diff --git a/.cursor/rules/context7-stack.mdc b/.cursor/rules/context7-stack.mdc index 9742e2d..7f0a807 100644 --- a/.cursor/rules/context7-stack.mdc +++ b/.cursor/rules/context7-stack.mdc @@ -28,7 +28,7 @@ alwaysApply: true | Библиотека | Context7 ID | Версия в проекте | Когда | |------------|-------------|------------------|-------| | OpenAPI | `/oai/openapi-specification` | 3.x в `docs/openapi.yaml` | схемы, operationId, problem+json | -| Redocly CLI | `/redocly/redocly-cli` | CI `@redocly/cli` | lint OpenAPI, `npx @redocly/cli lint` | +| Redocly CLI | `/redocly/redocly-cli` | CI `@redocly/cli` | lint OpenAPI, `pnpm exec redocly lint` | --- diff --git a/.cursor/rules/engineering.mdc b/.cursor/rules/engineering.mdc index a9c01a6..4a3987b 100644 --- a/.cursor/rules/engineering.mdc +++ b/.cursor/rules/engineering.mdc @@ -86,7 +86,7 @@ alwaysApply: true ## Dependency Management **DEP-01** | MUST | Go-зависимости — через `go get` / `go.mod`; версия Go как в `go.mod` и CI (1.24). -*Проверка:* `go.mod`, `.gitea/workflows/ci.yaml`. +*Проверка:* `go.mod`, `.gitea/workflows/quality.yaml`. **DEP-02** | NEVER | Vendor-копирование без явного решения в репозитории. *Проверка:* review. @@ -123,10 +123,10 @@ alwaysApply: true **TEST-03** | MUST | Новые BIRD-сценарии в `internal/birdfmt/testdata/scenarios/*/bird.conf` + `bird -p`. *Проверка:* CI job `bird2`. -**TEST-04** | MUST | Изменения `apps/web/**` или `packages/ui/**` — локально **`pnpm --filter @evobgp/web run typecheck`, `lint`, `build`** (все три команды, exit 0); CI job `web` в `.gitea/workflows/ci.yaml`. +**TEST-04** | MUST | Изменения `apps/web/**` или `packages/ui/**` — локально **`pnpm --filter @evobgp/web run typecheck`, `lint`, `build`** (все три команды, exit 0); CI job `web` в `.gitea/workflows/quality.yaml`. *Проверка:* CI job `web`; `.cursor/rules/web-shadcn.mdc` WEB-19. -**TEST-05** | MUST | Изменения OpenAPI — `npx @redocly/cli lint docs/openapi.yaml`. +**TEST-05** | MUST | Изменения OpenAPI — `pnpm exec redocly lint docs/openapi.yaml`. *Проверка:* CI job `openapi`. --- @@ -229,7 +229,7 @@ alwaysApply: true ```powershell go vet ./... go test ./... -race -count=1 -npx @redocly/cli lint docs/openapi.yaml +pnpm exec redocly lint docs/openapi.yaml # web: pnpm --filter @evobgp/web run typecheck; pnpm --filter @evobgp/web run lint; pnpm --filter @evobgp/web run build # go fmt/lint: gofmt -w ; scripts/lint-go.ps1 (gofmt + vet + golangci-lint) # birdfmt: go test ./internal/birdfmt/... -count=1 diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..74ce117 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,49 @@ +# Build context = repository root (deploy/docker/docker-bake.hcl). +.git +.gitea +.github +.cursor +.claude +.codegraph +.agents +memory-bank +.vscode +.idea + +**/.DS_Store +**/Thumbs.db +**/.env +**/.env.* +!**/.env.example +!**/.env.*.example + +node_modules +**/node_modules +**/dist +apps/web/src/routeTree.gen.ts +apps/web/playwright-report +apps/web/test-results + +*.md +AGENTS.md +CONTRIBUTING.md +LICENSE +docs + +.pre-commit-config.yaml +.golangci.yml +.releaserc.json +.commitlintrc.* +redocly.yaml +package-lock.json + +data +*.exe +*.test +coverage +.coverage +*.out +.release-version +CHANGELOG.md +deploy/docker/docker-bake.override.hcl +deploy/compose/runtime-logs diff --git a/.gitea/README.md b/.gitea/README.md index 8fbe263..f66b0e2 100644 --- a/.gitea/README.md +++ b/.gitea/README.md @@ -1,38 +1,39 @@ # Gitea Actions -Workflow: [workflows/ci.yaml](workflows/ci.yaml). - -| Job | PR | push в main | -|-----|-----|-------------| -| changes, openapi, web, go, bird2 | quality gates | quality gates | -| commitlint | да | — | -| **release** | — | semantic-release + docker push (один run) | +| Workflow | Когда | Что | +|----------|--------|-----| +| [workflows/ci.yaml](workflows/ci.yaml) | pull request в main/master | quality gates + commitlint | +| [workflows/cd.yaml](workflows/cd.yaml) | push в main/master | quality gates + semantic-release + docker push | +| [workflows/quality.yaml](workflows/quality.yaml) | reusable (`workflow_call`) | changes, openapi, web, go, bird2, commitlint, docker-check | Подробнее: [docs/releasing.md](../docs/releasing.md). ## CI (quality gates) -Job **changes** вычисляет флаги по путям в diff. Полный прогон (все узлы openapi / web / go / bird2 в графе): `.gitea/workflows/*`, `scripts/*`, `.golangci.yml`, `.pre-commit-config.yaml`, корневой `package.json` / `.releaserc.json`. Отдельно: `migrations/*`, `docs/openapi.yaml` → `go` / `openapi` и т.д. (см. `ci.yaml`). +Job **changes** вычисляет флаги по путям в diff. Полный прогон: `.gitea/workflows/*`, `scripts/*`, `.golangci.yml`, `.pre-commit-config.yaml`, корневой `package.json` / `.releaserc.json`. Правки `.cursor/`, `.claude/`, `*.md` (кроме `docs/api.md` / `docs/access.md` / `docs/openapi.yaml`) quality jobs не запускают. -На **pull request** — **commitlint** (Conventional Commits). +На **pull request** — **commitlint**. При изменении `deploy/docker/**` — job **docker-check** (`bake --print`, bake без `--push` если есть доступ к registry). -Runner: `ubuntu-latest`, **bird2** из apt, Docker для job **release**. +Кэш зависимостей: `actions/cache` с ключом `sha256sum` lockfile (`go.sum` / `pnpm-lock.yaml`). `hashFiles` в Gitea не используем. -## Release (job в ci.yaml) +Runner: `ubuntu-latest`, **bird2** из apt, Docker для **docker-check** (PR) и **publish** (CD). -После успешных quality gates на **push в main** job **release**: +## CD (job publish) -1. `npx semantic-release` — тег `vX.Y.Z` на **текущий commit** (без дополнительного commit в main). +После успешных quality gates на **push в main** job **publish**: + +1. `pnpm exec semantic-release` — тег `vX.Y.Z` на **текущий commit** (без дополнительного commit в main). 2. Gitea Release + `CHANGELOG.md` как attachment (не в git). -3. `docker buildx bake default --push` с `VERSION=X.Y.Z` — в том же job. +3. Зеркало base-образов в `evobgp-buildcache:base-*` (`deploy/docker/mirror-base-images.sh`). +4. `docker buildx bake default --push` с `VERSION=X.Y.Z`, `pull=false`, named builder `evobgp` (`cleanup: false`). Если releasable-коммитов нет — semantic-release no-op, образы не публикуются. -Повтор упавшего **release** (тег уже есть, bake нет): detect берёт `v*` на `HEAD` и всё равно пушит образы. Подробнее: [docs/releasing.md](../docs/releasing.md#перезапуск-упавшего-job-release). +Повтор упавшего **publish** (тег уже есть, bake нет): detect берёт `v*` на `HEAD` и всё равно пушит образы. Подробнее: [docs/releasing.md](../docs/releasing.md#перезапуск-упавшего-job-publish). ### Секреты -**`ACTIONS_PAT`**: push tags, releases, Container Registry. Fallback: **`gitea.token`**. +**`ACTIONS_PAT`**: push tags, releases, Container Registry. Для git tag fallback: `github.token`. Push OCI — **только PAT** (у `GITEA_TOKEN` нет права packages). ### Теги образов @@ -46,6 +47,8 @@ git.shx.one//<имя>:sha- Имена образов: `evobgp-api`, `evobgp-all`, `evobgp-scheduler`, `evobgp-ingest`, `evobgp-render`, `evobgp-deploy`, `evobgp-node`, `evobgp-web`, `evobgp-web-all`, `evobgp-agent`, `evobgp-bird2`. +Кэш сборки: `evobgp-buildcache:{go,web,birdc}-buildcache` и `evobgp-buildcache:base-*`. + **Удалённый спикер** (compose `deploy/compose/docker-compose.remote-speaker.yaml`): `evobgp-bird2`, `evobgp-agent`, `evobgp-node` (fallback profile); Traefik — внешний `traefik:latest`. CI: `scripts/validate-remote-speaker-compose.sh`. Пример: diff --git a/.gitea/workflows/cd.yaml b/.gitea/workflows/cd.yaml new file mode 100644 index 0000000..5ed7cf7 --- /dev/null +++ b/.gitea/workflows/cd.yaml @@ -0,0 +1,141 @@ +name: CD + +on: + push: + branches: [main, master] + +permissions: + contents: read + +jobs: + quality: + uses: ./.gitea/workflows/quality.yaml + with: + is_pull_request: false + before_sha: ${{ github.event.before }} + head_sha: ${{ github.sha }} + allow_registry_login: false + secrets: + ACTIONS_PAT: ${{ secrets.ACTIONS_PAT }} + + publish: + needs: [quality] + if: >- + always() && + (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master') && + needs.quality.result == 'success' + runs-on: ubuntu-latest + permissions: + contents: write + packages: write + releases: write + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + fetch-depth: 0 + fetch-tags: true + token: ${{ secrets.ACTIONS_PAT || gitea.token }} + persist-credentials: true + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: "22" + - name: Enable pnpm via corepack + run: corepack enable + - id: pnpm-hash + run: echo "key=$(sha256sum pnpm-lock.yaml | awk '{print $1}')" >> "$GITHUB_OUTPUT" + - uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 + with: + path: ~/.local/share/pnpm/store + key: pnpm-${{ runner.os }}-${{ steps.pnpm-hash.outputs.key }} + restore-keys: | + pnpm-${{ runner.os }}- + - name: Install release tooling + run: pnpm install --frozen-lockfile + - name: Verify releasable commit messages + run: node scripts/commit/verify-release-commits.mjs + - name: Semantic release + run: pnpm exec semantic-release + env: + GITEA_URL: https://git.shx.one + GITEA_TOKEN: ${{ secrets.ACTIONS_PAT || gitea.token }} + - name: Detect new release + id: rel + run: | + set -euo pipefail + version="" + if [ -f .release-version ]; then + version="$(tr -d '[:space:]' < .release-version)" + echo "New release from semantic-release: $version" + else + git fetch --tags --force origin || true + tag="$(git tag --points-at HEAD --list 'v*.*.*' | sort -V | tail -n1 || true)" + if [ -n "${tag:-}" ]; then + version="${tag#v}" + echo "Reuse existing tag $tag on HEAD (release retry)" + fi + fi + if [ -n "${version:-}" ]; then + echo "version=$version" >> "$GITHUB_OUTPUT" + echo "released=true" >> "$GITHUB_OUTPUT" + else + echo "released=false" >> "$GITHUB_OUTPUT" + echo "No releasable commits — skipping image publish" + fi + - name: Set up Docker Buildx + if: steps.rel.outputs.released == 'true' + uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 + with: + name: evobgp + driver: docker-container + cleanup: false + - name: Prepare image metadata + if: steps.rel.outputs.released == 'true' + id: meta + run: | + set -euo pipefail + echo "version=${{ steps.rel.outputs.version }}" >> "$GITHUB_OUTPUT" + owner_lc="$(echo '${{ github.repository_owner }}' | tr '[:upper:]' '[:lower:]')" + echo "owner_lc=$owner_lc" >> "$GITHUB_OUTPUT" + short_sha="$(echo '${{ github.sha }}' | cut -c1-7)" + echo "short_sha=$short_sha" >> "$GITHUB_OUTPUT" + echo "build_time=$(date -u +%Y-%m-%dT%H:%M:%SZ)" >> "$GITHUB_OUTPUT" + - name: Log in to Gitea Registry + if: steps.rel.outputs.released == 'true' + uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 + with: + registry: git.shx.one + username: ${{ gitea.actor }} + password: ${{ secrets.ACTIONS_PAT }} + - name: Mirror base images into buildcache + if: steps.rel.outputs.released == 'true' + id: mirror + continue-on-error: true + env: + REGISTRY: git.shx.one/${{ steps.meta.outputs.owner_lc }} + run: sh deploy/docker/mirror-base-images.sh + - name: Build and push images (bake) + if: steps.rel.outputs.released == 'true' + env: + REGISTRY: git.shx.one/${{ steps.meta.outputs.owner_lc }} + IMAGE_TAG: latest + VERSION: ${{ steps.meta.outputs.version }} + SHORT_SHA: ${{ steps.meta.outputs.short_sha }} + SHA_FULL: ${{ github.sha }} + BUILD_TIME: ${{ steps.meta.outputs.build_time }} + CACHE_REF_GO: git.shx.one/${{ steps.meta.outputs.owner_lc }}/evobgp-buildcache:go-buildcache + CACHE_REF_WEB: git.shx.one/${{ steps.meta.outputs.owner_lc }}/evobgp-buildcache:web-buildcache + CACHE_REF_BIRDC: git.shx.one/${{ steps.meta.outputs.owner_lc }}/evobgp-buildcache:birdc-buildcache + BUILDX_BAKE_ENTITLEMENTS_FS: "0" + run: | + set -euxo pipefail + cache="git.shx.one/${{ steps.meta.outputs.owner_lc }}/evobgp-buildcache" + if [ "${{ steps.mirror.outcome }}" = "success" ]; then + export BASE_GOLANG="${cache}:base-golang-1.24-alpine" + export BASE_DEBIAN="${cache}:base-debian-bookworm-slim" + export BASE_NODE="${cache}:base-node-22-alpine" + export BASE_NGINX="${cache}:base-nginx-1.27-alpine" + export BASE_UBUNTU="${cache}:base-ubuntu-noble" + export BASE_DISTROLESS="${cache}:base-distroless-static-debian12-nonroot" + fi + docker buildx bake --allow=fs.read="${{ github.workspace }}" \ + -f deploy/docker/docker-bake.hcl default --push diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index 91f95f8..ba99831 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -1,387 +1,23 @@ name: CI on: - push: - branches: [main, master] pull_request: branches: [main, master] +concurrency: + group: ci-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + jobs: - # --------------------------------------------------------------------------- - # Детекция изменений по модулям (флаги → downstream-джобы в графе CI). - # Полный прогон (все флаги true): .gitea/workflows/*, scripts/*, .golangci.yml, - # .pre-commit-config.yaml — чтобы при правках CI/CD пересобирались все узлы. - # --------------------------------------------------------------------------- - changes: - runs-on: ubuntu-latest - outputs: - openapi: ${{ steps.detect.outputs.openapi }} - go: ${{ steps.detect.outputs.go }} - web: ${{ steps.detect.outputs.web }} - bird_conf: ${{ steps.detect.outputs.bird_conf }} - docker_go: ${{ steps.detect.outputs.docker_go }} - docker_web: ${{ steps.detect.outputs.docker_web }} - docker_bird: ${{ steps.detect.outputs.docker_bird }} - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - id: detect - name: Detect changed paths per module - run: | - set -euo pipefail - - openapi=false - go=false - web=false - bird_conf=false - docker_go=false - docker_web=false - docker_bird=false - - # Все флаги true → openapi, web, go, bird2 (и release на main) в графе CI. - set_all_flags_true() { - openapi=true - go=true - web=true - bird_conf=true - docker_go=true - docker_web=true - docker_bird=true - } - - write_outputs() { - for v in openapi go web bird_conf docker_go docker_web docker_bird; do - eval "echo \"\$v=\$$v\"" >> "$GITHUB_OUTPUT" - done - } - - if [ "${{ github.event_name }}" = "pull_request" ]; then - base="${{ github.event.pull_request.base.sha }}" - head="${{ github.event.pull_request.head.sha }}" - FILES="$(git diff --name-only "$base" "$head")" - else - before="${{ github.event.before }}" - after="${{ github.sha }}" - if [ -n "$before" ] && [ "$before" != "0000000000000000000000000000000000000000" ]; then - FILES="$(git diff --name-only "$before" "$after")" - elif git rev-parse --verify HEAD~1 >/dev/null 2>&1; then - FILES="$(git diff --name-only HEAD~1 HEAD)" - else - set_all_flags_true - write_outputs - echo "No parent commit — full pipeline (all modules)" - exit 0 - fi - fi - - if [ -z "$(printf '%s' "$FILES" | tr -d '[:space:]')" ]; then - set_all_flags_true - write_outputs - echo "Empty diff — full pipeline fallback" - exit 0 - fi - - full_pipeline=false - - while IFS= read -r f || [ -n "${f:-}" ]; do - [ -z "${f:-}" ] && continue - case "$f" in - # CI/CD инфраструктура — все узлы quality gates - .gitea/workflows/*|.golangci.yml|.pre-commit-config.yaml|scripts/*) - full_pipeline=true - ;; - docs/openapi.yaml|redocly.yaml) - openapi=true - ;; - docs/api.md|docs/access.md) - openapi=true - go=true - ;; - apps/web/README.md|apps/web/components.json|packages/ui/components.json) - ;; - apps/web/*|packages/ui/*|packages/shared/*) - web=true - ;; - deploy/bird/*) - bird_conf=true - go=true - ;; - deploy/compose/*|deploy/docker/*) - docker_go=true - docker_web=true - docker_bird=true - go=true - ;; - go.mod|go.sum|go.work) - go=true - ;; - migrations/*) - go=true - ;; - cmd/*|internal/*|*.go) - go=true - bird_conf=true - ;; - docs/*) - go=true - ;; - package.json|package-lock.json|pnpm-lock.yaml|pnpm-workspace.yaml|.releaserc.json) - full_pipeline=true - ;; - *) - go=true - ;; - esac - done <<< "$FILES" - - if $full_pipeline; then - set_all_flags_true - fi - - write_outputs - - echo "Changed files (first 30):" - printf '%s\n' "$FILES" | head -n 30 - echo "--- flags ---" - echo "openapi=$openapi go=$go web=$web bird_conf=$bird_conf" - echo "docker_go=$docker_go docker_web=$docker_web docker_bird=$docker_bird full_pipeline=$full_pipeline" - - # --------------------------------------------------------------------------- - openapi: - needs: [changes] - if: needs.changes.outputs.openapi == 'true' || needs.changes.outputs.web == 'true' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: "22" - - name: Enable pnpm via corepack - run: corepack enable - - name: Lint OpenAPI (Redocly) - run: npx --yes @redocly/cli@1 lint docs/openapi.yaml - - name: Check OpenAPI→TS codegen is fresh - run: | - set -euxo pipefail - pnpm install --frozen-lockfile - chmod +x scripts/check-openapi-gen.sh - sh scripts/check-openapi-gen.sh - - # --------------------------------------------------------------------------- - web: - needs: [changes] - if: needs.changes.outputs.web == 'true' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: "22" - - name: Enable pnpm via corepack - run: corepack enable - - name: pnpm install, typecheck, lint, test, build - run: | - set -euxo pipefail - pnpm install --frozen-lockfile - pnpm --filter @evobgp/web run typecheck - pnpm --filter @evobgp/web run lint - pnpm --filter @evobgp/web run test - pnpm --filter @evobgp/web run build - - # --------------------------------------------------------------------------- - go: - needs: [changes] - if: needs.changes.outputs.go == 'true' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 - with: - go-version: "1.24" - cache: true - cache-dependency-path: go.sum - - name: Vet - run: go vet ./... - - name: Lint httpapi (ERR-01 / ARCH-01) - run: sh scripts/lint-httpapi.sh - - name: Check migration pairs (DEP-03) - run: sh scripts/check-migrations-pair.sh - - name: Validate remote speaker compose - run: sh scripts/validate-remote-speaker-compose.sh - # go.mod: go 1.24 — бинарник golangci-lint < v1.64.2 (сборка на Go 1.23) не запускается. - - name: golangci-lint - uses: golangci/golangci-lint-action@v6 - with: - version: v1.64.8 - install-mode: goinstall - - name: Test - run: go test ./... -race -count=1 - - name: Build all commands - run: | - set -euxo pipefail - out="${RUNNER_TEMP}/evobgp-bin" - mkdir -p "$out" - for d in cmd/*/; do - name="$(basename "$d")" - go build -o "$out/$name" "./$d" - done - - # --------------------------------------------------------------------------- - bird2: - runs-on: ubuntu-latest - needs: [changes, go] - if: >- - always() && - needs.changes.result == 'success' && - needs.go.result != 'failure' && - (needs.changes.outputs.go == 'true' || - needs.changes.outputs.bird_conf == 'true' || - needs.changes.outputs.docker_bird == 'true' || - needs.changes.outputs.docker_go == 'true') - steps: - - uses: actions/checkout@v4 - - name: Install bird2 (репозиторий Ubuntu runner, как в образе evobgp-bird2) - run: | - set -euxo pipefail - if command -v sudo >/dev/null 2>&1; then SUDO=sudo; else SUDO=""; fi - $SUDO apt-get update -qq - DEBIAN_FRONTEND=noninteractive $SUDO apt-get install -y -qq bird2 - bird --version - - name: bird -p on all scenario bird.conf files - env: - WORKSPACE: ${{ github.workspace }} - run: | - set -euxo pipefail - WS="${WORKSPACE:-$PWD}" - cd "$WS" - if [ ! -f internal/birdfmt/testdata/scenarios/minimal/bird.conf ]; then - echo "Нет сценариев BIRD в checkout. Проверьте, что internal/birdfmt/testdata/scenarios закоммичен и push в remote." - ls -la internal/birdfmt/testdata/ 2>/dev/null || ls -la - exit 1 - fi - for conf in internal/birdfmt/testdata/scenarios/*/bird.conf; do - echo "==> $conf" - bird -c "$WS/$conf" -p - done - - # --------------------------------------------------------------------------- - commitlint: - if: github.event_name == 'pull_request' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - uses: actions/setup-node@v4 - with: - node-version: "22" - cache: npm - cache-dependency-path: package-lock.json - - name: Lint commit messages - run: | - set -euxo pipefail - npm ci - npx commitlint --from "${{ github.event.pull_request.base.sha }}" --to "${{ github.event.pull_request.head.sha }}" - - # --------------------------------------------------------------------------- - # Один push в main: semantic-release (тег на текущий commit, без доп. commit) + docker push. - # --------------------------------------------------------------------------- - release: - needs: [changes, openapi, web, go, bird2] - if: >- - always() && - github.event_name == 'push' && - (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master') && - needs.changes.result == 'success' && - (needs.openapi.result == 'success' || needs.openapi.result == 'skipped') && - (needs.web.result == 'success' || needs.web.result == 'skipped') && - (needs.go.result == 'success' || needs.go.result == 'skipped') && - (needs.bird2.result == 'success' || needs.bird2.result == 'skipped') - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - fetch-tags: true - token: ${{ secrets.ACTIONS_PAT || gitea.token }} - persist-credentials: true - - uses: actions/setup-node@v4 - with: - node-version: "22" - cache: npm - cache-dependency-path: package-lock.json - - name: Install release tooling - run: npm ci - - name: Verify releasable commit messages - run: node scripts/commit/verify-release-commits.mjs - - name: Semantic release - run: npx semantic-release - env: - GITEA_URL: https://git.shx.one - GITEA_TOKEN: ${{ secrets.ACTIONS_PAT || gitea.token }} - - name: Detect new release - id: rel - run: | - set -euo pipefail - version="" - if [ -f .release-version ]; then - version="$(tr -d '[:space:]' < .release-version)" - echo "New release from semantic-release: $version" - else - # Re-run after a failed docker step: tag already exists, successCmd - # did not write .release-version (semantic-release is a no-op). - git fetch --tags --force origin || true - tag="$(git tag --points-at HEAD --list 'v*.*.*' | sort -V | tail -n1 || true)" - if [ -n "${tag:-}" ]; then - version="${tag#v}" - echo "Reuse existing tag $tag on HEAD (release retry)" - fi - fi - if [ -n "${version:-}" ]; then - echo "version=$version" >> "$GITHUB_OUTPUT" - echo "released=true" >> "$GITHUB_OUTPUT" - else - echo "released=false" >> "$GITHUB_OUTPUT" - echo "No releasable commits — skipping image publish" - fi - - name: Set up Docker Buildx - if: steps.rel.outputs.released == 'true' - uses: docker/setup-buildx-action@v3 - - name: Prepare image metadata - if: steps.rel.outputs.released == 'true' - id: meta - run: | - set -euo pipefail - echo "version=${{ steps.rel.outputs.version }}" >> "$GITHUB_OUTPUT" - owner_lc="$(echo '${{ github.repository_owner }}' | tr '[:upper:]' '[:lower:]')" - echo "owner_lc=$owner_lc" >> "$GITHUB_OUTPUT" - short_sha="$(echo '${{ github.sha }}' | cut -c1-7)" - echo "short_sha=$short_sha" >> "$GITHUB_OUTPUT" - echo "build_time=$(date -u +%Y-%m-%dT%H:%M:%SZ)" >> "$GITHUB_OUTPUT" - - name: Log in to Gitea Registry - if: steps.rel.outputs.released == 'true' - uses: docker/login-action@v3 - with: - registry: git.shx.one - username: ${{ gitea.actor }} - password: ${{ secrets.ACTIONS_PAT || gitea.token }} - - name: Build and push images (bake) - if: steps.rel.outputs.released == 'true' - env: - REGISTRY: git.shx.one/${{ steps.meta.outputs.owner_lc }} - IMAGE_TAG: latest - VERSION: ${{ steps.meta.outputs.version }} - SHORT_SHA: ${{ steps.meta.outputs.short_sha }} - SHA_FULL: ${{ github.sha }} - BUILD_TIME: ${{ steps.meta.outputs.build_time }} - CACHE_REF_GO: git.shx.one/${{ steps.meta.outputs.owner_lc }}/evobgp-buildcache:go-buildcache - CACHE_REF_WEB: git.shx.one/${{ steps.meta.outputs.owner_lc }}/evobgp-buildcache:web-buildcache - BUILDX_BAKE_ENTITLEMENTS_FS: "0" - run: | - set -euxo pipefail - cd "${{ github.workspace }}/deploy/docker" - sh write-bake-override.sh - docker buildx bake --allow=fs.read="${{ github.workspace }}" \ - -f docker-bake.hcl -f docker-bake.override.hcl default --push - + quality: + uses: ./.gitea/workflows/quality.yaml + with: + is_pull_request: true + base_sha: ${{ github.event.pull_request.base.sha }} + head_sha: ${{ github.event.pull_request.head.sha }} + allow_registry_login: ${{ github.event.pull_request.head.repo.full_name == github.repository }} + secrets: + ACTIONS_PAT: ${{ secrets.ACTIONS_PAT }} diff --git a/.gitea/workflows/quality.yaml b/.gitea/workflows/quality.yaml new file mode 100644 index 0000000..1a833e8 --- /dev/null +++ b/.gitea/workflows/quality.yaml @@ -0,0 +1,384 @@ +# Quality gates (reusable). Callers: ci.yaml (PR), cd.yaml (push main). +name: quality + +on: + workflow_call: + inputs: + is_pull_request: + type: boolean + required: true + base_sha: + type: string + required: false + default: "" + head_sha: + type: string + required: false + default: "" + before_sha: + type: string + required: false + default: "" + allow_registry_login: + type: boolean + required: false + default: false + secrets: + ACTIONS_PAT: + required: false + +permissions: + contents: read + +jobs: + changes: + runs-on: ubuntu-latest + outputs: + openapi: ${{ steps.detect.outputs.openapi }} + go: ${{ steps.detect.outputs.go }} + web: ${{ steps.detect.outputs.web }} + bird_conf: ${{ steps.detect.outputs.bird_conf }} + docker_go: ${{ steps.detect.outputs.docker_go }} + docker_web: ${{ steps.detect.outputs.docker_web }} + docker_bird: ${{ steps.detect.outputs.docker_bird }} + steps: + - if: ${{ inputs.is_pull_request }} + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + fetch-depth: 0 + - if: ${{ inputs.is_pull_request == false }} + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + fetch-depth: 2 + - id: detect + name: Detect changed paths per module + env: + IS_PR: ${{ inputs.is_pull_request }} + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + BEFORE_SHA: ${{ inputs.before_sha }} + run: | + set -euo pipefail + + openapi=false + go=false + web=false + bird_conf=false + docker_go=false + docker_web=false + docker_bird=false + + set_all_flags_true() { + openapi=true + go=true + web=true + bird_conf=true + docker_go=true + docker_web=true + docker_bird=true + } + + write_outputs() { + for v in openapi go web bird_conf docker_go docker_web docker_bird; do + eval "echo \"\$v=\$$v\"" >> "$GITHUB_OUTPUT" + done + } + + if [ "$IS_PR" = "true" ]; then + FILES="$(git diff --name-only "$BASE_SHA" "$HEAD_SHA")" + else + after="${HEAD_SHA:-$(git rev-parse HEAD)}" + before="$BEFORE_SHA" + if [ -n "$before" ] && [ "$before" != "0000000000000000000000000000000000000000" ]; then + FILES="$(git diff --name-only "$before" "$after")" + elif git rev-parse --verify HEAD~1 >/dev/null 2>&1; then + FILES="$(git diff --name-only HEAD~1 HEAD)" + else + set_all_flags_true + write_outputs + echo "No parent commit — full pipeline (all modules)" + exit 0 + fi + fi + + if [ -z "$(printf '%s' "$FILES" | tr -d '[:space:]')" ]; then + set_all_flags_true + write_outputs + echo "Empty diff — full pipeline fallback" + exit 0 + fi + + full_pipeline=false + + while IFS= read -r f || [ -n "${f:-}" ]; do + [ -z "${f:-}" ] && continue + case "$f" in + .gitea/workflows/*|.golangci.yml|.pre-commit-config.yaml|scripts/*) + full_pipeline=true + ;; + docs/openapi.yaml|redocly.yaml) + openapi=true + ;; + docs/api.md|docs/access.md) + openapi=true + go=true + ;; + .cursor/*|.claude/*|.codegraph/*|memory-bank/*) + ;; + *.md|AGENTS.md) + ;; + apps/web/README.md|apps/web/components.json|packages/ui/components.json) + ;; + apps/web/*|packages/ui/*|packages/shared/*) + web=true + ;; + deploy/bird/*) + bird_conf=true + go=true + ;; + deploy/compose/*|deploy/docker/*|.dockerignore) + docker_go=true + docker_web=true + docker_bird=true + go=true + ;; + go.mod|go.sum|go.work) + go=true + ;; + migrations/*) + go=true + ;; + cmd/*|internal/*|*.go) + go=true + bird_conf=true + ;; + docs/*) + ;; + package.json|package-lock.json|pnpm-lock.yaml|pnpm-workspace.yaml|.releaserc.json) + full_pipeline=true + ;; + *) + ;; + esac + done <<< "$FILES" + + if $full_pipeline; then + set_all_flags_true + fi + + write_outputs + + echo "Changed files (first 30):" + printf '%s\n' "$FILES" | head -n 30 + echo "--- flags ---" + echo "openapi=$openapi go=$go web=$web bird_conf=$bird_conf" + echo "docker_go=$docker_go docker_web=$docker_web docker_bird=$docker_bird full_pipeline=$full_pipeline" + + openapi: + needs: [changes] + if: needs.changes.outputs.openapi == 'true' || needs.changes.outputs.web == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: "22" + - name: Enable pnpm via corepack + run: corepack enable + - id: pnpm-hash + run: echo "key=$(sha256sum pnpm-lock.yaml | awk '{print $1}')" >> "$GITHUB_OUTPUT" + - uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 + with: + path: ~/.local/share/pnpm/store + key: pnpm-${{ runner.os }}-${{ steps.pnpm-hash.outputs.key }} + restore-keys: | + pnpm-${{ runner.os }}- + - name: pnpm install, Redocly, codegen check + run: | + set -euxo pipefail + pnpm install --frozen-lockfile + pnpm exec redocly lint docs/openapi.yaml + chmod +x scripts/check-openapi-gen.sh + sh scripts/check-openapi-gen.sh + + web: + needs: [changes] + if: needs.changes.outputs.web == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: "22" + - name: Enable pnpm via corepack + run: corepack enable + - id: pnpm-hash + run: echo "key=$(sha256sum pnpm-lock.yaml | awk '{print $1}')" >> "$GITHUB_OUTPUT" + - uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 + with: + path: ~/.local/share/pnpm/store + key: pnpm-${{ runner.os }}-${{ steps.pnpm-hash.outputs.key }} + restore-keys: | + pnpm-${{ runner.os }}- + - name: pnpm install, typecheck, lint, test, build + run: | + set -euxo pipefail + pnpm install --frozen-lockfile + pnpm --filter @evobgp/web run typecheck + pnpm --filter @evobgp/web run lint + pnpm --filter @evobgp/web run test + pnpm --filter @evobgp/web run build + + go: + needs: [changes] + if: needs.changes.outputs.go == 'true' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 + with: + go-version: "1.24" + cache: false + - id: go-hash + run: echo "key=$(sha256sum go.sum | awk '{print $1}')" >> "$GITHUB_OUTPUT" + - uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 + with: + path: | + ~/go/pkg/mod + ~/.cache/go-build + key: go-${{ runner.os }}-${{ steps.go-hash.outputs.key }} + restore-keys: | + go-${{ runner.os }}- + - name: Vet + run: go vet ./... + - name: Lint httpapi (ERR-01 / ARCH-01) + run: sh scripts/lint-httpapi.sh + - name: Check migration pairs (DEP-03) + run: sh scripts/check-migrations-pair.sh + - name: Validate remote speaker compose + run: sh scripts/validate-remote-speaker-compose.sh + - name: golangci-lint + uses: golangci/golangci-lint-action@55c2c1448f86e01eaae002a5a3a9624417608d84 # v6.5.2 + with: + version: v1.64.8 + skip-cache: true + - name: Test + run: go test ./... -race -count=1 + - name: Build all commands + run: | + set -euxo pipefail + out="${RUNNER_TEMP}/evobgp-bin" + mkdir -p "$out" + for d in cmd/*/; do + name="$(basename "$d")" + go build -o "$out/$name" "./$d" + done + + bird2: + runs-on: ubuntu-latest + needs: [changes, go] + if: >- + always() && + needs.changes.result == 'success' && + needs.go.result != 'failure' && + (needs.changes.outputs.go == 'true' || + needs.changes.outputs.bird_conf == 'true' || + needs.changes.outputs.docker_bird == 'true' || + needs.changes.outputs.docker_go == 'true') + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - name: Install bird2 (репозиторий Ubuntu runner, как в образе evobgp-bird2) + run: | + set -euxo pipefail + if command -v sudo >/dev/null 2>&1; then SUDO=sudo; else SUDO=""; fi + $SUDO apt-get update -qq + DEBIAN_FRONTEND=noninteractive $SUDO apt-get install -y -qq bird2 + bird --version + - name: bird -p on all scenario bird.conf files + env: + WORKSPACE: ${{ github.workspace }} + run: | + set -euxo pipefail + WS="${WORKSPACE:-$PWD}" + cd "$WS" + if [ ! -f internal/birdfmt/testdata/scenarios/minimal/bird.conf ]; then + echo "Нет сценариев BIRD в checkout. Проверьте, что internal/birdfmt/testdata/scenarios закоммичен и push в remote." + ls -la internal/birdfmt/testdata/ 2>/dev/null || ls -la + exit 1 + fi + for conf in internal/birdfmt/testdata/scenarios/*/bird.conf; do + echo "==> $conf" + bird -c "$WS/$conf" -p + done + + commitlint: + if: inputs.is_pull_request + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + fetch-depth: 0 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + with: + node-version: "22" + - name: Enable pnpm via corepack + run: corepack enable + - id: pnpm-hash + run: echo "key=$(sha256sum pnpm-lock.yaml | awk '{print $1}')" >> "$GITHUB_OUTPUT" + - uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 + with: + path: ~/.local/share/pnpm/store + key: pnpm-${{ runner.os }}-${{ steps.pnpm-hash.outputs.key }} + restore-keys: | + pnpm-${{ runner.os }}- + - name: Lint commit messages + env: + BASE_SHA: ${{ inputs.base_sha }} + HEAD_SHA: ${{ inputs.head_sha }} + run: | + set -euxo pipefail + pnpm install --frozen-lockfile + pnpm exec commitlint --from "$BASE_SHA" --to "$HEAD_SHA" + + docker-check: + needs: [changes] + if: >- + inputs.is_pull_request && + (needs.changes.outputs.docker_go == 'true' || + needs.changes.outputs.docker_web == 'true' || + needs.changes.outputs.docker_bird == 'true') + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 + with: + name: evobgp + driver: docker-container + cleanup: false + - name: Log in to Gitea Registry + if: inputs.allow_registry_login + uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 + with: + registry: git.shx.one + username: ${{ gitea.actor }} + password: ${{ secrets.ACTIONS_PAT }} + - name: bake --print + working-directory: deploy/docker + env: + BUILDX_BAKE_ENTITLEMENTS_FS: "0" + run: docker buildx bake --allow=fs.read="${{ github.workspace }}" -f docker-bake.hcl --print default + - name: bake (no push) + if: inputs.allow_registry_login + working-directory: deploy/docker + env: + BUILDX_BAKE_ENTITLEMENTS_FS: "0" + CACHE_REF_GO: git.shx.one/${{ github.repository_owner }}/evobgp-buildcache:go-buildcache + CACHE_REF_WEB: git.shx.one/${{ github.repository_owner }}/evobgp-buildcache:web-buildcache + CACHE_REF_BIRDC: git.shx.one/${{ github.repository_owner }}/evobgp-buildcache:birdc-buildcache + run: | + set -euxo pipefail + owner_lc="$(echo '${{ github.repository_owner }}' | tr '[:upper:]' '[:lower:]')" + export CACHE_REF_GO="git.shx.one/${owner_lc}/evobgp-buildcache:go-buildcache" + export CACHE_REF_WEB="git.shx.one/${owner_lc}/evobgp-buildcache:web-buildcache" + export CACHE_REF_BIRDC="git.shx.one/${owner_lc}/evobgp-buildcache:birdc-buildcache" + docker buildx bake --allow=fs.read="${{ github.workspace }}" -f docker-bake.hcl default diff --git a/README.md b/README.md index d24e5bf..8f8994f 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,6 @@ docker compose --profile reference up -d - [docs/releasing.md](docs/releasing.md) — пайплайн, commit conventions, секреты CI - API: `GET /version` и `GET /v1/version` (поле `version`) -- Docker-образы: теги `latest`, `vX.Y.Z`, `X.Y.Z` — в **том же CI run**, что и релиз (job `release`) +- Docker-образы: теги `latest`, `vX.Y.Z`, `X.Y.Z` — в **том же CD run**, что и релиз (job `publish`) Лицензия и условия использования — по политике владельца репозитория. diff --git a/deploy/docker/README.md b/deploy/docker/README.md index 5bff7f3..8c6435d 100644 --- a/deploy/docker/README.md +++ b/deploy/docker/README.md @@ -2,29 +2,38 @@ ## CI (Gitea Actions) -Сборка образов — **`docker buildx bake`** (`deploy/docker/docker-bake.hcl`), не отдельные `docker build`. +Сборка образов — **`docker buildx bake`** ([docker-bake.hcl](docker-bake.hcl)), не отдельные `docker build`. -**Publish:** push в `main` после quality gates — job **release** в [.gitea/workflows/ci.yaml](../.gitea/workflows/ci.yaml): semantic-release + bake с `VERSION` из релиза. +**Publish:** push в `main` после quality gates — workflow [CD](../../.gitea/workflows/cd.yaml) job **publish**: semantic-release + зеркало base-образов + bake с `VERSION` из релиза. -Локально BuildKit также кэширует `/go/pkg/mod` и `~/.cache/go-build` через `RUN --mount=type=cache`. +Bake читает переменные из **окружения** (`REGISTRY`, `IMAGE_TAG`, `CACHE_REF_*`, `BASE_*`). Скрипт [write-bake-override.sh](write-bake-override.sh) — опциональный helper для локальной отладки. -| Было | Стало | -|------|--------| -| 8× `go mod download` + 8× `go build` (разные BIN) | 1× download + 1× компиляция всех `cmd/*` | -| 2× сборка BIRD из исходников (api, all) | 1× stage `birdc`, копируется в runtime | -| 2× `npm ci` (web, web-all) | 1× `web-deps` + 1× `web-build` + два nginx-образа (общий артефакт) | -| 8 runner'ов с checkout/login | 1 job `docker-go`, 1 job `docker-web` | +BuildKit кэширует `/go/pkg/mod`, `~/.cache/go-build` и pnpm store через `RUN --mount=type=cache`. На CI mounts живут, пока named builder `evobgp` не удаляют (`cleanup: false`). -Кэш registry (переменные bake): +### Слои и runtime -- `git.shx.one//evobgp-buildcache:go-buildcache` — **запись** только из target `go-build-all` -- `git.shx.one//evobgp-buildcache:web-buildcache` — **запись** только из target `web-build` +| Образ | Runtime base | Заметка | +|-------|----------------|---------| +| scheduler, ingest, render, deploy, node | `gcr.io/distroless/static-debian12:nonroot` | static Go (`CGO_ENABLED=0`), без shell | +| api, all | `debian:bookworm-slim` + `birdc` | только клиент birdc, без демона `bird` | +| agent | тот же Ubuntu+bird2, что bird2 | общие слои с `evobgp-bird2` | +| bird2 | Ubuntu Noble + пакет bird2 | | +| web, web-all | `nginx:1.27-alpine` | `worker_processes 1` | -Остальные bake-target’ы только `cache-from` (чтение). Параллельный `cache-to` в один ref ломает manifest в registry (`content descriptor … not found`). +Сборка Go: `golang:1.24-alpine`. Context режется корневым [.dockerignore](../../.dockerignore). -Локально BuildKit также кэширует `/go/pkg/mod` и `~/.cache/go-build` через `RUN --mount=type=cache`. +### Кэш registry -Если CI падает на «not found» после смены схемы кэша — один раз удалите теги `evobgp-buildcache:go-buildcache` и `:web-buildcache` в registry и пересоберите. +- `git.shx.one//evobgp-buildcache:go-buildcache` — **запись** только из `go-build-all` +- `git.shx.one//evobgp-buildcache:web-buildcache` — **запись** только из `web-build` +- `git.shx.one//evobgp-buildcache:birdc-buildcache` — **запись** только из `go-birdc` +- `git.shx.one//evobgp-buildcache:base-*` — зеркало FROM-образов (`mirror-base-images.sh`), без rebuild + +`pull = false` в bake: не перекачивать FROM, если слой уже в builder. Не запускайте `docker system prune -a` на runner. + +Параллельный `cache-to` в один ref ломает manifest (`content descriptor … not found`). + +Если CI падает на «not found» после смены схемы кэша — один раз удалите теги `evobgp-buildcache:*` в registry и пересоберите. ## Локальная сборка @@ -37,20 +46,24 @@ export IMAGE_TAG=latest export SHORT_SHA=$(git rev-parse --short HEAD) export VERSION=dev export BUILD_TIME= -sh write-bake-override.sh -docker buildx bake --allow=fs.read=../.. -f docker-bake.hcl -f docker-bake.override.hcl go-images -docker buildx bake --allow=fs.read=../.. -f docker-bake.hcl -f docker-bake.override.hcl web-images +docker buildx bake --allow=fs.read=../.. -f docker-bake.hcl go-images +docker buildx bake --allow=fs.read=../.. -f docker-bake.hcl web-images ``` -В `docker-bake.hcl`: `context = "../.."` (корень репо), `dockerfile = "deploy/docker/…"` (путь от корня репо). **CI:** `write-bake-override.sh` + `--allow=fs.read=$GITHUB_WORKSPACE` в `.gitea/workflows/ci.yaml`. +Проверка манифеста без сборки: -Один образ (legacy): +```bash +docker buildx bake --allow=fs.read=../.. -f docker-bake.hcl --print default +``` + +В `docker-bake.hcl`: `context = "../.."` (корень репо), `dockerfile = "deploy/docker/…"` (путь от корня репо). + +Один образ (legacy, target `build-all`): ```bash docker build -f deploy/docker/gobinary/Dockerfile \ --target build-all \ - --build-arg BIN=evobgp-api \ - -t evobgp-api:local . + -t evobgp-build-all:local . ``` -Runtime-образы в bake ожидают stage `build-all` (через bake contexts), не отдельный `--build-arg BIN` на старый target `build`. +Runtime-образы в bake ожидают stage `build-all` (через bake contexts). diff --git a/deploy/docker/bird2/Dockerfile b/deploy/docker/bird2/Dockerfile index 9770ccc..d6da7d3 100644 --- a/deploy/docker/bird2/Dockerfile +++ b/deploy/docker/bird2/Dockerfile @@ -1,10 +1,17 @@ +# syntax=docker/dockerfile:1.7 # BIRD из репозитория Ubuntu (Noble 24.04 LTS) — актуальнее пакета Debian bookworm. -# Сборка из корня репозитория: docker build -f deploy/docker/bird2/Dockerfile . -# Зеркало ECR Public вместо прямого pull с Docker Hub. -FROM public.ecr.aws/docker/library/ubuntu:noble -RUN apt-get update \ - && apt-get install -y --no-install-recommends bird2 \ - && rm -rf /var/lib/apt/lists/* +# Stage bird2-base общий с evobgp-agent (одинаковые слои на speaker-VPS). +ARG BASE_UBUNTU=public.ecr.aws/docker/library/ubuntu:noble + +FROM ${BASE_UBUNTU} AS bird2-base +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + rm -f /etc/apt/apt.conf.d/docker-clean \ + && apt-get update \ + && apt-get install -y --no-install-recommends bird2 ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +FROM bird2-base AS bird2 COPY deploy/bird/bird.conf /etc/bird/bird.conf RUN mkdir -p /etc/bird/bird.d EXPOSE 179 diff --git a/deploy/docker/docker-bake.hcl b/deploy/docker/docker-bake.hcl index b6c9a0a..8dceacf 100644 --- a/deploy/docker/docker-bake.hcl +++ b/deploy/docker/docker-bake.hcl @@ -1,7 +1,6 @@ # Единая сборка образов EvoBGP (buildx bake: -f deploy/docker/docker-bake.hcl). # context = "../.." — корень репозитория (относительно этого файла). -# dockerfile — путь от корня репозитория (относительно context). -# Переменные: REGISTRY, IMAGE_TAG, CACHE_REF_GO, CACHE_REF_WEB +# Переменные Bake читаются из окружения (см. docs.docker.com/build/bake/variables/). variable "REGISTRY" { default = "git.shx.one/evobgp" @@ -35,14 +34,40 @@ variable "CACHE_REF_WEB" { default = "" } +variable "CACHE_REF_BIRDC" { + default = "" +} + +variable "BASE_GOLANG" { + default = "public.ecr.aws/docker/library/golang:1.24-alpine" +} + +variable "BASE_DEBIAN" { + default = "public.ecr.aws/docker/library/debian:bookworm-slim" +} + +variable "BASE_DISTROLESS" { + default = "gcr.io/distroless/static-debian12:nonroot" +} + +variable "BASE_NODE" { + default = "public.ecr.aws/docker/library/node:22-alpine" +} + +variable "BASE_NGINX" { + default = "public.ecr.aws/docker/library/nginx:1.27-alpine" +} + +variable "BASE_UBUNTU" { + default = "public.ecr.aws/docker/library/ubuntu:noble" +} + function "go-cache-from" { params = [] result = notequal("", CACHE_REF_GO) ? ["type=registry,ref=${CACHE_REF_GO}"] : [] } -# Экспорт кэша — только go-build-all / web-build (один writer на ref). -# Несколько target с cache-to в один ref и mode=max дают гонку в registry -# (content descriptor not found при параллельном bake). +# Экспорт кэша — один writer на ref (параллельный cache-to в один ref ломает manifest). function "go-cache-to-export" { params = [] result = notequal("", CACHE_REF_GO) ? ["type=registry,ref=${CACHE_REF_GO},mode=max"] : [] @@ -58,6 +83,16 @@ function "web-cache-to-export" { result = notequal("", CACHE_REF_WEB) ? ["type=registry,ref=${CACHE_REF_WEB},mode=max"] : [] } +function "birdc-cache-from" { + params = [] + result = notequal("", CACHE_REF_BIRDC) ? ["type=registry,ref=${CACHE_REF_BIRDC}"] : [] +} + +function "birdc-cache-to-export" { + params = [] + result = notequal("", CACHE_REF_BIRDC) ? ["type=registry,ref=${CACHE_REF_BIRDC},mode=max"] : [] +} + group "default" { targets = ["go-images", "web-images", "evobgp-bird2"] } @@ -75,26 +110,38 @@ group "go-images" { ] } -# web-deps / web-build — только зависимости (contexts), без tags; при --push в группе не указывать. group "web-images" { targets = ["evobgp-web", "evobgp-web-all"] } +target "_common" { + platforms = ["linux/amd64"] + pull = false +} + +target "_go-bases" { + args = { + BASE_GOLANG = BASE_GOLANG + BASE_DEBIAN = BASE_DEBIAN + BASE_DISTROLESS = BASE_DISTROLESS + } +} + # --- Go: go mod download → все cmd/* → birdc (один раз) → runtime-образы --- target "go-deps" { + inherits = ["_common", "_go-bases"] context = "../.." dockerfile = "deploy/docker/gobinary/Dockerfile" target = "deps" - platforms = ["linux/amd64"] cache-from = go-cache-from() } target "go-build-all" { + inherits = ["_common", "_go-bases"] context = "../.." dockerfile = "deploy/docker/gobinary/Dockerfile" target = "build-all" - platforms = ["linux/amd64"] args = { VERSION = VERSION GIT_SHA = notequal("", SHA_FULL) ? SHA_FULL : SHORT_SHA @@ -108,18 +155,19 @@ target "go-build-all" { } target "go-birdc" { + inherits = ["_common", "_go-bases"] context = "../.." dockerfile = "deploy/docker/gobinary/Dockerfile" target = "birdc" - platforms = ["linux/amd64"] - cache-from = go-cache-from() + cache-from = birdc-cache-from() + cache-to = birdc-cache-to-export() } target "_go-runtime" { + inherits = ["_common", "_go-bases"] context = "../.." dockerfile = "deploy/docker/gobinary/Dockerfile" target = "runtime" - platforms = ["linux/amd64"] contexts = { build-all = "target:go-build-all" } @@ -127,15 +175,15 @@ target "_go-runtime" { } target "_go-runtime-birdc" { + inherits = ["_common", "_go-bases"] context = "../.." dockerfile = "deploy/docker/gobinary/Dockerfile" target = "runtime-birdc" - platforms = ["linux/amd64"] contexts = { build-all = "target:go-build-all" birdc = "target:go-birdc" } - cache-from = go-cache-from() + cache-from = concat(go-cache-from(), birdc-cache-from()) } function "image-tags" { @@ -198,32 +246,51 @@ target "evobgp-node" { tags = image-tags("evobgp-node") } +target "evobgp-bird2-base" { + inherits = ["_common"] + context = "../.." + dockerfile = "deploy/docker/bird2/Dockerfile" + target = "bird2-base" + args = { + BASE_UBUNTU = BASE_UBUNTU + } +} + target "evobgp-agent" { + inherits = ["_common"] context = "../.." dockerfile = "deploy/docker/evobgp-agent/Dockerfile" - platforms = ["linux/amd64"] contexts = { - build-all = "target:go-build-all" + build-all = "target:go-build-all" + bird2-base = "target:evobgp-bird2-base" } cache-from = go-cache-from() tags = image-tags("evobgp-agent") } -# --- Web: npm ci (кэш) → build → nginx --- +# --- Web --- target "web-deps" { + inherits = ["_common"] context = "../.." dockerfile = "deploy/docker/evobgp-web/Dockerfile" target = "deps" - platforms = ["linux/amd64"] + args = { + BASE_NODE = BASE_NODE + BASE_NGINX = BASE_NGINX + } cache-from = web-cache-from() } target "web-build" { + inherits = ["_common"] context = "../.." dockerfile = "deploy/docker/evobgp-web/Dockerfile" target = "build" - platforms = ["linux/amd64"] + args = { + BASE_NODE = BASE_NODE + BASE_NGINX = BASE_NGINX + } contexts = { deps = "target:web-deps" } @@ -232,34 +299,49 @@ target "web-build" { } target "evobgp-web" { + inherits = ["_common"] context = "../.." dockerfile = "deploy/docker/evobgp-web/Dockerfile" target = "web" - platforms = ["linux/amd64"] contexts = { web-artifacts = "target:web-build" } - args = { EVOBGP_UPSTREAM = "evobgp-api" } + args = { + EVOBGP_UPSTREAM = "evobgp-api" + BASE_NODE = BASE_NODE + BASE_NGINX = BASE_NGINX + } cache-from = web-cache-from() tags = image-tags("evobgp-web") } target "evobgp-web-all" { + inherits = ["_common"] context = "../.." dockerfile = "deploy/docker/evobgp-web/Dockerfile" target = "web" - platforms = ["linux/amd64"] contexts = { web-artifacts = "target:web-build" } - args = { EVOBGP_UPSTREAM = "evobgp-all" } + args = { + EVOBGP_UPSTREAM = "evobgp-all" + BASE_NODE = BASE_NODE + BASE_NGINX = BASE_NGINX + } cache-from = web-cache-from() tags = image-tags("evobgp-web-all") } target "evobgp-bird2" { + inherits = ["_common"] context = "../.." dockerfile = "deploy/docker/bird2/Dockerfile" - platforms = ["linux/amd64"] - tags = image-tags("evobgp-bird2") + target = "bird2" + args = { + BASE_UBUNTU = BASE_UBUNTU + } + contexts = { + bird2-base = "target:evobgp-bird2-base" + } + tags = image-tags("evobgp-bird2") } diff --git a/deploy/docker/evobgp-agent/Dockerfile b/deploy/docker/evobgp-agent/Dockerfile index 174a7af..5eb9b5a 100644 --- a/deploy/docker/evobgp-agent/Dockerfile +++ b/deploy/docker/evobgp-agent/Dockerfile @@ -1,9 +1,6 @@ # syntax=docker/dockerfile:1.7 -# Агент: бинарь из общего build-all (docker-bake.hcl → contexts.build-all), bird2 из apt. -FROM public.ecr.aws/docker/library/ubuntu:noble -RUN apt-get update \ - && apt-get install -y --no-install-recommends bird2 ca-certificates \ - && rm -rf /var/lib/apt/lists/* +# Агент: бинарь из bake context build-all, runtime = тот же bird2-base, что evobgp-bird2. +FROM bird2-base ARG BIN=evobgp-agent COPY --from=build-all /out/${BIN} /usr/local/bin/evobgp-agent WORKDIR /etc/bird diff --git a/deploy/docker/evobgp-web/Dockerfile b/deploy/docker/evobgp-web/Dockerfile index 807060e..145ceb6 100644 --- a/deploy/docker/evobgp-web/Dockerfile +++ b/deploy/docker/evobgp-web/Dockerfile @@ -1,9 +1,10 @@ # syntax=docker/dockerfile:1.7 # React + Vite статическая панель EvoBGP + nginx. # Финальный stage `web` ожидает bake-контекст web-artifacts (= target:web-build). -# Сборка ведётся из корня репозитория (context = "../.." в docker-bake.hcl). +ARG BASE_NODE=public.ecr.aws/docker/library/node:22-alpine +ARG BASE_NGINX=public.ecr.aws/docker/library/nginx:1.27-alpine -FROM public.ecr.aws/docker/library/node:22-alpine AS deps +FROM ${BASE_NODE} AS deps WORKDIR /repo RUN corepack enable && corepack prepare pnpm@10.33.2 --activate COPY pnpm-workspace.yaml pnpm-lock.yaml package.json ./ @@ -16,11 +17,13 @@ FROM deps AS build COPY tsconfig.base.json ./ COPY apps/web/ ./apps/web/ COPY packages/ui/ ./packages/ui/ -RUN pnpm --filter @evobgp/web run build +RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \ + pnpm --filter @evobgp/web run build -FROM public.ecr.aws/docker/library/nginx:1.27-alpine AS web +FROM ${BASE_NGINX} AS web ARG EVOBGP_UPSTREAM=evobgp-api COPY deploy/docker/evobgp-web/nginx.conf /tmp/nginx-default.conf RUN sed -e "s/evobgp-api/${EVOBGP_UPSTREAM}/g" /tmp/nginx-default.conf > /etc/nginx/conf.d/default.conf \ - && rm -f /tmp/nginx-default.conf + && rm -f /tmp/nginx-default.conf \ + && sed -i 's/^[[:space:]]*worker_processes[[:space:]]*auto;/worker_processes 1;/' /etc/nginx/nginx.conf COPY --from=web-artifacts /repo/apps/web/dist /usr/share/nginx/html diff --git a/deploy/docker/evobgp-web/nginx.conf b/deploy/docker/evobgp-web/nginx.conf index 7b25710..245d86e 100644 --- a/deploy/docker/evobgp-web/nginx.conf +++ b/deploy/docker/evobgp-web/nginx.conf @@ -4,6 +4,7 @@ server { root /usr/share/nginx/html; gzip on; gzip_types text/css application/javascript application/json image/svg+xml; + gzip_min_length 256; # Docker embedded DNS: без resolver nginx кэширует IP upstream при старте — # после recreate evobgp-all остаётся 502 (connection refused на старый IP). diff --git a/deploy/docker/gobinary/Dockerfile b/deploy/docker/gobinary/Dockerfile index a3e2b64..0eacfdc 100644 --- a/deploy/docker/gobinary/Dockerfile +++ b/deploy/docker/gobinary/Dockerfile @@ -1,19 +1,23 @@ # syntax=docker/dockerfile:1.7 # Универсальная сборка бинарей cmd/* (ARG BIN) или всех сразу (target build-all). -# INSTALL_BIRDC=1 — birdc из stage birdc (собирается один раз, переиспользуется api/all). +# Воркеры (runtime): distroless static. api/all (runtime-birdc): debian-slim + birdc. # CI: docker buildx bake -f deploy/docker/docker-bake.hcl -FROM public.ecr.aws/docker/library/golang:1.24-bookworm AS deps +ARG BASE_GOLANG=public.ecr.aws/docker/library/golang:1.24-alpine +ARG BASE_DEBIAN=public.ecr.aws/docker/library/debian:bookworm-slim +ARG BASE_DISTROLESS=gcr.io/distroless/static-debian12:nonroot + +FROM ${BASE_GOLANG} AS deps WORKDIR /src COPY go.mod go.sum ./ RUN --mount=type=cache,target=/go/pkg/mod,sharing=locked \ go mod download FROM deps AS build-all -COPY . . ARG VERSION=dev ARG GIT_SHA=unknown ARG BUILD_TIME= -RUN --mount=type=cache,target=/go/pkg/mod,sharing=locked \ +RUN --mount=type=bind,target=. \ + --mount=type=cache,target=/go/pkg/mod,sharing=locked \ --mount=type=cache,target=/root/.cache/go-build,sharing=locked \ set -eux; \ mkdir -p /out; \ @@ -29,12 +33,12 @@ RUN --mount=type=cache,target=/go/pkg/mod,sharing=locked \ # Один бинарь (локальная сборка); в CI — build-all + runtime. FROM deps AS build -COPY . . ARG BIN=evobgp-api ARG VERSION=dev ARG GIT_SHA=unknown ARG BUILD_TIME= -RUN --mount=type=cache,target=/go/pkg/mod,sharing=locked \ +RUN --mount=type=bind,target=. \ + --mount=type=cache,target=/go/pkg/mod,sharing=locked \ --mount=type=cache,target=/root/.cache/go-build,sharing=locked \ CGO_ENABLED=0 go build -trimpath \ -ldflags="-s -w \ @@ -43,29 +47,33 @@ RUN --mount=type=cache,target=/go/pkg/mod,sharing=locked \ -X evobgp/internal/version.BuildTime=${BUILD_TIME}" \ -o /out/evobgp "./cmd/${BIN}" -FROM public.ecr.aws/docker/library/debian:bookworm-slim AS birdc +FROM ${BASE_DEBIAN} AS birdc ARG BIRD_VERSION=2.14 COPY deploy/docker/bird/bird-from-source.sh /tmp/bird-from-source.sh -RUN chmod +x /tmp/bird-from-source.sh \ +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + rm -f /etc/apt/apt.conf.d/docker-clean \ + && chmod +x /tmp/bird-from-source.sh \ && BIRD_VERSION="${BIRD_VERSION}" /tmp/bird-from-source.sh \ && rm -f /tmp/bird-from-source.sh -FROM public.ecr.aws/docker/library/debian:bookworm-slim AS runtime-base -RUN apt-get update \ - && apt-get install -y --no-install-recommends ca-certificates \ - && rm -rf /var/lib/apt/lists/* - -FROM runtime-base AS runtime +# scheduler / ingest / render / deploy / node — static Go, без shell. +FROM ${BASE_DISTROLESS} AS runtime ARG BIN=evobgp-api COPY --from=build-all /out/${BIN} /usr/local/bin/evobgp -COPY scripts/firewall /opt/evobgp/scripts/firewall -ENV EVOBGP_FIREWALL_SCRIPTS=/opt/evobgp/scripts/firewall EXPOSE 8080 ENTRYPOINT ["/usr/local/bin/evobgp"] -FROM runtime AS runtime-birdc -# birdc: динамическая линковка readline + ncurses (debian bookworm). -RUN apt-get update \ - && apt-get install -y --no-install-recommends libreadline8 libncurses6 \ +# api / all — birdc (readline + ncurses). Только клиент birdc, без демона bird. +FROM ${BASE_DEBIAN} AS runtime-birdc +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + rm -f /etc/apt/apt.conf.d/docker-clean \ + && apt-get update \ + && apt-get install -y --no-install-recommends ca-certificates libreadline8 libncurses6 \ && rm -rf /var/lib/apt/lists/* -COPY --from=birdc /usr/local/sbin/bird /usr/local/sbin/birdc /usr/local/sbin/ +ARG BIN=evobgp-api +COPY --from=build-all /out/${BIN} /usr/local/bin/evobgp +COPY --from=birdc /usr/local/sbin/birdc /usr/local/sbin/birdc +EXPOSE 8080 +ENTRYPOINT ["/usr/local/bin/evobgp"] diff --git a/deploy/docker/mirror-base-images.sh b/deploy/docker/mirror-base-images.sh new file mode 100644 index 0000000..1cf8d4f --- /dev/null +++ b/deploy/docker/mirror-base-images.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env sh +# Copy-by-digest зеркало базовых образов в Gitea Container Registry (без rebuild). +# Требует: docker login в REGISTRY host, docker buildx. +# REGISTRY=git.shx.one/ (без суффикса /evobgp-buildcache) +set -eu +REGISTRY="${REGISTRY:?REGISTRY required (git.shx.one/)}" +CACHE_REPO="${REGISTRY}/evobgp-buildcache" + +mirror() { + src="$1" + tag="$2" + echo "mirror ${src} -> ${CACHE_REPO}:${tag}" + docker buildx imagetools create --tag "${CACHE_REPO}:${tag}" "${src}" +} + +mirror "public.ecr.aws/docker/library/golang:1.24-alpine" "base-golang-1.24-alpine" +mirror "public.ecr.aws/docker/library/debian:bookworm-slim" "base-debian-bookworm-slim" +mirror "public.ecr.aws/docker/library/node:22-alpine" "base-node-22-alpine" +mirror "public.ecr.aws/docker/library/nginx:1.27-alpine" "base-nginx-1.27-alpine" +mirror "public.ecr.aws/docker/library/ubuntu:noble" "base-ubuntu-noble" +mirror "gcr.io/distroless/static-debian12:nonroot" "base-distroless-static-debian12-nonroot" + +echo "BASE_GOLANG=${CACHE_REPO}:base-golang-1.24-alpine" +echo "BASE_DEBIAN=${CACHE_REPO}:base-debian-bookworm-slim" +echo "BASE_NODE=${CACHE_REPO}:base-node-22-alpine" +echo "BASE_NGINX=${CACHE_REPO}:base-nginx-1.27-alpine" +echo "BASE_UBUNTU=${CACHE_REPO}:base-ubuntu-noble" +echo "BASE_DISTROLESS=${CACHE_REPO}:base-distroless-static-debian12-nonroot" diff --git a/deploy/docker/write-bake-override.sh b/deploy/docker/write-bake-override.sh index 6d85664..949ceb4 100644 --- a/deploy/docker/write-bake-override.sh +++ b/deploy/docker/write-bake-override.sh @@ -1,5 +1,6 @@ #!/usr/bin/env sh -# Writes docker-bake.override.hcl for CI (buildx without --var support). +# Optional helper for local bake when env-based Bake variables are inconvenient. +# CI задаёт те же имена переменных в окружении и вызывает bake без этого файла. set -eu OUT="${1:-docker-bake.override.hcl}" REGISTRY="${REGISTRY:?REGISTRY required}" @@ -10,30 +11,29 @@ VERSION="${VERSION:-dev}" BUILD_TIME="${BUILD_TIME:-}" CACHE_REF_GO="${CACHE_REF_GO:-}" CACHE_REF_WEB="${CACHE_REF_WEB:-}" +CACHE_REF_BIRDC="${CACHE_REF_BIRDC:-}" +BASE_GOLANG="${BASE_GOLANG:-}" +BASE_DEBIAN="${BASE_DEBIAN:-}" +BASE_DISTROLESS="${BASE_DISTROLESS:-}" +BASE_NODE="${BASE_NODE:-}" +BASE_NGINX="${BASE_NGINX:-}" +BASE_UBUNTU="${BASE_UBUNTU:-}" cat >"$OUT" <>"$OUT"; fi +if [ -n "$BASE_DEBIAN" ]; then printf 'variable "BASE_DEBIAN" { default = "%s" }\n' "$BASE_DEBIAN" >>"$OUT"; fi +if [ -n "$BASE_DISTROLESS" ]; then printf 'variable "BASE_DISTROLESS" { default = "%s" }\n' "$BASE_DISTROLESS" >>"$OUT"; fi +if [ -n "$BASE_NODE" ]; then printf 'variable "BASE_NODE" { default = "%s" }\n' "$BASE_NODE" >>"$OUT"; fi +if [ -n "$BASE_NGINX" ]; then printf 'variable "BASE_NGINX" { default = "%s" }\n' "$BASE_NGINX" >>"$OUT"; fi +if [ -n "$BASE_UBUNTU" ]; then printf 'variable "BASE_UBUNTU" { default = "%s" }\n' "$BASE_UBUNTU" >>"$OUT"; fi diff --git a/docs/quickstart.md b/docs/quickstart.md index 376dbc4..540cf9c 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -11,7 +11,7 @@ ## Готовые образы без сборки (Container Registry Gitea) -После успешного CI (push в `main` или `master`) образы публикуются в **Container Registry** вашего Gitea. В workflow зафиксирован хост реестра **`git.shx.one`**; имя владельца в пути образа — **в нижнем регистре**, как у `github.repository_owner` в CI (например, пользователь `Denozord` → префикс `denozord`). +После успешного **CD** (push в `main` или `master`, job **publish**) образы публикуются в **Container Registry** вашего Gitea. В workflow зафиксирован хост реестра **`git.shx.one`**; имя владельца в пути образа — **в нижнем регистре**, как у `github.repository_owner` в CI (например, пользователь `Denozord` → префикс `denozord`). ### Шаблон имени и теги diff --git a/docs/releasing.md b/docs/releasing.md index e5ef826..548246e 100644 --- a/docs/releasing.md +++ b/docs/releasing.md @@ -23,21 +23,22 @@ EvoBGP использует [Conventional Commits](https://www.conventionalcommi Подробные правила сообщений коммитов: [.cursor/rules/conventional-commits.mdc](../.cursor/rules/conventional-commits.mdc). -## CI-пайплайн (один push в main) +## CI-пайплайн (push в main) ```text push/merge в main - → CI: openapi, web, go, bird2 (параллельно) - → job release (в том же workflow, после quality gates): + → workflow CD: quality (openapi, web, go, bird2) + → job publish: → semantic-release: git tag vX.Y.Z на текущий commit (без доп. commit) → Gitea Release + CHANGELOG.md как attachment - → docker buildx bake с VERSION=X.Y.Z + → зеркало base-образов в evobgp-buildcache:base-* + → docker buildx bake с VERSION=X.Y.Z (pull=false, named builder evobgp) → образы: latest, vX.Y.Z, X.Y.Z, sha-*, короткий SHA ``` -Pull request: только quality gates + commitlint; релиз и образы **не** публикуются. +Pull request: workflow **CI** — quality gates + commitlint; релиз и образы **не** публикуются. -Workflow: [.gitea/workflows/ci.yaml](../.gitea/workflows/ci.yaml) (job **release**). +Workflows: [.gitea/workflows/ci.yaml](../.gitea/workflows/ci.yaml), [.gitea/workflows/cd.yaml](../.gitea/workflows/cd.yaml), reusable [.gitea/workflows/quality.yaml](../.gitea/workflows/quality.yaml). Конфиг semantic-release: [.releaserc.json](../.releaserc.json) — без `@semantic-release/git` (CHANGELOG не коммитится в репозиторий). @@ -51,7 +52,7 @@ Workflow: [.gitea/workflows/ci.yaml](../.gitea/workflows/ci.yaml) (job **release | releases | Gitea Release + notes | | packages (Container Registry) | push образов | -Fallback: **`gitea.token`** (нужны права на releases и packages). +Fallback для **git tag**: `github.token`, если PAT недоступен. Push образов в Container Registry — **только `ACTIONS_PAT`** (у job token Gitea нет права packages). ## Источник правды для версии в runtime @@ -75,15 +76,15 @@ Web UI показывает версию из API (footer sidebar, страни Правило: **один scope** из таблицы в [.cursor/rules/conventional-commits.mdc](../.cursor/rules/conventional-commits.mdc) (`web`, `httpapi`, `api`, …). -На push в `main` job **release** запускает `scripts/commit/verify-release-commits.mjs` — в логе будут предупреждения о непарсящихся коммитах. +На push в `main` job **publish** запускает `scripts/commit/verify-release-commits.mjs` — в логе будут предупреждения о непарсящихся коммитах. Если релиз «не создался», а CI зелёный: смотрите лог release — часто `No releasable commits`. Исправление: новый коммит с корректным заголовком (например `refactor(web): …`). -## Перезапуск упавшего job release +## Перезапуск упавшего job publish -semantic-release пишет `.release-version` только в `successCmd` при **новом** релизе. Если тег `vX.Y.Z` уже создан, а `docker buildx bake` упал, повторный run того же SHA делает semantic-release no-op (файла нет). Job **release** тогда берёт версию из git-тега на `HEAD` и публикует образы. +semantic-release пишет `.release-version` только в `successCmd` при **новом** релизе. Если тег `vX.Y.Z` уже создан, а `docker buildx bake` упал, повторный run того же SHA делает semantic-release no-op (файла нет). Job **publish** тогда берёт версию из git-тега на `HEAD` и публикует образы. -Перезапускать нужно **весь job release**, не отдельный шаг bake: checkout + semantic-release + detect + bake идут подряд. +Перезапускать нужно **весь job publish**, не отдельный шаг bake: checkout + semantic-release + detect + bake идут подряд. ## CHANGELOG @@ -91,7 +92,7 @@ Release notes — в Gitea Release; файл `CHANGELOG.md` генерирует ## Проверка после релиза -1. Один run workflow **CI** на push в main: job **release** зелёный. +1. Один run workflow **CD** на push в main: job **publish** зелёный. 2. Gitea: тег `vX.Y.Z` на том же commit, что и merge; Release с notes. 3. Container Registry: `evobgp-api:vX.Y.Z`, `evobgp-api:X.Y.Z`, `evobgp-api:latest`. 4. `curl http://localhost:8080/version` → `"version":"X.Y.Z"`. diff --git a/package.json b/package.json index 0ab42df..ee55c1b 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "@commitlint/cli": "^19.8.1", "@commitlint/config-conventional": "^19.8.1", "@markwylde/semantic-release-gitea": "^2.2.0", + "@redocly/cli": "1.34.5", "@semantic-release/changelog": "^6.0.3", "@semantic-release/commit-analyzer": "^13.0.1", "@semantic-release/exec": "^7.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9a46be6..b2c1899 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,9 @@ importers: '@markwylde/semantic-release-gitea': specifier: ^2.2.0 version: 2.2.0 + '@redocly/cli': + specifier: 1.34.5 + version: 1.34.5(ajv@8.20.0) '@semantic-release/changelog': specifier: ^6.0.3 version: 6.0.3(semantic-release@25.0.5(typescript@5.9.3)) @@ -456,6 +459,12 @@ packages: peerDependencies: react: '>=16.8.0' + '@emotion/is-prop-valid@1.4.0': + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + '@esbuild/aix-ppc64@0.28.1': resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} engines: {node: '>=18'} @@ -650,6 +659,13 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@exodus/schemasafe@1.3.0': + resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} + + '@faker-js/faker@7.6.0': + resolution: {integrity: sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==} + engines: {node: '>=14.0.0', npm: '>=6.0.0'} + '@floating-ui/core@1.7.5': resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} @@ -686,10 +702,18 @@ packages: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} + '@humanwhocodes/momoa@2.0.4': + resolution: {integrity: sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==} + engines: {node: '>=10.10.0'} + '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -706,6 +730,18 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@jsep-plugin/assignment@1.3.0': + resolution: {integrity: sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + + '@jsep-plugin/regex@1.0.4': + resolution: {integrity: sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + '@keyv/serialize@1.1.1': resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} @@ -713,6 +749,9 @@ packages: resolution: {integrity: sha512-qfDhu5ExWRtZgw5Z6KhVAM6hlLHqj5RuSiGmLlUYMI7FNr4VWsk0zRpdYCgv0yqG3D+n8df12ZaUON0KYxo3bg==} engines: {node: '>=18.0.0'} + '@nodable/entities@3.0.0': + resolution: {integrity: sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -773,6 +812,90 @@ packages: '@octokit/types@16.0.0': resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==} + '@opentelemetry/api-logs@0.53.0': + resolution: {integrity: sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==} + engines: {node: '>=14'} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/context-async-hooks@1.26.0': + resolution: {integrity: sha512-HedpXXYzzbaoutw6DFLWLDket2FwLkLpil4hGCZ1xYEIMTcivdfwEOISgdbLEWyG3HW52gTq2V9mOVJrONgiwg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@1.26.0': + resolution: {integrity: sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/exporter-trace-otlp-http@0.53.0': + resolution: {integrity: sha512-m7F5ZTq+V9mKGWYpX8EnZ7NjoqAU7VemQ1E2HAG+W/u0wpY1x0OmbxAXfGKFHCspdJk8UKlwPGrpcB8nay3P8A==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/otlp-exporter-base@0.53.0': + resolution: {integrity: sha512-UCWPreGQEhD6FjBaeDuXhiMf6kkBODF0ZQzrk/tuQcaVDJ+dDQ/xhJp192H9yWnKxVpEjFrSSLnpqmX4VwX+eA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/otlp-transformer@0.53.0': + resolution: {integrity: sha512-rM0sDA9HD8dluwuBxLetUmoqGJKSAbWenwD65KY9iZhUxdBHRLrIdrABfNDP7aiTjcgK8XFyTn5fhDz7N+W6DA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/propagator-b3@1.26.0': + resolution: {integrity: sha512-vvVkQLQ/lGGyEy9GT8uFnI047pajSOVnZI2poJqVGD3nJ+B9sFGdlHNnQKophE3lHfnIH0pw2ubrCTjZCgIj+Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/propagator-jaeger@1.26.0': + resolution: {integrity: sha512-DelFGkCdaxA1C/QA0Xilszfr0t4YbGd3DjxiCDPh34lfnFr+VkkrjV9S8ZTJvAzfdKERXhfOxIKBoGPJwoSz7Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/resources@1.26.0': + resolution: {integrity: sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.53.0': + resolution: {integrity: sha512-dhSisnEgIj/vJZXZV6f6KcTnyLDx/VuQ6l3ejuZpMpPlh9S1qMHiZU9NMmOkVkwwHkMy3G6mEBwdP23vUZVr4g==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-metrics@1.26.0': + resolution: {integrity: sha512-0SvDXmou/JjzSDOjUmetAAvcKQW6ZrvosU0rkbDGpXvvZN+pQF6JbK/Kd4hNdK4q/22yeruqvukXEJyySTzyTQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@1.26.0': + resolution: {integrity: sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@1.26.0': + resolution: {integrity: sha512-Fj5IVKrj0yeUwlewCRwzOVcr5avTuNnMHWf7GPc1t6WaT78J6CJyF3saZ/0RkZfdeNO8IcBl/bNcWMVZBMRW8Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.27.0': + resolution: {integrity: sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==} + engines: {node: '>=14'} + '@playwright/test@1.62.1': resolution: {integrity: sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==} engines: {node: '>=20'} @@ -790,6 +913,33 @@ packages: resolution: {integrity: sha512-//0sR/cow/s4ICQaYoAobOl4aU8cjU6x/V24V7XkKotb9+O+3zySIYp146vpaobYHnxa4pZX8NkV54Z5AwbDKA==} engines: {node: '>=12'} + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.5': + resolution: {integrity: sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==} + + '@protobufjs/eventemitter@1.1.1': + resolution: {integrity: sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==} + + '@protobufjs/fetch@1.1.1': + resolution: {integrity: sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.2': + resolution: {integrity: sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==} + '@radix-ui/primitive@1.1.4': resolution: {integrity: sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==} @@ -955,6 +1105,11 @@ packages: '@redocly/ajv@8.11.2': resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==} + '@redocly/cli@1.34.5': + resolution: {integrity: sha512-5IEwxs7SGP5KEXjBKLU8Ffdz9by/KqNSeBk6YUVQaGxMXK//uYlTJIPntgUXbo1KAGG2d2q2XF8y4iFz6qNeiw==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + hasBin: true + '@redocly/config@0.22.0': resolution: {integrity: sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==} @@ -962,6 +1117,14 @@ packages: resolution: {integrity: sha512-UyKIm0wTPw5BcY7Z2PkbK1Ma260um96LSBWXHrdSMe+ZV0EPMyDfAcUcjjm3qEiGST9OK/1TriekdPCZkn4Q3A==} engines: {node: '>=18.17.0', npm: '>=9.5.0'} + '@redocly/openapi-core@1.34.5': + resolution: {integrity: sha512-0EbE8LRbkogtcCXU7liAyC00n9uNG9hJ+eMyHFdUsy9lB/WGqnEBgwjA9q2cyzAVcdTkQqTBBU1XePNnN3OijA==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + + '@redocly/respect-core@1.34.5': + resolution: {integrity: sha512-GheC/g/QFztPe9UA9LamooSplQuy9pe0Yr8XGTqkz0ahivLDl7svoy/LSQNn1QH3XGtLKwFYMfTwFR2TAYyh5Q==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + '@reduxjs/toolkit@2.12.0': resolution: {integrity: sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==} peerDependencies: @@ -1165,6 +1328,9 @@ packages: resolution: {integrity: sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==} engines: {node: '>=18'} + '@sinclair/typebox@0.27.12': + resolution: {integrity: sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==} + '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} @@ -1472,6 +1638,9 @@ packages: '@types/react@19.2.17': resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@types/use-sync-external-store@0.0.6': resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} @@ -1576,6 +1745,10 @@ packages: 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'} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1632,6 +1805,10 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} @@ -1643,6 +1820,13 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + anynum@1.0.1: + resolution: {integrity: sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1681,6 +1865,16 @@ packages: before-after-hook@4.0.0: resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==} + better-ajv-errors@1.2.0: + resolution: {integrity: sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + ajv: 4.11.8 - 8 + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + bottleneck@2.19.5: resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} @@ -1703,6 +1897,13 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + byte-counter@0.1.0: resolution: {integrity: sha512-jheRLVMeUKrDBjVw2O5+k4EvR4t9wtxHL+bo/LxfkxsVeuGMy3a5SEGgXdAFA4FSzTrU8rQXQIrsZ3oBq5a0pQ==} engines: {node: '>=20'} @@ -1723,6 +1924,9 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} + call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -1757,6 +1961,10 @@ packages: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + chokidar@5.0.0: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} @@ -1764,6 +1972,9 @@ packages: class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -1818,6 +2029,9 @@ packages: colorette@1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + 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'} @@ -1828,6 +2042,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -1876,6 +2094,13 @@ packages: cookie-es@3.1.1: resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==} + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + core-js@3.50.0: + resolution: {integrity: sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw==} + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -1970,6 +2195,9 @@ packages: decimal.js-light@2.5.1: resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + decko@1.2.0: + resolution: {integrity: sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ==} + decompress-response@10.0.0: resolution: {integrity: sha512-oj7KWToJuuxlPr7VV0vabvxEIiqNMo+q0NueIiL3XhtwC6FVOX7Hr1c0C4eD0bmf7Zr+S/dSf2xvkH3Ad6sU3Q==} engines: {node: '>=20'} @@ -1985,6 +2213,18 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.5.1: + resolution: {integrity: sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==} + engines: {node: '>=18'} + + 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'} @@ -1996,6 +2236,10 @@ packages: detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff@8.0.4: resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} @@ -2004,10 +2248,17 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + dompurify@3.4.13: + resolution: {integrity: sha512-2vmYIoqjze2d+kakP8S/nS5shfsl587kzwEjcGlTdiksUVgFHnFCsLYDVj/JNqJVOQZGSYBTmuycv0PodwmnMQ==} + dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -2068,6 +2319,9 @@ packages: es-toolkit@1.49.0: resolution: {integrity: sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==} + es6-promise@3.3.1: + resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + esbuild@0.28.1: resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} engines: {node: '>=18'} @@ -2149,6 +2403,10 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} @@ -2177,9 +2435,19 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fast-uri@3.1.3: resolution: {integrity: sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==} + fast-xml-builder@1.3.1: + resolution: {integrity: sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug==} + + fast-xml-parser@5.11.0: + resolution: {integrity: sha512-9IGxMqvqLOnqP+Egi1nqDHKv5k8aZ7r9n558enxcucmyVGEBNPAU+MOg/8jPIS7rO7sSq4gFm1/nHtiaubMruw==} + hasBin: true + fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -2235,6 +2503,9 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + foreach@2.0.6: + resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==} + form-data-encoder@4.1.0: resolution: {integrity: sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==} engines: {node: '>= 18'} @@ -2247,6 +2518,9 @@ packages: resolution: {integrity: sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==} engines: {node: '>=14.14'} + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2284,6 +2558,9 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} + get-port-please@3.2.0: + resolution: {integrity: sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -2317,6 +2594,10 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + global-directory@4.0.1: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} engines: {node: '>=18'} @@ -2403,6 +2684,9 @@ packages: resolution: {integrity: sha512-2NxoveTT58mjYT4n3RPTEfCZGLMbidoO8XEieXfpSYxu+PQJ1qpx4ypwH6N+uF9twBPIvRRgvkvW5HUTYWENig==} engines: {node: '>= 20'} + http2-client@1.3.5: + resolution: {integrity: sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==} + http2-wrapper@2.2.1: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} @@ -2464,6 +2748,10 @@ packages: resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} engines: {node: '>=18'} + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -2487,6 +2775,15 @@ packages: 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-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'} @@ -2499,6 +2796,11 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -2531,6 +2833,13 @@ packages: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} + is-unsafe@2.0.0: + resolution: {integrity: sha512-2LdV822R+wmI86unXA93WCFpL6g+av8ynWk0nrHyJqGop5VoocYsSLFgN8jrfalT6iGeLNM4KXuVSsULP53kEA==} + + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -2549,6 +2858,18 @@ packages: resolution: {integrity: sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==} engines: {node: '>= 0.6.0'} + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -2567,10 +2888,18 @@ packages: js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + js-yaml@4.3.0: resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} hasBin: true + jsep@1.4.0: + resolution: {integrity: sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==} + engines: {node: '>= 10.16.0'} + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -2585,6 +2914,9 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-pointer@0.6.2: + resolution: {integrity: sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -2609,12 +2941,25 @@ packages: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} + jsonpath-plus@10.4.0: + resolution: {integrity: sha512-T92WWatJXmhBbKsgH/0hl+jxjdXrifi5IKeMY02DWggRxX0UElcbVzPlmgLTbvsPeW1PasQ6xE2Q75stkhGbsA==} + engines: {node: '>=18.0.0'} + hasBin: true + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} keyv@5.6.0: resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -2757,6 +3102,13 @@ packages: lodash@4.18.1: resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} @@ -2779,6 +3131,9 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -2786,6 +3141,9 @@ packages: resolution: {integrity: sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==} engines: {node: '>=18'} + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + marked-terminal@7.3.0: resolution: {integrity: sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==} engines: {node: '>=16.0.0'} @@ -2797,6 +3155,11 @@ packages: engines: {node: '>= 18'} hasBin: true + marked@4.3.0: + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} + hasBin: true + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -2855,6 +3218,35 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + mobx-react-lite@4.1.1: + resolution: {integrity: sha512-iUxiMpsvNraCKXU+yPotsOncNNmyeS2B5DKL+TL6Tar/xm+wwNJAubJmtRSeAoYawdZqwv8Z/+5nPRHeQxTiXg==} + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + mobx-react@9.2.2: + resolution: {integrity: sha512-ShszmQzR/VrhU3M0cQ7DA/s8qNcLcF2emSuudJ/TnDILS3C1Im48mdaG6CpyjZHy8+WqgXUCC9mPqSRIwPPMuQ==} + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 || ^19 + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + mobx@6.16.1: + resolution: {integrity: sha512-syNcDdX3KT+Jq3je6eGjBhuc24Z68td2VG0zNFqRswaE433D9SNH5VRy/xrGbJsUixfppLLccXhAW9JSf6n+SQ==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2885,6 +3277,22 @@ packages: resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} engines: {node: '>=18'} + node-fetch-h2@2.3.0: + resolution: {integrity: sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==} + engines: {node: 4.x || >=6.0.0} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-readfiles@0.2.0: + resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==} + node-releases@2.0.50: resolution: {integrity: sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==} engines: {node: '>=18'} @@ -2897,6 +3305,10 @@ packages: resolution: {integrity: sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==} engines: {node: ^20.17.0 || >=22.9.0} + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + normalize-url@8.1.1: resolution: {integrity: sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==} engines: {node: '>=14.16'} @@ -2984,14 +3396,40 @@ packages: - validate-npm-package-name - which + oas-kit-common@1.0.8: + resolution: {integrity: sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==} + + oas-linter@3.2.2: + resolution: {integrity: sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==} + + oas-resolver@2.5.6: + resolution: {integrity: sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==} + hasBin: true + + oas-schema-walker@1.1.5: + resolution: {integrity: sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==} + + oas-validator@5.0.8: + resolution: {integrity: sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + + openapi-sampler@1.7.4: + resolution: {integrity: sha512-CKS/rd5ucPCuEDbJnjGDXZTsuGWcmv53aCmQx7soZlPEONUGN4af0/dY5+THRFZraSEjeA78nlfzdFswC/N5SA==} + openapi-typescript@7.13.0: resolution: {integrity: sha512-EFP392gcqXS7ntPvbhBzbF8TyBA+baIYEm791Hy5YkjDYKTnk/Tn5OQeKm5BIZvJihpp8Zzr4hzx0Irde1LNGQ==} hasBin: true @@ -3002,6 +3440,9 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + outdent@0.8.0: + resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} + p-cancelable@4.0.1: resolution: {integrity: sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==} engines: {node: '>=14.16'} @@ -3087,6 +3528,9 @@ packages: parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} @@ -3099,6 +3543,14 @@ packages: resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + path-expression-matcher@1.6.2: + resolution: {integrity: sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==} + engines: {node: '>=14.0.0'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -3118,6 +3570,9 @@ packages: resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} + perfect-scrollbar@1.5.6: + resolution: {integrity: sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3151,6 +3606,10 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} + polished@4.3.1: + resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} + engines: {node: '>=10'} + postcss@8.5.16: resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==} engines: {node: ^10 || ^12 || >=14} @@ -3164,16 +3623,31 @@ packages: engines: {node: '>=14'} hasBin: true + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-ms@9.3.0: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + protobufjs@7.6.5: + resolution: {integrity: sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw==} + engines: {node: '>=12.0.0'} + proxy-agent-negotiate@1.1.0: resolution: {integrity: sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ==} engines: {node: '>= 20'} @@ -3194,6 +3668,9 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -3219,6 +3696,12 @@ packages: peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-is@19.2.7: resolution: {integrity: sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==} @@ -3268,6 +3751,11 @@ packages: '@types/react': optional: true + react-tabs@6.1.1: + resolution: {integrity: sha512-CPiuKoMFf89B7QlbFfdBD9XmUWiE3qudQputMVZB8GQvPJZRX/gqjDaDWOPDwGinEfpJKEuBCkGt83Tt4efeyA==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react@19.2.7: resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} engines: {node: '>=0.10.0'} @@ -3291,6 +3779,14 @@ packages: 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'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + readdirp@5.0.0: resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} engines: {node: '>= 20.19.0'} @@ -3303,6 +3799,16 @@ packages: react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-is: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + redoc@2.5.0: + resolution: {integrity: sha512-NpYsOZ1PD9qFdjbLVBZJWptqE+4Y6TkUuvEOqPUmoH7AKOmPcE+hYjotLxQNTqVoWL4z0T2uxILmcc8JGDci+Q==} + engines: {node: '>=6.9', npm: '>=3.0.0'} + peerDependencies: + core-js: ^3.1.4 + mobx: ^6.0.4 + react: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 + styled-components: ^4.1.1 || ^5.1.1 || ^6.0.5 + redux-thunk@3.1.0: resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} peerDependencies: @@ -3311,6 +3817,9 @@ packages: redux@5.0.1: resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} + reftools@1.1.9: + resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==} + registry-auth-token@5.1.1: resolution: {integrity: sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==} engines: {node: '>=14'} @@ -3353,6 +3862,10 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -3390,6 +3903,9 @@ packages: resolution: {integrity: sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw==} engines: {node: '>=10'} + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -3398,6 +3914,24 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + should-equal@2.0.0: + resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==} + + should-format@3.0.3: + resolution: {integrity: sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==} + + should-type-adaptors@1.1.0: + resolution: {integrity: sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==} + + should-type@1.4.0: + resolution: {integrity: sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==} + + should-util@1.0.1: + resolution: {integrity: sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==} + + should@13.2.3: + resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -3409,6 +3943,9 @@ packages: resolution: {integrity: sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==} engines: {node: '>=6'} + simple-websocket@9.1.0: + resolution: {integrity: sha512-8MJPnjRN6A8UCp1I+H/dSFyjwJhp6wta4hsVRhjf8w9qBHRzxYt14RaOcjvQnhD1N4yKOddEjflwMnQM4VtXjQ==} + skin-tone@2.0.0: resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} engines: {node: '>=8'} @@ -3417,6 +3954,10 @@ packages: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} + slugify@1.4.7: + resolution: {integrity: sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==} + engines: {node: '>=8.0.0'} + sonner@1.7.4: resolution: {integrity: sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw==} peerDependencies: @@ -3459,6 +4000,9 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + stickyfill@1.1.1: + resolution: {integrity: sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==} + stream-combiner2@1.1.1: resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} @@ -3504,6 +4048,28 @@ packages: strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + strnum@2.4.2: + resolution: {integrity: sha512-rDG3Ah4TV0k1hWvLSzkZtMmLN9+eS+h3knq4MP6A42Y3Yh5qGNnOUs1jJkoSr8FG5dsL28c7KgkIBzSEykqtuw==} + + styled-components@6.5.3: + resolution: {integrity: sha512-vAX79sfpmUerP9fsTTxoTrBDE0RuO4ahjInyWYoohNgqrdg63Ms4q6FJ/o2Fyity82NU3cujOT8Ewl9TThBdwg==} + engines: {node: '>= 16'} + peerDependencies: + css-to-react-native: '>= 3.2.0' + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-native: '>= 0.68.0' + peerDependenciesMeta: + css-to-react-native: + optional: true + react-dom: + optional: true + react-native: + optional: true + + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + super-regex@1.1.0: resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} engines: {node: '>=18'} @@ -3524,6 +4090,10 @@ packages: resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} engines: {node: '>=14.18'} + swagger2openapi@7.0.8: + resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==} + hasBin: true + tagged-tag@1.0.0: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} @@ -3600,6 +4170,9 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + traverse@0.6.8: resolution: {integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==} engines: {node: '>= 0.4'} @@ -3640,6 +4213,9 @@ packages: resolution: {integrity: sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==} engines: {node: '>=20'} + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + typescript-eslint@8.62.1: resolution: {integrity: sha512-vymnnM5g0AKQDSAyfP12nMIBvgwgA42syg74kkuZ4x1VuTzwQKwc5h9rGxeShCjny5o+zWAb6OEoz7XLgrIkIw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3744,6 +4320,9 @@ packages: resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + url-template@2.0.8: + resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} + use-callback-ref@1.3.3: resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} @@ -3854,6 +4433,9 @@ packages: web-worker@1.5.0: resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} @@ -3861,6 +4443,9 @@ packages: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -3886,6 +4471,29 @@ packages: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.5.13: + resolution: {integrity: sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + + xml-naming@0.3.0: + resolution: {integrity: sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==} + engines: {node: '>=16.0.0'} + xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -3900,6 +4508,10 @@ packages: yaml-ast-parser@0.0.43: resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + yaml@1.10.3: + resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} + engines: {node: '>= 6'} + yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -3916,6 +4528,10 @@ packages: resolution: {integrity: sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==} engines: {node: '>=10'} + yargs@17.0.1: + resolution: {integrity: sha512-xBBulfCc8Y6gLFcrPvtqKz9hz8SO0l1Ni8GgDekvBX2ro0HRQImDGnikfc33cgzcYUSncapnNcZDjVFIH3f6KQ==} + engines: {node: '>=12'} + yargs@17.7.3: resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} engines: {node: '>=12'} @@ -4246,6 +4862,12 @@ snapshots: react: 19.2.7 tslib: 2.8.1 + '@emotion/is-prop-valid@1.4.0': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + '@esbuild/aix-ppc64@0.28.1': optional: true @@ -4370,6 +4992,10 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 + '@exodus/schemasafe@1.3.0': {} + + '@faker-js/faker@7.6.0': {} + '@floating-ui/core@1.7.5': dependencies: '@floating-ui/utils': 0.2.11 @@ -4405,8 +5031,14 @@ snapshots: '@humanwhocodes/module-importer@1.0.1': {} + '@humanwhocodes/momoa@2.0.4': {} + '@humanwhocodes/retry@0.4.3': {} + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.12 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -4426,6 +5058,14 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@jsep-plugin/assignment@1.3.0(jsep@1.4.0)': + dependencies: + jsep: 1.4.0 + + '@jsep-plugin/regex@1.0.4(jsep@1.4.0)': + dependencies: + jsep: 1.4.0 + '@keyv/serialize@1.1.1': {} '@markwylde/semantic-release-gitea@2.2.0': @@ -4443,6 +5083,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@nodable/entities@3.0.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -4515,6 +5157,95 @@ snapshots: dependencies: '@octokit/openapi-types': 27.0.0 + '@opentelemetry/api-logs@0.53.0': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/context-async-hooks@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.27.0 + + '@opentelemetry/exporter-trace-otlp-http@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-exporter-base@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.53.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-transformer@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.53.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) + protobufjs: 7.6.5 + + '@opentelemetry/propagator-b3@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/propagator-jaeger@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/resources@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + + '@opentelemetry/sdk-logs@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.53.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-metrics@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + + '@opentelemetry/sdk-trace-node@1.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-b3': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-jaeger': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) + semver: 7.8.5 + + '@opentelemetry/semantic-conventions@1.27.0': {} + '@playwright/test@1.62.1': dependencies: playwright: 1.62.1 @@ -4531,6 +5262,26 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.5': {} + + '@protobufjs/eventemitter@1.1.1': {} + + '@protobufjs/fetch@1.1.1': + dependencies: + '@protobufjs/aspromise': 1.1.2 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.2': {} + '@radix-ui/primitive@1.1.4': {} '@radix-ui/react-compose-refs@1.1.3(@types/react@19.2.17)(react@19.2.7)': @@ -4673,6 +5424,43 @@ snapshots: require-from-string: 2.0.2 uri-js-replace: 1.0.1 + '@redocly/cli@1.34.5(ajv@8.20.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/exporter-trace-otlp-http': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@redocly/config': 0.22.0 + '@redocly/openapi-core': 1.34.5 + '@redocly/respect-core': 1.34.5(ajv@8.20.0) + abort-controller: 3.0.0 + chokidar: 3.6.0 + colorette: 1.4.0 + core-js: 3.50.0 + dotenv: 16.4.7 + form-data: 4.0.6 + get-port-please: 3.2.0 + glob: 7.2.3 + handlebars: 4.7.9 + mobx: 6.16.1 + pluralize: 8.0.0 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + redoc: 2.5.0(core-js@3.50.0)(mobx@6.16.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(styled-components@6.5.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) + semver: 7.8.5 + simple-websocket: 9.1.0 + styled-components: 6.5.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + yargs: 17.0.1 + transitivePeerDependencies: + - ajv + - bufferutil + - css-to-react-native + - encoding + - react-native + - supports-color + - utf-8-validate + '@redocly/config@0.22.0': {} '@redocly/openapi-core@1.34.18(supports-color@10.2.2)': @@ -4689,6 +5477,45 @@ snapshots: transitivePeerDependencies: - supports-color + '@redocly/openapi-core@1.34.5': + dependencies: + '@redocly/ajv': 8.11.2 + '@redocly/config': 0.22.0 + colorette: 1.4.0 + https-proxy-agent: 7.0.6(supports-color@10.2.2) + js-levenshtein: 1.1.6 + js-yaml: 4.3.0 + minimatch: 5.1.9 + pluralize: 8.0.0 + yaml-ast-parser: 0.0.43 + transitivePeerDependencies: + - supports-color + + '@redocly/respect-core@1.34.5(ajv@8.20.0)': + dependencies: + '@faker-js/faker': 7.6.0 + '@redocly/ajv': 8.11.2 + '@redocly/openapi-core': 1.34.5 + better-ajv-errors: 1.2.0(ajv@8.20.0) + colorette: 2.0.20 + concat-stream: 2.0.0 + cookie: 0.7.2 + dotenv: 16.4.7 + form-data: 4.0.6 + jest-diff: 29.7.0 + jest-matcher-utils: 29.7.0 + js-yaml: 4.1.0 + json-pointer: 0.6.2 + jsonpath-plus: 10.4.0 + open: 10.2.0 + openapi-sampler: 1.7.4 + outdent: 0.8.0 + set-cookie-parser: 2.7.2 + undici: 6.27.0 + transitivePeerDependencies: + - ajv + - supports-color + '@reduxjs/toolkit@2.12.0(react-redux@9.3.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1))(react@19.2.7)': dependencies: '@standard-schema/spec': 1.1.0 @@ -4877,6 +5704,8 @@ snapshots: '@simple-libs/stream-utils@1.2.0': {} + '@sinclair/typebox@0.27.12': {} + '@sindresorhus/is@4.6.0': {} '@sindresorhus/is@7.2.0': {} @@ -5172,6 +6001,9 @@ snapshots: dependencies: csstype: 3.2.3 + '@types/trusted-types@2.0.7': + optional: true + '@types/use-sync-external-store@0.0.6': {} '@types/whatwg-mimetype@3.0.2': {} @@ -5326,6 +6158,10 @@ snapshots: jsonparse: 1.3.1 through: 2.3.8 + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + acorn-jsx@5.3.2(acorn@8.17.0): dependencies: acorn: 8.17.0 @@ -5378,12 +6214,21 @@ snapshots: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + ansi-styles@6.2.3: {} ansis@4.3.1: {} any-promise@1.3.0: {} + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + anynum@1.0.1: {} + argparse@2.0.1: {} argv-formatter@1.0.0: {} @@ -5415,6 +6260,17 @@ snapshots: before-after-hook@4.0.0: {} + better-ajv-errors@1.2.0(ajv@8.20.0): + dependencies: + '@babel/code-frame': 7.29.7 + '@humanwhocodes/momoa': 2.0.4 + ajv: 8.20.0 + chalk: 4.1.2 + jsonpointer: 5.0.1 + leven: 3.1.0 + + binary-extensions@2.3.0: {} + bottleneck@2.19.5: {} brace-expansion@1.1.15: @@ -5442,6 +6298,12 @@ snapshots: node-releases: 2.0.50 update-browserslist-db: 1.2.3(browserslist@4.28.4) + buffer-from@1.1.2: {} + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + byte-counter@0.1.0: {} cac@6.7.14: {} @@ -5463,6 +6325,8 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 + call-me-maybe@1.0.2: {} + callsites@3.1.0: {} caniuse-lite@1.0.30001800: {} @@ -5494,6 +6358,18 @@ snapshots: check-error@2.1.3: {} + 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 + chokidar@5.0.0: dependencies: readdirp: 5.0.0 @@ -5502,6 +6378,8 @@ snapshots: dependencies: clsx: 2.1.1 + classnames@2.5.1: {} + clean-stack@2.2.0: {} clean-stack@5.3.0: @@ -5569,6 +6447,8 @@ snapshots: colorette@1.4.0: {} + colorette@2.0.20: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -5580,6 +6460,13 @@ snapshots: concat-map@0.0.1: {} + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + config-chain@1.1.13: dependencies: ini: 1.3.8 @@ -5627,6 +6514,10 @@ snapshots: cookie-es@3.1.1: {} + cookie@0.7.2: {} + + core-js@3.50.0: {} + core-util-is@1.0.3: {} cosmiconfig-typescript-loader@6.3.0(@types/node@22.20.0)(cosmiconfig@9.0.2(typescript@5.9.3))(typescript@5.9.3): @@ -5707,6 +6598,8 @@ snapshots: decimal.js-light@2.5.1: {} + decko@1.2.0: {} + decompress-response@10.0.0: dependencies: mimic-response: 4.0.0 @@ -5717,22 +6610,39 @@ snapshots: deep-is@0.1.4: {} + default-browser-id@5.0.1: {} + + default-browser@5.5.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + + define-lazy-prop@3.0.0: {} + delayed-stream@1.0.0: {} detect-libc@2.1.2: {} detect-node-es@1.1.0: {} + diff-sequences@29.6.3: {} + diff@8.0.4: {} dir-glob@3.0.1: dependencies: path-type: 4.0.0 + dompurify@3.4.13: + optionalDependencies: + '@types/trusted-types': 2.0.7 + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 + dotenv@16.4.7: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -5788,6 +6698,8 @@ snapshots: es-toolkit@1.49.0: {} + es6-promise@3.3.1: {} + esbuild@0.28.1: optionalDependencies: '@esbuild/aix-ppc64': 0.28.1 @@ -5907,6 +6819,8 @@ snapshots: esutils@2.0.3: {} + event-target-shim@5.0.1: {} + eventemitter3@5.0.4: {} execa@8.0.1: @@ -5952,8 +6866,24 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-safe-stringify@2.1.1: {} + fast-uri@3.1.3: {} + fast-xml-builder@1.3.1: + dependencies: + path-expression-matcher: 1.6.2 + xml-naming: 0.3.0 + + fast-xml-parser@5.11.0: + dependencies: + '@nodable/entities': 3.0.0 + fast-xml-builder: 1.3.1 + is-unsafe: 2.0.0 + path-expression-matcher: 1.6.2 + strnum: 2.4.2 + xml-naming: 0.3.0 + fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -6007,6 +6937,8 @@ snapshots: flatted@3.4.2: {} + foreach@2.0.6: {} + form-data-encoder@4.1.0: {} form-data@4.0.6: @@ -6023,6 +6955,8 @@ snapshots: jsonfile: 6.2.1 universalify: 2.0.1 + fs.realpath@1.0.0: {} + fsevents@2.3.2: optional: true @@ -6054,6 +6988,8 @@ snapshots: get-nonce@1.0.1: {} + get-port-please@3.2.0: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -6091,6 +7027,15 @@ snapshots: dependencies: is-glob: 4.0.3 + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + global-directory@4.0.1: dependencies: ini: 4.1.1 @@ -6185,6 +7130,8 @@ snapshots: - kerberos - supports-color + http2-client@1.3.5: {} + http2-wrapper@2.2.1: dependencies: quick-lru: 5.1.1 @@ -6240,6 +7187,11 @@ snapshots: index-to-position@1.2.0: {} + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + inherits@2.0.4: {} ini@1.3.8: {} @@ -6255,6 +7207,12 @@ snapshots: is-arrayish@0.2.1: {} + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-docker@3.0.0: {} + is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -6263,6 +7221,10 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + is-number@7.0.0: {} is-obj@2.0.0: {} @@ -6281,6 +7243,12 @@ snapshots: is-unicode-supported@2.1.0: {} + is-unsafe@2.0.0: {} + + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + isarray@1.0.0: {} isbot@5.1.44: {} @@ -6297,6 +7265,22 @@ snapshots: java-properties@1.0.2: {} + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + jiti@2.6.1: {} jiti@2.7.0: {} @@ -6307,10 +7291,16 @@ snapshots: js-tokens@9.0.1: {} + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + js-yaml@4.3.0: dependencies: argparse: 2.0.1 + jsep@1.4.0: {} + jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -6319,6 +7309,10 @@ snapshots: json-parse-even-better-errors@2.3.1: {} + json-pointer@0.6.2: + dependencies: + foreach: 2.0.6 + json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -6337,6 +7331,14 @@ snapshots: jsonparse@1.3.1: {} + jsonpath-plus@10.4.0: + dependencies: + '@jsep-plugin/assignment': 1.3.0(jsep@1.4.0) + '@jsep-plugin/regex': 1.0.4(jsep@1.4.0) + jsep: 1.4.0 + + jsonpointer@5.0.1: {} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -6345,6 +7347,8 @@ snapshots: dependencies: '@keyv/serialize': 1.1.1 + leven@3.1.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -6451,6 +7455,12 @@ snapshots: lodash@4.18.1: {} + long@5.3.2: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + loupe@3.2.1: {} lowercase-keys@3.0.0: {} @@ -6467,6 +7477,8 @@ snapshots: dependencies: react: 19.2.7 + lunr@2.3.9: {} + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -6477,6 +7489,8 @@ snapshots: type-fest: 4.41.0 web-worker: 1.5.0 + mark.js@8.11.1: {} + marked-terminal@7.3.0(marked@15.0.12): dependencies: ansi-escapes: 7.3.0 @@ -6490,6 +7504,8 @@ snapshots: marked@15.0.12: {} + marked@4.3.0: {} + math-intrinsics@1.1.0: {} meow@12.1.1: {} @@ -6531,6 +7547,24 @@ snapshots: minimist@1.2.8: {} + mobx-react-lite@4.1.1(mobx@6.16.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + mobx: 6.16.1 + react: 19.2.7 + use-sync-external-store: 1.6.0(react@19.2.7) + optionalDependencies: + react-dom: 19.2.7(react@19.2.7) + + mobx-react@9.2.2(mobx@6.16.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + mobx: 6.16.1 + mobx-react-lite: 4.1.1(mobx@6.16.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + optionalDependencies: + react-dom: 19.2.7(react@19.2.7) + + mobx@6.16.1: {} + ms@2.1.3: {} mz@2.7.0: @@ -6559,6 +7593,18 @@ snapshots: emojilib: 2.4.0 skin-tone: 2.0.0 + node-fetch-h2@2.3.0: + dependencies: + http2-client: 1.3.5 + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-readfiles@0.2.0: + dependencies: + es6-promise: 3.3.1 + node-releases@2.0.50: {} normalize-package-data@6.0.2: @@ -6573,6 +7619,8 @@ snapshots: semver: 7.8.5 validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} + normalize-url@8.1.1: {} normalize-url@9.0.1: {} @@ -6588,12 +7636,60 @@ snapshots: npm@11.18.0: {} + oas-kit-common@1.0.8: + dependencies: + fast-safe-stringify: 2.1.1 + + oas-linter@3.2.2: + dependencies: + '@exodus/schemasafe': 1.3.0 + should: 13.2.3 + yaml: 1.10.3 + + oas-resolver@2.5.6: + dependencies: + node-fetch-h2: 2.3.0 + oas-kit-common: 1.0.8 + reftools: 1.1.9 + yaml: 1.10.3 + yargs: 17.7.3 + + oas-schema-walker@1.1.5: {} + + oas-validator@5.0.8: + dependencies: + call-me-maybe: 1.0.2 + oas-kit-common: 1.0.8 + oas-linter: 3.2.2 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + reftools: 1.1.9 + should: 13.2.3 + yaml: 1.10.3 + object-assign@4.1.1: {} + once@1.4.0: + dependencies: + wrappy: 1.0.2 + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 + open@10.2.0: + dependencies: + default-browser: 5.5.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + + openapi-sampler@1.7.4: + dependencies: + '@types/json-schema': 7.0.15 + fast-xml-parser: 5.11.0 + json-pointer: 0.6.2 + openapi-typescript@7.13.0(typescript@5.9.3): dependencies: '@redocly/openapi-core': 1.34.18(supports-color@10.2.2) @@ -6613,6 +7709,8 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + outdent@0.8.0: {} + p-cancelable@4.0.1: {} p-each-series@3.0.0: {} @@ -6689,12 +7787,18 @@ snapshots: parse5@6.0.1: {} + path-browserify@1.0.1: {} + path-exists@3.0.0: {} path-exists@4.0.0: {} path-exists@5.0.0: {} + path-expression-matcher@1.6.2: {} + + path-is-absolute@1.0.1: {} + path-key@3.1.1: {} path-key@4.0.0: {} @@ -6705,6 +7809,8 @@ snapshots: pathval@2.0.1: {} + perfect-scrollbar@1.5.6: {} + picocolors@1.1.1: {} picomatch@2.3.2: {} @@ -6728,6 +7834,10 @@ snapshots: pluralize@8.0.0: {} + polished@4.3.1: + dependencies: + '@babel/runtime': 7.29.7 + postcss@8.5.16: dependencies: nanoid: 3.3.15 @@ -6738,14 +7848,42 @@ snapshots: prettier@3.9.4: {} + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + pretty-ms@9.3.0: dependencies: parse-ms: 4.0.0 + prismjs@1.30.0: {} + process-nextick-args@2.0.1: {} + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + proto-list@1.2.4: {} + protobufjs@7.6.5: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.5 + '@protobufjs/eventemitter': 1.1.1 + '@protobufjs/fetch': 1.1.1 + '@protobufjs/float': 1.0.2 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.2 + '@types/node': 22.20.0 + long: 5.3.2 + proxy-agent-negotiate@1.1.0: {} punycode@2.3.1: {} @@ -6754,6 +7892,10 @@ snapshots: quick-lru@5.1.1: {} + randombytes@2.1.0: + dependencies: + safe-buffer: 5.1.2 + rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -6778,6 +7920,10 @@ snapshots: dependencies: react: 19.2.7 + react-is@16.13.1: {} + + react-is@18.3.1: {} + react-is@19.2.7: {} react-redux@9.3.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1): @@ -6818,6 +7964,12 @@ snapshots: optionalDependencies: '@types/react': 19.2.17 + react-tabs@6.1.1(react@19.2.7): + dependencies: + clsx: 2.1.1 + prop-types: 15.8.1 + react: 19.2.7 + react@19.2.7: {} read-package-up@11.0.0: @@ -6858,6 +8010,16 @@ snapshots: string_decoder: 1.1.1 util-deprecate: 1.0.2 + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.2 + readdirp@5.0.0: {} recharts@3.8.0(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@19.2.7)(react@19.2.7)(redux@5.0.1): @@ -6880,12 +8042,47 @@ snapshots: - '@types/react' - redux + redoc@2.5.0(core-js@3.50.0)(mobx@6.16.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(styled-components@6.5.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7)): + dependencies: + '@redocly/openapi-core': 1.34.18(supports-color@10.2.2) + classnames: 2.5.1 + core-js: 3.50.0 + decko: 1.2.0 + dompurify: 3.4.13 + eventemitter3: 5.0.4 + json-pointer: 0.6.2 + lunr: 2.3.9 + mark.js: 8.11.1 + marked: 4.3.0 + mobx: 6.16.1 + mobx-react: 9.2.2(mobx@6.16.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + openapi-sampler: 1.7.4 + path-browserify: 1.0.1 + perfect-scrollbar: 1.5.6 + polished: 4.3.1 + prismjs: 1.30.0 + prop-types: 15.8.1 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-tabs: 6.1.1(react@19.2.7) + slugify: 1.4.7 + stickyfill: 1.1.1 + styled-components: 6.5.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + swagger2openapi: 7.0.8 + url-template: 2.0.8 + transitivePeerDependencies: + - encoding + - react-native + - supports-color + redux-thunk@3.1.0(redux@5.0.1): dependencies: redux: 5.0.1 redux@5.0.1: {} + reftools@1.1.9: {} + registry-auth-token@5.1.1: dependencies: '@pnpm/npm-conf': 3.0.3 @@ -6941,6 +8138,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.62.2 fsevents: 2.3.3 + run-applescript@7.1.0: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -6996,12 +8195,40 @@ snapshots: seroval@1.5.4: {} + set-cookie-parser@2.7.2: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + should-equal@2.0.0: + dependencies: + should-type: 1.4.0 + + should-format@3.0.3: + dependencies: + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + + should-type-adaptors@1.1.0: + dependencies: + should-type: 1.4.0 + should-util: 1.0.1 + + should-type@1.4.0: {} + + should-util@1.0.1: {} + + should@13.2.3: + dependencies: + should-equal: 2.0.0 + should-format: 3.0.3 + should-type: 1.4.0 + should-type-adaptors: 1.1.0 + should-util: 1.0.1 + siginfo@2.0.0: {} signal-exit@4.1.0: {} @@ -7012,12 +8239,26 @@ snapshots: figures: 2.0.0 pkg-conf: 2.1.0 + simple-websocket@9.1.0: + dependencies: + debug: 4.4.3(supports-color@10.2.2) + queue-microtask: 1.2.3 + randombytes: 2.1.0 + readable-stream: 3.6.2 + ws: 7.5.13 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + skin-tone@2.0.0: dependencies: unicode-emoji-modifier-base: 1.0.0 slash@5.1.0: {} + slugify@1.4.7: {} + sonner@1.7.4(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: react: 19.2.7 @@ -7053,6 +8294,8 @@ snapshots: std-env@3.10.0: {} + stickyfill@1.1.1: {} + stream-combiner2@1.1.1: dependencies: duplexer2: 0.1.4 @@ -7096,6 +8339,21 @@ snapshots: dependencies: js-tokens: 9.0.1 + strnum@2.4.2: + dependencies: + anynum: 1.0.1 + + styled-components@6.5.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + '@emotion/is-prop-valid': 1.4.0 + csstype: 3.2.3 + react: 19.2.7 + stylis: 4.3.6 + optionalDependencies: + react-dom: 19.2.7(react@19.2.7) + + stylis@4.3.6: {} + super-regex@1.1.0: dependencies: function-timeout: 1.0.2 @@ -7117,6 +8375,22 @@ snapshots: has-flag: 4.0.0 supports-color: 7.2.0 + swagger2openapi@7.0.8: + dependencies: + call-me-maybe: 1.0.2 + node-fetch: 2.7.0 + node-fetch-h2: 2.3.0 + node-readfiles: 0.2.0 + oas-kit-common: 1.0.8 + oas-resolver: 2.5.6 + oas-schema-walker: 1.1.5 + oas-validator: 5.0.8 + reftools: 1.1.9 + yaml: 1.10.3 + yargs: 17.7.3 + transitivePeerDependencies: + - encoding + tagged-tag@1.0.0: {} tailwind-merge@3.6.0: {} @@ -7178,6 +8452,8 @@ snapshots: dependencies: is-number: 7.0.0 + tr46@0.0.3: {} + traverse@0.6.8: {} ts-api-utils@2.5.0(typescript@5.9.3): @@ -7204,6 +8480,8 @@ snapshots: dependencies: tagged-tag: 1.0.0 + typedarray@0.0.6: {} + typescript-eslint@8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3): dependencies: '@typescript-eslint/eslint-plugin': 8.62.1(@typescript-eslint/parser@8.62.1(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) @@ -7266,6 +8544,8 @@ snapshots: url-join@5.0.0: {} + url-template@2.0.8: {} + use-callback-ref@1.3.3(@types/react@19.2.17)(react@19.2.7): dependencies: react: 19.2.7 @@ -7388,10 +8668,17 @@ snapshots: web-worker@1.5.0: {} + webidl-conversions@3.0.1: {} + webpack-virtual-modules@0.6.2: {} whatwg-mimetype@3.0.0: {} + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + which@2.0.2: dependencies: isexe: 2.0.0 @@ -7417,6 +8704,16 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.2.0 + wrappy@1.0.2: {} + + ws@7.5.13: {} + + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.1 + + xml-naming@0.3.0: {} + xtend@4.0.2: {} y18n@5.0.8: {} @@ -7425,6 +8722,8 @@ snapshots: yaml-ast-parser@0.0.43: {} + yaml@1.10.3: {} + yargs-parser@20.2.9: {} yargs-parser@21.1.1: {} @@ -7441,6 +8740,16 @@ snapshots: y18n: 5.0.8 yargs-parser: 20.2.9 + yargs@17.0.1: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + yargs@17.7.3: dependencies: cliui: 8.0.1