diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index eca3f03..b013b3d 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -12,14 +12,29 @@ - **Infrastructure**: AWS CDK - **Modules**: Separate repositories (`@ciscode/*` packages) -### Backend Module Architecture +### Architecture Strategy: Application vs Modules + +**๐Ÿข ComptAlEyes Application (backend/src/modules/):** +**โ†’ 4-Layer Clean Architecture** (for complex business logic) + +**๐Ÿ“ฆ External Modules (@ciscode/\*):** +**โ†’ Controller-Service-Repository** (for simplicity and reusability) + +> **Why different approaches?** +> - **Applications** have complex, evolving business logic requiring strict layer separation +> - **Modules** are reusable libraries that need to be simple, well-tested, and easy to integrate +> - Clean Architecture in apps, pragmatic CSR in modules = best of both worlds + +### Backend Module Architecture (Application) **ALWAYS follow 4-layer Clean Architecture for business modules:** ``` -modules/ +backend/src/modules/ โ””โ”€โ”€ {module-name}/ โ”œโ”€โ”€ api/ # Controllers, DTOs, HTTP layer โ”‚ โ”œโ”€โ”€ {name}.controller.ts + โ”‚ โ”œโ”€โ”€ guards/ # Module-specific guards + โ”‚ โ”œโ”€โ”€ decorators/ # Module-specific decorators โ”‚ โ””โ”€โ”€ dto/ โ”œโ”€โ”€ application/ # Use-cases, business orchestration โ”‚ โ”œโ”€โ”€ ports/ # Interfaces/contracts @@ -32,6 +47,9 @@ modules/ **Exception**: Utilities in `core/` (health, logging, config) can be simpler structures. +**See module-specific copilot-instructions.md for details.** + + ### Core vs Shared **`core/`** - NestJS-specific, framework-dependent: @@ -770,6 +788,66 @@ Before declaring a task complete, verify: --- +## ๐Ÿ”€ Git Workflow & Branching Strategy + +### Branch Structure + +**Main Branches:** +- `master` - **Production-ready code** (solo release) +- `develop` - **Development branch** (integrazione continua) + +**Supporting Branches:** +- `feature/*` - Nuove feature +- `bugfix/*` - Bug fix +- `refactor/*` - Refactoring +- `chore/*` - Manutenzione + +### Workflow Completo + +**1. Staccare branch da develop:** +```bash +git checkout develop +git pull origin develop +git checkout -b feature/TASK-123-description +``` + +**2. Sviluppo e commit:** +```bash +# Lavora sul feature branch +git add . +git commit -m "feat(module): description [TASK-123]" +git push origin feature/TASK-123-description +``` + +**3. Pull Request verso develop:** +```bash +# PR: feature/TASK-123-description โ†’ develop +# Dopo review e merge, il codice entra in develop +``` + +**4. Release (solo quando pronto):** +```bash +# Quando develop รจ stabile e pronto per release: +git checkout master +git merge develop +git tag v1.2.0 +git push origin master --tags +``` + +### โš ๏ธ IMPORTANTE + +**SEMPRE:** +- โœ… Stacca branch da `develop` +- โœ… PR verso `develop` +- โœ… Merge su `master` solo per release + +**MAI:** +- โŒ Branch da `master` (tranne hotfix critici) +- โŒ PR dirette a `master` +- โŒ Commit diretti su `master` o `develop` + +--- + ## ๐Ÿ”€ Git Commit Convention ### Conventional Commits Format diff --git a/.github/prompts/clone-module.md b/.github/prompts/clone-module.md new file mode 100644 index 0000000..bf20e09 --- /dev/null +++ b/.github/prompts/clone-module.md @@ -0,0 +1,161 @@ +# ๐Ÿ“ฆ Clone Module for Local Development + +**Purpose:** Clone a @ciscode/* module repository for local development alongside ComptAlEyes app. + +--- + +## Instructions for AI Assistant + +When a user requests to clone a module for local development, follow these steps: + +### 1. Verify Workspace Structure + +Check that we're in the ComptAlEyes workspace: +```bash +pwd # Should show: .../comptaleyes +``` + +### 2. Check Available Modules + +Show modules already available: +```bash +npm run module:list +``` + +### 3. Ask User for Module Details + +Prompt user for: +- **Module name** (e.g., `auth-kit`, `database-kit`, `auth-kit-ui`) +- **Repository URL** (if not standard @ciscode/* repo) + +### 4. Navigate to Modules Directory + +```bash +cd .. +# Create modules directory if it doesn't exist +mkdir -p modules +cd modules +``` + +### 5. Clone the Module + +```bash +# Clone with appropriate directory name +git clone + +# Example: +# git clone https://github.com/ciscode/authentication-kit.git auth-kit +``` + +### 6. Verify Module Structure + +Check that the cloned module has: +- โœ… `package.json` with correct package name (e.g., `@ciscode/authentication-kit`) +- โœ… `src/` directory +- โœ… `tsconfig.json` or build configuration +- โœ… Build script (`build` or `build:watch`) + +### 7. Install Module Dependencies + +```bash +cd +npm install +``` + +### 8. Return to Main App + +```bash +cd ../../comptaleyes +``` + +### 9. Verify Auto-Discovery + +```bash +npm run module:list +``` + +The newly cloned module should appear in the list. + +### 10. Provide Next Steps + +Tell user: +``` +โœ… Module '' cloned successfully! + +Next steps: +1. Run 'npm run module:setup' for interactive setup +2. Or manually link: 'npm run module:link ' +3. Start watch mode in module: 'cd ../modules/ && npm run build:watch' +``` + +--- + +## Expected Directory Structure After Clone + +``` +your-workspace/ +โ”œโ”€โ”€ comptaleyes/ (main app - current directory) +โ”‚ โ”œโ”€โ”€ scripts/ +โ”‚ โ”œโ”€โ”€ backend/ +โ”‚ โ””โ”€โ”€ frontend/ +โ””โ”€โ”€ modules/ (parent level - ../modules) + โ”œโ”€โ”€ auth-kit/ (newly cloned) + โ”œโ”€โ”€ database-kit/ + โ””โ”€โ”€ ... +``` + +--- + +## Error Handling + +**If modules/ doesn't exist:** +- Create it at parent level: `mkdir -p ../modules` + +**If module already exists:** +- Ask user if they want to: + - Pull latest changes (`git pull`) + - Delete and re-clone + - Skip + +**If package.json missing or invalid:** +- Warn user that auto-discovery won't work +- Suggest checking repository URL + +**If git clone fails:** +- Check repository URL +- Check git credentials +- Check network connection + +--- + +## Validation Checklist + +After cloning, verify: +- [ ] Module exists in `../modules/` +- [ ] `package.json` exists with valid `@ciscode/*` package name +- [ ] Dependencies installed (`node_modules/` exists) +- [ ] Module appears in `npm run module:list` +- [ ] Can be linked via `npm run module:link ` + +--- + +## Example Usage + +**User says:** "Clone the database-kit module for local development" + +**AI should:** +1. Navigate to `../modules` +2. Clone: `git clone database-kit` +3. Install deps: `cd database-kit && npm install` +4. Return to app: `cd ../../comptaleyes` +5. Verify: `npm run module:list` shows database-kit +6. Provide next steps message + +--- + +## Notes + +- โœ… Scripts are portable (use relative paths) +- โš ๏ธ Module MUST be at `../modules/` relative to main app +- โœ… Module name in directory should match what users use in commands +- โœ… Package name in `package.json` is what matters for linking diff --git a/.github/prompts/setup-dev-modules.md b/.github/prompts/setup-dev-modules.md new file mode 100644 index 0000000..33f685d --- /dev/null +++ b/.github/prompts/setup-dev-modules.md @@ -0,0 +1,283 @@ +# ๐Ÿš€ Interactive Module Development Setup + +**Purpose:** Guide user through interactive setup of local module development environment. + +--- + +## Instructions for AI Assistant + +When a user wants to set up module development interactively, follow this conversational flow: + +--- + +## Step 1: Introduction & Context + +**Say to user:** +``` +I'll help you set up local module development for @ciscode/* packages. + +This will: +โœ… Show available modules in your workspace +โœ… Let you select which modules to develop locally +โœ… Automatically link selected modules +โœ… Set up watch mode for automatic rebuilds +โœ… Unlink modules you're no longer working on +``` + +--- + +## Step 2: Check Available Modules + +**Run:** +```bash +npm run module:list +``` + +**Interpret output:** +- If NO modules found โ†’ Guide user to clone modules first (use `clone-module.md` prompt) +- If modules found โ†’ Continue to Step 3 + +--- + +## Step 3: Show Current Status + +**Run:** +```bash +npm run module:status +``` + +**Show user:** +- Which modules are currently linked (๐Ÿ”— Linked) +- Which modules are from npm (๐Ÿ“ฆ Installed) + +--- + +## Step 4: Ask User Intent + +**Ask:** +``` +What would you like to do? + +1. ๐Ÿ”— Set up local development (link modules + watch mode) +2. ๐Ÿ“Š Just check status of modules +3. ๐Ÿ”“ Unlink all modules and restore npm versions +4. โŒ Cancel +``` + +**Based on answer:** +- **Option 1** โ†’ Continue to Step 5 +- **Option 2** โ†’ Show status and exit +- **Option 3** โ†’ Go to Step 8 (Cleanup) +- **Option 4** โ†’ Exit + +--- + +## Step 5: Interactive Module Selection + +**Run the setup script:** +```bash +npm run module:setup +``` + +**The script will:** +1. Show list of available modules +2. Ask user to select which modules to work on (multi-select with space bar) +3. Ask if user wants watch mode enabled +4. Automatically unlink previously linked modules +5. Link selected modules +6. Start watch modes if requested + +**Let the script handle the interaction** - don't interrupt the process. + +--- + +## Step 6: Verify Setup + +**After script completes, verify:** +```bash +npm run module:status +``` + +**Check:** +- โœ… Selected modules show "๐Ÿ”— Linked (local)" +- โœ… Other modules show "๐Ÿ“ฆ Installed (npm)" + +--- + +## Step 7: Start Application + +**Ask user:** +``` +Setup complete! Would you like to start the application? + +1. Start backend only +2. Start frontend only +3. Start both (full stack) +4. No, I'll start manually +``` + +**Based on answer, run:** +- Backend: `npm run dev:backend` (from backend directory) +- Frontend: `npm run dev:frontend` (from frontend directory) +- Both: Start both in separate terminals +- Manual: Provide instructions + +--- + +## Step 8: Cleanup (Unlink All) + +**If user chooses to unlink all:** + +**For each linked module, run:** +```bash +npm run module:unlink +``` + +**Then verify:** +```bash +npm run module:status +``` + +All should show "๐Ÿ“ฆ Installed (npm)" + +--- + +## Step 9: Final Instructions + +**Provide user with:** + +``` +โœ… Setup complete! + +๐Ÿ“ Quick Reference Commands: + npm run module:list # List available modules + npm run module:status # Check link status + npm run module:setup # Interactive setup (run again anytime) + npm run module:link X # Link specific module + npm run module:unlink X # Unlink specific module + +๐Ÿ’ก Tips: + โ€ข Changes in linked modules rebuild automatically (if watch mode enabled) + โ€ข Restart app to see changes + โ€ข When done, run setup again and deselect modules to unlink + +๐Ÿ“– Full documentation: docs/LOCAL_MODULE_DEVELOPMENT.md +``` + +--- + +## Error Handling + +### No modules found +**Say:** +``` +โš ๏ธ No @ciscode/* modules found in ../modules directory. + +To get started: +1. Clone the modules you want to develop +2. Would you like me to help you clone a module? +``` + +If yes โ†’ Use `clone-module.md` prompt + +### Setup script fails +**Check:** +- Module has `build` or `build:watch` script in package.json +- Module dependencies are installed +- No permission issues + +**Suggest:** +``` +Try manually: +1. cd ../modules/ +2. npm install +3. npm run build +4. cd ../../comptaleyes +5. npm run module:link +``` + +### Link fails +**Common causes:** +- Module not built yet โ†’ Run `npm run build` in module +- npm link global issue โ†’ Clear npm cache and retry +- Permission issues โ†’ Check file permissions + +### Watch mode doesn't start +**Verify:** +- Module has `build:watch` script +- TypeScript compiler is installed +- No syntax errors in module + +--- + +## Follow-up Questions to Ask + +**After setup:** + +1. **"Do you want to open VS Code tasks?"** + - Yes โ†’ Open `.vscode/tasks.json` and show available tasks + +2. **"Would you like to set up debug configurations?"** + - Yes โ†’ Open `.vscode/launch.json` and explain configs + +3. **"Need to work on a different module?"** + - Yes โ†’ Run `npm run module:setup` again + +--- + +## Expected User Experience Flow + +``` +User: "Set up local development for auth-kit" + โ†“ +AI: Shows intro, checks available modules + โ†“ +AI: Runs npm run module:setup + โ†“ +User: Selects auth-kit from list, enables watch mode + โ†“ +Script: Unlinks old, links auth-kit, starts watch + โ†“ +AI: Verifies status, shows auth-kit is linked + โ†“ +AI: Asks if user wants to start app + โ†“ +User: "Yes, start backend" + โ†“ +AI: Starts backend in background + โ†“ +AI: Provides quick reference and tips + โ†“ +Done โœ… +``` + +--- + +## Important Notes + +- โœ… **Always verify** status after operations +- โœ… **Use the npm scripts** - don't run raw commands +- โœ… **Let setup-dev-modules.js handle interaction** - it's already interactive +- โš ๏ธ **Don't start multiple watch modes manually** - use the script +- โš ๏ธ **Watch processes are background** - user needs to stop them manually or close terminal +- โœ… **Be conversational** - this is an interactive workflow + +--- + +## Troubleshooting Guide to Provide + +**"Module shows linked but app doesn't reflect changes"** +โ†’ Restart the application + +**"Watch mode not working"** +โ†’ Check terminal for watch process, verify build:watch script exists + +**"Can't unlink module"** +โ†’ Stop app first, then unlink + +**"Status shows npm but I linked it"** +โ†’ Check workspace structure (modules must be at ../modules) + +**"Module not found in list"** +โ†’ Verify module is cloned to ../modules/ +โ†’ Verify package.json has valid @ciscode/* package name diff --git a/.github/workflows/backend-ci.yml b/.github/workflows/backend-ci.yml index bef19e7..558a874 100644 --- a/.github/workflows/backend-ci.yml +++ b/.github/workflows/backend-ci.yml @@ -10,15 +10,17 @@ on: - ".github/workflows/backend-ci.yml" concurrency: - group: ci-backend-pr-${{ github.event.pull_request.number }} + group: ci-backend-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true permissions: contents: read + checks: write + pull-requests: write jobs: backend: runs-on: ubuntu-latest - timeout-minutes: 20 + timeout-minutes: 30 steps: - name: Checkout @@ -29,8 +31,9 @@ jobs: with: node-version: "22" cache: "npm" + cache-dependency-path: package-lock.json - - name: Install (workspaces) + - name: Install dependencies run: npm ci - name: Typecheck @@ -40,7 +43,14 @@ jobs: run: npm -w backend run lint - name: Test - run: npm -w backend run test + run: npm -w backend run test -- --coverage - - name: Docker build (backend only) - run: docker build -f backend/docker/Dockerfile -t comptaleyes-backend:ci . + - name: Upload coverage + uses: codecov/codecov-action@v3 + with: + files: ./backend/coverage/lcov.info + flags: backend + fail_ci_if_error: false + + - name: Build Docker image + run: docker build -f backend/docker/Dockerfile -t comptaleyes-backend:${{ github.sha }} . diff --git a/.github/workflows/frontend-ci.yml b/.github/workflows/frontend-ci.yml index 3fe9cb5..6d067c0 100644 --- a/.github/workflows/frontend-ci.yml +++ b/.github/workflows/frontend-ci.yml @@ -10,15 +10,17 @@ on: - ".github/workflows/frontend-ci.yml" concurrency: - group: ci-frontend-pr-${{ github.event.pull_request.number }} + group: ci-frontend-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true permissions: contents: read + checks: write + pull-requests: write jobs: frontend: runs-on: ubuntu-latest - timeout-minutes: 20 + timeout-minutes: 30 steps: - name: Checkout @@ -29,16 +31,13 @@ jobs: with: node-version: "22" cache: "npm" - cache-dependency-path: | - package-lock.json + cache-dependency-path: package-lock.json - - name: Install (workspaces) - run: | - npm ci + - name: Install dependencies + run: npm ci - name: Typecheck - run: | - npm --workspace frontend run typecheck + run: npm --workspace frontend run typecheck - name: Lint run: | diff --git a/.gitignore b/.gitignore index a1fdbea..05dc76d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ node_modules/ **/node_modules/ +.vscode/ + backend/dist/ frontend/dist/ frontend/build/ @@ -9,7 +11,10 @@ dist/ coverage/ cdk.out/ .env -.env.* .DS_Store scripts/* + +# VS Code workspace files +*.code-workspace +Filetree.md diff --git a/backend/.env.example b/backend/.env.example new file mode 100644 index 0000000..0f22948 --- /dev/null +++ b/backend/.env.example @@ -0,0 +1,73 @@ +# ============================================== +# ENVIRONMENT CONFIGURATION +# ============================================== +# Copy this file to .env and fill in your actual values + +# ====================== +# GENERAL +# ====================== +NODE_ENV=development +PORT=3000 +SERVICE_NAME=comptaleyes-backend + +# ====================== +# DATABASE (MongoDB) +# ====================== +MONGO_URI=mongodb://localhost:27017/comptaleyes +# For MongoDB Atlas, use: +# MONGO_URI=mongodb+srv://username:password@cluster.mongodb.net/dbname?retryWrites=true&w=majority + +# ====================== +# JWT TOKENS +# ====================== +# Generate secure secrets: node -e "console.log(require('crypto').randomBytes(64).toString('base64'))" + +# Access Token (short-lived, for API requests) +JWT_SECRET=your-jwt-secret-change-this +JWT_ACCESS_TOKEN_EXPIRES_IN=15m + +# Refresh Token (long-lived, for getting new access tokens) +JWT_REFRESH_SECRET=your-refresh-secret-change-this +JWT_REFRESH_TOKEN_EXPIRES_IN=7d + +# Email Verification Token +JWT_EMAIL_SECRET=your-email-verification-secret-change-this +JWT_EMAIL_TOKEN_EXPIRES_IN=1d + +# Password Reset Token +JWT_RESET_SECRET=your-password-reset-secret-change-this +JWT_RESET_TOKEN_EXPIRES_IN=1h + +# ====================== +# SMTP / EMAIL +# ====================== +SMTP_HOST=smtp.gmail.com +SMTP_PORT=587 +SMTP_SECURE=false +SMTP_USER=your-email@gmail.com +SMTP_PASS=your-app-specific-password +FROM_EMAIL=noreply@yourdomain.com + +# Frontend URL (for email links, redirects, CORS) +FRONTEND_URL=http://localhost:5173 + +# ====================== +# OAUTH / SOCIAL LOGIN +# ====================== + +# Microsoft OAuth +MICROSOFT_CLIENT_ID=your-microsoft-client-id +MICROSOFT_CLIENT_SECRET=your-microsoft-client-secret +MICROSOFT_CALLBACK_URL=http://localhost:3000/api/auth/microsoft/callback + +# Google OAuth +# Get credentials from: https://console.cloud.google.com/apis/credentials +GOOGLE_CLIENT_ID=your-google-client-id +GOOGLE_CLIENT_SECRET=your-google-client-secret +GOOGLE_CALLBACK_URL=http://localhost:3000/api/auth/google/callback + +# Facebook OAuth +# Get credentials from: https://developers.facebook.com/apps/ +FACEBOOK_APP_ID=your-facebook-app-id +FACEBOOK_APP_SECRET=your-facebook-app-secret +FACEBOOK_CALLBACK_URL=http://localhost:3000/api/auth/facebook/callback diff --git a/backend/nest-cli.json b/backend/nest-cli.json index f9aa683..00209ec 100644 --- a/backend/nest-cli.json +++ b/backend/nest-cli.json @@ -2,7 +2,9 @@ "$schema": "https://json.schemastore.org/nest-cli", "collection": "@nestjs/schematics", "sourceRoot": "src", + "entryFile": "main", "compilerOptions": { - "deleteOutDir": true + "deleteOutDir": true, + "watchAssets": true } } diff --git a/backend/package.json b/backend/package.json index 4239ac2..b98de80 100644 --- a/backend/package.json +++ b/backend/package.json @@ -7,7 +7,7 @@ "license": "MIT", "...": "...", "scripts": { - "dev": "nest start --watch", + "dev": "nest start --watch --preserveWatchOutput", "build": "nest build", "start:prod": "node dist/main.js", "lint": "eslint \"{src,test}/**/*.ts\" --max-warnings=0", @@ -28,6 +28,7 @@ }, "dependencies": { "@ciscode/authentication-kit": "^1.5.0", + "@ciscode/database-kit": "^1.0.0", "@nestjs/common": "^11.0.1", "@nestjs/core": "^11.0.1", "@nestjs/mongoose": "^11.0.4", diff --git a/docs/ARCHITECTURE_STRATEGY.md b/docs/ARCHITECTURE_STRATEGY.md new file mode 100644 index 0000000..83b2ce3 --- /dev/null +++ b/docs/ARCHITECTURE_STRATEGY.md @@ -0,0 +1,382 @@ +# Architecture Strategy Guide + +> **Purpose**: Define clear architectural patterns for applications vs reusable modules + +--- + +## ๐ŸŽฏ Strategic Decision + +**Different architectures for different purposes:** + +| Context | Pattern | Reason | +|---------|---------|--------| +| **ComptAlEyes App** | 4-Layer Clean Architecture | Complex business logic, long-term evolution | +| **@ciscode/* Modules** | Controller-Service-Repository | Simplicity, reusability, easy integration | + +--- + +## ๐Ÿข Application Architecture (ComptAlEyes Backend) + +### Pattern: Clean Architecture (4-Layer) + +**When to use:** +- Complex business logic +- Multiple use-cases per domain +- Long-term maintenance and evolution +- Need for strict layer separation +- Testing complex workflows + +**Structure:** +``` +backend/src/modules/{module}/ +โ”œโ”€โ”€ api/ # HTTP Layer +โ”‚ โ”œโ”€โ”€ controllers/ +โ”‚ โ”œโ”€โ”€ guards/ +โ”‚ โ”œโ”€โ”€ decorators/ +โ”‚ โ””โ”€โ”€ dto/ +โ”œโ”€โ”€ application/ # Business Orchestration +โ”‚ โ”œโ”€โ”€ ports/ # Interfaces +โ”‚ โ””โ”€โ”€ use-cases/ # Business logic +โ”œโ”€โ”€ domain/ # Core Business Logic +โ”‚ โ””โ”€โ”€ entities/ +โ””โ”€โ”€ infrastructure/ # External Dependencies + โ”œโ”€โ”€ repositories/ + โ””โ”€โ”€ adapters/ +``` + +**Dependency Flow:** +``` +api โ†’ application โ†’ domain โ† infrastructure +``` + +**Example - Invoice Module:** +``` +modules/invoice/ +โ”œโ”€โ”€ api/ +โ”‚ โ”œโ”€โ”€ invoice.controller.ts # HTTP endpoints +โ”‚ โ”œโ”€โ”€ guards/ +โ”‚ โ”‚ โ””โ”€โ”€ invoice-owner.guard.ts # Module-specific guard +โ”‚ โ””โ”€โ”€ dto/ +โ”‚ โ”œโ”€โ”€ create-invoice.dto.ts +โ”‚ โ””โ”€โ”€ invoice-response.dto.ts +โ”œโ”€โ”€ application/ +โ”‚ โ”œโ”€โ”€ ports/ +โ”‚ โ”‚ โ””โ”€โ”€ invoice.repository.port.ts +โ”‚ โ””โ”€โ”€ use-cases/ +โ”‚ โ”œโ”€โ”€ create-invoice.use-case.ts +โ”‚ โ”œโ”€โ”€ calculate-tax.use-case.ts +โ”‚ โ””โ”€โ”€ send-to-accounting.use-case.ts +โ”œโ”€โ”€ domain/ +โ”‚ โ”œโ”€โ”€ invoice.entity.ts # Business rules +โ”‚ โ””โ”€โ”€ tax-calculator.ts # Pure domain logic +โ””โ”€โ”€ infrastructure/ + โ”œโ”€โ”€ invoice.postgres.repo.ts # Data access + โ””โ”€โ”€ accounting-api.adapter.ts # External service +``` + +**Benefits:** +- Clear separation of concerns +- Easy to test (mock each layer) +- Scalable for complex domains +- Framework-independent domain +- Easy to swap infrastructure + +**Trade-offs:** +- More files and folders +- Steeper learning curve +- Overhead for simple CRUD + +--- + +## ๐Ÿ“ฆ Module Architecture (@ciscode/*) + +### Pattern: Controller-Service-Repository (CSR) + +**When to use:** +- Reusable libraries +- Standard CRUD operations +- Authentication, authorization +- Database abstractions +- UI component libraries + +**Structure:** +``` +src/ +โ”œโ”€โ”€ index.ts # PUBLIC API exports +โ”œโ”€โ”€ {module}.module.ts # NestJS module +โ”œโ”€โ”€ controllers/ # HTTP Layer +โ”‚ โ””โ”€โ”€ *.controller.ts +โ”œโ”€โ”€ services/ # Business Logic +โ”‚ โ””โ”€โ”€ *.service.ts +โ”œโ”€โ”€ entities/ # Domain Models +โ”‚ โ””โ”€โ”€ *.entity.ts +โ”œโ”€โ”€ repositories/ # Data Access +โ”‚ โ””โ”€โ”€ *.repository.ts +โ”œโ”€โ”€ guards/ # Auth Guards +โ”œโ”€โ”€ decorators/ # Custom Decorators +โ”œโ”€โ”€ dto/ # Data Transfer Objects +โ””โ”€โ”€ utils/ # Helpers +``` + +**Dependency Flow:** +``` +controllers โ†’ services โ†’ repositories +``` + +**Example - Auth Kit:** +``` +src/ +โ”œโ”€โ”€ index.ts +โ”‚ export { AuthKitModule } from './auth-kit.module'; +โ”‚ export { AuthService } from './services/auth.service'; +โ”‚ export { LoginDto, RegisterDto } from './dto/auth'; +โ”‚ export { AuthenticateGuard } from './guards/jwt-auth.guard'; +โ”‚ +โ”œโ”€โ”€ controllers/ +โ”‚ โ””โ”€โ”€ auth.controller.ts +โ”‚ @Post('login') +โ”‚ async login(@Body() dto: LoginDto) { +โ”‚ return this.authService.login(dto); +โ”‚ } +โ”‚ +โ”œโ”€โ”€ services/ +โ”‚ โ””โ”€โ”€ auth.service.ts +โ”‚ async login(dto: LoginDto) { +โ”‚ const user = await this.users.findByEmail(dto.email); +โ”‚ // Business logic here +โ”‚ return this.generateTokens(user); +โ”‚ } +โ”‚ +โ”œโ”€โ”€ entities/ +โ”‚ โ””โ”€โ”€ user.entity.ts +โ”‚ @Schema() +โ”‚ export class User { +โ”‚ @Prop() email: string; +โ”‚ @Prop() password: string; +โ”‚ } +โ”‚ +โ””โ”€โ”€ repositories/ + โ””โ”€โ”€ user.repository.ts + async findByEmail(email: string): Promise { + return this.model.findOne({ email }); + } +``` + +**Benefits:** +- Simple and straightforward +- Easy to understand and use +- Minimal boilerplate +- Fast development +- Well-known pattern + +**Trade-offs:** +- Less strict boundaries +- Services can grow large +- Harder to test complex logic +- Business logic mixed with orchestration + +--- + +## ๐Ÿ”„ Cross-Cutting Concerns + +### Authentication & Authorization + +**Application (ComptAlEyes):** +```typescript +// Uses external module guards +import { AuthenticateGuard } from '@ciscode/authentication-kit'; + +@Controller('invoices') +@UseGuards(AuthenticateGuard) +export class InvoiceController { + // Protected routes +} +``` + +**Module (Auth Kit):** +```typescript +// Provides guards for apps to use +@Injectable() +export class AuthenticateGuard implements CanActivate { + canActivate(context: ExecutionContext): boolean { + // JWT validation logic + } +} + +// Export in index.ts +export { AuthenticateGuard } from './guards/authenticate.guard'; +``` + +### Database Access + +**Application (ComptAlEyes):** +```typescript +// Uses external module for DB +import { DatabaseService } from '@ciscode/database-kit'; + +// App defines its own repositories +export class InvoiceRepository { + constructor(private db: DatabaseService) {} + + async findByUser(userId: string) { + return this.db.repository('invoices') + .find({ userId }); + } +} +``` + +**Module (Database Kit):** +```typescript +// Provides database abstraction +export class DatabaseService { + repository(collection: string): Repository { + // Returns CRUD operations + } +} +``` + +--- + +## ๐Ÿ“‹ Export Rules + +### Application Modules + +**Export Services + DTOs (for cross-module communication):** +```typescript +// backend/src/modules/user/index.ts +export { UserService } from './application/user.service'; +export { UserDto, CreateUserDto } from './api/dto'; + +// โŒ NEVER export entities or repositories +``` + +### External Modules + +**Export Services + DTOs + Guards + Decorators:** +```typescript +// src/index.ts +export { AuthKitModule } from './auth-kit.module'; +export { AuthService } from './services/auth.service'; +export { LoginDto, RegisterDto, UserDto } from './dto/auth'; +export { AuthenticateGuard } from './guards/jwt-auth.guard'; +export { CurrentUser } from './decorators/current-user.decorator'; + +// โŒ NEVER export entities or repositories +``` + +--- + +## ๐Ÿงช Testing Strategy + +### Application Testing + +**Focus on business logic:** +- โœ… Use-cases (complex business rules) +- โœ… Domain entities (validation, calculations) +- โœ… Integration tests (use-case โ†’ repository) +- โœ… E2E tests (critical flows) + +**Coverage:** 70-80% (focus on business logic) + +### Module Testing + +**Comprehensive library testing:** +- โœ… All services (business logic) +- โœ… All utilities and helpers +- โœ… Guards and decorators +- โœ… Repository methods +- โœ… Integration tests +- โœ… E2E tests + +**Coverage:** 80%+ (it's a library, must be bulletproof) + +--- + +## ๐Ÿ“š Documentation + +### Application + +**Internal documentation:** +- README per module (what it does) +- JSDoc on use-cases +- Architecture decision records (ADRs) + +### Modules + +**Public documentation:** +- Comprehensive README with examples +- JSDoc on ALL public APIs +- API reference +- Migration guides +- CHANGELOG with breaking changes + +--- + +## ๐ŸŽ“ Decision Tree + +**When creating new code, ask:** + +### Is this part of ComptAlEyes application? +**YES** โ†’ Use 4-Layer Clean Architecture +- Create `api/`, `application/`, `domain/`, `infrastructure/` +- Use-cases for business logic +- Strict layer separation + +### Is this a reusable module (@ciscode/*)? +**YES** โ†’ Use Controller-Service-Repository +- Keep it simple +- Comprehensive testing +- Excellent documentation +- Clear public API + +--- + +## ๐Ÿ“Š Comparison Table + +| Aspect | Application (Clean) | Module (CSR) | +|--------|-------------------|--------------| +| **Complexity** | High (4 layers) | Low (3 layers) | +| **Learning Curve** | Steep | Gentle | +| **Files** | More files | Fewer files | +| **Business Logic** | Use-cases | Services | +| **Testing** | Focus on use-cases | Test everything | +| **Documentation** | Internal | Public + Examples | +| **Flexibility** | Very high | Moderate | +| **Simplicity** | Lower | Higher | +| **Reusability** | Low (app-specific) | High (library) | + +--- + +## ๐Ÿš€ Migration Path + +### From CSR to Clean (rare, only if module becomes very complex) + +1. Create `application/` folder +2. Extract business logic to use-cases +3. Move services to orchestration role +4. Create ports for repositories +5. Move entities to `domain/` + +### From Clean to CSR (when extracting to module) + +1. Flatten structure (remove layers) +2. Merge use-cases into services +3. Rename folders (domain โ†’ entities, etc.) +4. Define public exports in `index.ts` +5. Add comprehensive tests and docs + +--- + +## ๐ŸŽฏ Key Takeaways + +1. **Different tools for different jobs** - Clean Architecture for apps, CSR for modules +2. **Clarity over consistency** - It's OK to have different patterns in different contexts +3. **Always export DTOs** - Never expose entities from modules +4. **Services as public API** - Consumers use services, not internal implementation +5. **Test everything in modules** - Libraries must be bulletproof +6. **Document everything in modules** - Users need examples and guides + +--- + +*Last updated: February 2, 2026* +*Version: 1.0.0* diff --git a/docs/LOCAL_MODULE_DEVELOPMENT.md b/docs/LOCAL_MODULE_DEVELOPMENT.md new file mode 100644 index 0000000..ce91c4a --- /dev/null +++ b/docs/LOCAL_MODULE_DEVELOPMENT.md @@ -0,0 +1,313 @@ +# Local Module Development Workflow + +This guide explains how to develop `@ciscode/*` modules locally alongside the ComptAlEyes application. + +--- + +## ๐Ÿ“ Prerequisites - Workspace Structure + +**IMPORTANT:** Scripts use relative paths and expect this directory structure: + +``` +your-workspace/ (any name) +โ”œโ”€โ”€ comptaleyes/ (main app) +โ”‚ โ”œโ”€โ”€ scripts/ +โ”‚ โ”œโ”€โ”€ backend/ +โ”‚ โ”œโ”€โ”€ frontend/ +โ”‚ โ””โ”€โ”€ docs/ +โ””โ”€โ”€ modules/ (โš ๏ธ MUST be at same level as comptaleyes/) + โ”œโ”€โ”€ auth-kit/ (git clone @ciscode/authentication-kit) + โ”œโ”€โ”€ auth-kit-ui/ (git clone @ciscode/ui-authentication-kit) + โ””โ”€โ”€ database-kit/ (git clone @ciscode/database-kit) +``` + +**Setup for new team members:** + +```bash +# Clone main app +git clone comptaleyes +cd comptaleyes + +# Clone modules you want to develop locally (one level up) +cd .. +mkdir modules +cd modules + +# Clone the modules you need +git clone auth-kit +git clone auth-kit-ui +git clone database-kit + +# Return to main app +cd ../comptaleyes +npm install +``` + +โœ… **Scripts are portable** - no hardcoded paths, works on any machine with this structure. + +--- + +## ๐ŸŽฏ Overview + +Instead of publishing every change to npm, you can: +1. **Link** a module locally for development +2. **Watch** the module for automatic rebuild on changes +3. **Develop** with real-time feedback in the app +4. **Unlink** when done and restore npm version + +--- + +## ๐Ÿ“ฆ Available Commands + +### CLI Commands + +```bash +# List all available modules +npm run module:list + +# Show link status of all modules +npm run module:status + +# Link a module for local development +npm run module:link + +# Unlink and restore npm version +npm run module:unlink +``` + +### Examples + +```bash +# Link database-kit +npm run module:link database-kit + +# Check status +npm run module:status + +# Unlink when done +npm run module:unlink database-kit +``` + +--- + +## ๐Ÿš€ VS Code Integration + +### Using Tasks (Ctrl+Shift+P โ†’ "Run Task") + +**Quick Actions:** +- `๐Ÿ“ฆ Module: List Available` - See all modules +- `๐Ÿ“Š Module: Show Status` - Check what's linked +- `๐Ÿ”— Link: ` - Link specific module +- `๐Ÿ”“ Unlink: ` - Unlink specific module + +**Development Workflows:** +- `๐Ÿ”ง Develop Module: database-kit` - Link + Watch +- `๐ŸŽฏ Full Dev: database-kit + Backend` - Link + Watch + Run App + +### Using Debug/Launch (F5) + +**Single Module Development:** +- `๐Ÿ‘€ Watch: database-kit` - Watch mode only +- `๐Ÿ› Debug: Backend (with database-kit)` - Full workflow + +**Full Stack Development:** +- `๐Ÿš€ Full Stack: App Only` - Run app without modules +- `๐Ÿš€ Full Stack: with database-kit` - App + specific module +- `๐Ÿš€ Full Stack: All Modules` - App + all modules in watch mode + +--- + +## ๐Ÿ”„ Typical Workflow + +### Scenario: Bug Fix in database-kit + +**Option 1: Using CLI** +```bash +# 1. Link module +npm run module:link database-kit + +# 2. Start watch mode (in module directory) +cd modules/database-kit +npm run build:watch + +# 3. Start app (in another terminal) +cd ../.. +npm run dev:backend + +# 4. Make changes, test, commit + +# 5. When done, unlink +npm run module:unlink database-kit +``` + +**Option 2: Using VS Code** +1. Press `F5` +2. Select `๐Ÿš€ Full Stack: with database-kit` +3. Make changes in `modules/database-kit/` +4. Changes rebuild automatically +5. Test in running app +6. When done: `Ctrl+Shift+P` โ†’ Run Task โ†’ `๐Ÿ”“ Unlink: database-kit` + +--- + +## ๐Ÿ“‚ Directory Structure + +``` +comptaleyes/ # Main app +โ”œโ”€โ”€ backend/ +โ”œโ”€โ”€ frontend/ +โ”œโ”€โ”€ scripts/ +โ”‚ โ””โ”€โ”€ link-module.js # Auto-discovery script +โ””โ”€โ”€ .vscode/ + โ”œโ”€โ”€ tasks.json # VS Code tasks + โ””โ”€โ”€ launch.json # Debug configurations + +modules/ # @ciscode/* packages +โ”œโ”€โ”€ auth-kit/ # Backend auth +โ”œโ”€โ”€ auth-kit-ui/ # Frontend auth UI +โ””โ”€โ”€ database-kit/ # Database abstraction +``` + +--- + +## ๐Ÿ” How It Works + +### Auto-Discovery +The script automatically discovers modules by: +1. Scanning `modules/` directory +2. Reading `package.json` from each subdirectory +3. Filtering for `@ciscode/*` packages +4. Determining target (backend/frontend) from dependencies + +### Link Process +When you link a module: +1. Module is built (`npm run build`) +2. Global symlink created (`npm link` in module) +3. App links to global symlink (`npm link @ciscode/module-name`) +4. Changes to module source โ†’ automatic rebuild โ†’ reflected in app + +### Unlink Process +When you unlink: +1. Remove app's symlink +2. Remove global symlink +3. Reinstall from npm (`npm install @ciscode/module-name`) + +--- + +## โœ… Benefits + +- **No npm publish** for every change +- **Real-time development** with watch mode +- **Work on 1 module** while others use npm versions +- **Zero configuration** for new modules (auto-discovery) +- **IDE integration** with VS Code tasks and debug + +--- + +## โš ๏ธ Important Notes + +### When Working with Linked Modules + +- Always check link status before debugging issues: `npm run module:status` +- Linked modules take precedence over npm versions +- Remember to unlink when done to avoid confusion +- Build errors in module will affect the app + +### Adding New Modules + +1. Clone module repository to `modules/` directory +2. Module is automatically discovered +3. No script updates needed +4. Use `npm run module:list` to confirm + +--- + +## ๐Ÿ› Troubleshooting + +### Module not found after linking +```bash +# Rebuild the module +cd modules/ +npm run build + +# Re-link +cd ../.. +npm run module:unlink +npm run module:link +``` + +### App not picking up changes +```bash +# Ensure watch mode is running +cd modules/ +npm run build:watch + +# Restart app +``` + +### "Cannot find module" error +```bash +# Check link status +npm run module:status + +# If not linked, link it +npm run module:link +``` + +### Want to use npm version again +```bash +# Simply unlink +npm run module:unlink +``` + +--- + +## ๐Ÿ“ Examples + +### Scenario 1: Fix Bug in database-kit + +```bash +# Quick CLI approach +npm run module:link database-kit +cd modules/database-kit && npm run build:watch & +npm run dev:backend + +# Make changes in modules/database-kit/src/ +# Test in app +# Commit changes + +npm run module:unlink database-kit +``` + +### Scenario 2: Develop New Feature in auth-kit-ui + +Press `F5` โ†’ Select `๐Ÿš€ Full Stack: with auth-kit-ui` + +- Edit `modules/auth-kit-ui/src/` +- See changes in frontend immediately +- Debug with breakpoints +- When done: Unlink via task + +### Scenario 3: Work on Multiple Modules + +Press `F5` โ†’ Select `๐Ÿš€ Full Stack: All Modules` + +- All modules in watch mode +- Backend + Frontend running +- Edit any module source +- Changes reflected instantly + +--- + +## ๐ŸŽ“ Best Practices + +1. **Always check status** before starting work +2. **Unlink when done** to avoid confusion later +3. **Use watch mode** for automatic rebuilds +4. **Test thoroughly** before unlinking and publishing +5. **Commit module changes** before unlinking +6. **Document breaking changes** if any + +--- + +_Last updated: February 2, 2026_ diff --git a/frontend/package.json b/frontend/package.json index fcc6155..573b176 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -18,7 +18,7 @@ }, "dependencies": { "@ciscode/template-fe": "^1.0.0", - "@ciscode/ui-authentication-kit": "^1.0.4", + "@ciscode/ui-authentication-kit": "^1.0.11", "@ciscode/ui-translate-core": "^1.0.0", "@iconify/tailwind": "^1.2.0", "@tanstack/react-query": "^5.90.16", diff --git a/frontend/src/app/router/router.tsx b/frontend/src/app/router/router.tsx index e2f0ef8..d4947fe 100644 --- a/frontend/src/app/router/router.tsx +++ b/frontend/src/app/router/router.tsx @@ -1,4 +1,4 @@ -import { Navigate, Route, Routes } from 'react-router-dom'; +import { Route, Routes, useSearchParams } from 'react-router-dom'; import Loading from '../../pages/Loading'; import AppLayout from '../layouts/AppLayout'; @@ -11,20 +11,44 @@ function ProfilePage() { return
Profile
; } +function LoginPage() { + return
Login
; +} + +function ForgotPasswordPage() { + return
Forgot Password
; +} + +function ResetPasswordPage() { + const [params] = useSearchParams(); + const token = params.get('token'); + return ( +
+
Reset Password
+
Token: {token ?? 'none'}
+
+ ); +} + export default function Router() { return ( {/* Boot */} } /> + {/* Public routes */} + } /> + } /> + } /> + {/* App layout (NO PATH) */} }> } /> } /> - {/* Fallback */} - } /> + {/* 404 Fallback for unknown paths */} + 404 Not Found} /> ); } diff --git a/package-lock.json b/package-lock.json index 0a4c3fb..e799b2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,7 @@ "license": "MIT", "dependencies": { "@ciscode/authentication-kit": "^1.5.0", + "@ciscode/database-kit": "^1.0.0", "@nestjs/common": "^11.0.1", "@nestjs/core": "^11.0.1", "@nestjs/mongoose": "^11.0.4", @@ -75,7 +76,7 @@ "version": "0.0.0", "dependencies": { "@ciscode/template-fe": "^1.0.0", - "@ciscode/ui-authentication-kit": "^1.0.4", + "@ciscode/ui-authentication-kit": "^1.0.11", "@ciscode/ui-translate-core": "^1.0.0", "@iconify/tailwind": "^1.2.0", "@tanstack/react-query": "^5.90.16", @@ -442,9 +443,9 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", - "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", @@ -456,9 +457,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", - "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", "dev": true, "license": "MIT", "engines": { @@ -466,21 +467,21 @@ } }, "node_modules/@babel/core": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", - "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.28.6", + "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -497,13 +498,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", - "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.0.tgz", + "integrity": "sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -622,12 +623,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", - "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.6" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -932,17 +933,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", - "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.6", + "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6", + "@babel/types": "^7.29.0", "debug": "^4.3.1" }, "engines": { @@ -950,9 +951,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -1022,10 +1023,146 @@ "url": "https://dotenvx.com" } }, + "node_modules/@ciscode/database-kit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@ciscode/database-kit/-/database-kit-1.0.0.tgz", + "integrity": "sha512-EqpB2L430bCKlzjOG189GIg+/Bc90sRndYJHcC4PJ6lUIu8CVql9fCc/iZpKrB02SztZE/1X8QXWnYWSFjgtbA==", + "license": "MIT", + "dependencies": { + "knex": "^3.1.0", + "mongoose": "^8.22.0", + "pg": "^8.18.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.0.0", + "@nestjs/core": "^10.0.0 || ^11.0.0", + "reflect-metadata": "^0.2.0" + } + }, + "node_modules/@ciscode/database-kit/node_modules/@types/whatwg-url": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", + "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", + "license": "MIT", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, + "node_modules/@ciscode/database-kit/node_modules/bson": { + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.4.tgz", + "integrity": "sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.20.1" + } + }, + "node_modules/@ciscode/database-kit/node_modules/kareem": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", + "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@ciscode/database-kit/node_modules/mongodb": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.20.0.tgz", + "integrity": "sha512-Tl6MEIU3K4Rq3TSHd+sZQqRBoGlFsOgNrH5ltAcFBV62Re3Fd+FcaVf8uSEQFOJ51SDowDVttBTONMfoYWrWlQ==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.3.0", + "bson": "^6.10.4", + "mongodb-connection-string-url": "^3.0.2" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.3.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/@ciscode/database-kit/node_modules/mongodb-connection-string-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz", + "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==", + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^14.1.0 || ^13.0.0" + } + }, + "node_modules/@ciscode/database-kit/node_modules/mongoose": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.22.0.tgz", + "integrity": "sha512-LKTPPqD3CVcSZJRzPcwKiSVYTmAvBZeVT0V34vUiqPEo9sBmOEg1y4TpDbUb90Zf2lO4N05ailQnKxiapCN08g==", + "license": "MIT", + "dependencies": { + "bson": "^6.10.4", + "kareem": "2.6.3", + "mongodb": "~6.20.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "17.1.3" + }, + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/@ciscode/database-kit/node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "license": "MIT", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@ciscode/ui-authentication-kit": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@ciscode/ui-authentication-kit/-/ui-authentication-kit-1.0.4.tgz", - "integrity": "sha512-cHVBpKQE6G9cQhnx6JXZTn3clgSLUrGYN9GfIBeIROlJwLEGdzCCWTrCTWtanItrmkaMXgtbZleT4BG8IyR9zA==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@ciscode/ui-authentication-kit/-/ui-authentication-kit-1.0.11.tgz", + "integrity": "sha512-MmPDgxpZ+iXxQCrABfVH62dU5SgaKVJyme3+Eql8EMRNKgS6pDd03xb1YfcNgAuALV8us37JqncGhK4Kxx0/DA==", "license": "ISC", "peerDependencies": { "@ciscode/ui-translate-core": "^1.0.0", @@ -3766,9 +3903,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.0.tgz", - "integrity": "sha512-tPgXB6cDTndIe1ah7u6amCI1T0SsnlOuKgg10Xh3uizJk4e5M1JGaUMk7J4ciuAUcFpbOiNhm2XIjP9ON0dUqA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", "cpu": [ "arm" ], @@ -3780,9 +3917,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.0.tgz", - "integrity": "sha512-sa4LyseLLXr1onr97StkU1Nb7fWcg6niokTwEVNOO7awaKaoRObQ54+V/hrF/BP1noMEaaAW6Fg2d/CfLiq3Mg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", "cpu": [ "arm64" ], @@ -3794,9 +3931,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.0.tgz", - "integrity": "sha512-/NNIj9A7yLjKdmkx5dC2XQ9DmjIECpGpwHoGmA5E1AhU0fuICSqSWScPhN1yLCkEdkCwJIDu2xIeLPs60MNIVg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", "cpu": [ "arm64" ], @@ -3808,9 +3945,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.0.tgz", - "integrity": "sha512-xoh8abqgPrPYPr7pTYipqnUi1V3em56JzE/HgDgitTqZBZ3yKCWI+7KUkceM6tNweyUKYru1UMi7FC060RyKwA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", "cpu": [ "x64" ], @@ -3822,9 +3959,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.0.tgz", - "integrity": "sha512-PCkMh7fNahWSbA0OTUQ2OpYHpjZZr0hPr8lId8twD7a7SeWrvT3xJVyza+dQwXSSq4yEQTMoXgNOfMCsn8584g==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", "cpu": [ "arm64" ], @@ -3836,9 +3973,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.0.tgz", - "integrity": "sha512-1j3stGx+qbhXql4OCDZhnK7b01s6rBKNybfsX+TNrEe9JNq4DLi1yGiR1xW+nL+FNVvI4D02PUnl6gJ/2y6WJA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", "cpu": [ "x64" ], @@ -3850,9 +3987,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.0.tgz", - "integrity": "sha512-eyrr5W08Ms9uM0mLcKfM/Uzx7hjhz2bcjv8P2uynfj0yU8GGPdz8iYrBPhiLOZqahoAMB8ZiolRZPbbU2MAi6Q==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", "cpu": [ "arm" ], @@ -3864,9 +4001,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.0.tgz", - "integrity": "sha512-Xds90ITXJCNyX9pDhqf85MKWUI4lqjiPAipJ8OLp8xqI2Ehk+TCVhF9rvOoN8xTbcafow3QOThkNnrM33uCFQA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", "cpu": [ "arm" ], @@ -3878,9 +4015,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.0.tgz", - "integrity": "sha512-Xws2KA4CLvZmXjy46SQaXSejuKPhwVdaNinldoYfqruZBaJHqVo6hnRa8SDo9z7PBW5x84SH64+izmldCgbezw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", "cpu": [ "arm64" ], @@ -3892,9 +4029,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.0.tgz", - "integrity": "sha512-hrKXKbX5FdaRJj7lTMusmvKbhMJSGWJ+w++4KmjiDhpTgNlhYobMvKfDoIWecy4O60K6yA4SnztGuNTQF+Lplw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", "cpu": [ "arm64" ], @@ -3906,9 +4043,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.0.tgz", - "integrity": "sha512-6A+nccfSDGKsPm00d3xKcrsBcbqzCTAukjwWK6rbuAnB2bHaL3r9720HBVZ/no7+FhZLz/U3GwwZZEh6tOSI8Q==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", "cpu": [ "loong64" ], @@ -3920,9 +4057,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.0.tgz", - "integrity": "sha512-4P1VyYUe6XAJtQH1Hh99THxr0GKMMwIXsRNOceLrJnaHTDgk1FTcTimDgneRJPvB3LqDQxUmroBclQ1S0cIJwQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", "cpu": [ "loong64" ], @@ -3934,9 +4071,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.0.tgz", - "integrity": "sha512-8Vv6pLuIZCMcgXre6c3nOPhE0gjz1+nZP6T+hwWjr7sVH8k0jRkH+XnfjjOTglyMBdSKBPPz54/y1gToSKwrSQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", "cpu": [ "ppc64" ], @@ -3948,9 +4085,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.0.tgz", - "integrity": "sha512-r1te1M0Sm2TBVD/RxBPC6RZVwNqUTwJTA7w+C/IW5v9Ssu6xmxWEi+iJQlpBhtUiT1raJ5b48pI8tBvEjEFnFA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", "cpu": [ "ppc64" ], @@ -3962,9 +4099,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.0.tgz", - "integrity": "sha512-say0uMU/RaPm3CDQLxUUTF2oNWL8ysvHkAjcCzV2znxBr23kFfaxocS9qJm+NdkRhF8wtdEEAJuYcLPhSPbjuQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", "cpu": [ "riscv64" ], @@ -3976,9 +4113,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.0.tgz", - "integrity": "sha512-/MU7/HizQGsnBREtRpcSbSV1zfkoxSTR7wLsRmBPQ8FwUj5sykrP1MyJTvsxP5KBq9SyE6kH8UQQQwa0ASeoQQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", "cpu": [ "riscv64" ], @@ -3990,9 +4127,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.0.tgz", - "integrity": "sha512-Q9eh+gUGILIHEaJf66aF6a414jQbDnn29zeu0eX3dHMuysnhTvsUvZTCAyZ6tJhUjnvzBKE4FtuaYxutxRZpOg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", "cpu": [ "s390x" ], @@ -4004,9 +4141,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.0.tgz", - "integrity": "sha512-OR5p5yG5OKSxHReWmwvM0P+VTPMwoBS45PXTMYaskKQqybkS3Kmugq1W+YbNWArF8/s7jQScgzXUhArzEQ7x0A==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", "cpu": [ "x64" ], @@ -4018,9 +4155,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.0.tgz", - "integrity": "sha512-XeatKzo4lHDsVEbm1XDHZlhYZZSQYym6dg2X/Ko0kSFgio+KXLsxwJQprnR48GvdIKDOpqWqssC3iBCjoMcMpw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", "cpu": [ "x64" ], @@ -4032,9 +4169,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.0.tgz", - "integrity": "sha512-Lu71y78F5qOfYmubYLHPcJm74GZLU6UJ4THkf/a1K7Tz2ycwC2VUbsqbJAXaR6Bx70SRdlVrt2+n5l7F0agTUw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", "cpu": [ "x64" ], @@ -4046,9 +4183,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.0.tgz", - "integrity": "sha512-v5xwKDWcu7qhAEcsUubiav7r+48Uk/ENWdr82MBZZRIm7zThSxCIVDfb3ZeRRq9yqk+oIzMdDo6fCcA5DHfMyA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", "cpu": [ "arm64" ], @@ -4060,9 +4197,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.0.tgz", - "integrity": "sha512-XnaaaSMGSI6Wk8F4KK3QP7GfuuhjGchElsVerCplUuxRIzdvZ7hRBpLR0omCmw+kI2RFJB80nenhOoGXlJ5TfQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", "cpu": [ "arm64" ], @@ -4074,9 +4211,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.0.tgz", - "integrity": "sha512-3K1lP+3BXY4t4VihLw5MEg6IZD3ojSYzqzBG571W3kNQe4G4CcFpSUQVgurYgib5d+YaCjeFow8QivWp8vuSvA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", "cpu": [ "ia32" ], @@ -4088,9 +4225,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.0.tgz", - "integrity": "sha512-MDk610P/vJGc5L5ImE4k5s+GZT3en0KoK1MKPXCRgzmksAMk79j4h3k1IerxTNqwDLxsGxStEZVBqG0gIqZqoA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", "cpu": [ "x64" ], @@ -4102,9 +4239,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.0.tgz", - "integrity": "sha512-Zv7v6q6aV+VslnpwzqKAmrk5JdVkLUzok2208ZXGipjb+msxBr/fJPZyeEXiFgH7k62Ak0SLIfxQRZQvTuf7rQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", "cpu": [ "x64" ], @@ -6762,9 +6899,9 @@ "license": "MIT" }, "node_modules/autoprefixer": { - "version": "10.4.23", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", - "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "version": "10.4.24", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.24.tgz", + "integrity": "sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==", "dev": true, "funding": [ { @@ -6783,7 +6920,7 @@ "license": "MIT", "dependencies": { "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001760", + "caniuse-lite": "^1.0.30001766", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" @@ -7871,9 +8008,9 @@ } }, "node_modules/ci-info": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", - "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, "funding": [ { @@ -8179,9 +8316,9 @@ } }, "node_modules/commander": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", - "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "dev": true, "license": "MIT", "engines": { @@ -9785,9 +9922,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.282", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.282.tgz", - "integrity": "sha512-FCPkJtpst28UmFzd903iU7PdeVTfY0KAeJy+Lk0GLZRwgwYHn/irRcaCbQQOmr5Vytc/7rcavsYLvTM8RiHYhQ==", + "version": "1.5.283", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.283.tgz", + "integrity": "sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==", "dev": true, "license": "ISC" }, @@ -10079,7 +10216,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -10599,6 +10735,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", @@ -11530,7 +11675,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=8.0.0" @@ -11581,9 +11725,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.1.tgz", + "integrity": "sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==", "dev": true, "license": "MIT", "dependencies": { @@ -11593,6 +11737,12 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/getopts": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", + "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==", + "license": "MIT" + }, "node_modules/glob": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", @@ -12173,6 +12323,15 @@ "node": ">= 0.4" } }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -14896,6 +15055,95 @@ "node": ">=6" } }, + "node_modules/knex": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/knex/-/knex-3.1.0.tgz", + "integrity": "sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==", + "license": "MIT", + "dependencies": { + "colorette": "2.0.19", + "commander": "^10.0.0", + "debug": "4.3.4", + "escalade": "^3.1.1", + "esm": "^3.2.25", + "get-package-type": "^0.1.0", + "getopts": "2.3.0", + "interpret": "^2.2.0", + "lodash": "^4.17.21", + "pg-connection-string": "2.6.2", + "rechoir": "^0.8.0", + "resolve-from": "^5.0.0", + "tarn": "^3.0.2", + "tildify": "2.0.0" + }, + "bin": { + "knex": "bin/cli.js" + }, + "engines": { + "node": ">=16" + }, + "peerDependenciesMeta": { + "better-sqlite3": { + "optional": true + }, + "mysql": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-native": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } + } + }, + "node_modules/knex/node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "license": "MIT" + }, + "node_modules/knex/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/knex/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/knex/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -14921,9 +15169,9 @@ } }, "node_modules/libphonenumber-js": { - "version": "1.12.35", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.35.tgz", - "integrity": "sha512-T/Cz6iLcsZdb5jDncDcUNhSAJ0VlSC9TnsqtBNdpkaAmy24/R1RhErtNWVWBrcUZKs9hSgaVsBkc7HxYnazIfw==", + "version": "1.12.36", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.36.tgz", + "integrity": "sha512-woWhKMAVx1fzzUnMCyOzglgSgf6/AFHLASdOBcchYCyvWSGWt12imw3iu2hdI5d4dGZRsNWAmWiz37sDKUPaRQ==", "license": "MIT" }, "node_modules/lilconfig": { @@ -16465,6 +16713,101 @@ "dev": true, "license": "MIT" }, + "node_modules/pg": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.18.0.tgz", + "integrity": "sha512-xqrUDL1b9MbkydY/s+VZ6v+xiMUmOUk7SS9d/1kpyQxoJ6U9AO1oIJyUWVZojbfe5Cc/oluutcgFG4L9RDP1iQ==", + "license": "MIT", + "dependencies": { + "pg-connection-string": "^2.11.0", + "pg-pool": "^3.11.0", + "pg-protocol": "^1.11.0", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.3.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.3.0.tgz", + "integrity": "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.11.0.tgz", + "integrity": "sha512-MJYfvHwtGp870aeusDh+hg9apvOe2zmpZJpyt+BMtzUWlVqbhFmMK6bOBXLBUPd7iRtIF9fZplDc7KrPN3PN7w==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.11.0.tgz", + "integrity": "sha512-pfsxk2M9M3BuGgDOfuy37VNRRX3jmKgMjcvAcWqNDpZSf4cUmv8HSOl5ViRQFsfARFn0KuUQTgLxVMbNq5NW3g==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pg/node_modules/pg-connection-string": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.11.0.tgz", + "integrity": "sha512-kecgoJwhOpxYU21rZjULrmrBJ698U2RxXofKVzOn5UDj61BPj/qMb7diYUR1nLScCDbrztQFl1TaQZT0t1EtzQ==", + "license": "MIT" + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -16723,6 +17066,45 @@ "dev": true, "license": "MIT" }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -17156,6 +17538,18 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, "node_modules/reflect-metadata": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", @@ -17270,7 +17664,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -17348,9 +17741,9 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.0.tgz", - "integrity": "sha512-e5lPJi/aui4TO1LpAXIRLySmwXSE8k3b9zoGfd42p67wzxog4WHjiZF3M2uheQih4DGyc25QEV4yRBbpueNiUA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", "dev": true, "license": "MIT", "dependencies": { @@ -17364,31 +17757,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.57.0", - "@rollup/rollup-android-arm64": "4.57.0", - "@rollup/rollup-darwin-arm64": "4.57.0", - "@rollup/rollup-darwin-x64": "4.57.0", - "@rollup/rollup-freebsd-arm64": "4.57.0", - "@rollup/rollup-freebsd-x64": "4.57.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.57.0", - "@rollup/rollup-linux-arm-musleabihf": "4.57.0", - "@rollup/rollup-linux-arm64-gnu": "4.57.0", - "@rollup/rollup-linux-arm64-musl": "4.57.0", - "@rollup/rollup-linux-loong64-gnu": "4.57.0", - "@rollup/rollup-linux-loong64-musl": "4.57.0", - "@rollup/rollup-linux-ppc64-gnu": "4.57.0", - "@rollup/rollup-linux-ppc64-musl": "4.57.0", - "@rollup/rollup-linux-riscv64-gnu": "4.57.0", - "@rollup/rollup-linux-riscv64-musl": "4.57.0", - "@rollup/rollup-linux-s390x-gnu": "4.57.0", - "@rollup/rollup-linux-x64-gnu": "4.57.0", - "@rollup/rollup-linux-x64-musl": "4.57.0", - "@rollup/rollup-openbsd-x64": "4.57.0", - "@rollup/rollup-openharmony-arm64": "4.57.0", - "@rollup/rollup-win32-arm64-msvc": "4.57.0", - "@rollup/rollup-win32-ia32-msvc": "4.57.0", - "@rollup/rollup-win32-x64-gnu": "4.57.0", - "@rollup/rollup-win32-x64-msvc": "4.57.0", + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", "fsevents": "~2.3.2" } }, @@ -17989,6 +18382,15 @@ "memory-pager": "^1.0.2" } }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -18677,6 +19079,15 @@ "streamx": "^2.15.0" } }, + "node_modules/tarn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", + "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/terser": { "version": "5.46.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", @@ -18905,6 +19316,15 @@ "dev": true, "license": "MIT" }, + "node_modules/tildify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", + "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", diff --git a/package.json b/package.json index ca1ce32..b6decee 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,10 @@ "scripts": { "prepare": "husky", "lint-staged": "lint-staged", + "module:list": "node scripts/link-module.js list", + "module:status": "node scripts/link-module.js status", + "module:link": "node scripts/link-module.js link", + "module:unlink": "node scripts/link-module.js unlink", "dev": "concurrently \"npm -w backend run dev\" \"npm -w frontend run dev\"", "dev:backend": "npm -w backend run dev", "dev:frontend": "npm -w frontend run dev", @@ -25,7 +29,12 @@ "frontend:typecheck": "npm -w frontend run typecheck", "frontend:test": "npm -w frontend run test", "frontend:lint:fix": "npm -w frontend run lint:fix", - "frontend:format": "npm -w frontend run format" + "frontend:format": "npm -w frontend run format", + "lint": "npm run backend:lint && npm run frontend:lint", + "typecheck": "npm run backend:typecheck && npm run frontend:typecheck", + "test": "npm run backend:test && npm run frontend:test", + "lint:fix": "npm run backend:lint:fix && npm run frontend:lint:fix", + "format": "npm run backend:format && npm run frontend:format" }, "devDependencies": { "concurrently": "^9.1.0", @@ -40,4 +49,4 @@ "npm --workspace backend exec -- prettier --write" ] } -} \ No newline at end of file +}