From 303a419c0095fa20b6b636bba1140edc51956243 Mon Sep 17 00:00:00 2001 From: Donald Pakkies Date: Fri, 17 Oct 2025 16:40:59 +0200 Subject: [PATCH 1/6] feat: clean up code and introduce domain routing --- package-lock.json | 617 ++++++++---------- src/Auth/Drivers/Driver.imba | 2 +- src/Database/Database.imba | 39 +- src/Environment/Repository.imba | 5 +- src/Foundation/Application.imba | 2 +- src/Foundation/Console.imba | 8 +- .../Console/Commands/DbSeedCommand.imba | 2 +- .../Console/Commands/MigrationCommand.imba | 2 +- .../Commands/PackagePublishCommand.imba | 5 +- .../Console/Commands/RouteListCommand.imba | 10 +- .../Console/Commands/ShellCommand.imba | 3 +- src/Http/Kernel.imba | 21 +- src/Http/Middleware/TransformsRequest.imba | 9 +- src/Http/Request/FileCollection.imba | 42 +- src/Http/Request/FormRequest.imba | 6 +- src/Http/Router/Route.imba | 100 +-- src/Http/URL/URL.imba | 6 +- src/Mix/Repository.imba | 10 +- src/Support/Decorators/use.imba | 6 +- src/Support/Helpers/config.imba | 10 +- src/Support/Helpers/dotNotation.imba | 8 +- src/Support/Helpers/env.imba | 2 +- src/Support/Helpers/imbaEnv.imba | 4 +- src/Support/Helpers/isEmpty.imba | 6 +- src/Support/Helpers/toBoolean.imba | 2 +- src/Support/Helpers/updateLine.imba | 23 +- src/Support/Helpers/wildcard.imba | 8 +- src/Support/Helpers/without.imba | 8 +- src/Support/Language/Language.imba | 6 +- src/Validator/ValidationServiceResolver.imba | 51 +- 30 files changed, 545 insertions(+), 478 deletions(-) diff --git a/package-lock.json b/package-lock.json index e5740c36..b6d4fa32 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@formidablejs/framework", - "version": "0.28.2", + "version": "0.28.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@formidablejs/framework", - "version": "0.28.2", + "version": "0.28.3", "license": "MIT", "dependencies": { "@fastify/cookie": "^11.0.2", @@ -166,22 +166,22 @@ } }, "node_modules/@babel/core": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", - "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", + "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", + "@babel/generator": "^7.28.3", "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.28.0", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.3", + "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.0", - "@babel/types": "^7.28.0", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -225,14 +225,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", - "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.0", - "@babel/types": "^7.28.0", + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -293,15 +293,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -351,27 +351,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", - "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", + "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.27.6" + "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", - "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", + "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.0" + "@babel/types": "^7.28.2" }, "bin": { "parser": "bin/babel-parser.js" @@ -635,18 +635,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", - "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", + "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", + "@babel/generator": "^7.28.3", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.0", + "@babel/parser": "^7.28.3", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.0", + "@babel/types": "^7.28.2", "debug": "^4.3.1" }, "engines": { @@ -672,9 +672,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.0.tgz", - "integrity": "sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", "dev": true, "license": "MIT", "dependencies": { @@ -803,9 +803,9 @@ } }, "node_modules/@fastify/busboy": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.1.1.tgz", - "integrity": "sha512-5DGmA8FTdB2XbDeEwc/5ZXBl6UbBAyBOOLlPuBnZ/N1SwdH9Ii+cOX3tBROlDgcTXxjOYnLMVoKk9+FXAw0CJw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.2.0.tgz", + "integrity": "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==", "license": "MIT" }, "node_modules/@fastify/cookie": { @@ -1078,10 +1078,31 @@ "license": "MIT", "optional": true }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.1.tgz", + "integrity": "sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==", + "license": "MIT", + "dependencies": { + "chardet": "^2.1.0", + "iconv-lite": "^0.6.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@ioredis/commands": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", - "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.3.0.tgz", + "integrity": "sha512-M/T6Zewn7sDaBQEqIZ8Rb+i9y8qfGmq+5SDFSf9sA2lUZTmdDLVdOiQaeDp+Q4wElZ9HG1GAX5KhDaidp6LQsQ==", "dev": true, "license": "MIT" }, @@ -1124,9 +1145,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", + "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", "license": "MIT", "engines": { "node": ">=12" @@ -1503,13 +1524,13 @@ } }, "node_modules/@jest/expect-utils": { - "version": "30.0.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.0.4.tgz", - "integrity": "sha512-EgXecHDNfANeqOkcak0DxsoVI4qkDUsR7n/Lr2vtmTBjwLPBnnPOF71S11Q8IObWzxm2QgQoY6f9hzrRD3gHRA==", + "version": "30.1.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.1.1.tgz", + "integrity": "sha512-5YUHr27fpJ64dnvtu+tt11ewATynrHkGYD+uSFgRr8V2eFJis/vEXgToyLwccIwqBihVfz9jwio+Zr1ab1Zihw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1" + "@jest/get-type": "30.1.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -1745,9 +1766,9 @@ } }, "node_modules/@jest/get-type": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.0.1.tgz", - "integrity": "sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==", + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", "dev": true, "license": "MIT", "engines": { @@ -2097,9 +2118,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", "dependencies": { @@ -2117,15 +2138,15 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2181,21 +2202,21 @@ } }, "node_modules/@redis/bloom": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-5.8.0.tgz", - "integrity": "sha512-kpKZzAAjGiGYn88Bqq6+ozxPg6kGYWRZH9vnOwGcoSCbrW14SZpZVMYMFSio8FH9ZJUdUcmT/RLGlA1W1t0UWQ==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-5.8.2.tgz", + "integrity": "sha512-855DR0ChetZLarblio5eM0yLwxA9Dqq50t8StXKp5bAtLT0G+rZ+eRzzqxl37sPqQKjUudSYypz55o6nNhbz0A==", "license": "MIT", "engines": { "node": ">= 18" }, "peerDependencies": { - "@redis/client": "^5.8.0" + "@redis/client": "^5.8.2" } }, "node_modules/@redis/client": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.8.0.tgz", - "integrity": "sha512-ywZjKGoSSAECGYOd9bJpws6d4867SN686obUWT/sRmo1c/Q8V+jWyInvlqwKa0BOvTHHwYeB2WFUEvd6PADeOQ==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.8.2.tgz", + "integrity": "sha512-WtMScno3+eBpTac1Uav2zugXEoXqaU23YznwvFgkPwBQVwEHTDgOG7uEAObtZ/Nyn8SmAMbqkEubJaMOvnqdsQ==", "license": "MIT", "dependencies": { "cluster-key-slot": "1.1.2" @@ -2205,39 +2226,39 @@ } }, "node_modules/@redis/json": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-5.8.0.tgz", - "integrity": "sha512-xPBpwY6aKoRzMSu67MpwrBiSliON9bfHo9Y/pSPBjW8/KoOm1MzGqwJUO20qdjXpFoKJsDWwxIE1LHdBNzcImw==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-5.8.2.tgz", + "integrity": "sha512-uxpVfas3I0LccBX9rIfDgJ0dBrUa3+0Gc8sEwmQQH0vHi7C1Rx1Qn8Nv1QWz5bohoeIXMICFZRcyDONvum2l/w==", "license": "MIT", "engines": { "node": ">= 18" }, "peerDependencies": { - "@redis/client": "^5.8.0" + "@redis/client": "^5.8.2" } }, "node_modules/@redis/search": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-5.8.0.tgz", - "integrity": "sha512-lF9pNv9vySmirm1EzCH6YeRjhvH6lLT7tvebYHEM7WTkEQ/7kZWb4athliKESHpxzTQ36U9UbzuedSywHV6OhQ==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-5.8.2.tgz", + "integrity": "sha512-cNv7HlgayavCBXqPXgaS97DRPVWFznuzsAmmuemi2TMCx5scwLiP50TeZvUS06h/MG96YNPe6A0Zt57yayfxwA==", "license": "MIT", "engines": { "node": ">= 18" }, "peerDependencies": { - "@redis/client": "^5.8.0" + "@redis/client": "^5.8.2" } }, "node_modules/@redis/time-series": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-5.8.0.tgz", - "integrity": "sha512-kPTlW2ACXokjQNXjCD8Pw9mHDoB94AHUlHFahyjxz9lUJUVwiva2Dgfrd2k3JxHhSBqyY2PREIj9YwIUSTSSqQ==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-5.8.2.tgz", + "integrity": "sha512-g2NlHM07fK8H4k+613NBsk3y70R2JIM2dPMSkhIjl2Z17SYvaYKdusz85d7VYOrZBWtDrHV/WD2E3vGu+zni8A==", "license": "MIT", "engines": { "node": ">= 18" }, "peerDependencies": { - "@redis/client": "^5.8.0" + "@redis/client": "^5.8.2" } }, "node_modules/@sinclair/typebox": { @@ -2338,13 +2359,13 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.20.7" + "@babel/types": "^7.28.2" } }, "node_modules/@types/body-parser": { @@ -2395,9 +2416,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", - "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz", + "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2480,12 +2501,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.10.tgz", - "integrity": "sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==", + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", + "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", "license": "MIT", "dependencies": { - "undici-types": "~7.8.0" + "undici-types": "~7.10.0" } }, "node_modules/@types/qs": { @@ -2754,9 +2775,9 @@ } }, "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", "dev": true, "license": "ISC", "optional": true @@ -2784,15 +2805,15 @@ "license": "MIT" }, "node_modules/argon2": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/argon2/-/argon2-0.43.0.tgz", - "integrity": "sha512-u/HKLcbWShVDhkfwI4hWyiUf3qyX8QhTfaIv2cWE18uqhXCmR5hb6Ed7oqYi2KCQegeAnRhiFzbjzm7i5yl1GA==", + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/argon2/-/argon2-0.43.1.tgz", + "integrity": "sha512-TfOzvDWUaQPurCT1hOwIeFNkgrAJDpbBGBGWDgzDsm11nNhImc13WhdGdCU6K7brkp8VpeY07oGtSex0Wmhg8w==", "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { "@phc/format": "^1.0.0", - "node-addon-api": "^8.3.1", + "node-addon-api": "^8.4.0", "node-gyp-build": "^4.8.4" }, "engines": { @@ -2923,9 +2944,9 @@ } }, "node_modules/babel-preset-current-node-syntax": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", - "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, "license": "MIT", "dependencies": { @@ -2946,7 +2967,7 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0 || ^8.0.0-0" } }, "node_modules/babel-preset-jest": { @@ -3074,9 +3095,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "version": "4.25.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz", + "integrity": "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==", "dev": true, "funding": [ { @@ -3094,8 +3115,8 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", + "caniuse-lite": "^1.0.30001737", + "electron-to-chromium": "^1.5.211", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, @@ -3278,9 +3299,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001726", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz", - "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==", + "version": "1.0.30001737", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001737.tgz", + "integrity": "sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==", "dev": true, "funding": [ { @@ -3325,9 +3346,9 @@ } }, "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", + "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", "license": "MIT" }, "node_modules/chokidar": { @@ -3869,9 +3890,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.179", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.179.tgz", - "integrity": "sha512-UWKi/EbBopgfFsc5k61wFpV7WrnnSlSzW/e2XcBmS6qKYTivZlLtoll5/rdqRTxGglGHkmkW0j0pFNJG10EUIQ==", + "version": "1.5.211", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.211.tgz", + "integrity": "sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw==", "dev": true, "license": "ISC" }, @@ -3905,20 +3926,6 @@ "iconv-lite": "^0.6.2" } }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -4429,18 +4436,18 @@ } }, "node_modules/expect": { - "version": "30.0.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.0.4.tgz", - "integrity": "sha512-dDLGjnP2cKbEppxVICxI/Uf4YemmGMPNy0QytCbfafbpYk9AFQsxb8Uyrxii0RPK7FWgLGlSem+07WirwS3cFQ==", + "version": "30.1.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.1.1.tgz", + "integrity": "sha512-OKe7cdic4qbfWd/CcgwJvvCrNX2KWfuMZee9AfJHL1gTYmvqjBjZG1a2NwfhspBzxzlXwsN75WWpKTYfsJpBxg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "30.0.4", - "@jest/get-type": "30.0.1", - "jest-matcher-utils": "30.0.4", - "jest-message-util": "30.0.2", - "jest-mock": "30.0.2", - "jest-util": "30.0.2" + "@jest/expect-utils": "30.1.1", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.1.1", + "jest-message-util": "30.1.0", + "jest-mock": "30.0.5", + "jest-util": "30.0.5" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -4474,20 +4481,6 @@ "node": ">= 0.6" } }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/fast-decode-uri-component": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", @@ -4550,9 +4543,9 @@ } }, "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "funding": [ { "type": "github", @@ -4566,9 +4559,9 @@ "license": "BSD-3-Clause" }, "node_modules/fastify": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.4.0.tgz", - "integrity": "sha512-I4dVlUe+WNQAhKSyv15w+dwUh2EPiEl4X2lGYMmNSgF83WzTMAPKGdWEv5tPsCQOb+SOZwz8Vlta2vF+OeDgRw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.5.0.tgz", + "integrity": "sha512-ZWSWlzj3K/DcULCnCjEiC2zn2FBPdlZsSA/pnPa/dbUfLvxkD/Nqmb0XXMXLrWkeM4uQPUvjdJpwtXmTfriXqw==", "funding": [ { "type": "github", @@ -4674,17 +4667,17 @@ } }, "node_modules/find-my-way": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.2.0.tgz", - "integrity": "sha512-d3uCir8Hmg7W1Ywp8nKf2lJJYU9Nwinvo+1D39Dn09nz65UKXIxUh7j7K8zeWhxqe1WrkS7FJyON/Q/3lPoc6w==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.3.0.tgz", + "integrity": "sha512-eRoFWQw+Yv2tuYlK2pjFS2jGXSxSppAs3hSQjfxVKxM5amECzIgYYc1FEI8ZmhSh/Ig+FrKEz43NLRKJjYCZVg==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", - "safe-regex2": "^4.0.0" + "safe-regex2": "^5.0.0" }, "engines": { - "node": ">=14" + "node": ">=20" } }, "node_modules/find-up": { @@ -5090,12 +5083,12 @@ } }, "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" @@ -5235,11 +5228,14 @@ } }, "node_modules/imba-shell/node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -5303,9 +5299,9 @@ } }, "node_modules/imba-shell/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "optional": true, @@ -5318,9 +5314,9 @@ } }, "node_modules/imba-shell/node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "dev": true, "license": "Apache-2.0", "bin": { @@ -5405,16 +5401,16 @@ "license": "ISC" }, "node_modules/inquirer": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", - "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.7.tgz", + "integrity": "sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==", "license": "MIT", "dependencies": { + "@inquirer/external-editor": "^1.0.0", "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", - "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.21", "mute-stream": "0.0.8", @@ -5440,13 +5436,13 @@ } }, "node_modules/ioredis": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.1.tgz", - "integrity": "sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.7.0.tgz", + "integrity": "sha512-NUcA93i1lukyXU+riqEyPtSEkyFq8tX90uL659J+qpCZ3rEdViB/APC58oAhIh3+bJln2hzdlZbBZsGNrlsR8g==", "dev": true, "license": "MIT", "dependencies": { - "@ioredis/commands": "^1.1.1", + "@ioredis/commands": "^1.3.0", "cluster-key-slot": "^1.1.0", "debug": "^4.3.4", "denque": "^2.1.0", @@ -5483,28 +5479,16 @@ } }, "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, "engines": { "node": ">= 12" } }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true - }, "node_modules/ipaddr.js": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", @@ -5727,9 +5711,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6133,16 +6117,16 @@ } }, "node_modules/jest-diff": { - "version": "30.0.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.0.4.tgz", - "integrity": "sha512-TSjceIf6797jyd+R64NXqicttROD+Qf98fex7CowmlSn7f8+En0da1Dglwr1AXxDtVizoxXYZBlUQwNhoOXkNw==", + "version": "30.1.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.1.1.tgz", + "integrity": "sha512-LUU2Gx8EhYxpdzTR6BmjL1ifgOAQJQELTHOiPv9KITaKjZvJ9Jmgigx01tuZ49id37LorpGc9dPBPlXTboXScw==", "dev": true, "license": "MIT", "dependencies": { "@jest/diff-sequences": "30.0.1", - "@jest/get-type": "30.0.1", + "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "pretty-format": "30.0.2" + "pretty-format": "30.0.5" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -6372,35 +6356,35 @@ } }, "node_modules/jest-matcher-utils": { - "version": "30.0.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.0.4.tgz", - "integrity": "sha512-ubCewJ54YzeAZ2JeHHGVoU+eDIpQFsfPQs0xURPWoNiO42LGJ+QGgfSf+hFIRplkZDkhH5MOvuxHKXRTUU3dUQ==", + "version": "30.1.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.1.1.tgz", + "integrity": "sha512-SuH2QVemK48BNTqReti6FtjsMPFsSOD/ZzRxU1TttR7RiRsRSe78d03bb4Cx6D4bQC/80Q8U4VnaaAH9FlbZ9w==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.0.1", + "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "jest-diff": "30.0.4", - "pretty-format": "30.0.2" + "jest-diff": "30.1.1", + "pretty-format": "30.0.5" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-message-util": { - "version": "30.0.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.0.2.tgz", - "integrity": "sha512-vXywcxmr0SsKXF/bAD7t7nMamRvPuJkras00gqYeB1V0WllxZrbZ0paRr3XqpFU2sYYjD0qAaG2fRyn/CGZ0aw==", + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.1.0.tgz", + "integrity": "sha512-HizKDGG98cYkWmaLUHChq4iN+oCENohQLb7Z5guBPumYs+/etonmNFlg1Ps6yN9LTPyZn+M+b/9BbnHx3WTMDg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@jest/types": "30.0.1", + "@jest/types": "30.0.5", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "micromatch": "^4.0.8", - "pretty-format": "30.0.2", + "pretty-format": "30.0.5", "slash": "^3.0.0", "stack-utils": "^2.0.6" }, @@ -6409,9 +6393,9 @@ } }, "node_modules/jest-message-util/node_modules/@jest/schemas": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.1.tgz", - "integrity": "sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w==", + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", "dependencies": { @@ -6422,14 +6406,14 @@ } }, "node_modules/jest-message-util/node_modules/@jest/types": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.1.tgz", - "integrity": "sha512-HGwoYRVF0QSKJu1ZQX0o5ZrUrrhj0aOOFA8hXrumD7SIzjouevhawbTjmXdwOmURdGluU9DM/XvGm3NyFoiQjw==", + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.5.tgz", + "integrity": "sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==", "dev": true, "license": "MIT", "dependencies": { "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.1", + "@jest/schemas": "30.0.5", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -6441,31 +6425,31 @@ } }, "node_modules/jest-message-util/node_modules/@sinclair/typebox": { - "version": "0.34.37", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.37.tgz", - "integrity": "sha512-2TRuQVgQYfy+EzHRTIvkhv2ADEouJ2xNS/Vq+W5EuuewBdOrvATvljZTxHWZSTYr2sTjTHpGvucaGAt67S2akw==", + "version": "0.34.40", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.40.tgz", + "integrity": "sha512-gwBNIP8ZAYev/ORDWW0QvxdwPXwxBtLsdsJgSc7eDIRt8ubP+rxUBzPsrwnu16fgEF8Bx4lh/+mvQvJzcTM6Kw==", "dev": true, "license": "MIT" }, "node_modules/jest-mock": { - "version": "30.0.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.2.tgz", - "integrity": "sha512-PnZOHmqup/9cT/y+pXIVbbi8ID6U1XHRmbvR7MvUy4SLqhCbwpkmXhLbsWbGewHrV5x/1bF7YDjs+x24/QSvFA==", + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.5.tgz", + "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.1", + "@jest/types": "30.0.5", "@types/node": "*", - "jest-util": "30.0.2" + "jest-util": "30.0.5" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-mock/node_modules/@jest/schemas": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.1.tgz", - "integrity": "sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w==", + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", "dependencies": { @@ -6476,14 +6460,14 @@ } }, "node_modules/jest-mock/node_modules/@jest/types": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.1.tgz", - "integrity": "sha512-HGwoYRVF0QSKJu1ZQX0o5ZrUrrhj0aOOFA8hXrumD7SIzjouevhawbTjmXdwOmURdGluU9DM/XvGm3NyFoiQjw==", + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.5.tgz", + "integrity": "sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==", "dev": true, "license": "MIT", "dependencies": { "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.1", + "@jest/schemas": "30.0.5", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -6495,9 +6479,9 @@ } }, "node_modules/jest-mock/node_modules/@sinclair/typebox": { - "version": "0.34.37", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.37.tgz", - "integrity": "sha512-2TRuQVgQYfy+EzHRTIvkhv2ADEouJ2xNS/Vq+W5EuuewBdOrvATvljZTxHWZSTYr2sTjTHpGvucaGAt67S2akw==", + "version": "0.34.40", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.40.tgz", + "integrity": "sha512-gwBNIP8ZAYev/ORDWW0QvxdwPXwxBtLsdsJgSc7eDIRt8ubP+rxUBzPsrwnu16fgEF8Bx4lh/+mvQvJzcTM6Kw==", "dev": true, "license": "MIT" }, @@ -6995,13 +6979,13 @@ } }, "node_modules/jest-util": { - "version": "30.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.2.tgz", - "integrity": "sha512-8IyqfKS4MqprBuUpZNlFB5l+WFehc8bfCe1HSZFHzft2mOuND8Cvi9r1musli+u6F3TqanCZ/Ik4H4pXUolZIg==", + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", + "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.0.1", + "@jest/types": "30.0.5", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -7013,9 +6997,9 @@ } }, "node_modules/jest-util/node_modules/@jest/schemas": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.1.tgz", - "integrity": "sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w==", + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", "dependencies": { @@ -7026,14 +7010,14 @@ } }, "node_modules/jest-util/node_modules/@jest/types": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.1.tgz", - "integrity": "sha512-HGwoYRVF0QSKJu1ZQX0o5ZrUrrhj0aOOFA8hXrumD7SIzjouevhawbTjmXdwOmURdGluU9DM/XvGm3NyFoiQjw==", + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.5.tgz", + "integrity": "sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==", "dev": true, "license": "MIT", "dependencies": { "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.1", + "@jest/schemas": "30.0.5", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -7045,16 +7029,16 @@ } }, "node_modules/jest-util/node_modules/@sinclair/typebox": { - "version": "0.34.37", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.37.tgz", - "integrity": "sha512-2TRuQVgQYfy+EzHRTIvkhv2ADEouJ2xNS/Vq+W5EuuewBdOrvATvljZTxHWZSTYr2sTjTHpGvucaGAt67S2akw==", + "version": "0.34.40", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.40.tgz", + "integrity": "sha512-gwBNIP8ZAYev/ORDWW0QvxdwPXwxBtLsdsJgSc7eDIRt8ubP+rxUBzPsrwnu16fgEF8Bx4lh/+mvQvJzcTM6Kw==", "dev": true, "license": "MIT" }, "node_modules/jest-util/node_modules/ci-info": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", - "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", + "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", "dev": true, "funding": [ { @@ -7068,9 +7052,9 @@ } }, "node_modules/jest-util/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -7248,14 +7232,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -7315,9 +7291,9 @@ } }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -8177,9 +8153,9 @@ } }, "node_modules/node-addon-api": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.4.0.tgz", - "integrity": "sha512-D9DI/gXHvVmjHS08SVch0Em8G5S1P+QWtU31appcKT/8wFSPRcdHadIFSAntdMMVM5zz+/DL+bL/gz3UDppqtg==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", "license": "MIT", "engines": { "node": "^18 || ^20 || >= 21" @@ -8493,15 +8469,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -8694,9 +8661,9 @@ } }, "node_modules/pino": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-9.7.0.tgz", - "integrity": "sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg==", + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.9.0.tgz", + "integrity": "sha512-zxsRIQG9HzG+jEljmvmZupOMDUQ0Jpj0yAgE28jQvvrdYTlEaiGwelJpdndMl/MBuRr70heIj83QyqJUWaU8mQ==", "license": "MIT", "dependencies": { "atomic-sleep": "^1.0.0", @@ -8790,13 +8757,13 @@ } }, "node_modules/pretty-format": { - "version": "30.0.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.2.tgz", - "integrity": "sha512-yC5/EBSOrTtqhCKfLHqoUIAXVRZnukHPwWBJWR7h84Q3Be1DRQZLncwcfLoPA5RPQ65qfiCMqgYwdUuQ//eVpg==", + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", + "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "30.0.1", + "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", "react-is": "^18.3.1" }, @@ -8805,9 +8772,9 @@ } }, "node_modules/pretty-format/node_modules/@jest/schemas": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.1.tgz", - "integrity": "sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w==", + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", "dependencies": { @@ -8818,9 +8785,9 @@ } }, "node_modules/pretty-format/node_modules/@sinclair/typebox": { - "version": "0.34.37", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.37.tgz", - "integrity": "sha512-2TRuQVgQYfy+EzHRTIvkhv2ADEouJ2xNS/Vq+W5EuuewBdOrvATvljZTxHWZSTYr2sTjTHpGvucaGAt67S2akw==", + "version": "0.34.40", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.40.tgz", + "integrity": "sha512-gwBNIP8ZAYev/ORDWW0QvxdwPXwxBtLsdsJgSc7eDIRt8ubP+rxUBzPsrwnu16fgEF8Bx4lh/+mvQvJzcTM6Kw==", "dev": true, "license": "MIT" }, @@ -9026,16 +8993,16 @@ } }, "node_modules/redis": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/redis/-/redis-5.8.0.tgz", - "integrity": "sha512-re0MHm1KHbiVIUPDGoUM3jldvjH5EM/wGZ3A33gyUYoC/UnVNKNnZHM5hcJVry7L2O2eJU3nflSXTliv10BTKg==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/redis/-/redis-5.8.2.tgz", + "integrity": "sha512-31vunZj07++Y1vcFGcnNWEf5jPoTkGARgfWI4+Tk55vdwHxhAvug8VEtW7Cx+/h47NuJTEg/JL77zAwC6E0OeA==", "license": "MIT", "dependencies": { - "@redis/bloom": "5.8.0", - "@redis/client": "5.8.0", - "@redis/json": "5.8.0", - "@redis/search": "5.8.0", - "@redis/time-series": "5.8.0" + "@redis/bloom": "5.8.2", + "@redis/client": "5.8.2", + "@redis/json": "5.8.2", + "@redis/search": "5.8.2", + "@redis/time-series": "5.8.2" }, "engines": { "node": ">= 18" @@ -9282,9 +9249,9 @@ "license": "MIT" }, "node_modules/safe-regex2": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-4.0.1.tgz", - "integrity": "sha512-goqsB+bSlOmVX+CiFX2PFc1OV88j5jvBqIM+DgqrucHnUguAUNtiNOs+aTadq2NqsLQ+TQ3UEVG3gtSFcdlkCg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.0.0.tgz", + "integrity": "sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==", "funding": [ { "type": "github", @@ -9552,14 +9519,14 @@ } }, "node_modules/socks": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.5.tgz", - "integrity": "sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "ip-address": "^9.0.5", + "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" }, "engines": { @@ -10089,18 +10056,6 @@ "node": ">=8" } }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -10272,9 +10227,9 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", "license": "MIT" }, "node_modules/unique-filename": { diff --git a/src/Auth/Drivers/Driver.imba b/src/Auth/Drivers/Driver.imba index 76809ed0..7ad8c7a4 100644 --- a/src/Auth/Drivers/Driver.imba +++ b/src/Auth/Drivers/Driver.imba @@ -282,7 +282,7 @@ export default class Driver if isValid !== true let errors = {} - isValid.forEach do(field) + for field in isValid errors[field] = [ "The {field} is invalid or has already taken." ] diff --git a/src/Database/Database.imba b/src/Database/Database.imba index 5314ed5d..3047c7f6 100644 --- a/src/Database/Database.imba +++ b/src/Database/Database.imba @@ -31,13 +31,13 @@ try let results\object[] = await this if columns && Array.isArray(columns) && columns.length > 0 - return results.map do(result) + let mappedResults = [] + for result in results const object = {} - for column in columns object[column] = result[column] - - return object + mappedResults.push(object) + return mappedResults if this._hidden && Array.isArray(this._hidden) && this._hidden.length > 0 for result in results @@ -129,37 +129,56 @@ try url = url.length > 1 ? url.replace(/\/+$/, '') + '/' : '' + params = [] + keys = Object.keys(query) + for key in keys + params.push(key + '=' + encodeURIComponent(key == 'page' ? (results.pagination.firstPage) : query[key])) links.firstPage = { label: 'First', active: results.pagination.firstPage === results.pagination.currentPage, - url: url + '?' + Object.keys(query).map(do(key) key + '=' + encodeURIComponent(key == 'page' ? (results.pagination.firstPage) : query[key])).join('&') + url: url + '?' + params.join('&') } + params = [] + keys = Object.keys(query) + for key in keys + params.push(key + '=' + encodeURIComponent(key == 'page' ? (results.pagination.prevPage) : query[key])) links.prevPage = results.pagination.prevPage ? { label: 'Previous', active: results.pagination.prevPage === results.pagination.currentPage, - url: url + '?' + Object.keys(query).map(do(key) key + '=' + encodeURIComponent(key == 'page' ? (results.pagination.prevPage) : query[key])).join('&') + url: url + '?' + params.join('&') } : null for page in pages query.page = page - + params = [] + keys = Object.keys(query) + for key in keys + params.push(key + '=' + encodeURIComponent(query[key])) links[page] = { label: page, active: page === results.pagination.currentPage, - url: url + '?' + Object.keys(query).map(do(key) key + '=' + encodeURIComponent(query[key])).join('&') + url: url + '?' + params.join('&') } + params = [] + keys = Object.keys(query) + for key in keys + params.push(key + '=' + encodeURIComponent(key == 'page' ? (results.pagination.nextPage) : query[key])) links.nextPage = results.pagination.nextPage ? { label: 'Next', active: results.pagination.nextPage === results.pagination.currentPage, - url: url + '?' + Object.keys(query).map(do(key) key + '=' + encodeURIComponent(key == 'page' ? (results.pagination.nextPage) : query[key])).join('&') + url: url + '?' + params.join('&') } : null + params = [] + keys = Object.keys(query) + for key in keys + params.push(key + '=' + encodeURIComponent(key == 'page' ? (results.pagination.lastPage) : query[key])) links.lastPage = { label: 'Last', active: results.pagination.lastPage === results.pagination.currentPage, - url: url + '?' + Object.keys(query).map(do(key) key + '=' + encodeURIComponent(key == 'page' ? (results.pagination.lastPage) : query[key])).join('&') + url: url + '?' + params.join('&') } results.pagination.links = links diff --git a/src/Environment/Repository.imba b/src/Environment/Repository.imba index b7e1f636..ed2ff47a 100644 --- a/src/Environment/Repository.imba +++ b/src/Environment/Repository.imba @@ -36,9 +36,12 @@ export default class Repository const results = output.match(/\$\{(.*?)\}/g) if !isEmpty(results) - results.forEach do(variable) + for variable in results output = output.replace(variable, self.variables[variable.slice(2, -1)]) + # results.forEach do(variable) + # output = output.replace(variable, self.variables[variable.slice(2, -1)]) + if isEmpty(output) then return default ['true', 'false'].includes(output.toLowerCase!) ? output = JSON.parse(output) : (output === 'null' ? null : output) diff --git a/src/Foundation/Application.imba b/src/Foundation/Application.imba index 7e5ec81a..e8cb26b3 100644 --- a/src/Foundation/Application.imba +++ b/src/Foundation/Application.imba @@ -227,5 +227,5 @@ export default class Application resolver.register! if resolver.context && Array.isArray(resolver.context) - resolver.context.forEach do(context) + for context in resolver.context self.context.inject(context) diff --git a/src/Foundation/Console.imba b/src/Foundation/Console.imba index 74ee2409..9b03d7ce 100644 --- a/src/Foundation/Console.imba +++ b/src/Foundation/Console.imba @@ -125,7 +125,11 @@ export default class Console const nodeEnv = args.find do(arg) arg.startsWith('--MODE=') const nodeEnvValue = nodeEnv ? nodeEnv.split('=')[1] : 'development' - process.argv = process.argv.filter do(arg) !arg.startsWith('--MODE=') + let filteredArgv = [] + for arg in process.argv + if !arg.startsWith('--MODE=') + filteredArgv.push(arg) + process.argv = filteredArgv modes.includes(nodeEnvValue) @@ -148,7 +152,7 @@ export default class Console let host = 'localhost' let addr = false - args.forEach do(arg) + for arg in args port = arg.split('=')[1] if arg.startsWith('--port') host = arg.split('=')[1] if arg.startsWith('--host') || arg.startsWith('-h') addr = true if arg == '--addr' diff --git a/src/Foundation/Console/Commands/DbSeedCommand.imba b/src/Foundation/Console/Commands/DbSeedCommand.imba index 63de523f..b906cd99 100644 --- a/src/Foundation/Console/Commands/DbSeedCommand.imba +++ b/src/Foundation/Console/Commands/DbSeedCommand.imba @@ -63,7 +63,7 @@ export class DbSeedCommand < Command const root = process.cwd! Output.group { newLine: false }, do - results[0].forEach do(seeder) + for seeder in results[0] self.message 'info', "Seeder \x1b[1m[{seeder.substring(root.length + 1)}]\x1b[0m ran successfully." exit! diff --git a/src/Foundation/Console/Commands/MigrationCommand.imba b/src/Foundation/Console/Commands/MigrationCommand.imba index 16fdaefd..309d0f74 100644 --- a/src/Foundation/Console/Commands/MigrationCommand.imba +++ b/src/Foundation/Console/Commands/MigrationCommand.imba @@ -52,7 +52,7 @@ export class MigrationCommand < Command if results[1].length > 0 Output.group { newLine: false }, do - results[1].forEach do(migration) + for migration in results[1] self.message 'info', "{action === 'rollback' ? 'Rollback' : 'Migrate'}: {migration}" if exitOnEnd diff --git a/src/Foundation/Console/Commands/PackagePublishCommand.imba b/src/Foundation/Console/Commands/PackagePublishCommand.imba index 6b1bc77f..b9b4406f 100644 --- a/src/Foundation/Console/Commands/PackagePublishCommand.imba +++ b/src/Foundation/Console/Commands/PackagePublishCommand.imba @@ -64,7 +64,8 @@ export class PackagePublishCommand < Command def handle let tags\string[] = self.option('tag').split(',') - tags.forEach do(optTag) self.persist optTag + for optTag in tags + self.persist optTag self.exit! @@ -75,7 +76,7 @@ export class PackagePublishCommand < Command if typeof self.publisher[optTag] !== 'object' return self.write "{optTag} is missing paths." - Object.keys(self.publisher[optTag].paths).forEach do(entry) + for entry in Object.keys(self.publisher[optTag].paths) const file = join self.package, self.publisher[optTag].paths[entry] if existsSync(entry) && !self.option('force', false) diff --git a/src/Foundation/Console/Commands/RouteListCommand.imba b/src/Foundation/Console/Commands/RouteListCommand.imba index e1dcecce..1cc828aa 100644 --- a/src/Foundation/Console/Commands/RouteListCommand.imba +++ b/src/Foundation/Console/Commands/RouteListCommand.imba @@ -24,9 +24,13 @@ export class RouteListCommand < Command const list = [] const methods = self.option('method') ? (Array.isArray(self.option('method')) ? self.option('method') : [self.option('method')]) : ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS', 'HEAD', 'TRACE', 'CONNECT'] - const routes = self.app.routes!.filter(do(route) - methods.map(do(method) method.toUpperCase!).includes(route.method.toUpperCase!) - ) + let normalizedMethods = [] + for method in methods + normalizedMethods.push(method.toUpperCase!) + let routes = [] + for route in self.app.routes! + if normalizedMethods.includes(route.method.toUpperCase!) + routes.push(route) if self.option('legacy') self.table(routes) diff --git a/src/Foundation/Console/Commands/ShellCommand.imba b/src/Foundation/Console/Commands/ShellCommand.imba index b46f2249..054126ec 100644 --- a/src/Foundation/Console/Commands/ShellCommand.imba +++ b/src/Foundation/Console/Commands/ShellCommand.imba @@ -38,7 +38,8 @@ export class ShellCommand < Command imbaRepl.registerCallback do(ctx) const context = app.context.registered - Object.keys(context).forEach do(key) if !ctx[key] then ctx[key] = context[key] + for key in Object.keys(context) + if !ctx[key] then ctx[key] = context[key] const server\REPLServer = await imbaRepl.run! diff --git a/src/Http/Kernel.imba b/src/Http/Kernel.imba index 8f15e6a1..908a048d 100644 --- a/src/Http/Kernel.imba +++ b/src/Http/Kernel.imba @@ -49,16 +49,16 @@ export default class Kernel const middlewareAliases = self.middlewareAliases ?? self.routeMiddleware # get route grouped middleware list. - Object.values((_middleware ? _middleware : route.middleware) || []).forEach do(middleware) + middlewareArr = Object.values((_middleware ? _middleware : route.middleware) || []) + for middleware in middlewareArr if typeof middleware === 'string' if typeof middleware.split(':')[1] === 'string' then params = middleware.split(':')[1].split(',') - middleware = middleware.split(':')[0] if self.middlewareGroups[middleware] const groupedList = self.middlewareGroups[middleware] - - Object.values(groupedList).forEach do(match) + const groupedArr = Object.values(groupedList) + for match in groupedArr if typeof match == 'string' && typeof match.split(':')[1] === 'string' params = match.split(':')[1].split(',') match = match.split(':')[0] @@ -171,8 +171,8 @@ export default class Kernel def hasRoutes router\FastifyInstance, config for route in Route.all! if isArray(route.action) || isFunction(route.action) || isClass(route.action) || route.action.constructor.name === 'AsyncFunction' - router.route({ - method: route.method.toUpperCase! + const domainPayload = { + method: route.method == 'any' ? ['DELETE', 'GET', 'OPTIONS', 'PATCH', 'POST', 'PUT'] : route.method.toUpperCase! url: route.path handler: do(req\FastifyRequest, reply\FastifyReply) const request = req.#context @@ -198,7 +198,14 @@ export default class Kernel await self.resolveMiddleware('timeout', route, request, reply, config) - }) + } + + if route.domain + domainPayload.constraints = { + host: route.domain + } + + router.route(domainPayload) else routes.invalid.push(route.path) diff --git a/src/Http/Middleware/TransformsRequest.imba b/src/Http/Middleware/TransformsRequest.imba index 0bd605d4..d3f0d434 100644 --- a/src/Http/Middleware/TransformsRequest.imba +++ b/src/Http/Middleware/TransformsRequest.imba @@ -10,15 +10,12 @@ export default class TransformsRequest def clean request if (request.request.body && request.request.body.constructor === ({}).constructor) - const results = Object.keys(request.request.body).map do(key) + let results = [] + for key in Object.keys(request.request.body) let value = request.request.body[key] - if except.includes(key) == false value = transform(key, request.input(key)) - - { - [key]: value - } + results.push({ [key]: value }) let output = {} diff --git a/src/Http/Request/FileCollection.imba b/src/Http/Request/FileCollection.imba index 0dd8dd5a..addbb7d3 100644 --- a/src/Http/Request/FileCollection.imba +++ b/src/Http/Request/FileCollection.imba @@ -68,9 +68,13 @@ export default class FileCollection * @returns {void} */ def each callback\function, _this\null - if isEmpty(_this) then return self._object.forEach callback, _this + if isEmpty(_this) + for file in self._object + callback file, _this + return - self._object.forEach callback + for file in self._object + callback file /** * Calls a defined callback function on each File of an array, and returns an array that contains the results. @@ -80,9 +84,14 @@ export default class FileCollection * @returns {File[]} */ def map callback\function, _this\null - if isEmpty(_this) then return self._object.map callback, _this - - self._object.map callback + let result = [] + if isEmpty(_this) + for file in self._object + result.push(callback(file, _this)) + return result + for file in self._object + result.push(callback(file)) + return result /** * Returns the files of an array that meet the condition specified in a callback function. @@ -92,9 +101,16 @@ export default class FileCollection * @returns {File[]} */ def filter callback\function, _this\null - if isEmpty(_this) then return self._object.filter callback, _this - - self._object.filter callback + let result = [] + if isEmpty(_this) + for file in self._object + if callback(file, _this) + result.push(file) + return result + for file in self._object + if callback(file) + result.push(file) + return result /** * Filter files using the where condition. @@ -123,8 +139,10 @@ export default class FileCollection */ def get let filtered = self._object - for condition\{ key: string, value: any } in self._conditions - filtered = filtered.filter do(file) file[condition.key] == condition.value - - filtered + let temp = [] + for file in filtered + if file[condition.key] == condition.value + temp.push(file) + filtered = temp + return filtered diff --git a/src/Http/Request/FormRequest.imba b/src/Http/Request/FormRequest.imba index 2c941290..07958a6a 100644 --- a/src/Http/Request/FormRequest.imba +++ b/src/Http/Request/FormRequest.imba @@ -211,7 +211,8 @@ export default class FormRequest def setHeaders headers\object const req = this - Object.keys(headers).forEach do(value) + const headerKeys = Object.keys(headers) + for value in headerKeys req.setHeader(value, headers[value]) this @@ -342,9 +343,8 @@ export default class FormRequest const body\object = this.body! - keys.forEach do(key) + for key in keys const value = body[key] - if value Object.assign response, { [key]: value diff --git a/src/Http/Router/Route.imba b/src/Http/Router/Route.imba index 3683f2ee..8d564c03 100644 --- a/src/Http/Router/Route.imba +++ b/src/Http/Router/Route.imba @@ -6,11 +6,12 @@ import type View from '../View/View' const routes = [] const middleware = [] const prefix = [] +const domain = [] export default class Route static def addRoute verb\string, pattern\string, action\function|[function, string] - if !['delete', 'get', 'options', 'patch', 'post', 'put'].includes verb + if !['delete', 'get', 'options', 'patch', 'post', 'put', 'any'].includes verb throw new Error "{verb} is not a valid HTTP verb." if typeof pattern !== 'string' || (isString(pattern) && pattern.trim! == '') @@ -22,70 +23,81 @@ export default class Route middleware: middleware.flat! action: action name: null + domain: domain.length > 0 ? domain[domain.length - 1] : null } this - /** - * Check if route exists. - */ + # Match specific verbs. + static def match verbs\string[], path\string, action\function|[function, string] + if !verbs.every(do(verb) ['delete', 'get', 'options', 'patch', 'post', 'put'].includes(verb)) + throw new Error "{verb} is not a valid HTTP verb." + + if typeof pattern !== 'string' || (isString(pattern) && pattern.trim! == '') + throw new Error 'Invalid route path.' + + for verb in verbs + routes.push { + method: verb + path: Path.clean prefix, pattern.trim! + middleware: middleware.flat! + action: action + name: null + domain: domain.length > 0 ? domain[domain.length - 1] : null + } + + this + + # Check if route exists. static def has name\string if routes.length === 0 then return false - const names = routes.map do(route) route.name + names = [] + for route in routes + names.push route.name names.includes(name) - /** - * Add a get route that renders a view. - */ + # Add a get route that renders a view. static def view path\string, view\View, data\object = {}, statusCode\number|null = null self.get path, do ViewResponse.make(view, data, statusCode ?? 200) - /** - * Add a delete route. - */ + # Add a delete route. static def delete path\string, action\function|[function, string] self.addRoute 'delete', path, action - /** - * Add a get route. - */ + # Add a get route. static def get path\string, action\function|[function, string] self.addRoute 'get', path, action - /** - * Add a options route. - */ + # Add a options route. static def options path\string, action\function|[function, string] self.addRoute 'options', path, action - /** - * Add a patch route. - */ + # Add a patch route. static def patch path\string, action\function|[function, string] self.addRoute 'patch', path, action - /** - * Add a post route. - */ + # Add a post route. static def post path\string, action\function|[function, string] self.addRoute 'post', path, action - /** - * Add a put route. - */ + # Add a put route. static def put path\string, action\function|[function, string] self.addRoute 'put', path, action - /** - * Set route name. - */ + # Add any route. + static def any path\string, action\function|[function, string] + self.addRoute 'any', path, action + + # Set route name. static def name name\string if routes.length === 0 then return this - const names = routes.map do(route) route.name + names = [] + for route in routes + names.push route.name if names.includes name throw new Error "\"{name}\" is already in use by another route." @@ -94,28 +106,25 @@ export default class Route this - /** - * Add middleware to route. - */ + # Add middleware to route. static def middleware name\string|string[] if routes.length === 0 then return this if !Array.isArray name then name = [name] - name.forEach do(middleware) + for middleware in name routes.slice(-1).pop!.middleware.push middleware this - /** - * Add grouped routes. - */ + # Add grouped routes. static def group options = new Object, callable\function if !options || options && typeof options !== 'object' throw new Error 'Invalid route group.' let groupPrefix = options['prefix'] ? options['prefix'] : '' let groupMiddleware = options['middleware'] ? options['middleware'] : [] + let groupDomain = options['domain'] ? options['domain'] : null # validate prefix if typeof groupPrefix !== 'string' || groupPrefix.trim! === '/' @@ -128,21 +137,28 @@ export default class Route if !Array.isArray groupMiddleware groupMiddleware = [groupMiddleware] + if groupDomain? and typeof groupDomain != 'string' + throw new Error 'Invalid domain.' + # append prefix let prefixIndex = 0 + let domainIndex = 0 if groupPrefix.trim! !== '' prefix.push groupPrefix.trim! prefixIndex = prefix.length - 1 + if groupDomain? + domain.push groupDomain + domainIndex = domain.length - 1 + let middlewareIndex = [] # push middleware if groupMiddleware.length > 0 - groupMiddleware.forEach do(m) + for m in groupMiddleware middleware.push m - middlewareIndex.push middleware.length - 1 # call callable @@ -152,10 +168,14 @@ export default class Route if groupPrefix.trim! !== '' prefix.splice prefixIndex + if groupDomain? + domain.splice domainIndex + # remove pushed middleware if middlewareIndex.length > 0 - middlewareIndex.forEach do(index) + for index in middlewareIndex middleware.splice index + # Get all routes. static def all routes diff --git a/src/Http/URL/URL.imba b/src/Http/URL/URL.imba index d956893e..35df3051 100644 --- a/src/Http/URL/URL.imba +++ b/src/Http/URL/URL.imba @@ -35,12 +35,11 @@ export default class URL let query = {} const uri = [] - Object.keys(params).forEach(do(key) + for key in Object.keys(params) if !selected.params.includes(":{key}") && key !== '_query' query[key] = params[key] - ) - selected.path.split('/').forEach(do(value) + for value in selected.path.split('/') if value.startsWith(':') value = value.slice(1) @@ -50,7 +49,6 @@ export default class URL else value = params[value] uri.push value - ) query = (new URLSearchParams(Object.assign(query, (params._query ?? {})))).toString() diff --git a/src/Mix/Repository.imba b/src/Mix/Repository.imba index e3004afd..99b71a00 100644 --- a/src/Mix/Repository.imba +++ b/src/Mix/Repository.imba @@ -14,9 +14,9 @@ export default class Repository static def manifest const location\string = path.join(process.cwd!, 'public', 'mix-manifest.json') - if fs.existsSync(location) - const content\string = fs.readFileSync(location, 'utf8') - + try + await fs.promises.access(location) + const content\string = await fs.promises.readFile(location, 'utf8') return content ? JSON.parse(content) : null - - null + catch err + return null diff --git a/src/Support/Decorators/use.imba b/src/Support/Decorators/use.imba index 960f3577..163fef85 100644 --- a/src/Support/Decorators/use.imba +++ b/src/Support/Decorators/use.imba @@ -106,11 +106,13 @@ def DI target, key, descriptor, paramaters = null if !isEmpty(request.auth) response.auth = request.auth - if !response.passesAuthorization! then response.failedAuthorization! + const passesAuth = await response.passesAuthorization! + + if !passesAuth then response.failedAuthorization! parsed.request = true - Object.keys(request).map do(key) + for key in Object.keys(request) if isEmpty(response[key]) then response[key] = request[key] const validator = response.validate! diff --git a/src/Support/Helpers/config.imba b/src/Support/Helpers/config.imba index 85bddca3..46870f50 100644 --- a/src/Support/Helpers/config.imba +++ b/src/Support/Helpers/config.imba @@ -3,17 +3,19 @@ import dot from './dotNotation' import path from 'path' def fallback notation\string, default\any = null + if !notation or typeof notation != 'string' + throw new ConfigNotCachedError try const app = require('../../Foundation/Application').default - app.getConfig(notation, default) catch e throw new ConfigNotCachedError export default def config notation\string, default\any = null + if !notation or typeof notation != 'string' + return default try const config = require(path.join(process.cwd!, 'bootstrap', 'cache', 'config.json')) - - dot(config, notation) ?? default + return dot(config, notation) ?? default catch e - fallback(notation, default) + return fallback(notation, default) diff --git a/src/Support/Helpers/dotNotation.imba b/src/Support/Helpers/dotNotation.imba index 1c5256a5..43760539 100644 --- a/src/Support/Helpers/dotNotation.imba +++ b/src/Support/Helpers/dotNotation.imba @@ -8,7 +8,7 @@ export default def dotNotation object\object, key\string if !isString key throw new TypeError 'Expected string' - const results = key.split('.').reduce(&, object) do(o, i) - o ? o[i] ?? null : null - - results + let result = object + for i in key.split('.') + result = result ? result[i] ?? null : null + result diff --git a/src/Support/Helpers/env.imba b/src/Support/Helpers/env.imba index 270694ae..05d6d09a 100644 --- a/src/Support/Helpers/env.imba +++ b/src/Support/Helpers/env.imba @@ -13,7 +13,7 @@ export default def env key\string, default\any = null const results = output.match(/\$\{(.*?)\}/g) if !isEmpty(results) - results.forEach do(variable) + for variable in results output = output.replace(variable, process.env[variable.slice(2, -1)]) if isEmpty(output) then return default diff --git a/src/Support/Helpers/imbaEnv.imba b/src/Support/Helpers/imbaEnv.imba index 5b6ac5a8..87162486 100644 --- a/src/Support/Helpers/imbaEnv.imba +++ b/src/Support/Helpers/imbaEnv.imba @@ -6,4 +6,6 @@ export default def imbaEnv stringify\boolean = true if env.startsWith(prefix) envList[env] = value - stringify ? JSON.stringify(envList) : envList + if stringify + return JSON.stringify(envList) + return envList diff --git a/src/Support/Helpers/isEmpty.imba b/src/Support/Helpers/isEmpty.imba index 814e6cc0..19842b61 100644 --- a/src/Support/Helpers/isEmpty.imba +++ b/src/Support/Helpers/isEmpty.imba @@ -19,7 +19,9 @@ export default def isEmpty value\any if isArray(value) && value.length === 0 return true - if isObject(value) && Object.keys(value).length === 0 - return true + if isObject(value) + keys = Object.keys(value) + if keys.length === 0 + return true return false diff --git a/src/Support/Helpers/toBoolean.imba b/src/Support/Helpers/toBoolean.imba index 4cd6ab09..685e99c0 100644 --- a/src/Support/Helpers/toBoolean.imba +++ b/src/Support/Helpers/toBoolean.imba @@ -16,4 +16,4 @@ export default def toBoolean value if !isString(value) throw new BooleanCastError("Can't convert {value} to boolean.") - JSON.parse value.toLowerCase! + return JSON.parse(value.toLowerCase!) diff --git a/src/Support/Helpers/updateLine.imba b/src/Support/Helpers/updateLine.imba index cd4491cb..21dab40c 100644 --- a/src/Support/Helpers/updateLine.imba +++ b/src/Support/Helpers/updateLine.imba @@ -1,15 +1,16 @@ -import { existsSync } from 'fs' -import { readFileSync } from 'fs' -import { writeFileSync } from 'fs' +import { promises as fs } from 'fs' -export def updateLine file\string, callback\function - if !existsSync(file) then return false +def updateLine file\string, callback\function + try + await fs.access(file) + catch + return false - const contents = readFileSync(file, 'utf8') + const contents = await fs.readFile(file, 'utf8') const lines = [] + const splitLines = contents.split('\n') + for index in [0...splitLines.length] + lines.push callback(splitLines[index], index) - contents.split('\n').map do(line, index) lines.push callback(line, index) - - writeFileSync file, lines.join('\n'), { encoding: 'utf8' } - - true + await fs.writeFile(file, lines.join('\n'), { encoding: 'utf8' }) + return true diff --git a/src/Support/Helpers/wildcard.imba b/src/Support/Helpers/wildcard.imba index 740ed95c..fd4b4823 100644 --- a/src/Support/Helpers/wildcard.imba +++ b/src/Support/Helpers/wildcard.imba @@ -9,4 +9,10 @@ export default def wildcard value\string, match\string const escapeRegex = do(value) value.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1") - new RegExp("^" + match.split("*").map(escapeRegex).join(".*") + "$").test value + let parts = match.split("*") + let regexStr = "" + for idx in [0...parts.length] + regexStr += escapeRegex(parts[idx]) + if idx < parts.length - 1 + regexStr += ".*" + new RegExp("^" + regexStr + "$").test value diff --git a/src/Support/Helpers/without.imba b/src/Support/Helpers/without.imba index dd716035..6638aa7f 100644 --- a/src/Support/Helpers/without.imba +++ b/src/Support/Helpers/without.imba @@ -8,9 +8,9 @@ export default def without object\object, exclude\string[] const output = {} - Object.keys(object).forEach do(key) - if !exclude.includes(key) then Object.assign(output, { - [ key ] : object[key] - }) + keys = Object.keys(object) + for key in keys + if !exclude.includes(key) + output[key] = object[key] output diff --git a/src/Support/Language/Language.imba b/src/Support/Language/Language.imba index fb0a4559..c8ca8ae8 100644 --- a/src/Support/Language/Language.imba +++ b/src/Support/Language/Language.imba @@ -5,7 +5,7 @@ import path from 'path' def getDirectories location const all = [] - fs.readdirSync(location).forEach do(folder) + for folder in fs.readdirSync(location) if fs.statSync(path.join(location, folder)).isDirectory! then all.push folder all @@ -40,11 +40,11 @@ export default class Language def register location\string const packs = getDirectories location - packs.forEach do(pack) + for pack in packs if !self.lang.packs[pack] self.lang.packs[pack] = {} - fs.readdirSync(path.join(location, pack)).forEach do(file) + for file in fs.readdirSync(path.join(location, pack)) if path.extname(file) == '.json' const definition = { [path.parse(file).name]: require path.join(location, pack, file) diff --git a/src/Validator/ValidationServiceResolver.imba b/src/Validator/ValidationServiceResolver.imba index 60180602..3b88f40b 100644 --- a/src/Validator/ValidationServiceResolver.imba +++ b/src/Validator/ValidationServiceResolver.imba @@ -18,27 +18,52 @@ export default class ValidationServiceResolver < ServiceResolver true def unique value\string, definition\string, field\string, passes\CallableFunction + let rawDef = definition.trim! + let conditionBlock = null + + if rawDef.includes('[') + conditionBlock = rawDef.slice(rawDef.indexOf('[') + 1, rawDef.lastIndexOf(']')) + rawDef = rawDef.slice(0, rawDef.indexOf('[')) // remove condition part + let [ table, column = field, ignore = null - ] = definition.split(',') + ] = rawDef.split(',') let results + let query = DB.table(table) + if ignore - const [ - identifierValue, - identifierColumn = 'id' - ] = ignore.split(':') - - results = await DB.table(table) - .whereRaw("LOWER({column}) = LOWER(?) AND {identifierColumn} != ?", [ value, identifierValue ]) - .first! + let [identifierValue, identifierColumn = 'id'] = ignore.split(':') + query.whereRaw("LOWER({column}) = LOWER(?) AND {identifierColumn} != ?", [value, identifierValue]) else - results = await DB.table(table) - .whereRaw("LOWER({column}) = LOWER(?)", [ value ]) - .first! + query.whereRaw("LOWER({column}) = LOWER(?)", [value]) + + if conditionBlock + let conditionRegex = /(where(?:Not)?(?:In|Like|ILike|Null)?\(([^)]*)\))/g + let conditionMatch + + while conditionMatch = conditionRegex.exec(conditionBlock) + let full = conditionMatch[1] + let method = full.split('(')[0].trim() + let args = conditionMatch[2].split(',').map do(x) x.trim() + + args = args.map do(arg) arg === 'true' ? true : arg === 'false' ? false : arg === 'null' ? null : isNaN(arg) ? arg.replace(/^['"]|['"]$/g, '') : Number(arg) + + if method in ['where', 'whereNot'] + query[method](...args) + else if method in ['whereIn', 'whereNotIn'] + query[method](args[0], args.slice(1)) + else if method in ['whereLike', 'whereILike'] + query[method](...args) + else if method in ['whereNull', 'whereNotNull'] + query[method](args[0]) + else + continue + + results = await query.first! passes(!results, "The {field} has already been taken.") @@ -59,7 +84,7 @@ export default class ValidationServiceResolver < ServiceResolver { } def registerRules rules\object - Object.keys(rules).forEach do(name) + for name in Object.keys(rules) Validator.get!.registerAsync(name, rules[name]) this From dc4fc6d797d838415a290273b4530dee90211be0 Mon Sep 17 00:00:00 2001 From: Donald Pakkies Date: Fri, 17 Oct 2025 16:51:55 +0200 Subject: [PATCH 2/6] fix: use sync --- src/Support/Helpers/updateLine.imba | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/Support/Helpers/updateLine.imba b/src/Support/Helpers/updateLine.imba index 21dab40c..e254aa82 100644 --- a/src/Support/Helpers/updateLine.imba +++ b/src/Support/Helpers/updateLine.imba @@ -1,16 +1,13 @@ import { promises as fs } from 'fs' def updateLine file\string, callback\function - try - await fs.access(file) - catch - return false + if !existsSync(file) then return false - const contents = await fs.readFile(file, 'utf8') + const contents = fs.readFileSync(file, 'utf8') const lines = [] const splitLines = contents.split('\n') for index in [0...splitLines.length] lines.push callback(splitLines[index], index) - await fs.writeFile(file, lines.join('\n'), { encoding: 'utf8' }) + fs.writeFileSync(file, lines.join('\n'), { encoding: 'utf8' }) return true From 0589a40f28b93c3fac27db15cdcf71d6b173859f Mon Sep 17 00:00:00 2001 From: Donald Pakkies Date: Sat, 18 Oct 2025 18:06:31 +0200 Subject: [PATCH 3/6] fix: export function --- src/Support/Helpers/updateLine.imba | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Support/Helpers/updateLine.imba b/src/Support/Helpers/updateLine.imba index e254aa82..dbac59fe 100644 --- a/src/Support/Helpers/updateLine.imba +++ b/src/Support/Helpers/updateLine.imba @@ -1,6 +1,6 @@ import { promises as fs } from 'fs' -def updateLine file\string, callback\function +export default def updateLine file\string, callback\function if !existsSync(file) then return false const contents = fs.readFileSync(file, 'utf8') From 0d38e5d571401f76c54a72c6ba27a90f7830b78d Mon Sep 17 00:00:00 2001 From: Donald Pakkies Date: Sat, 18 Oct 2025 18:11:45 +0200 Subject: [PATCH 4/6] chore: revert changes --- src/Support/Helpers/updateLine.imba | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Support/Helpers/updateLine.imba b/src/Support/Helpers/updateLine.imba index dbac59fe..a8a35bf3 100644 --- a/src/Support/Helpers/updateLine.imba +++ b/src/Support/Helpers/updateLine.imba @@ -1,13 +1,15 @@ -import { promises as fs } from 'fs' +import { existsSync } from 'fs' +import { readFileSync } from 'fs' +import { writeFileSync } from 'fs' -export default def updateLine file\string, callback\function +export def updateLine file\string, callback\function if !existsSync(file) then return false - const contents = fs.readFileSync(file, 'utf8') + const contents = readFileSync(file, 'utf8') const lines = [] const splitLines = contents.split('\n') for index in [0...splitLines.length] lines.push callback(splitLines[index], index) - fs.writeFileSync(file, lines.join('\n'), { encoding: 'utf8' }) + writeFileSync(file, lines.join('\n'), { encoding: 'utf8' }) return true From 1b6b924d1cdaff91b3bd53b4f0f0313670d1fb75 Mon Sep 17 00:00:00 2001 From: Donald Pakkies Date: Sat, 18 Oct 2025 18:45:37 +0200 Subject: [PATCH 5/6] feat(router): enhance Route class with improved docs and new features - Clean up JSDoc documentation with consistent formatting and proper tags - Add domain support to GroupOptions type for multi-tenant routing - Add Route.any() method for catch-all HTTP method handling - Remove duplicate comment blocks and improve code readability --- types/Http/Router/Route.d.ts | 185 ++++++++++++++++------------------- 1 file changed, 82 insertions(+), 103 deletions(-) diff --git a/types/Http/Router/Route.d.ts b/types/Http/Router/Route.d.ts index 81263334..4a6e6cb0 100644 --- a/types/Http/Router/Route.d.ts +++ b/types/Http/Router/Route.d.ts @@ -2,138 +2,117 @@ import { IMiddleware } from "../Middleware/IMiddleware"; import { IView } from "../View/View"; export default class Route { -// /** -// @param {string} verb -// @param {string} pattern -// @param {function|[function, string]} action -// */ -// static addRoute(verb: string, pattern: string, action: Function | [Function, string]): typeof Route; /** - * Check if route exists. - */ - /** - * * Check if route exists. - * @param {string} name + * @param name - The route name to check + * @returns True if the route exists, false otherwise */ static has(name: string): boolean; - /** - * Add a get route that renders a view. - */ - /** - * - * Add a get route that renders a view. - @param {string} path - @param {View} view - @param {object} data - @param {number|null} statusCode - */ - static view(path: string, view: IView, data?: object, statusCode?: number | null): typeof Route; - /** - * Add a delete route. - */ /** - * - * Add a delete route. + * Add a GET route that renders a view. + * @param path - The route path + * @param view - The view to render + * @param data - Optional data to pass to the view + * @param statusCode - Optional HTTP status code + * @returns The Route class for method chaining + */ + static view(path: string, view: IView, data?: object, statusCode?: number | null): typeof Route; - @param {string} path - @param {function|[function, string]} action - */ - static delete(path: string, action: Function | [Function, string]): typeof Route; - /** - * Add a get route. - */ /** - * - * Add a get route. + * Add a DELETE route. + * @param path - The route path + * @param action - The route handler function or [function, method] tuple + * @returns The Route class for method chaining + */ + static delete(path: string, action: Function | [Function, string]): typeof Route; - @param {string} path - @param {function|[function, string]} action - */ - static get(path: string, action: Function | [Function, string]): typeof Route; /** - * Add a options route. - */ - /** - * - * Add a options route. + * Add a GET route. + * @param path - The route path + * @param action - The route handler function or [function, method] tuple + * @returns The Route class for method chaining + */ + static get(path: string, action: Function | [Function, string]): typeof Route; - @param {string} path - @param {function|[function, string]} action - */ - static options(path: string, action: Function | [Function, string]): typeof Route; - /** - * Add a patch route. - */ /** - * - * Add a patch route. + * Add an OPTIONS route. + * @param path - The route path + * @param action - The route handler function or [function, method] tuple + * @returns The Route class for method chaining + */ + static options(path: string, action: Function | [Function, string]): typeof Route; - @param {string} path - @param {function|[function, string]} action - */ - static patch(path: string, action: Function | [Function, string]): typeof Route; - /** - * Add a post route. - */ /** - * - * Add a post route. + * Add a PATCH route. + * @param path - The route path + * @param action - The route handler function or [function, method] tuple + * @returns The Route class for method chaining + */ + static patch(path: string, action: Function | [Function, string]): typeof Route; - @param {string} path - @param {function|[function, string]} action - */ - static post(path: string, action: Function | [Function, string]): typeof Route; - /** - * Add a put route. - */ /** - * - * Add a put route. + * Add a POST route. + * @param path - The route path + * @param action - The route handler function or [function, method] tuple + * @returns The Route class for method chaining + */ + static post(path: string, action: Function | [Function, string]): typeof Route; - @param {string} path - @param {function|[function, string]} action - */ - static put(path: string, action: Function | [Function, string]): typeof Route; - /** - * Set route name. - */ /** - * - * Set route name. + * Add a PUT route. + * @param path - The route path + * @param action - The route handler function or [function, method] tuple + * @returns The Route class for method chaining + */ + static put(path: string, action: Function | [Function, string]): typeof Route; - @param {string} name - */ - static name(name: string): typeof Route; /** - * Add middleware to route. - */ - /** - * - * Add middleware to route. + * Add a route that matches any HTTP method. + * @param path - The route path + * @param action - The route handler function or [function, method] tuple + * @returns The Route class for method chaining + */ + static any(path: string, action: Function | [Function, string]): typeof Route; - @param {string | IMiddleware | Array} name - */ - static middleware(name: string | IMiddleware | Array): typeof Route; /** - * Add grouped routes. - */ + * Set route name. + * @param name - The name to assign to the route + * @returns The Route class for method chaining + */ + static name(name: string): typeof Route; + /** - * - * Add grouped routes. + * Add middleware to route. + * @param name - The middleware name, instance, or array of middleware + * @returns The Route class for method chaining + */ + static middleware(name: string | IMiddleware | Array): typeof Route; - @param {function} callable - */ + /** + * Add grouped routes. + * @param options - Group configuration options + * @param callable - Function containing the grouped routes + */ static group(options: GroupOptions, callable: Function): void; + + /** + * Get all registered routes. + * @returns Array of all registered routes + */ static all(): any[]; } export type GroupOptions = { - prefix: string; - middleware: IMiddleware | string | Array; + prefix: string; + middleware: IMiddleware | string | Array; + domain?: string; +} | { + prefix: string; + domain?: string; } | { - prefix: string; + middleware: IMiddleware | string | Array; + domain?: string; } | { - middleware: IMiddleware | string | Array; + domain: string; } From fb0932bc799482c41791fa2056bface00f6eb3b2 Mon Sep 17 00:00:00 2001 From: Donald Pakkies Date: Sat, 18 Oct 2025 18:49:13 +0200 Subject: [PATCH 6/6] chore: bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index aa089f2e..b22ac7eb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@formidablejs/framework", - "version": "0.28.3", + "version": "0.28.4", "description": "Formidable Framework Core", "author": "Donald Pakkies", "license": "MIT",