From 0d6cb03237d72107fc4dbe2da4783aa12bcf3c03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20D=C3=BCnkelmann?= Date: Fri, 23 Aug 2024 15:16:12 +0200 Subject: [PATCH] feat: initial release MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Dünkelmann --- .github/workflows/ci_release.yml | 84 + .gitignore | 3 + README.md | 77 +- backend/.gitignore | 43 + backend/README.md | 21 + backend/build.gradle.kts | 85 + backend/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43583 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + backend/gradlew | 252 + backend/gradlew.bat | 94 + backend/settings.gradle.kts | 11 + .../OpenapiCatalogBackendApplication.kt | 11 + .../openapicatalogbackend/api/DocumentApi.kt | 16 + .../api/MajorVersionApi.kt | 13 + .../api/SpecificationApi.kt | 24 + .../beans/RestTemplateBean.kt | 12 + .../beans/ThreadPoolTaskSchedulerConfig.kt | 17 + .../openapicatalogbackend/config/WebConfig.kt | 22 + .../LocalDateTimeCustomSerializer.kt | 23 + .../config/serializer/UUIDStringSerializer.kt | 22 + .../init/InitDevDatabase.kt | 92 + .../openapicatalogbackend/init/InitTasks.kt | 17 + .../openapicatalogbackend/init/InitTools.kt | 26 + .../openapicatalogbackend/init/OpenBrowser.kt | 29 + .../openapicatalogbackend/model/dto/ADto.kt | 8 + .../model/dto/DocumentDto.kt | 35 + .../model/dto/MajorVersionDto.kt | 17 + .../model/dto/SpecificationDto.kt | 12 + .../model/dto/SpecificationTmpDto.kt | 7 + .../openapicatalogbackend/model/dto/URLDto.kt | 13 + .../model/dto/document/LintReportDto.kt | 15 + .../model/dto/document/ReportDto.kt | 14 + .../model/dto/majorVersion/LintRuleDto.kt | 15 + .../model/dto/specification/UpdateDto.kt | 13 + .../model/entity/AEntity.kt | 10 + .../model/entity/Document.kt | 35 + .../model/entity/MajorVersion.kt | 18 + .../model/entity/Specification.kt | 20 + .../openapicatalogbackend/model/entity/URL.kt | 13 + .../model/entity/document/LintReport.kt | 10 + .../model/entity/document/Report.kt | 13 + .../model/entity/majorVersion/LintRule.kt | 25 + .../model/entity/specification/Update.kt | 13 + .../openapicatalogbackend/model/enums/EOS.kt | 7 + .../model/enums/EType.kt | 6 + .../repository/DocumentRepository.kt | 12 + .../repository/MajorVersionRepository.kt | 11 + .../repository/SpecificationRepository.kt | 9 + .../document/LintReportRepository.kt | 9 + .../repository/document/ReportRepository.kt | 9 + .../majorVersion/LintRuleRepository.kt | 11 + .../service/DocumentService.kt | 101 + .../service/MajorVersionService.kt | 14 + .../service/SpecificationService.kt | 57 + .../openapicatalogbackend/utils/GitTool.kt | 34 + .../utils/TaskSchedulerTool.kt | 12 + .../openapicatalogbackend/utils/Tools.kt | 37 + .../utils/report/DiffTool.kt | 80 + .../utils/report/LintTool.kt | 63 + .../src/main/resources/application-dev.yml | 10 + .../src/main/resources/application-prod.yml | 10 + backend/src/main/resources/application.yml | 16 + .../1.0.0_2.0.0_api-with-examples.yaml | 164 + .../2.0.0_3.0.0.api-with-examples-0.yaml | 170 + .../2.0.0_3.0.0.api-with-examples.yaml | 170 + .../1.0.0_3.0.0_callback-example.yaml | 61 + .../1.0.1_3.0.0_callback-example.yaml | 61 + .../2.0.0_3.1.0_callback-example.yaml | 117 + .../2.0.1_3.1.0_callback-example-0.yaml | 117 + .../2.0.1_3.1.0_callback-example.yaml | 117 + .../1.0.0_3.1.0_non-oauth-scopes.yaml | 24 + .../init/partner-api/partner-api-v1.0.0.yaml | 163 + .../init/partner-api/partner-api-v1.0.1.yaml | 164 + .../init/partner-api/partner-api-v1.1.0.yaml | 170 + .../partner-api/partner-api-v1.2.0-0.yaml | 208 + .../init/partner-api/partner-api-v1.2.0.yaml | 208 + .../OpenapiCatalogBackendApplicationTests.kt | 11 + frontend/.editorconfig | 9 + frontend/.gitignore | 33 + frontend/.husky/commit-msg | 1 + frontend/.husky/pre-commit | 1 + frontend/.npmrc | 1 + frontend/.prettierrc | 13 + frontend/README.md | 23 + frontend/commitlint.config.ts | 1 + frontend/eslint.config.js | 64 + frontend/index.html | 21 + frontend/package.json | 66 + frontend/pnpm-lock.yaml | 7648 +++++++++++++++++ frontend/postcss.config.js | 17 + frontend/public/favicon.ico | Bin 0 -> 64483 bytes frontend/public/icons/favicon-128x128.png | Bin 0 -> 12324 bytes frontend/public/icons/favicon-16x16.png | Bin 0 -> 859 bytes frontend/public/icons/favicon-32x32.png | Bin 0 -> 2039 bytes frontend/public/icons/favicon-96x96.png | Bin 0 -> 9643 bytes frontend/quasar.config.ts | 207 + frontend/quasar.extensions.json | 3 + frontend/src/App.vue | 29 + frontend/src/assets/quasar-logo-vertical.svg | 15 + frontend/src/boot/.gitkeep | 0 frontend/src/components/CReportDiff.vue | 32 + .../src/components/CReportDiffSummary.vue | 47 + frontend/src/components/CReportLint.vue | 40 + .../src/components/CReportLintSummary.vue | 39 + .../src/components/document/CSwaggerUI.vue | 54 + .../specification/DUploadLintingRule.vue | 44 + .../specification/DUploadSpecification.vue | 100 + frontend/src/css/app.scss | 1 + frontend/src/css/quasar.variables.scss | 25 + frontend/src/env.d.ts | 7 + frontend/src/layouts/MainLayout.vue | 34 + frontend/src/model/AEntity.ts | 3 + frontend/src/model/Document.ts | 14 + frontend/src/model/MajorVersion.ts | 11 + frontend/src/model/Specification.ts | 8 + frontend/src/model/SpecificationTmp.ts | 8 + frontend/src/model/URL.ts | 7 + frontend/src/model/document/IReportDiff.ts | 9 + .../src/model/document/IReportDiffSummary.ts | 4 + .../src/model/document/IReportLintEntry.ts | 16 + frontend/src/model/document/LintReport.ts | 8 + frontend/src/model/document/Report.ts | 8 + frontend/src/model/enums/EErrorColor.ts | 8 + frontend/src/model/enums/EErrorLevel.ts | 8 + frontend/src/model/enums/EType.ts | 6 + frontend/src/model/majorVersion/LintRule.ts | 11 + frontend/src/model/specification/Update.ts | 8 + frontend/src/pages/ErrorNotFound.vue | 17 + frontend/src/pages/document/DetailsPage.vue | 42 + .../src/pages/specification/ChangelogPage.vue | 43 + .../src/pages/specification/DetailsPage.vue | 100 + frontend/src/pages/specification/ListPage.vue | 68 + frontend/src/quasar.d.ts | 7 + frontend/src/router/index.ts | 29 + frontend/src/router/routes.ts | 31 + frontend/src/shims-vue.d.ts | 8 + frontend/src/stores/index.ts | 30 + frontend/src/stores/store-flag.d.ts | 9 + frontend/src/utils/Fetch.ts | 26 + frontend/tsconfig.json | 7 + frontend/tsconfig.vue-tsc.json | 6 + 141 files changed, 12873 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/ci_release.yml create mode 100644 backend/.gitignore create mode 100644 backend/README.md create mode 100644 backend/build.gradle.kts create mode 100644 backend/gradle/wrapper/gradle-wrapper.jar create mode 100644 backend/gradle/wrapper/gradle-wrapper.properties create mode 100755 backend/gradlew create mode 100644 backend/gradlew.bat create mode 100644 backend/settings.gradle.kts create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/OpenapiCatalogBackendApplication.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/api/DocumentApi.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/api/MajorVersionApi.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/api/SpecificationApi.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/beans/RestTemplateBean.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/beans/ThreadPoolTaskSchedulerConfig.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/config/WebConfig.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/config/serializer/LocalDateTimeCustomSerializer.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/config/serializer/UUIDStringSerializer.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/init/InitDevDatabase.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/init/InitTasks.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/init/InitTools.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/init/OpenBrowser.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/ADto.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/DocumentDto.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/MajorVersionDto.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/SpecificationDto.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/SpecificationTmpDto.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/URLDto.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/document/LintReportDto.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/document/ReportDto.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/majorVersion/LintRuleDto.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/specification/UpdateDto.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/AEntity.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/Document.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/MajorVersion.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/Specification.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/URL.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/document/LintReport.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/document/Report.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/majorVersion/LintRule.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/specification/Update.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/enums/EOS.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/enums/EType.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/DocumentRepository.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/MajorVersionRepository.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/SpecificationRepository.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/document/LintReportRepository.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/document/ReportRepository.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/majorVersion/LintRuleRepository.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/service/DocumentService.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/service/MajorVersionService.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/service/SpecificationService.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/utils/GitTool.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/utils/TaskSchedulerTool.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/utils/Tools.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/utils/report/DiffTool.kt create mode 100644 backend/src/main/kotlin/de/predic8/openapicatalogbackend/utils/report/LintTool.kt create mode 100644 backend/src/main/resources/application-dev.yml create mode 100644 backend/src/main/resources/application-prod.yml create mode 100644 backend/src/main/resources/application.yml create mode 100644 backend/src/main/resources/init/api-with-examples/1.0.0_2.0.0_api-with-examples.yaml create mode 100644 backend/src/main/resources/init/api-with-examples/2.0.0_3.0.0.api-with-examples-0.yaml create mode 100644 backend/src/main/resources/init/api-with-examples/2.0.0_3.0.0.api-with-examples.yaml create mode 100644 backend/src/main/resources/init/callback-example/1.0.0_3.0.0_callback-example.yaml create mode 100644 backend/src/main/resources/init/callback-example/1.0.1_3.0.0_callback-example.yaml create mode 100644 backend/src/main/resources/init/callback-example/2.0.0_3.1.0_callback-example.yaml create mode 100644 backend/src/main/resources/init/callback-example/2.0.1_3.1.0_callback-example-0.yaml create mode 100644 backend/src/main/resources/init/callback-example/2.0.1_3.1.0_callback-example.yaml create mode 100644 backend/src/main/resources/init/non-oauth-scopes/1.0.0_3.1.0_non-oauth-scopes.yaml create mode 100644 backend/src/main/resources/init/partner-api/partner-api-v1.0.0.yaml create mode 100644 backend/src/main/resources/init/partner-api/partner-api-v1.0.1.yaml create mode 100644 backend/src/main/resources/init/partner-api/partner-api-v1.1.0.yaml create mode 100644 backend/src/main/resources/init/partner-api/partner-api-v1.2.0-0.yaml create mode 100644 backend/src/main/resources/init/partner-api/partner-api-v1.2.0.yaml create mode 100644 backend/src/test/kotlin/de/predic8/openapicatalogbackend/OpenapiCatalogBackendApplicationTests.kt create mode 100644 frontend/.editorconfig create mode 100644 frontend/.gitignore create mode 100644 frontend/.husky/commit-msg create mode 100644 frontend/.husky/pre-commit create mode 100644 frontend/.npmrc create mode 100644 frontend/.prettierrc create mode 100644 frontend/README.md create mode 100644 frontend/commitlint.config.ts create mode 100644 frontend/eslint.config.js create mode 100644 frontend/index.html create mode 100644 frontend/package.json create mode 100644 frontend/pnpm-lock.yaml create mode 100644 frontend/postcss.config.js create mode 100644 frontend/public/favicon.ico create mode 100644 frontend/public/icons/favicon-128x128.png create mode 100644 frontend/public/icons/favicon-16x16.png create mode 100644 frontend/public/icons/favicon-32x32.png create mode 100644 frontend/public/icons/favicon-96x96.png create mode 100644 frontend/quasar.config.ts create mode 100644 frontend/quasar.extensions.json create mode 100644 frontend/src/App.vue create mode 100644 frontend/src/assets/quasar-logo-vertical.svg create mode 100644 frontend/src/boot/.gitkeep create mode 100644 frontend/src/components/CReportDiff.vue create mode 100644 frontend/src/components/CReportDiffSummary.vue create mode 100644 frontend/src/components/CReportLint.vue create mode 100644 frontend/src/components/CReportLintSummary.vue create mode 100644 frontend/src/components/document/CSwaggerUI.vue create mode 100644 frontend/src/components/specification/DUploadLintingRule.vue create mode 100644 frontend/src/components/specification/DUploadSpecification.vue create mode 100644 frontend/src/css/app.scss create mode 100644 frontend/src/css/quasar.variables.scss create mode 100644 frontend/src/env.d.ts create mode 100644 frontend/src/layouts/MainLayout.vue create mode 100644 frontend/src/model/AEntity.ts create mode 100644 frontend/src/model/Document.ts create mode 100644 frontend/src/model/MajorVersion.ts create mode 100644 frontend/src/model/Specification.ts create mode 100644 frontend/src/model/SpecificationTmp.ts create mode 100644 frontend/src/model/URL.ts create mode 100644 frontend/src/model/document/IReportDiff.ts create mode 100644 frontend/src/model/document/IReportDiffSummary.ts create mode 100644 frontend/src/model/document/IReportLintEntry.ts create mode 100644 frontend/src/model/document/LintReport.ts create mode 100644 frontend/src/model/document/Report.ts create mode 100644 frontend/src/model/enums/EErrorColor.ts create mode 100644 frontend/src/model/enums/EErrorLevel.ts create mode 100644 frontend/src/model/enums/EType.ts create mode 100644 frontend/src/model/majorVersion/LintRule.ts create mode 100644 frontend/src/model/specification/Update.ts create mode 100644 frontend/src/pages/ErrorNotFound.vue create mode 100644 frontend/src/pages/document/DetailsPage.vue create mode 100644 frontend/src/pages/specification/ChangelogPage.vue create mode 100644 frontend/src/pages/specification/DetailsPage.vue create mode 100644 frontend/src/pages/specification/ListPage.vue create mode 100644 frontend/src/quasar.d.ts create mode 100644 frontend/src/router/index.ts create mode 100644 frontend/src/router/routes.ts create mode 100644 frontend/src/shims-vue.d.ts create mode 100644 frontend/src/stores/index.ts create mode 100644 frontend/src/stores/store-flag.d.ts create mode 100644 frontend/src/utils/Fetch.ts create mode 100644 frontend/tsconfig.json create mode 100644 frontend/tsconfig.vue-tsc.json diff --git a/.github/workflows/ci_release.yml b/.github/workflows/ci_release.yml new file mode 100644 index 0000000..9677496 --- /dev/null +++ b/.github/workflows/ci_release.yml @@ -0,0 +1,84 @@ +name: CI Release +on: + push: + branches: + - main +jobs: + build_frontend: + runs-on: ubuntu-latest + steps: + - name: Checkout frontend + uses: actions/checkout@v4.1.7 + with: + sparse-checkout: 'frontend' + - name: Install PNPM + uses: pnpm/action-setup@v4.0.0 + with: + package_json_file: 'frontend/package.json' + - name: Setup node env + uses: actions/setup-node@v4.0.3 + with: + cache: 'pnpm' + cache-dependency-path: 'frontend/pnpm-lock.yaml' + check-latest: true + node-version: 'lts/*' + - name: Install dependencies + run: pnpm install --frozen-lockfile + working-directory: 'frontend' + - name: Lint code + run: pnpm prepare && pnpm lint + working-directory: 'frontend' + - name: Build frontend + run: pnpm build + working-directory: 'frontend' + - name: Upload frontend artifact + uses: actions/upload-artifact@v4.3.6 + with: + name: frontend-build + path: frontend/dist/spa/ + build_backend: + needs: build_frontend + runs-on: ubuntu-latest + steps: + - name: Checkout backend + uses: actions/checkout@v4.1.7 + with: + sparse-checkout: 'backend' + - name: setup jdk 17 + uses: actions/setup-java@v3 + with: + cache: 'gradle' + distribution: 'temurin' + java-version: '21' + - name: Create needed folders for the frontend artifact + run: | + mkdir -p src/main/resources/static/ + mkdir -p src/main/resources/templates/ + working-directory: 'backend' + - name: Download frontend artifact + uses: actions/download-artifact@v4.1.8 + with: + name: frontend-build + path: backend/src/main/resources/static/ + - name: Move index.html from static to templates + run: gradle bootJar + working-directory: 'backend' + - name: Upload backend artifact + uses: actions/upload-artifact@v4.3.6 + with: + name: backend-build + path: backend/build/libs/openapi-catalog-*.jar + release: + needs: build_backend + runs-on: ubuntu-latest + steps: + - name: Download backend artifact + uses: actions/download-artifact@v4.1.8 + with: + name: backend-build + path: build/libs/ + - name: Upload release + uses: softprops/action-gh-release@v2 + with: + files: build/libs/ + make_latest: true diff --git a/.gitignore b/.gitignore index a5b1113..953902d 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,6 @@ gradle-app.setting .project # JDT-specific (Eclipse Java Development Tools) .classpath + +# IDE +.idea diff --git a/README.md b/README.md index 07e1b22..41f8ddf 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,75 @@ -# openapi-catalog -Membrane OpenAPI Catalog +# OpenAPI Catalog + +The Membrane OpenAPI Catalog manages OpenAPI specifications. +Features: + +- Automatic updates +- Linting +- Diff checking for breaking changes + +## Requirements + +- Linux, macOS or Windows +- x86-64 +- Java 21 +- Internet connection + +## Installation + +1. [Download the latest release](https://github.com/membrane/openapi-catalog/releases/latest) +2. Execute the OpenAPI-Catalog with `java -jar openapi-catalog-{version}.jar` +3. After you see `Completed initialization` in the terminal the application is ready. +4. A browser window should open automatically. If not, [open the service in the browser](http://localhost:8000). + +## Configuration + +You can configurate the application by opening its file with an archive manager and edit specific files. + +### Database + +- file: /BOOT-INF/classes/application.yml + - values: + - datasource.username +- file: /BOOT-INF/classes/application-prod.yml + - values: + - datasource.password + - datasource.url + +### Port + +- file: /BOOT-INF/classes/application-prod.yml + - values: + - server.port + +### Used tools + +If the organization or repository names of the used tools change on GitHub, these values can be updated with the following parameters: + +- file: /BOOT-INF/classes/application.yml + - values: + - tools.diff.github.name + _repository name_ + - tools.diff.github.organization + _organization name_ + - tools.lint.github.name + _repository name_ + - tools.lint.github.organization + _organization name_ + +## Automatic setup + +On execution, the software will do the following tasks: + +1. Installation of the tools: + - If the tool doesn't exist or is older than the GitHub version, it will be downloaded. + - If no internet is available and tools are already downloaded, the software will use them. + - The location of the downloaded tools will be at `/home/{$HOME}/.predic8/openapicatalog/tools/`. + - diff tool + - filename: `openapi-changes` + - version file: `.openapi-changes` + - linting tool + - filename: `spectral` + - version file: `.spectral` +2. Installation of the `hsqldb` database: + - The database will be created at `/home/{$HOME}/.predic8/openapicatalog/database/` +3. Update specifications which should be updated automatically. diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..2e918ad --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,43 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Kotlin ### +.kotlin +/.idea/ + +### Frontend ### +src/main/resources/static +src/main/resources/templates \ No newline at end of file diff --git a/backend/README.md b/backend/README.md new file mode 100644 index 0000000..6ae54ed --- /dev/null +++ b/backend/README.md @@ -0,0 +1,21 @@ +# Backend + +## Run in development mode + +### Linux / Unix + +`./gradlew bootRun --args='--spring.profiles.active=dev'` + +### Windows + +`gradlew.bat bootRun --args="--spring.profiles.active=dev"` + +## Run in productive mode + +### Linux / Unix + +`./gradlew bootRun --args='--spring.profiles.active=prod'` + +### Windows + +`gradlew.bat bootRun --args="--spring.profiles.active=prod"` diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts new file mode 100644 index 0000000..aa403b0 --- /dev/null +++ b/backend/build.gradle.kts @@ -0,0 +1,85 @@ +import org.gradle.api.JavaVersion.VERSION_21 +import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask +import org.springframework.boot.gradle.tasks.bundling.BootJar + +plugins { + val kotlinVersion = "2.0.20" + + id("com.github.ben-manes.versions") version "0.51.0" + id("io.spring.dependency-management") version "1.1.6" + id("org.springframework.boot") version "3.3.3" + + kotlin("jvm") version kotlinVersion + kotlin("plugin.jpa") version kotlinVersion + kotlin("plugin.serialization") version kotlinVersion + kotlin("plugin.spring") version kotlinVersion +} + +group = "de.predic8" +version = "1.0.0" + +java { + sourceCompatibility = VERSION_21 +} + +repositories { + mavenCentral() +} + +dependencies { + // Database + runtimeOnly("org.hsqldb:hsqldb") + implementation("org.springframework.boot:spring-boot-starter-data-jpa") + + // (De-)Compression + implementation("org.apache.commons:commons-compress:1.27.1") + + // (De-)Serialization + implementation("com.charleskorn.kaml:kaml:0.61.0") + implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.6.1") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.1") + + // Git + implementation("org.eclipse.jgit:org.eclipse.jgit:6.10.0.202406032230-r") + implementation("org.kohsuke:github-api:1.324") + + // Kotlin + implementation("org.jetbrains.kotlin:kotlin-reflect") + implementation("org.jetbrains.kotlin:kotlin-stdlib") + + // Open the browser on startup + implementation("org.seleniumhq.selenium:selenium-java:4.23.1") + + // OS detection + implementation("org.apache.commons:commons-lang3:3.16.0") + + // Scheduler + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0-RC.2") + + // Versioning + implementation("org.semver4j:semver4j:5.3.0") + + // Web + implementation("org.springframework.boot:spring-boot-starter-security") + implementation("org.springframework.boot:spring-boot-starter-thymeleaf") + implementation("org.springframework.boot:spring-boot-starter-web") + + // Testing + testImplementation("org.springframework.boot:spring-boot-starter-test") +} + +tasks.named("bootJar") { + archiveFileName = "openapi-catalog-${version}.jar" + + launchScript() +} + +tasks.named("compileKotlin", KotlinCompilationTask::class.java) { + compilerOptions { + freeCompilerArgs.add("-Xjsr305=strict") + } +} + +tasks.withType { + useJUnitPlatform() +} diff --git a/backend/gradle/wrapper/gradle-wrapper.jar b/backend/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..a4b76b9530d66f5e68d973ea569d8e19de379189 GIT binary patch literal 43583 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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 GZ~q4|mN%#X literal 0 HcmV?d00001 diff --git a/backend/gradle/wrapper/gradle-wrapper.properties b/backend/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..9355b41 --- /dev/null +++ b/backend/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/backend/gradlew b/backend/gradlew new file mode 100755 index 0000000..f5feea6 --- /dev/null +++ b/backend/gradlew @@ -0,0 +1,252 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/backend/gradlew.bat b/backend/gradlew.bat new file mode 100644 index 0000000..9d21a21 --- /dev/null +++ b/backend/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/backend/settings.gradle.kts b/backend/settings.gradle.kts new file mode 100644 index 0000000..05f1b0e --- /dev/null +++ b/backend/settings.gradle.kts @@ -0,0 +1,11 @@ +plugins { + id("org.danilopianini.gradle-pre-commit-git-hooks") version "2.0.4" +} + +gitHooks { + // Configuration + commitMsg { conventionalCommits() } // Applies the default conventional commits configuration + createHooks() // actual hooks creation +} + +rootProject.name = "openapi-catalog-backend" diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/OpenapiCatalogBackendApplication.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/OpenapiCatalogBackendApplication.kt new file mode 100644 index 0000000..cd969a5 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/OpenapiCatalogBackendApplication.kt @@ -0,0 +1,11 @@ +package de.predic8.openapicatalogbackend + +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication + +@SpringBootApplication +class OpenapiCatalogBackendApplication + +fun main(args: Array) { + runApplication(*args) +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/api/DocumentApi.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/api/DocumentApi.kt new file mode 100644 index 0000000..3fc365b --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/api/DocumentApi.kt @@ -0,0 +1,16 @@ +package de.predic8.openapicatalogbackend.api + +import de.predic8.openapicatalogbackend.model.dto.DocumentDto +import de.predic8.openapicatalogbackend.service.DocumentService +import org.springframework.web.bind.annotation.* +import java.util.* + +@RequestMapping("/api/v1/documents") +@RestController +class DocumentApi(val service: DocumentService) { + @GetMapping("/{id}") + fun getBy(@PathVariable id: UUID): DocumentDto? = service.getBy(id) + + @PostMapping + fun save(@RequestPart(value = "file") document: String, @RequestParam specificationId: UUID): List = service.saveContents(contents = listOf(document), specificationId = specificationId) +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/api/MajorVersionApi.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/api/MajorVersionApi.kt new file mode 100644 index 0000000..b1e4fbf --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/api/MajorVersionApi.kt @@ -0,0 +1,13 @@ +package de.predic8.openapicatalogbackend.api + +import de.predic8.openapicatalogbackend.model.dto.majorVersion.LintRuleDto +import de.predic8.openapicatalogbackend.service.MajorVersionService +import org.springframework.web.bind.annotation.* +import java.util.* + +@RequestMapping("/api/v1/majorversions") +@RestController +class MajorVersionApi(val service: MajorVersionService) { + @PostMapping("/{id}/lintingrules") + fun saveLintingRuleBy(@PathVariable id: UUID, @RequestBody dto: LintRuleDto): LintRuleDto? = service.saveLintingRuleBy(dto = dto, id = id) +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/api/SpecificationApi.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/api/SpecificationApi.kt new file mode 100644 index 0000000..f8623f6 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/api/SpecificationApi.kt @@ -0,0 +1,24 @@ +package de.predic8.openapicatalogbackend.api + +import de.predic8.openapicatalogbackend.model.dto.MajorVersionDto +import de.predic8.openapicatalogbackend.model.dto.SpecificationDto +import de.predic8.openapicatalogbackend.model.dto.SpecificationTmpDto +import de.predic8.openapicatalogbackend.service.SpecificationService +import org.springframework.web.bind.annotation.* +import java.util.* + +@RequestMapping("/api/v1/specifications") +@RestController +class SpecificationApi(val service: SpecificationService) { + @GetMapping + fun getAll(): List = service.getAll() + + @GetMapping("/{id}") + fun getBy(@PathVariable id: UUID): SpecificationDto? = service.getBy(id) + + @GetMapping("/{id}/majorversions/{version}") + fun getMajorVersionBy(@PathVariable id: UUID, @PathVariable version: Int): MajorVersionDto? = service.getMajorVersionBy(id = id, version = version) + + @PostMapping + fun save(@RequestBody dto: SpecificationTmpDto): SpecificationDto = service.save(dto) +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/beans/RestTemplateBean.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/beans/RestTemplateBean.kt new file mode 100644 index 0000000..440147e --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/beans/RestTemplateBean.kt @@ -0,0 +1,12 @@ +package de.predic8.openapicatalogbackend.beans + +import org.springframework.boot.web.client.RestTemplateBuilder +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.web.client.RestTemplate + +@Configuration +class RestTemplateBean(val builder: RestTemplateBuilder) { + @Bean + fun restTemplate(): RestTemplate = builder.build() +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/beans/ThreadPoolTaskSchedulerConfig.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/beans/ThreadPoolTaskSchedulerConfig.kt new file mode 100644 index 0000000..a8e79be --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/beans/ThreadPoolTaskSchedulerConfig.kt @@ -0,0 +1,17 @@ +package de.predic8.openapicatalogbackend.beans + +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.scheduling.annotation.EnableScheduling +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler + + +@Configuration +@EnableScheduling +class ThreadPoolTaskSchedulerConfig { + @Bean + fun threadPoolTaskScheduler(): ThreadPoolTaskScheduler = ThreadPoolTaskScheduler().apply { + poolSize = 5 + threadNamePrefix = "ThreadPoolTaskScheduler" + } +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/config/WebConfig.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/config/WebConfig.kt new file mode 100644 index 0000000..819e2a3 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/config/WebConfig.kt @@ -0,0 +1,22 @@ +package de.predic8.openapicatalogbackend.config + +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.security.config.annotation.web.builders.HttpSecurity +import org.springframework.security.config.annotation.web.configurers.CsrfConfigurer +import org.springframework.security.config.annotation.web.configurers.HttpBasicConfigurer +import org.springframework.security.web.SecurityFilterChain +import org.springframework.web.servlet.config.annotation.CorsRegistry +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer + +@Configuration +class WebConfig : WebMvcConfigurer { + override fun addCorsMappings(registry: CorsRegistry) { + registry + .addMapping("/**") + .allowedOrigins("http://localhost:9092") + } + + @Bean + fun filterChain(http: HttpSecurity): SecurityFilterChain = http.csrf(CsrfConfigurer::disable).httpBasic(HttpBasicConfigurer::disable).build() +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/config/serializer/LocalDateTimeCustomSerializer.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/config/serializer/LocalDateTimeCustomSerializer.kt new file mode 100644 index 0000000..5b41115 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/config/serializer/LocalDateTimeCustomSerializer.kt @@ -0,0 +1,23 @@ +package de.predic8.openapicatalogbackend.config.serializer + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind.STRING +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import org.springframework.stereotype.Component +import java.time.LocalDateTime +import java.time.LocalDateTime.parse + +// TODO Workaround until kotlinx-datetime v0.7.0. See https://github.com/Kotlin/kotlinx-datetime/issues/350 +@Component +class LocalDateTimeCustomSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("LocalDateTime", STRING) + + override fun deserialize(decoder: Decoder): LocalDateTime = parse(decoder.decodeString()) + + override fun serialize(encoder: Encoder, value: LocalDateTime) { + value.toString().also(encoder::encodeString) + } +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/config/serializer/UUIDStringSerializer.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/config/serializer/UUIDStringSerializer.kt new file mode 100644 index 0000000..19b8576 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/config/serializer/UUIDStringSerializer.kt @@ -0,0 +1,22 @@ +package de.predic8.openapicatalogbackend.config.serializer + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind.STRING +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import org.springframework.stereotype.Component +import java.util.* +import java.util.UUID.fromString + +@Component +class UUIDStringSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("UUID", STRING) + + override fun deserialize(decoder: Decoder): UUID = decoder.decodeString().takeIf(String::isNotBlank)?.let(::fromString) ?: UUID(0, 0) + + override fun serialize(encoder: Encoder, value: UUID) { + value.toString().also(encoder::encodeString) + } +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/init/InitDevDatabase.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/init/InitDevDatabase.kt new file mode 100644 index 0000000..b5afd4b --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/init/InitDevDatabase.kt @@ -0,0 +1,92 @@ +package de.predic8.openapicatalogbackend.init + +import de.predic8.openapicatalogbackend.api.SpecificationApi +import de.predic8.openapicatalogbackend.model.dto.DocumentDto +import de.predic8.openapicatalogbackend.model.dto.SpecificationTmpDto +import de.predic8.openapicatalogbackend.model.dto.URLDto +import de.predic8.openapicatalogbackend.model.dto.specification.UpdateDto +import de.predic8.openapicatalogbackend.model.enums.EType.GIT +import de.predic8.openapicatalogbackend.model.enums.EType.HTTP +import org.springframework.beans.factory.annotation.Value +import org.springframework.context.event.ContextRefreshedEvent +import org.springframework.context.event.EventListener +import org.springframework.core.annotation.Order +import org.springframework.core.io.ClassPathResource +import org.springframework.stereotype.Component +import java.io.File + +@Component +class InitDevDatabase(val api: SpecificationApi) { + @Value("init") + lateinit var resourceFolder: ClassPathResource + + @EventListener(condition = "@environment.acceptsProfiles('dev')") + @Order + fun onApplicationEvent(event: ContextRefreshedEvent) { + addSpecs() + + addAutoUpdaterSpecsByGIT() + addAutoUpdaterSpecsByHTTP() + } + + private fun addAutoUpdaterSpecsByGIT() { + SpecificationTmpDto( + update = UpdateDto( + interval = 60, + path = "examples/v3.1/non-oauth-scopes.yaml", + url = URLDto( + url = "https://github.com/OAI/OpenAPI-Specification.git", + type = GIT + ), + ) + ).let(api::save) + + SpecificationTmpDto( + update = UpdateDto( + interval = 60, + path = "examples/v3.1/webhook-example.yaml", + url = URLDto( + url = "https://github.com/OAI/OpenAPI-Specification.git", + type = GIT, + ) + ) + ).let(api::save) + + SpecificationTmpDto( + update = UpdateDto( + interval = 60, + path = "openapi.yaml", + url = URLDto( + url = "https://github.com/Redocly/openapi-template.git", + type = GIT, + ) + ) + ).let(api::save) + } + + private fun addAutoUpdaterSpecsByHTTP() { + SpecificationTmpDto( + update = UpdateDto( + interval = 60, + url = URLDto( + url = "https://raw.githubusercontent.com/OAI/OpenAPI-Specification/main/examples/v3.1/non-oauth-scopes.yaml", + type = HTTP, + ) + ) + ).let(api::save) + + SpecificationTmpDto( + update = UpdateDto( + interval = 60, + url = URLDto( + url = "https://api.predic8.de/api-docs/fruit-shop-api-v2-2-0", + type = HTTP, + ) + ) + ).let(api::save) + } + + private fun addSpecs(): Unit = resourceFolder.file.walk().maxDepth(1).filter { it.name != resourceFolder.filename }.forEach { folder -> + folder.walk().filter(File::isFile).filter { it.extension == "yaml" }.map { DocumentDto(it.readText()) }.toList().let(::SpecificationTmpDto).let(api::save) + } +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/init/InitTasks.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/init/InitTasks.kt new file mode 100644 index 0000000..ddfd79f --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/init/InitTasks.kt @@ -0,0 +1,17 @@ +package de.predic8.openapicatalogbackend.init + +import de.predic8.openapicatalogbackend.service.SpecificationService +import org.springframework.context.event.ContextRefreshedEvent +import org.springframework.context.event.EventListener +import org.springframework.core.Ordered.HIGHEST_PRECEDENCE +import org.springframework.core.annotation.Order +import org.springframework.stereotype.Component + +@Component +class InitTasks(val specificationService: SpecificationService) { + @EventListener + @Order(HIGHEST_PRECEDENCE) + fun onApplicationEventCreateFolder(event: ContextRefreshedEvent) { + specificationService.enableAllTasks() + } +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/init/InitTools.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/init/InitTools.kt new file mode 100644 index 0000000..0ad98db --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/init/InitTools.kt @@ -0,0 +1,26 @@ +package de.predic8.openapicatalogbackend.init + +import de.predic8.openapicatalogbackend.utils.Tools +import de.predic8.openapicatalogbackend.utils.report.DiffTool +import de.predic8.openapicatalogbackend.utils.report.LintTool +import org.springframework.context.event.ContextRefreshedEvent +import org.springframework.context.event.EventListener +import org.springframework.core.Ordered.HIGHEST_PRECEDENCE +import org.springframework.core.annotation.Order +import org.springframework.stereotype.Component + +@Component +class InitTools(val toolD: DiffTool, val toolL: LintTool, val tools: Tools) { + @EventListener + @Order(HIGHEST_PRECEDENCE) + fun onApplicationEventCreateFolder(event: ContextRefreshedEvent) { + tools.createFolder() + } + + @EventListener + @Order(HIGHEST_PRECEDENCE + 1) + fun onApplicationEventDownloadDiffTool(event: ContextRefreshedEvent) { + toolD.init() + toolL.init() + } +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/init/OpenBrowser.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/init/OpenBrowser.kt new file mode 100644 index 0000000..e70bd87 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/init/OpenBrowser.kt @@ -0,0 +1,29 @@ +package de.predic8.openapicatalogbackend.init + +import org.openqa.selenium.chrome.ChromeDriver +import org.openqa.selenium.edge.EdgeDriver +import org.openqa.selenium.firefox.FirefoxDriver +import org.openqa.selenium.ie.InternetExplorerDriver +import org.openqa.selenium.remote.RemoteWebDriver +import org.openqa.selenium.safari.SafariDriver +import org.springframework.boot.autoconfigure.web.ServerProperties +import org.springframework.context.event.ContextRefreshedEvent +import org.springframework.context.event.EventListener +import org.springframework.core.Ordered.LOWEST_PRECEDENCE +import org.springframework.core.annotation.Order +import org.springframework.stereotype.Component + +@Component +class OpenBrowser(val sp: ServerProperties) { + @EventListener(condition = "@environment.acceptsProfiles('prod')") + @Order(LOWEST_PRECEDENCE) + fun onApplicationEventCreateFolder(event: ContextRefreshedEvent) { + val rwd: RemoteWebDriver? = runCatching { ChromeDriver() }.getOrNull() + ?: runCatching { FirefoxDriver() }.getOrNull() + ?: runCatching { SafariDriver() }.getOrNull() + ?: runCatching { EdgeDriver() }.getOrNull() + ?: runCatching { InternetExplorerDriver() }.getOrNull() + + rwd?.get("http://localhost:" + sp.port) + } +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/ADto.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/ADto.kt new file mode 100644 index 0000000..db8e22c --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/ADto.kt @@ -0,0 +1,8 @@ +package de.predic8.openapicatalogbackend.model.dto + +import de.predic8.openapicatalogbackend.config.serializer.UUIDStringSerializer +import kotlinx.serialization.Serializable +import java.util.* + +@Serializable +abstract class ADto(@Serializable(with = UUIDStringSerializer::class) var id: UUID = UUID(0, 0)) diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/DocumentDto.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/DocumentDto.kt new file mode 100644 index 0000000..f5e86c3 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/DocumentDto.kt @@ -0,0 +1,35 @@ +package de.predic8.openapicatalogbackend.model.dto + +import de.predic8.openapicatalogbackend.config.serializer.LocalDateTimeCustomSerializer +import de.predic8.openapicatalogbackend.model.dto.document.ReportDto +import de.predic8.openapicatalogbackend.model.entity.Document +import kotlinx.serialization.Serializable +import java.time.LocalDateTime +import java.time.LocalDateTime.now + +@Serializable +data class DocumentDto( + var content: String, + var majorVersion: MajorVersionDto? = null, + var openapiVersion: String = "", + var report: ReportDto? = null, + val servers: MutableMap = mutableMapOf(), + @Serializable(with = LocalDateTimeCustomSerializer::class) + var timestamp: LocalDateTime = now(), + var title: String = "", + var version: String = "", +) : + ADto() { + constructor(entity: Document, content: String = "", majorVersion: MajorVersionDto? = null) : this( + content = content, + majorVersion = majorVersion, + openapiVersion = entity.openapiVersion, + report = ReportDto(entity.report), + servers = entity.servers, + timestamp = entity.timestamp, + title = entity.title, + version = entity.version + ) { + id = entity.id + } +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/MajorVersionDto.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/MajorVersionDto.kt new file mode 100644 index 0000000..6beb5d4 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/MajorVersionDto.kt @@ -0,0 +1,17 @@ +package de.predic8.openapicatalogbackend.model.dto + +import de.predic8.openapicatalogbackend.model.dto.majorVersion.LintRuleDto +import de.predic8.openapicatalogbackend.model.entity.MajorVersion +import kotlinx.serialization.Serializable + +@Serializable +class MajorVersionDto( + val documents: MutableList = mutableListOf(), + var lintRules: MutableList = mutableListOf(), + var specification: SpecificationDto, + var version: Int +) : ADto() { + constructor(entity: MajorVersion) : this(specification = SpecificationDto(entity.specification), version = entity.version) { + id = entity.id + } +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/SpecificationDto.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/SpecificationDto.kt new file mode 100644 index 0000000..491246d --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/SpecificationDto.kt @@ -0,0 +1,12 @@ +package de.predic8.openapicatalogbackend.model.dto + +import de.predic8.openapicatalogbackend.model.dto.specification.UpdateDto +import de.predic8.openapicatalogbackend.model.entity.Specification +import kotlinx.serialization.Serializable + +@Serializable +data class SpecificationDto(val majorVersions: MutableList = mutableListOf(), var update: UpdateDto? = null) : ADto() { + constructor(entity: Specification) : this(update = entity.update?.let(::UpdateDto)) { + id = entity.id + } +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/SpecificationTmpDto.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/SpecificationTmpDto.kt new file mode 100644 index 0000000..b3423d4 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/SpecificationTmpDto.kt @@ -0,0 +1,7 @@ +package de.predic8.openapicatalogbackend.model.dto + +import de.predic8.openapicatalogbackend.model.dto.specification.UpdateDto +import kotlinx.serialization.Serializable + +@Serializable +data class SpecificationTmpDto(val documents: List = emptyList(), val update: UpdateDto? = null) : ADto() diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/URLDto.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/URLDto.kt new file mode 100644 index 0000000..4396b8c --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/URLDto.kt @@ -0,0 +1,13 @@ +package de.predic8.openapicatalogbackend.model.dto + +import de.predic8.openapicatalogbackend.model.entity.URL +import de.predic8.openapicatalogbackend.model.enums.EType +import de.predic8.openapicatalogbackend.model.enums.EType.GIT +import kotlinx.serialization.Serializable + +@Serializable +data class URLDto(var url: String, var type: EType = GIT) : ADto() { + constructor(entity: URL) : this(url = entity.url, type = entity.type) { + id = entity.id + } +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/document/LintReportDto.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/document/LintReportDto.kt new file mode 100644 index 0000000..b4c9f70 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/document/LintReportDto.kt @@ -0,0 +1,15 @@ +package de.predic8.openapicatalogbackend.model.dto.document + +import de.predic8.openapicatalogbackend.model.dto.ADto +import de.predic8.openapicatalogbackend.model.dto.majorVersion.LintRuleDto +import de.predic8.openapicatalogbackend.model.entity.document.LintReport +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json.Default.parseToJsonElement +import kotlinx.serialization.json.JsonElement + +@Serializable +class LintReportDto(var content: JsonElement, var rule: LintRuleDto? = null) : ADto() { + constructor(entity: LintReport) : this(content = entity.content.let(::parseToJsonElement), rule = entity.rule?.let(::LintRuleDto)) { + id = entity.id + } +} \ No newline at end of file diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/document/ReportDto.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/document/ReportDto.kt new file mode 100644 index 0000000..4fd9d34 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/document/ReportDto.kt @@ -0,0 +1,14 @@ +package de.predic8.openapicatalogbackend.model.dto.document + +import de.predic8.openapicatalogbackend.model.dto.ADto +import de.predic8.openapicatalogbackend.model.entity.document.Report +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json.Default.parseToJsonElement +import kotlinx.serialization.json.JsonElement + +@Serializable +class ReportDto(var diffReport: JsonElement? = null, var lintReports: MutableList = mutableListOf()) : ADto() { + constructor(entity: Report) : this(diffReport = entity.diffReport?.let(::parseToJsonElement), lintReports = entity.lintReports.map(::LintReportDto).toMutableList()) { + id = entity.id + } +} \ No newline at end of file diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/majorVersion/LintRuleDto.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/majorVersion/LintRuleDto.kt new file mode 100644 index 0000000..976e1b7 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/majorVersion/LintRuleDto.kt @@ -0,0 +1,15 @@ +package de.predic8.openapicatalogbackend.model.dto.majorVersion + +import de.predic8.openapicatalogbackend.model.dto.ADto +import de.predic8.openapicatalogbackend.model.dto.MajorVersionDto +import de.predic8.openapicatalogbackend.model.dto.URLDto +import de.predic8.openapicatalogbackend.model.dto.document.LintReportDto +import de.predic8.openapicatalogbackend.model.entity.majorVersion.LintRule +import kotlinx.serialization.Serializable + +@Serializable +class LintRuleDto(var majorVersion: MajorVersionDto? = null, var name: String, var reports: MutableList = mutableListOf(), var url: URLDto) : ADto() { + constructor(entity: LintRule) : this(MajorVersionDto(entity.majorVersion), name = entity.name, url = URLDto(entity.url)) { + id = entity.id + } +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/specification/UpdateDto.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/specification/UpdateDto.kt new file mode 100644 index 0000000..c38df43 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/dto/specification/UpdateDto.kt @@ -0,0 +1,13 @@ +package de.predic8.openapicatalogbackend.model.dto.specification + +import de.predic8.openapicatalogbackend.model.dto.ADto +import de.predic8.openapicatalogbackend.model.dto.URLDto +import de.predic8.openapicatalogbackend.model.entity.specification.Update +import kotlinx.serialization.Serializable + +@Serializable +data class UpdateDto(var interval: Int = 30, var path: String? = null, var url: URLDto) : ADto() { + constructor(entity: Update) : this(interval = entity.interval, path = entity.path, url = URLDto(entity.url)) { + id = entity.id + } +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/AEntity.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/AEntity.kt new file mode 100644 index 0000000..7855754 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/AEntity.kt @@ -0,0 +1,10 @@ +package de.predic8.openapicatalogbackend.model.entity + +import jakarta.persistence.GeneratedValue +import jakarta.persistence.GenerationType.AUTO +import jakarta.persistence.Id +import jakarta.persistence.MappedSuperclass +import java.util.* + +@MappedSuperclass +abstract class AEntity(@Id @GeneratedValue(strategy = AUTO) val id: UUID = UUID(0, 0)) diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/Document.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/Document.kt new file mode 100644 index 0000000..ee2179b --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/Document.kt @@ -0,0 +1,35 @@ +package de.predic8.openapicatalogbackend.model.entity + +import de.predic8.openapicatalogbackend.model.dto.DocumentDto +import de.predic8.openapicatalogbackend.model.entity.document.Report +import jakarta.persistence.* +import jakarta.persistence.CascadeType.ALL +import java.time.LocalDateTime +import java.time.LocalDateTime.now + +@Entity +class Document( + @Lob + var content: String, + @ManyToOne(optional = false) + var majorVersion: MajorVersion, + var openapiVersion: String, + @OneToOne(cascade = [ALL]) + var report: Report, + @ElementCollection + val servers: MutableMap = mutableMapOf(), + var timestamp: LocalDateTime = now(), + var title: String, + var version: String, +) : AEntity() { + constructor(dto: DocumentDto, majorVersion: MajorVersion, report: Report) : this( + content = dto.content, + majorVersion = majorVersion, + openapiVersion = dto.openapiVersion, + report = report, + servers = dto.servers, + timestamp = dto.timestamp, + title = dto.title, + version = dto.version + ) +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/MajorVersion.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/MajorVersion.kt new file mode 100644 index 0000000..4753a81 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/MajorVersion.kt @@ -0,0 +1,18 @@ +package de.predic8.openapicatalogbackend.model.entity + +import de.predic8.openapicatalogbackend.model.entity.majorVersion.LintRule +import jakarta.persistence.* +import jakarta.persistence.CascadeType.ALL + +@Entity +@Table(uniqueConstraints = [UniqueConstraint(columnNames = ["specification_id", "version"])]) +class MajorVersion( + @OneToMany(cascade = [ALL], mappedBy = "majorVersion", orphanRemoval = true) + @OrderBy("version DESC, timestamp DESC") + val documents: MutableList = mutableListOf(), + @OneToMany(cascade = [ALL], mappedBy = "majorVersion", orphanRemoval = true) + var lintRules: MutableList = mutableListOf(), + @ManyToOne(optional = false) + var specification: Specification, + var version: Int, +) : AEntity() diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/Specification.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/Specification.kt new file mode 100644 index 0000000..f064c1a --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/Specification.kt @@ -0,0 +1,20 @@ +package de.predic8.openapicatalogbackend.model.entity + +import de.predic8.openapicatalogbackend.model.dto.SpecificationTmpDto +import de.predic8.openapicatalogbackend.model.entity.specification.Update +import jakarta.persistence.CascadeType.ALL +import jakarta.persistence.Entity +import jakarta.persistence.OneToMany +import jakarta.persistence.OneToOne +import jakarta.persistence.OrderBy + +@Entity +class Specification( + @OneToMany(cascade = [ALL], mappedBy = "specification", orphanRemoval = true) + @OrderBy("version DESC") + val majorVersions: MutableList = mutableListOf(), + @OneToOne(cascade = [ALL]) + var update: Update? = null, +) : AEntity() { + constructor(dto: SpecificationTmpDto) : this(update = dto.update?.let(::Update)) +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/URL.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/URL.kt new file mode 100644 index 0000000..4dd0b44 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/URL.kt @@ -0,0 +1,13 @@ +package de.predic8.openapicatalogbackend.model.entity + +import de.predic8.openapicatalogbackend.model.dto.URLDto +import de.predic8.openapicatalogbackend.model.enums.EType +import de.predic8.openapicatalogbackend.model.enums.EType.GIT +import jakarta.persistence.Entity +import jakarta.persistence.EnumType.STRING +import jakarta.persistence.Enumerated + +@Entity +class URL(var url: String, @Enumerated(STRING) var type: EType = GIT) : AEntity() { + constructor(dto: URLDto) : this(url = dto.url, type = dto.type) +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/document/LintReport.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/document/LintReport.kt new file mode 100644 index 0000000..a8ea407 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/document/LintReport.kt @@ -0,0 +1,10 @@ +package de.predic8.openapicatalogbackend.model.entity.document + +import de.predic8.openapicatalogbackend.model.entity.AEntity +import de.predic8.openapicatalogbackend.model.entity.majorVersion.LintRule +import jakarta.persistence.Entity +import jakarta.persistence.Lob +import jakarta.persistence.ManyToOne + +@Entity +class LintReport(@Lob var content: String, @ManyToOne(optional = false) var report: Report, @ManyToOne var rule: LintRule? = null) : AEntity() diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/document/Report.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/document/Report.kt new file mode 100644 index 0000000..61fe081 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/document/Report.kt @@ -0,0 +1,13 @@ +package de.predic8.openapicatalogbackend.model.entity.document + +import de.predic8.openapicatalogbackend.model.dto.document.ReportDto +import de.predic8.openapicatalogbackend.model.entity.AEntity +import jakarta.persistence.CascadeType.ALL +import jakarta.persistence.Entity +import jakarta.persistence.Lob +import jakarta.persistence.OneToMany + +@Entity +class Report(@Lob var diffReport: String? = null, @OneToMany(cascade = [ALL], mappedBy = "report", orphanRemoval = true) var lintReports: MutableList = mutableListOf()) : AEntity() { + constructor(dto: ReportDto) : this(diffReport = dto.diffReport?.toString()) +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/majorVersion/LintRule.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/majorVersion/LintRule.kt new file mode 100644 index 0000000..ac3b570 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/majorVersion/LintRule.kt @@ -0,0 +1,25 @@ +package de.predic8.openapicatalogbackend.model.entity.majorVersion + +import de.predic8.openapicatalogbackend.model.dto.majorVersion.LintRuleDto +import de.predic8.openapicatalogbackend.model.entity.AEntity +import de.predic8.openapicatalogbackend.model.entity.MajorVersion +import de.predic8.openapicatalogbackend.model.entity.URL +import de.predic8.openapicatalogbackend.model.entity.document.LintReport +import jakarta.persistence.CascadeType.ALL +import jakarta.persistence.Entity +import jakarta.persistence.ManyToOne +import jakarta.persistence.OneToMany +import jakarta.persistence.OneToOne + +@Entity +class LintRule( + @OneToMany(cascade = [ALL], mappedBy = "rule", orphanRemoval = true) + var reports: MutableList = mutableListOf(), + @ManyToOne(optional = false) + var majorVersion: MajorVersion, + var name: String, + @OneToOne(cascade = [ALL]) + var url: URL, +) : AEntity() { + constructor(dto: LintRuleDto, majorVersion: MajorVersion) : this(majorVersion = majorVersion, name = dto.name, url = URL(dto.url)) +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/specification/Update.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/specification/Update.kt new file mode 100644 index 0000000..072571e --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/entity/specification/Update.kt @@ -0,0 +1,13 @@ +package de.predic8.openapicatalogbackend.model.entity.specification + +import de.predic8.openapicatalogbackend.model.dto.specification.UpdateDto +import de.predic8.openapicatalogbackend.model.entity.AEntity +import de.predic8.openapicatalogbackend.model.entity.URL +import jakarta.persistence.CascadeType.ALL +import jakarta.persistence.Entity +import jakarta.persistence.OneToOne + +@Entity +class Update(var interval: Int = 30, var path: String? = null, @OneToOne(cascade = [ALL]) var url: URL) : AEntity() { + constructor(dto: UpdateDto) : this(interval = dto.interval, path = dto.path, url = URL(dto.url)) +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/enums/EOS.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/enums/EOS.kt new file mode 100644 index 0000000..01e688b --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/enums/EOS.kt @@ -0,0 +1,7 @@ +package de.predic8.openapicatalogbackend.model.enums + +enum class EOS { + LINUX, + MACOS, + WINDOWS +} \ No newline at end of file diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/enums/EType.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/enums/EType.kt new file mode 100644 index 0000000..f4cbd14 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/model/enums/EType.kt @@ -0,0 +1,6 @@ +package de.predic8.openapicatalogbackend.model.enums + +enum class EType { + GIT, + HTTP +} \ No newline at end of file diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/DocumentRepository.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/DocumentRepository.kt new file mode 100644 index 0000000..6ff02ac --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/DocumentRepository.kt @@ -0,0 +1,12 @@ +package de.predic8.openapicatalogbackend.repository + +import de.predic8.openapicatalogbackend.model.entity.Document +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.stereotype.Repository +import java.util.* + +@Repository +interface DocumentRepository : JpaRepository { + fun findFirstByMajorVersionSpecificationIdOrderByVersionDescTimestampDesc(specificationId: UUID): Document? + fun findFirstByMajorVersionSpecificationIdAndMajorVersionVersionOrderByVersionDescTimestampDesc(specificationId: UUID, version: Int): Document? +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/MajorVersionRepository.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/MajorVersionRepository.kt new file mode 100644 index 0000000..6f55a84 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/MajorVersionRepository.kt @@ -0,0 +1,11 @@ +package de.predic8.openapicatalogbackend.repository + +import de.predic8.openapicatalogbackend.model.entity.MajorVersion +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.stereotype.Repository +import java.util.* + +@Repository +interface MajorVersionRepository : JpaRepository { + fun findFirstBySpecificationIdAndVersion(specificationId: UUID, version: Int): MajorVersion? +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/SpecificationRepository.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/SpecificationRepository.kt new file mode 100644 index 0000000..e25b5ad --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/SpecificationRepository.kt @@ -0,0 +1,9 @@ +package de.predic8.openapicatalogbackend.repository + +import de.predic8.openapicatalogbackend.model.entity.Specification +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.stereotype.Repository +import java.util.* + +@Repository +interface SpecificationRepository : JpaRepository \ No newline at end of file diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/document/LintReportRepository.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/document/LintReportRepository.kt new file mode 100644 index 0000000..467f85c --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/document/LintReportRepository.kt @@ -0,0 +1,9 @@ +package de.predic8.openapicatalogbackend.repository.document + +import de.predic8.openapicatalogbackend.model.entity.document.LintReport +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.stereotype.Repository +import java.util.* + +@Repository +interface LintReportRepository : JpaRepository diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/document/ReportRepository.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/document/ReportRepository.kt new file mode 100644 index 0000000..803f7ae --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/document/ReportRepository.kt @@ -0,0 +1,9 @@ +package de.predic8.openapicatalogbackend.repository.document + +import de.predic8.openapicatalogbackend.model.entity.document.Report +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.stereotype.Repository +import java.util.* + +@Repository +interface ReportRepository : JpaRepository diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/majorVersion/LintRuleRepository.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/majorVersion/LintRuleRepository.kt new file mode 100644 index 0000000..7ad8af1 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/repository/majorVersion/LintRuleRepository.kt @@ -0,0 +1,11 @@ +package de.predic8.openapicatalogbackend.repository.majorVersion + +import de.predic8.openapicatalogbackend.model.entity.majorVersion.LintRule +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.stereotype.Repository +import java.util.* + +@Repository +interface LintRuleRepository : JpaRepository { + fun findAllByMajorVersionId(majorVersionId: UUID): List +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/service/DocumentService.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/service/DocumentService.kt new file mode 100644 index 0000000..fcb59f0 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/service/DocumentService.kt @@ -0,0 +1,101 @@ +package de.predic8.openapicatalogbackend.service + +import com.charleskorn.kaml.Yaml.Companion.default +import com.charleskorn.kaml.YamlList +import com.charleskorn.kaml.YamlMap +import com.charleskorn.kaml.YamlNode +import com.charleskorn.kaml.yamlMap +import de.predic8.openapicatalogbackend.model.dto.DocumentDto +import de.predic8.openapicatalogbackend.model.dto.MajorVersionDto +import de.predic8.openapicatalogbackend.model.dto.majorVersion.LintRuleDto +import de.predic8.openapicatalogbackend.model.entity.Document +import de.predic8.openapicatalogbackend.model.entity.MajorVersion +import de.predic8.openapicatalogbackend.model.entity.Specification +import de.predic8.openapicatalogbackend.model.entity.document.LintReport +import de.predic8.openapicatalogbackend.model.entity.document.Report +import de.predic8.openapicatalogbackend.model.entity.majorVersion.LintRule +import de.predic8.openapicatalogbackend.repository.DocumentRepository +import de.predic8.openapicatalogbackend.repository.MajorVersionRepository +import de.predic8.openapicatalogbackend.repository.SpecificationRepository +import de.predic8.openapicatalogbackend.repository.document.LintReportRepository +import de.predic8.openapicatalogbackend.repository.document.ReportRepository +import de.predic8.openapicatalogbackend.repository.majorVersion.LintRuleRepository +import de.predic8.openapicatalogbackend.utils.report.DiffTool +import de.predic8.openapicatalogbackend.utils.report.LintTool +import kotlinx.serialization.json.Json.Default.parseToJsonElement +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.contentOrNull +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive +import org.semver4j.Semver.coerce +import org.springframework.data.repository.findByIdOrNull +import org.springframework.stereotype.Service +import java.util.* + +@Service +class DocumentService( + val repo: DocumentRepository, + val repoMV: MajorVersionRepository, + val repoR: ReportRepository, + val repoLRe: LintReportRepository, + val repoLRu: LintRuleRepository, + val repoS: SpecificationRepository, + val toolD: DiffTool, + val toolL: LintTool, +) { + fun getBy(id: UUID): DocumentDto? = repo.findByIdOrNull(id)?.let { DocumentDto(content = it.content, entity = it, majorVersion = MajorVersionDto(it.majorVersion)) } + + fun save(allowDuplicate: Boolean = true, documents: List, specificationId: UUID): List = + repoS.findByIdOrNull(specificationId)?.let { documents.save(allowDuplicate = allowDuplicate, specification = it) }.orEmpty() + + fun saveContents(allowDuplicate: Boolean = true, contents: List, specificationId: UUID): List = + save(allowDuplicate = allowDuplicate, documents = contents.map(::DocumentDto), specificationId = specificationId) + + fun saveLintReports(lt: LintRuleDto): List = runCatching { repoLRu.getReferenceById(lt.id) }.getOrNull()?.run { majorVersion.documents.map { (it.generateReportBy(this)) } }.orEmpty() + + private fun DocumentDto.createChangesReportBy(specificationId: UUID): JsonElement? = coerce(version)?.major + ?.let { repo.findFirstByMajorVersionSpecificationIdAndMajorVersionVersionOrderByVersionDescTimestampDesc(specificationId = specificationId, version = it) } + ?.let { toolD.generateReportBy(old = it.content, new = content) } + + private fun DocumentDto.fillWith(yamlMap: YamlMap): DocumentDto = apply { + openapiVersion = yamlMap.getScalarContentBy("openapi", "swagger") + yamlMap.get("servers")?.items?.map(YamlNode::yamlMap) + ?.mapNotNull { it.getScalarContentOrNullBy("description")?.let { desc -> it.getScalarContentBy("url") to desc } } + ?.let(servers::putAll) + title = yamlMap.get("info")?.getScalarContentBy("title").orEmpty() + version = yamlMap.get("info")?.getScalarContentBy("version")?.let(::coerce)?.version.orEmpty() + } + + private fun DocumentDto.findOrCreateMajorVersion(specification: Specification): MajorVersion? = + coerce(version)?.major?.let { v -> repoMV.findFirstBySpecificationIdAndVersion(specificationId = specification.id, version = v) ?: repoMV.save(MajorVersion(specification = specification, version = v)) } + + private fun YamlMap.getScalarContentBy(vararg keys: String = arrayOf("null")): String = + getScalarContentOrNullBy(keys = keys) ?: error("${path.toHumanReadableString()}.${keys.joinToString("/")} not specified.") + + private fun YamlMap.getScalarContentOrNullBy(vararg keys: String = arrayOf("null")): String? = keys.firstNotNullOfOrNull(::getScalar)?.content + + private fun Report.hasChanges(): Boolean = + diffReport?.runCatching(::parseToJsonElement)?.getOrNull()?.jsonObject?.get("report")?.jsonObject?.get("message")?.jsonPrimitive?.contentOrNull != "No changes found between specifications" + + private fun DocumentDto.parseDocument(): DocumentDto = fillWith(content.parseToYamlNode().yamlMap) + + private fun String.parseToYamlNode(): YamlNode = let(default::parseToYamlNode) + + private fun DocumentDto.save(allowDuplicate: Boolean, specification: Specification): DocumentDto? = + parseDocument().findOrCreateMajorVersion(specification = specification)?.let { saveReports(allowDuplicate = allowDuplicate, mv = it, s = specification) }?.let(repo::save)?.let(::DocumentDto) + + private fun List.save(allowDuplicate: Boolean, specification: Specification): List = mapNotNull { it.save(allowDuplicate = allowDuplicate, specification = specification) } + + private fun DocumentDto.saveReports(allowDuplicate: Boolean, mv: MajorVersion, s: Specification): Document? = Report(createChangesReportBy(s.id)?.toString()) + .takeIf { allowDuplicate || it.hasChanges() } + ?.let(repoR::save) + ?.also { saveLintReports(mv = mv, r = it) } + ?.let { Document(dto = this, majorVersion = mv, report = it) } + + private fun DocumentDto.saveLintReports(mv: MajorVersion, r: Report): List = repoLRu.findAllByMajorVersionId(mv.id) + .map { LintReport(content = toolL.generateReportBy(content = content, lintRule = it).toString(), report = r, rule = it) } + .ifEmpty { listOf(LintReport(content = toolL.generateReportBy(content).toString(), report = r)) } + .let(repoLRe::saveAll) + + private fun Document.generateReportBy(lr: LintRule): LintReport = toolL.generateReportBy(content = content, lintRule = lr).toString().let { LintReport(content = it, report = report, rule = lr) }.let(repoLRe::save) +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/service/MajorVersionService.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/service/MajorVersionService.kt new file mode 100644 index 0000000..4821067 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/service/MajorVersionService.kt @@ -0,0 +1,14 @@ +package de.predic8.openapicatalogbackend.service + +import de.predic8.openapicatalogbackend.model.dto.majorVersion.LintRuleDto +import de.predic8.openapicatalogbackend.model.entity.majorVersion.LintRule +import de.predic8.openapicatalogbackend.repository.MajorVersionRepository +import de.predic8.openapicatalogbackend.repository.majorVersion.LintRuleRepository +import org.springframework.data.repository.findByIdOrNull +import org.springframework.stereotype.Service +import java.util.* + +@Service +class MajorVersionService(val repo: MajorVersionRepository, val repoLR: LintRuleRepository, val serviceD: DocumentService) { + fun saveLintingRuleBy(dto: LintRuleDto, id: UUID): LintRuleDto? = repo.findByIdOrNull(id)?.let { LintRule(dto = dto, majorVersion = it) }?.let(repoLR::save)?.let(::LintRuleDto)?.also(serviceD::saveLintReports) +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/service/SpecificationService.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/service/SpecificationService.kt new file mode 100644 index 0000000..8322796 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/service/SpecificationService.kt @@ -0,0 +1,57 @@ +package de.predic8.openapicatalogbackend.service + +import de.predic8.openapicatalogbackend.model.dto.DocumentDto +import de.predic8.openapicatalogbackend.model.dto.MajorVersionDto +import de.predic8.openapicatalogbackend.model.dto.SpecificationDto +import de.predic8.openapicatalogbackend.model.dto.SpecificationTmpDto +import de.predic8.openapicatalogbackend.model.dto.specification.UpdateDto +import de.predic8.openapicatalogbackend.model.entity.MajorVersion +import de.predic8.openapicatalogbackend.model.entity.Specification +import de.predic8.openapicatalogbackend.model.enums.EType.GIT +import de.predic8.openapicatalogbackend.repository.DocumentRepository +import de.predic8.openapicatalogbackend.repository.MajorVersionRepository +import de.predic8.openapicatalogbackend.repository.SpecificationRepository +import de.predic8.openapicatalogbackend.utils.GitTool +import de.predic8.openapicatalogbackend.utils.TaskSchedulerTool +import kotlinx.coroutines.Runnable +import org.springframework.data.repository.findByIdOrNull +import org.springframework.stereotype.Service +import java.net.URI +import java.time.LocalDateTime +import java.util.* +import java.util.concurrent.ScheduledFuture +import kotlin.time.toDuration +import kotlin.time.toJavaDuration +import java.util.concurrent.TimeUnit as TU +import kotlin.time.DurationUnit as DU + +@Service +class SpecificationService(val repo: SpecificationRepository, val repoD: DocumentRepository, val repoMV: MajorVersionRepository, val serviceD: DocumentService, val toolG: GitTool, val toolTS: TaskSchedulerTool) { + fun createTaskBy(dto: SpecificationDto): ScheduledFuture<*>? = dto.update?.run { toTask(dto.id) } + + fun enableAllTasks(): List> = repo.findAll().map(::SpecificationDto).mapNotNull(::createTaskBy) + + fun getAll(): List = repo.findAll().map { it.toDto() } + + fun getBy(id: UUID): SpecificationDto? = repo.findByIdOrNull(id)?.toDto() + + fun getMajorVersionBy(id: UUID, version: Int): MajorVersionDto? = repoMV.findFirstBySpecificationIdAndVersion(id, version)?.toDto() + + fun save(dto: SpecificationTmpDto): SpecificationDto = dto.saveSpecification().also { createTaskBy(it)?.runCatching { get(30, TU.SECONDS) } ?: serviceD.save(documents = dto.documents, specificationId = it.id) } + + private fun UpdateDto.getDocuments(lastFetch: LocalDateTime?): List = when (url.type) { + GIT -> toolG.getDocumentsBy(lastFetch = lastFetch, update = this) + else -> URI(url.url).toURL().readText().let(::listOf) + } + + private fun SpecificationTmpDto.saveSpecification(): SpecificationDto = let(::Specification).let(repo::save).let(::SpecificationDto) + + private fun MajorVersion.toDto(): MajorVersionDto = MajorVersionDto(this).also { it.documents.addAll(documents.map(::DocumentDto)) } + + private fun Specification.toDto(): SpecificationDto = SpecificationDto(this).also { it.majorVersions.addAll(majorVersions.map { mv -> mv.toDto() }) } + + private fun UpdateDto.toTask(id: UUID): ScheduledFuture<*> = toolTS.createScheduledTaskFrom( + duration = interval.toDuration(DU.SECONDS).toJavaDuration(), + runnable = Runnable { serviceD.saveContents(allowDuplicate = false, contents = getDocuments(repoD.findFirstByMajorVersionSpecificationIdOrderByVersionDescTimestampDesc(id)?.timestamp), specificationId = id) } + ) +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/utils/GitTool.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/utils/GitTool.kt new file mode 100644 index 0000000..4fa0f6f --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/utils/GitTool.kt @@ -0,0 +1,34 @@ +package de.predic8.openapicatalogbackend.utils + +import de.predic8.openapicatalogbackend.model.dto.specification.UpdateDto +import org.eclipse.jgit.api.Git +import org.eclipse.jgit.api.Git.cloneRepository +import org.eclipse.jgit.api.Git.open +import org.eclipse.jgit.revwalk.RevCommit +import org.eclipse.jgit.storage.file.FileRepositoryBuilder +import org.eclipse.jgit.treewalk.TreeWalk +import org.eclipse.jgit.treewalk.TreeWalk.forPath +import org.springframework.stereotype.Component +import java.io.File +import java.time.LocalDateTime + +@Component +class GitTool(val tools: Tools) { + fun getDocumentsBy(lastFetch: LocalDateTime?, update: UpdateDto): List = getRepositoryBy(update.url.url).getContentHistoryBy(lastFetch = lastFetch, path = update.path!!) + + private fun cloneRepositoryBy(path: File, sourceUrl: String): Git = cloneRepository().setURI(sourceUrl).setDirectory(path).call() + + private fun TreeWalk.getContent(): String = objectReader.open(getObjectId(0)).bytes.decodeToString() + + private fun Git.getContentHistoryBy(lastFetch: LocalDateTime?, path: String): List = + getContentLogBy(path).filter { lastFetch?.let { lf -> it.committerIdent?.run { whenAsInstant.atZone(zoneId).toLocalDateTime() > lf } } ?: true }.flatMap { getContentHistoryBy(commit = it, path = path) } + + private fun Git.getContentHistoryBy(commit: RevCommit, path: String): List = + buildList { forPath(repository, path, commit.tree).use { do add(it.getContent()) while (it.next()) } } + + private fun Git.getContentLogBy(path: String): MutableIterable = log().addPath(path).call() + + private fun getRepositoryBy(path: File): Git? = FileRepositoryBuilder().findGitDir(path).gitDir?.let(::open) + + private fun getRepositoryBy(sourceUrl: String): Git = tools.createTempFolder().let { getRepositoryBy(it) ?: cloneRepositoryBy(path = it, sourceUrl = sourceUrl) }.apply { pull().call() } +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/utils/TaskSchedulerTool.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/utils/TaskSchedulerTool.kt new file mode 100644 index 0000000..656787c --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/utils/TaskSchedulerTool.kt @@ -0,0 +1,12 @@ +package de.predic8.openapicatalogbackend.utils + +import kotlinx.coroutines.Runnable +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler +import org.springframework.stereotype.Component +import java.time.Duration +import java.util.concurrent.ScheduledFuture + +@Component +class TaskSchedulerTool(val taskScheduler: ThreadPoolTaskScheduler) { + fun createScheduledTaskFrom(duration: Duration, runnable: Runnable): ScheduledFuture<*> = taskScheduler.scheduleWithFixedDelay(runnable, duration) +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/utils/Tools.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/utils/Tools.kt new file mode 100644 index 0000000..370869b --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/utils/Tools.kt @@ -0,0 +1,37 @@ +package de.predic8.openapicatalogbackend.utils + +import de.predic8.openapicatalogbackend.model.enums.EOS +import de.predic8.openapicatalogbackend.model.enums.EOS.* +import org.apache.commons.lang3.SystemUtils.OS_NAME +import org.kohsuke.github.GitHub +import org.kohsuke.github.GitHub.connectAnonymously +import org.springframework.beans.factory.annotation.Value +import org.springframework.boot.system.ApplicationTemp +import org.springframework.core.io.FileSystemResource +import org.springframework.stereotype.Component +import java.io.File +import java.util.UUID.randomUUID + +@Component +class Tools(private val tmp: ApplicationTemp = ApplicationTemp()) { + @Value("\${user.home}/.predic8/openapicatalog/tools/") + lateinit var folder: FileSystemResource + + val github: GitHub? + get() = runCatching { connectAnonymously() }.getOrNull()?.takeIf { it.rateLimit.getRemaining() > 0 } + + fun createFolder(): Boolean = folder.file.mkdirs() + + fun createTempFile(fileEnding: String = ""): File = File(tmp.dir, "${randomUUID()}$fileEnding") + + fun createTempFolder(): File = tmp.getDir(randomUUID().toString()) + + fun detectOS(): EOS = when { + OS_NAME.contains("Mac", true) -> MACOS + OS_NAME.contains("Windows", true) -> WINDOWS + else -> LINUX + } + + + fun saveToTempFile(content: String, fileEnding: String = ""): File = createTempFile(fileEnding).apply { writeText(content) } +} \ No newline at end of file diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/utils/report/DiffTool.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/utils/report/DiffTool.kt new file mode 100644 index 0000000..3d1e770 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/utils/report/DiffTool.kt @@ -0,0 +1,80 @@ +package de.predic8.openapicatalogbackend.utils.report + +import de.predic8.openapicatalogbackend.model.enums.EOS.MACOS +import de.predic8.openapicatalogbackend.model.enums.EOS.WINDOWS +import de.predic8.openapicatalogbackend.utils.Tools +import kotlinx.serialization.json.Json.Default.parseToJsonElement +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.put +import org.apache.commons.compress.archivers.tar.TarArchiveInputStream +import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream +import org.springframework.beans.factory.annotation.Value +import org.springframework.core.io.ByteArrayResource +import org.springframework.stereotype.Component +import org.springframework.web.client.RestTemplate +import org.springframework.web.client.getForObject +import java.io.File +import java.lang.Runtime.getRuntime +import java.time.Instant +import java.time.Instant.parse +import java.util.* + +@Component +class DiffTool(val restTemplate: RestTemplate, val tools: Tools) { + val file: File by lazy { File(tools.folder.file, name) } + val fileLastUpdate: File by lazy { File(tools.folder.file, ".${file.name}") } + + @Value("\${tools.diff.github.name}") + lateinit var name: String + + @Value("\${tools.diff.github.organization}") + lateinit var organization: String + + fun generateReportBy(old: String, new: String): JsonElement? = tools.saveToTempFile(old).let { oldFile -> + tools.saveToTempFile(new).let { newFile -> + getRuntime().exec(arrayOf(file.path, "report", oldFile.path, newFile.path)) + .inputStream.readAllBytes().decodeToString() + .runCatching(::parseToJsonElement).getOrNull()?.let { + buildJsonObject { + put("report", it) + // TODO WORKAROUND FOR https://github.com/pb33f/openapi-changes/issues/137 + put( + "reportPaths", + getRuntime().exec(arrayOf(file.path, "summary", "-bmn", oldFile.path, newFile.path)).inputStream.readAllBytes().decodeToString() + .extractMarkdownPathFromSummary() + ) + } + }.also { oldFile.delete() } + .also { newFile.delete() } + } + } + + fun init(): Boolean = tools.github?.getOrganization(organization)?.getRepository(name)?.latestRelease + ?.takeIf { file.isUpdateNeeded(lastUpdate = fileLastUpdate, newUpdate = it.published_at) } + ?.apply { fileLastUpdate.writeText(published_at.toInstant().toString()) } + ?.listAssets()?.firstOrNull { it.name.contains(getNameByOS(), ignoreCase = true) } + ?.run { restTemplate.getForObject(browserDownloadUrl) } + ?.run { GzipCompressorInputStream(inputStream) } + ?.let(::TarArchiveInputStream) + ?.writeToolInFile(file) + ?.run { file.setExecutable(true, true) } == true + + private fun String.extractMarkdownPathFromSummary(): String = substringAfter("```").substringBeforeLast("```").trim().let { "```markdown\n$it\n```" } + + private fun getNameByOS() = when (tools.detectOS()) { + MACOS -> "darwin_x86_64" + WINDOWS -> "windows_x86_64" + else -> "linux_x86_64" + } + + private fun File.isUpdateNeeded(lastUpdate: File, newUpdate: Date): Boolean = !exists() || !lastUpdate.exists() || lastUpdate.isUpdateNeeded(newUpdate) + + private fun File.isUpdateNeeded(newUpdate: Date): Boolean = parseInstant()?.let(newUpdate.toInstant()::isAfter) != false + + private fun File.parseInstant(): Instant? = readText().runCatching(::parse).getOrNull() + + private fun TarArchiveInputStream.writeToolInFile(tool: File) { + while (nextEntry != null) if (currentEntry.name == tool.name) tool.writeBytes(readBytes()) + } +} diff --git a/backend/src/main/kotlin/de/predic8/openapicatalogbackend/utils/report/LintTool.kt b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/utils/report/LintTool.kt new file mode 100644 index 0000000..9c55479 --- /dev/null +++ b/backend/src/main/kotlin/de/predic8/openapicatalogbackend/utils/report/LintTool.kt @@ -0,0 +1,63 @@ +package de.predic8.openapicatalogbackend.utils.report + +import de.predic8.openapicatalogbackend.model.entity.majorVersion.LintRule +import de.predic8.openapicatalogbackend.model.enums.EOS.MACOS +import de.predic8.openapicatalogbackend.model.enums.EOS.WINDOWS +import de.predic8.openapicatalogbackend.utils.Tools +import kotlinx.serialization.json.Json.Default.parseToJsonElement +import kotlinx.serialization.json.JsonElement +import org.springframework.beans.factory.annotation.Value +import org.springframework.stereotype.Component +import org.springframework.web.client.RestTemplate +import org.springframework.web.client.getForObject +import java.io.File +import java.lang.Runtime.getRuntime +import java.time.Instant +import java.time.Instant.parse +import java.util.* + +@Component +class LintTool(val restTemplate: RestTemplate, val tools: Tools) { + val file: File by lazy { File(tools.folder.file, name) } + val fileLastUpdate: File by lazy { File(tools.folder.file, ".${file.name}") } + + @Value("\${tools.lint.github.name}") + lateinit var name: String + + @Value("\${tools.lint.github.organization}") + lateinit var organization: String + + fun generateReportBy(content: String, lintRule: LintRule? = null): JsonElement = lintRule?.url?.url + .let { tools.saveToTempFile(content = "extends: ['${it ?: "spectral:oas"}']", fileEnding = ".yaml") } + .let { generateReportBy(content = content, fileRuleSet = it) } + .let(::parseToJsonElement) + + fun init(): Boolean = tools.github?.getOrganization(organization)?.getRepository(name)?.latestRelease + ?.takeIf { file.isUpdateNeeded(lastUpdate = fileLastUpdate, newUpdate = it.published_at) } + ?.apply { fileLastUpdate.writeText(published_at.toInstant().toString()) } + ?.listAssets()?.firstOrNull { it.name.contains(getNameByOS(), ignoreCase = true) } + ?.run { restTemplate.getForObject(browserDownloadUrl) } + ?.let(file::writeBytes) + ?.run { file.setExecutable(true, true) } == true + + private fun generateReportBy(content: String, fileRuleSet: File): String = tools.createTempFile().let { + tools.saveToTempFile(content) + .apply { getRuntime().exec(arrayOf(file.path, "lint", path, "-f", "json", "-o", it.path, "-r", fileRuleSet.path)).waitFor() } + .apply(File::delete) + .apply { fileRuleSet.delete() } + .run { it.readText() } + .apply { it.delete() } + } + + private fun getNameByOS() = when (tools.detectOS()) { + MACOS -> "macos-x64" + WINDOWS -> ".exe" + else -> "linux-x64" + } + + private fun File.isUpdateNeeded(lastUpdate: File, newUpdate: Date): Boolean = !exists() || !lastUpdate.exists() || lastUpdate.isUpdateNeeded(newUpdate) + + private fun File.isUpdateNeeded(newUpdate: Date): Boolean = parseInstant()?.let(newUpdate.toInstant()::isAfter) != false + + private fun File.parseInstant(): Instant? = readText().runCatching(::parse).getOrNull() +} diff --git a/backend/src/main/resources/application-dev.yml b/backend/src/main/resources/application-dev.yml new file mode 100644 index 0000000..b793d21 --- /dev/null +++ b/backend/src/main/resources/application-dev.yml @@ -0,0 +1,10 @@ +server: + port: 9091 +spring: + datasource: + password: openapicatalog + # hsqldb.lock_file=false to access it via a DatabaseViewer + url: jdbc:hsqldb:file:/tmp/predic8/openapicatalog/database/database;hsqldb.lock_file=false + jpa: + hibernate: + ddl-auto: create-drop diff --git a/backend/src/main/resources/application-prod.yml b/backend/src/main/resources/application-prod.yml new file mode 100644 index 0000000..f6f406f --- /dev/null +++ b/backend/src/main/resources/application-prod.yml @@ -0,0 +1,10 @@ +server: + port: 8000 +spring: + datasource: + password: openapicatalog + # hsqldb.files_space=true for data safety + url: jdbc:hsqldb:file:${user.home}/.predic8/openapicatalog/database/database;hsqldb.files_space=true + jpa: + hibernate: + ddl-auto: update diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml new file mode 100644 index 0000000..87e5422 --- /dev/null +++ b/backend/src/main/resources/application.yml @@ -0,0 +1,16 @@ +spring: + application: + name: openapi-catalog-backend + datasource: + username: openapicatalog + profiles: + active: prod +tools: + diff: + github: + name: openapi-changes + organization: pb33f + lint: + github: + name: spectral + organization: stoplightio diff --git a/backend/src/main/resources/init/api-with-examples/1.0.0_2.0.0_api-with-examples.yaml b/backend/src/main/resources/init/api-with-examples/1.0.0_2.0.0_api-with-examples.yaml new file mode 100644 index 0000000..d1fdc87 --- /dev/null +++ b/backend/src/main/resources/init/api-with-examples/1.0.0_2.0.0_api-with-examples.yaml @@ -0,0 +1,164 @@ +swagger: "2.0" +info: + title: Simple API overview + version: v1 +paths: + /: + get: + operationId: listVersionsv2 + summary: List API versions + produces: + - application/json + responses: + "200": + description: |- + 200 300 response + examples: + application/json: |- + { + "versions": [ + { + "status": "CURRENT", + "updated": "2011-01-21T11:33:21Z", + "id": "v2.0", + "links": [ + { + "href": "http://127.0.0.1:8774/v2/", + "rel": "self" + } + ] + }, + { + "status": "EXPERIMENTAL", + "updated": "2013-07-23T11:33:21Z", + "id": "v3.0", + "links": [ + { + "href": "http://127.0.0.1:8774/v3/", + "rel": "self" + } + ] + } + ] + } + "300": + description: |- + 200 300 response + examples: + application/json: |- + { + "versions": [ + { + "status": "CURRENT", + "updated": "2011-01-21T11:33:21Z", + "id": "v2.0", + "links": [ + { + "href": "http://127.0.0.1:8774/v2/", + "rel": "self" + } + ] + }, + { + "status": "EXPERIMENTAL", + "updated": "2013-07-23T11:33:21Z", + "id": "v3.0", + "links": [ + { + "href": "http://127.0.0.1:8774/v3/", + "rel": "self" + } + ] + } + ] + } + /v2: + get: + operationId: getVersionDetailsv2 + summary: Show API version details + produces: + - application/json + responses: + "200": + description: |- + 200 203 response + examples: + application/json: |- + { + "version": { + "status": "CURRENT", + "updated": "2011-01-21T11:33:21Z", + "media-types": [ + { + "base": "application/xml", + "type": "application/vnd.openstack.compute+xml;version=2" + }, + { + "base": "application/json", + "type": "application/vnd.openstack.compute+json;version=2" + } + ], + "id": "v2.0", + "links": [ + { + "href": "http://127.0.0.1:8774/v2/", + "rel": "self" + }, + { + "href": "http://docs.openstack.org/api/openstack-compute/2/os-compute-devguide-2.pdf", + "type": "application/pdf", + "rel": "describedby" + }, + { + "href": "http://docs.openstack.org/api/openstack-compute/2/wadl/os-compute-2.wadl", + "type": "application/vnd.sun.wadl+xml", + "rel": "describedby" + }, + { + "href": "http://docs.openstack.org/api/openstack-compute/2/wadl/os-compute-2.wadl", + "type": "application/vnd.sun.wadl+xml", + "rel": "describedby" + } + ] + } + } + "203": + description: |- + 200 203 response + examples: + application/json: |- + { + "version": { + "status": "CURRENT", + "updated": "2011-01-21T11:33:21Z", + "media-types": [ + { + "base": "application/xml", + "type": "application/vnd.openstack.compute+xml;version=2" + }, + { + "base": "application/json", + "type": "application/vnd.openstack.compute+json;version=2" + } + ], + "id": "v2.0", + "links": [ + { + "href": "http://23.253.228.211:8774/v2/", + "rel": "self" + }, + { + "href": "http://docs.openstack.org/api/openstack-compute/2/os-compute-devguide-2.pdf", + "type": "application/pdf", + "rel": "describedby" + }, + { + "href": "http://docs.openstack.org/api/openstack-compute/2/wadl/os-compute-2.wadl", + "type": "application/vnd.sun.wadl+xml", + "rel": "describedby" + } + ] + } + } +consumes: + - application/json diff --git a/backend/src/main/resources/init/api-with-examples/2.0.0_3.0.0.api-with-examples-0.yaml b/backend/src/main/resources/init/api-with-examples/2.0.0_3.0.0.api-with-examples-0.yaml new file mode 100644 index 0000000..818c78d --- /dev/null +++ b/backend/src/main/resources/init/api-with-examples/2.0.0_3.0.0.api-with-examples-0.yaml @@ -0,0 +1,170 @@ +openapi: "3.0.0" +info: + title: Simple API overview + version: 2.0.0 +paths: + /: + get: + operationId: listVersionsv2 + summary: List API versions + responses: + '200': + description: |- + 200 response + content: + application/json: + examples: + foo: + value: + { + "versions": [ + { + "status": "CURRENT", + "updated": "2011-01-21T11:33:21Z", + "id": "v2.0", + "links": [ + { + "href": "http://127.0.0.1:8774/v2/", + "rel": "self" + } + ] + }, + { + "status": "EXPERIMENTAL", + "updated": "2013-07-23T11:33:21Z", + "id": "v3.0", + "links": [ + { + "href": "http://127.0.0.1:8774/v3/", + "rel": "self" + } + ] + } + ] + } + '300': + description: |- + 300 response + content: + application/json: + examples: + foo: + value: | + { + "versions": [ + { + "status": "CURRENT", + "updated": "2011-01-21T11:33:21Z", + "id": "v2.0", + "links": [ + { + "href": "http://127.0.0.1:8774/v2/", + "rel": "self" + } + ] + }, + { + "status": "EXPERIMENTAL", + "updated": "2013-07-23T11:33:21Z", + "id": "v3.0", + "links": [ + { + "href": "http://127.0.0.1:8774/v3/", + "rel": "self" + } + ] + } + ] + } + /v3: + get: + operationId: getVersionDetailsv2 + summary: Show API version details + responses: + '200': + description: |- + 200 response + content: + application/json: + examples: + foo: + value: + { + "version": { + "status": "CURRENT", + "updated": "2011-01-21T11:33:21Z", + "media-types": [ + { + "base": "application/xml", + "type": "application/vnd.openstack.compute+xml;version=2" + }, + { + "base": "application/json", + "type": "application/vnd.openstack.compute+json;version=2" + } + ], + "id": "v2.0", + "links": [ + { + "href": "http://127.0.0.1:8774/v2/", + "rel": "self" + }, + { + "href": "http://docs.openstack.org/api/openstack-compute/2/os-compute-devguide-2.pdf", + "type": "application/pdf", + "rel": "describedby" + }, + { + "href": "http://docs.openstack.org/api/openstack-compute/2/wadl/os-compute-2.wadl", + "type": "application/vnd.sun.wadl+xml", + "rel": "describedby" + }, + { + "href": "http://docs.openstack.org/api/openstack-compute/2/wadl/os-compute-2.wadl", + "type": "application/vnd.sun.wadl+xml", + "rel": "describedby" + } + ] + } + } + '203': + description: |- + 203 response + content: + application/json: + examples: + foo: + value: + { + "version": { + "status": "CURRENT", + "updated": "2011-01-21T11:33:21Z", + "media-types": [ + { + "base": "application/xml", + "type": "application/vnd.openstack.compute+xml;version=2" + }, + { + "base": "application/json", + "type": "application/vnd.openstack.compute+json;version=2" + } + ], + "id": "v2.0", + "links": [ + { + "href": "http://23.253.228.211:8774/v2/", + "rel": "self" + }, + { + "href": "http://docs.openstack.org/api/openstack-compute/2/os-compute-devguide-2.pdf", + "type": "application/pdf", + "rel": "describedby" + }, + { + "href": "http://docs.openstack.org/api/openstack-compute/2/wadl/os-compute-2.wadl", + "type": "application/vnd.sun.wadl+xml", + "rel": "describedby" + } + ] + } + } diff --git a/backend/src/main/resources/init/api-with-examples/2.0.0_3.0.0.api-with-examples.yaml b/backend/src/main/resources/init/api-with-examples/2.0.0_3.0.0.api-with-examples.yaml new file mode 100644 index 0000000..18726a5 --- /dev/null +++ b/backend/src/main/resources/init/api-with-examples/2.0.0_3.0.0.api-with-examples.yaml @@ -0,0 +1,170 @@ +openapi: "3.0.0" +info: + title: Simple API overview + version: 2.0.0 +paths: + /: + get: + operationId: listVersionsv2 + summary: List API versions + responses: + '200': + description: |- + 200 response + content: + application/json: + examples: + foo: + value: + { + "versions": [ + { + "status": "CURRENT", + "updated": "2011-01-21T11:33:21Z", + "id": "v2.0", + "links": [ + { + "href": "http://127.0.0.1:8774/v2/", + "rel": "self" + } + ] + }, + { + "status": "EXPERIMENTAL", + "updated": "2013-07-23T11:33:21Z", + "id": "v3.0", + "links": [ + { + "href": "http://127.0.0.1:8774/v3/", + "rel": "self" + } + ] + } + ] + } + '300': + description: |- + 300 response + content: + application/json: + examples: + foo: + value: | + { + "versions": [ + { + "status": "CURRENT", + "updated": "2011-01-21T11:33:21Z", + "id": "v2.0", + "links": [ + { + "href": "http://127.0.0.1:8774/v2/", + "rel": "self" + } + ] + }, + { + "status": "EXPERIMENTAL", + "updated": "2013-07-23T11:33:21Z", + "id": "v3.0", + "links": [ + { + "href": "http://127.0.0.1:8774/v3/", + "rel": "self" + } + ] + } + ] + } + /v2: + get: + operationId: getVersionDetailsv2 + summary: Show API version details + responses: + '200': + description: |- + 200 response + content: + application/json: + examples: + foo: + value: + { + "version": { + "status": "CURRENT", + "updated": "2011-01-21T11:33:21Z", + "media-types": [ + { + "base": "application/xml", + "type": "application/vnd.openstack.compute+xml;version=2" + }, + { + "base": "application/json", + "type": "application/vnd.openstack.compute+json;version=2" + } + ], + "id": "v2.0", + "links": [ + { + "href": "http://127.0.0.1:8774/v2/", + "rel": "self" + }, + { + "href": "http://docs.openstack.org/api/openstack-compute/2/os-compute-devguide-2.pdf", + "type": "application/pdf", + "rel": "describedby" + }, + { + "href": "http://docs.openstack.org/api/openstack-compute/2/wadl/os-compute-2.wadl", + "type": "application/vnd.sun.wadl+xml", + "rel": "describedby" + }, + { + "href": "http://docs.openstack.org/api/openstack-compute/2/wadl/os-compute-2.wadl", + "type": "application/vnd.sun.wadl+xml", + "rel": "describedby" + } + ] + } + } + '203': + description: |- + 203 response + content: + application/json: + examples: + foo: + value: + { + "version": { + "status": "CURRENT", + "updated": "2011-01-21T11:33:21Z", + "media-types": [ + { + "base": "application/xml", + "type": "application/vnd.openstack.compute+xml;version=2" + }, + { + "base": "application/json", + "type": "application/vnd.openstack.compute+json;version=2" + } + ], + "id": "v2.0", + "links": [ + { + "href": "http://23.253.228.211:8774/v2/", + "rel": "self" + }, + { + "href": "http://docs.openstack.org/api/openstack-compute/2/os-compute-devguide-2.pdf", + "type": "application/pdf", + "rel": "describedby" + }, + { + "href": "http://docs.openstack.org/api/openstack-compute/2/wadl/os-compute-2.wadl", + "type": "application/vnd.sun.wadl+xml", + "rel": "describedby" + } + ] + } + } diff --git a/backend/src/main/resources/init/callback-example/1.0.0_3.0.0_callback-example.yaml b/backend/src/main/resources/init/callback-example/1.0.0_3.0.0_callback-example.yaml new file mode 100644 index 0000000..e20da37 --- /dev/null +++ b/backend/src/main/resources/init/callback-example/1.0.0_3.0.0_callback-example.yaml @@ -0,0 +1,61 @@ +openapi: 3.0.0 +info: + title: Callback Example + version: 1.0.0 +paths: + /streams: + post: + description: subscribe to a client to receive out-of-band data + parameters: + - name: callbackUrl + in: query + required: true + description: | + the location where data will be sent. Must be network accessible + by the source server + schema: + type: string + format: uri + example: https://tonys-server.com + responses: + '201': + description: subscription successfully created + content: + application/json: + schema: + description: subscription information + required: + - subscriptionId + properties: + subscriptionId: + description: this unique identifier allows management of the subscription + type: string + example: 2531329f-fb09-4ef7-887e-84e648214436 + callbacks: + # the name `onData` is a convenience locator + onData: + # when data is sent, it will be sent to the `callbackUrl` provided + # when making the subscription PLUS the suffix `/data` + '{$request.query.callbackUrl}/data': + post: + requestBody: + description: subscription payload + content: + application/json: + schema: + type: object + properties: + timestamp: + type: string + format: date-time + userData: + type: string + responses: + '202': + description: | + Your server implementation should return this HTTP status code + if the data was received successfully + '204': + description: | + Your server should return this HTTP status code if no longer interested + in further updates diff --git a/backend/src/main/resources/init/callback-example/1.0.1_3.0.0_callback-example.yaml b/backend/src/main/resources/init/callback-example/1.0.1_3.0.0_callback-example.yaml new file mode 100644 index 0000000..b7540e7 --- /dev/null +++ b/backend/src/main/resources/init/callback-example/1.0.1_3.0.0_callback-example.yaml @@ -0,0 +1,61 @@ +openapi: 3.0.0 +info: + title: Callback Example + version: 1.0.1 +paths: + /streams: + post: + description: subscribes a client to receive out-of-band data + parameters: + - name: callbackUrl + in: query + required: true + description: | + the location where data will be sent. Must be network accessible + by the source server + schema: + type: string + format: uri + example: https://tonys-server.com + responses: + '201': + description: subscription successfully created + content: + application/json: + schema: + description: subscription information + required: + - subscriptionId + properties: + subscriptionId: + description: this unique identifier allows management of the subscription + type: string + example: 2531329f-fb09-4ef7-887e-84e648214436 + callbacks: + # the name `onData` is a convenience locator + onData: + # when data is sent, it will be sent to the `callbackUrl` provided + # when making the subscription PLUS the suffix `/data` + '{$request.query.callbackUrl}/data': + post: + requestBody: + description: subscription payload + content: + application/json: + schema: + type: object + properties: + timestamp: + type: string + format: date-time + userData: + type: string + responses: + '202': + description: | + Your server implementation should return this HTTP status code + if the data was received successfully + '204': + description: | + Your server should return this HTTP status code if no longer interested + in further updates diff --git a/backend/src/main/resources/init/callback-example/2.0.0_3.1.0_callback-example.yaml b/backend/src/main/resources/init/callback-example/2.0.0_3.1.0_callback-example.yaml new file mode 100644 index 0000000..77104a4 --- /dev/null +++ b/backend/src/main/resources/init/callback-example/2.0.0_3.1.0_callback-example.yaml @@ -0,0 +1,117 @@ +openapi: 3.1.0 +info: + title: Callback Example + version: 2.0.0 +paths: + /streams-old: + post: + description: OLD VERSION. subscribes a client to receive out-of-band data + parameters: + - name: callbackUrl + in: query + required: true + description: | + the location where data will be sent. Must be network accessible + by the source server + schema: + type: string + format: uri + example: https://tonys-server.com + responses: + '201': + description: subscription successfully created + content: + application/json: + schema: + description: subscription information + required: + - subscriptionId + properties: + subscriptionId: + description: this unique identifier allows management of the subscription + type: string + example: 2531329f-fb09-4ef7-887e-84e648214436 + callbacks: + # the name `onData` is a convenience locator + onData: + # when data is sent, it will be sent to the `callbackUrl` provided + # when making the subscription PLUS the suffix `/data` + '{$request.query.callbackUrl}/data': + post: + requestBody: + description: subscription payload + content: + application/json: + schema: + type: object + properties: + timestamp: + type: string + format: date-time + userData: + type: string + responses: + '202': + description: | + Your server implementation should return this HTTP status code + if the data was received successfully + '204': + description: | + Your server should return this HTTP status code if no longer interested + in further updates + /streams: + post: + description: NEW VERSION. subscribes a client to receive out-of-band data + parameters: + - name: callbackUrl + in: query + required: true + description: | + the location where data will be sent. Must be network accessible + by the source server + schema: + type: string + format: uri + example: https://tonys-server.com + responses: + '201': + description: subscription successfully created + content: + application/json: + schema: + description: subscription information + required: + - subscriptionId + properties: + subscriptionId: + description: this unique identifier allows management of the subscription + type: string + example: 2531329f-fb09-4ef7-887e-84e648214436 + callbacks: + # the name `onData` is a convenience locator + onData: + # when data is sent, it will be sent to the `callbackUrl` provided + # when making the subscription PLUS the suffix `/data` + '{$request.query.callbackUrl}/data': + post: + requestBody: + description: subscription payload + content: + application/json: + schema: + type: object + properties: + timestamp: + type: string + format: date-time + userData: + type: string + responses: + '202': + description: | + Your server implementation should return this HTTP status code + if the data was received successfully + '204': + description: | + Your server should return this HTTP status code if no longer interested + in further updates diff --git a/backend/src/main/resources/init/callback-example/2.0.1_3.1.0_callback-example-0.yaml b/backend/src/main/resources/init/callback-example/2.0.1_3.1.0_callback-example-0.yaml new file mode 100644 index 0000000..59aaa8e --- /dev/null +++ b/backend/src/main/resources/init/callback-example/2.0.1_3.1.0_callback-example-0.yaml @@ -0,0 +1,117 @@ +openapi: 3.1.0 +info: + title: Callback Example V2 + version: 2.0.1 +paths: + /streams-old: + post: + description: OLD VERSION + parameters: + - name: callbackUrl + in: query + required: true + description: | + the location where data will be sent. Must be network accessible + by the source server + schema: + type: string + format: uri + example: https://tonys-server.com + responses: + '201': + description: subscription successfully created + content: + application/json: + schema: + description: subscription information + required: + - subscriptionId + properties: + subscriptionId: + description: this unique identifier allows management of the subscription + type: string + example: 2531329f-fb09-4ef7-887e-84e648214436 + callbacks: + # the name `onData` is a convenience locator + onData: + # when data is sent, it will be sent to the `callbackUrl` provided + # when making the subscription PLUS the suffix `/data` + '{$request.query.callbackUrl}/data': + post: + requestBody: + description: subscription payload + content: + application/json: + schema: + type: object + properties: + timestamp: + type: string + format: date-time + userData: + type: string + responses: + '202': + description: | + Your server implementation should return this HTTP status code + if the data was received successfully + '204': + description: | + Your server should return this HTTP status code if no longer interested + in further updates + /streams: + post: + description: NEW VERSION. subscribes a client to receive out-of-band data + parameters: + - name: callbackUrl + in: query + required: true + description: | + the location where data will be sent. Must be network accessible + by the source server + schema: + type: string + format: uri + example: https://tonys-server.com + responses: + '201': + description: subscription successfully created + content: + application/json: + schema: + description: subscription information + required: + - subscriptionId + properties: + subscriptionId: + description: this unique identifier allows management of the subscription + type: string + example: 2531329f-fb09-4ef7-887e-84e648214436 + callbacks: + # the name `onData` is a convenience locator + onData: + # when data is sent, it will be sent to the `callbackUrl` provided + # when making the subscription PLUS the suffix `/data` + '{$request.query.callbackUrl}/data': + post: + requestBody: + description: subscription payload + content: + application/json: + schema: + type: object + properties: + timestamp: + type: string + format: date-time + userData: + type: string + responses: + '202': + description: | + Your server implementation should return this HTTP status code + if the data was received successfully + '204': + description: | + Your server should return this HTTP status code if no longer interested + in further updates diff --git a/backend/src/main/resources/init/callback-example/2.0.1_3.1.0_callback-example.yaml b/backend/src/main/resources/init/callback-example/2.0.1_3.1.0_callback-example.yaml new file mode 100644 index 0000000..f4e0801 --- /dev/null +++ b/backend/src/main/resources/init/callback-example/2.0.1_3.1.0_callback-example.yaml @@ -0,0 +1,117 @@ +openapi: 3.1.0 +info: + title: Callback Example V2 + version: 2.0.1 +paths: + /streams-old: + post: + description: OLD VERSION. subscribes a client to receive out-of-band data + parameters: + - name: callbackUrl + in: query + required: true + description: | + the location where data will be sent. Must be network accessible + by the source server + schema: + type: string + format: uri + example: https://tonys-server.com + responses: + '201': + description: subscription successfully created + content: + application/json: + schema: + description: subscription information + required: + - subscriptionId + properties: + subscriptionId: + description: this unique identifier allows management of the subscription + type: string + example: 2531329f-fb09-4ef7-887e-84e648214436 + callbacks: + # the name `onData` is a convenience locator + onData: + # when data is sent, it will be sent to the `callbackUrl` provided + # when making the subscription PLUS the suffix `/data` + '{$request.query.callbackUrl}/data': + post: + requestBody: + description: subscription payload + content: + application/json: + schema: + type: object + properties: + timestamp: + type: string + format: date-time + userData: + type: string + responses: + '202': + description: | + Your server implementation should return this HTTP status code + if the data was received successfully + '204': + description: | + Your server should return this HTTP status code if no longer interested + in further updates + /streams: + post: + description: NEW VERSION. subscribes a client to receive out-of-band data + parameters: + - name: callbackUrl + in: query + required: true + description: | + the location where data will be sent. Must be network accessible + by the source server + schema: + type: string + format: uri + example: https://tonys-server.com + responses: + '201': + description: subscription successfully created + content: + application/json: + schema: + description: subscription information + required: + - subscriptionId + properties: + subscriptionId: + description: this unique identifier allows management of the subscription + type: string + example: 2531329f-fb09-4ef7-887e-84e648214436 + callbacks: + # the name `onData` is a convenience locator + onData: + # when data is sent, it will be sent to the `callbackUrl` provided + # when making the subscription PLUS the suffix `/data` + '{$request.query.callbackUrl}/data': + post: + requestBody: + description: subscription payload + content: + application/json: + schema: + type: object + properties: + timestamp: + type: string + format: date-time + userData: + type: string + responses: + '202': + description: | + Your server implementation should return this HTTP status code + if the data was received successfully + '204': + description: | + Your server should return this HTTP status code if no longer interested + in further updates diff --git a/backend/src/main/resources/init/non-oauth-scopes/1.0.0_3.1.0_non-oauth-scopes.yaml b/backend/src/main/resources/init/non-oauth-scopes/1.0.0_3.1.0_non-oauth-scopes.yaml new file mode 100644 index 0000000..5b388af --- /dev/null +++ b/backend/src/main/resources/init/non-oauth-scopes/1.0.0_3.1.0_non-oauth-scopes.yaml @@ -0,0 +1,24 @@ +openapi: 3.1.0 +info: + title: Non-oAuth Scopes example + version: 1.0.0 +servers: + - url: /v1 + description: Run locally. + - url: https://production.com/v1 + description: Run on production server. +paths: + /users: + get: + security: + - bearerAuth: + - 'read:users' + - 'public' +components: + securitySchemes: + bearerAuth: + type: http + scheme: bearer + bearerFormat: jwt + description: 'note: non-oauth scopes are not defined at the securityScheme level' + diff --git a/backend/src/main/resources/init/partner-api/partner-api-v1.0.0.yaml b/backend/src/main/resources/init/partner-api/partner-api-v1.0.0.yaml new file mode 100644 index 0000000..7fa9950 --- /dev/null +++ b/backend/src/main/resources/init/partner-api/partner-api-v1.0.0.yaml @@ -0,0 +1,163 @@ +openapi: '3.0.2' +info: + title: Partner API + x-api-id: partner-api + version: '1.0.0' + description: | + ![Logo](https://www.predic8.de/logo6.png) + # Die Partner API in der Versicherung + Lore et ipsum blah blah + contact: + name: Thomas + email: bayer@predic8.de +servers: + - url: https://api.server.test/v1 +tags: + - name: Partner +paths: + /partner: + get: + tags: + - Partner + operationId: getPartners + summary: Liste der Partner + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/PartnerListe" + post: + tags: + - Partner + operationId: createPartner + summary: Lege neuen Partner an + requestBody: + $ref: "#/components/requestBodies/PartnerInput" + responses: + '201': + description: OK + headers: + Location: + schema: + type: string + description: URL des neu erzeugten Partners + content: + application/json: + schema: + $ref: "#/components/schemas/Partner" + /partner/{pid}: + parameters: + - name: pid + in: path + required: true + schema: + type: integer + get: + tags: + - Partner + operationId: getPartner + summary: Einzelner Partner + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/PartnerListe" + put: + tags: + - Partner + operationId: updatePartner + summary: Ändere Partner + requestBody: + $ref: "#/components/requestBodies/PartnerInput" + responses: + '200': + $ref: "#/components/responses/PartnerOutput" + delete: + tags: + - Partner + operationId: deletePartner + summary: Lösche Partner + responses: + '200': + description: OK + 'default': + $ref: "#/components/responses/ProblemJSON" + +components: + responses: + ProblemJSON: + description: Bad Request + content: + application/problem+json: + schema: + type: object + properties: + title: + type: string + maxLength: 100 + pattern: "/w*" + type: + type: string + maxLength: 100 + pattern: "/w*" + PartnerOutput: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/Partner" + requestBodies: + PartnerInput: + content: + application/json: + schema: + $ref: "#/components/schemas/Partner" + schemas: + PartnerListe: + type: object + properties: + meta: + type: object + properties: + count: + type: integer + format: int32 + partner: + type: array + items: + $ref: "#/components/schemas/Partner" + Partner: + type: object + required: + - id + - vorname + properties: + id: + type: string + format: uuid + readOnly: true + maxLength: 100 + vorname: + type: string + minLength: 3 + maxLength: 100 + description: Vorname des Partners + example: Herbert + pattern: ".*" + foto: + type: string + format: url + example: http://predic8.de/bucket/21213 + pattern: ".*" + kontakte: + type: array + items: + type: string + format: email + example: bayer@predic8.de + pattern: ".*" + maxItems: 10 \ No newline at end of file diff --git a/backend/src/main/resources/init/partner-api/partner-api-v1.0.1.yaml b/backend/src/main/resources/init/partner-api/partner-api-v1.0.1.yaml new file mode 100644 index 0000000..83ba882 --- /dev/null +++ b/backend/src/main/resources/init/partner-api/partner-api-v1.0.1.yaml @@ -0,0 +1,164 @@ +openapi: '3.0.2' +info: + title: Partner API für Versicherungen + x-api-id: partner-api + version: '1.0.1' + description: | + ![Logo](https://www.predic8.de/logo6.png) + # Die Partner API in der Versicherung + Lore et ipsum blah blah + contact: + name: Thomas + email: bayer@predic8.de +servers: + - url: https://api.server.test/v1 +tags: + - name: Partner + - name: Vertrag +paths: + /partner: + get: + tags: + - Partner + operationId: getPartners + summary: Liste der Partner + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/PartnerListe" + post: + tags: + - Partner + operationId: createPartner + summary: Lege neuen Partner an + requestBody: + $ref: "#/components/requestBodies/PartnerInput" + responses: + '201': + description: OK + headers: + Location: + schema: + type: string + description: URL des neu erzeugten Partners + content: + application/json: + schema: + $ref: "#/components/schemas/Partner" + /partner/{pid}: + parameters: + - name: pid + in: path + required: true + schema: + type: integer + get: + tags: + - Partner + operationId: getPartner + summary: Einzelner Partner + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/PartnerListe" + put: + tags: + - Partner + operationId: updatePartner + summary: Ändere Partner + requestBody: + $ref: "#/components/requestBodies/PartnerInput" + responses: + '200': + $ref: "#/components/responses/PartnerOutput" + delete: + tags: + - Partner + operationId: deletePartner + summary: Lösche Partner + responses: + '200': + description: OK + 'default': + $ref: "#/components/responses/ProblemJSON" + +components: + responses: + ProblemJSON: + description: Bad Request + content: + application/problem+json: + schema: + type: object + properties: + title: + type: string + maxLength: 100 + pattern: "/w*" + type: + type: string + maxLength: 100 + pattern: "/w*" + PartnerOutput: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/Partner" + requestBodies: + PartnerInput: + content: + application/json: + schema: + $ref: "#/components/schemas/Partner" + schemas: + PartnerListe: + type: object + properties: + meta: + type: object + properties: + count: + type: integer + format: int32 + partner: + type: array + items: + $ref: "#/components/schemas/Partner" + Partner: + type: object + required: + - id + - vorname + properties: + id: + type: string + format: uuid + readOnly: true + maxLength: 100 + vorname: + type: string + minLength: 3 + maxLength: 100 + description: Vorname des Partners + example: Paul + pattern: ".*" + foto: + type: string + format: url + example: http://predic8.de/bucket/21213 + pattern: ".*" + kontakte: + type: array + items: + type: string + format: email + example: bayer@predic8.de + pattern: ".*" + maxItems: 10 \ No newline at end of file diff --git a/backend/src/main/resources/init/partner-api/partner-api-v1.1.0.yaml b/backend/src/main/resources/init/partner-api/partner-api-v1.1.0.yaml new file mode 100644 index 0000000..a043757 --- /dev/null +++ b/backend/src/main/resources/init/partner-api/partner-api-v1.1.0.yaml @@ -0,0 +1,170 @@ +openapi: '3.0.2' +info: + title: Partner API für Versicherungen + x-api-id: partner-api + version: '1.1.0' + description: | + ![Logo](https://www.predic8.de/logo6.png) + # Die Partner API in der Versicherung + Lore et ipsum blah blah + contact: + name: Thomas + email: bayer@predic8.de +servers: + - url: https://api.server.test/v1 +tags: + - name: Partner + - name: Vertrag +paths: + /partner: + get: + tags: + - Partner + operationId: getPartners + summary: Liste der Partner + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/PartnerListe" + post: + tags: + - Partner + operationId: createPartner + summary: Lege neuen Partner an + requestBody: + $ref: "#/components/requestBodies/PartnerInput" + responses: + '201': + description: OK + headers: + Location: + schema: + type: string + description: URL des neu erzeugten Partners + content: + application/json: + schema: + $ref: "#/components/schemas/Partner" + /partner/{pid}: + parameters: + - name: pid + in: path + required: true + schema: + type: integer + get: + tags: + - Partner + operationId: getPartner + summary: Einzelner Partner + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/PartnerListe" + put: + tags: + - Partner + operationId: updatePartner + summary: Ändere Partner + requestBody: + $ref: "#/components/requestBodies/PartnerInput" + responses: + '200': + $ref: "#/components/responses/PartnerOutput" + delete: + tags: + - Partner + operationId: deletePartner + summary: Lösche Partner + responses: + '200': + description: OK + 'default': + $ref: "#/components/responses/ProblemJSON" + +components: + responses: + ProblemJSON: + description: Bad Request + content: + application/problem+json: + schema: + type: object + properties: + title: + type: string + maxLength: 100 + pattern: "/w*" + type: + type: string + maxLength: 100 + pattern: "/w*" + PartnerOutput: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/Partner" + requestBodies: + PartnerInput: + content: + application/json: + schema: + $ref: "#/components/schemas/Partner" + schemas: + PartnerListe: + type: object + properties: + meta: + type: object + properties: + count: + type: integer + format: int32 + partner: + type: array + items: + $ref: "#/components/schemas/Partner" + Partner: + type: object + required: + - id + - vorname + properties: + id: + type: string + format: uuid + readOnly: true + maxLength: 100 + vorname: + type: string + minLength: 3 + maxLength: 100 + description: Vorname des Partners + example: Paul + pattern: ".*" + title: + type: string + enum: + - Frau + - Herr + - Anders + foto: + type: string + format: url + example: http://predic8.de/bucket/21213 + pattern: ".*" + kontakte: + type: array + items: + type: string + format: email + example: bayer@predic8.de + pattern: ".*" + maxItems: 10 \ No newline at end of file diff --git a/backend/src/main/resources/init/partner-api/partner-api-v1.2.0-0.yaml b/backend/src/main/resources/init/partner-api/partner-api-v1.2.0-0.yaml new file mode 100644 index 0000000..eee8097 --- /dev/null +++ b/backend/src/main/resources/init/partner-api/partner-api-v1.2.0-0.yaml @@ -0,0 +1,208 @@ +openapi: '3.0.2' +info: + title: Partner API für Versicherungen + x-api-id: partner-api + version: '1.2.0' + description: | + ![Logo](https://www.predic8.de/logo6.png) + # Die Partner API in der Versicherung + Lore et ipsum blah blah + contact: + name: Thomas + email: bayer@predic8.de +servers: + - url: https://api.server.test/v1 +tags: + - name: Partner + - name: Vertrag +paths: + /partners: + get: + tags: + - Partner + operationId: getPartners + summary: Liste der Partner + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/PartnerListe" + post: + tags: + - Partner + operationId: createPartner + summary: Lege neuen Partner an + requestBody: + $ref: "#/components/requestBodies/PartnerInput" + responses: + '201': + description: OK + headers: + Location: + schema: + type: string + description: URL des neu erzeugten Partners + content: + application/json: + schema: + $ref: "#/components/schemas/Partner" + + /partner: + get: + tags: + - Partner + deprecated: true + x-sunset: "2024-07-31" + description: "**Deprecated** Bitte /partners verwenden" + operationId: getPartners + summary: Liste der Partner + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/PartnerListe" + post: + tags: + - Partner + operationId: createPartner + deprecated: true + x-sunset: "2024-07-31" + summary: Lege neuen Partner an + requestBody: + $ref: "#/components/requestBodies/PartnerInput" + responses: + '201': + description: OK + headers: + Location: + schema: + type: string + description: URL des neu erzeugten Partners + content: + application/json: + schema: + $ref: "#/components/schemas/Partner" + /partner/{pid}: + parameters: + - name: pid + in: path + required: true + schema: + type: integer + get: + tags: + - Partner + operationId: getPartner + summary: Einzelner Partner + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/PartnerListe" + put: + tags: + - Partner + operationId: updatePartner + summary: Ändere Partner + requestBody: + $ref: "#/components/requestBodies/PartnerInput" + responses: + '200': + $ref: "#/components/responses/PartnerOutput" + delete: + tags: + - Partner + operationId: deletePartner + summary: Lösche Partner + responses: + '200': + description: OK + 'default': + $ref: "#/components/responses/ProblemJSON" + +components: + responses: + ProblemJSON: + description: Bad Request + content: + application/problem+json: + schema: + type: object + properties: + title: + type: string + maxLength: 100 + pattern: "/w*" + type: + type: string + maxLength: 100 + pattern: "/w*" + PartnerOutput: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/Partner" + requestBodies: + PartnerInput: + content: + application/json: + schema: + $ref: "#/components/schemas/Partner" + schemas: + PartnerListe: + type: object + properties: + meta: + type: object + properties: + count: + type: integer + format: int32 + partner: + type: array + items: + $ref: "#/components/schemas/Partner" + Partner: + type: object + required: + - id + - vorname + properties: + id: + type: string + format: uuid + readOnly: true + maxLength: 100 + vorname: + type: string + minLength: 3 + maxLength: 99 + description: Vorname des Partners + example: Paul + pattern: ".*" + title: + type: string + enum: + - Frau + - Herr + - Anders + foto: + type: string + format: url + example: http://predic8.de/bucket/21213 + pattern: ".*" + kontakte: + type: array + items: + type: string + format: email + example: bayer@predic8.de + pattern: ".*" + maxItems: 10 \ No newline at end of file diff --git a/backend/src/main/resources/init/partner-api/partner-api-v1.2.0.yaml b/backend/src/main/resources/init/partner-api/partner-api-v1.2.0.yaml new file mode 100644 index 0000000..eee8097 --- /dev/null +++ b/backend/src/main/resources/init/partner-api/partner-api-v1.2.0.yaml @@ -0,0 +1,208 @@ +openapi: '3.0.2' +info: + title: Partner API für Versicherungen + x-api-id: partner-api + version: '1.2.0' + description: | + ![Logo](https://www.predic8.de/logo6.png) + # Die Partner API in der Versicherung + Lore et ipsum blah blah + contact: + name: Thomas + email: bayer@predic8.de +servers: + - url: https://api.server.test/v1 +tags: + - name: Partner + - name: Vertrag +paths: + /partners: + get: + tags: + - Partner + operationId: getPartners + summary: Liste der Partner + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/PartnerListe" + post: + tags: + - Partner + operationId: createPartner + summary: Lege neuen Partner an + requestBody: + $ref: "#/components/requestBodies/PartnerInput" + responses: + '201': + description: OK + headers: + Location: + schema: + type: string + description: URL des neu erzeugten Partners + content: + application/json: + schema: + $ref: "#/components/schemas/Partner" + + /partner: + get: + tags: + - Partner + deprecated: true + x-sunset: "2024-07-31" + description: "**Deprecated** Bitte /partners verwenden" + operationId: getPartners + summary: Liste der Partner + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/PartnerListe" + post: + tags: + - Partner + operationId: createPartner + deprecated: true + x-sunset: "2024-07-31" + summary: Lege neuen Partner an + requestBody: + $ref: "#/components/requestBodies/PartnerInput" + responses: + '201': + description: OK + headers: + Location: + schema: + type: string + description: URL des neu erzeugten Partners + content: + application/json: + schema: + $ref: "#/components/schemas/Partner" + /partner/{pid}: + parameters: + - name: pid + in: path + required: true + schema: + type: integer + get: + tags: + - Partner + operationId: getPartner + summary: Einzelner Partner + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/PartnerListe" + put: + tags: + - Partner + operationId: updatePartner + summary: Ändere Partner + requestBody: + $ref: "#/components/requestBodies/PartnerInput" + responses: + '200': + $ref: "#/components/responses/PartnerOutput" + delete: + tags: + - Partner + operationId: deletePartner + summary: Lösche Partner + responses: + '200': + description: OK + 'default': + $ref: "#/components/responses/ProblemJSON" + +components: + responses: + ProblemJSON: + description: Bad Request + content: + application/problem+json: + schema: + type: object + properties: + title: + type: string + maxLength: 100 + pattern: "/w*" + type: + type: string + maxLength: 100 + pattern: "/w*" + PartnerOutput: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/Partner" + requestBodies: + PartnerInput: + content: + application/json: + schema: + $ref: "#/components/schemas/Partner" + schemas: + PartnerListe: + type: object + properties: + meta: + type: object + properties: + count: + type: integer + format: int32 + partner: + type: array + items: + $ref: "#/components/schemas/Partner" + Partner: + type: object + required: + - id + - vorname + properties: + id: + type: string + format: uuid + readOnly: true + maxLength: 100 + vorname: + type: string + minLength: 3 + maxLength: 99 + description: Vorname des Partners + example: Paul + pattern: ".*" + title: + type: string + enum: + - Frau + - Herr + - Anders + foto: + type: string + format: url + example: http://predic8.de/bucket/21213 + pattern: ".*" + kontakte: + type: array + items: + type: string + format: email + example: bayer@predic8.de + pattern: ".*" + maxItems: 10 \ No newline at end of file diff --git a/backend/src/test/kotlin/de/predic8/openapicatalogbackend/OpenapiCatalogBackendApplicationTests.kt b/backend/src/test/kotlin/de/predic8/openapicatalogbackend/OpenapiCatalogBackendApplicationTests.kt new file mode 100644 index 0000000..63e1ee3 --- /dev/null +++ b/backend/src/test/kotlin/de/predic8/openapicatalogbackend/OpenapiCatalogBackendApplicationTests.kt @@ -0,0 +1,11 @@ +package de.predic8.openapicatalogbackend + +import org.junit.jupiter.api.Test +import org.springframework.boot.test.context.SpringBootTest + +@SpringBootTest +class OpenapiCatalogBackendApplicationTests { + @Test + fun contextLoads() { + } +} diff --git a/frontend/.editorconfig b/frontend/.editorconfig new file mode 100644 index 0000000..9d08a1a --- /dev/null +++ b/frontend/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..f1d913c --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,33 @@ +.DS_Store +.thumbs.db +node_modules + +# Quasar core related directories +.quasar +/dist +/quasar.config.*.temporary.compiled* + +# Cordova related directories and files +/src-cordova/node_modules +/src-cordova/platforms +/src-cordova/plugins +/src-cordova/www + +# Capacitor related directories and files +/src-capacitor/www +/src-capacitor/node_modules + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.idea +*.suo +*.ntvs* +*.njsproj +*.sln + +# local .env files +.env.local* diff --git a/frontend/.husky/commit-msg b/frontend/.husky/commit-msg new file mode 100644 index 0000000..3d69b22 --- /dev/null +++ b/frontend/.husky/commit-msg @@ -0,0 +1 @@ +pnpm commitlint --edit "${1}" diff --git a/frontend/.husky/pre-commit b/frontend/.husky/pre-commit new file mode 100644 index 0000000..cb2c84d --- /dev/null +++ b/frontend/.husky/pre-commit @@ -0,0 +1 @@ +pnpm lint-staged diff --git a/frontend/.npmrc b/frontend/.npmrc new file mode 100644 index 0000000..6c59086 --- /dev/null +++ b/frontend/.npmrc @@ -0,0 +1 @@ +enable-pre-post-scripts=true diff --git a/frontend/.prettierrc b/frontend/.prettierrc new file mode 100644 index 0000000..a8f919f --- /dev/null +++ b/frontend/.prettierrc @@ -0,0 +1,13 @@ +{ + "overrides": [ + { + "files": "pnpm-lock.yaml", + "options": { + "rangeEnd": 0 + } + } + ], + "printWidth": 220, + "semi": false, + "singleQuote": true +} diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..c7b99ef --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,23 @@ +# OpenAPI-Catalog Frontend (openapi-catalog-frontend) + +Frontend of the OpenAPI-Catalog + +## Install the dependencies + +`pnpm install` + +### Start the app in development mode (hot-code reloading, error reporting, etc.) + +`quasar dev` + +### Lint files + +`pnpm lint` + +### Build the app for production + +`quasar build` + +### Customize the configuration + +See [Configuring quasar.config.js](https://v2.quasar.dev/quasar-cli-vite/quasar-config-js). diff --git a/frontend/commitlint.config.ts b/frontend/commitlint.config.ts new file mode 100644 index 0000000..7c4ff4d --- /dev/null +++ b/frontend/commitlint.config.ts @@ -0,0 +1 @@ +export default { extends: ['@commitlint/config-conventional'] } diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js new file mode 100644 index 0000000..af5a1ae --- /dev/null +++ b/frontend/eslint.config.js @@ -0,0 +1,64 @@ +import js from '@eslint/js' +import globals from 'globals' +import eslintPluginPrettier from 'eslint-plugin-prettier/recommended' +import tslint from 'typescript-eslint' +import vuePlugin from 'eslint-plugin-vue' + +export default tslint.config( + /* + * Rules order is important, please avoid shuffling them + * Base ESLint recommended rules + */ + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-member-access + js.configs.recommended, + /* + * https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin#usage + * ESLint typescript rules + */ + ...tslint.configs.strictTypeChecked, + ...tslint.configs.stylisticTypeChecked, + // See https://eslint.vuejs.org/rules/#available-rules + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-member-access + ...vuePlugin.configs['flat/recommended'], + /* + * https://github.com/prettier/eslint-config-prettier#installation + * usage with Prettier, provided by 'eslint-config-prettier'. + */ + eslintPluginPrettier, + { ignores: ['.quasar/**', 'dist/**', 'node_modules/**'] }, + { + languageOptions: { + // global variables + globals: { + ...globals.browser, + ...globals.es2025, + ...globals.nodeBuiltin, + Capacitor: 'readonly', + __QUASAR_SSR_CLIENT__: 'readonly', + __QUASAR_SSR_PWA__: 'readonly', + __QUASAR_SSR_SERVER__: 'readonly', + __QUASAR_SSR__: 'readonly', + __statics: 'readonly', + chrome: 'readonly', + cordova: 'readonly', + // Google Analytics + ga: 'readonly', + process: 'readonly', + }, + /* + * https://eslint.vuejs.org/user-guide/#how-to-use-a-custom-parser + * Must use parserOptions instead of "parser" to allow vue-eslint-parser to keep working + * `parser: 'vue-eslint-parser'` is already included with any 'plugin:vue/**' config and should be omitted + */ + parserOptions: { + ecmaVersion: 'latest', + extraFileExtensions: ['.vue'], + parser: tslint.parser, + project: true, + sourceType: 'module', + }, + }, + // Add your custom rules here + rules: {}, + }, +) diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..9ed43bc --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,21 @@ + + + + <%= productName %> + + + + + + + + + + + + + + + + + diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..2a7001e --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,66 @@ +{ + "name": "openapi-catalog-frontend", + "version": "1.0.0", + "description": "Frontend of the OpenAPI-Catalog", + "productName": "OpenAPI-Catalog Frontend", + "author": "Martin Dünkelmann ", + "type": "module", + "packageManager": "pnpm@9.8.0+sha512.8e4c3550fb500e808dbc30bb0ce4dd1eb614e30b1c55245f211591ec2cdf9c611cabd34e1364b42f564bd54b3945ed0f49d61d1bbf2ec9bd74b866fcdc723276", + "private": true, + "scripts": { + "build": "quasar build", + "predev": "corepack use pnpm@* && pnpm lint", + "dev": "quasar dev", + "preinstall": "npx only-allow pnpm", + "lint": "pnpm lint:js && pnpm lint:prettier", + "lint:js": "eslint --cache --cache-location node_modules/.cache/.eslintcache --fix .", + "lint:prettier": "prettier --cache --cache-location node_modules/.cache/.prettiercache --ignore-path .gitignore --list-different --write '**/*.{js,ts,vue,scss,html,md,json}' .", + "prepare": "husky", + "test": "echo \"No test specified\" && exit 0" + }, + "dependencies": { + "@quasar/extras": "^1.16.12", + "@quasar/quasar-ui-qmarkdown": "^2.0.0-beta.10", + "pinia": "^2.2.2", + "quasar": "^2.16.9", + "swagger-ui": "^5.17.14", + "vue": "^3.4.38", + "vue-router": "^4.4.3" + }, + "devDependencies": { + "@commitlint/cli": "19.4.0", + "@commitlint/config-conventional": "19.2.2", + "@eslint/js": "9.9.0", + "@quasar/app-vite": "2.0.0-beta.19", + "@quasar/quasar-app-extension-qmarkdown": "2.0.0-beta.10", + "@types/node": "22.5.0", + "@types/swagger-ui": "3.52.4", + "autoprefixer": "10.4.20", + "eslint": "9.9.0", + "eslint-config-prettier": "9.1.0", + "eslint-plugin-prettier": "5.2.1", + "eslint-plugin-vue": "9.27.0", + "globals": "15.9.0", + "husky": "9.1.5", + "lint-staged": "15.2.9", + "prettier": "3.3.3", + "ts-node": "10.9.2", + "typescript": "5.5.4", + "typescript-eslint": "8.2.0", + "vite-plugin-checker": "0.7.2", + "vue-tsc": "2.0.29", + "yaml": "2.5.0" + }, + "gitHooks": { + "pre-commit": "lint-staged" + }, + "lint-staged": { + "*.**": [ + "eslint --fix", + "prettier --ignore-unknown --write" + ] + }, + "browserslist": [ + "defaults" + ] +} diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml new file mode 100644 index 0000000..8f2fe3b --- /dev/null +++ b/frontend/pnpm-lock.yaml @@ -0,0 +1,7648 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@quasar/extras': + specifier: ^1.16.12 + version: 1.16.12 + '@quasar/quasar-ui-qmarkdown': + specifier: ^2.0.0-beta.10 + version: 2.0.0-beta.10 + pinia: + specifier: ^2.2.2 + version: 2.2.2(typescript@5.5.4)(vue@3.4.38(typescript@5.5.4)) + quasar: + specifier: ^2.16.9 + version: 2.16.9 + swagger-ui: + specifier: ^5.17.14 + version: 5.17.14(ramda@0.30.1) + vue: + specifier: ^3.4.38 + version: 3.4.38(typescript@5.5.4) + vue-router: + specifier: ^4.4.3 + version: 4.4.3(vue@3.4.38(typescript@5.5.4)) + devDependencies: + '@commitlint/cli': + specifier: 19.4.0 + version: 19.4.0(@types/node@22.5.0)(typescript@5.5.4) + '@commitlint/config-conventional': + specifier: 19.2.2 + version: 19.2.2 + '@eslint/js': + specifier: 9.9.0 + version: 9.9.0 + '@quasar/app-vite': + specifier: 2.0.0-beta.19 + version: 2.0.0-beta.19(@types/node@22.5.0)(eslint@9.9.0(jiti@1.21.6))(pinia@2.2.2(typescript@5.5.4)(vue@3.4.38(typescript@5.5.4)))(quasar@2.16.9)(rollup@4.21.0)(terser@5.31.6)(typescript@5.5.4)(vue-router@4.4.3(vue@3.4.38(typescript@5.5.4)))(vue@3.4.38(typescript@5.5.4)) + '@quasar/quasar-app-extension-qmarkdown': + specifier: 2.0.0-beta.10 + version: 2.0.0-beta.10(webpack@5.91.0) + '@types/node': + specifier: 22.5.0 + version: 22.5.0 + '@types/swagger-ui': + specifier: 3.52.4 + version: 3.52.4 + autoprefixer: + specifier: 10.4.20 + version: 10.4.20(postcss@8.4.41) + eslint: + specifier: 9.9.0 + version: 9.9.0(jiti@1.21.6) + eslint-config-prettier: + specifier: 9.1.0 + version: 9.1.0(eslint@9.9.0(jiti@1.21.6)) + eslint-plugin-prettier: + specifier: 5.2.1 + version: 5.2.1(@types/eslint@9.6.0)(eslint-config-prettier@9.1.0(eslint@9.9.0(jiti@1.21.6)))(eslint@9.9.0(jiti@1.21.6))(prettier@3.3.3) + eslint-plugin-vue: + specifier: 9.27.0 + version: 9.27.0(eslint@9.9.0(jiti@1.21.6)) + globals: + specifier: 15.9.0 + version: 15.9.0 + husky: + specifier: 9.1.5 + version: 9.1.5 + lint-staged: + specifier: 15.2.9 + version: 15.2.9 + prettier: + specifier: 3.3.3 + version: 3.3.3 + ts-node: + specifier: 10.9.2 + version: 10.9.2(@types/node@22.5.0)(typescript@5.5.4) + typescript: + specifier: 5.5.4 + version: 5.5.4 + typescript-eslint: + specifier: 8.2.0 + version: 8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) + vite-plugin-checker: + specifier: 0.7.2 + version: 0.7.2(eslint@9.9.0(jiti@1.21.6))(optionator@0.9.4)(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.0)(sass@1.77.8)(terser@5.31.6))(vue-tsc@2.0.29(typescript@5.5.4)) + vue-tsc: + specifier: 2.0.29 + version: 2.0.29(typescript@5.5.4) + yaml: + specifier: 2.5.0 + version: 2.5.0 + +packages: + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.25.4': + resolution: {integrity: sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime-corejs3@7.25.0': + resolution: {integrity: sha512-BOehWE7MgQ8W8Qn0CQnMtg2tHPHPulcS/5AVpFvs2KCK1ET+0WqZqPvnpRpFN81gYoFopdIEJX9Sgjw3ZBccPg==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.25.4': + resolution: {integrity: sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.25.4': + resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==} + engines: {node: '>=6.9.0'} + + '@braintree/sanitize-url@7.0.2': + resolution: {integrity: sha512-NVf/1YycDMs6+FxS0Tb/W8MjJRDQdXF+tBfDtZ5UZeiRUkTmwKc4vmYCKZTyymfJk1gnMsauvZSX/HiV9jOABw==} + + '@commitlint/cli@19.4.0': + resolution: {integrity: sha512-sJX4J9UioVwZHq7JWM9tjT5bgWYaIN3rC4FP7YwfEwBYiIO+wMyRttRvQLNkow0vCdM0D67r9NEWU0Ui03I4Eg==} + engines: {node: '>=v18'} + hasBin: true + + '@commitlint/config-conventional@19.2.2': + resolution: {integrity: sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw==} + engines: {node: '>=v18'} + + '@commitlint/config-validator@19.0.3': + resolution: {integrity: sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==} + engines: {node: '>=v18'} + + '@commitlint/ensure@19.0.3': + resolution: {integrity: sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==} + engines: {node: '>=v18'} + + '@commitlint/execute-rule@19.0.0': + resolution: {integrity: sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==} + engines: {node: '>=v18'} + + '@commitlint/format@19.3.0': + resolution: {integrity: sha512-luguk5/aF68HiF4H23ACAfk8qS8AHxl4LLN5oxPc24H+2+JRPsNr1OS3Gaea0CrH7PKhArBMKBz5RX9sA5NtTg==} + engines: {node: '>=v18'} + + '@commitlint/is-ignored@19.2.2': + resolution: {integrity: sha512-eNX54oXMVxncORywF4ZPFtJoBm3Tvp111tg1xf4zWXGfhBPKpfKG6R+G3G4v5CPlRROXpAOpQ3HMhA9n1Tck1g==} + engines: {node: '>=v18'} + + '@commitlint/lint@19.2.2': + resolution: {integrity: sha512-xrzMmz4JqwGyKQKTpFzlN0dx0TAiT7Ran1fqEBgEmEj+PU98crOFtysJgY+QdeSagx6EDRigQIXJVnfrI0ratA==} + engines: {node: '>=v18'} + + '@commitlint/load@19.4.0': + resolution: {integrity: sha512-I4lCWaEZYQJ1y+Y+gdvbGAx9pYPavqZAZ3/7/8BpWh+QjscAn8AjsUpLV2PycBsEx7gupq5gM4BViV9xwTIJuw==} + engines: {node: '>=v18'} + + '@commitlint/message@19.0.0': + resolution: {integrity: sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==} + engines: {node: '>=v18'} + + '@commitlint/parse@19.0.3': + resolution: {integrity: sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==} + engines: {node: '>=v18'} + + '@commitlint/read@19.4.0': + resolution: {integrity: sha512-r95jLOEZzKDakXtnQub+zR3xjdnrl2XzerPwm7ch1/cc5JGq04tyaNpa6ty0CRCWdVrk4CZHhqHozb8yZwy2+g==} + engines: {node: '>=v18'} + + '@commitlint/resolve-extends@19.1.0': + resolution: {integrity: sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==} + engines: {node: '>=v18'} + + '@commitlint/rules@19.0.3': + resolution: {integrity: sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==} + engines: {node: '>=v18'} + + '@commitlint/to-lines@19.0.0': + resolution: {integrity: sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==} + engines: {node: '>=v18'} + + '@commitlint/top-level@19.0.0': + resolution: {integrity: sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==} + engines: {node: '>=v18'} + + '@commitlint/types@19.0.3': + resolution: {integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==} + engines: {node: '>=v18'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.17.1': + resolution: {integrity: sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.1.0': + resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.9.0': + resolution: {integrity: sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.0': + resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} + engines: {node: '>=18.18'} + + '@inquirer/figures@1.0.5': + resolution: {integrity: sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==} + engines: {node: '>=18'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@quasar/app-vite@2.0.0-beta.19': + resolution: {integrity: sha512-6hVhSN6vUJgayv4Nj07OnifSgjJUMO4ImAFnw7Atg1g1boih7ye+hzDJNLLzm8dQbSApLAOhQI5/7LzSHHld8Q==} + engines: {node: ^30 || ^28 || ^26 || ^24 || ^22 || ^20 || ^18, npm: '>= 6.14.12', yarn: '>= 1.17.3'} + hasBin: true + peerDependencies: + '@electron/packager': '>= 18' + electron-builder: '>= 22' + eslint: '*' + pinia: ^2.0.0 + quasar: ^2.16.0 + vue: ^3.2.29 + vue-router: ^4.0.12 + vuex: ^4.0.0 + workbox-build: '>= 6' + peerDependenciesMeta: + '@electron/packager': + optional: true + electron-builder: + optional: true + eslint: + optional: true + pinia: + optional: true + vuex: + optional: true + workbox-build: + optional: true + + '@quasar/extras@1.16.12': + resolution: {integrity: sha512-hLlb3Buxo38Xg/2w0BTkz98RBh/VH8apZ2r6Fl8YpPgrVQ0diHyN/BVTvIOk5Kch2y38L2kvwOIddsB2UcCuIg==} + + '@quasar/quasar-app-extension-qmarkdown@2.0.0-beta.10': + resolution: {integrity: sha512-D/2/oxMiNM19D7p1xAkWG5ptW3IzXmLwGtmtqbDJ0gmtzYvkqQxzimdst9uUyZs6G3jmMQSdCN6mJ/iZcyw38g==} + + '@quasar/quasar-ui-qmarkdown@2.0.0-beta.10': + resolution: {integrity: sha512-dglYq169H7SQ14eR0mm/Rp+k5gftkSmZyd/3vIH4M94Z/3z2eys4Ch620VhM4oFuxnUUumXYxvs66IQDx3272g==} + + '@quasar/render-ssr-error@1.0.3': + resolution: {integrity: sha512-A8RF99q6/sOSe1Ighnh5syEIbliD3qUYEJd2HyfFyBPSMF+WYGXon5dmzg4nUoK662NgOggInevkDyBDJcZugg==} + engines: {node: '>= 16'} + + '@quasar/ssl-certificate@1.0.0': + resolution: {integrity: sha512-RhZF7rO76T7Ywer1/5lCe7xl3CIiXxSAH1xgwOj0wcHTityDxJqIN/5YIj6BxMvlFw8XkJDoB1udEQafoVFA4g==} + engines: {node: '>= 16'} + + '@quasar/vite-plugin@1.7.0': + resolution: {integrity: sha512-ia4w1n4DuPYm92MQLPNpMqLJID1WGGRyVGxkVeg8V+V25Vh3p9QBo++iuXR4sW/bCmzzx66Ko6VStsr1zp90GQ==} + engines: {node: '>=18'} + peerDependencies: + '@vitejs/plugin-vue': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + quasar: ^2.16.0 + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + vue: ^3.0.0 + + '@rollup/rollup-android-arm-eabi@4.21.0': + resolution: {integrity: sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.21.0': + resolution: {integrity: sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.21.0': + resolution: {integrity: sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.21.0': + resolution: {integrity: sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.21.0': + resolution: {integrity: sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.21.0': + resolution: {integrity: sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.21.0': + resolution: {integrity: sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.21.0': + resolution: {integrity: sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': + resolution: {integrity: sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.21.0': + resolution: {integrity: sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.21.0': + resolution: {integrity: sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.21.0': + resolution: {integrity: sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.21.0': + resolution: {integrity: sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.21.0': + resolution: {integrity: sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.21.0': + resolution: {integrity: sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.21.0': + resolution: {integrity: sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==} + cpu: [x64] + os: [win32] + + '@swagger-api/apidom-ast@1.0.0-alpha.9': + resolution: {integrity: sha512-SAOQrFSFwgDiI4QSIPDwAIJEb4Za+8bu45sNojgV3RMtCz+n4Agw66iqGsDib5YSI/Cg1h4AKFovT3iWdfGWfw==} + + '@swagger-api/apidom-core@1.0.0-alpha.9': + resolution: {integrity: sha512-vGl8BWRf6ODl39fxElcIOjRE2QG5AJhn8tTNMqjjHB/2WppNBuxOVStYZeVJoWfK03OPK8v4Fp/TAcaP9+R7DQ==} + + '@swagger-api/apidom-error@1.0.0-alpha.9': + resolution: {integrity: sha512-FU/2sFSgsICB9HYFELJ79caRpXXzlAV41QTHsAM46WfRehbzZUQpOBQm4jRi3qJGSa/Jk+mQ7Vt8HLRFMpJFfg==} + + '@swagger-api/apidom-json-pointer@1.0.0-alpha.9': + resolution: {integrity: sha512-/W8Ktbgbs29zdhed6KHTFk0qmuIRbvEFi8wu2MHGQ5UT4i99Bdu2OyUiayhnpejWztfQxDgL08pjrQPEwgY8Yg==} + + '@swagger-api/apidom-ns-api-design-systems@1.0.0-alpha.9': + resolution: {integrity: sha512-aduC2vbwGgn6ia9IkKpqBYBaKyIDGM/80M3oU3DFgaYIIwynzuwVpN1TkBOLIFy3mAzkWoYKUS0jdZJhMy/6Ug==} + + '@swagger-api/apidom-ns-asyncapi-2@1.0.0-alpha.9': + resolution: {integrity: sha512-hZjxXJgMt517ADnAauWJh01k7WNRwkbWT5p6b7AXF2H3tl549A2hhLnIg3BBSE3GwB3Nv25GyrI3aA/1dFVC8A==} + + '@swagger-api/apidom-ns-json-schema-draft-4@1.0.0-alpha.9': + resolution: {integrity: sha512-OfX4UBb08C0xD5+F80dQAM2yt5lXxcURWkVEeCwxz7i23BB3nNEbnZXNV91Qo9eaJflPh8dO9iiHQxvfw5IgSg==} + + '@swagger-api/apidom-ns-json-schema-draft-6@1.0.0-alpha.9': + resolution: {integrity: sha512-qzUVRSSrnlYGMhK6w57o/RboNvy1FO0iFgEnTk56dD4wN49JRNuFqKI18IgXc1W2r9tTTG70nG1khe4cPE8TNg==} + + '@swagger-api/apidom-ns-json-schema-draft-7@1.0.0-alpha.9': + resolution: {integrity: sha512-Zml8Z8VCckdFjvTogaec1dabd85hg1+xZDseWcCuD0tYkaTY/sZ8zzI0dz6/4HsKCb58qjiWSa0w60N8Syr6WQ==} + + '@swagger-api/apidom-ns-openapi-2@1.0.0-alpha.9': + resolution: {integrity: sha512-WUZxt7Gs7P4EQsGtoD6cKAjf0uDJhkUxsIW9Bb4EAgO6tdp7LlXhbJ0fJ2QycCLY717SfJbvGLfhuSfTYo4Iow==} + + '@swagger-api/apidom-ns-openapi-3-0@1.0.0-alpha.9': + resolution: {integrity: sha512-7ra5uoZGrfCn1LabfJLueChPcYXyg24//LCYBtjTstyueqd5Vp7JCPeP5NnJSAaqVAP47r8ygceBPoxNp9k1EQ==} + + '@swagger-api/apidom-ns-openapi-3-1@1.0.0-alpha.9': + resolution: {integrity: sha512-nQOwNQgf0C8EVjf2loAAl4ifRuVOdcqycvXUdcTpsUfHN3fbndR8IKpb26mQNmnACmqgmX+LkbMdW9b+K6089g==} + + '@swagger-api/apidom-ns-workflows-1@1.0.0-alpha.9': + resolution: {integrity: sha512-yKo0p8OkQmDib93Kt1yqWmI7JsD6D9qUHxr/SCuAmNNWny1hxm7cZGoKJwJlGd0uAg84j4vmzWOlG3AsJbnT8g==} + + '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.0.0-alpha.9': + resolution: {integrity: sha512-xfVMR4HrTzXU0HB4TtxwkNbUIa/cQrPa0BWutJZ0fMYMAtUox2s8GsFYnJfZP52XfpSHFM1VPclivorZqET14g==} + + '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.0.0-alpha.9': + resolution: {integrity: sha512-lJZkrhZ8qRTtc5fSLKefCv8j7Xzo8UBfMjpqTJhmETAtU8YfVV2i2znjgxJpm0QwV6FVQqGfK1+ASZQWPLiVcA==} + + '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.0.0-alpha.9': + resolution: {integrity: sha512-65nmKdPzw4C1bmtYn+3zoxXCI6Gnobr0StI9XE0YWiK+lpso7RH3Cgyl1yPZ0DBRVGzP+Fn9FVzmDNulEfR95w==} + + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.0.0-alpha.9': + resolution: {integrity: sha512-RLI4FpVB3vB6mIuT77yrsv5V2LMZ80dW9XpV+Fmbd4Jkdj+ysAFwT38cI4AsUMOxixpTDIXY1oWD7AjvylHhQQ==} + + '@swagger-api/apidom-parser-adapter-json@1.0.0-alpha.9': + resolution: {integrity: sha512-aOewp8/3zobf/O+5Jx8y7+bX3BPRfRlHIv15qp4YVTsLs6gLISWSzTO9JpWe9cR+AfhpsAalFq4t1LwIkmLk4A==} + + '@swagger-api/apidom-parser-adapter-openapi-json-2@1.0.0-alpha.9': + resolution: {integrity: sha512-zgtsAfkplCFusX2P/saqdn10J8P3kQizCXxHLvxd2j0EhMJk2wfu4HYN5Pej/7/qf/OR1QZxqtacwebd4RfpXA==} + + '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.0.0-alpha.9': + resolution: {integrity: sha512-iPuHf0cAZSUhSv8mB0FnVgatTc26cVYohgqz2cvjoGofdqoh5KKIfxOkWlIhm+qGuBp71CfZUrPYPRsd0dHgeg==} + + '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.0.0-alpha.9': + resolution: {integrity: sha512-jwkfO7tzZyyrAgok+O9fKFOv1q/5njMb9DBc3D/ZF3ZLTcnEw8uj4V2HkjKxUweH5k8ip/gc8ueKmO/i7p2fng==} + + '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.0.0-alpha.9': + resolution: {integrity: sha512-jEIDpjbjwFKXQXS/RHJeA4tthsguLoz+nJPYS3AOLfuSiby5QXsKTxgqHXxG/YJqF1xJbZL+5KcF8UyiDePumw==} + + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.0.0-alpha.9': + resolution: {integrity: sha512-ieJL8dfIF8fmP3uJRNh/duJa3cCIIv6MzUe6o4uPT/oTDroy4qIATvnq9Dq/gtAv6rcPRpA9VhyghJ1DmjKsZQ==} + + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.0.0-alpha.9': + resolution: {integrity: sha512-EatIH7PZQSNDsRn9ompc62MYzboY7wAkjfYz+2FzBaSA8Vl5/+740qGQj22tu/xhwW4K72aV2NNL1m47QVF7hA==} + + '@swagger-api/apidom-parser-adapter-workflows-json-1@1.0.0-alpha.9': + resolution: {integrity: sha512-LylC2cQdAmvR7bXqwMwBt6FHTMVGinwIdI8pjl4EbPT9hCVm1rdED53caTYM4gCm+CJGRw20r4gb9vn3+N6RrA==} + + '@swagger-api/apidom-parser-adapter-workflows-yaml-1@1.0.0-alpha.9': + resolution: {integrity: sha512-TlA4+1ca33D7fWxO5jKBytSCv86IGI4Lze4JfrawWUXZ5efhi4LiNmW5TrGlZUyvL7yJtZcA4tn3betlj6jVwA==} + + '@swagger-api/apidom-parser-adapter-yaml-1-2@1.0.0-alpha.9': + resolution: {integrity: sha512-jSIHEB7lbh+MP3BhYIXFkeivDR01kugXN70e5FskW7oet2TIARsVEPheWKQFSP1U8bUZA4bsp9h9gOQ9xEeErw==} + + '@swagger-api/apidom-reference@1.0.0-alpha.9': + resolution: {integrity: sha512-KQ6wB5KplqdSsjxdA8BaQulj5zlF5VBCd5KP3RN/9vvixgsD/gyrVY59nisdzmPTqiL6yjhk612eQ96MgG8KiA==} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/chrome@0.0.262': + resolution: {integrity: sha512-TOoj3dqSYE13PD2fRuMQ6X6pggEvL9rRk/yOYOyWE6sfqRWxsJm4VoVm+wr9pkr4Sht/M5t7FFL4vXato8d1gA==} + + '@types/compression@1.7.5': + resolution: {integrity: sha512-AAQvK5pxMpaT+nDvhHrsBhLSYG5yQdtkaJE1WYieSNY2mVFKAgmU4ks65rkZD5oqnGCFLyQpUr1CqI4DmUMyDg==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/conventional-commits-parser@5.0.0': + resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} + + '@types/cordova@11.0.3': + resolution: {integrity: sha512-kyuRQ40/NWQVhqGIHq78Ehu2Bf9Mlg0LhmSmis6ZFJK7z933FRfYi8tHe/k/0fB+PGfCf95rJC6TO7dopaFvAg==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.0': + resolution: {integrity: sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/express-serve-static-core@4.19.5': + resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/filesystem@0.0.36': + resolution: {integrity: sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==} + + '@types/filewriter@0.0.33': + resolution: {integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==} + + '@types/har-format@1.2.15': + resolution: {integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==} + + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@12.2.3': + resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/node-forge@1.3.11': + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + + '@types/node@22.5.0': + resolution: {integrity: sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==} + + '@types/qs@6.9.15': + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + + '@types/ramda@0.30.1': + resolution: {integrity: sha512-aoyF/ADPL6N+/NXXfhPWF+Qj6w1Cql59m9wX0Gi15uyF+bpzXeLd63HPdiTDE2bmLXfNcVufsDPKmbfOrOzTBA==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + '@types/swagger-ui@3.52.4': + resolution: {integrity: sha512-7NV7q8BfupqdQxr26OkM0g0YEPB9uXnKGzXadgcearvI9MoCHt3F72lPTX3fZZIlrr21DC0IK26wcDMZ37oFDA==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/use-sync-external-store@0.0.3': + resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} + + '@typescript-eslint/eslint-plugin@8.2.0': + resolution: {integrity: sha512-02tJIs655em7fvt9gps/+4k4OsKULYGtLBPJfOsmOq1+3cdClYiF0+d6mHu6qDnTcg88wJBkcPLpQhq7FyDz0A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@8.2.0': + resolution: {integrity: sha512-j3Di+o0lHgPrb7FxL3fdEy6LJ/j2NE8u+AP/5cQ9SKb+JLH6V6UHDqJ+e0hXBkHP1wn1YDFjYCS9LBQsZDlDEg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@8.2.0': + resolution: {integrity: sha512-OFn80B38yD6WwpoHU2Tz/fTz7CgFqInllBoC3WP+/jLbTb4gGPTy9HBSTsbDWkMdN55XlVU0mMDYAtgvlUspGw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.2.0': + resolution: {integrity: sha512-g1CfXGFMQdT5S+0PSO0fvGXUaiSkl73U1n9LTK5aRAFnPlJ8dLKkXr4AaLFvPedW8lVDoMgLLE3JN98ZZfsj0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@8.2.0': + resolution: {integrity: sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.2.0': + resolution: {integrity: sha512-kiG4EDUT4dImplOsbh47B1QnNmXSoUqOjWDvCJw/o8LgfD0yr7k2uy54D5Wm0j4t71Ge1NkynGhpWdS0dEIAUA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@8.2.0': + resolution: {integrity: sha512-O46eaYKDlV3TvAVDNcoDzd5N550ckSe8G4phko++OCSC1dYIb9LTc3HDGYdWqWIAT5qDUKphO6sd9RrpIJJPfg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + '@typescript-eslint/visitor-keys@8.2.0': + resolution: {integrity: sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitejs/plugin-vue@5.1.2': + resolution: {integrity: sha512-nY9IwH12qeiJqumTCLJLE7IiNx7HZ39cbHaysEUd+Myvbz9KAqd2yq+U01Kab1R/H1BmiyM2ShTYlNH32Fzo3A==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 + vue: ^3.2.25 + + '@volar/language-core@2.4.0': + resolution: {integrity: sha512-FTla+khE+sYK0qJP+6hwPAAUwiNHVMph4RUXpxf/FIPKUP61NFrVZorml4mjFShnueR2y9/j8/vnh09YwVdH7A==} + + '@volar/source-map@2.4.0': + resolution: {integrity: sha512-2ceY8/NEZvN6F44TXw2qRP6AQsvCYhV2bxaBPWxV9HqIfkbRydSksTFObCF1DBDNBfKiZTS8G/4vqV6cvjdOIQ==} + + '@volar/typescript@2.4.0': + resolution: {integrity: sha512-9zx3lQWgHmVd+JRRAHUSRiEhe4TlzL7U7e6ulWXOxHH/WNYxzKwCvZD7WYWEZFdw4dHfTD9vUR0yPQO6GilCaQ==} + + '@vue/compiler-core@3.4.38': + resolution: {integrity: sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==} + + '@vue/compiler-dom@3.4.38': + resolution: {integrity: sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ==} + + '@vue/compiler-sfc@3.4.38': + resolution: {integrity: sha512-s5QfZ+9PzPh3T5H4hsQDJtI8x7zdJaew/dCGgqZ2630XdzaZ3AD8xGZfBqpT8oaD/p2eedd+pL8tD5vvt5ZYJQ==} + + '@vue/compiler-ssr@3.4.38': + resolution: {integrity: sha512-YXznKFQ8dxYpAz9zLuVvfcXhc31FSPFDcqr0kyujbOwNhlmaNvL2QfIy+RZeJgSn5Fk54CWoEUeW+NVBAogGaw==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/devtools-api@6.6.3': + resolution: {integrity: sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==} + + '@vue/language-core@2.0.29': + resolution: {integrity: sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity@3.4.38': + resolution: {integrity: sha512-4vl4wMMVniLsSYYeldAKzbk72+D3hUnkw9z8lDeJacTxAkXeDAP1uE9xr2+aKIN0ipOL8EG2GPouVTH6yF7Gnw==} + + '@vue/runtime-core@3.4.38': + resolution: {integrity: sha512-21z3wA99EABtuf+O3IhdxP0iHgkBs1vuoCAsCKLVJPEjpVqvblwBnTj42vzHRlWDCyxu9ptDm7sI2ZMcWrQqlA==} + + '@vue/runtime-dom@3.4.38': + resolution: {integrity: sha512-afZzmUreU7vKwKsV17H1NDThEEmdYI+GCAK/KY1U957Ig2NATPVjCROv61R19fjZNzMmiU03n79OMnXyJVN0UA==} + + '@vue/server-renderer@3.4.38': + resolution: {integrity: sha512-NggOTr82FbPEkkUvBm4fTGcwUY8UuTsnWC/L2YZBmvaQ4C4Jl/Ao4HHTB+l7WnFCt5M/dN3l0XLuyjzswGYVCA==} + peerDependencies: + vue: 3.4.38 + + '@vue/shared@3.4.38': + resolution: {integrity: sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==} + + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-import-assertions@1.9.0: + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + engines: {node: '>=0.4.0'} + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + apg-lite@1.0.4: + resolution: {integrity: sha512-B32zCN3IdHIc99Vy7V9BaYTUzLeRA8YXYY1aQD1/5I2aqIrO0coi4t6hJPqMisidlBxhyME8UexkHt31SlR6Og==} + + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + autolinker@3.16.2: + resolution: {integrity: sha512-JiYl7j2Z19F9NdTmirENSUUIIL/9MytEWtmzhfmsKPCp9E+G35Y0UNCMoM9tFigxT59qSc8Ml2dlZXOCVTYwuA==} + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + axios@1.7.4: + resolution: {integrity: sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==} + + b4a@1.6.6: + resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bare-events@2.4.2: + resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + caniuse-lite@1.0.30001651: + resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + + character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + + character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + ci-info@4.0.0: + resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + engines: {node: '>=8'} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@1.0.8: + resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + + computeds@0.0.1: + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + + conventional-changelog-conventionalcommits@7.0.2: + resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} + engines: {node: '>=16'} + + conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + + core-js-pure@3.38.1: + resolution: {integrity: sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig-typescript-loader@5.0.0: + resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} + engines: {node: '>=v16'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=8.2' + typescript: '>=4' + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + dargs@8.1.0: + resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} + engines: {node: '>=12'} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dompurify@3.1.4: + resolution: {integrity: sha512-2gnshi6OshmuKil8rMZuQCGiUF3cUxHY3NGDzUAdUx/NPEe5DVnO8BDoAQouvgwnx0R/+a6jUn36Z0FSdq8vww==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dot-prop@9.0.0: + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} + engines: {node: '>=18'} + + dotenv-expand@11.0.6: + resolution: {integrity: sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==} + engines: {node: '>=12'} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + + drange@1.1.1: + resolution: {integrity: sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==} + engines: {node: '>=4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.13: + resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} + + elementtree@0.1.7: + resolution: {integrity: sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==} + engines: {node: '>= 0.4.0'} + + emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} + + entities@2.1.0: + resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@5.2.1: + resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-vue@9.27.0: + resolution: {integrity: sha512-5Dw3yxEyuBSXTzT5/Ge1X5kIkRTQ3nvBn/VwPwInNiZBSJOO/timWMUaflONnFBzU6NhB68lxnCda7ULV5N7LA==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-scope@8.0.2: + resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.0.0: + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.9.0: + resolution: {integrity: sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.1.0: + resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + engines: {node: '>= 0.10.0'} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-patch@3.1.1: + resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.0.1: + resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fault@1.0.4: + resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + front-matter@4.0.2: + resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + git-raw-commits@4.0.0: + resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} + engines: {node: '>=16'} + hasBin: true + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.9.0: + resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} + engines: {node: '>=18'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-parse-selector@2.2.5: + resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} + + hastscript@6.0.0: + resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + + html-minifier-terser@7.2.0: + resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + husky@9.1.5: + resolution: {integrity: sha512-rowAVRUBfI0b4+niA4SJMhfQwc107VLkBUgEYYAOQAbqDCnra1nYh83hF/MDmhYs9t9n1E3DuKOrs2LYNC+0Ag==} + engines: {node: '>=18'} + hasBin: true + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + immutable@3.8.2: + resolution: {integrity: sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==} + engines: {node: '>=0.10.0'} + + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + inquirer@9.3.6: + resolution: {integrity: sha512-riK/iQB2ctwkpWYgjjWIRv3MBLt2gzb2Sj0JNQNbyTXgyXsLWcDPJ5WS5ZDTCx7BRFnJsARtYh+58fjP5M2Y0Q==} + engines: {node: '>=18'} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + + is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isbinaryfile@5.0.2: + resolution: {integrity: sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==} + engines: {node: '>= 18.0.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + + js-file-download@0.4.12: + resolution: {integrity: sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + linkify-it@3.0.3: + resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} + + lint-staged@15.2.9: + resolution: {integrity: sha512-BZAt8Lk3sEnxw7tfxM7jeZlPRuT4M68O0/CwZhhaw6eeWu0Lz5eERE3m386InivXB64fp/mDID452h48tvKlRQ==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr2@8.2.4: + resolution: {integrity: sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==} + engines: {node: '>=18.0.0'} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lowlight@1.20.0: + resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + markdown-it-abbr@1.0.4: + resolution: {integrity: sha512-ZeA4Z4SaBbYysZap5iZcxKmlPL6bYA8grqhzJIHB1ikn7njnzaP8uwbtuXc4YXD5LicI4/2Xmc0VwmSiFV04gg==} + + markdown-it-container@3.0.0: + resolution: {integrity: sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==} + + markdown-it-deflist@2.1.0: + resolution: {integrity: sha512-3OuqoRUlSxJiuQYu0cWTLHNhhq2xtoSFqsZK8plANg91+RJQU1ziQ6lA2LzmFAEes18uPBsHZpcX6We5l76Nzg==} + + markdown-it-emoji@2.0.2: + resolution: {integrity: sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==} + + markdown-it-footnote@3.0.3: + resolution: {integrity: sha512-YZMSuCGVZAjzKMn+xqIco9d1cLGxbELHZ9do/TSYVzraooV8ypsppKNmUJ0fVH5ljkCInQAtFpm8Rb3eXSrt5w==} + + markdown-it-imsize@2.0.1: + resolution: {integrity: sha512-5SH90ademqcR8ifQCBXRCfIR4HGfZZOh5pO0j2TglulfSQH+SBXM4Iw/QlTUbSoUwVZArCYgECoMvktDS2kP3w==} + + markdown-it-ins@3.0.1: + resolution: {integrity: sha512-32SSfZqSzqyAmmQ4SHvhxbFqSzPDqsZgMHDwxqPzp+v+t8RsmqsBZRG+RfRQskJko9PfKC2/oxyOs4Yg/CfiRw==} + + markdown-it-mark@3.0.1: + resolution: {integrity: sha512-HyxjAu6BRsdt6Xcv6TKVQnkz/E70TdGXEFHRYBGLncRE9lBFwDNLVtFojKxjJWgJ+5XxUwLaHXy+2sGBbDn+4A==} + + markdown-it-sub@1.0.0: + resolution: {integrity: sha512-z2Rm/LzEE1wzwTSDrI+FlPEveAAbgdAdPhdWarq/ZGJrGW/uCQbKAnhoCsE4hAbc3SEym26+W2z/VQB0cQiA9Q==} + + markdown-it-sup@1.0.0: + resolution: {integrity: sha512-E32m0nV9iyhRR7CrhnzL5msqic7rL1juWre6TQNxsnApg7Uf+F97JOKxUijg5YwXz86lZ0mqfOnutoryyNdntQ==} + + markdown-it-task-lists@2.1.1: + resolution: {integrity: sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==} + + markdown-it-toc-and-anchor@4.2.0: + resolution: {integrity: sha512-DusSbKtg8CwZ92ztN7bOojDpP4h0+w7BVOPuA3PHDIaabMsERYpwsazLYSP/UlKedoQjOz21mwlai36TQ04EpA==} + + markdown-it@12.3.2: + resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==} + hasBin: true + + mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + + merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.53.0: + resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minim@0.23.8: + resolution: {integrity: sha512-bjdr2xW1dBCMsMGGsUeqM4eFI60m94+szhxWys+B1ztIt6gWSfeGBdSVCIawezeHYLYn0j6zrsXdQS/JllBzww==} + engines: {node: '>=6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + nan@2.20.0: + resolution: {integrity: sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + neotraverse@0.6.18: + resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} + engines: {node: '>= 10'} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-abi@3.67.0: + resolution: {integrity: sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw==} + engines: {node: '>=10'} + + node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-fetch-commonjs@3.3.2: + resolution: {integrity: sha512-VBlAiynj3VMLrotgwOS3OyECFxas5y7ltLcK4t41lMUZeaK15Ym4QRkqN0EQKAFL42q9i21EPKjzLUPfltR72A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + openapi-path-templating@1.6.0: + resolution: {integrity: sha512-1atBNwOUrZXthTvlvvX8k8ovFEF3iA8mDidYMkdOtvVdndBhTrspbwGXNOzEUaJhm9iUl4Tf5uQaeTLAJvwPig==} + engines: {node: '>=12.20.0'} + + openapi-server-url-templating@1.1.0: + resolution: {integrity: sha512-dtyTFKx2xVcO0W8JKaluXIHC9l/MLjHeflBaWjiWNMCHp/TBs9dEjQDbj/VFlHR4omFOKjjmqm1pW1aCAhmPBg==} + engines: {node: '>=12.20.0'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pinia@2.2.2: + resolution: {integrity: sha512-ja2XqFWZC36mupU4z1ZzxeTApV7DOw44cV4dhQ9sGwun+N89v/XP7+j7q6TanS1u1tdbK4r+1BUx7heMaIdagA==} + peerDependencies: + '@vue/composition-api': ^1.4.0 + typescript: '>=4.4.4' + vue: ^2.6.14 || ^3.3.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + typescript: + optional: true + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + engines: {node: ^10 || ^12 || >=14} + + prebuild-install@7.1.2: + resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + engines: {node: '>=10'} + hasBin: true + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + + prismjs@1.27.0: + resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} + engines: {node: '>=6'} + + prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@5.6.0: + resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + + quasar@2.16.9: + resolution: {integrity: sha512-cAbt5l8hbxf7GQSwtYQ/3TlrbA8cOfjXXbFvikx4amMQEFKVB/vi/PfQMjbdRVcK/zEB6hu1y5OjS/9NlpJc/Q==} + engines: {node: '>= 10.18.1', npm: '>= 6.13.4', yarn: '>= 1.21.1'} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + + ramda-adjunct@5.1.0: + resolution: {integrity: sha512-8qCpl2vZBXEJyNbi4zqcgdfHtcdsWjOGbiNSEnEBrM6Y0OKOT8UxJbIVGm1TIcjaSu2MxaWcgtsNlKlCk7o7qg==} + engines: {node: '>=0.10.3'} + peerDependencies: + ramda: '>= 0.30.0' + + ramda@0.30.1: + resolution: {integrity: sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw==} + + randexp@0.5.3: + resolution: {integrity: sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==} + engines: {node: '>=4'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + raw-loader@4.0.2: + resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-copy-to-clipboard@5.1.0: + resolution: {integrity: sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==} + peerDependencies: + react: ^15.3.0 || 16 || 17 || 18 + + react-debounce-input@3.3.0: + resolution: {integrity: sha512-VEqkvs8JvY/IIZvh71Z0TC+mdbxERvYF33RcebnodlsUZ8RSgyKe2VWaHXv4+/8aoOgXLxWrdsYs2hDhcwbUgA==} + peerDependencies: + react: ^15.3.0 || 16 || 17 || 18 + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-immutable-proptypes@2.2.0: + resolution: {integrity: sha512-Vf4gBsePlwdGvSZoLSBfd4HAP93HDauMY4fDjXhreg/vg6F3Fj/MXDNyTbltPC/xZKmZc+cjLu3598DdYK6sgQ==} + peerDependencies: + immutable: '>=3.6.2' + + react-immutable-pure-component@2.2.2: + resolution: {integrity: sha512-vkgoMJUDqHZfXXnjVlG3keCxSO/U6WeDQ5/Sl0GK2cH8TOxEzQ5jXqDXHEL/jqk6fsNxV05oH5kD7VNMUE2k+A==} + peerDependencies: + immutable: '>= 2 || >= 4.0.0-rc' + react: '>= 16.6' + react-dom: '>= 16.6' + + react-inspector@6.0.2: + resolution: {integrity: sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ==} + peerDependencies: + react: ^16.8.4 || ^17.0.0 || ^18.0.0 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-redux@9.1.2: + resolution: {integrity: sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==} + peerDependencies: + '@types/react': ^18.2.25 + react: ^18.0 + redux: ^5.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + redux: + optional: true + + react-syntax-highlighter@15.5.0: + resolution: {integrity: sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==} + peerDependencies: + react: '>= 0.14.0' + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + redux-immutable@4.0.0: + resolution: {integrity: sha512-SchSn/DWfGb3oAejd+1hhHx01xUoxY+V7TeK0BKqpkLKiQPVFf7DYzEaKmrEVxsWxielKfSK9/Xq66YyxgR1cg==} + peerDependencies: + immutable: ^3.8.1 || ^4.0.0-rc.1 + + redux@5.0.1: + resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} + + refractor@3.6.0: + resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + + remarkable@2.0.1: + resolution: {integrity: sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==} + engines: {node: '>= 6.0.0'} + hasBin: true + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + reselect@5.1.1: + resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + ret@0.2.2: + resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} + engines: {node: '>=4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rollup-plugin-visualizer@5.12.0: + resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rollup: + optional: true + + rollup@4.21.0: + resolution: {integrity: sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sass@1.77.8: + resolution: {integrity: sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + sax@1.1.4: + resolution: {integrity: sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + + serialize-error@8.1.0: + resolution: {integrity: sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==} + engines: {node: '>=10'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + short-unique-id@5.2.0: + resolution: {integrity: sha512-cMGfwNyfDZ/nzJ2k2M+ClthBIh//GlZl1JEf47Uoa9XR11bz8Pa2T2wQO4bVrRdH48LrIDWJahQziKo3MjhsWg==} + hasBin: true + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + space-separated-tokens@1.1.5: + resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-trace@1.0.0-pre2: + resolution: {integrity: sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==} + engines: {node: '>=16'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + streamx@2.19.0: + resolution: {integrity: sha512-5z6CNR4gtkPbwlxyEqoDGDmWIzoNJqCBt4Eac1ICP9YaIT08ct712cFj0u1rx4F8luAuL+3Qc+RFIdI4OX00kg==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + swagger-client@3.29.2: + resolution: {integrity: sha512-7dOIAodJeUsYbvWTpDODY2+bfJcZ34WG84TByMet76OJ/ZjOLHZtJSgMFxEvnh9+yR0qn8wvHUdfg27ylg2eiQ==} + + swagger-ui@5.17.14: + resolution: {integrity: sha512-z9pOymwowrgkoMKNsRSN6QjOyYrMAnc4iohEebnS/ELT5jjdB13Lu4f3Bl4+o2Mw5B6QOyo4vibr/A/Vb7UbMQ==} + + synckit@0.9.1: + resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} + engines: {node: ^14.18.0 || >=16.0.0} + + table@6.8.2: + resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} + engines: {node: '>=10.0.0'} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.31.6: + resolution: {integrity: sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==} + engines: {node: '>=10'} + hasBin: true + + text-decoder@1.1.1: + resolution: {integrity: sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==} + + text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tree-sitter-json@0.20.2: + resolution: {integrity: sha512-eUxrowp4F1QEGk/i7Sa+Xl8Crlfp7J0AXxX1QdJEQKQYMWhgMbCIgyQvpO3Q0P9oyTrNQxRLlRipDS44a8EtRw==} + + tree-sitter-yaml@0.5.0: + resolution: {integrity: sha512-POJ4ZNXXSWIG/W4Rjuyg36MkUD4d769YRUGKRqN+sVaj/VCo6Dh6Pkssn1Rtewd5kybx+jT1BWMyWN0CijXnMA==} + + tree-sitter@0.20.4: + resolution: {integrity: sha512-rjfR5dc4knG3jnJNN/giJ9WOoN1zL/kZyrS0ILh+eqq8RNcIbiXA63JsMEgluug0aNvfQvK4BfCErN1vIzvKog==} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-essentials@9.4.2: + resolution: {integrity: sha512-mB/cDhOvD7pg3YCLk2rOtejHjjdSi9in/IBYE13S+8WA5FBSraYf4V/ws55uvs0IvQ/l0wBOlXy5yBNZ9Bl8ZQ==} + peerDependencies: + typescript: '>=4.1.0' + peerDependenciesMeta: + typescript: + optional: true + + ts-mixer@6.0.4: + resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + ts-toolbelt@9.6.0: + resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} + + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@4.25.0: + resolution: {integrity: sha512-bRkIGlXsnGBRBQRAY56UXBm//9qH4bmJfFvq83gSz41N282df+fjy8ofcEgc1sM8geNt5cl6mC2g9Fht1cs8Aw==} + engines: {node: '>=16'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + types-ramda@0.30.1: + resolution: {integrity: sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA==} + + typescript-eslint@8.2.0: + resolution: {integrity: sha512-DmnqaPcML0xYwUzgNbM1XaKXpEb7BShYf2P1tkUmmcl8hyeG7Pj08Er7R9bNy6AufabywzJcOybQAtnD/c9DGw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@1.0.6: + resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unorm@1.6.0: + resolution: {integrity: sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==} + engines: {node: '>= 0.4.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unraw@3.0.0: + resolution: {integrity: sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==} + + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + use-sync-external-store@1.2.2: + resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + uslug@1.0.4: + resolution: {integrity: sha512-Jrbpp/NS3TvIGNjfJT1sn3/BCeykoxR8GbNYW5lF6fUscLkbXFwj1b7m4DvIkHm8k3Qr6Co68lbTmoZTMGk/ow==} + engines: {node: '>= 0.4.0'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite-plugin-checker@0.7.2: + resolution: {integrity: sha512-xeYeJbG0gaCaT0QcUC4B2Zo4y5NR8ZhYenc5gPbttrZvraRFwkEADCYwq+BfEHl9zYz7yf85TxsiGoYwyyIjhw==} + engines: {node: '>=14.16'} + peerDependencies: + '@biomejs/biome': '>=1.7' + eslint: '>=7' + meow: ^9.0.0 + optionator: ^0.9.1 + stylelint: '>=13' + typescript: '*' + vite: '>=2.0.0' + vls: '*' + vti: '*' + vue-tsc: '>=2.0.0' + peerDependenciesMeta: + '@biomejs/biome': + optional: true + eslint: + optional: true + meow: + optional: true + optionator: + optional: true + stylelint: + optional: true + typescript: + optional: true + vls: + optional: true + vti: + optional: true + vue-tsc: + optional: true + + vite@5.4.2: + resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vscode-jsonrpc@6.0.0: + resolution: {integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==} + engines: {node: '>=8.0.0 || >=10.0.0'} + + vscode-languageclient@7.0.0: + resolution: {integrity: sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==} + engines: {vscode: ^1.52.0} + + vscode-languageserver-protocol@3.16.0: + resolution: {integrity: sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.16.0: + resolution: {integrity: sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==} + + vscode-languageserver@7.0.0: + resolution: {integrity: sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==} + hasBin: true + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-eslint-parser@9.4.3: + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + vue-router@4.4.3: + resolution: {integrity: sha512-sv6wmNKx2j3aqJQDMxLFzs/u/mjA9Z5LCgy6BE0f7yFWMjrPLnS/sPNn8ARY/FXw6byV18EFutn5lTO6+UsV5A==} + peerDependencies: + vue: ^3.2.0 + + vue-tsc@2.0.29: + resolution: {integrity: sha512-MHhsfyxO3mYShZCGYNziSbc63x7cQ5g9kvijV7dRe1TTXBRLxXyL0FnXWpUF1xII2mJ86mwYpYsUmMwkmerq7Q==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + + vue@3.4.38: + resolution: {integrity: sha512-f0ZgN+mZ5KFgVv9wz0f4OgVKukoXtS3nwET4c2vLBGQR50aI8G0cqbFtLlX9Yiyg3LFGBitruPHt2PxwTduJEw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + watchpack@2.4.2: + resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} + engines: {node: '>=10.13.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + web-tree-sitter@0.20.3: + resolution: {integrity: sha512-zKGJW9r23y3BcJusbgvnOH2OYAW40MXAOi9bi3Gcc7T4Gms9WWgXF8m6adsJWpGJEhgOzCrfiz1IzKowJWrtYw==} + + webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} + engines: {node: '>=10.0.0'} + + webpack-merge@6.0.1: + resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} + engines: {node: '>=18.0.0'} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.91.0: + resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xml-but-prettier@1.0.1: + resolution: {integrity: sha512-C2CJaadHrZTqESlH03WOyw0oZTtoy2uEg6dSDF6YRg+9GnYNub53RRemLpnvtbHDFelxMx4LajiFsYeR6XJHgQ==} + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + xml@1.0.1: + resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml@2.5.0: + resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + + zenscroll@4.0.2: + resolution: {integrity: sha512-jEA1znR7b4C/NnaycInCU6h/d15ZzCd1jmsruqOKnZP6WXQSMH3W2GL+OXbkruslU4h+Tzuos0HdswzRUk/Vgg==} + + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + +snapshots: + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 + + '@babel/helper-string-parser@7.24.8': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/parser@7.25.4': + dependencies: + '@babel/types': 7.25.4 + + '@babel/runtime-corejs3@7.25.0': + dependencies: + core-js-pure: 3.38.1 + regenerator-runtime: 0.14.1 + + '@babel/runtime@7.25.4': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/types@7.25.4': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@braintree/sanitize-url@7.0.2': {} + + '@commitlint/cli@19.4.0(@types/node@22.5.0)(typescript@5.5.4)': + dependencies: + '@commitlint/format': 19.3.0 + '@commitlint/lint': 19.2.2 + '@commitlint/load': 19.4.0(@types/node@22.5.0)(typescript@5.5.4) + '@commitlint/read': 19.4.0 + '@commitlint/types': 19.0.3 + execa: 8.0.1 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/config-conventional@19.2.2': + dependencies: + '@commitlint/types': 19.0.3 + conventional-changelog-conventionalcommits: 7.0.2 + + '@commitlint/config-validator@19.0.3': + dependencies: + '@commitlint/types': 19.0.3 + ajv: 8.17.1 + + '@commitlint/ensure@19.0.3': + dependencies: + '@commitlint/types': 19.0.3 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + + '@commitlint/execute-rule@19.0.0': {} + + '@commitlint/format@19.3.0': + dependencies: + '@commitlint/types': 19.0.3 + chalk: 5.3.0 + + '@commitlint/is-ignored@19.2.2': + dependencies: + '@commitlint/types': 19.0.3 + semver: 7.6.3 + + '@commitlint/lint@19.2.2': + dependencies: + '@commitlint/is-ignored': 19.2.2 + '@commitlint/parse': 19.0.3 + '@commitlint/rules': 19.0.3 + '@commitlint/types': 19.0.3 + + '@commitlint/load@19.4.0(@types/node@22.5.0)(typescript@5.5.4)': + dependencies: + '@commitlint/config-validator': 19.0.3 + '@commitlint/execute-rule': 19.0.0 + '@commitlint/resolve-extends': 19.1.0 + '@commitlint/types': 19.0.3 + chalk: 5.3.0 + cosmiconfig: 9.0.0(typescript@5.5.4) + cosmiconfig-typescript-loader: 5.0.0(@types/node@22.5.0)(cosmiconfig@9.0.0(typescript@5.5.4))(typescript@5.5.4) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/message@19.0.0': {} + + '@commitlint/parse@19.0.3': + dependencies: + '@commitlint/types': 19.0.3 + conventional-changelog-angular: 7.0.0 + conventional-commits-parser: 5.0.0 + + '@commitlint/read@19.4.0': + dependencies: + '@commitlint/top-level': 19.0.0 + '@commitlint/types': 19.0.3 + execa: 8.0.1 + git-raw-commits: 4.0.0 + minimist: 1.2.8 + + '@commitlint/resolve-extends@19.1.0': + dependencies: + '@commitlint/config-validator': 19.0.3 + '@commitlint/types': 19.0.3 + global-directory: 4.0.1 + import-meta-resolve: 4.1.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + + '@commitlint/rules@19.0.3': + dependencies: + '@commitlint/ensure': 19.0.3 + '@commitlint/message': 19.0.0 + '@commitlint/to-lines': 19.0.0 + '@commitlint/types': 19.0.3 + execa: 8.0.1 + + '@commitlint/to-lines@19.0.0': {} + + '@commitlint/top-level@19.0.0': + dependencies: + find-up: 7.0.0 + + '@commitlint/types@19.0.3': + dependencies: + '@types/conventional-commits-parser': 5.0.0 + chalk: 5.3.0 + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.23.1': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.23.1': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.23.1': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.23.1': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.23.1': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.23.1': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.23.1': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.23.1': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.23.1': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.23.1': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.23.1': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.23.1': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.23.1': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.23.1': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.23.1': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.23.1': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.23.1': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.23.1': + optional: true + + '@esbuild/openbsd-arm64@0.23.1': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.23.1': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.23.1': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.23.1': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.23.1': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.23.1': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@9.9.0(jiti@1.21.6))': + dependencies: + eslint: 9.9.0(jiti@1.21.6) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.11.0': {} + + '@eslint/config-array@0.17.1': + dependencies: + '@eslint/object-schema': 2.1.4 + debug: 4.3.6 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/eslintrc@3.1.0': + dependencies: + ajv: 6.12.6 + debug: 4.3.6 + espree: 10.1.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.9.0': {} + + '@eslint/object-schema@2.1.4': {} + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.0': {} + + '@inquirer/figures@1.0.5': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.1.1': {} + + '@quasar/app-vite@2.0.0-beta.19(@types/node@22.5.0)(eslint@9.9.0(jiti@1.21.6))(pinia@2.2.2(typescript@5.5.4)(vue@3.4.38(typescript@5.5.4)))(quasar@2.16.9)(rollup@4.21.0)(terser@5.31.6)(typescript@5.5.4)(vue-router@4.4.3(vue@3.4.38(typescript@5.5.4)))(vue@3.4.38(typescript@5.5.4))': + dependencies: + '@quasar/render-ssr-error': 1.0.3 + '@quasar/ssl-certificate': 1.0.0 + '@quasar/vite-plugin': 1.7.0(@vitejs/plugin-vue@5.1.2(vite@5.4.2(@types/node@22.5.0)(sass@1.77.8)(terser@5.31.6))(vue@3.4.38(typescript@5.5.4)))(quasar@2.16.9)(vite@5.4.2(@types/node@22.5.0)(sass@1.77.8)(terser@5.31.6))(vue@3.4.38(typescript@5.5.4)) + '@types/chrome': 0.0.262 + '@types/compression': 1.7.5 + '@types/cordova': 11.0.3 + '@types/express': 4.17.21 + '@vitejs/plugin-vue': 5.1.2(vite@5.4.2(@types/node@22.5.0)(sass@1.77.8)(terser@5.31.6))(vue@3.4.38(typescript@5.5.4)) + archiver: 7.0.1 + chokidar: 3.6.0 + ci-info: 4.0.0 + compression: 1.7.4 + cross-spawn: 7.0.3 + dot-prop: 9.0.0 + dotenv: 16.4.5 + dotenv-expand: 11.0.6 + elementtree: 0.1.7 + esbuild: 0.23.1 + express: 4.19.2 + fast-glob: 3.3.2 + fs-extra: 11.2.0 + html-minifier-terser: 7.2.0 + inquirer: 9.3.6 + isbinaryfile: 5.0.2 + kolorist: 1.8.0 + lodash: 4.17.21 + minimist: 1.2.8 + open: 10.1.0 + quasar: 2.16.9 + rollup-plugin-visualizer: 5.12.0(rollup@4.21.0) + sass: 1.77.8 + semver: 7.6.3 + serialize-javascript: 6.0.2 + table: 6.8.2 + ts-essentials: 9.4.2(typescript@5.5.4) + vite: 5.4.2(@types/node@22.5.0)(sass@1.77.8)(terser@5.31.6) + vue: 3.4.38(typescript@5.5.4) + vue-router: 4.4.3(vue@3.4.38(typescript@5.5.4)) + webpack-merge: 6.0.1 + optionalDependencies: + eslint: 9.9.0(jiti@1.21.6) + pinia: 2.2.2(typescript@5.5.4)(vue@3.4.38(typescript@5.5.4)) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - rollup + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - typescript + + '@quasar/extras@1.16.12': {} + + '@quasar/quasar-app-extension-qmarkdown@2.0.0-beta.10(webpack@5.91.0)': + dependencies: + '@quasar/quasar-ui-qmarkdown': 2.0.0-beta.10 + front-matter: 4.0.2 + markdown-it-abbr: 1.0.4 + markdown-it-deflist: 2.1.0 + markdown-it-emoji: 2.0.2 + markdown-it-footnote: 3.0.3 + markdown-it-ins: 3.0.1 + markdown-it-mark: 3.0.1 + markdown-it-sub: 1.0.0 + markdown-it-sup: 1.0.0 + markdown-it-task-lists: 2.1.1 + raw-loader: 4.0.2(webpack@5.91.0) + webpack-merge: 5.10.0 + transitivePeerDependencies: + - webpack + + '@quasar/quasar-ui-qmarkdown@2.0.0-beta.10': + dependencies: + '@types/markdown-it': 12.2.3 + markdown-it: 12.3.2 + markdown-it-container: 3.0.0 + markdown-it-imsize: 2.0.1 + markdown-it-toc-and-anchor: 4.2.0 + prismjs: 1.29.0 + + '@quasar/render-ssr-error@1.0.3': + dependencies: + stack-trace: 1.0.0-pre2 + + '@quasar/ssl-certificate@1.0.0': + dependencies: + fs-extra: 11.2.0 + selfsigned: 2.4.1 + + '@quasar/vite-plugin@1.7.0(@vitejs/plugin-vue@5.1.2(vite@5.4.2(@types/node@22.5.0)(sass@1.77.8)(terser@5.31.6))(vue@3.4.38(typescript@5.5.4)))(quasar@2.16.9)(vite@5.4.2(@types/node@22.5.0)(sass@1.77.8)(terser@5.31.6))(vue@3.4.38(typescript@5.5.4))': + dependencies: + '@vitejs/plugin-vue': 5.1.2(vite@5.4.2(@types/node@22.5.0)(sass@1.77.8)(terser@5.31.6))(vue@3.4.38(typescript@5.5.4)) + quasar: 2.16.9 + vite: 5.4.2(@types/node@22.5.0)(sass@1.77.8)(terser@5.31.6) + vue: 3.4.38(typescript@5.5.4) + + '@rollup/rollup-android-arm-eabi@4.21.0': + optional: true + + '@rollup/rollup-android-arm64@4.21.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.21.0': + optional: true + + '@rollup/rollup-darwin-x64@4.21.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.21.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.21.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.21.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.21.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.21.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.21.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.21.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.21.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.21.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.21.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.21.0': + optional: true + + '@swagger-api/apidom-ast@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-error': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + unraw: 3.0.0 + + '@swagger-api/apidom-core@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-ast': 1.0.0-alpha.9 + '@swagger-api/apidom-error': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + minim: 0.23.8 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + short-unique-id: 5.2.0 + ts-mixer: 6.0.4 + + '@swagger-api/apidom-error@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + + '@swagger-api/apidom-json-pointer@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-error': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + + '@swagger-api/apidom-ns-api-design-systems@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-error': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + ts-mixer: 6.0.4 + optional: true + + '@swagger-api/apidom-ns-asyncapi-2@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-json-schema-draft-7': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + ts-mixer: 6.0.4 + optional: true + + '@swagger-api/apidom-ns-json-schema-draft-4@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-ast': 1.0.0-alpha.9 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + ts-mixer: 6.0.4 + + '@swagger-api/apidom-ns-json-schema-draft-6@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-error': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-json-schema-draft-4': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + ts-mixer: 6.0.4 + optional: true + + '@swagger-api/apidom-ns-json-schema-draft-7@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-error': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-json-schema-draft-6': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + ts-mixer: 6.0.4 + optional: true + + '@swagger-api/apidom-ns-openapi-2@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-error': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-json-schema-draft-4': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + ts-mixer: 6.0.4 + optional: true + + '@swagger-api/apidom-ns-openapi-3-0@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-error': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-json-schema-draft-4': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + ts-mixer: 6.0.4 + + '@swagger-api/apidom-ns-openapi-3-1@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-ast': 1.0.0-alpha.9 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-json-pointer': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + ts-mixer: 6.0.4 + + '@swagger-api/apidom-ns-workflows-1@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + ts-mixer: 6.0.4 + optional: true + + '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-api-design-systems': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-json': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + optional: true + + '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-api-design-systems': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + optional: true + + '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-asyncapi-2': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-json': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + optional: true + + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-asyncapi-2': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + optional: true + + '@swagger-api/apidom-parser-adapter-json@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-ast': 1.0.0-alpha.9 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-error': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + tree-sitter: 0.20.4 + tree-sitter-json: 0.20.2 + web-tree-sitter: 0.20.3 + optional: true + + '@swagger-api/apidom-parser-adapter-openapi-json-2@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-openapi-2': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-json': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + optional: true + + '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-json': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + optional: true + + '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-json': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + optional: true + + '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-openapi-2': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + optional: true + + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + optional: true + + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + optional: true + + '@swagger-api/apidom-parser-adapter-workflows-json-1@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-workflows-1': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-json': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + optional: true + + '@swagger-api/apidom-parser-adapter-workflows-yaml-1@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-workflows-1': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + optional: true + + '@swagger-api/apidom-parser-adapter-yaml-1-2@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-ast': 1.0.0-alpha.9 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-error': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + tree-sitter: 0.20.4 + tree-sitter-yaml: 0.5.0 + web-tree-sitter: 0.20.3 + optional: true + + '@swagger-api/apidom-reference@1.0.0-alpha.9': + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@types/ramda': 0.30.1 + axios: 1.7.4 + minimatch: 7.4.6 + process: 0.11.10 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + optionalDependencies: + '@swagger-api/apidom-error': 1.0.0-alpha.9 + '@swagger-api/apidom-json-pointer': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-asyncapi-2': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-openapi-2': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-workflows-1': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-api-design-systems-json': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-api-design-systems-yaml': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-asyncapi-json-2': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-json': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-openapi-json-2': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-openapi-json-3-0': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-openapi-json-3-1': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-openapi-yaml-2': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-workflows-json-1': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-workflows-yaml-1': 1.0.0-alpha.9 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-alpha.9 + transitivePeerDependencies: + - debug + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.5.0 + + '@types/chrome@0.0.262': + dependencies: + '@types/filesystem': 0.0.36 + '@types/har-format': 1.2.15 + + '@types/compression@1.7.5': + dependencies: + '@types/express': 4.17.21 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.5.0 + + '@types/conventional-commits-parser@5.0.0': + dependencies: + '@types/node': 22.5.0 + + '@types/cordova@11.0.3': {} + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.0 + '@types/estree': 1.0.5 + + '@types/eslint@9.6.0': + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.5': {} + + '@types/express-serve-static-core@4.19.5': + dependencies: + '@types/node': 22.5.0 + '@types/qs': 6.9.15 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express@4.17.21': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.5 + '@types/qs': 6.9.15 + '@types/serve-static': 1.15.7 + + '@types/filesystem@0.0.36': + dependencies: + '@types/filewriter': 0.0.33 + + '@types/filewriter@0.0.33': {} + + '@types/har-format@1.2.15': {} + + '@types/hast@2.3.10': + dependencies: + '@types/unist': 2.0.11 + + '@types/http-errors@2.0.4': {} + + '@types/json-schema@7.0.15': {} + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@12.2.3': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdurl@2.0.0': {} + + '@types/mime@1.3.5': {} + + '@types/node-forge@1.3.11': + dependencies: + '@types/node': 22.5.0 + + '@types/node@22.5.0': + dependencies: + undici-types: 6.19.8 + + '@types/qs@6.9.15': {} + + '@types/ramda@0.30.1': + dependencies: + types-ramda: 0.30.1 + + '@types/range-parser@1.2.7': {} + + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 22.5.0 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 22.5.0 + '@types/send': 0.17.4 + + '@types/swagger-ui@3.52.4': {} + + '@types/unist@2.0.11': {} + + '@types/use-sync-external-store@0.0.3': {} + + '@typescript-eslint/eslint-plugin@8.2.0(@typescript-eslint/parser@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4)': + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.2.0 + '@typescript-eslint/type-utils': 8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/utils': 8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.2.0 + eslint: 9.9.0(jiti@1.21.6) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4)': + dependencies: + '@typescript-eslint/scope-manager': 8.2.0 + '@typescript-eslint/types': 8.2.0 + '@typescript-eslint/typescript-estree': 8.2.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.2.0 + debug: 4.3.6 + eslint: 9.9.0(jiti@1.21.6) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.2.0': + dependencies: + '@typescript-eslint/types': 8.2.0 + '@typescript-eslint/visitor-keys': 8.2.0 + + '@typescript-eslint/type-utils@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4)': + dependencies: + '@typescript-eslint/typescript-estree': 8.2.0(typescript@5.5.4) + '@typescript-eslint/utils': 8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) + debug: 4.3.6 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - eslint + - supports-color + + '@typescript-eslint/types@8.2.0': {} + + '@typescript-eslint/typescript-estree@8.2.0(typescript@5.5.4)': + dependencies: + '@typescript-eslint/types': 8.2.0 + '@typescript-eslint/visitor-keys': 8.2.0 + debug: 4.3.6 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.0(jiti@1.21.6)) + '@typescript-eslint/scope-manager': 8.2.0 + '@typescript-eslint/types': 8.2.0 + '@typescript-eslint/typescript-estree': 8.2.0(typescript@5.5.4) + eslint: 9.9.0(jiti@1.21.6) + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@8.2.0': + dependencies: + '@typescript-eslint/types': 8.2.0 + eslint-visitor-keys: 3.4.3 + + '@vitejs/plugin-vue@5.1.2(vite@5.4.2(@types/node@22.5.0)(sass@1.77.8)(terser@5.31.6))(vue@3.4.38(typescript@5.5.4))': + dependencies: + vite: 5.4.2(@types/node@22.5.0)(sass@1.77.8)(terser@5.31.6) + vue: 3.4.38(typescript@5.5.4) + + '@volar/language-core@2.4.0': + dependencies: + '@volar/source-map': 2.4.0 + + '@volar/source-map@2.4.0': {} + + '@volar/typescript@2.4.0': + dependencies: + '@volar/language-core': 2.4.0 + path-browserify: 1.0.1 + vscode-uri: 3.0.8 + + '@vue/compiler-core@3.4.38': + dependencies: + '@babel/parser': 7.25.4 + '@vue/shared': 3.4.38 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + + '@vue/compiler-dom@3.4.38': + dependencies: + '@vue/compiler-core': 3.4.38 + '@vue/shared': 3.4.38 + + '@vue/compiler-sfc@3.4.38': + dependencies: + '@babel/parser': 7.25.4 + '@vue/compiler-core': 3.4.38 + '@vue/compiler-dom': 3.4.38 + '@vue/compiler-ssr': 3.4.38 + '@vue/shared': 3.4.38 + estree-walker: 2.0.2 + magic-string: 0.30.11 + postcss: 8.4.41 + source-map-js: 1.2.0 + + '@vue/compiler-ssr@3.4.38': + dependencies: + '@vue/compiler-dom': 3.4.38 + '@vue/shared': 3.4.38 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/devtools-api@6.6.3': {} + + '@vue/language-core@2.0.29(typescript@5.5.4)': + dependencies: + '@volar/language-core': 2.4.0 + '@vue/compiler-dom': 3.4.38 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.4.38 + computeds: 0.0.1 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.5.4 + + '@vue/reactivity@3.4.38': + dependencies: + '@vue/shared': 3.4.38 + + '@vue/runtime-core@3.4.38': + dependencies: + '@vue/reactivity': 3.4.38 + '@vue/shared': 3.4.38 + + '@vue/runtime-dom@3.4.38': + dependencies: + '@vue/reactivity': 3.4.38 + '@vue/runtime-core': 3.4.38 + '@vue/shared': 3.4.38 + csstype: 3.1.3 + + '@vue/server-renderer@3.4.38(vue@3.4.38(typescript@5.5.4))': + dependencies: + '@vue/compiler-ssr': 3.4.38 + '@vue/shared': 3.4.38 + vue: 3.4.38(typescript@5.5.4) + + '@vue/shared@3.4.38': {} + + '@webassemblyjs/ast@1.12.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} + + '@webassemblyjs/helper-api-error@1.11.6': {} + + '@webassemblyjs/helper-buffer@1.12.1': {} + + '@webassemblyjs/helper-numbers@1.11.6': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} + + '@webassemblyjs/helper-wasm-section@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 + + '@webassemblyjs/ieee754@1.11.6': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.11.6': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.11.6': {} + + '@webassemblyjs/wasm-edit@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 + + '@webassemblyjs/wasm-gen@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wasm-opt@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + + '@webassemblyjs/wasm-parser@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + '@webassemblyjs/wast-printer@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + JSONStream@1.3.5: + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-import-assertions@1.9.0(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + + acorn-jsx@5.3.2(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + + acorn-walk@8.3.3: + dependencies: + acorn: 8.12.1 + + acorn@8.12.1: {} + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.1 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + apg-lite@1.0.4: {} + + archiver-utils@5.0.2: + dependencies: + glob: 10.4.5 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.17.21 + normalize-path: 3.0.0 + readable-stream: 4.5.2 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.5.2 + readdir-glob: 1.1.3 + tar-stream: 3.1.7 + zip-stream: 6.0.1 + + arg@4.1.3: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-flatten@1.1.1: {} + + array-ify@1.0.0: {} + + array-union@2.1.0: {} + + astral-regex@2.0.0: {} + + async@3.2.6: {} + + asynckit@0.4.0: {} + + autolinker@3.16.2: + dependencies: + tslib: 2.6.3 + + autoprefixer@10.4.20(postcss@8.4.41): + dependencies: + browserslist: 4.23.3 + caniuse-lite: 1.0.30001651 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.1 + postcss: 8.4.41 + postcss-value-parser: 4.2.0 + + axios@1.7.4: + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + b4a@1.6.6: {} + + balanced-match@1.0.2: {} + + bare-events@2.4.2: + optional: true + + base64-js@1.5.1: {} + + big.js@5.2.2: {} + + binary-extensions@2.3.0: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + body-parser@1.20.2: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + boolbase@1.0.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.23.3: + dependencies: + caniuse-lite: 1.0.30001651 + electron-to-chromium: 1.5.13 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) + + buffer-crc32@1.0.0: {} + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.0.0 + + bytes@3.0.0: {} + + bytes@3.1.2: {} + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + callsites@3.1.0: {} + + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.6.3 + + caniuse-lite@1.0.30001651: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.3.0: {} + + character-entities-legacy@1.1.4: {} + + character-entities@1.2.4: {} + + character-reference-invalid@1.1.4: {} + + chardet@0.7.0: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@1.1.4: + optional: true + + chrome-trace-event@1.0.4: {} + + ci-info@4.0.0: {} + + classnames@2.5.1: {} + + clean-css@5.3.3: + dependencies: + source-map: 0.6.1 + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-spinners@2.9.2: {} + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + + cli-width@4.1.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + clone@1.0.4: {} + + clone@2.1.2: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@1.0.8: {} + + commander@10.0.1: {} + + commander@12.1.0: {} + + commander@2.20.3: {} + + commander@8.3.0: {} + + compare-func@2.0.0: + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + + compress-commons@6.0.2: + dependencies: + crc-32: 1.2.2 + crc32-stream: 6.0.0 + is-stream: 2.0.1 + normalize-path: 3.0.0 + readable-stream: 4.5.2 + + compressible@2.0.18: + dependencies: + mime-db: 1.53.0 + + compression@1.7.4: + dependencies: + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + computeds@0.0.1: {} + + concat-map@0.0.1: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + conventional-changelog-angular@7.0.0: + dependencies: + compare-func: 2.0.0 + + conventional-changelog-conventionalcommits@7.0.2: + dependencies: + compare-func: 2.0.0 + + conventional-commits-parser@5.0.0: + dependencies: + JSONStream: 1.3.5 + is-text-path: 2.0.0 + meow: 12.1.1 + split2: 4.2.0 + + cookie-signature@1.0.6: {} + + cookie@0.6.0: {} + + copy-to-clipboard@3.3.3: + dependencies: + toggle-selection: 1.0.6 + + core-js-pure@3.38.1: {} + + core-util-is@1.0.3: {} + + cosmiconfig-typescript-loader@5.0.0(@types/node@22.5.0)(cosmiconfig@9.0.0(typescript@5.5.4))(typescript@5.5.4): + dependencies: + '@types/node': 22.5.0 + cosmiconfig: 9.0.0(typescript@5.5.4) + jiti: 1.21.6 + typescript: 5.5.4 + + cosmiconfig@9.0.0(typescript@5.5.4): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.5.4 + + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.5.2 + + create-require@1.1.1: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css.escape@1.5.1: {} + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + dargs@8.1.0: {} + + de-indent@1.0.2: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.3.6: + dependencies: + ms: 2.1.2 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + optional: true + + deep-extend@0.6.0: {} + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + default-browser-id@5.0.0: {} + + default-browser@5.2.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-lazy-prop@2.0.0: {} + + define-lazy-prop@3.0.0: {} + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + destroy@1.2.0: {} + + detect-libc@2.0.3: + optional: true + + diff@4.0.2: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dompurify@3.1.4: {} + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.6.3 + + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + + dot-prop@9.0.0: + dependencies: + type-fest: 4.25.0 + + dotenv-expand@11.0.6: + dependencies: + dotenv: 16.4.5 + + dotenv@16.4.5: {} + + drange@1.1.1: {} + + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.13: {} + + elementtree@0.1.7: + dependencies: + sax: 1.1.4 + + emoji-regex@10.3.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + emojis-list@3.0.0: {} + + encodeurl@1.0.2: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + optional: true + + enhanced-resolve@5.17.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + entities@2.1.0: {} + + entities@4.5.0: {} + + env-paths@2.2.1: {} + + environment@1.1.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-module-lexer@1.5.4: {} + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + + escalade@3.1.2: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@9.1.0(eslint@9.9.0(jiti@1.21.6)): + dependencies: + eslint: 9.9.0(jiti@1.21.6) + + eslint-plugin-prettier@5.2.1(@types/eslint@9.6.0)(eslint-config-prettier@9.1.0(eslint@9.9.0(jiti@1.21.6)))(eslint@9.9.0(jiti@1.21.6))(prettier@3.3.3): + dependencies: + eslint: 9.9.0(jiti@1.21.6) + prettier: 3.3.3 + prettier-linter-helpers: 1.0.0 + synckit: 0.9.1 + optionalDependencies: + '@types/eslint': 9.6.0 + eslint-config-prettier: 9.1.0(eslint@9.9.0(jiti@1.21.6)) + + eslint-plugin-vue@9.27.0(eslint@9.9.0(jiti@1.21.6)): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.0(jiti@1.21.6)) + eslint: 9.9.0(jiti@1.21.6) + globals: 13.24.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.1.2 + semver: 7.6.3 + vue-eslint-parser: 9.4.3(eslint@9.9.0(jiti@1.21.6)) + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - supports-color + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-scope@8.0.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.0.0: {} + + eslint@9.9.0(jiti@1.21.6): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.0(jiti@1.21.6)) + '@eslint-community/regexpp': 4.11.0 + '@eslint/config-array': 0.17.1 + '@eslint/eslintrc': 3.1.0 + '@eslint/js': 9.9.0 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.3.0 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.6 + escape-string-regexp: 4.0.0 + eslint-scope: 8.0.2 + eslint-visitor-keys: 4.0.0 + espree: 10.1.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + optionalDependencies: + jiti: 1.21.6 + transitivePeerDependencies: + - supports-color + + espree@10.1.0: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 4.0.0 + + espree@9.6.1: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + event-target-shim@5.0.1: {} + + eventemitter3@5.0.1: {} + + events@3.3.0: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + expand-template@2.0.3: + optional: true + + express@4.19.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.2 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.6.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-fifo@1.3.2: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fast-json-patch@3.1.1: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.0.1: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fault@1.0.4: + dependencies: + format: 0.2.2 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.2.0: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + find-up@7.0.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + + flat@5.0.2: {} + + flatted@3.3.1: {} + + follow-redirects@1.15.6: {} + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + format@0.2.2: {} + + forwarded@0.2.0: {} + + fraction.js@4.3.7: {} + + fresh@0.5.2: {} + + front-matter@4.0.2: + dependencies: + js-yaml: 3.14.1 + + fs-constants@1.0.0: + optional: true + + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.2.0: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-stream@8.0.1: {} + + git-raw-commits@4.0.0: + dependencies: + dargs: 8.1.0 + meow: 12.1.1 + split2: 4.2.0 + + github-from-package@0.0.0: + optional: true + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + + global-directory@4.0.1: + dependencies: + ini: 4.1.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globals@14.0.0: {} + + globals@15.9.0: {} + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-parse-selector@2.2.5: {} + + hastscript@6.0.0: + dependencies: + '@types/hast': 2.3.10 + comma-separated-tokens: 1.0.8 + hast-util-parse-selector: 2.2.5 + property-information: 5.6.0 + space-separated-tokens: 1.1.5 + + he@1.2.0: {} + + highlight.js@10.7.3: {} + + html-minifier-terser@7.2.0: + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 10.0.1 + entities: 4.5.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.31.6 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + human-signals@5.0.0: {} + + husky@9.1.5: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + immutable@3.8.2: {} + + immutable@4.3.7: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-meta-resolve@4.1.0: {} + + imurmurhash@0.1.4: {} + + inherits@2.0.4: {} + + ini@1.3.8: + optional: true + + ini@4.1.1: {} + + inquirer@9.3.6: + dependencies: + '@inquirer/figures': 1.0.5 + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + external-editor: 3.1.0 + mute-stream: 1.0.0 + ora: 5.4.1 + run-async: 3.0.0 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + + ipaddr.js@1.9.1: {} + + is-alphabetical@1.0.4: {} + + is-alphanumerical@1.0.4: + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + + is-arrayish@0.2.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-decimal@1.0.4: {} + + is-docker@2.2.1: {} + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.2.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@1.0.4: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-interactive@1.0.0: {} + + is-number@7.0.0: {} + + is-obj@2.0.0: {} + + is-path-inside@3.0.3: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-text-path@2.0.0: + dependencies: + text-extensions: 2.4.0 + + is-unicode-supported@0.1.0: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isarray@1.0.0: {} + + isbinaryfile@5.0.2: {} + + isexe@2.0.0: {} + + isobject@3.0.1: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jest-worker@27.5.1: + dependencies: + '@types/node': 22.5.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jiti@1.21.6: {} + + js-file-download@0.4.12: {} + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonparse@1.3.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@6.0.3: {} + + kolorist@1.8.0: {} + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@3.1.2: {} + + lines-and-columns@1.2.4: {} + + linkify-it@3.0.3: + dependencies: + uc.micro: 1.0.6 + + lint-staged@15.2.9: + dependencies: + chalk: 5.3.0 + commander: 12.1.0 + debug: 4.3.6 + execa: 8.0.1 + lilconfig: 3.1.2 + listr2: 8.2.4 + micromatch: 4.0.7 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.5.0 + transitivePeerDependencies: + - supports-color + + listr2@8.2.4: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + + loader-runner@4.3.0: {} + + loader-utils@2.0.4: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash.camelcase@4.3.0: {} + + lodash.debounce@4.0.8: {} + + lodash.isplainobject@4.0.6: {} + + lodash.kebabcase@4.1.1: {} + + lodash.merge@4.6.2: {} + + lodash.mergewith@4.6.2: {} + + lodash.snakecase@4.1.1: {} + + lodash.startcase@4.4.0: {} + + lodash.truncate@4.4.2: {} + + lodash.uniq@4.5.0: {} + + lodash.upperfirst@4.3.1: {} + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lower-case@2.0.2: + dependencies: + tslib: 2.6.3 + + lowlight@1.20.0: + dependencies: + fault: 1.0.4 + highlight.js: 10.7.3 + + lru-cache@10.4.3: {} + + magic-string@0.30.11: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + make-error@1.3.6: {} + + markdown-it-abbr@1.0.4: {} + + markdown-it-container@3.0.0: {} + + markdown-it-deflist@2.1.0: {} + + markdown-it-emoji@2.0.2: {} + + markdown-it-footnote@3.0.3: {} + + markdown-it-imsize@2.0.1: {} + + markdown-it-ins@3.0.1: {} + + markdown-it-mark@3.0.1: {} + + markdown-it-sub@1.0.0: {} + + markdown-it-sup@1.0.0: {} + + markdown-it-task-lists@2.1.1: {} + + markdown-it-toc-and-anchor@4.2.0: + dependencies: + clone: 2.1.2 + uslug: 1.0.4 + + markdown-it@12.3.2: + dependencies: + argparse: 2.0.1 + entities: 2.1.0 + linkify-it: 3.0.3 + mdurl: 1.0.1 + uc.micro: 1.0.6 + + mdurl@1.0.1: {} + + media-typer@0.3.0: {} + + meow@12.1.1: {} + + merge-descriptors@1.0.1: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + methods@1.1.2: {} + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-db@1.53.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + mimic-function@5.0.1: {} + + mimic-response@3.1.0: + optional: true + + minim@0.23.8: + dependencies: + lodash: 4.17.21 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@7.4.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mkdirp-classic@0.5.3: + optional: true + + ms@2.0.0: {} + + ms@2.1.2: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + mute-stream@1.0.0: {} + + nan@2.20.0: + optional: true + + nanoid@3.3.7: {} + + napi-build-utils@1.0.2: + optional: true + + natural-compare@1.4.0: {} + + negotiator@0.6.3: {} + + neo-async@2.6.2: {} + + neotraverse@0.6.18: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.6.3 + + node-abi@3.67.0: + dependencies: + semver: 7.6.3 + optional: true + + node-abort-controller@3.1.1: {} + + node-domexception@1.0.0: {} + + node-fetch-commonjs@3.3.2: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + node-forge@1.3.1: {} + + node-releases@2.0.18: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-assign@4.1.1: {} + + object-inspect@1.13.2: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.0.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + optional: true + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + open@10.1.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + openapi-path-templating@1.6.0: + dependencies: + apg-lite: 1.0.4 + + openapi-server-url-templating@1.1.0: + dependencies: + apg-lite: 1.0.4 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + os-tmpdir@1.0.2: {} + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.1.1 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + package-json-from-dist@1.0.0: {} + + param-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.6.3 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@2.0.0: + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.24.7 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parseurl@1.3.3: {} + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.6.3 + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-exists@5.0.0: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@0.1.7: {} + + path-type@4.0.0: {} + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + pidtree@0.6.0: {} + + pinia@2.2.2(typescript@5.5.4)(vue@3.4.38(typescript@5.5.4)): + dependencies: + '@vue/devtools-api': 6.6.3 + vue: 3.4.38(typescript@5.5.4) + vue-demi: 0.14.10(vue@3.4.38(typescript@5.5.4)) + optionalDependencies: + typescript: 5.5.4 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.41: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + prebuild-install@7.1.2: + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.67.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + optional: true + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@3.3.3: {} + + prismjs@1.27.0: {} + + prismjs@1.29.0: {} + + process-nextick-args@2.0.1: {} + + process@0.11.10: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + property-information@5.6.0: + dependencies: + xtend: 4.0.2 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-from-env@1.1.0: {} + + pump@3.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + optional: true + + punycode@2.3.1: {} + + qs@6.11.0: + dependencies: + side-channel: 1.0.6 + + quasar@2.16.9: {} + + querystringify@2.2.0: {} + + queue-microtask@1.2.3: {} + + queue-tick@1.0.1: {} + + ramda-adjunct@5.1.0(ramda@0.30.1): + dependencies: + ramda: 0.30.1 + + ramda@0.30.1: {} + + randexp@0.5.3: + dependencies: + drange: 1.1.1 + ret: 0.2.2 + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + raw-loader@4.0.2(webpack@5.91.0): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.3.0 + webpack: 5.91.0 + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + optional: true + + react-copy-to-clipboard@5.1.0(react@18.3.1): + dependencies: + copy-to-clipboard: 3.3.3 + prop-types: 15.8.1 + react: 18.3.1 + + react-debounce-input@3.3.0(react@18.3.1): + dependencies: + lodash.debounce: 4.0.8 + prop-types: 15.8.1 + react: 18.3.1 + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-immutable-proptypes@2.2.0(immutable@3.8.2): + dependencies: + immutable: 3.8.2 + invariant: 2.2.4 + + react-immutable-pure-component@2.2.2(immutable@3.8.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + immutable: 3.8.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-inspector@6.0.2(react@18.3.1): + dependencies: + react: 18.3.1 + + react-is@16.13.1: {} + + react-redux@9.1.2(react@18.3.1)(redux@5.0.1): + dependencies: + '@types/use-sync-external-store': 0.0.3 + react: 18.3.1 + use-sync-external-store: 1.2.2(react@18.3.1) + optionalDependencies: + redux: 5.0.1 + + react-syntax-highlighter@15.5.0(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.4 + highlight.js: 10.7.3 + lowlight: 1.20.0 + prismjs: 1.29.0 + react: 18.3.1 + refractor: 3.6.0 + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.5.2: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.6 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + redux-immutable@4.0.0(immutable@3.8.2): + dependencies: + immutable: 3.8.2 + + redux@5.0.1: {} + + refractor@3.6.0: + dependencies: + hastscript: 6.0.0 + parse-entities: 2.0.0 + prismjs: 1.27.0 + + regenerator-runtime@0.14.1: {} + + relateurl@0.2.7: {} + + remarkable@2.0.1: + dependencies: + argparse: 1.0.10 + autolinker: 3.16.2 + + repeat-string@1.6.1: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + requires-port@1.0.0: {} + + reselect@5.1.1: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + ret@0.2.2: {} + + reusify@1.0.4: {} + + rfdc@1.4.1: {} + + rollup-plugin-visualizer@5.12.0(rollup@4.21.0): + dependencies: + open: 8.4.2 + picomatch: 2.3.1 + source-map: 0.7.4 + yargs: 17.7.2 + optionalDependencies: + rollup: 4.21.0 + + rollup@4.21.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.21.0 + '@rollup/rollup-android-arm64': 4.21.0 + '@rollup/rollup-darwin-arm64': 4.21.0 + '@rollup/rollup-darwin-x64': 4.21.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.0 + '@rollup/rollup-linux-arm-musleabihf': 4.21.0 + '@rollup/rollup-linux-arm64-gnu': 4.21.0 + '@rollup/rollup-linux-arm64-musl': 4.21.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.0 + '@rollup/rollup-linux-riscv64-gnu': 4.21.0 + '@rollup/rollup-linux-s390x-gnu': 4.21.0 + '@rollup/rollup-linux-x64-gnu': 4.21.0 + '@rollup/rollup-linux-x64-musl': 4.21.0 + '@rollup/rollup-win32-arm64-msvc': 4.21.0 + '@rollup/rollup-win32-ia32-msvc': 4.21.0 + '@rollup/rollup-win32-x64-msvc': 4.21.0 + fsevents: 2.3.3 + + run-applescript@7.0.0: {} + + run-async@3.0.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.1: + dependencies: + tslib: 2.6.3 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sass@1.77.8: + dependencies: + chokidar: 3.6.0 + immutable: 4.3.7 + source-map-js: 1.2.0 + + sax@1.1.4: {} + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + selfsigned@2.4.1: + dependencies: + '@types/node-forge': 1.3.11 + node-forge: 1.3.1 + + semver@7.6.3: {} + + send@0.18.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serialize-error@8.1.0: + dependencies: + type-fest: 0.20.2 + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + serve-static@1.15.0: + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + + set-function-length@1.2.2: + 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 + + setprototypeof@1.2.0: {} + + sha.js@2.4.11: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + short-unique-id@5.2.0: {} + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-concat@1.0.1: + optional: true + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + optional: true + + slash@3.0.0: {} + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + + source-map-js@1.2.0: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + space-separated-tokens@1.1.5: {} + + split2@4.2.0: {} + + sprintf-js@1.0.3: {} + + stack-trace@1.0.0-pre2: {} + + statuses@2.0.1: {} + + streamx@2.19.0: + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + text-decoder: 1.1.1 + optionalDependencies: + bare-events: 2.4.2 + + string-argv@0.3.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-final-newline@3.0.0: {} + + strip-json-comments@2.0.1: + optional: true + + strip-json-comments@3.1.1: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + swagger-client@3.29.2(ramda@0.30.1): + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@swagger-api/apidom-core': 1.0.0-alpha.9 + '@swagger-api/apidom-error': 1.0.0-alpha.9 + '@swagger-api/apidom-json-pointer': 1.0.0-alpha.9 + '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-alpha.9 + '@swagger-api/apidom-reference': 1.0.0-alpha.9 + cookie: 0.6.0 + deepmerge: 4.3.1 + fast-json-patch: 3.1.1 + js-yaml: 4.1.0 + neotraverse: 0.6.18 + node-abort-controller: 3.1.1 + node-fetch-commonjs: 3.3.2 + openapi-path-templating: 1.6.0 + openapi-server-url-templating: 1.1.0 + ramda-adjunct: 5.1.0(ramda@0.30.1) + transitivePeerDependencies: + - debug + - ramda + + swagger-ui@5.17.14(ramda@0.30.1): + dependencies: + '@babel/runtime-corejs3': 7.25.0 + '@braintree/sanitize-url': 7.0.2 + base64-js: 1.5.1 + classnames: 2.5.1 + css.escape: 1.5.1 + deep-extend: 0.6.0 + dompurify: 3.1.4 + ieee754: 1.2.1 + immutable: 3.8.2 + js-file-download: 0.4.12 + js-yaml: 4.1.0 + lodash: 4.17.21 + prop-types: 15.8.1 + randexp: 0.5.3 + randombytes: 2.1.0 + react: 18.3.1 + react-copy-to-clipboard: 5.1.0(react@18.3.1) + react-debounce-input: 3.3.0(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) + react-immutable-proptypes: 2.2.0(immutable@3.8.2) + react-immutable-pure-component: 2.2.2(immutable@3.8.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-inspector: 6.0.2(react@18.3.1) + react-redux: 9.1.2(react@18.3.1)(redux@5.0.1) + react-syntax-highlighter: 15.5.0(react@18.3.1) + redux: 5.0.1 + redux-immutable: 4.0.0(immutable@3.8.2) + remarkable: 2.0.1 + reselect: 5.1.1 + serialize-error: 8.1.0 + sha.js: 2.4.11 + swagger-client: 3.29.2(ramda@0.30.1) + url-parse: 1.5.10 + xml: 1.0.1 + xml-but-prettier: 1.0.1 + zenscroll: 4.0.2 + transitivePeerDependencies: + - '@types/react' + - debug + - ramda + + synckit@0.9.1: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.3 + + table@6.8.2: + dependencies: + ajv: 8.17.1 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + tapable@2.2.1: {} + + tar-fs@2.1.1: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + optional: true + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + optional: true + + tar-stream@3.1.7: + dependencies: + b4a: 1.6.6 + fast-fifo: 1.3.2 + streamx: 2.19.0 + + terser-webpack-plugin@5.3.10(webpack@5.91.0): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.31.6 + webpack: 5.91.0 + + terser@5.31.6: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.12.1 + commander: 2.20.3 + source-map-support: 0.5.21 + + text-decoder@1.1.1: + dependencies: + b4a: 1.6.6 + + text-extensions@2.4.0: {} + + text-table@0.2.0: {} + + through@2.3.8: {} + + tiny-invariant@1.3.3: {} + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toggle-selection@1.0.6: {} + + toidentifier@1.0.1: {} + + tree-sitter-json@0.20.2: + dependencies: + nan: 2.20.0 + optional: true + + tree-sitter-yaml@0.5.0: + dependencies: + nan: 2.20.0 + optional: true + + tree-sitter@0.20.4: + dependencies: + nan: 2.20.0 + prebuild-install: 7.1.2 + optional: true + + ts-api-utils@1.3.0(typescript@5.5.4): + dependencies: + typescript: 5.5.4 + + ts-essentials@9.4.2(typescript@5.5.4): + optionalDependencies: + typescript: 5.5.4 + + ts-mixer@6.0.4: {} + + ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.5.0 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + ts-toolbelt@9.6.0: {} + + tslib@2.6.3: {} + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + optional: true + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@4.25.0: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + types-ramda@0.30.1: + dependencies: + ts-toolbelt: 9.6.0 + + typescript-eslint@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4): + dependencies: + '@typescript-eslint/eslint-plugin': 8.2.0(@typescript-eslint/parser@8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/parser': 8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) + '@typescript-eslint/utils': 8.2.0(eslint@9.9.0(jiti@1.21.6))(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - eslint + - supports-color + + typescript@5.5.4: {} + + uc.micro@1.0.6: {} + + undici-types@6.19.8: {} + + unicorn-magic@0.1.0: {} + + universalify@2.0.1: {} + + unorm@1.6.0: {} + + unpipe@1.0.0: {} + + unraw@3.0.0: {} + + update-browserslist-db@1.1.0(browserslist@4.23.3): + dependencies: + browserslist: 4.23.3 + escalade: 3.1.2 + picocolors: 1.0.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + + use-sync-external-store@1.2.2(react@18.3.1): + dependencies: + react: 18.3.1 + + uslug@1.0.4: + dependencies: + unorm: 1.6.0 + + util-deprecate@1.0.2: {} + + utils-merge@1.0.1: {} + + v8-compile-cache-lib@3.0.1: {} + + vary@1.1.2: {} + + vite-plugin-checker@0.7.2(eslint@9.9.0(jiti@1.21.6))(optionator@0.9.4)(typescript@5.5.4)(vite@5.4.2(@types/node@22.5.0)(sass@1.77.8)(terser@5.31.6))(vue-tsc@2.0.29(typescript@5.5.4)): + dependencies: + '@babel/code-frame': 7.24.7 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + chokidar: 3.6.0 + commander: 8.3.0 + fast-glob: 3.3.2 + fs-extra: 11.2.0 + npm-run-path: 4.0.1 + strip-ansi: 6.0.1 + tiny-invariant: 1.3.3 + vite: 5.4.2(@types/node@22.5.0)(sass@1.77.8)(terser@5.31.6) + vscode-languageclient: 7.0.0 + vscode-languageserver: 7.0.0 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + optionalDependencies: + eslint: 9.9.0(jiti@1.21.6) + optionator: 0.9.4 + typescript: 5.5.4 + vue-tsc: 2.0.29(typescript@5.5.4) + + vite@5.4.2(@types/node@22.5.0)(sass@1.77.8)(terser@5.31.6): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.41 + rollup: 4.21.0 + optionalDependencies: + '@types/node': 22.5.0 + fsevents: 2.3.3 + sass: 1.77.8 + terser: 5.31.6 + + vscode-jsonrpc@6.0.0: {} + + vscode-languageclient@7.0.0: + dependencies: + minimatch: 3.1.2 + semver: 7.6.3 + vscode-languageserver-protocol: 3.16.0 + + vscode-languageserver-protocol@3.16.0: + dependencies: + vscode-jsonrpc: 6.0.0 + vscode-languageserver-types: 3.16.0 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.16.0: {} + + vscode-languageserver@7.0.0: + dependencies: + vscode-languageserver-protocol: 3.16.0 + + vscode-uri@3.0.8: {} + + vue-demi@0.14.10(vue@3.4.38(typescript@5.5.4)): + dependencies: + vue: 3.4.38(typescript@5.5.4) + + vue-eslint-parser@9.4.3(eslint@9.9.0(jiti@1.21.6)): + dependencies: + debug: 4.3.6 + eslint: 9.9.0(jiti@1.21.6) + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + lodash: 4.17.21 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + vue-router@4.4.3(vue@3.4.38(typescript@5.5.4)): + dependencies: + '@vue/devtools-api': 6.6.3 + vue: 3.4.38(typescript@5.5.4) + + vue-tsc@2.0.29(typescript@5.5.4): + dependencies: + '@volar/typescript': 2.4.0 + '@vue/language-core': 2.0.29(typescript@5.5.4) + semver: 7.6.3 + typescript: 5.5.4 + + vue@3.4.38(typescript@5.5.4): + dependencies: + '@vue/compiler-dom': 3.4.38 + '@vue/compiler-sfc': 3.4.38 + '@vue/runtime-dom': 3.4.38 + '@vue/server-renderer': 3.4.38(vue@3.4.38(typescript@5.5.4)) + '@vue/shared': 3.4.38 + optionalDependencies: + typescript: 5.5.4 + + watchpack@2.4.2: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + web-streams-polyfill@3.3.3: {} + + web-tree-sitter@0.20.3: + optional: true + + webpack-merge@5.10.0: + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + webpack-merge@6.0.1: + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + webpack-sources@3.2.3: {} + + webpack@5.91.0: + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.12.1 + acorn-import-assertions: 1.9.0(acorn@8.12.1) + browserslist: 4.23.3 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.1 + es-module-lexer: 1.5.4 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(webpack@5.91.0) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wildcard@2.0.1: {} + + word-wrap@1.2.5: {} + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + wrappy@1.0.2: + optional: true + + xml-but-prettier@1.0.1: + dependencies: + repeat-string: 1.6.1 + + xml-name-validator@4.0.0: {} + + xml@1.0.1: {} + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yaml@2.5.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} + + yocto-queue@1.1.1: {} + + yoctocolors-cjs@2.1.2: {} + + zenscroll@4.0.2: {} + + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.5.2 diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js new file mode 100644 index 0000000..8fedede --- /dev/null +++ b/frontend/postcss.config.js @@ -0,0 +1,17 @@ +// https://github.com/michael-ciniawsky/postcss-load-config +// TODO rename to postcss.config.js with vite v6 +import autoprefixer from 'autoprefixer' + +export default { + plugins: [ + // https://github.com/postcss/autoprefixer + autoprefixer, + + // https://github.com/elchininet/postcss-rtlcss + // If you want to support RTL css, then + // 1. yarn/npm install postcss-rtlcss + // 2. optionally set quasar.config.js > framework > lang to an RTL language + // 3. uncomment the following line: + // require('postcss-rtlcss') + ], +} diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ae7bbdb712f8ce9fe49761b68ef3a2d4c51606f9 GIT binary patch literal 64483 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 literal 0 HcmV?d00001 diff --git a/frontend/public/icons/favicon-128x128.png b/frontend/public/icons/favicon-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..14011761929f4ffbef81be318a347c0032eb6f42 GIT binary patch literal 12324 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 h$J#u>{O`^5_ ({ + // https://v2.quasar.dev/quasar-cli-vite/prefetch-feature + // preFetch: true, + + // app boot file (/src/boot) + // --> boot files are part of "main.js" + // https://v2.quasar.dev/quasar-cli-vite/boot-files + boot: [], + + // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#css + css: ['app.scss'], + + // https://github.com/quasarframework/quasar/tree/dev/extras + extras: [ + // 'ionicons-v4', + // 'mdi-v7', + // 'fontawesome-v6', + // 'eva-icons', + // 'themify', + // 'line-awesome', + // 'roboto-font-latin-ext', // this or either 'roboto-font', NEVER both! + //'roboto-font', // optional, you are not bound to it + //'material-icons', // optional, you are not bound to it + ], + + // Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#build + build: { + target: { + // browser: ['es2022', 'firefox115', 'chrome115', 'safari14'], + // node: 'node20', + }, + + vueRouterMode: 'hash', // available values: 'hash', 'history' + // vueRouterBase, + // vueDevtools, + // vueOptionsAPI: false, + + // rebuildCache: true, // rebuilds Vite/linter/etc cache on startup + + // publicPath: '/', + // analyze: true, + // env: {}, + // rawDefine: {} + // ignorePublicFolder: true, + // minify: false, + // polyfillModulePreload: true, + // distDir + + // extendViteConf (viteConf) {}, + // viteVuePluginOptions: {}, + + vitePlugins: [ + [ + 'vite-plugin-checker', + { + eslint: { + lintCommand: 'eslint', + useFlatConfig: true, + }, + vueTsc: { + tsconfigPath: 'tsconfig.vue-tsc.json', + }, + }, + { server: false }, + ], + ], + }, + + // Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#devServer + devServer: { + // https: true + open: true, // opens browser window automatically + port: 9092, + }, + + // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#framework + framework: { + config: {}, + + iconSet: 'svg-mdi-v7', // Quasar icon set + lang: 'en-US', // Quasar language pack + + // For special cases outside of where the auto-import strategy can have an impact + // (like functional components as one of the examples), + // you can manually specify Quasar components/directives to be available everywhere: + // + // components: [], + // directives: [], + + // Quasar plugins + plugins: [], + }, + + // animations: 'all', // --- includes all animations + // https://v2.quasar.dev/options/animations + animations: [], + + // https://v2.quasar.dev/quasar-cli-vite/quasar-config-js#sourcefiles + // sourceFiles: { + // rootComponent: 'src/App.vue', + // router: 'src/router/index', + // store: 'src/store/index', + // pwaRegisterServiceWorker: 'src-pwa/register-service-worker', + // pwaServiceWorker: 'src-pwa/custom-service-worker', + // pwaManifestFile: 'src-pwa/manifest.json', + // electronMain: 'src-electron/electron-main', + // electronPreload: 'src-electron/electron-preload' + // bexManifestFile: 'src-bex/manifest.json + // }, + + // https://v2.quasar.dev/quasar-cli-vite/developing-ssr/configuring-ssr + ssr: { + prodPort: 3000, // The default port that the production server should use + // (gets superseded if process.env.PORT is specified at runtime) + + middlewares: [ + 'render', // keep this as last one + ], + + // extendPackageJson (json) {}, + // extendSSRWebserverConf (esbuildConf) {}, + + // manualStoreSerialization: true, + // manualStoreSsrContextInjection: true, + // manualStoreHydration: true, + // manualPostHydrationTrigger: true, + + pwa: false, + + // pwaOfflineHtmlFilename: 'offline.html', // do NOT use index.html as name! + // will mess up SSR + + // pwaExtendGenerateSWOptions (cfg) {}, + // pwaExtendInjectManifestOptions (cfg) {} + }, + + // https://v2.quasar.dev/quasar-cli-vite/developing-pwa/configuring-pwa + pwa: { + workboxMode: 'GenerateSW', // 'GenerateSW' or 'InjectManifest' + // swFilename: 'sw.js', + // manifestFilename: 'manifest.json' + // extendManifestJson (json) {}, + // useCredentialsForManifestTag: true, + // injectPwaMetaTags: false, + // extendPWACustomSWConf (esbuildConf) {}, + // extendGenerateSWOptions (cfg) {}, + // extendInjectManifestOptions (cfg) {} + }, + + // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-cordova-apps/configuring-cordova + cordova: { + // noIosLegacyBuildFlag: true, // uncomment only if you know what you are doing + }, + + // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-capacitor-apps/configuring-capacitor + capacitor: { + hideSplashscreen: true, + }, + + // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-electron-apps/configuring-electron + electron: { + // extendElectronMainConf (esbuildConf) {}, + // extendElectronPreloadConf (esbuildConf) {}, + + // extendPackageJson (json) {}, + + // Electron preload scripts (if any) from /src-electron, WITHOUT file extension + preloadScripts: ['electron-preload'], + + // specify the debugging port to use for the Electron app when running in development mode + inspectPort: 5858, + + bundler: 'packager', // 'packager' or 'builder' + + packager: { + // https://github.com/electron-userland/electron-packager/blob/master/docs/api.md#options + // OS X / Mac App Store + // appBundleId: '', + // appCategoryType: '', + // osxSign: '', + // protocol: 'myapp://path', + // Windows only + // win32metadata: { ... } + }, + + builder: { + // https://www.electron.build/configuration/configuration + + appId: 'openapi-catalog-frontend', + }, + }, + + // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-browser-extensions/configuring-bex + bex: { + // extendBexScriptsConf (esbuildConf) {}, + // extendBexManifestJson (json) {}, + + contentScripts: ['my-content-script'], + }, +})) diff --git a/frontend/quasar.extensions.json b/frontend/quasar.extensions.json new file mode 100644 index 0000000..0b4e8db --- /dev/null +++ b/frontend/quasar.extensions.json @@ -0,0 +1,3 @@ +{ + "@quasar/qmarkdown": {} +} diff --git a/frontend/src/App.vue b/frontend/src/App.vue new file mode 100644 index 0000000..e676257 --- /dev/null +++ b/frontend/src/App.vue @@ -0,0 +1,29 @@ + + + diff --git a/frontend/src/assets/quasar-logo-vertical.svg b/frontend/src/assets/quasar-logo-vertical.svg new file mode 100644 index 0000000..d039b53 --- /dev/null +++ b/frontend/src/assets/quasar-logo-vertical.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/frontend/src/boot/.gitkeep b/frontend/src/boot/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/components/CReportDiff.vue b/frontend/src/components/CReportDiff.vue new file mode 100644 index 0000000..39dc541 --- /dev/null +++ b/frontend/src/components/CReportDiff.vue @@ -0,0 +1,32 @@ + + + diff --git a/frontend/src/components/CReportDiffSummary.vue b/frontend/src/components/CReportDiffSummary.vue new file mode 100644 index 0000000..c3cecda --- /dev/null +++ b/frontend/src/components/CReportDiffSummary.vue @@ -0,0 +1,47 @@ + + + diff --git a/frontend/src/components/CReportLint.vue b/frontend/src/components/CReportLint.vue new file mode 100644 index 0000000..6c71dc1 --- /dev/null +++ b/frontend/src/components/CReportLint.vue @@ -0,0 +1,40 @@ + + + diff --git a/frontend/src/components/CReportLintSummary.vue b/frontend/src/components/CReportLintSummary.vue new file mode 100644 index 0000000..f2f42af --- /dev/null +++ b/frontend/src/components/CReportLintSummary.vue @@ -0,0 +1,39 @@ + + + diff --git a/frontend/src/components/document/CSwaggerUI.vue b/frontend/src/components/document/CSwaggerUI.vue new file mode 100644 index 0000000..8a88bb2 --- /dev/null +++ b/frontend/src/components/document/CSwaggerUI.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/frontend/src/components/specification/DUploadLintingRule.vue b/frontend/src/components/specification/DUploadLintingRule.vue new file mode 100644 index 0000000..c885636 --- /dev/null +++ b/frontend/src/components/specification/DUploadLintingRule.vue @@ -0,0 +1,44 @@ + + + diff --git a/frontend/src/components/specification/DUploadSpecification.vue b/frontend/src/components/specification/DUploadSpecification.vue new file mode 100644 index 0000000..2c9d323 --- /dev/null +++ b/frontend/src/components/specification/DUploadSpecification.vue @@ -0,0 +1,100 @@ + + + diff --git a/frontend/src/css/app.scss b/frontend/src/css/app.scss new file mode 100644 index 0000000..ecac98f --- /dev/null +++ b/frontend/src/css/app.scss @@ -0,0 +1 @@ +// app global css in SCSS form diff --git a/frontend/src/css/quasar.variables.scss b/frontend/src/css/quasar.variables.scss new file mode 100644 index 0000000..2605a0d --- /dev/null +++ b/frontend/src/css/quasar.variables.scss @@ -0,0 +1,25 @@ +// Quasar SCSS (& Sass) Variables +// -------------------------------------------------- +// To customize the look and feel of this app, you can override +// the Sass/SCSS variables found in Quasar's source Sass/SCSS files. + +// Check documentation for full list of Quasar variables + +// Your own variables (that are declared here) and Quasar's own +// ones will be available out of the box in your .vue/.scss/.sass files + +// It's highly recommended to change the default colors +// to match your app's branding. +// Tip: Use the "Theme Builder" on Quasar's documentation website. + +$primary: #1976d2; +$secondary: #26a69a; +$accent: #9c27b0; + +$dark: #1d1d1d; +$dark-page: #121212; + +$positive: #21ba45; +$negative: #c10015; +$info: #31ccec; +$warning: #f2c037; diff --git a/frontend/src/env.d.ts b/frontend/src/env.d.ts new file mode 100644 index 0000000..503c2b6 --- /dev/null +++ b/frontend/src/env.d.ts @@ -0,0 +1,7 @@ +declare namespace NodeJS { + interface ProcessEnv { + NODE_ENV: string + VUE_ROUTER_MODE: 'hash' | 'history' | 'abstract' | undefined + VUE_ROUTER_BASE: string | undefined + } +} diff --git a/frontend/src/layouts/MainLayout.vue b/frontend/src/layouts/MainLayout.vue new file mode 100644 index 0000000..25dd01e --- /dev/null +++ b/frontend/src/layouts/MainLayout.vue @@ -0,0 +1,34 @@ + + + diff --git a/frontend/src/model/AEntity.ts b/frontend/src/model/AEntity.ts new file mode 100644 index 0000000..e7ffde9 --- /dev/null +++ b/frontend/src/model/AEntity.ts @@ -0,0 +1,3 @@ +export default abstract class AEntity { + id!: string +} diff --git a/frontend/src/model/Document.ts b/frontend/src/model/Document.ts new file mode 100644 index 0000000..7936c89 --- /dev/null +++ b/frontend/src/model/Document.ts @@ -0,0 +1,14 @@ +import AEntity from 'src/model/AEntity' +import type MajorVersion from 'src/model/MajorVersion' +import type Report from 'src/model/document/Report' + +export default class Document extends AEntity { + content!: string + majorVersion!: MajorVersion + openapiVersion!: string + report!: Report + servers!: Map + timestamp!: Date + title!: string + version!: string +} diff --git a/frontend/src/model/MajorVersion.ts b/frontend/src/model/MajorVersion.ts new file mode 100644 index 0000000..8d35b9f --- /dev/null +++ b/frontend/src/model/MajorVersion.ts @@ -0,0 +1,11 @@ +import AEntity from 'src/model/AEntity' +import type Document from 'src/model/Document' +import type LintRule from 'src/model/majorVersion/LintRule' +import type Specification from 'src/model/Specification' + +export default class MajorVersion extends AEntity { + documents: Document[] = [] + lintRules: LintRule[] = [] + specification!: Specification + version!: number +} diff --git a/frontend/src/model/Specification.ts b/frontend/src/model/Specification.ts new file mode 100644 index 0000000..50be313 --- /dev/null +++ b/frontend/src/model/Specification.ts @@ -0,0 +1,8 @@ +import AEntity from 'src/model/AEntity' +import type Update from 'src/model/specification/Update' +import type MajorVersion from 'src/model/MajorVersion' + +export default class Specification extends AEntity { + majorVersions: MajorVersion[] = [] + update?: Update +} diff --git a/frontend/src/model/SpecificationTmp.ts b/frontend/src/model/SpecificationTmp.ts new file mode 100644 index 0000000..bbe7afb --- /dev/null +++ b/frontend/src/model/SpecificationTmp.ts @@ -0,0 +1,8 @@ +import AEntity from 'src/model/AEntity' +import type Document from 'src/model/Document' +import type Update from 'src/model/specification/Update' + +export default class SpecificationTmp extends AEntity { + documents: Document[] = [] + update?: Update +} diff --git a/frontend/src/model/URL.ts b/frontend/src/model/URL.ts new file mode 100644 index 0000000..55abcef --- /dev/null +++ b/frontend/src/model/URL.ts @@ -0,0 +1,7 @@ +import AEntity from 'src/model/AEntity' +import EType from 'src/model/enums/EType' + +export default class Update extends AEntity { + url!: string + type: EType = EType.GIT +} diff --git a/frontend/src/model/document/IReportDiff.ts b/frontend/src/model/document/IReportDiff.ts new file mode 100644 index 0000000..0c04b6f --- /dev/null +++ b/frontend/src/model/document/IReportDiff.ts @@ -0,0 +1,9 @@ +import type IReportDiffSummary from 'src/model/document/IReportDiffSummary' + +export default interface IReportDiff { + report: { + changes: Record[] + reportSummary: Record + } + reportPaths: string +} diff --git a/frontend/src/model/document/IReportDiffSummary.ts b/frontend/src/model/document/IReportDiffSummary.ts new file mode 100644 index 0000000..59725fe --- /dev/null +++ b/frontend/src/model/document/IReportDiffSummary.ts @@ -0,0 +1,4 @@ +export default interface IReportDiffSummary { + breakingChanges: number + totalChanges: number +} diff --git a/frontend/src/model/document/IReportLintEntry.ts b/frontend/src/model/document/IReportLintEntry.ts new file mode 100644 index 0000000..edb3c3c --- /dev/null +++ b/frontend/src/model/document/IReportLintEntry.ts @@ -0,0 +1,16 @@ +export default interface IReportLintEntry { + code: string + message: string + path: string[] + range: { + end: { + character: number + line: number + } + start: { + character: number + line: number + } + } + severity: number +} diff --git a/frontend/src/model/document/LintReport.ts b/frontend/src/model/document/LintReport.ts new file mode 100644 index 0000000..5f99f6f --- /dev/null +++ b/frontend/src/model/document/LintReport.ts @@ -0,0 +1,8 @@ +import AEntity from 'src/model/AEntity' +import type IReportLintEntry from 'src/model/document/IReportLintEntry' +import type LintRule from 'src/model/majorVersion/LintRule' + +export default class LintReport extends AEntity { + content!: IReportLintEntry[] + rule?: LintRule +} diff --git a/frontend/src/model/document/Report.ts b/frontend/src/model/document/Report.ts new file mode 100644 index 0000000..d5e3df9 --- /dev/null +++ b/frontend/src/model/document/Report.ts @@ -0,0 +1,8 @@ +import AEntity from 'src/model/AEntity' +import type IReportDiff from 'src/model/document/IReportDiff' +import type LintReport from 'src/model/document/LintReport' + +export default class Report extends AEntity { + diffReport?: IReportDiff + lintReports: LintReport[] = [] +} diff --git a/frontend/src/model/enums/EErrorColor.ts b/frontend/src/model/enums/EErrorColor.ts new file mode 100644 index 0000000..03e9429 --- /dev/null +++ b/frontend/src/model/enums/EErrorColor.ts @@ -0,0 +1,8 @@ +enum EErrorColor { + 'negative' = 0, + 'warning' = 1, + 'info' = 2, + 'dark' = 3, +} + +export default EErrorColor diff --git a/frontend/src/model/enums/EErrorLevel.ts b/frontend/src/model/enums/EErrorLevel.ts new file mode 100644 index 0000000..e136d62 --- /dev/null +++ b/frontend/src/model/enums/EErrorLevel.ts @@ -0,0 +1,8 @@ +enum EErrorLevel { + 'Errors' = 0, + 'Warnings' = 1, + 'Info' = 2, + 'Hints' = 3, +} + +export default EErrorLevel diff --git a/frontend/src/model/enums/EType.ts b/frontend/src/model/enums/EType.ts new file mode 100644 index 0000000..95a4513 --- /dev/null +++ b/frontend/src/model/enums/EType.ts @@ -0,0 +1,6 @@ +enum EType { + GIT = 'GIT', + HTTP = 'HTTP', +} + +export default EType diff --git a/frontend/src/model/majorVersion/LintRule.ts b/frontend/src/model/majorVersion/LintRule.ts new file mode 100644 index 0000000..98dfbe9 --- /dev/null +++ b/frontend/src/model/majorVersion/LintRule.ts @@ -0,0 +1,11 @@ +import AEntity from 'src/model/AEntity' +import type LintReport from 'src/model/document/LintReport' +import type MajorVersion from 'src/model/MajorVersion' +import URL from 'src/model/URL' + +export default class LintRule extends AEntity { + majorVersion?: MajorVersion + name!: string + reports: LintReport[] = [] + url = new URL() +} diff --git a/frontend/src/model/specification/Update.ts b/frontend/src/model/specification/Update.ts new file mode 100644 index 0000000..089d25f --- /dev/null +++ b/frontend/src/model/specification/Update.ts @@ -0,0 +1,8 @@ +import AEntity from 'src/model/AEntity' +import URL from 'src/model/URL' + +export default class Update extends AEntity { + interval = 30 + path?: string + url: URL = new URL() +} diff --git a/frontend/src/pages/ErrorNotFound.vue b/frontend/src/pages/ErrorNotFound.vue new file mode 100644 index 0000000..5034561 --- /dev/null +++ b/frontend/src/pages/ErrorNotFound.vue @@ -0,0 +1,17 @@ + + + diff --git a/frontend/src/pages/document/DetailsPage.vue b/frontend/src/pages/document/DetailsPage.vue new file mode 100644 index 0000000..052a11b --- /dev/null +++ b/frontend/src/pages/document/DetailsPage.vue @@ -0,0 +1,42 @@ + + + diff --git a/frontend/src/pages/specification/ChangelogPage.vue b/frontend/src/pages/specification/ChangelogPage.vue new file mode 100644 index 0000000..94af6e2 --- /dev/null +++ b/frontend/src/pages/specification/ChangelogPage.vue @@ -0,0 +1,43 @@ + + + diff --git a/frontend/src/pages/specification/DetailsPage.vue b/frontend/src/pages/specification/DetailsPage.vue new file mode 100644 index 0000000..467e47e --- /dev/null +++ b/frontend/src/pages/specification/DetailsPage.vue @@ -0,0 +1,100 @@ + + + diff --git a/frontend/src/pages/specification/ListPage.vue b/frontend/src/pages/specification/ListPage.vue new file mode 100644 index 0000000..c875365 --- /dev/null +++ b/frontend/src/pages/specification/ListPage.vue @@ -0,0 +1,68 @@ + + + diff --git a/frontend/src/quasar.d.ts b/frontend/src/quasar.d.ts new file mode 100644 index 0000000..8d15c69 --- /dev/null +++ b/frontend/src/quasar.d.ts @@ -0,0 +1,7 @@ +// Forces TS to apply `@quasar/app-vite` augmentations of `quasar` package +// Removing this would break `quasar/wrappers` imports as those typings are declared +// into `@quasar/app-vite` +// As a side effect, since `@quasar/app-vite` reference `quasar` to augment it, +// this declaration also apply `quasar` own +// augmentations (eg. adds `$q` into Vue component context) +/// diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts new file mode 100644 index 0000000..b1d0238 --- /dev/null +++ b/frontend/src/router/index.ts @@ -0,0 +1,29 @@ +import { route } from 'quasar/wrappers' +import { createMemoryHistory, createRouter, createWebHashHistory, createWebHistory } from 'vue-router' + +import routes from './routes' + +/* + * If not building with SSR mode, you can + * directly export the Router instantiation; + * + * The function below can be async too; either use + * async/await or return a Promise which resolves + * with the Router instance. + */ + +const getHistoryMode = () => (process.env.VUE_ROUTER_MODE === 'history' ? createWebHistory : createWebHashHistory) + +export default route(function (/* { store, ssrContext } */) { + const createHistory = process.env['SERVER'] ? createMemoryHistory : getHistoryMode() + + return createRouter({ + scrollBehavior: () => ({ left: 0, top: 0 }), + routes, + + // Leave this as is and make changes in quasar.conf.js instead! + // quasar.conf.js -> build -> vueRouterMode + // quasar.conf.js -> build -> publicPath + history: createHistory(process.env.VUE_ROUTER_BASE), + }) +}) diff --git a/frontend/src/router/routes.ts b/frontend/src/router/routes.ts new file mode 100644 index 0000000..fd2f861 --- /dev/null +++ b/frontend/src/router/routes.ts @@ -0,0 +1,31 @@ +import type { RouteRecordRaw } from 'vue-router' + +const routes: RouteRecordRaw[] = [ + { + children: [ + { path: '/', redirect: { name: 'specification-list' } }, + { + children: [{ component: () => import('pages/document/DetailsPage.vue'), name: 'document-details', path: ':id', props: true }], + path: 'documents', + }, + { + children: [ + { component: () => import('pages/specification/ChangelogPage.vue'), name: 'specification-changelog', path: ':id/changelog/:version', props: true }, + { component: () => import('pages/specification/DetailsPage.vue'), name: 'specification-details', path: ':id', props: true }, + { component: () => import('pages/specification/ListPage.vue'), name: 'specification-list', path: '' }, + ], + path: 'specifications', + }, + ], + component: () => import('layouts/MainLayout.vue'), + path: '/', + }, + + // Always leave this as the last one, but you can also remove it + { + path: '/:catchAll(.*)*', + component: () => import('pages/ErrorNotFound.vue'), + }, +] + +export default routes diff --git a/frontend/src/shims-vue.d.ts b/frontend/src/shims-vue.d.ts new file mode 100644 index 0000000..d385337 --- /dev/null +++ b/frontend/src/shims-vue.d.ts @@ -0,0 +1,8 @@ +/// + +// Mocks all files ending in `.vue` showing them as plain Vue instances +declare module '*.vue' { + import type { DefineComponent } from 'vue' + const component: DefineComponent + export default component +} diff --git a/frontend/src/stores/index.ts b/frontend/src/stores/index.ts new file mode 100644 index 0000000..b9d7b88 --- /dev/null +++ b/frontend/src/stores/index.ts @@ -0,0 +1,30 @@ +import { store } from 'quasar/wrappers' +import type { Router } from 'vue-router' +import { createPinia } from 'pinia' + +/* + * When adding new properties to stores, you should also + * extend the `PiniaCustomProperties` interface. + * @see https://pinia.vuejs.org/core-concepts/plugins.html#typing-new-store-properties + */ +declare module 'pinia' { + export interface PiniaCustomProperties { + readonly router: Router + } +} + +/* + * If not building with SSR mode, you can + * directly export the Store instantiation; + * + * The function below can be async too; either use + * async/await or return a Promise which resolves + * with the Store instance. + */ + +export default store((/* { ssrContext } */) => { + // You can add Pinia plugins here + // pinia.use(SomePiniaPlugin) + + return createPinia() +}) diff --git a/frontend/src/stores/store-flag.d.ts b/frontend/src/stores/store-flag.d.ts new file mode 100644 index 0000000..7660dcf --- /dev/null +++ b/frontend/src/stores/store-flag.d.ts @@ -0,0 +1,9 @@ +// THIS FEATURE-FLAG FILE IS AUTOGENERATED, +// REMOVAL OR CHANGES WILL CAUSE RELATED TYPES TO STOP WORKING +import 'quasar/dist/types/feature-flag' + +declare module 'quasar/dist/types/feature-flag' { + interface QuasarFeatureFlags { + store: true + } +} diff --git a/frontend/src/utils/Fetch.ts b/frontend/src/utils/Fetch.ts new file mode 100644 index 0000000..40326ba --- /dev/null +++ b/frontend/src/utils/Fetch.ts @@ -0,0 +1,26 @@ +export function useFetch() { + const port = process.env['DEV'] ? '9091' : '8000' + const baseUrl = `http://localhost:${port}/api/v1/` + + const get = async (endpoint: string) => + await fetch(baseUrl + endpoint, { + headers: { + 'Content-Type': 'application/json', + }, + }) + + const post = async (data: unknown, endpoint: string) => await postOrPut(data, endpoint, 'POST') + + const put = async (data: unknown, endpoint: string) => await postOrPut(data, endpoint, 'PUT') + + const postOrPut = async (data: unknown, endpoint: string, method: 'POST' | 'PUT') => + await fetch(baseUrl + endpoint, { + body: JSON.stringify(data), + headers: { + 'Content-Type': 'application/json', + }, + method: method, + }) + + return { baseUrl, get, post, put } +} diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000..4691ddc --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "@quasar/app-vite/stricter-tsconfig-preset", + "compilerOptions": { + "baseUrl": "." + }, + "exclude": ["./dist", "./.quasar", "./node_modules", "./src-capacitor", "./src-cordova", "./quasar.config.*.temporary.compiled*"] +} diff --git a/frontend/tsconfig.vue-tsc.json b/frontend/tsconfig.vue-tsc.json new file mode 100644 index 0000000..90a2bcb --- /dev/null +++ b/frontend/tsconfig.vue-tsc.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "skipLibCheck": true + } +}