From 08fe77d1e53effe2028a12b505a23fa35f1f050a Mon Sep 17 00:00:00 2001 From: Vinayak Sarawagi Date: Fri, 18 Apr 2025 09:37:28 +0530 Subject: [PATCH 1/3] feat(core): introduce scheduling functionality and enhance core package - Added scheduling capabilities with the new Schedule class and related decorators. - Implemented ScheduleServiceTest for handling scheduled tasks. - Updated package.json to include new schedule module and dependencies. - Enhanced IntentExplorer to support schedule lookups. - Introduced console commands for listing scheduled tasks. - Improved error handling for duplicate schedules and class-based schedules without a handle method. - Updated various components to integrate with the new scheduling system. --- integrations/sample-app/app/boot/sp/app.ts | 30 +- .../sample-app/app/services/schedule.ts | 15 + integrations/sample-app/package.json | 6 +- package-lock.json | 5679 ++++++----------- packages/core/lib/console/consoleIO.ts | 2 +- packages/core/lib/console/logger.ts | 16 +- .../core/lib/database/commands/migrations.ts | 4 +- packages/core/lib/explorer.ts | 41 + packages/core/lib/rest/foundation/server.ts | 2 +- packages/core/lib/scheduler/console/list.ts | 24 + packages/core/lib/scheduler/constants.ts | 2 + packages/core/lib/scheduler/decorator.ts | 23 + .../errors/class-schedule-with-no-handle.ts | 5 + .../errors/schedule-already-exists.ts | 5 + packages/core/lib/scheduler/index.ts | 5 + packages/core/lib/scheduler/metadata.ts | 31 + .../core/lib/scheduler/options/interface.ts | 21 + packages/core/lib/scheduler/schedule-run.ts | 90 + packages/core/lib/scheduler/schedule.ts | 310 + packages/core/lib/scheduler/worker.ts | 18 + packages/core/lib/serviceProvider.ts | 2 + packages/core/package.json | 5 + 22 files changed, 2707 insertions(+), 3629 deletions(-) create mode 100644 integrations/sample-app/app/services/schedule.ts create mode 100644 packages/core/lib/scheduler/console/list.ts create mode 100644 packages/core/lib/scheduler/constants.ts create mode 100644 packages/core/lib/scheduler/decorator.ts create mode 100644 packages/core/lib/scheduler/errors/class-schedule-with-no-handle.ts create mode 100644 packages/core/lib/scheduler/errors/schedule-already-exists.ts create mode 100644 packages/core/lib/scheduler/index.ts create mode 100644 packages/core/lib/scheduler/metadata.ts create mode 100644 packages/core/lib/scheduler/options/interface.ts create mode 100644 packages/core/lib/scheduler/schedule-run.ts create mode 100644 packages/core/lib/scheduler/schedule.ts create mode 100644 packages/core/lib/scheduler/worker.ts diff --git a/integrations/sample-app/app/boot/sp/app.ts b/integrations/sample-app/app/boot/sp/app.ts index 35dffb9..753cd36 100644 --- a/integrations/sample-app/app/boot/sp/app.ts +++ b/integrations/sample-app/app/boot/sp/app.ts @@ -5,6 +5,8 @@ import { QueueJobs } from '#jobs/job'; import { UserDbRepository } from '#repositories/userDbRepository'; import { UserService } from '#services/index'; import { AuthService } from '#services/auth'; +import { ScheduleServiceTest } from '#services/schedule'; +import { Schedule } from '@intentjs/core/schedule'; export class AppServiceProvider extends ServiceProvider { /** @@ -29,10 +31,36 @@ export class AppServiceProvider extends ServiceProvider { this.bind(QueueJobs); this.bind(OrderPlacedListener); + + this.bind(ScheduleServiceTest); } /** * Bootstrap any application service here. */ - boot(app: IntentApplicationContext) {} + boot(app: IntentApplicationContext) { + /** + * Schedule Intent Command to run daily. + */ + Schedule.command('send:email').daily(); + + /** + * Simple callback, with lifecycle methods `before` and `after`. + */ + Schedule.call(() => console.log('inside the schedule method')) + .purpose('sample scheduler') + .before(() => console.log('this will run before the cron')) + .after(() => console.log('this will run after the cron')) + .everyFiveSeconds(); + + /** + * Running a job every day at 5AM. + */ + Schedule.job({ + job: 'process_abandoned_cart', + data: { from: '2024-04-16', to: '2024-04-17' }, + }) + .purpose('cron dispatching job every day at 5AM') + .at('5 AM'); + } } diff --git a/integrations/sample-app/app/services/schedule.ts b/integrations/sample-app/app/services/schedule.ts new file mode 100644 index 0000000..ab2ffbd --- /dev/null +++ b/integrations/sample-app/app/services/schedule.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@intentjs/core'; +import { + Schedule, + SchedulerRegistry, + ScheduleRun, +} from '@intentjs/core/schedule'; + +@Injectable() +export class ScheduleServiceTest { + constructor() {} + + async handle() { + console.log('inside the handle method'); + } +} diff --git a/integrations/sample-app/package.json b/integrations/sample-app/package.json index 7f64155..3f1b26c 100644 --- a/integrations/sample-app/package.json +++ b/integrations/sample-app/package.json @@ -49,7 +49,7 @@ "@aws-sdk/client-s3": "^3.689.0", "@aws-sdk/credential-providers": "^3.687.0", "@aws-sdk/s3-request-presigner": "^3.689.0", - "@intentjs/core": "workspace:*", + "@intentjs/core": "*", "bcrypt": "^5.1.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", @@ -66,8 +66,8 @@ "winston": "^3.14.2" }, "devDependencies": { - "@intentjs/cli": "workspace:*", - "@intentjs/tooling": "workspace:*", + "@intentjs/cli": "*", + "@intentjs/tooling": "*", "@nestjs/testing": "^10.0.0", "@rollup/plugin-typescript": "^12.1.2", "@rspack/cli": "^1.2.8", diff --git a/package-lock.json b/package-lock.json index d351dfd..10d3796 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,8 +47,8 @@ "winston": "^3.14.2" }, "devDependencies": { - "@intentjs/cli": "^0.0.15", - "@intentjs/tooling": "^0.0.2", + "@intentjs/cli": "*", + "@intentjs/tooling": "*", "@nestjs/testing": "^10.0.0", "@rollup/plugin-typescript": "^12.1.2", "@rspack/cli": "^1.2.8", @@ -3022,897 +3022,517 @@ "node": ">=6.9.0" } }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", - "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@intentjs/cli": { + "resolved": "packages/cli", + "link": true + }, + "node_modules/@intentjs/core": { + "resolved": "packages/core", + "link": true + }, + "node_modules/@intentjs/hyper-express": { + "resolved": "packages/hyper-express", + "link": true + }, + "node_modules/@intentjs/tooling": { + "resolved": "packages/toolings", + "link": true + }, + "node_modules/@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "license": "MIT", "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.4" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", - "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "license": "MIT", "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.4" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", - "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", - "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", - "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", - "cpu": [ - "arm64" - ], + "node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } + "license": "ISC" }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", - "cpu": [ - "s390x" - ], + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", - "cpu": [ - "x64" - ], + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" } }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", - "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", - "cpu": [ - "arm64" - ], + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", - "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", - "cpu": [ - "x64" - ], + "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { + "version": "1.0.3", "dev": true, - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } + "license": "BSD-3-Clause" }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", - "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", - "cpu": [ - "arm" - ], + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.5" + "node": ">=8" } }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", - "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", - "cpu": [ - "arm64" - ], + "node_modules/@jest/console": { + "version": "29.7.0", "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.4" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", - "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", - "cpu": [ - "s390x" - ], + "node_modules/@jest/core": { + "version": "29.7.0", "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.4" + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", - "cpu": [ - "x64" - ], + "node_modules/@jest/environment": { + "version": "29.7.0", "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", - "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", - "cpu": [ - "arm64" - ], + "node_modules/@jest/expect": { + "version": "29.7.0", "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", - "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", - "cpu": [ - "x64" - ], + "node_modules/@jest/expect-utils": { + "version": "29.7.0", "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@img/sharp-wasm32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", - "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", - "cpu": [ - "wasm32" - ], + "node_modules/@jest/fake-timers": { + "version": "29.7.0", "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, + "license": "MIT", "dependencies": { - "@emnapi/runtime": "^1.2.0" + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" }, - "funding": { - "url": "https://opencollective.com/libvips" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", - "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", - "cpu": [ - "ia32" - ], + "node_modules/@jest/reporters": { + "version": "29.7.0", "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://opencollective.com/libvips" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", - "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", - "cpu": [ - "x64" - ], + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", "dev": true, - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": "*" }, "funding": { - "url": "https://opencollective.com/libvips" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@intentjs/cli": { - "resolved": "packages/cli", - "link": true - }, - "node_modules/@intentjs/core": { - "resolved": "packages/core", - "link": true - }, - "node_modules/@intentjs/hyper-express": { - "resolved": "packages/hyper-express", - "link": true - }, - "node_modules/@intentjs/tooling": { - "resolved": "packages/toolings", - "link": true - }, - "node_modules/@ioredis/commands": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", - "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==", - "license": "MIT" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", + "node_modules/@jest/reporters/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, "license": "ISC", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=12" + "node": "*" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@sinclair/typebox": "^0.27.8" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", + "node_modules/@jest/source-map": { + "version": "29.6.3", + "dev": true, "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "dev": true, - "license": "ISC" - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "dev": true, - "license": "ISC", "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" }, "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", + "node_modules/@jest/test-result": { + "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { - "version": "1.0.3", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "dev": true, - "license": "MIT", "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/console": { + "node_modules/@jest/test-sequencer": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/core": { + "node_modules/@jest/transform": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "pirates": "^4.0.4", "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "write-file-atomic": "^4.0.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/write-file-atomic": { + "version": "4.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/@jest/environment": { - "version": "29.7.0", + "node_modules/@jest/types": { + "version": "29.6.3", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "jest-mock": "^29.7.0" + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/expect": { - "version": "29.7.0", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", "dev": true, "license": "MIT", "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.0.0" } }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", "dev": true, "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.0.0" } }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", "dev": true, "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.0.0" } }, - "node_modules/@jest/globals": { - "version": "29.7.0", + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@jest/reporters/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform/node_modules/write-file-atomic": { - "version": "4.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", "dev": true, "license": "MIT", "dependencies": { @@ -4484,180 +4104,37 @@ "dev": true, "license": "0BSD" }, - "node_modules/@next/env": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.2.tgz", - "integrity": "sha512-Hm3jIGsoUl6RLB1vzY+dZeqb+/kWPZ+h34yiWxW0dV87l8Im/eMOwpOA+a0L78U0HM04syEjXuRlCozqpwuojQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.2.tgz", - "integrity": "sha512-b9TN7q+j5/7+rGLhFAVZiKJGIASuo8tWvInGfAd8wsULjB1uNGRCj1z1WZwwPWzVQbIKWFYqc+9L7W09qwt52w==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, "engines": { - "node": ">= 10" + "node": ">= 8" } }, - "node_modules/@next/swc-darwin-x64": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.2.tgz", - "integrity": "sha512-caR62jNDUCU+qobStO6YJ05p9E+LR0EoXh1EEmyU69cYydsAy7drMcOlUlRtQihM6K6QfvNwJuLhsHcCzNpqtA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">= 10" + "node": ">= 8" } }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.2.tgz", - "integrity": "sha512-fHHXBusURjBmN6VBUtu6/5s7cCeEkuGAb/ZZiGHBLVBXMBy4D5QpM8P33Or8JD1nlOjm/ZT9sEE5HouQ0F+hUA==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, "engines": { - "node": ">= 10" + "node": ">= 8" } }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.2.tgz", - "integrity": "sha512-9CF1Pnivij7+M3G74lxr+e9h6o2YNIe7QtExWq1KUK4hsOLTBv6FJikEwCaC3NeYTflzrm69E5UfwEAbV2U9/g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.2.tgz", - "integrity": "sha512-tINV7WmcTUf4oM/eN3Yuu/f8jQ5C6AkueZPKeALs/qfdfX57eNv4Ij7rt0SA6iZ8+fMobVfcFVv664Op0caCCg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.2.tgz", - "integrity": "sha512-jf2IseC4WRsGkzeUw/cK3wci9pxR53GlLAt30+y+B+2qAQxMw6WAC3QrANIKxkcoPU3JFh/10uFfmoMDF9JXKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.2.tgz", - "integrity": "sha512-wvg7MlfnaociP7k8lxLX4s2iBJm4BrNiNFhVUY+Yur5yhAJHfkS8qPPeDEUH8rQiY0PX3u/P7Q/wcg6Mv6GSAA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.2.tgz", - "integrity": "sha512-D3cNA8NoT3aWISWmo7HF5Eyko/0OdOO+VagkoJuiTk7pyX3P/b+n8XA/MYvyR+xSVcbKn68B1rY9fgqjNISqzQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/agent": { - "version": "2.2.2", + "node_modules/@npmcli/agent": { + "version": "2.2.2", "dev": true, "license": "ISC", "dependencies": { @@ -6801,13 +6278,6 @@ "node": ">=16.0.0" } }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "dev": true, - "license": "MIT" - }, "node_modules/@swc/cli": { "version": "0.4.1-nightly.20240914", "dev": true, @@ -7085,8 +6555,9 @@ "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", - "devOptional": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.8.0" } @@ -7516,6 +6987,12 @@ "@types/node": "*" } }, + "node_modules/@types/luxon": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.6.2.tgz", + "integrity": "sha512-R/BdP7OxEMc44l2Ex5lSXHoIXTB2JLNa3y2QISIbr58U/YcsffyQrYW//hZSdrfxrjRZj3GcUoxMPGdO8gSYuw==", + "license": "MIT" + }, "node_modules/@types/methods": { "version": "1.1.4", "dev": true, @@ -10000,16 +9477,6 @@ ], "license": "MIT" }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -10774,13 +10241,6 @@ "node": ">= 10" } }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "dev": true, - "license": "MIT" - }, "node_modules/cliui": { "version": "8.0.1", "license": "ISC", @@ -11405,6 +10865,19 @@ "dev": true, "license": "MIT" }, + "node_modules/cron": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/cron/-/cron-4.1.4.tgz", + "integrity": "sha512-PpAGyOyWZuGT3I50iGKeyZzNsDn/hp2AzRGUzXIlmnwC+bHZFTs1itnQKx171FeocEej+zTYV2JIgQM8M46LaQ==", + "license": "MIT", + "dependencies": { + "@types/luxon": "~3.6.0", + "luxon": "~3.6.0" + }, + "engines": { + "node": ">=18.x" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -11522,19 +10995,6 @@ "version": "0.2.3", "license": "MIT" }, - "node_modules/debounce": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-2.0.0.tgz", - "integrity": "sha512-xRetU6gL1VJbs85Mc4FoEGSjQxzpdxRyFhe3lmWFyy2EzydIcD4xzUvRJMD+NPDfMwKNhxa3PvsIOU32luIWeA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/debug": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", @@ -12109,87 +11569,6 @@ "once": "^1.4.0" } }, - "node_modules/engine.io": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", - "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.7.2", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io/node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/engine.io/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/engine.io/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/enhanced-resolve": { "version": "5.17.1", "dev": true, @@ -16676,1720 +16055,1003 @@ }, "bin": { "lerna": "dist/cli.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/lerna/node_modules/chalk": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/lerna/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/libnpmaccess": { - "version": "8.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^11.0.2", - "npm-registry-fetch": "^17.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/libnpmpublish": { - "version": "9.0.9", - "dev": true, - "license": "ISC", - "dependencies": { - "ci-info": "^4.0.0", - "normalize-package-data": "^6.0.1", - "npm-package-arg": "^11.0.2", - "npm-registry-fetch": "^17.0.1", - "proc-log": "^4.2.0", - "semver": "^7.3.7", - "sigstore": "^2.2.0", - "ssri": "^10.0.6" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/libnpmpublish/node_modules/ci-info": { - "version": "4.0.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/libphonenumber-js": { - "version": "1.11.14", - "license": "MIT" - }, - "node_modules/lines-and-columns": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/live-directory": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/live-directory/-/live-directory-3.0.3.tgz", - "integrity": "sha512-d5jchsscPvkDqwv8lypjpxIIUz4w8fu+czfEkNEMGub4+EZ0SBj5Nclb4E2QmJNC5HJ4BwEdc5DHvoHZfIAK+w==", - "license": "MIT", - "dependencies": { - "chokidar": "^3.5.2" - } - }, - "node_modules/load-json-file": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.15", - "parse-json": "^5.0.0", - "strip-bom": "^4.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/load-json-file/node_modules/type-fest": { - "version": "0.6.0", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "license": "MIT" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "license": "MIT" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "license": "MIT" - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "license": "MIT" - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "license": "MIT" - }, - "node_modules/lodash.kebabcase": { - "version": "4.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.mergewith": { - "version": "4.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "license": "MIT" - }, - "node_modules/lodash.snakecase": { - "version": "4.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.startcase": { - "version": "4.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.upperfirst": { - "version": "4.3.1", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/logform": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", - "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", - "license": "MIT", - "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, - "engines": { - "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/loose-envify": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "license": "ISC" - }, - "node_modules/make-dir": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "dev": true, - "license": "ISC" - }, - "node_modules/make-fetch-happen": { - "version": "13.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/marked": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/marked/-/marked-7.0.4.tgz", - "integrity": "sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 16" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/md-to-react-email": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/md-to-react-email/-/md-to-react-email-5.0.5.tgz", - "integrity": "sha512-OvAXqwq57uOk+WZqFFNCMZz8yDp8BD3WazW1wAKHUrPbbdr89K9DWS6JXY09vd9xNdPNeurI8DU/X4flcfaD8A==", - "license": "MIT", - "dependencies": { - "marked": "7.0.4" - }, - "peerDependencies": { - "react": "^18.0 || ^19.0" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.0.tgz", - "integrity": "sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/json-pack": "^1.0.3", - "@jsonjoy.com/util": "^1.3.0", - "tree-dump": "^1.0.1", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">= 4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - } - }, - "node_modules/meow": { - "version": "8.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/hosted-git-info": { - "version": "4.1.0", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/normalize-package-data": { - "version": "3.0.3", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/read-pkg": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "dev": true, - "license": "ISC" - }, - "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/yargs-parser": { - "version": "20.2.9", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "license": "MIT", + }, "engines": { - "node": ">= 0.6" + "node": ">=18.0.0" } }, - "node_modules/mime-types": { - "version": "2.1.35", + "node_modules/lerna/node_modules/chalk": { + "version": "4.1.0", + "dev": true, "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 0.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", + "node_modules/lerna/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/mimic-response": { - "version": "1.0.1", + "node_modules/leven": { + "version": "3.1.0", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/min-indent": { - "version": "1.0.1", + "node_modules/levn": { + "version": "0.4.1", "dev": true, "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, "engines": { - "node": ">=4" + "node": ">= 0.8.0" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true, - "license": "ISC" - }, - "node_modules/minimatch": { - "version": "3.0.5", + "node_modules/libnpmaccess": { + "version": "8.0.6", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "npm-package-arg": "^11.0.2", + "npm-registry-fetch": "^17.0.1" }, "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "devOptional": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/minimist-options": { - "version": "4.1.0", + "node_modules/libnpmpublish": { + "version": "9.0.9", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" + "ci-info": "^4.0.0", + "normalize-package-data": "^6.0.1", + "npm-package-arg": "^11.0.2", + "npm-registry-fetch": "^17.0.1", + "proc-log": "^4.2.0", + "semver": "^7.3.7", + "sigstore": "^2.2.0", + "ssri": "^10.0.6" }, "engines": { - "node": ">= 6" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/minipass": { - "version": "7.1.2", - "license": "ISC", + "node_modules/libnpmpublish/node_modules/ci-info": { + "version": "4.0.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=8" } }, - "node_modules/minipass-collect": { - "version": "2.0.1", + "node_modules/libphonenumber-js": { + "version": "1.11.14", + "license": "MIT" + }, + "node_modules/lines-and-columns": { + "version": "2.0.3", "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/minipass-fetch": { - "version": "3.0.5", - "dev": true, + "node_modules/live-directory": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/live-directory/-/live-directory-3.0.3.tgz", + "integrity": "sha512-d5jchsscPvkDqwv8lypjpxIIUz4w8fu+czfEkNEMGub4+EZ0SBj5Nclb4E2QmJNC5HJ4BwEdc5DHvoHZfIAK+w==", "license": "MIT", "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" + "chokidar": "^3.5.2" } }, - "node_modules/minipass-flush": { - "version": "1.0.5", + "node_modules/load-json-file": { + "version": "6.2.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "graceful-fs": "^4.1.15", + "parse-json": "^5.0.0", + "strip-bom": "^4.0.0", + "type-fest": "^0.6.0" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", + "node_modules/load-json-file/node_modules/type-fest": { + "version": "0.6.0", "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", + "node_modules/loader-runner": { + "version": "4.3.0", "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, + "license": "MIT", + "peer": true, "engines": { - "node": ">=8" + "node": ">=6.11.5" } }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", + "node_modules/locate-path": { + "version": "5.0.0", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, - "node_modules/minipass-sized": { - "version": "1.0.3", + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "license": "MIT" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "license": "MIT" + }, + "node_modules/lodash.ismatch": { + "version": "4.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "license": "MIT" + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "license": "MIT" + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", + "node_modules/lodash.upperfirst": { + "version": "4.3.1", "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/minizlib": { - "version": "2.1.2", + "node_modules/log-symbols": { + "version": "4.1.0", + "dev": true, "license": "MIT", "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" }, "engines": { - "node": ">=8" + "node": ">= 12.0.0" } }, - "node_modules/mkdirp": { - "version": "1.0.4", + "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", - "bin": { - "mkdirp": "bin/cmd.js" - }, "engines": { - "node": ">=10" + "node": ">=0.1.90" } }, - "node_modules/modify-values": { - "version": "1.0.1", - "dev": true, + "node_modules/loose-envify": { + "version": "1.4.0", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" } }, - "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "node_modules/lowercase-keys": { + "version": "2.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" + "node_modules/lru-cache": { + "version": "10.4.3", + "license": "ISC" }, - "node_modules/multer": { - "version": "1.4.4-lts.1", - "dev": true, + "node_modules/luxon": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.1.tgz", + "integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==", "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - }, "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/multer/node_modules/concat-stream": { - "version": "1.6.2", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "node": ">=12" } }, - "node_modules/multer/node_modules/mkdirp": { - "version": "0.5.6", - "dev": true, + "node_modules/make-dir": { + "version": "4.0.0", "license": "MIT", - "optional": true, - "peer": true, "dependencies": { - "minimist": "^1.2.6" + "semver": "^7.5.3" }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/multer/node_modules/readable-stream": { - "version": "2.3.8", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/multer/node_modules/safe-buffer": { - "version": "5.1.2", + "node_modules/make-error": { + "version": "1.3.6", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "ISC" }, - "node_modules/multer/node_modules/string_decoder": { - "version": "1.1.1", + "node_modules/make-fetch-happen": { + "version": "13.0.1", "dev": true, - "license": "MIT", - "optional": true, - "peer": true, + "license": "ISC", "dependencies": { - "safe-buffer": "~5.1.0" + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "node_modules/makeerror": { + "version": "1.0.12", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" + "tmpl": "1.0.5" } }, - "node_modules/multimatch": { - "version": "5.0.0", + "node_modules/map-obj": { + "version": "4.3.0", "dev": true, "license": "MIT", - "dependencies": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" - }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/multimatch/node_modules/arrify": { - "version": "2.0.1", - "dev": true, + "node_modules/marked": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/marked/-/marked-7.0.4.tgz", + "integrity": "sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ==", "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, "engines": { - "node": ">=8" + "node": ">= 16" } }, - "node_modules/mute-stream": { - "version": "0.0.8", - "dev": true, - "license": "ISC" - }, - "node_modules/nanoid": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz", - "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "devOptional": true, + "license": "MIT", "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">= 0.4" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" + "node_modules/md-to-react-email": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/md-to-react-email/-/md-to-react-email-5.0.5.tgz", + "integrity": "sha512-OvAXqwq57uOk+WZqFFNCMZz8yDp8BD3WazW1wAKHUrPbbdr89K9DWS6JXY09vd9xNdPNeurI8DU/X4flcfaD8A==", + "license": "MIT", + "dependencies": { + "marked": "7.0.4" + }, + "peerDependencies": { + "react": "^18.0 || ^19.0" + } }, - "node_modules/negotiator": { - "version": "0.6.4", - "dev": true, + "node_modules/media-typer": { + "version": "0.3.0", "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/next": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/next/-/next-15.1.2.tgz", - "integrity": "sha512-nLJDV7peNy+0oHlmY2JZjzMfJ8Aj0/dd3jCwSZS8ZiO5nkQfcZRqDrRN3U5rJtqVTQneIOGZzb6LCNrk7trMCQ==", + "node_modules/memfs": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.0.tgz", + "integrity": "sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@next/env": "15.1.2", - "@swc/counter": "0.1.3", - "@swc/helpers": "0.5.15", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001579", - "postcss": "8.4.31", - "styled-jsx": "5.1.6" - }, - "bin": { - "next": "dist/bin/next" + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" }, "engines": { - "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "15.1.2", - "@next/swc-darwin-x64": "15.1.2", - "@next/swc-linux-arm64-gnu": "15.1.2", - "@next/swc-linux-arm64-musl": "15.1.2", - "@next/swc-linux-x64-gnu": "15.1.2", - "@next/swc-linux-x64-musl": "15.1.2", - "@next/swc-win32-arm64-msvc": "15.1.2", - "@next/swc-win32-x64-msvc": "15.1.2", - "sharp": "^0.33.5" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", - "babel-plugin-react-compiler": "*", - "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "sass": "^1.3.0" + "node": ">= 4.0.0" }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - }, - "sass": { - "optional": true - } + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" } }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "node_modules/meow": { + "version": "8.1.2", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-addon-api": { - "version": "5.1.0", - "license": "MIT" - }, - "node_modules/node-cache": { - "version": "5.1.2", - "license": "MIT", + "node_modules/meow/node_modules/hosted-git-info": { + "version": "4.1.0", + "dev": true, + "license": "ISC", "dependencies": { - "clone": "2.x" + "lru-cache": "^6.0.0" }, "engines": { - "node": ">= 8.0.0" + "node": ">=10" } }, - "node_modules/node-cache/node_modules/clone": { - "version": "2.1.2", - "license": "MIT", + "node_modules/meow/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=0.8" + "node": ">=10" } }, - "node_modules/node-fetch": { - "version": "2.6.7", - "license": "MIT", + "node_modules/meow/node_modules/normalize-package-data": { + "version": "3.0.3", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "whatwg-url": "^5.0.0" + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "node": ">=10" } }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "node_modules/meow/node_modules/read-pkg": { + "version": "5.2.0", "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, "engines": { - "node": ">= 6.13.0" + "node": ">=8" } }, - "node_modules/node-gyp": { - "version": "10.2.0", + "node_modules/meow/node_modules/read-pkg-up": { + "version": "7.0.1", "dev": true, "license": "MIT", "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^4.1.0", - "semver": "^7.3.5", - "tar": "^6.2.1", - "which": "^4.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-int64": { - "version": "0.4.0", + "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", "dev": true, - "license": "MIT" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } }, - "node_modules/node-machine-id": { - "version": "1.1.12", + "node_modules/meow/node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/node-releases": { - "version": "2.0.18", + "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", "dev": true, - "license": "MIT" + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } }, - "node_modules/nopt": { - "version": "7.2.1", + "node_modules/meow/node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "dev": true, "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, "bin": { - "nopt": "bin/nopt.js" - }, + "semver": "bin/semver" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/normalize-package-data": { - "version": "6.0.2", + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "license": "MIT", + "node_modules/meow/node_modules/yargs-parser": { + "version": "20.2.9", + "dev": true, + "license": "ISC", "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/normalize-url": { - "version": "6.1.0", + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" - }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-bundled": { - "version": "3.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "node_modules/merge-stream": { + "version": "2.0.0", + "license": "MIT" }, - "node_modules/npm-install-checks": { - "version": "6.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, + "node_modules/merge2": { + "version": "1.4.1", + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 8" } }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "dev": true, - "license": "ISC", + "node_modules/methods": { + "version": "1.1.2", + "devOptional": true, + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 0.6" } }, - "node_modules/npm-package-arg": { - "version": "11.0.2", - "dev": true, - "license": "ISC", + "node_modules/micromatch": { + "version": "4.0.8", + "license": "MIT", "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=8.6" } }, - "node_modules/npm-packlist": { - "version": "8.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "ignore-walk": "^6.0.4" - }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/npm-pick-manifest": { - "version": "9.1.0", + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", - "semver": "^7.3.5" + "license": "MIT", + "bin": { + "mime": "cli.js" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/npm-registry-fetch": { - "version": "17.1.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/redact": "^2.0.0", - "jsonparse": "^1.3.1", - "make-fetch-happen": "^13.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minizlib": "^2.1.2", - "npm-package-arg": "^11.0.0", - "proc-log": "^4.0.0" - }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">= 0.6" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", + "node_modules/mime-types": { + "version": "2.1.35", "license": "MIT", "dependencies": { - "path-key": "^3.0.0" + "mime-db": "1.52.0" }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/npmlog": { - "version": "5.0.1", - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" + "node_modules/mimic-fn": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/nx": { - "version": "20.0.12", + "node_modules/mimic-response": { + "version": "1.0.1", "dev": true, - "hasInstallScript": true, "license": "MIT", - "dependencies": { - "@napi-rs/wasm-runtime": "0.2.4", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.2", - "@zkochan/js-yaml": "0.0.7", - "axios": "^1.7.4", - "chalk": "^4.1.0", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^8.0.1", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "enquirer": "~2.3.6", - "figures": "3.2.0", - "flat": "^5.0.2", - "front-matter": "^4.0.2", - "ignore": "^5.0.4", - "jest-diff": "^29.4.1", - "jsonc-parser": "3.2.0", - "lines-and-columns": "2.0.3", - "minimatch": "9.0.3", - "node-machine-id": "1.1.12", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "ora": "5.3.0", - "semver": "^7.5.3", - "string-width": "^4.2.3", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0", - "yargs": "^17.6.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "nx": "bin/nx.js", - "nx-cloud": "bin/nx-cloud.js" - }, - "optionalDependencies": { - "@nx/nx-darwin-arm64": "20.0.12", - "@nx/nx-darwin-x64": "20.0.12", - "@nx/nx-freebsd-x64": "20.0.12", - "@nx/nx-linux-arm-gnueabihf": "20.0.12", - "@nx/nx-linux-arm64-gnu": "20.0.12", - "@nx/nx-linux-arm64-musl": "20.0.12", - "@nx/nx-linux-x64-gnu": "20.0.12", - "@nx/nx-linux-x64-musl": "20.0.12", - "@nx/nx-win32-arm64-msvc": "20.0.12", - "@nx/nx-win32-x64-msvc": "20.0.12" - }, - "peerDependencies": { - "@swc-node/register": "^1.8.0", - "@swc/core": "^1.3.85" - }, - "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { - "optional": true - } + "engines": { + "node": ">=4" } }, - "node_modules/nx/node_modules/brace-expansion": { - "version": "2.0.1", + "node_modules/min-indent": { + "version": "1.0.1", "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "engines": { + "node": ">=4" } }, - "node_modules/nx/node_modules/minimatch": { - "version": "9.0.3", + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.0.5", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "devOptional": true, + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nx/node_modules/ora": { - "version": "5.3.0", + "node_modules/minimist-options": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "bl": "^4.0.3", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "license": "MIT", + "node_modules/minipass-collect": { + "version": "2.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, "engines": { - "node": ">=0.10.0" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/object-inspect": { - "version": "1.13.3", - "devOptional": true, + "node_modules/minipass-fetch": { + "version": "3.0.5", + "dev": true, "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, "engines": { - "node": ">= 0.4" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "encoding": "^0.1.13" } }, - "node_modules/object-keys": { - "version": "1.1.1", + "node_modules/minipass-flush": { + "version": "1.0.5", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, "engines": { - "node": ">= 0.4" + "node": ">= 8" } }, - "node_modules/object.assign": { - "version": "4.1.5", + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/object.fromentries": { - "version": "2.0.8", + "node_modules/minipass-pipeline": { + "version": "1.2.4", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" + "minipass": "^3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/object.groupby": { + "node_modules/minipass-sized": { "version": "1.0.3", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" + "minipass": "^3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/object.values": { - "version": "1.2.0", + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/objection": { - "version": "3.1.5", + "node_modules/minizlib": { + "version": "2.1.2", "license": "MIT", "dependencies": { - "ajv": "^8.17.1", - "ajv-formats": "^2.1.1", - "db-errors": "^0.2.3" + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "knex": ">=1.0.1" + "node": ">= 8" } }, - "node_modules/objection/node_modules/ajv": { - "version": "8.17.1", - "license": "MIT", + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "license": "ISC", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "yallist": "^4.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=8" } }, - "node_modules/objection/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" + "node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "node_modules/modify-values": { + "version": "1.0.1", "dev": true, - "license": "MIT" - }, - "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==", - "devOptional": true, "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=10" } }, - "node_modules/once": { - "version": "1.4.0", - "license": "ISC", + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multer": { + "version": "1.4.4-lts.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "wrappy": "1" + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" } }, - "node_modules/one-time": { - "version": "1.0.0", + "node_modules/multer/node_modules/concat-stream": { + "version": "1.6.2", + "dev": true, + "engines": [ + "node >= 0.8" + ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "fn.name": "1.x.x" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "node_modules/onetime": { - "version": "5.1.2", + "node_modules/multer/node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" + "minimist": "^1.2.6" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/open": { - "version": "8.4.2", + "node_modules/multer/node_modules/readable-stream": { + "version": "2.3.8", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "node_modules/multer/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/multer/node_modules/string_decoder": { + "version": "1.1.1", "dev": true, - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/optionator": { - "version": "0.9.4", + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, "license": "MIT", "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" }, - "engines": { - "node": ">= 0.8.0" + "bin": { + "multicast-dns": "cli.js" } }, - "node_modules/ora": { - "version": "5.4.1", + "node_modules/multimatch": { + "version": "5.0.0", "dev": true, "license": "MIT", "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" }, "engines": { "node": ">=10" @@ -18398,487 +17060,641 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/os-filter-obj": { - "version": "2.0.0", + "node_modules/multimatch/node_modules/arrify": { + "version": "2.0.1", "dev": true, "license": "MIT", - "dependencies": { - "arch": "^2.1.0" - }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", + "node_modules/mute-stream": { + "version": "0.0.8", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "license": "ISC" }, - "node_modules/p-cancelable": { - "version": "2.1.1", + "node_modules/nanoid": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz", + "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, "engines": { - "node": ">=8" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/p-finally": { - "version": "1.0.0", + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.4", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "node_modules/p-limit": { - "version": "2.3.0", + "node_modules/neo-async": { + "version": "2.6.2", "dev": true, + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "license": "MIT" + }, + "node_modules/node-cache": { + "version": "5.1.2", "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "clone": "2.x" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8.0.0" } }, - "node_modules/p-locate": { - "version": "4.1.0", - "dev": true, + "node_modules/node-cache/node_modules/clone": { + "version": "2.1.2", "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, "engines": { - "node": ">=8" + "node": ">=0.8" } }, - "node_modules/p-map": { - "version": "4.0.0", - "dev": true, + "node_modules/node-fetch": { + "version": "2.6.7", "license": "MIT", "dependencies": { - "aggregate-error": "^3.0.0" + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">=10" + "node": "4.x || >=6.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/p-map-series": { - "version": "2.1.0", + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true, - "license": "MIT", + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { - "node": ">=8" + "node": ">= 6.13.0" } }, - "node_modules/p-pipe": { - "version": "3.1.0", + "node_modules/node-gyp": { + "version": "10.2.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5", + "tar": "^6.2.1", + "which": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/p-queue": { - "version": "6.6.2", + "node_modules/node-int64": { + "version": "0.4.0", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/node-machine-id": { + "version": "1.1.12", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.18", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "7.2.1", + "license": "ISC", "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" + "abbrev": "^2.0.0" }, - "engines": { - "node": ">=8" + "bin": { + "nopt": "bin/nopt.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/p-reduce": { - "version": "2.1.0", + "node_modules/normalize-package-data": { + "version": "6.0.2", "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "node_modules/normalize-url": { + "version": "6.1.0", "dev": true, "license": "MIT", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-retry/node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "node_modules/npm-bundled": { + "version": "3.0.1", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, "engines": { - "node": ">= 4" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/p-timeout": { - "version": "3.2.0", + "node_modules/npm-install-checks": { + "version": "6.3.0", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "p-finally": "^1.0.0" + "semver": "^7.1.1" }, "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/p-try": { - "version": "2.2.0", + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=6" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/p-waterfall": { - "version": "2.1.1", + "node_modules/npm-package-arg": { + "version": "11.0.2", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "p-reduce": "^2.0.0" + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "license": "BlueOak-1.0.0" - }, - "node_modules/pacote": { - "version": "18.0.6", + "node_modules/npm-packlist": { + "version": "8.0.2", "dev": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^5.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/package-json": "^5.1.0", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^8.0.0", - "cacache": "^18.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^11.0.0", - "npm-packlist": "^8.0.0", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^17.0.0", - "proc-log": "^4.0.0", - "promise-retry": "^2.0.1", - "sigstore": "^2.2.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "bin/index.js" + "ignore-walk": "^6.0.4" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/parent-module": { - "version": "1.0.1", + "node_modules/npm-pick-manifest": { + "version": "9.1.0", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "callsites": "^3.0.0" + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" }, "engines": { - "node": ">=6" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/parse-conflict-json": { - "version": "3.0.1", + "node_modules/npm-registry-fetch": { + "version": "17.1.0", "dev": true, "license": "ISC", "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" + "@npmcli/redact": "^2.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "dev": true, + "node_modules/npm-run-path": { + "version": "4.0.1", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "path-key": "^3.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-json/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true, - "license": "MIT" - }, - "node_modules/parse-json/node_modules/lines-and-columns": { - "version": "1.2.4", - "dev": true, - "license": "MIT" + "node_modules/npmlog": { + "version": "5.0.1", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } }, - "node_modules/parse-path": { - "version": "7.0.0", + "node_modules/nx": { + "version": "20.0.12", "dev": true, + "hasInstallScript": true, "license": "MIT", "dependencies": { - "protocols": "^2.0.0" + "@napi-rs/wasm-runtime": "0.2.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.2", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.7.4", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "front-matter": "^4.0.2", + "ignore": "^5.0.4", + "jest-diff": "^29.4.1", + "jsonc-parser": "3.2.0", + "lines-and-columns": "2.0.3", + "minimatch": "9.0.3", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "ora": "5.3.0", + "semver": "^7.5.3", + "string-width": "^4.2.3", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "20.0.12", + "@nx/nx-darwin-x64": "20.0.12", + "@nx/nx-freebsd-x64": "20.0.12", + "@nx/nx-linux-arm-gnueabihf": "20.0.12", + "@nx/nx-linux-arm64-gnu": "20.0.12", + "@nx/nx-linux-arm64-musl": "20.0.12", + "@nx/nx-linux-x64-gnu": "20.0.12", + "@nx/nx-linux-x64-musl": "20.0.12", + "@nx/nx-win32-arm64-msvc": "20.0.12", + "@nx/nx-win32-x64-msvc": "20.0.12" + }, + "peerDependencies": { + "@swc-node/register": "^1.8.0", + "@swc/core": "^1.3.85" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } } }, - "node_modules/parse-url": { - "version": "8.1.0", + "node_modules/nx/node_modules/brace-expansion": { + "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { - "parse-path": "^7.0.0" + "balanced-match": "^1.0.0" } }, - "node_modules/parseley": { - "version": "0.12.1", - "license": "MIT", + "node_modules/nx/node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", "dependencies": { - "leac": "^0.6.0", - "peberminta": "^0.9.0" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://ko-fi.com/killymxi" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "devOptional": true, + "node_modules/nx/node_modules/ora": { + "version": "5.3.0", + "dev": true, "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, "engines": { - "node": ">= 0.8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-browserify": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "dev": true, + "node_modules/object-assign": { + "version": "4.1.1", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", + "node_modules/object-inspect": { + "version": "1.13.3", + "devOptional": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/path-key": { - "version": "3.1.1", + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "license": "BlueOak-1.0.0", + "node_modules/object.assign": { + "version": "4.1.5", + "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/path-to-regexp": { - "version": "3.3.0", + "node_modules/object.fromentries": { + "version": "2.0.8", "dev": true, "license": "MIT", - "peer": true + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/path-type": { - "version": "4.0.0", + "node_modules/object.groupby": { + "version": "1.0.3", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/peberminta": { - "version": "0.9.0", + "node_modules/object.values": { + "version": "1.2.0", + "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { - "url": "https://ko-fi.com/killymxi" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/peek-readable": { - "version": "5.3.1", + "node_modules/objection": { + "version": "3.1.5", "license": "MIT", + "dependencies": { + "ajv": "^8.17.1", + "ajv-formats": "^2.1.1", + "db-errors": "^0.2.3" + }, "engines": { - "node": ">=14.16" + "node": ">=14.0.0" + }, + "peerDependencies": { + "knex": ">=1.0.1" + } + }, + "node_modules/objection/node_modules/ajv": { + "version": "8.17.1", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { "type": "github", - "url": "https://github.com/sponsors/Borewit" + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "node_modules/objection/node_modules/json-schema-traverse": { + "version": "1.0.0", "license": "MIT" }, - "node_modules/pg": { - "version": "8.13.1", + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true, + "license": "MIT" + }, + "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==", + "devOptional": true, "license": "MIT", "dependencies": { - "pg-connection-string": "^2.7.0", - "pg-pool": "^3.7.0", - "pg-protocol": "^1.7.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" + "ee-first": "1.1.1" }, "engines": { - "node": ">= 8.0.0" - }, - "optionalDependencies": { - "pg-cloudflare": "^1.1.1" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } + "node": ">= 0.8" } }, - "node_modules/pg-cloudflare": { - "version": "1.1.1", + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, "license": "MIT", - "optional": true - }, - "node_modules/pg-connection-string": { - "version": "2.6.2", - "license": "MIT" + "engines": { + "node": ">= 0.8" + } }, - "node_modules/pg-int8": { - "version": "1.0.1", + "node_modules/once": { + "version": "1.4.0", "license": "ISC", - "engines": { - "node": ">=4.0.0" + "dependencies": { + "wrappy": "1" } }, - "node_modules/pg-pool": { - "version": "3.7.0", + "node_modules/one-time": { + "version": "1.0.0", "license": "MIT", - "peerDependencies": { - "pg": ">=8.0" + "dependencies": { + "fn.name": "1.x.x" } }, - "node_modules/pg-protocol": { - "version": "1.7.0", - "license": "MIT" - }, - "node_modules/pg-types": { - "version": "2.2.0", + "node_modules/onetime": { + "version": "5.1.2", "license": "MIT", "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pg/node_modules/pg-connection-string": { - "version": "2.7.0", - "license": "MIT" - }, - "node_modules/pgpass": { - "version": "1.0.5", + "node_modules/open": { + "version": "8.4.2", + "dev": true, "license": "MIT", "dependencies": { - "split2": "^4.1.0" - } - }, - "node_modules/pgpass/node_modules/split2": { - "version": "4.2.0", - "license": "ISC", + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, "engines": { - "node": ">= 10.x" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/picocolors": { - "version": "1.1.1", - "license": "ISC" + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "node_modules/optionator": { + "version": "0.9.4", + "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/pify": { - "version": "5.0.0", + "node_modules/ora": { + "version": "5.4.1", "dev": true, "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, "engines": { "node": ">=10" }, @@ -18886,1066 +17702,915 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pirates": { - "version": "4.0.6", + "node_modules/os-filter-obj": { + "version": "2.0.0", "dev": true, "license": "MIT", + "dependencies": { + "arch": "^2.1.0" + }, "engines": { - "node": ">= 6" + "node": ">=4" } }, - "node_modules/piscina": { - "version": "4.7.0", + "node_modules/os-tmpdir": { + "version": "1.0.2", + "dev": true, "license": "MIT", - "optionalDependencies": { - "@napi-rs/nice": "^1.0.1" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", + "node_modules/p-cancelable": { + "version": "2.1.1", "dev": true, "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, "engines": { "node": ">=8" } }, - "node_modules/possible-typed-array-names": { + "node_modules/p-finally": { "version": "1.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=4" } }, - "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "node_modules/p-limit": { + "version": "2.3.0", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "p-try": "^2.0.0" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", + "node_modules/p-locate": { + "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/postgres-array": { - "version": "2.0.0", + "node_modules/p-map": { + "version": "4.0.0", + "dev": true, "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postgres-bytea": { - "version": "1.0.0", + "node_modules/p-map-series": { + "version": "2.1.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/postgres-date": { - "version": "1.0.7", + "node_modules/p-pipe": { + "version": "3.1.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "xtend": "^4.0.0" + "node": ">=8" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", + "node_modules/p-queue": { + "version": "6.6.2", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", - "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" }, "engines": { - "node": ">=14" + "node": ">=8" }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", + "node_modules/p-reduce": { + "version": "2.1.0", "dev": true, "license": "MIT", - "dependencies": { - "fast-diff": "^1.1.2" - }, "engines": { - "node": ">=6.0.0" + "node": ">=8" } }, - "node_modules/pretty-format": { - "version": "29.7.0", + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "@types/retry": "0.12.0", + "retry": "^0.13.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 4" } }, - "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "node_modules/p-timeout": { + "version": "3.2.0", + "dev": true, "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/proc-log": { - "version": "4.2.0", + "node_modules/p-try": { + "version": "2.2.0", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=6" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "devOptional": true, - "license": "MIT" - }, - "node_modules/proggy": { - "version": "2.0.0", + "node_modules/p-waterfall": { + "version": "2.1.1", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "p-reduce": "^2.0.0" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/promise-all-reject-late": { - "version": "1.0.1", - "dev": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/promise-call-limit": { - "version": "3.0.2", - "dev": true, - "license": "ISC", + "node": ">=8" + }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/promise-inflight": { + "node_modules/package-json-from-dist": { "version": "1.0.1", - "dev": true, - "license": "ISC" + "license": "BlueOak-1.0.0" }, - "node_modules/promise-retry": { - "version": "2.0.1", + "node_modules/pacote": { + "version": "18.0.6", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/package-json": "^5.1.0", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^8.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^17.0.0", + "proc-log": "^4.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^2.2.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "bin/index.js" }, "engines": { - "node": ">=10" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/prompts": { - "version": "2.4.2", + "node_modules/parent-module": { + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "callsites": "^3.0.0" }, "engines": { - "node": ">= 6" + "node": ">=6" } }, - "node_modules/promzard": { - "version": "1.0.2", + "node_modules/parse-conflict-json": { + "version": "3.0.1", "dev": true, "license": "ISC", "dependencies": { - "read": "^3.0.1" + "json-parse-even-better-errors": "^3.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/proto-list": { - "version": "1.2.4", - "license": "ISC" - }, - "node_modules/protocols": { - "version": "2.0.1", + "node_modules/parse-json": { + "version": "5.2.0", "dev": true, - "license": "MIT" - }, - "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==", - "devOptional": true, "license": "MIT", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">= 0.10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", + "node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", "dev": true, "license": "MIT" }, - "node_modules/pseudomap": { - "version": "1.0.2", + "node_modules/parse-json/node_modules/lines-and-columns": { + "version": "1.2.4", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/pump": { - "version": "3.0.2", + "node_modules/parse-path": { + "version": "7.0.0", "dev": true, "license": "MIT", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "protocols": "^2.0.0" } }, - "node_modules/punycode": { - "version": "2.3.1", + "node_modules/parse-url": { + "version": "8.1.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "parse-path": "^7.0.0" } }, - "node_modules/pure-rand": { - "version": "6.1.0", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/qs": { - "version": "6.13.0", - "devOptional": true, - "license": "BSD-3-Clause", + "node_modules/parseley": { + "version": "0.12.1", + "license": "MIT", "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" + "leac": "^0.6.0", + "peberminta": "^0.9.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://ko-fi.com/killymxi" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "node_modules/queue-tick": { + "node_modules/path-browserify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", "license": "MIT" }, - "node_modules/quick-lru": { - "version": "4.0.1", + "node_modules/path-exists": { + "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/radash": { - "version": "12.1.0", + "node_modules/path-is-absolute": { + "version": "1.0.1", "license": "MIT", "engines": { - "node": ">=14.18.0" + "node": ">=0.10.0" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, + "node_modules/path-key": { + "version": "3.1.1", "license": "MIT", - "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "license": "BlueOak-1.0.0", "dependencies": { - "safe-buffer": "^5.1.0" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/range-parser": { - "version": "1.2.1", + "node_modules/path-to-regexp": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, + "node_modules/peberminta": { + "version": "0.9.0", + "license": "MIT", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/peek-readable": { + "version": "5.3.1", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/pg": { + "version": "8.13.1", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "pg-connection-string": "^2.7.0", + "pg-pool": "^3.7.0", + "pg-protocol": "^1.7.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" }, "engines": { - "node": ">= 0.8" + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.6.2", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.7.0", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" } }, - "node_modules/react": { - "version": "18.3.1", + "node_modules/pg-protocol": { + "version": "1.7.0", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0" + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/react-dom": { - "version": "18.3.1", + "node_modules/pg/node_modules/pg-connection-string": { + "version": "2.7.0", + "license": "MIT" + }, + "node_modules/pgpass": { + "version": "1.0.5", "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" + "split2": "^4.1.0" } }, - "node_modules/react-email": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/react-email/-/react-email-3.0.7.tgz", - "integrity": "sha512-lX9dFCPtTG+79aP9uTdx763byshptPYbOi0KXwxn6nPJoDP/Ty/G1W5fx1lbrmec+pk38MTDZPrzJ/UYIxgP/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "7.24.5", - "@babel/parser": "7.24.5", - "chalk": "4.1.2", - "chokidar": "4.0.3", - "commander": "11.1.0", - "debounce": "2.0.0", - "esbuild": "0.23.0", - "glob": "10.3.4", - "log-symbols": "4.1.0", - "mime-types": "2.1.35", - "next": "15.1.2", - "normalize-path": "3.0.0", - "ora": "5.4.1", - "socket.io": "4.8.1" - }, - "bin": { - "email": "dist/cli/index.js" - }, + "node_modules/pgpass/node_modules/split2": { + "version": "4.2.0", + "license": "ISC", "engines": { - "node": ">=18.0.0" + "node": ">= 10.x" } }, - "node_modules/react-email/node_modules/@babel/core": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", - "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", - "dev": true, + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.24.5", - "@babel/helpers": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/react-email/node_modules/@babel/parser": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", - "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", + "node_modules/pify": { + "version": "5.0.0", "dev": true, "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" - }, "engines": { - "node": ">=6.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/react-email/node_modules/@esbuild/aix-ppc64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", - "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", - "cpu": [ - "ppc64" - ], + "node_modules/pirates": { + "version": "4.0.6", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "aix" - ], "engines": { - "node": ">=18" + "node": ">= 6" } }, - "node_modules/react-email/node_modules/@esbuild/android-arm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", - "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/piscina": { + "version": "4.7.0", "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" + "optionalDependencies": { + "@napi-rs/nice": "^1.0.1" } }, - "node_modules/react-email/node_modules/@esbuild/android-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", - "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", - "cpu": [ - "arm64" - ], + "node_modules/pkg-dir": { + "version": "4.2.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "find-up": "^4.0.0" + }, "engines": { - "node": ">=18" + "node": ">=8" } }, - "node_modules/react-email/node_modules/@esbuild/android-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", - "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", - "cpu": [ - "x64" - ], + "node_modules/possible-typed-array-names": { + "version": "1.0.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": ">= 0.4" } }, - "node_modules/react-email/node_modules/@esbuild/darwin-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", - "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", - "cpu": [ - "arm64" - ], + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, "engines": { - "node": ">=18" + "node": "^10 || ^12 || >=14" } }, - "node_modules/react-email/node_modules/@esbuild/darwin-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", - "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", - "cpu": [ - "x64" - ], + "node_modules/postcss-selector-parser": { + "version": "6.1.2", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, "engines": { - "node": ">=18" + "node": ">=4" } }, - "node_modules/react-email/node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", - "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/postgres-array": { + "version": "2.0.0", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">=18" + "node": ">=4" } }, - "node_modules/react-email/node_modules/@esbuild/freebsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", - "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/postgres-bytea": { + "version": "1.0.0", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">=18" + "node": ">=0.10.0" } }, - "node_modules/react-email/node_modules/@esbuild/linux-arm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", - "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/postgres-date": { + "version": "1.0.7", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=0.10.0" } }, - "node_modules/react-email/node_modules/@esbuild/linux-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", - "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/postgres-interval": { + "version": "1.2.0", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "xtend": "^4.0.0" + }, "engines": { - "node": ">=18" + "node": ">=0.10.0" } }, - "node_modules/react-email/node_modules/@esbuild/linux-ia32": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", - "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", - "cpu": [ - "ia32" - ], + "node_modules/prelude-ls": { + "version": "1.2.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">= 0.8.0" } }, - "node_modules/react-email/node_modules/@esbuild/linux-loong64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", - "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", - "cpu": [ - "loong64" - ], - "dev": true, + "node_modules/prettier": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "bin": { + "prettier": "bin/prettier.cjs" + }, "engines": { - "node": ">=18" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/react-email/node_modules/@esbuild/linux-mips64el": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", - "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", - "cpu": [ - "mips64el" - ], + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "fast-diff": "^1.1.2" + }, "engines": { - "node": ">=18" + "node": ">=6.0.0" } }, - "node_modules/react-email/node_modules/@esbuild/linux-ppc64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", - "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", - "cpu": [ - "ppc64" - ], + "node_modules/pretty-format": { + "version": "29.7.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, "engines": { - "node": ">=18" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/react-email/node_modules/@esbuild/linux-riscv64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", - "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", - "cpu": [ - "riscv64" - ], + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/react-email/node_modules/@esbuild/linux-s390x": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", - "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", - "cpu": [ - "s390x" - ], - "dev": true, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=6" } }, - "node_modules/react-email/node_modules/@esbuild/linux-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", - "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", - "cpu": [ - "x64" - ], + "node_modules/proc-log": { + "version": "4.2.0", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "ISC", "engines": { - "node": ">=18" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/react-email/node_modules/@esbuild/netbsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", - "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", - "cpu": [ - "x64" - ], + "node_modules/process-nextick-args": { + "version": "2.0.1", + "devOptional": true, + "license": "MIT" + }, + "node_modules/proggy": { + "version": "2.0.0", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "license": "ISC", "engines": { - "node": ">=18" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/react-email/node_modules/@esbuild/openbsd-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", - "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", - "cpu": [ - "arm64" - ], + "node_modules/promise-all-reject-late": { + "version": "1.0.1", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/react-email/node_modules/@esbuild/openbsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", - "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", - "cpu": [ - "x64" - ], + "node_modules/promise-call-limit": { + "version": "3.0.2", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/react-email/node_modules/@esbuild/sunos-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", - "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", - "cpu": [ - "x64" - ], + "node_modules/promise-inflight": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/promise-retry": { + "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, "engines": { - "node": ">=18" + "node": ">=10" } }, - "node_modules/react-email/node_modules/@esbuild/win32-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", - "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", - "cpu": [ - "arm64" - ], + "node_modules/prompts": { + "version": "2.4.2", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, "engines": { - "node": ">=18" + "node": ">= 6" } }, - "node_modules/react-email/node_modules/@esbuild/win32-ia32": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", - "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", - "cpu": [ - "ia32" - ], + "node_modules/promzard": { + "version": "1.0.2", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "license": "ISC", + "dependencies": { + "read": "^3.0.1" + }, "engines": { - "node": ">=18" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/react-email/node_modules/@esbuild/win32-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", - "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", - "cpu": [ - "x64" - ], + "node_modules/proto-list": { + "version": "1.2.4", + "license": "ISC" + }, + "node_modules/protocols": { + "version": "2.0.1", "dev": true, + "license": "MIT" + }, + "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==", + "devOptional": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, "engines": { - "node": ">=18" + "node": ">= 0.10" } }, - "node_modules/react-email/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/proxy-from-env": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/pump": { + "version": "3.0.2", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/react-email/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "node_modules/punycode": { + "version": "2.3.1", "dev": true, "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.13.0", + "devOptional": true, + "license": "BSD-3-Clause", "dependencies": { - "readdirp": "^4.0.1" + "side-channel": "^1.0.6" }, "engines": { - "node": ">= 14.16.0" + "node": ">=0.6" }, "funding": { - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-email/node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "node_modules/queue-microtask": { + "version": "1.2.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "4.0.1", "dev": true, "license": "MIT", "engines": { - "node": ">=16" + "node": ">=8" } }, - "node_modules/react-email/node_modules/esbuild": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", - "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", - "dev": true, - "hasInstallScript": true, + "node_modules/radash": { + "version": "12.1.0", "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.0", - "@esbuild/android-arm": "0.23.0", - "@esbuild/android-arm64": "0.23.0", - "@esbuild/android-x64": "0.23.0", - "@esbuild/darwin-arm64": "0.23.0", - "@esbuild/darwin-x64": "0.23.0", - "@esbuild/freebsd-arm64": "0.23.0", - "@esbuild/freebsd-x64": "0.23.0", - "@esbuild/linux-arm": "0.23.0", - "@esbuild/linux-arm64": "0.23.0", - "@esbuild/linux-ia32": "0.23.0", - "@esbuild/linux-loong64": "0.23.0", - "@esbuild/linux-mips64el": "0.23.0", - "@esbuild/linux-ppc64": "0.23.0", - "@esbuild/linux-riscv64": "0.23.0", - "@esbuild/linux-s390x": "0.23.0", - "@esbuild/linux-x64": "0.23.0", - "@esbuild/netbsd-x64": "0.23.0", - "@esbuild/openbsd-arm64": "0.23.0", - "@esbuild/openbsd-x64": "0.23.0", - "@esbuild/sunos-x64": "0.23.0", - "@esbuild/win32-arm64": "0.23.0", - "@esbuild/win32-ia32": "0.23.0", - "@esbuild/win32-x64": "0.23.0" - } - }, - "node_modules/react-email/node_modules/glob": { - "version": "10.3.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.4.tgz", - "integrity": "sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==", + "node": ">=14.18.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, - "license": "ISC", + "license": "MIT", + "peer": true, "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.6" } }, - "node_modules/react-email/node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "@isaacs/cliui": "^8.0.2" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "node": ">= 0.8" } }, - "node_modules/react-email/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", + "node_modules/react": { + "version": "18.3.1", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "loose-envify": "^1.1.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=0.10.0" } }, - "node_modules/react-email/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, + "node_modules/react-dom": { + "version": "18.3.1", "license": "MIT", - "engines": { - "node": ">= 14.18.0" + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/react-email/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "peerDependencies": { + "react": "^18.3.1" } }, "node_modules/react-is": { @@ -21088,62 +19753,6 @@ "node": ">=8" } }, - "node_modules/sharp": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", - "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.4", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.4", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" - } - }, - "node_modules/sharp/node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "license": "MIT", @@ -21325,126 +19934,6 @@ "npm": ">= 3.0.0" } }, - "node_modules/socket.io": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", - "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.6.0", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", - "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "~4.3.4", - "ws": "~8.17.1" - } - }, - "node_modules/socket.io-adapter/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io-adapter/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -21928,30 +20417,6 @@ "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/styled-jsx": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", - "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, "node_modules/superagent": { "version": "9.0.2", "dev": true, @@ -24427,7 +22892,7 @@ }, "packages/cli": { "name": "@intentjs/cli", - "version": "0.0.18-alpha.2", + "version": "0.0.19", "license": "MIT", "dependencies": { "@clack/prompts": "^0.10.0", @@ -24621,10 +23086,10 @@ }, "packages/core": { "name": "@intentjs/core", - "version": "0.1.46-alpha.3", + "version": "0.1.53", "license": "MIT", "dependencies": { - "@intentjs/hyper-express": "^0.0.7", + "@intentjs/hyper-express": "^0.0.11", "@nestjs/common": "^11.0.12", "@nestjs/core": "^11.0.12", "@react-email/components": "^0.0.32", @@ -24633,6 +23098,7 @@ "class-validator": "^0.14.1", "cli-table3": "^0.6.3", "cors": "^2.8.5", + "cron": "^4.1.4", "dotenv": "^16.4.7", "enquirer": "^2.4.1", "eta": "^3.5.0", @@ -24672,7 +23138,6 @@ "eslint-plugin-sonarjs": "^3.0.2", "jest": "^29.7.0", "prettier": "^3.5.3", - "react-email": "3.0.7", "reflect-metadata": "^0.2.2", "rimraf": "^6.0.1", "ts-jest": "^29.2.6", @@ -25973,7 +24438,7 @@ }, "packages/hyper-express": { "name": "@intentjs/hyper-express", - "version": "0.0.7", + "version": "0.0.11", "license": "MIT", "dependencies": { "busboy": "^1.6.0", @@ -26065,7 +24530,7 @@ }, "packages/toolings": { "name": "@intentjs/tooling", - "version": "0.0.2", + "version": "0.0.3", "license": "MIT" } } diff --git a/packages/core/lib/console/consoleIO.ts b/packages/core/lib/console/consoleIO.ts index 3727a1a..80361ab 100644 --- a/packages/core/lib/console/consoleIO.ts +++ b/packages/core/lib/console/consoleIO.ts @@ -145,7 +145,7 @@ export class ConsoleIO { * @param options * @returns void */ - table(header: string[], rows: Record[]) { + table(header: string[], rows: Array>) { ConsoleLogger.table(header, rows); } diff --git a/packages/core/lib/console/logger.ts b/packages/core/lib/console/logger.ts index 0cba129..fbe1db2 100644 --- a/packages/core/lib/console/logger.ts +++ b/packages/core/lib/console/logger.ts @@ -54,26 +54,14 @@ export class ConsoleLogger { * @param options * @returns void */ - static table(headers: string[], rows: Record[]): void { + static table(headers: string[], rows: Array>): void { const formattedHeaders = []; for (const header of headers) { formattedHeaders.push(pc.cyan(pc.bold(header))); } - const pRows: string[][] = []; - - for (const header of headers) { - for (const [index, row] of rows.entries()) { - if (!pRows[index]) { - pRows[index] = [] as string[]; - } - - pRows[index].push(row[Str.camel(header)]); - } - } - const p = new Table({ head: formattedHeaders }); - p.push(...pRows); + p.push(...rows); console.log(p.toString()); } diff --git a/packages/core/lib/database/commands/migrations.ts b/packages/core/lib/database/commands/migrations.ts index b507cd7..60923a4 100644 --- a/packages/core/lib/database/commands/migrations.ts +++ b/packages/core/lib/database/commands/migrations.ts @@ -23,11 +23,11 @@ export class DbOperationsCommand { const statusList = []; for (const migration of completed) { - statusList.push({ migration: migration.name, status: pc.green('Y') }); + statusList.push([migration.name, pc.green('Y')]); } for (const migration of pending) { - statusList.push({ migration: migration.file, status: pc.red('N') }); + statusList.push([migration.file, pc.red('N')]); } _cli.table(['Migration', 'Status'], statusList); diff --git a/packages/core/lib/explorer.ts b/packages/core/lib/explorer.ts index c1ff809..59f4080 100644 --- a/packages/core/lib/explorer.ts +++ b/packages/core/lib/explorer.ts @@ -7,6 +7,10 @@ import { GenericFunction } from './interfaces/index.js'; import { JOB_NAME, JOB_OPTIONS } from './queue/constants.js'; import { QueueMetadata } from './queue/metadata.js'; import { Injectable } from './foundation/decorators.js'; +import { TASK_SCHEDULE, TASK_SCHEDULE_OPTIONS } from './scheduler/constants.js'; +import { SchedulerRegistry } from './scheduler/metadata.js'; +import { ScheduleOptions } from './scheduler/options/interface.js'; +import { ulid } from 'ulid'; @Injectable() export class IntentExplorer { @@ -34,11 +38,48 @@ export class IntentExplorer { this.lookupJobs(instance, key); this.lookupEventListeners(instance, key); this.lookupConsoleCommands(instance, key); + this.lookupSchedules(instance, key); }, ); }); } + lookupSchedules(instance: Record, key: string) { + const methodRef = instance[key]; + const hasSchedule = Reflect.hasMetadata(TASK_SCHEDULE, instance, key); + const isClassScheduleTask = Reflect.hasMetadata( + TASK_SCHEDULE, + instance.constructor, + ); + + if (!hasSchedule && !isClassScheduleTask) return; + + if (isClassScheduleTask && key != 'handle') return; + + const command = + Reflect.getMetadata(TASK_SCHEDULE, instance, key) || + Reflect.getMetadata(TASK_SCHEDULE, instance.constructor); + + const options: ScheduleOptions = + Reflect.getMetadata(TASK_SCHEDULE_OPTIONS, instance, key) || + Reflect.getMetadata(TASK_SCHEDULE_OPTIONS, instance.constructor); + + /** + * Check if the schedule is class based, + * if yes, then fill the name of the schedule with the name of the class, if not already filled. + * if no, then assign a ulid() to it. + */ + const name = options.name + ? options.name + : isClassScheduleTask + ? `${instance.constructor.name}#handle` + : ulid(); + SchedulerRegistry.addSchedule(command, methodRef.bind(instance), { + ...options, + name, + }); + } + lookupJobs(instance: Record, key: string) { const methodRef = instance[key]; const hasJobMeta = Reflect.hasMetadata(JOB_NAME, instance, key); diff --git a/packages/core/lib/rest/foundation/server.ts b/packages/core/lib/rest/foundation/server.ts index 556a478..85a08f4 100644 --- a/packages/core/lib/rest/foundation/server.ts +++ b/packages/core/lib/rest/foundation/server.ts @@ -135,7 +135,7 @@ export class IntentHttpServer { config: ConfigService, extraInfo: [string, string, string][] = [], ) { - console.clear(); + // console.clear(); console.log(); const port = config.get('app.port'); const hostname = config.get('app.hostname'); diff --git a/packages/core/lib/scheduler/console/list.ts b/packages/core/lib/scheduler/console/list.ts new file mode 100644 index 0000000..1111f67 --- /dev/null +++ b/packages/core/lib/scheduler/console/list.ts @@ -0,0 +1,24 @@ +import { ConsoleIO } from '../../console/consoleIO.js'; +import { Command } from '../../console/decorators.js'; +import { SchedulerRegistry } from '../metadata.js'; +import pc from 'picocolors'; + +@Command('schedule:list') +export class ListScheduledTaskCommands { + async handle(_cli: ConsoleIO): Promise { + const schedules = SchedulerRegistry.getAllSchedules(); + const rows = []; + + for (const [name, schedule] of Object.entries(schedules)) { + rows.push([ + pc.yellow(schedule.getCronExp()), + schedule.getName(), + schedule.getPurpose(), + ]); + } + + console.log(rows); + _cli.table(['Schedule', 'Name', 'Purpose'], rows); + return true; + } +} diff --git a/packages/core/lib/scheduler/constants.ts b/packages/core/lib/scheduler/constants.ts new file mode 100644 index 0000000..236e370 --- /dev/null +++ b/packages/core/lib/scheduler/constants.ts @@ -0,0 +1,2 @@ +export const TASK_SCHEDULE = '__INTENTJS_TASK_SCHEDULE'; +export const TASK_SCHEDULE_OPTIONS = '__INTENTJS_TASK_SCHEDULE_OPTIONS'; diff --git a/packages/core/lib/scheduler/decorator.ts b/packages/core/lib/scheduler/decorator.ts new file mode 100644 index 0000000..1d1f880 --- /dev/null +++ b/packages/core/lib/scheduler/decorator.ts @@ -0,0 +1,23 @@ +import { TASK_SCHEDULE, TASK_SCHEDULE_OPTIONS } from './constants.js'; +import { ScheduleOptions } from './options/interface.js'; + +export function ScheduleOn(schedule: string, options: ScheduleOptions) { + return function (...args: string[] | any[]) { + switch (args.length) { + case 1: + Reflect.defineMetadata(TASK_SCHEDULE, schedule, args[0]); + Reflect.defineMetadata(TASK_SCHEDULE_OPTIONS, options, args[0]); + break; + + case 3: + Reflect.defineMetadata(TASK_SCHEDULE, schedule, args[0], args[1]); + Reflect.defineMetadata( + TASK_SCHEDULE_OPTIONS, + options, + args[0], + args[1], + ); + break; + } + }; +} diff --git a/packages/core/lib/scheduler/errors/class-schedule-with-no-handle.ts b/packages/core/lib/scheduler/errors/class-schedule-with-no-handle.ts new file mode 100644 index 0000000..56fc64b --- /dev/null +++ b/packages/core/lib/scheduler/errors/class-schedule-with-no-handle.ts @@ -0,0 +1,5 @@ +export class ClassBasedScheduleWithNoHandleMethdoError extends Error { + constructor(name?: string) { + super(`Class based schedule with no handle method error`); + } +} diff --git a/packages/core/lib/scheduler/errors/schedule-already-exists.ts b/packages/core/lib/scheduler/errors/schedule-already-exists.ts new file mode 100644 index 0000000..3a9a1ec --- /dev/null +++ b/packages/core/lib/scheduler/errors/schedule-already-exists.ts @@ -0,0 +1,5 @@ +export class DuplicateScheduleError extends Error { + constructor(name?: string) { + super(name); + } +} diff --git a/packages/core/lib/scheduler/index.ts b/packages/core/lib/scheduler/index.ts new file mode 100644 index 0000000..bdedb96 --- /dev/null +++ b/packages/core/lib/scheduler/index.ts @@ -0,0 +1,5 @@ +export * from './metadata.js'; +export * from './worker.js'; +export * from './decorator.js'; +export * from './schedule-run.js'; +export * from './schedule.js'; diff --git a/packages/core/lib/scheduler/metadata.ts b/packages/core/lib/scheduler/metadata.ts new file mode 100644 index 0000000..2606965 --- /dev/null +++ b/packages/core/lib/scheduler/metadata.ts @@ -0,0 +1,31 @@ +import { HandlerType, ScheduleOptions } from './options/interface.js'; +import { Schedule } from './schedule.js'; + +type ScheduleStore = Record; + +export class SchedulerRegistry { + private static schedules = {} as ScheduleStore; + + static addSchedule( + cronExpression: string, + handler: any, + options?: ScheduleOptions, + ): void { + const schedule = new Schedule({ + type: HandlerType.FUNCTION, + value: handler, + }); + + options?.name && schedule.name(options.name); + schedule.cron(cronExpression); + console.log(this.schedules); + } + + static register(name: string, schedule: Schedule): void { + this.schedules[name] = schedule; + } + + static getAllSchedules(): ScheduleStore { + return this.schedules; + } +} diff --git a/packages/core/lib/scheduler/options/interface.ts b/packages/core/lib/scheduler/options/interface.ts new file mode 100644 index 0000000..b8424b5 --- /dev/null +++ b/packages/core/lib/scheduler/options/interface.ts @@ -0,0 +1,21 @@ +import { Message } from '../../queue/index.js'; + +export type ScheduleOptions = { + name?: string; + timezone?: string; + purpose?: string; +}; + +export enum HandlerType { + COMMAND, + JOB, + FUNCTION, + SHELL, +} + +export type ScheduleHandler = + | { type: HandlerType.COMMAND; value: string } + | { type: HandlerType.JOB; value: Message } + | { type: HandlerType.FUNCTION; value: any } + | { type: HandlerType.SHELL; value: any } + | null; diff --git a/packages/core/lib/scheduler/schedule-run.ts b/packages/core/lib/scheduler/schedule-run.ts new file mode 100644 index 0000000..9838c36 --- /dev/null +++ b/packages/core/lib/scheduler/schedule-run.ts @@ -0,0 +1,90 @@ +export class ScheduleRun { + // Second-based schedules + static everySecond = '* * * * * *'; + static everyTwoSeconds = '*/2 * * * * *'; + static everyFiveSeconds = '*/5 * * * * *'; + static everyTenSeconds = '*/10 * * * * *'; + static everyFifteenSeconds = '*/15 * * * * *'; + static everyTwentySeconds = '*/20 * * * * *'; + static everyThirtySeconds = '*/30 * * * * *'; + + // Minute-based schedules + static everyMinute = '* * * * *'; + static everyTwoMinutes = '*/2 * * * *'; + static everyThreeMinutes = '*/3 * * * *'; + static everyFourMinutes = '*/4 * * * *'; + static everyFiveMinutes = '*/5 * * * *'; + static everyTenMinutes = '*/10 * * * *'; + static everyFifteenMinutes = '*/15 * * * *'; + static everyThirtyMinutes = '*/30 * * * *'; + + // Hour-based schedules + static hourly = '0 * * * *'; + static hourlyAt(minute: number): string { + return `${minute} * * * *`; + } + static everyOddHour(minutes = 0): string { + return `${minutes} */2 * * *`; + } + static everyTwoHours(minutes = 0): string { + return `${minutes} */2 * * *`; + } + static everyThreeHours(minutes = 0): string { + return `${minutes} */3 * * *`; + } + static everyFourHours(minutes = 0): string { + return `${minutes} */4 * * *`; + } + static everySixHours(minutes = 0): string { + return `${minutes} */6 * * *`; + } + + // Day-based schedules + static daily = '0 0 * * *'; + static dailyAt(time: string): string { + const [hour, minute] = time.split(':').map(Number); + return `${minute} ${hour} * * *`; + } + static twiceDaily(first: number, second: number): string { + return `0 ${first},${second} * * *`; + } + static twiceDailyAt(first: number, second: number, minutes: number): string { + return `${minutes} ${first},${second} * * *`; + } + + // Week-based schedules + static weekly = '0 0 * * 0'; + static weeklyOn(day: number, time: string): string { + const [hour, minute] = time.split(':').map(Number); + return `${minute} ${hour} * * ${day}`; + } + + // Month-based schedules + static monthly = '0 0 1 * *'; + static monthlyOn(day: number, time: string): string { + const [hour, minute] = time.split(':').map(Number); + return `${minute} ${hour} ${day} * *`; + } + static twiceMonthly(first: number, second: number, time: string): string { + const [hour, minute] = time.split(':').map(Number); + return `${minute} ${hour} ${first},${second} * *`; + } + static lastDayOfMonth(time: string): string { + const [hour, minute] = time.split(':').map(Number); + return `${minute} ${hour} L * *`; + } + + // Quarter-based schedules + static quarterly = '0 0 1 */3 *'; + static quarterlyOn(day: number, time: string): string { + const [hour, minute] = time.split(':').map(Number); + return `${minute} ${hour} ${day} */3 *`; + } + + // Year-based schedules + static yearly = '0 0 1 1 *'; + static yearlyOn(month: number, day: number, time: string): string { + const [hour, minute] = time.split(':').map(Number); + return `${minute} ${hour} ${day} ${month} *`; + } +} diff --git a/packages/core/lib/scheduler/schedule.ts b/packages/core/lib/scheduler/schedule.ts new file mode 100644 index 0000000..24177c6 --- /dev/null +++ b/packages/core/lib/scheduler/schedule.ts @@ -0,0 +1,310 @@ +import { CronJob, validateCronExpression } from 'cron'; +import { Dispatch, Message } from '../queue/index.js'; +import { SchedulerRegistry } from './metadata.js'; +import { ulid } from 'ulid'; +import { + HandlerType, + ScheduleHandler, + ScheduleOptions, +} from './options/interface.js'; +import { CommandRunner } from '../console/runner.js'; +import { ScheduleRun } from './schedule-run.js'; + +export class Schedule { + private scheduleName: ScheduleOptions['name']; + private purposeText: ScheduleOptions['purpose']; + private handler: ScheduleHandler; + private cronJob: CronJob; + private tz: ScheduleOptions['timezone']; + private cronExpression: string; + private beforeFunc: any; + private afterFunc: any; + private onErrorFunc: (e: Error) => void | Promise; + private autoStart: boolean; + + constructor(handler: ScheduleHandler) { + this.purposeText = ''; + this.scheduleName = ''; + this.cronJob = null; + this.cronExpression = ''; + this.handler = handler; + console.log(this.handler); + this.autoStart = true; + } + + static command(command: string): Schedule { + const schedule = new Schedule({ + type: HandlerType.COMMAND, + value: command, + }); + + return schedule; + } + + static job(job: Message): Schedule { + const schedule = new Schedule({ type: HandlerType.JOB, value: job }); + return schedule; + } + + static call(fun: Function): Schedule { + const schedule = new Schedule({ type: HandlerType.FUNCTION, value: fun }); + return schedule; + } + + static exec(command: string): Schedule { + const schedule = new Schedule({ type: HandlerType.SHELL, value: command }); + return schedule; + } + + name(name: ScheduleOptions['name']): this { + this.scheduleName = name; + return this; + } + + purpose(purpose: ScheduleOptions['purpose']): this { + this.purposeText = purpose; + return this; + } + + timezone(tz: ScheduleOptions['timezone']): this { + this.tz = tz; + return this; + } + + cron(expression: string): void { + validateCronExpression(expression); + this.cronExpression = expression; + this.makeCronJob(); + } + + noAutoStart(): this { + this.autoStart = false; + return this; + } + + utcOffset(offset: string): this { + return this; + } + + at(time: string): void { + this.cron(ScheduleRun.dailyAt(time)); + } + + everySecond(): void { + this.cron(ScheduleRun.everySecond); + } + + everyTwoSeconds(): void { + this.cron(ScheduleRun.everyTwoSeconds); + } + + everyFiveSeconds(): void { + this.cron(ScheduleRun.everyFiveSeconds); + } + + everyTenSeconds() { + this.cron(ScheduleRun.everyTenSeconds); + } + + everyFifteenSeconds() { + this.cron(ScheduleRun.everyFifteenSeconds); + } + + everyTwentySeconds() { + this.cron(ScheduleRun.everyTwentySeconds); + } + + everyThirtySeconds() { + this.cron(ScheduleRun.everyThirtySeconds); + } + + everyMinute() { + this.cron(ScheduleRun.everyMinute); + } + + everyTwoMinutes() { + this.cron(ScheduleRun.everyTwoMinutes); + } + + everyThreeMinutes() { + this.cron(ScheduleRun.everyThreeMinutes); + } + + everyFourMinutes() { + this.cron(ScheduleRun.everyFourMinutes); + } + + everyFiveMinutes() { + this.cron(ScheduleRun.everyFourMinutes); + } + + everyTenMinutes() { + this.cron(ScheduleRun.everyTenMinutes); + } + + everyFifteenMinutes() { + this.cron(ScheduleRun.everyFifteenMinutes); + } + + everyThirtyMinutes() { + this.cron(ScheduleRun.everyThirtyMinutes); + } + + hourly() { + this.cron(ScheduleRun.hourly); + } + + hourlyAt(min: number) { + this.cron(ScheduleRun.hourlyAt(min)); + } + + everyOddHour(mins: number = 0) { + this.cron(ScheduleRun.everyOddHour(mins)); + } + + everyTwoHours(mins: number = 0) { + this.cron(ScheduleRun.everyTwoHours(mins)); + } + + everyThreeHours(mins: number = 0) { + this.cron(ScheduleRun.everyThreeHours(mins)); + } + + everyFourHours(mins: number = 0) { + this.cron(ScheduleRun.everyFourHours(mins)); + } + + everySixHours(mins: number = 0) { + this.cron(ScheduleRun.everySixHours(mins)); + } + + daily() { + this.cron(ScheduleRun.daily); + } + + dailyAt(time: string) { + this.cron(ScheduleRun.dailyAt(time)); + } + + twiceDaily(hour1: number, hour2: number) { + this.cron(ScheduleRun.twiceDaily(hour1, hour2)); + } + + twiceDailyAt(hour1: number, hour2: number, mins: number) { + this.cron(ScheduleRun.twiceDailyAt(hour1, hour2, mins)); + } + + weekly() { + this.cron(ScheduleRun.weekly); + } + + weeklyOn(day: number, time: string) { + this.cron(ScheduleRun.weeklyOn(day, time)); + } + + monthly() { + this.cron(ScheduleRun.monthly); + } + + monthlyOn(day: number, time: string) { + this.cron(ScheduleRun.monthlyOn(day, time)); + } + + twiceMonthly(firstDay: number, secondDay: number, time: string) { + this.cron(ScheduleRun.twiceMonthly(firstDay, secondDay, time)); + } + + lastDayOfMonth(time: string) { + this.cron(ScheduleRun.lastDayOfMonth(time)); + } + + quarterly() { + this.cron(ScheduleRun.quarterly); + } + + quarterlyOn(day: number, time: string) { + this.cron(ScheduleRun.quarterlyOn(day, time)); + } + + yearly() { + this.cron(ScheduleRun.yearly); + } + + yearlyOn(month: number, day: number, time: string) { + this.cron(ScheduleRun.yearlyOn(month, day, time)); + } + + private makeCronJob() { + this.scheduleName = this.scheduleName || `schedule_${ulid()}`; + const onTick = async () => { + try { + console.log('running on tick ===> '); + const beforeResult = this.beforeFunc && (await this.beforeFunc()); + console.log('before result ===> ', beforeResult); + const { type, value } = this.handler; + if (type === HandlerType.COMMAND) { + await CommandRunner.run(value); + } else if (type === HandlerType.FUNCTION) { + await value(); + } else if (type === HandlerType.JOB) { + await Dispatch(value); + } + + console.log(this.handler); + const afterResult = this.afterFunc && (await this.afterFunc()); + console.log('after result ===> ', beforeResult); + } catch (e) { + await this.onErrorFunc(e as Error); + } + }; + this.cronJob = CronJob.from({ + cronTime: this.cronExpression, + onTick: onTick.bind(this), + start: this.autoStart, + timeZone: this.tz, + }); + + SchedulerRegistry.register(this.scheduleName, this); + } + + /** + * Getter methods + */ + getCronExp(): string { + return this.cronExpression; + } + + getPurpose(): ScheduleOptions['purpose'] { + return this.purposeText; + } + + getName(): ScheduleOptions['name'] { + return this.scheduleName; + } + + /** + * Lifecycle methods + */ + stop() { + this.cronJob.stop(); + } + + lastExecution(): Date { + return this.cronJob.lastExecution; + } + + before(fun: Function): this { + this.beforeFunc = fun; + return this; + } + + after(fun: Function): this { + this.afterFunc = fun; + return this; + } + + onError(fun: (e: Error) => void): this { + this.onErrorFunc = fun; + return this; + } +} diff --git a/packages/core/lib/scheduler/worker.ts b/packages/core/lib/scheduler/worker.ts new file mode 100644 index 0000000..e363f3d --- /dev/null +++ b/packages/core/lib/scheduler/worker.ts @@ -0,0 +1,18 @@ +import { SchedulerRegistry } from './metadata.js'; + +export class ScheduleWorker { + static init() { + return new ScheduleWorker(); + } + + async run(): Promise { + // const cronPackage = await Package.load('cron'); + const schedules = SchedulerRegistry.getAllSchedules(); + + for (const [schedule, options] of Object.entries(schedules)) { + console.log(schedule, options); + // const job = CronJob.from({}); + } + // const job = CronJob.from({}) + } +} diff --git a/packages/core/lib/serviceProvider.ts b/packages/core/lib/serviceProvider.ts index 0439c1e..9709e86 100644 --- a/packages/core/lib/serviceProvider.ts +++ b/packages/core/lib/serviceProvider.ts @@ -23,6 +23,7 @@ import { ConfigService, } from './config/index.js'; import { ReplConsole } from './repl/terminal.js'; +import { ListScheduledTaskCommands } from './scheduler/console/list.js'; export const IntentProvidersFactory = ( config: any[], @@ -56,6 +57,7 @@ export const IntentProvidersFactory = ( LoggerService, BuildProjectCommand, DevServerCommand, + ListScheduledTaskCommands, ); } diff --git a/packages/core/package.json b/packages/core/package.json index 4456b25..d6be9c2 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -85,6 +85,10 @@ "./storage": { "types": "./dist/lib/storage/index.d.ts", "default": "./dist/lib/storage/index.js" + }, + "./schedule": { + "types": "./dist/lib/scheduler/index.d.ts", + "default": "./dist/lib/scheduler/index.js" } }, "scripts": { @@ -140,6 +144,7 @@ "class-validator": "^0.14.1", "cli-table3": "^0.6.3", "cors": "^2.8.5", + "cron": "^4.1.4", "dotenv": "^16.4.7", "enquirer": "^2.4.1", "eta": "^3.5.0", From 8585bb44e216faa9a2f3e150607672f4733e4491 Mon Sep 17 00:00:00 2001 From: Vinayak Sarawagi Date: Sat, 19 Apr 2025 23:37:43 +0530 Subject: [PATCH 2/3] feat(core): enhance scheduling capabilities with new frequency management - Introduced ScheduleFrequency class to manage cron expressions and scheduling intervals. - Updated Schedule class to utilize ScheduleFrequency for defining scheduling options. - Enhanced scheduling methods to support more granular timing options, including hourly, daily, and custom intervals. - Removed deprecated ScheduleRun class to streamline scheduling logic. - Added support for pinging URLs before and after scheduled tasks, along with success and failure callbacks. - Improved error handling and logging within the scheduling process. --- integrations/sample-app/app/boot/sp/app.ts | 43 +- packages/core/lib/scheduler/frequency.ts | 482 +++++++++++++++ packages/core/lib/scheduler/index.ts | 2 +- .../core/lib/scheduler/options/interface.ts | 5 + packages/core/lib/scheduler/schedule-run.ts | 90 --- packages/core/lib/scheduler/schedule.ts | 548 ++++++++++++++---- 6 files changed, 962 insertions(+), 208 deletions(-) create mode 100644 packages/core/lib/scheduler/frequency.ts delete mode 100644 packages/core/lib/scheduler/schedule-run.ts diff --git a/integrations/sample-app/app/boot/sp/app.ts b/integrations/sample-app/app/boot/sp/app.ts index 753cd36..d537c31 100644 --- a/integrations/sample-app/app/boot/sp/app.ts +++ b/integrations/sample-app/app/boot/sp/app.ts @@ -42,25 +42,48 @@ export class AppServiceProvider extends ServiceProvider { /** * Schedule Intent Command to run daily. */ - Schedule.command('send:email').daily(); + Schedule.command('send:email') + // .days([Schedule.MONDAY, Schedule.THURSDAY]) + .hourly() + .timezone('America/Chicago') + .between('8:00', '17:00') + .run(); /** * Simple callback, with lifecycle methods `before` and `after`. */ - Schedule.call(() => console.log('inside the schedule method')) + Schedule.call(() => { + console.log('inside the schedule method'); + }) .purpose('sample scheduler') .before(() => console.log('this will run before the cron')) - .after(() => console.log('this will run after the cron')) - .everyFiveSeconds(); + .after((output: any) => + console.log('this will run after the cron', output), + ) + .onSuccess((result) => + console.log('this will run on success the cron', result), + ) + .onFailure((error) => + console.log('this will run on failure the cron', error), + ) + // .pingBefore('https://webhook.site/79dcb789-869b-459d-9ba9-638aae449328') + .thenPing('https://webhook.site/79dcb789-869b-459d-9ba9-638aae449328') + .weekends() + .everyTwoSeconds() + .when(() => true) + + .run(); /** * Running a job every day at 5AM. */ - Schedule.job({ - job: 'process_abandoned_cart', - data: { from: '2024-04-16', to: '2024-04-17' }, - }) - .purpose('cron dispatching job every day at 5AM') - .at('5 AM'); + // Schedule.job({ + // job: 'process_abandoned_cart', + // data: { from: '2024-04-16', to: '2024-04-17' }, + // }) + // .purpose('cron dispatching job every day at 5AM') + // .everyFiveSeconds() + // .weekends() + // .run(); } } diff --git a/packages/core/lib/scheduler/frequency.ts b/packages/core/lib/scheduler/frequency.ts new file mode 100644 index 0000000..a697c3d --- /dev/null +++ b/packages/core/lib/scheduler/frequency.ts @@ -0,0 +1,482 @@ +type CronField = '*' | string; + +export class ScheduleFrequency { + static SUNDAY = '0'; + static MONDAY = '1'; + static TUESDAY = '2'; + static WEDNESDAY = '3'; + static THURSDAY = '4'; + static FRIDAY = '5'; + static SATURDAY = '6'; + + private second: CronField[] = []; + private minute: CronField[] = []; + private hour: CronField[] = []; + private dayOfMonth: CronField[] = []; + private month: CronField[] = []; + private dayOfWeek: CronField[] = []; + + private weeklyEnabled = false; + + everySecond(): this { + this.second.push('*'); + return this; + } + + everyTwoSeconds(): this { + this.second.push('*/2'); + return this; + } + + everyFiveSeconds(): this { + this.second.push('*/5'); + return this; + } + + everyTenSeconds(): this { + this.second.push('*/10'); + return this; + } + + everyFifteenSeconds(): this { + this.second.push('*/15'); + return this; + } + + everyTwentySeconds(): this { + this.second.push('*/20'); + return this; + } + + everyThirtySeconds(): this { + this.second.push('*/30'); + return this; + } + + everyMinute(): this { + this.second = ['0']; + this.minute.push('*'); + return this; + } + + everyTwoMinutes(): this { + this.second = ['0']; + this.minute.push('*/2'); + return this; + } + + everyThreeMinutes(): this { + this.second = ['0']; + this.minute.push('*/3'); + return this; + } + + everyFourMinutes(): this { + this.second = ['0']; + this.minute.push('*/4'); + return this; + } + + everyFiveMinutes(): this { + this.second = ['0']; + this.minute.push('*/5'); + return this; + } + + everyTenMinutes(): this { + this.second = ['0']; + this.minute.push('*/10'); + return this; + } + + everyFifteenMinutes(): this { + this.second = ['0']; + this.minute.push('*/15'); + return this; + } + + everyThirtyMinutes(): this { + this.second = ['0']; + this.minute.push('*/30'); + return this; + } + + weekdays(): this { + this.dayOfWeek.push( + `${ScheduleFrequency.MONDAY}-${ScheduleFrequency.FRIDAY}`, + ); + return this; + } + + weekends(): this { + this.dayOfWeek.push( + `${ScheduleFrequency.SATURDAY},${ScheduleFrequency.SUNDAY}`, + ); + return this; + } + + sundays(): this { + if (this.weeklyEnabled) this.dayOfWeek = []; + this.dayOfWeek.push(ScheduleFrequency.SUNDAY); + return this; + } + + mondays(): this { + if (this.weeklyEnabled) this.dayOfWeek = []; + this.dayOfWeek.push(ScheduleFrequency.MONDAY); + return this; + } + + tuesdays(): this { + if (this.weeklyEnabled) this.dayOfWeek = []; + this.dayOfWeek.push(ScheduleFrequency.TUESDAY); + return this; + } + + wednesdays(): this { + if (this.weeklyEnabled) this.dayOfWeek = []; + this.dayOfWeek.push(ScheduleFrequency.WEDNESDAY); + return this; + } + + thursdays(): this { + if (this.weeklyEnabled) this.dayOfWeek = []; + this.dayOfWeek.push(ScheduleFrequency.THURSDAY); + return this; + } + + fridays(): this { + if (this.weeklyEnabled) this.dayOfWeek = []; + this.dayOfWeek.push(ScheduleFrequency.FRIDAY); + return this; + } + + saturdays(): this { + if (this.weeklyEnabled) this.dayOfWeek = []; + this.dayOfWeek.push(ScheduleFrequency.SATURDAY); + return this; + } + + cron(expr: string): this { + this.reset(); + + const parts = expr.trim().split(/\s+/); + if (parts.length === 6) { + const [second, minute, hour, dayOfMonth, month, dayOfWeek] = parts; + this.second = second === '*' ? [] : second.split(','); + this.minute = minute === '*' ? [] : minute.split(','); + this.hour = hour === '*' ? [] : hour.split(','); + this.dayOfMonth = dayOfMonth === '*' ? [] : dayOfMonth.split(','); + this.month = month === '*' ? [] : month.split(','); + this.dayOfWeek = dayOfWeek === '*' ? [] : dayOfWeek.split(','); + } else if (parts.length === 5) { + const [minute, hour, dayOfMonth, month, dayOfWeek] = parts; + this.second = ['0']; + this.minute = minute === '*' ? [] : minute.split(','); + this.hour = hour === '*' ? [] : hour.split(','); + this.dayOfMonth = dayOfMonth === '*' ? [] : dayOfMonth.split(','); + this.month = month === '*' ? [] : month.split(','); + this.dayOfWeek = dayOfWeek === '*' ? [] : dayOfWeek.split(','); + } else { + throw new Error( + 'Invalid cron expression format. Use 5 or 6 space-separated parts.', + ); + } + return this; + } + + build(): string { + const formatPart = (part: CronField[]) => + part.length === 0 ? '*' : part.join(','); + + return [ + formatPart(this.second), + formatPart(this.minute), + formatPart(this.hour), + formatPart(this.dayOfMonth), + formatPart(this.month), + formatPart(this.dayOfWeek), + ].join(' '); + } + + reset(): this { + this.second = []; + this.minute = []; + this.hour = []; + this.dayOfMonth = []; + this.month = []; + this.dayOfWeek = []; + return this; + } + + toJSON() { + return { + second: this.second, + minute: this.minute, + hour: this.hour, + dayOfMonth: this.dayOfMonth, + month: this.month, + dayOfWeek: this.dayOfWeek, + }; + } + + hourly(): this { + this.second = ['0']; + this.minute = ['0']; + this.hour = ['*']; + return this; + } + + hourlyAt(min: number): this { + this.second = ['0']; + this.minute = [String(min)]; + return this; + } + + everyOddHour(minute: string | number = '0'): this { + this.second = ['0']; + this.minute = [String(minute)]; + this.hour = ['1-23/2']; + return this; + } + + everyTwoHours(minute: string | number = '0'): this { + this.second = ['0']; + this.minute = [String(minute)]; + this.hour = ['*/2']; + return this; + } + + everyThreeHours(minute: string | number = '0'): this { + this.second = ['0']; + this.minute = [String(minute)]; + this.hour = ['*/3']; + return this; + } + + everyFourHours(minute: string | number = '0'): this { + this.second = ['0']; + this.minute = [String(minute)]; + this.hour = ['*/4']; + return this; + } + + everyFiveHours(minute: string | number = '0'): this { + this.second = ['0']; + this.minute = [String(minute)]; + this.hour = ['*/5']; + return this; + } + + everySixHours(minute: string | number = '0'): this { + this.second = ['0']; + this.minute = [String(minute)]; + this.hour = ['*/6']; + return this; + } + + /** + * Schedule the task to run daily at midnight. + */ + daily(): this { + this.second = ['0']; + this.minute = ['0']; + this.hour = ['0']; + this.dayOfMonth = ['*']; + this.month = ['*']; + return this; + } + + dailyAt(time: string): this { + const [hour, minute] = time.split(':').map(Number); + this.hour = [String(hour)]; + this.minute = [String(minute)]; + return this; + } + + twiceDaily(firstTime: string, secondTime: string): this { + const [firstHour, firstMinute] = firstTime.split(':').map(Number); + const [secondHour, secondMinute] = secondTime.split(':').map(Number); + this.hour = [String(firstHour), String(secondHour)]; + this.minute = [String(firstMinute), String(secondMinute)]; + return this; + } + + twiceDailyAt(firstTime: string, secondTime: string): this { + const [firstHour, firstMinute] = firstTime.split(':').map(Number); + const [secondHour, secondMinute] = secondTime.split(':').map(Number); + this.hour = [String(firstHour), String(secondHour)]; + this.minute = [String(firstMinute), String(secondMinute)]; + return this; + } + + /** + * Schedule the task to run weekly on Sunday at 00:00. + */ + weekly(): this { + this.dayOfWeek = [ScheduleFrequency.SUNDAY]; + this.weeklyEnabled = true; + return this; + } + + /** + * Schedule the task to run weekly on a specific day at a specific time. + */ + weeklyOn(day: number | number[], time: string): this { + this.dayOfWeek = Array.isArray(day) ? day.map(String) : [String(day)]; + const [hour, minute] = time.split(':').map(Number); + this.hour = [String(hour)]; + this.minute = [String(minute)]; + return this; + } + + monthly(): this { + this.dayOfMonth = ['1']; + return this; + } + + monthlyOn(day: number, time: string): this { + this.dayOfMonth = [String(day)]; + const [hour, minute] = time.split(':').map(Number); + this.hour = [String(hour)]; + this.minute = [String(minute)]; + return this; + } + + twiceMonthly(firstDay: number, secondDay: number, time: string): this { + this.dayOfMonth = [String(firstDay), String(secondDay)]; + const [hour, minute] = time.split(':').map(Number); + this.hour = [String(hour)]; + this.minute = [String(minute)]; + return this; + } + + lastDayOfMonth(time: string): this { + this.dayOfMonth = ['L']; + const [hour, minute] = time.split(':').map(Number); + this.hour = [String(hour)]; + this.minute = [String(minute)]; + return this; + } + + quarterly(time: string): this { + this.month = ['1', '4', '7', '10']; + const [hour, minute] = time.split(':').map(Number); + this.hour = [String(hour)]; + this.minute = [String(minute)]; + return this; + } + + quarterlyOn(day: number, time: string): this { + this.month = ['1', '4', '7', '10']; + this.dayOfMonth = [String(day)]; + const [hour, minute] = time.split(':').map(Number); + this.hour = [String(hour)]; + this.minute = [String(minute)]; + return this; + } + + /** + * Schedule the task to run on the first day of every year at 00:00. + */ + yearly(): this { + this.dayOfMonth.push('1'); + this.month.push('1'); + return this; + } + + yearlyOn(month: number, day: number, time: string): this { + this.dayOfMonth.push(String(day)); + this.month.push(String(month)); + const [hour, minute] = time.split(':').map(Number); + this.hour.push(String(hour)); + this.minute.push(String(minute)); + return this; + } + + /** + * Set the seconds field of the cron expression. + * @param value The cron value for seconds ('*', '0-59', '*\/15', etc.). + */ + seconds(value: CronField): this { + this.second.push(value); + return this; + } + + /** + * Set the minutes field of the cron expression. + * @param value The cron value for minutes ('*', '0-59', '*\/15', '1,15,30', etc.). + */ + minutes(value: CronField): this { + this.minute.push(value); + return this; + } + + /** + * Set the day of the month field of the cron expression. + * @param value The cron value for day of month ('*', '1-31', 'L', '1,15', etc.). + */ + daysOfMonth(value: CronField): this { + this.dayOfMonth.push(value); + return this; + } + + /** + * Set the months field of the cron expression. + * @param value The cron value for months ('*', '1-12', '*\/3', '1,6,12', etc.). + */ + months(value: CronField): this { + this.month.push(value); + return this; + } + + /** + * Set the days of the week field of the cron expression. + * @param value The cron value for day of week ('*', '0-6', '1-5', 'MON,WED,FRI', etc.). + */ + days(value: Array): this { + this.dayOfWeek.push(...value.map(String)); + return this; + } + + /** + * Restrict the task to run only between the given start and end times (inclusive). + * Sets the hour range based on the times. Defaults minute to '*' and second to '0' + * if they haven't been set by other methods. + * Note: Minute precision within the start/end time (e.g., ending at :24) + * is not supported by standard cron ranges and will be ignored. The range applies to whole hours. + * @param startTime Start time in HH:MM format. + * @param endTime End time in HH:MM format. + */ + between(startTime: string, endTime: string): this { + const [startHourStr] = startTime.split(':'); + const [endHourStr] = endTime.split(':'); + + const startHour = parseInt(startHourStr, 10); + const endHour = parseInt(endHourStr, 10); + + if ( + isNaN(startHour) || + isNaN(endHour) || + startHour < 0 || + startHour > 23 || + endHour < 0 || + endHour > 23 + ) { + throw new Error('Invalid hour values in between(). Hours must be 0-23.'); + } + + if (startHour > endHour) { + console.warn( + 'Warning: between() with start hour > end hour might not produce expected cron range.', + ); + this.hour = [`${startHour}-23`, `0-${endHour}`]; + } else { + this.hour = [`${startHour}-${endHour}`]; + } + + if (this.minute.length === 0) this.minute = []; + if (this.second.length === 0) this.second = ['0']; + return this; + } +} diff --git a/packages/core/lib/scheduler/index.ts b/packages/core/lib/scheduler/index.ts index bdedb96..b6a4367 100644 --- a/packages/core/lib/scheduler/index.ts +++ b/packages/core/lib/scheduler/index.ts @@ -1,5 +1,5 @@ export * from './metadata.js'; export * from './worker.js'; export * from './decorator.js'; -export * from './schedule-run.js'; export * from './schedule.js'; +export * from './frequency.js'; diff --git a/packages/core/lib/scheduler/options/interface.ts b/packages/core/lib/scheduler/options/interface.ts index b8424b5..bc0b2b8 100644 --- a/packages/core/lib/scheduler/options/interface.ts +++ b/packages/core/lib/scheduler/options/interface.ts @@ -19,3 +19,8 @@ export type ScheduleHandler = | { type: HandlerType.FUNCTION; value: any } | { type: HandlerType.SHELL; value: any } | null; + +export type PingOptions = { + url: string; + ifCb: undefined | ((...args: any[]) => Promise | boolean); +}; diff --git a/packages/core/lib/scheduler/schedule-run.ts b/packages/core/lib/scheduler/schedule-run.ts deleted file mode 100644 index 9838c36..0000000 --- a/packages/core/lib/scheduler/schedule-run.ts +++ /dev/null @@ -1,90 +0,0 @@ -export class ScheduleRun { - // Second-based schedules - static everySecond = '* * * * * *'; - static everyTwoSeconds = '*/2 * * * * *'; - static everyFiveSeconds = '*/5 * * * * *'; - static everyTenSeconds = '*/10 * * * * *'; - static everyFifteenSeconds = '*/15 * * * * *'; - static everyTwentySeconds = '*/20 * * * * *'; - static everyThirtySeconds = '*/30 * * * * *'; - - // Minute-based schedules - static everyMinute = '* * * * *'; - static everyTwoMinutes = '*/2 * * * *'; - static everyThreeMinutes = '*/3 * * * *'; - static everyFourMinutes = '*/4 * * * *'; - static everyFiveMinutes = '*/5 * * * *'; - static everyTenMinutes = '*/10 * * * *'; - static everyFifteenMinutes = '*/15 * * * *'; - static everyThirtyMinutes = '*/30 * * * *'; - - // Hour-based schedules - static hourly = '0 * * * *'; - static hourlyAt(minute: number): string { - return `${minute} * * * *`; - } - static everyOddHour(minutes = 0): string { - return `${minutes} */2 * * *`; - } - static everyTwoHours(minutes = 0): string { - return `${minutes} */2 * * *`; - } - static everyThreeHours(minutes = 0): string { - return `${minutes} */3 * * *`; - } - static everyFourHours(minutes = 0): string { - return `${minutes} */4 * * *`; - } - static everySixHours(minutes = 0): string { - return `${minutes} */6 * * *`; - } - - // Day-based schedules - static daily = '0 0 * * *'; - static dailyAt(time: string): string { - const [hour, minute] = time.split(':').map(Number); - return `${minute} ${hour} * * *`; - } - static twiceDaily(first: number, second: number): string { - return `0 ${first},${second} * * *`; - } - static twiceDailyAt(first: number, second: number, minutes: number): string { - return `${minutes} ${first},${second} * * *`; - } - - // Week-based schedules - static weekly = '0 0 * * 0'; - static weeklyOn(day: number, time: string): string { - const [hour, minute] = time.split(':').map(Number); - return `${minute} ${hour} * * ${day}`; - } - - // Month-based schedules - static monthly = '0 0 1 * *'; - static monthlyOn(day: number, time: string): string { - const [hour, minute] = time.split(':').map(Number); - return `${minute} ${hour} ${day} * *`; - } - static twiceMonthly(first: number, second: number, time: string): string { - const [hour, minute] = time.split(':').map(Number); - return `${minute} ${hour} ${first},${second} * *`; - } - static lastDayOfMonth(time: string): string { - const [hour, minute] = time.split(':').map(Number); - return `${minute} ${hour} L * *`; - } - - // Quarter-based schedules - static quarterly = '0 0 1 */3 *'; - static quarterlyOn(day: number, time: string): string { - const [hour, minute] = time.split(':').map(Number); - return `${minute} ${hour} ${day} */3 *`; - } - - // Year-based schedules - static yearly = '0 0 1 1 *'; - static yearlyOn(month: number, day: number, time: string): string { - const [hour, minute] = time.split(':').map(Number); - return `${minute} ${hour} ${day} ${month} *`; - } -} diff --git a/packages/core/lib/scheduler/schedule.ts b/packages/core/lib/scheduler/schedule.ts index 24177c6..d2a44ad 100644 --- a/packages/core/lib/scheduler/schedule.ts +++ b/packages/core/lib/scheduler/schedule.ts @@ -1,16 +1,25 @@ -import { CronJob, validateCronExpression } from 'cron'; +import { CronJob } from 'cron'; import { Dispatch, Message } from '../queue/index.js'; import { SchedulerRegistry } from './metadata.js'; import { ulid } from 'ulid'; import { HandlerType, + PingOptions, ScheduleHandler, ScheduleOptions, } from './options/interface.js'; import { CommandRunner } from '../console/runner.js'; -import { ScheduleRun } from './schedule-run.js'; +import { ScheduleFrequency } from './frequency.js'; export class Schedule { + static SUNDAY = '0'; + static MONDAY = '1'; + static TUESDAY = '2'; + static WEDNESDAY = '3'; + static THURSDAY = '4'; + static FRIDAY = '5'; + static SATURDAY = '6'; + private scheduleName: ScheduleOptions['name']; private purposeText: ScheduleOptions['purpose']; private handler: ScheduleHandler; @@ -19,8 +28,19 @@ export class Schedule { private cronExpression: string; private beforeFunc: any; private afterFunc: any; - private onErrorFunc: (e: Error) => void | Promise; private autoStart: boolean; + private whenFunc: (...args: any[]) => Promise | boolean; + private skipFunc: (...args: any[]) => Promise | boolean; + private onSuccessFunc: (...args: any[]) => Promise | void; + private onFailureFunc: (...args: any[]) => Promise | void; + private frequency: ScheduleFrequency; + private pingBeforeOptions: PingOptions; + private pingThenOptions: PingOptions; + private pingOnSuccessOptions: PingOptions; + private pingOnFailureOptions: PingOptions; + private sendOutputToUrlOptions: { url: string }; + private sendOutputToFileOptions: { file: string }; + private emailOutputToOptions: string[]; constructor(handler: ScheduleHandler) { this.purposeText = ''; @@ -30,6 +50,14 @@ export class Schedule { this.handler = handler; console.log(this.handler); this.autoStart = true; + this.frequency = new ScheduleFrequency(); + this.pingBeforeOptions = { url: undefined, ifCb: undefined }; + this.pingThenOptions = { url: undefined, ifCb: undefined }; + this.pingOnSuccessOptions = { url: undefined, ifCb: undefined }; + this.pingOnFailureOptions = { url: undefined, ifCb: undefined }; + this.sendOutputToFileOptions = { file: undefined }; + this.sendOutputToUrlOptions = { url: undefined }; + this.emailOutputToOptions = []; } static command(command: string): Schedule { @@ -71,12 +99,6 @@ export class Schedule { return this; } - cron(expression: string): void { - validateCronExpression(expression); - this.cronExpression = expression; - this.makeCronJob(); - } - noAutoStart(): this { this.autoStart = false; return this; @@ -86,180 +108,262 @@ export class Schedule { return this; } - at(time: string): void { - this.cron(ScheduleRun.dailyAt(time)); + cron(expression: string): this { + this.frequency.cron(expression); + return this; } - everySecond(): void { - this.cron(ScheduleRun.everySecond); + at(time: string): this { + this.frequency.dailyAt(time); + return this; } - everyTwoSeconds(): void { - this.cron(ScheduleRun.everyTwoSeconds); + everySecond(): this { + this.frequency.everySecond(); + return this; } - everyFiveSeconds(): void { - this.cron(ScheduleRun.everyFiveSeconds); + everyTwoSeconds(): this { + this.frequency.everyTwoSeconds(); + return this; } - everyTenSeconds() { - this.cron(ScheduleRun.everyTenSeconds); + everyFiveSeconds(): this { + this.frequency.everyFiveSeconds(); + return this; } - everyFifteenSeconds() { - this.cron(ScheduleRun.everyFifteenSeconds); + everyTenSeconds(): this { + this.frequency.everyTenSeconds(); + return this; } - everyTwentySeconds() { - this.cron(ScheduleRun.everyTwentySeconds); + everyFifteenSeconds(): this { + this.frequency.everyFifteenSeconds(); + return this; } - everyThirtySeconds() { - this.cron(ScheduleRun.everyThirtySeconds); + everyTwentySeconds(): this { + this.frequency.everyTwentySeconds(); + return this; } - everyMinute() { - this.cron(ScheduleRun.everyMinute); + everyThirtySeconds(): this { + this.frequency.everyThirtySeconds(); + return this; } - everyTwoMinutes() { - this.cron(ScheduleRun.everyTwoMinutes); + everyMinute(): this { + this.frequency.everyMinute(); + return this; } - everyThreeMinutes() { - this.cron(ScheduleRun.everyThreeMinutes); + everyTwoMinutes(): this { + this.frequency.everyTwoMinutes(); + return this; } - everyFourMinutes() { - this.cron(ScheduleRun.everyFourMinutes); + everyThreeMinutes(): this { + this.frequency.everyThreeMinutes(); + return this; } - everyFiveMinutes() { - this.cron(ScheduleRun.everyFourMinutes); + everyFourMinutes(): this { + this.frequency.everyFourMinutes(); + return this; } - everyTenMinutes() { - this.cron(ScheduleRun.everyTenMinutes); + everyFiveMinutes(): this { + this.frequency.everyFiveMinutes(); + return this; } - everyFifteenMinutes() { - this.cron(ScheduleRun.everyFifteenMinutes); + everyTenMinutes(): this { + this.frequency.everyTenMinutes(); + return this; } - everyThirtyMinutes() { - this.cron(ScheduleRun.everyThirtyMinutes); + everyFifteenMinutes(): this { + this.frequency.everyFifteenMinutes(); + return this; } - hourly() { - this.cron(ScheduleRun.hourly); + everyThirtyMinutes(): this { + this.frequency.everyThirtyMinutes(); + return this; } - hourlyAt(min: number) { - this.cron(ScheduleRun.hourlyAt(min)); + hourly(): this { + this.frequency.hourly(); + return this; } - everyOddHour(mins: number = 0) { - this.cron(ScheduleRun.everyOddHour(mins)); + hourlyAt(min: number): this { + this.frequency.hourlyAt(min); + return this; } - everyTwoHours(mins: number = 0) { - this.cron(ScheduleRun.everyTwoHours(mins)); + everyOddHour(mins: number = 0): this { + this.frequency.everyOddHour(mins); + return this; } - everyThreeHours(mins: number = 0) { - this.cron(ScheduleRun.everyThreeHours(mins)); + everyTwoHours(mins: number = 0): this { + this.frequency.everyTwoHours(mins); + return this; } - everyFourHours(mins: number = 0) { - this.cron(ScheduleRun.everyFourHours(mins)); + everyThreeHours(mins: number = 0): this { + this.frequency.everyThreeHours(mins); + return this; } - everySixHours(mins: number = 0) { - this.cron(ScheduleRun.everySixHours(mins)); + everyFourHours(mins: number = 0): this { + this.frequency.everyFourHours(mins); + return this; } - daily() { - this.cron(ScheduleRun.daily); + everySixHours(mins: number = 0): this { + this.frequency.everySixHours(mins); + return this; } - dailyAt(time: string) { - this.cron(ScheduleRun.dailyAt(time)); + daily(): this { + this.frequency.daily(); + return this; } - twiceDaily(hour1: number, hour2: number) { - this.cron(ScheduleRun.twiceDaily(hour1, hour2)); + dailyAt(time: string): this { + this.frequency.dailyAt(time); + return this; } - twiceDailyAt(hour1: number, hour2: number, mins: number) { - this.cron(ScheduleRun.twiceDailyAt(hour1, hour2, mins)); + twiceDaily(firstTime: string, secondTime: string): this { + this.frequency.twiceDaily(firstTime, secondTime); + return this; } - weekly() { - this.cron(ScheduleRun.weekly); + twiceDailyAt(firstTime: string, secondTime: string): this { + this.frequency.twiceDailyAt(firstTime, secondTime); + return this; } - weeklyOn(day: number, time: string) { - this.cron(ScheduleRun.weeklyOn(day, time)); + weekly(): this { + this.frequency.weekly(); + return this; } - monthly() { - this.cron(ScheduleRun.monthly); + weeklyOn(day: number, time: string): this { + this.frequency.weeklyOn(day, time); + return this; } - monthlyOn(day: number, time: string) { - this.cron(ScheduleRun.monthlyOn(day, time)); + monthly(): this { + this.frequency.monthly(); + return this; } - twiceMonthly(firstDay: number, secondDay: number, time: string) { - this.cron(ScheduleRun.twiceMonthly(firstDay, secondDay, time)); + monthlyOn(day: number, time: string): this { + this.frequency.monthlyOn(day, time); + return this; } - lastDayOfMonth(time: string) { - this.cron(ScheduleRun.lastDayOfMonth(time)); + twiceMonthly(firstDay: number, secondDay: number, time: string): this { + this.frequency.twiceMonthly(firstDay, secondDay, time); + return this; } - quarterly() { - this.cron(ScheduleRun.quarterly); + lastDayOfMonth(time: string): this { + this.frequency.lastDayOfMonth(time); + return this; } - quarterlyOn(day: number, time: string) { - this.cron(ScheduleRun.quarterlyOn(day, time)); + quarterly(time: string): this { + this.frequency.quarterly(time); + return this; } - yearly() { - this.cron(ScheduleRun.yearly); + quarterlyOn(day: number, time: string): this { + this.frequency.quarterlyOn(day, time); + return this; + } + + yearly(): this { + this.frequency.yearly(); + return this; + } + + yearlyOn(month: number, day: number, time: string): this { + this.frequency.yearlyOn(month, day, time); + return this; + } + + weekdays(): this { + this.frequency.weekdays(); + return this; + } + + weekends(): this { + this.frequency.weekends(); + return this; + } + + sundays(): this { + this.frequency.sundays(); + return this; + } + + mondays(): this { + this.frequency.mondays(); + return this; + } + + tuesdays(): this { + this.frequency.tuesdays(); + return this; + } + + wednesdays(): this { + this.frequency.wednesdays(); + return this; + } + + thursdays(): this { + this.frequency.thursdays(); + return this; + } + + fridays(): this { + this.frequency.fridays(); + return this; + } + + saturdays(): this { + this.frequency.saturdays(); + return this; + } + + between(startTime: string, endTime: string): this { + this.frequency.between(startTime, endTime); + return this; + } + + days(days: string[]): this { + this.frequency.days(days); + return this; } - yearlyOn(month: number, day: number, time: string) { - this.cron(ScheduleRun.yearlyOn(month, day, time)); + run() { + this.makeCronJob(); } private makeCronJob() { this.scheduleName = this.scheduleName || `schedule_${ulid()}`; - const onTick = async () => { - try { - console.log('running on tick ===> '); - const beforeResult = this.beforeFunc && (await this.beforeFunc()); - console.log('before result ===> ', beforeResult); - const { type, value } = this.handler; - if (type === HandlerType.COMMAND) { - await CommandRunner.run(value); - } else if (type === HandlerType.FUNCTION) { - await value(); - } else if (type === HandlerType.JOB) { - await Dispatch(value); - } - - console.log(this.handler); - const afterResult = this.afterFunc && (await this.afterFunc()); - console.log('after result ===> ', beforeResult); - } catch (e) { - await this.onErrorFunc(e as Error); - } - }; + this.cronExpression = this.frequency.build(); + console.log('cron expression ===> ', this.cronExpression); this.cronJob = CronJob.from({ cronTime: this.cronExpression, - onTick: onTick.bind(this), + onTick: this.composeHandler.bind(this), start: this.autoStart, timeZone: this.tz, }); @@ -267,6 +371,134 @@ export class Schedule { SchedulerRegistry.register(this.scheduleName, this); } + async composeHandler() { + try { + const startedAt = this.formatDate(new Date()); + const startedAtEpoch = performance.now(); + + if (this.whenFunc) { + const shouldRun = await this.whenFunc(); + if (!shouldRun) return; + } + + if (this.skipFunc) { + const shouldSkip = await this.skipFunc(); + if (shouldSkip) return; + } + + const beforeResult = await this.processBeforeEvents({ startedAt }); + + const { type, value } = this.handler; + let result = null; + if (type === HandlerType.COMMAND) { + result = await CommandRunner.run(value); + } else if (type === HandlerType.FUNCTION) { + result = await value(beforeResult); + } else if (type === HandlerType.JOB) { + result = await Dispatch(value); + } + await this.processAfterEvents(result, { + startedAtEpoch: startedAtEpoch, + startedAt, + }); + } catch (e) { + await this.processFailureEvents(e as Error); + } + } + + async processBeforeEvents(options: { startedAt: string }): Promise { + const beforeResult = this.beforeFunc && (await this.beforeFunc()); + if (!this.pingBeforeOptions.url) return beforeResult; + + const shouldPing = this.pingBeforeOptions.ifCb + ? await this.pingBeforeOptions.ifCb() + : true; + + if (!shouldPing) return beforeResult; + + const payload = { + event: 'before', + scheduleName: this.scheduleName, + cronExpression: this.cronExpression, + purpose: this.purposeText, + timezone: this.tz, + startedAt: options.startedAt, + }; + await fetch(this.pingBeforeOptions.url, { + method: 'POST', + body: JSON.stringify(payload), + }); + } + + async processAfterEvents( + result: any, + options: { startedAtEpoch: number; startedAt: string }, + ) { + const afterResult = this.afterFunc && (await this.afterFunc(result)); + this.onSuccessFunc && (await this.onSuccessFunc(result)); + + if (!this.pingThenOptions.url && !this.pingOnSuccessOptions.url) { + return afterResult; + } + + const shouldPingThen = this.pingThenOptions.ifCb + ? await this.pingThenOptions.ifCb() + : true; + + const totalTimeInMs = performance.now() - options.startedAtEpoch; + const payload = { + event: 'after', + scheduleName: this.scheduleName, + cronExpression: this.cronExpression, + totalTimeInMs, + startedAt: options.startedAt, + }; + + if (shouldPingThen) { + await fetch(this.pingThenOptions.url, { + method: 'POST', + body: JSON.stringify(payload), + }); + } + + if (!this.pingOnSuccessOptions.url) return afterResult; + + const shouldPingSuccess = this.pingOnSuccessOptions.ifCb + ? await this.pingOnSuccessOptions.ifCb() + : true; + + if (!shouldPingSuccess) return afterResult; + + await fetch(this.pingOnSuccessOptions.url, { + method: 'POST', + body: JSON.stringify({ ...payload, event: 'success' }), + }); + } + + async processFailureEvents(error: Error): Promise { + const failureResult = + this.onFailureFunc && (await this.onFailureFunc(error)); + + if (!this.pingOnFailureOptions.url) return; + + const shouldPingFailure = this.pingOnFailureOptions.ifCb + ? await this.pingOnFailureOptions.ifCb() + : true; + + if (!shouldPingFailure) return; + + const payload = { + scheduleName: this.scheduleName, + cronExpression: this.cronExpression, + event: 'failure', + }; + + await fetch(this.pingOnFailureOptions.url, { + method: 'POST', + body: JSON.stringify(payload), + }); + } + /** * Getter methods */ @@ -303,8 +535,110 @@ export class Schedule { return this; } - onError(fun: (e: Error) => void): this { - this.onErrorFunc = fun; + onFailure(fun: (e: Error) => void): this { + this.onFailureFunc = fun; + return this; + } + + onSuccess(fun: (...args: any[]) => void): this { + this.onSuccessFunc = fun; return this; } + + pingBefore(url: string): this { + this.pingBeforeOptions = { url, ifCb: undefined }; + return this; + } + + pingBeforeIf( + cb: (...args: any[]) => Promise | boolean, + url: string, + ): this { + this.pingBeforeOptions.ifCb = cb; + this.pingBeforeOptions.url = url; + return this; + } + + thenPing(url: string): this { + this.pingThenOptions = { url, ifCb: undefined }; + return this; + } + + thenPingIf( + cb: (...args: any[]) => Promise | boolean, + url: string, + ): this { + this.pingThenOptions.ifCb = cb; + this.pingThenOptions.url = url; + return this; + } + + onSuccessPing(url: string): this { + this.pingOnSuccessOptions = { url, ifCb: undefined }; + return this; + } + + pingOnSuccessIf( + cb: (...args: any[]) => Promise | boolean, + url: string, + ): this { + this.pingOnSuccessOptions.ifCb = cb; + this.pingOnSuccessOptions.url = url; + return this; + } + + pingOnFailure(url: string): this { + this.pingOnFailureOptions = { url, ifCb: undefined }; + return this; + } + + pingOnFailureIf( + cb: (...args: any[]) => Promise | boolean, + url: string, + ): this { + this.pingOnFailureOptions.ifCb = cb; + this.pingOnFailureOptions.url = url; + return this; + } + + sendOutputToUrl(url: string): this { + this.sendOutputToUrlOptions.url = url; + return this; + } + + sendOutputToFile(file: string): this { + this.sendOutputToFileOptions = { file }; + return this; + } + + emailOutputTo(...emails: string[]): this { + this.emailOutputToOptions.push(...emails); + return this; + } + + emailOutputOnFailure(...emails: string[]): this { + this.emailOutputToOptions.push(...emails); + return this; + } + + when(cb: (...args: any[]) => Promise | boolean): this { + this.whenFunc = cb; + return this; + } + + skip(cb: (...args: any[]) => Promise | boolean): this { + this.skipFunc = cb; + return this; + } + + formatDate(date: Date): string { + return new Intl.DateTimeFormat('en-US', { + timeZone: this.tz ? this.tz : 'UTC', + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + }).format(date); + } } From 34172063bd9d2ed25c37d0b4001473a14aafd9c6 Mon Sep 17 00:00:00 2001 From: Vinayak Sarawagi Date: Sun, 20 Apr 2025 12:00:02 +0530 Subject: [PATCH 3/3] feat(core): enhance scheduling functionality with output handling and email notifications - Introduced new methods for appending output to files and sending email notifications based on task results. - Updated Schedule class to support shell command execution and improved error handling. - Refactored ScheduleOptions to include output file options for better flexibility. - Commented out previous scheduling commands in the sample app for clarity. - Removed unused imports in ScheduleServiceTest to streamline the code. --- integrations/sample-app/app/boot/sp/app.ts | 71 ++++--- .../sample-app/app/services/schedule.ts | 6 - .../core/lib/scheduler/options/interface.ts | 1 + packages/core/lib/scheduler/schedule.ts | 191 ++++++++++++++---- 4 files changed, 196 insertions(+), 73 deletions(-) diff --git a/integrations/sample-app/app/boot/sp/app.ts b/integrations/sample-app/app/boot/sp/app.ts index d537c31..1dd9659 100644 --- a/integrations/sample-app/app/boot/sp/app.ts +++ b/integrations/sample-app/app/boot/sp/app.ts @@ -42,37 +42,46 @@ export class AppServiceProvider extends ServiceProvider { /** * Schedule Intent Command to run daily. */ - Schedule.command('send:email') - // .days([Schedule.MONDAY, Schedule.THURSDAY]) - .hourly() - .timezone('America/Chicago') - .between('8:00', '17:00') + + Schedule.exec('ls -la') + .everyTwoSeconds() + .appendOutputToFile('output.txt') + .emailOutputTo('vinayak@tryhanalabs.com') .run(); + // Schedule.command('send:email') + // // .days([Schedule.MONDAY, Schedule.THURSDAY]) + // .hourly() + // .timezone('America/Chicago') + // .between('8:00', '17:00') + // .run(); + /** * Simple callback, with lifecycle methods `before` and `after`. */ - Schedule.call(() => { - console.log('inside the schedule method'); - }) - .purpose('sample scheduler') - .before(() => console.log('this will run before the cron')) - .after((output: any) => - console.log('this will run after the cron', output), - ) - .onSuccess((result) => - console.log('this will run on success the cron', result), - ) - .onFailure((error) => - console.log('this will run on failure the cron', error), - ) - // .pingBefore('https://webhook.site/79dcb789-869b-459d-9ba9-638aae449328') - .thenPing('https://webhook.site/79dcb789-869b-459d-9ba9-638aae449328') - .weekends() - .everyTwoSeconds() - .when(() => true) - - .run(); + // Schedule.call(() => { + // console.log('inside the schedule method'); + // return 'hello'; + // }) + // .purpose('sample scheduler') + // .before(() => console.log('this will run before the cron')) + // .after((output: any) => + // console.log('this will run after the cron', output), + // ) + // .onSuccess((result) => + // console.log('this will run on success the cron', result), + // ) + // .onFailure((error) => + // console.log('this will run on failure the cron', error), + // ) + // // .pingBefore('https://webhook.site/79dcb789-869b-459d-9ba9-638aae449328') + // .thenPing('https://webhook.site/79dcb789-869b-459d-9ba9-638aae449328') + // .weekends() + // .everyTwoSeconds() + // // .pingOnSuccess('https://webhook.site/79dcb789-869b-459d-9ba9-638aae449328') + // .when(() => true) + // .appendOutputToFile('output.txt') + // .run(); /** * Running a job every day at 5AM. @@ -85,5 +94,15 @@ export class AppServiceProvider extends ServiceProvider { // .everyFiveSeconds() // .weekends() // .run(); + + // Schedule.command('emails:send') + // .daily() + // .onSuccess((result) => { + // console.log('emails:send on success', result); + // }) + // .onFailure((error: Error) => { + // console.log('emails:send on failure', error); + // }) + // .run(); } } diff --git a/integrations/sample-app/app/services/schedule.ts b/integrations/sample-app/app/services/schedule.ts index ab2ffbd..e379cc0 100644 --- a/integrations/sample-app/app/services/schedule.ts +++ b/integrations/sample-app/app/services/schedule.ts @@ -1,10 +1,4 @@ import { Injectable } from '@intentjs/core'; -import { - Schedule, - SchedulerRegistry, - ScheduleRun, -} from '@intentjs/core/schedule'; - @Injectable() export class ScheduleServiceTest { constructor() {} diff --git a/packages/core/lib/scheduler/options/interface.ts b/packages/core/lib/scheduler/options/interface.ts index bc0b2b8..70e91cf 100644 --- a/packages/core/lib/scheduler/options/interface.ts +++ b/packages/core/lib/scheduler/options/interface.ts @@ -4,6 +4,7 @@ export type ScheduleOptions = { name?: string; timezone?: string; purpose?: string; + outputFile?: { file: string; append?: boolean }; }; export enum HandlerType { diff --git a/packages/core/lib/scheduler/schedule.ts b/packages/core/lib/scheduler/schedule.ts index d2a44ad..11b7060 100644 --- a/packages/core/lib/scheduler/schedule.ts +++ b/packages/core/lib/scheduler/schedule.ts @@ -10,6 +10,12 @@ import { } from './options/interface.js'; import { CommandRunner } from '../console/runner.js'; import { ScheduleFrequency } from './frequency.js'; +import fs from 'fs-extra'; +import execa from 'execa'; +import { MailMessage } from '../mailer/message.js'; +import { Mail } from '../mailer/mail.js'; + +const { appendFileSync, writeFileSync } = fs; export class Schedule { static SUNDAY = '0'; @@ -38,9 +44,8 @@ export class Schedule { private pingThenOptions: PingOptions; private pingOnSuccessOptions: PingOptions; private pingOnFailureOptions: PingOptions; - private sendOutputToUrlOptions: { url: string }; - private sendOutputToFileOptions: { file: string }; - private emailOutputToOptions: string[]; + private outputFileOptions: ScheduleOptions['outputFile']; + private emailOutputToOptions: { email: string; onFailureOnly?: boolean }[]; constructor(handler: ScheduleHandler) { this.purposeText = ''; @@ -48,15 +53,13 @@ export class Schedule { this.cronJob = null; this.cronExpression = ''; this.handler = handler; - console.log(this.handler); this.autoStart = true; this.frequency = new ScheduleFrequency(); this.pingBeforeOptions = { url: undefined, ifCb: undefined }; this.pingThenOptions = { url: undefined, ifCb: undefined }; this.pingOnSuccessOptions = { url: undefined, ifCb: undefined }; this.pingOnFailureOptions = { url: undefined, ifCb: undefined }; - this.sendOutputToFileOptions = { file: undefined }; - this.sendOutputToUrlOptions = { url: undefined }; + this.outputFileOptions = { file: undefined }; this.emailOutputToOptions = []; } @@ -372,10 +375,11 @@ export class Schedule { } async composeHandler() { - try { - const startedAt = this.formatDate(new Date()); - const startedAtEpoch = performance.now(); + let output = null; + const startedAt = this.formatDate(new Date()); + const startedAtEpoch = performance.now(); + try { if (this.whenFunc) { const shouldRun = await this.whenFunc(); if (!shouldRun) return; @@ -389,21 +393,44 @@ export class Schedule { const beforeResult = await this.processBeforeEvents({ startedAt }); const { type, value } = this.handler; - let result = null; + console.log('type ===> ', type); + console.log('value ===> ', value); if (type === HandlerType.COMMAND) { - result = await CommandRunner.run(value); + console.log('executing command ===> ', value); + output = await CommandRunner.run(value); } else if (type === HandlerType.FUNCTION) { - result = await value(beforeResult); + output = await value(beforeResult); } else if (type === HandlerType.JOB) { - result = await Dispatch(value); + output = await Dispatch(value); + } else if (type === HandlerType.SHELL) { + console.log('executing shell command ===> ', value); + const command = value.split(' '); + const { stdout, stderr, exitCode } = await execa( + command[0], + command.slice(1), + { stdio: 'pipe' }, + ); + if (exitCode !== 0) throw new Error(stderr); + output = stdout; } - await this.processAfterEvents(result, { + + await this.sendEmail(output); + + await this.processAfterEvents(output, { startedAtEpoch: startedAtEpoch, startedAt, }); } catch (e) { - await this.processFailureEvents(e as Error); + console.error('error ===> ', e); + await this.sendEmail(output, e as Error); + await this.processFailureEvents(e as Error, output); + return; } + + await this.processSuccessEvents(output, { + startedAtEpoch: startedAtEpoch, + startedAt, + }); } async processBeforeEvents(options: { startedAt: string }): Promise { @@ -434,50 +461,69 @@ export class Schedule { result: any, options: { startedAtEpoch: number; startedAt: string }, ) { + this.writeOutputToFile(result); const afterResult = this.afterFunc && (await this.afterFunc(result)); - this.onSuccessFunc && (await this.onSuccessFunc(result)); - if (!this.pingThenOptions.url && !this.pingOnSuccessOptions.url) { - return afterResult; - } + if (!this.pingThenOptions.url) return afterResult; const shouldPingThen = this.pingThenOptions.ifCb ? await this.pingThenOptions.ifCb() : true; - const totalTimeInMs = performance.now() - options.startedAtEpoch; + if (!shouldPingThen) return; + const payload = { event: 'after', scheduleName: this.scheduleName, cronExpression: this.cronExpression, - totalTimeInMs, startedAt: options.startedAt, }; - if (shouldPingThen) { + try { await fetch(this.pingThenOptions.url, { method: 'POST', body: JSON.stringify(payload), }); + } catch (e) { + console.error(e); } + } + + async processSuccessEvents( + output: any, + options: { startedAtEpoch: number; startedAt: string }, + ): Promise { + this.onSuccessFunc && (await this.onSuccessFunc(output)); - if (!this.pingOnSuccessOptions.url) return afterResult; + if (!this.pingOnSuccessOptions.url) return; const shouldPingSuccess = this.pingOnSuccessOptions.ifCb ? await this.pingOnSuccessOptions.ifCb() : true; - if (!shouldPingSuccess) return afterResult; + if (!shouldPingSuccess) return; - await fetch(this.pingOnSuccessOptions.url, { - method: 'POST', - body: JSON.stringify({ ...payload, event: 'success' }), - }); + const payload = { + totalTimeInMs: performance.now() - options.startedAtEpoch, + event: 'success', + scheduleName: this.scheduleName, + cronExpression: this.cronExpression, + startedAt: this.formatDate(new Date()), + }; + + try { + await fetch(this.pingOnSuccessOptions.url, { + method: 'POST', + body: JSON.stringify(payload), + }); + } catch (e) { + console.error(e); + } } - async processFailureEvents(error: Error): Promise { - const failureResult = - this.onFailureFunc && (await this.onFailureFunc(error)); + async processFailureEvents(error: Error, result: any): Promise { + this.onFailureFunc && (await this.onFailureFunc(error)); + this.writeOutputToFile(result, error); if (!this.pingOnFailureOptions.url) return; @@ -493,12 +539,66 @@ export class Schedule { event: 'failure', }; - await fetch(this.pingOnFailureOptions.url, { - method: 'POST', - body: JSON.stringify(payload), - }); + try { + await fetch(this.pingOnFailureOptions.url, { + method: 'POST', + body: JSON.stringify(payload), + }); + } catch (e) { + console.error(e); + } } + writeOutputToFile(result: any, error?: Error): void { + if (!this.outputFileOptions.file) { + return; + } + + const content = { + event: error ? 'failure' : 'success', + date: this.formatDate(new Date()), + error: error?.message, + stack: error?.stack, + result, + }; + if (this.outputFileOptions.append) { + appendFileSync( + this.outputFileOptions.file, + JSON.stringify(content) + '\n', + ); + return; + } + + writeFileSync(this.outputFileOptions.file, JSON.stringify(content) + '\n'); + } + + async sendEmail(output: string, error?: Error): Promise { + if (!this.emailOutputToOptions.length) return; + + const subject = `Output from scheduled task: ${this.scheduleName}`; + const content = { + name: this.scheduleName, + schedule: this.cronExpression, + purpose: this.purposeText, + timezone: this.tz, + startedAt: this.formatDate(new Date()), + result: output, + error: error?.message, + stack: error?.stack, + status: error ? 'failure' : 'success', + }; + + const mail = MailMessage.init() + .preview(subject) + .subject(subject) + .raw(JSON.stringify(content)); + + const emails = error + ? this.emailOutputToOptions.filter(o => o.onFailureOnly).map(o => o.email) + : this.emailOutputToOptions.map(o => o.email); + + emails.length && (await Mail.init().to(emails).send(mail)); + } /** * Getter methods */ @@ -578,6 +678,11 @@ export class Schedule { return this; } + pingOnSuccess(url: string): this { + this.pingOnSuccessOptions = { url, ifCb: undefined }; + return this; + } + pingOnSuccessIf( cb: (...args: any[]) => Promise | boolean, url: string, @@ -601,23 +706,27 @@ export class Schedule { return this; } - sendOutputToUrl(url: string): this { - this.sendOutputToUrlOptions.url = url; + sendOutputToFile(file: string, append: boolean = false): this { + this.outputFileOptions = { file, append }; return this; } - sendOutputToFile(file: string): this { - this.sendOutputToFileOptions = { file }; + appendOutputToFile(file: string): this { + this.outputFileOptions = { file, append: true }; return this; } emailOutputTo(...emails: string[]): this { - this.emailOutputToOptions.push(...emails); + this.emailOutputToOptions.push( + ...emails.map(email => ({ email, onFailureOnly: false })), + ); return this; } emailOutputOnFailure(...emails: string[]): this { - this.emailOutputToOptions.push(...emails); + this.emailOutputToOptions.push( + ...emails.map(email => ({ email, onFailureOnly: true })), + ); return this; }