From 4e0230fe7255f5140d31ecab580b8a71317f6665 Mon Sep 17 00:00:00 2001 From: pasibun Date: Wed, 10 Jun 2026 12:03:21 +0200 Subject: [PATCH 01/27] Refactor tools API to Fastify TypeScript adapter --- .github/workflows/deploy-prod.yml | 10 +- .github/workflows/deploy-test.yml | 18 +- .github/workflows/json-ci.yml | 4 +- .github/workflows/node-ci.yml | 12 +- Dockerfile | 22 +- README 2.md | 104 - README.md | 118 +- api/openapi.json | 24 +- biome.json | 5 +- config.js | 24 - controllers/Controller.js | 256 - controllers/ToolsController.js | 53 - controllers/index.js | 5 - expressServer.js | 265 - index.js | 34 - logger.js | 18 - package-lock.json | 7694 +++++++----------------- package.json | 47 +- publiccode.yml | 6 +- services/ArazzoVisualizationService.js | 749 --- services/KeycloakService.js | 312 - services/OasBundleService.js | 160 - services/OasConversionService.js | 187 - services/OasGeneratorService.js | 359 -- services/OasInputService.js | 50 - services/OasValidatorService.js | 216 - services/PostmanConversionService.js | 90 - services/RemoteSpecificationService.js | 95 - services/Service.js | 454 -- services/ToolsService.js | 295 - services/ZipService.js | 38 - services/index.js | 5 - src/app.ts | 73 + src/config.ts | 12 + src/plugins/error-handler.ts | 79 + src/routes.ts | 63 + src/server.ts | 28 + src/utils/operation-id.ts | 13 + test/OasConversionService.test.js | 155 - test/app.test.ts | 59 + test/convert-oas.test.ts | 54 + tsconfig.json | 22 + utils/fileName.js | 58 - utils/openapiRouter.js | 71 - vitest.config.ts | 9 + 45 files changed, 2698 insertions(+), 9727 deletions(-) delete mode 100644 README 2.md delete mode 100644 config.js delete mode 100644 controllers/Controller.js delete mode 100644 controllers/ToolsController.js delete mode 100644 controllers/index.js delete mode 100644 expressServer.js delete mode 100644 index.js delete mode 100644 logger.js delete mode 100644 services/ArazzoVisualizationService.js delete mode 100644 services/KeycloakService.js delete mode 100644 services/OasBundleService.js delete mode 100644 services/OasConversionService.js delete mode 100644 services/OasGeneratorService.js delete mode 100644 services/OasInputService.js delete mode 100644 services/OasValidatorService.js delete mode 100644 services/PostmanConversionService.js delete mode 100644 services/RemoteSpecificationService.js delete mode 100644 services/Service.js delete mode 100644 services/ToolsService.js delete mode 100644 services/ZipService.js delete mode 100644 services/index.js create mode 100644 src/app.ts create mode 100644 src/config.ts create mode 100644 src/plugins/error-handler.ts create mode 100644 src/routes.ts create mode 100644 src/server.ts create mode 100644 src/utils/operation-id.ts delete mode 100644 test/OasConversionService.test.js create mode 100644 test/app.test.ts create mode 100644 test/convert-oas.test.ts create mode 100644 tsconfig.json delete mode 100644 utils/fileName.js delete mode 100644 utils/openapiRouter.js create mode 100644 vitest.config.ts diff --git a/.github/workflows/deploy-prod.yml b/.github/workflows/deploy-prod.yml index 24b005b..45c43e6 100644 --- a/.github/workflows/deploy-prod.yml +++ b/.github/workflows/deploy-prod.yml @@ -31,7 +31,7 @@ jobs: - name: Genereer app token (Release proces app) id: app-token - uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 + uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0 with: app-id: ${{ secrets.RELEASE_PROCES_APP_ID }} private-key: ${{ secrets.RELEASE_PROCES_APP_PRIVATE_KEY }} @@ -39,7 +39,7 @@ jobs: repositories: ${{ steps.infra-repo.outputs.repo }} - name: Checkout don-infra - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 with: repository: ${{ env.INFRA_REPO }} token: ${{ steps.app-token.outputs.token }} @@ -54,8 +54,8 @@ jobs: - name: Install yq run: | set -e - sudo wget -O /usr/local/bin/yq https://github.com/mikefarah/yq/releases/download/v4.44.3/yq_linux_amd64 - echo "a2c097180dd884a8d50c956ee16a9cec070f30a7947cf4ebf87d5f36213e9ed7 /usr/local/bin/yq" | sha256sum -c + sudo wget -O /usr/local/bin/yq https://github.com/mikefarah/yq/releases/download/v4.53.2/yq_linux_amd64 + echo "d56bf5c6819e8e696340c312bd70f849dc1678a7cda9c2ad63eebd906371d56b /usr/local/bin/yq" | sha256sum -c sudo chmod +x /usr/local/bin/yq - name: Update image tag in prod overlay @@ -91,4 +91,4 @@ jobs: **Branch:** \`${{ github.ref_name }}\` **Commit:** ${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }} - Merge deze PR om de nieuwe versie naar productie te deployen." \ No newline at end of file + Merge deze PR om de nieuwe versie naar productie te deployen." diff --git a/.github/workflows/deploy-test.yml b/.github/workflows/deploy-test.yml index 6fdc437..86e7633 100644 --- a/.github/workflows/deploy-test.yml +++ b/.github/workflows/deploy-test.yml @@ -48,20 +48,20 @@ jobs: packages: write steps: - name: Checkout - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd + uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df # v4.1.0 - name: Login to container registry - uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 + uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push image - uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 + uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0 with: context: . push: true @@ -88,7 +88,7 @@ jobs: - name: Genereer app token (Release proces app) id: app-token - uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 + uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0 with: app-id: ${{ secrets.RELEASE_PROCES_APP_ID }} private-key: ${{ secrets.RELEASE_PROCES_APP_PRIVATE_KEY }} @@ -96,7 +96,7 @@ jobs: repositories: ${{ steps.infra-repo.outputs.repo }} - name: Checkout don-infra - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 with: repository: ${{ env.INFRA_REPO }} token: ${{ steps.app-token.outputs.token }} @@ -104,8 +104,8 @@ jobs: - name: Install yq run: | set -e - sudo wget -O /usr/local/bin/yq https://github.com/mikefarah/yq/releases/download/v4.44.3/yq_linux_amd64 - echo "a2c097180dd884a8d50c956ee16a9cec070f30a7947cf4ebf87d5f36213e9ed7 /usr/local/bin/yq" | sha256sum -c + sudo wget -O /usr/local/bin/yq https://github.com/mikefarah/yq/releases/download/v4.53.2/yq_linux_amd64 + echo "d56bf5c6819e8e696340c312bd70f849dc1678a7cda9c2ad63eebd906371d56b /usr/local/bin/yq" | sha256sum -c sudo chmod +x /usr/local/bin/yq - name: Update image tag in test overlay @@ -125,4 +125,4 @@ jobs: Branch: ${{ github.ref_name }} Commit: ${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}" - git push \ No newline at end of file + git push diff --git a/.github/workflows/json-ci.yml b/.github/workflows/json-ci.yml index 152574c..2a8b346 100644 --- a/.github/workflows/json-ci.yml +++ b/.github/workflows/json-ci.yml @@ -12,11 +12,11 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 with: fetch-depth: 0 - name: Run Super-Linter - uses: super-linter/super-linter@v8.6.0 + uses: super-linter/super-linter@9e863354e3ff62e0727d37183162c4a88873df41 # v8.6.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} VALIDATE_ALL_CODEBASE: true diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 00d9839..87454a1 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -9,12 +9,12 @@ jobs: name: Lint runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - name: Setup Node.js - uses: actions/setup-node@v6 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: - node-version: 20 + node-version: 22 cache: npm - name: Install dependencies @@ -30,17 +30,17 @@ jobs: permissions: packages: write steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - name: Login to GitHub Container Registry - uses: docker/login-action@v4 + uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build & Push Docker image - uses: docker/build-push-action@v7 + uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0 with: context: . push: true diff --git a/Dockerfile b/Dockerfile index 0d56ab1..22a3c80 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,20 @@ -FROM node:lts-alpine AS runtime - +FROM node:22-alpine AS build WORKDIR /app - -# Install dependencies COPY package.json package-lock.json ./ RUN npm ci +COPY tsconfig.json ./ +COPY src ./src +COPY api ./api +RUN npm run build -# Copy source -COPY . . +FROM node:22-alpine AS runtime +WORKDIR /app +ENV NODE_ENV=production +COPY package.json package-lock.json ./ +RUN npm ci --omit=dev +COPY --from=build /app/dist ./dist +COPY api ./api -EXPOSE 8080 +EXPOSE 1338 -CMD ["node", "index.js"] +CMD ["node", "dist/server.js"] diff --git a/README 2.md b/README 2.md deleted file mode 100644 index 1db34a2..0000000 --- a/README 2.md +++ /dev/null @@ -1,104 +0,0 @@ - -# OpenAPI Generated JavaScript/Express Server - -## Overview -This server was generated using the [OpenAPI Generator](https://openapi-generator.tech) project. The code generator, and it's generated code allows you to develop your system with an API-First attitude, where the API contract is the anchor and definer of your project, and your code and business-logic aims to complete and comply to the terms in the API contract. - -### prerequisites -- NodeJS >= 10.6 -- NPM >= 6.10.0 - -The code was written on a mac, so assuming all should work smoothly on Linux-based computers. However, there is no reason not to run this library on Windows-based machines. If you find an OS-related problem, please open an issue and it will be resolved. - -### Running the server -#### This is a long read, but there's a lot to understand. Please take the time to go through this. -1. Use the OpenAPI Generator to generate your application: -Assuming you have Java (1.8+), and [have the jar](https://github.com/openapitools/openapi-generator#13---download-jar) to generate the application, run: -```java -jar {path_to_jar_file} generate -g nodejs-express-server -i {openapi yaml/json file} -o {target_directory_where_the_app_will_be_installed} ``` -If you do not have the jar, or do not want to run Java from your local machine, follow instructions on the [OpenAPITools page](https://github.com/openapitools/openapi-generator). You can run the script online, on docker, and various other ways. -2. Go to the generated directory you defined. There's a fully working NodeJS-ExpressJs server waiting for you. This is important - the code is yours to change and update! Look at config.js and see that the settings there are ok with you - the server will run on port 8080, and files will be uploaded to a new directory 'uploaded_files'. -3. The server will base itself on an openapi.yaml file which is located under /api/openapi.yaml. This is not exactly the same file that you used to generate the app: -I. If you have `application/json` contentBody that was defined inside the path object - the generate will have moved it to the components/schemas section of the openapi document. -II. Every process has a new element added to it - `x-eov-operation-handler: controllers/PetController` which directs the call to that file. -III. We have a Java application that translates the operationId to a method, and a nodeJS script that does the same process to call that method. Both are converting the method to `camelCase`, but might have discrepancy. Please pay attention to the operationID names, and see that they are represented in the `controllers` and `services` directories. -4. Take the time to understand the structure of the application. There might be bugs, and there might be settings and business-logic that does not meet your expectation. Instead of dumping this solution and looking for something else - see if you can make the generated code work for you. -To keep the explanation short (a more detailed explanation will follow): Application starts with a call to index.js (this is where you will plug in the db later). It calls expressServer.js which is where the express.js and openapi-validator kick in. This is an important file. Learn it. All calls to endpoints that were configured in the openapi.yaml document go to `controllers/{name_of_tag_which_the_operation_was_associated_with}.js`, which is a very small method. All the business-logic lies in `controllers/Controller.js`, and from there - to `services/{name_of_tag_which_the_operation_was_associated_with}.js`. - -5. Once you've understood what is *going* to happen, launch the app and ensure everything is working as expected: -``` -npm start -``` -### Tests -Unfortunately, I have not written any unit-tests. Those will come in the future. However, the package does come with all that is needed to write and run tests - mocha and sinon and the related libraries are included in the package.js and will be installed upon npm install command - -### Mocking responses -- Enable the mock layer with `npm run start-mock` (wraps `USE_MOCKS=true` for you). Setting `USE_MOCKS` or `MOCKS_ENABLED` to `true/1/yes/on` achieves the same effect for custom scripts. -- Without any custom mock files the server auto-generates example payloads from the OpenAPI document (using response examples/schema defaults). -- Add overrides in `mocks/.js` when you need to control a specific operation. Export functions with the same operationIds. -- A handler can return a plain payload (automatically wrapped as a success), the result of `Service.successResponse(...)` to customize status codes, or `Service.rejectResponse(...)`/throw an error to simulate failures. - -```javascript -const Service = require('../services/Service'); - -module.exports = { - listPets: async () => Service.successResponse([{ id: 1, name: 'Fluffy' }]), -}; -``` - -### View and test the API -(Assuming no changes were made to config.js) - -1. API documentation, and to check the available endpoints: -http://localhost:8080/api-docs/. To -2. Download the openapi.yaml document: http://localhost:8080/openapi. -3. Every call to an endpoint that was defined in the openapi document will return a 200 and a list of all the parameters and objects that were sent in the request. -4. Endpoints that require security need to have security handlers configured before they can return a successful response. At this point they will return [ a response code of 401](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401). -5. ##### At this stage the server does not support document body sent in xml format. - -### Node version and guidelines -The code was written using Node version 10.6, and complies to the [Airbnb .eslint guiding rules](https://github.com/airbnb/javascript). - -### Project Files -#### Root Directory: -In the root directory we have (besides package.json, config.js, and log files): -- **logger.js** - where we define the logger for the project. The project uses winston, but the purpose of this file is to enable users to change and modify their own logger behavior. -- **index.js** - This is the project's 'main' file, and from here we launch the application. This is a very short and concise file, and the idea behind launching from this short file is to allow use-cases of launching the server with different parameters (changing config and/or logger) without affecting the rest of the code. -- **expressServer.js** - The core of the Express.js server. This is where the express server is initialized, together with the OpenAPI validator, OpenAPI UI, and other libraries needed to start our server. If we want to add external links, that's where they would go. Our project uses the [express-openapi-validator](https://www.npmjs.com/package/express-openapi-validator) library that acts as a first step in the routing process - requests that are directed to paths defined in the `openapi.yaml` file are caught by this process, and it's parameters and bodyContent are validated against the schema. A successful result of this validation will be a new 'openapi' object added to the request. If the path requested is not part of the openapi.yaml file, the validator ignores the request and passes it on, as is, down the flow of the Express server. - -#### api/ -- **openapi.yaml** - This is the OpenAPI contract to which this server will comply. The file was generated using the codegen, and should contain everything needed to run the API Gateway - no references to external models/schemas. - -#### utils/ -Currently a single file: - -- **openapiRouter.js** - This is where the routing to our back-end code happens. If the request object includes an ```openapi``` object, it picks up the following values (that are part of the ```openapi.yaml``` file): 'x-openapi-router-controller', and 'x-openapi-router-service'. These variables are names of files/classes in the controllers and services directories respectively. The operationId of the request is also extracted. The operationId is a method in the controller and the service that was generated as part of the codegen process. The routing process sends the request and response objects to the controller, which will extract the expected variables from the request, and send it to be processed by the service, returning the response from the service to the caller. - -#### controllers/ -After validating the request, and ensuring this belongs to our API gateway, we send the request to a `controller`, where the variables and parameters are extracted from the request and sent to the relevant `service` for processing. The `controller` handles the response from the `service` and builds the appropriate HTTP response to be sent back to the user. - -- **index.js** - load all the controllers that were generated for this project, and export them to be used dynamically by the `openapiRouter.js`. If you would like to customize your controller, it is advised that you link to your controller here, and ensure that the codegen does not rewrite this file. - -- **Controller.js** - The core processor of the generated controllers. The generated controllers are designed to be as slim and generic as possible, referencing to the `Controller.js` for the business logic of parsing the needed variables and arguments from the request, and for building the HTTP response which will be sent back. The `Controller.js` is a class with static methods. - -- **.js** - auto-generated code, processing all the operations. The Controller is a class that is constructed with the service class it will be sending the request to. Every request defined by the `openapi.yaml` has an operationId. The operationId is the name of the method that will be called. Every method receives the request and response, and calls the `Controller.js` to process the request and response, adding the service method that should be called for the actual business-logic processing. - -#### services/ -This is where the API Gateway ends, and the unique business-logic of your application kicks in. Every endpoint in the `openapi.yaml` has a variable 'x-openapi-router-service', which is the name of the service class that is generated. The operationID of the endpoint is the name of the method that will be called. The generated code provides a simple promise with a try/catch clause. A successful operation ends with a call to the generic `Service.js` to build a successful response (payload and response code), and a failure will call the generic `Service.js` to build a response with an error object and the relevant response code. It is recommended to have the services be generated automatically once, and after the initial build add methods manually. - -- **index.js** - load all the services that were generated for this project, and export them to be used dynamically by the `openapiRouter.js`. If you would like to customize your service, it is advised that you link to your controller here, and ensure that the codegen does not rewrite this file. - -- **Service.js** - A utility class, very simple and thin at this point, with two static methods for building a response object for successful and failed results in the service operation. The default response code is 200 for success and 500 for failure. It is recommended to send more accurate response codes and override these defaults when relevant. - -- **.js** - auto-generated code, providing a stub Promise for each operationId defined in the `openapi.yaml`. Each method receives the variables that were defined in the `openapi.yaml` file, and wraps a Promise in a try/catch clause. The Promise resolves both success and failure in a call to the `Service.js` utility class for building the appropriate response that will be sent back to the Controller and then to the caller of this endpoint. - -#### tests/ -- **serverTests.js** - basic server validation tests, checking that the server is up, that a call to an endpoint within the scope of the `openapi.yaml` file returns 200, that a call to a path outside that scope returns 200 if it exists and a 404 if not. -- **routingTests.js** - Runs through all the endpoints defined in the `openapi.yaml`, and constructs a dummy request to send to the server. Confirms that the response code is 200. At this point requests containing xml or formData fail - currently they are not supported in the router. -- **additionalEndpointsTests.js** - A test file for all the endpoints that are defined outside the openapi.yaml scope. Confirms that these endpoints return a successful 200 response. - - -Future tests should be written to ensure that the response of every request sent should conform to the structure defined in the `openapi.yaml`. This test will fail 100% initially, and the job of the development team will be to clear these tests. - - -#### models/ -Currently a concept awaiting feedback. The idea is to have the objects defined in the openapi.yaml act as models which are passed between the different modules. This will conform the programmers to interact using defined objects, rather than loosely-defined JSON objects. Given the nature of JavaScript programmers, who want to work with their own bootstrapped parameters, this concept might not work. Keeping this here for future discussion and feedback. diff --git a/README.md b/README.md index 1db34a2..45ad1cb 100644 --- a/README.md +++ b/README.md @@ -1,104 +1,40 @@ +# Tools API -# OpenAPI Generated JavaScript/Express Server +HTTP API for developer.overheid.nl tools. -## Overview -This server was generated using the [OpenAPI Generator](https://openapi-generator.tech) project. The code generator, and it's generated code allows you to develop your system with an API-First attitude, where the API contract is the anchor and definer of your project, and your code and business-logic aims to complete and comply to the terms in the API contract. +This repository contains only the API transport layer: OpenAPI validation, Fastify routing, response headers, and error +mapping. Business logic lives in `@developer-overheid-nl/don-tools-logic`, currently consumed locally from +`../don-tools-api-v2`. -### prerequisites -- NodeJS >= 10.6 -- NPM >= 6.10.0 +## Stack -The code was written on a mac, so assuming all should work smoothly on Linux-based computers. However, there is no reason not to run this library on Windows-based machines. If you find an OS-related problem, please open an issue and it will be resolved. +- Node.js 22+ +- TypeScript, native ESM, `NodeNext` +- Fastify v5 +- `fastify-openapi-glue` for OpenAPI operation binding +- Vitest +- Biome -### Running the server -#### This is a long read, but there's a lot to understand. Please take the time to go through this. -1. Use the OpenAPI Generator to generate your application: -Assuming you have Java (1.8+), and [have the jar](https://github.com/openapitools/openapi-generator#13---download-jar) to generate the application, run: -```java -jar {path_to_jar_file} generate -g nodejs-express-server -i {openapi yaml/json file} -o {target_directory_where_the_app_will_be_installed} ``` -If you do not have the jar, or do not want to run Java from your local machine, follow instructions on the [OpenAPITools page](https://github.com/openapitools/openapi-generator). You can run the script online, on docker, and various other ways. -2. Go to the generated directory you defined. There's a fully working NodeJS-ExpressJs server waiting for you. This is important - the code is yours to change and update! Look at config.js and see that the settings there are ok with you - the server will run on port 8080, and files will be uploaded to a new directory 'uploaded_files'. -3. The server will base itself on an openapi.yaml file which is located under /api/openapi.yaml. This is not exactly the same file that you used to generate the app: -I. If you have `application/json` contentBody that was defined inside the path object - the generate will have moved it to the components/schemas section of the openapi document. -II. Every process has a new element added to it - `x-eov-operation-handler: controllers/PetController` which directs the call to that file. -III. We have a Java application that translates the operationId to a method, and a nodeJS script that does the same process to call that method. Both are converting the method to `camelCase`, but might have discrepancy. Please pay attention to the operationID names, and see that they are represented in the `controllers` and `services` directories. -4. Take the time to understand the structure of the application. There might be bugs, and there might be settings and business-logic that does not meet your expectation. Instead of dumping this solution and looking for something else - see if you can make the generated code work for you. -To keep the explanation short (a more detailed explanation will follow): Application starts with a call to index.js (this is where you will plug in the db later). It calls expressServer.js which is where the express.js and openapi-validator kick in. This is an important file. Learn it. All calls to endpoints that were configured in the openapi.yaml document go to `controllers/{name_of_tag_which_the_operation_was_associated_with}.js`, which is a very small method. All the business-logic lies in `controllers/Controller.js`, and from there - to `services/{name_of_tag_which_the_operation_was_associated_with}.js`. +## Development -5. Once you've understood what is *going* to happen, launch the app and ensure everything is working as expected: -``` +```sh +npm install +npm run dev +npm run build npm start +npm test +npm run lint ``` -### Tests -Unfortunately, I have not written any unit-tests. Those will come in the future. However, the package does come with all that is needed to write and run tests - mocha and sinon and the related libraries are included in the package.js and will be installed upon npm install command - -### Mocking responses -- Enable the mock layer with `npm run start-mock` (wraps `USE_MOCKS=true` for you). Setting `USE_MOCKS` or `MOCKS_ENABLED` to `true/1/yes/on` achieves the same effect for custom scripts. -- Without any custom mock files the server auto-generates example payloads from the OpenAPI document (using response examples/schema defaults). -- Add overrides in `mocks/.js` when you need to control a specific operation. Export functions with the same operationIds. -- A handler can return a plain payload (automatically wrapped as a success), the result of `Service.successResponse(...)` to customize status codes, or `Service.rejectResponse(...)`/throw an error to simulate failures. - -```javascript -const Service = require('../services/Service'); - -module.exports = { - listPets: async () => Service.successResponse([{ id: 1, name: 'Fluffy' }]), -}; -``` - -### View and test the API -(Assuming no changes were made to config.js) - -1. API documentation, and to check the available endpoints: -http://localhost:8080/api-docs/. To -2. Download the openapi.yaml document: http://localhost:8080/openapi. -3. Every call to an endpoint that was defined in the openapi document will return a 200 and a list of all the parameters and objects that were sent in the request. -4. Endpoints that require security need to have security handlers configured before they can return a successful response. At this point they will return [ a response code of 401](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401). -5. ##### At this stage the server does not support document body sent in xml format. - -### Node version and guidelines -The code was written using Node version 10.6, and complies to the [Airbnb .eslint guiding rules](https://github.com/airbnb/javascript). - -### Project Files -#### Root Directory: -In the root directory we have (besides package.json, config.js, and log files): -- **logger.js** - where we define the logger for the project. The project uses winston, but the purpose of this file is to enable users to change and modify their own logger behavior. -- **index.js** - This is the project's 'main' file, and from here we launch the application. This is a very short and concise file, and the idea behind launching from this short file is to allow use-cases of launching the server with different parameters (changing config and/or logger) without affecting the rest of the code. -- **expressServer.js** - The core of the Express.js server. This is where the express server is initialized, together with the OpenAPI validator, OpenAPI UI, and other libraries needed to start our server. If we want to add external links, that's where they would go. Our project uses the [express-openapi-validator](https://www.npmjs.com/package/express-openapi-validator) library that acts as a first step in the routing process - requests that are directed to paths defined in the `openapi.yaml` file are caught by this process, and it's parameters and bodyContent are validated against the schema. A successful result of this validation will be a new 'openapi' object added to the request. If the path requested is not part of the openapi.yaml file, the validator ignores the request and passes it on, as is, down the flow of the Express server. - -#### api/ -- **openapi.yaml** - This is the OpenAPI contract to which this server will comply. The file was generated using the codegen, and should contain everything needed to run the API Gateway - no references to external models/schemas. - -#### utils/ -Currently a single file: -- **openapiRouter.js** - This is where the routing to our back-end code happens. If the request object includes an ```openapi``` object, it picks up the following values (that are part of the ```openapi.yaml``` file): 'x-openapi-router-controller', and 'x-openapi-router-service'. These variables are names of files/classes in the controllers and services directories respectively. The operationId of the request is also extracted. The operationId is a method in the controller and the service that was generated as part of the codegen process. The routing process sends the request and response objects to the controller, which will extract the expected variables from the request, and send it to be processed by the service, returning the response from the service to the caller. +The OpenAPI contract is `api/openapi.json`. The API also serves it at `GET /v1/openapi.json`. -#### controllers/ -After validating the request, and ensuring this belongs to our API gateway, we send the request to a `controller`, where the variables and parameters are extracted from the request and sent to the relevant `service` for processing. The `controller` handles the response from the `service` and builds the appropriate HTTP response to be sent back to the user. +## Split -- **index.js** - load all the controllers that were generated for this project, and export them to be used dynamically by the `openapiRouter.js`. If you would like to customize your controller, it is advised that you link to your controller here, and ensure that the codegen does not rewrite this file. +- `don-tools-api`: API adapter, OpenAPI contract, HTTP error handling +- `don-tools-api-v2`: reusable logic package -- **Controller.js** - The core processor of the generated controllers. The generated controllers are designed to be as slim and generic as possible, referencing to the `Controller.js` for the business logic of parsing the needed variables and arguments from the request, and for building the HTTP response which will be sent back. The `Controller.js` is a class with static methods. +The local package dependency is: -- **.js** - auto-generated code, processing all the operations. The Controller is a class that is constructed with the service class it will be sending the request to. Every request defined by the `openapi.yaml` has an operationId. The operationId is the name of the method that will be called. Every method receives the request and response, and calls the `Controller.js` to process the request and response, adding the service method that should be called for the actual business-logic processing. - -#### services/ -This is where the API Gateway ends, and the unique business-logic of your application kicks in. Every endpoint in the `openapi.yaml` has a variable 'x-openapi-router-service', which is the name of the service class that is generated. The operationID of the endpoint is the name of the method that will be called. The generated code provides a simple promise with a try/catch clause. A successful operation ends with a call to the generic `Service.js` to build a successful response (payload and response code), and a failure will call the generic `Service.js` to build a response with an error object and the relevant response code. It is recommended to have the services be generated automatically once, and after the initial build add methods manually. - -- **index.js** - load all the services that were generated for this project, and export them to be used dynamically by the `openapiRouter.js`. If you would like to customize your service, it is advised that you link to your controller here, and ensure that the codegen does not rewrite this file. - -- **Service.js** - A utility class, very simple and thin at this point, with two static methods for building a response object for successful and failed results in the service operation. The default response code is 200 for success and 500 for failure. It is recommended to send more accurate response codes and override these defaults when relevant. - -- **.js** - auto-generated code, providing a stub Promise for each operationId defined in the `openapi.yaml`. Each method receives the variables that were defined in the `openapi.yaml` file, and wraps a Promise in a try/catch clause. The Promise resolves both success and failure in a call to the `Service.js` utility class for building the appropriate response that will be sent back to the Controller and then to the caller of this endpoint. - -#### tests/ -- **serverTests.js** - basic server validation tests, checking that the server is up, that a call to an endpoint within the scope of the `openapi.yaml` file returns 200, that a call to a path outside that scope returns 200 if it exists and a 404 if not. -- **routingTests.js** - Runs through all the endpoints defined in the `openapi.yaml`, and constructs a dummy request to send to the server. Confirms that the response code is 200. At this point requests containing xml or formData fail - currently they are not supported in the router. -- **additionalEndpointsTests.js** - A test file for all the endpoints that are defined outside the openapi.yaml scope. Confirms that these endpoints return a successful 200 response. - - -Future tests should be written to ensure that the response of every request sent should conform to the structure defined in the `openapi.yaml`. This test will fail 100% initially, and the job of the development team will be to clear these tests. - - -#### models/ -Currently a concept awaiting feedback. The idea is to have the objects defined in the openapi.yaml act as models which are passed between the different modules. This will conform the programmers to interact using defined objects, rather than loosely-defined JSON objects. Given the nature of JavaScript programmers, who want to work with their own bootstrapped parameters, this concept might not work. Keeping this here for future discussion and feedback. +```json +"@developer-overheid-nl/don-tools-logic": "file:../don-tools-api-v2" +``` diff --git a/api/openapi.json b/api/openapi.json index 02ca14c..82929a7 100644 --- a/api/openapi.json +++ b/api/openapi.json @@ -78,8 +78,7 @@ "summary": "Arazzo Markdown (POST)", "tags": [ "Tools" - ], - "x-eov-operation-handler": "controllers/ToolsController" + ] } }, "/v1/arazzo/mermaid": { @@ -129,8 +128,7 @@ "summary": "Arazzo Mermaid (POST)", "tags": [ "Tools" - ], - "x-eov-operation-handler": "controllers/ToolsController" + ] } }, "/v1/auth/clients": { @@ -180,8 +178,7 @@ "summary": "Maak client (POST)", "tags": [ "Tools" - ], - "x-eov-operation-handler": "controllers/ToolsController" + ] } }, "/v1/oas/convert": { @@ -224,8 +221,7 @@ "summary": "Converteer OpenAPI 3.0/3.1", "tags": [ "Tools" - ], - "x-eov-operation-handler": "controllers/ToolsController" + ] } }, "/v1/oas/bundle": { @@ -268,8 +264,7 @@ "summary": "Bundle OpenAPI", "tags": [ "Tools" - ], - "x-eov-operation-handler": "controllers/ToolsController" + ] } }, "/v1/oas/generate": { @@ -319,8 +314,7 @@ "summary": "Generate OpenAPI", "tags": [ "Tools" - ], - "x-eov-operation-handler": "controllers/ToolsController" + ] } }, "/v1/oas/validate": { @@ -370,8 +364,7 @@ "summary": "Validate OpenAPI (POST)", "tags": [ "Tools" - ], - "x-eov-operation-handler": "controllers/ToolsController" + ] } }, "/v1/oas/postman": { @@ -414,8 +407,7 @@ "summary": "Maak Postman-collectie (POST)", "tags": [ "Tools" - ], - "x-eov-operation-handler": "controllers/ToolsController" + ] } } }, diff --git a/biome.json b/biome.json index fac7c27..322be84 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.4.13/schema.json", + "$schema": "https://biomejs.dev/schemas/2.4.16/schema.json", "formatter": { "indentStyle": "space", "indentWidth": 2, @@ -22,5 +22,8 @@ "formatter": { "quoteStyle": "double" } + }, + "files": { + "includes": ["src/**", "test/**", "*.json", "*.ts"] } } diff --git a/config.js b/config.js deleted file mode 100644 index f047887..0000000 --- a/config.js +++ /dev/null @@ -1,24 +0,0 @@ -const path = require("node:path"); - -const parseEnvBoolean = (value) => { - if (value === undefined || value === null) { - return false; - } - return ["1", "true", "yes", "on"].includes(String(value).toLowerCase()); -}; - -const config = { - ROOT_DIR: __dirname, - URL_PORT: 1338, - URL_PATH: "https://api.developer.overheid.nl", - BASE_VERSION: "/tools/v1", - CONTROLLER_DIRECTORY: path.join(__dirname, "controllers"), - PROJECT_DIR: __dirname, - USE_MOCKS: parseEnvBoolean(process.env.USE_MOCKS) || parseEnvBoolean(process.env.MOCKS_ENABLED), -}; -config.OPENAPI_JSON = path.join(config.ROOT_DIR, "api", "openapi.json"); -config.FULL_PATH = `${config.URL_PATH}:${config.URL_PORT}/${config.BASE_VERSION}`; -config.FILE_UPLOAD_PATH = path.join(config.PROJECT_DIR, "uploaded_files"); -config.MOCK_DIR = path.join(config.PROJECT_DIR, "mocks"); - -module.exports = config; diff --git a/controllers/Controller.js b/controllers/Controller.js deleted file mode 100644 index 7524b93..0000000 --- a/controllers/Controller.js +++ /dev/null @@ -1,256 +0,0 @@ -const fs = require("node:fs"); -const path = require("node:path"); -const config = require("../config"); -const Service = require("../services/Service"); -const logger = require("../logger"); - -class Controller { - static getStatusText(status) { - const statusTexts = { - 400: "Bad Request", - 401: "Unauthorized", - 403: "Forbidden", - 404: "Not Found", - 405: "Method Not Allowed", - 409: "Conflict", - 422: "Unprocessable Entity", - 429: "Too Many Requests", - 500: "Internal Server Error", - }; - return statusTexts[status] || "Unknown Error"; - } - - static sendResponse(response, payload) { - /** - * The default response-code is 200. We want to allow to change that. in That case, - * payload will be an object consisting of a code and a payload. If not customized - * send 200 and the payload as received in this method. - */ - response.status(payload.code || 200); - if (payload.headers && typeof payload.headers === "object") { - Object.entries(payload.headers).forEach(([header, value]) => { - if (value !== undefined) { - response.set(header, value); - } - }); - } - const responsePayload = payload.payload !== undefined ? payload.payload : payload; - if (Buffer.isBuffer(responsePayload)) { - if (!response.get("Content-Type")) { - response.set("Content-Type", "application/octet-stream"); - } - response.send(responsePayload); - return; - } - if (responsePayload !== null && typeof responsePayload === "object") { - response.json(responsePayload); - } else if (responsePayload !== undefined) { - response.end(responsePayload); - } else { - response.end(); - } - } - - static sendError(response, error) { - const status = error.code || 500; - const reason = error.message || error.error?.message || "Unexpected error"; - const detail = error.detail || reason; - let invalidParams = []; - if (Array.isArray(error.invalidParams)) { - invalidParams = error.invalidParams; - } else if (error.field !== undefined || error.reason !== undefined) { - invalidParams = [ - { - name: error.field || "body", - reason: error.reason || detail, - }, - ]; - } - - const problem = { - type: `https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/${status}`, - title: Controller.getStatusText(status), - status, - detail, - instance: error.instance || "body", - }; - if (invalidParams.length > 0) { - problem.invalidParams = invalidParams; - } - - logger.error(`Request failed (${status} ${Controller.getStatusText(status)}): ${reason}`, { - detail, - invalidParams, - errorMessage: error?.message, - stack: error?.stack, - }); - - response.status(status).json(problem); - } - - /** - * Files have been uploaded to the directory defined by config.js as upload directory - * Files have a temporary name, that was saved as 'filename' of the file object that is - * referenced in request.files array. - * This method finds the file and changes it to the file name that was originally called - * when it was uploaded. To prevent files from being overwritten, a timestamp is added between - * the filename and its extension - * @param request - * @param fieldName - * @returns {string} - */ - static collectFile(request, fieldName) { - let uploadedFileName = ""; - if (request.files && request.files.length > 0) { - const fileObject = request.files.find((file) => file.fieldname === fieldName); - if (fileObject) { - const fileArray = fileObject.originalname.split("."); - const extension = fileArray.pop(); - fileArray.push(`_${Date.now()}`); - uploadedFileName = `${fileArray.join("")}.${extension}`; - fs.renameSync( - path.join(config.FILE_UPLOAD_PATH, fileObject.filename), - path.join(config.FILE_UPLOAD_PATH, uploadedFileName), - ); - } - } - return uploadedFileName; - } - - static getRequestBodyName(request) { - const codeGenDefinedBodyName = request.openapi.schema["x-codegen-request-body-name"]; - if (codeGenDefinedBodyName !== undefined) { - return codeGenDefinedBodyName; - } - const refObjectPath = request.openapi.schema.requestBody.content["application/json"].schema.$ref; - if (refObjectPath !== undefined && refObjectPath.length > 0) { - return refObjectPath.substr(refObjectPath.lastIndexOf("/") + 1); - } - return "body"; - } - - static aliasRequestBodyParam(params, bodyName, value) { - if (!bodyName || value === undefined) { - return params; - } - const result = { ...params }; - if (!Object.hasOwn(result, bodyName)) { - result[bodyName] = value; - } - if (!Object.hasOwn(result, "body")) { - result.body = value; - } - const sanitizedName = Service.sanitizeOperationId(bodyName); - if (sanitizedName && !Object.hasOwn(result, sanitizedName)) { - result[sanitizedName] = value; - } - const lowerCaseName = bodyName.charAt(0).toLowerCase() + bodyName.slice(1); - if (lowerCaseName && !Object.hasOwn(result, lowerCaseName)) { - result[lowerCaseName] = value; - } - if (value && typeof value === "object" && !Array.isArray(value)) { - Object.keys(value).forEach((key) => { - if (!Object.hasOwn(result, key)) { - result[key] = value[key]; - } - }); - } - return result; - } - - static collectRequestParams(request) { - let requestParams = {}; - if (request.openapi.schema.requestBody !== null) { - const { content } = request.openapi.schema.requestBody; - if (content["application/json"] !== undefined) { - const requestBodyName = Controller.getRequestBodyName(request); - const schemaObject = content["application/json"].schema || {}; - let schemaDefinition = schemaObject; - if (schemaObject.$ref) { - const resolved = Service.resolveRef(schemaObject.$ref); - if (resolved) { - schemaDefinition = resolved; - } - } - const requiredProperties = Array.isArray(schemaDefinition.required) ? schemaDefinition.required : []; - const payload = request.body || {}; - if (requiredProperties.length > 0) { - const missing = requiredProperties.filter((prop) => payload[prop] === undefined); - if (missing.length > 0) { - throw Service.rejectResponse( - { - message: `Missing required properties: ${missing.join(", ")}`, - field: requestBodyName, - detail: `Missing required properties: ${missing.join(", ")}`, - }, - 400, - ); - } - } - const declaredProperties = schemaDefinition?.properties ? Object.keys(schemaDefinition.properties) : []; - const allowAdditional = (() => { - if (schemaDefinition && Object.hasOwn(schemaDefinition, "additionalProperties")) { - return schemaDefinition.additionalProperties !== false; - } - return false; - })(); - if (!allowAdditional) { - const unknownProperties = Object.keys(payload).filter((prop) => !declaredProperties.includes(prop)); - if (unknownProperties.length > 0) { - throw Service.rejectResponse( - { - message: `Unknown properties: ${unknownProperties.join(", ")}`, - field: requestBodyName, - detail: `Unknown properties: ${unknownProperties.join(", ")}`, - }, - 400, - ); - } - } - if (Object.keys(payload).length > 0) { - requestParams = Controller.aliasRequestBodyParam( - { - ...requestParams, - [requestBodyName]: payload, - }, - requestBodyName, - payload, - ); - } - } else if (content["multipart/form-data"] !== undefined) { - Object.keys(content["multipart/form-data"].schema.properties).forEach((property) => { - const propertyObject = content["multipart/form-data"].schema.properties[property]; - if (propertyObject.format !== undefined && propertyObject.format === "binary") { - requestParams[property] = Controller.collectFile(request, property); - } else { - requestParams[property] = request.body[property]; - } - }); - } - } - - if (request.openapi.schema.parameters !== undefined) { - request.openapi.schema.parameters.forEach((param) => { - if (param.in === "path") { - requestParams[param.name] = request.openapi.pathParams[param.name]; - } else if (param.in === "query") { - requestParams[param.name] = request.query[param.name]; - } else if (param.in === "header") { - requestParams[param.name] = request.headers[param.name]; - } - }); - } - return requestParams; - } - - static async handleRequest(request, response, serviceOperation) { - try { - const serviceResponse = await serviceOperation(Controller.collectRequestParams(request)); - Controller.sendResponse(response, serviceResponse); - } catch (error) { - Controller.sendError(response, error); - } - } -} - -module.exports = Controller; diff --git a/controllers/ToolsController.js b/controllers/ToolsController.js deleted file mode 100644 index 50248e8..0000000 --- a/controllers/ToolsController.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * The ToolsController file is a very simple one, which does not need to be changed manually, - * unless there's a case where business logic routes the request to an entity which is not - * the service. - * The heavy lifting of the Controller item is done in Request.js - that is where request - * parameters are extracted and sent to the service, and where response is handled. - */ - -const Controller = require("./Controller"); -const service = require("../services/ToolsService"); - -const arazzoMarkdown = async (request, response) => { - await Controller.handleRequest(request, response, service.arazzoMarkdown); -}; - -const arazzoMermaid = async (request, response) => { - await Controller.handleRequest(request, response, service.arazzoMermaid); -}; - -const convertOAS = async (request, response) => { - await Controller.handleRequest(request, response, service.convertOAS); -}; - -const createPostmanCollection = async (request, response) => { - await Controller.handleRequest(request, response, service.createPostmanCollection); -}; - -const bundleOAS = async (request, response) => { - await Controller.handleRequest(request, response, service.bundleOAS); -}; - -const generateOAS = async (request, response) => { - await Controller.handleRequest(request, response, service.generateOAS); -}; - -const untrustClient = async (request, response) => { - await Controller.handleRequest(request, response, service.untrustClient); -}; - -const validatorOpenAPIPost = async (request, response) => { - await Controller.handleRequest(request, response, service.validatorOpenAPIPost); -}; - -module.exports = { - arazzoMarkdown, - arazzoMermaid, - convertOAS, - createPostmanCollection, - bundleOAS, - generateOAS, - untrustClient, - validatorOpenAPIPost, -}; diff --git a/controllers/index.js b/controllers/index.js deleted file mode 100644 index a389b0d..0000000 --- a/controllers/index.js +++ /dev/null @@ -1,5 +0,0 @@ -const ToolsController = require("./ToolsController"); - -module.exports = { - ToolsController, -}; diff --git a/expressServer.js b/expressServer.js deleted file mode 100644 index 9500c7b..0000000 --- a/expressServer.js +++ /dev/null @@ -1,265 +0,0 @@ -const http = require("node:http"); -const fs = require("node:fs"); -const path = require("node:path"); -const express = require("express"); -const cors = require("cors"); -const bodyParser = require("body-parser"); -const OpenApiValidator = require("express-openapi-validator"); -const logger = require("./logger"); -const config = require("./config"); - -class ExpressServer { - static sanitizeOperationId(operationId) { - if (!operationId || typeof operationId !== "string") { - return null; - } - let result = operationId.trim(); - if (result.length === 0) { - return null; - } - result = result.replace(/[_-]+/g, " "); - result = result.replace(/[^a-zA-Z0-9_$]+/g, " "); - result = result - .split(" ") - .filter((segment) => segment.length > 0) - .map((segment, index) => { - if (index === 0) { - return segment; - } - return segment.charAt(0).toUpperCase() + segment.slice(1); - }) - .join(""); - result = result.replace(/^[^a-zA-Z_$]+/, ""); - if (result.length === 0) { - return null; - } - return result.charAt(0).toLowerCase() + result.slice(1); - } - - static sanitizeTagName(tagName) { - if (!tagName || typeof tagName !== "string") { - return null; - } - let result = tagName.trim(); - if (result.length === 0) { - return null; - } - result = result.replace(/[_-]+/g, " "); - result = result.replace(/[^a-zA-Z0-9_$]+/g, " "); - const parts = result - .split(" ") - .filter((segment) => segment.length > 0) - .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1)); - if (parts.length === 0) { - return null; - } - return parts.join(""); - } - - static normalizeOperationIds(schema) { - if (!schema || !schema.paths) { - return; - } - const methods = ["get", "put", "post", "delete", "options", "head", "patch", "trace"]; - for (const pathKey of Object.keys(schema.paths)) { - const pathItem = schema.paths[pathKey]; - for (const method of methods) { - const operation = pathItem[method]; - if (operation?.operationId) { - const normalizedId = ExpressServer.sanitizeOperationId(operation.operationId); - if (normalizedId && normalizedId !== operation.operationId) { - operation["x-original-operationId"] = operation.operationId; - operation.operationId = normalizedId; - } - } - } - } - } - - constructor(port, openApiJsonPath) { - this.port = port; - this.app = express(); - try { - this.schema = JSON.parse(fs.readFileSync(openApiJsonPath, "utf8")); - if (this.schema?.components) { - const { components } = this.schema; - const componentMirrors = [ - "schemas", - "responses", - "parameters", - "examples", - "requestBodies", - "headers", - "securitySchemes", - "links", - "callbacks", - "pathItems", - ]; - for (const key of componentMirrors) { - if (!this.schema[key] && components[key]) { - this.schema[key] = components[key]; - } - } - } - ExpressServer.normalizeOperationIds(this.schema); - } catch (e) { - logger.error("failed to start Express Server", e.message); - } - this.setupMiddleware(); - } - - static getStatusText(status) { - const statusTexts = { - 400: "Bad Request", - 401: "Unauthorized", - 403: "Forbidden", - 404: "Not Found", - 405: "Method Not Allowed", - 409: "Conflict", - 422: "Unprocessable Entity", - 429: "Too Many Requests", - 500: "Internal Server Error", - 501: "Not Implemented", - 502: "Bad Gateway", - 503: "Service Unavailable", - 504: "Gateway Timeout", - }; - return statusTexts[status] || "Unknown Error"; - } - - setupMiddleware() { - // this.setupAllowedMedia(); - this.app.use(cors()); - this.app.use(bodyParser.json({ limit: "14MB" })); - this.app.use(express.json()); - this.app.use(express.urlencoded({ extended: false })); - this.app.use((_req, res, next) => { - res.set("API-Version", this.schema.info.version); - next(); - }); - const sendOpenApiSpec = (_req, res) => res.json(this.schema); - this.app.get("/v1/openapi.json", sendOpenApiSpec); - this.app.use( - OpenApiValidator.middleware({ - apiSpec: this.schema, - validateApiSpec: false, - validateSecurity: false, - validateRequests: { - coerceTypes: false, - allowUnknownBodyProperties: false, - }, - operationHandlers: { - basePath: path.join(__dirname), - }, - fileUploader: { dest: config.FILE_UPLOAD_PATH }, - }), - ); - ExpressServer.registerRoutes(this.app, this.schema); - } - - static toExpressPath(openApiPath) { - return openApiPath.replace(/{/g, ":").replace(/}/g, ""); - } - - static resolveOperationHandler(operation) { - let handlerRef = operation["x-eov-operation-handler"]; - if (!handlerRef && operation.tags?.length > 0) { - const tagName = ExpressServer.sanitizeTagName(operation.tags[0]); - if (tagName) { - handlerRef = `controllers/${tagName}Controller`; - } - } - if (!handlerRef) { - logger.warn(`No handler reference found for operation ${operation.operationId}`); - return null; - } - const normalizedRef = handlerRef.replace(/\\/g, "/"); - const modulePath = normalizedRef.endsWith(".js") - ? path.join(__dirname, normalizedRef) - : path.join(__dirname, `${normalizedRef}.js`); - if (!fs.existsSync(modulePath)) { - logger.warn(`Handler module missing for ${operation.operationId}: ${modulePath}`); - return null; - } - // eslint-disable-next-line global-require, import/no-dynamic-require - const controllerModule = require(modulePath); - const handler = controllerModule[operation.operationId]; - if (typeof handler !== "function") { - logger.warn(`Handler function ${operation.operationId} not found in ${modulePath}`); - return null; - } - return handler; - } - - static registerRoutes(app, schema) { - if (!schema || !schema.paths) { - return; - } - const methods = ["get", "put", "post", "delete", "options", "head", "patch", "trace"]; - for (const pathKey of Object.keys(schema.paths)) { - const expressPath = ExpressServer.toExpressPath(pathKey); - const pathItem = schema.paths[pathKey]; - for (const method of methods) { - const operation = pathItem[method]; - if (!operation) { - continue; - } - const handler = ExpressServer.resolveOperationHandler(operation); - if (!handler) { - continue; - } - app[method](expressPath, async (req, res, next) => { - logger.info(`Incoming request for ${method.toUpperCase()} ${expressPath}`); - req.openapi = req.openapi || {}; - req.openapi.schema = req.openapi.schema || operation; - req.openapi.pathParams = req.openapi.pathParams || req.params; - try { - await Promise.resolve(handler(req, res, next)); - } catch (error) { - next(error); - } - }); - } - } - } - - launch() { - // eslint-disable-next-line no-unused-vars - this.app.use((err, req, res, _next) => { - // format errors using RFC 7807 Problem Details format - const status = err.status || 500; - const problemDetails = { - type: `https://httpstatuses.com/${status}`, - title: ExpressServer.getStatusText(status), - status, - detail: err.message || err.toString(), - }; - - // Add instance URI if available - if (req.originalUrl) { - problemDetails.instance = req.originalUrl; - } - - // Add additional error details if available - if (err.status === 400 && err.errors && Array.isArray(err.errors) && err.errors.length > 0) { - problemDetails.invalidParams = err.errors; - } - - // Set the proper content type for problem+json - res.set("Content-Type", "application/problem+json"); - res.status(status).json(problemDetails); - }); - - http.createServer(this.app).listen(this.port); - console.log(`Listening on port ${this.port}`); - } - - async close() { - if (this.server !== undefined) { - await this.server.close(); - console.log(`Server on port ${this.port} shut down`); - } - } -} - -module.exports = ExpressServer; diff --git a/index.js b/index.js deleted file mode 100644 index 4f1f314..0000000 --- a/index.js +++ /dev/null @@ -1,34 +0,0 @@ -const fs = require("node:fs"); -const path = require("node:path"); - -const loadLocalEnvFile = () => { - if (typeof process.loadEnvFile !== "function") { - return; - } - const envPath = path.join(__dirname, ".env"); - if (!fs.existsSync(envPath)) { - return; - } - process.loadEnvFile(envPath); -}; - -loadLocalEnvFile(); - -const config = require("./config"); -const logger = require("./logger"); -const ExpressServer = require("./expressServer"); - -let expressServer; - -const launchServer = async () => { - try { - expressServer = new ExpressServer(config.URL_PORT, config.OPENAPI_JSON); - expressServer.launch(); - logger.info("Express server running"); - } catch (error) { - logger.error("Express Server failure", error.message); - await expressServer?.close?.(); - } -}; - -launchServer().catch((e) => logger.error(e)); diff --git a/logger.js b/logger.js deleted file mode 100644 index 7f119b2..0000000 --- a/logger.js +++ /dev/null @@ -1,18 +0,0 @@ -const { transports, createLogger, format } = require("winston"); - -const logger = createLogger({ - level: "info", - format: format.combine(format.timestamp(), format.json()), - defaultMeta: { service: "user-service" }, - transports: [ - new transports.Console(), - new transports.File({ filename: "error.log", level: "error", timestamp: true }), - new transports.File({ filename: "combined.log", timestamp: true }), - ], -}); - -if (process.env.NODE_ENV !== "production") { - logger.add(new transports.Console({ format: format.simple() })); -} - -module.exports = logger; diff --git a/package-lock.json b/package-lock.json index 5ab9d79..8e46bae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,114 +8,61 @@ "name": "tools-api-v1", "version": "1.0.0", "license": "EUPL-1.2", + "dependencies": { + "@developer-overheid-nl/don-tools-logic": "file:../don-tools-api-v2", + "@fastify/cors": "^11.2.0", + "ajv-formats": "^3.0.1", + "fastify": "^5.8.5", + "fastify-openapi-glue": "^4.11.3", + "fastify-plugin": "^5.1.0" + }, + "devDependencies": { + "@biomejs/biome": "^2.4.16", + "@types/js-yaml": "^4.0.9", + "@types/node": "^25.9.1", + "js-yaml": "^4.2.0", + "pino-pretty": "^13.1.3", + "tsx": "^4.22.4", + "typescript": "^6.0.3", + "vite": "^8.0.16", + "vitest": "^4.1.8" + } + }, + "../don-tools-api-v2": { + "name": "@developer-overheid-nl/don-tools-logic", + "version": "2.0.0", + "license": "EUPL-1.2", "dependencies": { "@apiture/openapi-down-convert": "^0.14.2", - "@developer-overheid-nl/adr-rulesets": "github:developer-overheid-nl/adr-rulesets#da1327dfcc83ed130b1fe5aaa282b7bfba537aee", - "@redocly/cli": "^2.30.3", - "@scalar/openapi-upgrader": "^0.2.7", + "@developer-overheid-nl/adr-rulesets": "github:developer-overheid-nl/adr-rulesets#main", + "@redocly/openapi-core": "^2.31.5", + "@redocly/respect-core": "^2.31.5", + "@scalar/openapi-upgrader": "^0.2.9", + "@stoplight/spectral-core": "^1.23.0", "@stoplight/spectral-parsers": "^1.0.5", - "@stoplight/spectral-rulesets": "^1.22.1", - "@stoplight/spectral-runtime": "^1.1.5", - "body-parser": "^2.2.2", "case-anything": "^3.1.2", - "cors": "^2.8.6", - "express": "^5.2.1", - "express-openapi-validator": "^5.6.2", - "js-yaml": "^4.1.1", + "js-yaml": "^4.2.0", "jszip": "^3.10.1", - "openapi-to-postmanv2": "^6.0.1", - "winston": "^3.19.0" + "openapi-to-postmanv2": "^6.0.1" }, "devDependencies": { - "@biomejs/biome": "^2.4.13" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-14.2.1.tgz", - "integrity": "sha512-HmdFw9CDYqM6B25pqGBpNeLCKvGPlIx1EbLrVL0zPvj50CJQUHyBNBw45Muk0kEIkogo1VZvOKHajdMuAzSxRg==", - "license": "MIT", - "dependencies": { - "js-yaml": "^4.1.0" - }, - "engines": { - "node": ">= 20" - }, - "funding": { - "url": "https://github.com/sponsors/philsturgeon" - }, - "peerDependencies": { - "@types/json-schema": "^7.0.15" - } - }, - "node_modules/@apiture/openapi-down-convert": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@apiture/openapi-down-convert/-/openapi-down-convert-0.14.2.tgz", - "integrity": "sha512-vT3eqOEmJ4KZ2qojycEV0zzFBPDrkwntyfnWi8/WMaag8jvGN4osIdVRuwxWcK6AvQr32ohrpcLGqEZ+ZHVNcw==", - "license": "ISC", - "dependencies": { - "commander": "^9.4.1", - "js-yaml": "^4.1.0", - "typescript": "^4.8.4" - }, - "bin": { - "openapi-down-convert": "lib/src/cli.js" - } - }, - "node_modules/@apiture/openapi-down-convert/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/@asyncapi/specs": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@asyncapi/specs/-/specs-6.10.0.tgz", - "integrity": "sha512-vB5oKLsdrLUORIZ5BXortZTlVyGWWMC1Nud/0LtgxQ3Yn2738HigAD6EVqScvpPsDUI/bcLVsYEXN4dtXQHVng==", - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.11" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "@biomejs/biome": "^2.4.16", + "@types/js-yaml": "^4.0.9", + "@types/node": "^25.9.1", + "tsx": "^4.22.4", + "typescript": "^6.0.3", + "vite": "^8.0.16", + "vitest": "^4.1.8" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" + "node": ">=22", + "pnpm": ">=11" } }, "node_modules/@biomejs/biome": { - "version": "2.4.13", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.13.tgz", - "integrity": "sha512-gLXOwkOBBg0tr7bDsqlkIh4uFeKuMjxvqsrb1Tukww1iDmHcfr4Uu8MoQxp0Rcte+69+osRNWXwHsu/zxT6XqA==", + "version": "2.4.16", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.16.tgz", + "integrity": "sha512-x9ajFh1zChVybCiM3TN6OD4phAqLgtPZjFrZF+aTMYCPjwBO+k529TX7PPsAqtGNLeV4UgzwQnowEgS7bGmzcA==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -129,20 +76,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.4.13", - "@biomejs/cli-darwin-x64": "2.4.13", - "@biomejs/cli-linux-arm64": "2.4.13", - "@biomejs/cli-linux-arm64-musl": "2.4.13", - "@biomejs/cli-linux-x64": "2.4.13", - "@biomejs/cli-linux-x64-musl": "2.4.13", - "@biomejs/cli-win32-arm64": "2.4.13", - "@biomejs/cli-win32-x64": "2.4.13" + "@biomejs/cli-darwin-arm64": "2.4.16", + "@biomejs/cli-darwin-x64": "2.4.16", + "@biomejs/cli-linux-arm64": "2.4.16", + "@biomejs/cli-linux-arm64-musl": "2.4.16", + "@biomejs/cli-linux-x64": "2.4.16", + "@biomejs/cli-linux-x64-musl": "2.4.16", + "@biomejs/cli-win32-arm64": "2.4.16", + "@biomejs/cli-win32-x64": "2.4.16" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.4.13", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.13.tgz", - "integrity": "sha512-2KImO1jhNFBa2oWConyr0x6flxbQpGKv6902uGXpYM62Xyem8U80j441SyUJ8KyngsmKbQjeIv1q2CQfDkNnYg==", + "version": "2.4.16", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.16.tgz", + "integrity": "sha512-wxPvu4XOA85YJk9ixSWUmq/QBHbid85BISbOAqqBM/5xQpPk9ayjk5375tOlSC0BeCwNSbPFafQBm+vBumXq0A==", "cpu": [ "arm64" ], @@ -157,9 +104,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.4.13", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.13.tgz", - "integrity": "sha512-BKrJklbaFN4p1Ts4kPBczo+PkbsHQg57kmJ+vON9u2t6uN5okYHaSr7h/MutPCWQgg2lglaWoSmm+zhYW+oOkg==", + "version": "2.4.16", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.16.tgz", + "integrity": "sha512-xFCqGPwYusQJp4N4NJLi1XJiZqjwFdjhT+KqtNy+Ug3qgfczqnTa6MSDvxJF6TkuDLoYJItMapz6tAf7kCekFw==", "cpu": [ "x64" ], @@ -174,13 +121,16 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.4.13", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.13.tgz", - "integrity": "sha512-NzkUDSqfvMBrPplKgVr3aXLHZ2NEELvvF4vZxXulEylKWIGqlvNEcwUcj9OLrn75TD3lJ/GIqCVlBwd1MZCuYQ==", + "version": "2.4.16", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.16.tgz", + "integrity": "sha512-2kFb4//jxfZaP6D+Rj5VkHkxgyD9EoRAVBEQb8PKRv+s4NO2zYNJKXFaJmK1CmhufJOWEfpHKaRbOja7qjmdhQ==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -191,13 +141,16 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.4.13", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.13.tgz", - "integrity": "sha512-U5MsuBQW25dXaYtqWWSPM3P96H6Y+fHuja3TQpMNnylocHW0tEbtFTDlUj6oM+YJLntvEkQy4grBvQNUD4+RCg==", + "version": "2.4.16", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.16.tgz", + "integrity": "sha512-oYxnW0ARfJkr72ezzF2OR8N/rtkgLUQeYtF8cFhVswbknHxtTcmzSsanVJP8yQKnGpGpc2ck6c5zLvHahL6Cbg==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -208,13 +161,16 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.4.13", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.13.tgz", - "integrity": "sha512-Az3ZZedYRBo9EQzNnD9SxFcR1G5QsGo6VEc2hIyVPZ1rdKwee/7E9oeBBZFpE8Z44ekxsDQBqbiWGW5ShOhUSQ==", + "version": "2.4.16", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.16.tgz", + "integrity": "sha512-NbcBbi/nJqn5baae6wqRXdS7Gadf2uRpehSh6vMSYpG8OhkXl/Xg8aorWrJ+9VWqAT5ml90alLvorkpMW0nBwQ==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -225,13 +181,16 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.4.13", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.13.tgz", - "integrity": "sha512-Z601MienRgTBDza/+u2CH3RSrWoXo9rtr8NK6A4KJzqGgfxx+H3VlyLgTJ4sRo40T3pIsqpTmiOQEvYzQvBRvQ==", + "version": "2.4.16", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.16.tgz", + "integrity": "sha512-iHDS+MCM65DPqWGu+ECC3uoALyj2H7F4nVUPxIPjz/PIl94EUu+EDfGZDzFP+NY1EOPVt9NQvwFqq7HdMmowdg==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -242,9 +201,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.4.13", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.13.tgz", - "integrity": "sha512-Px9PS2B5/Q183bUwy/5VHqp3J2lzdOCeVGzMpphYfl8oSa7VDCqenBdqWpy6DCy/en4Rbf/Y1RieZF6dJPcc9A==", + "version": "2.4.16", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.16.tgz", + "integrity": "sha512-0rgImMsNb5v/chhkIFe3wu7PEFClS6RBAYUijGL9UsYN3PanSaoK24HSSuSJb1pYbYYVjzAyZTl3gtjJ84BM8A==", "cpu": [ "arm64" ], @@ -259,9 +218,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.4.13", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.13.tgz", - "integrity": "sha512-tTcMkXyBrmHi9BfrD2VNHs/5rYIUKETqsBlYOvSAABwBkJhSDVb5e7wPukftsQbO3WzQkXe6kaztC6WtUOXSoQ==", + "version": "2.4.16", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.16.tgz", + "integrity": "sha512-Kp85jgoBHa05gix6UIRjfCDiUV3w/8VIdZ247VyyO2gEjaw12WEVhdIjlxp/AMzXxqxQwbxNTDVZ3Mwd2RG5rw==", "cpu": [ "x64" ], @@ -275,5988 +234,2703 @@ "node": ">=14.21.3" } }, - "node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } + "node_modules/@developer-overheid-nl/don-tools-logic": { + "resolved": "../don-tools-api-v2", + "link": true }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", - "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "@so-ric/colorspace": "^1.1.6", - "enabled": "2.0.x", - "kuler": "^2.0.0" + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" } }, - "node_modules/@developer-overheid-nl/adr-rulesets": { - "version": "0.1.0", - "resolved": "git+ssh://git@github.com/developer-overheid-nl/adr-rulesets.git#da1327dfcc83ed130b1fe5aaa282b7bfba537aee", - "integrity": "sha512-SUFzrz7JkAJCjq+5NCS+SbbpI9YAqJGbgFv5POTnRrTMMg52U6lDJ/fdkTNyoOyPx2/9rtKlZYdicPKpUzeXtg==", - "license": "EUPL-1.2", + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "@stoplight/spectral-core": "^1.21.0", - "@stoplight/spectral-functions": "^1.10.1", - "@stoplight/spectral-rulesets": "^1.22.0" + "tslib": "^2.4.0" } }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", - "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "@emotion/memoize": "^0.9.0" + "tslib": "^2.4.0" } }, - "node_modules/@emotion/memoize": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", - "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", - "license": "MIT" - }, - "node_modules/@emotion/unitless": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", - "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", - "license": "MIT" - }, - "node_modules/@exodus/schemasafe": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", - "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==", - "license": "MIT" - }, - "node_modules/@faker-js/faker": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-5.5.3.tgz", - "integrity": "sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw==", - "deprecated": "Please update to a newer version.", - "license": "MIT" - }, - "node_modules/@humanwhocodes/momoa": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-2.0.4.tgz", - "integrity": "sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==", - "license": "Apache-2.0", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", + "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=10.10.0" + "node": ">=18" } }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "license": "MIT" - }, - "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==", + "node_modules/@esbuild/android-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", + "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 10.16.0" - }, - "peerDependencies": { - "jsep": "^0.4.0||^1.0.0" + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/android-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", + "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 10.16.0" - }, - "peerDependencies": { - "jsep": "^0.4.0||^1.0.0" + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/android-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", + "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 10.16.0" - }, - "peerDependencies": { - "jsep": "^0.4.0||^1.0.0" + "node": ">=18" } }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", + "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=18" } }, - "node_modules/@opentelemetry/api": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", - "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", - "license": "Apache-2.0", + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", + "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8.0.0" + "node": ">=18" } }, - "node_modules/@opentelemetry/api-logs": { - "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.214.0.tgz", - "integrity": "sha512-40lSJeqYO8Uz2Yj7u94/SJWE/wONa7rmMKjI1ZcIjgf3MHNHv1OZUCrCETGuaRF62d5pQD1wKIW+L4lmSMTzZA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.3.0" - }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", + "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8.0.0" + "node": ">=18" } }, - "node_modules/@opentelemetry/context-async-hooks": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.6.1.tgz", - "integrity": "sha512-XHzhwRNkBpeP8Fs/qjGrAf9r9PRv67wkJQ/7ZPaBQQ68DYlTBBx5MF9LvPx7mhuXcDessKK2b+DcxqwpgkcivQ==", - "license": "Apache-2.0", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", + "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "node": ">=18" } }, - "node_modules/@opentelemetry/core": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.1.tgz", - "integrity": "sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", + "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" + "node": ">=18" } }, - "node_modules/@opentelemetry/exporter-trace-otlp-http": { - "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.214.0.tgz", - "integrity": "sha512-kIN8nTBMgV2hXzV/a20BCFilPZdAIMYYJGSgfMMRm/Xa+07y5hRDS2Vm12A/z8Cdu3Sq++ZvJfElokX2rkgGgw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/otlp-exporter-base": "0.214.0", - "@opentelemetry/otlp-transformer": "0.214.0", - "@opentelemetry/resources": "2.6.1", - "@opentelemetry/sdk-trace-base": "2.6.1" - }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", + "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">=18" } }, - "node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.214.0.tgz", - "integrity": "sha512-u1Gdv0/E9wP+apqWf7Wv2npXmgJtxsW2XL0TEv9FZloTZRuMBKmu8cYVXwS4Hm3q/f/3FuCnPTgiwYvIqRSpRg==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/otlp-transformer": "0.214.0" - }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", + "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">=18" } }, - "node_modules/@opentelemetry/otlp-transformer": { - "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.214.0.tgz", - "integrity": "sha512-DSaYcuBRh6uozfsWN3R8HsN0yDhCuWP7tOFdkUOVaWD1KVJg8m4qiLUsg/tNhTLS9HUYUcwNpwL2eroLtsZZ/w==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.214.0", - "@opentelemetry/core": "2.6.1", - "@opentelemetry/resources": "2.6.1", - "@opentelemetry/sdk-logs": "0.214.0", - "@opentelemetry/sdk-metrics": "2.6.1", - "@opentelemetry/sdk-trace-base": "2.6.1", - "protobufjs": "^7.0.0" - }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", + "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" + "node": ">=18" } }, - "node_modules/@opentelemetry/resources": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.1.tgz", - "integrity": "sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", + "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" + "node": ">=18" } }, - "node_modules/@opentelemetry/sdk-logs": { - "version": "0.214.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.214.0.tgz", - "integrity": "sha512-zf6acnScjhsaBUU22zXZ/sLWim1dfhUAbGXdMmHmNG3LfBnQ3DKsOCITb2IZwoUsNNMTogqFKBnlIPPftUgGwA==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.214.0", - "@opentelemetry/core": "2.6.1", - "@opentelemetry/resources": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", + "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.4.0 <1.10.0" + "node": ">=18" } }, - "node_modules/@opentelemetry/sdk-metrics": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.6.1.tgz", - "integrity": "sha512-9t9hJHX15meBy2NmTJxL+NJfXmnausR2xUDvE19XQce0Qi/GBtDGamU8nS1RMbdgDmhgpm3VaOu2+fiS/SfTpQ==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/resources": "2.6.1" - }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", + "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-base": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.6.1.tgz", - "integrity": "sha512-r86ut4T1e8vNwB35CqCcKd45yzqH6/6Wzvpk2/cZB8PsPLlZFTvrh8yfOS3CYZYcUmAx4hHTZJ8AO8Dj8nrdhw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.6.1", - "@opentelemetry/resources": "2.6.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-node": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.6.1.tgz", - "integrity": "sha512-Hh2i4FwHWRFhnO2Q/p6svMxy8MPsNCG0uuzUY3glqm0rwM0nQvbTO1dXSp9OqQoTKXcQzaz9q1f65fsurmOhNw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/context-async-hooks": "2.6.1", - "@opentelemetry/core": "2.6.1", - "@opentelemetry/sdk-trace-base": "2.6.1" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.40.0.tgz", - "integrity": "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==", - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", - "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.1.tgz", - "integrity": "sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", - "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", - "license": "BSD-3-Clause" - }, - "node_modules/@redocly/ajv": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.18.3.tgz", - "integrity": "sha512-l42u0of3hY98sN2A+M4qTX1O/KrpgGH32Hu9kP2GtHyD5Dfqq86PKFLe5dwaD8DEnNmlOlll2BAmeEtf0DaySg==", - "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/@redocly/cli": { - "version": "2.30.3", - "resolved": "https://registry.npmjs.org/@redocly/cli/-/cli-2.30.3.tgz", - "integrity": "sha512-z2T4+v4qwyEl1Cb2bRS77sK3jiYDOnIVZUYF8/3OWA1N+4znGIvs85xm5pAqQE0kltoIJuisekqERMvhdG6Z4w==", - "license": "MIT", - "dependencies": { - "@opentelemetry/exporter-trace-otlp-http": "0.214.0", - "@opentelemetry/resources": "2.6.1", - "@opentelemetry/sdk-trace-node": "2.6.1", - "@opentelemetry/semantic-conventions": "1.40.0", - "@redocly/cli-otel": "0.1.2", - "@redocly/openapi-core": "2.30.3", - "@redocly/respect-core": "2.30.3", - "ajv": "npm:@redocly/ajv@8.18.1", - "ajv-formats": "^3.0.1", - "colorette": "^1.2.0", - "cookie": "^0.7.2", - "dotenv": "16.4.7", - "glob": "^13.0.5", - "handlebars": "^4.7.9", - "https-proxy-agent": "^7.0.5", - "mobx": "^6.0.4", - "picomatch": "^4.0.4", - "pluralize": "^8.0.0", - "react": "^17.0.0 || ^18.2.0 || ^19.2.1", - "react-dom": "^17.0.0 || ^18.2.0 || ^19.2.1", - "redoc": "2.5.1", - "semver": "^7.5.2", - "set-cookie-parser": "^2.3.5", - "simple-websocket": "^9.0.0", - "styled-components": "6.3.9", - "ulid": "^3.0.1", - "undici": "6.24.0", - "yargs": "17.0.1" - }, - "bin": { - "openapi": "bin/cli.js", - "redocly": "bin/cli.js" - }, - "engines": { - "node": ">=22.12.0 || >=20.19.0 <21.0.0", - "npm": ">=10" - } - }, - "node_modules/@redocly/cli-otel": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@redocly/cli-otel/-/cli-otel-0.1.2.tgz", - "integrity": "sha512-Bg7BoO5t1x3lVK+KhA5aGPmeXpQmdf6WtTYHhelKJCsQ+tRMiJoFAQoKHoBHAoNxXrhlS3K9lKFLHGmtxsFQfA==", - "license": "MIT", - "dependencies": { - "ulid": "^2.3.0" - } - }, - "node_modules/@redocly/cli-otel/node_modules/ulid": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.4.0.tgz", - "integrity": "sha512-fIRiVTJNcSRmXKPZtGzFQv9WRrZ3M9eoptl/teFJvjOzmpU+/K/JH6HZ8deBfb5vMEpicJcLn7JmvdknlMq7Zg==", - "license": "MIT", - "bin": { - "ulid": "bin/cli.js" - } - }, - "node_modules/@redocly/cli/node_modules/ajv": { - "name": "@redocly/ajv", - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.18.1.tgz", - "integrity": "sha512-Ifm/pP/tul1qmAecpbVxCBluVE32rKfjf8gYXH4xI2gCv9mRWFhJMHzkPDM4TXlxwPQYIFegymlsy8lXz7optA==", - "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/@redocly/cli/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==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/@redocly/cli/node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/@redocly/cli/node_modules/yargs": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.0.1.tgz", - "integrity": "sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==", - "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": ">=12" - } - }, - "node_modules/@redocly/cli/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==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/@redocly/config": { - "version": "0.48.1", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.48.1.tgz", - "integrity": "sha512-vq8GM3e0KiglqkwE5Lb9XayrmZY4dHCs21BsvV92yAZN68f1N9cZUuwY1SwnztPbH06dn9uLzubBl/JNfImqfA==", - "license": "MIT", - "dependencies": { - "json-schema-to-ts": "2.7.2" - } - }, - "node_modules/@redocly/openapi-core": { - "version": "2.30.3", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-2.30.3.tgz", - "integrity": "sha512-roSwxkitl+JY3LajLEg6n9ujaFkCB4cqtjgrjXxedgk57Qde5t0Vn4HBYkOomw1bHOI7W+Ux2qfPQOpzK7BnLg==", - "license": "MIT", - "dependencies": { - "@redocly/ajv": "^8.18.1", - "@redocly/config": "^0.48.1", - "ajv": "npm:@redocly/ajv@8.18.1", - "ajv-formats": "^3.0.1", - "colorette": "^1.2.0", - "js-levenshtein": "^1.1.6", - "js-yaml": "^4.1.0", - "picomatch": "^4.0.4", - "pluralize": "^8.0.0", - "yaml-ast-parser": "0.0.43" - }, - "engines": { - "node": ">=22.12.0 || >=20.19.0 <21.0.0", - "npm": ">=10" - } - }, - "node_modules/@redocly/openapi-core/node_modules/ajv": { - "name": "@redocly/ajv", - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.18.1.tgz", - "integrity": "sha512-Ifm/pP/tul1qmAecpbVxCBluVE32rKfjf8gYXH4xI2gCv9mRWFhJMHzkPDM4TXlxwPQYIFegymlsy8lXz7optA==", - "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/@redocly/respect-core": { - "version": "2.30.3", - "resolved": "https://registry.npmjs.org/@redocly/respect-core/-/respect-core-2.30.3.tgz", - "integrity": "sha512-9bEETk86ECE6n/0g/6MEQ3RryamTOv6mdZ0WDmHUmO3PfVUzHKFRgNcFnvyTWEC2nApdO9GbnYLjZcwyPwUdOw==", - "license": "MIT", - "dependencies": { - "@faker-js/faker": "^7.6.0", - "@noble/hashes": "^1.8.0", - "@redocly/ajv": "^8.18.1", - "@redocly/openapi-core": "2.30.3", - "ajv": "npm:@redocly/ajv@8.18.1", - "better-ajv-errors": "^2.0.3", - "colorette": "^2.0.20", - "json-pointer": "^0.6.2", - "jsonpath-rfc9535": "1.3.0", - "openapi-sampler": "^1.7.1", - "outdent": "^0.8.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=22.12.0 || >=20.19.0 <21.0.0", - "npm": ">=10" - } - }, - "node_modules/@redocly/respect-core/node_modules/@faker-js/faker": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.6.0.tgz", - "integrity": "sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==", - "license": "MIT", - "engines": { - "node": ">=14.0.0", - "npm": ">=6.0.0" - } - }, - "node_modules/@redocly/respect-core/node_modules/ajv": { - "name": "@redocly/ajv", - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.18.1.tgz", - "integrity": "sha512-Ifm/pP/tul1qmAecpbVxCBluVE32rKfjf8gYXH4xI2gCv9mRWFhJMHzkPDM4TXlxwPQYIFegymlsy8lXz7optA==", - "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/@redocly/respect-core/node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "license": "MIT" - }, - "node_modules/@scalar/openapi-types": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@scalar/openapi-types/-/openapi-types-0.8.0.tgz", - "integrity": "sha512-WmaxVSfvY5K/TwcG2B2TU1WOe1As1uc2s7myswtP6dBlcjU3hM08SApxv/jmyGaCE8t4gO5BBhmHY4pDUfmr2g==", - "license": "MIT", - "engines": { - "node": ">=22" - } - }, - "node_modules/@scalar/openapi-upgrader": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@scalar/openapi-upgrader/-/openapi-upgrader-0.2.7.tgz", - "integrity": "sha512-sC/uLQOivfX+Oef2QhUpgmERL7KZc1z+hiYkcwZQaUyVOHh5e6OscW0skfzbxKPyJfQ6Ocv0Iom9wMToCGaAPw==", - "license": "MIT", - "dependencies": { - "@scalar/openapi-types": "0.8.0" - }, - "engines": { - "node": ">=22" - } - }, - "node_modules/@so-ric/colorspace": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", - "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", - "license": "MIT", - "dependencies": { - "color": "^5.0.2", - "text-hex": "1.0.x" - } - }, - "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/@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": { - "node-fetch": "^2.6.0", - "tslib": "^1.14.1" - }, - "engines": { - "node": ">=8.3.0" - } - }, - "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": { - "@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": ">=8.3.0" - } - }, - "node_modules/@stoplight/json-ref-resolver/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/@stoplight/json/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/@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": ">=8" - } - }, - "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": ">=8" - } - }, - "node_modules/@stoplight/spectral-core": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.22.0.tgz", - "integrity": "sha512-4hTxMDs4TFUG4/jKjaZttA65gNuV2PCKI9+51I+J4nL6ylo17DlbW+sl6byKnBuV/85HxaV33ri5fEGlp8lTSA==", - "license": "Apache-2.0", - "dependencies": { - "@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/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": { - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - }, - "engines": { - "node": "^12.20 || >= 14.13" - }, - "peerDependencies": { - "ajv": ">=8" - } - }, - "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": "^12.20 || >=14.13" - } - }, - "node_modules/@stoplight/spectral-core/node_modules/ajv-errors": { - "version": "3.0.0", - "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/@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": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/@stoplight/spectral-core/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/@stoplight/spectral-core/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/@stoplight/spectral-formats": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-formats/-/spectral-formats-1.8.2.tgz", - "integrity": "sha512-c06HB+rOKfe7tuxg0IdKDEA5XnjL2vrn/m/OVIIxtINtBzphZrOgtRn7epQ5bQF5SWp84Ue7UJWaGgDwVngMFw==", - "license": "Apache-2.0", - "dependencies": { - "@stoplight/json": "^3.17.0", - "@stoplight/spectral-core": "^1.19.2", - "@types/json-schema": "^7.0.7", - "tslib": "^2.8.1" - }, - "engines": { - "node": "^16.20 || ^18.18 || >= 20.17" - } - }, - "node_modules/@stoplight/spectral-formats/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/@stoplight/spectral-functions": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-functions/-/spectral-functions-1.10.1.tgz", - "integrity": "sha512-obu8ZfoHxELOapfGsCJixKZXZcffjg+lSoNuttpmUFuDzVLT3VmH8QkPXfOGOL5Pz80BR35ClNAToDkdnYIURg==", - "license": "Apache-2.0", - "dependencies": { - "@stoplight/better-ajv-errors": "1.0.3", - "@stoplight/json": "^3.17.1", - "@stoplight/spectral-core": "^1.19.4", - "@stoplight/spectral-formats": "^1.8.1", - "@stoplight/spectral-runtime": "^1.1.2", - "ajv": "^8.17.1", - "ajv-draft-04": "~1.0.0", - "ajv-errors": "~3.0.0", - "ajv-formats": "~2.1.1", - "lodash": "~4.17.21", - "tslib": "^2.8.1" - }, - "engines": { - "node": "^16.20 || ^18.18 || >= 20.17" - } - }, - "node_modules/@stoplight/spectral-functions/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": { - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - }, - "engines": { - "node": "^12.20 || >= 14.13" - }, - "peerDependencies": { - "ajv": ">=8" - } - }, - "node_modules/@stoplight/spectral-functions/node_modules/ajv-errors": { - "version": "3.0.0", - "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/@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": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/@stoplight/spectral-functions/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "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", - "dependencies": { - "@stoplight/json": "~3.21.0", - "@stoplight/types": "^14.1.1", - "@stoplight/yaml": "~4.3.0", - "tslib": "^2.8.1" - }, - "engines": { - "node": "^16.20 || ^18.18 || >= 20.17" - } - }, - "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": { - "@types/json-schema": "^7.0.4", - "utility-types": "^3.10.0" - }, - "engines": { - "node": "^12.20 || >=14.13" - } - }, - "node_modules/@stoplight/spectral-parsers/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "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": "^16.20 || ^18.18 || >= 20.17" - } - }, - "node_modules/@stoplight/spectral-ref-resolver/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/@stoplight/spectral-rulesets": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-rulesets/-/spectral-rulesets-1.22.1.tgz", - "integrity": "sha512-DaaQJioKuYkRsOuKIJfX2ek7G7f6OCU3CI3K7ABaOcTFMiHj29SJLDdb04mCjXZFXMlXHjmCl2ZpKW6heieXpw==", - "license": "Apache-2.0", - "dependencies": { - "@asyncapi/specs": "^6.8.0", - "@stoplight/better-ajv-errors": "1.0.3", - "@stoplight/json": "^3.17.0", - "@stoplight/spectral-core": "^1.19.4", - "@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" - }, - "engines": { - "node": "^16.20 || ^18.18 || >= 20.17" - } - }, - "node_modules/@stoplight/spectral-rulesets/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": { - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - }, - "engines": { - "node": "^12.20 || >= 14.13" - }, - "peerDependencies": { - "ajv": ">=8" - } - }, - "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": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/@stoplight/spectral-rulesets/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/@stoplight/spectral-rulesets/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/@stoplight/spectral-runtime": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-runtime/-/spectral-runtime-1.1.5.tgz", - "integrity": "sha512-6/HSCQBKnI4M5qonCKos2W7oggXv+U/ml+m/cAd4eJAYfIVEmaLUo03qSWIIl4cBc5ujJPmn2WnCiRrz1++P7Q==", - "license": "Apache-2.0", - "dependencies": { - "@stoplight/json": "^3.20.1", - "@stoplight/path": "^1.3.2", - "@stoplight/types": "^13.6.0", - "abort-controller": "^3.0.0", - "lodash": "^4.18.1", - "node-fetch": "^2.7.0", - "tslib": "^2.8.1" - }, - "engines": { - "node": "^16.20 || ^18.18 || >= 20.17" - } - }, - "node_modules/@stoplight/spectral-runtime/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/@stoplight/spectral-runtime/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "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": "^12.20 || >=14.13" - } - }, - "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": ">=10.8" - } - }, - "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/@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": { - "@types/json-schema": "^7.0.4", - "utility-types": "^3.10.0" - }, - "engines": { - "node": "^12.20 || >=14.13" - } - }, - "node_modules/@stoplight/yaml/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "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", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", - "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "^2" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", - "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "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/multer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/multer/-/multer-2.1.0.tgz", - "integrity": "sha512-zYZb0+nJhOHtPpGDb3vqPjwpdeGlGC157VpkqNQL+UU2qwoacoQ7MpsAmUptI/0Oa127X32JzWDqQVEXp2RcIA==", - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/node": { - "version": "24.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz", - "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@types/qs": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", - "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*" - } - }, - "node_modules/@types/stylis": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.7.tgz", - "integrity": "sha512-VgDNokpBoKF+wrdvhAAfS55OMQpL6QRglwTwNC3kIgBrzZxA4WsFj+2eLfEA/uMUDzBcEhYmjSbwQakn/i3ajA==", - "license": "MIT" - }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT" - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT", - "optional": true - }, - "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/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "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", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "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": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-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-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": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "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/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/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", - "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/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": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/astring": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", - "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", - "license": "MIT", - "bin": { - "astring": "bin/astring" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "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": ">= 0.4" - } - }, - "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", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/better-ajv-errors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/better-ajv-errors/-/better-ajv-errors-2.0.3.tgz", - "integrity": "sha512-t1vxUP+vYKsaYi/BbKo2K98nEAZmfi4sjwvmRT8aOPDzPJeAtLurfoIDazVkLILxO4K+Sw4YrLYnBQ46l6pePg==", - "license": "Apache-2.0", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@humanwhocodes/momoa": "^2.0.4", - "chalk": "^4.1.2", - "jsonpointer": "^5.0.1", - "leven": "^3.1.0 < 4" - }, - "engines": { - "node": ">= 18.20.6" - }, - "peerDependencies": { - "ajv": "4.11.8 - 8" - } - }, - "node_modules/body-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.1", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.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", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.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.4" - } - }, - "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/call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", - "license": "MIT" - }, - "node_modules/camelize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", - "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/case-anything": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-3.1.2.tgz", - "integrity": "sha512-wljhAjDDIv/hM2FzgJnYQg90AWmZMNtESCjTeLH680qTzdo0nErlCxOmgzgX4ZsZAtIvqHyD87ES8QyriXB+BQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "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/charset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", - "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", - "license": "MIT" - }, - "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==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/color": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/color/-/color-5.0.2.tgz", - "integrity": "sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==", - "license": "MIT", - "dependencies": { - "color-convert": "^3.0.1", - "color-string": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "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/color-string": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.2.tgz", - "integrity": "sha512-RxmjYxbWemV9gKu4zPgiZagUxbH3RQpEIO77XoSSX0ivgABDZ+h8Zuash/EMFLTI4N9QgFPOJ6JQpPZKFxa+dA==", - "license": "MIT", - "dependencies": { - "color-name": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/color-string/node_modules/color-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.2.tgz", - "integrity": "sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==", - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/color/node_modules/color-convert": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.2.tgz", - "integrity": "sha512-UNqkvCDXstVck3kdowtOTWROIJQwafjOfXSmddoDrXo4cewMKmusCeF22Q24zvjR8nwWib/3S/dfyzPItPEiJg==", - "license": "MIT", - "dependencies": { - "color-name": "^2.0.0" - }, - "engines": { - "node": ">=14.6" - } - }, - "node_modules/color/node_modules/color-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.2.tgz", - "integrity": "sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==", - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "license": "MIT" - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, - "node_modules/compute-gcd": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz", - "integrity": "sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==", - "dependencies": { - "validate.io-array": "^1.0.3", - "validate.io-function": "^1.0.2", - "validate.io-integer-array": "^1.0.0" - } - }, - "node_modules/compute-lcm": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz", - "integrity": "sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==", - "dependencies": { - "compute-gcd": "^1.2.1", - "validate.io-array": "^1.0.3", - "validate.io-function": "^1.0.2", - "validate.io-integer-array": "^1.0.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/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "engines": [ - "node >= 6.0" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/core-js": { - "version": "3.46.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.46.0.tgz", - "integrity": "sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==", - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "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", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/css-to-react-native": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", - "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "license": "MIT", - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "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/decko": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decko/-/decko-1.2.0.tgz", - "integrity": "sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ==" - }, - "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", - "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/dompurify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.0.tgz", - "integrity": "sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==", - "license": "(MPL-2.0 OR Apache-2.0)", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } - }, - "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/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" - }, - "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/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "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", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", - "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-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-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "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-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", - "license": "MIT" - }, - "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" - }, - "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", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" - }, - "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", - "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-openapi-validator": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/express-openapi-validator/-/express-openapi-validator-5.6.2.tgz", - "integrity": "sha512-fkDn4+ImUC4HTJ1g0cek/ItqYhmEO19AglJd2Iw2OJco0jLIbxIlDGVazmXbvvYeziU4Bnah2h+S2tb6NtWg8w==", - "license": "MIT", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^14.2.1", - "@types/multer": "^2.0.0", - "ajv": "^8.17.1", - "ajv-draft-04": "^1.0.0", - "ajv-formats": "^3.0.1", - "content-type": "^1.0.5", - "json-schema-traverse": "^1.0.0", - "lodash.clonedeep": "^4.5.0", - "lodash.get": "^4.4.2", - "media-typer": "^1.1.0", - "multer": "^2.0.2", - "ono": "^7.1.3", - "path-to-regexp": "^8.3.0", - "qs": "^6.14.1" - }, - "peerDependencies": { - "express": "*" - } - }, - "node_modules/express/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", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "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-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fast-xml-builder": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.2.tgz", - "integrity": "sha512-NJAmiuVaJEjVa7TjLZKlYd7RqmzOC91EtPFXHvlTcqBVo50Qh7XV5IwvXi1c7NRz2Q/majGX9YLcwJtWgHjtkA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "path-expression-matcher": "^1.1.3" - } - }, - "node_modules/fast-xml-parser": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.3.tgz", - "integrity": "sha512-Ymnuefk6VzAhT3SxLzVUw+nMio/wB1NGypHkgetwtXcK1JfryaHk4DWQFGVwQ9XgzyS5iRZ7C2ZGI4AMsdMZ6A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "fast-xml-builder": "^1.1.2", - "path-expression-matcher": "^1.1.3", - "strnum": "^2.1.2" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT" - }, - "node_modules/file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "license": "MIT", - "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": ">= 0.8" - } - }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT" - }, - "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/foreach": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", - "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", - "license": "MIT" - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "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", - "engines": { - "node": ">= 0.8" - } - }, - "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.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "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/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-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-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-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/glob": { - "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", - "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/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": "18 || 20 || >=22" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.2.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", - "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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/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/graphlib": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", - "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.15" - } - }, - "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/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/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-reasons": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", - "integrity": "sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ==", - "license": "Apache-2.0" - }, - "node_modules/http2-client": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", - "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==", - "license": "MIT" - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "license": "MIT" - }, - "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/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/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/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", - "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-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-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-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": "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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-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-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-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "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": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "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-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": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" - }, - "node_modules/js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "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/json-pointer": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", - "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", - "license": "MIT", - "dependencies": { - "foreach": "^2.0.4" - } - }, - "node_modules/json-schema-compare": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz", - "integrity": "sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.4" - } - }, - "node_modules/json-schema-merge-allof": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/json-schema-merge-allof/-/json-schema-merge-allof-0.8.1.tgz", - "integrity": "sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w==", - "license": "MIT", - "dependencies": { - "compute-lcm": "^1.1.2", - "json-schema-compare": "^0.2.2", - "lodash": "^4.17.20" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/json-schema-to-ts": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-2.7.2.tgz", - "integrity": "sha512-R1JfqKqbBR4qE8UyBR56Ms30LL62/nlhoz+1UkfI/VE7p54Awu919FZ6ZUPG8zIa3XB65usPJgr1ONVncUGSaQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@types/json-schema": "^7.0.9", - "ts-algebra": "^1.2.0" - }, - "engines": { - "node": ">=16" - } - }, - "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/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/jsonpath-plus": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.3.0.tgz", - "integrity": "sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==", - "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-rfc9535": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsonpath-rfc9535/-/jsonpath-rfc9535-1.3.0.tgz", - "integrity": "sha512-3jFHya7oZ45aDxIIdx+/zQARahHXxFSMWBkcBUldfXpLS9VCXDJyTKt35kQfEXLqh0K3Ixw/9xFnvcDStaxh7Q==", - "license": "Apache-2.0", - "engines": { - "node": ">=20" - } - }, - "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/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "license": "(MIT OR GPL-3.0-or-later)", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jszip/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/jszip/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==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/jszip/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==", - "license": "MIT" - }, - "node_modules/jszip/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==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "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/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/liquid-json": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz", - "integrity": "sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "license": "MIT" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", - "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/logform": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", - "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", - "license": "MIT", - "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0" - }, - "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.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "license": "MIT" - }, - "node_modules/mark.js": { - "version": "8.11.1", - "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", - "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", - "license": "MIT" - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "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": ">=18" } }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", + "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", + "cpu": [ + "s390x" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.8" + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/linux-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", + "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", + "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "bin": { - "mime": "cli.js" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=10.0.0" + "node": ">=18" } }, - "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/@esbuild/netbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", + "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-format": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mime-format/-/mime-format-2.0.2.tgz", - "integrity": "sha512-Y5ERWVcyh3sby9Fx2U5F1yatiTFjNsqF5NltihTWI9QgNtr5o3dbCZdcKa1l2wyfhnwwoP9HGNxga7LqZLA6gw==", - "license": "Apache-2.0", - "dependencies": { - "charset": "^1.0.0" + "node": ">=18" } }, - "node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", + "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": "*" + "node": ">=18" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", + "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", + "cpu": [ + "x64" + ], + "dev": true, "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==", - "license": "BlueOak-1.0.0", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mobx": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.15.0.tgz", - "integrity": "sha512-UczzB+0nnwGotYSgllfARAqWCJ5e/skuV2K/l+Zyck/H6pJIhLXuBnz+6vn2i211o7DtbE78HQtsYEKICHGI+g==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mobx" - } - }, - "node_modules/mobx-react": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-9.2.0.tgz", - "integrity": "sha512-dkGWCx+S0/1mfiuFfHRH8D9cplmwhxOV5CkXMp38u6rQGG2Pv3FWYztS0M7ncR6TyPRQKaTG/pnitInoYE9Vrw==", - "license": "MIT", - "dependencies": { - "mobx-react-lite": "^4.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mobx" - }, - "peerDependencies": { - "mobx": "^6.9.0", - "react": "^16.8.0 || ^17 || ^18 || ^19" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } + "node": ">=18" } }, - "node_modules/mobx-react-lite": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-4.1.1.tgz", - "integrity": "sha512-iUxiMpsvNraCKXU+yPotsOncNNmyeS2B5DKL+TL6Tar/xm+wwNJAubJmtRSeAoYawdZqwv8Z/+5nPRHeQxTiXg==", - "license": "MIT", - "dependencies": { - "use-sync-external-store": "^1.4.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mobx" - }, - "peerDependencies": { - "mobx": "^6.9.0", - "react": "^16.8.0 || ^17 || ^18 || ^19" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", + "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "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/multer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", - "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", + "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.6.0", - "concat-stream": "^2.0.0", - "mkdirp": "^0.5.6", - "object-assign": "^4.1.1", - "type-is": "^1.6.18", - "xtend": "^4.0.2" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">= 10.16.0" + "node": ">=18" } }, - "node_modules/multer/node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", + "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.6" + "node": ">=18" } }, - "node_modules/multer/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", + "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", + "cpu": [ + "ia32" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.6" + "node": ">=18" } }, - "node_modules/multer/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/@esbuild/win32-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", + "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.6" + "node": ">=18" } }, - "node_modules/multer/node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/@fastify/ajv-compiler": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.5.tgz", + "integrity": "sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-uri": "^3.0.0" } }, - "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "node_modules/@fastify/cors": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-11.2.0.tgz", + "integrity": "sha512-LbLHBuSAdGdSFZYTLVA3+Ch2t+sA6nq3Ejc6XLAKiQ6ViS2qFnvicpj0htsx03FyYeLs04HfRNBsz/a8SvbcUw==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/ai" + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" } ], "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "dependencies": { + "fastify-plugin": "^5.0.0", + "toad-cache": "^3.7.0" } }, - "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==", + "node_modules/@fastify/error": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.2.0.tgz", + "integrity": "sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.3.tgz", + "integrity": "sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "fast-json-stringify": "^6.0.0" } }, - "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/@fastify/forwarded": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@fastify/forwarded/-/forwarded-3.0.1.tgz", + "integrity": "sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "license": "MIT" }, - "node_modules/neotraverse": { - "version": "0.6.15", - "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.15.tgz", - "integrity": "sha512-HZpdkco+JeXq0G+WWpMJ4NsX3pqb5O7eR9uGz3FfoFt+LYzU8iRWp49nJtud6hsDoywM8tIrDo3gjgmOqJA8LA==", + "node_modules/@fastify/merge-json-schemas": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.2.1.tgz", + "integrity": "sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "license": "MIT", - "engines": { - "node": ">= 10" + "dependencies": { + "dequal": "^2.0.3" } }, - "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", + "node_modules/@fastify/proxy-addr": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.1.0.tgz", + "integrity": "sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", "dependencies": { - "@jsep-plugin/regex": "^1.0.1", - "@jsep-plugin/ternary": "^1.0.2", - "astring": "^1.8.1", - "jsep": "^1.2.0" - }, + "@fastify/forwarded": "^3.0.0", + "ipaddr.js": "^2.1.0" + } + }, + "node_modules/@fastify/proxy-addr/node_modules/ipaddr.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz", + "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==", + "license": "MIT", "engines": { - "node": "^12.20 || >=14.13" - }, - "optionalDependencies": { - "jsonpath-plus": "^6.0.1 || ^10.1.0", - "lodash.topath": "^4.5.2" + "node": ">= 10" } }, - "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==", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "whatwg-url": "^5.0.0" + "@tybys/wasm-util": "^0.10.1" }, - "engines": { - "node": "4.x || >=6.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" }, "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" } }, - "node_modules/node-fetch-h2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", - "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", + "node_modules/@oxc-project/types": { + "version": "0.133.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", + "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", + "dev": true, "license": "MIT", - "dependencies": { - "http2-client": "^1.2.5" - }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", + "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "4.x || >=6.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/node-readfiles": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", - "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", + "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "es6-promise": "^3.2.1" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/oas-kit-common": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", - "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", - "license": "BSD-3-Clause", - "dependencies": { - "fast-safe-stringify": "^2.0.7" + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", + "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/oas-linter": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", - "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", - "license": "BSD-3-Clause", - "dependencies": { - "@exodus/schemasafe": "^1.0.0-rc.2", - "should": "^13.2.1", - "yaml": "^1.10.0" - }, - "funding": { - "url": "https://github.com/Mermade/oas-kit?sponsor=1" + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", + "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/oas-resolver": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", - "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", - "license": "BSD-3-Clause", - "dependencies": { - "node-fetch-h2": "^2.3.0", - "oas-kit-common": "^1.0.8", - "reftools": "^1.1.9", - "yaml": "^1.10.0", - "yargs": "^17.0.1" - }, - "bin": { - "resolve": "resolve.js" - }, - "funding": { - "url": "https://github.com/Mermade/oas-kit?sponsor=1" + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", + "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/oas-resolver-browser": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/oas-resolver-browser/-/oas-resolver-browser-2.5.6.tgz", - "integrity": "sha512-Jw5elT/kwUJrnGaVuRWe1D7hmnYWB8rfDDjBnpQ+RYY/dzAewGXeTexXzt4fGEo6PUE4eqKqPWF79MZxxvMppA==", - "license": "BSD-3-Clause", - "dependencies": { - "node-fetch-h2": "^2.3.0", - "oas-kit-common": "^1.0.8", - "path-browserify": "^1.0.1", - "reftools": "^1.1.9", - "yaml": "^1.10.0", - "yargs": "^17.0.1" - }, - "bin": { - "resolve": "resolve.js" - }, - "funding": { - "url": "https://github.com/Mermade/oas-kit?sponsor=1" + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", + "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/oas-schema-walker": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", - "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", - "license": "BSD-3-Clause", - "funding": { - "url": "https://github.com/Mermade/oas-kit?sponsor=1" + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", + "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/oas-validator": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", - "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", - "license": "BSD-3-Clause", - "dependencies": { - "call-me-maybe": "^1.0.1", - "oas-kit-common": "^1.0.8", - "oas-linter": "^3.2.2", - "oas-resolver": "^2.5.6", - "oas-schema-walker": "^1.1.5", - "reftools": "^1.1.9", - "should": "^13.2.1", - "yaml": "^1.10.0" - }, - "funding": { - "url": "https://github.com/Mermade/oas-kit?sponsor=1" + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", + "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "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==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", + "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", + "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 6" + "node": "^20.19.0 || >=22.12.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==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", + "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^20.19.0 || >=22.12.0" } }, - "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==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", + "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], "engines": { - "node": ">= 0.4" + "node": "^20.19.0 || >=22.12.0" } }, - "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==", + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", + "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", + "cpu": [ + "wasm32" + ], + "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "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" + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^20.19.0 || >=22.12.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==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", + "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.8" + "node": "^20.19.0 || >=22.12.0" } }, - "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", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", + "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@seriousme/openapi-schema-validator": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@seriousme/openapi-schema-validator/-/openapi-schema-validator-2.9.0.tgz", + "integrity": "sha512-bP/48Il7RMxhohq36Vg0c25tnCKOO+oEv8XSxDefuUBj0W8fYzL2Yb6C8tji0WBXykZ1S/79AWbrzGLfCG2dYw==", + "license": "MIT", "dependencies": { - "wrappy": "1" + "ajv": "^8.18.0", + "ajv-draft-04": "^1.0.0", + "ajv-formats": "^3.0.1", + "yaml": "^2.8.3" + }, + "bin": { + "bundle-api": "bin/bundle-api-cli.js", + "validate-api": "bin/validate-api-cli.js" } }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "fn.name": "1.x.x" + "tslib": "^2.4.0" } }, - "node_modules/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-9jnfVriq7uJM4o5ganUY54ntUm+5EK21EGaQ5NWnkWg3zz5ywbbonlBguRcnmF1/HDiIe3zxNxXcO1YPBmPcQQ==", + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, "license": "MIT", "dependencies": { - "@jsdevtools/ono": "7.1.3" + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" } }, - "node_modules/openapi-sampler": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.7.2.tgz", - "integrity": "sha512-OKytvqB5XIaTgA9xtw8W8UTar+uymW2xPVpFN0NihMtuHPdPTGxBEhGnfFnJW5g/gOSIvkP+H0Xh3XhVI9/n7g==", + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", + "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", + "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.7", - "fast-xml-parser": "^5.5.1", - "json-pointer": "0.6.2" + "undici-types": ">=7.24.0 <7.24.7" } }, - "node_modules/openapi-to-postmanv2": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/openapi-to-postmanv2/-/openapi-to-postmanv2-6.0.1.tgz", - "integrity": "sha512-zAjaTwXo07az6jjvZTw4d26QMQsFxZBxTqjj3LQQMDCCuO6+peATQc9bSmAq3QbzvikP+h2WEjTphMcIrcSurg==", - "license": "Apache-2.0", + "node_modules/@vitest/expect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.8.tgz", + "integrity": "sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==", + "dev": true, + "license": "MIT", "dependencies": { - "ajv": "^8.11.0", - "ajv-draft-04": "1.0.0", - "ajv-formats": "2.1.1", - "async": "3.2.6", - "commander": "2.20.3", - "graphlib": "2.1.8", - "js-yaml": "4.1.0", - "json-pointer": "0.6.2", - "json-schema-merge-allof": "0.8.1", - "lodash": "4.17.21", - "neotraverse": "0.6.15", - "oas-resolver-browser": "2.5.6", - "object-hash": "3.0.0", - "openapi-types": "^12.1.3", - "path-browserify": "1.0.1", - "postman-collection": "^5.0.0", - "swagger2openapi": "7.0.8", - "yaml": "1.10.2" + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.8", + "@vitest/utils": "4.1.8", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" }, - "bin": { - "openapi2postmanv2": "bin/openapi2postmanv2.js" - }, - "engines": { - "node": ">=18" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/openapi-to-postmanv2/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==", + "node_modules/@vitest/mocker": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.8.tgz", + "integrity": "sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==", + "dev": true, "license": "MIT", "dependencies": { - "ajv": "^8.0.0" + "@vitest/spy": "4.1.8", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "ajv": "^8.0.0" + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { - "ajv": { + "msw": { + "optional": true + }, + "vite": { "optional": true } } }, - "node_modules/openapi-to-postmanv2/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/@vitest/pretty-format": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.8.tgz", + "integrity": "sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==", + "dev": true, "license": "MIT", "dependencies": { - "argparse": "^2.0.1" + "tinyrainbow": "^3.1.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/openapi-types": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", - "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", - "license": "MIT" - }, - "node_modules/outdent": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.8.0.tgz", - "integrity": "sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==", - "license": "MIT" - }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "node_modules/@vitest/runner": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.8.tgz", + "integrity": "sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==", + "dev": true, "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "@vitest/utils": "4.1.8", + "pathe": "^2.0.3" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/vitest" } }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/@vitest/snapshot": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.8.tgz", + "integrity": "sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8" + "dependencies": { + "@vitest/pretty-format": "4.1.8", + "@vitest/utils": "4.1.8", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "license": "MIT" - }, - "node_modules/path-expression-matcher": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz", - "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], + "node_modules/@vitest/spy": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.8.tgz", + "integrity": "sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "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==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://opencollective.com/vitest" } }, - "node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "node_modules/@vitest/utils": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.8.tgz", + "integrity": "sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==", + "dev": true, "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.8", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://opencollective.com/vitest" } }, - "node_modules/perfect-scrollbar": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.6.tgz", - "integrity": "sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw==", + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", "license": "MIT" }, - "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.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "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", - "engines": { - "node": ">=12" + "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": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "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", - "engines": { - "node": ">=4" + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/polished": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", - "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", + "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": { - "@babel/runtime": "^7.17.8" + "ajv": "^8.0.0" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "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", + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12.0.0" + "node": ">=12" } }, - "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==", + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=8.0.0" } }, - "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "node_modules/avvio": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.2.0.tgz", + "integrity": "sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==", "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/fastify" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "opencollective", + "url": "https://opencollective.com/fastify" } ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" + "@fastify/error": "^4.0.0", + "fastq": "^1.17.1" } }, - "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/postman-collection": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-5.2.0.tgz", - "integrity": "sha512-ktjlchtpoCw+FZRg+WwnGWH1w9oQDNUBLSRh+9ETPqFAz3SupqHqRuMh74xjQ+PvTWY/WH2JR4ZW+1sH58Ul1g==", - "license": "Apache-2.0", - "dependencies": { - "@faker-js/faker": "5.5.3", - "file-type": "3.9.0", - "http-reasons": "0.1.0", - "iconv-lite": "0.6.3", - "liquid-json": "0.3.1", - "lodash": "4.17.21", - "mime": "3.0.0", - "mime-format": "2.0.2", - "postman-url-encoder": "3.0.8", - "semver": "7.7.1", - "uuid": "8.3.2" - }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", "engines": { "node": ">=18" } }, - "node_modules/postman-url-encoder": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-3.0.8.tgz", - "integrity": "sha512-EOgUMBazo7JNP4TDrd64TsooCiWzzo4143Ws8E8WYGEpn2PKpq+S4XRTDhuRTYHm3VKOpUZs7ZYZq7zSDuesqA==", - "license": "Apache-2.0", - "dependencies": { - "punycode": "^2.3.1" - }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/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/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": "*" } }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } }, - "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==", + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, "license": "MIT", "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" + "once": "^1.4.0" } }, - "node_modules/protobufjs": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.6.tgz", - "integrity": "sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg==", + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", + "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", + "dev": true, "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.5", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.1", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.1", - "@types/node": ">=13.7.0", - "long": "^5.0.0" + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12.0.0" - } - }, - "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": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.0", + "@esbuild/android-arm": "0.28.0", + "@esbuild/android-arm64": "0.28.0", + "@esbuild/android-x64": "0.28.0", + "@esbuild/darwin-arm64": "0.28.0", + "@esbuild/darwin-x64": "0.28.0", + "@esbuild/freebsd-arm64": "0.28.0", + "@esbuild/freebsd-x64": "0.28.0", + "@esbuild/linux-arm": "0.28.0", + "@esbuild/linux-arm64": "0.28.0", + "@esbuild/linux-ia32": "0.28.0", + "@esbuild/linux-loong64": "0.28.0", + "@esbuild/linux-mips64el": "0.28.0", + "@esbuild/linux-ppc64": "0.28.0", + "@esbuild/linux-riscv64": "0.28.0", + "@esbuild/linux-s390x": "0.28.0", + "@esbuild/linux-x64": "0.28.0", + "@esbuild/netbsd-arm64": "0.28.0", + "@esbuild/netbsd-x64": "0.28.0", + "@esbuild/openbsd-arm64": "0.28.0", + "@esbuild/openbsd-x64": "0.28.0", + "@esbuild/openharmony-arm64": "0.28.0", + "@esbuild/sunos-x64": "0.28.0", + "@esbuild/win32-arm64": "0.28.0", + "@esbuild/win32-ia32": "0.28.0", + "@esbuild/win32-x64": "0.28.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, "license": "MIT", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" + "@types/estree": "^1.0.0" } }, - "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", + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=6" + "node": ">=12.0.0" } }, - "node_modules/qs": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", - "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/fast-copy": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-4.0.3.tgz", + "integrity": "sha512-58apWr0GUiDFM8+3afrO6eYwJBn9ZAhDOzG3L+/9llab/haCARS2UIfffmOurYLwbgDRs8n0rfr6qAAPEAuAQw==", + "dev": true, + "license": "MIT" }, - "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==", + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", + "license": "MIT" + }, + "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-json-stringify": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.4.0.tgz", + "integrity": "sha512-ibRCQ0GZKJIQ+P3Et1h0LhPgp3PMTYk0MH8O+kW3lNYsvmaQww5Nn3f1jf73Q0jR1Yz3a1CDP4/NZD3vOajWJQ==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "url": "https://github.com/sponsors/fastify" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "opencollective", + "url": "https://opencollective.com/fastify" } ], - "license": "MIT" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "license": "MIT", "dependencies": { - "safe-buffer": "^5.1.0" + "@fastify/merge-json-schemas": "^0.2.0", + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-uri": "^3.0.0", + "json-schema-ref-resolver": "^3.0.0", + "rfdc": "^1.2.0" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "fast-decode-uri-component": "^1.0.1" } }, - "node_modules/raw-body": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz", - "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==", + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastify": { + "version": "5.8.5", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.8.5.tgz", + "integrity": "sha512-Yqptv59pQzPgQUSIm87hMqHJmdkb1+GPxdE6vW6FRyVE9G86mt7rOghitiU4JHRaTyDUk9pfeKmDeu70lAwM4Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.7.0", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.10" + "@fastify/ajv-compiler": "^4.0.5", + "@fastify/error": "^4.0.0", + "@fastify/fast-json-stringify-compiler": "^5.0.0", + "@fastify/proxy-addr": "^5.0.0", + "abstract-logging": "^2.0.1", + "avvio": "^9.0.0", + "fast-json-stringify": "^6.0.0", + "find-my-way": "^9.0.0", + "light-my-request": "^6.0.0", + "pino": "^9.14.0 || ^10.1.0", + "process-warning": "^5.0.0", + "rfdc": "^1.3.1", + "secure-json-parse": "^4.0.0", + "semver": "^7.6.0", + "toad-cache": "^3.7.0" } }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "node_modules/fastify-openapi-glue": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/fastify-openapi-glue/-/fastify-openapi-glue-4.11.3.tgz", + "integrity": "sha512-LgxS6u7U2f0gAY4QhvxZj0o2NEIl5KQeTy77iFFTXLnHZ12LiVmQvy+x3lutA+ZoWcxxl98S66J/2/RXKw+hfg==", "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "@seriousme/openapi-schema-validator": "^2.9.0", + "fastify-plugin": "^5.1.0", + "yaml": "^2.9.0" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "openapi-glue": "bin/openapi-glue-cli.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/react": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", - "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", - "license": "MIT", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.4" + "node": ">=20.0.0" } }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "node_modules/fastify-plugin": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz", + "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "license": "MIT" }, - "node_modules/react-tabs": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/react-tabs/-/react-tabs-6.1.0.tgz", - "integrity": "sha512-6QtbTRDKM+jA/MZTTefvigNxo0zz+gnBTVFw2CFVvq+f2BuH0nF0vDLNClL045nuTAdOoK/IL1vTP0ZLX0DAyQ==", - "license": "MIT", - "dependencies": { - "clsx": "^2.0.0", - "prop-types": "^15.5.0" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "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": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "reusify": "^1.0.4" } }, - "node_modules/redoc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/redoc/-/redoc-2.5.1.tgz", - "integrity": "sha512-LmqA+4A3CmhTllGG197F0arUpmChukAj9klfSdxNRemT9Hr07xXr7OGKu4PHzBs359sgrJ+4JwmOlM7nxLPGMg==", + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, "license": "MIT", - "dependencies": { - "@redocly/openapi-core": "^1.4.0", - "classnames": "^2.3.2", - "decko": "^1.2.0", - "dompurify": "^3.2.4", - "eventemitter3": "^5.0.1", - "json-pointer": "^0.6.2", - "lunr": "^2.3.9", - "mark.js": "^8.11.1", - "marked": "^4.3.0", - "mobx-react": "9.2.0", - "openapi-sampler": "^1.5.0", - "path-browserify": "^1.0.1", - "perfect-scrollbar": "^1.5.5", - "polished": "^4.2.2", - "prismjs": "^1.29.0", - "prop-types": "^15.8.1", - "react-tabs": "^6.0.2", - "slugify": "~1.4.7", - "stickyfill": "^1.1.1", - "swagger2openapi": "^7.0.8", - "url-template": "^2.0.8" - }, "engines": { - "node": ">=6.9", - "npm": ">=3.0.0" + "node": ">=12.0.0" }, "peerDependencies": { - "core-js": "^3.1.4", - "mobx": "^6.0.4", - "react": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "styled-components": "^4.1.1 || ^5.1.1 || ^6.0.5" + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/redoc/node_modules/@redocly/config": { - "version": "0.22.2", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.2.tgz", - "integrity": "sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ==", - "license": "MIT" - }, - "node_modules/redoc/node_modules/@redocly/openapi-core": { - "version": "1.34.5", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.5.tgz", - "integrity": "sha512-0EbE8LRbkogtcCXU7liAyC00n9uNG9hJ+eMyHFdUsy9lB/WGqnEBgwjA9q2cyzAVcdTkQqTBBU1XePNnN3OijA==", + "node_modules/find-my-way": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.6.0.tgz", + "integrity": "sha512-Zf4Xve4RymLl7NgaavNebZ01joJ8MfVerOG43wy7SHLO+r+K0C6d/SE0BiR7AV5V1VOCFlOP7ecdo+I4qmiHrQ==", "license": "MIT", "dependencies": { - "@redocly/ajv": "^8.11.2", - "@redocly/config": "^0.22.0", - "colorette": "^1.2.0", - "https-proxy-agent": "^7.0.5", - "js-levenshtein": "^1.1.6", - "js-yaml": "^4.1.0", - "minimatch": "^5.0.1", - "pluralize": "^8.0.0", - "yaml-ast-parser": "0.0.43" + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^5.0.0" }, "engines": { - "node": ">=18.17.0", - "npm": ">=9.5.0" + "node": ">=20" } }, - "node_modules/redoc/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/redoc/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "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==", + "node_modules/help-me": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reftools": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", - "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", - "license": "BSD-3-Clause", - "funding": { - "url": "https://github.com/Mermade/oas-kit?sponsor=1" + "node": ">=10" } }, - "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==", + "node_modules/js-yaml": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "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": ">= 0.4" + "argparse": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "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==", + "node_modules/json-schema-ref-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.0.tgz", + "integrity": "sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "dequal": "^2.0.3" } }, - "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": ">=0.10.0" - } + "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/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", + "node_modules/light-my-request": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.6.0.tgz", + "integrity": "sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause", "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": ">= 18" + "cookie": "^1.0.1", + "process-warning": "^4.0.0", + "set-cookie-parser": "^2.6.0" } }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "node_modules/light-my-request/node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, "engines": { - "node": ">=0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "node_modules/light-my-request/node_modules/process-warning": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", + "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "url": "https://github.com/sponsors/fastify" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "opencollective", + "url": "https://opencollective.com/fastify" } ], "license": "MIT" }, - "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", + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" + "detect-libc": "^2.0.3" }, "engines": { - "node": ">= 0.4" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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" + "type": "opencollective", + "url": "https://opencollective.com/parcel" }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 0.4" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "license": "MIT", + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10" - } - }, - "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" - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node": ">= 12.0.0" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 18" - } - }, - "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" + "node": ">= 12.0.0" }, - "engines": { - "node": ">= 18" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/set-cookie-parser": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", - "license": "MIT" - }, - "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" - }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 0.4" - } - }, - "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" + "node": ">= 12.0.0" }, - "engines": { - "node": ">= 0.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "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" - }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "license": "MIT" - }, - "node_modules/should": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", - "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", - "license": "MIT", - "dependencies": { - "should-equal": "^2.0.0", - "should-format": "^3.0.3", - "should-type": "^1.4.0", - "should-type-adaptors": "^1.0.1", - "should-util": "^1.0.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/should-equal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", - "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", - "license": "MIT", - "dependencies": { - "should-type": "^1.4.0" + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/should-format": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", - "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", - "license": "MIT", - "dependencies": { - "should-type": "^1.3.0", - "should-type-adaptors": "^1.0.1" + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/should-type": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", - "license": "MIT" - }, - "node_modules/should-type-adaptors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", - "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", - "license": "MIT", - "dependencies": { - "should-type": "^1.3.0", - "should-util": "^1.0.0" + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/should-util": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", - "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", - "license": "MIT" - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.4" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "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/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "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/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/simple-websocket": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/simple-websocket/-/simple-websocket-9.1.0.tgz", - "integrity": "sha512-8MJPnjRN6A8UCp1I+H/dSFyjwJhp6wta4hsVRhjf8w9qBHRzxYt14RaOcjvQnhD1N4yKOddEjflwMnQM4VtXjQ==", + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, "funding": [ { "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" + "url": "https://github.com/sponsors/ai" } ], "license": "MIT", - "dependencies": { - "debug": "^4.3.1", - "queue-microtask": "^1.2.2", - "randombytes": "^2.1.0", - "readable-stream": "^3.6.0", - "ws": "^7.4.2" - } - }, - "node_modules/slugify": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.4.7.tgz", - "integrity": "sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "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", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "license": "MIT", - "engines": { - "node": "*" - } + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=14.0.0" } }, - "node_modules/stickyfill": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stickyfill/-/stickyfill-1.1.1.tgz", - "integrity": "sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==" - }, - "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", + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" + "wrappy": "1" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" }, - "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==", - "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/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "node_modules/pino": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-10.3.1.tgz", + "integrity": "sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "@pinojs/redact": "^0.4.0", + "atomic-sleep": "^1.0.0", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^3.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^5.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "pino": "bin.js" } }, - "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/pino-abstract-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", + "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", "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" + "split2": "^4.0.0" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/pino-pretty": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-13.1.3.tgz", + "integrity": "sha512-ttXRkkOz6WWC95KeY9+xxWL6AtImwbyMHrL1mSwqwW9u+vLp/WIElvHvCSDg0xO/Dzrggz1zv3rN5ovTRVowKg==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^4.0.0", + "fast-safe-stringify": "^2.1.1", + "help-me": "^5.0.0", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^3.0.0", + "pump": "^3.0.0", + "secure-json-parse": "^4.0.0", + "sonic-boom": "^4.0.1", + "strip-json-comments": "^5.0.2" }, - "engines": { - "node": ">=8" + "bin": { + "pino-pretty": "bin.js" } }, - "node_modules/strnum": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.0.tgz", - "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==", + "node_modules/pino-std-serializers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", + "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", + "license": "MIT" + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, { "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" + "url": "https://github.com/sponsors/ai" } ], - "license": "MIT" - }, - "node_modules/styled-components": { - "version": "6.3.9", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.3.9.tgz", - "integrity": "sha512-J72R4ltw0UBVUlEjTzI0gg2STOqlI9JBhQOL4Dxt7aJOnnSesy0qJDn4PYfMCafk9cWOaVg129Pesl5o+DIh0Q==", "license": "MIT", "dependencies": { - "@emotion/is-prop-valid": "1.4.0", - "@emotion/unitless": "0.10.0", - "@types/stylis": "4.2.7", - "css-to-react-native": "3.2.0", - "csstype": "3.2.3", - "postcss": "8.4.49", - "shallowequal": "1.1.0", - "stylis": "4.3.6", - "tslib": "2.8.1" + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" - }, - "peerDependencies": { - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } + "node": "^10 || ^12 || >=14" } }, - "node_modules/styled-components/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/stylis": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", - "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "node_modules/process-warning": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "license": "MIT" }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/swagger2openapi": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", - "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", - "license": "BSD-3-Clause", - "dependencies": { - "call-me-maybe": "^1.0.1", - "node-fetch": "^2.6.1", - "node-fetch-h2": "^2.3.0", - "node-readfiles": "^0.2.0", - "oas-kit-common": "^1.0.8", - "oas-resolver": "^2.5.6", - "oas-schema-walker": "^1.1.5", - "oas-validator": "^5.0.8", - "reftools": "^1.1.9", - "yaml": "^1.10.0", - "yargs": "^17.0.1" - }, - "bin": { - "boast": "boast.js", - "oas-validate": "oas-validate.js", - "swagger2openapi": "swagger2openapi.js" - }, - "funding": { - "url": "https://github.com/Mermade/oas-kit?sponsor=1" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", "license": "MIT" }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", "license": "MIT", "engines": { - "node": ">=0.6" + "node": ">= 12.13.0" } }, - "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/triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "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": ">= 14.0.0" + "node": ">=0.10.0" } }, - "node_modules/ts-algebra": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-1.2.2.tgz", - "integrity": "sha512-kloPhf1hq3JbCPOTYoOWDKxebWjNb2o/LKnNfkWhxVVisFFmMJPPdJeGoGmM+iRLyoXAR61e08Pb+vUXINg8aA==", - "license": "MIT" - }, - "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/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "node_modules/ret": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", + "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==", "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "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==", + "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": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, "engines": { - "node": ">= 0.4" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/typed-array-byte-length": { + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rolldown": { "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==", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", + "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", + "dev": true, "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" + "@oxc-project/types": "=0.133.0", + "@rolldown/pluginutils": "^1.0.0" }, - "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" + "bin": { + "rolldown": "bin/cli.mjs" }, "engines": { - "node": ">= 0.4" + "node": "^20.19.0 || >=22.12.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.3", + "@rolldown/binding-darwin-arm64": "1.0.3", + "@rolldown/binding-darwin-x64": "1.0.3", + "@rolldown/binding-freebsd-x64": "1.0.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", + "@rolldown/binding-linux-arm64-gnu": "1.0.3", + "@rolldown/binding-linux-arm64-musl": "1.0.3", + "@rolldown/binding-linux-ppc64-gnu": "1.0.3", + "@rolldown/binding-linux-s390x-gnu": "1.0.3", + "@rolldown/binding-linux-x64-gnu": "1.0.3", + "@rolldown/binding-linux-x64-musl": "1.0.3", + "@rolldown/binding-openharmony-arm64": "1.0.3", + "@rolldown/binding-wasm32-wasi": "1.0.3", + "@rolldown/binding-win32-arm64-msvc": "1.0.3", + "@rolldown/binding-win32-x64-msvc": "1.0.3" + } + }, + "node_modules/safe-regex2": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.1.1.tgz", + "integrity": "sha512-mOSBvHGDZMuIEZMdOz/aCEYDCv0E7nfcNsIhUF+/P+xC7Hyf3FkvymqgPbg9D1EdSGu+uKbJgy09K/RKKc7kJA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "license": "MIT" - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "ret": "~0.5.0" }, + "bin": { + "safe-regex2": "bin/safe-regex2.js" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", "engines": { - "node": ">=4.2.0" + "node": ">=10" } }, - "node_modules/uglify-js": { - "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==", - "license": "BSD-2-Clause", - "optional": true, + "node_modules/secure-json-parse": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz", + "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "license": "ISC", "bin": { - "uglifyjs": "bin/uglifyjs" + "semver": "bin/semver.js" }, "engines": { - "node": ">=0.8.0" + "node": ">=10" } }, - "node_modules/ulid": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/ulid/-/ulid-3.0.2.tgz", - "integrity": "sha512-yu26mwteFYzBAot7KVMqFGCVpsF6g8wXfJzQUHvu1no3+rRRSFcSV2nKeYvNPLD2J4b08jYBDhHUjeH0ygIl9w==", - "license": "MIT", - "bin": { - "ulid": "dist/cli.js" - } + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" }, - "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==", + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/sonic-boom": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz", + "integrity": "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==", "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" + "atomic-sleep": "^1.0.0" } }, - "node_modules/undici": { - "version": "6.24.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.24.0.tgz", - "integrity": "sha512-lVLNosgqo5EkGqh5XUDhGfsMSoO8K0BAN0TyJLvwNRSl4xWGZlCVYsAIpa/OpA3TvmnM01GWcoKmc3ZWo5wKKA==", - "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==", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=18.17" + "node": ">=0.10.0" } }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "license": "MIT" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", "engines": { - "node": ">= 0.8" + "node": ">= 10.x" } }, - "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==", + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, "license": "MIT" }, - "node_modules/url-template": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", - "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==", - "license": "BSD" - }, - "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "node_modules/std-env": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", + "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "dev": true, "license": "MIT" }, - "node_modules/utility-types": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", - "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "node_modules/strip-json-comments": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.3.tgz", + "integrity": "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/thread-stream": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.2.0.tgz", + "integrity": "sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ==", "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/validate.io-array": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", - "integrity": "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==", - "license": "MIT" - }, - "node_modules/validate.io-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz", - "integrity": "sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==" - }, - "node_modules/validate.io-integer": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", - "integrity": "sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==", "dependencies": { - "validate.io-number": "^1.0.3" + "real-require": "^1.0.0" + }, + "engines": { + "node": ">=20" } }, - "node_modules/validate.io-integer-array": { + "node_modules/thread-stream/node_modules/real-require": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz", - "integrity": "sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==", - "dependencies": { - "validate.io-array": "^1.0.3", - "validate.io-integer": "^1.0.4" - } + "resolved": "https://registry.npmjs.org/real-require/-/real-require-1.0.0.tgz", + "integrity": "sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g==", + "license": "MIT" }, - "node_modules/validate.io-number": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", - "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==" + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" - } - }, - "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": ">=18" } }, - "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==", + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, "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" + "fdir": "^6.5.0", + "picomatch": "^4.0.4" }, "engines": { - "node": ">= 0.4" + "node": ">=12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "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==", + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, "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": ">=14.0.0" } }, - "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==", + "node_modules/toad-cache": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.1.tgz", + "integrity": "sha512-5DXWzE4Vz7xNHsv+xQ+MGfJYyC78Aok3tEr0MNwHoRf7vZnga1mQXZ4/Nsodld4VR6Wd+VhfmqnNrsRJyYPfrQ==", "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": ">=20" } }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "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/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true }, - "node_modules/winston": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", - "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==", + "node_modules/tsx": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz", + "integrity": "sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==", + "dev": true, "license": "MIT", "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.8", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.7.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.9.0" + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" }, "engines": { - "node": ">= 12.0.0" + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "node_modules/winston-transport": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", - "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", - "license": "MIT", - "dependencies": { - "logform": "^2.7.0", - "readable-stream": "^3.6.2", - "triple-beam": "^1.3.0" + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">= 12.0.0" + "node": ">=14.17" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "dev": true, "license": "MIT" }, - "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/vite": { + "version": "8.0.16", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", + "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "1.0.3", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": ">=10" + "node": "^20.19.0 || >=22.12.0" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.18", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "node_modules/vitest": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.8.tgz", + "integrity": "sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==", + "dev": true, "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.8", + "@vitest/mocker": "4.1.8", + "@vitest/pretty-format": "4.1.8", + "@vitest/runner": "4.1.8", + "@vitest/snapshot": "4.1.8", + "@vitest/spy": "4.1.8", + "@vitest/utils": "4.1.8", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, "engines": { - "node": ">=8.3.0" + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.8", + "@vitest/browser-preview": "4.1.8", + "@vitest/browser-webdriverio": "4.1.8", + "@vitest/coverage-istanbul": "4.1.8", + "@vitest/coverage-v8": "4.1.8", + "@vitest/ui": "4.1.8", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { - "bufferutil": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { "optional": true }, - "utf-8-validate": { + "@vitest/browser-playwright": { "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false } } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, "engines": { - "node": ">=0.4" + "node": ">=8" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" }, "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yaml-ast-parser": { - "version": "0.0.43", - "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", - "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", - "license": "Apache-2.0" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "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" + "bin": { + "yaml": "bin.mjs" }, "engines": { - "node": ">=12" - } - }, - "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==", - "license": "ISC", - "engines": { - "node": ">=12" + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } } } diff --git a/package.json b/package.json index e81c54c..c60e8c5 100644 --- a/package.json +++ b/package.json @@ -2,36 +2,37 @@ "name": "tools-api-v1", "version": "1.0.0", "description": "API van het Tools (apis.developer.overheid.nl)", - "main": "index.js", + "type": "module", + "main": "dist/server.js", "scripts": { - "prestart": "npm install", - "start": "node index.js", - "start-mock": "USE_MOCKS=true node index.js", - "test": "node --test", + "dev": "tsx watch --env-file=.env src/server.ts", + "prebuild": "rm -rf dist", + "build": "tsc", + "start": "node --env-file-if-exists=.env dist/server.js", + "test": "vitest run", "lint": "biome lint .", - "format": "biome format --write ." + "format": "biome format --write .", + "typecheck": "tsc --noEmit" }, "license": "EUPL-1.2", "private": true, "dependencies": { - "@apiture/openapi-down-convert": "^0.14.2", - "@developer-overheid-nl/adr-rulesets": "github:developer-overheid-nl/adr-rulesets#da1327dfcc83ed130b1fe5aaa282b7bfba537aee", - "@redocly/cli": "^2.30.3", - "@scalar/openapi-upgrader": "^0.2.7", - "@stoplight/spectral-parsers": "^1.0.5", - "@stoplight/spectral-rulesets": "^1.22.1", - "@stoplight/spectral-runtime": "^1.1.5", - "body-parser": "^2.2.2", - "case-anything": "^3.1.2", - "cors": "^2.8.6", - "express": "^5.2.1", - "express-openapi-validator": "^5.6.2", - "js-yaml": "^4.1.1", - "jszip": "^3.10.1", - "openapi-to-postmanv2": "^6.0.1", - "winston": "^3.19.0" + "@developer-overheid-nl/don-tools-logic": "file:../don-tools-api-v2", + "@fastify/cors": "^11.2.0", + "ajv-formats": "^3.0.1", + "fastify": "^5.8.5", + "fastify-openapi-glue": "^4.11.3", + "fastify-plugin": "^5.1.0" }, "devDependencies": { - "@biomejs/biome": "^2.4.13" + "@biomejs/biome": "^2.4.16", + "@types/js-yaml": "^4.0.9", + "@types/node": "^25.9.1", + "js-yaml": "^4.2.0", + "pino-pretty": "^13.1.3", + "tsx": "^4.22.4", + "typescript": "^6.0.3", + "vite": "^8.0.16", + "vitest": "^4.1.8" } } diff --git a/publiccode.yml b/publiccode.yml index 34ba177..4972657 100644 --- a/publiccode.yml +++ b/publiccode.yml @@ -26,9 +26,9 @@ description: Ontwikkelaars kunnen via deze API OpenAPI-specificaties omzetten tussen versies (3.0 en 3.1), specificaties bundelen, valideren tegen de DON API Design Rules (ADR) ruleset, Postman-collecties genereren en - Arazzo-workflows visualiseren. De API is gebouwd met Node.js en Express - en volgt een API-first aanpak waarbij het OpenAPI-contract leidend is - voor de implementatie. + Arazzo-workflows visualiseren. De API is gebouwd met Node.js, + TypeScript en Fastify en volgt een API-first aanpak waarbij het + OpenAPI-contract leidend is voor de implementatie. features: - OpenAPI specificatie conversie tussen versie 3.0 en 3.1 - OpenAPI specificatie bundeling met oplossen van externe verwijzingen diff --git a/services/ArazzoVisualizationService.js b/services/ArazzoVisualizationService.js deleted file mode 100644 index 726a318..0000000 --- a/services/ArazzoVisualizationService.js +++ /dev/null @@ -1,749 +0,0 @@ -"use strict"; - -const fs = require("node:fs/promises"); -const path = require("node:path"); -const os = require("node:os"); -const jsYaml = require("js-yaml"); -const { - logger: redoclyLogger, - createConfig, - lint, - bundle, - getTotals, - formatProblems, -} = require("@redocly/openapi-core"); -const Service = require("./Service"); -const { fetchSpecification } = require("./RemoteSpecificationService"); -const { resolveOasInput } = require("./OasInputService"); -const appLogger = require("../logger"); - -// --------------------------------------------------------------------------- -// Constante waarden / config -// --------------------------------------------------------------------------- - -const EMPTY_BODY_ERROR = "Body ontbreekt of ongeldig: gebruik oasUrl|oasBody"; -const INVALID_SPEC_ERROR = "Arazzo specificatie ongeldig of mist workflows"; -const TEMP_PREFIX = "don-tools-arazzo-"; - -const SOURCE_REF_PREFIX = "$sourceDescriptions."; -const COMPONENT_INPUTS_PREFIX = "#/components/inputs/"; -const ALLOWED_METHODS = Object.freeze( - new Set(["get", "put", "post", "delete", "patch", "head", "options", "trace"]), -); - -let redoclyConfigPromise; -let arazzoLintConfigPromise; - -const getRedoclyConfig = () => { - if (!redoclyConfigPromise) { - redoclyConfigPromise = createConfig({ extends: ["recommended"] }); - } - return redoclyConfigPromise; -}; - -const getArazzoLintConfig = () => { - if (!arazzoLintConfigPromise) { - arazzoLintConfigPromise = createConfig({ - extends: ["recommended-strict"], - arazzo1Rules: { - "no-criteria-xpath": "error", - "respect-supported-versions": "warn", - "no-x-security-scheme-name-without-openapi": "error", - "x-security-scheme-required-values": "error", - "x-security-scheme-name-reference": "error", - "no-x-security-both-scheme-and-scheme-name": "error", - }, - }); - } - return arazzoLintConfigPromise; -}; - -const isLikelyArazzoTestFile = (fileName, parsedDocument) => { - if (!fileName || typeof fileName !== "string") return false; - return /\.(yaml|yml|json)$/i.test(fileName) && !!parsedDocument?.arazzo; -}; - -const logLintSummary = (lintProblems, version) => { - if (!Array.isArray(lintProblems) || lintProblems.length === 0) { - return; - } - - const totals = getTotals(lintProblems); - formatProblems(lintProblems, { totals, version }); - - if (totals.errors > 0) { - appLogger.error("[ArazzoService] lint errors in Arazzo beschrijving", { errors: totals.errors }); - } else if (totals.warnings > 0) { - appLogger.warn("[ArazzoService] lint waarschuwingen in Arazzo beschrijving", { warnings: totals.warnings }); - } -}; - -const bundleArazzoDocument = async ({ - filePath, - base, - externalRefResolver, - collectSpecData, - version = "don-tools-api", - skipLint = false, -}) => { - const fileName = path.basename(filePath); - if (!fileName) { - throw new Error("Invalid file name"); - } - - const config = await getArazzoLintConfig(); - let lintProblems = []; - - if (!skipLint) { - lintProblems = await lint({ - ref: filePath, - config, - externalRefResolver, - }); - - logLintSummary(lintProblems, version); - } - - const bundledDocument = await bundle({ - base, - ref: filePath, - config, - dereference: true, - externalRefResolver, - }); - - const parsedDocument = bundledDocument?.bundle?.parsed; - - if (!parsedDocument) { - throw new Error(`Could not find source description file '${fileName}'.`); - } - - if (!isLikelyArazzoTestFile(fileName, parsedDocument)) { - throw new Error( - `No test files found. File ${fileName} voldoet niet aan het patroon "*.[yaml|yml|json]" of mist een geldige "Arazzo" beschrijving.`, - ); - } - - collectSpecData?.(parsedDocument); - - if (!skipLint) { - const errors = lintProblems.filter((problem) => problem.severity === "error"); - if (errors.length > 0) { - throw new Error(`Found errors in Arazzo description ${fileName}.`); - } - } - - return parsedDocument; -}; - -// --------------------------------------------------------------------------- -// Helpers: I/O & parsing -// --------------------------------------------------------------------------- - -const normalizeText = (value) => { - if (!value || typeof value !== "string") return ""; - return value.trim(); -}; - -const ensureTempFile = async (contents, filename = "input.yaml") => { - const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), TEMP_PREFIX)); - const filePath = path.join(tempDir, filename); - - await fs.writeFile(filePath, contents, "utf8"); - - const cleanup = async () => { - try { - await fs.rm(tempDir, { recursive: true, force: true }); - } catch (error) { - appLogger.warn("[ArazzoService] opruimen temp dir faalde", { - tempDir, - message: error?.message, - }); - } - }; - - return { filePath, cleanup }; -}; - -const parseYamlOrUndefined = (contents) => { - try { - const parsed = jsYaml.load(contents); - return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : undefined; - } catch { - return undefined; - } -}; - -// --------------------------------------------------------------------------- -// Input normalisatie (body / URL / oas*) -// --------------------------------------------------------------------------- - -/** - * Normaliseert de input naar `{ source, contents }`. - * Ondersteunt: - * - `arazzoBody` (string) - * - `arazzoUrl` (URL) - * - fallback naar `resolveOasInput` (oasUrl/oasBody/etc.) - */ -const resolveVisualizationInput = async (input) => { - if (!input || typeof input !== "object") { - throw Service.rejectResponse({ message: EMPTY_BODY_ERROR }, 400); - } - - const { arazzoBody, arazzoUrl } = input; - - // 1) Directe Arazzo-body - if (typeof arazzoBody === "string" && arazzoBody.trim().length > 0) { - return { - source: "request-body", - contents: arazzoBody, - }; - } - - // 2) Arazzo-URL - if (typeof arazzoUrl === "string" && arazzoUrl.trim().length > 0) { - let parsedUrl; - try { - parsedUrl = new URL(arazzoUrl); - } catch { - throw Service.rejectResponse( - { - message: "De waarde van arazzoUrl is geen geldige URL.", - }, - 400, - ); - } - - const contents = await fetchSpecification(parsedUrl.toString(), { - errorMessage: "Het ophalen van de Arazzo specificatie is mislukt.", - }); - - return { - source: parsedUrl.toString(), - contents, - }; - } - - // 3) Fallback: dit beschouwen we als OpenAPI input (oasUrl/oasBody/etc.) - const resolved = await resolveOasInput(input); - const trimmed = typeof resolved.contents === "string" ? resolved.contents.trim() : ""; - - if (!trimmed) { - throw Service.rejectResponse({ message: EMPTY_BODY_ERROR }, 400); - } - - return { - source: resolved.source, - contents: trimmed, - }; -}; - -// --------------------------------------------------------------------------- -// Arazzo-document ophalen / genereren -// --------------------------------------------------------------------------- - -/** - * Bundelt een Arazzo-document vanuit YAML/JSON met respect-core (bundleArazzo). - */ -const loadArazzoDocumentFromContents = async (contents) => { - const { filePath, cleanup } = await ensureTempFile(contents, "arazzo.yaml"); - - try { - const document = await bundleArazzoDocument({ - filePath, - base: path.dirname(filePath), - externalRefResolver: undefined, - collectSpecData: undefined, - version: "don-tools-api", - skipLint: true, - }); - - if (!document || !Array.isArray(document.workflows) || document.workflows.length === 0) { - throw new Error(INVALID_SPEC_ERROR); - } - - return document; - } catch (error) { - appLogger.error("[ArazzoService] bundelen Arazzo-document mislukt", { - message: error?.message, - detail: error?.detail, - stack: error?.stack, - }); - throw error; - } finally { - await cleanup(); - } -}; - -/** - * Genereert Arazzo-workflows vanuit een OpenAPI-spec via respect-core (generate). - */ -const generateArazzoFromOpenApi = async (contents) => { - const { filePath, cleanup } = await ensureTempFile(contents, "openapi.yaml"); - - try { - const { generate } = await import("@redocly/respect-core"); - const config = await getRedoclyConfig(); - - const document = await generate({ - descriptionPath: filePath, - collectSpecData: undefined, - version: "don-tools-api", - config, - base: path.dirname(filePath), - }); - - if (!document || !Array.isArray(document.workflows) || document.workflows.length === 0) { - throw new Error(INVALID_SPEC_ERROR); - } - - return document; - } catch (error) { - appLogger.error("[ArazzoService] generate from OpenAPI failed", { - message: error?.message, - stack: error?.stack, - }); - - throw Service.rejectResponse( - { - message: "Kon Arazzo workflows genereren vanuit OpenAPI.", - detail: error.message, - }, - 400, - ); - } finally { - await cleanup(); - } -}; - -// --------------------------------------------------------------------------- -// OpenAPI helpers (operation lookup / schema beschrijving) -// --------------------------------------------------------------------------- - -const buildOperationLookup = (openapiDocument) => { - const lookup = new Map(); - - if (!openapiDocument || typeof openapiDocument !== "object") return lookup; - - const { paths } = openapiDocument; - if (!paths || typeof paths !== "object") return lookup; - - Object.entries(paths).forEach(([pathKey, pathItem]) => { - if (!pathItem || typeof pathItem !== "object") return; - - Object.entries(pathItem).forEach(([method, operation]) => { - if (!ALLOWED_METHODS.has(method) || !operation || typeof operation !== "object") return; - - const { operationId } = operation; - if (!operationId) return; - - lookup.set(operationId, { - method: method.toUpperCase(), - path: pathKey, - summary: normalizeText(operation.summary), - description: normalizeText(operation.description), - tags: Array.isArray(operation.tags) ? operation.tags : undefined, - }); - }); - }); - - return lookup; -}; - -const describeSchemaType = (schema) => { - if (!schema || typeof schema !== "object") return ""; - - const parts = []; - - if (schema.type) { - parts.push(schema.type + (schema.format ? ` (${schema.format})` : "")); - } else if (schema.format) { - parts.push(schema.format); - } - - if (schema.enum) { - parts.push(`mogelijk: ${schema.enum.join(", ")}`); - } - - return parts.join(" | "); -}; - -const formatInputDefinition = (name, schema) => { - const lines = [`- **${name}**`]; - const description = normalizeText(schema?.description); - const typeInfo = describeSchemaType(schema); - - if (description || typeInfo) { - const details = [description, typeInfo ? `type: ${typeInfo}` : undefined] - .filter(Boolean) - .join(" | "); - lines.push(` - ${details}`); - } - - if (schema && typeof schema === "object" && schema.properties && typeof schema.properties === "object") { - lines.push(" - Velden:"); - Object.entries(schema.properties).forEach(([propName, propSchema]) => { - const propType = describeSchemaType(propSchema); - const propDescription = normalizeText(propSchema?.description); - const suffix = [propType, propDescription].filter(Boolean).join(" — "); - lines.push(` - ${propName}${suffix ? ` — ${suffix}` : ""}`); - }); - } - - return lines; -}; - -const resolveInputs = (inputs, components) => { - if (!inputs) return []; - - // $ref naar #/components/inputs/* - if (inputs.$ref && typeof inputs.$ref === "string") { - if (!inputs.$ref.startsWith(COMPONENT_INPUTS_PREFIX)) return []; - - const refName = inputs.$ref.slice(COMPONENT_INPUTS_PREFIX.length); - const definition = components?.[refName]; - if (!definition) return []; - - return [{ name: refName, schema: definition }]; - } - - // Inline definitie - if (typeof inputs === "object") { - const inlineName = inputs.name || inputs.title || "inputs"; - return [{ name: inlineName, schema: inputs }]; - } - - return []; -}; - -const formatParameterValue = (value) => { - if (typeof value === "string") return value; - if (value === undefined) return "onbekend"; - return JSON.stringify(value); -}; - -const appendCriteriaLines = (lines, items, label) => { - if (!Array.isArray(items) || items.length === 0) return; - - lines.push(` - ${label}:`); - items.forEach((criteria) => { - const condition = normalizeText(criteria?.condition) || "(geen conditie)"; - const detail = normalizeText(criteria?.description); - lines.push(` - ${condition}${detail ? ` — ${detail}` : ""}`); - }); -}; - -const appendOutputs = (lines, outputs) => { - if (!outputs || typeof outputs !== "object" || Object.keys(outputs).length === 0) return; - - lines.push(" - Outputs:"); - Object.entries(outputs).forEach(([key, value]) => { - lines.push(` - ${key}: ${JSON.stringify(value)}`); - }); -}; - -const parseStepOperation = (value) => { - if (!value || typeof value !== "string") { - return { raw: "", operationId: "" }; - } - - if (!value.startsWith(SOURCE_REF_PREFIX)) { - return { raw: value, operationId: value }; - } - - const remainder = value.slice(SOURCE_REF_PREFIX.length); - const delimiterIndex = remainder.indexOf("."); - - if (delimiterIndex === -1) { - return { raw: value, operationId: remainder }; - } - - return { - raw: value, - source: remainder.slice(0, delimiterIndex), - operationId: remainder.slice(delimiterIndex + 1), - }; -}; - -const describeStepOperation = (step, operationLookup) => { - const parsedOperation = parseStepOperation(step.operationId); - const operationDetails = parsedOperation.operationId ? operationLookup.get(parsedOperation.operationId) : undefined; - - const suffixParts = []; - - if (operationDetails?.method && operationDetails.path) { - suffixParts.push(`${operationDetails.method} ${operationDetails.path}`); - } - - if (parsedOperation.operationId) { - suffixParts.push(parsedOperation.operationId); - } - - const suffix = suffixParts.length > 0 ? ` (${suffixParts.join(" · ")})` : ""; - - return { parsedOperation, operationDetails, suffix }; -}; - -// --------------------------------------------------------------------------- -// Markdown output -// --------------------------------------------------------------------------- - -const buildMarkdown = (document, options = {}) => { - const lines = []; - const title = normalizeText(document.info?.title) || "Arazzo Workflows"; - const description = normalizeText(document.info?.description); - const operationLookup = buildOperationLookup(options.openapi); - - lines.push(`# ${title}`); - if (description) { - lines.push("", description); - } - - (document.workflows || []).forEach((workflow, workflowIndex) => { - const workflowTitle = - normalizeText(workflow.summary) || workflow.workflowId || `Workflow ${workflowIndex + 1}`; - - lines.push("", `## ${workflowTitle}`); - - if (workflow.description) { - lines.push("", workflow.description.trim()); - } - - // Inputs - const inputs = resolveInputs(workflow.inputs, document.components?.inputs); - if (inputs.length > 0) { - lines.push("", "### Inputs"); - inputs.forEach((input) => { - formatInputDefinition(input.name, input.schema).forEach((line) => { - lines.push(line); - }); - }); - } - - // Parameters - if (Array.isArray(workflow.parameters) && workflow.parameters.length > 0) { - lines.push("", "### Parameters"); - workflow.parameters.forEach((parameter) => { - const location = parameter.in || "parameter"; - const name = parameter.name || "naamloos"; - const value = formatParameterValue(parameter.value); - - lines.push(`- ${name} (${location}) = ${value}`); - if (parameter.description) { - lines.push(` - ${parameter.description.trim()}`); - } - }); - } - - // Steps - if (Array.isArray(workflow.steps) && workflow.steps.length > 0) { - lines.push("", "### Stappen"); - workflow.steps.forEach((step, index) => { - const stepLabel = step.stepId || `Stap ${index + 1}`; - const { operationDetails, suffix } = describeStepOperation(step, operationLookup); - - lines.push(`- **${stepLabel}${suffix}**`); - - const summary = operationDetails?.summary; - const descriptionText = operationDetails?.description; - - if (summary) { - lines.push(` - ${summary}`); - } - - if (descriptionText && descriptionText !== summary) { - lines.push(` - ${descriptionText}`); - } - - const stepDescription = normalizeText(step.description); - if ( - stepDescription && - stepDescription !== summary && - stepDescription !== descriptionText - ) { - lines.push(` - ${stepDescription}`); - } - - appendCriteriaLines(lines, step.successCriteria, "Succescriteria"); - appendCriteriaLines(lines, step.failureCriteria, "Faalcriteria"); - appendOutputs(lines, step.outputs); - }); - } - }); - - return lines.join("\n"); -}; - -// --------------------------------------------------------------------------- -// Mermaid output -// --------------------------------------------------------------------------- - -const escapeMermaidLabel = (value) => { - if (!value) return ""; - return String(value).replace(/"/g, '\\"'); -}; - -const sanitizeMermaidId = (value, fallback) => { - if (typeof value !== "string" || value.trim() === "") { - return fallback; - } - - const sanitized = value.replace(/[^a-zA-Z0-9_]/g, "_"); - if (!sanitized) { - return fallback; - } - - if (/^[0-9]/.test(sanitized)) { - return `S_${sanitized}`; - } - - return sanitized; -}; - -const buildMermaid = (document, options = {}) => { - const operationLookup = buildOperationLookup(options.openapi); - const lines = ["flowchart TD"]; - - (document.workflows || []).forEach((workflow, workflowIndex) => { - const workflowTitle = - normalizeText(workflow.summary) || workflow.workflowId || `Workflow ${workflowIndex + 1}`; - - lines.push("", `subgraph "${escapeMermaidLabel(workflowTitle)}"`); - - const steps = Array.isArray(workflow.steps) ? workflow.steps : []; - if (steps.length === 0) { - lines.push(' EmptyWorkflow["Geen stappen gedefinieerd"]'); - lines.push("end"); - return; - } - - const workflowKey = sanitizeMermaidId( - workflow.workflowId || `workflow_${workflowIndex + 1}`, - `workflow_${workflowIndex + 1}`, - ); - - const nodeIds = steps.map((step, index) => { - const stepKey = sanitizeMermaidId(step.stepId || `step_${index + 1}`, `step_${index + 1}`); - return `${workflowKey}_${stepKey}`; - }); - - steps.forEach((step, index) => { - const stepLabel = step.stepId || `Stap ${index + 1}`; - const { suffix } = describeStepOperation(step, operationLookup); - const label = escapeMermaidLabel(`${stepLabel}${suffix}`); - lines.push(` ${nodeIds[index]}["${label}"]`); - }); - - for (let i = 0; i < nodeIds.length - 1; i += 1) { - lines.push(` ${nodeIds[i]} --> ${nodeIds[i + 1]}`); - } - - lines.push("end"); - }); - - return lines.join("\n"); -}; - -// --------------------------------------------------------------------------- -// Conversie-functies: input -> Arazzo-document -// --------------------------------------------------------------------------- - -/** - * Hoofd-conversie: - * - Detecteert automatisch Arazzo vs OpenAPI. - * - Retourneert een Arazzo-document + optioneel het OpenAPI-document. - */ -const convertInputToArazzo = async (input) => { - const resolved = await resolveVisualizationInput(input); - - if (!resolved.contents || typeof resolved.contents !== "string" || !resolved.contents.trim()) { - throw Service.rejectResponse({ message: EMPTY_BODY_ERROR }, 400); - } - - const contents = resolved.contents; - const parsed = parseYamlOrUndefined(contents); - const isArazzoSpecification = Boolean(parsed && parsed.arazzo); - const openapiDocument = parsed && !isArazzoSpecification ? parsed : undefined; - - try { - const arazzoDocument = isArazzoSpecification - ? await loadArazzoDocumentFromContents(contents) - : await generateArazzoFromOpenApi(contents); - - return { - source: resolved.source, - arazzoDocument, - openapiDocument, - }; - } catch (error) { - if (Service.isErrorResponse && Service.isErrorResponse(error)) { - throw error; - } - - appLogger.error("[ArazzoService] Arazzo conversie mislukt", { - message: error?.message, - detail: error?.detail, - stack: error?.stack, - }); - - throw Service.rejectResponse( - { - message: error?.message && error.message !== "Unknown error" ? error.message : INVALID_SPEC_ERROR, - detail: error?.message, - }, - 400, - ); - } -}; - -const convertOasInputToArazzo = async (input) => { - const resolved = await resolveOasInput(input); - const contents = typeof resolved.contents === "string" ? resolved.contents.trim() : ""; - - if (!contents) { - throw Service.rejectResponse({ message: EMPTY_BODY_ERROR }, 400); - } - - const openapiDocument = parseYamlOrUndefined(contents) || undefined; - const arazzoDocument = await generateArazzoFromOpenApi(contents); - - return { - source: resolved.source, - arazzoDocument, - openapiDocument, - }; -}; - -// --------------------------------------------------------------------------- -// Publieke helpers: Arazzo-document -> Markdown / Mermaid -// --------------------------------------------------------------------------- - -const buildMarkdownFromArazzo = (arazzoDocument, { openapi } = {}) => - buildMarkdown(arazzoDocument, { openapi }); - -const buildMermaidFromArazzo = (arazzoDocument, { openapi } = {}) => - buildMermaid(arazzoDocument, { openapi }); - -// --------------------------------------------------------------------------- -// Hoofdfunctie: alles-in-één visualisatie -// --------------------------------------------------------------------------- - -/** - * Convenience: input (OAS of Arazzo) -> `{ markdown, mermaid }` - */ -const visualize = async (input) => { - const { arazzoDocument, openapiDocument } = await convertInputToArazzo(input); - - return { - markdown: buildMarkdownFromArazzo(arazzoDocument, { openapi: openapiDocument }), - mermaid: buildMermaidFromArazzo(arazzoDocument, { openapi: openapiDocument }), - }; -}; - -module.exports = { - visualize, - convertInputToArazzo, - convertOasInputToArazzo, - buildMarkdownFromArazzo, - buildMermaidFromArazzo, -}; diff --git a/services/KeycloakService.js b/services/KeycloakService.js deleted file mode 100644 index 659a80b..0000000 --- a/services/KeycloakService.js +++ /dev/null @@ -1,312 +0,0 @@ -const { randomUUID } = require("node:crypto"); -const { URL, URLSearchParams } = require("node:url"); -const Service = require("./Service"); - -const KEYCLOAK_CLIENT_DESCRIPTION = "Dit is een read-only api key. Meer info: https://apis.developer.overheid.nl/apis/toevoegen"; -const DEFAULT_TIMEOUT_MS = 30000; -const MAX_ERROR_BODY_LENGTH = 8192; - -const ERROR_CODES = { - CONFIG: "config", - CONFLICT: "conflict", - UNAUTHORIZED: "unauthorized", - CLIENT_ID_MISSING: "client_id_missing", - GENERIC: "generic", -}; - -class KeycloakError extends Error { - constructor(message, code = ERROR_CODES.GENERIC) { - super(message); - this.name = "KeycloakError"; - this.code = code; - } -} - -const resolveFetch = (fetchImpl) => { - if (typeof fetchImpl === "function") { - return fetchImpl; - } - if (typeof fetch === "function") { - return fetch; - } - throw new KeycloakError("Fetch API is niet beschikbaar in de huidige runtime.", ERROR_CODES.CONFIG); -}; - -const trimString = (value) => (typeof value === "string" ? value.trim() : ""); - -const truncate = (value, limit = MAX_ERROR_BODY_LENGTH) => { - if (typeof value !== "string") { - return ""; - } - if (value.length <= limit) { - return value; - } - return `${value.slice(0, limit)}…`; -}; - -const buildKeycloakPayload = (clientId, email) => { - const payload = { - clientId, - name: clientId, - enabled: true, - publicClient: true, - directAccessGrantsEnabled: false, - standardFlowEnabled: false, - serviceAccountsEnabled: false, - authorizationServicesEnabled: false, - protocol: "openid-connect", - description: KEYCLOAK_CLIENT_DESCRIPTION, - }; - - const attributes = {}; - if (email) { - attributes.email = email; - } - if (Object.keys(attributes).length > 0) { - payload.attributes = attributes; - } - return payload; -}; - -const extractClientIdFromLocation = (locationHeader) => { - const trimmed = trimString(locationHeader); - if (!trimmed) { - throw new KeycloakError("Keycloak response bevat geen Location header", ERROR_CODES.GENERIC); - } - - try { - const url = new URL(trimmed); - const candidate = trimString(url.pathname.split("/").pop()); - if (candidate) { - return candidate; - } - } catch { - // fall back to manual parsing - } - - const lastSlash = trimmed.lastIndexOf("/"); - if (lastSlash >= 0 && lastSlash < trimmed.length - 1) { - const candidate = trimString(trimmed.slice(lastSlash + 1)); - if (candidate) { - return candidate; - } - } - - throw new KeycloakError(`Kan clientId niet bepalen uit Keycloak Location header: ${trimmed}`, ERROR_CODES.GENERIC); -}; - -const buildUrlFromEnv = (baseUrl, realm, suffix) => { - const baseTrimmed = trimString(baseUrl).replace(/\/+$/, ""); - const realmTrimmed = trimString(realm); - if (!baseTrimmed || !realmTrimmed) { - return ""; - } - return `${baseTrimmed}${suffix}${encodeURIComponent(realmTrimmed)}`; -}; - -const createTimeoutSignal = (timeoutMs) => { - if (typeof AbortSignal !== "undefined" && typeof AbortSignal.timeout === "function") { - return { - signal: AbortSignal.timeout(timeoutMs), - cleanup: () => {}, - }; - } - const controller = new AbortController(); - const timeoutId = setTimeout(() => controller.abort(), timeoutMs); - const cleanup = () => clearTimeout(timeoutId); - return { - signal: controller.signal, - cleanup, - }; -}; - -const parseUntrustClientInput = (params) => { - const payload = Service.extractRequestBody(params); - if (!payload || typeof payload !== "object") { - Service.throwHttpError(400, "body ontbreekt"); - } - const email = typeof payload.email === "string" ? payload.email.trim() : ""; - if (!email) { - Service.throwHttpError(400, "email is verplicht"); - } - return { email }; -}; - -const translateKeycloakError = (error) => { - if (!(error instanceof KeycloakError)) { - return null; - } - switch (error.code) { - case ERROR_CODES.CONFIG: - return { status: 500, message: "Keycloak configuratie ontbreekt" }; - case ERROR_CODES.CONFLICT: - return { status: 409, message: "Keycloak client bestaat al" }; - case ERROR_CODES.UNAUTHORIZED: - return { status: 403, message: "Geen toegang tot Keycloak admin API" }; - case ERROR_CODES.CLIENT_ID_MISSING: - return { status: 400, message: "clientId ontbreekt of is ongeldig" }; - default: - return { status: 500, message: error.message || "Er is een fout opgetreden bij Keycloak." }; - } -}; - -class KeycloakService { - constructor({ - adminClientsURL = "", - tokenURL = "", - clientId = "", - clientSecret = "", - timeoutMs = DEFAULT_TIMEOUT_MS, - fetchImpl, - } = {}) { - this.adminClientsURL = trimString(adminClientsURL); - this.tokenURL = trimString(tokenURL); - this.clientId = trimString(clientId); - this.clientSecret = trimString(clientSecret); - this.timeoutMs = Number.isFinite(timeoutMs) && timeoutMs > 0 ? timeoutMs : DEFAULT_TIMEOUT_MS; - this.fetch = resolveFetch(fetchImpl); - } - - static fromEnv() { - const adminBase = buildUrlFromEnv(process.env.KEYCLOAK_BASE_URL, process.env.KEYCLOAK_REALM, "/admin/realms/"); - const adminClientsURL = adminBase ? `${adminBase}/clients` : ""; - - const tokenBase = buildUrlFromEnv(process.env.KEYCLOAK_BASE_URL, process.env.KEYCLOAK_REALM, "/realms/"); - const tokenURL = tokenBase ? `${tokenBase}/protocol/openid-connect/token` : ""; - - return new KeycloakService({ - adminClientsURL, - tokenURL, - clientId: process.env.AUTH_CLIENT_ID, - clientSecret: process.env.AUTH_CLIENT_SECRET, - }); - } - - isConfigured() { - return ( - Boolean(this.adminClientsURL) && Boolean(this.tokenURL) && Boolean(this.clientId) && Boolean(this.clientSecret) - ); - } - - async createClient(input) { - if (!this.isConfigured()) { - throw new KeycloakError("Keycloak configuratie ontbreekt", ERROR_CODES.CONFIG); - } - - const email = trimString(typeof input === "string" ? input : input?.email); - - const token = await this.fetchToken(); - const clientId = randomUUID(); - const payload = buildKeycloakPayload(clientId, email); - - const { signal, cleanup } = createTimeoutSignal(this.timeoutMs); - let response; - try { - response = await this.fetch(this.adminClientsURL, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${token}`, - }, - body: JSON.stringify(payload), - signal, - }); - } catch (error) { - if (error.name === "TimeoutError" || error.name === "AbortError") { - throw new KeycloakError("Timeout tijdens verzoek naar Keycloak", ERROR_CODES.GENERIC); - } - throw new KeycloakError(`Netwerkfout richting Keycloak: ${error.message}`, ERROR_CODES.GENERIC); - } finally { - cleanup(); - } - - const responseText = truncate(await response.text()); - - switch (response.status) { - case 201: { - const location = response.headers.get("location"); - const newClientId = extractClientIdFromLocation(location); - return { - apiKey: newClientId, - }; - } - case 204: - throw new KeycloakError("clientId ontbreekt of is ongeldig", ERROR_CODES.CLIENT_ID_MISSING); - case 409: - throw new KeycloakError("Keycloak client bestaat al", ERROR_CODES.CONFLICT); - case 401: - case 403: - throw new KeycloakError("Geen toegang tot Keycloak admin API", ERROR_CODES.UNAUTHORIZED); - default: { - const message = responseText || response.statusText || "Onbekende fout"; - throw new KeycloakError(`Keycloak response ${response.status}: ${message}`, ERROR_CODES.GENERIC); - } - } - } - - async fetchToken() { - if (!this.tokenURL || !this.clientId || !this.clientSecret) { - throw new KeycloakError("Keycloak configuratie ontbreekt", ERROR_CODES.CONFIG); - } - - const body = new URLSearchParams({ - grant_type: "client_credentials", - client_id: this.clientId, - client_secret: this.clientSecret, - }); - - const { signal, cleanup } = createTimeoutSignal(this.timeoutMs); - let response; - try { - response = await this.fetch(this.tokenURL, { - method: "POST", - headers: { - "Content-Type": "application/x-www-form-urlencoded", - Accept: "application/json", - }, - body, - signal, - }); - } catch (error) { - if (error.name === "TimeoutError" || error.name === "AbortError") { - throw new KeycloakError("Timeout tijdens ophalen van Keycloak token", ERROR_CODES.GENERIC); - } - throw new KeycloakError(`Netwerkfout richting Keycloak token endpoint: ${error.message}`, ERROR_CODES.GENERIC); - } finally { - cleanup(); - } - - const text = truncate(await response.text()); - if (!response.ok) { - const unauthorizedStatuses = new Set([400, 401, 403]); - if (unauthorizedStatuses.has(response.status)) { - throw new KeycloakError("autorisatie voor keycloak mislukt", ERROR_CODES.UNAUTHORIZED); - } - throw new KeycloakError( - `Keycloak token response ${response.status}: ${text || response.statusText}`, - ERROR_CODES.GENERIC, - ); - } - - let parsed; - try { - parsed = JSON.parse(text || "{}"); - } catch { - throw new KeycloakError("Keycloak token response bevat geen geldig JSON", ERROR_CODES.GENERIC); - } - - const token = trimString(parsed.access_token); - if (!token) { - throw new KeycloakError("Keycloak token ontbreekt in response", ERROR_CODES.GENERIC); - } - return token; - } -} - -module.exports = { - KeycloakService, - KeycloakError, - ERROR_CODES, - parseUntrustClientInput, - translateKeycloakError, -}; diff --git a/services/OasBundleService.js b/services/OasBundleService.js deleted file mode 100644 index 9d9051d..0000000 --- a/services/OasBundleService.js +++ /dev/null @@ -1,160 +0,0 @@ -const fs = require("node:fs/promises"); -const os = require("node:os"); -const path = require("node:path"); -const { URL } = require("node:url"); -const { execFile } = require("node:child_process"); -const { promisify } = require("node:util"); -const jsYaml = require("js-yaml"); -const Service = require("./Service"); -const { resolveOasInput } = require("./OasInputService"); -const { sanitizeFileName } = require("../utils/fileName"); -const logger = require("../logger"); - -const DEFAULT_FILENAME = "openapi"; -const REDOCLY_BIN = require.resolve("@redocly/cli/bin/cli"); -const execFileAsync = promisify(execFile); - -const guessPreferredExtension = (contents) => { - if (typeof contents !== "string") { - return ".json"; - } - const trimmed = contents.trimStart(); - if (trimmed.startsWith("{") || trimmed.startsWith("[")) { - return ".json"; - } - return ".yaml"; -}; - -const deriveDocumentName = (doc, source) => { - if (doc && typeof doc === "object" && !Array.isArray(doc)) { - const infoTitle = typeof doc.info?.title === "string" ? doc.info.title.trim() : ""; - if (infoTitle) { - const sanitized = sanitizeFileName(infoTitle, { fallback: DEFAULT_FILENAME }); - if (sanitized) { - return sanitized; - } - } - } - if (typeof source === "string" && source !== "request-body") { - try { - const parsed = new URL(source); - const basePath = parsed.pathname || ""; - if (basePath) { - const basename = path.posix.basename(basePath); - const withoutExt = basename.replace(/\.[^.]+$/, ""); - const sanitized = sanitizeFileName(withoutExt, { fallback: DEFAULT_FILENAME }); - if (sanitized) { - return sanitized; - } - } - } catch { - // ignore invalid URL - } - } - return DEFAULT_FILENAME; -}; - -const runRedoclyBundle = async (inputPath, outputPath, ext) => { - const args = [ - REDOCLY_BIN, - "bundle", - inputPath, - "--output", - outputPath, - "--ext", - ext, - "--dereferenced", - ]; - return execFileAsync(process.execPath, args, { maxBuffer: 20 * 1024 * 1024 }); -}; - -const bundle = async (input) => { - const resolved = await resolveOasInput(input); - const contents = typeof resolved.contents === "string" ? resolved.contents : ""; - if (!contents.trim()) { - throw Service.rejectResponse( - { - message: "Body ontbreekt of ongeldig: gebruik oasUrl of oasBody.", - }, - 400, - ); - } - - let tmpDir; - const inputExt = guessPreferredExtension(contents); - const inputPath = () => path.join(tmpDir, `input${inputExt}`); - const outputPath = (ext) => path.join(tmpDir, `bundle.${ext}`); - - let bundledText; - let document; - let outputExt = "json"; - try { - tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "oas-bundle-")); - await fs.writeFile(inputPath(), contents, "utf8"); - try { - await runRedoclyBundle(inputPath(), outputPath("json"), "json"); - bundledText = await fs.readFile(outputPath("json"), "utf8"); - document = JSON.parse(bundledText); - } catch (jsonError) { - const errText = `${jsonError?.stderr || ""}${jsonError?.stdout || ""}${jsonError?.message || ""}`; - const hasCircular = errText.toLowerCase().includes("circular reference"); - if (!hasCircular) { - throw jsonError; - } - logger.warn("[OasBundleService] JSON bundle failed due to circular refs, retrying with YAML", { - message: jsonError?.message, - }); - outputExt = "yaml"; - await runRedoclyBundle(inputPath(), outputPath("yaml"), "yaml"); - bundledText = await fs.readFile(outputPath("yaml"), "utf8"); - document = jsYaml.load(bundledText); - } - } catch (error) { - logger.error("[OasBundleService] bundle failed via redocly CLI", { - message: error?.message, - stack: error?.stack, - }); - const status = typeof error?.status === "number" && error.status >= 400 ? error.status : 400; - throw Service.rejectResponse( - { - message: "Het bundelen van de OpenAPI specificatie is mislukt.", - detail: error?.message, - }, - status, - ); - } finally { - if (tmpDir) { - try { - await fs.rm(tmpDir, { recursive: true, force: true }); - } catch { - // ignore cleanup errors - } - } - } - - if (!document || typeof document !== "object" || Array.isArray(document)) { - throw Service.rejectResponse( - { - message: "Onverwachte structuur na bundelen.", - }, - 500, - ); - } - - const docName = deriveDocumentName(document, resolved.source); - const buffer = Buffer.from(bundledText, "utf8"); - const filename = `${docName}.${outputExt}`; - const contentType = outputExt === "json" ? "application/json" : "application/yaml"; - - return { - headers: { - "Content-Type": contentType, - "Content-Disposition": `attachment; filename="${filename}"`, - }, - rawBody: buffer, - }; -}; - -module.exports = { - bundle, -}; diff --git a/services/OasConversionService.js b/services/OasConversionService.js deleted file mode 100644 index d851085..0000000 --- a/services/OasConversionService.js +++ /dev/null @@ -1,187 +0,0 @@ -const { Converter } = require("@apiture/openapi-down-convert"); -const { upgrade: scalarUpgrade } = require("@scalar/openapi-upgrader"); -const jsYaml = require("js-yaml"); -const Service = require("./Service"); -const { resolveOasInput } = require("./OasInputService"); -const logger = require("../logger"); - -const DEFAULT_TARGET_VERSION = "3.1.0"; - -const EMPTY_BODY_ERROR = "Body ontbreekt of ongeldig: gebruik oasUrl of oasBody"; -const VERSION_MISSING_ERROR = "OpenAPI document bevat geen geldig openapi versieveld"; -const UNSUPPORTED_VERSION_ERROR = "Alleen OpenAPI 3.0 en 3.1 worden ondersteund"; -const UNSUPPORTED_TARGET_VERSION_ERROR = "targetVersion wordt niet ondersteund. Gebruik 3.0 of 3.1."; - -const parseSpecification = (contents) => { - const trimmed = contents.trim(); - if (trimmed.length === 0) { - throw Service.rejectResponse({ message: EMPTY_BODY_ERROR }, 400); - } - try { - const spec = JSON.parse(trimmed); - if (!spec || typeof spec !== "object" || Array.isArray(spec)) { - throw new Error("Ongeldig OpenAPI document"); - } - return { spec, format: "json" }; - } catch (_jsonError) { - try { - const spec = jsYaml.load(trimmed); - if (!spec || typeof spec !== "object" || Array.isArray(spec)) { - throw new Error("Ongeldig OpenAPI document"); - } - return { spec, format: "yaml" }; - } catch (yamlError) { - throw new Error(`Kan OpenAPI specificatie niet parseren: ${yamlError.message}`); - } - } -}; - -const resolveVersionDescriptor = (value) => { - const raw = - typeof value === "number" && Number.isFinite(value) - ? value.toString() - : typeof value === "string" - ? value.trim() - : ""; - if (!raw) { - return null; - } - if (raw === "3") { - return { major: "3.0", canonical: "3.0.3" }; - } - if (raw.startsWith("3.0")) { - return { major: "3.0", canonical: "3.0.3" }; - } - if (raw.startsWith("3.1")) { - return { major: "3.1", canonical: "3.1.0" }; - } - return null; -}; - -const normalizeTargetVersion = (value) => { - if (typeof value !== "string" || value.trim().length === 0) { - return DEFAULT_TARGET_VERSION; - } - const descriptor = resolveVersionDescriptor(value); - if (!descriptor) { - throw Service.rejectResponse( - { - message: UNSUPPORTED_TARGET_VERSION_ERROR, - }, - 400, - ); - } - return descriptor.canonical; -}; - -const ensureObjectSpec = (value, errorMessage) => { - if (!value || typeof value !== "object" || Array.isArray(value)) { - throw new Error(errorMessage); - } - return value; -}; - -const convertSpec = async (spec, targetVersion, options = {}) => { - const sourceDescriptor = resolveVersionDescriptor(spec.openapi); - const rawVersion = spec.openapi == null ? "" : String(spec.openapi).trim(); - if (rawVersion.length === 0 || !sourceDescriptor) { - throw Service.rejectResponse({ message: VERSION_MISSING_ERROR }, 400); - } - - const targetDescriptor = resolveVersionDescriptor(targetVersion); - if (!targetDescriptor) { - throw Service.rejectResponse({ message: UNSUPPORTED_TARGET_VERSION_ERROR }, 400); - } - - if (sourceDescriptor.major === targetDescriptor.major) { - if (options.preserveSourceVersion && sourceDescriptor.major === "3.1") { - spec.openapi = rawVersion; - return { spec, resolvedVersion: rawVersion }; - } - spec.openapi = targetDescriptor.canonical; - return { spec, resolvedVersion: targetDescriptor.canonical }; - } - - if (sourceDescriptor.major === "3.0" && targetDescriptor.major === "3.1") { - const upgraded = ensureObjectSpec( - scalarUpgrade(spec, "3.1"), - "Scalar OpenAPI upgrader retourneerde een ongeldig document.", - ); - upgraded.openapi = targetDescriptor.canonical; - return { spec: upgraded, resolvedVersion: targetDescriptor.canonical }; - } - - if (sourceDescriptor.major === "3.1" && targetDescriptor.major === "3.0") { - const downConverter = new Converter(spec); - const downgraded = ensureObjectSpec( - downConverter.convert(), - "OpenAPI down converter retourneerde een ongeldig document.", - ); - downgraded.openapi = targetDescriptor.canonical; - return { spec: downgraded, resolvedVersion: targetDescriptor.canonical }; - } - - throw Service.rejectResponse({ message: UNSUPPORTED_VERSION_ERROR }, 400); -}; - -const serializeSpecification = (spec, format, targetVersion) => { - const filenameBase = `openapi-${targetVersion.replace(/\./g, "-")}`; - if (format === "json") { - const json = JSON.stringify(spec, null, 2); - return { - buffer: Buffer.from(json, "utf8"), - contentType: "application/json", - filename: `${filenameBase}.json`, - }; - } - const yaml = jsYaml.dump(spec, { lineWidth: -1 }); - return { - buffer: Buffer.from(yaml, "utf8"), - contentType: "application/yaml", - filename: `${filenameBase}.yaml`, - }; -}; - -const convert = async (input) => { - const requestedTargetVersion = typeof input?.targetVersion === "string" ? input.targetVersion : undefined; - const targetVersion = normalizeTargetVersion(requestedTargetVersion); - const hasExplicitTargetVersion = - typeof requestedTargetVersion === "string" && requestedTargetVersion.trim().length > 0; - const { contents } = await resolveOasInput(input); - let parsed; - try { - parsed = parseSpecification(contents); - } catch (error) { - if (Service.isErrorResponse(error)) throw error; - logger.error(`[OasConversionService] parseSpecification failed: ${error?.message}`); - throw Service.rejectResponse({ message: error.message }, 500); - } - - const { spec, format } = parsed; - let convertedSpec, resolvedVersion; - try { - ({ spec: convertedSpec, resolvedVersion } = await convertSpec(spec, targetVersion, { - preserveSourceVersion: !hasExplicitTargetVersion, - })); - } catch (error) { - if (Service.isErrorResponse(error)) throw error; - logger.error(`[OasConversionService] convertSpec failed: ${error?.message}`); - throw Service.rejectResponse( - { message: error.message || "Er is een fout opgetreden tijdens het converteren." }, - 500, - ); - } - - const { buffer, contentType, filename } = serializeSpecification(convertedSpec, format, resolvedVersion); - return { - headers: { - "Content-Type": contentType, - "Content-Disposition": `attachment; filename="${filename}"`, - }, - rawBody: buffer, - }; -}; - -module.exports = { - convert, -}; diff --git a/services/OasGeneratorService.js b/services/OasGeneratorService.js deleted file mode 100644 index 87a8485..0000000 --- a/services/OasGeneratorService.js +++ /dev/null @@ -1,359 +0,0 @@ -const { kebabCase, upperCamelCase } = require("case-anything"); -const Service = require("./Service"); -const { resolveOasInput } = require("./OasInputService"); -const { sanitizeFileName } = require("../utils/fileName"); -const logger = require("../logger"); - -const EMPTY_BODY_ERROR = "Body ontbreekt of heeft een ongeldig formaat."; -const INVALID_JSON_ERROR = "Het aangeleverde JSON-document kon niet worden gelezen."; -const MISSING_VALUE_ERROR = (field) => `Eigenschap '${field}' ontbreekt of is ongeldig.`; -const NO_RESOURCES_ERROR = "Geef minimaal één resource op in het 'resources' veld."; - -const toUppercase = (value) => { - if (typeof value !== "string" || value.length === 0) { - return ""; - } - return value.charAt(0).toUpperCase() + value.slice(1); -}; - -const requireString = (value, fieldName) => { - if (typeof value !== "string" || value.trim().length === 0) { - throw Service.rejectResponse( - { - message: MISSING_VALUE_ERROR(fieldName), - detail: `${fieldName} moet een niet-lege string zijn.`, - }, - 400, - ); - } - return value.trim(); -}; - -const requireObject = (value, fieldName) => { - if (!value || typeof value !== "object" || Array.isArray(value)) { - throw Service.rejectResponse( - { - message: MISSING_VALUE_ERROR(fieldName), - detail: `${fieldName} moet een object zijn.`, - }, - 400, - ); - } - return value; -}; - -const normalizeContact = (contact) => { - const source = requireObject(contact, "contact"); - return { - name: requireString(source.name, "contact.name"), - email: requireString(source.email, "contact.email"), - url: requireString(source.url, "contact.url"), - }; -}; - -const normalizeResources = (resources) => { - if (!Array.isArray(resources) || resources.length === 0) { - throw Service.rejectResponse( - { - message: NO_RESOURCES_ERROR, - detail: NO_RESOURCES_ERROR, - }, - 400, - ); - } - return resources.map((resource, index) => { - const source = requireObject(resource, `resources[${index}]`); - return { - name: requireString(source.name, `resources[${index}].name`), - plural: requireString(source.plural, `resources[${index}].plural`), - readonly: Boolean(source.readonly), - }; - }); -}; - -const parseGeneratorConfig = (contents) => { - if (typeof contents !== "string" || contents.trim().length === 0) { - throw Service.rejectResponse( - { - message: EMPTY_BODY_ERROR, - }, - 400, - ); - } - try { - const parsed = JSON.parse(contents); - const normalized = requireObject(parsed, "root"); - return { - title: requireString(normalized.title, "title"), - description: requireString(normalized.description, "description"), - contact: normalizeContact(normalized.contact), - resources: normalizeResources(normalized.resources), - }; - } catch (error) { - if (Service.isErrorResponse(error)) { - throw error; - } - throw Service.rejectResponse( - { - message: INVALID_JSON_ERROR, - detail: error?.message || INVALID_JSON_ERROR, - }, - 400, - ); - } -}; - -const createEndpointSingle = (resource) => { - const baseName = upperCamelCase(resource.name); - const schemaRef = `#/components/schemas/${baseName}`; - const pluralLabel = toUppercase(resource.plural); - const singularLabel = toUppercase(resource.name); - const endpoint = { - parameters: [ - { - $ref: "#/components/parameters/id", - }, - ], - get: { - operationId: `retrieve${baseName}`, - description: `${singularLabel} ophalen`, - summary: `${singularLabel} ophalen`, - tags: [pluralLabel], - responses: { - 200: { - headers: { - "API-Version": { - $ref: "https://static.developer.overheid.nl/adr/components.yaml#/headers/API-Version", - }, - }, - description: "OK", - content: { - "application/json": { - schema: { - $ref: schemaRef, - }, - }, - }, - }, - 404: { - $ref: "https://static.developer.overheid.nl/adr/components.yaml#/responses/404", - }, - }, - }, - }; - if (!resource.readonly) { - endpoint.put = { - operationId: `edit${baseName}`, - description: `${singularLabel} wijzigen`, - summary: `${singularLabel} wijzigen`, - tags: [pluralLabel], - responses: { - 200: { - headers: { - "API-Version": { - $ref: "https://static.developer.overheid.nl/adr/components.yaml#/headers/API-Version", - }, - }, - description: "OK", - content: { - "application/json": { - schema: { - $ref: schemaRef, - }, - }, - }, - }, - 400: { - $ref: "https://static.developer.overheid.nl/adr/components.yaml#/responses/400", - }, - }, - }; - endpoint.delete = { - operationId: `remove${baseName}`, - description: `${singularLabel} verwijderen`, - summary: `${singularLabel} verwijderen`, - tags: [pluralLabel], - responses: { - 204: { - $ref: "https://static.developer.overheid.nl/adr/components.yaml#/responses/204", - }, - 404: { - $ref: "https://static.developer.overheid.nl/adr/components.yaml#/responses/404", - }, - }, - }; - } - return endpoint; -}; - -const createEndpointList = (resource) => { - const pluralName = upperCamelCase(resource.plural); - const schemaRef = `#/components/schemas/${upperCamelCase(resource.name)}`; - const pluralLabel = toUppercase(resource.plural); - const endpoint = { - get: { - operationId: `list${pluralName}`, - description: `Alle ${resource.plural} ophalen`, - summary: `Alle ${resource.plural} ophalen`, - tags: [pluralLabel], - responses: { - 200: { - headers: { - "API-Version": { - $ref: "https://static.developer.overheid.nl/adr/components.yaml#/headers/API-Version", - }, - Link: { - $ref: "https://static.developer.overheid.nl/adr/components.yaml#/headers/Link", - }, - }, - description: "OK", - content: { - "application/json": { - schema: { - $ref: schemaRef, - }, - }, - }, - }, - }, - }, - }; - if (!resource.readonly) { - endpoint.post = { - operationId: `create${pluralName}`, - description: `Nieuwe ${resource.name} aanmaken`, - summary: `Nieuwe ${resource.name} aanmaken`, - tags: [pluralLabel], - responses: { - 201: { - headers: { - "API-Version": { - $ref: "https://static.developer.overheid.nl/adr/components.yaml#/headers/API-Version", - }, - }, - description: "Created", - content: { - "application/json": { - schema: { - $ref: schemaRef, - }, - }, - }, - }, - 400: { - $ref: "https://static.developer.overheid.nl/adr/components.yaml#/responses/400", - }, - }, - }; - } - return endpoint; -}; - -const createPaths = (resources) => - resources.reduce((paths, resource) => { - const pluralPath = kebabCase(resource.plural); - paths[`/${pluralPath}`] = createEndpointList(resource); - paths[`/${pluralPath}/{id}`] = createEndpointSingle(resource); - return paths; - }, {}); - -const createSchemas = (resources) => - resources.reduce((schemas, resource) => { - const schemaName = upperCamelCase(resource.name); - schemas[schemaName] = { - type: "object", - properties: { - id: { - type: "string", - format: "uuid", - }, - }, - }; - return schemas; - }, {}); - -const buildOpenApiDocument = (config) => ({ - openapi: "3.0.2", - info: { - title: config.title, - description: config.description, - version: "1.0.0", - contact: { - name: config.contact.name, - email: config.contact.email, - url: config.contact.url, - }, - }, - servers: [ - { - url: "@TODO: Add server URL", - }, - ], - tags: config.resources.map((resource) => { - const tag = toUppercase(resource.plural); - return { - name: tag, - description: `Alle API operaties die bij ${resource.plural} horen.`, - }; - }), - paths: createPaths(config.resources), - components: { - schemas: createSchemas(config.resources), - parameters: { - id: { - name: "id", - in: "path", - description: "id", - required: true, - schema: { - type: "string", - }, - }, - }, - }, -}); - -const deriveFilename = (title) => { - const sanitized = sanitizeFileName(title, { fallback: "openapi-boilerplate", lowercase: true }); - return (sanitized && `${sanitized}.json`) || "openapi-boilerplate.json"; -}; - -const generate = async (input) => { - const { contents } = await resolveOasInput(input); - let config; - try { - config = parseGeneratorConfig(contents); - } catch (error) { - logger.error(`[OasGeneratorService] parseGeneratorConfig failed: ${error?.detail || error?.message || "unknown"}`); - throw error; - } - - try { - const document = buildOpenApiDocument(config); - const filename = deriveFilename(config.title); - const buffer = Buffer.from(JSON.stringify(document, null, 2), "utf8"); - return { - headers: { - "Content-Type": "application/json", - "Content-Disposition": `attachment; filename="${filename}"`, - }, - rawBody: buffer, - }; - } catch (error) { - logger.error( - `[OasGeneratorService] buildOpenApiDocument failed: ${error?.message || "unknown"}${ - error?.stack ? ` stack=${error.stack}` : "" - }`, - ); - throw Service.rejectResponse( - { - message: "Er is een fout opgetreden tijdens het genereren van de OpenAPI specificatie.", - }, - 500, - ); - } -}; - -module.exports = { - generate, -}; diff --git a/services/OasInputService.js b/services/OasInputService.js deleted file mode 100644 index 7034289..0000000 --- a/services/OasInputService.js +++ /dev/null @@ -1,50 +0,0 @@ -const Service = require("./Service"); -const { fetchSpecification } = require("./RemoteSpecificationService"); - -const resolveOasInput = async (input) => { - if (!input || typeof input !== "object") { - throw Service.rejectResponse( - { - message: "Body ontbreekt of heeft een ongeldig formaat.", - }, - 400, - ); - } - const { oasBody, oasUrl } = input; - if (typeof oasBody === "string" && oasBody.trim().length > 0) { - return { - source: "request-body", - contents: oasBody, - }; - } - if (typeof oasUrl === "string" && oasUrl.trim().length > 0) { - let parsedUrl; - try { - parsedUrl = new URL(oasUrl); - } catch { - throw Service.rejectResponse( - { - message: "De waarde van oasUrl is geen geldige URL.", - }, - 400, - ); - } - const contents = await fetchSpecification(parsedUrl.toString(), { - errorMessage: "Het ophalen van de OpenAPI specificatie is mislukt.", - }); - return { - source: parsedUrl.toString(), - contents, - }; - } - throw Service.rejectResponse( - { - message: "Geef een oasBody of oasUrl mee.", - }, - 400, - ); -}; - -module.exports = { - resolveOasInput, -}; diff --git a/services/OasValidatorService.js b/services/OasValidatorService.js deleted file mode 100644 index a09e26f..0000000 --- a/services/OasValidatorService.js +++ /dev/null @@ -1,216 +0,0 @@ -const { randomUUID } = require("node:crypto"); -const { Spectral, Document } = require("@stoplight/spectral-core"); -const Parsers = require("@stoplight/spectral-parsers"); -const Service = require("./Service"); -const { fetchSpecification } = require("./RemoteSpecificationService"); -const logger = require("../logger"); - -const RULESET_LOADERS = { - "2.0": () => import("@developer-overheid-nl/adr-rulesets/rulesets/adr-20"), - "2.1": () => import("@developer-overheid-nl/adr-rulesets/rulesets/adr-21"), -}; -const DEFAULT_RULESET_VERSION = "2.1"; - -const SEVERITY_LABELS = ["error", "warning", "info", "hint"]; - -const MEASURED_RULE_GROUPS = { - openapi3: "openapi3", - "nlgov:openapi3": "openapi3", - "openapi-root-exists": "openapi-root-exists", - "nlgov:openapi-root-exists": "openapi-root-exists", - "missing-version-header": "version-header", - "nlgov:missing-version-header": "version-header", - "missing-header": "version-header", - "nlgov:missing-header": "version-header", - "include-major-version-in-uri": "include-major-version-in-uri", - "nlgov:include-major-version-in-uri": "include-major-version-in-uri", - "paths-no-trailing-slash": "paths-no-trailing-slash", - "nlgov:paths-no-trailing-slash": "paths-no-trailing-slash", - "info-contact-fields-exist": "info-contact-fields-exist", - "nlgov:info-contact-fields-exist": "info-contact-fields-exist", - "http-methods": "http-methods", - "nlgov:http-methods": "http-methods", - semver: "semver", - "nlgov:semver": "semver", -}; - -const MEASURED_GROUP_KEYS = Array.from(new Set(Object.values(MEASURED_RULE_GROUPS))); - -const spectralInstancePromises = new Map(); - -const loadSpectral = (rulesetVersion) => { - if (!spectralInstancePromises.has(rulesetVersion)) { - const promise = (async () => { - try { - const loader = RULESET_LOADERS[rulesetVersion]; - const module = await loader(); - const spectral = new Spectral(); - spectral.setRuleset(module.default); - return spectral; - } catch (error) { - logger.error(`[OasValidatorService] Unable to load ruleset (${rulesetVersion}): ${error.message}`); - spectralInstancePromises.delete(rulesetVersion); - throw Service.rejectResponse( - { - message: "Kan het regels-bestand niet laden voor validatie.", - detail: error.message, - }, - 500, - ); - } - })(); - spectralInstancePromises.set(rulesetVersion, promise); - } - return spectralInstancePromises.get(rulesetVersion); -}; - -const resolveSpecificationInput = async (input) => { - if (!input || typeof input !== "object") { - throw Service.rejectResponse( - { - message: "Body ontbreekt of heeft een ongeldig formaat.", - }, - 400, - ); - } - const { oasBody, oasUrl } = input; - if (typeof oasBody === "string" && oasBody.trim().length > 0) { - return { - source: "request-body", - contents: oasBody, - }; - } - if (typeof oasUrl === "string" && oasUrl.trim().length > 0) { - let parsedUrl; - try { - parsedUrl = new URL(oasUrl); - } catch (error) { - logger.error("[OasValidatorService] invalid oasUrl", { message: error.message }); - throw Service.rejectResponse( - { - message: "De waarde van oasUrl is geen geldige URL.", - }, - 400, - ); - } - const contents = await fetchSpecification(parsedUrl.toString(), { - errorMessage: "Het ophalen van de OpenAPI specificatie is mislukt.", - }); - return { - source: parsedUrl.toString(), - contents, - }; - } - throw Service.rejectResponse( - { - message: "Geef een oasBody of oasUrl mee.", - }, - 400, - ); -}; - -const buildInfo = (lintMessageId, diagnostic) => { - const pathValue = - Array.isArray(diagnostic.path) && diagnostic.path.length > 0 ? diagnostic.path.map(String).join(".") : "body"; - return [ - { - id: randomUUID(), - lintMessageId, - message: diagnostic.message, - path: pathValue, - }, - ]; -}; - -const mapDiagnosticsToMessages = (diagnostics, timestamp) => - diagnostics.map((diagnostic) => { - const lintMessageId = randomUUID(); - const severityIndex = typeof diagnostic.severity === "number" && diagnostic.severity >= 0 ? diagnostic.severity : 2; - const severity = SEVERITY_LABELS[severityIndex] || "info"; - return { - id: lintMessageId, - code: diagnostic.code ? String(diagnostic.code) : "spectral", - createdAt: timestamp, - severity, - infos: buildInfo(lintMessageId, diagnostic), - }; - }); - -const computeAdrScore = (messages) => { - const failedGroups = new Set(); - messages.forEach((message) => { - if (String(message.severity).toLowerCase() !== "error") { - return; - } - const group = MEASURED_RULE_GROUPS[message.code]; - if (group) { - failedGroups.add(group); - } - }); - - if (MEASURED_GROUP_KEYS.length === 0) { - return { score: 100, failedGroups: [] }; - } - - const score = Math.round((1 - failedGroups.size / MEASURED_GROUP_KEYS.length) * 100); - return { - score: Math.max(0, Math.min(100, score)), - failedGroups: Array.from(failedGroups).sort(), - }; -}; - -const buildLintResult = (diagnostics, rulesetVersion) => { - const timestamp = new Date().toISOString(); - const messages = mapDiagnosticsToMessages(diagnostics, timestamp); - const errorCount = messages.filter((message) => String(message.severity).toLowerCase() === "error").length; - const { score } = computeAdrScore(messages); - return { - id: randomUUID(), - apiId: "", - createdAt: timestamp, - failures: errorCount, - messages, - score, - successes: score === 100, - rulesetVersion, - }; -}; - -const normalizeRulesetVersion = (value) => { - if (typeof value === "number" && Number.isFinite(value)) { - value = value.toString(); - } - if (typeof value !== "string") { - return DEFAULT_RULESET_VERSION; - } - const trimmed = value.trim(); - if (trimmed === "2") { - return "2.0"; - } - if (Object.hasOwn(RULESET_LOADERS, trimmed)) { - return trimmed; - } - return DEFAULT_RULESET_VERSION; -}; - -const resolveValidationSettings = (input) => ({ - rulesetVersion: normalizeRulesetVersion(input?.targetVersion), -}); - -const validate = async (input) => { - const { contents, source } = await resolveSpecificationInput(input); - const { rulesetVersion } = resolveValidationSettings(input); - logger.info( - `[OasValidatorService] validate using ADR ruleset ${rulesetVersion} (targetVersion=${input?.targetVersion || "default"}, source=${source})`, - ); - const spectral = await loadSpectral(rulesetVersion); - const document = new Document(contents, Parsers.Yaml, source); - const parseDiagnostics = Array.isArray(document.diagnostics) ? document.diagnostics : []; - const lintDiagnostics = await spectral.run(document, { ignoreUnknownFormat: false }); - const diagnostics = [...parseDiagnostics, ...lintDiagnostics]; - return buildLintResult(diagnostics, rulesetVersion); -}; - -module.exports = { - validate, -}; diff --git a/services/PostmanConversionService.js b/services/PostmanConversionService.js deleted file mode 100644 index 15842a3..0000000 --- a/services/PostmanConversionService.js +++ /dev/null @@ -1,90 +0,0 @@ -const Service = require("./Service"); -const { resolveOasInput } = require("./OasInputService"); -const openapiToPostman = require("openapi-to-postmanv2"); -const { sanitizeFileName } = require("../utils/fileName"); - -const EMPTY_BODY_ERROR = "Body ontbreekt of ongeldig: gebruik oasUrl of oasBody"; -const DEFAULT_COLLECTION_NAME = "postman-collection"; - -const convertToPostman = (data) => - new Promise((resolve, reject) => { - openapiToPostman.convert({ type: "string", data }, {}, (error, result) => { - if (error) { - reject(error); - return; - } - if (!result || result.result !== true) { - const reason = - result && typeof result.reason === "string" ? result.reason : "Conversie naar Postman is mislukt."; - reject(new Error(reason)); - return; - } - resolve(result); - }); - }); - -const convert = async (input) => { - let resolved; - try { - resolved = await resolveOasInput(input); - } catch (error) { - if (Service.isErrorResponse(error)) { - throw error; - } - throw Service.rejectResponse( - { - message: error.message || "Er is een fout opgetreden tijdens het lezen van de input.", - }, - 500, - ); - } - - const trimmed = typeof resolved.contents === "string" ? resolved.contents.trim() : ""; - if (!trimmed) { - throw Service.rejectResponse({ message: EMPTY_BODY_ERROR }, 400); - } - - let conversionResult; - try { - conversionResult = await convertToPostman(trimmed); - } catch (error) { - throw Service.rejectResponse( - { - message: error.message || "Conversie naar Postman is mislukt.", - }, - 500, - ); - } - - const collectionOutput = Array.isArray(conversionResult.output) - ? conversionResult.output.find((item) => item.type === "collection") - : null; - if (!collectionOutput || !collectionOutput.data) { - throw Service.rejectResponse( - { - message: "Conversie naar Postman heeft geen collectie opgeleverd.", - }, - 500, - ); - } - - const collection = collectionOutput.data; - const collectionName = collection?.info?.name || DEFAULT_COLLECTION_NAME; - const filenameBase = sanitizeFileName(collectionName, { - fallback: DEFAULT_COLLECTION_NAME, - lowercase: true, - }); - const json = JSON.stringify(collection, null, 2); - - return { - headers: { - "Content-Type": "application/json", - "Content-Disposition": `attachment; filename="${filenameBase}.json"`, - }, - rawBody: Buffer.from(json, "utf8"), - }; -}; - -module.exports = { - convert, -}; diff --git a/services/RemoteSpecificationService.js b/services/RemoteSpecificationService.js deleted file mode 100644 index d974988..0000000 --- a/services/RemoteSpecificationService.js +++ /dev/null @@ -1,95 +0,0 @@ -const { fetch } = require("@stoplight/spectral-runtime"); -const Service = require("./Service"); -const logger = require("../logger"); - -const DEFAULT_ERROR_MESSAGE = "Het ophalen van de specificatie is mislukt."; -const DEFAULT_TIMEOUT_MS = 45000; - -const resolveTimeoutMs = () => { - const envValue = Number(process.env.OAS_FETCH_TIMEOUT_MS); - if (Number.isFinite(envValue) && envValue > 0) { - return envValue; - } - return DEFAULT_TIMEOUT_MS; -}; - -const buildFetchOptions = (url) => { - const controller = new AbortController(); - const timeout = resolveTimeoutMs(); - const timeoutId = setTimeout(() => controller.abort(), timeout); - const options = { - signal: controller.signal, - }; - return { options, cleanup: () => clearTimeout(timeoutId), timeout }; -}; - -const normalizeErrorDetail = (error) => { - const parts = []; - if (error?.message) { - parts.push(error.message); - } - if (error?.code) { - parts.push(`code=${error.code}`); - } - if (error?.type) { - parts.push(`type=${error.type}`); - } - return parts.join(" ").trim() || "Onbekende netwerkfout"; -}; - -const doFetch = async (url, { origin }) => { - const { options, cleanup, timeout } = buildFetchOptions(url); - try { - const headers = {}; - if (origin) { - headers.Origin = origin; - } - options.headers = headers; - const response = await fetch(url, options); - if (!response.ok) { - const preview = await response.text().catch(() => ""); - const trimmed = preview ? preview.slice(0, 200) : ""; - throw new Error(`Server gaf status ${response.status}${trimmed ? `: ${trimmed}` : ""}`); - } - return await response.text(); - } catch (error) { - error.timeout = timeout; - throw error; - } finally { - cleanup(); - } -}; - -const fetchSpecification = async (url, { errorMessage = DEFAULT_ERROR_MESSAGE } = {}) => { - const origin = "https://developer.overheid.nl"; - const attempts = origin ? [{ origin }, { origin: undefined }] : [{ origin: undefined }]; - let lastError; - for (const attempt of attempts) { - try { - return await doFetch(url, attempt); - } catch (error) { - lastError = error; - const detail = normalizeErrorDetail(error); - logger.error( - `[RemoteSpecificationService] fetch failed for ${url} (${attempt.origin ? "with" : "without"} Origin): ${detail}${ - error?.stack ? ` stack=${error.stack}` : "" - }`, - ); - // continue to next attempt - } - } - - const detail = normalizeErrorDetail(lastError); - throw Service.rejectResponse( - { - message: errorMessage, - detail, - timeout: lastError?.timeout, - }, - 400, - ); -}; - -module.exports = { - fetchSpecification, -}; diff --git a/services/Service.js b/services/Service.js deleted file mode 100644 index f516d8b..0000000 --- a/services/Service.js +++ /dev/null @@ -1,454 +0,0 @@ -const fs = require("node:fs"); -const path = require("node:path"); -const config = require("../config"); -const logger = require("../logger"); - -class Service { - static rejectResponse(error, code = 500) { - return { error, code }; - } - - static successResponse(payload, code = 200) { - return { payload, code }; - } - - static isErrorResponse(result) { - return Boolean(result && Object.hasOwn(result, "error") && Object.hasOwn(result, "code")); - } - - static normalizeSuccessResponse(result) { - if (result === undefined) { - return undefined; - } - if (result && Object.hasOwn(result, "payload")) { - return result; - } - return Service.successResponse(result); - } - - static extractRequestBody(params) { - if (!params || typeof params !== "object") { - return params; - } - if (params.body !== undefined) { - return params.body; - } - if (params.OASInput !== undefined) { - return params.OASInput; - } - if (params.oASInput !== undefined) { - return params.oASInput; - } - const entries = Object.entries(params); - if (entries.length === 1) { - return entries[0][1]; - } - return params; - } - - static throwHttpError(status, message, detail = undefined) { - throw Service.rejectResponse( - { - message, - detail: detail || message, - }, - status, - ); - } - - static getMockModule(serviceName) { - if (!config.USE_MOCKS) { - return null; - } - if (!Object.hasOwn(Service.mockModules, serviceName)) { - const mockPath = path.join(config.MOCK_DIR, `${serviceName}.js`); - if (!fs.existsSync(mockPath)) { - Service.mockModules[serviceName] = null; - return null; - } - try { - // eslint-disable-next-line global-require, import/no-dynamic-require - Service.mockModules[serviceName] = require(mockPath); - } catch (error) { - logger.error(`Unable to load mock implementation for ${serviceName}: ${error.message}`); - Service.mockModules[serviceName] = null; - } - } - return Service.mockModules[serviceName]; - } - - /** - * Returns undefined when no mock is available. Otherwise resolves to an object describing - * how the caller should respond (resolve/reject) with the normalized payload. - */ - static async applyMock(serviceName, operationId, params) { - if (!config.USE_MOCKS) { - return undefined; - } - let autoMockEvaluated = false; - let autoMock; - const resolveAutoMock = () => { - if (!autoMockEvaluated) { - autoMock = Service.generateAutoMock(operationId); - autoMockEvaluated = true; - } - return autoMock; - }; - const mockModule = Service.getMockModule(serviceName); - if (!mockModule) { - const generated = resolveAutoMock(); - if (generated !== undefined) { - logger.info(`[Mock] Using autogenerated payload for ${serviceName}.${operationId}`); - return { action: "resolve", value: generated }; - } - return undefined; - } - const handler = mockModule[operationId]; - if (typeof handler !== "function") { - const generated = resolveAutoMock(); - if (generated !== undefined) { - logger.info(`[Mock] Using autogenerated payload for ${serviceName}.${operationId}`); - return { action: "resolve", value: generated }; - } - return undefined; - } - try { - const result = await handler(params); - if (result === undefined) { - const generated = resolveAutoMock(); - if (generated !== undefined) { - logger.info(`[Mock] Using autogenerated payload for ${serviceName}.${operationId}`); - return { action: "resolve", value: generated }; - } - return undefined; - } - if (Service.isErrorResponse(result)) { - logger.info(`[Mock] Returning custom error response for ${serviceName}.${operationId}`); - return { action: "reject", value: result }; - } - logger.info(`[Mock] Returning custom mock payload for ${serviceName}.${operationId}`); - return { action: "resolve", value: Service.normalizeSuccessResponse(result) }; - } catch (error) { - if (Service.isErrorResponse(error)) { - logger.warn(`[Mock] Mock handler threw mock error for ${serviceName}.${operationId}`); - return { action: "reject", value: error }; - } - throw error; - } - } - - static getApiDoc() { - if (Service.apiDoc !== undefined) { - return Service.apiDoc; - } - try { - const specContents = fs.readFileSync(config.OPENAPI_JSON, "utf8"); - Service.apiDoc = JSON.parse(specContents); - } catch (error) { - logger.error(`Unable to load OpenAPI spec for auto mocks: ${error.message}`); - Service.apiDoc = null; - } - return Service.apiDoc; - } - - static buildOperationIndex() { - if (Service.operationIndex !== undefined) { - return Service.operationIndex; - } - const apiDoc = Service.getApiDoc(); - const index = {}; - if (apiDoc?.paths) { - Object.keys(apiDoc.paths).forEach((pathKey) => { - const pathItem = apiDoc.paths[pathKey]; - Object.keys(pathItem).forEach((methodKey) => { - const operation = pathItem[methodKey]; - if (!operation || typeof operation !== "object" || !operation.operationId) { - return; - } - const { operationId } = operation; - if (!operationId) { - return; - } - const entry = { - path: pathKey, - method: methodKey, - operation, - }; - index[operationId] = entry; - const sanitizedId = Service.sanitizeOperationId(operationId); - if (sanitizedId && sanitizedId !== operationId) { - index[sanitizedId] = entry; - } - const lowerId = operationId.toLowerCase(); - if (lowerId !== operationId && lowerId !== sanitizedId && !Object.hasOwn(index, lowerId)) { - index[lowerId] = entry; - } - }); - }); - } - Service.operationIndex = index; - return index; - } - - static resolveRef(ref) { - if (typeof ref !== "string" || !ref.startsWith("#/")) { - return undefined; - } - const apiDoc = Service.getApiDoc(); - if (!apiDoc) { - return undefined; - } - const parts = ref.replace("#/", "").split("/"); - let current = apiDoc; - for (let i = 0; i < parts.length; i += 1) { - const part = parts[i]; - if (!Object.hasOwn(current, part)) { - return undefined; - } - current = current[part]; - } - return current; - } - - static sanitizeOperationId(operationId) { - if (!operationId || typeof operationId !== "string") { - return null; - } - let result = operationId.trim(); - if (result.length === 0) { - return null; - } - result = result.replace(/[_-]+/g, " "); - result = result.replace(/[^a-zA-Z0-9_$]+/g, " "); - result = result - .split(" ") - .filter((segment) => segment.length > 0) - .map((segment, index) => { - if (index === 0) { - return segment; - } - return segment.charAt(0).toUpperCase() + segment.slice(1); - }) - .join(""); - result = result.replace(/^[^a-zA-Z_$]+/, ""); - if (result.length === 0) { - return null; - } - return result.charAt(0).toLowerCase() + result.slice(1); - } - - static pickPreferredMedia(content) { - if (!content || typeof content !== "object") { - return null; - } - if (content["application/json"]) { - return content["application/json"]; - } - if (content["application/problem+json"]) { - return content["application/problem+json"]; - } - const firstKey = Object.keys(content)[0]; - return firstKey ? content[firstKey] : null; - } - - static clone(value) { - if (value === undefined) { - return value; - } - try { - return JSON.parse(JSON.stringify(value)); - } catch (_error) { - return value; - } - } - - static primitiveExample(schema) { - if (!schema || typeof schema !== "object") { - return null; - } - if (schema.example !== undefined) { - return Service.clone(schema.example); - } - if (schema.default !== undefined) { - return Service.clone(schema.default); - } - if (schema.enum && schema.enum.length > 0) { - return Service.clone(schema.enum[0]); - } - switch (schema.type) { - case "string": - if (schema.format === "date-time") return new Date().toISOString(); - if (schema.format === "date") return new Date().toISOString().split("T")[0]; - if (schema.format === "uuid") return "00000000-0000-4000-8000-000000000000"; - return "string"; - case "integer": - case "number": - return 0; - case "boolean": - return true; - default: - return null; - } - } - - static generateExampleFromSchema(schema, stack = new Set()) { - if (!schema || typeof schema !== "object") { - return undefined; - } - if (schema.$ref) { - if (stack.has(schema.$ref)) { - return undefined; - } - stack.add(schema.$ref); - const resolved = Service.resolveRef(schema.$ref); - if (!resolved) { - return undefined; - } - const result = Service.generateExampleFromSchema(resolved, stack); - stack.delete(schema.$ref); - return result; - } - - const primitive = Service.primitiveExample(schema); - if (primitive !== null) { - return primitive; - } - - if (schema.type === "array") { - const itemExample = Service.generateExampleFromSchema(schema.items, stack); - return itemExample !== undefined ? [itemExample] : []; - } - - if (schema.type === "object" || schema.properties) { - const obj = {}; - const properties = schema.properties || {}; - const propertyNames = Object.keys(properties); - propertyNames.forEach((name) => { - const exampleValue = Service.generateExampleFromSchema(properties[name], stack); - if (exampleValue !== undefined) { - obj[name] = exampleValue; - } - }); - if (schema.additionalProperties && typeof schema.additionalProperties === "object") { - const additionalExample = Service.generateExampleFromSchema(schema.additionalProperties, stack); - if (additionalExample !== undefined) { - obj.additionalProperty = additionalExample; - } - } - return obj; - } - - if (schema.allOf && Array.isArray(schema.allOf)) { - return schema.allOf.reduce((acc, partialSchema) => { - const partialExample = Service.generateExampleFromSchema(partialSchema, stack); - if (partialExample === undefined) { - return acc; - } - if (partialExample && typeof partialExample === "object" && !Array.isArray(partialExample)) { - return { ...acc, ...partialExample }; - } - return partialExample; - }, {}); - } - - if (schema.oneOf && Array.isArray(schema.oneOf) && schema.oneOf.length > 0) { - return Service.generateExampleFromSchema(schema.oneOf[0], stack); - } - - if (schema.anyOf && Array.isArray(schema.anyOf) && schema.anyOf.length > 0) { - return Service.generateExampleFromSchema(schema.anyOf[0], stack); - } - - return undefined; - } - - static extractExampleFromResponse(response) { - if (!response) { - return undefined; - } - let resolvedResponse = response; - if (typeof resolvedResponse === "string") { - const dereferenced = Service.resolveRef(resolvedResponse); - if (dereferenced) { - resolvedResponse = dereferenced; - } - } - if (resolvedResponse && typeof resolvedResponse === "object" && resolvedResponse.$ref) { - const dereferenced = Service.resolveRef(resolvedResponse.$ref); - if (dereferenced) { - resolvedResponse = dereferenced; - } - } - if (!resolvedResponse || typeof resolvedResponse !== "object") { - return undefined; - } - const media = Service.pickPreferredMedia(resolvedResponse.content); - if (!media) { - return undefined; - } - if (media.example !== undefined) { - return Service.clone(media.example); - } - if (media.examples && typeof media.examples === "object") { - const firstExample = Object.values(media.examples)[0]; - if (firstExample && typeof firstExample === "object") { - if (firstExample.value !== undefined) { - return Service.clone(firstExample.value); - } - } - } - if (media.schema) { - return Service.generateExampleFromSchema(media.schema); - } - return undefined; - } - - static pickResponse(operation) { - if (!operation || !operation.responses) { - return null; - } - const preferredStatuses = ["200", "201", "202", "204"]; - for (let i = 0; i < preferredStatuses.length; i += 1) { - const status = preferredStatuses[i]; - if (operation.responses[status]) { - return { status, response: operation.responses[status] }; - } - } - const statusCodes = Object.keys(operation.responses); - if (statusCodes.length === 0) { - return null; - } - return { status: statusCodes[0], response: operation.responses[statusCodes[0]] }; - } - - static generateAutoMock(operationId) { - const operationIndex = Service.buildOperationIndex(); - const operationEntry = operationIndex[operationId]; - if (!operationEntry) { - return undefined; - } - const { operation } = operationEntry; - const responseInfo = Service.pickResponse(operation); - if (!responseInfo) { - return undefined; - } - const examplePayload = Service.extractExampleFromResponse(responseInfo.response); - const parsedStatus = Number.parseInt(responseInfo.status, 10); - const statusCode = Number.isNaN(parsedStatus) ? 200 : parsedStatus; - if (examplePayload === undefined) { - return Service.successResponse( - { - message: `Auto-generated mock for ${operationId}`, - }, - statusCode, - ); - } - return Service.successResponse(examplePayload, statusCode); - } -} - -Service.mockModules = {}; -Service.apiDoc = undefined; -Service.operationIndex = undefined; - -module.exports = Service; diff --git a/services/ToolsService.js b/services/ToolsService.js deleted file mode 100644 index 40d4786..0000000 --- a/services/ToolsService.js +++ /dev/null @@ -1,295 +0,0 @@ -/* eslint-disable no-unused-vars */ -const Service = require("./Service"); -const OasConversionService = require("./OasConversionService"); -const OasBundleService = require("./OasBundleService"); -const OasValidatorService = require("./OasValidatorService"); -const OasGeneratorService = require("./OasGeneratorService"); -const PostmanConversionService = require("./PostmanConversionService"); -const ArazzoVisualizationService = require("./ArazzoVisualizationService"); -const { KeycloakService, parseUntrustClientInput, translateKeycloakError } = require("./KeycloakService"); -const logger = require("../logger"); - -const keycloakService = KeycloakService.fromEnv(); - -const CONTENT_TYPE_MARKDOWN = "text/markdown; charset=utf-8"; -const CONTENT_TYPE_TEXT = "text/plain; charset=utf-8"; - -const normalizeError = (error) => { - if (Service.isErrorResponse(error)) { - const status = typeof error.code === "number" ? error.code : 400; - const message = error.error?.message || "Er is een fout opgetreden."; - const detail = error.error?.detail || message; - return { status, message, detail }; - } - const status = typeof error?.status === "number" && error.status > 0 ? error.status : 400; - const message = error?.message || "Er is een fout opgetreden."; - const detail = error?.detail || message; - return { status, message, detail }; -}; - -const logServiceError = (operation, error) => { - const { detail } = normalizeError(error); - const stack = error?.stack ? ` stack=${error.stack}` : ""; - logger.error(`[ToolsService] ${operation} failed: ${detail}${stack}`); -}; - -const handleArazzoVisualization = async ({ operationId, params, pick, contentType }) => { - try { - const mockResult = await Service.applyMock("ToolsService", operationId, params); - if (mockResult !== undefined) { - if (mockResult.action === "reject") { - throw mockResult.value; - } - return mockResult.value; - } - const requestPayload = Service.extractRequestBody(params); - const visualization = await ArazzoVisualizationService.visualize(requestPayload); - const body = pick(visualization) || ""; - return { - code: 200, - headers: { - "Content-Type": contentType, - }, - payload: body, - }; - } catch (e) { - logServiceError(operationId, e); - const { status, message, detail } = normalizeError(e); - throw Service.rejectResponse({ message, detail }, status); - } -}; - -/** - * Arazzo Markdown (POST) - * Genereert alleen de Markdown-uitvoer van een Arazzo specificatie. - * - * arazzoInput ArazzoInput (optional) - * no response value expected for this operation - */ -const arazzoMarkdown = async (params) => - handleArazzoVisualization({ - operationId: "arazzoMarkdown", - params, - pick: (visualization) => visualization.markdown, - contentType: CONTENT_TYPE_MARKDOWN, - }); - -/** - * Arazzo Mermaid (POST) - * Genereert de Mermaid flowchart van een Arazzo specificatie. - * - * arazzoInput ArazzoInput (optional) - * no response value expected for this operation - */ -const arazzoMermaid = async (params) => - handleArazzoVisualization({ - operationId: "arazzoMermaid", - params, - pick: (visualization) => visualization.mermaid, - contentType: CONTENT_TYPE_TEXT, - }); - -/** - * Converteer OpenAPI 3.0/3.1 - * Converteert standaard naar 3.1. Geef targetVersion (3.0 of 3.1) mee om een doelversie te forceren. Body: { oasUrl } of { oasBody } (stringified JSON of YAML). - * - * oASInput OASInput (optional) - * no response value expected for this operation - */ -// const convertOAS = async ({ oASInput }) => { -const convertOAS = async (params) => { - try { - const mockResult = await Service.applyMock("ToolsService", "convertOAS", params); - if (mockResult !== undefined) { - if (mockResult.action === "reject") { - throw mockResult.value; - } - return mockResult.value; - } - const requestPayload = Service.extractRequestBody(params); - const result = await OasConversionService.convert(requestPayload); - return { - code: 200, - headers: result.headers, - payload: result.rawBody, - }; - } catch (e) { - logServiceError("convertOAS", e); - const { status, message, detail } = normalizeError(e); - throw Service.rejectResponse({ message, detail }, status); - } -}; - -/** - * Maak Postman-collectie (POST) - * Converteert OpenAPI naar Postman Collection JSON. Body: { oasUrl } of { oasBody } (stringified JSON of YAML). - * - * oASInput OASInput (optional) - * no response value expected for this operation - */ -// const createPostmanCollection = async ({ oASInput }) => { -const createPostmanCollection = async (params) => { - try { - const mockResult = await Service.applyMock("ToolsService", "createPostmanCollection", params); - if (mockResult !== undefined) { - if (mockResult.action === "reject") { - throw mockResult.value; - } - return mockResult.value; - } - const requestPayload = Service.extractRequestBody(params); - const result = await PostmanConversionService.convert(requestPayload); - return { - code: 200, - headers: result.headers, - payload: result.rawBody, - }; - } catch (e) { - logServiceError("createPostmanCollection", e); - const { status, message, detail } = normalizeError(e); - throw Service.rejectResponse({ message, detail }, status); - } -}; - -/** - * Bundle OpenAPI - * Maakt één gebundeld OpenAPI document met opgeloste verwijzingen. Body: { oasUrl } of { oasBody }. - * - * oASInput OASInput (optional) - * no response value expected for this operation - */ -const bundleOAS = async (params) => { - try { - const mockResult = await Service.applyMock("ToolsService", "bundleOAS", params); - if (mockResult !== undefined) { - if (mockResult.action === "reject") { - throw mockResult.value; - } - return mockResult.value; - } - const requestPayload = Service.extractRequestBody(params); - const result = await OasBundleService.bundle(requestPayload); - return { - code: 200, - headers: result.headers, - payload: result.rawBody, - }; - } catch (e) { - logServiceError("bundleOAS", e); - const { status, message, detail } = normalizeError(e); - throw Service.rejectResponse({ message, detail }, status); - } -}; - -/** - * Generate OpenAPI - * Genereert een boilerplate OpenAPI document op basis van JSON-input. Body: { oasUrl } of { oasBody } (stringified JSON). - * - * oASInput OASInput (optional) - * no response value expected for this operation - */ -// const generateOAS = async ({ oASInput }) => { -const generateOAS = async (params) => { - try { - const mockResult = await Service.applyMock("ToolsService", "generateOAS", params); - if (mockResult !== undefined) { - if (mockResult.action === "reject") { - throw mockResult.value; - } - return mockResult.value; - } - const requestPayload = Service.extractRequestBody(params); - const result = await OasGeneratorService.generate(requestPayload); - return { - code: 200, - headers: result.headers, - payload: result.rawBody, - }; - } catch (e) { - logServiceError("generateOAS", e); - const { status, message, detail } = normalizeError(e); - throw Service.rejectResponse({ message, detail }, status); - } -}; - -/** - * Maak client (POST) - * Maak een client aan via de admin API. Body bevat Email. - * - * untrustClientInput UntrustClientInput (optional) - * returns ModelsKeycloakClientResult - */ -// const untrustClient = async ({ untrustClientInput }) => { -const untrustClient = async (params) => { - try { - const mockResult = await Service.applyMock("ToolsService", "untrustClient", params); - if (mockResult !== undefined) { - if (mockResult.action === "reject") { - throw mockResult.value; - } - return mockResult.value; - } - const { email } = parseUntrustClientInput(params); - if (!keycloakService.isConfigured()) { - Service.throwHttpError(500, "Keycloak service niet geconfigureerd"); - } - const result = await keycloakService.createClient({ email }); - return Service.successResponse(result); - } catch (e) { - logServiceError("untrustClient", e); - if (Service.isErrorResponse(e)) { - throw e; - } - const mapped = translateKeycloakError(e); - if (mapped) { - Service.throwHttpError(mapped.status, mapped.message); - } - const status = typeof e.status === "number" && e.status > 0 ? e.status : 400; - const message = e?.message ? e.message : "Er is een fout opgetreden."; - throw Service.rejectResponse( - { - message, - detail: e.detail || message, - }, - status, - ); - } -}; - -/** - * Validate OpenAPI (POST) - * Valideert een OpenAPI specificatie met de DON ADR ruleset. Body: { oasUrl } of { oasBody } (stringified JSON of YAML). - * - * oASInput OASInput (optional) - * returns ModelsLintResult - */ -// const validatorOpenAPIPost = async ({ oASInput }) => { -const validatorOpenAPIPost = async (params) => { - try { - const mockResult = await Service.applyMock("ToolsService", "validatorOpenAPIPost", params); - if (mockResult !== undefined) { - if (mockResult.action === "reject") { - throw mockResult.value; - } - return mockResult.value; - } - const requestPayload = Service.extractRequestBody(params); - const result = await OasValidatorService.validate(requestPayload); - return Service.successResponse(result); - } catch (e) { - logServiceError("validatorOpenAPIPost", e); - const { status, message, detail } = normalizeError(e); - throw Service.rejectResponse({ message, detail }, status); - } -}; - -module.exports = { - arazzoMarkdown, - arazzoMermaid, - convertOAS, - createPostmanCollection, - bundleOAS, - generateOAS, - untrustClient, - validatorOpenAPIPost, -}; diff --git a/services/ZipService.js b/services/ZipService.js deleted file mode 100644 index 3d4a013..0000000 --- a/services/ZipService.js +++ /dev/null @@ -1,38 +0,0 @@ -const JSZip = require("jszip"); - -const isBufferLike = (value) => Buffer.isBuffer(value) || value instanceof Uint8Array; - -const createZipFromEntries = async (entries, options = {}) => { - if (!Array.isArray(entries)) { - throw new TypeError("entries must be an array"); - } - - const zip = new JSZip(); - entries.forEach((entry) => { - if (!entry || typeof entry !== "object") { - throw new TypeError("Each entry must be an object with path and contents"); - } - const { path, contents, fileOptions } = entry; - if (typeof path !== "string" || path.trim().length === 0) { - throw new TypeError("Each entry must provide a non-empty string path"); - } - if (!isBufferLike(contents) && typeof contents !== "string") { - throw new TypeError(`Unsupported contents type for ${path}. Use string or Buffer.`); - } - zip.file(path, contents, fileOptions); - }); - - const compression = options.compression ?? "DEFLATE"; - const compressionOptions = options.compressionOptions ?? { level: 9 }; - - return zip.generateAsync({ - type: "nodebuffer", - compression, - compressionOptions, - streamFiles: true, - }); -}; - -module.exports = { - createZipFromEntries, -}; diff --git a/services/index.js b/services/index.js deleted file mode 100644 index 61a7144..0000000 --- a/services/index.js +++ /dev/null @@ -1,5 +0,0 @@ -const ToolsService = require("./ToolsService"); - -module.exports = { - ToolsService, -}; diff --git a/src/app.ts b/src/app.ts new file mode 100644 index 0000000..1f2b1c3 --- /dev/null +++ b/src/app.ts @@ -0,0 +1,73 @@ +import { readFile } from "node:fs/promises"; +import { fileURLToPath } from "node:url"; +import { dirname, join } from "node:path"; +import Fastify, { type FastifyInstance } from "fastify"; +import cors from "@fastify/cors"; +import addFormats from "ajv-formats"; +import openapiGlue from "fastify-openapi-glue"; +import { config } from "./config.js"; +import { errorHandlerPlugin } from "./plugins/error-handler.js"; +import { Routes } from "./routes.js"; +import { toLowerCamelCase } from "./utils/operation-id.js"; + +export interface BuildOptions { + loggerEnabled?: boolean; +} + +const here = dirname(fileURLToPath(import.meta.url)); +const rootDir = join(here, ".."); +const openapiSpecPath = join(rootDir, "api", "openapi.json"); + +export const buildApp = async (options: BuildOptions = {}): Promise => { + const app = Fastify({ + logger: + options.loggerEnabled === false + ? false + : { + level: config.logLevel, + transport: + config.nodeEnv === "production" + ? undefined + : { + target: "pino-pretty", + options: { translateTime: "HH:MM:ss.l", ignore: "pid,hostname" }, + }, + }, + bodyLimit: 14 * 1024 * 1024, + ajv: { + customOptions: { strict: false, allErrors: true }, + // biome-ignore lint/suspicious/noExplicitAny: ajv-formats default-export typing + plugins: [[(addFormats as any).default ?? addFormats, { mode: "fast" }]], + }, + }); + + const specRaw = await readFile(openapiSpecPath, "utf8"); + const spec = JSON.parse(specRaw) as { info: { version: string } }; + const apiVersion = spec.info.version; + + app.addContentTypeParser(["text/markdown", "text/plain"], { parseAs: "string" }, (_request, body, done) => { + done(null, body); + }); + + app.addHook("onSend", async (_request, reply) => { + if (!reply.getHeader("API-Version")) reply.header("API-Version", apiVersion); + }); + + await app.register(cors); + await app.register(errorHandlerPlugin); + + app.get("/v1/openapi.json", async () => spec); + + const handlers = new Routes() as unknown as Record; + + await app.register(openapiGlue, { + specification: spec, + operationResolver: ((operationId: string) => { + const handler = handlers[toLowerCamelCase(operationId)]; + return typeof handler === "function" ? handler : undefined; + }) as unknown as NonNullable[1]>["operationResolver"], + prefix: "", + }); + + return app; +}; diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..6e2eea9 --- /dev/null +++ b/src/config.ts @@ -0,0 +1,12 @@ +export const parseInt10 = (value: string | undefined, fallback: number): number => { + if (!value) return fallback; + const parsed = Number.parseInt(value, 10); + return Number.isFinite(parsed) ? parsed : fallback; +}; + +export const config = { + port: parseInt10(process.env.PORT, 1338), + host: process.env.HOST ?? "0.0.0.0", + logLevel: process.env.LOG_LEVEL ?? "info", + nodeEnv: process.env.NODE_ENV ?? "development", +} as const; diff --git a/src/plugins/error-handler.ts b/src/plugins/error-handler.ts new file mode 100644 index 0000000..e855149 --- /dev/null +++ b/src/plugins/error-handler.ts @@ -0,0 +1,79 @@ +import fp from "fastify-plugin"; +import type { FastifyInstance } from "fastify"; +import { HttpError, statusText, toProblemDetails, type Problem } from "@developer-overheid-nl/don-tools-logic"; + +interface FastifyValidationEntry { + instancePath?: string; + message?: string; + params?: { missingProperty?: string }; +} + +interface FastifyErrorLike { + message?: string; + statusCode?: number; + validation?: FastifyValidationEntry[]; +} + +const ajvEntryToPointer = (entry: FastifyValidationEntry): string => { + const missing = entry.params?.missingProperty; + const base = entry.instancePath ?? ""; + if (missing) return `#${base}/${missing}`; + return `#${base}`; +}; + +export const errorHandlerPlugin = fp(async (app: FastifyInstance) => { + app.setErrorHandler((rawError, request, reply) => { + const instance = request.url; + + if (rawError instanceof HttpError) { + const problem = toProblemDetails(rawError, instance); + reply.status(problem.status).type("application/problem+json").send(problem); + return; + } + + const error = rawError as FastifyErrorLike; + + if (Array.isArray(error.validation)) { + const problem: Problem = { + type: "https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/400", + title: statusText(400), + status: 400, + detail: error.message ?? "Validation failed", + instance, + errors: error.validation.map((entry) => ({ + detail: entry.message ?? "validation failed", + pointer: ajvEntryToPointer(entry), + })), + }; + reply.status(400).type("application/problem+json").send(problem); + return; + } + + const status = typeof error.statusCode === "number" && error.statusCode >= 400 ? error.statusCode : 500; + const problem: Problem = { + type: `https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/${status}`, + title: statusText(status), + status, + detail: error.message ?? statusText(status), + instance, + }; + + if (status >= 500) request.log.error({ err: rawError }, "request failed"); + else request.log.warn({ err: rawError }, "request rejected"); + + reply.status(status).type("application/problem+json").send(problem); + }); + + app.setNotFoundHandler((request, reply) => { + reply + .status(404) + .type("application/problem+json") + .send({ + type: "https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/404", + title: statusText(404), + status: 404, + detail: `Route ${request.method} ${request.url} not found`, + instance: request.url, + }); + }); +}); diff --git a/src/routes.ts b/src/routes.ts new file mode 100644 index 0000000..ea3b42e --- /dev/null +++ b/src/routes.ts @@ -0,0 +1,63 @@ +import type { FastifyReply, FastifyRequest } from "fastify"; +import { + arazzoMarkdown, + arazzoMermaid, + bundleOAS, + convertOAS, + createPostmanCollection, + generateOAS, + untrustedClient, + validatorOpenAPIPost, + type OasInput, + type UntrustedClientInput, + type ValidateInput, +} from "@developer-overheid-nl/don-tools-logic"; + +type OasRequest = FastifyRequest<{ Body: OasInput }>; +type ValidateRequest = FastifyRequest<{ Body: ValidateInput }>; +type UntrustedClientRequest = FastifyRequest<{ Body: UntrustedClientInput }>; + +const sendBuffer = (reply: FastifyReply, headers: Record, buffer: Buffer) => { + for (const [name, value] of Object.entries(headers)) reply.header(name, value); + return reply.send(buffer); +}; + +export class Routes { + arazzoMarkdown = async (request: OasRequest, reply: FastifyReply) => { + const markdown = await arazzoMarkdown(request.body); + reply.header("Content-Type", "text/markdown; charset=utf-8"); + return reply.send(markdown); + }; + + arazzoMermaid = async (request: OasRequest, reply: FastifyReply) => { + const mermaid = await arazzoMermaid(request.body); + reply.header("Content-Type", "text/plain; charset=utf-8"); + return reply.send(mermaid); + }; + + bundleOAS = async (request: OasRequest, reply: FastifyReply) => { + const result = await bundleOAS(request.body); + return sendBuffer(reply, result.headers, result.rawBody); + }; + + convertOAS = async (request: OasRequest, reply: FastifyReply) => { + const result = await convertOAS(request.body); + return sendBuffer(reply, result.headers, result.rawBody); + }; + + createPostmanCollection = async (request: OasRequest, reply: FastifyReply) => { + const result = await createPostmanCollection(request.body); + return sendBuffer(reply, result.headers, result.rawBody); + }; + + generateOAS = async (request: OasRequest, reply: FastifyReply) => { + const result = await generateOAS(request.body); + return sendBuffer(reply, result.headers, result.rawBody); + }; + + untrustClient = async (request: UntrustedClientRequest, reply: FastifyReply) => + reply.send(await untrustedClient(request.body)); + + validatorOpenAPIPost = async (request: ValidateRequest, reply: FastifyReply) => + reply.send(await validatorOpenAPIPost(request.body)); +} diff --git a/src/server.ts b/src/server.ts new file mode 100644 index 0000000..5d67463 --- /dev/null +++ b/src/server.ts @@ -0,0 +1,28 @@ +import { buildApp } from "./app.js"; +import { config } from "./config.js"; + +const start = async () => { + const app = await buildApp(); + try { + await app.listen({ port: config.port, host: config.host }); + } catch (error) { + app.log.error({ err: error }, "failed to start server"); + process.exit(1); + } + + const shutdown = async (signal: string) => { + app.log.info(`Received ${signal}, shutting down`); + try { + await app.close(); + process.exit(0); + } catch (error) { + app.log.error({ err: error }, "error during shutdown"); + process.exit(1); + } + }; + + process.on("SIGTERM", () => void shutdown("SIGTERM")); + process.on("SIGINT", () => void shutdown("SIGINT")); +}; + +start(); diff --git a/src/utils/operation-id.ts b/src/utils/operation-id.ts new file mode 100644 index 0000000..314b028 --- /dev/null +++ b/src/utils/operation-id.ts @@ -0,0 +1,13 @@ +export const toLowerCamelCase = (operationId: string): string => { + const normalized = operationId + .trim() + .replace(/[_-]+/g, " ") + .replace(/[^a-zA-Z0-9_$]+/g, " ") + .split(" ") + .filter(Boolean) + .map((segment, index) => (index === 0 ? segment : segment.charAt(0).toUpperCase() + segment.slice(1))) + .join("") + .replace(/^[^a-zA-Z_$]+/, ""); + + return normalized ? normalized.charAt(0).toLowerCase() + normalized.slice(1) : operationId; +}; diff --git a/test/OasConversionService.test.js b/test/OasConversionService.test.js deleted file mode 100644 index fa8f1b5..0000000 --- a/test/OasConversionService.test.js +++ /dev/null @@ -1,155 +0,0 @@ -const assert = require("node:assert/strict"); -const test = require("node:test"); -const jsYaml = require("js-yaml"); -const OasConversionService = require("../services/OasConversionService"); - -const toJson = (buffer) => JSON.parse(buffer.toString("utf8")); -const toYaml = (buffer) => jsYaml.load(buffer.toString("utf8")); - -test("convert 3.0 -> 3.1 (JSON) upgrades key OpenAPI features", async () => { - const sourceSpec = { - openapi: "3.0.3", - info: { - title: "Test API", - version: "1.0.0", - }, - paths: {}, - "x-webhooks": { - onEvent: { - post: { - responses: { - 200: { - description: "OK", - }, - }, - }, - }, - }, - components: { - schemas: { - Pet: { - type: "object", - properties: { - nickname: { - type: "string", - nullable: true, - }, - }, - }, - }, - }, - }; - - const result = await OasConversionService.convert({ - oasBody: JSON.stringify(sourceSpec), - targetVersion: "3.1", - }); - - const converted = toJson(result.rawBody); - - assert.equal(result.headers["Content-Type"], "application/json"); - assert.equal(result.headers["Content-Disposition"], 'attachment; filename="openapi-3-1-0.json"'); - assert.equal(converted.openapi, "3.1.0"); - assert.ok(Object.hasOwn(converted, "webhooks")); - assert.ok(!Object.hasOwn(converted, "x-webhooks")); - assert.deepEqual(converted.components.schemas.Pet.properties.nickname.type, ["string", "null"]); -}); - -test("convert 3.1 -> 3.0 (JSON) downgrades key OpenAPI features", async () => { - const sourceSpec = { - openapi: "3.1.0", - info: { - title: "Test API", - version: "1.0.0", - }, - paths: {}, - webhooks: { - onEvent: { - post: { - responses: { - 200: { - description: "OK", - }, - }, - }, - }, - }, - components: { - schemas: { - Pet: { - type: "object", - properties: { - nickname: { - type: ["string", "null"], - }, - }, - }, - }, - }, - }; - - const result = await OasConversionService.convert({ - oasBody: JSON.stringify(sourceSpec), - targetVersion: "3.0", - }); - - const converted = toJson(result.rawBody); - - assert.equal(result.headers["Content-Type"], "application/json"); - assert.equal(result.headers["Content-Disposition"], 'attachment; filename="openapi-3-0-3.json"'); - assert.equal(converted.openapi, "3.0.3"); - assert.ok(!Object.hasOwn(converted, "webhooks")); - assert.equal(converted.components.schemas.Pet.properties.nickname.type, "string"); - assert.equal(converted.components.schemas.Pet.properties.nickname.nullable, true); -}); - -test("convert preserves YAML format in response", async () => { - const sourceSpecYaml = ` -openapi: 3.0.3 -info: - title: Test API - version: 1.0.0 -paths: {} -components: - schemas: - Item: - type: object - properties: - maybeText: - type: string - nullable: true -`; - - const result = await OasConversionService.convert({ - oasBody: sourceSpecYaml, - targetVersion: "3.1", - }); - - const converted = toYaml(result.rawBody); - - assert.equal(result.headers["Content-Type"], "application/yaml"); - assert.equal(result.headers["Content-Disposition"], 'attachment; filename="openapi-3-1-0.yaml"'); - assert.equal(converted.openapi, "3.1.0"); - assert.deepEqual(converted.components.schemas.Item.properties.maybeText.type, ["string", "null"]); -}); - -test("convert without targetVersion keeps existing 3.1 patch version", async () => { - const sourceSpec = { - openapi: "3.1.2", - info: { - title: "Test API", - version: "1.0.0", - }, - paths: {}, - }; - - const result = await OasConversionService.convert({ - oasBody: JSON.stringify(sourceSpec), - }); - - const converted = toJson(result.rawBody); - - assert.equal(result.headers["Content-Type"], "application/json"); - assert.equal(result.headers["Content-Disposition"], 'attachment; filename="openapi-3-1-2.json"'); - assert.equal(converted.openapi, "3.1.2"); -}); diff --git a/test/app.test.ts b/test/app.test.ts new file mode 100644 index 0000000..74403f1 --- /dev/null +++ b/test/app.test.ts @@ -0,0 +1,59 @@ +import { afterAll, beforeAll, describe, expect, it } from "vitest"; +import type { FastifyInstance } from "fastify"; +import { buildApp } from "../src/app.js"; + +let app: FastifyInstance; + +beforeAll(async () => { + app = await buildApp({ loggerEnabled: false }); + await app.ready(); +}); + +afterAll(async () => { + await app.close(); +}); + +describe("app", () => { + it("serves the OpenAPI spec", async () => { + const response = await app.inject({ method: "GET", url: "/v1/openapi.json" }); + expect(response.statusCode).toBe(200); + const body = response.json() as { info: { title: string } }; + expect(body.info.title).toBe("Tools API v1"); + }); + + it("returns API-Version header", async () => { + const response = await app.inject({ method: "GET", url: "/v1/openapi.json" }); + expect(response.headers["api-version"]).toBe("1.0.0"); + }); + + it("returns problem+json on unknown route", async () => { + const response = await app.inject({ method: "GET", url: "/no-such-route" }); + expect(response.statusCode).toBe(404); + expect(response.headers["content-type"]).toContain("application/problem+json"); + expect(response.json()).toMatchObject({ status: 404, title: "Not Found" }); + }); + + it("returns problem+json on validation failure", async () => { + const response = await app.inject({ + method: "POST", + url: "/v1/oas/validate", + payload: {}, + }); + expect(response.statusCode).toBe(400); + expect(response.headers["content-type"]).toContain("application/problem+json"); + }); + + it("converts OpenAPI through the logic package", async () => { + const response = await app.inject({ + method: "POST", + url: "/v1/oas/convert", + payload: { + oasBody: JSON.stringify({ openapi: "3.0.3", info: { title: "T", version: "1.0.0" }, paths: {} }), + targetVersion: "3.1", + }, + }); + expect(response.statusCode).toBe(200); + expect(response.headers["content-type"]).toContain("application/json"); + expect(JSON.parse(response.body)).toMatchObject({ openapi: "3.1.0" }); + }); +}); diff --git a/test/convert-oas.test.ts b/test/convert-oas.test.ts new file mode 100644 index 0000000..3d36eef --- /dev/null +++ b/test/convert-oas.test.ts @@ -0,0 +1,54 @@ +import { describe, expect, it } from "vitest"; +import jsYaml from "js-yaml"; +import { convertOAS } from "@developer-overheid-nl/don-tools-logic"; + +const toJson = (buffer: Buffer) => JSON.parse(buffer.toString("utf8")); +const toYaml = (buffer: Buffer) => jsYaml.load(buffer.toString("utf8")) as Record; + +describe("convertOAS", () => { + it("upgrades 3.0 -> 3.1 (JSON)", async () => { + const sourceSpec = { + openapi: "3.0.3", + info: { title: "Test API", version: "1.0.0" }, + paths: {}, + "x-webhooks": { onEvent: { post: { responses: { 200: { description: "OK" } } } } }, + components: { + schemas: { Pet: { type: "object", properties: { nickname: { type: "string", nullable: true } } } }, + }, + }; + + const result = await convertOAS({ oasBody: JSON.stringify(sourceSpec), targetVersion: "3.1" }); + const converted = toJson(result.rawBody); + + expect(result.headers["Content-Type"]).toBe("application/json"); + expect(result.headers["Content-Disposition"]).toBe('attachment; filename="openapi-3-1-0.json"'); + expect(converted.openapi).toBe("3.1.0"); + expect(Object.hasOwn(converted, "webhooks")).toBe(true); + expect(Object.hasOwn(converted, "x-webhooks")).toBe(false); + expect(converted.components.schemas.Pet.properties.nickname.type).toEqual(["string", "null"]); + }); + + it("preserves YAML format", async () => { + const yaml = ` +openapi: 3.0.3 +info: + title: Test API + version: 1.0.0 +paths: {} +components: + schemas: + Item: + type: object + properties: + maybeText: + type: string + nullable: true +`; + const result = await convertOAS({ oasBody: yaml, targetVersion: "3.1" }); + const converted = toYaml(result.rawBody); + + expect(result.headers["Content-Type"]).toBe("application/yaml"); + expect(result.headers["Content-Disposition"]).toBe('attachment; filename="openapi-3-1-0.yaml"'); + expect((converted as { openapi: string }).openapi).toBe("3.1.0"); + }); +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..ca4bd6d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ES2023", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "lib": ["ES2023"], + "outDir": "./dist", + "rootDir": "./src", + "strict": true, + "noUncheckedIndexedAccess": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "sourceMap": true, + "removeComments": false, + "isolatedModules": true, + "verbatimModuleSyntax": true + }, + "include": ["src/**/*.ts", "src/**/*.d.ts"], + "exclude": ["node_modules", "dist", "test"] +} diff --git a/utils/fileName.js b/utils/fileName.js deleted file mode 100644 index d167eda..0000000 --- a/utils/fileName.js +++ /dev/null @@ -1,58 +0,0 @@ -const DEFAULT_MAX_LENGTH = 128; - -const internalSanitize = (value, { lowercase, maxLength }) => { - if (typeof value !== "string") { - return ""; - } - - let working = value.trim(); - if (working.length === 0) { - return ""; - } - - try { - working = working.normalize("NFKD").replace(/\p{M}+/gu, ""); - } catch { - // ignore environments without String.prototype.normalize - } - - working = working - .replace(/["']/g, "") - .replace(/\p{Cc}+/gu, " ") - .replace(/[<>:"/\\|?*]+/g, "-") - .replace(/[^0-9A-Za-z._\s-]+/g, "-") - .replace(/\s+/g, "-") - .replace(/-+/g, "-") - .replace(/^[-_.]+|[-_.]+$/g, "") - .trim(); - - if (lowercase) { - working = working.toLowerCase(); - } - - if (maxLength > 0 && working.length > maxLength) { - working = working.slice(0, maxLength); - } - - return working; -}; - -const sanitizeFileName = (value, options = {}) => { - const { fallback = "", lowercase = false, maxLength = DEFAULT_MAX_LENGTH } = options; - const params = { lowercase, maxLength }; - const sanitized = internalSanitize(value, params); - if (sanitized) { - return sanitized; - } - if (typeof fallback === "string" && fallback.length > 0) { - const fallbackSanitized = internalSanitize(fallback, params); - if (fallbackSanitized) { - return fallbackSanitized; - } - } - return ""; -}; - -module.exports = { - sanitizeFileName, -}; diff --git a/utils/openapiRouter.js b/utils/openapiRouter.js deleted file mode 100644 index 8813d6c..0000000 --- a/utils/openapiRouter.js +++ /dev/null @@ -1,71 +0,0 @@ -const logger = require("../logger"); -const controllers = require("../controllers"); -const Services = require("../services"); - -function handleError(err, _request, response, next) { - logger.error(err); - const code = err.code || 400; - response.status(code); - response.error = err; - next( - JSON.stringify({ - code, - error: err, - }), - ); -} - -/** - * The purpose of this route is to collect the request variables as defined in the - * OpenAPI document and pass them to the handling controller as another Express - * middleware. All parameters are collected in the request.swagger.values key-value object - * - * The assumption is that security handlers have already verified and allowed access - * to this path. If the business-logic of a particular path is dependent on authentication - * parameters (e.g. scope checking) - it is recommended to define the authentication header - * as one of the parameters expected in the OpenAPI/Swagger document. - * - * Requests made to paths that are not in the OpenAPI scope - * are passed on to the next middleware handler. - * @returns {Function} - */ -function openApiRouter() { - return async (request, response, next) => { - try { - /** - * This middleware runs after a previous process have applied an openapi object - * to the request. - * If none was applied This is because the path requested is not in the schema. - * If there's no openapi object, we have nothing to do, and pass on to next middleware. - */ - if (request.openapi === undefined || request.openapi.schema === undefined) { - next(); - return; - } - // request.swagger.paramValues = {}; - // request.swagger.params.forEach((param) => { - // request.swagger.paramValues[param.name] = getValueFromRequest(request, param); - // }); - const controllerName = request.openapi.schema["x-openapi-router-controller"]; - const serviceName = request.openapi.schema["x-openapi-router-service"]; - if (!controllers[controllerName] || controllers[controllerName] === undefined) { - handleError( - `request sent to controller '${controllerName}' which has not been defined`, - request, - response, - next, - ); - } else { - const apiController = new controllers[controllerName](Services[serviceName]); - const controllerOperation = request.openapi.schema.operationId; - await apiController[controllerOperation](request, response, next); - } - } catch (error) { - console.error(error); - const err = { code: 500, error: error.message }; - handleError(err, request, response, next); - } - }; -} - -module.exports = openApiRouter; diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..0deaed0 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + include: ["test/**/*.test.ts"], + environment: "node", + testTimeout: 30000, + }, +}); From d7581eb3d2981d02305e68526d520da11750228a Mon Sep 17 00:00:00 2001 From: pasibun Date: Wed, 10 Jun 2026 12:15:46 +0200 Subject: [PATCH 02/27] Update API dependencies --- package-lock.json | 44 ++++++++++++++++++++++++++++++++++++++------ package.json | 4 ++-- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8e46bae..3fdb019 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,12 +14,12 @@ "ajv-formats": "^3.0.1", "fastify": "^5.8.5", "fastify-openapi-glue": "^4.11.3", - "fastify-plugin": "^5.1.0" + "fastify-plugin": "^6.0.0" }, "devDependencies": { "@biomejs/biome": "^2.4.16", "@types/js-yaml": "^4.0.9", - "@types/node": "^25.9.1", + "@types/node": "^25.9.2", "js-yaml": "^4.2.0", "pino-pretty": "^13.1.3", "tsx": "^4.22.4", @@ -755,6 +755,22 @@ "toad-cache": "^3.7.0" } }, + "node_modules/@fastify/cors/node_modules/fastify-plugin": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz", + "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, "node_modules/@fastify/error": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.2.0.tgz", @@ -1245,9 +1261,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.9.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.1.tgz", - "integrity": "sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==", + "version": "25.9.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.2.tgz", + "integrity": "sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw==", "dev": true, "license": "MIT", "dependencies": { @@ -1723,7 +1739,7 @@ "node": ">=20.0.0" } }, - "node_modules/fastify-plugin": { + "node_modules/fastify-openapi-glue/node_modules/fastify-plugin": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz", "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==", @@ -1739,6 +1755,22 @@ ], "license": "MIT" }, + "node_modules/fastify-plugin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-6.0.0.tgz", + "integrity": "sha512-fZOty7z3O7vOliF6d8bHE3wiEh1KcNnKEQensSgTk9C1DvN6nRLS++XVd86v33Hw/8u9Un8A1zDrQ8ujcQDHEg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", diff --git a/package.json b/package.json index c60e8c5..aeafc07 100644 --- a/package.json +++ b/package.json @@ -22,12 +22,12 @@ "ajv-formats": "^3.0.1", "fastify": "^5.8.5", "fastify-openapi-glue": "^4.11.3", - "fastify-plugin": "^5.1.0" + "fastify-plugin": "^6.0.0" }, "devDependencies": { "@biomejs/biome": "^2.4.16", "@types/js-yaml": "^4.0.9", - "@types/node": "^25.9.1", + "@types/node": "^25.9.2", "js-yaml": "^4.2.0", "pino-pretty": "^13.1.3", "tsx": "^4.22.4", From 613244fbe2c435bd9af2ccc42d0cf72222cf5c75 Mon Sep 17 00:00:00 2001 From: pasibun Date: Wed, 10 Jun 2026 14:02:58 +0200 Subject: [PATCH 03/27] Use tools logic package from git --- package-lock.json | 4090 +++++++++++++++++++++++++++++++++++++++++---- package.json | 8 +- 2 files changed, 3778 insertions(+), 320 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3fdb019..8944568 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "EUPL-1.2", "dependencies": { - "@developer-overheid-nl/don-tools-logic": "file:../don-tools-api-v2", + "@developer-overheid-nl/don-tools-logic": "github:developer-overheid-nl/don-tools-api-v2#60-tools-api-refactor", "@fastify/cors": "^11.2.0", "ajv-formats": "^3.0.1", "fastify": "^5.8.5", @@ -28,35 +28,72 @@ "vitest": "^4.1.8" } }, - "../don-tools-api-v2": { - "name": "@developer-overheid-nl/don-tools-logic", - "version": "2.0.0", - "license": "EUPL-1.2", + "node_modules/@apiture/openapi-down-convert": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@apiture/openapi-down-convert/-/openapi-down-convert-0.14.2.tgz", + "integrity": "sha512-vT3eqOEmJ4KZ2qojycEV0zzFBPDrkwntyfnWi8/WMaag8jvGN4osIdVRuwxWcK6AvQr32ohrpcLGqEZ+ZHVNcw==", + "license": "ISC", "dependencies": { - "@apiture/openapi-down-convert": "^0.14.2", - "@developer-overheid-nl/adr-rulesets": "github:developer-overheid-nl/adr-rulesets#main", - "@redocly/openapi-core": "^2.31.5", - "@redocly/respect-core": "^2.31.5", - "@scalar/openapi-upgrader": "^0.2.9", - "@stoplight/spectral-core": "^1.23.0", - "@stoplight/spectral-parsers": "^1.0.5", - "case-anything": "^3.1.2", - "js-yaml": "^4.2.0", - "jszip": "^3.10.1", - "openapi-to-postmanv2": "^6.0.1" + "commander": "^9.4.1", + "js-yaml": "^4.1.0", + "typescript": "^4.8.4" }, - "devDependencies": { - "@biomejs/biome": "^2.4.16", - "@types/js-yaml": "^4.0.9", - "@types/node": "^25.9.1", - "tsx": "^4.22.4", - "typescript": "^6.0.3", - "vite": "^8.0.16", - "vitest": "^4.1.8" + "bin": { + "openapi-down-convert": "lib/src/cli.js" + } + }, + "node_modules/@apiture/openapi-down-convert/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=22", - "pnpm": ">=11" + "node": ">=4.2.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", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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": ">=6.9.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, "node_modules/@biomejs/biome": { @@ -234,9 +271,37 @@ "node": ">=14.21.3" } }, + "node_modules/@developer-overheid-nl/adr-rulesets": { + "version": "0.1.0", + "resolved": "git+ssh://git@github.com/developer-overheid-nl/adr-rulesets.git#da1327dfcc83ed130b1fe5aaa282b7bfba537aee", + "license": "EUPL-1.2", + "dependencies": { + "@stoplight/spectral-core": "^1.21.0", + "@stoplight/spectral-functions": "^1.10.1", + "@stoplight/spectral-rulesets": "^1.22.0" + } + }, "node_modules/@developer-overheid-nl/don-tools-logic": { - "resolved": "../don-tools-api-v2", - "link": true + "version": "2.0.0", + "resolved": "git+ssh://git@github.com/developer-overheid-nl/don-tools-api-v2.git#0df3425e39d4df3af923fa8cb566b7ac06182919", + "license": "EUPL-1.2", + "dependencies": { + "@apiture/openapi-down-convert": "^0.14.2", + "@developer-overheid-nl/adr-rulesets": "github:developer-overheid-nl/adr-rulesets#main", + "@redocly/openapi-core": "^2.32.0", + "@redocly/respect-core": "^2.32.0", + "@scalar/openapi-upgrader": "^0.2.9", + "@stoplight/spectral-core": "^1.23.0", + "@stoplight/spectral-parsers": "^1.0.5", + "case-anything": "^3.1.2", + "js-yaml": "^4.2.0", + "jszip": "^3.10.1", + "openapi-to-postmanv2": "^6.0.1" + }, + "engines": { + "node": ">=22", + "pnpm": ">=11" + } }, "node_modules/@emnapi/core": { "version": "1.10.0", @@ -714,6 +779,22 @@ "node": ">=18" } }, + "node_modules/@exodus/schemasafe": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", + "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==", + "license": "MIT" + }, + "node_modules/@faker-js/faker": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.6.0.tgz", + "integrity": "sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==", + "license": "MIT", + "engines": { + "node": ">=14.0.0", + "npm": ">=6.0.0" + } + }, "node_modules/@fastify/ajv-compiler": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.5.tgz", @@ -870,6 +951,15 @@ "node": ">= 10" } }, + "node_modules/@humanwhocodes/momoa": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-2.0.4.tgz", + "integrity": "sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.10.0" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", @@ -877,6 +967,42 @@ "dev": true, "license": "MIT" }, + "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.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, + "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": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, + "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": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, "node_modules/@napi-rs/wasm-runtime": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", @@ -896,6 +1022,30 @@ "@emnapi/runtime": "^1.7.1" } }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodable/entities": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.1.tgz", + "integrity": "sha512-Pig3HxDIoMgjdEH8OCf/dkcTmLFjJRjWuq8jSnklu284/TKOPibSRERmOykiwmyXTtv61mP+44f3GMx0tLAyjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT" + }, "node_modules/@oxc-project/types": { "version": "0.133.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", @@ -912,6 +1062,117 @@ "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", "license": "MIT" }, + "node_modules/@redocly/ajv": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.18.3.tgz", + "integrity": "sha512-l42u0of3hY98sN2A+M4qTX1O/KrpgGH32Hu9kP2GtHyD5Dfqq86PKFLe5dwaD8DEnNmlOlll2BAmeEtf0DaySg==", + "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/@redocly/config": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.49.0.tgz", + "integrity": "sha512-OI/rpEffX3fKUuy+OuBHPRspRI/S30b9aiqxfZLMpSWZzDncEGPxSEP1O2LrBVshnDX4hLjVjLvCZ4YT85+1rw==", + "license": "MIT", + "dependencies": { + "json-schema-to-ts": "2.7.2" + } + }, + "node_modules/@redocly/openapi-core": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-2.32.0.tgz", + "integrity": "sha512-B4CsuuokMc3vgNh9e+eFX8FAbjMTWUVgYtBvPXm0X2pwBs9nO2v+m6ARp7lEpg1P42B6XztIdI08BGMqUAerJQ==", + "license": "MIT", + "dependencies": { + "@redocly/ajv": "^8.18.1", + "@redocly/config": "^0.49.0", + "ajv": "npm:@redocly/ajv@8.18.1", + "ajv-formats": "^3.0.1", + "colorette": "^1.2.0", + "js-levenshtein": "^1.1.6", + "js-yaml": "^4.1.0", + "picomatch": "^4.0.4", + "pluralize": "^8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=22.12.0 || >=20.19.0 <21.0.0", + "npm": ">=10" + } + }, + "node_modules/@redocly/openapi-core/node_modules/ajv": { + "name": "@redocly/ajv", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.18.1.tgz", + "integrity": "sha512-Ifm/pP/tul1qmAecpbVxCBluVE32rKfjf8gYXH4xI2gCv9mRWFhJMHzkPDM4TXlxwPQYIFegymlsy8lXz7optA==", + "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/@redocly/openapi-core/node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "license": "MIT" + }, + "node_modules/@redocly/respect-core": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/@redocly/respect-core/-/respect-core-2.32.0.tgz", + "integrity": "sha512-CYRyleK+xOQtd8K6JuZbJr/yD+EVscipAtst/e5x66wyoG04vzUQWX1tzTibNQhl8OI/FMy9BnlFrHCaA8BiHg==", + "license": "MIT", + "dependencies": { + "@faker-js/faker": "^7.6.0", + "@noble/hashes": "^1.8.0", + "@redocly/ajv": "^8.18.1", + "@redocly/openapi-core": "2.32.0", + "ajv": "npm:@redocly/ajv@8.18.1", + "better-ajv-errors": "^2.0.3", + "colorette": "^2.0.20", + "json-pointer": "^0.6.2", + "jsonpath-rfc9535": "1.3.0", + "openapi-sampler": "^1.7.1", + "outdent": "^0.8.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=22.12.0 || >=20.19.0 <21.0.0", + "npm": ">=10" + } + }, + "node_modules/@redocly/respect-core/node_modules/ajv": { + "name": "@redocly/ajv", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.18.1.tgz", + "integrity": "sha512-Ifm/pP/tul1qmAecpbVxCBluVE32rKfjf8gYXH4xI2gCv9mRWFhJMHzkPDM4TXlxwPQYIFegymlsy8lXz7optA==", + "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/@rolldown/binding-android-arm64": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", @@ -1194,6 +1455,27 @@ "dev": true, "license": "MIT" }, + "node_modules/@scalar/openapi-types": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@scalar/openapi-types/-/openapi-types-0.9.1.tgz", + "integrity": "sha512-gkGhSkxSzADaBiNg+ZAbJuwj+ZUmzP2Pg9CWZ7ZP+0fck2WjPeDDM7aAbouAm0aQQMF9xBjSPXSA9a/qTHYaTw==", + "license": "MIT", + "engines": { + "node": ">=22" + } + }, + "node_modules/@scalar/openapi-upgrader": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@scalar/openapi-upgrader/-/openapi-upgrader-0.2.9.tgz", + "integrity": "sha512-D5b0rGLLZgmkO9mdW2j/ND1KBlH1u3RCpr87HPxv9P9ZSr6PtM5iLqFOJq0ACiaHjY2mikCrxgDmnUEhTzRpHQ==", + "license": "MIT", + "dependencies": { + "@scalar/openapi-types": "0.9.1" + }, + "engines": { + "node": ">=22" + } + }, "node_modules/@seriousme/openapi-schema-validator": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/@seriousme/openapi-schema-validator/-/openapi-schema-validator-2.9.0.tgz", @@ -1217,80 +1499,452 @@ "dev": true, "license": "MIT" }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", - "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", - "dev": true, - "license": "MIT", - "optional": true, + "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": { - "tslib": "^2.4.0" + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": "^12.20 || >= 14.13" + }, + "peerDependencies": { + "ajv": ">=8" } }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dev": true, - "license": "MIT", + "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": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" + "@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/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/js-yaml": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", - "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "25.9.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.2.tgz", - "integrity": "sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw==", - "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": { - "undici-types": ">=7.24.0 <7.24.7" + "node-fetch": "^2.6.0", + "tslib": "^1.14.1" + }, + "engines": { + "node": ">=8.3.0" } }, - "node_modules/@vitest/expect": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.8.tgz", - "integrity": "sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==", - "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": { - "@standard-schema/spec": "^1.1.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.8", - "@vitest/utils": "4.1.8", - "chai": "^6.2.2", - "tinyrainbow": "^3.1.0" + "@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" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=8.3.0" } }, - "node_modules/@vitest/mocker": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.8.tgz", + "node_modules/@stoplight/json/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/@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": ">=8" + } + }, + "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": ">=8" + } + }, + "node_modules/@stoplight/spectral-core": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.23.0.tgz", + "integrity": "sha512-WvdgmiiJrjiMrcw7ByxfcYtUvAXNp2MhAfcEIXP3Mn8ZOVwyAWIsFjLlsE5zRqj0LuN8+7OQM/L+BMcHj6x/BQ==", + "license": "Apache-2.0", + "dependencies": { + "@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/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": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@stoplight/spectral-formats": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-formats/-/spectral-formats-1.8.3.tgz", + "integrity": "sha512-lfYzkHYS2mZQdm3k+TQ0lvXZ66vdBzJuy6awA4kXgQ0jWBbOC/FHzhBk5BaIVo2QRLUAGjMqWSd72WFryi+EvA==", + "license": "Apache-2.0", + "dependencies": { + "@stoplight/json": "^3.17.0", + "@stoplight/spectral-core": "1.23.0", + "@types/json-schema": "^7.0.7", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-functions": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-functions/-/spectral-functions-1.10.3.tgz", + "integrity": "sha512-AM7Gbh7pv1Mpc6fdVuR7N6C5t5KT3QKDHeBPA27Cw/GAch1VJnHkCV9R/SxDrvOgZ3tL1xrtAGFuNFwRvVdz3g==", + "license": "Apache-2.0", + "dependencies": { + "@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": "^16.20 || ^18.18 || >= 20.17" + } + }, + "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": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "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", + "dependencies": { + "@stoplight/json": "~3.21.0", + "@stoplight/types": "^14.1.1", + "@stoplight/yaml": "~4.3.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "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": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + }, + "engines": { + "node": "^12.20 || >=14.13" + } + }, + "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": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-rulesets": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-rulesets/-/spectral-rulesets-1.22.4.tgz", + "integrity": "sha512-Lwr4DVg8aEqiBcm2CMQAP1FIBmLP9Y8Z2st7jvbxzv3fXmThdafVMy6CrydWH46T4Wotm+UuBJFnqJd9H4RQZQ==", + "license": "Apache-2.0", + "dependencies": { + "@asyncapi/specs": "^6.8.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" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "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": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@stoplight/spectral-runtime": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@stoplight/spectral-runtime/-/spectral-runtime-1.1.5.tgz", + "integrity": "sha512-6/HSCQBKnI4M5qonCKos2W7oggXv+U/ml+m/cAd4eJAYfIVEmaLUo03qSWIIl4cBc5ujJPmn2WnCiRrz1++P7Q==", + "license": "Apache-2.0", + "dependencies": { + "@stoplight/json": "^3.20.1", + "@stoplight/path": "^1.3.2", + "@stoplight/types": "^13.6.0", + "abort-controller": "^3.0.0", + "lodash": "^4.18.1", + "node-fetch": "^2.7.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "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": "^12.20 || >=14.13" + } + }, + "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": ">=10.8" + } + }, + "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/@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": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + }, + "engines": { + "node": "^12.20 || >=14.13" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "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", + "dependencies": { + "@types/node": "*" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true, + "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": "25.9.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.2.tgz", + "integrity": "sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw==", + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "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/@vitest/expect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.8.tgz", + "integrity": "sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.8", + "@vitest/utils": "4.1.8", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.8.tgz", "integrity": "sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==", "dev": true, "license": "MIT", @@ -1383,6 +2037,18 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/abstract-logging": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", @@ -1419,6 +2085,15 @@ } } }, + "node_modules/ajv-errors": { + "version": "3.0.0", + "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", @@ -1436,52 +2111,263 @@ } } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, + "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": ">=12" + "node": ">=8" } }, - "node_modules/atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "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.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/avvio": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.2.0.tgz", - "integrity": "sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==", + "node_modules/anynum": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.0.tgz", + "integrity": "sha512-xjR9/zBVnUOP6ztMIIgShjsxui80nQUQH+5xJnvrYLs+90bF25/KJqaAi8mk+B4RDtX1Nspi6fmp4YTEts8SfA==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" + "url": "https://github.com/sponsors/NaturalIntelligence" } ], - "license": "MIT", - "dependencies": { - "@fastify/error": "^4.0.0", + "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/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": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "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": { + "astring": "bin/astring" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "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": ">= 0.4" + } + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "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", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/avvio": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.2.0.tgz", + "integrity": "sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/error": "^4.0.0", "fastq": "^1.17.1" } }, + "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/better-ajv-errors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/better-ajv-errors/-/better-ajv-errors-2.0.3.tgz", + "integrity": "sha512-t1vxUP+vYKsaYi/BbKo2K98nEAZmfi4sjwvmRT8aOPDzPJeAtLurfoIDazVkLILxO4K+Sw4YrLYnBQ46l6pePg==", + "license": "Apache-2.0", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@humanwhocodes/momoa": "^2.0.4", + "chalk": "^4.1.2", + "jsonpointer": "^5.0.1", + "leven": "^3.1.0 < 4" + }, + "engines": { + "node": ">= 18.20.6" + }, + "peerDependencies": { + "ajv": "4.11.8 - 8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.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/ljharb" + } + }, + "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.4" + } + }, + "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/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "license": "MIT" + }, + "node_modules/case-anything": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-3.1.2.tgz", + "integrity": "sha512-wljhAjDDIv/hM2FzgJnYQg90AWmZMNtESCjTeLH680qTzdo0nErlCxOmgzgX4ZsZAtIvqHyD87ES8QyriXB+BQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/chai": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", @@ -1492,11 +2378,103 @@ "node": ">=18" } }, + "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/charset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", + "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/compute-gcd": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz", + "integrity": "sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==", + "dependencies": { + "validate.io-array": "^1.0.3", + "validate.io-function": "^1.0.2", + "validate.io-integer-array": "^1.0.0" + } + }, + "node_modules/compute-lcm": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz", + "integrity": "sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==", + "dependencies": { + "compute-gcd": "^1.2.1", + "validate.io-array": "^1.0.3", + "validate.io-function": "^1.0.2", + "validate.io-integer-array": "^1.0.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/convert-source-map": { @@ -1506,6 +2484,63 @@ "dev": true, "license": "MIT" }, + "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==", + "license": "MIT" + }, + "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/dateformat": { "version": "4.6.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", @@ -1516,6 +2551,49 @@ "node": "*" } }, + "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/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/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -1535,6 +2613,26 @@ "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/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/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -1545,15 +2643,173 @@ "once": "^1.4.0" } }, - "node_modules/es-module-lexer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", - "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.28.0", + "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-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-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "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-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.28.0", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", "dev": true, @@ -1594,6 +2850,15 @@ "@esbuild/win32-x64": "0.28.0" } }, + "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/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -1604,6 +2869,15 @@ "@types/estree": "^1.0.0" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/expect-type": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", @@ -1614,6 +2888,15 @@ "node": ">=12.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/fast-copy": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-4.0.3.tgz", @@ -1657,181 +2940,885 @@ "rfdc": "^1.2.0" } }, - "node_modules/fast-querystring": { + "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-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "license": "MIT", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-xml-builder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", + "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.5.0", + "xml-naming": "^0.1.0" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.8.0.tgz", + "integrity": "sha512-6bIM7fsJxeo3uXv7OncQYsBAMPJ7V16Slahl/6M98C/i2q+vB1+4a0MtrvYwDFEUrwDSbAmeLDRXsOBwrL7yAg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "@nodable/entities": "^2.1.0", + "fast-xml-builder": "^1.2.0", + "path-expression-matcher": "^1.5.0", + "strnum": "^2.3.0", + "xml-naming": "^0.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastify": { + "version": "5.8.5", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.8.5.tgz", + "integrity": "sha512-Yqptv59pQzPgQUSIm87hMqHJmdkb1+GPxdE6vW6FRyVE9G86mt7rOghitiU4JHRaTyDUk9pfeKmDeu70lAwM4Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/ajv-compiler": "^4.0.5", + "@fastify/error": "^4.0.0", + "@fastify/fast-json-stringify-compiler": "^5.0.0", + "@fastify/proxy-addr": "^5.0.0", + "abstract-logging": "^2.0.1", + "avvio": "^9.0.0", + "fast-json-stringify": "^6.0.0", + "find-my-way": "^9.0.0", + "light-my-request": "^6.0.0", + "pino": "^9.14.0 || ^10.1.0", + "process-warning": "^5.0.0", + "rfdc": "^1.3.1", + "secure-json-parse": "^4.0.0", + "semver": "^7.6.0", + "toad-cache": "^3.7.0" + } + }, + "node_modules/fastify-openapi-glue": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/fastify-openapi-glue/-/fastify-openapi-glue-4.11.3.tgz", + "integrity": "sha512-LgxS6u7U2f0gAY4QhvxZj0o2NEIl5KQeTy77iFFTXLnHZ12LiVmQvy+x3lutA+ZoWcxxl98S66J/2/RXKw+hfg==", + "license": "MIT", + "dependencies": { + "@seriousme/openapi-schema-validator": "^2.9.0", + "fastify-plugin": "^5.1.0", + "yaml": "^2.9.0" + }, + "bin": { + "openapi-glue": "bin/openapi-glue-cli.js" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/fastify-openapi-glue/node_modules/fastify-plugin": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz", + "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/fastify-plugin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-6.0.0.tgz", + "integrity": "sha512-fZOty7z3O7vOliF6d8bHE3wiEh1KcNnKEQensSgTk9C1DvN6nRLS++XVd86v33Hw/8u9Un8A1zDrQ8ujcQDHEg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "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/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-my-way": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.6.0.tgz", + "integrity": "sha512-Zf4Xve4RymLl7NgaavNebZ01joJ8MfVerOG43wy7SHLO+r+K0C6d/SE0BiR7AV5V1VOCFlOP7ecdo+I4qmiHrQ==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^5.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "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/foreach": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", + "license": "MIT" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "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/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-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-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-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/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/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/graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "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/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/help-me": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-reasons": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", + "integrity": "sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ==", + "license": "Apache-2.0" + }, + "node_modules/http2-client": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", + "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==", + "license": "MIT" + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "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/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/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/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-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-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-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": "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", - "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "license": "MIT", "dependencies": { - "fast-decode-uri-component": "^1.0.1" + "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/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true, - "license": "MIT" + "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/fast-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" + "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/fastify": { - "version": "5.8.5", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.8.5.tgz", - "integrity": "sha512-Yqptv59pQzPgQUSIm87hMqHJmdkb1+GPxdE6vW6FRyVE9G86mt7rOghitiU4JHRaTyDUk9pfeKmDeu70lAwM4Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], + "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": { - "@fastify/ajv-compiler": "^4.0.5", - "@fastify/error": "^4.0.0", - "@fastify/fast-json-stringify-compiler": "^5.0.0", - "@fastify/proxy-addr": "^5.0.0", - "abstract-logging": "^2.0.1", - "avvio": "^9.0.0", - "fast-json-stringify": "^6.0.0", - "find-my-way": "^9.0.0", - "light-my-request": "^6.0.0", - "pino": "^9.14.0 || ^10.1.0", - "process-warning": "^5.0.0", - "rfdc": "^1.3.1", - "secure-json-parse": "^4.0.0", - "semver": "^7.6.0", - "toad-cache": "^3.7.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fastify-openapi-glue": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/fastify-openapi-glue/-/fastify-openapi-glue-4.11.3.tgz", - "integrity": "sha512-LgxS6u7U2f0gAY4QhvxZj0o2NEIl5KQeTy77iFFTXLnHZ12LiVmQvy+x3lutA+ZoWcxxl98S66J/2/RXKw+hfg==", + "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": { - "@seriousme/openapi-schema-validator": "^2.9.0", - "fastify-plugin": "^5.1.0", - "yaml": "^2.9.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, - "bin": { - "openapi-glue": "bin/openapi-glue-cli.js" + "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": ">=20.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fastify-openapi-glue/node_modules/fastify-plugin": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz", - "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" + "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/fastify-plugin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-6.0.0.tgz", - "integrity": "sha512-fZOty7z3O7vOliF6d8bHE3wiEh1KcNnKEQensSgTk9C1DvN6nRLS++XVd86v33Hw/8u9Un8A1zDrQ8ujcQDHEg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" + "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/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "license": "ISC", + "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": { - "reusify": "^1.0.4" + "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/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, + "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": ">=12.0.0" + "node": ">= 0.4" }, - "peerDependencies": { - "picomatch": "^3 || ^4" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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" }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/find-my-way": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.6.0.tgz", - "integrity": "sha512-Zf4Xve4RymLl7NgaavNebZ01joJ8MfVerOG43wy7SHLO+r+K0C6d/SE0BiR7AV5V1VOCFlOP7ecdo+I4qmiHrQ==", + "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": { - "fast-deep-equal": "^3.1.3", - "fast-querystring": "^1.0.0", - "safe-regex2": "^5.0.0" + "call-bound": "^1.0.3" }, "engines": { - "node": ">=20" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/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", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/help-me": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", - "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", - "dev": true, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT" }, "node_modules/joycon": { @@ -1844,11 +3831,25 @@ "node": ">=10" } }, + "node_modules/js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, "node_modules/js-yaml": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", - "dev": true, "funding": [ { "type": "github", @@ -1867,6 +3868,47 @@ "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/json-pointer": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", + "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", + "license": "MIT", + "dependencies": { + "foreach": "^2.0.4" + } + }, + "node_modules/json-schema-compare": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz", + "integrity": "sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.4" + } + }, + "node_modules/json-schema-merge-allof": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/json-schema-merge-allof/-/json-schema-merge-allof-0.8.1.tgz", + "integrity": "sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w==", + "license": "MIT", + "dependencies": { + "compute-lcm": "^1.1.2", + "json-schema-compare": "^0.2.2", + "lodash": "^4.17.20" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/json-schema-ref-resolver": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.0.tgz", @@ -1883,7 +3925,21 @@ ], "license": "MIT", "dependencies": { - "dequal": "^2.0.3" + "dequal": "^2.0.3" + } + }, + "node_modules/json-schema-to-ts": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-2.7.2.tgz", + "integrity": "sha512-R1JfqKqbBR4qE8UyBR56Ms30LL62/nlhoz+1UkfI/VE7p54Awu919FZ6ZUPG8zIa3XB65usPJgr1ONVncUGSaQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@types/json-schema": "^7.0.9", + "ts-algebra": "^1.2.0" + }, + "engines": { + "node": ">=16" } }, "node_modules/json-schema-traverse": { @@ -1892,6 +3948,78 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, + "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/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-rfc9535": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsonpath-rfc9535/-/jsonpath-rfc9535-1.3.0.tgz", + "integrity": "sha512-3jFHya7oZ45aDxIIdx+/zQARahHXxFSMWBkcBUldfXpLS9VCXDJyTKt35kQfEXLqh0K3Ixw/9xFnvcDStaxh7Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=20" + } + }, + "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/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "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/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/light-my-request": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.6.0.tgz", @@ -2215,6 +4343,27 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/liquid-json": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz", + "integrity": "sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "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.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/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -2225,6 +4374,48 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "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/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-format": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mime-format/-/mime-format-2.0.2.tgz", + "integrity": "sha512-Y5ERWVcyh3sby9Fx2U5F1yatiTFjNsqF5NltihTWI9QgNtr5o3dbCZdcKa1l2wyfhnwwoP9HGNxga7LqZLA6gw==", + "license": "Apache-2.0", + "dependencies": { + "charset": "^1.0.0" + } + }, + "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/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -2235,55 +4426,386 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", - "dev": true, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neotraverse": { + "version": "0.6.15", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.15.tgz", + "integrity": "sha512-HZpdkco+JeXq0G+WWpMJ4NsX3pqb5O7eR9uGz3FfoFt+LYzU8iRWp49nJtud6hsDoywM8tIrDo3gjgmOqJA8LA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "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-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-fetch-h2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", + "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", + "license": "MIT", + "dependencies": { + "http2-client": "^1.2.5" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-readfiles": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", + "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", + "license": "MIT", + "dependencies": { + "es6-promise": "^3.2.1" + } + }, + "node_modules/oas-kit-common": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", + "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", + "license": "BSD-3-Clause", + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/oas-linter": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", + "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@exodus/schemasafe": "^1.0.0-rc.2", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-resolver": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", + "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", + "license": "BSD-3-Clause", + "dependencies": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "resolve": "resolve.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-resolver-browser": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver-browser/-/oas-resolver-browser-2.5.6.tgz", + "integrity": "sha512-Jw5elT/kwUJrnGaVuRWe1D7hmnYWB8rfDDjBnpQ+RYY/dzAewGXeTexXzt4fGEo6PUE4eqKqPWF79MZxxvMppA==", + "license": "BSD-3-Clause", + "dependencies": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "path-browserify": "^1.0.1", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "resolve": "resolve.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-schema-walker": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", + "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", + "license": "BSD-3-Clause", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-validator": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", + "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", + "license": "BSD-3-Clause", + "dependencies": { + "call-me-maybe": "^1.0.1", + "oas-kit-common": "^1.0.8", + "oas-linter": "^3.2.2", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "reftools": "^1.1.9", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "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": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/openapi-sampler": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.7.4.tgz", + "integrity": "sha512-CKS/rd5ucPCuEDbJnjGDXZTsuGWcmv53aCmQx7soZlPEONUGN4af0/dY5+THRFZraSEjeA78nlfzdFswC/N5SA==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.7", + "fast-xml-parser": "^5.5.1", + "json-pointer": "0.6.2" + } + }, + "node_modules/openapi-to-postmanv2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/openapi-to-postmanv2/-/openapi-to-postmanv2-6.1.0.tgz", + "integrity": "sha512-qJ/SYQT0+oNxuOgd492cocXTNPowIgXV2EhifOUzlLt5STKWW3LSoddDqZUhSK9JsMLmdU3D7xbX/xRFqtho2w==", + "license": "Apache-2.0", + "dependencies": { + "ajv": "^8.11.0", + "ajv-draft-04": "1.0.0", + "ajv-formats": "2.1.1", + "async": "3.2.6", + "commander": "2.20.3", + "graphlib": "2.1.8", + "js-yaml": "4.1.0", + "json-pointer": "0.6.2", + "json-schema-merge-allof": "0.8.1", + "lodash": "4.17.21", + "neotraverse": "0.6.15", + "oas-resolver-browser": "2.5.6", + "object-hash": "3.0.0", + "openapi-types": "^12.1.3", + "path-browserify": "1.0.1", + "postman-collection": "^5.0.0", + "swagger2openapi": "7.0.8", + "yaml": "1.10.2" + }, + "bin": { + "openapi2postmanv2": "bin/openapi2postmanv2.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/openapi-to-postmanv2/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": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/openapi-to-postmanv2/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "license": "MIT" + }, + "node_modules/outdent": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.8.0.tgz", + "integrity": "sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==", + "license": "MIT" + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, + "node_modules/path-expression-matcher": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", + "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/ai" + "url": "https://github.com/sponsors/NaturalIntelligence" } ], "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT" - }, - "node_modules/on-exit-leak-free": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", - "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", - "license": "MIT", "engines": { "node": ">=14.0.0" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -2295,14 +4817,12 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -2373,6 +4893,33 @@ "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", "license": "MIT" }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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": ">=12.0.0" + } + }, + "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": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.5.15", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", @@ -2402,6 +4949,65 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postman-collection": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-5.3.0.tgz", + "integrity": "sha512-PMa5vRheqDFfS1bkRg8WBidWxunRA80sT5YNLP27YC5+ycyfiLMCwPnqQd1zfvxkGk04Pr9UronWmmgsbpsVyQ==", + "license": "Apache-2.0", + "dependencies": { + "@faker-js/faker": "5.5.3", + "file-type": "3.9.0", + "http-reasons": "0.1.0", + "iconv-lite": "0.6.3", + "liquid-json": "0.3.1", + "lodash": "4.17.23", + "mime": "3.0.0", + "mime-format": "2.0.2", + "postman-url-encoder": "3.0.8", + "semver": "7.7.1", + "uuid": "8.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/postman-collection/node_modules/@faker-js/faker": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-5.5.3.tgz", + "integrity": "sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw==", + "deprecated": "Please update to a newer version.", + "license": "MIT" + }, + "node_modules/postman-collection/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-url-encoder": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-3.0.8.tgz", + "integrity": "sha512-EOgUMBazo7JNP4TDrd64TsooCiWzzo4143Ws8E8WYGEpn2PKpq+S4XRTDhuRTYHm3VKOpUZs7ZYZq7zSDuesqA==", + "license": "Apache-2.0", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "license": "MIT" + }, "node_modules/process-warning": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", @@ -2429,12 +5035,36 @@ "once": "^1.3.1" } }, + "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/quick-format-unescaped": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", "license": "MIT" }, + "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==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "node_modules/real-require": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", @@ -2444,6 +5074,66 @@ "node": ">= 12.13.0" } }, + "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", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reftools": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", + "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", + "license": "BSD-3-Clause", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "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": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "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", @@ -2512,6 +5202,76 @@ "@rolldown/binding-win32-x64-msvc": "1.0.3" } }, + "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": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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==", + "license": "MIT" + }, + "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": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-regex2": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.1.1.tgz", @@ -2543,6 +5303,12 @@ "node": ">=10" } }, + "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" + }, "node_modules/secure-json-parse": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz", @@ -2568,15 +5334,193 @@ "semver": "bin/semver.js" }, "engines": { - "node": ">=10" + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "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": ">= 0.4" + } + }, + "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/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/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/should": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", + "license": "MIT", + "dependencies": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "node_modules/should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "license": "MIT", + "dependencies": { + "should-type": "^1.4.0" + } + }, + "node_modules/should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "node_modules/should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", + "license": "MIT" + }, + "node_modules/should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "node_modules/should-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", + "license": "MIT" + }, + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/set-cookie-parser": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", - "license": "MIT" - }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -2626,6 +5570,111 @@ "dev": true, "license": "MIT" }, + "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/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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "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==", + "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/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": "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/strip-json-comments": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.3.tgz", @@ -2639,6 +5688,60 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strnum": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.0.tgz", + "integrity": "sha512-sHrVyWWdq28RbhjuJdZsA1SnGRJV6NiXbk6AXBxDOsgAcA+lmpUZCYjOdLBxkXMwis6RRe7dlZt4VlIWFVzkmg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "anynum": "^1.0.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/swagger2openapi": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", + "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", + "license": "BSD-3-Clause", + "dependencies": { + "call-me-maybe": "^1.0.1", + "node-fetch": "^2.6.1", + "node-fetch-h2": "^2.3.0", + "node-readfiles": "^0.2.0", + "oas-kit-common": "^1.0.8", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "oas-validator": "^5.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "boast": "boast.js", + "oas-validate": "oas-validate.js", + "swagger2openapi": "swagger2openapi.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, "node_modules/thread-stream": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.2.0.tgz", @@ -2710,13 +5813,23 @@ "node": ">=20" } }, + "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/ts-algebra": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-1.2.2.tgz", + "integrity": "sha512-kloPhf1hq3JbCPOTYoOWDKxebWjNb2o/LKnNfkWhxVVisFFmMJPPdJeGoGmM+iRLyoXAR61e08Pb+vUXINg8aA==", + "license": "MIT" + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD", - "optional": true + "license": "0BSD" }, "node_modules/tsx": { "version": "4.22.4", @@ -2737,6 +5850,80 @@ "fsevents": "~2.3.3" } }, + "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", @@ -2751,13 +5938,97 @@ "node": ">=14.17" } }, + "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/undici-types": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", - "dev": true, "license": "MIT" }, + "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/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "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": "14.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz", + "integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/validate.io-array": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", + "integrity": "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==", + "license": "MIT" + }, + "node_modules/validate.io-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz", + "integrity": "sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==" + }, + "node_modules/validate.io-integer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", + "integrity": "sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==", + "dependencies": { + "validate.io-number": "^1.0.3" + } + }, + "node_modules/validate.io-integer-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz", + "integrity": "sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==", + "dependencies": { + "validate.io-array": "^1.0.3", + "validate.io-integer": "^1.0.4" + } + }, + "node_modules/validate.io-number": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", + "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==" + }, "node_modules/vite": { "version": "8.0.16", "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", @@ -2926,6 +6197,113 @@ } } }, + "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-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/why-is-node-running": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", @@ -2943,6 +6321,23 @@ "node": ">=8" } }, + "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==", + "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/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -2950,6 +6345,30 @@ "dev": true, "license": "ISC" }, + "node_modules/xml-naming": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", + "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yaml": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", @@ -2964,6 +6383,39 @@ "funding": { "url": "https://github.com/sponsors/eemeli" } + }, + "node_modules/yaml-ast-parser": { + "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", + "license": "Apache-2.0" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "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/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==", + "license": "ISC", + "engines": { + "node": ">=12" + } } } } diff --git a/package.json b/package.json index aeafc07..6dfd6fb 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "license": "EUPL-1.2", "private": true, "dependencies": { - "@developer-overheid-nl/don-tools-logic": "file:../don-tools-api-v2", + "@developer-overheid-nl/don-tools-logic": "github:developer-overheid-nl/don-tools-api-v2#60-tools-api-refactor", "@fastify/cors": "^11.2.0", "ajv-formats": "^3.0.1", "fastify": "^5.8.5", @@ -34,5 +34,11 @@ "typescript": "^6.0.3", "vite": "^8.0.16", "vitest": "^4.1.8" + }, + "overrides": { + "js-yaml@>=4.0.0 <4.1.1": "4.2.0", + "lodash@<=4.17.23": "4.18.1", + "uuid@<11.1.1": "14.0.0", + "yaml@>=1.0.0 <1.10.3": "2.9.0" } } From 77e45fa5640993c51c15f2b0cb8e908f2d78a856 Mon Sep 17 00:00:00 2001 From: pasibun Date: Thu, 11 Jun 2026 09:59:42 +0200 Subject: [PATCH 04/27] refactor: migrate to NestJS framework and restructure application - Updated package.json to change main entry point and scripts for NestJS. - Removed legacy Fastify app structure from app.ts, config.ts, error-handler.ts, routes.ts, server.ts, and operation-id.ts. - Introduced ToolsApiService to handle API logic using NestJS. - Updated TypeScript configuration for compatibility with NestJS. - Modified tests to work with the new NestJS application structure. --- Dockerfile | 7 +- api-implementations.ts | 9 + api.module.ts | 65 +++ api/ToolsApi.ts | 33 ++ api/index.ts | 1 + api/openapi.yaml | 654 ++++++++++++++++++++++ controllers/ToolsApi.controller.ts | 60 ++ controllers/index.ts | 1 + decorators/cookies-decorator.ts | 24 + decorators/headers-decorator.ts | 16 + decorators/index.ts | 2 + index.ts | 665 +++++++++++++++++++++++ models/index.ts | 17 + models/models-keycloak-client-result.ts | 4 + models/models-lint-message-info.ts | 7 + models/models-lint-message.ts | 8 + models/models-lint-result.ts | 14 + models/oas-input.ts | 9 + models/untrust-client-input.ts | 4 + package-lock.json | 694 +++++++++++++++++------- package.json | 21 +- src/app.ts | 73 --- src/config.ts | 12 - src/plugins/error-handler.ts | 79 --- src/routes.ts | 63 --- src/server.ts | 28 - src/utils/operation-id.ts | 13 - test/app.test.ts | 25 +- tools-api.service.ts | 74 +++ tsconfig.json | 39 +- 30 files changed, 2219 insertions(+), 502 deletions(-) create mode 100644 api-implementations.ts create mode 100644 api.module.ts create mode 100644 api/ToolsApi.ts create mode 100644 api/index.ts create mode 100644 api/openapi.yaml create mode 100644 controllers/ToolsApi.controller.ts create mode 100644 controllers/index.ts create mode 100644 decorators/cookies-decorator.ts create mode 100644 decorators/headers-decorator.ts create mode 100644 decorators/index.ts create mode 100644 index.ts create mode 100644 models/index.ts create mode 100644 models/models-keycloak-client-result.ts create mode 100644 models/models-lint-message-info.ts create mode 100644 models/models-lint-message.ts create mode 100644 models/models-lint-result.ts create mode 100644 models/oas-input.ts create mode 100644 models/untrust-client-input.ts delete mode 100644 src/app.ts delete mode 100644 src/config.ts delete mode 100644 src/plugins/error-handler.ts delete mode 100644 src/routes.ts delete mode 100644 src/server.ts delete mode 100644 src/utils/operation-id.ts create mode 100644 tools-api.service.ts diff --git a/Dockerfile b/Dockerfile index 22a3c80..21f887f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,8 +3,11 @@ WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci COPY tsconfig.json ./ -COPY src ./src COPY api ./api +COPY controllers ./controllers +COPY decorators ./decorators +COPY models ./models +COPY api-implementations.ts api.module.ts index.ts tools-api.service.ts ./ RUN npm run build FROM node:22-alpine AS runtime @@ -17,4 +20,4 @@ COPY api ./api EXPOSE 1338 -CMD ["node", "dist/server.js"] +CMD ["node", "dist/index.js"] diff --git a/api-implementations.ts b/api-implementations.ts new file mode 100644 index 0000000..81f6c5a --- /dev/null +++ b/api-implementations.ts @@ -0,0 +1,9 @@ +import { Type } from '@nestjs/common'; +import { ToolsApi } from './api'; + +/** + * Provide this type to {@link ApiModule} to provide your API implementations +**/ +export type ApiImplementations = { + toolsApi: Type +}; diff --git a/api.module.ts b/api.module.ts new file mode 100644 index 0000000..9573cfc --- /dev/null +++ b/api.module.ts @@ -0,0 +1,65 @@ +import { DynamicModule, HttpException, Module, Provider } from '@nestjs/common'; +import { ApiImplementations } from './api-implementations' +import { ToolsApi } from './api'; +import { ToolsApiController } from './controllers'; + +const createNotImplementedProvider = (apiName: string) => + new Proxy( + {}, + { + get: (_target, property) => { + if (typeof property !== 'string') return undefined; + if ( + property === 'then' || + property === 'onModuleInit' || + property === 'onApplicationBootstrap' || + property === 'onModuleDestroy' || + property === 'beforeApplicationShutdown' || + property === 'onApplicationShutdown' + ) { + return undefined; + } + return () => { + throw new HttpException(`Operation ${property} is not implemented in ${apiName}`, 501); + }; + }, + }, + ); + +export type ApiModuleConfiguration = { + /** + * your Api implementations + */ + apiImplementations?: Partial, + /** + * additional Providers that may be used by your implementations + */ + providers?: Provider[], +} + +@Module({}) +export class ApiModule { + static forRoot(configuration: ApiModuleConfiguration = {}): DynamicModule { + const providers: Provider[] = [ + configuration.apiImplementations?.toolsApi + ? { + provide: ToolsApi, + useClass: configuration.apiImplementations.toolsApi, + } + : { + provide: ToolsApi, + useValue: createNotImplementedProvider('ToolsApi'), + }, + ...(configuration.providers || []), + ]; + + return { + module: ApiModule, + controllers: [ + ToolsApiController, + ], + providers: [...providers], + exports: [...providers] + } + } +} diff --git a/api/ToolsApi.ts b/api/ToolsApi.ts new file mode 100644 index 0000000..34e23db --- /dev/null +++ b/api/ToolsApi.ts @@ -0,0 +1,33 @@ +import { Injectable } from '@nestjs/common'; +import type { FastifyReply } from 'fastify'; +import { Observable } from 'rxjs'; +import { ModelsKeycloakClientResult, ModelsLintResult, OasInput, UntrustClientInput, } from '../models'; + + +@Injectable() +export abstract class ToolsApi { + + abstract arazzoMarkdown(oasInput: OasInput | undefined, request: Request, reply: FastifyReply): string | Promise | Observable; + + + abstract arazzoMermaid(oasInput: OasInput | undefined, request: Request, reply: FastifyReply): string | Promise | Observable; + + + abstract bundleOAS(oasInput: OasInput | undefined, request: Request, reply: FastifyReply): void | Promise | Observable; + + + abstract convertOAS(oasInput: OasInput | undefined, request: Request, reply: FastifyReply): void | Promise | Observable; + + + abstract createPostmanCollection(oasInput: OasInput | undefined, request: Request, reply: FastifyReply): void | Promise | Observable; + + + abstract generateOAS(oasInput: OasInput | undefined, request: Request, reply: FastifyReply): object | Promise | Observable; + + + abstract untrustClient(untrustClientInput: UntrustClientInput | undefined, request: Request, reply: FastifyReply): ModelsKeycloakClientResult | Promise | Observable; + + + abstract validatorOpenAPIPost(oasInput: OasInput | undefined, request: Request, reply: FastifyReply): ModelsLintResult | Promise | Observable; + +} diff --git a/api/index.ts b/api/index.ts new file mode 100644 index 0000000..b832067 --- /dev/null +++ b/api/index.ts @@ -0,0 +1 @@ +export * from './ToolsApi'; diff --git a/api/openapi.yaml b/api/openapi.yaml new file mode 100644 index 0000000..82929a7 --- /dev/null +++ b/api/openapi.yaml @@ -0,0 +1,654 @@ +{ + "openapi": "3.0.1", + "info": { + "contact": { + "email": "developer.overheid@geonovum.nl", + "name": "Team developer.overheid.nl", + "url": "https://github.com/developer-overheid-nl/don-tools-api/issues" + }, + "description": "API to access the tools endpoints of developer.overheid.nl.\n\n## Auth\n\nThis API provides tools endpoints that can be accessed with either an API key or a client credentials token.\n\n### API key\n\nUsing an API key, you can access the tools endpoints.\nThese requests can also be made from the browser.\nRequest a read-only API key at https://apis.developer.overheid.nl/apis/key-aanvragen.\nSimply pass the obtained API key with each request using the `X-Api-Key` header.\n\n### Client credentials token\n\nUsing a client credentials token, you can access the tools endpoints.\nTo obtain the token, perform a `POST` request to `https://auth.developer.overheid.nl/realms/don/protocol/openid-connect/token` with the following Form URL Encoded body:\n- `grant_type`: `client_credentials`\n- `scope`: `tools`\n- `client_id`: the client id you received from us\n- `client_secret`: the client secret you received from us\n\nPass the obtained token with each request using the `Authorization` header. Example:\n\n`Authorization`: `Bearer {ACCESS_TOKEN}` (replace `{ACCESS_TOKEN}` with the obtained `access_token`)", + "title": "Tools API v1", + "version": "1.0.0" + }, + "servers": [ + { + "description": "Production", + "url": "https://api.developer.overheid.nl/tools/v1" + }, + { + "description": "Test", + "url": "https://api.don.projects.digilab.network/tools/v1" + } + ], + "tags": [ + { + "description": "Tools API V1 routes", + "name": "API v1" + }, + { + "description": "Conversies en hulpmiddelen", + "name": "Tools" + } + ], + "paths": { + "/v1/arazzo/markdown": { + "post": { + "description": "Genereert alleen de Markdown-uitvoer van een Arazzo specificatie. Body: { oasUrl|oasBody }", + "operationId": "arazzoMarkdown", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OasInput" + } + } + } + }, + "responses": { + "200": { + "content": { + "text/markdown": { + "schema": { + "type": "string" + } + } + }, + "description": "OK", + "headers": { + "API-Version": { + "description": "De API-versie van de response", + "explode": false, + "schema": { + "type": "string" + }, + "style": "simple" + } + } + }, + "404": { + "$ref": "#/components/responses/404" + } + }, + "security": [ + { + "apiKey": [], + "clientCredentials": [] + } + ], + "summary": "Arazzo Markdown (POST)", + "tags": [ + "Tools" + ] + } + }, + "/v1/arazzo/mermaid": { + "post": { + "description": "Genereert alleen de Mermaid flowchart van een Arazzo specificatie. Body: { oasUrl|oasBody }", + "operationId": "arazzoMermaid", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OasInput" + } + } + } + }, + "responses": { + "200": { + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + }, + "description": "OK", + "headers": { + "API-Version": { + "description": "De API-versie van de response", + "explode": false, + "schema": { + "type": "string" + }, + "style": "simple" + } + } + }, + "404": { + "$ref": "#/components/responses/404" + } + }, + "security": [ + { + "apiKey": [], + "clientCredentials": [] + } + ], + "summary": "Arazzo Mermaid (POST)", + "tags": [ + "Tools" + ] + } + }, + "/v1/auth/clients": { + "post": { + "description": "Maak een client aan via de admin API. Body bevat Email.", + "operationId": "untrustClient", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UntrustClientInput" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelsKeycloakClientResult" + } + } + }, + "description": "OK", + "headers": { + "API-Version": { + "description": "De API-versie van de response", + "explode": false, + "schema": { + "type": "string" + }, + "style": "simple" + } + } + }, + "404": { + "$ref": "#/components/responses/404" + } + }, + "security": [ + { + "apiKey": [], + "clientCredentials": [] + } + ], + "summary": "Maak client (POST)", + "tags": [ + "Tools" + ] + } + }, + "/v1/oas/convert": { + "post": { + "description": "Converteert OpenAPI naar de laatst ondersteunde versie (standaard 3.1). Meegegeven targetVersion (3.0 of 3.1) bepaalt het doel. Body: { oasUrl } of { oasBody } (stringified JSON of YAML).", + "operationId": "ConvertOAS", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OasInput" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "headers": { + "API-Version": { + "description": "De API-versie van de response", + "explode": false, + "schema": { + "type": "string" + }, + "style": "simple" + } + } + }, + "404": { + "$ref": "#/components/responses/404" + } + }, + "security": [ + { + "apiKey": [], + "clientCredentials": [] + } + ], + "summary": "Converteer OpenAPI 3.0/3.1", + "tags": [ + "Tools" + ] + } + }, + "/v1/oas/bundle": { + "post": { + "description": "Bundelt een OpenAPI specificatie en lost externe verwijzingen op. Body: { oasUrl } of { oasBody }.", + "operationId": "bundleOAS", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OasInput" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "headers": { + "API-Version": { + "description": "De API-versie van de response", + "explode": false, + "schema": { + "type": "string" + }, + "style": "simple" + } + } + }, + "404": { + "$ref": "#/components/responses/404" + } + }, + "security": [ + { + "apiKey": [], + "clientCredentials": [] + } + ], + "summary": "Bundle OpenAPI", + "tags": [ + "Tools" + ] + } + }, + "/v1/oas/generate": { + "post": { + "description": "Genereert een boilerplate OpenAPI specificatie op basis van JSON-invoer. Body: { oasUrl } of { oasBody } (stringified JSON).", + "operationId": "GenerateOAS", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OasInput" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "headers": { + "API-Version": { + "description": "De API-versie van de response", + "explode": false, + "schema": { + "type": "string" + }, + "style": "simple" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "404": { + "$ref": "#/components/responses/404" + } + }, + "security": [ + { + "apiKey": [], + "clientCredentials": [] + } + ], + "summary": "Generate OpenAPI", + "tags": [ + "Tools" + ] + } + }, + "/v1/oas/validate": { + "post": { + "description": "Valideert een OpenAPI specificatie met de DON ADR ruleset. Standaard wordt ruleset 2.1 gebruikt; geef targetVersion \"2.0\" of \"2.1\" mee om een versie te kiezen. Body: { oasUrl } of { oasBody } (stringified JSON of YAML).", + "operationId": "validatorOpenAPIPost", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OasInput" + } + } + } + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ModelsLintResult" + } + } + }, + "description": "OK", + "headers": { + "API-Version": { + "description": "De API-versie van de response", + "explode": false, + "schema": { + "type": "string" + }, + "style": "simple" + } + } + }, + "404": { + "$ref": "#/components/responses/404" + } + }, + "security": [ + { + "apiKey": [], + "clientCredentials": [] + } + ], + "summary": "Validate OpenAPI (POST)", + "tags": [ + "Tools" + ] + } + }, + "/v1/oas/postman": { + "post": { + "description": "Converteert OpenAPI naar Postman Collection JSON. Body: { oasUrl } of { oasBody } (stringified JSON of YAML).", + "operationId": "CreatePostmanCollection", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OasInput" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "headers": { + "API-Version": { + "description": "De API-versie van de response", + "explode": false, + "schema": { + "type": "string" + }, + "style": "simple" + } + } + }, + "404": { + "$ref": "#/components/responses/404" + } + }, + "security": [ + { + "apiKey": [], + "clientCredentials": [] + } + ], + "summary": "Maak Postman-collectie (POST)", + "tags": [ + "Tools" + ] + } + } + }, + "components": { + "headers": { + "API-Version": { + "description": "De API-versie van de response", + "explode": false, + "schema": { + "example": "1.0.0", + "type": "string" + }, + "style": "simple" + } + }, + "responses": { + "404": { + "description": "Resource does not exist", + "headers": { + "API-Version": { + "$ref": "#/components/headers/API-Version" + } + } + } + }, + "schemas": { + "OasInput": { + "example": { + "oasUrl": "oasUrl", + "oasBody": "oasBody", + "targetVersion": "3.1" + }, + "properties": { + "oasBody": { + "type": "string" + }, + "oasUrl": { + "type": "string" + }, + "targetVersion": { + "description": "Doelversie. Voor conversie: 3.0 of 3.1. Voor validatie: 2.0 of 2.1.", + "type": "string" + } + }, + "type": "object" + }, + "ModelsKeycloakClientResult": { + "example": { + "apiKey": "apiKey" + }, + "properties": { + "apiKey": { + "type": "string" + } + }, + "type": "object" + }, + "ModelsLintMessage": { + "example": { + "severity": "severity", + "createdAt": "2000-01-23T04:56:07.000Z", + "code": "code", + "id": "id", + "infos": [ + { + "path": "path", + "lintMessageId": "lintMessageId", + "id": "id", + "message": "message" + }, + { + "path": "path", + "lintMessageId": "lintMessageId", + "id": "id", + "message": "message" + } + ] + }, + "properties": { + "code": { + "type": "string" + }, + "createdAt": { + "format": "date-time", + "type": "string" + }, + "id": { + "type": "string" + }, + "infos": { + "items": { + "$ref": "#/components/schemas/ModelsLintMessageInfo" + }, + "type": "array" + }, + "severity": { + "type": "string" + } + }, + "type": "object" + }, + "ModelsLintMessageInfo": { + "example": { + "path": "path", + "lintMessageId": "lintMessageId", + "id": "id", + "message": "message" + }, + "properties": { + "id": { + "type": "string" + }, + "lintMessageId": { + "type": "string" + }, + "message": { + "type": "string" + }, + "path": { + "type": "string" + } + }, + "type": "object" + }, + "ModelsLintResult": { + "example": { + "createdAt": "2000-01-23T04:56:07.000Z", + "score": 6, + "failures": 0, + "successes": true, + "rulesetVersion": "2.1", + "messages": [ + { + "severity": "severity", + "createdAt": "2000-01-23T04:56:07.000Z", + "code": "code", + "id": "id", + "infos": [ + { + "path": "path", + "lintMessageId": "lintMessageId", + "id": "id", + "message": "message" + }, + { + "path": "path", + "lintMessageId": "lintMessageId", + "id": "id", + "message": "message" + } + ] + }, + { + "severity": "severity", + "createdAt": "2000-01-23T04:56:07.000Z", + "code": "code", + "id": "id", + "infos": [ + { + "path": "path", + "lintMessageId": "lintMessageId", + "id": "id", + "message": "message" + }, + { + "path": "path", + "lintMessageId": "lintMessageId", + "id": "id", + "message": "message" + } + ] + } + ], + "id": "id", + "apiId": "apiId" + }, + "properties": { + "apiId": { + "type": "string" + }, + "createdAt": { + "format": "date-time", + "type": "string" + }, + "failures": { + "format": "int32", + "type": "integer" + }, + "id": { + "type": "string" + }, + "messages": { + "items": { + "$ref": "#/components/schemas/ModelsLintMessage" + }, + "type": "array" + }, + "score": { + "format": "int32", + "type": "integer" + }, + "successes": { + "type": "boolean" + }, + "rulesetVersion": { + "description": "De gebruikte ruleset-versie voor validatie.", + "type": "string" + } + }, + "type": "object" + }, + "UntrustClientInput": { + "example": { + "email": "email" + }, + "properties": { + "email": { + "type": "string" + } + }, + "type": "object" + } + }, + "securitySchemes": { + "apiKey": { + "in": "header", + "name": "X-Api-Key", + "type": "apiKey", + "description": "Read-only API keys for tools endpoints can be requested at https://apis.developer.overheid.nl/apis/key-aanvragen." + }, + "clientCredentials": { + "flows": { + "clientCredentials": { + "scopes": { + "tools": "Access to tools endpoints" + }, + "tokenUrl": "https://auth.developer.overheid.nl/realms/don/protocol/openid-connect/token" + } + }, + "type": "oauth2" + } + } + } +} diff --git a/controllers/ToolsApi.controller.ts b/controllers/ToolsApi.controller.ts new file mode 100644 index 0000000..bef652b --- /dev/null +++ b/controllers/ToolsApi.controller.ts @@ -0,0 +1,60 @@ +import { Body, Controller, DefaultValuePipe, Post, Inject, Param, ParseIntPipe, ParseFloatPipe, Query, Req, Res, HttpCode } from '@nestjs/common'; +import type { FastifyReply } from 'fastify'; +import { Observable } from 'rxjs'; +import { Cookies, Headers } from '../decorators'; +import { ToolsApi } from '../api'; +import { ModelsKeycloakClientResult, ModelsLintResult, OasInput, UntrustClientInput, } from '../models'; + +@Controller() +export class ToolsApiController { + constructor(@Inject(ToolsApi) private readonly toolsApi: ToolsApi) {} + + @Post('/v1/arazzo/markdown') + @HttpCode(200) + arazzoMarkdown(@Body() oasInput: OasInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): string | Promise | Observable { + return this.toolsApi.arazzoMarkdown(oasInput, request, reply); + } + + @Post('/v1/arazzo/mermaid') + @HttpCode(200) + arazzoMermaid(@Body() oasInput: OasInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): string | Promise | Observable { + return this.toolsApi.arazzoMermaid(oasInput, request, reply); + } + + @Post('/v1/oas/bundle') + @HttpCode(200) + bundleOAS(@Body() oasInput: OasInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): void | Promise | Observable { + return this.toolsApi.bundleOAS(oasInput, request, reply); + } + + @Post('/v1/oas/convert') + @HttpCode(200) + convertOAS(@Body() oasInput: OasInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): void | Promise | Observable { + return this.toolsApi.convertOAS(oasInput, request, reply); + } + + @Post('/v1/oas/postman') + @HttpCode(200) + createPostmanCollection(@Body() oasInput: OasInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): void | Promise | Observable { + return this.toolsApi.createPostmanCollection(oasInput, request, reply); + } + + @Post('/v1/oas/generate') + @HttpCode(200) + generateOAS(@Body() oasInput: OasInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): object | Promise | Observable { + return this.toolsApi.generateOAS(oasInput, request, reply); + } + + @Post('/v1/auth/clients') + @HttpCode(200) + untrustClient(@Body() untrustClientInput: UntrustClientInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): ModelsKeycloakClientResult | Promise | Observable { + return this.toolsApi.untrustClient(untrustClientInput, request, reply); + } + + @Post('/v1/oas/validate') + @HttpCode(200) + validatorOpenAPIPost(@Body() oasInput: OasInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): ModelsLintResult | Promise | Observable { + return this.toolsApi.validatorOpenAPIPost(oasInput, request, reply); + } + +} diff --git a/controllers/index.ts b/controllers/index.ts new file mode 100644 index 0000000..bca7f6c --- /dev/null +++ b/controllers/index.ts @@ -0,0 +1 @@ +export * from './ToolsApi.controller'; diff --git a/decorators/cookies-decorator.ts b/decorators/cookies-decorator.ts new file mode 100644 index 0000000..fe8ce15 --- /dev/null +++ b/decorators/cookies-decorator.ts @@ -0,0 +1,24 @@ +import { createParamDecorator, ExecutionContext } from '@nestjs/common'; + +/** +* A decorator function for retrieving cookies from the request object in an HTTP context. +* +* This decorator only works, if the framework specific cookie middleware is installed and enabled. +* - For Express, you need to use the `cookie-parser` middleware. +* - For Fastify, you need to use the `@fastify/cookie` plugin. +* +* Consult https://docs.nestjs.com/techniques/cookies for further information +* +* Usage: +* ``` +* @Get() +* findAll(@Cookies('name') name: string) {} +* ``` +*/ +export const Cookies = createParamDecorator((cookieName: string, ctx: ExecutionContext) => { + const request = ctx.switchToHttp().getRequest(); + if (!cookieName) { + return { ...request.cookies, ...request.signedCookies }; + } + return request.cookies?.[cookieName] ?? request.signedCookies?.[cookieName]; +}); \ No newline at end of file diff --git a/decorators/headers-decorator.ts b/decorators/headers-decorator.ts new file mode 100644 index 0000000..85bd979 --- /dev/null +++ b/decorators/headers-decorator.ts @@ -0,0 +1,16 @@ +import { createParamDecorator, ExecutionContext } from '@nestjs/common'; + +/** +* A decorator function for retrieving headers from the request object in an HTTP context. +* Workaround for enabling PipeTransformers on Headers (see https://github.com/nestjs/nest/issues/356) +* +* Usage: +* ``` +* @Get() +* findAll(@Headers('name') name: string) {} +* ``` +*/ +export const Headers = createParamDecorator((headerName: string, ctx: ExecutionContext) => { + const request = ctx.switchToHttp().getRequest(); + return headerName ? request.headers?.[headerName.toLowerCase()] : request.headers; +}); \ No newline at end of file diff --git a/decorators/index.ts b/decorators/index.ts new file mode 100644 index 0000000..4bd1d7b --- /dev/null +++ b/decorators/index.ts @@ -0,0 +1,2 @@ +export * from './cookies-decorator'; +export * from './headers-decorator'; \ No newline at end of file diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..55809d6 --- /dev/null +++ b/index.ts @@ -0,0 +1,665 @@ +import "reflect-metadata"; +import { readFileSync } from "node:fs"; +import { join } from "node:path"; +import { ArgumentsHost, Catch, ExceptionFilter, HttpException, Module } from "@nestjs/common"; +import { NestFactory } from "@nestjs/core"; +import { FastifyAdapter, NestFastifyApplication } from "@nestjs/platform-fastify"; +import cors from "@fastify/cors"; +import addFormats from "ajv-formats"; +import { OpenAPIBackend } from "openapi-backend"; +import type { Operation, Request as OpenAPIRequest } from "openapi-backend"; +import type Ajv from "ajv"; +import { ApiModule } from "./api.module"; +import { ToolsApiService } from "./tools-api.service"; + +const yaml = require("js-yaml") as { load(input: string): unknown }; + +type RuntimeOpenAPIRequest = OpenAPIRequest & { + path: string; +}; + +type RuntimeOperation = Operation & { + operationId?: string; + path: string; + method: string; + requestBody?: { + content?: Record; + }; + responses?: Record; +}; + +type RuntimeRequest = { + url: string; + method: string; + query?: unknown; + params?: unknown; + headers: Record; +}; + +type RuntimeReply = { + statusCode: number; + status(statusCode: number): RuntimeReply; + type(contentType: string): RuntimeReply; + header(name: string, value: unknown): RuntimeReply; + getHeader(name: string): unknown; + getHeaders(): Record; + send(payload: unknown): unknown; +}; + +type ValidationError = { + instancePath?: string; + schemaPath?: string; + keyword?: string; + params?: unknown; + message?: string; +}; + +type ProblemError = { + in: string; + location: string; + code: string; + detail: string; +}; + +const parseInt10 = (value: string | undefined, fallback: number): number => { + if (!value) return fallback; + const parsed = Number.parseInt(value, 10); + return Number.isFinite(parsed) ? parsed : fallback; +}; + +const parseBoolean = (value: string | undefined): boolean => { + if (!value) return false; + return ["1", "true", "yes", "on"].includes(value.toLowerCase()); +}; + +const statusText = (status: number): string => { + const texts: Record = { + 400: "Bad Request", + 401: "Unauthorized", + 403: "Forbidden", + 404: "Not Found", + 405: "Method Not Allowed", + 409: "Conflict", + 415: "Unsupported Media Type", + 422: "Unprocessable Entity", + 429: "Too Many Requests", + 500: "Internal Server Error", + 501: "Not Implemented", + 502: "Bad Gateway", + 503: "Service Unavailable", + 504: "Gateway Timeout", + }; + return texts[status] ?? "Unknown Error"; +}; + +const toProblem = (status: number, title: string, errors?: ProblemError[]) => ({ + title, + status, + ...(errors?.length ? { errors } : {}), +}); + +const toProblemErrors = (errors: ValidationError[] | undefined): ProblemError[] | undefined => { + if (!errors?.length) return undefined; + const bodyErrors = errors.filter((error) => ["body", "requestBody"].includes(error.instancePath?.split("/").filter(Boolean)[0] ?? "")); + if (bodyErrors.length > 0) { + return [ + { + in: "body", + location: "body", + code: "body", + detail: bodyErrors.map((error) => error.message ?? "Invalid request body").join("\n"), + }, + ]; + } + + return errors.map((error) => { + const params = typeof error.params === "object" && error.params !== null ? (error.params as Record) : {}; + const additionalProperty = typeof params.additionalProperty === "string" ? params.additionalProperty : undefined; + const location = additionalProperty ?? error.instancePath?.split("/").filter(Boolean).pop() ?? ""; + const source = error.instancePath?.split("/").filter(Boolean)[0] ?? ""; + const sourceMap: Record = { + body: "body", + headers: "header", + path: "path", + params: "path", + query: "query", + cookies: "cookie", + }; + return { + in: sourceMap[source] ?? "request", + location, + code: error.keyword ?? "validation", + detail: error.message ?? "Invalid value", + }; + }); +}; + +const isRecord = (value: unknown): value is Record => + typeof value === "object" && value !== null && !Array.isArray(value); + +const resolveJsonPointer = (document: unknown, pointer: string): unknown => { + if (!pointer.startsWith("#/")) return undefined; + return pointer + .slice(2) + .split("/") + .map((part) => part.replace(/~1/g, "/").replace(/~0/g, "~")) + .reduce((current, part) => (isRecord(current) ? current[part] : undefined), document); +}; + +const resolveRef = (document: unknown, value: unknown): unknown => { + if (!isRecord(value) || typeof value.$ref !== "string") return value; + return resolveJsonPointer(document, value.$ref) ?? value; +}; + +const getResponseObject = (document: unknown, operation: RuntimeOperation | undefined, statusCode: number): Record | undefined => { + if (!operation?.responses) return undefined; + const responses = operation.responses; + const response = responses[String(statusCode)] ?? responses[`${Math.floor(statusCode / 100)}XX`] ?? responses.default; + const resolved = resolveRef(document, response); + return isRecord(resolved) ? resolved : undefined; +}; + +const getResponseContentTypes = (responseObject: Record | undefined): string[] => { + const content = responseObject?.content; + return isRecord(content) ? Object.keys(content) : []; +}; + +const getResponseMediaObject = ( + document: unknown, + responseObject: Record | undefined, + contentType: string | undefined, +): Record | undefined => { + if (!contentType || !isRecord(responseObject?.content)) return undefined; + const content = responseObject.content; + const mediaType = Object.keys(content).find((candidate) => mediaTypeMatches(contentType, candidate)); + const mediaObject = mediaType ? resolveRef(document, content[mediaType]) : undefined; + return isRecord(mediaObject) ? mediaObject : undefined; +}; + +const acceptsMediaType = (acceptHeader: unknown, mediaType: string): boolean => { + if (typeof acceptHeader !== "string" || acceptHeader.trim() === "" || acceptHeader.includes("*/*")) return true; + return acceptHeader + .split(",") + .map((part) => part.split(";")[0]?.trim() ?? "") + .some((accepted) => mediaTypeMatches(mediaType, accepted)); +}; + +const chooseResponseContentType = (request: RuntimeRequest, responseObject: Record | undefined): string | undefined => { + const contentTypes = getResponseContentTypes(responseObject); + if (contentTypes.length === 0) return undefined; + return contentTypes.find((mediaType) => acceptsMediaType(request.headers.accept, mediaType)) ?? contentTypes[0]; +}; + +const getSchemaType = (schema: unknown): string | undefined => { + if (!isRecord(schema)) return undefined; + if (typeof schema.type === "string") return schema.type; + if (Array.isArray(schema.type)) return schema.type.find((type) => type !== "null"); + if (schema.format === "date-time" || schema.format === "date" || schema.format === "uri") return "string"; + return undefined; +}; + +const getExampleValue = (document: unknown, value: unknown): unknown => { + const resolved = resolveRef(document, value); + if (!isRecord(resolved)) return undefined; + if ("value" in resolved) return resolved.value; + return undefined; +}; + +const firstDefined = (...values: unknown[]): unknown => values.find((value) => value !== undefined); + +const mockFromSchema = (document: unknown, schema: unknown, seen = new Set()): unknown => { + const resolvedSchema = resolveRef(document, schema); + if (!isRecord(resolvedSchema)) return {}; + if (seen.has(resolvedSchema)) return {}; + seen.add(resolvedSchema); + + const directValue = firstDefined(resolvedSchema.example, resolvedSchema.default, resolvedSchema.const); + if (directValue !== undefined) return directValue; + if (Array.isArray(resolvedSchema.examples) && resolvedSchema.examples.length > 0) return resolvedSchema.examples[0]; + if (Array.isArray(resolvedSchema.enum) && resolvedSchema.enum.length > 0) { + return resolvedSchema.enum.find((value) => value !== null) ?? resolvedSchema.enum[0]; + } + + if (Array.isArray(resolvedSchema.allOf)) { + const values = resolvedSchema.allOf.map((item) => mockFromSchema(document, item, seen)); + if (values.every(isRecord)) return Object.assign({}, ...values); + return values.find((value) => value !== undefined && value !== null) ?? {}; + } + + const union = Array.isArray(resolvedSchema.oneOf) + ? resolvedSchema.oneOf + : Array.isArray(resolvedSchema.anyOf) + ? resolvedSchema.anyOf + : undefined; + if (union) { + const preferred = union.find((item) => getSchemaType(resolveRef(document, item)) !== "null") ?? union[0]; + return mockFromSchema(document, preferred, seen); + } + + const schemaType = getSchemaType(resolvedSchema); + if (schemaType === "array") return [mockFromSchema(document, resolvedSchema.items, seen)]; + if (schemaType === "object" || isRecord(resolvedSchema.properties)) { + const properties = isRecord(resolvedSchema.properties) ? resolvedSchema.properties : {}; + return Object.fromEntries(Object.entries(properties).map(([name, propertySchema]) => [name, mockFromSchema(document, propertySchema, seen)])); + } + if (schemaType === "integer" || schemaType === "number") return 0; + if (schemaType === "boolean") return true; + if (schemaType === "null") return null; + + if (resolvedSchema.format === "email") return "user@example.com"; + if (resolvedSchema.format === "uri" || resolvedSchema.format === "url") return "https://example.com/path"; + if (resolvedSchema.format === "uuid") return "3fa85f64-5717-4562-b3fc-2c963f66afa6"; + if (resolvedSchema.format === "date") return "1970-01-01"; + if (resolvedSchema.format === "date-time") return "1970-01-01T00:00:00.000Z"; + return "string"; +}; + +const getMediaExample = (document: unknown, mediaObject: Record | undefined): unknown => { + if (!mediaObject) return undefined; + if ("example" in mediaObject) return mediaObject.example; + if (isRecord(mediaObject.examples)) { + for (const example of Object.values(mediaObject.examples)) { + const value = getExampleValue(document, example); + if (value !== undefined) return value; + } + } + return undefined; +}; + +const selectMockStatusCode = (operation: RuntimeOperation): number => { + const responseCodes = Object.keys(operation.responses ?? {}); + const successCode = responseCodes.find((code) => /^[23]\d\d$/.test(code)); + if (successCode) return Number.parseInt(successCode, 10); + const numericCode = responseCodes.find((code) => /^\d\d\d$/.test(code)); + return numericCode ? Number.parseInt(numericCode, 10) : 200; +}; + +const mockResponseForOperation = ( + document: unknown, + request: RuntimeRequest, + operation: RuntimeOperation, +): { status: number; body: unknown; contentType?: string } => { + const status = selectMockStatusCode(operation); + const responseObject = getResponseObject(document, operation, status); + const contentType = chooseResponseContentType(request, responseObject); + const mediaObject = getResponseMediaObject(document, responseObject, contentType); + const example = getMediaExample(document, mediaObject); + const schema = mediaObject?.schema; + return { + status, + contentType, + body: example !== undefined ? example : schema !== undefined ? mockFromSchema(document, schema) : undefined, + }; +}; + +const firstQueryValue = (query: unknown, names: string[]): string | undefined => { + if (!isRecord(query)) return undefined; + const lowerCaseEntries = new Map(Object.entries(query).map(([key, value]) => [key.toLowerCase(), value])); + for (const name of names) { + const value = lowerCaseEntries.get(name.toLowerCase()); + if (Array.isArray(value)) return value[0] === undefined ? undefined : String(value[0]); + if (value !== undefined) return String(value); + } + return undefined; +}; + +const firstPathValue = (params: unknown, names: string[]): string | undefined => { + if (!isRecord(params)) return undefined; + const lowerCaseEntries = new Map(Object.entries(params).map(([key, value]) => [key.toLowerCase(), value])); + for (const name of names) { + const value = lowerCaseEntries.get(name.toLowerCase()); + if (value !== undefined) return String(value); + } + return undefined; +}; + +const buildPaginationLink = (request: RuntimeRequest): string => { + const url = new URL(request.url, "http://localhost"); + const currentPage = Number.parseInt(firstQueryValue(request.query, ["page", "Page"]) ?? "1", 10) || 1; + const perPage = Number.parseInt(firstQueryValue(request.query, ["perPage", "PerPage"]) ?? "20", 10) || 20; + const totalPages = Math.max(currentPage, 1); + const withPage = (page: number) => { + const nextUrl = new URL(url.toString()); + nextUrl.searchParams.set("page", String(page)); + nextUrl.searchParams.set("perPage", String(perPage)); + return `${nextUrl.pathname}${nextUrl.search}`; + }; + return [`<${withPage(1)}>; rel="first"`, `<${withPage(totalPages)}>; rel="last"`].join(", "); +}; + +const mockPagination = (request: RuntimeRequest): { currentPage: number; perPage: number; totalPages: number; totalCount: number } => { + const currentPage = Math.max(Number.parseInt(firstQueryValue(request.query, ["page", "Page"]) ?? "1", 10) || 1, 1); + const perPage = Math.max(Number.parseInt(firstQueryValue(request.query, ["perPage", "PerPage"]) ?? "20", 10) || 20, 1); + const totalPages = Math.max(currentPage, 1); + return { + currentPage, + perPage, + totalPages, + totalCount: (totalPages - 1) * perPage + 1, + }; +}; + +const mockHeaderValue = (name: string, schema: unknown, request: RuntimeRequest, apiVersion: string | undefined): string => { + const normalizedName = name.toLowerCase(); + const pagination = mockPagination(request); + if (normalizedName === "api-version") return apiVersion ?? "1.0.0"; + if (normalizedName === "link") return buildPaginationLink(request); + if (normalizedName === "total-count") return String(pagination.totalCount); + if (normalizedName === "current-page") return String(pagination.currentPage); + if (normalizedName === "per-page") return String(pagination.perPage); + if (normalizedName === "total-pages") return String(pagination.totalPages); + if (normalizedName === "oas-version") return firstPathValue(request.params, ["version", "oasVersion", "OASVersion"]) ?? "mock"; + if (normalizedName === "oas-source") return "mock"; + + const schemaType = getSchemaType(schema); + if (schemaType === "integer" || schemaType === "number") return "1"; + if (schemaType === "boolean") return "true"; + return "string"; +}; + +const applyDeclaredResponseMetadata = ( + document: unknown, + request: RuntimeRequest, + reply: RuntimeReply, + operation: RuntimeOperation | undefined, + statusCode: number, + apiVersion: string | undefined, +) => { + const responseObject = getResponseObject(document, operation, statusCode); + const declaredHeaders = responseObject?.headers; + if (isRecord(declaredHeaders)) { + for (const [headerName, headerDefinition] of Object.entries(declaredHeaders)) { + if (reply.getHeader(headerName) !== undefined) continue; + const resolvedHeader = resolveRef(document, headerDefinition); + const schema = isRecord(resolvedHeader) ? resolveRef(document, resolvedHeader.schema) : undefined; + reply.header(headerName, mockHeaderValue(headerName, schema, request, apiVersion)); + } + } + + if (apiVersion && !reply.getHeader("API-Version")) reply.header("API-Version", apiVersion); + + const contentType = chooseResponseContentType(request, responseObject); + if (contentType && !reply.getHeader("content-type")) reply.type(contentType); +}; + +const sendProblem = ( + document: unknown, + request: RuntimeRequest, + reply: RuntimeReply, + operation: RuntimeOperation | undefined, + status: number, + title: string, + apiVersion: string | undefined, + errors?: ValidationError[], +) => { + applyDeclaredResponseMetadata(document, request, reply.status(status), operation, status, apiVersion); + if (!reply.getHeader("content-type")) reply.type("application/problem+json"); + return reply.send(toProblem(status, title, toProblemErrors(errors))); +}; + +const escapeRegExp = (input: string): string => input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + +const openApiPathToRegExp = (path: string): RegExp => { + const source = path + .split("/") + .map((part) => (part.startsWith("{") && part.endsWith("}") ? "[^/]+" : escapeRegExp(part))) + .join("/"); + return new RegExp(`^${source}/?$`); +}; + +const toHeaderRecord = (headers: Record): Record => { + const result: Record = {}; + for (const [key, value] of Object.entries(headers)) { + if (Array.isArray(value)) result[key] = value.map(String); + else if (value !== undefined) result[key] = String(value); + } + return result; +}; + +const hasOpenApiPath = (document: unknown, path: string): boolean => + typeof document === "object" && + document !== null && + "paths" in document && + typeof (document as { paths?: unknown }).paths === "object" && + (document as { paths: Record }).paths !== null && + path in (document as { paths: Record }).paths; + +const isJsonLikeContentType = (contentType: unknown): boolean => + typeof contentType === "string" && /\bjson\b/i.test(contentType); + +const normalizeMediaType = (contentType: string): string => contentType.split(";")[0]?.trim().toLowerCase() ?? ""; + +const mediaTypeMatches = (actual: string, expected: string): boolean => { + const normalizedActual = normalizeMediaType(actual); + const normalizedExpected = normalizeMediaType(expected); + if (normalizedActual === normalizedExpected) return true; + if (normalizedExpected === "*/*") return true; + const [expectedType, expectedSubtype] = normalizedExpected.split("/"); + const [actualType, actualSubtype] = normalizedActual.split("/"); + if (!expectedType || !expectedSubtype || !actualType || !actualSubtype) return false; + if (expectedSubtype === "*") return expectedType === actualType; + return expectedSubtype.startsWith("*+") && actualSubtype.endsWith(expectedSubtype.slice(1)) && expectedType === actualType; +}; + +const hasUnsupportedRequestMediaType = (operation: RuntimeOperation, contentType: unknown, body: unknown): boolean => { + const allowedMediaTypes = Object.keys(operation.requestBody?.content ?? {}); + if (allowedMediaTypes.length === 0 || body === undefined) return false; + if (typeof contentType !== "string" || contentType.trim() === "") return true; + return !allowedMediaTypes.some((mediaType) => mediaTypeMatches(contentType, mediaType)); +}; + +const isDeclaredResponseStatus = (operation: RuntimeOperation, statusCode: number): boolean => { + const responses = operation.responses ?? {}; + return String(statusCode) in responses || `${Math.floor(statusCode / 100)}XX` in responses || "default" in responses; +}; + +@Catch() +class ProblemDetailsFilter implements ExceptionFilter { + catch(error: unknown, host: ArgumentsHost) { + const context = host.switchToHttp(); + const request = context.getRequest<{ url?: string }>(); + const reply = context.getResponse(); + const status = error instanceof HttpException ? error.getStatus() : 500; + const response = error instanceof HttpException ? error.getResponse() : undefined; + const detail = + typeof response === "object" && response !== null && "message" in response + ? Array.isArray((response as { message?: unknown }).message) + ? (response as { message: unknown[] }).message.join(", ") + : String((response as { message?: unknown }).message) + : error instanceof Error + ? error.message + : statusText(status); + + reply.status(status).type("application/problem+json").send(toProblem(status, detail)); + } +} + +@Module({ + imports: [ + ApiModule.forRoot({ + apiImplementations: { + toolsApi: ToolsApiService, + }, + }), + ], +}) +class AppModule {} + +export const createApp = async () => { + const app = await NestFactory.create(AppModule, new FastifyAdapter({ bodyLimit: 14 * 1024 * 1024 })); + await app.register(cors); + app.useGlobalFilters(new ProblemDetailsFilter()); + + const openapiYaml = readFileSync(join(process.cwd(), "api", "openapi.yaml"), "utf8"); + const openapiDocument = yaml.load(openapiYaml); + const openapi = new OpenAPIBackend({ + definition: openapiDocument as never, + quick: true, + validate: true, + coerceTypes: true, + ajvOpts: { + allErrors: true, + strict: false, + }, + customizeAjv: (ajv: Ajv) => addFormats(ajv), + }); + await openapi.init(); + + const apiVersion = + typeof openapiDocument === "object" && openapiDocument !== null && "info" in openapiDocument + ? (openapiDocument as { info?: { version?: string } }).info?.version + : undefined; + const mockResponses = parseBoolean(process.env.OPENAPI_MOCK); + const validateResponses = parseBoolean(process.env.OPENAPI_VALIDATE_RESPONSES); + const operations = openapi.getOperations() as RuntimeOperation[]; + const operationPaths = operations.map((operation) => ({ + operation, + pathPattern: openApiPathToRegExp(operation.path), + })); + const generatedOpenApiPaths = new Set(); + if (!hasOpenApiPath(openapiDocument, "/openapi.yaml")) generatedOpenApiPaths.add("/openapi.yaml"); + if (!hasOpenApiPath(openapiDocument, "/openapi.json")) generatedOpenApiPaths.add("/openapi.json"); + const isGeneratedOpenApiEndpoint = (path: string): boolean => generatedOpenApiPaths.has(path.split("?")[0] ?? path); + + const fastify = app.getHttpAdapter().getInstance(); + + fastify.addHook("preValidation", async (request, reply) => { + if (isGeneratedOpenApiEndpoint(request.url)) return; + + const openapiRequest: RuntimeOpenAPIRequest = { + method: request.method, + path: request.url, + body: request.body, + query: request.query as Record | string | undefined, + headers: toHeaderRecord(request.headers), + }; + const operation = openapi.matchOperation(openapiRequest) as RuntimeOperation | undefined; + + if (!operation) { + const requestPath = request.url.split("?")[0] ?? request.url; + const allowedMethods = operationPaths + .filter(({ pathPattern }) => pathPattern.test(requestPath)) + .map(({ operation: candidate }) => candidate.method.toUpperCase()); + + if (allowedMethods.length > 0) { + reply.header("Allow", [...new Set(allowedMethods)].sort().join(", ")); + return sendProblem( + openapiDocument, + request as RuntimeRequest, + reply as RuntimeReply, + undefined, + 405, + `Method ${request.method} is not allowed for ${requestPath}`, + apiVersion, + ); + } + return; + } + + const operationId = operation.operationId; + if (hasUnsupportedRequestMediaType(operation, request.headers["content-type"], request.body)) { + return sendProblem( + openapiDocument, + request as RuntimeRequest, + reply as RuntimeReply, + operation, + 415, + "Request content type is not supported by the OpenAPI operation", + apiVersion, + ); + } + + const validation = openapi.validateRequest(openapiRequest, operationId); + if (!validation.valid) { + const status = validation.errors?.some((error) => error.keyword === "contentType") ? 415 : 400; + return sendProblem( + openapiDocument, + request as RuntimeRequest, + reply as RuntimeReply, + operation, + status, + "Request validation failed", + apiVersion, + validation.errors ?? undefined, + ); + } + + (request as { openapiOperation?: RuntimeOperation }).openapiOperation = operation; + + if (mockResponses) { + const mocked = mockResponseForOperation(openapiDocument, request as RuntimeRequest, operation); + applyDeclaredResponseMetadata( + openapiDocument, + request as RuntimeRequest, + reply.status(mocked.status) as RuntimeReply, + operation, + mocked.status, + apiVersion, + ); + if (mocked.contentType && !reply.getHeader("content-type")) reply.type(mocked.contentType); + return reply.send(mocked.body); + } + }); + + fastify.addHook("onSend", async (_request, reply, payload) => { + const request = _request as RuntimeRequest & { openapiOperation?: RuntimeOperation }; + applyDeclaredResponseMetadata(openapiDocument, request, reply as RuntimeReply, request.openapiOperation, reply.statusCode, apiVersion); + return payload; + }); + fastify.addHook("onSend", async (request, reply, payload) => { + if (!validateResponses) return payload; + if (isGeneratedOpenApiEndpoint(request.url)) return payload; + + const operation = (request as { openapiOperation?: RuntimeOperation }).openapiOperation; + const operationId = operation?.operationId; + if (!operationId) return payload; + + const statusCode = reply.statusCode; + if (!isDeclaredResponseStatus(operation, statusCode)) { + reply.status(502).type("application/problem+json"); + return JSON.stringify(toProblem(502, `Response status ${statusCode} is not declared in the OpenAPI specification`)); + } + + const contentType = reply.getHeader("content-type"); + const responseBody = + typeof payload === "string" && isJsonLikeContentType(contentType) + ? JSON.parse(payload) + : payload; + const bodyValidation = openapi.validateResponse(responseBody, operationId, statusCode); + if (!bodyValidation.valid) { + reply.status(502).type("application/problem+json"); + return JSON.stringify( + toProblem(502, "Response body does not match the OpenAPI specification", toProblemErrors(bodyValidation.errors ?? undefined)), + ); + } + + const headerValidation = openapi.validateResponseHeaders(reply.getHeaders(), operationId, { + statusCode, + }); + if (!headerValidation.valid) { + reply.status(502).type("application/problem+json"); + return JSON.stringify( + toProblem(502, "Response headers do not match the OpenAPI specification", toProblemErrors(headerValidation.errors ?? undefined)), + ); + } + + return payload; + }); + if (generatedOpenApiPaths.has("/openapi.yaml")) { + fastify.get("/openapi.yaml", async (_request, reply) => reply.type("text/yaml; charset=utf-8").send(openapiYaml)); + } + if (generatedOpenApiPaths.has("/openapi.json")) { + fastify.get("/openapi.json", async () => openapiDocument); + } + + return app; +}; + +export const bootstrap = async () => { + const app = await createApp(); + await app.listen(parseInt10(process.env.PORT, 1338), process.env.HOST ?? "0.0.0.0"); +}; + +if (require.main === module) { + void bootstrap(); +} diff --git a/models/index.ts b/models/index.ts new file mode 100644 index 0000000..7b5a4f5 --- /dev/null +++ b/models/index.ts @@ -0,0 +1,17 @@ +export * from './models-keycloak-client-result'; +export * from './models-lint-message'; +export * from './models-lint-message-info'; +export * from './models-lint-result'; +export * from './oas-input'; +export * from './untrust-client-input'; + +export {}; + +declare global { + type ModelsKeycloakClientResult = import('./models-keycloak-client-result').ModelsKeycloakClientResult; + type ModelsLintMessage = import('./models-lint-message').ModelsLintMessage; + type ModelsLintMessageInfo = import('./models-lint-message-info').ModelsLintMessageInfo; + type ModelsLintResult = import('./models-lint-result').ModelsLintResult; + type OasInput = import('./oas-input').OasInput; + type UntrustClientInput = import('./untrust-client-input').UntrustClientInput; +} diff --git a/models/models-keycloak-client-result.ts b/models/models-keycloak-client-result.ts new file mode 100644 index 0000000..4ae98d2 --- /dev/null +++ b/models/models-keycloak-client-result.ts @@ -0,0 +1,4 @@ +export interface ModelsKeycloakClientResult { + apiKey?: string; +} + diff --git a/models/models-lint-message-info.ts b/models/models-lint-message-info.ts new file mode 100644 index 0000000..97b555b --- /dev/null +++ b/models/models-lint-message-info.ts @@ -0,0 +1,7 @@ +export interface ModelsLintMessageInfo { + id?: string; + lintMessageId?: string; + message?: string; + path?: string; +} + diff --git a/models/models-lint-message.ts b/models/models-lint-message.ts new file mode 100644 index 0000000..dd559e7 --- /dev/null +++ b/models/models-lint-message.ts @@ -0,0 +1,8 @@ +export interface ModelsLintMessage { + code?: string; + createdAt?: string; + id?: string; + infos?: Array; + severity?: string; +} + diff --git a/models/models-lint-result.ts b/models/models-lint-result.ts new file mode 100644 index 0000000..13136f5 --- /dev/null +++ b/models/models-lint-result.ts @@ -0,0 +1,14 @@ +export interface ModelsLintResult { + apiId?: string; + createdAt?: string; + failures?: number; + id?: string; + messages?: Array; + score?: number; + successes?: boolean; + /** + * De gebruikte ruleset-versie voor validatie. + */ + rulesetVersion?: string; +} + diff --git a/models/oas-input.ts b/models/oas-input.ts new file mode 100644 index 0000000..9d2c87e --- /dev/null +++ b/models/oas-input.ts @@ -0,0 +1,9 @@ +export interface OasInput { + oasBody?: string; + oasUrl?: string; + /** + * Doelversie. Voor conversie: 3.0 of 3.1. Voor validatie: 2.0 of 2.1. + */ + targetVersion?: string; +} + diff --git a/models/untrust-client-input.ts b/models/untrust-client-input.ts new file mode 100644 index 0000000..b2d1fe2 --- /dev/null +++ b/models/untrust-client-input.ts @@ -0,0 +1,4 @@ +export interface UntrustClientInput { + email?: string; +} + diff --git a/package-lock.json b/package-lock.json index 8944568..c8c53b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,23 +11,42 @@ "dependencies": { "@developer-overheid-nl/don-tools-logic": "github:developer-overheid-nl/don-tools-api-v2#60-tools-api-refactor", "@fastify/cors": "^11.2.0", + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/platform-fastify": "^11.0.0", "ajv-formats": "^3.0.1", "fastify": "^5.8.5", - "fastify-openapi-glue": "^4.11.3", - "fastify-plugin": "^6.0.0" + "js-yaml": "^4.2.0", + "openapi-backend": "^5.17.0", + "reflect-metadata": "^0.2.2", + "rxjs": "^7.8.1" }, "devDependencies": { "@biomejs/biome": "^2.4.16", - "@types/js-yaml": "^4.0.9", "@types/node": "^25.9.2", - "js-yaml": "^4.2.0", - "pino-pretty": "^13.1.3", "tsx": "^4.22.4", "typescript": "^6.0.3", "vite": "^8.0.16", "vitest": "^4.1.8" } }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "11.9.3", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.3.tgz", + "integrity": "sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==", + "license": "MIT", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, "node_modules/@apiture/openapi-down-convert": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/@apiture/openapi-down-convert/-/openapi-down-convert-0.14.2.tgz", @@ -271,6 +290,16 @@ "node": ">=14.21.3" } }, + "node_modules/@borewit/text-codec": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.2.tgz", + "integrity": "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/@developer-overheid-nl/adr-rulesets": { "version": "0.1.0", "resolved": "git+ssh://git@github.com/developer-overheid-nl/adr-rulesets.git#da1327dfcc83ed130b1fe5aaa282b7bfba537aee", @@ -887,6 +916,42 @@ "fast-json-stringify": "^6.0.0" } }, + "node_modules/@fastify/formbody": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@fastify/formbody/-/formbody-8.0.2.tgz", + "integrity": "sha512-84v5J2KrkXzjgBpYnaNRPqwgMsmY7ZDjuj0YVuMR3NXCJRCgKEZy/taSP1wUYGn0onfxJpLyRGDLa+NMaDJtnA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "fast-querystring": "^1.1.2", + "fastify-plugin": "^5.0.0" + } + }, + "node_modules/@fastify/formbody/node_modules/fastify-plugin": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz", + "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, "node_modules/@fastify/forwarded": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@fastify/forwarded/-/forwarded-3.0.1.tgz", @@ -967,6 +1032,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "license": "MIT" + }, "node_modules/@jsep-plugin/assignment": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz", @@ -1003,6 +1074,15 @@ "jsep": "^0.4.0||^1.0.0" } }, + "node_modules/@lukeed/csprng": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", + "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/@napi-rs/wasm-runtime": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", @@ -1022,6 +1102,146 @@ "@emnapi/runtime": "^1.7.1" } }, + "node_modules/@nestjs/common": { + "version": "11.1.26", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.26.tgz", + "integrity": "sha512-0VARQyzuGbprvjO+slWq9Jtj1P0jYCSKAUSv9LWFNWD39ZbDzXXM1pMs35kReVXwchra0urMfTQxw4uAOfdSzA==", + "license": "MIT", + "dependencies": { + "file-type": "21.3.4", + "iterare": "1.2.1", + "load-esm": "1.0.3", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "class-transformer": ">=0.4.1", + "class-validator": ">=0.13.2", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/common/node_modules/file-type": { + "version": "21.3.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.4.tgz", + "integrity": "sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==", + "license": "MIT", + "dependencies": { + "@tokenizer/inflate": "^0.4.1", + "strtok3": "^10.3.4", + "token-types": "^6.1.1", + "uint8array-extras": "^1.4.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/@nestjs/core": { + "version": "11.1.26", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.26.tgz", + "integrity": "sha512-K45zUwYpowEsVqm8qNIzsMcl4LJev0MK9zVhDnmym7YRTJ2/caslqVeKYhPRd5+Fh81IkvWUVu6vEo46uZ5mgQ==", + "license": "MIT", + "dependencies": { + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "path-to-regexp": "8.4.2", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "engines": { + "node": ">= 20" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0", + "@nestjs/websockets": "^11.0.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true + } + } + }, + "node_modules/@nestjs/platform-fastify": { + "version": "11.1.26", + "resolved": "https://registry.npmjs.org/@nestjs/platform-fastify/-/platform-fastify-11.1.26.tgz", + "integrity": "sha512-x7O39mdfgTzq43YRB1H+CkZX34q3joahnmpHmobmYSiQeRjsEa3beBDMsT1IAz/aH91N33p+nUvjxiD3FH6mOQ==", + "license": "MIT", + "dependencies": { + "@fastify/cors": "11.2.0", + "@fastify/formbody": "8.0.2", + "fast-querystring": "1.1.2", + "fastify": "5.8.5", + "fastify-plugin": "5.1.0", + "find-my-way": "9.6.0", + "light-my-request": "6.6.0", + "path-to-regexp": "8.4.2", + "reusify": "1.1.0", + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@fastify/static": "^8.0.0 || ^9.0.0", + "@fastify/view": "^10.0.0 || ^11.0.0", + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0" + }, + "peerDependenciesMeta": { + "@fastify/static": { + "optional": true + }, + "@fastify/view": { + "optional": true + } + } + }, + "node_modules/@nestjs/platform-fastify/node_modules/fastify-plugin": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz", + "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, "node_modules/@noble/hashes": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", @@ -1476,22 +1696,6 @@ "node": ">=22" } }, - "node_modules/@seriousme/openapi-schema-validator": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@seriousme/openapi-schema-validator/-/openapi-schema-validator-2.9.0.tgz", - "integrity": "sha512-bP/48Il7RMxhohq36Vg0c25tnCKOO+oEv8XSxDefuUBj0W8fYzL2Yb6C8tji0WBXykZ1S/79AWbrzGLfCG2dYw==", - "license": "MIT", - "dependencies": { - "ajv": "^8.18.0", - "ajv-draft-04": "^1.0.0", - "ajv-formats": "^3.0.1", - "yaml": "^2.8.3" - }, - "bin": { - "bundle-api": "bin/bundle-api-cli.js", - "validate-api": "bin/validate-api-cli.js" - } - }, "node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", @@ -1851,6 +2055,29 @@ "node": "^12.20 || >=14.13" } }, + "node_modules/@tokenizer/inflate": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", + "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "token-types": "^6.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "license": "MIT" + }, "node_modules/@tybys/wasm-util": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", @@ -1896,13 +2123,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/js-yaml": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", - "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", - "dev": true, - "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", @@ -2274,6 +2494,12 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, + "node_modules/bath-es5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/bath-es5/-/bath-es5-3.0.3.tgz", + "integrity": "sha512-PdCioDToH3t84lP40kUFCKWCOCH389Dl1kbC8FGoqOwamxsmqxxnJSXdkTOsPoNHXjem4+sJ+bbNoQm5zeCqxg==", + "license": "MIT" + }, "node_modules/better-ajv-errors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/better-ajv-errors/-/better-ajv-errors-2.0.3.tgz", @@ -2484,6 +2710,19 @@ "dev": true, "license": "MIT" }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -2541,14 +2780,21 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dateformat": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", - "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", - "dev": true, + "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": "*" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/define-data-property": { @@ -2603,6 +2849,12 @@ "node": ">=6" } }, + "node_modules/dereference-json-schema": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dereference-json-schema/-/dereference-json-schema-0.2.2.tgz", + "integrity": "sha512-w8dUsJyrzH4Zsj8W/tKcjLsmcTKXfdNf+n3BBm1SAfnqpaCodgEUWqQGJ+pNb9NOqPwYMGvUnZZ8nQfeFjJlbQ==", + "license": "MIT" + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -2633,16 +2885,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/es-abstract": { "version": "1.24.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", @@ -2897,13 +3139,6 @@ "node": ">=16.9.0" } }, - "node_modules/fast-copy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-4.0.3.tgz", - "integrity": "sha512-58apWr0GUiDFM8+3afrO6eYwJBn9ZAhDOzG3L+/9llab/haCARS2UIfffmOurYLwbgDRs8n0rfr6qAAPEAuAQw==", - "dev": true, - "license": "MIT" - }, "node_modules/fast-decode-uri-component": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", @@ -3048,55 +3283,6 @@ "toad-cache": "^3.7.0" } }, - "node_modules/fastify-openapi-glue": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/fastify-openapi-glue/-/fastify-openapi-glue-4.11.3.tgz", - "integrity": "sha512-LgxS6u7U2f0gAY4QhvxZj0o2NEIl5KQeTy77iFFTXLnHZ12LiVmQvy+x3lutA+ZoWcxxl98S66J/2/RXKw+hfg==", - "license": "MIT", - "dependencies": { - "@seriousme/openapi-schema-validator": "^2.9.0", - "fastify-plugin": "^5.1.0", - "yaml": "^2.9.0" - }, - "bin": { - "openapi-glue": "bin/openapi-glue-cli.js" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/fastify-openapi-glue/node_modules/fastify-plugin": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz", - "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" - }, - "node_modules/fastify-plugin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-6.0.0.tgz", - "integrity": "sha512-fZOty7z3O7vOliF6d8bHE3wiEh1KcNnKEQensSgTk9C1DvN6nRLS++XVd86v33Hw/8u9Un8A1zDrQ8ujcQDHEg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" - }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", @@ -3417,13 +3603,6 @@ "node": ">= 0.4" } }, - "node_modules/help-me": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", - "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", - "dev": true, - "license": "MIT" - }, "node_modules/http-reasons": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", @@ -3448,6 +3627,26 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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": "BSD-3-Clause" + }, "node_modules/immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", @@ -3821,14 +4020,13 @@ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT" }, - "node_modules/joycon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - "dev": true, - "license": "MIT", + "node_modules/iterare": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", + "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", + "license": "ISC", "engines": { - "node": ">=10" + "node": ">=6" } }, "node_modules/js-levenshtein": { @@ -4041,19 +4239,6 @@ "set-cookie-parser": "^2.6.0" } }, - "node_modules/light-my-request/node_modules/cookie": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/light-my-request/node_modules/process-warning": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", @@ -4352,12 +4537,37 @@ "node": ">=4" } }, + "node_modules/load-esm": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.3.tgz", + "integrity": "sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + }, + { + "type": "buymeacoffee", + "url": "https://buymeacoffee.com/borewit" + } + ], + "license": "MIT", + "engines": { + "node": ">=13.2.0" + } + }, "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.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", @@ -4416,16 +4626,21 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, + "node_modules/mock-json-schema": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/mock-json-schema/-/mock-json-schema-1.1.2.tgz", + "integrity": "sha512-3IyduYlhfzPy+nFN8wxUjloUi1hM7l8lN5LITuauUNMQltynJIOfLf/DADwTAp2d6kvSBtWojly1EuxX5B0WkA==", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "lodash": "^4.17.21" } }, + "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/nanoid": { "version": "3.3.12", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", @@ -4674,14 +4889,28 @@ "node": ">=14.0.0" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", + "node_modules/openapi-backend": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/openapi-backend/-/openapi-backend-5.17.0.tgz", + "integrity": "sha512-wyimPBoz/Gx+pqh4QwvMQRIJiZQHZkLdiyFXwfjiLwS5Jhbm7gCI+T0WTXmx7HXAYXL5Cr+016dR3CV3T/dPmQ==", + "license": "MIT", "dependencies": { - "wrappy": "1" + "@apidevtools/json-schema-ref-parser": "^11.1.0", + "ajv": "^8.6.2", + "bath-es5": "^3.0.3", + "cookie": "^1.0.1", + "dereference-json-schema": "^0.2.1", + "lodash": "^4.17.15", + "mock-json-schema": "^1.0.7", + "openapi-schema-validator": "^12.0.0", + "openapi-types": "^12.0.2", + "qs": "^6.15.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/anttiviljami" } }, "node_modules/openapi-sampler": { @@ -4695,6 +4924,35 @@ "json-pointer": "0.6.2" } }, + "node_modules/openapi-schema-validator": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-schema-validator/-/openapi-schema-validator-12.1.3.tgz", + "integrity": "sha512-xTHOmxU/VQGUgo7Cm0jhwbklOKobXby+/237EG967+3TQEYJztMgX9Q5UE2taZKwyKPUq0j11dngpGjUuxz1hQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.1.0", + "ajv-formats": "^2.0.2", + "lodash.merge": "^4.6.1", + "openapi-types": "^12.1.3" + } + }, + "node_modules/openapi-schema-validator/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": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/openapi-to-postmanv2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/openapi-to-postmanv2/-/openapi-to-postmanv2-6.1.0.tgz", @@ -4806,6 +5064,16 @@ "node": ">=14.0.0" } }, + "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", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -4862,31 +5130,6 @@ "split2": "^4.0.0" } }, - "node_modules/pino-pretty": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-13.1.3.tgz", - "integrity": "sha512-ttXRkkOz6WWC95KeY9+xxWL6AtImwbyMHrL1mSwqwW9u+vLp/WIElvHvCSDg0xO/Dzrggz1zv3rN5ovTRVowKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "colorette": "^2.0.7", - "dateformat": "^4.6.3", - "fast-copy": "^4.0.0", - "fast-safe-stringify": "^2.1.1", - "help-me": "^5.0.0", - "joycon": "^3.1.1", - "minimist": "^1.2.6", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^3.0.0", - "pump": "^3.0.0", - "secure-json-parse": "^4.0.0", - "sonic-boom": "^4.0.1", - "strip-json-comments": "^5.0.2" - }, - "bin": { - "pino-pretty": "bin.js" - } - }, "node_modules/pino-std-serializers": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", @@ -5024,17 +5267,6 @@ ], "license": "MIT" }, - "node_modules/pump": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", - "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -5044,6 +5276,21 @@ "node": ">=6" } }, + "node_modules/qs": { + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/quick-format-unescaped": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", @@ -5074,6 +5321,12 @@ "node": ">= 12.13.0" } }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -5202,6 +5455,15 @@ "@rolldown/binding-win32-x64-msvc": "1.0.3" } }, + "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", @@ -5675,19 +5937,6 @@ "node": ">=8" } }, - "node_modules/strip-json-comments": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.3.tgz", - "integrity": "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/strnum": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.0.tgz", @@ -5703,6 +5952,22 @@ "anynum": "^1.0.0" } }, + "node_modules/strtok3": { + "version": "10.3.5", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.5.tgz", + "integrity": "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==", + "license": "MIT", + "dependencies": { + "@tokenizer/token": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -5813,6 +6078,24 @@ "node": ">=20" } }, + "node_modules/token-types": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz", + "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==", + "license": "MIT", + "dependencies": { + "@borewit/text-codec": "^0.2.1", + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -5938,6 +6221,30 @@ "node": ">=14.17" } }, + "node_modules/uid": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", + "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", + "license": "MIT", + "dependencies": { + "@lukeed/csprng": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/uint8array-extras": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", + "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", @@ -6338,13 +6645,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, "node_modules/xml-naming": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", diff --git a/package.json b/package.json index 6dfd6fb..648fa39 100644 --- a/package.json +++ b/package.json @@ -2,13 +2,14 @@ "name": "tools-api-v1", "version": "1.0.0", "description": "API van het Tools (apis.developer.overheid.nl)", - "type": "module", - "main": "dist/server.js", + "main": "dist/index.js", "scripts": { - "dev": "tsx watch --env-file=.env src/server.ts", + "init-install": "npm install", + "dev": "tsx watch --env-file=.env index.ts", + "dev-mock": "OPENAPI_MOCK=true npm run dev", "prebuild": "rm -rf dist", "build": "tsc", - "start": "node --env-file-if-exists=.env dist/server.js", + "start": "node --env-file-if-exists=.env dist/index.js", "test": "vitest run", "lint": "biome lint .", "format": "biome format --write .", @@ -19,17 +20,19 @@ "dependencies": { "@developer-overheid-nl/don-tools-logic": "github:developer-overheid-nl/don-tools-api-v2#60-tools-api-refactor", "@fastify/cors": "^11.2.0", + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/platform-fastify": "^11.0.0", "ajv-formats": "^3.0.1", "fastify": "^5.8.5", - "fastify-openapi-glue": "^4.11.3", - "fastify-plugin": "^6.0.0" + "js-yaml": "^4.2.0", + "openapi-backend": "^5.17.0", + "reflect-metadata": "^0.2.2", + "rxjs": "^7.8.1" }, "devDependencies": { "@biomejs/biome": "^2.4.16", - "@types/js-yaml": "^4.0.9", "@types/node": "^25.9.2", - "js-yaml": "^4.2.0", - "pino-pretty": "^13.1.3", "tsx": "^4.22.4", "typescript": "^6.0.3", "vite": "^8.0.16", diff --git a/src/app.ts b/src/app.ts deleted file mode 100644 index 1f2b1c3..0000000 --- a/src/app.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { readFile } from "node:fs/promises"; -import { fileURLToPath } from "node:url"; -import { dirname, join } from "node:path"; -import Fastify, { type FastifyInstance } from "fastify"; -import cors from "@fastify/cors"; -import addFormats from "ajv-formats"; -import openapiGlue from "fastify-openapi-glue"; -import { config } from "./config.js"; -import { errorHandlerPlugin } from "./plugins/error-handler.js"; -import { Routes } from "./routes.js"; -import { toLowerCamelCase } from "./utils/operation-id.js"; - -export interface BuildOptions { - loggerEnabled?: boolean; -} - -const here = dirname(fileURLToPath(import.meta.url)); -const rootDir = join(here, ".."); -const openapiSpecPath = join(rootDir, "api", "openapi.json"); - -export const buildApp = async (options: BuildOptions = {}): Promise => { - const app = Fastify({ - logger: - options.loggerEnabled === false - ? false - : { - level: config.logLevel, - transport: - config.nodeEnv === "production" - ? undefined - : { - target: "pino-pretty", - options: { translateTime: "HH:MM:ss.l", ignore: "pid,hostname" }, - }, - }, - bodyLimit: 14 * 1024 * 1024, - ajv: { - customOptions: { strict: false, allErrors: true }, - // biome-ignore lint/suspicious/noExplicitAny: ajv-formats default-export typing - plugins: [[(addFormats as any).default ?? addFormats, { mode: "fast" }]], - }, - }); - - const specRaw = await readFile(openapiSpecPath, "utf8"); - const spec = JSON.parse(specRaw) as { info: { version: string } }; - const apiVersion = spec.info.version; - - app.addContentTypeParser(["text/markdown", "text/plain"], { parseAs: "string" }, (_request, body, done) => { - done(null, body); - }); - - app.addHook("onSend", async (_request, reply) => { - if (!reply.getHeader("API-Version")) reply.header("API-Version", apiVersion); - }); - - await app.register(cors); - await app.register(errorHandlerPlugin); - - app.get("/v1/openapi.json", async () => spec); - - const handlers = new Routes() as unknown as Record; - - await app.register(openapiGlue, { - specification: spec, - operationResolver: ((operationId: string) => { - const handler = handlers[toLowerCamelCase(operationId)]; - return typeof handler === "function" ? handler : undefined; - }) as unknown as NonNullable[1]>["operationResolver"], - prefix: "", - }); - - return app; -}; diff --git a/src/config.ts b/src/config.ts deleted file mode 100644 index 6e2eea9..0000000 --- a/src/config.ts +++ /dev/null @@ -1,12 +0,0 @@ -export const parseInt10 = (value: string | undefined, fallback: number): number => { - if (!value) return fallback; - const parsed = Number.parseInt(value, 10); - return Number.isFinite(parsed) ? parsed : fallback; -}; - -export const config = { - port: parseInt10(process.env.PORT, 1338), - host: process.env.HOST ?? "0.0.0.0", - logLevel: process.env.LOG_LEVEL ?? "info", - nodeEnv: process.env.NODE_ENV ?? "development", -} as const; diff --git a/src/plugins/error-handler.ts b/src/plugins/error-handler.ts deleted file mode 100644 index e855149..0000000 --- a/src/plugins/error-handler.ts +++ /dev/null @@ -1,79 +0,0 @@ -import fp from "fastify-plugin"; -import type { FastifyInstance } from "fastify"; -import { HttpError, statusText, toProblemDetails, type Problem } from "@developer-overheid-nl/don-tools-logic"; - -interface FastifyValidationEntry { - instancePath?: string; - message?: string; - params?: { missingProperty?: string }; -} - -interface FastifyErrorLike { - message?: string; - statusCode?: number; - validation?: FastifyValidationEntry[]; -} - -const ajvEntryToPointer = (entry: FastifyValidationEntry): string => { - const missing = entry.params?.missingProperty; - const base = entry.instancePath ?? ""; - if (missing) return `#${base}/${missing}`; - return `#${base}`; -}; - -export const errorHandlerPlugin = fp(async (app: FastifyInstance) => { - app.setErrorHandler((rawError, request, reply) => { - const instance = request.url; - - if (rawError instanceof HttpError) { - const problem = toProblemDetails(rawError, instance); - reply.status(problem.status).type("application/problem+json").send(problem); - return; - } - - const error = rawError as FastifyErrorLike; - - if (Array.isArray(error.validation)) { - const problem: Problem = { - type: "https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/400", - title: statusText(400), - status: 400, - detail: error.message ?? "Validation failed", - instance, - errors: error.validation.map((entry) => ({ - detail: entry.message ?? "validation failed", - pointer: ajvEntryToPointer(entry), - })), - }; - reply.status(400).type("application/problem+json").send(problem); - return; - } - - const status = typeof error.statusCode === "number" && error.statusCode >= 400 ? error.statusCode : 500; - const problem: Problem = { - type: `https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/${status}`, - title: statusText(status), - status, - detail: error.message ?? statusText(status), - instance, - }; - - if (status >= 500) request.log.error({ err: rawError }, "request failed"); - else request.log.warn({ err: rawError }, "request rejected"); - - reply.status(status).type("application/problem+json").send(problem); - }); - - app.setNotFoundHandler((request, reply) => { - reply - .status(404) - .type("application/problem+json") - .send({ - type: "https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/404", - title: statusText(404), - status: 404, - detail: `Route ${request.method} ${request.url} not found`, - instance: request.url, - }); - }); -}); diff --git a/src/routes.ts b/src/routes.ts deleted file mode 100644 index ea3b42e..0000000 --- a/src/routes.ts +++ /dev/null @@ -1,63 +0,0 @@ -import type { FastifyReply, FastifyRequest } from "fastify"; -import { - arazzoMarkdown, - arazzoMermaid, - bundleOAS, - convertOAS, - createPostmanCollection, - generateOAS, - untrustedClient, - validatorOpenAPIPost, - type OasInput, - type UntrustedClientInput, - type ValidateInput, -} from "@developer-overheid-nl/don-tools-logic"; - -type OasRequest = FastifyRequest<{ Body: OasInput }>; -type ValidateRequest = FastifyRequest<{ Body: ValidateInput }>; -type UntrustedClientRequest = FastifyRequest<{ Body: UntrustedClientInput }>; - -const sendBuffer = (reply: FastifyReply, headers: Record, buffer: Buffer) => { - for (const [name, value] of Object.entries(headers)) reply.header(name, value); - return reply.send(buffer); -}; - -export class Routes { - arazzoMarkdown = async (request: OasRequest, reply: FastifyReply) => { - const markdown = await arazzoMarkdown(request.body); - reply.header("Content-Type", "text/markdown; charset=utf-8"); - return reply.send(markdown); - }; - - arazzoMermaid = async (request: OasRequest, reply: FastifyReply) => { - const mermaid = await arazzoMermaid(request.body); - reply.header("Content-Type", "text/plain; charset=utf-8"); - return reply.send(mermaid); - }; - - bundleOAS = async (request: OasRequest, reply: FastifyReply) => { - const result = await bundleOAS(request.body); - return sendBuffer(reply, result.headers, result.rawBody); - }; - - convertOAS = async (request: OasRequest, reply: FastifyReply) => { - const result = await convertOAS(request.body); - return sendBuffer(reply, result.headers, result.rawBody); - }; - - createPostmanCollection = async (request: OasRequest, reply: FastifyReply) => { - const result = await createPostmanCollection(request.body); - return sendBuffer(reply, result.headers, result.rawBody); - }; - - generateOAS = async (request: OasRequest, reply: FastifyReply) => { - const result = await generateOAS(request.body); - return sendBuffer(reply, result.headers, result.rawBody); - }; - - untrustClient = async (request: UntrustedClientRequest, reply: FastifyReply) => - reply.send(await untrustedClient(request.body)); - - validatorOpenAPIPost = async (request: ValidateRequest, reply: FastifyReply) => - reply.send(await validatorOpenAPIPost(request.body)); -} diff --git a/src/server.ts b/src/server.ts deleted file mode 100644 index 5d67463..0000000 --- a/src/server.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { buildApp } from "./app.js"; -import { config } from "./config.js"; - -const start = async () => { - const app = await buildApp(); - try { - await app.listen({ port: config.port, host: config.host }); - } catch (error) { - app.log.error({ err: error }, "failed to start server"); - process.exit(1); - } - - const shutdown = async (signal: string) => { - app.log.info(`Received ${signal}, shutting down`); - try { - await app.close(); - process.exit(0); - } catch (error) { - app.log.error({ err: error }, "error during shutdown"); - process.exit(1); - } - }; - - process.on("SIGTERM", () => void shutdown("SIGTERM")); - process.on("SIGINT", () => void shutdown("SIGINT")); -}; - -start(); diff --git a/src/utils/operation-id.ts b/src/utils/operation-id.ts deleted file mode 100644 index 314b028..0000000 --- a/src/utils/operation-id.ts +++ /dev/null @@ -1,13 +0,0 @@ -export const toLowerCamelCase = (operationId: string): string => { - const normalized = operationId - .trim() - .replace(/[_-]+/g, " ") - .replace(/[^a-zA-Z0-9_$]+/g, " ") - .split(" ") - .filter(Boolean) - .map((segment, index) => (index === 0 ? segment : segment.charAt(0).toUpperCase() + segment.slice(1))) - .join("") - .replace(/^[^a-zA-Z_$]+/, ""); - - return normalized ? normalized.charAt(0).toLowerCase() + normalized.slice(1) : operationId; -}; diff --git a/test/app.test.ts b/test/app.test.ts index 74403f1..186f8c2 100644 --- a/test/app.test.ts +++ b/test/app.test.ts @@ -1,40 +1,43 @@ import { afterAll, beforeAll, describe, expect, it } from "vitest"; -import type { FastifyInstance } from "fastify"; -import { buildApp } from "../src/app.js"; +import type { NestFastifyApplication } from "@nestjs/platform-fastify"; +import { createApp } from "../index.ts"; -let app: FastifyInstance; +let app: NestFastifyApplication; beforeAll(async () => { - app = await buildApp({ loggerEnabled: false }); - await app.ready(); + app = await createApp(); + await app.init(); }); afterAll(async () => { await app.close(); }); +const inject = async (options: { method: string; url: string; payload?: unknown }) => + app.getHttpAdapter().getInstance().inject(options); + describe("app", () => { it("serves the OpenAPI spec", async () => { - const response = await app.inject({ method: "GET", url: "/v1/openapi.json" }); + const response = await inject({ method: "GET", url: "/openapi.json" }); expect(response.statusCode).toBe(200); const body = response.json() as { info: { title: string } }; expect(body.info.title).toBe("Tools API v1"); }); it("returns API-Version header", async () => { - const response = await app.inject({ method: "GET", url: "/v1/openapi.json" }); + const response = await inject({ method: "GET", url: "/openapi.json" }); expect(response.headers["api-version"]).toBe("1.0.0"); }); it("returns problem+json on unknown route", async () => { - const response = await app.inject({ method: "GET", url: "/no-such-route" }); + const response = await inject({ method: "GET", url: "/no-such-route" }); expect(response.statusCode).toBe(404); expect(response.headers["content-type"]).toContain("application/problem+json"); - expect(response.json()).toMatchObject({ status: 404, title: "Not Found" }); + expect(response.json()).toMatchObject({ status: 404, title: "Cannot GET /no-such-route" }); }); it("returns problem+json on validation failure", async () => { - const response = await app.inject({ + const response = await inject({ method: "POST", url: "/v1/oas/validate", payload: {}, @@ -44,7 +47,7 @@ describe("app", () => { }); it("converts OpenAPI through the logic package", async () => { - const response = await app.inject({ + const response = await inject({ method: "POST", url: "/v1/oas/convert", payload: { diff --git a/tools-api.service.ts b/tools-api.service.ts new file mode 100644 index 0000000..407a81e --- /dev/null +++ b/tools-api.service.ts @@ -0,0 +1,74 @@ +import { BadRequestException, Injectable } from "@nestjs/common"; +import type { FastifyReply } from "fastify"; +import type { OasInput, UntrustedClientInput, ValidateInput } from "@developer-overheid-nl/don-tools-logic"; +import { ToolsApi } from "./api"; +import type { ModelsKeycloakClientResult, ModelsLintResult } from "./models"; + +const setHeaders = (reply: FastifyReply, headers: Record) => { + for (const [name, value] of Object.entries(headers)) reply.header(name, value); +}; + +const importEsm = new Function("specifier", "return import(specifier)") as (specifier: string) => Promise; +const loadLogic = () => + import("@developer-overheid-nl/don-tools-logic").catch(() => + importEsm("@developer-overheid-nl/don-tools-logic"), + ); + +const asBadRequest = async (operation: () => Promise): Promise => { + try { + return await operation(); + } catch (error) { + throw new BadRequestException(error instanceof Error ? error.message : "Request validation failed"); + } +}; + +@Injectable() +export class ToolsApiService extends ToolsApi { + async arazzoMarkdown(oasInput: OasInput | undefined, _request: Request, reply: FastifyReply): Promise { + const { arazzoMarkdown } = await loadLogic(); + reply.type("text/markdown; charset=utf-8"); + return asBadRequest(() => arazzoMarkdown(oasInput as OasInput)); + } + + async arazzoMermaid(oasInput: OasInput | undefined, _request: Request, reply: FastifyReply): Promise { + const { arazzoMermaid } = await loadLogic(); + reply.type("text/plain; charset=utf-8"); + return asBadRequest(() => arazzoMermaid(oasInput as OasInput)); + } + + async bundleOAS(oasInput: OasInput | undefined, _request: Request, reply: FastifyReply): Promise { + const { bundleOAS } = await loadLogic(); + const result = await asBadRequest(() => bundleOAS(oasInput as OasInput)); + setHeaders(reply, result.headers); + return result.rawBody as unknown as void; + } + + async convertOAS(oasInput: OasInput | undefined, _request: Request, reply: FastifyReply): Promise { + const { convertOAS } = await loadLogic(); + const result = await asBadRequest(() => convertOAS(oasInput as OasInput)); + setHeaders(reply, result.headers); + return result.rawBody as unknown as void; + } + + async createPostmanCollection(oasInput: OasInput | undefined, _request: Request, reply: FastifyReply): Promise { + const { createPostmanCollection } = await loadLogic(); + const result = await asBadRequest(() => createPostmanCollection(oasInput as OasInput)); + setHeaders(reply, result.headers); + return result.rawBody as unknown as void; + } + + async generateOAS(oasInput: OasInput | undefined): Promise { + const { generateOAS } = await loadLogic(); + return asBadRequest(() => generateOAS(oasInput as OasInput)); + } + + async untrustClient(untrustClientInput: UntrustedClientInput | undefined): Promise { + const { untrustedClient } = await loadLogic(); + return asBadRequest(() => untrustedClient(untrustClientInput as UntrustedClientInput)) as Promise; + } + + async validatorOpenAPIPost(oasInput: OasInput | undefined): Promise { + const { validatorOpenAPIPost } = await loadLogic(); + return asBadRequest(() => validatorOpenAPIPost(oasInput as ValidateInput)) as Promise; + } +} diff --git a/tsconfig.json b/tsconfig.json index ca4bd6d..6aaf8ba 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,22 +1,31 @@ { "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, "target": "ES2023", - "module": "NodeNext", - "moduleResolution": "NodeNext", - "lib": ["ES2023"], + "sourceMap": true, "outDir": "./dist", - "rootDir": "./src", - "strict": true, - "noUncheckedIndexedAccess": true, - "esModuleInterop": true, - "resolveJsonModule": true, + "incremental": true, "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "sourceMap": true, - "removeComments": false, - "isolatedModules": true, - "verbatimModuleSyntax": true + "strictNullChecks": true, + "noImplicitAny": false, + "strictBindCallApply": false, + "noFallthroughCasesInSwitch": false }, - "include": ["src/**/*.ts", "src/**/*.d.ts"], - "exclude": ["node_modules", "dist", "test"] + "include": [ + "api/**/*.ts", + "controllers/**/*.ts", + "decorators/**/*.ts", + "models/**/*.ts", + "api-implementations.ts", + "api.module.ts", + "index.ts", + "tools-api.service.ts" + ], + "exclude": ["node_modules", "dist", "src", "test"] } From 1a97cd3b86d8566fa9c0f96ed2476b3b7d34cff9 Mon Sep 17 00:00:00 2001 From: pasibun Date: Fri, 12 Jun 2026 11:36:37 +0200 Subject: [PATCH 05/27] feat: update OpenAPI specification and implement Tools API - Changed the base URL in the OpenAPI specification from `https://api.don.projects.digilab.network/tools/v1` to `https://api.don.apps.digilab.network/tools/v1`. - Added custom operation handlers for various endpoints in the OpenAPI specification. - Introduced `api-implementations.ts` to define API implementations. - Created `api.module.ts` to manage dynamic module configuration for API implementations. - Implemented `ToolsApiService` to handle business logic for the Tools API. - Updated `ToolsApiController` to remove unnecessary HTTP code decorators. - Adjusted the main entry point in `package.json` and `tsconfig.json` to reflect the new structure. - Added tests to ensure the application works as expected with the new structure. --- Dockerfile | 5 +-- api/openapi.json | 35 ++++++++++++------- api/openapi.yaml | 35 ++++++++++++------- .../api-implementations.ts | 2 +- api.module.ts => app/api.module.ts | 4 +-- index.ts => app/index.ts | 11 ++++-- controllers/ToolsApi.controller.ts | 10 +----- .../tools-api.service.ts | 4 +-- package.json | 6 ++-- test/app.test.ts | 2 +- tsconfig.json | 6 ++-- 11 files changed, 70 insertions(+), 50 deletions(-) rename api-implementations.ts => app/api-implementations.ts (84%) rename api.module.ts => app/api.module.ts (95%) rename index.ts => app/index.ts (97%) rename tools-api.service.ts => implementation/tools-api.service.ts (98%) diff --git a/Dockerfile b/Dockerfile index 21f887f..a74306c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,8 @@ COPY api ./api COPY controllers ./controllers COPY decorators ./decorators COPY models ./models -COPY api-implementations.ts api.module.ts index.ts tools-api.service.ts ./ +COPY implementation ./implementation +COPY app ./app RUN npm run build FROM node:22-alpine AS runtime @@ -20,4 +21,4 @@ COPY api ./api EXPOSE 1338 -CMD ["node", "dist/index.js"] +CMD ["node", "dist/app/index.js"] diff --git a/api/openapi.json b/api/openapi.json index 82929a7..0f2e2f7 100644 --- a/api/openapi.json +++ b/api/openapi.json @@ -17,7 +17,7 @@ }, { "description": "Test", - "url": "https://api.don.projects.digilab.network/tools/v1" + "url": "https://api.don.apps.digilab.network/tools/v1" } ], "tags": [ @@ -78,7 +78,8 @@ "summary": "Arazzo Markdown (POST)", "tags": [ "Tools" - ] + ], + "x-eov-operation-handler": "controllers/ToolsController" } }, "/v1/arazzo/mermaid": { @@ -128,7 +129,8 @@ "summary": "Arazzo Mermaid (POST)", "tags": [ "Tools" - ] + ], + "x-eov-operation-handler": "controllers/ToolsController" } }, "/v1/auth/clients": { @@ -178,13 +180,14 @@ "summary": "Maak client (POST)", "tags": [ "Tools" - ] + ], + "x-eov-operation-handler": "controllers/ToolsController" } }, "/v1/oas/convert": { "post": { "description": "Converteert OpenAPI naar de laatst ondersteunde versie (standaard 3.1). Meegegeven targetVersion (3.0 of 3.1) bepaalt het doel. Body: { oasUrl } of { oasBody } (stringified JSON of YAML).", - "operationId": "ConvertOAS", + "operationId": "convertOAS", "requestBody": { "content": { "application/json": { @@ -221,7 +224,9 @@ "summary": "Converteer OpenAPI 3.0/3.1", "tags": [ "Tools" - ] + ], + "x-eov-operation-handler": "controllers/ToolsController", + "x-original-operationId": "ConvertOAS" } }, "/v1/oas/bundle": { @@ -264,13 +269,14 @@ "summary": "Bundle OpenAPI", "tags": [ "Tools" - ] + ], + "x-eov-operation-handler": "controllers/ToolsController" } }, "/v1/oas/generate": { "post": { "description": "Genereert een boilerplate OpenAPI specificatie op basis van JSON-invoer. Body: { oasUrl } of { oasBody } (stringified JSON).", - "operationId": "GenerateOAS", + "operationId": "generateOAS", "requestBody": { "content": { "application/json": { @@ -314,7 +320,9 @@ "summary": "Generate OpenAPI", "tags": [ "Tools" - ] + ], + "x-eov-operation-handler": "controllers/ToolsController", + "x-original-operationId": "GenerateOAS" } }, "/v1/oas/validate": { @@ -364,13 +372,14 @@ "summary": "Validate OpenAPI (POST)", "tags": [ "Tools" - ] + ], + "x-eov-operation-handler": "controllers/ToolsController" } }, "/v1/oas/postman": { "post": { "description": "Converteert OpenAPI naar Postman Collection JSON. Body: { oasUrl } of { oasBody } (stringified JSON of YAML).", - "operationId": "CreatePostmanCollection", + "operationId": "createPostmanCollection", "requestBody": { "content": { "application/json": { @@ -407,7 +416,9 @@ "summary": "Maak Postman-collectie (POST)", "tags": [ "Tools" - ] + ], + "x-eov-operation-handler": "controllers/ToolsController", + "x-original-operationId": "CreatePostmanCollection" } } }, diff --git a/api/openapi.yaml b/api/openapi.yaml index 82929a7..0f2e2f7 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -17,7 +17,7 @@ }, { "description": "Test", - "url": "https://api.don.projects.digilab.network/tools/v1" + "url": "https://api.don.apps.digilab.network/tools/v1" } ], "tags": [ @@ -78,7 +78,8 @@ "summary": "Arazzo Markdown (POST)", "tags": [ "Tools" - ] + ], + "x-eov-operation-handler": "controllers/ToolsController" } }, "/v1/arazzo/mermaid": { @@ -128,7 +129,8 @@ "summary": "Arazzo Mermaid (POST)", "tags": [ "Tools" - ] + ], + "x-eov-operation-handler": "controllers/ToolsController" } }, "/v1/auth/clients": { @@ -178,13 +180,14 @@ "summary": "Maak client (POST)", "tags": [ "Tools" - ] + ], + "x-eov-operation-handler": "controllers/ToolsController" } }, "/v1/oas/convert": { "post": { "description": "Converteert OpenAPI naar de laatst ondersteunde versie (standaard 3.1). Meegegeven targetVersion (3.0 of 3.1) bepaalt het doel. Body: { oasUrl } of { oasBody } (stringified JSON of YAML).", - "operationId": "ConvertOAS", + "operationId": "convertOAS", "requestBody": { "content": { "application/json": { @@ -221,7 +224,9 @@ "summary": "Converteer OpenAPI 3.0/3.1", "tags": [ "Tools" - ] + ], + "x-eov-operation-handler": "controllers/ToolsController", + "x-original-operationId": "ConvertOAS" } }, "/v1/oas/bundle": { @@ -264,13 +269,14 @@ "summary": "Bundle OpenAPI", "tags": [ "Tools" - ] + ], + "x-eov-operation-handler": "controllers/ToolsController" } }, "/v1/oas/generate": { "post": { "description": "Genereert een boilerplate OpenAPI specificatie op basis van JSON-invoer. Body: { oasUrl } of { oasBody } (stringified JSON).", - "operationId": "GenerateOAS", + "operationId": "generateOAS", "requestBody": { "content": { "application/json": { @@ -314,7 +320,9 @@ "summary": "Generate OpenAPI", "tags": [ "Tools" - ] + ], + "x-eov-operation-handler": "controllers/ToolsController", + "x-original-operationId": "GenerateOAS" } }, "/v1/oas/validate": { @@ -364,13 +372,14 @@ "summary": "Validate OpenAPI (POST)", "tags": [ "Tools" - ] + ], + "x-eov-operation-handler": "controllers/ToolsController" } }, "/v1/oas/postman": { "post": { "description": "Converteert OpenAPI naar Postman Collection JSON. Body: { oasUrl } of { oasBody } (stringified JSON of YAML).", - "operationId": "CreatePostmanCollection", + "operationId": "createPostmanCollection", "requestBody": { "content": { "application/json": { @@ -407,7 +416,9 @@ "summary": "Maak Postman-collectie (POST)", "tags": [ "Tools" - ] + ], + "x-eov-operation-handler": "controllers/ToolsController", + "x-original-operationId": "CreatePostmanCollection" } } }, diff --git a/api-implementations.ts b/app/api-implementations.ts similarity index 84% rename from api-implementations.ts rename to app/api-implementations.ts index 81f6c5a..b1482c8 100644 --- a/api-implementations.ts +++ b/app/api-implementations.ts @@ -1,5 +1,5 @@ import { Type } from '@nestjs/common'; -import { ToolsApi } from './api'; +import { ToolsApi } from '../api'; /** * Provide this type to {@link ApiModule} to provide your API implementations diff --git a/api.module.ts b/app/api.module.ts similarity index 95% rename from api.module.ts rename to app/api.module.ts index 9573cfc..e5e617c 100644 --- a/api.module.ts +++ b/app/api.module.ts @@ -1,7 +1,7 @@ import { DynamicModule, HttpException, Module, Provider } from '@nestjs/common'; import { ApiImplementations } from './api-implementations' -import { ToolsApi } from './api'; -import { ToolsApiController } from './controllers'; +import { ToolsApi } from '../api'; +import { ToolsApiController } from '../controllers'; const createNotImplementedProvider = (apiName: string) => new Proxy( diff --git a/index.ts b/app/index.ts similarity index 97% rename from index.ts rename to app/index.ts index 55809d6..e8c0bed 100644 --- a/index.ts +++ b/app/index.ts @@ -10,7 +10,7 @@ import { OpenAPIBackend } from "openapi-backend"; import type { Operation, Request as OpenAPIRequest } from "openapi-backend"; import type Ajv from "ajv"; import { ApiModule } from "./api.module"; -import { ToolsApiService } from "./tools-api.service"; +import { ToolsApiService } from "../implementation/tools-api.service"; const yaml = require("js-yaml") as { load(input: string): unknown }; @@ -453,6 +453,11 @@ const isDeclaredResponseStatus = (operation: RuntimeOperation, statusCode: numbe return String(statusCode) in responses || `${Math.floor(statusCode / 100)}XX` in responses || "default" in responses; }; +const chooseDeclaredResponseStatus = (operation: RuntimeOperation | undefined, statusCode: number): number => { + if (!operation || statusCode >= 400 || isDeclaredResponseStatus(operation, statusCode)) return statusCode; + return selectMockStatusCode(operation); +}; + @Catch() class ProblemDetailsFilter implements ExceptionFilter { catch(error: unknown, host: ArgumentsHost) { @@ -603,7 +608,9 @@ export const createApp = async () => { fastify.addHook("onSend", async (_request, reply, payload) => { const request = _request as RuntimeRequest & { openapiOperation?: RuntimeOperation }; - applyDeclaredResponseMetadata(openapiDocument, request, reply as RuntimeReply, request.openapiOperation, reply.statusCode, apiVersion); + const statusCode = chooseDeclaredResponseStatus(request.openapiOperation, reply.statusCode); + if (statusCode !== reply.statusCode) reply.status(statusCode); + applyDeclaredResponseMetadata(openapiDocument, request, reply as RuntimeReply, request.openapiOperation, statusCode, apiVersion); return payload; }); fastify.addHook("onSend", async (request, reply, payload) => { diff --git a/controllers/ToolsApi.controller.ts b/controllers/ToolsApi.controller.ts index bef652b..bc43007 100644 --- a/controllers/ToolsApi.controller.ts +++ b/controllers/ToolsApi.controller.ts @@ -1,4 +1,4 @@ -import { Body, Controller, DefaultValuePipe, Post, Inject, Param, ParseIntPipe, ParseFloatPipe, Query, Req, Res, HttpCode } from '@nestjs/common'; +import { Body, Controller, DefaultValuePipe, Post, Inject, Param, ParseIntPipe, ParseFloatPipe, Query, Req, Res } from '@nestjs/common'; import type { FastifyReply } from 'fastify'; import { Observable } from 'rxjs'; import { Cookies, Headers } from '../decorators'; @@ -10,49 +10,41 @@ export class ToolsApiController { constructor(@Inject(ToolsApi) private readonly toolsApi: ToolsApi) {} @Post('/v1/arazzo/markdown') - @HttpCode(200) arazzoMarkdown(@Body() oasInput: OasInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): string | Promise | Observable { return this.toolsApi.arazzoMarkdown(oasInput, request, reply); } @Post('/v1/arazzo/mermaid') - @HttpCode(200) arazzoMermaid(@Body() oasInput: OasInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): string | Promise | Observable { return this.toolsApi.arazzoMermaid(oasInput, request, reply); } @Post('/v1/oas/bundle') - @HttpCode(200) bundleOAS(@Body() oasInput: OasInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): void | Promise | Observable { return this.toolsApi.bundleOAS(oasInput, request, reply); } @Post('/v1/oas/convert') - @HttpCode(200) convertOAS(@Body() oasInput: OasInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): void | Promise | Observable { return this.toolsApi.convertOAS(oasInput, request, reply); } @Post('/v1/oas/postman') - @HttpCode(200) createPostmanCollection(@Body() oasInput: OasInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): void | Promise | Observable { return this.toolsApi.createPostmanCollection(oasInput, request, reply); } @Post('/v1/oas/generate') - @HttpCode(200) generateOAS(@Body() oasInput: OasInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): object | Promise | Observable { return this.toolsApi.generateOAS(oasInput, request, reply); } @Post('/v1/auth/clients') - @HttpCode(200) untrustClient(@Body() untrustClientInput: UntrustClientInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): ModelsKeycloakClientResult | Promise | Observable { return this.toolsApi.untrustClient(untrustClientInput, request, reply); } @Post('/v1/oas/validate') - @HttpCode(200) validatorOpenAPIPost(@Body() oasInput: OasInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): ModelsLintResult | Promise | Observable { return this.toolsApi.validatorOpenAPIPost(oasInput, request, reply); } diff --git a/tools-api.service.ts b/implementation/tools-api.service.ts similarity index 98% rename from tools-api.service.ts rename to implementation/tools-api.service.ts index 407a81e..18cb8e5 100644 --- a/tools-api.service.ts +++ b/implementation/tools-api.service.ts @@ -1,8 +1,8 @@ import { BadRequestException, Injectable } from "@nestjs/common"; import type { FastifyReply } from "fastify"; import type { OasInput, UntrustedClientInput, ValidateInput } from "@developer-overheid-nl/don-tools-logic"; -import { ToolsApi } from "./api"; -import type { ModelsKeycloakClientResult, ModelsLintResult } from "./models"; +import { ToolsApi } from "../api"; +import type { ModelsKeycloakClientResult, ModelsLintResult } from "../models"; const setHeaders = (reply: FastifyReply, headers: Record) => { for (const [name, value] of Object.entries(headers)) reply.header(name, value); diff --git a/package.json b/package.json index 648fa39..46c8a39 100644 --- a/package.json +++ b/package.json @@ -2,14 +2,14 @@ "name": "tools-api-v1", "version": "1.0.0", "description": "API van het Tools (apis.developer.overheid.nl)", - "main": "dist/index.js", + "main": "dist/app/index.js", "scripts": { "init-install": "npm install", - "dev": "tsx watch --env-file=.env index.ts", + "dev": "tsx watch --env-file=.env app/index.ts", "dev-mock": "OPENAPI_MOCK=true npm run dev", "prebuild": "rm -rf dist", "build": "tsc", - "start": "node --env-file-if-exists=.env dist/index.js", + "start": "node --env-file-if-exists=.env dist/app/index.js", "test": "vitest run", "lint": "biome lint .", "format": "biome format --write .", diff --git a/test/app.test.ts b/test/app.test.ts index 186f8c2..2cd7a13 100644 --- a/test/app.test.ts +++ b/test/app.test.ts @@ -1,6 +1,6 @@ import { afterAll, beforeAll, describe, expect, it } from "vitest"; import type { NestFastifyApplication } from "@nestjs/platform-fastify"; -import { createApp } from "../index.ts"; +import { createApp } from "../app/index.ts"; let app: NestFastifyApplication; diff --git a/tsconfig.json b/tsconfig.json index 6aaf8ba..f025710 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -22,10 +22,8 @@ "controllers/**/*.ts", "decorators/**/*.ts", "models/**/*.ts", - "api-implementations.ts", - "api.module.ts", - "index.ts", - "tools-api.service.ts" + "app/**/*.ts", + "implementation/**/*.ts" ], "exclude": ["node_modules", "dist", "src", "test"] } From ddc2b424758e2a060899617a03a96d48a20ffba9 Mon Sep 17 00:00:00 2001 From: pasibun Date: Tue, 16 Jun 2026 13:51:38 +0200 Subject: [PATCH 06/27] Fix GitHub dependency installs in CI --- .github/workflows/node-ci.yml | 5 ++++ Dockerfile | 9 ++++++- package-lock.json | 44 +---------------------------------- package.json | 2 +- 4 files changed, 15 insertions(+), 45 deletions(-) diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 87454a1..752a098 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -17,6 +17,11 @@ jobs: node-version: 22 cache: npm + - name: Configure GitHub git dependencies over HTTPS + run: | + git config --global url."https://github.com/".insteadOf "ssh://git@github.com/" + git config --global url."https://github.com/".insteadOf "git@github.com:" + - name: Install dependencies run: npm install --ignore-scripts diff --git a/Dockerfile b/Dockerfile index a74306c..41813c2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,9 @@ FROM node:22-alpine AS build WORKDIR /app COPY package.json package-lock.json ./ +RUN apk add --no-cache git \ + && git config --global url."https://github.com/".insteadOf "ssh://git@github.com/" \ + && git config --global url."https://github.com/".insteadOf "git@github.com:" RUN npm ci COPY tsconfig.json ./ COPY api ./api @@ -15,7 +18,11 @@ FROM node:22-alpine AS runtime WORKDIR /app ENV NODE_ENV=production COPY package.json package-lock.json ./ -RUN npm ci --omit=dev +RUN apk add --no-cache --virtual .git-deps git \ + && git config --global url."https://github.com/".insteadOf "ssh://git@github.com/" \ + && git config --global url."https://github.com/".insteadOf "git@github.com:" \ + && npm ci --omit=dev \ + && apk del .git-deps COPY --from=build /app/dist ./dist COPY api ./api diff --git a/package-lock.json b/package-lock.json index c8c53b1..6612f5c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "EUPL-1.2", "dependencies": { - "@developer-overheid-nl/don-tools-logic": "github:developer-overheid-nl/don-tools-api-v2#60-tools-api-refactor", + "@developer-overheid-nl/don-tools-logic": "git+https://github.com/developer-overheid-nl/don-tools-api-v2.git#60-tools-api-refactor", "@fastify/cors": "^11.2.0", "@nestjs/common": "^11.0.0", "@nestjs/core": "^11.0.0", @@ -184,9 +184,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -204,9 +201,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -224,9 +218,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -244,9 +235,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -1486,9 +1474,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1506,9 +1491,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1526,9 +1508,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1546,9 +1525,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1566,9 +1542,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1586,9 +1559,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -4398,9 +4368,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -4422,9 +4389,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -4446,9 +4410,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -4470,9 +4431,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ diff --git a/package.json b/package.json index 46c8a39..c8e511f 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "license": "EUPL-1.2", "private": true, "dependencies": { - "@developer-overheid-nl/don-tools-logic": "github:developer-overheid-nl/don-tools-api-v2#60-tools-api-refactor", + "@developer-overheid-nl/don-tools-logic": "git+https://github.com/developer-overheid-nl/don-tools-api-v2.git#60-tools-api-refactor", "@fastify/cors": "^11.2.0", "@nestjs/common": "^11.0.0", "@nestjs/core": "^11.0.0", From 49935f8ae49e18a2c4c38ca209a7b9ffda4c810b Mon Sep 17 00:00:00 2001 From: pasibun Date: Tue, 16 Jun 2026 14:42:24 +0200 Subject: [PATCH 07/27] refactor: update Git configuration for HTTPS access and streamline Dockerfile --- .github/workflows/node-ci.yml | 8 ++++++-- Dockerfile | 26 +++++++++++++++++++------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 752a098..9b10744 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -18,9 +18,11 @@ jobs: cache: npm - name: Configure GitHub git dependencies over HTTPS + env: + GIT_AUTH_TOKEN: ${{ secrets.DEPENDENCY_REPO_READ_TOKEN || github.token }} run: | - git config --global url."https://github.com/".insteadOf "ssh://git@github.com/" - git config --global url."https://github.com/".insteadOf "git@github.com:" + git config --global --add url."https://x-access-token:${GIT_AUTH_TOKEN}@github.com/".insteadOf "ssh://git@github.com/" + git config --global --add url."https://x-access-token:${GIT_AUTH_TOKEN}@github.com/".insteadOf "git@github.com:" - name: Install dependencies run: npm install --ignore-scripts @@ -49,6 +51,8 @@ jobs: with: context: . push: true + secrets: | + git_auth_token=${{ secrets.DEPENDENCY_REPO_READ_TOKEN || github.token }} tags: | ghcr.io/developer-overheid-nl/don-api-tools:latest ghcr.io/developer-overheid-nl/don-api-tools:${{ github.sha }} diff --git a/Dockerfile b/Dockerfile index 41813c2..d084a59 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,17 @@ +# syntax=docker/dockerfile:1 + FROM node:22-alpine AS build WORKDIR /app COPY package.json package-lock.json ./ -RUN apk add --no-cache git \ - && git config --global url."https://github.com/".insteadOf "ssh://git@github.com/" \ - && git config --global url."https://github.com/".insteadOf "git@github.com:" -RUN npm ci +RUN --mount=type=secret,id=git_auth_token,required=false \ + apk add --no-cache git \ + && GIT_AUTH_TOKEN="$(cat /run/secrets/git_auth_token 2>/dev/null || true)" \ + && GIT_URL="https://github.com/" \ + && if [ -n "${GIT_AUTH_TOKEN}" ]; then GIT_URL="https://x-access-token:${GIT_AUTH_TOKEN}@github.com/"; fi \ + && git config --global --add "url.${GIT_URL}.insteadOf" "ssh://git@github.com/" \ + && git config --global --add "url.${GIT_URL}.insteadOf" "git@github.com:" \ + && npm ci \ + && rm -f ~/.gitconfig COPY tsconfig.json ./ COPY api ./api COPY controllers ./controllers @@ -18,10 +25,15 @@ FROM node:22-alpine AS runtime WORKDIR /app ENV NODE_ENV=production COPY package.json package-lock.json ./ -RUN apk add --no-cache --virtual .git-deps git \ - && git config --global url."https://github.com/".insteadOf "ssh://git@github.com/" \ - && git config --global url."https://github.com/".insteadOf "git@github.com:" \ +RUN --mount=type=secret,id=git_auth_token,required=false \ + apk add --no-cache --virtual .git-deps git \ + && GIT_AUTH_TOKEN="$(cat /run/secrets/git_auth_token 2>/dev/null || true)" \ + && GIT_URL="https://github.com/" \ + && if [ -n "${GIT_AUTH_TOKEN}" ]; then GIT_URL="https://x-access-token:${GIT_AUTH_TOKEN}@github.com/"; fi \ + && git config --global --add "url.${GIT_URL}.insteadOf" "ssh://git@github.com/" \ + && git config --global --add "url.${GIT_URL}.insteadOf" "git@github.com:" \ && npm ci --omit=dev \ + && rm -f ~/.gitconfig \ && apk del .git-deps COPY --from=build /app/dist ./dist COPY api ./api From 89eff1b58f74948803205a84145d1c55a76deddc Mon Sep 17 00:00:00 2001 From: pasibun Date: Tue, 16 Jun 2026 14:47:29 +0200 Subject: [PATCH 08/27] Revert "refactor: update Git configuration for HTTPS access and streamline Dockerfile" This reverts commit 49935f8ae49e18a2c4c38ca209a7b9ffda4c810b. --- .github/workflows/node-ci.yml | 8 ++------ Dockerfile | 26 +++++++------------------- 2 files changed, 9 insertions(+), 25 deletions(-) diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 9b10744..752a098 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -18,11 +18,9 @@ jobs: cache: npm - name: Configure GitHub git dependencies over HTTPS - env: - GIT_AUTH_TOKEN: ${{ secrets.DEPENDENCY_REPO_READ_TOKEN || github.token }} run: | - git config --global --add url."https://x-access-token:${GIT_AUTH_TOKEN}@github.com/".insteadOf "ssh://git@github.com/" - git config --global --add url."https://x-access-token:${GIT_AUTH_TOKEN}@github.com/".insteadOf "git@github.com:" + git config --global url."https://github.com/".insteadOf "ssh://git@github.com/" + git config --global url."https://github.com/".insteadOf "git@github.com:" - name: Install dependencies run: npm install --ignore-scripts @@ -51,8 +49,6 @@ jobs: with: context: . push: true - secrets: | - git_auth_token=${{ secrets.DEPENDENCY_REPO_READ_TOKEN || github.token }} tags: | ghcr.io/developer-overheid-nl/don-api-tools:latest ghcr.io/developer-overheid-nl/don-api-tools:${{ github.sha }} diff --git a/Dockerfile b/Dockerfile index d084a59..41813c2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,17 +1,10 @@ -# syntax=docker/dockerfile:1 - FROM node:22-alpine AS build WORKDIR /app COPY package.json package-lock.json ./ -RUN --mount=type=secret,id=git_auth_token,required=false \ - apk add --no-cache git \ - && GIT_AUTH_TOKEN="$(cat /run/secrets/git_auth_token 2>/dev/null || true)" \ - && GIT_URL="https://github.com/" \ - && if [ -n "${GIT_AUTH_TOKEN}" ]; then GIT_URL="https://x-access-token:${GIT_AUTH_TOKEN}@github.com/"; fi \ - && git config --global --add "url.${GIT_URL}.insteadOf" "ssh://git@github.com/" \ - && git config --global --add "url.${GIT_URL}.insteadOf" "git@github.com:" \ - && npm ci \ - && rm -f ~/.gitconfig +RUN apk add --no-cache git \ + && git config --global url."https://github.com/".insteadOf "ssh://git@github.com/" \ + && git config --global url."https://github.com/".insteadOf "git@github.com:" +RUN npm ci COPY tsconfig.json ./ COPY api ./api COPY controllers ./controllers @@ -25,15 +18,10 @@ FROM node:22-alpine AS runtime WORKDIR /app ENV NODE_ENV=production COPY package.json package-lock.json ./ -RUN --mount=type=secret,id=git_auth_token,required=false \ - apk add --no-cache --virtual .git-deps git \ - && GIT_AUTH_TOKEN="$(cat /run/secrets/git_auth_token 2>/dev/null || true)" \ - && GIT_URL="https://github.com/" \ - && if [ -n "${GIT_AUTH_TOKEN}" ]; then GIT_URL="https://x-access-token:${GIT_AUTH_TOKEN}@github.com/"; fi \ - && git config --global --add "url.${GIT_URL}.insteadOf" "ssh://git@github.com/" \ - && git config --global --add "url.${GIT_URL}.insteadOf" "git@github.com:" \ +RUN apk add --no-cache --virtual .git-deps git \ + && git config --global url."https://github.com/".insteadOf "ssh://git@github.com/" \ + && git config --global url."https://github.com/".insteadOf "git@github.com:" \ && npm ci --omit=dev \ - && rm -f ~/.gitconfig \ && apk del .git-deps COPY --from=build /app/dist ./dist COPY api ./api From 5ff9c557634e12ad108f66e526c8e90c612628d8 Mon Sep 17 00:00:00 2001 From: pasibun Date: Tue, 16 Jun 2026 14:47:29 +0200 Subject: [PATCH 09/27] Revert "Fix GitHub dependency installs in CI" This reverts commit ddc2b424758e2a060899617a03a96d48a20ffba9. --- .github/workflows/node-ci.yml | 5 ---- Dockerfile | 9 +------ package-lock.json | 44 ++++++++++++++++++++++++++++++++++- package.json | 2 +- 4 files changed, 45 insertions(+), 15 deletions(-) diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 752a098..87454a1 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -17,11 +17,6 @@ jobs: node-version: 22 cache: npm - - name: Configure GitHub git dependencies over HTTPS - run: | - git config --global url."https://github.com/".insteadOf "ssh://git@github.com/" - git config --global url."https://github.com/".insteadOf "git@github.com:" - - name: Install dependencies run: npm install --ignore-scripts diff --git a/Dockerfile b/Dockerfile index 41813c2..a74306c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,6 @@ FROM node:22-alpine AS build WORKDIR /app COPY package.json package-lock.json ./ -RUN apk add --no-cache git \ - && git config --global url."https://github.com/".insteadOf "ssh://git@github.com/" \ - && git config --global url."https://github.com/".insteadOf "git@github.com:" RUN npm ci COPY tsconfig.json ./ COPY api ./api @@ -18,11 +15,7 @@ FROM node:22-alpine AS runtime WORKDIR /app ENV NODE_ENV=production COPY package.json package-lock.json ./ -RUN apk add --no-cache --virtual .git-deps git \ - && git config --global url."https://github.com/".insteadOf "ssh://git@github.com/" \ - && git config --global url."https://github.com/".insteadOf "git@github.com:" \ - && npm ci --omit=dev \ - && apk del .git-deps +RUN npm ci --omit=dev COPY --from=build /app/dist ./dist COPY api ./api diff --git a/package-lock.json b/package-lock.json index 6612f5c..c8c53b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "EUPL-1.2", "dependencies": { - "@developer-overheid-nl/don-tools-logic": "git+https://github.com/developer-overheid-nl/don-tools-api-v2.git#60-tools-api-refactor", + "@developer-overheid-nl/don-tools-logic": "github:developer-overheid-nl/don-tools-api-v2#60-tools-api-refactor", "@fastify/cors": "^11.2.0", "@nestjs/common": "^11.0.0", "@nestjs/core": "^11.0.0", @@ -184,6 +184,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -201,6 +204,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -218,6 +224,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -235,6 +244,9 @@ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -1474,6 +1486,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1491,6 +1506,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -1508,6 +1526,9 @@ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1525,6 +1546,9 @@ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1542,6 +1566,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1559,6 +1586,9 @@ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -4368,6 +4398,9 @@ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -4389,6 +4422,9 @@ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -4410,6 +4446,9 @@ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -4431,6 +4470,9 @@ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MPL-2.0", "optional": true, "os": [ diff --git a/package.json b/package.json index c8e511f..46c8a39 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "license": "EUPL-1.2", "private": true, "dependencies": { - "@developer-overheid-nl/don-tools-logic": "git+https://github.com/developer-overheid-nl/don-tools-api-v2.git#60-tools-api-refactor", + "@developer-overheid-nl/don-tools-logic": "github:developer-overheid-nl/don-tools-api-v2#60-tools-api-refactor", "@fastify/cors": "^11.2.0", "@nestjs/common": "^11.0.0", "@nestjs/core": "^11.0.0", From bfd6718d7b03a9d8488070a9933b6b07233bd8f0 Mon Sep 17 00:00:00 2001 From: pasibun Date: Tue, 16 Jun 2026 17:48:33 +0200 Subject: [PATCH 10/27] new version --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index c8c53b1..79d151b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -312,7 +312,7 @@ }, "node_modules/@developer-overheid-nl/don-tools-logic": { "version": "2.0.0", - "resolved": "git+ssh://git@github.com/developer-overheid-nl/don-tools-api-v2.git#0df3425e39d4df3af923fa8cb566b7ac06182919", + "resolved": "git+ssh://git@github.com/developer-overheid-nl/don-tools-api-v2.git#dadd0aa1eded7b817e0a2fc3b59216422739336d", "license": "EUPL-1.2", "dependencies": { "@apiture/openapi-down-convert": "^0.14.2", From c54343680ac401e94cce6c85f4e1fe9b4d7c2e6c Mon Sep 17 00:00:00 2001 From: pasibun Date: Tue, 16 Jun 2026 17:51:36 +0200 Subject: [PATCH 11/27] Improve Tools API v1 README --- README.md | 133 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 110 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 45ad1cb..d9a044f 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,127 @@ -# Tools API +# DON Tools API v1 -HTTP API for developer.overheid.nl tools. +HTTP API voor de tools op `developer.overheid.nl`. -This repository contains only the API transport layer: OpenAPI validation, Fastify routing, response headers, and error -mapping. Business logic lives in `@developer-overheid-nl/don-tools-logic`, currently consumed locally from -`../don-tools-api-v2`. +Deze repository bevat de API-laag voor versie 1 van de Tools API: routing, OpenAPI-validatie, +response headers, foutafhandeling en de koppeling naar de daadwerkelijke businesslogica. Die +businesslogica staat in `@developer-overheid-nl/don-tools-logic` en wordt los beheerd in +`don-tools-api-v2`. -## Stack +## Wat zit hierin? + +- NestJS met Fastify als HTTP runtime +- OpenAPI request- en responsevalidatie via `openapi-backend` +- Gegenereerde controller- en modelbestanden op basis van `api/openapi.yaml` +- Implementatie-adapter in `implementation/tools-api.service.ts` +- Docker image voor deployment op poort `1338` + +## Endpoints + +De OpenAPI-specificatie staat in `api/openapi.yaml` en `api/openapi.json`. + +Bij runtime worden deze ook beschikbaar gemaakt op: + +- `GET /openapi.yaml` +- `GET /openapi.json` + +Belangrijkste tools-endpoints: + +- `POST /v1/oas/validate` +- `POST /v1/oas/convert` +- `POST /v1/oas/bundle` +- `POST /v1/oas/generate` +- `POST /v1/oas/postman` +- `POST /v1/arazzo/markdown` +- `POST /v1/arazzo/mermaid` +- `POST /v1/auth/clients` + +## Lokaal ontwikkelen + +Vereisten: - Node.js 22+ -- TypeScript, native ESM, `NodeNext` -- Fastify v5 -- `fastify-openapi-glue` for OpenAPI operation binding -- Vitest -- Biome +- npm -## Development +Installeren en starten: ```sh npm install npm run dev -npm run build -npm start -npm test -npm run lint ``` -The OpenAPI contract is `api/openapi.json`. The API also serves it at `GET /v1/openapi.json`. +De API luistert standaard op `http://localhost:1338`. + +Handige scripts: + +```sh +npm run build # TypeScript build naar dist/ +npm start # start de gebouwde app +npm test # Vitest tests +npm run lint # Biome lint +npm run typecheck # TypeScript typecheck zonder output +``` + +## Omgevingsvariabelen + +- `PORT`: poort waarop de API luistert, standaard `1338` +- `HOST`: host waarop Fastify bindt, standaard `0.0.0.0` +- `OPENAPI_MOCK`: zet mock responses aan met `true`, `1`, `yes` of `on` + +Mock mode kan ook direct via: + +```sh +npm run dev-mock +``` + +## Relatie met `don-tools-api-v2` -## Split +`don-tools-api` is de v1 HTTP-adapter. De herbruikbare logica zit in +`@developer-overheid-nl/don-tools-logic`. + +Zodra de logic package op npm gepubliceerd is, pin deze API op een expliciete packageversie: + +```sh +npm install @developer-overheid-nl/don-tools-logic@ +``` + +Gebruik liever een npm-versie dan een GitHub dependency in CI/CD. Dat voorkomt dat builds afhankelijk +worden van GitHub SSH keys of repository tokens. + +## Docker + +Build lokaal: + +```sh +docker build -t don-tools-api . +``` + +Run lokaal: + +```sh +docker run --rm -p 1338:1338 don-tools-api +``` + +## Checks voor een wijziging + +Draai minimaal: + +```sh +npm run lint +npm run build +npm test +``` -- `don-tools-api`: API adapter, OpenAPI contract, HTTP error handling -- `don-tools-api-v2`: reusable logic package +Bij wijzigingen aan `api/openapi.yaml` of gegenereerde bestanden: controleer ook of +`api/openapi.json`, `controllers/`, `models/` en `api/` nog overeenkomen met het contract. -The local package dependency is: +## Repository-indeling -```json -"@developer-overheid-nl/don-tools-logic": "file:../don-tools-api-v2" +```text +api/ OpenAPI contract en gegenereerde API interfaces +app/ NestJS/Fastify bootstrap en OpenAPI middleware +controllers/ Gegenereerde NestJS controllers +decorators/ Gegenereerde request decorators +implementation/ Handgeschreven adapter naar don-tools-logic +models/ Gegenereerde request/response modellen +test/ Vitest tests ``` From cc3ab8b2f5c4d977b02c32a59ea188157569fc44 Mon Sep 17 00:00:00 2001 From: pasibun Date: Tue, 16 Jun 2026 18:08:30 +0200 Subject: [PATCH 12/27] refactor: update dependency for don-tools-logic to version 0.0.1 --- package-lock.json | 7 ++++--- package.json | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 79d151b..ca8fdb1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "EUPL-1.2", "dependencies": { - "@developer-overheid-nl/don-tools-logic": "github:developer-overheid-nl/don-tools-api-v2#60-tools-api-refactor", + "@developer-overheid-nl/don-tools-logic": "^0.0.1", "@fastify/cors": "^11.2.0", "@nestjs/common": "^11.0.0", "@nestjs/core": "^11.0.0", @@ -311,8 +311,9 @@ } }, "node_modules/@developer-overheid-nl/don-tools-logic": { - "version": "2.0.0", - "resolved": "git+ssh://git@github.com/developer-overheid-nl/don-tools-api-v2.git#dadd0aa1eded7b817e0a2fc3b59216422739336d", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@developer-overheid-nl/don-tools-logic/-/don-tools-logic-0.0.1.tgz", + "integrity": "sha512-8KJOreUcPrXbPvJ4WuyE9ChtVt8U1VbYeGlyWvsMGBMQaNsGfkhCskGS+EQ4YynjrMjra5n9+5+RV88dzoA14Q==", "license": "EUPL-1.2", "dependencies": { "@apiture/openapi-down-convert": "^0.14.2", diff --git a/package.json b/package.json index 46c8a39..efce107 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "license": "EUPL-1.2", "private": true, "dependencies": { - "@developer-overheid-nl/don-tools-logic": "github:developer-overheid-nl/don-tools-api-v2#60-tools-api-refactor", + "@developer-overheid-nl/don-tools-logic": "^0.0.1", "@fastify/cors": "^11.2.0", "@nestjs/common": "^11.0.0", "@nestjs/core": "^11.0.0", From f19c5fa9f5eef30f51f168bcc595ef4997798e30 Mon Sep 17 00:00:00 2001 From: pasibun Date: Tue, 16 Jun 2026 18:13:52 +0200 Subject: [PATCH 13/27] Implement feature X to enhance user experience and optimize performance --- package-lock.json | 844 +--------------------------------------------- 1 file changed, 6 insertions(+), 838 deletions(-) diff --git a/package-lock.json b/package-lock.json index ca8fdb1..50e3d06 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,8 +32,6 @@ }, "node_modules/@apidevtools/json-schema-ref-parser": { "version": "11.9.3", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.3.tgz", - "integrity": "sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==", "license": "MIT", "dependencies": { "@jsdevtools/ono": "^7.1.3", @@ -49,8 +47,6 @@ }, "node_modules/@apiture/openapi-down-convert": { "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@apiture/openapi-down-convert/-/openapi-down-convert-0.14.2.tgz", - "integrity": "sha512-vT3eqOEmJ4KZ2qojycEV0zzFBPDrkwntyfnWi8/WMaag8jvGN4osIdVRuwxWcK6AvQr32ohrpcLGqEZ+ZHVNcw==", "license": "ISC", "dependencies": { "commander": "^9.4.1", @@ -63,8 +59,6 @@ }, "node_modules/@apiture/openapi-down-convert/node_modules/typescript": { "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -76,8 +70,6 @@ }, "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" @@ -85,8 +77,6 @@ }, "node_modules/@babel/code-frame": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", @@ -99,8 +89,6 @@ }, "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": ">=6.9.0" @@ -108,8 +96,6 @@ }, "node_modules/@babel/runtime": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", - "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -117,8 +103,6 @@ }, "node_modules/@biomejs/biome": { "version": "2.4.16", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.16.tgz", - "integrity": "sha512-x9ajFh1zChVybCiM3TN6OD4phAqLgtPZjFrZF+aTMYCPjwBO+k529TX7PPsAqtGNLeV4UgzwQnowEgS7bGmzcA==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -144,8 +128,6 @@ }, "node_modules/@biomejs/cli-darwin-arm64": { "version": "2.4.16", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.16.tgz", - "integrity": "sha512-wxPvu4XOA85YJk9ixSWUmq/QBHbid85BISbOAqqBM/5xQpPk9ayjk5375tOlSC0BeCwNSbPFafQBm+vBumXq0A==", "cpu": [ "arm64" ], @@ -292,8 +274,6 @@ }, "node_modules/@borewit/text-codec": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.2.tgz", - "integrity": "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==", "license": "MIT", "funding": { "type": "github", @@ -312,8 +292,6 @@ }, "node_modules/@developer-overheid-nl/don-tools-logic": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@developer-overheid-nl/don-tools-logic/-/don-tools-logic-0.0.1.tgz", - "integrity": "sha512-8KJOreUcPrXbPvJ4WuyE9ChtVt8U1VbYeGlyWvsMGBMQaNsGfkhCskGS+EQ4YynjrMjra5n9+5+RV88dzoA14Q==", "license": "EUPL-1.2", "dependencies": { "@apiture/openapi-down-convert": "^0.14.2", @@ -437,8 +415,6 @@ }, "node_modules/@esbuild/darwin-arm64": { "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", - "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", "cpu": [ "arm64" ], @@ -811,14 +787,10 @@ }, "node_modules/@exodus/schemasafe": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", - "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==", "license": "MIT" }, "node_modules/@faker-js/faker": { "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.6.0.tgz", - "integrity": "sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==", "license": "MIT", "engines": { "node": ">=14.0.0", @@ -827,8 +799,6 @@ }, "node_modules/@fastify/ajv-compiler": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.5.tgz", - "integrity": "sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==", "funding": [ { "type": "github", @@ -848,8 +818,6 @@ }, "node_modules/@fastify/cors": { "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-11.2.0.tgz", - "integrity": "sha512-LbLHBuSAdGdSFZYTLVA3+Ch2t+sA6nq3Ejc6XLAKiQ6ViS2qFnvicpj0htsx03FyYeLs04HfRNBsz/a8SvbcUw==", "funding": [ { "type": "github", @@ -868,8 +836,6 @@ }, "node_modules/@fastify/cors/node_modules/fastify-plugin": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz", - "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==", "funding": [ { "type": "github", @@ -884,8 +850,6 @@ }, "node_modules/@fastify/error": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.2.0.tgz", - "integrity": "sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==", "funding": [ { "type": "github", @@ -900,8 +864,6 @@ }, "node_modules/@fastify/fast-json-stringify-compiler": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.0.3.tgz", - "integrity": "sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==", "funding": [ { "type": "github", @@ -919,8 +881,6 @@ }, "node_modules/@fastify/formbody": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@fastify/formbody/-/formbody-8.0.2.tgz", - "integrity": "sha512-84v5J2KrkXzjgBpYnaNRPqwgMsmY7ZDjuj0YVuMR3NXCJRCgKEZy/taSP1wUYGn0onfxJpLyRGDLa+NMaDJtnA==", "funding": [ { "type": "github", @@ -939,8 +899,6 @@ }, "node_modules/@fastify/formbody/node_modules/fastify-plugin": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz", - "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==", "funding": [ { "type": "github", @@ -955,8 +913,6 @@ }, "node_modules/@fastify/forwarded": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@fastify/forwarded/-/forwarded-3.0.1.tgz", - "integrity": "sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw==", "funding": [ { "type": "github", @@ -971,8 +927,6 @@ }, "node_modules/@fastify/merge-json-schemas": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.2.1.tgz", - "integrity": "sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==", "funding": [ { "type": "github", @@ -990,8 +944,6 @@ }, "node_modules/@fastify/proxy-addr": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.1.0.tgz", - "integrity": "sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==", "funding": [ { "type": "github", @@ -1010,8 +962,6 @@ }, "node_modules/@fastify/proxy-addr/node_modules/ipaddr.js": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz", - "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==", "license": "MIT", "engines": { "node": ">= 10" @@ -1019,8 +969,6 @@ }, "node_modules/@humanwhocodes/momoa": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-2.0.4.tgz", - "integrity": "sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==", "license": "Apache-2.0", "engines": { "node": ">=10.10.0" @@ -1028,21 +976,15 @@ }, "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==", "dev": true, "license": "MIT" }, "node_modules/@jsdevtools/ono": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", "license": "MIT" }, "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.16.0" @@ -1053,8 +995,6 @@ }, "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": ">= 10.16.0" @@ -1065,8 +1005,6 @@ }, "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": ">= 10.16.0" @@ -1077,22 +1015,20 @@ }, "node_modules/@lukeed/csprng": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", - "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", - "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz", + "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@tybys/wasm-util": "^0.10.1" + "@tybys/wasm-util": "^0.10.2" }, "funding": { "type": "github", @@ -1105,8 +1041,6 @@ }, "node_modules/@nestjs/common": { "version": "11.1.26", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.26.tgz", - "integrity": "sha512-0VARQyzuGbprvjO+slWq9Jtj1P0jYCSKAUSv9LWFNWD39ZbDzXXM1pMs35kReVXwchra0urMfTQxw4uAOfdSzA==", "license": "MIT", "dependencies": { "file-type": "21.3.4", @@ -1136,8 +1070,6 @@ }, "node_modules/@nestjs/common/node_modules/file-type": { "version": "21.3.4", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.4.tgz", - "integrity": "sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==", "license": "MIT", "dependencies": { "@tokenizer/inflate": "^0.4.1", @@ -1154,8 +1086,6 @@ }, "node_modules/@nestjs/core": { "version": "11.1.26", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.26.tgz", - "integrity": "sha512-K45zUwYpowEsVqm8qNIzsMcl4LJev0MK9zVhDnmym7YRTJ2/caslqVeKYhPRd5+Fh81IkvWUVu6vEo46uZ5mgQ==", "license": "MIT", "dependencies": { "fast-safe-stringify": "2.1.1", @@ -1193,8 +1123,6 @@ }, "node_modules/@nestjs/platform-fastify": { "version": "11.1.26", - "resolved": "https://registry.npmjs.org/@nestjs/platform-fastify/-/platform-fastify-11.1.26.tgz", - "integrity": "sha512-x7O39mdfgTzq43YRB1H+CkZX34q3joahnmpHmobmYSiQeRjsEa3beBDMsT1IAz/aH91N33p+nUvjxiD3FH6mOQ==", "license": "MIT", "dependencies": { "@fastify/cors": "11.2.0", @@ -1229,8 +1157,6 @@ }, "node_modules/@nestjs/platform-fastify/node_modules/fastify-plugin": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-5.1.0.tgz", - "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==", "funding": [ { "type": "github", @@ -1245,8 +1171,6 @@ }, "node_modules/@noble/hashes": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", "license": "MIT", "engines": { "node": "^14.21.3 || >=16" @@ -1257,8 +1181,6 @@ }, "node_modules/@nodable/entities": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.1.tgz", - "integrity": "sha512-Pig3HxDIoMgjdEH8OCf/dkcTmLFjJRjWuq8jSnklu284/TKOPibSRERmOykiwmyXTtv61mP+44f3GMx0tLAyjg==", "funding": [ { "type": "github", @@ -1269,8 +1191,6 @@ }, "node_modules/@oxc-project/types": { "version": "0.133.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", - "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", "dev": true, "license": "MIT", "funding": { @@ -1279,14 +1199,10 @@ }, "node_modules/@pinojs/redact": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", - "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", "license": "MIT" }, "node_modules/@redocly/ajv": { "version": "8.18.3", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.18.3.tgz", - "integrity": "sha512-l42u0of3hY98sN2A+M4qTX1O/KrpgGH32Hu9kP2GtHyD5Dfqq86PKFLe5dwaD8DEnNmlOlll2BAmeEtf0DaySg==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -1301,8 +1217,6 @@ }, "node_modules/@redocly/config": { "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.49.0.tgz", - "integrity": "sha512-OI/rpEffX3fKUuy+OuBHPRspRI/S30b9aiqxfZLMpSWZzDncEGPxSEP1O2LrBVshnDX4hLjVjLvCZ4YT85+1rw==", "license": "MIT", "dependencies": { "json-schema-to-ts": "2.7.2" @@ -1310,8 +1224,6 @@ }, "node_modules/@redocly/openapi-core": { "version": "2.32.0", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-2.32.0.tgz", - "integrity": "sha512-B4CsuuokMc3vgNh9e+eFX8FAbjMTWUVgYtBvPXm0X2pwBs9nO2v+m6ARp7lEpg1P42B6XztIdI08BGMqUAerJQ==", "license": "MIT", "dependencies": { "@redocly/ajv": "^8.18.1", @@ -1333,8 +1245,6 @@ "node_modules/@redocly/openapi-core/node_modules/ajv": { "name": "@redocly/ajv", "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.18.1.tgz", - "integrity": "sha512-Ifm/pP/tul1qmAecpbVxCBluVE32rKfjf8gYXH4xI2gCv9mRWFhJMHzkPDM4TXlxwPQYIFegymlsy8lXz7optA==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -1349,14 +1259,10 @@ }, "node_modules/@redocly/openapi-core/node_modules/colorette": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", "license": "MIT" }, "node_modules/@redocly/respect-core": { "version": "2.32.0", - "resolved": "https://registry.npmjs.org/@redocly/respect-core/-/respect-core-2.32.0.tgz", - "integrity": "sha512-CYRyleK+xOQtd8K6JuZbJr/yD+EVscipAtst/e5x66wyoG04vzUQWX1tzTibNQhl8OI/FMy9BnlFrHCaA8BiHg==", "license": "MIT", "dependencies": { "@faker-js/faker": "^7.6.0", @@ -1380,8 +1286,6 @@ "node_modules/@redocly/respect-core/node_modules/ajv": { "name": "@redocly/ajv", "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.18.1.tgz", - "integrity": "sha512-Ifm/pP/tul1qmAecpbVxCBluVE32rKfjf8gYXH4xI2gCv9mRWFhJMHzkPDM4TXlxwPQYIFegymlsy8lXz7optA==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -1413,8 +1317,6 @@ }, "node_modules/@rolldown/binding-darwin-arm64": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", - "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", "cpu": [ "arm64" ], @@ -1671,15 +1573,11 @@ }, "node_modules/@rolldown/pluginutils": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "dev": true, "license": "MIT" }, "node_modules/@scalar/openapi-types": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@scalar/openapi-types/-/openapi-types-0.9.1.tgz", - "integrity": "sha512-gkGhSkxSzADaBiNg+ZAbJuwj+ZUmzP2Pg9CWZ7ZP+0fck2WjPeDDM7aAbouAm0aQQMF9xBjSPXSA9a/qTHYaTw==", "license": "MIT", "engines": { "node": ">=22" @@ -1687,8 +1585,6 @@ }, "node_modules/@scalar/openapi-upgrader": { "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@scalar/openapi-upgrader/-/openapi-upgrader-0.2.9.tgz", - "integrity": "sha512-D5b0rGLLZgmkO9mdW2j/ND1KBlH1u3RCpr87HPxv9P9ZSr6PtM5iLqFOJq0ACiaHjY2mikCrxgDmnUEhTzRpHQ==", "license": "MIT", "dependencies": { "@scalar/openapi-types": "0.9.1" @@ -1699,15 +1595,11 @@ }, "node_modules/@standard-schema/spec": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "dev": true, "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": { "jsonpointer": "^5.0.0", @@ -1722,8 +1614,6 @@ }, "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", @@ -1739,8 +1629,6 @@ }, "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": { "node-fetch": "^2.6.0", @@ -1752,14 +1640,10 @@ }, "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": { "@stoplight/json": "^3.21.0", @@ -1779,14 +1663,10 @@ }, "node_modules/@stoplight/json/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/@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": ">=8" @@ -1794,8 +1674,6 @@ }, "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": ">=8" @@ -1803,8 +1681,6 @@ }, "node_modules/@stoplight/spectral-core": { "version": "1.23.0", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-core/-/spectral-core-1.23.0.tgz", - "integrity": "sha512-WvdgmiiJrjiMrcw7ByxfcYtUvAXNp2MhAfcEIXP3Mn8ZOVwyAWIsFjLlsE5zRqj0LuN8+7OQM/L+BMcHj6x/BQ==", "license": "Apache-2.0", "dependencies": { "@stoplight/better-ajv-errors": "1.0.3", @@ -1835,8 +1711,6 @@ }, "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": { "ajv": "^8.0.0" @@ -1852,8 +1726,6 @@ }, "node_modules/@stoplight/spectral-formats": { "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-formats/-/spectral-formats-1.8.3.tgz", - "integrity": "sha512-lfYzkHYS2mZQdm3k+TQ0lvXZ66vdBzJuy6awA4kXgQ0jWBbOC/FHzhBk5BaIVo2QRLUAGjMqWSd72WFryi+EvA==", "license": "Apache-2.0", "dependencies": { "@stoplight/json": "^3.17.0", @@ -1867,8 +1739,6 @@ }, "node_modules/@stoplight/spectral-functions": { "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-functions/-/spectral-functions-1.10.3.tgz", - "integrity": "sha512-AM7Gbh7pv1Mpc6fdVuR7N6C5t5KT3QKDHeBPA27Cw/GAch1VJnHkCV9R/SxDrvOgZ3tL1xrtAGFuNFwRvVdz3g==", "license": "Apache-2.0", "dependencies": { "@stoplight/better-ajv-errors": "1.0.3", @@ -1889,8 +1759,6 @@ }, "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": { "ajv": "^8.0.0" @@ -1906,8 +1774,6 @@ }, "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", "dependencies": { "@stoplight/json": "~3.21.0", @@ -1921,8 +1787,6 @@ }, "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": { "@types/json-schema": "^7.0.4", @@ -1934,8 +1798,6 @@ }, "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", @@ -1950,8 +1812,6 @@ }, "node_modules/@stoplight/spectral-rulesets": { "version": "1.22.4", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-rulesets/-/spectral-rulesets-1.22.4.tgz", - "integrity": "sha512-Lwr4DVg8aEqiBcm2CMQAP1FIBmLP9Y8Z2st7jvbxzv3fXmThdafVMy6CrydWH46T4Wotm+UuBJFnqJd9H4RQZQ==", "license": "Apache-2.0", "dependencies": { "@asyncapi/specs": "^6.8.0", @@ -1976,8 +1836,6 @@ }, "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": { "ajv": "^8.0.0" @@ -1993,8 +1851,6 @@ }, "node_modules/@stoplight/spectral-runtime": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@stoplight/spectral-runtime/-/spectral-runtime-1.1.5.tgz", - "integrity": "sha512-6/HSCQBKnI4M5qonCKos2W7oggXv+U/ml+m/cAd4eJAYfIVEmaLUo03qSWIIl4cBc5ujJPmn2WnCiRrz1++P7Q==", "license": "Apache-2.0", "dependencies": { "@stoplight/json": "^3.20.1", @@ -2011,8 +1867,6 @@ }, "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", @@ -2024,8 +1878,6 @@ }, "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", @@ -2039,14 +1891,10 @@ }, "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/@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": { "@types/json-schema": "^7.0.4", @@ -2058,8 +1906,6 @@ }, "node_modules/@tokenizer/inflate": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", - "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", "license": "MIT", "dependencies": { "debug": "^4.4.3", @@ -2075,8 +1921,6 @@ }, "node_modules/@tokenizer/token": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", "license": "MIT" }, "node_modules/@tybys/wasm-util": { @@ -2092,8 +1936,6 @@ }, "node_modules/@types/chai": { "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, "license": "MIT", "dependencies": { @@ -2103,15 +1945,11 @@ }, "node_modules/@types/deep-eql": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true, "license": "MIT" }, "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", "dependencies": { "@types/node": "*" @@ -2119,21 +1957,15 @@ }, "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==", "dev": true, "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": "25.9.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.2.tgz", - "integrity": "sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw==", "license": "MIT", "dependencies": { "undici-types": ">=7.24.0 <7.24.7" @@ -2141,14 +1973,10 @@ }, "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/@vitest/expect": { "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.8.tgz", - "integrity": "sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2165,8 +1993,6 @@ }, "node_modules/@vitest/mocker": { "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.8.tgz", - "integrity": "sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==", "dev": true, "license": "MIT", "dependencies": { @@ -2192,8 +2018,6 @@ }, "node_modules/@vitest/pretty-format": { "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.8.tgz", - "integrity": "sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==", "dev": true, "license": "MIT", "dependencies": { @@ -2205,8 +2029,6 @@ }, "node_modules/@vitest/runner": { "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.8.tgz", - "integrity": "sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==", "dev": true, "license": "MIT", "dependencies": { @@ -2219,8 +2041,6 @@ }, "node_modules/@vitest/snapshot": { "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.8.tgz", - "integrity": "sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2235,8 +2055,6 @@ }, "node_modules/@vitest/spy": { "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.8.tgz", - "integrity": "sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==", "dev": true, "license": "MIT", "funding": { @@ -2245,8 +2063,6 @@ }, "node_modules/@vitest/utils": { "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.8.tgz", - "integrity": "sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==", "dev": true, "license": "MIT", "dependencies": { @@ -2260,8 +2076,6 @@ }, "node_modules/abort-controller": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" @@ -2272,14 +2086,10 @@ }, "node_modules/abstract-logging": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", - "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", "license": "MIT" }, "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": { "fast-deep-equal": "^3.1.3", @@ -2294,8 +2104,6 @@ }, "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" @@ -2308,8 +2116,6 @@ }, "node_modules/ajv-errors": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-3.0.0.tgz", - "integrity": "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==", "license": "MIT", "peerDependencies": { "ajv": "^8.0.1" @@ -2317,8 +2123,6 @@ }, "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": { "ajv": "^8.0.0" @@ -2334,8 +2138,6 @@ }, "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" @@ -2343,8 +2145,6 @@ }, "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" @@ -2358,8 +2158,6 @@ }, "node_modules/anynum": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.0.tgz", - "integrity": "sha512-xjR9/zBVnUOP6ztMIIgShjsxui80nQUQH+5xJnvrYLs+90bF25/KJqaAi8mk+B4RDtX1Nspi6fmp4YTEts8SfA==", "funding": [ { "type": "github", @@ -2370,14 +2168,10 @@ }, "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/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": { "call-bound": "^1.0.3", @@ -2392,8 +2186,6 @@ }, "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": { "array-buffer-byte-length": "^1.0.1", @@ -2413,8 +2205,6 @@ }, "node_modules/assertion-error": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", "engines": { @@ -2423,8 +2213,6 @@ }, "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": { "astring": "bin/astring" @@ -2432,14 +2220,10 @@ }, "node_modules/async": { "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "license": "MIT" }, "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": ">= 0.4" @@ -2447,8 +2231,6 @@ }, "node_modules/atomic-sleep": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", "license": "MIT", "engines": { "node": ">=8.0.0" @@ -2456,8 +2238,6 @@ }, "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", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -2471,8 +2251,6 @@ }, "node_modules/avvio": { "version": "9.2.0", - "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.2.0.tgz", - "integrity": "sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==", "funding": [ { "type": "github", @@ -2491,20 +2269,14 @@ }, "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/bath-es5": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/bath-es5/-/bath-es5-3.0.3.tgz", - "integrity": "sha512-PdCioDToH3t84lP40kUFCKWCOCH389Dl1kbC8FGoqOwamxsmqxxnJSXdkTOsPoNHXjem4+sJ+bbNoQm5zeCqxg==", "license": "MIT" }, "node_modules/better-ajv-errors": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/better-ajv-errors/-/better-ajv-errors-2.0.3.tgz", - "integrity": "sha512-t1vxUP+vYKsaYi/BbKo2K98nEAZmfi4sjwvmRT8aOPDzPJeAtLurfoIDazVkLILxO4K+Sw4YrLYnBQ46l6pePg==", "license": "Apache-2.0", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -2522,8 +2294,6 @@ }, "node_modules/brace-expansion": { "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -2532,8 +2302,6 @@ }, "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", @@ -2550,8 +2318,6 @@ }, "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", @@ -2563,8 +2329,6 @@ }, "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", @@ -2579,14 +2343,10 @@ }, "node_modules/call-me-maybe": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", "license": "MIT" }, "node_modules/case-anything": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-3.1.2.tgz", - "integrity": "sha512-wljhAjDDIv/hM2FzgJnYQg90AWmZMNtESCjTeLH680qTzdo0nErlCxOmgzgX4ZsZAtIvqHyD87ES8QyriXB+BQ==", "license": "MIT", "engines": { "node": ">=18" @@ -2597,8 +2357,6 @@ }, "node_modules/chai": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", "engines": { @@ -2607,8 +2365,6 @@ }, "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", @@ -2623,8 +2379,6 @@ }, "node_modules/charset": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", - "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", "license": "MIT", "engines": { "node": ">=4.0.0" @@ -2632,8 +2386,6 @@ }, "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==", "license": "ISC", "dependencies": { "string-width": "^4.2.0", @@ -2646,8 +2398,6 @@ }, "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" @@ -2658,20 +2408,14 @@ }, "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/colorette": { "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "license": "MIT" }, "node_modules/commander": { "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "license": "MIT", "engines": { "node": "^12.20.0 || >=14" @@ -2679,8 +2423,6 @@ }, "node_modules/compute-gcd": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz", - "integrity": "sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==", "dependencies": { "validate.io-array": "^1.0.3", "validate.io-function": "^1.0.2", @@ -2689,8 +2431,6 @@ }, "node_modules/compute-lcm": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz", - "integrity": "sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==", "dependencies": { "compute-gcd": "^1.2.1", "validate.io-array": "^1.0.3", @@ -2700,21 +2440,15 @@ }, "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/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": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", - "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", "license": "MIT", "engines": { "node": ">=18" @@ -2726,14 +2460,10 @@ }, "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==", "license": "MIT" }, "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", @@ -2749,8 +2479,6 @@ }, "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", @@ -2766,8 +2494,6 @@ }, "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", @@ -2783,8 +2509,6 @@ }, "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" @@ -2800,8 +2524,6 @@ }, "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", @@ -2817,8 +2539,6 @@ }, "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", @@ -2834,8 +2554,6 @@ }, "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" @@ -2843,8 +2561,6 @@ }, "node_modules/dequal": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "license": "MIT", "engines": { "node": ">=6" @@ -2852,14 +2568,10 @@ }, "node_modules/dereference-json-schema": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dereference-json-schema/-/dereference-json-schema-0.2.2.tgz", - "integrity": "sha512-w8dUsJyrzH4Zsj8W/tKcjLsmcTKXfdNf+n3BBm1SAfnqpaCodgEUWqQGJ+pNb9NOqPwYMGvUnZZ8nQfeFjJlbQ==", "license": "MIT" }, "node_modules/detect-libc": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2868,8 +2580,6 @@ }, "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", @@ -2882,14 +2592,10 @@ }, "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/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", @@ -2956,8 +2662,6 @@ }, "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", @@ -2978,8 +2682,6 @@ }, "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" @@ -2987,8 +2689,6 @@ }, "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" @@ -2996,15 +2696,11 @@ }, "node_modules/es-module-lexer": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", - "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", "dev": true, "license": "MIT" }, "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" @@ -3015,8 +2711,6 @@ }, "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", @@ -3030,8 +2724,6 @@ }, "node_modules/es-to-primitive": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "license": "MIT", "dependencies": { "is-callable": "^1.2.7", @@ -3047,14 +2739,10 @@ }, "node_modules/es6-promise": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", "license": "MIT" }, "node_modules/esbuild": { "version": "0.28.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", - "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -3095,8 +2783,6 @@ }, "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" @@ -3104,8 +2790,6 @@ }, "node_modules/estree-walker": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", "dependencies": { @@ -3114,8 +2798,6 @@ }, "node_modules/event-target-shim": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "license": "MIT", "engines": { "node": ">=6" @@ -3123,8 +2805,6 @@ }, "node_modules/expect-type": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3133,8 +2813,6 @@ }, "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" @@ -3142,20 +2820,14 @@ }, "node_modules/fast-decode-uri-component": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", - "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", "license": "MIT" }, "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-json-stringify": { "version": "6.4.0", - "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.4.0.tgz", - "integrity": "sha512-ibRCQ0GZKJIQ+P3Et1h0LhPgp3PMTYk0MH8O+kW3lNYsvmaQww5Nn3f1jf73Q0jR1Yz3a1CDP4/NZD3vOajWJQ==", "funding": [ { "type": "github", @@ -3178,14 +2850,10 @@ }, "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-querystring": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", - "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", "license": "MIT", "dependencies": { "fast-decode-uri-component": "^1.0.1" @@ -3193,14 +2861,10 @@ }, "node_modules/fast-safe-stringify": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "license": "MIT" }, "node_modules/fast-uri": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "funding": [ { "type": "github", @@ -3215,8 +2879,6 @@ }, "node_modules/fast-xml-builder": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", - "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", "funding": [ { "type": "github", @@ -3231,8 +2893,6 @@ }, "node_modules/fast-xml-parser": { "version": "5.8.0", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.8.0.tgz", - "integrity": "sha512-6bIM7fsJxeo3uXv7OncQYsBAMPJ7V16Slahl/6M98C/i2q+vB1+4a0MtrvYwDFEUrwDSbAmeLDRXsOBwrL7yAg==", "funding": [ { "type": "github", @@ -3253,8 +2913,6 @@ }, "node_modules/fastify": { "version": "5.8.5", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.8.5.tgz", - "integrity": "sha512-Yqptv59pQzPgQUSIm87hMqHJmdkb1+GPxdE6vW6FRyVE9G86mt7rOghitiU4JHRaTyDUk9pfeKmDeu70lAwM4Q==", "funding": [ { "type": "github", @@ -3286,8 +2944,6 @@ }, "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" @@ -3295,8 +2951,6 @@ }, "node_modules/fdir": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { @@ -3313,8 +2967,6 @@ }, "node_modules/file-type": { "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -3322,8 +2974,6 @@ }, "node_modules/find-my-way": { "version": "9.6.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.6.0.tgz", - "integrity": "sha512-Zf4Xve4RymLl7NgaavNebZ01joJ8MfVerOG43wy7SHLO+r+K0C6d/SE0BiR7AV5V1VOCFlOP7ecdo+I4qmiHrQ==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -3336,8 +2986,6 @@ }, "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" @@ -3351,16 +2999,11 @@ }, "node_modules/foreach": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", - "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", "license": "MIT" }, "node_modules/fsevents": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ @@ -3372,8 +3015,6 @@ }, "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" @@ -3381,8 +3022,6 @@ }, "node_modules/function.prototype.name": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -3401,8 +3040,6 @@ }, "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" @@ -3410,8 +3047,6 @@ }, "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" @@ -3419,8 +3054,6 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" @@ -3428,8 +3061,6 @@ }, "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", @@ -3452,8 +3083,6 @@ }, "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", @@ -3465,8 +3094,6 @@ }, "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", @@ -3482,8 +3109,6 @@ }, "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", @@ -3498,8 +3123,6 @@ }, "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" @@ -3510,8 +3133,6 @@ }, "node_modules/graphlib": { "version": "2.1.8", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", - "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", "license": "MIT", "dependencies": { "lodash": "^4.17.15" @@ -3519,8 +3140,6 @@ }, "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" @@ -3531,8 +3150,6 @@ }, "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" @@ -3540,8 +3157,6 @@ }, "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" @@ -3552,8 +3167,6 @@ }, "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" @@ -3567,8 +3180,6 @@ }, "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" @@ -3579,8 +3190,6 @@ }, "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" @@ -3594,8 +3203,6 @@ }, "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" @@ -3606,20 +3213,14 @@ }, "node_modules/http-reasons": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", - "integrity": "sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ==", "license": "Apache-2.0" }, "node_modules/http2-client": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", - "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==", "license": "MIT" }, "node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -3630,8 +3231,6 @@ }, "node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -3650,14 +3249,10 @@ }, "node_modules/immediate": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "license": "MIT" }, "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", @@ -3666,14 +3261,10 @@ }, "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/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", @@ -3686,8 +3277,6 @@ }, "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", @@ -3703,8 +3292,6 @@ }, "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", @@ -3722,8 +3309,6 @@ }, "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" @@ -3737,8 +3322,6 @@ }, "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", @@ -3753,8 +3336,6 @@ }, "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" @@ -3765,8 +3346,6 @@ }, "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", @@ -3782,8 +3361,6 @@ }, "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", @@ -3798,8 +3375,6 @@ }, "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" @@ -3813,8 +3388,6 @@ }, "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==", "license": "MIT", "engines": { "node": ">=8" @@ -3822,8 +3395,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", @@ -3841,8 +3412,6 @@ }, "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" @@ -3853,8 +3422,6 @@ }, "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" @@ -3865,8 +3432,6 @@ }, "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", @@ -3881,8 +3446,6 @@ }, "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", @@ -3899,8 +3462,6 @@ }, "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" @@ -3911,8 +3472,6 @@ }, "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" @@ -3926,8 +3485,6 @@ }, "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", @@ -3942,8 +3499,6 @@ }, "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", @@ -3959,8 +3514,6 @@ }, "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" @@ -3974,8 +3527,6 @@ }, "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" @@ -3986,8 +3537,6 @@ }, "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" @@ -4001,8 +3550,6 @@ }, "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", @@ -4017,14 +3564,10 @@ }, "node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT" }, "node_modules/iterare": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", - "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", "license": "ISC", "engines": { "node": ">=6" @@ -4032,8 +3575,6 @@ }, "node_modules/js-levenshtein": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -4041,14 +3582,10 @@ }, "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.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", "funding": [ { "type": "github", @@ -4069,8 +3606,6 @@ }, "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" @@ -4078,8 +3613,6 @@ }, "node_modules/json-pointer": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", - "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", "license": "MIT", "dependencies": { "foreach": "^2.0.4" @@ -4087,8 +3620,6 @@ }, "node_modules/json-schema-compare": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz", - "integrity": "sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==", "license": "MIT", "dependencies": { "lodash": "^4.17.4" @@ -4096,8 +3627,6 @@ }, "node_modules/json-schema-merge-allof": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/json-schema-merge-allof/-/json-schema-merge-allof-0.8.1.tgz", - "integrity": "sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w==", "license": "MIT", "dependencies": { "compute-lcm": "^1.1.2", @@ -4110,8 +3639,6 @@ }, "node_modules/json-schema-ref-resolver": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.0.tgz", - "integrity": "sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A==", "funding": [ { "type": "github", @@ -4129,8 +3656,6 @@ }, "node_modules/json-schema-to-ts": { "version": "2.7.2", - "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-2.7.2.tgz", - "integrity": "sha512-R1JfqKqbBR4qE8UyBR56Ms30LL62/nlhoz+1UkfI/VE7p54Awu919FZ6ZUPG8zIa3XB65usPJgr1ONVncUGSaQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -4143,20 +3668,14 @@ }, "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/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/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", @@ -4173,8 +3692,6 @@ }, "node_modules/jsonpath-rfc9535": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsonpath-rfc9535/-/jsonpath-rfc9535-1.3.0.tgz", - "integrity": "sha512-3jFHya7oZ45aDxIIdx+/zQARahHXxFSMWBkcBUldfXpLS9VCXDJyTKt35kQfEXLqh0K3Ixw/9xFnvcDStaxh7Q==", "license": "Apache-2.0", "engines": { "node": ">=20" @@ -4182,8 +3699,6 @@ }, "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" @@ -4191,8 +3706,6 @@ }, "node_modules/jszip": { "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "license": "(MIT OR GPL-3.0-or-later)", "dependencies": { "lie": "~3.3.0", @@ -4203,8 +3716,6 @@ }, "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" @@ -4212,8 +3723,6 @@ }, "node_modules/lie": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "license": "MIT", "dependencies": { "immediate": "~3.0.5" @@ -4221,8 +3730,6 @@ }, "node_modules/light-my-request": { "version": "6.6.0", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.6.0.tgz", - "integrity": "sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==", "funding": [ { "type": "github", @@ -4242,8 +3749,6 @@ }, "node_modules/light-my-request/node_modules/process-warning": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz", - "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==", "funding": [ { "type": "github", @@ -4258,8 +3763,6 @@ }, "node_modules/lightningcss": { "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", "dev": true, "license": "MPL-2.0", "dependencies": { @@ -4309,8 +3812,6 @@ }, "node_modules/lightningcss-darwin-arm64": { "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", "cpu": [ "arm64" ], @@ -4531,8 +4032,6 @@ }, "node_modules/liquid-json": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz", - "integrity": "sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ==", "license": "Apache-2.0", "engines": { "node": ">=4" @@ -4540,8 +4039,6 @@ }, "node_modules/load-esm": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.3.tgz", - "integrity": "sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==", "funding": [ { "type": "github", @@ -4559,26 +4056,18 @@ }, "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.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/magic-string": { "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4587,8 +4076,6 @@ }, "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" @@ -4596,8 +4083,6 @@ }, "node_modules/mime": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "license": "MIT", "bin": { "mime": "cli.js" @@ -4608,8 +4093,6 @@ }, "node_modules/mime-format": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mime-format/-/mime-format-2.0.2.tgz", - "integrity": "sha512-Y5ERWVcyh3sby9Fx2U5F1yatiTFjNsqF5NltihTWI9QgNtr5o3dbCZdcKa1l2wyfhnwwoP9HGNxga7LqZLA6gw==", "license": "Apache-2.0", "dependencies": { "charset": "^1.0.0" @@ -4617,8 +4100,6 @@ }, "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" @@ -4629,8 +4110,6 @@ }, "node_modules/mock-json-schema": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/mock-json-schema/-/mock-json-schema-1.1.2.tgz", - "integrity": "sha512-3IyduYlhfzPy+nFN8wxUjloUi1hM7l8lN5LITuauUNMQltynJIOfLf/DADwTAp2d6kvSBtWojly1EuxX5B0WkA==", "license": "MIT", "dependencies": { "lodash": "^4.17.21" @@ -4638,14 +4117,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/nanoid": { "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "dev": true, "funding": [ { @@ -4663,8 +4138,6 @@ }, "node_modules/neotraverse": { "version": "0.6.15", - "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.15.tgz", - "integrity": "sha512-HZpdkco+JeXq0G+WWpMJ4NsX3pqb5O7eR9uGz3FfoFt+LYzU8iRWp49nJtud6hsDoywM8tIrDo3gjgmOqJA8LA==", "license": "MIT", "engines": { "node": ">= 10" @@ -4672,8 +4145,6 @@ }, "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", @@ -4691,8 +4162,6 @@ }, "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" @@ -4711,8 +4180,6 @@ }, "node_modules/node-fetch-h2": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", - "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", "license": "MIT", "dependencies": { "http2-client": "^1.2.5" @@ -4723,8 +4190,6 @@ }, "node_modules/node-readfiles": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", - "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", "license": "MIT", "dependencies": { "es6-promise": "^3.2.1" @@ -4732,8 +4197,6 @@ }, "node_modules/oas-kit-common": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", - "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", "license": "BSD-3-Clause", "dependencies": { "fast-safe-stringify": "^2.0.7" @@ -4741,8 +4204,6 @@ }, "node_modules/oas-linter": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", - "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", "license": "BSD-3-Clause", "dependencies": { "@exodus/schemasafe": "^1.0.0-rc.2", @@ -4755,8 +4216,6 @@ }, "node_modules/oas-resolver": { "version": "2.5.6", - "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", - "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", "license": "BSD-3-Clause", "dependencies": { "node-fetch-h2": "^2.3.0", @@ -4774,8 +4233,6 @@ }, "node_modules/oas-resolver-browser": { "version": "2.5.6", - "resolved": "https://registry.npmjs.org/oas-resolver-browser/-/oas-resolver-browser-2.5.6.tgz", - "integrity": "sha512-Jw5elT/kwUJrnGaVuRWe1D7hmnYWB8rfDDjBnpQ+RYY/dzAewGXeTexXzt4fGEo6PUE4eqKqPWF79MZxxvMppA==", "license": "BSD-3-Clause", "dependencies": { "node-fetch-h2": "^2.3.0", @@ -4794,8 +4251,6 @@ }, "node_modules/oas-schema-walker": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", - "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", "license": "BSD-3-Clause", "funding": { "url": "https://github.com/Mermade/oas-kit?sponsor=1" @@ -4803,8 +4258,6 @@ }, "node_modules/oas-validator": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", - "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", "license": "BSD-3-Clause", "dependencies": { "call-me-maybe": "^1.0.1", @@ -4822,8 +4275,6 @@ }, "node_modules/object-hash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "license": "MIT", "engines": { "node": ">= 6" @@ -4831,8 +4282,6 @@ }, "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" @@ -4843,8 +4292,6 @@ }, "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" @@ -4852,8 +4299,6 @@ }, "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": { "call-bind": "^1.0.8", @@ -4872,8 +4317,6 @@ }, "node_modules/obug": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", "dev": true, "funding": [ "https://github.com/sponsors/sxzz", @@ -4883,8 +4326,6 @@ }, "node_modules/on-exit-leak-free": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", - "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -4892,8 +4333,6 @@ }, "node_modules/openapi-backend": { "version": "5.17.0", - "resolved": "https://registry.npmjs.org/openapi-backend/-/openapi-backend-5.17.0.tgz", - "integrity": "sha512-wyimPBoz/Gx+pqh4QwvMQRIJiZQHZkLdiyFXwfjiLwS5Jhbm7gCI+T0WTXmx7HXAYXL5Cr+016dR3CV3T/dPmQ==", "license": "MIT", "dependencies": { "@apidevtools/json-schema-ref-parser": "^11.1.0", @@ -4916,8 +4355,6 @@ }, "node_modules/openapi-sampler": { "version": "1.7.4", - "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.7.4.tgz", - "integrity": "sha512-CKS/rd5ucPCuEDbJnjGDXZTsuGWcmv53aCmQx7soZlPEONUGN4af0/dY5+THRFZraSEjeA78nlfzdFswC/N5SA==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.7", @@ -4927,8 +4364,6 @@ }, "node_modules/openapi-schema-validator": { "version": "12.1.3", - "resolved": "https://registry.npmjs.org/openapi-schema-validator/-/openapi-schema-validator-12.1.3.tgz", - "integrity": "sha512-xTHOmxU/VQGUgo7Cm0jhwbklOKobXby+/237EG967+3TQEYJztMgX9Q5UE2taZKwyKPUq0j11dngpGjUuxz1hQ==", "license": "MIT", "dependencies": { "ajv": "^8.1.0", @@ -4939,8 +4374,6 @@ }, "node_modules/openapi-schema-validator/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": { "ajv": "^8.0.0" @@ -4956,8 +4389,6 @@ }, "node_modules/openapi-to-postmanv2": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/openapi-to-postmanv2/-/openapi-to-postmanv2-6.1.0.tgz", - "integrity": "sha512-qJ/SYQT0+oNxuOgd492cocXTNPowIgXV2EhifOUzlLt5STKWW3LSoddDqZUhSK9JsMLmdU3D7xbX/xRFqtho2w==", "license": "Apache-2.0", "dependencies": { "ajv": "^8.11.0", @@ -4988,8 +4419,6 @@ }, "node_modules/openapi-to-postmanv2/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": { "ajv": "^8.0.0" @@ -5005,26 +4434,18 @@ }, "node_modules/openapi-to-postmanv2/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, "node_modules/openapi-types": { "version": "12.1.3", - "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", - "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", "license": "MIT" }, "node_modules/outdent": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.8.0.tgz", - "integrity": "sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==", "license": "MIT" }, "node_modules/own-keys": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.6", @@ -5040,20 +4461,14 @@ }, "node_modules/pako": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "license": "(MIT AND Zlib)" }, "node_modules/path-browserify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "license": "MIT" }, "node_modules/path-expression-matcher": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", - "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", "funding": [ { "type": "github", @@ -5067,8 +4482,6 @@ }, "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", "funding": { "type": "opencollective", @@ -5077,21 +4490,15 @@ }, "node_modules/pathe": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, "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.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", "engines": { "node": ">=12" @@ -5102,8 +4509,6 @@ }, "node_modules/pino": { "version": "10.3.1", - "resolved": "https://registry.npmjs.org/pino/-/pino-10.3.1.tgz", - "integrity": "sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==", "license": "MIT", "dependencies": { "@pinojs/redact": "^0.4.0", @@ -5124,8 +4529,6 @@ }, "node_modules/pino-abstract-transport": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", - "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", "license": "MIT", "dependencies": { "split2": "^4.0.0" @@ -5133,14 +4536,10 @@ }, "node_modules/pino-std-serializers": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", - "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", "license": "MIT" }, "node_modules/pluralize": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "license": "MIT", "engines": { "node": ">=4" @@ -5148,8 +4547,6 @@ }, "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": ">=12.0.0" @@ -5157,8 +4554,6 @@ }, "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": ">= 0.4" @@ -5166,8 +4561,6 @@ }, "node_modules/postcss": { "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", "dev": true, "funding": [ { @@ -5195,8 +4588,6 @@ }, "node_modules/postman-collection": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-5.3.0.tgz", - "integrity": "sha512-PMa5vRheqDFfS1bkRg8WBidWxunRA80sT5YNLP27YC5+ycyfiLMCwPnqQd1zfvxkGk04Pr9UronWmmgsbpsVyQ==", "license": "Apache-2.0", "dependencies": { "@faker-js/faker": "5.5.3", @@ -5217,15 +4608,10 @@ }, "node_modules/postman-collection/node_modules/@faker-js/faker": { "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-5.5.3.tgz", - "integrity": "sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw==", - "deprecated": "Please update to a newer version.", "license": "MIT" }, "node_modules/postman-collection/node_modules/semver": { "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -5236,8 +4622,6 @@ }, "node_modules/postman-url-encoder": { "version": "3.0.8", - "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-3.0.8.tgz", - "integrity": "sha512-EOgUMBazo7JNP4TDrd64TsooCiWzzo4143Ws8E8WYGEpn2PKpq+S4XRTDhuRTYHm3VKOpUZs7ZYZq7zSDuesqA==", "license": "Apache-2.0", "dependencies": { "punycode": "^2.3.1" @@ -5248,14 +4632,10 @@ }, "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==", "license": "MIT" }, "node_modules/process-warning": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", - "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", "funding": [ { "type": "github", @@ -5270,8 +4650,6 @@ }, "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" @@ -5279,8 +4657,6 @@ }, "node_modules/qs": { "version": "6.15.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", - "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -5294,14 +4670,10 @@ }, "node_modules/quick-format-unescaped": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", "license": "MIT" }, "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==", "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", @@ -5315,8 +4687,6 @@ }, "node_modules/real-require": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", - "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", "license": "MIT", "engines": { "node": ">= 12.13.0" @@ -5324,14 +4694,10 @@ }, "node_modules/reflect-metadata": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", "license": "Apache-2.0" }, "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", "dependencies": { "call-bind": "^1.0.8", @@ -5352,8 +4718,6 @@ }, "node_modules/reftools": { "version": "1.1.9", - "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", - "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", "license": "BSD-3-Clause", "funding": { "url": "https://github.com/Mermade/oas-kit?sponsor=1" @@ -5361,8 +4725,6 @@ }, "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", @@ -5381,8 +4743,6 @@ }, "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==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5390,8 +4750,6 @@ }, "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": ">=0.10.0" @@ -5399,8 +4757,6 @@ }, "node_modules/ret": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", - "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==", "license": "MIT", "engines": { "node": ">=10" @@ -5408,8 +4764,6 @@ }, "node_modules/reusify": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -5418,14 +4772,10 @@ }, "node_modules/rfdc": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "license": "MIT" }, "node_modules/rolldown": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", - "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", "dev": true, "license": "MIT", "dependencies": { @@ -5458,8 +4808,6 @@ }, "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" @@ -5467,8 +4815,6 @@ }, "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", @@ -5486,20 +4832,14 @@ }, "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/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==", "license": "MIT" }, "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", @@ -5514,14 +4854,10 @@ }, "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", @@ -5537,8 +4873,6 @@ }, "node_modules/safe-regex2": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.1.1.tgz", - "integrity": "sha512-mOSBvHGDZMuIEZMdOz/aCEYDCv0E7nfcNsIhUF+/P+xC7Hyf3FkvymqgPbg9D1EdSGu+uKbJgy09K/RKKc7kJA==", "funding": [ { "type": "github", @@ -5559,8 +4893,6 @@ }, "node_modules/safe-stable-stringify": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "license": "MIT", "engines": { "node": ">=10" @@ -5568,14 +4900,10 @@ }, "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" }, "node_modules/secure-json-parse": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.0.tgz", - "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==", "funding": [ { "type": "github", @@ -5590,8 +4918,6 @@ }, "node_modules/semver": { "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -5602,14 +4928,10 @@ }, "node_modules/set-cookie-parser": { "version": "2.7.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", "license": "MIT" }, "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", @@ -5625,8 +4947,6 @@ }, "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", @@ -5640,8 +4960,6 @@ }, "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", @@ -5654,14 +4972,10 @@ }, "node_modules/setimmediate": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "license": "MIT" }, "node_modules/should": { "version": "13.2.3", - "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", - "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", "license": "MIT", "dependencies": { "should-equal": "^2.0.0", @@ -5673,8 +4987,6 @@ }, "node_modules/should-equal": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", - "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", "license": "MIT", "dependencies": { "should-type": "^1.4.0" @@ -5682,8 +4994,6 @@ }, "node_modules/should-format": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", - "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", "license": "MIT", "dependencies": { "should-type": "^1.3.0", @@ -5692,14 +5002,10 @@ }, "node_modules/should-type": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", - "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", "license": "MIT" }, "node_modules/should-type-adaptors": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", - "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", "license": "MIT", "dependencies": { "should-type": "^1.3.0", @@ -5708,14 +5014,10 @@ }, "node_modules/should-util": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", - "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", "license": "MIT" }, "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", @@ -5733,8 +5035,6 @@ }, "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", @@ -5749,8 +5049,6 @@ }, "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": { "call-bound": "^1.0.2", @@ -5767,8 +5065,6 @@ }, "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": { "call-bound": "^1.0.2", @@ -5786,15 +5082,11 @@ }, "node_modules/siginfo": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, "license": "ISC" }, "node_modules/sonic-boom": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz", - "integrity": "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==", "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0" @@ -5802,8 +5094,6 @@ }, "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==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -5812,8 +5102,6 @@ }, "node_modules/split2": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "license": "ISC", "engines": { "node": ">= 10.x" @@ -5821,22 +5109,16 @@ }, "node_modules/stackback": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, "license": "MIT" }, "node_modules/std-env": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", - "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", "dev": true, "license": "MIT" }, "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", @@ -5848,8 +5130,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==", "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -5857,8 +5137,6 @@ }, "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==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -5871,8 +5149,6 @@ }, "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", @@ -5893,8 +5169,6 @@ }, "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", @@ -5911,8 +5185,6 @@ }, "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", @@ -5928,8 +5200,6 @@ }, "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" @@ -5940,8 +5210,6 @@ }, "node_modules/strnum": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.0.tgz", - "integrity": "sha512-sHrVyWWdq28RbhjuJdZsA1SnGRJV6NiXbk6AXBxDOsgAcA+lmpUZCYjOdLBxkXMwis6RRe7dlZt4VlIWFVzkmg==", "funding": [ { "type": "github", @@ -5955,8 +5223,6 @@ }, "node_modules/strtok3": { "version": "10.3.5", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.5.tgz", - "integrity": "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==", "license": "MIT", "dependencies": { "@tokenizer/token": "^0.3.0" @@ -5971,8 +5237,6 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -5983,8 +5247,6 @@ }, "node_modules/swagger2openapi": { "version": "7.0.8", - "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", - "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", "license": "BSD-3-Clause", "dependencies": { "call-me-maybe": "^1.0.1", @@ -6010,8 +5272,6 @@ }, "node_modules/thread-stream": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.2.0.tgz", - "integrity": "sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ==", "license": "MIT", "dependencies": { "real-require": "^1.0.0" @@ -6022,21 +5282,15 @@ }, "node_modules/thread-stream/node_modules/real-require": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-1.0.0.tgz", - "integrity": "sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g==", "license": "MIT" }, "node_modules/tinybench": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, "license": "MIT" }, "node_modules/tinyexec": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", - "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", "dev": true, "license": "MIT", "engines": { @@ -6045,8 +5299,6 @@ }, "node_modules/tinyglobby": { "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", "dependencies": { @@ -6062,8 +5314,6 @@ }, "node_modules/tinyrainbow": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", "dev": true, "license": "MIT", "engines": { @@ -6072,8 +5322,6 @@ }, "node_modules/toad-cache": { "version": "3.7.1", - "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.1.tgz", - "integrity": "sha512-5DXWzE4Vz7xNHsv+xQ+MGfJYyC78Aok3tEr0MNwHoRf7vZnga1mQXZ4/Nsodld4VR6Wd+VhfmqnNrsRJyYPfrQ==", "license": "MIT", "engines": { "node": ">=20" @@ -6081,8 +5329,6 @@ }, "node_modules/token-types": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz", - "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==", "license": "MIT", "dependencies": { "@borewit/text-codec": "^0.2.1", @@ -6099,26 +5345,18 @@ }, "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/ts-algebra": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-1.2.2.tgz", - "integrity": "sha512-kloPhf1hq3JbCPOTYoOWDKxebWjNb2o/LKnNfkWhxVVisFFmMJPPdJeGoGmM+iRLyoXAR61e08Pb+vUXINg8aA==", "license": "MIT" }, "node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/tsx": { "version": "4.22.4", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz", - "integrity": "sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==", "dev": true, "license": "MIT", "dependencies": { @@ -6136,8 +5374,6 @@ }, "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", @@ -6150,8 +5386,6 @@ }, "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", @@ -6169,8 +5403,6 @@ }, "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", @@ -6190,8 +5422,6 @@ }, "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", @@ -6210,8 +5440,6 @@ }, "node_modules/typescript": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", - "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -6224,8 +5452,6 @@ }, "node_modules/uid": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", - "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", "license": "MIT", "dependencies": { "@lukeed/csprng": "^1.0.0" @@ -6236,8 +5462,6 @@ }, "node_modules/uint8array-extras": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", - "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", "license": "MIT", "engines": { "node": ">=18" @@ -6248,8 +5472,6 @@ }, "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", @@ -6266,26 +5488,18 @@ }, "node_modules/undici-types": { "version": "7.24.6", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", - "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", "license": "MIT" }, "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/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "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" @@ -6293,8 +5507,6 @@ }, "node_modules/uuid": { "version": "14.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz", - "integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -6306,41 +5518,29 @@ }, "node_modules/validate.io-array": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", - "integrity": "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==", "license": "MIT" }, "node_modules/validate.io-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz", - "integrity": "sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==" + "version": "1.0.2" }, "node_modules/validate.io-integer": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", - "integrity": "sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==", "dependencies": { "validate.io-number": "^1.0.3" } }, "node_modules/validate.io-integer-array": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz", - "integrity": "sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==", "dependencies": { "validate.io-array": "^1.0.3", "validate.io-integer": "^1.0.4" } }, "node_modules/validate.io-number": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", - "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==" + "version": "1.0.3" }, "node_modules/vite": { "version": "8.0.16", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", - "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", "dev": true, "license": "MIT", "dependencies": { @@ -6417,8 +5617,6 @@ }, "node_modules/vitest": { "version": "4.1.8", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.8.tgz", - "integrity": "sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==", "dev": true, "license": "MIT", "dependencies": { @@ -6507,14 +5705,10 @@ }, "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", @@ -6523,8 +5717,6 @@ }, "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", @@ -6542,8 +5734,6 @@ }, "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", @@ -6569,14 +5759,10 @@ }, "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", @@ -6593,8 +5779,6 @@ }, "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", @@ -6614,8 +5798,6 @@ }, "node_modules/why-is-node-running": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", "dependencies": { @@ -6631,8 +5813,6 @@ }, "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==", "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -6648,8 +5828,6 @@ }, "node_modules/xml-naming": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", - "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", "funding": [ { "type": "github", @@ -6663,8 +5841,6 @@ }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "license": "ISC", "engines": { "node": ">=10" @@ -6672,8 +5848,6 @@ }, "node_modules/yaml": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -6687,14 +5861,10 @@ }, "node_modules/yaml-ast-parser": { "version": "0.0.43", - "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", - "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", "license": "Apache-2.0" }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "license": "MIT", "dependencies": { "cliui": "^8.0.1", @@ -6711,8 +5881,6 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "license": "ISC", "engines": { "node": ">=12" From 6ba9d53c1bd56a5c2632541d68cbb13466874a4c Mon Sep 17 00:00:00 2001 From: pasibun Date: Tue, 16 Jun 2026 18:23:29 +0200 Subject: [PATCH 14/27] Fix npm ci lockfile entries --- package-lock.json | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/package-lock.json b/package-lock.json index 50e3d06..61753d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4436,6 +4436,24 @@ "version": "2.20.3", "license": "MIT" }, + "node_modules/openapi-to-postmanv2/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/openapi-to-postmanv2/node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, "node_modules/openapi-types": { "version": "12.1.3", "license": "MIT" @@ -4610,6 +4628,12 @@ "version": "5.5.3", "license": "MIT" }, + "node_modules/postman-collection/node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" + }, "node_modules/postman-collection/node_modules/semver": { "version": "7.7.1", "license": "ISC", From 51e31b22cbd4dc98917b909bcbccf2ca495fd831 Mon Sep 17 00:00:00 2001 From: pasibun Date: Tue, 16 Jun 2026 18:40:11 +0200 Subject: [PATCH 15/27] chore: trigger test deploy [deploy-test] From c38eb099d97f2cd2d51c959c53dce87484388e70 Mon Sep 17 00:00:00 2001 From: pasibun Date: Wed, 17 Jun 2026 09:07:45 +0200 Subject: [PATCH 16/27] fix: use full buildx action sha [deploy-test] --- .github/workflows/deploy-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-test.yml b/.github/workflows/deploy-test.yml index 86e7633..5cede02 100644 --- a/.github/workflows/deploy-test.yml +++ b/.github/workflows/deploy-test.yml @@ -51,7 +51,7 @@ jobs: uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df # v4.1.0 + uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0 - name: Login to container registry uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0 From 240f3019f78c304ec281497ec776ef681d1cf534 Mon Sep 17 00:00:00 2001 From: pasibun Date: Wed, 24 Jun 2026 09:32:30 +0200 Subject: [PATCH 17/27] Update API package dependencies --- biome.json | 2 +- package-lock.json | 764 ++++++++++++++++++++++++--------------- package.json | 18 +- test/convert-oas.test.ts | 4 +- 4 files changed, 482 insertions(+), 306 deletions(-) diff --git a/biome.json b/biome.json index 322be84..71154d9 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.4.16/schema.json", + "$schema": "https://biomejs.dev/schemas/2.5.1/schema.json", "formatter": { "indentStyle": "space", "indentWidth": 2, diff --git a/package-lock.json b/package-lock.json index 61753d8..160aaf5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,23 +11,23 @@ "dependencies": { "@developer-overheid-nl/don-tools-logic": "^0.0.1", "@fastify/cors": "^11.2.0", - "@nestjs/common": "^11.0.0", - "@nestjs/core": "^11.0.0", - "@nestjs/platform-fastify": "^11.0.0", + "@nestjs/common": "^11.1.27", + "@nestjs/core": "^11.1.27", + "@nestjs/platform-fastify": "^11.1.27", "ajv-formats": "^3.0.1", "fastify": "^5.8.5", - "js-yaml": "^4.2.0", + "js-yaml": "^5.1.0", "openapi-backend": "^5.17.0", "reflect-metadata": "^0.2.2", - "rxjs": "^7.8.1" + "rxjs": "^7.8.2" }, "devDependencies": { - "@biomejs/biome": "^2.4.16", - "@types/node": "^25.9.2", + "@biomejs/biome": "^2.5.1", + "@types/node": "^26.0.0", "tsx": "^4.22.4", "typescript": "^6.0.3", - "vite": "^8.0.16", - "vitest": "^4.1.8" + "vite": "^8.1.0", + "vitest": "^4.1.9" } }, "node_modules/@apidevtools/json-schema-ref-parser": { @@ -45,6 +45,28 @@ "url": "https://github.com/sponsors/philsturgeon" } }, + "node_modules/@apidevtools/json-schema-ref-parser/node_modules/js-yaml": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "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/@apiture/openapi-down-convert": { "version": "0.14.2", "license": "ISC", @@ -57,6 +79,28 @@ "openapi-down-convert": "lib/src/cli.js" } }, + "node_modules/@apiture/openapi-down-convert/node_modules/js-yaml": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "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/@apiture/openapi-down-convert/node_modules/typescript": { "version": "4.9.5", "license": "Apache-2.0", @@ -102,7 +146,9 @@ } }, "node_modules/@biomejs/biome": { - "version": "2.4.16", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.5.1.tgz", + "integrity": "sha512-IXWLCxKmae+rI7LOHS1B3EbVisQ6GRAWbhN9msa6KjNCyFWrvKZWR4oUdinaNssrV852OrSHuSPa95h1GPJc7Q==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -116,18 +162,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.4.16", - "@biomejs/cli-darwin-x64": "2.4.16", - "@biomejs/cli-linux-arm64": "2.4.16", - "@biomejs/cli-linux-arm64-musl": "2.4.16", - "@biomejs/cli-linux-x64": "2.4.16", - "@biomejs/cli-linux-x64-musl": "2.4.16", - "@biomejs/cli-win32-arm64": "2.4.16", - "@biomejs/cli-win32-x64": "2.4.16" + "@biomejs/cli-darwin-arm64": "2.5.1", + "@biomejs/cli-darwin-x64": "2.5.1", + "@biomejs/cli-linux-arm64": "2.5.1", + "@biomejs/cli-linux-arm64-musl": "2.5.1", + "@biomejs/cli-linux-x64": "2.5.1", + "@biomejs/cli-linux-x64-musl": "2.5.1", + "@biomejs/cli-win32-arm64": "2.5.1", + "@biomejs/cli-win32-x64": "2.5.1" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.4.16", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-npqDzvqv7vFaWRiNN1Te71siRgPaqS9MpqgYCdP/CrUbkJ7ApezaeaKjueKHRN/JH/6lRjJQAHi8acQDCAz22w==", "cpu": [ "arm64" ], @@ -142,9 +190,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.4.16", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.16.tgz", - "integrity": "sha512-xFCqGPwYusQJp4N4NJLi1XJiZqjwFdjhT+KqtNy+Ug3qgfczqnTa6MSDvxJF6TkuDLoYJItMapz6tAf7kCekFw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.5.1.tgz", + "integrity": "sha512-RgwTqPAM8g2tn1j+b5oRjF/DbSBX8a4gwojtuG9XuhfK7GgomvZ9+T+tqjXiVbjLEeGJOoL6VEk8mvRTVeSybw==", "cpu": [ "x64" ], @@ -159,9 +207,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.4.16", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.16.tgz", - "integrity": "sha512-2kFb4//jxfZaP6D+Rj5VkHkxgyD9EoRAVBEQb8PKRv+s4NO2zYNJKXFaJmK1CmhufJOWEfpHKaRbOja7qjmdhQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.5.1.tgz", + "integrity": "sha512-yhV35CzZh38VyMvTEXi3JTjxZBs++oCKK9KG8vB6VI5+uvQvZNR3BFWEKKzuOmx9DJJj7sQpZ4LQJcmbGTs3+Q==", "cpu": [ "arm64" ], @@ -179,9 +227,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.4.16", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.16.tgz", - "integrity": "sha512-oYxnW0ARfJkr72ezzF2OR8N/rtkgLUQeYtF8cFhVswbknHxtTcmzSsanVJP8yQKnGpGpc2ck6c5zLvHahL6Cbg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-WMcvMLgByyTqVxGlq918NBBYliq9FRR9GAQVETHb+VjGVqXCZFfHlZHC1FX4ibuYY/Hg6TJE3rHU0xVrdJXNRw==", "cpu": [ "arm64" ], @@ -199,9 +247,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.4.16", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.16.tgz", - "integrity": "sha512-NbcBbi/nJqn5baae6wqRXdS7Gadf2uRpehSh6vMSYpG8OhkXl/Xg8aorWrJ+9VWqAT5ml90alLvorkpMW0nBwQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.5.1.tgz", + "integrity": "sha512-J/7uHSX7NfoYDI7HijAkd8lnQIOrRb2W7j3X+tw4R+N5ExvXGsyXFiGdQcfcxfOmNQmZVSQOCDk757fwpzqQcg==", "cpu": [ "x64" ], @@ -219,9 +267,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.4.16", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.16.tgz", - "integrity": "sha512-iHDS+MCM65DPqWGu+ECC3uoALyj2H7F4nVUPxIPjz/PIl94EUu+EDfGZDzFP+NY1EOPVt9NQvwFqq7HdMmowdg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-ANTowtlLmPYm5yeMckWY8Xzb9Ix+JJP3tgHR/n6xRj1VWyIzzWtfRfih9hv9VmClwadpBvZduISZIbBsIlYG3A==", "cpu": [ "x64" ], @@ -239,9 +287,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.4.16", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.16.tgz", - "integrity": "sha512-0rgImMsNb5v/chhkIFe3wu7PEFClS6RBAYUijGL9UsYN3PanSaoK24HSSuSJb1pYbYYVjzAyZTl3gtjJ84BM8A==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.5.1.tgz", + "integrity": "sha512-zgXnKNgWPC4iPF7Y1lR3STUeCUuZRpD6IiOrC7TZTlh0Lx6FiVUT05myuMQHQ9D+1cc7uyMldi4forE6lp0ivQ==", "cpu": [ "arm64" ], @@ -256,9 +304,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.4.16", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.16.tgz", - "integrity": "sha512-Kp85jgoBHa05gix6UIRjfCDiUV3w/8VIdZ247VyyO2gEjaw12WEVhdIjlxp/AMzXxqxQwbxNTDVZ3Mwd2RG5rw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.5.1.tgz", + "integrity": "sha512-6uxpR9hvaglANkZemeSiN/FhYgkGasrEGn267eXIWvjrjJ2LhDlk251IhjVJq6MXzkV2/bcXwLwSroLyPtqRZg==", "cpu": [ "x64" ], @@ -292,6 +340,8 @@ }, "node_modules/@developer-overheid-nl/don-tools-logic": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@developer-overheid-nl/don-tools-logic/-/don-tools-logic-0.0.1.tgz", + "integrity": "sha512-8KJOreUcPrXbPvJ4WuyE9ChtVt8U1VbYeGlyWvsMGBMQaNsGfkhCskGS+EQ4YynjrMjra5n9+5+RV88dzoA14Q==", "license": "EUPL-1.2", "dependencies": { "@apiture/openapi-down-convert": "^0.14.2", @@ -311,22 +361,44 @@ "pnpm": ">=11" } }, + "node_modules/@developer-overheid-nl/don-tools-logic/node_modules/js-yaml": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "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/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.2.1", + "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", "dev": true, "license": "MIT", "optional": true, @@ -335,9 +407,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", "dev": true, "license": "MIT", "optional": true, @@ -346,9 +418,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", - "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", + "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" ], @@ -363,9 +435,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", - "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", "cpu": [ "arm" ], @@ -380,9 +452,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", - "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", "cpu": [ "arm64" ], @@ -397,9 +469,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", - "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", + "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" ], @@ -414,7 +486,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.0", + "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" ], @@ -429,9 +503,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", - "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", "cpu": [ "x64" ], @@ -446,9 +520,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", - "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", + "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" ], @@ -463,9 +537,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", - "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", + "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" ], @@ -480,9 +554,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", - "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", + "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" ], @@ -497,9 +571,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", - "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", + "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" ], @@ -514,9 +588,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", - "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", + "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" ], @@ -531,9 +605,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", - "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", + "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" ], @@ -548,9 +622,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", - "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", "cpu": [ "mips64el" ], @@ -565,9 +639,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", - "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", + "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" ], @@ -582,9 +656,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", - "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", "cpu": [ "riscv64" ], @@ -599,9 +673,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", - "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", + "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" ], @@ -616,9 +690,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", - "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", + "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" ], @@ -633,9 +707,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", - "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", + "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" ], @@ -650,9 +724,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", - "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", "cpu": [ "x64" ], @@ -667,9 +741,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", - "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", + "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" ], @@ -684,9 +758,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", - "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", + "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" ], @@ -701,9 +775,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", - "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", "cpu": [ "arm64" ], @@ -718,9 +792,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", - "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", + "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" ], @@ -735,9 +809,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", - "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", + "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" ], @@ -752,9 +826,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", - "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", + "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" ], @@ -769,9 +843,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", - "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", + "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" ], @@ -818,6 +892,8 @@ }, "node_modules/@fastify/cors": { "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@fastify/cors/-/cors-11.2.0.tgz", + "integrity": "sha512-LbLHBuSAdGdSFZYTLVA3+Ch2t+sA6nq3Ejc6XLAKiQ6ViS2qFnvicpj0htsx03FyYeLs04HfRNBsz/a8SvbcUw==", "funding": [ { "type": "github", @@ -976,6 +1052,8 @@ }, "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==", "dev": true, "license": "MIT" }, @@ -1021,14 +1099,14 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz", - "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@tybys/wasm-util": "^0.10.2" + "@tybys/wasm-util": "^0.10.3" }, "funding": { "type": "github", @@ -1040,7 +1118,9 @@ } }, "node_modules/@nestjs/common": { - "version": "11.1.26", + "version": "11.1.27", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.27.tgz", + "integrity": "sha512-kEGSzqM2lWr4whh4Ubflw+oPZSEzxvRMu9WL+LveZploJWTjec5bBlCiRVlVzTPg2kIwBiLwWSvCCW7Wnin1gg==", "license": "MIT", "dependencies": { "file-type": "21.3.4", @@ -1085,7 +1165,9 @@ } }, "node_modules/@nestjs/core": { - "version": "11.1.26", + "version": "11.1.27", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.27.tgz", + "integrity": "sha512-K6DX7hcqmZdeXkv7tsPakKBRCgqL19a4mtbX4FluY0hWtFdtPKp6lbe+lb8gWPfvLdbOWr/CPScn7BSjBX+Ecg==", "license": "MIT", "dependencies": { "fast-safe-stringify": "2.1.1", @@ -1122,14 +1204,16 @@ } }, "node_modules/@nestjs/platform-fastify": { - "version": "11.1.26", + "version": "11.1.27", + "resolved": "https://registry.npmjs.org/@nestjs/platform-fastify/-/platform-fastify-11.1.27.tgz", + "integrity": "sha512-rZMPS0RMP9P2O7Y/shAP0kKwrHElGO9cPTlgtdWpQ6JEX58uhYEJLGsU/X9a9l18DNSxxb3YjrEiVVuI2Iv6MA==", "license": "MIT", "dependencies": { "@fastify/cors": "11.2.0", "@fastify/formbody": "8.0.2", "fast-querystring": "1.1.2", "fastify": "5.8.5", - "fastify-plugin": "5.1.0", + "fastify-plugin": "6.0.0", "find-my-way": "9.6.0", "light-my-request": "6.6.0", "path-to-regexp": "8.4.2", @@ -1142,7 +1226,7 @@ }, "peerDependencies": { "@fastify/static": "^8.0.0 || ^9.0.0", - "@fastify/view": "^10.0.0 || ^11.0.0", + "@fastify/view": "^10.0.0 || ^11.0.0 || ^12.0.0", "@nestjs/common": "^11.0.0", "@nestjs/core": "^11.0.0" }, @@ -1155,20 +1239,6 @@ } } }, - "node_modules/@nestjs/platform-fastify/node_modules/fastify-plugin": { - "version": "5.1.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "MIT" - }, "node_modules/@noble/hashes": { "version": "1.8.0", "license": "MIT", @@ -1190,7 +1260,9 @@ "license": "MIT" }, "node_modules/@oxc-project/types": { - "version": "0.133.0", + "version": "0.137.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.137.0.tgz", + "integrity": "sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==", "dev": true, "license": "MIT", "funding": { @@ -1261,6 +1333,28 @@ "version": "1.4.0", "license": "MIT" }, + "node_modules/@redocly/openapi-core/node_modules/js-yaml": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "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/@redocly/respect-core": { "version": "2.32.0", "license": "MIT", @@ -1299,9 +1393,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", - "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.2.tgz", + "integrity": "sha512-2cZ+7xRS+DBcuJBJKnfzsbleumJhBqSlJVpuzHC0nTqfd3QQ7Vx2/x5YR/D7cBamKSeWplwo82Fn9lqYUDEMfA==", "cpu": [ "arm64" ], @@ -1316,7 +1410,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.3", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.2.tgz", + "integrity": "sha512-RkPMJnygxsgOYdkfqgpwY0/Fzm8d0VQe6HGU2/B00Xa9eqdLbrII+DOKAodbJAn3ZL1AJxGHkZRPYazgGY6Ljw==", "cpu": [ "arm64" ], @@ -1331,9 +1427,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", - "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.2.tgz", + "integrity": "sha512-Uiczh6vFhwyfd7WNe7Q7mCA4KxAiLdz7jPE/WGizfRpIieoyFuNVMmM8HqZ9HwudTkY6/AeMQwlNJ9NJijguWw==", "cpu": [ "x64" ], @@ -1348,9 +1444,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", - "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.2.tgz", + "integrity": "sha512-+TpdtTRgHiJFjCVFbw311SuLk3KfytPOQQn+VlAEv+gBxYPtL7E6JS9e/tk+8CwxhIZvemJKo4rTKgfWNsKkkA==", "cpu": [ "x64" ], @@ -1365,9 +1461,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", - "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.2.tgz", + "integrity": "sha512-4lv1/tkmi7ueIVHnyreaOeUpiZP26BH9rRy6hoYfR9310A2B9nUEVRDvBx69vx64Nr3eTPPRkyciqJJs+j9Jmw==", "cpu": [ "arm" ], @@ -1382,9 +1478,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", - "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.2.tgz", + "integrity": "sha512-gBSUVO0eaWgw1JMjK3gB8BMlX2Mk148s2lTiVT3e9vjVxbl7UDfMWWY8CfIaaqiXuM9fVTMxIpUz6CAo/B6Vlw==", "cpu": [ "arm64" ], @@ -1402,9 +1498,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", - "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.2.tgz", + "integrity": "sha512-LjQP/iZLBu8o8PjIfk4x3At0/mT6h282pvz8Z5LAyhGbu/kDezyO7ea62rF5uoqmgnIYqbN/MqJ3Si3Aymi7xQ==", "cpu": [ "arm64" ], @@ -1422,9 +1518,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", - "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.2.tgz", + "integrity": "sha512-X/7bVLWelEsbyWDUSXt7zVsTniLLPIY2n1rH58qr78l9i7MNbbxBWD8gI2vRfBWf4NUXJCUuQnfZDsp32LqsfQ==", "cpu": [ "ppc64" ], @@ -1442,9 +1538,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", - "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.2.tgz", + "integrity": "sha512-gb6dYKW/1KDorGXyy48glEBJs/sxVSC5pcVrox/pFGV4mvwSFeg2sK5L2tRkVsVlh7kueqOgg4GEcuipJcGuKg==", "cpu": [ "s390x" ], @@ -1462,9 +1558,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", - "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.2.tgz", + "integrity": "sha512-JY4w85pU3iAiJVMh5nuk4/Mh9GjMsupe8MrIN53rwxAZW64GKrWeJBuN6SxQg9QTU5uB1cxyhDzW8jqRn1EABw==", "cpu": [ "x64" ], @@ -1482,9 +1578,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", - "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.2.tgz", + "integrity": "sha512-xvpA7o5KCYLB0Rwscmuylb1/zHHSUx4g4xilm4prC5jP76pEUlzBmMbgpbh7bVDbId4NcfT96gN5i6mE6UDaiw==", "cpu": [ "x64" ], @@ -1502,9 +1598,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", - "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.2.tgz", + "integrity": "sha512-p/ts6KBLjuk49Bp21XH77poQGt02iNz7ChgHep7tudPOaLinR/De/RHdxF8w8Yj4r/bF/bqXwH6PZrB2sA+Nvw==", "cpu": [ "arm64" ], @@ -1519,9 +1615,9 @@ } }, "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", - "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.2.tgz", + "integrity": "sha512-VMu/wmrZ9hJzYlRhbw7jK5PODlugyKZ5mOdX78+lS8OvuFkWNQdz1pFLrI2p3P0pjXOmUZ7B48o5VnMH9QOGtg==", "cpu": [ "wasm32" ], @@ -1529,18 +1625,18 @@ "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "1.10.0", - "@emnapi/runtime": "1.10.0", - "@napi-rs/wasm-runtime": "^1.1.4" + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.5" }, "engines": { "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", - "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.2.tgz", + "integrity": "sha512-xtUJqs8qEkuSviS0n1tsohaPuz3a1SPhZywOji4Oo+sgrJs8daEDMZ0QtqL0OS7dx8PoVpg2J/ZZycPY5I2+Zg==", "cpu": [ "arm64" ], @@ -1555,9 +1651,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", - "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.2.tgz", + "integrity": "sha512-85YiLQqjUKgSO/Zjnf9e0XIn5Ymrh1fLDWBeAkZqpuBR/3R8TpfoHXuyblqyQrftSSgWO9qpcHN8mkyKsLraoA==", "cpu": [ "x64" ], @@ -1573,6 +1669,8 @@ }, "node_modules/@rolldown/pluginutils": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "dev": true, "license": "MIT" }, @@ -1595,6 +1693,8 @@ }, "node_modules/@standard-schema/spec": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "dev": true, "license": "MIT" }, @@ -1924,9 +2024,9 @@ "license": "MIT" }, "node_modules/@tybys/wasm-util": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", - "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", "dev": true, "license": "MIT", "optional": true, @@ -1936,6 +2036,8 @@ }, "node_modules/@types/chai": { "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, "license": "MIT", "dependencies": { @@ -1945,6 +2047,8 @@ }, "node_modules/@types/deep-eql": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true, "license": "MIT" }, @@ -1957,6 +2061,8 @@ }, "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==", "dev": true, "license": "MIT" }, @@ -1965,10 +2071,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.9.2", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.0.0.tgz", + "integrity": "sha512-vf2YFi1iY9lHGwNJMs01biZFbKJkrZR1T6/MlzjhJLPdntOHLhTrDSnSVcdtvjihi4VQNlrFRIxLsDBlQpAipA==", "license": "MIT", "dependencies": { - "undici-types": ">=7.24.0 <7.24.7" + "undici-types": "~8.3.0" } }, "node_modules/@types/urijs": { @@ -1976,14 +2084,16 @@ "license": "MIT" }, "node_modules/@vitest/expect": { - "version": "4.1.8", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.9.tgz", + "integrity": "sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.8", - "@vitest/utils": "4.1.8", + "@vitest/spy": "4.1.9", + "@vitest/utils": "4.1.9", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" }, @@ -1992,11 +2102,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.1.8", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.9.tgz", + "integrity": "sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.1.8", + "@vitest/spy": "4.1.9", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -2017,7 +2129,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.1.8", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.9.tgz", + "integrity": "sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==", "dev": true, "license": "MIT", "dependencies": { @@ -2028,11 +2142,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.1.8", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.9.tgz", + "integrity": "sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.8", + "@vitest/utils": "4.1.9", "pathe": "^2.0.3" }, "funding": { @@ -2040,12 +2156,14 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.1.8", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.9.tgz", + "integrity": "sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.8", - "@vitest/utils": "4.1.8", + "@vitest/pretty-format": "4.1.9", + "@vitest/utils": "4.1.9", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -2054,7 +2172,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.1.8", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.9.tgz", + "integrity": "sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==", "dev": true, "license": "MIT", "funding": { @@ -2062,11 +2182,13 @@ } }, "node_modules/@vitest/utils": { - "version": "4.1.8", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.9.tgz", + "integrity": "sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.8", + "@vitest/pretty-format": "4.1.9", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" }, @@ -2123,6 +2245,8 @@ }, "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": { "ajv": "^8.0.0" @@ -2205,6 +2329,8 @@ }, "node_modules/assertion-error": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", "engines": { @@ -2357,6 +2483,8 @@ }, "node_modules/chai": { "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", "engines": { @@ -2444,6 +2572,8 @@ }, "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" }, @@ -2742,7 +2872,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.28.0", + "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", @@ -2753,32 +2885,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.0", - "@esbuild/android-arm": "0.28.0", - "@esbuild/android-arm64": "0.28.0", - "@esbuild/android-x64": "0.28.0", - "@esbuild/darwin-arm64": "0.28.0", - "@esbuild/darwin-x64": "0.28.0", - "@esbuild/freebsd-arm64": "0.28.0", - "@esbuild/freebsd-x64": "0.28.0", - "@esbuild/linux-arm": "0.28.0", - "@esbuild/linux-arm64": "0.28.0", - "@esbuild/linux-ia32": "0.28.0", - "@esbuild/linux-loong64": "0.28.0", - "@esbuild/linux-mips64el": "0.28.0", - "@esbuild/linux-ppc64": "0.28.0", - "@esbuild/linux-riscv64": "0.28.0", - "@esbuild/linux-s390x": "0.28.0", - "@esbuild/linux-x64": "0.28.0", - "@esbuild/netbsd-arm64": "0.28.0", - "@esbuild/netbsd-x64": "0.28.0", - "@esbuild/openbsd-arm64": "0.28.0", - "@esbuild/openbsd-x64": "0.28.0", - "@esbuild/openharmony-arm64": "0.28.0", - "@esbuild/sunos-x64": "0.28.0", - "@esbuild/win32-arm64": "0.28.0", - "@esbuild/win32-ia32": "0.28.0", - "@esbuild/win32-x64": "0.28.0" + "@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": { @@ -2790,6 +2922,8 @@ }, "node_modules/estree-walker": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", "dependencies": { @@ -2913,6 +3047,8 @@ }, "node_modules/fastify": { "version": "5.8.5", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.8.5.tgz", + "integrity": "sha512-Yqptv59pQzPgQUSIm87hMqHJmdkb1+GPxdE6vW6FRyVE9G86mt7rOghitiU4JHRaTyDUk9pfeKmDeu70lAwM4Q==", "funding": [ { "type": "github", @@ -2942,6 +3078,22 @@ "toad-cache": "^3.7.0" } }, + "node_modules/fastify-plugin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-6.0.0.tgz", + "integrity": "sha512-fZOty7z3O7vOliF6d8bHE3wiEh1KcNnKEQensSgTk9C1DvN6nRLS++XVd86v33Hw/8u9Un8A1zDrQ8ujcQDHEg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, "node_modules/fastq": { "version": "1.20.1", "license": "ISC", @@ -3585,7 +3737,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.2.0", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-5.1.0.tgz", + "integrity": "sha512-s8VA5jkR8f22S3NAXmhKPFqGUduqZGlsufabVOgN14iTdw/RXcym7bKkbwjxLK9Yw2lEvvmJjFp119+KPeo8Kg==", "funding": [ { "type": "github", @@ -3601,7 +3755,7 @@ "argparse": "^2.0.1" }, "bin": { - "js-yaml": "bin/js-yaml.js" + "js-yaml": "bin/js-yaml.mjs" } }, "node_modules/jsep": { @@ -4068,6 +4222,8 @@ }, "node_modules/magic-string": { "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4333,6 +4489,8 @@ }, "node_modules/openapi-backend": { "version": "5.17.0", + "resolved": "https://registry.npmjs.org/openapi-backend/-/openapi-backend-5.17.0.tgz", + "integrity": "sha512-wyimPBoz/Gx+pqh4QwvMQRIJiZQHZkLdiyFXwfjiLwS5Jhbm7gCI+T0WTXmx7HXAYXL5Cr+016dR3CV3T/dPmQ==", "license": "MIT", "dependencies": { "@apidevtools/json-schema-ref-parser": "^11.1.0", @@ -4437,9 +4595,19 @@ "license": "MIT" }, "node_modules/openapi-to-postmanv2/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -4448,12 +4616,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/openapi-to-postmanv2/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, "node_modules/openapi-types": { "version": "12.1.3", "license": "MIT" @@ -4508,6 +4670,8 @@ }, "node_modules/pathe": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, @@ -4628,12 +4792,6 @@ "version": "5.5.3", "license": "MIT" }, - "node_modules/postman-collection/node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", - "license": "MIT" - }, "node_modules/postman-collection/node_modules/semver": { "version": "7.7.1", "license": "ISC", @@ -4718,6 +4876,8 @@ }, "node_modules/reflect-metadata": { "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", "license": "Apache-2.0" }, "node_modules/reflect.getprototypeof": { @@ -4799,11 +4959,13 @@ "license": "MIT" }, "node_modules/rolldown": { - "version": "1.0.3", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.2.tgz", + "integrity": "sha512-x0CrQQqCXWGeI8dTvFfN/Dnv3yMKT9hv5jFjlOreKAx9wqLq9wz7VvLLHyaAXC90/CpggTu9SisSbsJJTPSjNQ==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.133.0", + "@oxc-project/types": "=0.137.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -4813,25 +4975,27 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.3", - "@rolldown/binding-darwin-arm64": "1.0.3", - "@rolldown/binding-darwin-x64": "1.0.3", - "@rolldown/binding-freebsd-x64": "1.0.3", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", - "@rolldown/binding-linux-arm64-gnu": "1.0.3", - "@rolldown/binding-linux-arm64-musl": "1.0.3", - "@rolldown/binding-linux-ppc64-gnu": "1.0.3", - "@rolldown/binding-linux-s390x-gnu": "1.0.3", - "@rolldown/binding-linux-x64-gnu": "1.0.3", - "@rolldown/binding-linux-x64-musl": "1.0.3", - "@rolldown/binding-openharmony-arm64": "1.0.3", - "@rolldown/binding-wasm32-wasi": "1.0.3", - "@rolldown/binding-win32-arm64-msvc": "1.0.3", - "@rolldown/binding-win32-x64-msvc": "1.0.3" + "@rolldown/binding-android-arm64": "1.1.2", + "@rolldown/binding-darwin-arm64": "1.1.2", + "@rolldown/binding-darwin-x64": "1.1.2", + "@rolldown/binding-freebsd-x64": "1.1.2", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.2", + "@rolldown/binding-linux-arm64-gnu": "1.1.2", + "@rolldown/binding-linux-arm64-musl": "1.1.2", + "@rolldown/binding-linux-ppc64-gnu": "1.1.2", + "@rolldown/binding-linux-s390x-gnu": "1.1.2", + "@rolldown/binding-linux-x64-gnu": "1.1.2", + "@rolldown/binding-linux-x64-musl": "1.1.2", + "@rolldown/binding-openharmony-arm64": "1.1.2", + "@rolldown/binding-wasm32-wasi": "1.1.2", + "@rolldown/binding-win32-arm64-msvc": "1.1.2", + "@rolldown/binding-win32-x64-msvc": "1.1.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" @@ -5338,6 +5502,8 @@ }, "node_modules/tinyrainbow": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", "dev": true, "license": "MIT", "engines": { @@ -5381,6 +5547,8 @@ }, "node_modules/tsx": { "version": "4.22.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz", + "integrity": "sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==", "dev": true, "license": "MIT", "dependencies": { @@ -5464,6 +5632,8 @@ }, "node_modules/typescript": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -5511,7 +5681,9 @@ } }, "node_modules/undici-types": { - "version": "7.24.6", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", "license": "MIT" }, "node_modules/urijs": { @@ -5564,14 +5736,16 @@ "version": "1.0.3" }, "node_modules/vite": { - "version": "8.0.16", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.0.tgz", + "integrity": "sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.15", - "rolldown": "1.0.3", + "rolldown": "~1.1.2", "tinyglobby": "^0.2.17" }, "bin": { @@ -5588,7 +5762,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.1.18", + "@vitejs/devtools": "^0.3.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", @@ -5640,17 +5814,19 @@ } }, "node_modules/vitest": { - "version": "4.1.8", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.9.tgz", + "integrity": "sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.1.8", - "@vitest/mocker": "4.1.8", - "@vitest/pretty-format": "4.1.8", - "@vitest/runner": "4.1.8", - "@vitest/snapshot": "4.1.8", - "@vitest/spy": "4.1.8", - "@vitest/utils": "4.1.8", + "@vitest/expect": "4.1.9", + "@vitest/mocker": "4.1.9", + "@vitest/pretty-format": "4.1.9", + "@vitest/runner": "4.1.9", + "@vitest/snapshot": "4.1.9", + "@vitest/spy": "4.1.9", + "@vitest/utils": "4.1.9", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", @@ -5678,12 +5854,12 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.8", - "@vitest/browser-preview": "4.1.8", - "@vitest/browser-webdriverio": "4.1.8", - "@vitest/coverage-istanbul": "4.1.8", - "@vitest/coverage-v8": "4.1.8", - "@vitest/ui": "4.1.8", + "@vitest/browser-playwright": "4.1.9", + "@vitest/browser-preview": "4.1.9", + "@vitest/browser-webdriverio": "4.1.9", + "@vitest/coverage-istanbul": "4.1.9", + "@vitest/coverage-v8": "4.1.9", + "@vitest/ui": "4.1.9", "happy-dom": "*", "jsdom": "*", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" diff --git a/package.json b/package.json index efce107..f9f75d1 100644 --- a/package.json +++ b/package.json @@ -20,23 +20,23 @@ "dependencies": { "@developer-overheid-nl/don-tools-logic": "^0.0.1", "@fastify/cors": "^11.2.0", - "@nestjs/common": "^11.0.0", - "@nestjs/core": "^11.0.0", - "@nestjs/platform-fastify": "^11.0.0", + "@nestjs/common": "^11.1.27", + "@nestjs/core": "^11.1.27", + "@nestjs/platform-fastify": "^11.1.27", "ajv-formats": "^3.0.1", "fastify": "^5.8.5", - "js-yaml": "^4.2.0", + "js-yaml": "^5.1.0", "openapi-backend": "^5.17.0", "reflect-metadata": "^0.2.2", - "rxjs": "^7.8.1" + "rxjs": "^7.8.2" }, "devDependencies": { - "@biomejs/biome": "^2.4.16", - "@types/node": "^25.9.2", + "@biomejs/biome": "^2.5.1", + "@types/node": "^26.0.0", "tsx": "^4.22.4", "typescript": "^6.0.3", - "vite": "^8.0.16", - "vitest": "^4.1.8" + "vite": "^8.1.0", + "vitest": "^4.1.9" }, "overrides": { "js-yaml@>=4.0.0 <4.1.1": "4.2.0", diff --git a/test/convert-oas.test.ts b/test/convert-oas.test.ts index 3d36eef..39bc380 100644 --- a/test/convert-oas.test.ts +++ b/test/convert-oas.test.ts @@ -1,9 +1,9 @@ import { describe, expect, it } from "vitest"; -import jsYaml from "js-yaml"; +import { load } from "js-yaml"; import { convertOAS } from "@developer-overheid-nl/don-tools-logic"; const toJson = (buffer: Buffer) => JSON.parse(buffer.toString("utf8")); -const toYaml = (buffer: Buffer) => jsYaml.load(buffer.toString("utf8")) as Record; +const toYaml = (buffer: Buffer) => load(buffer.toString("utf8")) as Record; describe("convertOAS", () => { it("upgrades 3.0 -> 3.1 (JSON)", async () => { From a8a80f58c7104f610948a05633409e46f58b0fe9 Mon Sep 17 00:00:00 2001 From: pasibun Date: Wed, 24 Jun 2026 09:59:00 +0200 Subject: [PATCH 18/27] chore: trigger test deploy [deploy-test] From 6d3db49f641c178c1a94bc4419912d0278391f39 Mon Sep 17 00:00:00 2001 From: pasibun Date: Wed, 24 Jun 2026 11:40:12 +0200 Subject: [PATCH 19/27] Fix generate endpoint response [deploy-test] --- implementation/tools-api.service.ts | 6 ++++-- test/app.test.ts | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/implementation/tools-api.service.ts b/implementation/tools-api.service.ts index 18cb8e5..501769f 100644 --- a/implementation/tools-api.service.ts +++ b/implementation/tools-api.service.ts @@ -57,9 +57,11 @@ export class ToolsApiService extends ToolsApi { return result.rawBody as unknown as void; } - async generateOAS(oasInput: OasInput | undefined): Promise { + async generateOAS(oasInput: OasInput | undefined, _request: Request, reply: FastifyReply): Promise { const { generateOAS } = await loadLogic(); - return asBadRequest(() => generateOAS(oasInput as OasInput)); + const result = await asBadRequest(() => generateOAS(oasInput as OasInput)); + setHeaders(reply, result.headers); + return result.rawBody as unknown as object; } async untrustClient(untrustClientInput: UntrustedClientInput | undefined): Promise { diff --git a/test/app.test.ts b/test/app.test.ts index 2cd7a13..37fb79b 100644 --- a/test/app.test.ts +++ b/test/app.test.ts @@ -59,4 +59,29 @@ describe("app", () => { expect(response.headers["content-type"]).toContain("application/json"); expect(JSON.parse(response.body)).toMatchObject({ openapi: "3.1.0" }); }); + + it("returns generated OpenAPI directly", async () => { + const response = await inject({ + method: "POST", + url: "/v1/oas/generate", + payload: { + oasBody: JSON.stringify({ + title: "Generated API", + description: "Generated API description", + contact: { name: "DON", email: "don@example.com", url: "https://developer.overheid.nl" }, + resources: [{ name: "item", plural: "items", readonly: true }], + }), + }, + }); + + expect(response.statusCode).toBe(200); + expect(response.headers["content-type"]).toContain("application/json"); + expect(response.headers["content-disposition"]).toBe('attachment; filename="generated-api.json"'); + expect(JSON.parse(response.body)).toMatchObject({ + openapi: "3.0.2", + info: { title: "Generated API" }, + paths: { "/items": expect.any(Object) }, + }); + expect(JSON.parse(response.body)).not.toHaveProperty("rawBody"); + }); }); From c52cae51f45ac332114733e47ce74d8bc0a3d5ef Mon Sep 17 00:00:00 2001 From: pasibun Date: Wed, 24 Jun 2026 13:29:23 +0200 Subject: [PATCH 20/27] fix: update don-tools-logic dependency to version 0.0.2 --- package-lock.json | 153 ++++++++++++++++++++++++++++++++-------------- package.json | 2 +- 2 files changed, 107 insertions(+), 48 deletions(-) diff --git a/package-lock.json b/package-lock.json index 160aaf5..5205037 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "EUPL-1.2", "dependencies": { - "@developer-overheid-nl/don-tools-logic": "^0.0.1", + "@developer-overheid-nl/don-tools-logic": "^0.0.2", "@fastify/cors": "^11.2.0", "@nestjs/common": "^11.1.27", "@nestjs/core": "^11.1.27", @@ -121,6 +121,8 @@ }, "node_modules/@babel/code-frame": { "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", @@ -133,6 +135,8 @@ }, "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": ">=6.9.0" @@ -140,6 +144,8 @@ }, "node_modules/@babel/runtime": { "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -339,50 +345,28 @@ } }, "node_modules/@developer-overheid-nl/don-tools-logic": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@developer-overheid-nl/don-tools-logic/-/don-tools-logic-0.0.1.tgz", - "integrity": "sha512-8KJOreUcPrXbPvJ4WuyE9ChtVt8U1VbYeGlyWvsMGBMQaNsGfkhCskGS+EQ4YynjrMjra5n9+5+RV88dzoA14Q==", + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@developer-overheid-nl/don-tools-logic/-/don-tools-logic-0.0.2.tgz", + "integrity": "sha512-uX9KegVIk0/r+EDkt0199Ddy4m7mxWeWPwp3WE0fI+eBaUZMvAUTva4ZRsWvv6i3SjNy4Gfr9lof2PFETjzhzg==", "license": "EUPL-1.2", "dependencies": { "@apiture/openapi-down-convert": "^0.14.2", "@developer-overheid-nl/adr-rulesets": "github:developer-overheid-nl/adr-rulesets#main", - "@redocly/openapi-core": "^2.32.0", - "@redocly/respect-core": "^2.32.0", + "@redocly/openapi-core": "^2.34.0", + "@redocly/respect-core": "^2.34.0", "@scalar/openapi-upgrader": "^0.2.9", "@stoplight/spectral-core": "^1.23.0", "@stoplight/spectral-parsers": "^1.0.5", "case-anything": "^3.1.2", - "js-yaml": "^4.2.0", + "js-yaml": "^5.1.0", "jszip": "^3.10.1", - "openapi-to-postmanv2": "^6.0.1" + "openapi-to-postmanv2": "^6.1.0" }, "engines": { "node": ">=22", "pnpm": ">=11" } }, - "node_modules/@developer-overheid-nl/don-tools-logic/node_modules/js-yaml": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", - "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", - "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/@emnapi/core": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", @@ -865,6 +849,8 @@ }, "node_modules/@faker-js/faker": { "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.6.0.tgz", + "integrity": "sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==", "license": "MIT", "engines": { "node": ">=14.0.0", @@ -1045,6 +1031,8 @@ }, "node_modules/@humanwhocodes/momoa": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-2.0.4.tgz", + "integrity": "sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==", "license": "Apache-2.0", "engines": { "node": ">=10.10.0" @@ -1241,6 +1229,8 @@ }, "node_modules/@noble/hashes": { "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", "license": "MIT", "engines": { "node": "^14.21.3 || >=16" @@ -1250,7 +1240,9 @@ } }, "node_modules/@nodable/entities": { - "version": "2.1.1", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg==", "funding": [ { "type": "github", @@ -1275,6 +1267,8 @@ }, "node_modules/@redocly/ajv": { "version": "8.18.3", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.18.3.tgz", + "integrity": "sha512-l42u0of3hY98sN2A+M4qTX1O/KrpgGH32Hu9kP2GtHyD5Dfqq86PKFLe5dwaD8DEnNmlOlll2BAmeEtf0DaySg==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -1289,13 +1283,17 @@ }, "node_modules/@redocly/config": { "version": "0.49.0", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.49.0.tgz", + "integrity": "sha512-OI/rpEffX3fKUuy+OuBHPRspRI/S30b9aiqxfZLMpSWZzDncEGPxSEP1O2LrBVshnDX4hLjVjLvCZ4YT85+1rw==", "license": "MIT", "dependencies": { "json-schema-to-ts": "2.7.2" } }, "node_modules/@redocly/openapi-core": { - "version": "2.32.0", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-2.34.0.tgz", + "integrity": "sha512-QHdrFT34zJLTwC1vG4QAwSzHMh2Ll545X/u5ScKzVPh8PPmjYVE+jMjVmwlRXyTPKWxOerqbPY7ZOACOCOSfbg==", "license": "MIT", "dependencies": { "@redocly/ajv": "^8.18.1", @@ -1304,7 +1302,7 @@ "ajv-formats": "^3.0.1", "colorette": "^1.2.0", "js-levenshtein": "^1.1.6", - "js-yaml": "^4.1.0", + "js-yaml": "^4.2.0", "picomatch": "^4.0.4", "pluralize": "^8.0.0", "yaml-ast-parser": "0.0.43" @@ -1317,6 +1315,8 @@ "node_modules/@redocly/openapi-core/node_modules/ajv": { "name": "@redocly/ajv", "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.18.1.tgz", + "integrity": "sha512-Ifm/pP/tul1qmAecpbVxCBluVE32rKfjf8gYXH4xI2gCv9mRWFhJMHzkPDM4TXlxwPQYIFegymlsy8lXz7optA==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -1329,10 +1329,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@redocly/openapi-core/node_modules/colorette": { - "version": "1.4.0", - "license": "MIT" - }, "node_modules/@redocly/openapi-core/node_modules/js-yaml": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", @@ -1356,13 +1352,15 @@ } }, "node_modules/@redocly/respect-core": { - "version": "2.32.0", + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@redocly/respect-core/-/respect-core-2.34.0.tgz", + "integrity": "sha512-h3flGJdUk0c7n8PbjK0ZLhZbPHjkkF3gA4CMYBxGSo6fuvDJcCGVHe/EV6hZrq7N3XWUG2S+zTKwBQfVhOWq2Q==", "license": "MIT", "dependencies": { "@faker-js/faker": "^7.6.0", "@noble/hashes": "^1.8.0", "@redocly/ajv": "^8.18.1", - "@redocly/openapi-core": "2.32.0", + "@redocly/openapi-core": "2.34.0", "ajv": "npm:@redocly/ajv@8.18.1", "better-ajv-errors": "^2.0.3", "colorette": "^2.0.20", @@ -1380,6 +1378,8 @@ "node_modules/@redocly/respect-core/node_modules/ajv": { "name": "@redocly/ajv", "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.18.1.tgz", + "integrity": "sha512-Ifm/pP/tul1qmAecpbVxCBluVE32rKfjf8gYXH4xI2gCv9mRWFhJMHzkPDM4TXlxwPQYIFegymlsy8lXz7optA==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -1392,6 +1392,12 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/@redocly/respect-core/node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, "node_modules/@rolldown/binding-android-arm64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.2.tgz", @@ -2281,7 +2287,9 @@ } }, "node_modules/anynum": { - "version": "1.0.0", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz", + "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==", "funding": [ { "type": "github", @@ -2403,6 +2411,8 @@ }, "node_modules/better-ajv-errors": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/better-ajv-errors/-/better-ajv-errors-2.0.3.tgz", + "integrity": "sha512-t1vxUP+vYKsaYi/BbKo2K98nEAZmfi4sjwvmRT8aOPDzPJeAtLurfoIDazVkLILxO4K+Sw4YrLYnBQ46l6pePg==", "license": "Apache-2.0", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -2493,6 +2503,8 @@ }, "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", @@ -2539,7 +2551,9 @@ "license": "MIT" }, "node_modules/colorette": { - "version": "2.0.20", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", "license": "MIT" }, "node_modules/commander": { @@ -3013,6 +3027,8 @@ }, "node_modules/fast-xml-builder": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", + "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", "funding": [ { "type": "github", @@ -3026,7 +3042,9 @@ } }, "node_modules/fast-xml-parser": { - "version": "5.8.0", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.9.3.tgz", + "integrity": "sha512-brCNCeScma/kqa54J4PIDriSSSLssRkuYaUCpvHJulGc3HGI/xxKUCTDcYkAdqJsyb//ydpbxecjC3hB9+tb/g==", "funding": [ { "type": "github", @@ -3035,10 +3053,11 @@ ], "license": "MIT", "dependencies": { - "@nodable/entities": "^2.1.0", + "@nodable/entities": "^2.2.0", "fast-xml-builder": "^1.2.0", + "is-unsafe": "^1.0.1", "path-expression-matcher": "^1.5.0", - "strnum": "^2.3.0", + "strnum": "^2.4.1", "xml-naming": "^0.1.0" }, "bin": { @@ -3302,6 +3321,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==", "license": "MIT", "engines": { "node": ">=8" @@ -3677,6 +3698,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unsafe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-unsafe/-/is-unsafe-1.0.1.tgz", + "integrity": "sha512-CLK2+VdgERgD96EYm5lUQssZYlRg2tkZnbsxZoacmSiRxiFJ4Nk4SzjCl+Ur+v3kXIY9dTIdb3IH22y1mZ56LA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/is-weakmap": { "version": "2.0.2", "license": "MIT", @@ -3727,6 +3760,8 @@ }, "node_modules/js-levenshtein": { "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -3734,6 +3769,8 @@ }, "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": { @@ -3810,6 +3847,8 @@ }, "node_modules/json-schema-to-ts": { "version": "2.7.2", + "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-2.7.2.tgz", + "integrity": "sha512-R1JfqKqbBR4qE8UyBR56Ms30LL62/nlhoz+1UkfI/VE7p54Awu919FZ6ZUPG8zIa3XB65usPJgr1ONVncUGSaQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", @@ -3846,6 +3885,8 @@ }, "node_modules/jsonpath-rfc9535": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsonpath-rfc9535/-/jsonpath-rfc9535-1.3.0.tgz", + "integrity": "sha512-3jFHya7oZ45aDxIIdx+/zQARahHXxFSMWBkcBUldfXpLS9VCXDJyTKt35kQfEXLqh0K3Ixw/9xFnvcDStaxh7Q==", "license": "Apache-2.0", "engines": { "node": ">=20" @@ -4513,6 +4554,8 @@ }, "node_modules/openapi-sampler": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.7.4.tgz", + "integrity": "sha512-CKS/rd5ucPCuEDbJnjGDXZTsuGWcmv53aCmQx7soZlPEONUGN4af0/dY5+THRFZraSEjeA78nlfzdFswC/N5SA==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.7", @@ -4622,6 +4665,8 @@ }, "node_modules/outdent": { "version": "0.8.0", + "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.8.0.tgz", + "integrity": "sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==", "license": "MIT" }, "node_modules/own-keys": { @@ -4648,7 +4693,9 @@ "license": "MIT" }, "node_modules/path-expression-matcher": { - "version": "1.5.0", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.1.tgz", + "integrity": "sha512-h7bxdzhHk8Knyc4Tj+jMaa7fEEoUJy7p1qtbVgkYg1Uhpe5Np5VuGXCRZnkZvU+Q42M1vStt0ifa3ueykRJPmQ==", "funding": [ { "type": "github", @@ -4722,6 +4769,8 @@ }, "node_modules/pluralize": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "license": "MIT", "engines": { "node": ">=4" @@ -5397,7 +5446,9 @@ } }, "node_modules/strnum": { - "version": "2.4.0", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.1.tgz", + "integrity": "sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg==", "funding": [ { "type": "github", @@ -5406,7 +5457,7 @@ ], "license": "MIT", "dependencies": { - "anynum": "^1.0.0" + "anynum": "^1.0.1" } }, "node_modules/strtok3": { @@ -5425,6 +5476,8 @@ }, "node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -5539,6 +5592,8 @@ }, "node_modules/ts-algebra": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-1.2.2.tgz", + "integrity": "sha512-kloPhf1hq3JbCPOTYoOWDKxebWjNb2o/LKnNfkWhxVVisFFmMJPPdJeGoGmM+iRLyoXAR61e08Pb+vUXINg8aA==", "license": "MIT" }, "node_modules/tslib": { @@ -6028,6 +6083,8 @@ }, "node_modules/xml-naming": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", + "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", "funding": [ { "type": "github", @@ -6061,6 +6118,8 @@ }, "node_modules/yaml-ast-parser": { "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", "license": "Apache-2.0" }, "node_modules/yargs": { diff --git a/package.json b/package.json index f9f75d1..cffb623 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "license": "EUPL-1.2", "private": true, "dependencies": { - "@developer-overheid-nl/don-tools-logic": "^0.0.1", + "@developer-overheid-nl/don-tools-logic": "^0.0.2", "@fastify/cors": "^11.2.0", "@nestjs/common": "^11.1.27", "@nestjs/core": "^11.1.27", From 0076a4163de3d3395c3d698a721195f0d4e72ddd Mon Sep 17 00:00:00 2001 From: pasibun Date: Wed, 24 Jun 2026 13:30:18 +0200 Subject: [PATCH 21/27] chore: trigger test deploy [deploy-test] From 9870ae93b198cf67134e7d841ddbb32acadae988 Mon Sep 17 00:00:00 2001 From: pasibun Date: Wed, 24 Jun 2026 13:54:16 +0200 Subject: [PATCH 22/27] Fix npm 10 Docker lockfile sync [deploy-test] --- package-lock.json | 42 ------------------------------------------ package.json | 2 +- 2 files changed, 1 insertion(+), 43 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5205037..e374d12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -220,9 +220,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -240,9 +237,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -260,9 +254,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -280,9 +271,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT OR Apache-2.0", "optional": true, "os": [ @@ -1491,9 +1479,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1511,9 +1496,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1531,9 +1513,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1551,9 +1530,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1571,9 +1547,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1591,9 +1564,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -4095,9 +4065,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -4119,9 +4086,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -4143,9 +4107,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -4167,9 +4128,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ diff --git a/package.json b/package.json index cffb623..7a59e30 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ }, "overrides": { "js-yaml@>=4.0.0 <4.1.1": "4.2.0", - "lodash@<=4.17.23": "4.18.1", + "lodash": "4.18.1", "uuid@<11.1.1": "14.0.0", "yaml@>=1.0.0 <1.10.3": "2.9.0" } From 91b26ecc215cd78f3f75149fbded76f8b89b8122 Mon Sep 17 00:00:00 2001 From: pasibun Date: Wed, 24 Jun 2026 23:59:14 +0200 Subject: [PATCH 23/27] Apply Biome to generated API files [deploy-test] --- api/ToolsApi.ts | 82 ++++++++++++++--------- api/index.ts | 2 +- api/openapi.json | 32 +++------ app/api-implementations.ts | 8 +-- app/api.module.ts | 76 ++++++++++----------- app/index.ts | 89 +++++++++++++++++++------ biome.json | 16 ++++- controllers/ToolsApi.controller.ts | 76 ++++++++++++++------- controllers/index.ts | 2 +- decorators/cookies-decorator.ts | 32 ++++----- decorators/headers-decorator.ts | 22 +++--- decorators/index.ts | 4 +- implementation/tools-api.service.ts | 10 +-- models/index.ts | 26 ++++---- models/models-keycloak-client-result.ts | 3 +- models/models-lint-message-info.ts | 3 +- models/models-lint-message.ts | 3 +- models/models-lint-result.ts | 3 +- models/oas-input.ts | 3 +- models/untrust-client-input.ts | 3 +- 20 files changed, 291 insertions(+), 204 deletions(-) diff --git a/api/ToolsApi.ts b/api/ToolsApi.ts index 34e23db..dfd24ab 100644 --- a/api/ToolsApi.ts +++ b/api/ToolsApi.ts @@ -1,33 +1,55 @@ -import { Injectable } from '@nestjs/common'; -import type { FastifyReply } from 'fastify'; -import { Observable } from 'rxjs'; -import { ModelsKeycloakClientResult, ModelsLintResult, OasInput, UntrustClientInput, } from '../models'; - +import { Injectable } from "@nestjs/common"; +import type { FastifyReply } from "fastify"; +import type { Observable } from "rxjs"; +import type { ModelsKeycloakClientResult, ModelsLintResult, OasInput, UntrustClientInput } from "../models"; @Injectable() export abstract class ToolsApi { - - abstract arazzoMarkdown(oasInput: OasInput | undefined, request: Request, reply: FastifyReply): string | Promise | Observable; - - - abstract arazzoMermaid(oasInput: OasInput | undefined, request: Request, reply: FastifyReply): string | Promise | Observable; - - - abstract bundleOAS(oasInput: OasInput | undefined, request: Request, reply: FastifyReply): void | Promise | Observable; - - - abstract convertOAS(oasInput: OasInput | undefined, request: Request, reply: FastifyReply): void | Promise | Observable; - - - abstract createPostmanCollection(oasInput: OasInput | undefined, request: Request, reply: FastifyReply): void | Promise | Observable; - - - abstract generateOAS(oasInput: OasInput | undefined, request: Request, reply: FastifyReply): object | Promise | Observable; - - - abstract untrustClient(untrustClientInput: UntrustClientInput | undefined, request: Request, reply: FastifyReply): ModelsKeycloakClientResult | Promise | Observable; - - - abstract validatorOpenAPIPost(oasInput: OasInput | undefined, request: Request, reply: FastifyReply): ModelsLintResult | Promise | Observable; - -} + abstract arazzoMarkdown( + oasInput: OasInput | undefined, + request: Request, + reply: FastifyReply, + ): string | Promise | Observable; + + abstract arazzoMermaid( + oasInput: OasInput | undefined, + request: Request, + reply: FastifyReply, + ): string | Promise | Observable; + + abstract bundleOAS( + oasInput: OasInput | undefined, + request: Request, + reply: FastifyReply, + ): void | Promise | Observable; + + abstract convertOAS( + oasInput: OasInput | undefined, + request: Request, + reply: FastifyReply, + ): void | Promise | Observable; + + abstract createPostmanCollection( + oasInput: OasInput | undefined, + request: Request, + reply: FastifyReply, + ): void | Promise | Observable; + + abstract generateOAS( + oasInput: OasInput | undefined, + request: Request, + reply: FastifyReply, + ): object | Promise | Observable; + + abstract untrustClient( + untrustClientInput: UntrustClientInput | undefined, + request: Request, + reply: FastifyReply, + ): ModelsKeycloakClientResult | Promise | Observable; + + abstract validatorOpenAPIPost( + oasInput: OasInput | undefined, + request: Request, + reply: FastifyReply, + ): ModelsLintResult | Promise | Observable; +} diff --git a/api/index.ts b/api/index.ts index b832067..570f470 100644 --- a/api/index.ts +++ b/api/index.ts @@ -1 +1 @@ -export * from './ToolsApi'; +export * from "./ToolsApi"; diff --git a/api/openapi.json b/api/openapi.json index 0f2e2f7..e5bedbf 100644 --- a/api/openapi.json +++ b/api/openapi.json @@ -76,9 +76,7 @@ } ], "summary": "Arazzo Markdown (POST)", - "tags": [ - "Tools" - ], + "tags": ["Tools"], "x-eov-operation-handler": "controllers/ToolsController" } }, @@ -127,9 +125,7 @@ } ], "summary": "Arazzo Mermaid (POST)", - "tags": [ - "Tools" - ], + "tags": ["Tools"], "x-eov-operation-handler": "controllers/ToolsController" } }, @@ -178,9 +174,7 @@ } ], "summary": "Maak client (POST)", - "tags": [ - "Tools" - ], + "tags": ["Tools"], "x-eov-operation-handler": "controllers/ToolsController" } }, @@ -222,9 +216,7 @@ } ], "summary": "Converteer OpenAPI 3.0/3.1", - "tags": [ - "Tools" - ], + "tags": ["Tools"], "x-eov-operation-handler": "controllers/ToolsController", "x-original-operationId": "ConvertOAS" } @@ -267,9 +259,7 @@ } ], "summary": "Bundle OpenAPI", - "tags": [ - "Tools" - ], + "tags": ["Tools"], "x-eov-operation-handler": "controllers/ToolsController" } }, @@ -318,9 +308,7 @@ } ], "summary": "Generate OpenAPI", - "tags": [ - "Tools" - ], + "tags": ["Tools"], "x-eov-operation-handler": "controllers/ToolsController", "x-original-operationId": "GenerateOAS" } @@ -370,9 +358,7 @@ } ], "summary": "Validate OpenAPI (POST)", - "tags": [ - "Tools" - ], + "tags": ["Tools"], "x-eov-operation-handler": "controllers/ToolsController" } }, @@ -414,9 +400,7 @@ } ], "summary": "Maak Postman-collectie (POST)", - "tags": [ - "Tools" - ], + "tags": ["Tools"], "x-eov-operation-handler": "controllers/ToolsController", "x-original-operationId": "CreatePostmanCollection" } diff --git a/app/api-implementations.ts b/app/api-implementations.ts index b1482c8..a2ba8ce 100644 --- a/app/api-implementations.ts +++ b/app/api-implementations.ts @@ -1,9 +1,9 @@ -import { Type } from '@nestjs/common'; -import { ToolsApi } from '../api'; +import type { Type } from "@nestjs/common"; +import type { ToolsApi } from "../api"; /** * Provide this type to {@link ApiModule} to provide your API implementations -**/ + **/ export type ApiImplementations = { - toolsApi: Type + toolsApi: Type; }; diff --git a/app/api.module.ts b/app/api.module.ts index e5e617c..0a59272 100644 --- a/app/api.module.ts +++ b/app/api.module.ts @@ -1,21 +1,21 @@ -import { DynamicModule, HttpException, Module, Provider } from '@nestjs/common'; -import { ApiImplementations } from './api-implementations' -import { ToolsApi } from '../api'; -import { ToolsApiController } from '../controllers'; +import { type DynamicModule, HttpException, Module, type Provider } from "@nestjs/common"; +import type { ApiImplementations } from "./api-implementations"; +import { ToolsApi } from "../api"; +import { ToolsApiController } from "../controllers"; const createNotImplementedProvider = (apiName: string) => new Proxy( {}, { get: (_target, property) => { - if (typeof property !== 'string') return undefined; + if (typeof property !== "string") return undefined; if ( - property === 'then' || - property === 'onModuleInit' || - property === 'onApplicationBootstrap' || - property === 'onModuleDestroy' || - property === 'beforeApplicationShutdown' || - property === 'onApplicationShutdown' + property === "then" || + property === "onModuleInit" || + property === "onApplicationBootstrap" || + property === "onModuleDestroy" || + property === "beforeApplicationShutdown" || + property === "onApplicationShutdown" ) { return undefined; } @@ -28,38 +28,36 @@ const createNotImplementedProvider = (apiName: string) => export type ApiModuleConfiguration = { /** - * your Api implementations - */ - apiImplementations?: Partial, + * your Api implementations + */ + apiImplementations?: Partial; /** - * additional Providers that may be used by your implementations - */ - providers?: Provider[], -} + * additional Providers that may be used by your implementations + */ + providers?: Provider[]; +}; @Module({}) export class ApiModule { static forRoot(configuration: ApiModuleConfiguration = {}): DynamicModule { - const providers: Provider[] = [ - configuration.apiImplementations?.toolsApi - ? { - provide: ToolsApi, - useClass: configuration.apiImplementations.toolsApi, - } - : { - provide: ToolsApi, - useValue: createNotImplementedProvider('ToolsApi'), - }, - ...(configuration.providers || []), - ]; + const providers: Provider[] = [ + configuration.apiImplementations?.toolsApi + ? { + provide: ToolsApi, + useClass: configuration.apiImplementations.toolsApi, + } + : { + provide: ToolsApi, + useValue: createNotImplementedProvider("ToolsApi"), + }, + ...(configuration.providers || []), + ]; - return { - module: ApiModule, - controllers: [ - ToolsApiController, - ], - providers: [...providers], - exports: [...providers] - } - } + return { + module: ApiModule, + controllers: [ToolsApiController], + providers: [...providers], + exports: [...providers], + }; + } } diff --git a/app/index.ts b/app/index.ts index e8c0bed..6e62d07 100644 --- a/app/index.ts +++ b/app/index.ts @@ -1,9 +1,9 @@ import "reflect-metadata"; import { readFileSync } from "node:fs"; import { join } from "node:path"; -import { ArgumentsHost, Catch, ExceptionFilter, HttpException, Module } from "@nestjs/common"; +import { type ArgumentsHost, Catch, type ExceptionFilter, HttpException, Module } from "@nestjs/common"; import { NestFactory } from "@nestjs/core"; -import { FastifyAdapter, NestFastifyApplication } from "@nestjs/platform-fastify"; +import { FastifyAdapter, type NestFastifyApplication } from "@nestjs/platform-fastify"; import cors from "@fastify/cors"; import addFormats from "ajv-formats"; import { OpenAPIBackend } from "openapi-backend"; @@ -100,7 +100,9 @@ const toProblem = (status: number, title: string, errors?: ProblemError[]) => ({ const toProblemErrors = (errors: ValidationError[] | undefined): ProblemError[] | undefined => { if (!errors?.length) return undefined; - const bodyErrors = errors.filter((error) => ["body", "requestBody"].includes(error.instancePath?.split("/").filter(Boolean)[0] ?? "")); + const bodyErrors = errors.filter((error) => + ["body", "requestBody"].includes(error.instancePath?.split("/").filter(Boolean)[0] ?? ""), + ); if (bodyErrors.length > 0) { return [ { @@ -113,7 +115,8 @@ const toProblemErrors = (errors: ValidationError[] | undefined): ProblemError[] } return errors.map((error) => { - const params = typeof error.params === "object" && error.params !== null ? (error.params as Record) : {}; + const params = + typeof error.params === "object" && error.params !== null ? (error.params as Record) : {}; const additionalProperty = typeof params.additionalProperty === "string" ? params.additionalProperty : undefined; const location = additionalProperty ?? error.instancePath?.split("/").filter(Boolean).pop() ?? ""; const source = error.instancePath?.split("/").filter(Boolean)[0] ?? ""; @@ -151,7 +154,11 @@ const resolveRef = (document: unknown, value: unknown): unknown => { return resolveJsonPointer(document, value.$ref) ?? value; }; -const getResponseObject = (document: unknown, operation: RuntimeOperation | undefined, statusCode: number): Record | undefined => { +const getResponseObject = ( + document: unknown, + operation: RuntimeOperation | undefined, + statusCode: number, +): Record | undefined => { if (!operation?.responses) return undefined; const responses = operation.responses; const response = responses[String(statusCode)] ?? responses[`${Math.floor(statusCode / 100)}XX`] ?? responses.default; @@ -184,7 +191,10 @@ const acceptsMediaType = (acceptHeader: unknown, mediaType: string): boolean => .some((accepted) => mediaTypeMatches(mediaType, accepted)); }; -const chooseResponseContentType = (request: RuntimeRequest, responseObject: Record | undefined): string | undefined => { +const chooseResponseContentType = ( + request: RuntimeRequest, + responseObject: Record | undefined, +): string | undefined => { const contentTypes = getResponseContentTypes(responseObject); if (contentTypes.length === 0) return undefined; return contentTypes.find((mediaType) => acceptsMediaType(request.headers.accept, mediaType)) ?? contentTypes[0]; @@ -240,7 +250,12 @@ const mockFromSchema = (document: unknown, schema: unknown, seen = new Set [name, mockFromSchema(document, propertySchema, seen)])); + return Object.fromEntries( + Object.entries(properties).map(([name, propertySchema]) => [ + name, + mockFromSchema(document, propertySchema, seen), + ]), + ); } if (schemaType === "integer" || schemaType === "number") return 0; if (schemaType === "boolean") return true; @@ -327,9 +342,14 @@ const buildPaginationLink = (request: RuntimeRequest): string => { return [`<${withPage(1)}>; rel="first"`, `<${withPage(totalPages)}>; rel="last"`].join(", "); }; -const mockPagination = (request: RuntimeRequest): { currentPage: number; perPage: number; totalPages: number; totalCount: number } => { +const mockPagination = ( + request: RuntimeRequest, +): { currentPage: number; perPage: number; totalPages: number; totalCount: number } => { const currentPage = Math.max(Number.parseInt(firstQueryValue(request.query, ["page", "Page"]) ?? "1", 10) || 1, 1); - const perPage = Math.max(Number.parseInt(firstQueryValue(request.query, ["perPage", "PerPage"]) ?? "20", 10) || 20, 1); + const perPage = Math.max( + Number.parseInt(firstQueryValue(request.query, ["perPage", "PerPage"]) ?? "20", 10) || 20, + 1, + ); const totalPages = Math.max(currentPage, 1); return { currentPage, @@ -339,7 +359,12 @@ const mockPagination = (request: RuntimeRequest): { currentPage: number; perPage }; }; -const mockHeaderValue = (name: string, schema: unknown, request: RuntimeRequest, apiVersion: string | undefined): string => { +const mockHeaderValue = ( + name: string, + schema: unknown, + request: RuntimeRequest, + apiVersion: string | undefined, +): string => { const normalizedName = name.toLowerCase(); const pagination = mockPagination(request); if (normalizedName === "api-version") return apiVersion ?? "1.0.0"; @@ -348,7 +373,8 @@ const mockHeaderValue = (name: string, schema: unknown, request: RuntimeRequest, if (normalizedName === "current-page") return String(pagination.currentPage); if (normalizedName === "per-page") return String(pagination.perPage); if (normalizedName === "total-pages") return String(pagination.totalPages); - if (normalizedName === "oas-version") return firstPathValue(request.params, ["version", "oasVersion", "OASVersion"]) ?? "mock"; + if (normalizedName === "oas-version") + return firstPathValue(request.params, ["version", "oasVersion", "OASVersion"]) ?? "mock"; if (normalizedName === "oas-source") return "mock"; const schemaType = getSchemaType(schema); @@ -438,7 +464,9 @@ const mediaTypeMatches = (actual: string, expected: string): boolean => { const [actualType, actualSubtype] = normalizedActual.split("/"); if (!expectedType || !expectedSubtype || !actualType || !actualSubtype) return false; if (expectedSubtype === "*") return expectedType === actualType; - return expectedSubtype.startsWith("*+") && actualSubtype.endsWith(expectedSubtype.slice(1)) && expectedType === actualType; + return ( + expectedSubtype.startsWith("*+") && actualSubtype.endsWith(expectedSubtype.slice(1)) && expectedType === actualType + ); }; const hasUnsupportedRequestMediaType = (operation: RuntimeOperation, contentType: unknown, body: unknown): boolean => { @@ -462,7 +490,6 @@ const chooseDeclaredResponseStatus = (operation: RuntimeOperation | undefined, s class ProblemDetailsFilter implements ExceptionFilter { catch(error: unknown, host: ArgumentsHost) { const context = host.switchToHttp(); - const request = context.getRequest<{ url?: string }>(); const reply = context.getResponse(); const status = error instanceof HttpException ? error.getStatus() : 500; const response = error instanceof HttpException ? error.getResponse() : undefined; @@ -491,7 +518,10 @@ class ProblemDetailsFilter implements ExceptionFilter { class AppModule {} export const createApp = async () => { - const app = await NestFactory.create(AppModule, new FastifyAdapter({ bodyLimit: 14 * 1024 * 1024 })); + const app = await NestFactory.create( + AppModule, + new FastifyAdapter({ bodyLimit: 14 * 1024 * 1024 }), + ); await app.register(cors); app.useGlobalFilters(new ProblemDetailsFilter()); @@ -583,7 +613,7 @@ export const createApp = async () => { reply as RuntimeReply, operation, status, - "Request validation failed", + "Request validation failed", apiVersion, validation.errors ?? undefined, ); @@ -610,7 +640,14 @@ export const createApp = async () => { const request = _request as RuntimeRequest & { openapiOperation?: RuntimeOperation }; const statusCode = chooseDeclaredResponseStatus(request.openapiOperation, reply.statusCode); if (statusCode !== reply.statusCode) reply.status(statusCode); - applyDeclaredResponseMetadata(openapiDocument, request, reply as RuntimeReply, request.openapiOperation, statusCode, apiVersion); + applyDeclaredResponseMetadata( + openapiDocument, + request, + reply as RuntimeReply, + request.openapiOperation, + statusCode, + apiVersion, + ); return payload; }); fastify.addHook("onSend", async (request, reply, payload) => { @@ -624,19 +661,23 @@ export const createApp = async () => { const statusCode = reply.statusCode; if (!isDeclaredResponseStatus(operation, statusCode)) { reply.status(502).type("application/problem+json"); - return JSON.stringify(toProblem(502, `Response status ${statusCode} is not declared in the OpenAPI specification`)); + return JSON.stringify( + toProblem(502, `Response status ${statusCode} is not declared in the OpenAPI specification`), + ); } const contentType = reply.getHeader("content-type"); const responseBody = - typeof payload === "string" && isJsonLikeContentType(contentType) - ? JSON.parse(payload) - : payload; + typeof payload === "string" && isJsonLikeContentType(contentType) ? JSON.parse(payload) : payload; const bodyValidation = openapi.validateResponse(responseBody, operationId, statusCode); if (!bodyValidation.valid) { reply.status(502).type("application/problem+json"); return JSON.stringify( - toProblem(502, "Response body does not match the OpenAPI specification", toProblemErrors(bodyValidation.errors ?? undefined)), + toProblem( + 502, + "Response body does not match the OpenAPI specification", + toProblemErrors(bodyValidation.errors ?? undefined), + ), ); } @@ -646,7 +687,11 @@ export const createApp = async () => { if (!headerValidation.valid) { reply.status(502).type("application/problem+json"); return JSON.stringify( - toProblem(502, "Response headers do not match the OpenAPI specification", toProblemErrors(headerValidation.errors ?? undefined)), + toProblem( + 502, + "Response headers do not match the OpenAPI specification", + toProblemErrors(headerValidation.errors ?? undefined), + ), ); } diff --git a/biome.json b/biome.json index 71154d9..18a5e55 100644 --- a/biome.json +++ b/biome.json @@ -19,11 +19,25 @@ } }, "javascript": { + "parser": { + "unsafeParameterDecoratorsEnabled": true + }, "formatter": { "quoteStyle": "double" } }, "files": { - "includes": ["src/**", "test/**", "*.json", "*.ts"] + "includes": [ + "app/**", + "api/**", + "controllers/**", + "decorators/**", + "implementation/**", + "models/**", + "src/**", + "test/**", + "*.json", + "*.ts" + ] } } diff --git a/controllers/ToolsApi.controller.ts b/controllers/ToolsApi.controller.ts index bc43007..5b56fb7 100644 --- a/controllers/ToolsApi.controller.ts +++ b/controllers/ToolsApi.controller.ts @@ -1,52 +1,82 @@ -import { Body, Controller, DefaultValuePipe, Post, Inject, Param, ParseIntPipe, ParseFloatPipe, Query, Req, Res } from '@nestjs/common'; -import type { FastifyReply } from 'fastify'; -import { Observable } from 'rxjs'; -import { Cookies, Headers } from '../decorators'; -import { ToolsApi } from '../api'; -import { ModelsKeycloakClientResult, ModelsLintResult, OasInput, UntrustClientInput, } from '../models'; +import { Body, Controller, Post, Inject, Req, Res } from "@nestjs/common"; +import type { FastifyReply } from "fastify"; +import type { Observable } from "rxjs"; +import { ToolsApi } from "../api"; +import type { ModelsKeycloakClientResult, ModelsLintResult, OasInput, UntrustClientInput } from "../models"; @Controller() export class ToolsApiController { constructor(@Inject(ToolsApi) private readonly toolsApi: ToolsApi) {} - @Post('/v1/arazzo/markdown') - arazzoMarkdown(@Body() oasInput: OasInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): string | Promise | Observable { + @Post("/v1/arazzo/markdown") + arazzoMarkdown( + @Body() oasInput: OasInput | undefined, + @Req() request: Request, + @Res({ passthrough: true }) reply: FastifyReply, + ): string | Promise | Observable { return this.toolsApi.arazzoMarkdown(oasInput, request, reply); } - @Post('/v1/arazzo/mermaid') - arazzoMermaid(@Body() oasInput: OasInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): string | Promise | Observable { + @Post("/v1/arazzo/mermaid") + arazzoMermaid( + @Body() oasInput: OasInput | undefined, + @Req() request: Request, + @Res({ passthrough: true }) reply: FastifyReply, + ): string | Promise | Observable { return this.toolsApi.arazzoMermaid(oasInput, request, reply); } - @Post('/v1/oas/bundle') - bundleOAS(@Body() oasInput: OasInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): void | Promise | Observable { + @Post("/v1/oas/bundle") + bundleOAS( + @Body() oasInput: OasInput | undefined, + @Req() request: Request, + @Res({ passthrough: true }) reply: FastifyReply, + ): void | Promise | Observable { return this.toolsApi.bundleOAS(oasInput, request, reply); } - @Post('/v1/oas/convert') - convertOAS(@Body() oasInput: OasInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): void | Promise | Observable { + @Post("/v1/oas/convert") + convertOAS( + @Body() oasInput: OasInput | undefined, + @Req() request: Request, + @Res({ passthrough: true }) reply: FastifyReply, + ): void | Promise | Observable { return this.toolsApi.convertOAS(oasInput, request, reply); } - @Post('/v1/oas/postman') - createPostmanCollection(@Body() oasInput: OasInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): void | Promise | Observable { + @Post("/v1/oas/postman") + createPostmanCollection( + @Body() oasInput: OasInput | undefined, + @Req() request: Request, + @Res({ passthrough: true }) reply: FastifyReply, + ): void | Promise | Observable { return this.toolsApi.createPostmanCollection(oasInput, request, reply); } - @Post('/v1/oas/generate') - generateOAS(@Body() oasInput: OasInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): object | Promise | Observable { + @Post("/v1/oas/generate") + generateOAS( + @Body() oasInput: OasInput | undefined, + @Req() request: Request, + @Res({ passthrough: true }) reply: FastifyReply, + ): object | Promise | Observable { return this.toolsApi.generateOAS(oasInput, request, reply); } - @Post('/v1/auth/clients') - untrustClient(@Body() untrustClientInput: UntrustClientInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): ModelsKeycloakClientResult | Promise | Observable { + @Post("/v1/auth/clients") + untrustClient( + @Body() untrustClientInput: UntrustClientInput | undefined, + @Req() request: Request, + @Res({ passthrough: true }) reply: FastifyReply, + ): ModelsKeycloakClientResult | Promise | Observable { return this.toolsApi.untrustClient(untrustClientInput, request, reply); } - @Post('/v1/oas/validate') - validatorOpenAPIPost(@Body() oasInput: OasInput | undefined, @Req() request: Request, @Res({ passthrough: true }) reply: FastifyReply): ModelsLintResult | Promise | Observable { + @Post("/v1/oas/validate") + validatorOpenAPIPost( + @Body() oasInput: OasInput | undefined, + @Req() request: Request, + @Res({ passthrough: true }) reply: FastifyReply, + ): ModelsLintResult | Promise | Observable { return this.toolsApi.validatorOpenAPIPost(oasInput, request, reply); } - } diff --git a/controllers/index.ts b/controllers/index.ts index bca7f6c..df13f36 100644 --- a/controllers/index.ts +++ b/controllers/index.ts @@ -1 +1 @@ -export * from './ToolsApi.controller'; +export * from "./ToolsApi.controller"; diff --git a/decorators/cookies-decorator.ts b/decorators/cookies-decorator.ts index fe8ce15..42f65b0 100644 --- a/decorators/cookies-decorator.ts +++ b/decorators/cookies-decorator.ts @@ -1,24 +1,24 @@ -import { createParamDecorator, ExecutionContext } from '@nestjs/common'; +import { createParamDecorator, type ExecutionContext } from "@nestjs/common"; /** -* A decorator function for retrieving cookies from the request object in an HTTP context. -* -* This decorator only works, if the framework specific cookie middleware is installed and enabled. -* - For Express, you need to use the `cookie-parser` middleware. -* - For Fastify, you need to use the `@fastify/cookie` plugin. -* -* Consult https://docs.nestjs.com/techniques/cookies for further information -* -* Usage: -* ``` -* @Get() -* findAll(@Cookies('name') name: string) {} -* ``` -*/ + * A decorator function for retrieving cookies from the request object in an HTTP context. + * + * This decorator only works, if the framework specific cookie middleware is installed and enabled. + * - For Express, you need to use the `cookie-parser` middleware. + * - For Fastify, you need to use the `@fastify/cookie` plugin. + * + * Consult https://docs.nestjs.com/techniques/cookies for further information + * + * Usage: + * ``` + * @Get() + * findAll(@Cookies('name') name: string) {} + * ``` + */ export const Cookies = createParamDecorator((cookieName: string, ctx: ExecutionContext) => { const request = ctx.switchToHttp().getRequest(); if (!cookieName) { return { ...request.cookies, ...request.signedCookies }; } return request.cookies?.[cookieName] ?? request.signedCookies?.[cookieName]; -}); \ No newline at end of file +}); diff --git a/decorators/headers-decorator.ts b/decorators/headers-decorator.ts index 85bd979..16cea73 100644 --- a/decorators/headers-decorator.ts +++ b/decorators/headers-decorator.ts @@ -1,16 +1,16 @@ -import { createParamDecorator, ExecutionContext } from '@nestjs/common'; +import { createParamDecorator, type ExecutionContext } from "@nestjs/common"; /** -* A decorator function for retrieving headers from the request object in an HTTP context. -* Workaround for enabling PipeTransformers on Headers (see https://github.com/nestjs/nest/issues/356) -* -* Usage: -* ``` -* @Get() -* findAll(@Headers('name') name: string) {} -* ``` -*/ + * A decorator function for retrieving headers from the request object in an HTTP context. + * Workaround for enabling PipeTransformers on Headers (see https://github.com/nestjs/nest/issues/356) + * + * Usage: + * ``` + * @Get() + * findAll(@Headers('name') name: string) {} + * ``` + */ export const Headers = createParamDecorator((headerName: string, ctx: ExecutionContext) => { const request = ctx.switchToHttp().getRequest(); return headerName ? request.headers?.[headerName.toLowerCase()] : request.headers; -}); \ No newline at end of file +}); diff --git a/decorators/index.ts b/decorators/index.ts index 4bd1d7b..2298186 100644 --- a/decorators/index.ts +++ b/decorators/index.ts @@ -1,2 +1,2 @@ -export * from './cookies-decorator'; -export * from './headers-decorator'; \ No newline at end of file +export * from "./cookies-decorator"; +export * from "./headers-decorator"; diff --git a/implementation/tools-api.service.ts b/implementation/tools-api.service.ts index 501769f..b29508d 100644 --- a/implementation/tools-api.service.ts +++ b/implementation/tools-api.service.ts @@ -40,21 +40,21 @@ export class ToolsApiService extends ToolsApi { const { bundleOAS } = await loadLogic(); const result = await asBadRequest(() => bundleOAS(oasInput as OasInput)); setHeaders(reply, result.headers); - return result.rawBody as unknown as void; + return result.rawBody as never; } async convertOAS(oasInput: OasInput | undefined, _request: Request, reply: FastifyReply): Promise { const { convertOAS } = await loadLogic(); const result = await asBadRequest(() => convertOAS(oasInput as OasInput)); setHeaders(reply, result.headers); - return result.rawBody as unknown as void; + return result.rawBody as never; } async createPostmanCollection(oasInput: OasInput | undefined, _request: Request, reply: FastifyReply): Promise { const { createPostmanCollection } = await loadLogic(); const result = await asBadRequest(() => createPostmanCollection(oasInput as OasInput)); setHeaders(reply, result.headers); - return result.rawBody as unknown as void; + return result.rawBody as never; } async generateOAS(oasInput: OasInput | undefined, _request: Request, reply: FastifyReply): Promise { @@ -66,7 +66,9 @@ export class ToolsApiService extends ToolsApi { async untrustClient(untrustClientInput: UntrustedClientInput | undefined): Promise { const { untrustedClient } = await loadLogic(); - return asBadRequest(() => untrustedClient(untrustClientInput as UntrustedClientInput)) as Promise; + return asBadRequest(() => + untrustedClient(untrustClientInput as UntrustedClientInput), + ) as Promise; } async validatorOpenAPIPost(oasInput: OasInput | undefined): Promise { diff --git a/models/index.ts b/models/index.ts index 7b5a4f5..1102429 100644 --- a/models/index.ts +++ b/models/index.ts @@ -1,17 +1,15 @@ -export * from './models-keycloak-client-result'; -export * from './models-lint-message'; -export * from './models-lint-message-info'; -export * from './models-lint-result'; -export * from './oas-input'; -export * from './untrust-client-input'; - -export {}; +export * from "./models-keycloak-client-result"; +export * from "./models-lint-message"; +export * from "./models-lint-message-info"; +export * from "./models-lint-result"; +export * from "./oas-input"; +export * from "./untrust-client-input"; declare global { - type ModelsKeycloakClientResult = import('./models-keycloak-client-result').ModelsKeycloakClientResult; - type ModelsLintMessage = import('./models-lint-message').ModelsLintMessage; - type ModelsLintMessageInfo = import('./models-lint-message-info').ModelsLintMessageInfo; - type ModelsLintResult = import('./models-lint-result').ModelsLintResult; - type OasInput = import('./oas-input').OasInput; - type UntrustClientInput = import('./untrust-client-input').UntrustClientInput; + type ModelsKeycloakClientResult = import("./models-keycloak-client-result").ModelsKeycloakClientResult; + type ModelsLintMessage = import("./models-lint-message").ModelsLintMessage; + type ModelsLintMessageInfo = import("./models-lint-message-info").ModelsLintMessageInfo; + type ModelsLintResult = import("./models-lint-result").ModelsLintResult; + type OasInput = import("./oas-input").OasInput; + type UntrustClientInput = import("./untrust-client-input").UntrustClientInput; } diff --git a/models/models-keycloak-client-result.ts b/models/models-keycloak-client-result.ts index 4ae98d2..cf2f3d9 100644 --- a/models/models-keycloak-client-result.ts +++ b/models/models-keycloak-client-result.ts @@ -1,4 +1,3 @@ -export interface ModelsKeycloakClientResult { +export interface ModelsKeycloakClientResult { apiKey?: string; } - diff --git a/models/models-lint-message-info.ts b/models/models-lint-message-info.ts index 97b555b..fedea5b 100644 --- a/models/models-lint-message-info.ts +++ b/models/models-lint-message-info.ts @@ -1,7 +1,6 @@ -export interface ModelsLintMessageInfo { +export interface ModelsLintMessageInfo { id?: string; lintMessageId?: string; message?: string; path?: string; } - diff --git a/models/models-lint-message.ts b/models/models-lint-message.ts index dd559e7..b0d21e8 100644 --- a/models/models-lint-message.ts +++ b/models/models-lint-message.ts @@ -1,8 +1,7 @@ -export interface ModelsLintMessage { +export interface ModelsLintMessage { code?: string; createdAt?: string; id?: string; infos?: Array; severity?: string; } - diff --git a/models/models-lint-result.ts b/models/models-lint-result.ts index 13136f5..ed79fbb 100644 --- a/models/models-lint-result.ts +++ b/models/models-lint-result.ts @@ -1,4 +1,4 @@ -export interface ModelsLintResult { +export interface ModelsLintResult { apiId?: string; createdAt?: string; failures?: number; @@ -11,4 +11,3 @@ export interface ModelsLintResult { */ rulesetVersion?: string; } - diff --git a/models/oas-input.ts b/models/oas-input.ts index 9d2c87e..674556a 100644 --- a/models/oas-input.ts +++ b/models/oas-input.ts @@ -1,4 +1,4 @@ -export interface OasInput { +export interface OasInput { oasBody?: string; oasUrl?: string; /** @@ -6,4 +6,3 @@ export interface OasInput { */ targetVersion?: string; } - diff --git a/models/untrust-client-input.ts b/models/untrust-client-input.ts index b2d1fe2..a28b2a8 100644 --- a/models/untrust-client-input.ts +++ b/models/untrust-client-input.ts @@ -1,4 +1,3 @@ -export interface UntrustClientInput { +export interface UntrustClientInput { email?: string; } - From 4a51a39beaea3fd2a9887ae1b54145ff6d5e527f Mon Sep 17 00:00:00 2001 From: Matthijs Hovestad Date: Thu, 25 Jun 2026 08:38:54 +0200 Subject: [PATCH 24/27] Apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- app/index.ts | 8 ++++++-- implementation/tools-api.service.ts | 2 +- test/convert-oas.test.ts | 17 +++++++++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/app/index.ts b/app/index.ts index 6e62d07..01192ed 100644 --- a/app/index.ts +++ b/app/index.ts @@ -561,9 +561,11 @@ export const createApp = async () => { fastify.addHook("preValidation", async (request, reply) => { if (isGeneratedOpenApiEndpoint(request.url)) return; + const requestPath = request.url.split("?")[0] ?? request.url; + const openapiRequest: RuntimeOpenAPIRequest = { method: request.method, - path: request.url, + path: requestPath, body: request.body, query: request.query as Record | string | undefined, headers: toHeaderRecord(request.headers), @@ -668,7 +670,9 @@ export const createApp = async () => { const contentType = reply.getHeader("content-type"); const responseBody = - typeof payload === "string" && isJsonLikeContentType(contentType) ? JSON.parse(payload) : payload; + isJsonLikeContentType(contentType) && (typeof payload === "string" || payload instanceof Uint8Array) + ? JSON.parse(Buffer.from(payload).toString("utf8")) + : payload; const bodyValidation = openapi.validateResponse(responseBody, operationId, statusCode); if (!bodyValidation.valid) { reply.status(502).type("application/problem+json"); diff --git a/implementation/tools-api.service.ts b/implementation/tools-api.service.ts index b29508d..a3485b2 100644 --- a/implementation/tools-api.service.ts +++ b/implementation/tools-api.service.ts @@ -61,7 +61,7 @@ export class ToolsApiService extends ToolsApi { const { generateOAS } = await loadLogic(); const result = await asBadRequest(() => generateOAS(oasInput as OasInput)); setHeaders(reply, result.headers); - return result.rawBody as unknown as object; + return JSON.parse(Buffer.from(result.rawBody).toString("utf8")) as object; } async untrustClient(untrustClientInput: UntrustedClientInput | undefined): Promise { diff --git a/test/convert-oas.test.ts b/test/convert-oas.test.ts index 39bc380..3f37b4a 100644 --- a/test/convert-oas.test.ts +++ b/test/convert-oas.test.ts @@ -51,4 +51,21 @@ components: expect(result.headers["Content-Disposition"]).toBe('attachment; filename="openapi-3-1-0.yaml"'); expect((converted as { openapi: string }).openapi).toBe("3.1.0"); }); + + it("downgrades 3.1 -> 3.0 (JSON)", async () => { + const sourceSpec = { openapi: "3.1.0", info: { title: "Test API", version: "1.0.0" }, paths: {}, webhooks: { onEvent: { post: { responses: { 200: { description: "OK" } } } } }, components: { schemas: { Pet: { type: "object", properties: { nickname: { type: ["string", "null"] } } } } } }; + const result = await convertOAS({ oasBody: JSON.stringify(sourceSpec), targetVersion: "3.0" }); + const converted = toJson(result.rawBody); + expect(converted.openapi).toBe("3.0.3"); + expect(Object.hasOwn(converted, "webhooks")).toBe(false); + expect(converted.components.schemas.Pet.properties.nickname.type).toBe("string"); + expect(converted.components.schemas.Pet.properties.nickname.nullable).toBe(true); + }); + + it("keeps existing 3.1 patch version when targetVersion is omitted", async () => { + const sourceSpec = { openapi: "3.1.2", info: { title: "Test API", version: "1.0.0" }, paths: {} }; + const result = await convertOAS({ oasBody: JSON.stringify(sourceSpec) }); + expect(toJson(result.rawBody).openapi).toBe("3.1.2"); + expect(result.headers["Content-Disposition"]).toBe('attachment; filename="openapi-3-1-2.json"'); + }); }); From bc2bdf518fcca7e328f33775fe6928f41707c8cc Mon Sep 17 00:00:00 2001 From: pasibun Date: Thu, 25 Jun 2026 09:27:34 +0200 Subject: [PATCH 25/27] Remove redundant OpenAPI YAML [deploy-test] --- README.md | 11 +- api/openapi.yaml | 665 ---------------------------------------------- app/index.ts | 9 +- package-lock.json | 1 - package.json | 1 - 5 files changed, 6 insertions(+), 681 deletions(-) delete mode 100644 api/openapi.yaml diff --git a/README.md b/README.md index d9a044f..abb7c1c 100644 --- a/README.md +++ b/README.md @@ -11,17 +11,16 @@ businesslogica staat in `@developer-overheid-nl/don-tools-logic` en wordt los be - NestJS met Fastify als HTTP runtime - OpenAPI request- en responsevalidatie via `openapi-backend` -- Gegenereerde controller- en modelbestanden op basis van `api/openapi.yaml` +- Gegenereerde controller- en modelbestanden op basis van `api/openapi.json` - Implementatie-adapter in `implementation/tools-api.service.ts` - Docker image voor deployment op poort `1338` ## Endpoints -De OpenAPI-specificatie staat in `api/openapi.yaml` en `api/openapi.json`. +De OpenAPI-specificatie staat in `api/openapi.json`. -Bij runtime worden deze ook beschikbaar gemaakt op: +Bij runtime wordt deze ook beschikbaar gemaakt op: -- `GET /openapi.yaml` - `GET /openapi.json` Belangrijkste tools-endpoints: @@ -111,8 +110,8 @@ npm run build npm test ``` -Bij wijzigingen aan `api/openapi.yaml` of gegenereerde bestanden: controleer ook of -`api/openapi.json`, `controllers/`, `models/` en `api/` nog overeenkomen met het contract. +Bij wijzigingen aan `api/openapi.json` of gegenereerde bestanden: controleer ook of +`controllers/`, `models/` en `api/` nog overeenkomen met het contract. ## Repository-indeling diff --git a/api/openapi.yaml b/api/openapi.yaml deleted file mode 100644 index 0f2e2f7..0000000 --- a/api/openapi.yaml +++ /dev/null @@ -1,665 +0,0 @@ -{ - "openapi": "3.0.1", - "info": { - "contact": { - "email": "developer.overheid@geonovum.nl", - "name": "Team developer.overheid.nl", - "url": "https://github.com/developer-overheid-nl/don-tools-api/issues" - }, - "description": "API to access the tools endpoints of developer.overheid.nl.\n\n## Auth\n\nThis API provides tools endpoints that can be accessed with either an API key or a client credentials token.\n\n### API key\n\nUsing an API key, you can access the tools endpoints.\nThese requests can also be made from the browser.\nRequest a read-only API key at https://apis.developer.overheid.nl/apis/key-aanvragen.\nSimply pass the obtained API key with each request using the `X-Api-Key` header.\n\n### Client credentials token\n\nUsing a client credentials token, you can access the tools endpoints.\nTo obtain the token, perform a `POST` request to `https://auth.developer.overheid.nl/realms/don/protocol/openid-connect/token` with the following Form URL Encoded body:\n- `grant_type`: `client_credentials`\n- `scope`: `tools`\n- `client_id`: the client id you received from us\n- `client_secret`: the client secret you received from us\n\nPass the obtained token with each request using the `Authorization` header. Example:\n\n`Authorization`: `Bearer {ACCESS_TOKEN}` (replace `{ACCESS_TOKEN}` with the obtained `access_token`)", - "title": "Tools API v1", - "version": "1.0.0" - }, - "servers": [ - { - "description": "Production", - "url": "https://api.developer.overheid.nl/tools/v1" - }, - { - "description": "Test", - "url": "https://api.don.apps.digilab.network/tools/v1" - } - ], - "tags": [ - { - "description": "Tools API V1 routes", - "name": "API v1" - }, - { - "description": "Conversies en hulpmiddelen", - "name": "Tools" - } - ], - "paths": { - "/v1/arazzo/markdown": { - "post": { - "description": "Genereert alleen de Markdown-uitvoer van een Arazzo specificatie. Body: { oasUrl|oasBody }", - "operationId": "arazzoMarkdown", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OasInput" - } - } - } - }, - "responses": { - "200": { - "content": { - "text/markdown": { - "schema": { - "type": "string" - } - } - }, - "description": "OK", - "headers": { - "API-Version": { - "description": "De API-versie van de response", - "explode": false, - "schema": { - "type": "string" - }, - "style": "simple" - } - } - }, - "404": { - "$ref": "#/components/responses/404" - } - }, - "security": [ - { - "apiKey": [], - "clientCredentials": [] - } - ], - "summary": "Arazzo Markdown (POST)", - "tags": [ - "Tools" - ], - "x-eov-operation-handler": "controllers/ToolsController" - } - }, - "/v1/arazzo/mermaid": { - "post": { - "description": "Genereert alleen de Mermaid flowchart van een Arazzo specificatie. Body: { oasUrl|oasBody }", - "operationId": "arazzoMermaid", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OasInput" - } - } - } - }, - "responses": { - "200": { - "content": { - "text/plain": { - "schema": { - "type": "string" - } - } - }, - "description": "OK", - "headers": { - "API-Version": { - "description": "De API-versie van de response", - "explode": false, - "schema": { - "type": "string" - }, - "style": "simple" - } - } - }, - "404": { - "$ref": "#/components/responses/404" - } - }, - "security": [ - { - "apiKey": [], - "clientCredentials": [] - } - ], - "summary": "Arazzo Mermaid (POST)", - "tags": [ - "Tools" - ], - "x-eov-operation-handler": "controllers/ToolsController" - } - }, - "/v1/auth/clients": { - "post": { - "description": "Maak een client aan via de admin API. Body bevat Email.", - "operationId": "untrustClient", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UntrustClientInput" - } - } - } - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelsKeycloakClientResult" - } - } - }, - "description": "OK", - "headers": { - "API-Version": { - "description": "De API-versie van de response", - "explode": false, - "schema": { - "type": "string" - }, - "style": "simple" - } - } - }, - "404": { - "$ref": "#/components/responses/404" - } - }, - "security": [ - { - "apiKey": [], - "clientCredentials": [] - } - ], - "summary": "Maak client (POST)", - "tags": [ - "Tools" - ], - "x-eov-operation-handler": "controllers/ToolsController" - } - }, - "/v1/oas/convert": { - "post": { - "description": "Converteert OpenAPI naar de laatst ondersteunde versie (standaard 3.1). Meegegeven targetVersion (3.0 of 3.1) bepaalt het doel. Body: { oasUrl } of { oasBody } (stringified JSON of YAML).", - "operationId": "convertOAS", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OasInput" - } - } - } - }, - "responses": { - "200": { - "description": "OK", - "headers": { - "API-Version": { - "description": "De API-versie van de response", - "explode": false, - "schema": { - "type": "string" - }, - "style": "simple" - } - } - }, - "404": { - "$ref": "#/components/responses/404" - } - }, - "security": [ - { - "apiKey": [], - "clientCredentials": [] - } - ], - "summary": "Converteer OpenAPI 3.0/3.1", - "tags": [ - "Tools" - ], - "x-eov-operation-handler": "controllers/ToolsController", - "x-original-operationId": "ConvertOAS" - } - }, - "/v1/oas/bundle": { - "post": { - "description": "Bundelt een OpenAPI specificatie en lost externe verwijzingen op. Body: { oasUrl } of { oasBody }.", - "operationId": "bundleOAS", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OasInput" - } - } - } - }, - "responses": { - "200": { - "description": "OK", - "headers": { - "API-Version": { - "description": "De API-versie van de response", - "explode": false, - "schema": { - "type": "string" - }, - "style": "simple" - } - } - }, - "404": { - "$ref": "#/components/responses/404" - } - }, - "security": [ - { - "apiKey": [], - "clientCredentials": [] - } - ], - "summary": "Bundle OpenAPI", - "tags": [ - "Tools" - ], - "x-eov-operation-handler": "controllers/ToolsController" - } - }, - "/v1/oas/generate": { - "post": { - "description": "Genereert een boilerplate OpenAPI specificatie op basis van JSON-invoer. Body: { oasUrl } of { oasBody } (stringified JSON).", - "operationId": "generateOAS", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OasInput" - } - } - } - }, - "responses": { - "200": { - "description": "OK", - "headers": { - "API-Version": { - "description": "De API-versie van de response", - "explode": false, - "schema": { - "type": "string" - }, - "style": "simple" - } - }, - "content": { - "application/json": { - "schema": { - "type": "object" - } - } - } - }, - "404": { - "$ref": "#/components/responses/404" - } - }, - "security": [ - { - "apiKey": [], - "clientCredentials": [] - } - ], - "summary": "Generate OpenAPI", - "tags": [ - "Tools" - ], - "x-eov-operation-handler": "controllers/ToolsController", - "x-original-operationId": "GenerateOAS" - } - }, - "/v1/oas/validate": { - "post": { - "description": "Valideert een OpenAPI specificatie met de DON ADR ruleset. Standaard wordt ruleset 2.1 gebruikt; geef targetVersion \"2.0\" of \"2.1\" mee om een versie te kiezen. Body: { oasUrl } of { oasBody } (stringified JSON of YAML).", - "operationId": "validatorOpenAPIPost", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OasInput" - } - } - } - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ModelsLintResult" - } - } - }, - "description": "OK", - "headers": { - "API-Version": { - "description": "De API-versie van de response", - "explode": false, - "schema": { - "type": "string" - }, - "style": "simple" - } - } - }, - "404": { - "$ref": "#/components/responses/404" - } - }, - "security": [ - { - "apiKey": [], - "clientCredentials": [] - } - ], - "summary": "Validate OpenAPI (POST)", - "tags": [ - "Tools" - ], - "x-eov-operation-handler": "controllers/ToolsController" - } - }, - "/v1/oas/postman": { - "post": { - "description": "Converteert OpenAPI naar Postman Collection JSON. Body: { oasUrl } of { oasBody } (stringified JSON of YAML).", - "operationId": "createPostmanCollection", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OasInput" - } - } - } - }, - "responses": { - "200": { - "description": "OK", - "headers": { - "API-Version": { - "description": "De API-versie van de response", - "explode": false, - "schema": { - "type": "string" - }, - "style": "simple" - } - } - }, - "404": { - "$ref": "#/components/responses/404" - } - }, - "security": [ - { - "apiKey": [], - "clientCredentials": [] - } - ], - "summary": "Maak Postman-collectie (POST)", - "tags": [ - "Tools" - ], - "x-eov-operation-handler": "controllers/ToolsController", - "x-original-operationId": "CreatePostmanCollection" - } - } - }, - "components": { - "headers": { - "API-Version": { - "description": "De API-versie van de response", - "explode": false, - "schema": { - "example": "1.0.0", - "type": "string" - }, - "style": "simple" - } - }, - "responses": { - "404": { - "description": "Resource does not exist", - "headers": { - "API-Version": { - "$ref": "#/components/headers/API-Version" - } - } - } - }, - "schemas": { - "OasInput": { - "example": { - "oasUrl": "oasUrl", - "oasBody": "oasBody", - "targetVersion": "3.1" - }, - "properties": { - "oasBody": { - "type": "string" - }, - "oasUrl": { - "type": "string" - }, - "targetVersion": { - "description": "Doelversie. Voor conversie: 3.0 of 3.1. Voor validatie: 2.0 of 2.1.", - "type": "string" - } - }, - "type": "object" - }, - "ModelsKeycloakClientResult": { - "example": { - "apiKey": "apiKey" - }, - "properties": { - "apiKey": { - "type": "string" - } - }, - "type": "object" - }, - "ModelsLintMessage": { - "example": { - "severity": "severity", - "createdAt": "2000-01-23T04:56:07.000Z", - "code": "code", - "id": "id", - "infos": [ - { - "path": "path", - "lintMessageId": "lintMessageId", - "id": "id", - "message": "message" - }, - { - "path": "path", - "lintMessageId": "lintMessageId", - "id": "id", - "message": "message" - } - ] - }, - "properties": { - "code": { - "type": "string" - }, - "createdAt": { - "format": "date-time", - "type": "string" - }, - "id": { - "type": "string" - }, - "infos": { - "items": { - "$ref": "#/components/schemas/ModelsLintMessageInfo" - }, - "type": "array" - }, - "severity": { - "type": "string" - } - }, - "type": "object" - }, - "ModelsLintMessageInfo": { - "example": { - "path": "path", - "lintMessageId": "lintMessageId", - "id": "id", - "message": "message" - }, - "properties": { - "id": { - "type": "string" - }, - "lintMessageId": { - "type": "string" - }, - "message": { - "type": "string" - }, - "path": { - "type": "string" - } - }, - "type": "object" - }, - "ModelsLintResult": { - "example": { - "createdAt": "2000-01-23T04:56:07.000Z", - "score": 6, - "failures": 0, - "successes": true, - "rulesetVersion": "2.1", - "messages": [ - { - "severity": "severity", - "createdAt": "2000-01-23T04:56:07.000Z", - "code": "code", - "id": "id", - "infos": [ - { - "path": "path", - "lintMessageId": "lintMessageId", - "id": "id", - "message": "message" - }, - { - "path": "path", - "lintMessageId": "lintMessageId", - "id": "id", - "message": "message" - } - ] - }, - { - "severity": "severity", - "createdAt": "2000-01-23T04:56:07.000Z", - "code": "code", - "id": "id", - "infos": [ - { - "path": "path", - "lintMessageId": "lintMessageId", - "id": "id", - "message": "message" - }, - { - "path": "path", - "lintMessageId": "lintMessageId", - "id": "id", - "message": "message" - } - ] - } - ], - "id": "id", - "apiId": "apiId" - }, - "properties": { - "apiId": { - "type": "string" - }, - "createdAt": { - "format": "date-time", - "type": "string" - }, - "failures": { - "format": "int32", - "type": "integer" - }, - "id": { - "type": "string" - }, - "messages": { - "items": { - "$ref": "#/components/schemas/ModelsLintMessage" - }, - "type": "array" - }, - "score": { - "format": "int32", - "type": "integer" - }, - "successes": { - "type": "boolean" - }, - "rulesetVersion": { - "description": "De gebruikte ruleset-versie voor validatie.", - "type": "string" - } - }, - "type": "object" - }, - "UntrustClientInput": { - "example": { - "email": "email" - }, - "properties": { - "email": { - "type": "string" - } - }, - "type": "object" - } - }, - "securitySchemes": { - "apiKey": { - "in": "header", - "name": "X-Api-Key", - "type": "apiKey", - "description": "Read-only API keys for tools endpoints can be requested at https://apis.developer.overheid.nl/apis/key-aanvragen." - }, - "clientCredentials": { - "flows": { - "clientCredentials": { - "scopes": { - "tools": "Access to tools endpoints" - }, - "tokenUrl": "https://auth.developer.overheid.nl/realms/don/protocol/openid-connect/token" - } - }, - "type": "oauth2" - } - } - } -} diff --git a/app/index.ts b/app/index.ts index 01192ed..a211540 100644 --- a/app/index.ts +++ b/app/index.ts @@ -12,8 +12,6 @@ import type Ajv from "ajv"; import { ApiModule } from "./api.module"; import { ToolsApiService } from "../implementation/tools-api.service"; -const yaml = require("js-yaml") as { load(input: string): unknown }; - type RuntimeOpenAPIRequest = OpenAPIRequest & { path: string; }; @@ -525,8 +523,7 @@ export const createApp = async () => { await app.register(cors); app.useGlobalFilters(new ProblemDetailsFilter()); - const openapiYaml = readFileSync(join(process.cwd(), "api", "openapi.yaml"), "utf8"); - const openapiDocument = yaml.load(openapiYaml); + const openapiDocument = JSON.parse(readFileSync(join(process.cwd(), "api", "openapi.json"), "utf8")) as unknown; const openapi = new OpenAPIBackend({ definition: openapiDocument as never, quick: true, @@ -552,7 +549,6 @@ export const createApp = async () => { pathPattern: openApiPathToRegExp(operation.path), })); const generatedOpenApiPaths = new Set(); - if (!hasOpenApiPath(openapiDocument, "/openapi.yaml")) generatedOpenApiPaths.add("/openapi.yaml"); if (!hasOpenApiPath(openapiDocument, "/openapi.json")) generatedOpenApiPaths.add("/openapi.json"); const isGeneratedOpenApiEndpoint = (path: string): boolean => generatedOpenApiPaths.has(path.split("?")[0] ?? path); @@ -701,9 +697,6 @@ export const createApp = async () => { return payload; }); - if (generatedOpenApiPaths.has("/openapi.yaml")) { - fastify.get("/openapi.yaml", async (_request, reply) => reply.type("text/yaml; charset=utf-8").send(openapiYaml)); - } if (generatedOpenApiPaths.has("/openapi.json")) { fastify.get("/openapi.json", async () => openapiDocument); } diff --git a/package-lock.json b/package-lock.json index e374d12..77e0851 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,6 @@ "@nestjs/platform-fastify": "^11.1.27", "ajv-formats": "^3.0.1", "fastify": "^5.8.5", - "js-yaml": "^5.1.0", "openapi-backend": "^5.17.0", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.2" diff --git a/package.json b/package.json index 7a59e30..e4f53cc 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,6 @@ "@nestjs/platform-fastify": "^11.1.27", "ajv-formats": "^3.0.1", "fastify": "^5.8.5", - "js-yaml": "^5.1.0", "openapi-backend": "^5.17.0", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.2" From f602d1fca7f15410db82b0696ff1b62d3bb124bc Mon Sep 17 00:00:00 2001 From: pasibun Date: Fri, 26 Jun 2026 09:04:32 +0200 Subject: [PATCH 26/27] Use fixed DON tools package for circular OAS dereference [deploy-test] --- README.md | 11 ++++---- implementation/tools-api.service.ts | 44 ++++++++++++++++++++--------- package-lock.json | 8 +++--- package.json | 2 +- test/app.test.ts | 34 ++++++++++++++++++++++ test/convert-oas.test.ts | 10 +++++-- 6 files changed, 82 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index abb7c1c..88e3ff8 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,7 @@ HTTP API voor de tools op `developer.overheid.nl`. Deze repository bevat de API-laag voor versie 1 van de Tools API: routing, OpenAPI-validatie, response headers, foutafhandeling en de koppeling naar de daadwerkelijke businesslogica. Die -businesslogica staat in `@developer-overheid-nl/don-tools-logic` en wordt los beheerd in -`don-tools-api-v2`. +businesslogica staat in `@developer-overheid-nl/don-tools` en wordt los beheerd in `don-tools`. ## Wat zit hierin? @@ -72,15 +71,15 @@ Mock mode kan ook direct via: npm run dev-mock ``` -## Relatie met `don-tools-api-v2` +## Relatie met `don-tools` `don-tools-api` is de v1 HTTP-adapter. De herbruikbare logica zit in -`@developer-overheid-nl/don-tools-logic`. +`@developer-overheid-nl/don-tools`. Zodra de logic package op npm gepubliceerd is, pin deze API op een expliciete packageversie: ```sh -npm install @developer-overheid-nl/don-tools-logic@ +npm install @developer-overheid-nl/don-tools@ ``` Gebruik liever een npm-versie dan een GitHub dependency in CI/CD. Dat voorkomt dat builds afhankelijk @@ -120,7 +119,7 @@ api/ OpenAPI contract en gegenereerde API interfaces app/ NestJS/Fastify bootstrap en OpenAPI middleware controllers/ Gegenereerde NestJS controllers decorators/ Gegenereerde request decorators -implementation/ Handgeschreven adapter naar don-tools-logic +implementation/ Handgeschreven adapter naar don-tools models/ Gegenereerde request/response modellen test/ Vitest tests ``` diff --git a/implementation/tools-api.service.ts b/implementation/tools-api.service.ts index a3485b2..bba3e6c 100644 --- a/implementation/tools-api.service.ts +++ b/implementation/tools-api.service.ts @@ -1,6 +1,6 @@ -import { BadRequestException, Injectable } from "@nestjs/common"; +import { HttpException, Injectable } from "@nestjs/common"; import type { FastifyReply } from "fastify"; -import type { OasInput, UntrustedClientInput, ValidateInput } from "@developer-overheid-nl/don-tools-logic"; +import type { OasInput, UntrustedClientInput, ValidateInput } from "@developer-overheid-nl/don-tools"; import { ToolsApi } from "../api"; import type { ModelsKeycloakClientResult, ModelsLintResult } from "../models"; @@ -10,15 +10,31 @@ const setHeaders = (reply: FastifyReply, headers: Record) => { const importEsm = new Function("specifier", "return import(specifier)") as (specifier: string) => Promise; const loadLogic = () => - import("@developer-overheid-nl/don-tools-logic").catch(() => - importEsm("@developer-overheid-nl/don-tools-logic"), + import("@developer-overheid-nl/don-tools").catch(() => + importEsm("@developer-overheid-nl/don-tools"), ); -const asBadRequest = async (operation: () => Promise): Promise => { +const getLogicErrorStatus = (error: unknown): number | undefined => { + if (typeof error !== "object" || error === null || !("status" in error)) return undefined; + const status = (error as { status: unknown }).status; + return typeof status === "number" ? status : undefined; +}; + +const getLogicErrorMessage = (error: unknown): string => { + if (typeof error !== "object" || error === null) { + return "Request validation failed"; + } + if (error instanceof Error && error.message.length > 0) return error.message; + const detail = "detail" in error ? (error as { detail: unknown }).detail : undefined; + if (typeof detail === "string" && detail.length > 0) return detail; + return "Request validation failed"; +}; + +const asHttpException = async (operation: () => Promise): Promise => { try { return await operation(); } catch (error) { - throw new BadRequestException(error instanceof Error ? error.message : "Request validation failed"); + throw new HttpException(getLogicErrorMessage(error), getLogicErrorStatus(error) ?? 400); } }; @@ -27,52 +43,52 @@ export class ToolsApiService extends ToolsApi { async arazzoMarkdown(oasInput: OasInput | undefined, _request: Request, reply: FastifyReply): Promise { const { arazzoMarkdown } = await loadLogic(); reply.type("text/markdown; charset=utf-8"); - return asBadRequest(() => arazzoMarkdown(oasInput as OasInput)); + return asHttpException(() => arazzoMarkdown(oasInput as OasInput)); } async arazzoMermaid(oasInput: OasInput | undefined, _request: Request, reply: FastifyReply): Promise { const { arazzoMermaid } = await loadLogic(); reply.type("text/plain; charset=utf-8"); - return asBadRequest(() => arazzoMermaid(oasInput as OasInput)); + return asHttpException(() => arazzoMermaid(oasInput as OasInput)); } async bundleOAS(oasInput: OasInput | undefined, _request: Request, reply: FastifyReply): Promise { const { bundleOAS } = await loadLogic(); - const result = await asBadRequest(() => bundleOAS(oasInput as OasInput)); + const result = await asHttpException(() => bundleOAS(oasInput as OasInput)); setHeaders(reply, result.headers); return result.rawBody as never; } async convertOAS(oasInput: OasInput | undefined, _request: Request, reply: FastifyReply): Promise { const { convertOAS } = await loadLogic(); - const result = await asBadRequest(() => convertOAS(oasInput as OasInput)); + const result = await asHttpException(() => convertOAS(oasInput as OasInput)); setHeaders(reply, result.headers); return result.rawBody as never; } async createPostmanCollection(oasInput: OasInput | undefined, _request: Request, reply: FastifyReply): Promise { const { createPostmanCollection } = await loadLogic(); - const result = await asBadRequest(() => createPostmanCollection(oasInput as OasInput)); + const result = await asHttpException(() => createPostmanCollection(oasInput as OasInput)); setHeaders(reply, result.headers); return result.rawBody as never; } async generateOAS(oasInput: OasInput | undefined, _request: Request, reply: FastifyReply): Promise { const { generateOAS } = await loadLogic(); - const result = await asBadRequest(() => generateOAS(oasInput as OasInput)); + const result = await asHttpException(() => generateOAS(oasInput as OasInput)); setHeaders(reply, result.headers); return JSON.parse(Buffer.from(result.rawBody).toString("utf8")) as object; } async untrustClient(untrustClientInput: UntrustedClientInput | undefined): Promise { const { untrustedClient } = await loadLogic(); - return asBadRequest(() => + return asHttpException(() => untrustedClient(untrustClientInput as UntrustedClientInput), ) as Promise; } async validatorOpenAPIPost(oasInput: OasInput | undefined): Promise { const { validatorOpenAPIPost } = await loadLogic(); - return asBadRequest(() => validatorOpenAPIPost(oasInput as ValidateInput)) as Promise; + return asHttpException(() => validatorOpenAPIPost(oasInput as ValidateInput)) as Promise; } } diff --git a/package-lock.json b/package-lock.json index 77e0851..d43ca50 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "EUPL-1.2", "dependencies": { - "@developer-overheid-nl/don-tools-logic": "^0.0.2", + "@developer-overheid-nl/don-tools": "git+https://github.com/developer-overheid-nl/don-tools.git#d3d54ba222717d070b8d1ddd7689713dd0aaab26", "@fastify/cors": "^11.2.0", "@nestjs/common": "^11.1.27", "@nestjs/core": "^11.1.27", @@ -331,10 +331,10 @@ "@stoplight/spectral-rulesets": "^1.22.0" } }, - "node_modules/@developer-overheid-nl/don-tools-logic": { + "node_modules/@developer-overheid-nl/don-tools": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@developer-overheid-nl/don-tools-logic/-/don-tools-logic-0.0.2.tgz", - "integrity": "sha512-uX9KegVIk0/r+EDkt0199Ddy4m7mxWeWPwp3WE0fI+eBaUZMvAUTva4ZRsWvv6i3SjNy4Gfr9lof2PFETjzhzg==", + "resolved": "git+https://github.com/developer-overheid-nl/don-tools.git#d3d54ba222717d070b8d1ddd7689713dd0aaab26", + "integrity": "sha512-bXDlRFB8LlqNSIxLDryfYL+FGAYJ1EFQvUPkNNvWGsiKHgSFjC/ix2IHvh+uUP6jgZvsfgkqlJu/8mL3x1TLCg==", "license": "EUPL-1.2", "dependencies": { "@apiture/openapi-down-convert": "^0.14.2", diff --git a/package.json b/package.json index e4f53cc..7941ba3 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "license": "EUPL-1.2", "private": true, "dependencies": { - "@developer-overheid-nl/don-tools-logic": "^0.0.2", + "@developer-overheid-nl/don-tools": "git+https://github.com/developer-overheid-nl/don-tools.git#d3d54ba222717d070b8d1ddd7689713dd0aaab26", "@fastify/cors": "^11.2.0", "@nestjs/common": "^11.1.27", "@nestjs/core": "^11.1.27", diff --git a/test/app.test.ts b/test/app.test.ts index 37fb79b..868a855 100644 --- a/test/app.test.ts +++ b/test/app.test.ts @@ -60,6 +60,40 @@ describe("app", () => { expect(JSON.parse(response.body)).toMatchObject({ openapi: "3.1.0" }); }); + it("returns 422 when an OpenAPI document cannot be fully dereferenced", async () => { + const response = await inject({ + method: "POST", + url: "/v1/oas/bundle", + payload: { + oasBody: JSON.stringify({ + openapi: "3.0.3", + info: { title: "Recursive API", version: "1.0.0" }, + paths: {}, + components: { + schemas: { + Node: { + type: "object", + properties: { + children: { + type: "array", + items: { $ref: "#/components/schemas/Node" }, + }, + }, + }, + }, + }, + }), + }, + }); + + expect(response.statusCode).toBe(422); + expect(response.headers["content-type"]).toContain("application/problem+json"); + expect(response.json()).toMatchObject({ + status: 422, + title: "De OpenAPI specificatie bevat circulaire verwijzingen en kan niet volledig worden gedereferenced.", + }); + }); + it("returns generated OpenAPI directly", async () => { const response = await inject({ method: "POST", diff --git a/test/convert-oas.test.ts b/test/convert-oas.test.ts index 3f37b4a..465d280 100644 --- a/test/convert-oas.test.ts +++ b/test/convert-oas.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; import { load } from "js-yaml"; -import { convertOAS } from "@developer-overheid-nl/don-tools-logic"; +import { convertOAS } from "@developer-overheid-nl/don-tools"; const toJson = (buffer: Buffer) => JSON.parse(buffer.toString("utf8")); const toYaml = (buffer: Buffer) => load(buffer.toString("utf8")) as Record; @@ -53,7 +53,13 @@ components: }); it("downgrades 3.1 -> 3.0 (JSON)", async () => { - const sourceSpec = { openapi: "3.1.0", info: { title: "Test API", version: "1.0.0" }, paths: {}, webhooks: { onEvent: { post: { responses: { 200: { description: "OK" } } } } }, components: { schemas: { Pet: { type: "object", properties: { nickname: { type: ["string", "null"] } } } } } }; + const sourceSpec = { + openapi: "3.1.0", + info: { title: "Test API", version: "1.0.0" }, + paths: {}, + webhooks: { onEvent: { post: { responses: { 200: { description: "OK" } } } } }, + components: { schemas: { Pet: { type: "object", properties: { nickname: { type: ["string", "null"] } } } } }, + }; const result = await convertOAS({ oasBody: JSON.stringify(sourceSpec), targetVersion: "3.0" }); const converted = toJson(result.rawBody); expect(converted.openapi).toBe("3.0.3"); From 2b1a517f1ba0f7ce76da54e1f6f38ae7d086a1cf Mon Sep 17 00:00:00 2001 From: pasibun Date: Fri, 26 Jun 2026 11:30:33 +0200 Subject: [PATCH 27/27] Revert "Use fixed DON tools package for circular OAS dereference [deploy-test]" This reverts commit f602d1fca7f15410db82b0696ff1b62d3bb124bc. --- README.md | 11 ++++---- implementation/tools-api.service.ts | 44 +++++++++-------------------- package-lock.json | 8 +++--- package.json | 2 +- test/app.test.ts | 34 ---------------------- test/convert-oas.test.ts | 10 ++----- 6 files changed, 27 insertions(+), 82 deletions(-) diff --git a/README.md b/README.md index 88e3ff8..abb7c1c 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,8 @@ HTTP API voor de tools op `developer.overheid.nl`. Deze repository bevat de API-laag voor versie 1 van de Tools API: routing, OpenAPI-validatie, response headers, foutafhandeling en de koppeling naar de daadwerkelijke businesslogica. Die -businesslogica staat in `@developer-overheid-nl/don-tools` en wordt los beheerd in `don-tools`. +businesslogica staat in `@developer-overheid-nl/don-tools-logic` en wordt los beheerd in +`don-tools-api-v2`. ## Wat zit hierin? @@ -71,15 +72,15 @@ Mock mode kan ook direct via: npm run dev-mock ``` -## Relatie met `don-tools` +## Relatie met `don-tools-api-v2` `don-tools-api` is de v1 HTTP-adapter. De herbruikbare logica zit in -`@developer-overheid-nl/don-tools`. +`@developer-overheid-nl/don-tools-logic`. Zodra de logic package op npm gepubliceerd is, pin deze API op een expliciete packageversie: ```sh -npm install @developer-overheid-nl/don-tools@ +npm install @developer-overheid-nl/don-tools-logic@ ``` Gebruik liever een npm-versie dan een GitHub dependency in CI/CD. Dat voorkomt dat builds afhankelijk @@ -119,7 +120,7 @@ api/ OpenAPI contract en gegenereerde API interfaces app/ NestJS/Fastify bootstrap en OpenAPI middleware controllers/ Gegenereerde NestJS controllers decorators/ Gegenereerde request decorators -implementation/ Handgeschreven adapter naar don-tools +implementation/ Handgeschreven adapter naar don-tools-logic models/ Gegenereerde request/response modellen test/ Vitest tests ``` diff --git a/implementation/tools-api.service.ts b/implementation/tools-api.service.ts index bba3e6c..a3485b2 100644 --- a/implementation/tools-api.service.ts +++ b/implementation/tools-api.service.ts @@ -1,6 +1,6 @@ -import { HttpException, Injectable } from "@nestjs/common"; +import { BadRequestException, Injectable } from "@nestjs/common"; import type { FastifyReply } from "fastify"; -import type { OasInput, UntrustedClientInput, ValidateInput } from "@developer-overheid-nl/don-tools"; +import type { OasInput, UntrustedClientInput, ValidateInput } from "@developer-overheid-nl/don-tools-logic"; import { ToolsApi } from "../api"; import type { ModelsKeycloakClientResult, ModelsLintResult } from "../models"; @@ -10,31 +10,15 @@ const setHeaders = (reply: FastifyReply, headers: Record) => { const importEsm = new Function("specifier", "return import(specifier)") as (specifier: string) => Promise; const loadLogic = () => - import("@developer-overheid-nl/don-tools").catch(() => - importEsm("@developer-overheid-nl/don-tools"), + import("@developer-overheid-nl/don-tools-logic").catch(() => + importEsm("@developer-overheid-nl/don-tools-logic"), ); -const getLogicErrorStatus = (error: unknown): number | undefined => { - if (typeof error !== "object" || error === null || !("status" in error)) return undefined; - const status = (error as { status: unknown }).status; - return typeof status === "number" ? status : undefined; -}; - -const getLogicErrorMessage = (error: unknown): string => { - if (typeof error !== "object" || error === null) { - return "Request validation failed"; - } - if (error instanceof Error && error.message.length > 0) return error.message; - const detail = "detail" in error ? (error as { detail: unknown }).detail : undefined; - if (typeof detail === "string" && detail.length > 0) return detail; - return "Request validation failed"; -}; - -const asHttpException = async (operation: () => Promise): Promise => { +const asBadRequest = async (operation: () => Promise): Promise => { try { return await operation(); } catch (error) { - throw new HttpException(getLogicErrorMessage(error), getLogicErrorStatus(error) ?? 400); + throw new BadRequestException(error instanceof Error ? error.message : "Request validation failed"); } }; @@ -43,52 +27,52 @@ export class ToolsApiService extends ToolsApi { async arazzoMarkdown(oasInput: OasInput | undefined, _request: Request, reply: FastifyReply): Promise { const { arazzoMarkdown } = await loadLogic(); reply.type("text/markdown; charset=utf-8"); - return asHttpException(() => arazzoMarkdown(oasInput as OasInput)); + return asBadRequest(() => arazzoMarkdown(oasInput as OasInput)); } async arazzoMermaid(oasInput: OasInput | undefined, _request: Request, reply: FastifyReply): Promise { const { arazzoMermaid } = await loadLogic(); reply.type("text/plain; charset=utf-8"); - return asHttpException(() => arazzoMermaid(oasInput as OasInput)); + return asBadRequest(() => arazzoMermaid(oasInput as OasInput)); } async bundleOAS(oasInput: OasInput | undefined, _request: Request, reply: FastifyReply): Promise { const { bundleOAS } = await loadLogic(); - const result = await asHttpException(() => bundleOAS(oasInput as OasInput)); + const result = await asBadRequest(() => bundleOAS(oasInput as OasInput)); setHeaders(reply, result.headers); return result.rawBody as never; } async convertOAS(oasInput: OasInput | undefined, _request: Request, reply: FastifyReply): Promise { const { convertOAS } = await loadLogic(); - const result = await asHttpException(() => convertOAS(oasInput as OasInput)); + const result = await asBadRequest(() => convertOAS(oasInput as OasInput)); setHeaders(reply, result.headers); return result.rawBody as never; } async createPostmanCollection(oasInput: OasInput | undefined, _request: Request, reply: FastifyReply): Promise { const { createPostmanCollection } = await loadLogic(); - const result = await asHttpException(() => createPostmanCollection(oasInput as OasInput)); + const result = await asBadRequest(() => createPostmanCollection(oasInput as OasInput)); setHeaders(reply, result.headers); return result.rawBody as never; } async generateOAS(oasInput: OasInput | undefined, _request: Request, reply: FastifyReply): Promise { const { generateOAS } = await loadLogic(); - const result = await asHttpException(() => generateOAS(oasInput as OasInput)); + const result = await asBadRequest(() => generateOAS(oasInput as OasInput)); setHeaders(reply, result.headers); return JSON.parse(Buffer.from(result.rawBody).toString("utf8")) as object; } async untrustClient(untrustClientInput: UntrustedClientInput | undefined): Promise { const { untrustedClient } = await loadLogic(); - return asHttpException(() => + return asBadRequest(() => untrustedClient(untrustClientInput as UntrustedClientInput), ) as Promise; } async validatorOpenAPIPost(oasInput: OasInput | undefined): Promise { const { validatorOpenAPIPost } = await loadLogic(); - return asHttpException(() => validatorOpenAPIPost(oasInput as ValidateInput)) as Promise; + return asBadRequest(() => validatorOpenAPIPost(oasInput as ValidateInput)) as Promise; } } diff --git a/package-lock.json b/package-lock.json index d43ca50..77e0851 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "EUPL-1.2", "dependencies": { - "@developer-overheid-nl/don-tools": "git+https://github.com/developer-overheid-nl/don-tools.git#d3d54ba222717d070b8d1ddd7689713dd0aaab26", + "@developer-overheid-nl/don-tools-logic": "^0.0.2", "@fastify/cors": "^11.2.0", "@nestjs/common": "^11.1.27", "@nestjs/core": "^11.1.27", @@ -331,10 +331,10 @@ "@stoplight/spectral-rulesets": "^1.22.0" } }, - "node_modules/@developer-overheid-nl/don-tools": { + "node_modules/@developer-overheid-nl/don-tools-logic": { "version": "0.0.2", - "resolved": "git+https://github.com/developer-overheid-nl/don-tools.git#d3d54ba222717d070b8d1ddd7689713dd0aaab26", - "integrity": "sha512-bXDlRFB8LlqNSIxLDryfYL+FGAYJ1EFQvUPkNNvWGsiKHgSFjC/ix2IHvh+uUP6jgZvsfgkqlJu/8mL3x1TLCg==", + "resolved": "https://registry.npmjs.org/@developer-overheid-nl/don-tools-logic/-/don-tools-logic-0.0.2.tgz", + "integrity": "sha512-uX9KegVIk0/r+EDkt0199Ddy4m7mxWeWPwp3WE0fI+eBaUZMvAUTva4ZRsWvv6i3SjNy4Gfr9lof2PFETjzhzg==", "license": "EUPL-1.2", "dependencies": { "@apiture/openapi-down-convert": "^0.14.2", diff --git a/package.json b/package.json index 7941ba3..e4f53cc 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "license": "EUPL-1.2", "private": true, "dependencies": { - "@developer-overheid-nl/don-tools": "git+https://github.com/developer-overheid-nl/don-tools.git#d3d54ba222717d070b8d1ddd7689713dd0aaab26", + "@developer-overheid-nl/don-tools-logic": "^0.0.2", "@fastify/cors": "^11.2.0", "@nestjs/common": "^11.1.27", "@nestjs/core": "^11.1.27", diff --git a/test/app.test.ts b/test/app.test.ts index 868a855..37fb79b 100644 --- a/test/app.test.ts +++ b/test/app.test.ts @@ -60,40 +60,6 @@ describe("app", () => { expect(JSON.parse(response.body)).toMatchObject({ openapi: "3.1.0" }); }); - it("returns 422 when an OpenAPI document cannot be fully dereferenced", async () => { - const response = await inject({ - method: "POST", - url: "/v1/oas/bundle", - payload: { - oasBody: JSON.stringify({ - openapi: "3.0.3", - info: { title: "Recursive API", version: "1.0.0" }, - paths: {}, - components: { - schemas: { - Node: { - type: "object", - properties: { - children: { - type: "array", - items: { $ref: "#/components/schemas/Node" }, - }, - }, - }, - }, - }, - }), - }, - }); - - expect(response.statusCode).toBe(422); - expect(response.headers["content-type"]).toContain("application/problem+json"); - expect(response.json()).toMatchObject({ - status: 422, - title: "De OpenAPI specificatie bevat circulaire verwijzingen en kan niet volledig worden gedereferenced.", - }); - }); - it("returns generated OpenAPI directly", async () => { const response = await inject({ method: "POST", diff --git a/test/convert-oas.test.ts b/test/convert-oas.test.ts index 465d280..3f37b4a 100644 --- a/test/convert-oas.test.ts +++ b/test/convert-oas.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; import { load } from "js-yaml"; -import { convertOAS } from "@developer-overheid-nl/don-tools"; +import { convertOAS } from "@developer-overheid-nl/don-tools-logic"; const toJson = (buffer: Buffer) => JSON.parse(buffer.toString("utf8")); const toYaml = (buffer: Buffer) => load(buffer.toString("utf8")) as Record; @@ -53,13 +53,7 @@ components: }); it("downgrades 3.1 -> 3.0 (JSON)", async () => { - const sourceSpec = { - openapi: "3.1.0", - info: { title: "Test API", version: "1.0.0" }, - paths: {}, - webhooks: { onEvent: { post: { responses: { 200: { description: "OK" } } } } }, - components: { schemas: { Pet: { type: "object", properties: { nickname: { type: ["string", "null"] } } } } }, - }; + const sourceSpec = { openapi: "3.1.0", info: { title: "Test API", version: "1.0.0" }, paths: {}, webhooks: { onEvent: { post: { responses: { 200: { description: "OK" } } } } }, components: { schemas: { Pet: { type: "object", properties: { nickname: { type: ["string", "null"] } } } } } }; const result = await convertOAS({ oasBody: JSON.stringify(sourceSpec), targetVersion: "3.0" }); const converted = toJson(result.rawBody); expect(converted.openapi).toBe("3.0.3");