diff --git a/.clinerules/01-ResponceType.md b/.clinerules/01-ResponceType.md index 093fde4..8058c7d 100644 --- a/.clinerules/01-ResponceType.md +++ b/.clinerules/01-ResponceType.md @@ -26,11 +26,12 @@ Project follows a standardized response type for all API endpoints. - **errors**: Field-specific validation errors (maps field names to arrays of messages) - **data**: The actual response data (success responses only) - **total, page, limit**: Only for paginated responses - + ## Examples: ### Success Response (Single Item) + ```json { "data": { @@ -45,10 +46,7 @@ Project follows a standardized response type for all API endpoints. ```json { - "data": [ - {"id": "1", "name": "Toyota"}, - {"id": "2", "name": "Honda"} - ], + "data": [{ "id": "1", "name": "Toyota" }, { "id": "2", "name": "Honda" }], "total": 150, "page": 1, "limit": 30 @@ -79,7 +77,6 @@ Project follows a standardized response type for all API endpoints. ### Combined Error (with both message and field errors) - ```json { "message": "Brand already exists", @@ -103,7 +100,7 @@ Project follows a standardized response type for all API endpoints. - All user-facing messages go through `req.appInfo.i18n?.t()`, and the English text belongs in i18next's own `defaultValue` option — **never behind `||`**. - A missing key makes `t()` return the key *itself*, which is a truthy string, + A missing key makes `t()` return the key _itself_, which is a truthy string, so `t('x') || 'fallback'` never reaches the fallback: it answers with the raw `x`. `defaultValue` is what actually renders English on a miss. - Example: `req.appInfo.i18n?.t('validation.required', { defaultValue: 'Field is required' })` @@ -122,7 +119,10 @@ Project follows a standardized response type for all API endpoints. ## Field-Specific Error Examples: ```javascript -import { BadRequestError, ConflictError } from '@adaptivestone/framework/services/http/httpErrors.js'; +import { + BadRequestError, + ConflictError, +} from '@adaptivestone/framework/services/http/httpErrors.js'; // File validation error → 400 { message, errors: { image: [...] } } throw new BadRequestError({ diff --git a/.clinerules/02-DockerCommands.md b/.clinerules/02-DockerCommands.md index 6d4636c..fd73670 100644 --- a/.clinerules/02-DockerCommands.md +++ b/.clinerules/02-DockerCommands.md @@ -5,6 +5,7 @@ This project runs inside Docker containers. All commands must be executed within ## Command Execution Format ### Backend Commands + For any backend-related commands (TypeScript, Node.js, npm, etc.), use: ```bash docker compose exec backend {command} @@ -13,11 +14,13 @@ docker compose exec backend {command} ### Examples: #### TypeScript Type Check + ```bash docker compose exec backend npm run check:types ``` #### Generate Types (Required after Model Changes) + **IMPORTANT**: After creating or updating any model, you MUST regenerate types: ```bash docker compose exec backend npm run generateTypes @@ -25,11 +28,13 @@ docker compose exec backend npm run generateTypes This generates type definitions that allow `this.app.getModel('ModelName')` to work with proper types without manual casting. #### Install Dependencies + ```bash docker compose exec backend npm install ``` #### Run Tests + ```bash docker compose exec backend npm test ``` @@ -68,11 +73,13 @@ docker compose run --rm backend-bun bash scripts/bun-test.sh --test-name-pattern Bun never runs on the host. See [11-Testing.md](./11-Testing.md). #### Run Development Server + ```bash docker compose exec backend npm run dev ``` #### Database Migrations + Create a migration (scaffolds the file — never hand-write one), then apply pending ones. See [10-Migrations.md](./10-Migrations.md). ```bash docker compose exec backend npm run cli migration/create -- --name=someName @@ -80,11 +87,13 @@ docker compose exec backend npm run cli migration/migrate ``` #### Linting + ```bash docker compose exec backend npm run lint ``` #### Build Project + ```bash docker compose exec backend npm run build ``` @@ -97,24 +106,28 @@ docker compose exec backend npm run build 4. **Use the correct service name** (`backend` for this project) ## Container Status Check + To check if containers are running: ```bash docker compose ps ``` ## Starting Containers + If containers are not running: ```bash docker compose up ``` ## Accessing Container Shell + For interactive debugging: ```bash docker compose exec backend bash ``` ## Database Access + If database operations are needed: ```bash docker compose exec mongo mongosh diff --git a/.clinerules/03-ControllerPattern.md b/.clinerules/03-ControllerPattern.md index 080054b..4b15c8b 100644 --- a/.clinerules/03-ControllerPattern.md +++ b/.clinerules/03-ControllerPattern.md @@ -107,12 +107,14 @@ export default YourController; ## Route Definition Rules ### HTTP Methods + - `get`: For retrieving data - `post`: For creating new resources - `put`: For updating existing resources - `delete`: For deleting resources ### Route Structure + ```typescript get: { '/path': { @@ -135,6 +137,7 @@ post: { ### Common Middleware #### Pagination + ```typescript import Pagination from '@adaptivestone/framework/services/http/middleware/Pagination.js'; @@ -152,14 +155,16 @@ async getList( ``` #### Role-based Access Control + ```typescript import RoleMiddleware from '@adaptivestone/framework/services/http/middleware/Role.js'; // In routes -middleware: [[RoleMiddleware, { roles: ['admin'] }]] +middleware: [[RoleMiddleware, { roles: ['admin'] }]]; ``` #### Authentication + ```typescript import Auth from '@adaptivestone/framework/services/http/middleware/Auth.js'; import GetUserByToken from '@adaptivestone/framework/services/http/middleware/GetUserByToken.js'; @@ -175,16 +180,18 @@ static get middleware() { Any [Standard Schema](https://standardschema.dev/) validator works as a route `query:` / `request:` schema. The `` you declare is what codegen turns into `req.appInfo.query` / `req.appInfo.request`. ### Default — zod + ```typescript import { z } from 'zod'; query: z.object({ status: z.string().optional(), tags: z.array(z.string()).optional(), -}) +}); ``` ### Other validators (yup / valibot / arktype) + Any Standard Schema validator works the same way — pick one and import it. Yup is the framework's traditional choice (yup ≥1.7 implements Standard Schema): ```typescript import { object, string, array } from 'yup'; @@ -192,7 +199,7 @@ import { object, string, array } from 'yup'; request: object().shape({ name: string().required(), tags: array().of(string()), -}) +}); ``` > File uploads: import `File` from `@adaptivestone/framework/types.js` and use @@ -204,6 +211,7 @@ request: object().shape({ > The signatures below predate codegen and hand-write the `appInfo` shape for illustration. In real controllers, type each handler with the generated `…Request` type (PascalCased handler name) from `./.routes.gen.ts` (see the Basic Template) instead of `FrameworkRequest & { appInfo: { ... } }` — the generated type already includes `pagination`, `query`, `request`, `params`, and `user`. ### Basic GET Handler + ```typescript async getList( req: FrameworkRequest & PaginationMiddlewareAppInfo & { @@ -247,6 +255,7 @@ async getList( ``` ### GET by Slug Handler + ```typescript async getBySlug(req: FrameworkRequest, res: Response) { const Model = this.app.getModel('ModelName'); @@ -267,6 +276,7 @@ async getBySlug(req: FrameworkRequest, res: Response) { ``` ### POST (Create) Handler + ```typescript async create( req: FrameworkRequest & { @@ -342,6 +352,7 @@ async create( ``` ### PUT (Update) Handler + ```typescript async update( req: FrameworkRequest & { @@ -415,6 +426,7 @@ async update( ``` ### DELETE Handler + ```typescript async delete(req: FrameworkRequest, res: Response) { const Model = this.app.getModel('ModelName'); @@ -439,11 +451,13 @@ async delete(req: FrameworkRequest, res: Response) { ## Important Rules ### 1. Response Format + - Always follow the project's response format (see `.clinerules/01-ResponceType.md`) - Use proper HTTP status codes - Include internationalization support ### 2. Error Handling + - Framework handles errors automatically (see `.clinerules/07-ErrorHandling.md`) - Do NOT wrap main handler logic in try-catch blocks - Only use try-catch for specific non-critical operations (external APIs, logging, etc.) @@ -452,24 +466,29 @@ async delete(req: FrameworkRequest, res: Response) { - Use field-specific errors in the `errors` object ### 3. Model Access + - Use `this.app.getModel('ModelName')` to access models - Always call `getPublic()` on model instances before returning ### 4. Validation + - Use Yup schemas for request/query validation - Validate file uploads properly - Check for duplicates before creating/updating ### 5. Pagination + - Use `Pagination` middleware for list endpoints - Always return `total`, `page`, and `limit` for paginated responses ### 6. File Uploads + - Validate file types and presence - Use `FileModel.uploadFile()` for file handling - Store file references in the database ### 7. Internationalization + - Use `req.appInfo.i18n?.t()` for all user-facing messages - Carry the English text in i18next's `defaultValue` option — `t('key', { defaultValue: 'English text' })`. Never `t('key') || 'English diff --git a/.clinerules/05-TS.md b/.clinerules/05-TS.md index 9281694..241d2ed 100644 --- a/.clinerules/05-TS.md +++ b/.clinerules/05-TS.md @@ -7,6 +7,7 @@ This project follows strict TypeScript standards to ensure type safety and code **Rule**: Avoid using the `any` type as much as possible. TypeScript's strength lies in its type system, and using `any` defeats this purpose. ### ❌ Incorrect Usage + ```typescript function processData(data: any): any { return data.someProperty; @@ -16,6 +17,7 @@ const result: any = someFunction(); ``` ### ✅ Correct Usage + ```typescript interface DataType { someProperty: string; @@ -32,6 +34,7 @@ const result: DataType = someFunction(); ## Type Definitions ### Models Should Provide Types + - Models should export proper TypeScript types for all their properties - Use the model's exported types instead of `any` - Keep the readonly Mongoose schema as the single source of truth; do not copy it @@ -73,17 +76,19 @@ validation or authorization; it throws if the model is unavailable instead of returning `false`. ### When Types Are Unknown + If the exact type is unknown, use more specific alternatives: ```typescript // Instead of 'any', use: -unknown // For truly unknown data that needs type checking -object // For objects -Record // For object with string keys -Array // For arrays of unknown items +unknown; // For truly unknown data that needs type checking +object; // For objects +Record; // For object with string keys +Array; // For arrays of unknown items ``` ### Database Documents + ```typescript // ❌ Don't use any const doc: any = await Model.findOne(); @@ -93,6 +98,7 @@ const doc: InstanceType | null = await Model.findOne(); ``` ### API Responses + ```typescript // ❌ Don't use any const response: any = await fetch('/api/data'); @@ -107,6 +113,7 @@ const response: ApiResponse = await fetch('/api/data'); ``` ### Error Handling + ```typescript // ❌ Don't use any catch (error: any) { @@ -144,16 +151,16 @@ Use TypeScript's built-in utility types: ```typescript // For partial updates -Partial +Partial; // For picking specific properties -Pick +Pick; // For omitting properties -Omit +Omit; // For making properties optional -Optional +Optional; ``` ## Important Rules diff --git a/.clinerules/06-PrivateFields.md b/.clinerules/06-PrivateFields.md index 9ecd0de..4dcec62 100644 --- a/.clinerules/06-PrivateFields.md +++ b/.clinerules/06-PrivateFields.md @@ -5,13 +5,14 @@ This project uses JavaScript private fields syntax (`#`) instead of TypeScript ` ## Use JavaScript Private Fields ### Correct Usage + ```typescript class MyClass { #privateField: string = 'private'; #privateMethod(): void { // private method implementation } - + public publicMethod(): void { this.#privateMethod(); console.log(this.#privateField); @@ -20,10 +21,12 @@ class MyClass { ``` ### Incorrect Usage + ```typescript class MyClass { private privateField: string = 'private'; // ❌ Don't use TypeScript private - private privateMethod(): void { // ❌ Don't use TypeScript private + private privateMethod(): void { + // ❌ Don't use TypeScript private // private method implementation } } @@ -46,15 +49,16 @@ class MyClass { ## Examples ### Private Properties + ```typescript class DataProcessor { #data: any[] = []; #isProcessing: boolean = false; - + addData(item: any): void { this.#data.push(item); } - + process(): void { if (this.#isProcessing) return; this.#isProcessing = true; @@ -65,22 +69,23 @@ class DataProcessor { ``` ### Private Methods + ```typescript class ApiClient { #baseUrl: string; - + constructor(baseUrl: string) { this.#baseUrl = baseUrl; } - + #buildUrl(endpoint: string): string { return `${this.#baseUrl}/${endpoint}`; } - + #handleError(error: any): void { console.error('API Error:', error); } - + async get(endpoint: string): Promise { try { const url = this.#buildUrl(endpoint); diff --git a/.clinerules/07-ErrorHandling.md b/.clinerules/07-ErrorHandling.md index 286f4ad..6d5214e 100644 --- a/.clinerules/07-ErrorHandling.md +++ b/.clinerules/07-ErrorHandling.md @@ -13,6 +13,7 @@ The Adaptive Stone framework automatically wraps controller methods and handles ## Controller Error Handling Rules ### ❌ Don't Wrap Entire Controller Methods + ```typescript async getMyList(req: FrameworkRequest, res: Response) { try { @@ -27,6 +28,7 @@ async getMyList(req: FrameworkRequest, res: Response) { ``` ### ✅ Let Framework Handle Errors + ```typescript async getMyList(req: FrameworkRequest, res: Response) { // Framework will catch and handle any errors automatically @@ -36,6 +38,7 @@ async getMyList(req: FrameworkRequest, res: Response) { ``` ### ✅ Use Try-Catch Only for Specific Cases + ```typescript async updateUserProfile(req: FrameworkRequest, res: Response) { const user = await User.findById(req.params.id); @@ -57,12 +60,14 @@ async updateUserProfile(req: FrameworkRequest, res: Response) { ## When to Use Try-Catch ### ✅ Acceptable Use Cases: + 1. **Non-critical operations** that shouldn't fail the main request 2. **External API calls** where you want to continue on failure 3. **Cleanup operations** that might fail but shouldn't affect the response 4. **Logging operations** that are supplementary to the main logic ### ❌ Don't Use For: + 1. **Main controller logic** - let framework handle these errors 2. **Database operations** - framework converts these to proper HTTP responses 3. **Validation errors** - framework handles these automatically @@ -71,6 +76,7 @@ async updateUserProfile(req: FrameworkRequest, res: Response) { ## Examples ### ✅ Good: Non-critical operation + ```typescript async createListing(req: FrameworkRequest, res: Response) { const listing = await ListingModel.create(req.appInfo.request); @@ -87,6 +93,7 @@ async createListing(req: FrameworkRequest, res: Response) { ``` ### ✅ Good: External service call + ```typescript async processPayment(req: FrameworkRequest, res: Response) { const order = await OrderModel.create(req.appInfo.request); @@ -103,6 +110,7 @@ async processPayment(req: FrameworkRequest, res: Response) { ``` ### ❌ Bad: Wrapping main logic + ```typescript async getMyAuctionsList(req: FrameworkRequest, res: Response) { try { diff --git a/.clinerules/08-Internationalization.md b/.clinerules/08-Internationalization.md index 7a9d54e..25e8c94 100644 --- a/.clinerules/08-Internationalization.md +++ b/.clinerules/08-Internationalization.md @@ -1,6 +1,6 @@ # Internationalization (i18n) Standard -This project supports multiple languages and requires proper internationalization for all user-facing strings. +This project supports multiple languages and requires proper internationalization for all user-facing strings. ## The engine is this project's dependency, not the framework's @@ -16,9 +16,10 @@ That is a silently English application, which is not what this project wants. ## Translation Requirements ### Mandatory Translation Rule + **IMPORTANT**: Whenever you add any new user-facing string (error messages, validation messages, success messages, etc.), you MUST add translations for all supported languages: - (`src/locales/#{locale}/translation.json`) +(`src/locales/#{locale}/translation.json`) ### What Requires Translation @@ -85,7 +86,7 @@ and assert localized text. Always go through the i18n service, and put the English text in i18next's `defaultValue` option. **Never** write `t('key') || 'English text'`: on a miss -`t()` returns the key *itself*, a truthy string, so the `||` branch is +`t()` returns the key _itself_, a truthy string, so the `||` branch is unreachable and the raw key ships to the client. ```typescript @@ -121,7 +122,7 @@ Use descriptive, hierarchical keys: Framework 5.4 emits every one of its own messages as `t(key, { defaultValue })` with the current English text as the default. Nothing is added to the -framework's locale files — the in-code default *is* the English source of truth +framework's locale files — the in-code default _is_ the English source of truth — and **a key present in this project's locales always wins**. So translating or rewording a built-in message needs nothing but the key in `src/locales//translation.json`. @@ -204,6 +205,7 @@ Before submitting any code with user-facing strings: ## Common Translation Categories ### Validation Messages + - `validation.required` - `validation.invalid` - `validation.tooShort` @@ -211,18 +213,21 @@ Before submitting any code with user-facing strings: - `validation.mustMatch` ### Authentication + - `auth.loginSuccess` - `auth.loginFailed` - `auth.invalidCredentials` - `auth.sessionExpired` ### General Errors + - `common.serverError` - `common.notFound` - `common.accessDenied` - `common.operationFailed` ### Success Messages + - `common.success` - `common.created` - `common.updated` diff --git a/.clinerules/09-FrameworkDocumentation.md b/.clinerules/09-FrameworkDocumentation.md index 846ddc8..024e2da 100644 --- a/.clinerules/09-FrameworkDocumentation.md +++ b/.clinerules/09-FrameworkDocumentation.md @@ -12,6 +12,7 @@ The framework documentation is stored at `.clinerules/framework-docs.md`. 1. **First, check if `.clinerules/framework-docs.md` exists** 2. **If the file does NOT exist**, inform the user to download it: + ```bash npm run docs:download ``` diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c5d2635..b0857d2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: strategy: matrix: - task: [check, 'check:types', routes, openapi] + task: [check, "check:types", routes, openapi] steps: - uses: actions/checkout@v6 @@ -22,8 +22,8 @@ jobs: fetch-depth: 0 - uses: actions/setup-node@v6 with: - node-version: '24' - cache: 'npm' + node-version: "24" + cache: "npm" - name: npm install run: npm i - name: Run Task diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c70355d..a33464a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -43,7 +43,6 @@ tests: paths: - coverage/lcov.info - # deploy_production: # image: registry.gitlab.com/adaptivestone/ubuntu-node:latest # stage: deploy diff --git a/README.md b/README.md index e0984cd..a009375 100644 --- a/README.md +++ b/README.md @@ -10,24 +10,24 @@ for installation, configuration, and API guides. This project includes working examples of the framework features commonly used when building an application. -| Feature | Where to look | -|---|---| -| Controller auto-loading, pathless route groups, and framework overrides | [`PathlessRouteGroups.ts`](src/controllers/(public)/PathlessRouteGroups.ts) is physically grouped but serves `GET /pathlessroutegroups`; [`Auth.ts`](src/controllers/(framework)/Auth.ts) stays at `/auth` and replaces the framework controller even from inside a group. | -| Standard Schema validation, generated request types, Zod input coercion, and resilient OpenAPI | [`PathlessRouteGroups.ts`](src/controllers/(public)/PathlessRouteGroups.ts) uses `z.coerce.date()` and Pagination; [`Person.ts`](src/controllers/Person.ts) validates a request body. `npm run gen` types both handlers and `npm run openapi` documents them, including Pagination's `page` and `limit`. | -| Cache with memory/Redis driver portability | [`PathlessRouteGroups.ts`](src/controllers/(public)/PathlessRouteGroups.ts) uses the default memory-backed `app.cache.getSetValue()` API; selecting Redis requires no controller change. | -| Typed HTTP errors | [`Person.ts`](src/controllers/Person.ts) throws `NotFoundError` and lets the framework render the response centrally. | -| Authentication middleware and typed authenticated users | [`Profile.ts`](src/controllers/Profile.ts) uses `GetUserByToken` + `Auth`; generated types make `req.appInfo.user` non-null. | -| Typed config and named rate-limit policies | [`rateLimiter.ts`](src/config/rateLimiter.ts) declares the policy consumed as route-level middleware by [`Person.ts`](src/controllers/Person.ts); [`http.ts`](src/config/http.ts) demonstrates homogeneous arrays generated as reusable `string[]` types. | -| Static and runtime model lookup | [`Person.ts`](src/controllers/Person.ts) uses precise literal `getModel('Person')`; [`Person.test.ts`](src/models/Person.test.ts) demonstrates the explicit throwing `getModelOrThrow(name)` boundary for a runtime string. | -| Model schemas, statics, instance methods, and virtuals | [`Person.ts`](src/models/Person.ts) keeps one readonly runtime schema, uses private schema-derived authoring contexts inside the unfinished class, and exports only the complete normal Mongoose model type. | -| Email module, custom template engines, and localized templates | [`Email.ts`](src/controllers/Email.ts), [`registerEngines.ts`](src/services/messaging/email/registerEngines.ts), and [`src/locales/`](src/locales/). | -| Overriding and translating framework messages | [`src/locales/`](src/locales/) define `middleware.auth.notLoggedIn`, so the auth 401 answers with this project's wording — and its Russian translation — instead of the framework's built-in English. See [Translating framework messages](#translating-framework-messages). | -| Bun as a second runtime | the `backend-bun` compose service runs the whole suite under Bun ≥ 1.4 via [`scripts/bun-test.sh`](scripts/bun-test.sh); [`setupBunTest.ts`](src/tests/setupBunTest.ts) is the one Bun-specific line of test glue. | -| HTTP boot hook, tested, and external observability integration | [`bootHttp.ts`](src/bootHttp.ts) holds the typed `bootHttp` hook that registers an example webhook route (`POST /webhooks/example`); [`server.ts`](src/server.ts) passes it to the production server and initializes Sentry, while [`configureServer.ts`](src/tests/configureServer.ts) passes the same hook to the test server through `configureTestServer`, so [`bootHttp.test.ts`](src/bootHttp.test.ts) covers the webhook. | -| Health checks | Built into the framework, no route needed: `GET /health/live` answers while the process serves requests, and `GET /health/ready` also pings MongoDB and answers 503 when it fails. | -| Single-process and clustered deployment | [`server.ts`](src/server.ts) is supervisor-friendly; [`index.ts`](src/index.ts) uses the public `runCluster()` helper. | -| Framework-aware testing | [`src/tests/`](src/tests/) integrates Node's test runner with the framework lifecycle; [`setupHooks.ts`](src/tests/setupHooks.ts) shows safe server readiness, and controller/model tests are colocated. | -| Operational CLI | [`src/cli.ts`](src/cli.ts) propagates command failures through the process exit code; `npm run dev` first runs `npm run cli createEnv`, so a fresh clone gets a `.env` with its own `AUTH_SALT`; `npm run routes`, `npm run openapi`, `npm run gen`, and `npm run cli migration/create -- --name=` expose routing, API contracts, generated types, and migrations. | +| Feature | Where to look | +| ---------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Controller auto-loading, pathless route groups, and framework overrides | [`PathlessRouteGroups.ts`](src/controllers/(public)/PathlessRouteGroups.ts) is physically grouped but serves `GET /pathlessroutegroups`; [`Auth.ts`](src/controllers/(framework)/Auth.ts) stays at `/auth` and replaces the framework controller even from inside a group. | +| Standard Schema validation, generated request types, Zod input coercion, and resilient OpenAPI | [`PathlessRouteGroups.ts`](src/controllers/(public)/PathlessRouteGroups.ts) uses `z.coerce.date()` and Pagination; [`Person.ts`](src/controllers/Person.ts) validates a request body. `npm run gen` types both handlers and `npm run openapi` documents them, including Pagination's `page` and `limit`. | +| Cache with memory/Redis driver portability | [`PathlessRouteGroups.ts`](src/controllers/(public)/PathlessRouteGroups.ts) uses the default memory-backed `app.cache.getSetValue()` API; selecting Redis requires no controller change. | +| Typed HTTP errors | [`Person.ts`](src/controllers/Person.ts) throws `NotFoundError` and lets the framework render the response centrally. | +| Authentication middleware and typed authenticated users | [`Profile.ts`](src/controllers/Profile.ts) uses `GetUserByToken` + `Auth`; generated types make `req.appInfo.user` non-null. | +| Typed config and named rate-limit policies | [`rateLimiter.ts`](src/config/rateLimiter.ts) declares the policy consumed as route-level middleware by [`Person.ts`](src/controllers/Person.ts); [`http.ts`](src/config/http.ts) demonstrates homogeneous arrays generated as reusable `string[]` types. | +| Static and runtime model lookup | [`Person.ts`](src/controllers/Person.ts) uses precise literal `getModel('Person')`; [`Person.test.ts`](src/models/Person.test.ts) demonstrates the explicit throwing `getModelOrThrow(name)` boundary for a runtime string. | +| Model schemas, statics, instance methods, and virtuals | [`Person.ts`](src/models/Person.ts) keeps one readonly runtime schema, uses private schema-derived authoring contexts inside the unfinished class, and exports only the complete normal Mongoose model type. | +| Email module, custom template engines, and localized templates | [`Email.ts`](src/controllers/Email.ts), [`registerEngines.ts`](src/services/messaging/email/registerEngines.ts), and [`src/locales/`](src/locales/). | +| Overriding and translating framework messages | [`src/locales/`](src/locales/) define `middleware.auth.notLoggedIn`, so the auth 401 answers with this project's wording — and its Russian translation — instead of the framework's built-in English. See [Translating framework messages](#translating-framework-messages). | +| Bun as a second runtime | the `backend-bun` compose service runs the whole suite under Bun ≥ 1.4 via [`scripts/bun-test.sh`](scripts/bun-test.sh); [`setupBunTest.ts`](src/tests/setupBunTest.ts) is the one Bun-specific line of test glue. | +| HTTP boot hook, tested, and external observability integration | [`bootHttp.ts`](src/bootHttp.ts) holds the typed `bootHttp` hook that registers an example webhook route (`POST /webhooks/example`); [`server.ts`](src/server.ts) passes it to the production server and initializes Sentry, while [`configureServer.ts`](src/tests/configureServer.ts) passes the same hook to the test server through `configureTestServer`, so [`bootHttp.test.ts`](src/bootHttp.test.ts) covers the webhook. | +| Health checks | Built into the framework, no route needed: `GET /health/live` answers while the process serves requests, and `GET /health/ready` also pings MongoDB and answers 503 when it fails. | +| Single-process and clustered deployment | [`server.ts`](src/server.ts) is supervisor-friendly; [`index.ts`](src/index.ts) uses the public `runCluster()` helper. | +| Framework-aware testing | [`src/tests/`](src/tests/) integrates Node's test runner with the framework lifecycle; [`setupHooks.ts`](src/tests/setupHooks.ts) shows safe server readiness, and controller/model tests are colocated. | +| Operational CLI | [`src/cli.ts`](src/cli.ts) propagates command failures through the process exit code; `npm run dev` first runs `npm run cli createEnv`, so a fresh clone gets a `.env` with its own `AUTH_SALT`; `npm run routes`, `npm run openapi`, `npm run gen`, and `npm run cli migration/create -- --name=` expose routing, API contracts, generated types, and migrations. | ## Runtime support diff --git a/biome.json b/biome.json index 5c48489..30afa81 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.5.6/schema.json", + "$schema": "https://biomejs.dev/schemas/2.6.3/schema.json", "vcs": { "enabled": true, "clientKind": "git", diff --git a/docker-compose.yml b/docker-compose.yml index 816a02f..842a05d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -53,12 +53,12 @@ services: - 27017:27017 entrypoint: [ - '/usr/bin/mongod', - '--bind_ip_all', - '--wiredTigerCacheSizeGB', - '1', - '--replSet', - 'rs0' + "/usr/bin/mongod", + "--bind_ip_all", + "--wiredTigerCacheSizeGB", + "1", + "--replSet", + "rs0", ] healthcheck: test: test $$(mongosh --quiet --eval "try {rs.initiate({_id:'rs0',members:[{_id:0,host:'mongo:27017'}]})} catch(e) {rs.status().ok}") -eq 1 diff --git a/package-lock.json b/package-lock.json index f3aa671..5adff71 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,19 +9,19 @@ "version": "1.1.0", "license": "ISC", "dependencies": { - "@adaptivestone/framework": "^5.5.0", - "@adaptivestone/framework-module-email": "^2.1.0", - "@sentry/node": "^11.2.0", - "i18next": "^26.0.1", - "i18next-fs-backend": "^2.0.0", - "zod": "^4.0.0" + "@adaptivestone/framework": "^5.6.0", + "@adaptivestone/framework-module-email": "^2.1.1", + "@sentry/node": "^11.9.0", + "i18next": "^26.5.11", + "i18next-fs-backend": "^2.6.9", + "zod": "^4.6.7" }, "devDependencies": { - "@biomejs/biome": "^2.0.6", - "@types/express": "^5.0.1", - "mongodb-memory-server": "^11.0.0", - "nodemon": "^3.0.1", - "oxc-parser": "^0.152.0", + "@biomejs/biome": "^2.6.3", + "@types/express": "^5.0.6", + "mongodb-memory-server": "^11.3.0", + "nodemon": "^3.1.14", + "oxc-parser": "^0.156.0", "typescript": "^7.0.2" }, "engines": { @@ -29,9 +29,9 @@ } }, "node_modules/@adaptivestone/framework": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@adaptivestone/framework/-/framework-5.5.0.tgz", - "integrity": "sha512-i6Q0Mv4l2dBMWKSD3T3he8K1RvCUNRoFunsILZtpNU10xB2Kh6MEW5UrZgotH1IvmFHaoIo4r71R95MI9vCw2Q==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@adaptivestone/framework/-/framework-5.6.0.tgz", + "integrity": "sha512-Tae9B6wxrQqXu/4OfPZZ8yqMoqgR76MIxDHk4GHVDGB9K4fCD7dUZCg4BxbzoLkgM9QXVTlsAGwFISA3caqPIA==", "license": "MIT", "dependencies": { "deepmerge": "^4.2.2", @@ -54,7 +54,7 @@ "i18next": "^26.0.1", "i18next-fs-backend": "^2.0.0", "mongodb-memory-server": "^11.0.0", - "oxc-parser": "^0.152.0", + "oxc-parser": "^0.156.0", "vitest": "^4.0.0 || ^5.0.0", "yup": "^1.7.0", "zod": "^3.24.0 || ^4.0.0" @@ -96,16 +96,16 @@ } }, "node_modules/@adaptivestone/framework-module-email": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@adaptivestone/framework-module-email/-/framework-module-email-2.1.0.tgz", - "integrity": "sha512-JhdFM0bwutSwYMFILV4GaAFww9Ddvjjt354zpZ9k6LPyte2VTdsEackFC0qlEK+qOuyAO3ckkoMGdNUSjujnKg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@adaptivestone/framework-module-email/-/framework-module-email-2.1.1.tgz", + "integrity": "sha512-DCz9kVB6ZtKij+0bZFy4unL3F5NXEi/JEQysvpmmBH7tay+yVP5aaAqUQ/+VtLX9ri6oAzDlz0t1tizWLOX9Yg==", "license": "MIT", "peer": true, "dependencies": { "deepmerge": "^4.3.1", - "html-to-text": "^10.0.0", - "juice": "^12.1.0", - "nodemailer": "^9.0.1", + "html-to-text": "^10.0.1", + "juice": "^12.2.1", + "nodemailer": "^10.2.1", "nodemailer-stub-transport": "^1.1.0" }, "engines": { @@ -113,9 +113,9 @@ } }, "node_modules/@biomejs/biome": { - "version": "2.5.11", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.5.11.tgz", - "integrity": "sha512-Tj0dnkLPdW0ASjHfj2D/ZkkvPU2wrFmnE1jWTD2xzV1ycapV1DutbYXk4NDnR3rYTi1ZCbNFD4G2gRMEY65WaA==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.6.3.tgz", + "integrity": "sha512-va/0xPku7wnfzv+D8Zpdm5uKiGJWiV8neqoEPnRjvNQQwhl4tVXS4fETs4H0CCB2rGeqJ4cu9y4iOZOnOYKAUA==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -129,20 +129,56 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.5.11", - "@biomejs/cli-darwin-x64": "2.5.11", - "@biomejs/cli-linux-arm64": "2.5.11", - "@biomejs/cli-linux-arm64-musl": "2.5.11", - "@biomejs/cli-linux-x64": "2.5.11", - "@biomejs/cli-linux-x64-musl": "2.5.11", - "@biomejs/cli-win32-arm64": "2.5.11", - "@biomejs/cli-win32-x64": "2.5.11" + "@biomejs/cli-android-arm64": "2.6.3", + "@biomejs/cli-android-x64": "2.6.3", + "@biomejs/cli-darwin-arm64": "2.6.3", + "@biomejs/cli-darwin-x64": "2.6.3", + "@biomejs/cli-linux-arm64": "2.6.3", + "@biomejs/cli-linux-arm64-musl": "2.6.3", + "@biomejs/cli-linux-x64": "2.6.3", + "@biomejs/cli-linux-x64-musl": "2.6.3", + "@biomejs/cli-win32-arm64": "2.6.3", + "@biomejs/cli-win32-x64": "2.6.3" + } + }, + "node_modules/@biomejs/cli-android-arm64": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-android-arm64/-/cli-android-arm64-2.6.3.tgz", + "integrity": "sha512-5JD7QQDEHxdeEb4sftEHG+lsuUyu8Cob/hVLqRELbgGlFl68Rldv/PPi2k4dRjERZ/EItJ3O6Xmv8lqsEtUBiw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-android-x64": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-android-x64/-/cli-android-x64-2.6.3.tgz", + "integrity": "sha512-70WOGKCgpT+Uqg6LFdTLqefV54/DypdZg+LnBQDO6AWvkgXO+9xhVClajQyDsIHYjnXMtI1pRO5sP+zMXlS/bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.21.3" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.5.11", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.5.11.tgz", - "integrity": "sha512-6SGZxoKbXvUjMn1t6A98HqWISPnGNbYs0R/Rt2JarmXBSev+lva4QxUMWEBX9lX1Wo1XTJ78uk5xVDtG58SRZg==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.6.3.tgz", + "integrity": "sha512-ezf+XEKeyJ2yYlBhrzyEEHLvfRYrhtNKc6maLzR/WcAcBccb4RVDeFxsymjBve2LO0bpIMRUAiS90D4bUBRT0A==", "cpu": [ "arm64" ], @@ -157,9 +193,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.5.11", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.5.11.tgz", - "integrity": "sha512-nYkXY7tLBEgnGbYapDKAyKzgt44ZEyG+AKalvTXtCWKYgepI9dw327q+cVgedxm+Udi1ZzHKUyZrIusHi/KQbw==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.6.3.tgz", + "integrity": "sha512-Lg2tFdg4elJo+7i707PpLMs6N1hATVt4kqDo6MD/q/VnPs8rsKReKXsz1TA5GNdfRVAQNJ5GRiyK2EwNptK+MA==", "cpu": [ "x64" ], @@ -174,9 +210,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.5.11", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.5.11.tgz", - "integrity": "sha512-3PVLSTD9RR73rvVPt5G3T1gc+ycggWEGfTD7RvzzbtcDPD27NxgxBbAFfpm7DXJKW6VLHWE1lLMGvFt2Qxjcow==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.6.3.tgz", + "integrity": "sha512-8Stcvq98n1gs9VyLKuaWrnsd8kbXE2nKDAHtuLHGSYdGyNWN5JIIm5a28xdnmgdKzKHmiDgYyATetkEv7+zGow==", "cpu": [ "arm64" ], @@ -191,9 +227,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.5.11", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.5.11.tgz", - "integrity": "sha512-qhyZUMyCbWYFV2bAwRNVvfMVZ+hv7WYl6mossGrxC+uiQQXhvsuWWU8zz6jYX0mChZd9MgQZbm4vozTmG/5iGw==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.6.3.tgz", + "integrity": "sha512-dYU70A89OFHzakQPE9VOPbE60JNcQt4mtxvUGQl+EgTkGtqCFxLD2RUn1SbiMu8Mu5xFscS1bfYDpoasaUrqNA==", "cpu": [ "arm64" ], @@ -208,9 +244,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.5.11", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.5.11.tgz", - "integrity": "sha512-JOytptlsgM33B2MMFUg8iBrb4IKpbD5JnJrSeYiaFEeAj4vuXx0iQSQZ4qK7sqyMtfjZxxPdNdMZZVL4y/mFyA==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.6.3.tgz", + "integrity": "sha512-CShmx0bO6BngywT3minv8K1xsQX1ig1vsBqYTLnmDY3mBiDYHlaLRIsdHoM1pEU9dV3BN5a0uiH0IGDtYh9TWA==", "cpu": [ "x64" ], @@ -225,9 +261,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.5.11", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.5.11.tgz", - "integrity": "sha512-oRRlrchG5EfrEL/EmtT1qUjSNHk3/5LGeZhQqADBBAJF1b1ET6964xEKe7aGlGARzDfza8H/seEsFJl7S6Ql9w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.6.3.tgz", + "integrity": "sha512-j6eFjUcWSphmgVTbrobEMA0wdbfNHKrGi8hRsFkc17jeS1n7nHwFACxp6jWqe9sxQqyFAeyOgt2/1bOGVcbATA==", "cpu": [ "x64" ], @@ -242,9 +278,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.5.11", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.5.11.tgz", - "integrity": "sha512-e49E6K9hzH/ohJNx8Y26mY8HaV4I4ZViIeoqhKsmoXLKHhQnMeBAVqCgsGf2Wa3lXlS7RkporDXMHHWkzvZzFw==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.6.3.tgz", + "integrity": "sha512-00SthDxBPwNiT7IL/mOneif6fiEU1PXK875zhr+InpeZjovY1mF5tCuDhXo1Hh0GYyiKHKzLbItzn58SAyLhJQ==", "cpu": [ "arm64" ], @@ -259,9 +295,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.5.11", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.5.11.tgz", - "integrity": "sha512-QSQr/KjOgXA7OzXJUWS+oguKyAZ3Q0l/lnlDGbu397eKo83atuWUjBPJrsqbKNF6CARGw8XXJLGzpHC8Ryhd4Q==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.6.3.tgz", + "integrity": "sha512-GhtOPphBWlnCepqpNk/w5eGN5oGRCzL20EbAkL1XCIpyboeVC9R642noyT43l8LSenGS4qz9IL8sKPfwY37V/Q==", "cpu": [ "x64" ], @@ -276,18 +312,18 @@ } }, "node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.1.tgz", + "integrity": "sha512-dTmUJzXSuayBK+hZydEaXd2mhx61qWQwkwaBBY6LyEOVx/L9aQU5ac8eFNEsd9nrD1+zb9zvDCphLSe8g1F4Qw==", "license": "MIT", "engines": { "node": ">=0.1.90" } }, "node_modules/@csstools/selector-resolve-nested": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-4.0.1.tgz", - "integrity": "sha512-j3vdQu0XwLME5qOTWxm8cnmvsf423R2YL6DbKklCHZwkDm7UdKNu6RPlw4REIJhSlKBICY3B70/7QZdicLqZgg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-4.0.2.tgz", + "integrity": "sha512-JpjNBJFA+4OnAHKRK4AMp8xrYyLhI9XapOeBlP2PhRU/IylSw+1ep3BFNTksBJnrTS3KT6kqKNVfpzLLwZUW5Q==", "funding": [ { "type": "github", @@ -307,9 +343,9 @@ } }, "node_modules/@csstools/selector-specificity": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-6.0.0.tgz", - "integrity": "sha512-4sSgl78OtOXEX/2d++8A83zHNTgwCJMaR24FvsYL7Uf/VS8HZk9PTwR51elTbGqMuwH3szLvvOXEaVnqn0Z3zA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-6.0.1.tgz", + "integrity": "sha512-MBuqFIIvqk4S593MGAskTkPpEUUzZNvGzh8mMxEwl3oHwjQlXmqHEDxNbN3Y0Tsh+xjmem4GZjeg7I0qkwBivg==", "funding": [ { "type": "github", @@ -329,9 +365,9 @@ } }, "node_modules/@dabh/diagnostics": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", - "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.9.tgz", + "integrity": "sha512-R6siwR65Hm+3yfgP7o8DKhNvputQAwfoz9zTc3kyDudnomj2/BcLmD+uGQQPICjuFUp8ounPBU+jmKsocwVVAg==", "license": "MIT", "dependencies": { "@so-ric/colorspace": "^1.1.6", @@ -346,9 +382,9 @@ "license": "MIT" }, "node_modules/@mongodb-js/saslprep": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.4.13.tgz", - "integrity": "sha512-E3Sv4eCYAlKYUTx8S3ioQcDUscOif+8zZ5OnW1IzJ+Tt+EO+ke8mn+Y3FX6N1H79picwbdOavVOb1jPi2EOyrg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.6.1.tgz", + "integrity": "sha512-D4CQtk9IwjCLAvCf1xvHEod3960q8XMUzfmdRU9qjUNlHnesGuTOvJcOTaPm9koZ1caUKA2aTbszZiAkcmSgmg==", "license": "MIT", "dependencies": { "sparse-bitfield": "^3.0.3" @@ -367,9 +403,9 @@ } }, "node_modules/@opentelemetry/api": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", - "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.10.0.tgz", + "integrity": "sha512-lMkyes8iHrG+mk6WH7X70MdCLI2RS0FwNBY1PyQ8UemaijE2m5mv5A0Niy3HtbYTFrgkUEQjFMXmSAk2hQDuPQ==", "license": "Apache-2.0", "peer": true, "engines": { @@ -377,12 +413,13 @@ } }, "node_modules/@oxc-parser/binding-android-arm-eabi": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.152.0.tgz", - "integrity": "sha512-393VtirINkae4XHBTkq/yQxhOwEr4V+r0et37P2fp+sYZSdYgZTRDPo5Um8vBh0QjMZ+RmaMy4PP0qwr4cTMwA==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.156.0.tgz", + "integrity": "sha512-RMq7DKNzEp1T51QKNLTn0NryNEt2IYfh7mZBlIdi2Ju52ltOEDMeIXv0XBpA6dL7j7ChjlcovtGcc1Jv4qMipg==", "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -393,12 +430,13 @@ } }, "node_modules/@oxc-parser/binding-android-arm64": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.152.0.tgz", - "integrity": "sha512-iYFcExATJNZ0rZj0o02THbD1Nc9jAW0nVgIQPee6ejbSASpbZXlIMw8jxtpzaG14JQTWwGSZ6U5dEtRJXE6V3Q==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.156.0.tgz", + "integrity": "sha512-mwkWKhOBpmh8fWc3m4MiLsmEAtx0YuHmvyo9ff557cnb3QZ2kt2eauSz75wCGIpiZG3gUsJ4WwzEjm4R4/BHig==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -409,12 +447,13 @@ } }, "node_modules/@oxc-parser/binding-darwin-arm64": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.152.0.tgz", - "integrity": "sha512-fnU+DfUzi5/rFy0LzmipYRz06PAUUkOS8kCJQ3Eg6oqlunC1XZXoffFqxmdL51RmcbYtUG3P8DVG1U5fckoa2A==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.156.0.tgz", + "integrity": "sha512-6pGR5fUszM9M4eBBapqpGjCRJolFwuCldx8bRQjqXyM09cQysBTWVF2Ttg4UNJVxYSaw5RRINbveCOOCrsuGvA==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -425,12 +464,13 @@ } }, "node_modules/@oxc-parser/binding-darwin-x64": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.152.0.tgz", - "integrity": "sha512-Y3U2okryWTs7hDld6UhjJwLNf8/do+x4g4C+1U5SiGwrTLwbO83WJYJA8+l9iFSilWBgnfpd/+U76tfeNxUHzA==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.156.0.tgz", + "integrity": "sha512-M9QghL7uCAqMKjYJv1rDGblfEvkeQu3QzTPd7Uwo16gG3uO7m9ikVQ9OL8FZTnKzU4vbCEby6kTlEkqN+JeEMA==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -441,12 +481,13 @@ } }, "node_modules/@oxc-parser/binding-freebsd-x64": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.152.0.tgz", - "integrity": "sha512-XkhkRrrPffEw+ZLv/d/5pEni0buxinm/E/N6fLbJCunD1DBbeCTtVP23ESV+4CWCWdSz397asks1ViGslpmWiQ==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.156.0.tgz", + "integrity": "sha512-lX0ANxSwAOrpOT7NHB+YsrBqDJ8sOVon5m7GS9eQtkuUeNzQMMGpFsJLsStawTbrdwOF5KDVxgPWcKmt/DIZUQ==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -457,12 +498,13 @@ } }, "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.152.0.tgz", - "integrity": "sha512-MLzsRRbdfmdzo6JEhbC1yKU9ItfvM8tEf18HM32jCiNYZEz6J3bRBRl3cTkKR0vBdrk9ZVlcARXtwHccs+epDA==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.156.0.tgz", + "integrity": "sha512-iPgYpasRcqk7X3TGncQg7B+6RotDvG8weug0UrgF+FXLf4KmaNDyT91BKONlqbHcNgK9Nryp7AEZGuQn32fP6g==", "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -473,12 +515,13 @@ } }, "node_modules/@oxc-parser/binding-linux-arm-musleabihf": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.152.0.tgz", - "integrity": "sha512-HHerTEJz7Iy10Ji6BGsk4gqG6PU0UzFuBu91jIEOX89FnrI5ECWSEr7BLpkYQhp7U0QFtMnBhNfQKI0hYZK78w==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.156.0.tgz", + "integrity": "sha512-sJqJDEZevtkEfoxrXfaRTkSt6Itckr549cIfBbs11UgXv8bFyqQsXTQa6iKm8mTiWYmCDDFJf7TLnqxcbqzPOw==", "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -489,12 +532,13 @@ } }, "node_modules/@oxc-parser/binding-linux-arm64-gnu": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.152.0.tgz", - "integrity": "sha512-9Bb8GyzZ2uSLzRDZ27usaKokr07mxiBe2dDF5b6bd2janmaJTT1gL51UfP7AU30yFiXrJvcRyFKREAgKwZYs0w==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.156.0.tgz", + "integrity": "sha512-mrQs5OdRiqKskRuWEORPKT6YGIFhrpVvCvL9hqVaIh60EzgR4qjPvSsV6hWZcOfyWHBTbdEvfnDJPh/eQlxPRQ==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -505,12 +549,13 @@ } }, "node_modules/@oxc-parser/binding-linux-arm64-musl": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.152.0.tgz", - "integrity": "sha512-om7iDMUroI74A/lfRRWY9/Ev3VWrVsrUZ4tyvyh8raBey/sdcfyAD7tYWc+iykAiotnmftyKTpUKFr1QnaBrAQ==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.156.0.tgz", + "integrity": "sha512-ZtPqgCU3+wpU7dvX7YbaEiw71r0UdguzuPhcx4PIEZSs4XFqc6F5wXCtNdb6M7m3DMErlxrwosryoXrzYOY/Gg==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -521,12 +566,13 @@ } }, "node_modules/@oxc-parser/binding-linux-ppc64-gnu": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.152.0.tgz", - "integrity": "sha512-Lf1OL2lMTqwDMFC6jnRb30B+WYHKV0XT+bPHcFM6xHtNVwxpobiTzUIvKH6a0LWpvfwyru8Yu6zCGHqqFHH+gg==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.156.0.tgz", + "integrity": "sha512-ZuGRT/adReZZJn3PYNneb1HQIOH0iIZ2fzFgC1/XJYpMQ5KsRKmWIEzy3wEFsUwIOTomCmnmTZ/zbFYo9z9VeA==", "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -537,12 +583,13 @@ } }, "node_modules/@oxc-parser/binding-linux-riscv64-gnu": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.152.0.tgz", - "integrity": "sha512-BYWSMQK+YJ9ZILStPcmmiSVq8KEG9Qdq/c4BHPC3rUEq/fEDCVjUIwdj5ZzjgZ9P9is9PKu0tcAXzq1ZXg4urQ==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.156.0.tgz", + "integrity": "sha512-T+iWCeAOoEAJpHqr6/pogHIv98g9p8Ctccysm/h962hG4ayX5OL2c0Ih4oYe+JuFndLXy/OASvwMlTPe76sIiw==", "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -553,12 +600,13 @@ } }, "node_modules/@oxc-parser/binding-linux-riscv64-musl": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.152.0.tgz", - "integrity": "sha512-d2LqHNNNqdH185sRK5dPKWZu201JrNu9/CRFuVEuT+ht7n/QaVblEMWT9MALQPrDWYvhG10P+NSKJFquDWZ09w==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.156.0.tgz", + "integrity": "sha512-wL55bI2kVKfwdxScbw60zVgzAqbQbmE5zpSPWPZoZ9RSG8egm6ITE/UWE5mDWlglxz1QElJCcUbpaJCtHD11BQ==", "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -569,12 +617,13 @@ } }, "node_modules/@oxc-parser/binding-linux-s390x-gnu": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.152.0.tgz", - "integrity": "sha512-8gBeHt5rA/8+pKhHl+zLggfa3L/V/L2at96p7ty6pBE7id6lFO19nFUc15u2PcjC4OYeYK465MKy1fhhbpFIGw==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.156.0.tgz", + "integrity": "sha512-+D+JilhLqwrDLODYEl4qtovVwgxKALb23FkAWBiPvgmUWYgjCV83KKuwwxZJM8GCdKlNA1vt3iKtow8HUFjXtg==", "cpu": [ "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -585,12 +634,13 @@ } }, "node_modules/@oxc-parser/binding-linux-x64-gnu": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.152.0.tgz", - "integrity": "sha512-ltgrSF6L+yPTVsIdaAyqKq3zTqzj/1VlNbxWZuxAe8flR3sWdyNsKvdXukoO8/ucJbLickhmieRBge+o/e8Ugw==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.156.0.tgz", + "integrity": "sha512-jRfwpN4xKrsEpC+SgrUPY5k0mINYZn7aLrt22I3uQFoumiSgHgsLYgS9f84ntbkvSydH4HiwGuDa2b1XCHaJzw==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -601,12 +651,13 @@ } }, "node_modules/@oxc-parser/binding-linux-x64-musl": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.152.0.tgz", - "integrity": "sha512-LcMp6BvrBnewSfdkLHoSqidhoAq4syKOTBV5TYHWd+2VnGkfD/nPRRVIzTBt/Lkbt7pfOFDGtkiTntFS0p6sQQ==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.156.0.tgz", + "integrity": "sha512-P/ajnypgLmxmuRRyCIZcp2o4lOwmCaXYH5+eqDTcCW+MCTI+csKSw/Zc6GB67jZoVa4ey3q1jXEt7S60adBEMQ==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -617,12 +668,13 @@ } }, "node_modules/@oxc-parser/binding-openharmony-arm64": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.152.0.tgz", - "integrity": "sha512-jbhoMCslVxzRCRNQ8TSHxjYdSKRvk8O6ciLVDkahJvmyHDzBqba/bMQHM6ULKj/rgHNNbSzlIiakdx8SEfkJzA==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.156.0.tgz", + "integrity": "sha512-WSN6rQZZc9KqgZ4lMfjVDvqKhVOCjey/YEZIPisGXmwBqwgWOzru207dyiH50LHcf1n9LO2oceGk/id6RL9v0g==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -633,12 +685,13 @@ } }, "node_modules/@oxc-parser/binding-win32-arm64-msvc": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.152.0.tgz", - "integrity": "sha512-JZYVlhv36mr/nertnRB7vchJECOBb1Lz6lltalILsB+o9M/is+H6BEDRLQKdqA4JKs6NjJszo46+iM5sfwj6jQ==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.156.0.tgz", + "integrity": "sha512-l21Tz6tjraGBC3JefVeJZ9pojD0fCiB62PydAv+i9nrqJX7z/pDmyDNYLamDr/PRcQ4UQbFwkSnz7NKBB9UMLw==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -649,12 +702,13 @@ } }, "node_modules/@oxc-parser/binding-win32-ia32-msvc": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.152.0.tgz", - "integrity": "sha512-1X9oganvVsunRH0lH10UU05N+H9atpX6WsOybByUjwnfcd3h/0tYwvuv16XuHglrIUOnxV2TodbLVEwwafd64g==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.156.0.tgz", + "integrity": "sha512-CUq0ZFl/RODqPiIgfNNSamkpTj5x8AjBTkR/y1DNVIQiTGnmWqjHcn3o08ZW3q/LgkI4g9G9g6UirmmQFvuOZw==", "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -665,12 +719,13 @@ } }, "node_modules/@oxc-parser/binding-win32-x64-msvc": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.152.0.tgz", - "integrity": "sha512-sw0M80/dn9rcpu+Rqqph/C+MjvDDce6MlXmFjsNQtPEymha0eJy3ml6+foSUTqFfpDIDyHZZ4eoJ43IoMe8bJw==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.156.0.tgz", + "integrity": "sha512-dcpx5Y1x2v/cs7U/q3SZMvmxfyXjVvqC86jMuw2ZZUbHDd7W2cW7uSMQfg3GLVaE68Su3H9xd/Pc4v6QNyeSRg==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -681,9 +736,10 @@ } }, "node_modules/@oxc-project/types": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.152.0.tgz", - "integrity": "sha512-oM/5rLBm2tPkg0iBgkH/FOeR3PCDpY19GTgAZjMFM8h9WI9VW7cLgzp6nwtarYKmovavIQZ+Fe/RKX/8C8O/Rw==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.156.0.tgz", + "integrity": "sha512-1Duyg48TdJNdyhEB8Xn1L36bT9Pv6GUtlKjHxOys8xkaF/rQq3XJE+bAurSK/AgIz5mGFsb77cn9Pb20+WCScw==", + "devOptional": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/oxc-project" @@ -715,12 +771,12 @@ } }, "node_modules/@sentry/bundler-plugins": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@sentry/bundler-plugins/-/bundler-plugins-11.2.0.tgz", - "integrity": "sha512-ytSfzWJA+c4UhkUjAiiL8qIXujU2Ih6PbR8Ex6YCqoJXEHHDiZWJPWbaxgmzqKGrYBimp6UfgYn/CvK0/uksAg==", + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/@sentry/bundler-plugins/-/bundler-plugins-11.9.0.tgz", + "integrity": "sha512-wpz/gcM/6rld/wb4Mhf8kbDN9ngG5myKQSZC+45gzqR1w+GcdfVnYkp3sHL9AV4mrwL8skhTItdUghMwMTknKg==", "license": "MIT", "dependencies": { - "@sentry/core": "11.2.0", + "@sentry/core": "11.9.0", "dotenv": "^17.4.2", "glob": "^13.0.6", "magic-string": "~0.30.8 || ^1.0.0", @@ -729,98 +785,419 @@ "supports-color": "^8.1.1" }, "engines": { - "node": ">=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0" - }, - "peerDependencies": { - "@babel/core": "^7.18.5", - "rollup": ">=3.2.0", - "webpack": ">=5.1.0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "rollup": { - "optional": true - }, - "webpack": { - "optional": true - } + "node": ">=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0" + }, + "peerDependencies": { + "rollup": ">=3.2.0", + "webpack": ">=5.1.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/@oxc-parser/binding-android-arm-eabi": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.152.0.tgz", + "integrity": "sha512-393VtirINkae4XHBTkq/yQxhOwEr4V+r0et37P2fp+sYZSdYgZTRDPo5Um8vBh0QjMZ+RmaMy4PP0qwr4cTMwA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/@oxc-parser/binding-android-arm64": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.152.0.tgz", + "integrity": "sha512-iYFcExATJNZ0rZj0o02THbD1Nc9jAW0nVgIQPee6ejbSASpbZXlIMw8jxtpzaG14JQTWwGSZ6U5dEtRJXE6V3Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/@oxc-parser/binding-darwin-arm64": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.152.0.tgz", + "integrity": "sha512-fnU+DfUzi5/rFy0LzmipYRz06PAUUkOS8kCJQ3Eg6oqlunC1XZXoffFqxmdL51RmcbYtUG3P8DVG1U5fckoa2A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/@oxc-parser/binding-darwin-x64": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.152.0.tgz", + "integrity": "sha512-Y3U2okryWTs7hDld6UhjJwLNf8/do+x4g4C+1U5SiGwrTLwbO83WJYJA8+l9iFSilWBgnfpd/+U76tfeNxUHzA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/@oxc-parser/binding-freebsd-x64": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.152.0.tgz", + "integrity": "sha512-XkhkRrrPffEw+ZLv/d/5pEni0buxinm/E/N6fLbJCunD1DBbeCTtVP23ESV+4CWCWdSz397asks1ViGslpmWiQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.152.0.tgz", + "integrity": "sha512-MLzsRRbdfmdzo6JEhbC1yKU9ItfvM8tEf18HM32jCiNYZEz6J3bRBRl3cTkKR0vBdrk9ZVlcARXtwHccs+epDA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/@oxc-parser/binding-linux-arm-musleabihf": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.152.0.tgz", + "integrity": "sha512-HHerTEJz7Iy10Ji6BGsk4gqG6PU0UzFuBu91jIEOX89FnrI5ECWSEr7BLpkYQhp7U0QFtMnBhNfQKI0hYZK78w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/@oxc-parser/binding-linux-arm64-gnu": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.152.0.tgz", + "integrity": "sha512-9Bb8GyzZ2uSLzRDZ27usaKokr07mxiBe2dDF5b6bd2janmaJTT1gL51UfP7AU30yFiXrJvcRyFKREAgKwZYs0w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/@oxc-parser/binding-linux-arm64-musl": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.152.0.tgz", + "integrity": "sha512-om7iDMUroI74A/lfRRWY9/Ev3VWrVsrUZ4tyvyh8raBey/sdcfyAD7tYWc+iykAiotnmftyKTpUKFr1QnaBrAQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/@oxc-parser/binding-linux-ppc64-gnu": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.152.0.tgz", + "integrity": "sha512-Lf1OL2lMTqwDMFC6jnRb30B+WYHKV0XT+bPHcFM6xHtNVwxpobiTzUIvKH6a0LWpvfwyru8Yu6zCGHqqFHH+gg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/@oxc-parser/binding-linux-riscv64-gnu": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.152.0.tgz", + "integrity": "sha512-BYWSMQK+YJ9ZILStPcmmiSVq8KEG9Qdq/c4BHPC3rUEq/fEDCVjUIwdj5ZzjgZ9P9is9PKu0tcAXzq1ZXg4urQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/@oxc-parser/binding-linux-riscv64-musl": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.152.0.tgz", + "integrity": "sha512-d2LqHNNNqdH185sRK5dPKWZu201JrNu9/CRFuVEuT+ht7n/QaVblEMWT9MALQPrDWYvhG10P+NSKJFquDWZ09w==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/@oxc-parser/binding-linux-s390x-gnu": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.152.0.tgz", + "integrity": "sha512-8gBeHt5rA/8+pKhHl+zLggfa3L/V/L2at96p7ty6pBE7id6lFO19nFUc15u2PcjC4OYeYK465MKy1fhhbpFIGw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/@oxc-parser/binding-linux-x64-gnu": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.152.0.tgz", + "integrity": "sha512-ltgrSF6L+yPTVsIdaAyqKq3zTqzj/1VlNbxWZuxAe8flR3sWdyNsKvdXukoO8/ucJbLickhmieRBge+o/e8Ugw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/@oxc-parser/binding-linux-x64-musl": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.152.0.tgz", + "integrity": "sha512-LcMp6BvrBnewSfdkLHoSqidhoAq4syKOTBV5TYHWd+2VnGkfD/nPRRVIzTBt/Lkbt7pfOFDGtkiTntFS0p6sQQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/@oxc-parser/binding-openharmony-arm64": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.152.0.tgz", + "integrity": "sha512-jbhoMCslVxzRCRNQ8TSHxjYdSKRvk8O6ciLVDkahJvmyHDzBqba/bMQHM6ULKj/rgHNNbSzlIiakdx8SEfkJzA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/@oxc-parser/binding-win32-arm64-msvc": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.152.0.tgz", + "integrity": "sha512-JZYVlhv36mr/nertnRB7vchJECOBb1Lz6lltalILsB+o9M/is+H6BEDRLQKdqA4JKs6NjJszo46+iM5sfwj6jQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/@oxc-parser/binding-win32-ia32-msvc": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.152.0.tgz", + "integrity": "sha512-1X9oganvVsunRH0lH10UU05N+H9atpX6WsOybByUjwnfcd3h/0tYwvuv16XuHglrIUOnxV2TodbLVEwwafd64g==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@sentry/bundler-plugins/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@sentry/bundler-plugins/node_modules/@oxc-parser/binding-win32-x64-msvc": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.152.0.tgz", + "integrity": "sha512-sw0M80/dn9rcpu+Rqqph/C+MjvDDce6MlXmFjsNQtPEymha0eJy3ml6+foSUTqFfpDIDyHZZ4eoJ43IoMe8bJw==", + "cpu": [ + "x64" + ], "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@sentry/bundler-plugins/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/@sentry/bundler-plugins/node_modules/@oxc-project/types": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.152.0.tgz", + "integrity": "sha512-oM/5rLBm2tPkg0iBgkH/FOeR3PCDpY19GTgAZjMFM8h9WI9VW7cLgzp6nwtarYKmovavIQZ+Fe/RKX/8C8O/Rw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/oxc-project" + } + }, + "node_modules/@sentry/bundler-plugins/node_modules/oxc-parser": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.152.0.tgz", + "integrity": "sha512-ZztsZgaCWmPeKYMdoTT5e0oV/oxD1NeLWNR3kAtr/G707cUPYaaozRlVDHLCGnszHJRszN9mJwmPNpqgwloC0A==", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@oxc-project/types": "^0.152.0" }, "engines": { - "node": ">=10" + "node": "^20.19.0 || >=22.12.0" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sponsors/oxc-project" + }, + "optionalDependencies": { + "@oxc-parser/binding-android-arm-eabi": "0.152.0", + "@oxc-parser/binding-android-arm64": "0.152.0", + "@oxc-parser/binding-darwin-arm64": "0.152.0", + "@oxc-parser/binding-darwin-x64": "0.152.0", + "@oxc-parser/binding-freebsd-x64": "0.152.0", + "@oxc-parser/binding-linux-arm-gnueabihf": "0.152.0", + "@oxc-parser/binding-linux-arm-musleabihf": "0.152.0", + "@oxc-parser/binding-linux-arm64-gnu": "0.152.0", + "@oxc-parser/binding-linux-arm64-musl": "0.152.0", + "@oxc-parser/binding-linux-ppc64-gnu": "0.152.0", + "@oxc-parser/binding-linux-riscv64-gnu": "0.152.0", + "@oxc-parser/binding-linux-riscv64-musl": "0.152.0", + "@oxc-parser/binding-linux-s390x-gnu": "0.152.0", + "@oxc-parser/binding-linux-x64-gnu": "0.152.0", + "@oxc-parser/binding-linux-x64-musl": "0.152.0", + "@oxc-parser/binding-openharmony-arm64": "0.152.0", + "@oxc-parser/binding-win32-arm64-msvc": "0.152.0", + "@oxc-parser/binding-win32-ia32-msvc": "0.152.0", + "@oxc-parser/binding-win32-x64-msvc": "0.152.0" } }, "node_modules/@sentry/conventions": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@sentry/conventions/-/conventions-0.24.0.tgz", - "integrity": "sha512-pmmF2mLy7A23z8gnLRG87lYu4SSPIBColtfqu9cfkh1omn/0CI3w0/AqZ/uf/VGAtM/wJMN61J58Ks/IWBCHpQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@sentry/conventions/-/conventions-0.27.0.tgz", + "integrity": "sha512-Mrqd/o7n/z7qWSYfQQA7x4fFTA0IqOG6JNsbBpnC97khPwZk7n6DPtOO7YgaYplSl8R8QLRbBz9Xv2lVhToSAg==", "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/@sentry/core": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-11.2.0.tgz", - "integrity": "sha512-vkJDLDVk0WmMN7cixXULEkW2sopJwcTP3ODFkdrRFUJILARHS855TzJ3WG7WarNXtlzKY6ALzmsGPzHMZQfMrA==", + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-11.9.0.tgz", + "integrity": "sha512-t0dZyHILt2XVC4Fe9UmAty6YRfOuQv95cvWeNl+HlW4LphjF5/jkALV3cJCUMdhpblYELgIJC4U/S/GoYuI2bA==", "license": "MIT", "peer": true, "dependencies": { - "@sentry/conventions": "^0.24.0" + "@sentry/conventions": "^0.27.0" }, "engines": { "node": ">=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0" } }, "node_modules/@sentry/node": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-11.2.0.tgz", - "integrity": "sha512-1dxeMjIi60nTOoeixlHD/Ygb6acPag0rTPDk331c/ztzrGBjKleOTqss2yoewo/WOK4gSwRXJs5gxgdq3WCIVg==", + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-11.9.0.tgz", + "integrity": "sha512-cz219PzVaAPTlQ4bRBTRBCOvxbZkXK0KkqyqWPV6OmSn6vWn935CTfOs+MKUc1A+locvB8i9OfBIbO6v03BBuQ==", "license": "MIT", "peer": true, "dependencies": { "@opentelemetry/api": "^1.9.1", - "@sentry/bundler-plugins": "11.2.0", - "@sentry/conventions": "^0.24.0", - "@sentry/core": "11.2.0", - "@sentry/opentelemetry": "11.2.0", - "@sentry/server-runtime-injection": "11.2.0", - "@sentry/server-utils": "11.2.0" + "@sentry/bundler-plugins": "11.9.0", + "@sentry/conventions": "^0.27.0", + "@sentry/core": "11.9.0", + "@sentry/opentelemetry": "11.9.0", + "@sentry/server-runtime-injection": "11.9.0", + "@sentry/server-utils": "11.9.0" }, "engines": { "node": ">=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0" } }, "node_modules/@sentry/opentelemetry": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-11.2.0.tgz", - "integrity": "sha512-QE8o8gkFX87Z47VdYFzax+l545zNC8Alj8lPL+0wCWG6GOA2qQVPbv3Vl1XGKVOCgxWS/TSz8ObWZMrSrFaHfg==", + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-11.9.0.tgz", + "integrity": "sha512-FMCkAbEfBpFterrkR7k4P8LEabUAEHjZMbu+ycDjbnI1U4pT22tpwcFJOt06orFkacoWNsYT9+EdfmkvaCKtSA==", "license": "MIT", "dependencies": { - "@sentry/conventions": "^0.24.0", - "@sentry/core": "11.2.0" + "@sentry/conventions": "^0.27.0", + "@sentry/core": "11.9.0" }, "engines": { "node": ">=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0" @@ -830,27 +1207,27 @@ } }, "node_modules/@sentry/server-runtime-injection": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@sentry/server-runtime-injection/-/server-runtime-injection-11.2.0.tgz", - "integrity": "sha512-DhIUNIYxpSsLX1IGbVf05mbNhelcRbDGP0r0vnEVGUPuqaWBDMz1I8oJKjfJhFUCU8RYAad4azBIW0PHgJVdhA==", + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/@sentry/server-runtime-injection/-/server-runtime-injection-11.9.0.tgz", + "integrity": "sha512-Q2G5xaeoiYwGheCZyeqZ/v//SZYjRLlITlanTsZM/fox1qk7cmbDX7+o4q+JkApVV9VuXQZVxppaVCsBglfDKA==", "license": "MIT", "dependencies": { - "@sentry/core": "11.2.0", - "@sentry/server-utils": "11.2.0" + "@sentry/core": "11.9.0", + "@sentry/server-utils": "11.9.0" }, "engines": { "node": ">=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0" } }, "node_modules/@sentry/server-utils": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@sentry/server-utils/-/server-utils-11.2.0.tgz", - "integrity": "sha512-duhMoTBmf3W/opOexQGtcsb5cCDOhOrM0hBMGvGGtu6LinGyEgnz3OQzlI9AFZgYiJpAkyIUkh2QOwo3vqWJiQ==", + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/@sentry/server-utils/-/server-utils-11.9.0.tgz", + "integrity": "sha512-xHETix5jAjs/4tY+b9RCejEU7O49pNBiGgCWX0KFRMSpWbw9moqQ8i8N62bS7L+/BJnBcZ5SZ1nweXh7w787Qg==", "license": "MIT", "dependencies": { "@opentelemetry/api": "^1.9.1", - "@sentry/conventions": "^0.24.0", - "@sentry/core": "11.2.0" + "@sentry/conventions": "^0.27.0", + "@sentry/core": "11.9.0" }, "engines": { "node": ">=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0" @@ -926,13 +1303,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "26.1.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.2.tgz", - "integrity": "sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==", + "version": "26.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.5.tgz", + "integrity": "sha512-uMzsv9stDdofIZBx4UGh4Z9ZgXnGC9seRDscilBcTHAeOFk67MZg/k9bWVfO+bk4qZmG+l52hRnLwUiH2LnJTg==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~8.3.0" + "undici-types": "~8.9.0" } }, "node_modules/@types/qs": { @@ -1400,9 +1777,9 @@ } }, "node_modules/b4a": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", - "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.9.0.tgz", + "integrity": "sha512-dpfcF9fDNR6++cthXR67iyhgqWy9CBouAvIWhIntzBG6cvK/cnIPiZQjBwi/ZqjjBEDGfoNDtmB0kTjroOJ3pQ==", "devOptional": true, "license": "Apache-2.0", "peerDependencies": { @@ -1424,9 +1801,9 @@ } }, "node_modules/bare-events": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.1.tgz", - "integrity": "sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.2.tgz", + "integrity": "sha512-AIPKioV7/Y/8KfZ3AAhjPJxLLbY49S64Ym5DakZlUg75qQiTgUq9hEJoEwa4eUezPUlXRy/i5NpsKvo9jgKmoA==", "devOptional": true, "license": "Apache-2.0", "peer": true, @@ -1440,9 +1817,9 @@ } }, "node_modules/bare-fs": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.4.tgz", - "integrity": "sha512-y1kC+ffIx/tPLdTE693uNjHfzTfr+ravR5tvWlMXe25nELbkqV400S71qHDwbkAQ1FVEZobB1NFRzFbCCcyBCQ==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.8.4.tgz", + "integrity": "sha512-MPC2eyrpbk3A873sK4y6rk+Iv4o2enxTjHZ8zH3HO0mjrpm5XjnguY2XmfidIsDV6vnjpbMBKUAJpV0ISD2SsQ==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -1453,7 +1830,7 @@ "fast-fifo": "^1.3.2" }, "engines": { - "bare": ">=1.16.0" + "bare": ">=1.28.0" }, "peerDependencies": { "bare-buffer": "*" @@ -1465,16 +1842,16 @@ } }, "node_modules/bare-path": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.1.1.tgz", - "integrity": "sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.1.2.tgz", + "integrity": "sha512-ZyKbsuuqK6Ag0K8pX6V5Txq6XeJRvY+wXucnFGRjiyVYP9YWDpIQugk/b+enRYrEYBJaqLzghRQpXPMR7341Nw==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/bare-stream": { - "version": "2.13.3", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.3.tgz", - "integrity": "sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==", + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.4.tgz", + "integrity": "sha512-PcrQ8lVLbiJscNm1Kez+Yp4Gy4AHGcN1lzwjvf5NybWen7VvEgUfyfnXYJ2zNqWnzOfCb1Abq6lH8ti0syQszA==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -1500,9 +1877,9 @@ } }, "node_modules/bare-url": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.6.tgz", - "integrity": "sha512-iQxPClE07hETVpbRoX7JXX3v/ZQViCxe/SYCxylRLzdEx1xJAufPptfiOqR8tqiCtmbtMDANKWszzjLu1PMAZQ==", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.5.5.tgz", + "integrity": "sha512-iM9qJCruvpt2rPaLsrumVDru9pogI7PHziHIa9kTNRFt8C8HuSa+kI9kFezK+NvHEFnnz71rKGZ1EAilq/3V/Q==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -1523,18 +1900,18 @@ } }, "node_modules/body-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", - "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.4.0.tgz", + "integrity": "sha512-Ifk1KcLrxaGt1occQagQNFNNOqRt1LFuehEnHHzB8Z6cRgIxRU1TBaiIsUiCdA+gy5PL7Y1IX31DNKkRmxtXjQ==", "license": "MIT", "dependencies": { "bytes": "^3.1.2", - "content-type": "^2.0.0", + "content-type": "^2.1.0", "debug": "^4.4.3", "http-errors": "^2.0.1", - "iconv-lite": "^0.7.2", + "iconv-lite": "^0.7.3", "on-finished": "^2.4.1", - "qs": "^6.15.2", + "qs": "^6.16.1", "raw-body": "^3.0.2", "type-is": "^2.1.0" }, @@ -1546,19 +1923,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/body-parser/node_modules/content-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", - "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -1566,9 +1930,9 @@ "license": "ISC" }, "node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -1591,9 +1955,9 @@ } }, "node_modules/bson": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/bson/-/bson-7.3.1.tgz", - "integrity": "sha512-h/C0qe6857pQhcSJHLfsR1uYGj98Ge3wKAD3Ed9KqH3wcVh+BM4Jq4xISD7vs9OPuT07n+q3QQVjslJ286j6ag==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/bson/-/bson-7.3.3.tgz", + "integrity": "sha512-oz3LwE3qGEhTCSyhzQRLY3Bj1NLOsjFMf6tcmY5J8M+3R7EVcmoBfSHWvjUK3yXCLDUsGpIuB3aQL4nDZ1EV/g==", "license": "Apache-2.0", "engines": { "node": ">=20.19.0" @@ -1780,9 +2144,9 @@ "license": "MIT" }, "node_modules/content-disposition": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", - "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-2.0.1.tgz", + "integrity": "sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==", "license": "MIT", "engines": { "node": ">=18" @@ -1793,12 +2157,16 @@ } }, "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/cookie": { @@ -2130,15 +2498,15 @@ } }, "node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.3.0.tgz", + "integrity": "sha512-qCqy1xSoaugxOD4IVHb1ZWdkvCF2W3aE2okKouWj8VwJ+ztskSiXoBnCSJqfKT+cVPJhuJqe9YLbY425+Zh00g==", "license": "MIT", "dependencies": { "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", + "body-parser": "^2.3.0", + "content-disposition": "^2.0.1", + "content-type": "^2.0.0", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", @@ -2154,14 +2522,14 @@ "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", + "proxy-addr": "^2.0.8", + "qs": "^6.16.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", - "type-is": "^2.0.1", + "type-is": "^2.1.0", "vary": "^1.1.2" }, "engines": { @@ -2258,9 +2626,9 @@ "license": "MIT" }, "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.2.tgz", + "integrity": "sha512-/kVP2U8z596Ia0gwFrwyIeo74ta5aVmSeU1FfAUMAmcEP5EP7zydmag3SLiN64NaRKef3lxsq7i/g7ltJQDGow==", "devOptional": true, "funding": [ { @@ -2417,13 +2785,12 @@ } }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-symbols": { @@ -2535,9 +2902,9 @@ } }, "node_modules/i18next": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.4.0.tgz", - "integrity": "sha512-rsmK5bFqsD1AetSFSIa43wtNR4WpvvH4p0tLEsTxkC7QTrfdFm06nbQ95bh8Og4wwaCnUEcm9DVYL2cgxitiQg==", + "version": "26.5.11", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.5.11.tgz", + "integrity": "sha512-Wc0klBPKxqZ2tL2qdAnF8xvvnWgr1IMGSY2ikTiAvaFVbz7xiFARtkoU4RidBDw1SyziGROp0qxu6qnJ7l2Wug==", "funding": [ { "type": "individual", @@ -2564,9 +2931,9 @@ } }, "node_modules/i18next-fs-backend": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/i18next-fs-backend/-/i18next-fs-backend-2.6.7.tgz", - "integrity": "sha512-nN2TIycyR/d+OVuLm1ugPyOlMprqPRnQ7QktBgn44F3H8l7TeTH4ffHJ7nUsd4QVJfetWW7/VZ3s+4g7FoAZUA==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/i18next-fs-backend/-/i18next-fs-backend-2.6.9.tgz", + "integrity": "sha512-YZ5PQUV9xnAeh45CCSQW095wYDWZEwKse/1wr3m0z0Mij5zoCFMs67Q3M+w/9un8fUruubMR4DzETnDGH85heQ==", "license": "MIT", "peer": true }, @@ -2673,9 +3040,9 @@ } }, "node_modules/juice": { - "version": "12.1.2", - "resolved": "https://registry.npmjs.org/juice/-/juice-12.1.2.tgz", - "integrity": "sha512-qNFegEEo14v4aCh0OwdWhGsHKoxWx6RYl1GyzMhxNHfFnVGFi+MFgAiJ6pyFWPw0KucvPwmHctXPZwrsD0ufqg==", + "version": "12.2.1", + "resolved": "https://registry.npmjs.org/juice/-/juice-12.2.1.tgz", + "integrity": "sha512-tbyBK+Ifmx95xRB2XET205DAz67Oq8A5SG+gV8GzBzzf0oRVhpo+Wh1KTkC12emlyZallR/ZsG8FJ1LcM4P17Q==", "license": "MIT", "dependencies": { "cheerio": "1.2.0", @@ -2695,9 +3062,9 @@ } }, "node_modules/juice/node_modules/entities": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", - "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.1.0.tgz", + "integrity": "sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==", "license": "BSD-2-Clause", "engines": { "node": ">=20.19.0" @@ -2707,9 +3074,9 @@ } }, "node_modules/kareem": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-3.3.0.tgz", - "integrity": "sha512-kpSuLD3/7RenBnjnJdOHXCKC8dTd1JzeOiJhN0necWWci6cC+qX+VuwPnMVgb+a4+KNJSfgqahpnfWaeDXCimw==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-3.4.1.tgz", + "integrity": "sha512-UlgCAFNAdk/HLSsbfkmbH8pJqpEN52Ek8RG53Ys1i3Q3gbCQruSrWpplZlgIGyDHX/LNoLW97ei3OG43s7UhUA==", "license": "Apache-2.0", "engines": { "node": ">=18.0.0" @@ -2760,6 +3127,15 @@ "node": ">= 12.0.0" } }, + "node_modules/logform/node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/lru-cache": { "version": "11.5.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz", @@ -2770,9 +3146,9 @@ } }, "node_modules/magic-string": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.2.tgz", - "integrity": "sha512-vG+rjFRj1PqdIBozIxAGMjPlOhaVe+GXpbttY/iSK7rGcJRMlwNJO7dcUwmUqkymsFLJiNGI06t4D7Fr7yRC9g==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.5.tgz", + "integrity": "sha512-oLLC2+YvQUfAa+vxoufE/yc1icb87M9iXIRqAoR/2EhE/8cb3SF/+Gi0c2By1B+5Vz2e2vQtUvHiu1+63Znh+w==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.6.0" @@ -2909,6 +3285,7 @@ "version": "7.5.0", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.5.0.tgz", "integrity": "sha512-5FnrEDLnvp6ycUOGLNLLU33BfCx2qmp2mJjGPDwKLruYsVzXVSK5fsGpoDXvsXJwBfBsD7ebMRdawbDxC2814g==", + "devOptional": true, "license": "Apache-2.0", "dependencies": { "@mongodb-js/saslprep": "^1.4.11", @@ -2965,15 +3342,15 @@ } }, "node_modules/mongodb-memory-server": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-11.2.0.tgz", - "integrity": "sha512-506AD8qvClVx8Raw/WhAUUWBgIXPyi856iC01aa5vAzHmn6WOXC6ulvudkTF7oTMzJxkyA0A84VpD4BpyfqJ9w==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-11.3.0.tgz", + "integrity": "sha512-8ZCDrraqKqmAikoeKuEq+16jeWdVKwjtEAuMxxeQctHiGSGYt17W9LmoRzV1Nwnz7owyxwDKMhow4IVkNYYRKw==", "devOptional": true, "hasInstallScript": true, "license": "MIT", "peer": true, "dependencies": { - "mongodb-memory-server-core": "11.2.0", + "mongodb-memory-server-core": "11.3.0", "tslib": "^2.8.1" }, "engines": { @@ -2981,9 +3358,9 @@ } }, "node_modules/mongodb-memory-server-core": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-11.2.0.tgz", - "integrity": "sha512-vOoDtn0JiLrHvZY81Rp/UtKXXK0rtJHZGZFVnccvJwYitPLNspO0Ty0grqFQOe7iAET8+GI4zAQcphg+R3vxQg==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-11.3.0.tgz", + "integrity": "sha512-QBu/RsRpBfcNd5CrBDfCzqcaFPaYpivUzGYUy9YgVc3up78ff0gIHQVD9PLmBLOOxFX6BM9hU6YT0HocZH+s1g==", "devOptional": true, "license": "MIT", "dependencies": { @@ -2993,28 +3370,28 @@ "find-cache-dir": "^3.3.2", "follow-redirects": "^1.16.0", "https-proxy-agent": "^7.0.6", - "mongodb": "^7.2.0", + "mongodb": "~7.5.0", "new-find-package-json": "^2.0.0", - "semver": "^7.7.3", - "tar-stream": "^3.1.8", + "semver": "^7.8.5", + "tar-stream": "^3.2.1", "tslib": "^2.8.1", - "yauzl": "^3.3.1" + "yauzl": "^3.4.0" }, "engines": { "node": ">=20.19.0" } }, "node_modules/mongoose": { - "version": "9.9.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-9.9.1.tgz", - "integrity": "sha512-hI00baDVPjV5VfYA3j+oLuPvLfmCQICWot9zJZgkuDMXnWEYhIx9xCPEOt2IC3lDJz6ajsz2bpgO24E+xsP6wg==", + "version": "9.11.4", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-9.11.4.tgz", + "integrity": "sha512-+xME0fduXl1sWF+NZpJHZaNcwQSt+X2vbJ/h7GRSZ/ltLycAkGZSEABhzic0+q3IMF66KqF0viEE5+frchKCAQ==", "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.1.0", - "kareem": "3.3.0", - "mongodb": "~7.5", + "kareem": "3.4.1", + "mongodb": "~7.7", "mpath": "0.9.0", - "mquery": "6.0.0", + "mquery": "6.0.1", "ms": "2.1.3", "sift": "17.1.3" }, @@ -3026,6 +3403,52 @@ "url": "https://opencollective.com/mongoose" } }, + "node_modules/mongoose/node_modules/mongodb": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.7.0.tgz", + "integrity": "sha512-XG1xXEqyouAV8GCb3PuRaujofeXKpAJAPvXYWZgHl6Dz4QHSJ1nRLl0+GpqaLTwKvC0RFE9truOur34RNFY1nw==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.5.0", + "bson": "^7.3.2", + "mongodb-connection-string-url": "^7.0.2" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.806.0", + "@mongodb-js/zstd": "^7.0.0", + "gcp-metadata": "^7.0.1", + "kerberos": "^7.0.0", + "mongodb-client-encryption": "^7.2.0", + "snappy": "^7.3.2", + "socks": "^2.8.6" + }, + "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/mpath": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", @@ -3036,9 +3459,9 @@ } }, "node_modules/mquery": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-6.0.0.tgz", - "integrity": "sha512-b2KQNsmgtkscfeDgkYMcWGn9vZI9YoXh802VDEwE6qc50zxBFQ0Oo8ROkawbPAsXCY1/Z1yp0MagqsZStPWJjw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-6.0.1.tgz", + "integrity": "sha512-/Nijmq3JcpHwDM+5CwBp5yEl6fUa6jLsIhPsoQywlGXU/ZrKIvSpBzfaGnW9BLqcne/CoUwd1ch7MRqptDgFTA==", "license": "MIT", "engines": { "node": ">=20.19.0" @@ -3051,9 +3474,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.18", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", - "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "version": "3.3.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", + "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", "funding": [ { "type": "github", @@ -3069,12 +3492,19 @@ } }, "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.1.0.tgz", + "integrity": "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==", "license": "MIT", + "dependencies": { + "content-type": "^2.1.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/new-find-package-json": { @@ -3091,12 +3521,12 @@ } }, "node_modules/nodemailer": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-9.1.0.tgz", - "integrity": "sha512-xj1Ri5Sau3qpPffHJwi2bY0oWVVWYq62Ph17l+2v1xXpxjqTls3YPc3L8dub9mcJpxj+1ucNnuYVqLlgh4pmDA==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-10.2.1.tgz", + "integrity": "sha512-ZrDNsPFoDMwefNs7sJwrYiEJ/CG4ClJWDZv05iNJsEBWa8GRDry1QJHTJxsuTAY9eDDKjX4k+q3SxslXJOao7w==", "license": "MIT-0", "engines": { - "node": ">=6.0.0" + "node": ">=20.0.0" } }, "node_modules/nodemailer-stub-transport": { @@ -3134,6 +3564,29 @@ "url": "https://opencollective.com/nodemon" } }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -3169,15 +3622,19 @@ } }, "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.2.tgz", + "integrity": "sha512-ATWUv387i+nLD49EiDoOft5scf32Vsdz3ktrQJG9bi7jRFmaXTssvyvj1EmeKVVgvesbqUtvQQvaS2TpTukAZQ==", "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/once": { @@ -3199,13 +3656,14 @@ } }, "node_modules/oxc-parser": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.152.0.tgz", - "integrity": "sha512-ZztsZgaCWmPeKYMdoTT5e0oV/oxD1NeLWNR3kAtr/G707cUPYaaozRlVDHLCGnszHJRszN9mJwmPNpqgwloC0A==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.156.0.tgz", + "integrity": "sha512-7JhjgOfZjrIFJH5TlHrpRua864Si5GvwrPr5+eIRCY2sszhKXo6pyhP0HQKOGTtfO4UowwZ72XTGba0+lZphOQ==", + "devOptional": true, "license": "MIT", "peer": true, "dependencies": { - "@oxc-project/types": "^0.152.0" + "@oxc-project/types": "^0.156.0" }, "engines": { "node": "^20.19.0 || >=22.12.0" @@ -3214,25 +3672,25 @@ "url": "https://github.com/sponsors/oxc-project" }, "optionalDependencies": { - "@oxc-parser/binding-android-arm-eabi": "0.152.0", - "@oxc-parser/binding-android-arm64": "0.152.0", - "@oxc-parser/binding-darwin-arm64": "0.152.0", - "@oxc-parser/binding-darwin-x64": "0.152.0", - "@oxc-parser/binding-freebsd-x64": "0.152.0", - "@oxc-parser/binding-linux-arm-gnueabihf": "0.152.0", - "@oxc-parser/binding-linux-arm-musleabihf": "0.152.0", - "@oxc-parser/binding-linux-arm64-gnu": "0.152.0", - "@oxc-parser/binding-linux-arm64-musl": "0.152.0", - "@oxc-parser/binding-linux-ppc64-gnu": "0.152.0", - "@oxc-parser/binding-linux-riscv64-gnu": "0.152.0", - "@oxc-parser/binding-linux-riscv64-musl": "0.152.0", - "@oxc-parser/binding-linux-s390x-gnu": "0.152.0", - "@oxc-parser/binding-linux-x64-gnu": "0.152.0", - "@oxc-parser/binding-linux-x64-musl": "0.152.0", - "@oxc-parser/binding-openharmony-arm64": "0.152.0", - "@oxc-parser/binding-win32-arm64-msvc": "0.152.0", - "@oxc-parser/binding-win32-ia32-msvc": "0.152.0", - "@oxc-parser/binding-win32-x64-msvc": "0.152.0" + "@oxc-parser/binding-android-arm-eabi": "0.156.0", + "@oxc-parser/binding-android-arm64": "0.156.0", + "@oxc-parser/binding-darwin-arm64": "0.156.0", + "@oxc-parser/binding-darwin-x64": "0.156.0", + "@oxc-parser/binding-freebsd-x64": "0.156.0", + "@oxc-parser/binding-linux-arm-gnueabihf": "0.156.0", + "@oxc-parser/binding-linux-arm-musleabihf": "0.156.0", + "@oxc-parser/binding-linux-arm64-gnu": "0.156.0", + "@oxc-parser/binding-linux-arm64-musl": "0.156.0", + "@oxc-parser/binding-linux-ppc64-gnu": "0.156.0", + "@oxc-parser/binding-linux-riscv64-gnu": "0.156.0", + "@oxc-parser/binding-linux-riscv64-musl": "0.156.0", + "@oxc-parser/binding-linux-s390x-gnu": "0.156.0", + "@oxc-parser/binding-linux-x64-gnu": "0.156.0", + "@oxc-parser/binding-linux-x64-musl": "0.156.0", + "@oxc-parser/binding-openharmony-arm64": "0.156.0", + "@oxc-parser/binding-win32-arm64-msvc": "0.156.0", + "@oxc-parser/binding-win32-ia32-msvc": "0.156.0", + "@oxc-parser/binding-win32-x64-msvc": "0.156.0" } }, "node_modules/p-limit": { @@ -3430,9 +3888,9 @@ } }, "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "version": "8.5.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.32.tgz", + "integrity": "sha512-LJlKCCAUFKOuZxipUdYw1NzIITEsPcgyOG9LkvRJvuKj/bRzbuRY0ARXvL0pWGpsZvn8jku+LMep2eU0seHp8g==", "funding": [ { "type": "opencollective", @@ -3450,18 +3908,18 @@ "license": "MIT", "peer": true, "dependencies": { - "nanoid": "^3.3.17", + "nanoid": "^3.3.20", "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "source-map-js": "^1.2.2" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-nesting": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-14.0.1.tgz", - "integrity": "sha512-80MH7KcmMtb7ffSBX82uZwnogltubaXF0sagu+OGD8M9jViR3ngRgCdoTzKCvKEtllB0MW2U7Rgfcub5fR1Bug==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-14.0.3.tgz", + "integrity": "sha512-S6NJP2WFinT50vIo7fu3Z8PrTgng3P0ky47a5wQSrQpsH3WS82ZpjkIdAs+2ltRkk0wU7vRBKLYM96qY0RvKjA==", "funding": [ { "type": "github", @@ -3474,8 +3932,8 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/selector-resolve-nested": "^4.0.1", - "@csstools/selector-specificity": "^6.0.0", + "@csstools/selector-resolve-nested": "^4.0.2", + "@csstools/selector-specificity": "^6.0.1", "postcss-selector-parser": "^7.1.1" }, "engines": { @@ -3486,9 +3944,9 @@ } }, "node_modules/postcss-safe-parser": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", - "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.1.0.tgz", + "integrity": "sha512-1WzZxRLaAFwEh6Do+zyGpjWV3nGJNxxhuh7Ubu/q1ICImMgZJnLwhoaEpRbG4pJppp2Y1ncL9ffA2f+LhrefQg==", "funding": [ { "type": "opencollective", @@ -3512,9 +3970,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz", - "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.7.tgz", + "integrity": "sha512-wWBro/7hJ40ye6TPiXkUQoXKCw23xSsjriUvqd7Uls9Sso3oLiON1flc18cCdnjgCRXw4fBVqUJJeOdDTh3P3g==", "license": "MIT", "peer": true, "dependencies": { @@ -3526,9 +3984,9 @@ } }, "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.8.tgz", + "integrity": "sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==", "license": "MIT", "dependencies": { "forwarded": "0.2.0", @@ -3536,6 +3994,10 @@ }, "engines": { "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/pstree.remy": { @@ -3555,9 +4017,9 @@ } }, "node_modules/qs": { - "version": "6.15.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", - "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.17.0.tgz", + "integrity": "sha512-5LK5BZ2XDHMvcUJaf0CQ5HL3aVgKbpklvByC7qLSxYkfE8COEEbJg5xCHWCTqzqi0Gs4Jn5Mv5v3R38W6edscA==", "license": "BSD-3-Clause", "dependencies": { "es-define-property": "^1.0.1", @@ -3584,9 +4046,9 @@ } }, "node_modules/rate-limiter-flexible": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-11.2.0.tgz", - "integrity": "sha512-L0eIK+BmFMi6NcvmtEg7RSswOFKi9MMD5RhBIypFfOve+G6Jl1Xbb8qEHgK3uRzNtkOFYF0L9f7P4rSf2PnUVw==", + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-11.2.3.tgz", + "integrity": "sha512-w4HX4toAsEbu1VksOauZwI9d6URb6/4WqJJ5Hg1bESihMt2KJfQ2iTwvDkhIg+y2HetLh65DGu/8xIkUz/xNPA==", "license": "ISC" }, "node_modules/raw-body": { @@ -3863,9 +4325,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -3899,9 +4361,9 @@ } }, "node_modules/streamx": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.0.tgz", - "integrity": "sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==", + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.1.tgz", + "integrity": "sha512-zEzXb0s5Cds7tqMH6rhZ05lcJydCWiQPEwiNngVqzsxCc962vLY4Uw+mW7od8kDH258k2Uz/JrOkdIAAhSh9VA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -3920,29 +4382,31 @@ } }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/tar-stream": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.0.tgz", - "integrity": "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.2.tgz", + "integrity": "sha512-+8NeqHRjQWH9nYlwo2gamAMImZCVzI4UoEgDpWorBt9OEfppiZn+uSkskzQKPWIZyji/C8fpWO7u69G0DX0tbg==", "devOptional": true, "license": "MIT", "dependencies": { - "b4a": "^1.6.4", - "bare-fs": "^4.5.5", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" + "b4a": "^1.9.0", + "bare-fs": "^4.8.2", + "fast-fifo": "^1.3.2", + "streamx": "^2.28.1" } }, "node_modules/teex": { @@ -4049,19 +4513,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/type-is/node_modules/content-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", - "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/typescript": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", @@ -4106,18 +4557,18 @@ "license": "MIT" }, "node_modules/undici": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", - "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", + "version": "7.30.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.30.1.tgz", + "integrity": "sha512-03KrMbjIFDWQR5RNPrSw3bd1r12JpyFQl9/yxjUbJtqkjmllqC5lFjZh6ujeuJCKr8EOQvRW872Oy/az+nLYxg==", "license": "MIT", "engines": { "node": ">=20.18.1" } }, "node_modules/undici-types": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", - "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz", + "integrity": "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==", "dev": true, "license": "MIT" }, @@ -4301,9 +4752,9 @@ } }, "node_modules/zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.7.tgz", + "integrity": "sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==", "license": "MIT", "peer": true, "funding": { diff --git a/package.json b/package.json index 9442b20..0ee59ef 100644 --- a/package.json +++ b/package.json @@ -58,19 +58,19 @@ }, "license": "ISC", "dependencies": { - "@adaptivestone/framework": "^5.5.0", - "@adaptivestone/framework-module-email": "^2.1.0", - "@sentry/node": "^11.2.0", - "i18next": "^26.0.1", - "i18next-fs-backend": "^2.0.0", - "zod": "^4.0.0" + "@adaptivestone/framework": "^5.6.0", + "@adaptivestone/framework-module-email": "^2.1.1", + "@sentry/node": "^11.9.0", + "i18next": "^26.5.11", + "i18next-fs-backend": "^2.6.9", + "zod": "^4.6.7" }, "devDependencies": { - "@biomejs/biome": "^2.0.6", - "@types/express": "^5.0.1", - "mongodb-memory-server": "^11.0.0", - "nodemon": "^3.0.1", - "oxc-parser": "^0.152.0", + "@biomejs/biome": "^2.6.3", + "@types/express": "^5.0.6", + "mongodb-memory-server": "^11.3.0", + "nodemon": "^3.1.14", + "oxc-parser": "^0.156.0", "typescript": "^7.0.2" }, "overrides": {