From e377c8ff4135033d8fbc86d498c445c639ac851a Mon Sep 17 00:00:00 2001 From: EdgarEldy Date: Wed, 26 Aug 2026 09:37:55 +0400 Subject: [PATCH 01/13] chore: install pg, bouncer, limiter, mail, cache, argon2, jose and adonis-autoswagger Consolidates every dependency the README's Tech Stack table calls for onto this branch instead of letting later branches install them one at a time. Also adds argon2 to allowScripts since its install step needs to run for the native binding to be usable. --- package-lock.json | 1134 +++++++++++++++++++++++++++++++++++++++++---- package.json | 21 +- 2 files changed, 1071 insertions(+), 84 deletions(-) diff --git a/package-lock.json b/package-lock.json index 638a59e..2ae3862 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,16 +10,24 @@ "license": "MIT", "dependencies": { "@adonisjs/auth": "^10.1.0", + "@adonisjs/bouncer": "^4.0.1", + "@adonisjs/cache": "^2.1.0", "@adonisjs/core": "^7.4.0", "@adonisjs/cors": "^3.0.0", + "@adonisjs/limiter": "^3.0.1", "@adonisjs/lucid": "^22.4.2", + "@adonisjs/mail": "^10.4.0", "@adonisjs/session": "^8.1.0", "@adonisjs/shield": "^9.0.0", "@japa/api-client": "^3.2.1", "@tuyau/core": "^1.2.2", "@vinejs/vine": "^4.4.0", + "adonis-autoswagger": "^3.73.0", + "argon2": "^0.45.1", "better-sqlite3": "^13.0.3", + "jose": "^6.2.10", "luxon": "^3.7.2", + "pg": "^8.23.0", "reflect-metadata": "^0.2.2" }, "devDependencies": { @@ -33,6 +41,7 @@ "@poppinss/ts-exec": "^1.4.4", "@types/luxon": "^3.7.4", "@types/node": "~26.2.0", + "@types/pg": "^8.23.1", "eslint": "^10.8.1", "hot-hook": "^1.0.0", "pino-pretty": "^13.1.3", @@ -94,7 +103,6 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/@adonisjs/assembler/-/assembler-8.5.0.tgz", "integrity": "sha512-/P0SEKMAeiIPlAqct/WPNTw5KdHfxmCDWJtiHDN+GL+Vz5gZezKFU8vVxBTuAwIIMhDNlTqkEFKGyrHCqNnSiQ==", - "devOptional": true, "license": "MIT", "dependencies": { "@adonisjs/env": "^7.0.0", @@ -195,6 +203,61 @@ "@adonisjs/http-server": "^8.0.0-next.17 || ^8.0.0 || ^9.0.0" } }, + "node_modules/@adonisjs/bouncer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@adonisjs/bouncer/-/bouncer-4.0.1.tgz", + "integrity": "sha512-YTVlr2apjEHZIDgs09zl2dAMse5xBOCWQ+iY5qYxsZwMRAZcNHaOMjhD6LGjxXKyyM0tFbypgshAWiKuFbI1MA==", + "license": "MIT", + "dependencies": { + "@poppinss/utils": "^7.0.1" + }, + "engines": { + "node": ">=24.0.0" + }, + "peerDependencies": { + "@adonisjs/assembler": "^8.0.0-next.26 || ^8.0.0", + "@adonisjs/core": "^7.0.0-next.16 || ^7.0.0", + "@adonisjs/i18n": "^3.0.0-next.2 || ^3.0.0", + "edge.js": "^6.4.0" + }, + "peerDependenciesMeta": { + "@adonisjs/assembler": { + "optional": true + }, + "@adonisjs/i18n": { + "optional": true + }, + "edge.js": { + "optional": true + } + } + }, + "node_modules/@adonisjs/cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@adonisjs/cache/-/cache-2.1.0.tgz", + "integrity": "sha512-rrdpJ10zF+6IWfAjz6wj1dBqPrtzk3q53ezsm+sYymNeG8C31Cj5FvwdbbhcXoQvR/SLOEi6SONtDxHK/D8doA==", + "license": "MIT", + "dependencies": { + "bentocache": "^1.6.1" + }, + "engines": { + "node": ">=22.0.0" + }, + "peerDependencies": { + "@adonisjs/assembler": "^8.0.0-next.19", + "@adonisjs/core": "^7.0.0-next.13", + "@adonisjs/lucid": "^22.0.0-next.1", + "@adonisjs/redis": "^10.0.0-next.1" + }, + "peerDependenciesMeta": { + "@adonisjs/lucid": { + "optional": true + }, + "@adonisjs/redis": { + "optional": true + } + } + }, "node_modules/@adonisjs/config": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@adonisjs/config/-/config-6.1.0.tgz", @@ -500,6 +563,35 @@ "@adonisjs/fold": "^11.0.0-next.2" } }, + "node_modules/@adonisjs/limiter": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@adonisjs/limiter/-/limiter-3.0.1.tgz", + "integrity": "sha512-U7drt/FPlB5PV84dnxQQSFGk75fDxgEHSkfT/eGwx/+Z4re7XlkVU4oros/VGefD72JTgXp7Kz97tS1XW7eEXA==", + "dependencies": { + "rate-limiter-flexible": "^9.1.1" + }, + "peerDependencies": { + "@adonisjs/assembler": "^8.0.0-next.9 || ^8.0.0", + "@adonisjs/core": "^7.0.0-next.1 || ^7.0.0", + "@adonisjs/i18n": "^3.0.0-next.0 || ^3.0.0", + "@adonisjs/lucid": "^22.0.0-next.0 || ^22.0.0", + "@adonisjs/redis": "^10.0.0-next.1 || ^10.0.0" + }, + "peerDependenciesMeta": { + "@adonisjs/assembler": { + "optional": true + }, + "@adonisjs/i18n": { + "optional": true + }, + "@adonisjs/lucid": { + "optional": true + }, + "@adonisjs/redis": { + "optional": true + } + } + }, "node_modules/@adonisjs/logger": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/@adonisjs/logger/-/logger-7.1.1.tgz", @@ -565,6 +657,57 @@ } } }, + "node_modules/@adonisjs/mail": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@adonisjs/mail/-/mail-10.4.0.tgz", + "integrity": "sha512-+o5qYB26gJgOGQysR/1KVEziM+MhSX9uP5ZBZjQuPC2xPTfvL5k10jHFQe5fZimhRHnETtNhoi4h3KIlen4KmQ==", + "license": "MIT", + "dependencies": { + "@poppinss/macroable": "^1.1.2", + "@poppinss/object-builder": "^1.1.0", + "@types/nodemailer": "^8.0.1", + "fastq": "^1.20.1", + "ical-generator": "^11.0.0", + "ky": "^2.0.2", + "nodemailer": "^9.0.3" + }, + "engines": { + "node": ">=24.0.0" + }, + "peerDependencies": { + "@adonisjs/assembler": "^8.0.0-next.14 || ^8.0.0", + "@adonisjs/core": "^7.0.0-next.8 || ^7.0.0", + "@aws-sdk/client-sesv2": "^3.997.0", + "edge.js": "^6.0.1", + "mjml": "^4.18.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "@adonisjs/assembler": { + "optional": true + }, + "@aws-sdk/client-sesv2": { + "optional": true + }, + "edge.js": { + "optional": true + }, + "mjml": { + "optional": true + } + } + }, + "node_modules/@adonisjs/mail/node_modules/ky": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ky/-/ky-2.0.2.tgz", + "integrity": "sha512-/GmXpo9F9W+f8n4Ivr2iH+7h7wL7jLbLKWkMlpflcCRb6kGjBfTlASEXaZ9qUgNTn4VgS0P2pwxxzQ4EM6Ulgg==", + "license": "MIT", + "engines": { + "node": ">=22" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, "node_modules/@adonisjs/presets": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@adonisjs/presets/-/presets-3.0.0.tgz", @@ -709,7 +852,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-2.0.1.tgz", "integrity": "sha512-iCKVQcIC0e3oDxEfs3SHQGW+ovhBMZmS1TE+bTk50rVyMCBmCfClv7Qi3HQKlumYwvjb/iIMeWCW2i67q6kFfQ==", - "devOptional": true, "license": "MIT", "dependencies": { "package-manager-detector": "^1.7.0", @@ -732,7 +874,6 @@ "version": "0.45.1", "resolved": "https://registry.npmjs.org/@ast-grep/napi/-/napi-0.45.1.tgz", "integrity": "sha512-4cmGQEHoP9GLHEhGvd1vgSzO3Y6KF7FczDk4+q/VfXV9/9sNxNVgNHC8t3BglhIADDcoHrCMc9aw4lHG+M240A==", - "devOptional": true, "license": "MIT", "engines": { "node": ">= 10" @@ -940,6 +1081,54 @@ "url": "https://github.com/sponsors/Borewit" } }, + "node_modules/@boringnode/bus": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@boringnode/bus/-/bus-0.9.1.tgz", + "integrity": "sha512-3N2Gr131VlZSvLMm2E3JYfQcnvlFLZKaOFYC2D6cQllSf61sj7Ffr51PMPStb/slDbkM8avbsRg4AP7WDMSNhw==", + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^3.3.0", + "@poppinss/utils": "^7.0.1", + "object-hash": "^3.0.0" + }, + "engines": { + "node": ">=20.6" + }, + "peerDependencies": { + "ioredis": "^5.0.0" + }, + "peerDependenciesMeta": { + "ioredis": { + "optional": true + } + } + }, + "node_modules/@boringnode/bus/node_modules/@noble/hashes": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.3.0.tgz", + "integrity": "sha512-oN+QwyX7VSHotibwubG3kpzbwKrfnyR6OOO+3Nk/53ADL7FmgHHz4TgrbaYKvvOw09u6QTx0oiH1cNCIOuN0CQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@boringnode/bus/node_modules/@paralleldrive/cuid2": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-3.3.0.tgz", + "integrity": "sha512-OqiFvSOF0dBSesELYY2CAMa4YINvlLpvKOz/rv6NeZEqiyttlHgv98Juwv4Ch+GrEV7IZ8jfI2VcEoYUjXXCjw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "^2.0.1", + "bignumber.js": "^9.3.1", + "error-causes": "^3.0.2" + }, + "bin": { + "cuid2": "bin/cuid2.js" + } + }, "node_modules/@boringnode/encryption": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@boringnode/encryption/-/encryption-1.0.1.tgz", @@ -962,6 +1151,12 @@ "node": ">=0.1.90" } }, + "node_modules/@epic-web/invariant": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", + "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", + "license": "MIT" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", @@ -1328,6 +1523,28 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/@julr/utils": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@julr/utils/-/utils-1.9.0.tgz", + "integrity": "sha512-hKKa29qRusABvUDt5QnJydG9aigplMJMaOrGwu11DAbZyxjqiytfOku6KbrdA1z0yUSvnFU8fSeJMXroYt+bwA==", + "license": "MIT", + "dependencies": { + "@lukeed/ms": "^2.0.2", + "bytes": "^3.1.2" + }, + "funding": { + "url": "https://github.com/sponsors/Julien-R44" + } + }, + "node_modules/@lukeed/ms": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.2.tgz", + "integrity": "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/@noble/hashes": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", @@ -1344,7 +1561,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "devOptional": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -1358,7 +1574,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "devOptional": true, "license": "MIT", "engines": { "node": ">= 8" @@ -1368,7 +1583,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "devOptional": true, "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -1594,7 +1808,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", - "devOptional": true, "license": "MIT" }, "node_modules/@sinclair/typebox": { @@ -1619,7 +1832,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -1968,7 +2180,6 @@ "version": "0.29.0", "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.29.0.tgz", "integrity": "sha512-35oUmphHbJvQ/+UTwFNme/t2p3FoKiGJ5auTjjpNTop2dyREspirjMy82PLSC1pnDJ8ah1GU98hwpVt64YXQsg==", - "devOptional": true, "license": "MIT", "dependencies": { "minimatch": "^10.0.1", @@ -2056,7 +2267,7 @@ "version": "3.7.5", "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.7.5.tgz", "integrity": "sha512-jJ41Q4z6ZVO260MNDdHfW7+7a5iMiX8Mr6ZJHcmgrvhZha6dz5704o/lF2kKl6URjH6ivEL97w9xS/MgpJEphg==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@types/methods": { @@ -2074,6 +2285,15 @@ "undici-types": "~8.3.0" } }, + "node_modules/@types/nodemailer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-8.0.1.tgz", + "integrity": "sha512-PxpaInm8V1JQDd4j0ds5HfvWQk8JupS1C0Picb96QJsrrRDjBH+DlK7L4ZdNSqNULhiZRQHc40nLVShaGxXAMw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", @@ -2081,6 +2301,18 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/pg": { + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.23.1.tgz", + "integrity": "sha512-fKVHpikPdg4GKks3JuLEhvwSyvwzF23hnabPy6DD8ljVbC7+6J5dQzdv4arV6jqq57djnMgs1HKBxX4P8aBI3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, "node_modules/@types/pluralize": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/@types/pluralize/-/pluralize-0.0.33.tgz", @@ -2384,11 +2616,27 @@ "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", "license": "MIT" }, + "node_modules/abstract-syntax-tree": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/abstract-syntax-tree/-/abstract-syntax-tree-2.24.0.tgz", + "integrity": "sha512-XLnDjO9d5CjNewxkGMEVFPGpphxr4NQc8oRqqqvOSXM2jVyqbdvW8T+bnqyg6KjRm0PRUOQzVGGTprVV+MsflA==", + "license": "MIT", + "dependencies": { + "ast-types": "0.14.2", + "astring": "^1.9.0", + "esquery": "^1.7.0", + "meriyah": "^7.2.0", + "pure-conditions": "^1.2.3", + "source-map": "^0.8.0" + }, + "engines": { + "node": ">=20.11.1" + } + }, "node_modules/acorn": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", - "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -2401,12 +2649,145 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/adonis-autoswagger": { + "version": "3.73.0", + "resolved": "https://registry.npmjs.org/adonis-autoswagger/-/adonis-autoswagger-3.73.0.tgz", + "integrity": "sha512-Fhzsj++PyaWeQARpd8USwNNOaT2Jr280b8Pk89t7P9YwMeUzh/KyiOhafo5h+KlArp6hLVmaiTscE+O2SToHTg==", + "license": "MIT", + "dependencies": { + "@vinejs/vine": "^2.1.0", + "abstract-syntax-tree": "^2.20.5", + "change-case": "^4.1.2", + "espree": "^9.3.1", + "extract-comments": "^1.1.0", + "http-status-code": "^2.1.0", + "json-to-pretty-yaml": "^1.2.2", + "lodash": "^4.17.21", + "parse-imports": "^1.1.2", + "typescript": "^5.8.2", + "typescript-parser": "^2.6.1" + } + }, + "node_modules/adonis-autoswagger/node_modules/@vinejs/compiler": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@vinejs/compiler/-/compiler-2.5.1.tgz", + "integrity": "sha512-efiO/SCQSMCqz6LDZTI4R3Ceq1ik3K2IqefEbbch+ko4dZncaYmQWJpX/fXVwgmO78jTZuerzD4I2WphPJUCwg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/adonis-autoswagger/node_modules/@vinejs/vine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@vinejs/vine/-/vine-2.1.0.tgz", + "integrity": "sha512-09aJ2OauxpblqiNqd8qC9RAzzm5SV6fTqZhE4e25j4cM7fmNoXRTjM7Oo8llFADMO4eSA44HqYEO3mkRRYdbYw==", + "license": "MIT", + "dependencies": { + "@poppinss/macroable": "^1.0.2", + "@types/validator": "^13.11.9", + "@vinejs/compiler": "^2.5.0", + "camelcase": "^8.0.0", + "dayjs": "^1.11.11", + "dlv": "^1.1.3", + "normalize-url": "^8.0.1", + "validator": "^13.11.0" + }, + "engines": { + "node": ">=18.16.0" + } + }, + "node_modules/adonis-autoswagger/node_modules/camelcase": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/adonis-autoswagger/node_modules/change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/adonis-autoswagger/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/adonis-autoswagger/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/adonis-autoswagger/node_modules/parse-imports": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-1.2.0.tgz", + "integrity": "sha512-K5aG9cextqjAlyevwuSMjWPbBr+X8xGgfHS4VopbKC1u3jLndRGl2CoUHMTvuD6LIg4di5TzH/Pw9+XZyTjI/w==", + "license": "Apache 2.0", + "dependencies": { + "es-module-lexer": "^1.5.2", + "slashes": "^3.0.12" + }, + "engines": { + "node": ">= 12.17" + } + }, + "node_modules/adonis-autoswagger/node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/ajv": { "version": "6.15.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", @@ -2482,6 +2863,22 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/argon2": { + "version": "0.45.1", + "resolved": "https://registry.npmjs.org/argon2/-/argon2-0.45.1.tgz", + "integrity": "sha512-skm+/WCjkGqCQxF7FG1LuZXM5yvbFjgbfiCGsud2oLgaDhh6b6dbH0b1EkghbM+xx4Bj8Ape+KKgixoIlWZicQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@phc/format": "^1.0.0", + "cross-env": "^10.1.0", + "node-addon-api": "^8.9.0", + "node-gyp-build": "^4.8.4" + }, + "engines": { + "node": ">=16.17.0" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -2498,6 +2895,36 @@ "node": ">=12" } }, + "node_modules/ast-types": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", + "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/async-mutex": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", + "integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/async-retry": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", @@ -2526,7 +2953,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "devOptional": true, "license": "MIT", "engines": { "node": "18 || 20 || >=22" @@ -2557,6 +2983,44 @@ "node": ">= 0.8" } }, + "node_modules/bentocache": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/bentocache/-/bentocache-1.6.1.tgz", + "integrity": "sha512-UuWL3k9A62ygI1/ws6x4r6lFkM/jTu24zTTuhtYa4jpd26BF5O4Y64KxWXJbcmpXo1swLQdBlA+sWGDuuIbKaw==", + "license": "MIT", + "dependencies": { + "@boringnode/bus": "^0.9.0", + "@julr/utils": "^1.9.0", + "@poppinss/exception": "^1.2.3", + "async-mutex": "^0.5.0", + "lru-cache": "^11.2.4", + "p-timeout": "^7.0.1" + }, + "peerDependencies": { + "@aws-sdk/client-dynamodb": "^3.438.0", + "ioredis": "^5.3.2", + "knex": "^3.0.1", + "kysely": "^0.27.3", + "orchid-orm": "^1.24.0" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-dynamodb": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "knex": { + "optional": true + }, + "kysely": { + "optional": true + }, + "orchid-orm": { + "optional": true + } + } + }, "node_modules/better-sqlite3": { "version": "13.0.3", "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-13.0.3.tgz", @@ -2569,11 +3033,19 @@ "node": ">=22" } }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/brace-expansion": { "version": "5.0.9", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", - "devOptional": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -2586,7 +3058,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "devOptional": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -2646,7 +3117,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "devOptional": true, "license": "MIT", "dependencies": { "run-applescript": "^7.0.0" @@ -2696,6 +3166,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, "node_modules/camelcase": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-9.0.0.tgz", @@ -2729,6 +3209,17 @@ ], "license": "CC-BY-4.0" }, + "node_modules/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "node_modules/case-anything": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-3.1.2.tgz", @@ -2799,7 +3290,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "devOptional": true, "license": "MIT", "dependencies": { "readdirp": "^5.0.0" @@ -2935,7 +3425,6 @@ "version": "13.0.3", "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", - "devOptional": true, "license": "MIT" }, "node_modules/color-convert": { @@ -2998,6 +3487,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } + }, "node_modules/content-disposition": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", @@ -3053,11 +3553,27 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/cross-env": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", + "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", + "license": "MIT", + "dependencies": { + "@epic-web/invariant": "^1.0.0", + "cross-spawn": "^7.0.6" + }, + "bin": { + "cross-env": "dist/bin/cross-env.js", + "cross-env-shell": "dist/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "devOptional": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -3119,7 +3635,6 @@ "version": "1.7.2", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", - "devOptional": true, "license": "MIT", "peerDependencies": { "babel-plugin-macros": "^3.1.0" @@ -3150,7 +3665,6 @@ "version": "5.5.1", "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.1.tgz", "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==", - "devOptional": true, "license": "MIT", "dependencies": { "bundle-name": "^4.1.0", @@ -3167,7 +3681,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -3180,7 +3693,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=12" @@ -3233,6 +3745,16 @@ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "license": "MIT" }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -3345,6 +3867,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/error-causes": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/error-causes/-/error-causes-3.0.2.tgz", + "integrity": "sha512-i0B8zq1dHL6mM85FGoxaJnVtx6LD5nL2v0hlpGdntg5FOSyzQ46c9lmz5qx0xRS2+PWHGOHcYxGIBC5Le2dRMw==", + "license": "MIT" + }, "node_modules/error-stack-parser-es": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-2.0.1.tgz", @@ -3657,11 +4185,35 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima-extract-comments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/esprima-extract-comments/-/esprima-extract-comments-1.1.0.tgz", + "integrity": "sha512-sBQUnvJwpeE9QnPrxh7dpI/dp67erYG4WXEAreAMoelPRpMR7NWb4YtwRPn9b+H1uLQKl/qS8WYmyaljTpjIsw==", + "license": "MIT", + "dependencies": { + "esprima": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/esquery": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" @@ -3687,7 +4239,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -3716,7 +4267,6 @@ "version": "9.6.1", "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", - "devOptional": true, "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", @@ -3739,6 +4289,19 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/extract-comments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/extract-comments/-/extract-comments-1.1.0.tgz", + "integrity": "sha512-dzbZV2AdSSVW/4E7Ti5hZdHWbA+Z80RJsJhr5uiL10oyjl/gy7/o+HI1HwK4/WSZhlq4SNKU3oUzXlM13Qx02Q==", + "license": "MIT", + "dependencies": { + "esprima-extract-comments": "^1.1.0", + "parse-code-context": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/fast-copy": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-4.0.4.tgz", @@ -3763,7 +4326,6 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "devOptional": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -3780,7 +4342,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "devOptional": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -3822,7 +4383,6 @@ "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "devOptional": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -3832,7 +4392,6 @@ "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=12.0.0" @@ -3850,7 +4409,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", - "devOptional": true, "license": "MIT", "dependencies": { "is-unicode-supported": "^2.0.0" @@ -3897,7 +4455,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "devOptional": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -4111,7 +4668,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.2.0.tgz", "integrity": "sha512-afP4W205ONCuMoPBqcR6PSXnzX35KTcJygfJfcp+QY+uwm3p20p1YczWXhlICIzGMCxYBQcySEcOgsJcrkyobg==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=16" @@ -4137,7 +4693,6 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", - "devOptional": true, "license": "MIT", "dependencies": { "@sec-ant/readable-stream": "^0.4.1", @@ -4154,7 +4709,6 @@ "version": "4.14.3", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.3.tgz", "integrity": "sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==", - "devOptional": true, "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -4263,6 +4817,16 @@ "he": "bin/he" } }, + "node_modules/header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "license": "MIT", + "dependencies": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/help-me": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", @@ -4317,16 +4881,84 @@ "url": "https://opencollective.com/express" } }, + "node_modules/http-status-code": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-status-code/-/http-status-code-2.1.0.tgz", + "integrity": "sha512-xlSRDG0i4j2HDR85FW2VGxFBo9GB1LpBp37/gldjrS5ZlAaHp1h0dbq96crIN/D0ur1jAa75ACrN8WezebLXSw==", + "license": "MIT", + "dependencies": { + "strip-json-comments": "^1.0.2" + } + }, + "node_modules/http-status-code/node_modules/strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==", + "license": "MIT", + "bin": { + "strip-json-comments": "cli.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/human-signals": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", - "devOptional": true, "license": "Apache-2.0", "engines": { "node": ">=18.18.0" } }, + "node_modules/ical-generator": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/ical-generator/-/ical-generator-11.1.1.tgz", + "integrity": "sha512-1m50e+BOMzxtE3lFXlFiOKvze4Mmiiq2+QoEMw7w7EDtWSq8OxWrdN6mmQdaymBVjmkP1pg0BAPUesBL1ZHQMQ==", + "license": "MIT", + "engines": { + "node": "22 || >=24.0.0" + }, + "peerDependencies": { + "@touch4it/ical-timezones": ">=1.6.0", + "@types/luxon": ">= 1.26.0", + "@types/mocha": ">= 8.2.1", + "dayjs": ">= 1.10.0", + "luxon": ">= 1.26.0", + "moment": ">= 2.29.0", + "moment-timezone": ">= 0.5.33", + "rrule": ">= 2.6.8" + }, + "peerDependenciesMeta": { + "@touch4it/ical-timezones": { + "optional": true + }, + "@types/luxon": { + "optional": true + }, + "@types/mocha": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + }, + "moment-timezone": { + "optional": true + }, + "rrule": { + "optional": true + } + } + }, "node_modules/iconv-lite": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", @@ -4386,7 +5018,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", - "devOptional": true, "license": "MIT", "funding": { "type": "github", @@ -4497,7 +5128,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "devOptional": true, "license": "MIT", "bin": { "is-docker": "cli.js" @@ -4549,7 +5179,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=20" @@ -4562,7 +5191,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "devOptional": true, "license": "MIT", "dependencies": { "is-docker": "^3.0.0" @@ -4581,7 +5209,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -4591,7 +5218,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=12" @@ -4604,7 +5230,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -4617,7 +5242,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -4630,7 +5254,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", - "devOptional": true, "license": "MIT", "dependencies": { "is-inside-container": "^1.0.0" @@ -4646,7 +5269,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "devOptional": true, "license": "ISC" }, "node_modules/jest-diff": { @@ -4664,6 +5286,15 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/jose": { + "version": "6.2.10", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.10.tgz", + "integrity": "sha512-iiW7J9qRFlGxvCOIBDBDxFePQSn7ZMAnrYGhrrOo6siO/MIqwfyilLR27pkfDgUk+raLuzADS8A3S/KLBisc0g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/joycon": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", @@ -4715,6 +5346,19 @@ "dev": true, "license": "MIT" }, + "node_modules/json-to-pretty-yaml": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz", + "integrity": "sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==", + "license": "Apache-2.0", + "dependencies": { + "remedial": "^1.0.7", + "remove-trailing-spaces": "^1.0.6" + }, + "engines": { + "node": ">= 0.2.0" + } + }, "node_modules/jsonschema": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.5.0.tgz", @@ -4728,7 +5372,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/junk/-/junk-4.0.1.tgz", "integrity": "sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=12.20" @@ -4980,6 +5623,12 @@ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "license": "MIT" }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "license": "MIT" + }, "node_modules/log-update": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-7.2.0.tgz", @@ -5026,11 +5675,19 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "11.5.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", - "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -5071,12 +5728,20 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "devOptional": true, "license": "MIT", "engines": { "node": ">= 8" } }, + "node_modules/meriyah": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/meriyah/-/meriyah-7.3.2.tgz", + "integrity": "sha512-uFPXbsoxaEd7PafMz3K/n/Z3kXz7iZBJtYU0VQB/kcV7i33+JghLTKweabLir480FUsyLz6gUIj4LW7kCQ35TA==", + "license": "ISC", + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -5090,7 +5755,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "devOptional": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -5104,7 +5768,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -5166,7 +5829,6 @@ "version": "10.2.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", - "devOptional": true, "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.8" @@ -5201,6 +5863,16 @@ "dev": true, "license": "MIT" }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/node-addon-api": { "version": "8.9.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.9.2.tgz", @@ -5210,6 +5882,17 @@ "node": "^18 || ^20 || >= 21" } }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-releases": { "version": "2.0.53", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", @@ -5220,6 +5903,15 @@ "node": ">=18" } }, + "node_modules/nodemailer": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-9.0.5.tgz", + "integrity": "sha512-wvjiKvjczmsN7U/8006JOdXubgBk2XFAbioDMbT+sM7cPs0QrhJTa6KBRX7P5REGGkDcLUz/EarWidb8G8C1jQ==", + "license": "MIT-0", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/normalize-package-data": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-8.0.0.tgz", @@ -5251,7 +5943,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", - "devOptional": true, "license": "MIT", "dependencies": { "path-key": "^4.0.0", @@ -5268,7 +5959,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=12" @@ -5277,6 +5967,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -5344,7 +6043,6 @@ "version": "11.0.1", "resolved": "https://registry.npmjs.org/open/-/open-11.0.1.tgz", "integrity": "sha512-NzwMUB6C1D0+Kd+9iMS/H4k+Ck3cTX6Ckyfr/gAGlmvSE1LUQZnEZvWBi4PYmMwH/S5SMeTXnE+9uAz8uF+pWw==", - "devOptional": true, "license": "MIT", "dependencies": { "default-browser": "^5.4.0", @@ -5411,13 +6109,43 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-timeout": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", + "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/package-manager-detector": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz", "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==", - "devOptional": true, "license": "MIT" }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parse-code-context": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-code-context/-/parse-code-context-1.0.0.tgz", + "integrity": "sha512-OZQaqKaQnR21iqhlnPfVisFjBWjhnMl5J9MgbP8xC+EwoVqbXrq78lp+9Zb3ahmLzrIX5Us/qbvBnaS3hkH6OA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/parse-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-3.0.0.tgz", @@ -5469,7 +6197,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -5478,13 +6205,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "devOptional": true, "license": "MIT" }, + "node_modules/path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -5499,7 +6245,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -5511,12 +6256,101 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, + "node_modules/pg": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.23.0.tgz", + "integrity": "sha512-Ip2EQCngowJLGOfCwkFhPXU7/ljlhn6Rxlmy4XYfL2Y+vyRM59+8uR2xqRWKdYmbXmxCFOAmKxBuSUCdF34qLg==", + "license": "MIT", + "dependencies": { + "pg-connection-string": "^2.14.0", + "pg-pool": "^3.14.0", + "pg-protocol": "^1.16.0", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.4.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.4.0.tgz", + "integrity": "sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==", + "license": "MIT", + "optional": true + }, "node_modules/pg-connection-string": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==", "license": "MIT" }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.14.0.tgz", + "integrity": "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.16.0.tgz", + "integrity": "sha512-sILXutLVjCLjcDuOmvhX5e2Z4cS5qG/6Bu3VkpFwdf/633ElGLpEh9bgmuI5I4sqKqkifQiGyiCcx1HdtrK7tg==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pg/node_modules/pg-connection-string": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.14.0.tgz", + "integrity": "sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg==", + "license": "MIT" + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -5528,7 +6362,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=12" @@ -5623,11 +6456,49 @@ "node": ">=4" } }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/powershell-utils": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.0.tgz", "integrity": "sha512-ZlsFlG7MtSFCoc5xreOvBAozCJ6Pf06opgJjh9ONEv418xpZSAzNjstD36C6+JwOnfSqOW/9uDkqKjezTdxZhw==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=20" @@ -5732,7 +6603,6 @@ "version": "9.3.0", "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", - "devOptional": true, "license": "MIT", "dependencies": { "parse-ms": "^4.0.0" @@ -5794,6 +6664,12 @@ "node": ">=6" } }, + "node_modules/pure-conditions": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/pure-conditions/-/pure-conditions-1.2.3.tgz", + "integrity": "sha512-TlBrX7PHkaglbE9eYYnc2Zk10PZ9wWllVjY33PQDp1/LK3aGC81RFKr0QzLwiKfipJlZZAK197c9YQFO6BAOFw==", + "license": "MIT" + }, "node_modules/qs": { "version": "6.15.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", @@ -5814,7 +6690,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "devOptional": true, "funding": [ { "type": "github", @@ -5846,6 +6721,12 @@ "node": ">= 0.8" } }, + "node_modules/rate-limiter-flexible": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-9.1.1.tgz", + "integrity": "sha512-imxFjzPCmvDLMe7d2tsgiSQvs5EI2fI9SNymmslAfOqznZhsZ+PqbIjIYKpuSbd3pKovR1aMG47qfCLIO/adVg==", + "license": "ISC" + }, "node_modules/raw-body": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", @@ -5930,7 +6811,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", - "devOptional": true, "license": "MIT", "engines": { "node": ">= 20.19.0" @@ -5990,6 +6870,21 @@ "regjsparser": "bin/parser" } }, + "node_modules/remedial": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/remedial/-/remedial-1.0.8.tgz", + "integrity": "sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==", + "license": "(MIT OR Apache-2.0)", + "engines": { + "node": "*" + } + }, + "node_modules/remove-trailing-spaces": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/remove-trailing-spaces/-/remove-trailing-spaces-1.0.9.tgz", + "integrity": "sha512-xzG7w5IRijvIkHIjDk65URsJJ7k4J95wmcArY5PRcmjldIOl7oTvG8+X2Ag690R7SfwiOcHrWZKVc1Pp5WIOzA==", + "license": "MIT" + }, "node_modules/resolve": { "version": "1.22.12", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", @@ -6024,7 +6919,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "devOptional": true, "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" @@ -6059,7 +6953,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "devOptional": true, "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -6076,7 +6969,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -6089,7 +6981,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "devOptional": true, "funding": [ { "type": "github", @@ -6160,6 +7051,17 @@ "node": ">=10" } }, + "node_modules/sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "node_modules/set-cookie-parser": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", @@ -6176,7 +7078,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "devOptional": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -6189,7 +7090,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -6334,6 +7234,16 @@ "node": ">=8.0.0" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/sonic-boom": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz", @@ -6343,6 +7253,15 @@ "atomic-sleep": "^1.0.0" } }, + "node_modules/source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0.tgz", + "integrity": "sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -6468,7 +7387,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -6659,7 +7577,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -6669,7 +7586,6 @@ "version": "0.2.17", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "devOptional": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -6695,7 +7611,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "devOptional": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -6748,13 +7663,18 @@ "version": "28.0.0", "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-28.0.0.tgz", "integrity": "sha512-Wp3tnZ2bzwxyTZMtgWVzXDfm7lB1Drz+y9DmmYH/L702PQhPyVrp3pkou3yIz4qjS14GY9kcpmLiOOMvl8oG1g==", - "devOptional": true, "license": "MIT", "dependencies": { "@ts-morph/common": "~0.29.0", "code-block-writer": "^13.0.3" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/tsscmp": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", @@ -6815,7 +7735,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", - "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -6849,6 +7768,37 @@ "typescript": ">=4.8.4 <6.1.0" } }, + "node_modules/typescript-parser": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typescript-parser/-/typescript-parser-2.6.1.tgz", + "integrity": "sha512-p4ZC10pu67KO8+WJALsJWhbAq4pRBIcP+ls8Bhl+V8KvzYQDwxw/P5hJhn3rBdLnfS5aGLflfh7WiZpN6yi+5g==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.10", + "lodash-es": "^4.17.10", + "tslib": "^1.9.3", + "typescript": "^3.0.3" + } + }, + "node_modules/typescript-parser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/typescript-parser/node_modules/typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/uid-safe": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", @@ -6883,7 +7833,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -6932,6 +7881,24 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -6975,7 +7942,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "devOptional": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -7035,7 +8001,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-1.0.0.tgz", "integrity": "sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==", - "devOptional": true, "license": "MIT", "dependencies": { "is-wsl": "^3.1.0", @@ -7052,7 +8017,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=20" @@ -7061,6 +8025,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, "node_modules/yargs-parser": { "version": "22.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", @@ -7087,7 +8060,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz", "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=18" diff --git a/package.json b/package.json index a6a2d31..6b8c6a3 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "@poppinss/ts-exec": "^1.4.4", "@types/luxon": "^3.7.4", "@types/node": "~26.2.0", + "@types/pg": "^8.23.1", "eslint": "^10.8.1", "hot-hook": "^1.0.0", "pino-pretty": "^13.1.3", @@ -58,16 +59,24 @@ }, "dependencies": { "@adonisjs/auth": "^10.1.0", + "@adonisjs/bouncer": "^4.0.1", + "@adonisjs/cache": "^2.1.0", "@adonisjs/core": "^7.4.0", "@adonisjs/cors": "^3.0.0", + "@adonisjs/limiter": "^3.0.1", "@adonisjs/lucid": "^22.4.2", + "@adonisjs/mail": "^10.4.0", "@adonisjs/session": "^8.1.0", "@adonisjs/shield": "^9.0.0", "@japa/api-client": "^3.2.1", "@tuyau/core": "^1.2.2", "@vinejs/vine": "^4.4.0", + "adonis-autoswagger": "^3.73.0", + "argon2": "^0.45.1", "better-sqlite3": "^13.0.3", + "jose": "^6.2.10", "luxon": "^3.7.2", + "pg": "^8.23.0", "reflect-metadata": "^0.2.2" }, "hotHook": { @@ -78,13 +87,19 @@ }, "allowScripts": { "@swc/core": true, + "argon2": true, "better-sqlite3": true, "esbuild": true, "fsevents": true }, "prettier": "@adonisjs/prettier-config", "lint-staged": { - "*.{ts,js}": ["eslint --fix", "prettier --write"], - "*.{json,md}": ["prettier --write"] + "*.{ts,js}": [ + "eslint --fix", + "prettier --write" + ], + "*.{json,md}": [ + "prettier --write" + ] } -} \ No newline at end of file +} From 86b6bfc3b3cac45c8ecb38fd450a8a3df174be2e Mon Sep 17 00:00:00 2001 From: EdgarEldy Date: Wed, 26 Aug 2026 09:38:04 +0400 Subject: [PATCH 02/13] chore: register the bouncer, limiter, mail and cache providers Wires all four packages' providers and commands into adonisrc.ts, and registers the bouncer initialization middleware in start/kernel.ts, so the IoC container can resolve ctx.bouncer, the mail service and the cache service anywhere in the app. --- adonisrc.ts | 9 +++++++++ start/kernel.ts | 1 + 2 files changed, 10 insertions(+) diff --git a/adonisrc.ts b/adonisrc.ts index a96390d..7325796 100644 --- a/adonisrc.ts +++ b/adonisrc.ts @@ -1,6 +1,7 @@ import { indexEntities } from '@adonisjs/core' import { defineConfig } from '@adonisjs/core/app' import { generateRegistry } from '@tuyau/core/hooks' +import { indexPolicies } from '@adonisjs/bouncer' export default defineConfig({ /* @@ -28,6 +29,9 @@ export default defineConfig({ () => import('@adonisjs/core/commands'), () => import('@adonisjs/lucid/commands'), () => import('@adonisjs/session/commands'), + () => import('@adonisjs/bouncer/commands'), + () => import('@adonisjs/mail/commands'), + () => import('@adonisjs/cache/commands'), ], /* @@ -53,6 +57,10 @@ export default defineConfig({ () => import('@adonisjs/cors/cors_provider'), () => import('@adonisjs/auth/auth_provider'), () => import('#providers/api_provider'), + () => import('@adonisjs/bouncer/bouncer_provider'), + () => import('@adonisjs/limiter/limiter_provider'), + () => import('@adonisjs/mail/mail_provider'), + () => import('@adonisjs/cache/cache_provider'), ], /* @@ -111,6 +119,7 @@ export default defineConfig({ transformers: { enabled: true }, }), generateRegistry(), + indexPolicies(), ], }, }) diff --git a/start/kernel.ts b/start/kernel.ts index 05c358a..5ec73e6 100644 --- a/start/kernel.ts +++ b/start/kernel.ts @@ -56,6 +56,7 @@ router.use([ () => import('@adonisjs/shield/shield_middleware'), () => import('@adonisjs/auth/initialize_auth_middleware'), () => import('#middleware/silent_auth_middleware'), + () => import('#middleware/initialize_bouncer_middleware'), ]) /** From c14788599e9a9f37508f79d3e800408e884e7223 Mon Sep 17 00:00:00 2001 From: EdgarEldy Date: Wed, 26 Aug 2026 09:38:04 +0400 Subject: [PATCH 03/13] feat: add the bouncer abilities entry point and init middleware Generated by the package's own configure command. The Edge template sharing branch in the middleware is removed since this project has no view provider, API only per the README's architecture. The policies.ts registry is empty for now, no policy classes exist yet. --- .adonisjs/server/policies.ts | 3 ++ app/abilities/main.ts | 23 ++++++++++++ .../initialize_bouncer_middleware.ts | 36 +++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 .adonisjs/server/policies.ts create mode 100644 app/abilities/main.ts create mode 100644 app/middleware/initialize_bouncer_middleware.ts diff --git a/.adonisjs/server/policies.ts b/.adonisjs/server/policies.ts new file mode 100644 index 0000000..a2d4a6c --- /dev/null +++ b/.adonisjs/server/policies.ts @@ -0,0 +1,3 @@ +export const policies = { +} + diff --git a/app/abilities/main.ts b/app/abilities/main.ts new file mode 100644 index 0000000..9c4fc0d --- /dev/null +++ b/app/abilities/main.ts @@ -0,0 +1,23 @@ +/* +|-------------------------------------------------------------------------- +| Bouncer abilities +|-------------------------------------------------------------------------- +| +| You may export multiple abilities from this file and pre-register them +| when creating the Bouncer instance. +| +| Pre-registered policies and abilities can be referenced as a string by their +| name. Also they are must if want to perform authorization inside Edge +| templates. +| +*/ + +import { Bouncer } from '@adonisjs/bouncer' + +/** + * Delete the following ability to start from + * scratch + */ +export const editUser = Bouncer.ability(() => { + return true +}) diff --git a/app/middleware/initialize_bouncer_middleware.ts b/app/middleware/initialize_bouncer_middleware.ts new file mode 100644 index 0000000..6ab6d4c --- /dev/null +++ b/app/middleware/initialize_bouncer_middleware.ts @@ -0,0 +1,36 @@ +import * as abilities from '#abilities/main' +import { policies } from '#generated/policies' + +import { Bouncer } from '@adonisjs/bouncer' +import type { HttpContext } from '@adonisjs/core/http' +import type { NextFn } from '@adonisjs/core/types/http' + +/** + * Init bouncer middleware is used to create a bouncer instance + * during an HTTP request + */ +export default class InitializeBouncerMiddleware { + async handle(ctx: HttpContext, next: NextFn) { + /** + * Create bouncer instance for the ongoing HTTP request. + * We will pull the user from the HTTP context. + */ + ctx.bouncer = new Bouncer( + () => ctx.auth.user || null, + abilities, + policies + ).setContainerResolver(ctx.containerResolver) + + return next() + } +} + +declare module '@adonisjs/core/http' { + export interface HttpContext { + bouncer: Bouncer< + Exclude, + typeof abilities, + typeof policies + > + } +} From 36f1594d4c7d93bd9ebaefacb0ff5596d6a829f0 Mon Sep 17 00:00:00 2001 From: EdgarEldy Date: Wed, 26 Aug 2026 09:38:16 +0400 Subject: [PATCH 04/13] feat: configure the rate limiter with a database store Database store over Redis, matching this project's pattern of reusing the one shared PostgreSQL instance instead of adding a second piece of infrastructure. The default is hardcoded to 'database' rather than read from LIMITER_STORE, since 'redis' is a documented but unconfigured env value with no matching store here. A global throttle stub is defined in start/limiter.ts for feature/auth to point at the real auth routes. --- config/limiter.ts | 32 +++++++++++++++++++ .../1787722050232_create_rate_limits_table.ts | 17 ++++++++++ start/limiter.ts | 16 ++++++++++ 3 files changed, 65 insertions(+) create mode 100644 config/limiter.ts create mode 100644 database/migrations/1787722050232_create_rate_limits_table.ts create mode 100644 start/limiter.ts diff --git a/config/limiter.ts b/config/limiter.ts new file mode 100644 index 0000000..bb1f0a3 --- /dev/null +++ b/config/limiter.ts @@ -0,0 +1,32 @@ +import { defineConfig, stores } from '@adonisjs/limiter' + +// NOTE: LIMITER_STORE is typed as 'database' | 'redis' in start/env.ts, +// matching the README's documented env reference, but only the database +// store is wired up below since this project has no Redis instance. The +// default is hardcoded to 'database' rather than read from env, the same +// way config/database.ts hardcodes its pg connection instead of deriving +// it from a variable with no matching configured alternative. +const limiterConfig = defineConfig({ + default: 'database', + stores: { + /** + * Database store to save rate limiting data inside a + * MYSQL or PostgreSQL database. + */ + database: stores.database({ + tableName: 'rate_limits', + }), + + /** + * Memory store could be used during + * testing + */ + memory: stores.memory({}), + }, +}) + +export default limiterConfig + +declare module '@adonisjs/limiter/types' { + export interface LimitersList extends InferLimiters {} +} diff --git a/database/migrations/1787722050232_create_rate_limits_table.ts b/database/migrations/1787722050232_create_rate_limits_table.ts new file mode 100644 index 0000000..3baffd1 --- /dev/null +++ b/database/migrations/1787722050232_create_rate_limits_table.ts @@ -0,0 +1,17 @@ +import { BaseSchema } from '@adonisjs/lucid/schema' + +export default class extends BaseSchema { + protected tableName = 'rate_limits' + + async up() { + this.schema.createTable(this.tableName, (table) => { + table.string('key', 255).notNullable().primary() + table.integer('points', 9).notNullable().defaultTo(0) + table.bigint('expire').unsigned() + }) + } + + async down() { + this.schema.dropTable(this.tableName) + } +} diff --git a/start/limiter.ts b/start/limiter.ts new file mode 100644 index 0000000..bc84b7d --- /dev/null +++ b/start/limiter.ts @@ -0,0 +1,16 @@ +/* +|-------------------------------------------------------------------------- +| Define HTTP limiters +|-------------------------------------------------------------------------- +| +| The "limiter.define" method creates an HTTP middleware to apply rate +| limits on a route or a group of routes. Feel free to define as many +| throttle middleware as needed. +| +*/ + +import limiter from '@adonisjs/limiter/services/main' + +export const throttle = limiter.define('global', () => { + return limiter.allowRequests(10).every('1 minute') +}) From 7f238e76a26afaeba0ba35eabccfdace2ec13d41 Mon Sep 17 00:00:00 2001 From: EdgarEldy Date: Wed, 26 Aug 2026 09:38:16 +0400 Subject: [PATCH 05/13] feat: configure the SMTP mailer against Mailhog SMTP is the only transport this project needs. The generated globals block for Edge template variables is removed, this project has no view provider and mail bodies are built as plain strings in the mailer classes that later branches add. --- config/mail.ts | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 config/mail.ts diff --git a/config/mail.ts b/config/mail.ts new file mode 100644 index 0000000..022fdb7 --- /dev/null +++ b/config/mail.ts @@ -0,0 +1,36 @@ +import env from '#start/env' +import { defineConfig, transports } from '@adonisjs/mail' + +/** + * Mail bodies in this project are built as plain strings inside the mailer + * classes themselves (see app/mails/), not rendered from Edge templates. + * This project has no view provider configured anywhere, it is an API only + * service per the README's own architecture, so there is no globals block + * here for template variables the way the package's own scaffold suggests. + */ +const mailConfig = defineConfig({ + default: env.get('MAIL_MAILER'), + + from: { + address: env.get('MAIL_FROM_ADDRESS'), + name: env.get('MAIL_FROM_NAME'), + }, + + /** + * SMTP pointed at Mailhog in every environment, development and test + * alike, so registration and password reset emails are always visible in + * Mailhog's web UI instead of attempting real delivery. + */ + mailers: { + smtp: transports.smtp({ + host: env.get('SMTP_HOST'), + port: env.get('SMTP_PORT'), + }), + }, +}) + +export default mailConfig + +declare module '@adonisjs/mail/types' { + export interface MailersList extends InferMailers {} +} From 94d8128299b57ef3e37e1531abedd25dd04a8f22 Mon Sep 17 00:00:00 2001 From: EdgarEldy Date: Wed, 26 Aug 2026 09:38:16 +0400 Subject: [PATCH 06/13] feat: configure the cache with an in-memory L1 and database L2 layer Same reasoning as the limiter: the database driver reuses the existing pg connection instead of adding Redis. Most reads never touch the database at all since the memory layer sits in front of it; the README names the categories list as a candidate for this once that branch exists. --- config/cache.ts | 30 +++++++++++++++++++ .../1787722100000_create_cache_table.ts | 17 +++++++++++ 2 files changed, 47 insertions(+) create mode 100644 config/cache.ts create mode 100644 database/migrations/1787722100000_create_cache_table.ts diff --git a/config/cache.ts b/config/cache.ts new file mode 100644 index 0000000..20c9c63 --- /dev/null +++ b/config/cache.ts @@ -0,0 +1,30 @@ +import { defineConfig, store, drivers } from '@adonisjs/cache' + +/** + * The database driver reuses the existing pg connection from + * config/database.ts, the same reasoning as config/limiter.ts's own choice + * of a database store over Redis: this project already runs one shared + * PostgreSQL instance in every environment via docker-compose, and adding + * Redis as a second piece of infrastructure just for caching a handful of + * frequently read list endpoints (the README names the categories list + * specifically) is not worth the extra moving part. + * + * The in-memory L1 layer sits in front of it regardless, so most reads + * never touch the database at all; L2 only matters for cache entries that + * need to survive a process restart or be shared across instances. + */ +const cacheConfig = defineConfig({ + default: 'default', + + stores: { + memoryOnly: store().useL1Layer(drivers.memory()), + + default: store().useL1Layer(drivers.memory()).useL2Layer(drivers.database({})), + }, +}) + +export default cacheConfig + +declare module '@adonisjs/cache/types' { + interface CacheStores extends InferStores {} +} diff --git a/database/migrations/1787722100000_create_cache_table.ts b/database/migrations/1787722100000_create_cache_table.ts new file mode 100644 index 0000000..bf36428 --- /dev/null +++ b/database/migrations/1787722100000_create_cache_table.ts @@ -0,0 +1,17 @@ +import { BaseSchema } from '@adonisjs/lucid/schema' + +export default class extends BaseSchema { + protected tableName = 'cache' + + async up() { + this.schema.createTable(this.tableName, (table) => { + table.string('key', 255).notNullable().primary() + table.text('value', 'longtext') + table.timestamp('expires_at').nullable() + }) + } + + async down() { + this.schema.dropTable(this.tableName) + } +} From 858abe0dcaa3bc5519437952958bbd05e3932f64 Mon Sep 17 00:00:00 2001 From: EdgarEldy Date: Wed, 26 Aug 2026 09:38:16 +0400 Subject: [PATCH 07/13] feat: add Swagger documentation via adonis-autoswagger /swagger returns the generated OpenAPI spec, /docs renders it through Swagger UI, both public. tagIndex is set to 3 to match this project's /api/v1/ route convention, and authMiddlewares points at the auth named middleware so protected routes are flagged with the bearer token security scheme automatically. --- config/swagger.ts | 36 ++++++++++++++++++++++++++++++++++++ start/routes.ts | 21 +++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 config/swagger.ts diff --git a/config/swagger.ts b/config/swagger.ts new file mode 100644 index 0000000..bedb019 --- /dev/null +++ b/config/swagger.ts @@ -0,0 +1,36 @@ +import path from 'node:path' +import url from 'node:url' + +/** + * adonis-autoswagger generates the OpenAPI spec from start/routes.ts and + * app/models/* directly, so this file only carries presentation and a few + * behavioral settings, not the API surface itself. Controllers must be + * imported lazily in routes.ts for their JSDoc annotations to be picked up, + * which every controller in this project already does. + */ +export default { + path: path.dirname(url.fileURLToPath(import.meta.url)) + '/../', + title: 'AdonisJS Tutorial API', + version: '1.0.0', + description: + 'REST API for the AdonisJS Tutorial project: categories, products, customers and orders, secured by JWT authentication and role based access control.', + + // Routes are declared as /api/v1/, so the third path segment + // (index 3) is the resource name autoswagger groups endpoints under. + tagIndex: 3, + + ignore: ['/swagger', '/docs'], + snakeCase: true, + preferredPutPatch: 'PUT', + common: { + parameters: {}, + headers: {}, + }, + + // AuthMiddleware is registered under the name "auth" in start/kernel.ts; + // any route using middleware.auth() is detected as requiring the bearer + // token security scheme below. + authMiddlewares: ['auth'], + defaultSecurityScheme: 'BearerAuth', + persistAuthorization: true, +} diff --git a/start/routes.ts b/start/routes.ts index ee8f1b3..eab8464 100644 --- a/start/routes.ts +++ b/start/routes.ts @@ -15,6 +15,8 @@ import { middleware } from '#start/kernel' import router from '@adonisjs/core/services/router' import { controllers } from '#generated/controllers' +import AutoSwagger from 'adonis-autoswagger' +import swagger from '#config/swagger' // Lazy import — AdonisJS resolves the module on the first matching request const HealthController = () => import('#controllers/health_controller') @@ -30,6 +32,25 @@ const HealthController = () => import('#controllers/health_controller') */ router.get('/api/v1/health', [HealthController, 'index']) +/* +|-------------------------------------------------------------------------- +| API documentation +|-------------------------------------------------------------------------- +| +| /swagger returns the generated OpenAPI spec in YAML; /docs renders it +| through Swagger UI. Both are public, documentation is not a protected +| resource, and adonis-autoswagger's own default `ignore` list already +| excludes these two paths from appearing in the spec they generate. +| +*/ +router.get('/swagger', async () => { + return AutoSwagger.default.docs(router.toJSON(), swagger) +}) + +router.get('/docs', async () => { + return AutoSwagger.default.ui('/swagger', swagger) +}) + /* |-------------------------------------------------------------------------- | API v1 — scaffold routes (replaced in feature/auth) From 285497fefe24df932d39c837f36c4118e9785865 Mon Sep 17 00:00:00 2001 From: EdgarEldy Date: Wed, 26 Aug 2026 09:38:29 +0400 Subject: [PATCH 08/13] fix: restore Secret redaction on APP_KEY, mark JWT_SECRET the same way, validate mail vars APP_KEY was weakened from Env.schema.secret() to string() when this file first added the auth, database and hashing env variables, losing log redaction for the key backing session and cookie encryption. Fixed at the source. JWT_SECRET gets the same protection since it signs every issued token. Mail variables are validated the same way every other env var in this project is. --- start/env.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/start/env.ts b/start/env.ts index 7d4b8e3..fd8a31b 100644 --- a/start/env.ts +++ b/start/env.ts @@ -19,7 +19,7 @@ export default await Env.create(new URL('../', import.meta.url), { LOG_LEVEL: Env.schema.string(), // App - APP_KEY: Env.schema.string(), + APP_KEY: Env.schema.secret(), APP_URL: Env.schema.string({ format: 'url', tld: false }), // Session @@ -33,7 +33,7 @@ export default await Env.create(new URL('../', import.meta.url), { DB_DATABASE: Env.schema.string(), // Auth - JWT_SECRET: Env.schema.string(), + JWT_SECRET: Env.schema.secret(), JWT_EXPIRY: Env.schema.string(), // Hashing @@ -43,4 +43,11 @@ export default await Env.create(new URL('../', import.meta.url), { LIMITER_STORE: Env.schema.enum(['database', 'redis'] as const), THROTTLE_AUTH_MAX: Env.schema.number(), THROTTLE_AUTH_WINDOW: Env.schema.number(), + + // Mail + MAIL_MAILER: Env.schema.enum(['smtp'] as const), + MAIL_FROM_NAME: Env.schema.string(), + MAIL_FROM_ADDRESS: Env.schema.string(), + SMTP_HOST: Env.schema.string({ format: 'host' }), + SMTP_PORT: Env.schema.number(), }) From 2e414e6bbfa8fc693e45f791a1fcc8c01227baaf Mon Sep 17 00:00:00 2001 From: EdgarEldy Date: Wed, 26 Aug 2026 09:38:29 +0400 Subject: [PATCH 09/13] docs: document the mail env variables Adds the SMTP_HOST/SMTP_PORT/MAIL_* section to all three env files, pointed at the Mailhog service docker-compose.yml and docker-compose.test.yml now run, ports 1025 and 1026 respectively. --- .env.development | 7 +++++++ .env.example | 7 +++++++ .env.test | 6 ++++++ 3 files changed, 20 insertions(+) diff --git a/.env.development b/.env.development index 9f6739f..89ae036 100644 --- a/.env.development +++ b/.env.development @@ -25,3 +25,10 @@ HASH_DRIVER=argon LIMITER_STORE=database THROTTLE_AUTH_MAX=10 THROTTLE_AUTH_WINDOW=60 + +# ── Mail ────────────────────────────────────────────────── +MAIL_MAILER=smtp +MAIL_FROM_NAME=AdonisJS Tutorial +MAIL_FROM_ADDRESS=no-reply@adonisjs-tutorial.test +SMTP_HOST=127.0.0.1 +SMTP_PORT=1025 diff --git a/.env.example b/.env.example index 13d5f98..bc56405 100644 --- a/.env.example +++ b/.env.example @@ -25,3 +25,10 @@ HASH_DRIVER=argon LIMITER_STORE=database THROTTLE_AUTH_MAX=10 THROTTLE_AUTH_WINDOW=60 + +# ── Mail ────────────────────────────────────────────────── +MAIL_MAILER=smtp # only smtp is configured, pointed at Mailhog +MAIL_FROM_NAME=AdonisJS Tutorial +MAIL_FROM_ADDRESS=no-reply@adonisjs-tutorial.test +SMTP_HOST=127.0.0.1 +SMTP_PORT=1025 # Mailhog SMTP port from docker-compose.yml (1026 for docker-compose.test.yml) diff --git a/.env.test b/.env.test index f3eba82..28e3b08 100644 --- a/.env.test +++ b/.env.test @@ -21,6 +21,12 @@ LIMITER_STORE=database THROTTLE_AUTH_MAX=10 THROTTLE_AUTH_WINDOW=60 +MAIL_MAILER=smtp +MAIL_FROM_NAME=AdonisJS Tutorial +MAIL_FROM_ADDRESS=no-reply@adonisjs-tutorial.test +SMTP_HOST=127.0.0.1 +SMTP_PORT=1026 + TEST_ADMIN_EMAIL=admin@example.com TEST_ADMIN_PASSWORD=Admin1234! TEST_USER_EMAIL=user@example.com From f91d4738120f63cbd2d8971853bd49daa0604489 Mon Sep 17 00:00:00 2001 From: EdgarEldy Date: Wed, 26 Aug 2026 09:38:29 +0400 Subject: [PATCH 10/13] chore: add Mailhog to both docker-compose stacks Catches every outgoing email instead of attempting real delivery. Test stack uses offset ports (1026/8026) so both compose files can run side by side, the same reasoning docker-compose.test.yml already applies to its postgres service. --- docker-compose.test.yml | 11 +++++++++-- docker-compose.yml | 11 +++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/docker-compose.test.yml b/docker-compose.test.yml index fab2c4a..6109c3b 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -7,14 +7,21 @@ services: POSTGRES_PASSWORD: postgres POSTGRES_DB: adonisjs_tutorial_test ports: - - "5433:5432" + - '5433:5432' volumes: - postgres_test_data:/var/lib/postgresql/data healthcheck: - test: ["CMD-SHELL", "pg_isready -U postgres"] + test: ['CMD-SHELL', 'pg_isready -U postgres'] interval: 10s timeout: 5s retries: 5 + mailhog_test: + image: mailhog/mailhog + restart: unless-stopped + ports: + - '1026:1025' + - '8026:8025' + volumes: postgres_test_data: diff --git a/docker-compose.yml b/docker-compose.yml index df2808b..04cb8d5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,14 +7,21 @@ services: POSTGRES_PASSWORD: postgres POSTGRES_DB: adonisjs_tutorial ports: - - "5432:5432" + - '5432:5432' volumes: - postgres_data:/var/lib/postgresql/data healthcheck: - test: ["CMD-SHELL", "pg_isready -U postgres"] + test: ['CMD-SHELL', 'pg_isready -U postgres'] interval: 10s timeout: 5s retries: 5 + mailhog: + image: mailhog/mailhog + restart: unless-stopped + ports: + - '1025:1025' + - '8025:8025' + volumes: postgres_data: From 54998f1a803a846d724806d0eb57b981ef2bcbba Mon Sep 17 00:00:00 2001 From: EdgarEldy Date: Wed, 26 Aug 2026 09:38:29 +0400 Subject: [PATCH 11/13] ci: add a Mailhog service to both workflows Needed once a later branch sends real email in a functional test. --- .github/workflows/ci.yml | 11 +++++++++++ .github/workflows/pr-checks.yml | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ef1e0f4..8148c22 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,6 +25,11 @@ env: LIMITER_STORE: database THROTTLE_AUTH_MAX: 5 THROTTLE_AUTH_WINDOW: 60 + MAIL_MAILER: smtp + MAIL_FROM_NAME: AdonisJS Tutorial + MAIL_FROM_ADDRESS: no-reply@adonisjs-tutorial.test + SMTP_HOST: 127.0.0.1 + SMTP_PORT: 1025 jobs: ci: @@ -46,6 +51,12 @@ jobs: --health-timeout 3s --health-retries 5 + mailhog: + image: mailhog/mailhog + ports: + - 1025:1025 + - 8025:8025 + steps: - name: Checkout repository uses: actions/checkout@v4 diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml index 1beaa51..2338b2b 100644 --- a/.github/workflows/pr-checks.yml +++ b/.github/workflows/pr-checks.yml @@ -29,6 +29,11 @@ env: LIMITER_STORE: database THROTTLE_AUTH_MAX: 5 THROTTLE_AUTH_WINDOW: 60 + MAIL_MAILER: smtp + MAIL_FROM_NAME: AdonisJS Tutorial + MAIL_FROM_ADDRESS: no-reply@adonisjs-tutorial.test + SMTP_HOST: 127.0.0.1 + SMTP_PORT: 1025 jobs: checks: @@ -52,6 +57,12 @@ jobs: --health-timeout 3s --health-retries 5 + mailhog: + image: mailhog/mailhog + ports: + - 1025:1025 + - 8025:8025 + steps: - name: Checkout repository uses: actions/checkout@v4 From ceac5d9bd40d2dbfdf56e9beeb167fe2b3bbcbd2 Mon Sep 17 00:00:00 2001 From: EdgarEldy Date: Wed, 26 Aug 2026 09:38:36 +0400 Subject: [PATCH 12/13] chore: regenerate codegen and schema snapshot Both auto-generated, refreshed to reflect the new routes and the rate_limits/cache tables. Neither is hand edited. --- .adonisjs/client/manifest.d.ts | 4 ++++ .adonisjs/server/controllers.ts | 1 + database/schema.ts | 35 ++++++++++++++++++++++----------- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/.adonisjs/client/manifest.d.ts b/.adonisjs/client/manifest.d.ts index 9fc3356..fc49405 100644 --- a/.adonisjs/client/manifest.d.ts +++ b/.adonisjs/client/manifest.d.ts @@ -5,5 +5,9 @@ /// /// +/// /// +/// /// +/// +/// diff --git a/.adonisjs/server/controllers.ts b/.adonisjs/server/controllers.ts index 202eb41..de3b59d 100644 --- a/.adonisjs/server/controllers.ts +++ b/.adonisjs/server/controllers.ts @@ -5,6 +5,7 @@ export const controllers = { AccessTokens: () => import('#controllers/access_tokens_controller'), + Health: () => import('#controllers/health_controller'), NewAccount: () => import('#controllers/new_account_controller'), Profile: () => import('#controllers/profile_controller'), } diff --git a/database/schema.ts b/database/schema.ts index 521fa3a..622b72a 100644 --- a/database/schema.ts +++ b/database/schema.ts @@ -8,18 +8,7 @@ import { BaseModel, column } from '@adonisjs/lucid/orm' import { DateTime } from 'luxon' export class AuthAccessTokenSchema extends BaseModel { - static $columns = [ - 'abilities', - 'createdAt', - 'expiresAt', - 'hash', - 'id', - 'lastUsedAt', - 'name', - 'tokenableId', - 'type', - 'updatedAt', - ] as const + static $columns = ['abilities', 'createdAt', 'expiresAt', 'hash', 'id', 'lastUsedAt', 'name', 'tokenableId', 'type', 'updatedAt'] as const $columns = AuthAccessTokenSchema.$columns @column() declare abilities: string @@ -43,6 +32,28 @@ export class AuthAccessTokenSchema extends BaseModel { declare updatedAt: DateTime | null } +export class CacheSchema extends BaseModel { + static $columns = ['expiresAt', 'key', 'value'] as const + $columns = CacheSchema.$columns + @column.dateTime() + declare expiresAt: DateTime | null + @column({ isPrimary: true }) + declare key: string + @column() + declare value: string | null +} + +export class RateLimitSchema extends BaseModel { + static $columns = ['expire', 'key', 'points'] as const + $columns = RateLimitSchema.$columns + @column() + declare expire: bigint | number | null + @column({ isPrimary: true }) + declare key: string + @column() + declare points: number +} + export class UserSchema extends BaseModel { static $columns = ['createdAt', 'email', 'fullName', 'id', 'password', 'updatedAt'] as const $columns = UserSchema.$columns From c03d5aa05f772cfa8cf611ae9a4c6d54f10ceef2 Mon Sep 17 00:00:00 2001 From: EdgarEldy Date: Wed, 26 Aug 2026 09:39:05 +0400 Subject: [PATCH 13/13] docs: consolidate dependency installation onto core-architecture The Tasks list now names every package the whole project's Tech Stack table needs, installed once here instead of one at a time as later branches reach the point of needing them. Bouncer, limiter and mail get their base scaffolding here too; the app-specific wiring each one needs (the JWT guard, Argon2 as the active hasher, real policies) still belongs to the branch whose behavior it is. --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 147878a..9fb066f 100644 --- a/README.md +++ b/README.md @@ -665,7 +665,11 @@ export default await Env.create(new URL('../', import.meta.url), { - [ ] Implement global exception handler in `app/exceptions/handler.ts` (wraps all errors in `ApiResponse` shape with `success: false`) - [ ] Implement `ResponseTimeMiddleware` and register it globally in `start/kernel.ts` - [ ] Register `auth` and `role` as named middleware in `start/kernel.ts` (stubs - implementation comes in `feature/auth`) -- [ ] Configure `adonis-autoswagger` for API documentation +- [ ] Configure `adonis-autoswagger` for API documentation, expose `/swagger` and `/docs` +- [ ] Install every dependency the whole project's Tech Stack needs, not just this branch's own: `pg`, `@adonisjs/bouncer`, `@adonisjs/limiter`, `@adonisjs/mail`, `@adonisjs/cache`, `argon2`, `jose`, `adonis-autoswagger`, so no later branch needs a mid-branch install +- [ ] Configure `@adonisjs/bouncer`, `@adonisjs/limiter` (database store) and `@adonisjs/mail` (SMTP against Mailhog) with their base scaffolding; the app-specific wiring (the JWT guard, Argon2 as the active hasher, real policies) still belongs to the branch that owns that behavior +- [ ] Configure `@adonisjs/cache` with an in-memory L1 layer and a database L2 layer, for `feature/categories` to use on its list endpoint +- [ ] Add Mailhog to both `docker-compose.yml` and `docker-compose.test.yml`, and to both CI workflows - [ ] Add `GET /api/v1/health` health-check route - [ ] Set up GitHub Actions `ci.yml` and `pr-checks.yml` - [ ] Functional test: `GET /api/v1/health` returns 200 with `ApiResponse` shape