From 98576c06ad5712d67a99dcfc1f85f6f71668282a Mon Sep 17 00:00:00 2001 From: nayan458 Date: Fri, 8 May 2026 02:40:25 +0530 Subject: [PATCH] feat: added CI pipeline configurations --- .github/BranchingStrategy.md | 386 +++++++++++++++++++++++++++ .github/workflows/a11y.yml | 35 +++ .github/workflows/ci.yml | 59 ---- .github/workflows/develop-deploy.yml | 46 ++++ .github/workflows/pr-validation.yml | 38 +++ .github/workflows/release.yml | 47 ++++ BranchingStrategy.md | 57 ---- eslint.config.js | 27 +- package.json | 4 +- pnpm-lock.yaml | 189 ++++++++++++- 10 files changed, 753 insertions(+), 135 deletions(-) create mode 100644 .github/BranchingStrategy.md create mode 100644 .github/workflows/a11y.yml delete mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/develop-deploy.yml create mode 100644 .github/workflows/pr-validation.yml create mode 100644 .github/workflows/release.yml delete mode 100644 BranchingStrategy.md diff --git a/.github/BranchingStrategy.md b/.github/BranchingStrategy.md new file mode 100644 index 0000000..cf2c53f --- /dev/null +++ b/.github/BranchingStrategy.md @@ -0,0 +1,386 @@ +# Git Branching Strategy + +## Purpose + +This document defines the Git branching strategy, naming conventions, and development workflow used across the project. + +The goals of this strategy are: + +- Maintain stable production releases +- Keep development workflow simple +- Enable controlled releases +- Improve collaboration and traceability +- Support CI/CD pipelines and automated deployments + +--- + +# Branch Overview + +| Branch | Purpose | +|---|---| +| `main` | Production-ready stable code | +| `dev` | Active development and integration branch | + +--- + +# Permanent Branches + +## `main` + +The `main` branch always represents: + +- Stable production-ready code +- Deployable releases +- Tagged versions/releases + +### Rules + +- No direct commits +- Only merge from: + - `dev` + - `hotfix/*` +- Protected branch recommended +- Every production release should be tagged + +--- + +## `dev` + +The `dev` branch is the primary integration branch. + +All feature development, tasks, UI work, testing, and configurations are merged into `dev` before being promoted to production. + +### Rules + +- Developers branch from `dev` +- Pull requests target `dev` +- CI validation must pass before merge + +--- + +# Temporary Working Branches + +All work should be done using short-lived branches created from `dev`. + +--- + +# Branch Naming Convention + +Format: + +```text +/- +```` + +Example: + +```text +feature/52-user-report-system +``` + +--- + +# Branch Types + +| Type | Purpose | +| ----------- | -------------------------------------- | +| `feature/*` | New features | +| `hotfix/*` | Production bug fixes | +| `task/*` | Refactoring/internal engineering tasks | +| `config/*` | Infrastructure/configuration changes | +| `ui/*` | Frontend/UI/page-related work | +| `test/*` | Testing-related tasks | + +--- + +# Examples + +## Feature + +```text +feature/52-user-report-system +``` + +## Hotfix + +```text +hotfix/81-post-deletion-bug +``` + +## UI Work + +```text +ui/34-profile-page-redesign +``` + +## Refactor Task + +```text +task/91-auth-service-refactor +``` + +## Config Change + +```text +config/15-nginx-production-config +``` + +## Testing Task + +```text +test/45-auth-integration-tests +``` + +--- + +# Development Workflow + +## 1. Create Branch + +Always branch from `dev`. + +```bash +git checkout dev +git pull origin dev + +git checkout -b feature/52-user-report-system +``` + +--- + +## 2. Development + +Commit changes using meaningful commit messages. + +### Recommended Commit Prefixes + +| Prefix | Purpose | +| ----------- | ------------------- | +| `feat:` | New feature | +| `fix:` | Bug fix | +| `refactor:` | Refactoring | +| `test:` | Testing | +| `docs:` | Documentation | +| `chore:` | Miscellaneous tasks | + +--- + +# Commit Examples + +```text +feat: add user reporting API +fix: resolve moderation deletion issue +refactor: optimize auth middleware +``` + +--- + +## 3. Push Branch + +```bash +git push origin feature/52-user-report-system +``` + +--- + +## 4. Open Pull Request + +### Target Branch + +```text +dev +``` + +### CI Requirements + +The following validations must pass before merge: + +* Linting +* Type checking +* Tests +* Build validation +* Accessibility checks (frontend) + +--- + +## 5. Merge Into `dev` + +After approval and successful CI: + +```text +feature/* -> dev +``` + +--- + +# Release Workflow + +When `dev` becomes stable and ready for production: + +```text +dev -> main +``` + +--- + +# Production Release Process + +## Merge Into Main + +```bash +git checkout main +git merge dev +``` + +--- + +## Create Release Tag + +```bash +git tag v1.0.0 +git push origin v1.0.0 +``` + +--- + +# Release Versioning + +The project follows semantic versioning. + +Format: + +```text +vMAJOR.MINOR.PATCH +``` + +Example: + +```text +v1.2.0 +``` + +--- + +# Version Meaning + +| Version Part | Meaning | +| ------------ | ------------------ | +| MAJOR | Breaking changes | +| MINOR | New features | +| PATCH | Bug fixes/hotfixes | + +--- + +# Hotfix Workflow + +Hotfixes are created from `main`. + +--- + +## 1. Create Hotfix Branch + +```bash +git checkout main +git pull origin main + +git checkout -b hotfix/81-post-deletion-bug +``` + +--- + +## 2. Fix Issue + +Commit and push normally. + +--- + +## 3. Merge Into Main + +```text +hotfix/* → main +``` + +--- + +## 4. Merge Back Into Dev + +IMPORTANT: + +Every hotfix merged into `main` must also be merged back into `dev`. + +This prevents: + +* branch divergence +* bug reintroduction +* inconsistent releases + +--- + +# CI/CD Strategy + +## Pull Request CI + +Runs on: + +* PRs to `dev` +* PRs to `main` + +Validates: + +* linting +* tests +* type checking +* build +* accessibility + +--- + +## Development Deployment + +Runs on: + +```text +push -> dev +``` + +Deploys: + +* development environment +* latest integration build + +--- + +## Release Pipeline + +Runs on: + +```text +git tag v* +``` + +Builds: + +* production Docker images +* immutable release artifacts + +--- + +# Docker Tagging Strategy + +## Mutable Tags + +| Tag | Purpose | +| ------------ | -------------------------------- | +| `dev-latest` | Latest development build | +| `latest` | Latest stable production release | + +--- + +## Immutable Tags + +| Tag | Purpose | +| -------- | ------------------------- | +| `v1.0.0` | Official release version | +| `sha-*` | Exact commit traceability | + +--- \ No newline at end of file diff --git a/.github/workflows/a11y.yml b/.github/workflows/a11y.yml new file mode 100644 index 0000000..4e796ea --- /dev/null +++ b/.github/workflows/a11y.yml @@ -0,0 +1,35 @@ +name: Accessibility Checks + +on: + pull_request: + branches: + - develop + - main + +jobs: + accessibility: + runs-on: ubuntu-latest + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: latest + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + + - name: Install Dependencies + run: pnpm install --frozen-lockfile + + - name: Run JSX Accessibility Lint + # run: pnpm eslint . --ext .js,.jsx,.ts,.tsx + + - name: Build App + run: pnpm vite build \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index d5d04ad..0000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: CI — Build & Push to Docker Hub - -on: - push: - branches: - - prod - - pre-prod - - stageing - - uat - -jobs: - build-and-push: - name: Build & Push - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup pnpm - uses: pnpm/action-setup@v4 - with: - version: latest - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: pnpm - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - # - name: Build - # run: pnpm build:production - - - name: Build - run: pnpm vite build - - - name: Log in to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - # - name: Build and push Docker image - # uses: docker/build-push-action@v6 - # with: - # context: . - # push: true - # tags: ${{ secrets.DOCKER_USERNAME }}/stoneinscription:admin-latest - - name: Build and push Docker image - uses: docker/build-push-action@v6 - with: - context: . - push: true - tags: | - ${{ secrets.DOCKER_USERNAME }}/stoneinscription:admin-${{ github.ref_name }} - ${{ github.ref_name == 'prod' && format('{0}/stoneinscription:admin-latest', secrets.DOCKER_USERNAME) || '' }} \ No newline at end of file diff --git a/.github/workflows/develop-deploy.yml b/.github/workflows/develop-deploy.yml new file mode 100644 index 0000000..6a8e1e3 --- /dev/null +++ b/.github/workflows/develop-deploy.yml @@ -0,0 +1,46 @@ +name: Frontend Develop Deployment + +on: + push: + branches: + - develop + +jobs: + build-and-push-dev: + runs-on: ubuntu-latest + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: latest + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + + - name: Install Dependencies + run: pnpm install --frozen-lockfile + + - name: Build App + run: pnpm vite build + + - name: Login To Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Build And Push Docker Image + uses: docker/build-push-action@v6 + with: + context: . + push: true + tags: | + ${{ secrets.DOCKER_USERNAME }}/stoneinscription-frontend:dev-latest + ${{ secrets.DOCKER_USERNAME }}/stoneinscription-frontend:sha-${{ github.sha }} \ No newline at end of file diff --git a/.github/workflows/pr-validation.yml b/.github/workflows/pr-validation.yml new file mode 100644 index 0000000..0df90be --- /dev/null +++ b/.github/workflows/pr-validation.yml @@ -0,0 +1,38 @@ +name: Frontend PR Validation + +on: + pull_request: + branches: + - develop + - main + +jobs: + validate: + runs-on: ubuntu-latest + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: latest + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + + - name: Install Dependencies + run: pnpm install --frozen-lockfile + + - name: Lint + run: pnpm lint + + - name: Type Check + run: pnpm tsc --noEmit + + - name: Build + run: pnpm vite build \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..17445fa --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,47 @@ +name: Frontend Release Pipeline + +on: + push: + tags: + - 'v*' + +jobs: + release: + runs-on: ubuntu-latest + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: latest + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + + - name: Install Dependencies + run: pnpm install --frozen-lockfile + + - name: Build Production App + run: pnpm vite build + + - name: Login To Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Build And Push Release Images + uses: docker/build-push-action@v6 + with: + context: . + push: true + tags: | + ${{ secrets.DOCKER_USERNAME }}/stoneinscription-frontend:latest + ${{ secrets.DOCKER_USERNAME }}/stoneinscription-frontend:${{ github.ref_name }} + ${{ secrets.DOCKER_USERNAME }}/stoneinscription-frontend:sha-${{ github.sha }} \ No newline at end of file diff --git a/BranchingStrategy.md b/BranchingStrategy.md deleted file mode 100644 index 8bbbb87..0000000 --- a/BranchingStrategy.md +++ /dev/null @@ -1,57 +0,0 @@ -# Branching Strategy - -## Core Branches - -We maintain the following core branches: - -* `main` -* `prod` -* `pre-prod` -* `staging` -* `uat` - ---- - -## Development Workflow - -### 1. Create an Issue - -* Before starting any feature or fix, create an issue in the repository. -* Link all development work to this issue. - -### 2. Create a Feature Branch - -* Pull the latest code from `pre-prod`. -* Create a new feature branch associated with the issue. - -### 3. Development & Testing - -* Implement the required changes in your feature branch. -* Test your code in the `staging` environment to ensure correctness. - -### 4. Commit Changes - -* Add and commit your changes with meaningful commit messages. - -### 5. Sync with UAT - -* Pull the latest changes from `uat`. -* Resolve any merge conflicts locally. - -### 6. Push to UAT - -* Push your updated feature branch changes to the `uat` branch. - -### 7. Deployment Process - -* Request the admin for deployment. -* The admin will review and promote changes from `uat` to `prod`. - ---- - -## Notes - -* Always ensure your branch is up to date before pushing. -* Resolve conflicts carefully to avoid breaking existing functionality. -* Follow consistent naming conventions for branches (e.g., `feature/issue-id-description`). -* Ensure proper testing before requesting deployment. \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js index 5e6b472..d9c3b48 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,23 +1,34 @@ -import js from '@eslint/js' -import globals from 'globals' -import reactHooks from 'eslint-plugin-react-hooks' -import reactRefresh from 'eslint-plugin-react-refresh' -import tseslint from 'typescript-eslint' -import { defineConfig, globalIgnores } from 'eslint/config' +import js from '@eslint/js'; +import globals from 'globals'; +import reactHooks from 'eslint-plugin-react-hooks'; +import reactRefresh from 'eslint-plugin-react-refresh'; +import jsxA11y from 'eslint-plugin-jsx-a11y'; +import tseslint from 'typescript-eslint'; +import { defineConfig, globalIgnores } from 'eslint/config'; export default defineConfig([ globalIgnores(['dist']), + { files: ['**/*.{ts,tsx}'], + extends: [ js.configs.recommended, tseslint.configs.recommended, - reactHooks.configs.flat.recommended, + reactHooks.configs['recommended-latest'], reactRefresh.configs.vite, + jsxA11y.flatConfigs.recommended, ], + languageOptions: { ecmaVersion: 2020, globals: globals.browser, }, + + rules: { + 'jsx-a11y/alt-text': 'error', + 'jsx-a11y/anchor-is-valid': 'warn', + 'jsx-a11y/no-autofocus': 'warn', + }, }, -]) +]); \ No newline at end of file diff --git a/package.json b/package.json index e775721..5bba1fc 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "@types/js-cookie": "^3.0.6", "@vitejs/plugin-react-swc": "^4.3.0", "axios": "^1.13.2", + "generate:api": "openapi-typescript http://localhost:8080/v3/api-docs -o src/api/generated/types.ts", "js-cookie": "^3.0.5", "jwt-decode": "^4.0.0", "lucide-react": "^0.542.0", @@ -28,8 +29,8 @@ "react-dom": "^19.2.5", "react-icons": "^5.5.0", "react-router-dom": "^7.7.1", - "tailwindcss": "^4.2.4", "styled-components": "^6.2.0", + "tailwindcss": "^4.2.4", "vite-plugin-remove-console": "^2.2.0" }, "devDependencies": { @@ -43,6 +44,7 @@ "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-refresh": "^0.5.2", "globals": "^17.5.0", + "openapi-typescript": "^7.13.0", "typescript": "~6.0.2", "typescript-eslint": "^8.58.2", "vite": "^8.0.9" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5338284..668f291 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -99,6 +99,9 @@ importers: globals: specifier: ^17.5.0 version: 17.5.0 + openapi-typescript: + specifier: ^7.13.0 + version: 7.13.0(typescript@6.0.3) typescript: specifier: ~6.0.2 version: 6.0.3 @@ -407,6 +410,16 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' + '@redocly/ajv@8.11.2': + resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==} + + '@redocly/config@0.22.0': + resolution: {integrity: sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==} + + '@redocly/openapi-core@1.34.14': + resolution: {integrity: sha512-y+xFx+Zz54Xhr8jUdnLENYnt7Y7GEDL6Q03ga7rTtX8DVwefX9H+hQEPgJp1nda7vdH+wJ9/HBVvyfBuW9x6rA==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + '@rolldown/binding-android-arm64@1.0.0-rc.16': resolution: {integrity: sha512-rhY3k7Bsae9qQfOtph2Pm2jZEA+s8Gmjoz4hhmx70K9iMQ/ddeae+xhRQcM5IuVx5ry1+bGfkvMn7D6MJggVSA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -822,9 +835,17 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + ajv@6.14.0: resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -853,6 +874,9 @@ packages: brace-expansion@1.1.14: resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} + brace-expansion@2.1.0: + resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} + brace-expansion@5.0.5: resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} engines: {node: 18 || 20 || >=22} @@ -877,6 +901,9 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -888,6 +915,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -1134,6 +1164,10 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -1150,6 +1184,10 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + index-to-position@1.2.0: + resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} + engines: {node: '>=18'} + inherits@2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} @@ -1172,6 +1210,10 @@ packages: resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} engines: {node: '>=14'} + js-levenshtein@1.1.6: + resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} + engines: {node: '>=0.10.0'} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -1190,6 +1232,9 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -1324,6 +1369,10 @@ packages: minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1342,6 +1391,12 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + openapi-typescript@7.13.0: + resolution: {integrity: sha512-EFP392gcqXS7ntPvbhBzbF8TyBA+baIYEm791Hy5YkjDYKTnk/Tn5OQeKm5BIZvJihpp8Zzr4hzx0Irde1LNGQ==} + hasBin: true + peerDependencies: + typescript: ^5.x + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -1358,6 +1413,10 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} + engines: {node: '>=18'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -1379,6 +1438,10 @@ packages: piexifjs@1.0.6: resolution: {integrity: sha512-0wVyH0cKohzBQ5Gi2V1BuxYpxWfxF3cSqfFXfPIpl5tl9XLS5z4ogqhUCD20AbHi0h9aJkqXNJnkVev6gwh2ag==} + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + postcss@8.5.10: resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} engines: {node: ^10 || ^12 || >=14} @@ -1445,6 +1508,10 @@ packages: resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==} engines: {node: '>=0.10.0'} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -1507,6 +1574,10 @@ packages: stylis@4.3.6: resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -1535,6 +1606,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + typescript-eslint@8.58.2: resolution: {integrity: sha512-V8iSng9mRbdZjl54VJ9NKr6ZB+dW0J3TzRXRGcSbLIej9jV86ZRtlYeTKDR/QLxXykocJ5icNzbsl2+5TzIvcQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1556,6 +1631,9 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + uri-js-replace@1.0.1: + resolution: {integrity: sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==} + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -1620,6 +1698,13 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml-ast-parser@0.0.43: + resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -1656,7 +1741,7 @@ snapshots: '@babel/types': 7.29.0 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -1728,7 +1813,7 @@ snapshots: '@babel/parser': 7.29.2 '@babel/template': 7.28.6 '@babel/types': 7.29.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) transitivePeerDependencies: - supports-color @@ -1795,7 +1880,7 @@ snapshots: '@eslint/config-array@0.21.2': dependencies: '@eslint/object-schema': 2.1.7 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) minimatch: 3.1.5 transitivePeerDependencies: - supports-color @@ -1811,7 +1896,7 @@ snapshots: '@eslint/eslintrc@3.3.5': dependencies: ajv: 6.14.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -1973,6 +2058,29 @@ snapshots: react: 19.2.5 react-dom: 19.2.5(react@19.2.5) + '@redocly/ajv@8.11.2': + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js-replace: 1.0.1 + + '@redocly/config@0.22.0': {} + + '@redocly/openapi-core@1.34.14(supports-color@10.2.2)': + 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.1.1 + minimatch: 5.1.9 + pluralize: 8.0.0 + yaml-ast-parser: 0.0.43 + transitivePeerDependencies: + - supports-color + '@rolldown/binding-android-arm64@1.0.0-rc.16': optional: true @@ -2214,7 +2322,7 @@ snapshots: '@typescript-eslint/types': 8.58.2 '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.58.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) eslint: 9.39.4(jiti@2.6.1) typescript: 6.0.3 transitivePeerDependencies: @@ -2224,7 +2332,7 @@ snapshots: dependencies: '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.3) '@typescript-eslint/types': 8.58.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -2243,7 +2351,7 @@ snapshots: '@typescript-eslint/types': 8.58.2 '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3) '@typescript-eslint/utils': 8.58.2(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.3) - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) eslint: 9.39.4(jiti@2.6.1) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 @@ -2258,7 +2366,7 @@ snapshots: '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.3) '@typescript-eslint/types': 8.58.2 '@typescript-eslint/visitor-keys': 8.58.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) minimatch: 10.2.5 semver: 7.7.4 tinyglobby: 0.2.16 @@ -2302,6 +2410,8 @@ snapshots: acorn@8.16.0: {} + agent-base@7.1.4: {} + ajv@6.14.0: dependencies: fast-deep-equal: 3.1.3 @@ -2309,6 +2419,8 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ansi-colors@4.1.3: {} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -2336,6 +2448,10 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 + brace-expansion@2.1.0: + dependencies: + balanced-match: 1.0.2 + brace-expansion@5.0.5: dependencies: balanced-match: 4.0.4 @@ -2362,6 +2478,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + change-case@5.4.4: {} + clsx@2.1.1: {} color-convert@2.0.1: @@ -2370,6 +2488,8 @@ snapshots: color-name@1.1.4: {} + colorette@1.4.0: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -2388,9 +2508,11 @@ snapshots: csstype@3.2.3: {} - debug@4.4.3: + debug@4.4.3(supports-color@10.2.2): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 10.2.2 deep-is@0.1.4: {} @@ -2478,7 +2600,7 @@ snapshots: ajv: 6.14.0 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.3 + debug: 4.4.3(supports-color@10.2.2) escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -2615,6 +2737,13 @@ snapshots: dependencies: react-is: 16.13.1 + https-proxy-agent@7.0.6(supports-color@10.2.2): + dependencies: + agent-base: 7.1.4 + debug: 4.4.3(supports-color@10.2.2) + transitivePeerDependencies: + - supports-color + ignore@5.3.2: {} ignore@7.0.5: {} @@ -2626,6 +2755,8 @@ snapshots: imurmurhash@0.1.4: {} + index-to-position@1.2.0: {} + inherits@2.0.3: {} is-extglob@2.1.1: {} @@ -2640,6 +2771,8 @@ snapshots: js-cookie@3.0.5: {} + js-levenshtein@1.1.6: {} + js-tokens@4.0.0: {} js-yaml@4.1.1: @@ -2652,6 +2785,8 @@ snapshots: json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@2.2.3: {} @@ -2754,6 +2889,10 @@ snapshots: dependencies: brace-expansion: 1.1.14 + minimatch@5.1.9: + dependencies: + brace-expansion: 2.1.0 + ms@2.1.3: {} nanoid@3.3.11: {} @@ -2764,6 +2903,16 @@ snapshots: object-assign@4.1.1: {} + openapi-typescript@7.13.0(typescript@6.0.3): + dependencies: + '@redocly/openapi-core': 1.34.14(supports-color@10.2.2) + ansi-colors: 4.1.3 + change-case: 5.4.4 + parse-json: 8.3.0 + supports-color: 10.2.2 + typescript: 6.0.3 + yargs-parser: 21.1.1 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -2785,6 +2934,12 @@ snapshots: dependencies: callsites: 3.1.0 + parse-json@8.3.0: + dependencies: + '@babel/code-frame': 7.29.0 + index-to-position: 1.2.0 + type-fest: 4.41.0 + path-exists@4.0.0: {} path-key@3.1.1: {} @@ -2800,6 +2955,8 @@ snapshots: piexifjs@1.0.6: {} + pluralize@8.0.0: {} + postcss@8.5.10: dependencies: nanoid: 3.3.11 @@ -2858,6 +3015,8 @@ snapshots: react@19.2.5: {} + require-from-string@2.0.2: {} + resolve-from@4.0.0: {} rolldown@1.0.0-rc.16: @@ -2912,6 +3071,8 @@ snapshots: stylis@4.3.6: {} + supports-color@10.2.2: {} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -2936,6 +3097,8 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-fest@4.41.0: {} + typescript-eslint@8.58.2(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.3): dependencies: '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.3))(eslint@9.39.4(jiti@2.6.1))(typescript@6.0.3) @@ -2957,6 +3120,8 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + uri-js-replace@1.0.1: {} + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -2987,6 +3152,10 @@ snapshots: yallist@3.1.1: {} + yaml-ast-parser@0.0.43: {} + + yargs-parser@21.1.1: {} + yocto-queue@0.1.0: {} zod-validation-error@4.0.2(zod@4.3.6):