From c6611471b16542bf145d663a743c80f9a5e6c581 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Nov 2025 01:37:59 +0000 Subject: [PATCH 01/29] Bump docker/setup-qemu-action from 3.6.0 to 3.7.0 Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 3.6.0 to 3.7.0. - [Release notes](https://github.com/docker/setup-qemu-action/releases) - [Commits](https://github.com/docker/setup-qemu-action/compare/29109295f81e9208d7d86ff1c6c12d2833863392...c7c53464625b32c7a7e944ae62b3e17d2b600130) --- updated-dependencies: - dependency-name: docker/setup-qemu-action dependency-version: 3.7.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/cicd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index 1af1bbb4..710c5c86 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -39,7 +39,7 @@ jobs: uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Set up QEMU - uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0 + uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 From fbce392137da5e4dc6742b73251ed52a1018bc0b Mon Sep 17 00:00:00 2001 From: Laurence Jones Date: Thu, 13 Nov 2025 12:52:21 +0000 Subject: [PATCH 02/29] Remove unnecessary return after success message Remove redundant return statement after success message. --- install/main.go | 1 - 1 file changed, 1 deletion(-) diff --git a/install/main.go b/install/main.go index a1b7d901..a8cb13e1 100644 --- a/install/main.go +++ b/install/main.go @@ -238,7 +238,6 @@ func main() { } fmt.Println("CrowdSec installed successfully!") - return } } } From ca66637270c8c6a6da127e2207671c5813b1157a Mon Sep 17 00:00:00 2001 From: miloschwartz Date: Thu, 13 Nov 2025 17:34:49 -0500 Subject: [PATCH 03/29] remove from address in saas suppport email --- server/private/routers/misc/sendSupportEmail.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/private/routers/misc/sendSupportEmail.ts b/server/private/routers/misc/sendSupportEmail.ts index fef43ef8..9b3f9c14 100644 --- a/server/private/routers/misc/sendSupportEmail.ts +++ b/server/private/routers/misc/sendSupportEmail.ts @@ -68,7 +68,7 @@ export async function sendSupportEmail( { name: req.user?.email || "Support User", to: "support@pangolin.net", - from: req.user?.email || config.getNoReplyEmail(), + from: config.getNoReplyEmail(), subject: `Support Request: ${subject}` } ); From 1a4078b8a1e40f5155627ee8092354cd9d52375a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Nov 2025 01:21:19 +0000 Subject: [PATCH 04/29] Bump the dev-minor-updates group across 1 directory with 3 updates Bumps the dev-minor-updates group with 3 updates in the / directory: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [esbuild](https://github.com/evanw/esbuild) and [esbuild-node-externals](https://github.com/pradel/esbuild-node-externals). Updates `@types/node` from 24.9.2 to 24.10.1 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `esbuild` from 0.25.12 to 0.27.0 - [Release notes](https://github.com/evanw/esbuild/releases) - [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md) - [Commits](https://github.com/evanw/esbuild/compare/v0.25.12...v0.27.0) Updates `esbuild-node-externals` from 1.18.0 to 1.19.1 - [Release notes](https://github.com/pradel/esbuild-node-externals/releases) - [Commits](https://github.com/pradel/esbuild-node-externals/compare/v1.18.0...esbuild-node-externals-v1.19.1) --- updated-dependencies: - dependency-name: "@types/node" dependency-version: 24.10.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: esbuild dependency-version: 0.27.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates - dependency-name: esbuild-node-externals dependency-version: 1.19.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dev-minor-updates ... Signed-off-by: dependabot[bot] --- package-lock.json | 1686 +++++++++++++++++++++++++++++++++++++++++---- package.json | 6 +- 2 files changed, 1572 insertions(+), 120 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2004db01..04839f15 100644 --- a/package-lock.json +++ b/package-lock.json @@ -123,7 +123,7 @@ "@types/jmespath": "^0.15.2", "@types/js-yaml": "4.0.9", "@types/jsonwebtoken": "^9.0.10", - "@types/node": "24.9.2", + "@types/node": "24.10.1", "@types/nodemailer": "7.0.3", "@types/nprogress": "^0.2.3", "@types/pg": "8.15.6", @@ -134,8 +134,8 @@ "@types/ws": "8.18.1", "@types/yargs": "17.0.34", "drizzle-kit": "0.31.6", - "esbuild": "0.25.12", - "esbuild-node-externals": "1.18.0", + "esbuild": "0.27.0", + "esbuild-node-externals": "1.19.1", "postcss": "^8", "react-email": "4.3.2", "tailwindcss": "^4.1.4", @@ -2507,9 +2507,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz", + "integrity": "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==", "cpu": [ "ppc64" ], @@ -2524,9 +2524,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.0.tgz", + "integrity": "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==", "cpu": [ "arm" ], @@ -2541,9 +2541,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz", + "integrity": "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==", "cpu": [ "arm64" ], @@ -2558,9 +2558,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.0.tgz", + "integrity": "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==", "cpu": [ "x64" ], @@ -2575,9 +2575,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.0.tgz", + "integrity": "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==", "cpu": [ "arm64" ], @@ -2592,9 +2592,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz", + "integrity": "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==", "cpu": [ "x64" ], @@ -2609,9 +2609,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz", + "integrity": "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==", "cpu": [ "arm64" ], @@ -2626,9 +2626,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz", + "integrity": "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==", "cpu": [ "x64" ], @@ -2643,9 +2643,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz", + "integrity": "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==", "cpu": [ "arm" ], @@ -2660,9 +2660,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz", + "integrity": "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==", "cpu": [ "arm64" ], @@ -2677,9 +2677,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz", + "integrity": "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==", "cpu": [ "ia32" ], @@ -2694,9 +2694,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz", + "integrity": "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==", "cpu": [ "loong64" ], @@ -2711,9 +2711,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz", + "integrity": "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==", "cpu": [ "mips64el" ], @@ -2728,9 +2728,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz", + "integrity": "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==", "cpu": [ "ppc64" ], @@ -2745,9 +2745,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz", + "integrity": "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==", "cpu": [ "riscv64" ], @@ -2762,9 +2762,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz", + "integrity": "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==", "cpu": [ "s390x" ], @@ -2779,9 +2779,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz", + "integrity": "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==", "cpu": [ "x64" ], @@ -2796,9 +2796,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.0.tgz", + "integrity": "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==", "cpu": [ "arm64" ], @@ -2813,9 +2813,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz", + "integrity": "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==", "cpu": [ "x64" ], @@ -2830,9 +2830,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.0.tgz", + "integrity": "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==", "cpu": [ "arm64" ], @@ -2847,9 +2847,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz", + "integrity": "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==", "cpu": [ "x64" ], @@ -2864,9 +2864,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.0.tgz", + "integrity": "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==", "cpu": [ "arm64" ], @@ -2881,9 +2881,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz", + "integrity": "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==", "cpu": [ "x64" ], @@ -2898,9 +2898,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz", + "integrity": "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==", "cpu": [ "arm64" ], @@ -2915,9 +2915,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz", + "integrity": "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==", "cpu": [ "ia32" ], @@ -2932,9 +2932,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz", + "integrity": "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==", "cpu": [ "x64" ], @@ -8680,9 +8680,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.9.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.2.tgz", - "integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==", + "version": "24.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -11266,6 +11266,490 @@ "drizzle-kit": "bin.cjs" } }, + "node_modules/drizzle-kit/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, "node_modules/drizzle-orm": { "version": "0.44.7", "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.44.7.tgz", @@ -11871,9 +12355,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.0.tgz", + "integrity": "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -11884,38 +12368,38 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" + "@esbuild/aix-ppc64": "0.27.0", + "@esbuild/android-arm": "0.27.0", + "@esbuild/android-arm64": "0.27.0", + "@esbuild/android-x64": "0.27.0", + "@esbuild/darwin-arm64": "0.27.0", + "@esbuild/darwin-x64": "0.27.0", + "@esbuild/freebsd-arm64": "0.27.0", + "@esbuild/freebsd-x64": "0.27.0", + "@esbuild/linux-arm": "0.27.0", + "@esbuild/linux-arm64": "0.27.0", + "@esbuild/linux-ia32": "0.27.0", + "@esbuild/linux-loong64": "0.27.0", + "@esbuild/linux-mips64el": "0.27.0", + "@esbuild/linux-ppc64": "0.27.0", + "@esbuild/linux-riscv64": "0.27.0", + "@esbuild/linux-s390x": "0.27.0", + "@esbuild/linux-x64": "0.27.0", + "@esbuild/netbsd-arm64": "0.27.0", + "@esbuild/netbsd-x64": "0.27.0", + "@esbuild/openbsd-arm64": "0.27.0", + "@esbuild/openbsd-x64": "0.27.0", + "@esbuild/openharmony-arm64": "0.27.0", + "@esbuild/sunos-x64": "0.27.0", + "@esbuild/win32-arm64": "0.27.0", + "@esbuild/win32-ia32": "0.27.0", + "@esbuild/win32-x64": "0.27.0" } }, "node_modules/esbuild-node-externals": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/esbuild-node-externals/-/esbuild-node-externals-1.18.0.tgz", - "integrity": "sha512-suFVX3SzZlXrGIS9Yqx+ZaHL4w1p0e/j7dQbOM9zk8SfFpnAGnDplHUKXIf9kcPEAfZRL66JuYeVSVlsSEQ5Eg==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/esbuild-node-externals/-/esbuild-node-externals-1.19.1.tgz", + "integrity": "sha512-edyCKL8PLs/uamOJUkvjn2TMOdbRaQmQ9l/LOLnUEOEhzpVk/PkyiRyllKac2GX9Y+8NqGTO4DhrHT92b4nHxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11925,7 +12409,7 @@ "node": ">=12" }, "peerDependencies": { - "esbuild": "0.12 - 0.25" + "esbuild": "0.12 - 0.27" } }, "node_modules/esbuild-register": { @@ -19336,6 +19820,448 @@ "node": ">=18.0.0" } }, + "node_modules/react-email/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/react-email/node_modules/chalk": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", @@ -19382,6 +20308,48 @@ "dev": true, "license": "MIT" }, + "node_modules/react-email/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, "node_modules/react-email/node_modules/is-interactive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", @@ -21655,6 +22623,490 @@ "fsevents": "~2.3.3" } }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, "node_modules/tsyringe": { "version": "4.10.0", "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", diff --git a/package.json b/package.json index 480da7e4..3e6d419b 100644 --- a/package.json +++ b/package.json @@ -147,7 +147,7 @@ "@types/js-yaml": "4.0.9", "@types/jsonwebtoken": "^9.0.10", "@types/nprogress": "^0.2.3", - "@types/node": "24.9.2", + "@types/node": "24.10.1", "@types/nodemailer": "7.0.3", "@types/pg": "8.15.6", "@types/react": "19.2.2", @@ -157,8 +157,8 @@ "@types/ws": "8.18.1", "@types/yargs": "17.0.34", "drizzle-kit": "0.31.6", - "esbuild": "0.25.12", - "esbuild-node-externals": "1.18.0", + "esbuild": "0.27.0", + "esbuild-node-externals": "1.19.1", "postcss": "^8", "react-email": "4.3.2", "tailwindcss": "^4.1.4", From 9344ab3546a4afffa1cda15f450def753bc105cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Nov 2025 01:23:32 +0000 Subject: [PATCH 05/29] Bump golang.org/x/term in /install in the prod-minor-updates group Bumps the prod-minor-updates group in /install with 1 update: [golang.org/x/term](https://github.com/golang/term). Updates `golang.org/x/term` from 0.36.0 to 0.37.0 - [Commits](https://github.com/golang/term/compare/v0.36.0...v0.37.0) --- updated-dependencies: - dependency-name: golang.org/x/term dependency-version: 0.37.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: prod-minor-updates ... Signed-off-by: dependabot[bot] --- install/go.mod | 4 ++-- install/go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/install/go.mod b/install/go.mod index 8c6e06e2..b639e847 100644 --- a/install/go.mod +++ b/install/go.mod @@ -3,8 +3,8 @@ module installer go 1.24.0 require ( - golang.org/x/term v0.36.0 + golang.org/x/term v0.37.0 gopkg.in/yaml.v3 v3.0.1 ) -require golang.org/x/sys v0.37.0 // indirect +require golang.org/x/sys v0.38.0 // indirect diff --git a/install/go.sum b/install/go.sum index 68e246d1..24b1a1ef 100644 --- a/install/go.sum +++ b/install/go.sum @@ -1,7 +1,7 @@ -golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= -golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= -golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= From c9786946b7f2d77189cb9c5fc01a57cab282f079 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Nov 2025 01:24:49 +0000 Subject: [PATCH 06/29] Bump the prod-patch-updates group across 1 directory with 12 updates Bumps the prod-patch-updates group with 12 updates in the / directory: | Package | From | To | | --- | --- | --- | | [@radix-ui/react-avatar](https://github.com/radix-ui/primitives) | `1.1.10` | `1.1.11` | | [@radix-ui/react-label](https://github.com/radix-ui/primitives) | `2.1.7` | `2.1.8` | | [@radix-ui/react-progress](https://github.com/radix-ui/primitives) | `1.1.7` | `1.1.8` | | [@radix-ui/react-separator](https://github.com/radix-ui/primitives) | `1.1.7` | `1.1.8` | | [@radix-ui/react-slot](https://github.com/radix-ui/primitives) | `1.2.3` | `1.2.4` | | [axios](https://github.com/axios/axios) | `1.13.1` | `1.13.2` | | [eslint](https://github.com/eslint/eslint) | `9.39.0` | `9.39.1` | | [eslint-config-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next) | `16.0.1` | `16.0.2` | | [js-yaml](https://github.com/nodeca/js-yaml) | `4.1.0` | `4.1.1` | | [maxmind](https://github.com/runk/node-maxmind) | `5.0.0` | `5.0.1` | | [posthog-node](https://github.com/PostHog/posthog-js/tree/HEAD/packages/node) | `5.11.0` | `5.11.2` | | [resend](https://github.com/resend/resend-node) | `6.4.0` | `6.4.2` | Updates `@radix-ui/react-avatar` from 1.1.10 to 1.1.11 - [Changelog](https://github.com/radix-ui/primitives/blob/main/release-process.md) - [Commits](https://github.com/radix-ui/primitives/commits) Updates `@radix-ui/react-label` from 2.1.7 to 2.1.8 - [Changelog](https://github.com/radix-ui/primitives/blob/main/release-process.md) - [Commits](https://github.com/radix-ui/primitives/commits) Updates `@radix-ui/react-progress` from 1.1.7 to 1.1.8 - [Changelog](https://github.com/radix-ui/primitives/blob/main/release-process.md) - [Commits](https://github.com/radix-ui/primitives/commits) Updates `@radix-ui/react-separator` from 1.1.7 to 1.1.8 - [Changelog](https://github.com/radix-ui/primitives/blob/main/release-process.md) - [Commits](https://github.com/radix-ui/primitives/commits) Updates `@radix-ui/react-slot` from 1.2.3 to 1.2.4 - [Changelog](https://github.com/radix-ui/primitives/blob/main/release-process.md) - [Commits](https://github.com/radix-ui/primitives/commits) Updates `axios` from 1.13.1 to 1.13.2 - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v1.13.1...v1.13.2) Updates `eslint` from 9.39.0 to 9.39.1 - [Release notes](https://github.com/eslint/eslint/releases) - [Commits](https://github.com/eslint/eslint/compare/v9.39.0...v9.39.1) Updates `eslint-config-next` from 16.0.1 to 16.0.2 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/commits/v16.0.2/packages/eslint-config-next) Updates `js-yaml` from 4.1.0 to 4.1.1 - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/4.1.0...4.1.1) Updates `maxmind` from 5.0.0 to 5.0.1 - [Release notes](https://github.com/runk/node-maxmind/releases) - [Commits](https://github.com/runk/node-maxmind/compare/v5.0.0...v5.0.1) Updates `posthog-node` from 5.11.0 to 5.11.2 - [Release notes](https://github.com/PostHog/posthog-js/releases) - [Changelog](https://github.com/PostHog/posthog-js/blob/main/packages/node/CHANGELOG.md) - [Commits](https://github.com/PostHog/posthog-js/commits/posthog-node@5.11.2/packages/node) Updates `resend` from 6.4.0 to 6.4.2 - [Release notes](https://github.com/resend/resend-node/releases) - [Commits](https://github.com/resend/resend-node/compare/v6.4.0...v6.4.2) --- updated-dependencies: - dependency-name: "@radix-ui/react-avatar" dependency-version: 1.1.11 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: prod-patch-updates - dependency-name: "@radix-ui/react-label" dependency-version: 2.1.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: prod-patch-updates - dependency-name: "@radix-ui/react-progress" dependency-version: 1.1.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: prod-patch-updates - dependency-name: "@radix-ui/react-separator" dependency-version: 1.1.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: prod-patch-updates - dependency-name: "@radix-ui/react-slot" dependency-version: 1.2.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: prod-patch-updates - dependency-name: axios dependency-version: 1.13.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: prod-patch-updates - dependency-name: eslint dependency-version: 9.39.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: prod-patch-updates - dependency-name: eslint-config-next dependency-version: 16.0.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: prod-patch-updates - dependency-name: js-yaml dependency-version: 4.1.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: prod-patch-updates - dependency-name: maxmind dependency-version: 5.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: prod-patch-updates - dependency-name: posthog-node dependency-version: 5.11.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: prod-patch-updates - dependency-name: resend dependency-version: 6.4.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: prod-patch-updates ... Signed-off-by: dependabot[bot] --- package-lock.json | 416 ++++++++++++++++++++++++++++++++++++++-------- package.json | 24 +-- 2 files changed, 355 insertions(+), 85 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2004db01..4875d1db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,20 +17,20 @@ "@node-rs/argon2": "^2.0.2", "@oslojs/crypto": "1.0.1", "@oslojs/encoding": "1.1.0", - "@radix-ui/react-avatar": "1.1.10", + "@radix-ui/react-avatar": "1.1.11", "@radix-ui/react-checkbox": "1.3.3", "@radix-ui/react-collapsible": "1.1.12", "@radix-ui/react-dialog": "1.1.15", "@radix-ui/react-dropdown-menu": "2.1.16", "@radix-ui/react-icons": "1.3.2", - "@radix-ui/react-label": "2.1.7", + "@radix-ui/react-label": "2.1.8", "@radix-ui/react-popover": "1.1.15", - "@radix-ui/react-progress": "^1.1.7", + "@radix-ui/react-progress": "^1.1.8", "@radix-ui/react-radio-group": "1.3.8", "@radix-ui/react-scroll-area": "^1.2.10", "@radix-ui/react-select": "2.2.6", - "@radix-ui/react-separator": "1.1.7", - "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-separator": "1.1.8", + "@radix-ui/react-slot": "1.2.4", "@radix-ui/react-switch": "1.2.6", "@radix-ui/react-tabs": "1.1.13", "@radix-ui/react-toast": "1.2.15", @@ -43,7 +43,7 @@ "@tailwindcss/forms": "^0.5.10", "@tanstack/react-table": "8.21.3", "arctic": "^3.7.0", - "axios": "^1.13.1", + "axios": "^1.13.2", "better-sqlite3": "11.7.0", "canvas-confetti": "1.9.4", "class-variance-authority": "^0.7.1", @@ -56,8 +56,8 @@ "crypto-js": "^4.2.0", "date-fns": "4.1.0", "drizzle-orm": "0.44.7", - "eslint": "9.39.0", - "eslint-config-next": "16.0.1", + "eslint": "9.39.1", + "eslint-config-next": "16.0.3", "express": "5.1.0", "express-rate-limit": "8.2.1", "glob": "11.0.3", @@ -67,10 +67,10 @@ "input-otp": "1.4.2", "ioredis": "5.8.2", "jmespath": "^0.16.0", - "js-yaml": "4.1.0", + "js-yaml": "4.1.1", "jsonwebtoken": "^9.0.2", "lucide-react": "^0.552.0", - "maxmind": "5.0.0", + "maxmind": "5.0.1", "moment": "2.30.1", "next": "15.5.6", "next-intl": "^4.4.0", @@ -83,7 +83,7 @@ "nprogress": "^0.2.0", "oslo": "1.2.1", "pg": "^8.16.2", - "posthog-node": "^5.11.0", + "posthog-node": "^5.11.2", "qrcode.react": "4.2.0", "react": "19.2.0", "react-day-picker": "9.11.1", @@ -93,7 +93,7 @@ "react-icons": "^5.5.0", "rebuild": "0.1.2", "reodotdev": "^1.0.0", - "resend": "^6.4.0", + "resend": "^6.4.2", "semver": "^7.7.3", "stripe": "18.2.1", "swagger-ui-express": "^5.0.1", @@ -3061,9 +3061,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.0.tgz", - "integrity": "sha512-BIhe0sW91JGPiaF1mOuPy5v8NflqfjIcDNpC+LbW9f609WVRX1rArrhi6Z2ymvrAry9jw+5POTj4t2t62o8Bmw==", + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3893,9 +3893,9 @@ "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.0.1.tgz", - "integrity": "sha512-g4Cqmv/gyFEXNeVB2HkqDlYKfy+YrlM2k8AVIO/YQVEPfhVruH1VA99uT1zELLnPLIeOnx8IZ6Ddso0asfTIdw==", + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.0.3.tgz", + "integrity": "sha512-6sPWmZetzFWMsz7Dhuxsdmbu3fK+/AxKRtj7OB0/3OZAI2MHB/v2FeYh271LZ9abvnM1WIwWc/5umYjx0jo5sQ==", "license": "MIT", "dependencies": { "fast-glob": "3.3.1" @@ -4864,10 +4864,13 @@ } }, "node_modules/@posthog/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.5.0.tgz", - "integrity": "sha512-oxfV20QMNwH30jKybUyqi3yGuMghULQz1zkJgQG3rjpHDxhD2vDN6E7UpmaqgphMIvGG3Q+DgfU10zfSPA7w7w==", - "license": "MIT" + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.5.2.tgz", + "integrity": "sha512-iedUP3EnOPPxTA2VaIrsrd29lSZnUV+ZrMnvY56timRVeZAXoYCkmjfIs3KBAsF8OUT5h1GXLSkoQdrV0r31OQ==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.6" + } }, "node_modules/@radix-ui/colors": { "version": "3.0.0", @@ -4912,13 +4915,13 @@ } }, "node_modules/@radix-ui/react-avatar": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.10.tgz", - "integrity": "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.11.tgz", + "integrity": "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==", "license": "MIT", "dependencies": { - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-context": "1.1.3", + "@radix-ui/react-primitive": "2.1.4", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1" @@ -4938,6 +4941,44 @@ } } }, + "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-context": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", + "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-checkbox": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", @@ -5024,6 +5065,24 @@ } } }, + "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-compose-refs": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", @@ -5090,6 +5149,24 @@ } } }, + "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-direction": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", @@ -5229,12 +5306,35 @@ } }, "node_modules/@radix-ui/react-label": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", - "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.8.tgz", + "integrity": "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.3" + "@radix-ui/react-primitive": "2.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" }, "peerDependencies": { "@types/react": "*", @@ -5291,6 +5391,24 @@ } } }, + "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-popover": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", @@ -5328,6 +5446,24 @@ } } }, + "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-popper": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", @@ -5431,14 +5567,70 @@ } } }, - "node_modules/@radix-ui/react-progress": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.7.tgz", - "integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==", + "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", "license": "MIT", "dependencies": { - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3" + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.8.tgz", + "integrity": "sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.3", + "@radix-ui/react-primitive": "2.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-context": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", + "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" }, "peerDependencies": { "@types/react": "*", @@ -5592,13 +5784,54 @@ } } }, - "node_modules/@radix-ui/react-separator": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", - "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", + "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.3" + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.8.tgz", + "integrity": "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" }, "peerDependencies": { "@types/react": "*", @@ -5616,9 +5849,9 @@ } }, "node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", + "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", "license": "MIT", "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" @@ -5816,6 +6049,24 @@ } } }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-use-callback-ref": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", @@ -6848,6 +7099,25 @@ "node": ">= 10" } }, + "node_modules/@react-email/preview-server/node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@react-email/preview-server/node_modules/@types/node": { "version": "22.14.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", @@ -10038,9 +10308,9 @@ } }, "node_modules/axios": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.1.tgz", - "integrity": "sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -11969,9 +12239,9 @@ } }, "node_modules/eslint": { - "version": "9.39.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.0.tgz", - "integrity": "sha512-iy2GE3MHrYTL5lrCtMZ0X1KLEKKUjmK0kzwcnefhR66txcEmXZD2YWgR5GNdcEwkNx3a0siYkSvl0vIC+Svjmg==", + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", + "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", @@ -11980,7 +12250,7 @@ "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.0", + "@eslint/js": "9.39.1", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -12028,12 +12298,12 @@ } }, "node_modules/eslint-config-next": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.0.1.tgz", - "integrity": "sha512-wNuHw5gNOxwLUvpg0cu6IL0crrVC9hAwdS/7UwleNkwyaMiWIOAwf8yzXVqBBzL3c9A7jVRngJxjoSpPP1aEhg==", + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.0.3.tgz", + "integrity": "sha512-5F6qDjcZldf0Y0ZbqvWvap9xzYUxyDf7/of37aeyhvkrQokj/4bT1JYWZdlWUr283aeVa+s52mPq9ogmGg+5dw==", "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "16.0.1", + "@next/eslint-plugin-next": "16.0.3", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.32.0", @@ -14163,9 +14433,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -14821,13 +15091,13 @@ } }, "node_modules/maxmind": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/maxmind/-/maxmind-5.0.0.tgz", - "integrity": "sha512-ndhnbeQWKuiBU17BJ6cybUnvcyvNXaK+1VM5n9/I7+TIqAYFLDvX1DSoVfE1hgvZfudvAU9Ts1CW5sxYq/M8dA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/maxmind/-/maxmind-5.0.1.tgz", + "integrity": "sha512-hYxQxvHkBUlyF34f7IlQOb60rytezCi2oZ8H/BtZpcoodXTlcK1eLgf7kY2TofHqBC3o+Hqtvde9kS72gFQSDw==", "license": "MIT", "dependencies": { "mmdb-lib": "3.0.1", - "tiny-lru": "11.3.4" + "tiny-lru": "11.4.5" }, "engines": { "node": ">=12", @@ -18935,12 +19205,12 @@ } }, "node_modules/posthog-node": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.11.0.tgz", - "integrity": "sha512-9+gmWp/7AEryJMi0+/ywJjKQhpkmcjxf+eT030fTIIPvFTF84zeeagdZBGNC/Nh2Jc0grIAW6O1n5lxXiX3daA==", + "version": "5.11.2", + "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.11.2.tgz", + "integrity": "sha512-z+XekcBUmGePMsjPlGaEF2bJFiDHKHYPQjS4OEw4YPDQz8s7Owuim/L7xNX+6UJkyIRniBza9iC7bW8yrGTv1g==", "license": "MIT", "dependencies": { - "@posthog/core": "1.5.0" + "@posthog/core": "1.5.2" }, "engines": { "node": ">=20" @@ -19827,9 +20097,9 @@ "license": "MIT" }, "node_modules/resend": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/resend/-/resend-6.4.0.tgz", - "integrity": "sha512-CTr4ix4RI5M/ucL58Wqr+LE8eI4JHtJEFaBAx6yUVNOI3eaPVtJjpNL0G/BdRSWMbwv6CtpprVOY8Xvpp6UJlA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/resend/-/resend-6.4.2.tgz", + "integrity": "sha512-YnxmwneltZtjc7Xff+8ZjG1/xPLdstCiqsedgO/JxWTf7vKRAPCx6CkhQ3ZXskG0mrmf8+I5wr/wNRd8PQMUfw==", "license": "MIT", "dependencies": { "svix": "1.76.1" @@ -21420,9 +21690,9 @@ } }, "node_modules/tiny-lru": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.3.4.tgz", - "integrity": "sha512-UxWEfRKpFCabAf6fkTNdlfSw/RDUJ/4C6i1aLZaDnGF82PERHyYhz5CMCVYXtLt34LbqgfpJ2bjmgGKgxuF/6A==", + "version": "11.4.5", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.4.5.tgz", + "integrity": "sha512-hkcz3FjNJfKXjV4mjQ1OrXSLAehg8Hw+cEZclOVT+5c/cWQWImQ9wolzTjth+dmmDe++p3bme3fTxz6Q4Etsqw==", "license": "BSD-3-Clause", "engines": { "node": ">=12" diff --git a/package.json b/package.json index 480da7e4..48be226a 100644 --- a/package.json +++ b/package.json @@ -39,20 +39,20 @@ "@node-rs/argon2": "^2.0.2", "@oslojs/crypto": "1.0.1", "@oslojs/encoding": "1.1.0", - "@radix-ui/react-avatar": "1.1.10", + "@radix-ui/react-avatar": "1.1.11", "@radix-ui/react-checkbox": "1.3.3", "@radix-ui/react-collapsible": "1.1.12", "@radix-ui/react-dialog": "1.1.15", "@radix-ui/react-dropdown-menu": "2.1.16", "@radix-ui/react-icons": "1.3.2", - "@radix-ui/react-label": "2.1.7", + "@radix-ui/react-label": "2.1.8", "@radix-ui/react-popover": "1.1.15", - "@radix-ui/react-progress": "^1.1.7", + "@radix-ui/react-progress": "^1.1.8", "@radix-ui/react-radio-group": "1.3.8", "@radix-ui/react-scroll-area": "^1.2.10", "@radix-ui/react-select": "2.2.6", - "@radix-ui/react-separator": "1.1.7", - "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-separator": "1.1.8", + "@radix-ui/react-slot": "1.2.4", "@radix-ui/react-switch": "1.2.6", "@radix-ui/react-tabs": "1.1.13", "@radix-ui/react-toast": "1.2.15", @@ -65,7 +65,7 @@ "@tailwindcss/forms": "^0.5.10", "@tanstack/react-table": "8.21.3", "arctic": "^3.7.0", - "axios": "^1.13.1", + "axios": "^1.13.2", "better-sqlite3": "11.7.0", "canvas-confetti": "1.9.4", "class-variance-authority": "^0.7.1", @@ -78,8 +78,8 @@ "crypto-js": "^4.2.0", "date-fns": "4.1.0", "drizzle-orm": "0.44.7", - "eslint": "9.39.0", - "eslint-config-next": "16.0.1", + "eslint": "9.39.1", + "eslint-config-next": "16.0.3", "express": "5.1.0", "express-rate-limit": "8.2.1", "glob": "11.0.3", @@ -89,10 +89,10 @@ "input-otp": "1.4.2", "ioredis": "5.8.2", "jmespath": "^0.16.0", - "js-yaml": "4.1.0", + "js-yaml": "4.1.1", "jsonwebtoken": "^9.0.2", "lucide-react": "^0.552.0", - "maxmind": "5.0.0", + "maxmind": "5.0.1", "moment": "2.30.1", "next": "15.5.6", "next-intl": "^4.4.0", @@ -105,7 +105,7 @@ "nprogress": "^0.2.0", "oslo": "1.2.1", "pg": "^8.16.2", - "posthog-node": "^5.11.0", + "posthog-node": "^5.11.2", "qrcode.react": "4.2.0", "react": "19.2.0", "react-day-picker": "9.11.1", @@ -115,7 +115,7 @@ "react-icons": "^5.5.0", "rebuild": "0.1.2", "reodotdev": "^1.0.0", - "resend": "^6.4.0", + "resend": "^6.4.2", "semver": "^7.7.3", "stripe": "18.2.1", "swagger-ui-express": "^5.0.1", From e62806d6fb8ab956f4e64f7a7e18995bcfd940c9 Mon Sep 17 00:00:00 2001 From: Owen Date: Fri, 14 Nov 2025 11:30:02 -0500 Subject: [PATCH 07/29] Clean up old timestamps --- server/private/lib/rateLimit.ts | 52 +++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/server/private/lib/rateLimit.ts b/server/private/lib/rateLimit.ts index 44aa0748..269e3bec 100644 --- a/server/private/lib/rateLimit.ts +++ b/server/private/lib/rateLimit.ts @@ -72,6 +72,38 @@ export class RateLimitService { return `ratelimit:${clientId}:${messageType}`; } + // Helper function to clean up old timestamp fields from a Redis hash + private async cleanupOldTimestamps(key: string, windowStart: number): Promise { + if (!redisManager.isRedisEnabled()) return; + + try { + const client = redisManager.getClient(); + if (!client) return; + + // Get all fields in the hash + const allData = await redisManager.hgetall(key); + if (!allData || Object.keys(allData).length === 0) return; + + // Find fields that are older than the window + const fieldsToDelete: string[] = []; + for (const timestamp of Object.keys(allData)) { + const time = parseInt(timestamp); + if (time < windowStart) { + fieldsToDelete.push(timestamp); + } + } + + // Delete old fields in batch + if (fieldsToDelete.length > 0) { + await client.hdel(key, ...fieldsToDelete); + logger.debug(`Cleaned up ${fieldsToDelete.length} old timestamp fields from ${key}`); + } + } catch (error) { + logger.error(`Failed to cleanup old timestamps for key ${key}:`, error); + // Don't throw - cleanup failures shouldn't block rate limiting + } + } + // Helper function to sync local rate limit data to Redis private async syncRateLimitToRedis( clientId: string, @@ -81,8 +113,12 @@ export class RateLimitService { try { const currentTime = Math.floor(Date.now() / 1000); + const windowStart = currentTime - RATE_LIMIT_WINDOW; const globalKey = this.getRateLimitKey(clientId); + // Clean up old timestamp fields before writing + await this.cleanupOldTimestamps(globalKey, windowStart); + // Get current value and add pending count const currentValue = await redisManager.hget( globalKey, @@ -93,7 +129,7 @@ export class RateLimitService { ).toString(); await redisManager.hset(globalKey, currentTime.toString(), newValue); - // Set TTL using the client directly + // Set TTL using the client directly - this prevents the key from persisting forever if (redisManager.getClient()) { await redisManager .getClient() @@ -119,8 +155,12 @@ export class RateLimitService { try { const currentTime = Math.floor(Date.now() / 1000); + const windowStart = currentTime - RATE_LIMIT_WINDOW; const messageTypeKey = this.getMessageTypeRateLimitKey(clientId, messageType); + // Clean up old timestamp fields before writing + await this.cleanupOldTimestamps(messageTypeKey, windowStart); + // Get current value and add pending count const currentValue = await redisManager.hget( messageTypeKey, @@ -135,7 +175,7 @@ export class RateLimitService { newValue ); - // Set TTL using the client directly + // Set TTL using the client directly - this prevents the key from persisting forever if (redisManager.getClient()) { await redisManager .getClient() @@ -170,6 +210,10 @@ export class RateLimitService { try { const globalKey = this.getRateLimitKey(clientId); + + // Clean up old timestamp fields before reading + await this.cleanupOldTimestamps(globalKey, windowStart); + const globalRateLimitData = await redisManager.hgetall(globalKey); let count = 0; @@ -215,6 +259,10 @@ export class RateLimitService { try { const messageTypeKey = this.getMessageTypeRateLimitKey(clientId, messageType); + + // Clean up old timestamp fields before reading + await this.cleanupOldTimestamps(messageTypeKey, windowStart); + const messageTypeRateLimitData = await redisManager.hgetall(messageTypeKey); let count = 0; From 8ad7bcc0d64c0a65b42dbd0f458773b53205eb6c Mon Sep 17 00:00:00 2001 From: Owen Date: Fri, 14 Nov 2025 11:33:39 -0500 Subject: [PATCH 08/29] Adjust rate limiting position --- server/apiServer.ts | 10 ++++++---- server/private/routers/hybrid.ts | 2 ++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/server/apiServer.ts b/server/apiServer.ts index 6c490053..dafec1b8 100644 --- a/server/apiServer.ts +++ b/server/apiServer.ts @@ -79,6 +79,12 @@ export function createApiServer() { // Add request timeout middleware apiServer.use(requestTimeoutMiddleware(60000)); // 60 second timeout + apiServer.use(logIncomingMiddleware); + + if (build !== "oss") { + apiServer.use(`${prefix}/hybrid`, hybridRouter); // put before rate limiting because we will rate limit there separately because some of the routes are heavily used + } + if (!dev) { apiServer.use( rateLimit({ @@ -101,11 +107,7 @@ export function createApiServer() { } // API routes - apiServer.use(logIncomingMiddleware); apiServer.use(prefix, unauthenticated); - if (build !== "oss") { - apiServer.use(`${prefix}/hybrid`, hybridRouter); - } apiServer.use(prefix, authenticated); // WebSocket routes diff --git a/server/private/routers/hybrid.ts b/server/private/routers/hybrid.ts index a8b6a174..d9178446 100644 --- a/server/private/routers/hybrid.ts +++ b/server/private/routers/hybrid.ts @@ -227,6 +227,8 @@ export type UserSessionWithUser = { export const hybridRouter = Router(); hybridRouter.use(verifySessionRemoteExitNodeMiddleware); +// TODO: ADD RATE LIMITING TO THESE ROUTES AS NEEDED BASED ON USAGE PATTERNS + hybridRouter.get( "/general-config", async (req: Request, res: Response, next: NextFunction) => { From de8262d7b9a58599b10f506d9124e3614379eb06 Mon Sep 17 00:00:00 2001 From: Owen Date: Sat, 15 Nov 2025 11:51:52 -0500 Subject: [PATCH 09/29] Batch deletes --- server/private/lib/rateLimit.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/server/private/lib/rateLimit.ts b/server/private/lib/rateLimit.ts index 269e3bec..6d4ab44d 100644 --- a/server/private/lib/rateLimit.ts +++ b/server/private/lib/rateLimit.ts @@ -93,9 +93,14 @@ export class RateLimitService { } } - // Delete old fields in batch + // Delete old fields in batches to avoid call stack size exceeded errors + // The spread operator can cause issues with very large arrays if (fieldsToDelete.length > 0) { - await client.hdel(key, ...fieldsToDelete); + const batchSize = 1000; // Process 1000 fields at a time + for (let i = 0; i < fieldsToDelete.length; i += batchSize) { + const batch = fieldsToDelete.slice(i, i + batchSize); + await client.hdel(key, ...batch); + } logger.debug(`Cleaned up ${fieldsToDelete.length} old timestamp fields from ${key}`); } } catch (error) { From 6d1713b6b957c730ab2b2a497c454722cba95856 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 16 Nov 2025 06:21:01 +0000 Subject: [PATCH 10/29] Bump js-yaml from 4.1.0 to 4.1.1 Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.1.0 to 4.1.1. - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/4.1.0...4.1.1) --- updated-dependencies: - dependency-name: js-yaml dependency-version: 4.1.1 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2004db01..3f37bb1b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -67,7 +67,7 @@ "input-otp": "1.4.2", "ioredis": "5.8.2", "jmespath": "^0.16.0", - "js-yaml": "4.1.0", + "js-yaml": "4.1.1", "jsonwebtoken": "^9.0.2", "lucide-react": "^0.552.0", "maxmind": "5.0.0", @@ -14163,9 +14163,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" diff --git a/package.json b/package.json index 480da7e4..d65f39e9 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,7 @@ "input-otp": "1.4.2", "ioredis": "5.8.2", "jmespath": "^0.16.0", - "js-yaml": "4.1.0", + "js-yaml": "4.1.1", "jsonwebtoken": "^9.0.2", "lucide-react": "^0.552.0", "maxmind": "5.0.0", From 000904eb31f30f25f26d871baa3b5979c6e70bc3 Mon Sep 17 00:00:00 2001 From: Lokowitz Date: Sun, 16 Nov 2025 14:09:22 +0000 Subject: [PATCH 11/29] upgrade zod --- Makefile | 11 +++++++ package-lock.json | 81 +++++++++++++++++++++++++++++++++++------------ package.json | 6 ++-- 3 files changed, 75 insertions(+), 23 deletions(-) diff --git a/Makefile b/Makefile index 6c538a47..3d4d8ad8 100644 --- a/Makefile +++ b/Makefile @@ -91,3 +91,14 @@ test: clean: docker rmi pangolin + +test-local: + cp config/config.example.yml config/config.yml + npm run set:oss + npm run set:sqlite + npm run db:sqlite:generate + npm run db:sqlite:push + - npx tsc --noEmit + - docker build --build-arg DATABASE=pg -t fosrl/pangolin:postgresql-latest . + - docker build --build-arg DATABASE=sqlite -t fosrl/pangolin:latest . + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d190bbb0..193007fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.0.0", "license": "SEE LICENSE IN LICENSE AND README.md", "dependencies": { - "@asteasolutions/zod-to-openapi": "^7.3.4", + "@asteasolutions/zod-to-openapi": "8.1.0", "@aws-sdk/client-s3": "3.922.0", "@faker-js/faker": "^10.1.0", "@headlessui/react": "^2.2.9", @@ -108,15 +108,15 @@ "ws": "8.18.3", "yaml": "^2.8.1", "yargs": "18.0.0", - "zod": "3.25.76", - "zod-validation-error": "3.5.2" + "zod": "4.1.12", + "zod-validation-error": "5.0.0" }, "devDependencies": { "@dotenvx/dotenvx": "1.51.1", "@esbuild-plugins/tsconfig-paths": "0.1.2", "@react-email/preview-server": "4.3.2", - "@tanstack/react-query-devtools": "^5.90.2", "@tailwindcss/postcss": "^4.1.17", + "@tanstack/react-query-devtools": "^5.90.2", "@types/better-sqlite3": "7.6.12", "@types/cookie-parser": "1.4.10", "@types/cors": "2.8.19", @@ -175,15 +175,15 @@ } }, "node_modules/@asteasolutions/zod-to-openapi": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@asteasolutions/zod-to-openapi/-/zod-to-openapi-7.3.4.tgz", - "integrity": "sha512-/2rThQ5zPi9OzVwes6U7lK1+Yvug0iXu25olp7S0XsYmOqnyMfxH7gdSQjn/+DSOHRg7wnotwGJSyL+fBKdnEA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@asteasolutions/zod-to-openapi/-/zod-to-openapi-8.1.0.tgz", + "integrity": "sha512-tQFxVs05J/6QXXqIzj6rTRk3nj1HFs4pe+uThwE95jL5II2JfpVXkK+CqkO7aT0Do5AYqO6LDrKpleLUFXgY+g==", "license": "MIT", "dependencies": { "openapi3-ts": "^4.1.2" }, "peerDependencies": { - "zod": "^3.20.2" + "zod": "^4.0.0" } }, "node_modules/@aws-crypto/crc32": { @@ -1644,6 +1644,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", @@ -4073,6 +4074,7 @@ "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -6969,6 +6971,7 @@ "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -7174,6 +7177,7 @@ "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -7184,6 +7188,7 @@ "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.25.0" }, @@ -8618,6 +8623,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.6.tgz", "integrity": "sha512-gB1sljYjcobZKxjPbKSa31FUTyr+ROaBdoH+wSSs9Dk+yDCmMs+TkTV3PybRRVLC7ax7q0erJ9LvRWnMktnRAw==", "license": "MIT", + "peer": true, "dependencies": { "@tanstack/query-core": "5.90.6" }, @@ -8723,6 +8729,7 @@ "integrity": "sha512-fnQmj8lELIj7BSrZQAdBMHEHX8OZLYIHXqAKT1O7tDfLxaINzf00PMjw22r3N/xXh0w/sGHlO6SVaCQ2mj78lg==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*" } @@ -8809,6 +8816,7 @@ "integrity": "sha512-LuIQOcb6UmnF7C1PCFmEU1u2hmiHL43fgFQX67sN3H4Z+0Yk0Neo++mFsBjhOAuLzvlQeqAAkeDOZrJs9rzumQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^5.0.0", @@ -8902,6 +8910,7 @@ "integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -8937,6 +8946,7 @@ "integrity": "sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "@types/node": "*", "pg-protocol": "*", @@ -8970,6 +8980,7 @@ "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -8980,6 +8991,7 @@ "integrity": "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==", "devOptional": true, "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -9123,6 +9135,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.3.tgz", "integrity": "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==", "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.3", "@typescript-eslint/types": "8.46.3", @@ -9796,6 +9809,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -10325,6 +10339,7 @@ "integrity": "sha512-mXpa5jnIKKHeoGzBrUJrc65cXFKcILGZpU3FXR0pradUEm9MA7UZz02qfEejaMcm9iXrSOCenwwYMJ/tZ1y5Ig==", "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { "bindings": "^1.5.0", "prebuild-install": "^7.1.1" @@ -10437,6 +10452,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", @@ -11437,8 +11453,7 @@ "version": "3.1.7", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.7.tgz", "integrity": "sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ==", - "license": "(MPL-2.0 OR Apache-2.0)", - "peer": true + "license": "(MPL-2.0 OR Apache-2.0)" }, "node_modules/domutils": { "version": "3.2.2", @@ -12094,6 +12109,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -12190,6 +12206,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.0.tgz", "integrity": "sha512-iy2GE3MHrYTL5lrCtMZ0X1KLEKKUjmK0kzwcnefhR66txcEmXZD2YWgR5GNdcEwkNx3a0siYkSvl0vIC+Svjmg==", "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -12367,6 +12384,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -12493,6 +12511,18 @@ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, + "node_modules/eslint-plugin-react-hooks/node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, "node_modules/eslint-plugin-react/node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -12663,6 +12693,7 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "license": "MIT", + "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", @@ -15272,7 +15303,6 @@ "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.54.0.tgz", "integrity": "sha512-hx45SEUoLatgWxHKCmlLJH81xBo0uXP4sRkESUpmDQevfi+e7K1VuiSprK6UpQ8u4zOcKNiH0pMvHvlMWA/4cw==", "license": "MIT", - "peer": true, "dependencies": { "dompurify": "3.1.7", "marked": "14.0.0" @@ -15283,7 +15313,6 @@ "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", "license": "MIT", - "peer": true, "bin": { "marked": "bin/marked.js" }, @@ -15406,6 +15435,7 @@ "resolved": "https://registry.npmjs.org/next/-/next-15.5.6.tgz", "integrity": "sha512-zTxsnI3LQo3c9HSdSf91O1jMNsEzIXDShXd4wVdg9y5shwLqBXi4ZtUUJyB86KGVSJLZx0PFONvO54aheGX8QQ==", "license": "MIT", + "peer": true, "dependencies": { "@next/env": "15.5.6", "@swc/helpers": "0.5.15", @@ -17852,6 +17882,7 @@ "version": "4.0.3", "inBundle": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -18836,6 +18867,7 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", "license": "MIT", + "peer": true, "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", @@ -19012,6 +19044,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -19469,6 +19502,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -19499,6 +19533,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -19790,6 +19825,7 @@ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.66.0.tgz", "integrity": "sha512-xXBqsWGKrY46ZqaHDo+ZUYiMUgi8suYu5kdrS20EG8KiL7VRQitEbNjm+UcrDYrNi1YLyfpmAeGjCZYXLT9YBw==", "license": "MIT", + "peer": true, "engines": { "node": ">=18.0.0" }, @@ -20283,6 +20319,7 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -21502,7 +21539,8 @@ "version": "4.1.17", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/tapable": { "version": "2.3.0", @@ -22032,6 +22070,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -22545,6 +22584,7 @@ "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", "license": "MIT", + "peer": true, "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.8", @@ -22847,24 +22887,25 @@ } }, "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", + "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zod-validation-error": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-3.5.2.tgz", - "integrity": "sha512-mdi7YOLtram5dzJ5aDtm1AG9+mxRma1iaMrZdYIpFO7epdKBUwLHIxTF8CPDeCQ828zAXYtizrKlEJAtzgfgrw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-5.0.0.tgz", + "integrity": "sha512-hmk+pkyKq7Q71PiWVSDUc3VfpzpvcRHZ3QPw9yEMVvmtCekaMeOHnbr3WbxfrgEnQTv6haGP4cmv0Ojmihzsxw==", "license": "MIT", "engines": { "node": ">=18.0.0" }, "peerDependencies": { - "zod": "^3.25.0" + "zod": "^3.25.0 || ^4.0.0" } } } diff --git a/package.json b/package.json index 2b47c1cb..d6469abb 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "build:cli": "node esbuild.mjs -e cli/index.ts -o dist/cli.mjs" }, "dependencies": { - "@asteasolutions/zod-to-openapi": "^7.3.4", + "@asteasolutions/zod-to-openapi": "8.1.0", "@aws-sdk/client-s3": "3.922.0", "@faker-js/faker": "^10.1.0", "@headlessui/react": "^2.2.9", @@ -131,8 +131,8 @@ "ws": "8.18.3", "yaml": "^2.8.1", "yargs": "18.0.0", - "zod": "3.25.76", - "zod-validation-error": "3.5.2" + "zod": "4.1.12", + "zod-validation-error": "5.0.0" }, "devDependencies": { "@dotenvx/dotenvx": "1.51.1", From 7db99a7dd560e8b4d1b1efc56a2e41f9ee4bef81 Mon Sep 17 00:00:00 2001 From: Lokowitz Date: Sun, 16 Nov 2025 14:18:17 +0000 Subject: [PATCH 12/29] used zod codemod --- server/lib/blueprints/types.ts | 52 ++++++----- server/lib/readConfigFile.ts | 36 ++++---- server/private/lib/readConfigFile.ts | 8 +- .../routers/auditLogs/queryAccessAuditLog.ts | 10 +-- .../routers/auditLogs/queryActionAuditLog.ts | 8 +- .../routers/auth/getSessionTransferToken.ts | 2 +- server/private/routers/auth/quickStart.ts | 4 +- .../routers/billing/createCheckoutSession.ts | 6 +- .../routers/billing/createPortalSession.ts | 6 +- .../routers/billing/getOrgSubscription.ts | 6 +- server/private/routers/billing/getOrgUsage.ts | 6 +- .../routers/billing/internalGetOrgTier.ts | 6 +- .../routers/certificates/getCertificate.ts | 6 +- .../certificates/restartCertificate.ts | 10 +-- .../checkDomainNamespaceAvailability.ts | 8 +- .../routers/domain/listDomainNamespaces.ts | 12 ++- server/private/routers/hybrid.ts | 86 ++++++------------- .../routers/license/activateLicense.ts | 6 +- .../routers/license/deleteLicenseKey.ts | 6 +- .../routers/loginPage/createLoginPage.ts | 12 +-- .../private/routers/loginPage/getLoginPage.ts | 6 +- .../routers/loginPage/updateLoginPage.ts | 10 +-- .../private/routers/misc/sendSupportEmail.ts | 6 +- .../routers/orgIdp/createOrgOidcIdp.ts | 12 ++- server/private/routers/orgIdp/listOrgIdps.ts | 16 ++-- .../routers/orgIdp/updateOrgOidcIdp.ts | 6 +- .../routers/re-key/reGenerateClientSecret.ts | 14 ++- .../re-key/reGenerateExitNodeSecret.ts | 6 +- .../routers/re-key/reGenerateSiteSecret.ts | 16 ++-- .../remoteExitNode/createRemoteExitNode.ts | 6 +- .../remoteExitNode/deleteRemoteExitNode.ts | 6 +- .../remoteExitNode/getRemoteExitNode.ts | 6 +- .../remoteExitNode/listRemoteExitNodes.ts | 10 +-- .../pickRemoteExitNodeDefaults.ts | 6 +- .../routers/accessToken/deleteAccessToken.ts | 6 +- .../accessToken/generateAccessToken.ts | 16 ++-- .../routers/accessToken/listAccessTokens.ts | 12 ++- server/routers/apiKeys/createRootApiKey.ts | 6 +- server/routers/apiKeys/listApiKeyActions.ts | 4 +- server/routers/apiKeys/listOrgApiKeys.ts | 4 +- server/routers/apiKeys/listRootApiKeys.ts | 4 +- server/routers/apiKeys/setApiKeyActions.ts | 9 +- server/routers/apiKeys/setApiKeyOrgs.ts | 9 +- .../routers/auditLogs/queryRequstAuditLog.ts | 12 +-- server/routers/auth/changePassword.ts | 6 +- server/routers/auth/checkResourceSession.ts | 6 +- server/routers/auth/disable2fa.ts | 6 +- server/routers/auth/login.ts | 8 +- server/routers/auth/requestPasswordReset.ts | 8 +- server/routers/auth/requestTotpSecret.ts | 8 +- server/routers/auth/resetPassword.ts | 8 +- server/routers/auth/securityKey.ts | 22 ++--- server/routers/auth/setServerAdmin.ts | 2 +- server/routers/auth/signup.ts | 2 +- server/routers/auth/validateSetupToken.ts | 6 +- server/routers/auth/verifyEmail.ts | 6 +- server/routers/auth/verifyTotp.ts | 8 +- server/routers/badger/verifySession.ts | 8 +- .../routers/blueprints/applyJSONBlueprint.ts | 12 +-- server/routers/blueprints/getBlueprint.ts | 8 +- server/routers/blueprints/listBlueprints.ts | 16 ++-- server/routers/client/createClient.ts | 14 ++- server/routers/client/deleteClient.ts | 8 +- server/routers/client/getClient.ts | 8 +- server/routers/client/listClients.ts | 10 +-- server/routers/client/pickClientDefaults.ts | 6 +- server/routers/client/updateClient.ts | 16 ++-- server/routers/domain/createOrgDomain.ts | 12 +-- server/routers/domain/deleteOrgDomain.ts | 6 +- server/routers/domain/getDNSRecords.ts | 6 +- server/routers/domain/getDomain.ts | 6 +- server/routers/domain/listDomains.ts | 16 ++-- server/routers/domain/restartOrgDomain.ts | 6 +- server/routers/domain/updateDomain.ts | 12 +-- server/routers/idp/createIdpOrgPolicy.ts | 12 +-- server/routers/idp/createOidcIdp.ts | 12 ++- server/routers/idp/deleteIdpOrgPolicy.ts | 6 +- server/routers/idp/generateOidcUrl.ts | 6 +- server/routers/idp/listIdpOrgPolicies.ts | 10 +-- server/routers/idp/listIdps.ts | 10 +-- server/routers/idp/updateIdpOrgPolicy.ts | 12 +-- server/routers/idp/updateOidcIdp.ts | 6 +- server/routers/newt/createNewt.ts | 6 +- server/routers/newt/handleGetConfigMessage.ts | 2 +- server/routers/olm/createOlm.ts | 6 +- server/routers/org/checkId.ts | 6 +- server/routers/org/createOrg.ts | 6 +- server/routers/org/deleteOrg.ts | 6 +- server/routers/org/getOrg.ts | 6 +- server/routers/org/getOrgOverview.ts | 6 +- server/routers/org/listOrgs.ts | 4 +- server/routers/org/listUserOrgs.ts | 4 +- server/routers/org/updateOrg.ts | 12 +-- .../resource/addEmailToResourceWhitelist.ts | 21 ++--- .../routers/resource/authWithAccessToken.ts | 14 ++- server/routers/resource/authWithPassword.ts | 14 ++- server/routers/resource/authWithPincode.ts | 14 ++- server/routers/resource/authWithWhitelist.ts | 16 ++-- server/routers/resource/createResource.ts | 22 ++--- server/routers/resource/createResourceRule.ts | 16 ++-- server/routers/resource/deleteResource.ts | 8 +- server/routers/resource/deleteResourceRule.ts | 10 +-- server/routers/resource/getExchangeToken.ts | 8 +- server/routers/resource/getResource.ts | 8 +- .../routers/resource/getResourceAuthInfo.ts | 6 +- .../routers/resource/getResourceWhitelist.ts | 8 +- server/routers/resource/listResourceRoles.ts | 8 +- server/routers/resource/listResourceRules.ts | 12 ++- server/routers/resource/listResourceUsers.ts | 8 +- server/routers/resource/listResources.ts | 10 +-- .../removeEmailFromResourceWhitelist.ts | 21 ++--- .../routers/resource/setResourceHeaderAuth.ts | 8 +- .../routers/resource/setResourcePassword.ts | 8 +- server/routers/resource/setResourcePincode.ts | 8 +- server/routers/resource/setResourceRoles.ts | 16 ++-- server/routers/resource/setResourceUsers.ts | 14 ++- .../routers/resource/setResourceWhitelist.ts | 21 ++--- server/routers/resource/updateResource.ts | 42 ++++----- server/routers/resource/updateResourceRule.ts | 18 ++-- server/routers/role/addRoleAction.ts | 14 ++- server/routers/role/addRoleSite.ts | 16 ++-- server/routers/role/createRole.ts | 12 +-- server/routers/role/deleteRole.ts | 16 ++-- server/routers/role/getRole.ts | 8 +- server/routers/role/listRoleActions.ts | 8 +- server/routers/role/listRoleResources.ts | 8 +- server/routers/role/listRoleSites.ts | 8 +- server/routers/role/listRoles.ts | 10 +-- server/routers/role/removeRoleAction.ts | 14 ++- server/routers/role/removeRoleResource.ts | 16 ++-- server/routers/role/removeRoleSite.ts | 16 ++-- server/routers/role/updateRole.ts | 14 ++- server/routers/site/createSite.ts | 14 ++- server/routers/site/deleteSite.ts | 8 +- server/routers/site/getSite.ts | 8 +- server/routers/site/listSiteRoles.ts | 8 +- server/routers/site/listSites.ts | 10 +-- server/routers/site/pickSiteDefaults.ts | 6 +- server/routers/site/socketIntegration.ts | 14 ++- server/routers/site/updateSite.ts | 14 ++- .../siteResource/createSiteResource.ts | 18 ++-- .../siteResource/deleteSiteResource.ts | 10 +-- .../routers/siteResource/getSiteResource.ts | 10 +-- .../siteResource/listAllSiteResourcesByOrg.ts | 10 +-- .../routers/siteResource/listSiteResources.ts | 12 ++- .../siteResource/updateSiteResource.ts | 20 ++--- .../supporterKey/validateSupporterKey.ts | 6 +- server/routers/target/createTarget.ts | 34 +++----- server/routers/target/deleteTarget.ts | 8 +- server/routers/target/getTarget.ts | 8 +- server/routers/target/listTargets.ts | 12 ++- server/routers/target/updateTarget.ts | 34 +++----- server/routers/user/acceptInvite.ts | 6 +- server/routers/user/addUserAction.ts | 6 +- server/routers/user/addUserRole.ts | 6 +- server/routers/user/addUserSite.ts | 8 +- server/routers/user/adminGetUser.ts | 6 +- server/routers/user/adminListUsers.ts | 10 +-- server/routers/user/adminRemoveUser.ts | 6 +- server/routers/user/adminUpdateUser2FA.ts | 12 +-- server/routers/user/createOrgUser.ts | 17 ++-- server/routers/user/getOrgUser.ts | 6 +- server/routers/user/inviteUser.ts | 14 ++- server/routers/user/listInvitations.ts | 16 ++-- server/routers/user/listUsers.ts | 16 ++-- server/routers/user/removeInvitation.ts | 6 +- server/routers/user/removeUserAction.ts | 12 +-- server/routers/user/removeUserOrg.ts | 6 +- server/routers/user/removeUserResource.ts | 8 +- server/routers/user/removeUserSite.ts | 14 ++- server/routers/user/updateOrgUser.ts | 12 +-- .../(private)/idp/[idpId]/general/page.tsx | 4 +- .../settings/(private)/idp/create/page.tsx | 8 +- .../settings/access/users/create/page.tsx | 8 +- .../[orgId]/settings/clients/create/page.tsx | 2 +- .../[niceId]/authentication/page.tsx | 4 +- .../resources/[niceId]/general/page.tsx | 2 +- .../resources/[niceId]/proxy/page.tsx | 16 ++-- .../resources/[niceId]/rules/page.tsx | 4 +- .../settings/resources/create/page.tsx | 10 +-- src/app/admin/idp/[idpId]/general/page.tsx | 4 +- src/app/admin/idp/create/page.tsx | 4 +- .../auth/reset-password/ResetPasswordForm.tsx | 4 +- .../CreateInternalResourceDialog.tsx | 10 +-- src/components/EditInternalResourceDialog.tsx | 4 +- src/components/GenerateLicenseKeyForm.tsx | 4 +- src/components/HealthCheckDialog.tsx | 12 +-- src/components/IdpCreateWizard.tsx | 4 +- src/components/ResetPasswordForm.tsx | 4 +- src/components/SupporterStatus.tsx | 8 +- src/components/VerifyEmailForm.tsx | 2 +- 191 files changed, 764 insertions(+), 1232 deletions(-) diff --git a/server/lib/blueprints/types.ts b/server/lib/blueprints/types.ts index ca3177b3..490cd7f8 100644 --- a/server/lib/blueprints/types.ts +++ b/server/lib/blueprints/types.ts @@ -7,20 +7,20 @@ export const SiteSchema = z.object({ export const TargetHealthCheckSchema = z.object({ hostname: z.string(), - port: z.number().int().min(1).max(65535), + port: z.int().min(1).max(65535), enabled: z.boolean().optional().default(true), path: z.string().optional(), scheme: z.string().optional(), mode: z.string().default("http"), - interval: z.number().int().default(30), - "unhealthy-interval": z.number().int().default(30), - unhealthyInterval: z.number().int().optional(), // deprecated alias - timeout: z.number().int().default(5), + interval: z.int().default(30), + "unhealthy-interval": z.int().default(30), + unhealthyInterval: z.int().optional(), // deprecated alias + timeout: z.int().default(5), headers: z.array(z.object({ name: z.string(), value: z.string() })).nullable().optional().default(null), "follow-redirects": z.boolean().default(true), followRedirects: z.boolean().optional(), // deprecated alias method: z.string().default("GET"), - status: z.number().int().optional() + status: z.int().optional() }); // Schema for individual target within a resource @@ -28,16 +28,16 @@ export const TargetSchema = z.object({ site: z.string().optional(), method: z.enum(["http", "https", "h2c"]).optional(), hostname: z.string(), - port: z.number().int().min(1).max(65535), + port: z.int().min(1).max(65535), enabled: z.boolean().optional().default(true), - "internal-port": z.number().int().min(1).max(65535).optional(), + "internal-port": z.int().min(1).max(65535).optional(), path: z.string().optional(), "path-match": z.enum(["exact", "prefix", "regex"]).optional().nullable(), healthcheck: TargetHealthCheckSchema.optional(), rewritePath: z.string().optional(), // deprecated alias "rewrite-path": z.string().optional(), "rewrite-match": z.enum(["exact", "prefix", "regex", "stripPrefix"]).optional().nullable(), - priority: z.number().int().min(1).max(1000).optional().default(100) + priority: z.int().min(1).max(1000).optional().default(100) }); export type TargetData = z.infer; @@ -55,10 +55,10 @@ export const AuthSchema = z.object({ .optional() .default([]) .refine((roles) => !roles.includes("Admin"), { - message: "Admin role cannot be included in sso-roles" + error: "Admin role cannot be included in sso-roles" }), - "sso-users": z.array(z.string().email()).optional().default([]), - "whitelist-users": z.array(z.string().email()).optional().default([]), + "sso-users": z.array(z.email()).optional().default([]), + "whitelist-users": z.array(z.email()).optional().default([]), }); export const RuleSchema = z.object({ @@ -79,7 +79,7 @@ export const ResourceSchema = z protocol: z.enum(["http", "tcp", "udp"]).optional(), ssl: z.boolean().optional(), "full-domain": z.string().optional(), - "proxy-port": z.number().int().min(1).max(65535).optional(), + "proxy-port": z.int().min(1).max(65535).optional(), enabled: z.boolean().optional(), targets: z.array(TargetSchema.nullable()).optional().default([]), auth: AuthSchema.optional(), @@ -100,9 +100,8 @@ export const ResourceSchema = z ); }, { - message: - "Resource must either be targets-only (only 'targets' field) or have both 'name' and 'protocol' fields at a minimum", - path: ["name", "protocol"] + path: ["name", "protocol"], + error: "Resource must either be targets-only (only 'targets' field) or have both 'name' and 'protocol' fields at a minimum" } ) .refine( @@ -156,9 +155,8 @@ export const ResourceSchema = z return true; }, { - message: - "When protocol is 'http', a 'full-domain' must be provided", - path: ["full-domain"] + path: ["full-domain"], + error: "When protocol is 'http', a 'full-domain' must be provided" } ) .refine( @@ -174,9 +172,8 @@ export const ResourceSchema = z return true; }, { - message: - "When protocol is 'tcp' or 'udp', 'proxy-port' must be provided", - path: ["proxy-port", "exit-node"] + path: ["proxy-port", "exit-node"], + error: "When protocol is 'tcp' or 'udp', 'proxy-port' must be provided" } ) .refine( @@ -193,9 +190,8 @@ export const ResourceSchema = z return true; }, { - message: - "When protocol is 'tcp' or 'udp', 'auth' must not be provided", - path: ["auth"] + path: ["auth"], + error: "When protocol is 'tcp' or 'udp', 'auth' must not be provided" } ); @@ -216,9 +212,9 @@ export const ClientResourceSchema = z.object({ // Schema for the entire configuration object export const ConfigSchema = z .object({ - "proxy-resources": z.record(z.string(), ResourceSchema).optional().default({}), - "client-resources": z.record(z.string(), ClientResourceSchema).optional().default({}), - sites: z.record(z.string(), SiteSchema).optional().default({}) + "proxy-resources": z.record(z.string(), ResourceSchema).optional().prefault({}), + "client-resources": z.record(z.string(), ClientResourceSchema).optional().prefault({}), + sites: z.record(z.string(), SiteSchema).optional().prefault({}) }) .refine( // Enforce the full-domain uniqueness across resources in the same stack diff --git a/server/lib/readConfigFile.ts b/server/lib/readConfigFile.ts index 9d6cafb9..2da8c0a7 100644 --- a/server/lib/readConfigFile.ts +++ b/server/lib/readConfigFile.ts @@ -14,10 +14,8 @@ export const configSchema = z .object({ app: z .object({ - dashboard_url: z - .string() - .url() - .pipe(z.string().url()) + dashboard_url: z.url() + .pipe(z.url()) .transform((url) => url.toLowerCase()) .optional(), log_level: z @@ -31,14 +29,14 @@ export const configSchema = z anonymous_usage: z.boolean().optional().default(true) }) .optional() - .default({}), + .prefault({}), notifications: z .object({ product_updates: z.boolean().optional().default(true), new_releases: z.boolean().optional().default(true) }) .optional() - .default({}) + .prefault({}) }) .optional() .default({ @@ -107,7 +105,7 @@ export const configSchema = z token: z.string().optional().default("P-Access-Token") }) .optional() - .default({}), + .prefault({}), resource_session_request_param: z .string() .optional() @@ -132,7 +130,7 @@ export const configSchema = z credentials: z.boolean().optional() }) .optional(), - trust_proxy: z.number().int().gte(0).optional().default(1), + trust_proxy: z.int().gte(0).optional().default(1), secret: z.string().pipe(z.string().min(8)).optional(), maxmind_db_path: z.string().optional() }) @@ -189,7 +187,7 @@ export const configSchema = z .default(5000) }) .optional() - .default({}) + .prefault({}) }) .optional(), traefik: z @@ -222,7 +220,7 @@ export const configSchema = z .default("pp-transport-v") }) .optional() - .default({}), + .prefault({}), gerbil: z .object({ exit_node_name: z.string().optional(), @@ -247,7 +245,7 @@ export const configSchema = z .default(30) }) .optional() - .default({}), + .prefault({}), orgs: z .object({ block_size: z.number().positive().gt(0).optional().default(24), @@ -276,7 +274,7 @@ export const configSchema = z .default(500) }) .optional() - .default({}), + .prefault({}), auth: z .object({ window_minutes: z @@ -293,10 +291,10 @@ export const configSchema = z .default(500) }) .optional() - .default({}) + .prefault({}) }) .optional() - .default({}), + .prefault({}), email: z .object({ smtp_host: z.string().optional(), @@ -308,7 +306,7 @@ export const configSchema = z .transform(getEnvOrYaml("EMAIL_SMTP_PASS")), smtp_secure: z.boolean().optional(), smtp_tls_reject_unauthorized: z.boolean().optional(), - no_reply: z.string().email().optional() + no_reply: z.email().optional() }) .optional(), flags: z @@ -340,7 +338,7 @@ export const configSchema = z .default("cname.pangolin.net") }) .optional() - .default({}) + .prefault({}) }) .refine( (data) => { @@ -355,7 +353,7 @@ export const configSchema = z return true; }, { - message: "At least one domain must be defined" + error: "At least one domain must be defined" } ) .refine( @@ -370,7 +368,7 @@ export const configSchema = z ); }, { - message: "Server secret must be defined" + error: "Server secret must be defined" } ) .refine( @@ -382,7 +380,7 @@ export const configSchema = z ); }, { - message: "Dashboard URL must be defined" + error: "Dashboard URL must be defined" } ); diff --git a/server/private/lib/readConfigFile.ts b/server/private/lib/readConfigFile.ts index 20712704..cc12b1fb 100644 --- a/server/private/lib/readConfigFile.ts +++ b/server/private/lib/readConfigFile.ts @@ -50,14 +50,14 @@ export const privateConfigSchema = z.object({ host: z.string(), port: portSchema, password: z.string().optional(), - db: z.number().int().nonnegative().optional().default(0), + db: z.int().nonnegative().optional().default(0), replicas: z .array( z.object({ host: z.string(), port: portSchema, password: z.string().optional(), - db: z.number().int().nonnegative().optional().default(0) + db: z.int().nonnegative().optional().default(0) }) ) .optional() @@ -79,14 +79,14 @@ export const privateConfigSchema = z.object({ .default("http://gerbil:3004") }) .optional() - .default({}), + .prefault({}), flags: z .object({ enable_redis: z.boolean().optional().default(false), use_pangolin_dns: z.boolean().optional().default(false) }) .optional() - .default({}), + .prefault({}), branding: z .object({ app_name: z.string().optional(), diff --git a/server/private/routers/auditLogs/queryAccessAuditLog.ts b/server/private/routers/auditLogs/queryAccessAuditLog.ts index 33383c25..6329206d 100644 --- a/server/private/routers/auditLogs/queryAccessAuditLog.ts +++ b/server/private/routers/auditLogs/queryAccessAuditLog.ts @@ -30,13 +30,13 @@ export const queryAccessAuditLogsQuery = z.object({ timeStart: z .string() .refine((val) => !isNaN(Date.parse(val)), { - message: "timeStart must be a valid ISO date string" + error: "timeStart must be a valid ISO date string" }) .transform((val) => Math.floor(new Date(val).getTime() / 1000)), timeEnd: z .string() .refine((val) => !isNaN(Date.parse(val)), { - message: "timeEnd must be a valid ISO date string" + error: "timeEnd must be a valid ISO date string" }) .transform((val) => Math.floor(new Date(val).getTime() / 1000)) .optional() @@ -51,7 +51,7 @@ export const queryAccessAuditLogsQuery = z.object({ .string() .optional() .transform(Number) - .pipe(z.number().int().positive()) + .pipe(z.int().positive()) .optional(), actor: z.string().optional(), type: z.string().optional(), @@ -61,13 +61,13 @@ export const queryAccessAuditLogsQuery = z.object({ .optional() .default("1000") .transform(Number) - .pipe(z.number().int().positive()), + .pipe(z.int().positive()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) + .pipe(z.int().nonnegative()) }); export const queryAccessAuditLogsParams = z.object({ diff --git a/server/private/routers/auditLogs/queryActionAuditLog.ts b/server/private/routers/auditLogs/queryActionAuditLog.ts index 018651cb..eb22cc0a 100644 --- a/server/private/routers/auditLogs/queryActionAuditLog.ts +++ b/server/private/routers/auditLogs/queryActionAuditLog.ts @@ -30,13 +30,13 @@ export const queryActionAuditLogsQuery = z.object({ timeStart: z .string() .refine((val) => !isNaN(Date.parse(val)), { - message: "timeStart must be a valid ISO date string" + error: "timeStart must be a valid ISO date string" }) .transform((val) => Math.floor(new Date(val).getTime() / 1000)), timeEnd: z .string() .refine((val) => !isNaN(Date.parse(val)), { - message: "timeEnd must be a valid ISO date string" + error: "timeEnd must be a valid ISO date string" }) .transform((val) => Math.floor(new Date(val).getTime() / 1000)) .optional() @@ -50,13 +50,13 @@ export const queryActionAuditLogsQuery = z.object({ .optional() .default("1000") .transform(Number) - .pipe(z.number().int().positive()), + .pipe(z.int().positive()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) + .pipe(z.int().nonnegative()) }); export const queryActionAuditLogsParams = z.object({ diff --git a/server/private/routers/auth/getSessionTransferToken.ts b/server/private/routers/auth/getSessionTransferToken.ts index ba295923..bd6bc545 100644 --- a/server/private/routers/auth/getSessionTransferToken.ts +++ b/server/private/routers/auth/getSessionTransferToken.ts @@ -28,7 +28,7 @@ import { response } from "@server/lib/response"; import { encrypt } from "@server/lib/crypto"; import config from "@server/lib/config"; -const paramsSchema = z.object({}).strict(); +const paramsSchema = z.strictObject({}); export type GetSessionTransferTokenRenponse = { token: string; diff --git a/server/private/routers/auth/quickStart.ts b/server/private/routers/auth/quickStart.ts index 582ac4d5..02023a0b 100644 --- a/server/private/routers/auth/quickStart.ts +++ b/server/private/routers/auth/quickStart.ts @@ -62,10 +62,10 @@ import { isTargetValid } from "@server/lib/validators"; import { listExitNodes } from "#private/lib/exitNodes"; const bodySchema = z.object({ - email: z.string().toLowerCase().email(), + email: z.email().toLowerCase(), ip: z.string().refine(isTargetValid), method: z.enum(["http", "https"]), - port: z.number().int().min(1).max(65535), + port: z.int().min(1).max(65535), pincode: z .string() .regex(/^\d{6}$/) diff --git a/server/private/routers/billing/createCheckoutSession.ts b/server/private/routers/billing/createCheckoutSession.ts index 6e1e28c2..e0e08a20 100644 --- a/server/private/routers/billing/createCheckoutSession.ts +++ b/server/private/routers/billing/createCheckoutSession.ts @@ -25,11 +25,9 @@ import stripe from "#private/lib/stripe"; import { getLineItems, getStandardFeaturePriceSet } from "@server/lib/billing"; import { getTierPriceSet, TierId } from "@server/lib/billing/tiers"; -const createCheckoutSessionSchema = z - .object({ +const createCheckoutSessionSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); export async function createCheckoutSession( req: Request, diff --git a/server/private/routers/billing/createPortalSession.ts b/server/private/routers/billing/createPortalSession.ts index eb55f007..a3a2f04f 100644 --- a/server/private/routers/billing/createPortalSession.ts +++ b/server/private/routers/billing/createPortalSession.ts @@ -23,11 +23,9 @@ import config from "@server/lib/config"; import { fromError } from "zod-validation-error"; import stripe from "#private/lib/stripe"; -const createPortalSessionSchema = z - .object({ +const createPortalSessionSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); export async function createPortalSession( req: Request, diff --git a/server/private/routers/billing/getOrgSubscription.ts b/server/private/routers/billing/getOrgSubscription.ts index b97ca39f..adc4ee04 100644 --- a/server/private/routers/billing/getOrgSubscription.ts +++ b/server/private/routers/billing/getOrgSubscription.ts @@ -33,11 +33,9 @@ import { SubscriptionItem } from "@server/db"; -const getOrgSchema = z - .object({ +const getOrgSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); registry.registerPath({ method: "get", diff --git a/server/private/routers/billing/getOrgUsage.ts b/server/private/routers/billing/getOrgUsage.ts index bc879659..9e605cca 100644 --- a/server/private/routers/billing/getOrgUsage.ts +++ b/server/private/routers/billing/getOrgUsage.ts @@ -27,11 +27,9 @@ import { usageService } from "@server/lib/billing/usageService"; import { FeatureId } from "@server/lib/billing"; import { GetOrgUsageResponse } from "@server/routers/billing/types"; -const getOrgSchema = z - .object({ +const getOrgSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); registry.registerPath({ method: "get", diff --git a/server/private/routers/billing/internalGetOrgTier.ts b/server/private/routers/billing/internalGetOrgTier.ts index cca96243..ec114cca 100644 --- a/server/private/routers/billing/internalGetOrgTier.ts +++ b/server/private/routers/billing/internalGetOrgTier.ts @@ -21,11 +21,9 @@ import { fromZodError } from "zod-validation-error"; import { getOrgTierData } from "#private/lib/billing"; import { GetOrgTierResponse } from "@server/routers/billing/types"; -const getOrgSchema = z - .object({ +const getOrgSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); export async function getOrgTier( req: Request, diff --git a/server/private/routers/certificates/getCertificate.ts b/server/private/routers/certificates/getCertificate.ts index 8392cbc0..4ff8184e 100644 --- a/server/private/routers/certificates/getCertificate.ts +++ b/server/private/routers/certificates/getCertificate.ts @@ -23,13 +23,11 @@ import { fromError } from "zod-validation-error"; import { registry } from "@server/openApi"; import { GetCertificateResponse } from "@server/routers/certificates/types"; -const getCertificateSchema = z - .object({ +const getCertificateSchema = z.strictObject({ domainId: z.string(), domain: z.string().min(1).max(255), orgId: z.string() - }) - .strict(); + }); async function query(domainId: string, domain: string) { const [domainRecord] = await db diff --git a/server/private/routers/certificates/restartCertificate.ts b/server/private/routers/certificates/restartCertificate.ts index 1ad3f6a7..a6ee5460 100644 --- a/server/private/routers/certificates/restartCertificate.ts +++ b/server/private/routers/certificates/restartCertificate.ts @@ -24,12 +24,10 @@ import stoi from "@server/lib/stoi"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -const restartCertificateParamsSchema = z - .object({ - certId: z.string().transform(stoi).pipe(z.number().int().positive()), +const restartCertificateParamsSchema = z.strictObject({ + certId: z.string().transform(stoi).pipe(z.int().positive()), orgId: z.string() - }) - .strict(); + }); registry.registerPath({ method: "post", @@ -41,7 +39,7 @@ registry.registerPath({ certId: z .string() .transform(stoi) - .pipe(z.number().int().positive()), + .pipe(z.int().positive()), orgId: z.string() }) }, diff --git a/server/private/routers/domain/checkDomainNamespaceAvailability.ts b/server/private/routers/domain/checkDomainNamespaceAvailability.ts index 745af9d3..6c9cb23c 100644 --- a/server/private/routers/domain/checkDomainNamespaceAvailability.ts +++ b/server/private/routers/domain/checkDomainNamespaceAvailability.ts @@ -23,13 +23,11 @@ import { db, domainNamespaces, resources } from "@server/db"; import { inArray } from "drizzle-orm"; import { CheckDomainAvailabilityResponse } from "@server/routers/domain/types"; -const paramsSchema = z.object({}).strict(); +const paramsSchema = z.strictObject({}); -const querySchema = z - .object({ +const querySchema = z.strictObject({ subdomain: z.string() - }) - .strict(); + }); registry.registerPath({ method: "get", diff --git a/server/private/routers/domain/listDomainNamespaces.ts b/server/private/routers/domain/listDomainNamespaces.ts index 10bcc91b..29d5d201 100644 --- a/server/private/routers/domain/listDomainNamespaces.ts +++ b/server/private/routers/domain/listDomainNamespaces.ts @@ -23,24 +23,22 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -const paramsSchema = z.object({}).strict(); +const paramsSchema = z.strictObject({}); -const querySchema = z - .object({ +const querySchema = z.strictObject({ limit: z .string() .optional() .default("1000") .transform(Number) - .pipe(z.number().int().nonnegative()), + .pipe(z.int().nonnegative()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) - }) - .strict(); + .pipe(z.int().nonnegative()) + }); async function query(limit: number, offset: number) { const res = await db diff --git a/server/private/routers/hybrid.ts b/server/private/routers/hybrid.ts index a8b6a174..b76cf6f9 100644 --- a/server/private/routers/hybrid.ts +++ b/server/private/routers/hybrid.ts @@ -78,105 +78,78 @@ import { verifyResourceAccessToken } from "@server/auth/verifyResourceAccessToke import semver from "semver"; // Zod schemas for request validation -const getResourceByDomainParamsSchema = z - .object({ +const getResourceByDomainParamsSchema = z.strictObject({ domain: z.string().min(1, "Domain is required") - }) - .strict(); + }); -const getUserSessionParamsSchema = z - .object({ +const getUserSessionParamsSchema = z.strictObject({ userSessionId: z.string().min(1, "User session ID is required") - }) - .strict(); + }); -const getUserOrgRoleParamsSchema = z - .object({ +const getUserOrgRoleParamsSchema = z.strictObject({ userId: z.string().min(1, "User ID is required"), orgId: z.string().min(1, "Organization ID is required") - }) - .strict(); + }); -const getRoleResourceAccessParamsSchema = z - .object({ +const getRoleResourceAccessParamsSchema = z.strictObject({ roleId: z .string() .transform(Number) .pipe( - z.number().int().positive("Role ID must be a positive integer") + z.int().positive("Role ID must be a positive integer") ), resourceId: z .string() .transform(Number) .pipe( - z - .number() - .int() + z.int() .positive("Resource ID must be a positive integer") ) - }) - .strict(); + }); -const getUserResourceAccessParamsSchema = z - .object({ +const getUserResourceAccessParamsSchema = z.strictObject({ userId: z.string().min(1, "User ID is required"), resourceId: z .string() .transform(Number) .pipe( - z - .number() - .int() + z.int() .positive("Resource ID must be a positive integer") ) - }) - .strict(); + }); -const getResourceRulesParamsSchema = z - .object({ +const getResourceRulesParamsSchema = z.strictObject({ resourceId: z .string() .transform(Number) .pipe( - z - .number() - .int() + z.int() .positive("Resource ID must be a positive integer") ) - }) - .strict(); + }); -const validateResourceSessionTokenParamsSchema = z - .object({ +const validateResourceSessionTokenParamsSchema = z.strictObject({ resourceId: z .string() .transform(Number) .pipe( - z - .number() - .int() + z.int() .positive("Resource ID must be a positive integer") ) - }) - .strict(); + }); -const validateResourceSessionTokenBodySchema = z - .object({ +const validateResourceSessionTokenBodySchema = z.strictObject({ token: z.string().min(1, "Token is required") - }) - .strict(); + }); -const validateResourceAccessTokenBodySchema = z - .object({ +const validateResourceAccessTokenBodySchema = z.strictObject({ accessTokenId: z.string().optional(), resourceId: z.number().optional(), accessToken: z.string() - }) - .strict(); + }); // Certificates by domains query validation -const getCertificatesByDomainsQuerySchema = z - .object({ +const getCertificatesByDomainsQuerySchema = z.strictObject({ // Accept domains as string or array (domains or domains[]) domains: z .union([z.array(z.string().min(1)), z.string().min(1)]) @@ -185,8 +158,7 @@ const getCertificatesByDomainsQuerySchema = z "domains[]": z .union([z.array(z.string().min(1)), z.string().min(1)]) .optional() - }) - .strict(); + }); // Type exports for request schemas export type GetResourceByDomainParams = z.infer< @@ -591,11 +563,9 @@ hybridRouter.get( } ); -const getOrgLoginPageParamsSchema = z - .object({ +const getOrgLoginPageParamsSchema = z.strictObject({ orgId: z.string().min(1) - }) - .strict(); + }); hybridRouter.get( "/org/:orgId/login-page", @@ -1217,7 +1187,7 @@ hybridRouter.post( ); const geoIpLookupParamsSchema = z.object({ - ip: z.string().ip() + ip: z.union([z.ipv4(), z.ipv6()]) }); hybridRouter.get( "/geoip/:ip", diff --git a/server/private/routers/license/activateLicense.ts b/server/private/routers/license/activateLicense.ts index f5d610aa..55b7827e 100644 --- a/server/private/routers/license/activateLicense.ts +++ b/server/private/routers/license/activateLicense.ts @@ -20,11 +20,9 @@ import license from "#private/license/license"; import { z } from "zod"; import { fromError } from "zod-validation-error"; -const bodySchema = z - .object({ +const bodySchema = z.strictObject({ licenseKey: z.string().min(1).max(255) - }) - .strict(); + }); export async function activateLicense( req: Request, diff --git a/server/private/routers/license/deleteLicenseKey.ts b/server/private/routers/license/deleteLicenseKey.ts index 93fc4ef6..6f5469fc 100644 --- a/server/private/routers/license/deleteLicenseKey.ts +++ b/server/private/routers/license/deleteLicenseKey.ts @@ -23,11 +23,9 @@ import { eq } from "drizzle-orm"; import { licenseKey } from "@server/db"; import license from "#private/license/license"; -const paramsSchema = z - .object({ +const paramsSchema = z.strictObject({ licenseKey: z.string().min(1).max(255) - }) - .strict(); + }); export async function deleteLicenseKey( req: Request, diff --git a/server/private/routers/loginPage/createLoginPage.ts b/server/private/routers/loginPage/createLoginPage.ts index cb0bb923..17050855 100644 --- a/server/private/routers/loginPage/createLoginPage.ts +++ b/server/private/routers/loginPage/createLoginPage.ts @@ -35,18 +35,14 @@ import { TierId } from "@server/lib/billing/tiers"; import { build } from "@server/build"; import { CreateLoginPageResponse } from "@server/routers/loginPage/types"; -const paramsSchema = z - .object({ +const paramsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); -const bodySchema = z - .object({ +const bodySchema = z.strictObject({ subdomain: z.string().nullable().optional(), domainId: z.string() - }) - .strict(); + }); export type CreateLoginPageBody = z.infer; diff --git a/server/private/routers/loginPage/getLoginPage.ts b/server/private/routers/loginPage/getLoginPage.ts index 76e20ffb..b3bde203 100644 --- a/server/private/routers/loginPage/getLoginPage.ts +++ b/server/private/routers/loginPage/getLoginPage.ts @@ -22,11 +22,9 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { GetLoginPageResponse } from "@server/routers/loginPage/types"; -const paramsSchema = z - .object({ +const paramsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); async function query(orgId: string) { const [res] = await db diff --git a/server/private/routers/loginPage/updateLoginPage.ts b/server/private/routers/loginPage/updateLoginPage.ts index 4f2be084..8a8e8ab0 100644 --- a/server/private/routers/loginPage/updateLoginPage.ts +++ b/server/private/routers/loginPage/updateLoginPage.ts @@ -35,14 +35,12 @@ const paramsSchema = z }) .strict(); -const bodySchema = z - .object({ +const bodySchema = z.strictObject({ subdomain: subdomainSchema.nullable().optional(), domainId: z.string().optional() }) - .strict() .refine((data) => Object.keys(data).length > 0, { - message: "At least one field must be provided for update" + error: "At least one field must be provided for update" }) .refine( (data) => { @@ -51,7 +49,9 @@ const bodySchema = z } return true; }, - { message: "Invalid subdomain" } + { + error: "Invalid subdomain" + } ); export type UpdateLoginPageBody = z.infer; diff --git a/server/private/routers/misc/sendSupportEmail.ts b/server/private/routers/misc/sendSupportEmail.ts index 9b3f9c14..f1f7a919 100644 --- a/server/private/routers/misc/sendSupportEmail.ts +++ b/server/private/routers/misc/sendSupportEmail.ts @@ -22,12 +22,10 @@ import { sendEmail } from "@server/emails"; import SupportEmail from "@server/emails/templates/SupportEmail"; import config from "@server/lib/config"; -const bodySchema = z - .object({ +const bodySchema = z.strictObject({ body: z.string().min(1), subject: z.string().min(1).max(255) - }) - .strict(); + }); export async function sendSupportEmail( req: Request, diff --git a/server/private/routers/orgIdp/createOrgOidcIdp.ts b/server/private/routers/orgIdp/createOrgOidcIdp.ts index 02cef526..c3ce774e 100644 --- a/server/private/routers/orgIdp/createOrgOidcIdp.ts +++ b/server/private/routers/orgIdp/createOrgOidcIdp.ts @@ -29,15 +29,14 @@ import { getOrgTierData } from "#private/lib/billing"; import { TierId } from "@server/lib/billing/tiers"; import { CreateOrgIdpResponse } from "@server/routers/orgIdp/types"; -const paramsSchema = z.object({ orgId: z.string().nonempty() }).strict(); +const paramsSchema = z.strictObject({ orgId: z.string().nonempty() }); -const bodySchema = z - .object({ +const bodySchema = z.strictObject({ name: z.string().nonempty(), clientId: z.string().nonempty(), clientSecret: z.string().nonempty(), - authUrl: z.string().url(), - tokenUrl: z.string().url(), + authUrl: z.url(), + tokenUrl: z.url(), identifierPath: z.string().nonempty(), emailPath: z.string().optional(), namePath: z.string().optional(), @@ -45,8 +44,7 @@ const bodySchema = z autoProvision: z.boolean().optional(), variant: z.enum(["oidc", "google", "azure"]).optional().default("oidc"), roleMapping: z.string().optional() - }) - .strict(); + }); // registry.registerPath({ // method: "put", diff --git a/server/private/routers/orgIdp/listOrgIdps.ts b/server/private/routers/orgIdp/listOrgIdps.ts index 0c69ff8d..646d808c 100644 --- a/server/private/routers/orgIdp/listOrgIdps.ts +++ b/server/private/routers/orgIdp/listOrgIdps.ts @@ -24,28 +24,24 @@ import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; import { ListOrgIdpsResponse } from "@server/routers/orgIdp/types"; -const querySchema = z - .object({ +const querySchema = z.strictObject({ limit: z .string() .optional() .default("1000") .transform(Number) - .pipe(z.number().int().nonnegative()), + .pipe(z.int().nonnegative()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) - }) - .strict(); + .pipe(z.int().nonnegative()) + }); -const paramsSchema = z - .object({ +const paramsSchema = z.strictObject({ orgId: z.string().nonempty() - }) - .strict(); + }); async function query(orgId: string, limit: number, offset: number) { const res = await db diff --git a/server/private/routers/orgIdp/updateOrgOidcIdp.ts b/server/private/routers/orgIdp/updateOrgOidcIdp.ts index c6e54240..f3e76054 100644 --- a/server/private/routers/orgIdp/updateOrgOidcIdp.ts +++ b/server/private/routers/orgIdp/updateOrgOidcIdp.ts @@ -35,8 +35,7 @@ const paramsSchema = z }) .strict(); -const bodySchema = z - .object({ +const bodySchema = z.strictObject({ name: z.string().optional(), clientId: z.string().optional(), clientSecret: z.string().optional(), @@ -48,8 +47,7 @@ const bodySchema = z scopes: z.string().optional(), autoProvision: z.boolean().optional(), roleMapping: z.string().optional() - }) - .strict(); + }); export type UpdateOrgIdpResponse = { idpId: number; diff --git a/server/private/routers/re-key/reGenerateClientSecret.ts b/server/private/routers/re-key/reGenerateClientSecret.ts index e07099a4..85b3f4a6 100644 --- a/server/private/routers/re-key/reGenerateClientSecret.ts +++ b/server/private/routers/re-key/reGenerateClientSecret.ts @@ -24,19 +24,15 @@ import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; import { hashPassword } from "@server/auth/password"; -const reGenerateSecretParamsSchema = z - .object({ - clientId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const reGenerateSecretParamsSchema = z.strictObject({ + clientId: z.string().transform(Number).pipe(z.int().positive()) + }); -const reGenerateSecretBodySchema = z - .object({ +const reGenerateSecretBodySchema = z.strictObject({ olmId: z.string().min(1).optional(), secret: z.string().min(1).optional(), - }) - .strict(); + }); export type ReGenerateSecretBody = z.infer; diff --git a/server/private/routers/re-key/reGenerateExitNodeSecret.ts b/server/private/routers/re-key/reGenerateExitNodeSecret.ts index 1503e75a..ee3a7a87 100644 --- a/server/private/routers/re-key/reGenerateExitNodeSecret.ts +++ b/server/private/routers/re-key/reGenerateExitNodeSecret.ts @@ -29,12 +29,10 @@ export const paramsSchema = z.object({ orgId: z.string() }); -const bodySchema = z - .object({ +const bodySchema = z.strictObject({ remoteExitNodeId: z.string().length(15), secret: z.string().length(48) - }) - .strict(); + }); registry.registerPath({ diff --git a/server/private/routers/re-key/reGenerateSiteSecret.ts b/server/private/routers/re-key/reGenerateSiteSecret.ts index 3826cbc3..bfa5df9d 100644 --- a/server/private/routers/re-key/reGenerateSiteSecret.ts +++ b/server/private/routers/re-key/reGenerateSiteSecret.ts @@ -25,22 +25,18 @@ import { hashPassword } from "@server/auth/password"; import { addPeer } from "@server/routers/gerbil/peers"; -const updateSiteParamsSchema = z - .object({ - siteId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const updateSiteParamsSchema = z.strictObject({ + siteId: z.string().transform(Number).pipe(z.int().positive()) + }); -const updateSiteBodySchema = z - .object({ +const updateSiteBodySchema = z.strictObject({ type: z.enum(["newt", "wireguard"]), newtId: z.string().min(1).max(255).optional(), newtSecret: z.string().min(1).max(255).optional(), - exitNodeId: z.number().int().positive().optional(), + exitNodeId: z.int().positive().optional(), pubKey: z.string().optional(), subnet: z.string().optional(), - }) - .strict(); + }); registry.registerPath({ method: "post", diff --git a/server/private/routers/remoteExitNode/createRemoteExitNode.ts b/server/private/routers/remoteExitNode/createRemoteExitNode.ts index 63209ad9..5afa82ef 100644 --- a/server/private/routers/remoteExitNode/createRemoteExitNode.ts +++ b/server/private/routers/remoteExitNode/createRemoteExitNode.ts @@ -35,12 +35,10 @@ export const paramsSchema = z.object({ orgId: z.string() }); -const bodySchema = z - .object({ +const bodySchema = z.strictObject({ remoteExitNodeId: z.string().length(15), secret: z.string().length(48) - }) - .strict(); + }); export type CreateRemoteExitNodeBody = z.infer; diff --git a/server/private/routers/remoteExitNode/deleteRemoteExitNode.ts b/server/private/routers/remoteExitNode/deleteRemoteExitNode.ts index f7b9d56c..e293f421 100644 --- a/server/private/routers/remoteExitNode/deleteRemoteExitNode.ts +++ b/server/private/routers/remoteExitNode/deleteRemoteExitNode.ts @@ -24,12 +24,10 @@ import { fromError } from "zod-validation-error"; import { usageService } from "@server/lib/billing/usageService"; import { FeatureId } from "@server/lib/billing"; -const paramsSchema = z - .object({ +const paramsSchema = z.strictObject({ orgId: z.string().min(1), remoteExitNodeId: z.string().min(1) - }) - .strict(); + }); export async function deleteRemoteExitNode( req: Request, diff --git a/server/private/routers/remoteExitNode/getRemoteExitNode.ts b/server/private/routers/remoteExitNode/getRemoteExitNode.ts index 2ef3fb06..c7b98297 100644 --- a/server/private/routers/remoteExitNode/getRemoteExitNode.ts +++ b/server/private/routers/remoteExitNode/getRemoteExitNode.ts @@ -23,12 +23,10 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { GetRemoteExitNodeResponse } from "@server/routers/remoteExitNode/types"; -const getRemoteExitNodeSchema = z - .object({ +const getRemoteExitNodeSchema = z.strictObject({ orgId: z.string().min(1), remoteExitNodeId: z.string().min(1) - }) - .strict(); + }); async function query(remoteExitNodeId: string) { const [remoteExitNode] = await db diff --git a/server/private/routers/remoteExitNode/listRemoteExitNodes.ts b/server/private/routers/remoteExitNode/listRemoteExitNodes.ts index 1029b1e9..a13a05cd 100644 --- a/server/private/routers/remoteExitNode/listRemoteExitNodes.ts +++ b/server/private/routers/remoteExitNode/listRemoteExitNodes.ts @@ -23,11 +23,9 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { ListRemoteExitNodesResponse } from "@server/routers/remoteExitNode/types"; -const listRemoteExitNodesParamsSchema = z - .object({ +const listRemoteExitNodesParamsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); const listRemoteExitNodesSchema = z.object({ limit: z @@ -35,13 +33,13 @@ const listRemoteExitNodesSchema = z.object({ .optional() .default("1000") .transform(Number) - .pipe(z.number().int().positive()), + .pipe(z.int().positive()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) + .pipe(z.int().nonnegative()) }); export function queryRemoteExitNodes(orgId: string) { diff --git a/server/private/routers/remoteExitNode/pickRemoteExitNodeDefaults.ts b/server/private/routers/remoteExitNode/pickRemoteExitNodeDefaults.ts index e5762f0d..bb7c89d5 100644 --- a/server/private/routers/remoteExitNode/pickRemoteExitNodeDefaults.ts +++ b/server/private/routers/remoteExitNode/pickRemoteExitNodeDefaults.ts @@ -21,11 +21,9 @@ import { fromError } from "zod-validation-error"; import { z } from "zod"; import { PickRemoteExitNodeDefaultsResponse } from "@server/routers/remoteExitNode/types"; -const paramsSchema = z - .object({ +const paramsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); export async function pickRemoteExitNodeDefaults( req: Request, diff --git a/server/routers/accessToken/deleteAccessToken.ts b/server/routers/accessToken/deleteAccessToken.ts index 60d8789e..5de4df9b 100644 --- a/server/routers/accessToken/deleteAccessToken.ts +++ b/server/routers/accessToken/deleteAccessToken.ts @@ -10,11 +10,9 @@ import { and, eq } from "drizzle-orm"; import { db } from "@server/db"; import { OpenAPITags, registry } from "@server/openApi"; -const deleteAccessTokenParamsSchema = z - .object({ +const deleteAccessTokenParamsSchema = z.strictObject({ accessTokenId: z.string() - }) - .strict(); + }); registry.registerPath({ method: "delete", diff --git a/server/routers/accessToken/generateAccessToken.ts b/server/routers/accessToken/generateAccessToken.ts index 631b5924..36a20268 100644 --- a/server/routers/accessToken/generateAccessToken.ts +++ b/server/routers/accessToken/generateAccessToken.ts @@ -24,22 +24,18 @@ import { encodeHexLowerCase } from "@oslojs/encoding"; import { sha256 } from "@oslojs/crypto/sha2"; import { OpenAPITags, registry } from "@server/openApi"; -export const generateAccessTokenBodySchema = z - .object({ - validForSeconds: z.number().int().positive().optional(), // seconds +export const generateAccessTokenBodySchema = z.strictObject({ + validForSeconds: z.int().positive().optional(), // seconds title: z.string().optional(), description: z.string().optional() - }) - .strict(); + }); -export const generateAccssTokenParamsSchema = z - .object({ +export const generateAccssTokenParamsSchema = z.strictObject({ resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); export type GenerateAccessTokenResponse = Omit< ResourceAccessToken, diff --git a/server/routers/accessToken/listAccessTokens.ts b/server/routers/accessToken/listAccessTokens.ts index ab2bf826..476c858b 100644 --- a/server/routers/accessToken/listAccessTokens.ts +++ b/server/routers/accessToken/listAccessTokens.ts @@ -17,18 +17,16 @@ import stoi from "@server/lib/stoi"; import { fromZodError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -const listAccessTokensParamsSchema = z - .object({ +const listAccessTokensParamsSchema = z.strictObject({ resourceId: z .string() .optional() .transform(stoi) - .pipe(z.number().int().positive().optional()), + .pipe(z.int().positive().optional()), orgId: z.string().optional() }) - .strict() .refine((data) => !!data.resourceId !== !!data.orgId, { - message: "Either resourceId or orgId must be provided, but not both" + error: "Either resourceId or orgId must be provided, but not both" }); const listAccessTokensSchema = z.object({ @@ -37,14 +35,14 @@ const listAccessTokensSchema = z.object({ .optional() .default("1000") .transform(Number) - .pipe(z.number().int().nonnegative()), + .pipe(z.int().nonnegative()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) + .pipe(z.int().nonnegative()) }); function queryAccessTokens( diff --git a/server/routers/apiKeys/createRootApiKey.ts b/server/routers/apiKeys/createRootApiKey.ts index 0754574a..8e9e571d 100644 --- a/server/routers/apiKeys/createRootApiKey.ts +++ b/server/routers/apiKeys/createRootApiKey.ts @@ -14,11 +14,9 @@ import { import logger from "@server/logger"; import { hashPassword } from "@server/auth/password"; -const bodySchema = z - .object({ +const bodySchema = z.strictObject({ name: z.string().min(1).max(255) - }) - .strict(); + }); export type CreateRootApiKeyBody = z.infer; diff --git a/server/routers/apiKeys/listApiKeyActions.ts b/server/routers/apiKeys/listApiKeyActions.ts index 51d20b24..7432d175 100644 --- a/server/routers/apiKeys/listApiKeyActions.ts +++ b/server/routers/apiKeys/listApiKeyActions.ts @@ -20,13 +20,13 @@ const querySchema = z.object({ .optional() .default("1000") .transform(Number) - .pipe(z.number().int().positive()), + .pipe(z.int().positive()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) + .pipe(z.int().nonnegative()) }); function queryActions(apiKeyId: string) { diff --git a/server/routers/apiKeys/listOrgApiKeys.ts b/server/routers/apiKeys/listOrgApiKeys.ts index e8c8bc1c..53191ba6 100644 --- a/server/routers/apiKeys/listOrgApiKeys.ts +++ b/server/routers/apiKeys/listOrgApiKeys.ts @@ -16,13 +16,13 @@ const querySchema = z.object({ .optional() .default("1000") .transform(Number) - .pipe(z.number().int().positive()), + .pipe(z.int().positive()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) + .pipe(z.int().nonnegative()) }); const paramsSchema = z.object({ diff --git a/server/routers/apiKeys/listRootApiKeys.ts b/server/routers/apiKeys/listRootApiKeys.ts index ddfade3c..654b830a 100644 --- a/server/routers/apiKeys/listRootApiKeys.ts +++ b/server/routers/apiKeys/listRootApiKeys.ts @@ -15,13 +15,13 @@ const querySchema = z.object({ .optional() .default("1000") .transform(Number) - .pipe(z.number().int().positive()), + .pipe(z.int().positive()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) + .pipe(z.int().nonnegative()) }); function queryApiKeys() { diff --git a/server/routers/apiKeys/setApiKeyActions.ts b/server/routers/apiKeys/setApiKeyActions.ts index bb16deb5..fe8cc4f1 100644 --- a/server/routers/apiKeys/setApiKeyActions.ts +++ b/server/routers/apiKeys/setApiKeyActions.ts @@ -10,13 +10,10 @@ import { fromError } from "zod-validation-error"; import { eq, and, inArray } from "drizzle-orm"; import { OpenAPITags, registry } from "@server/openApi"; -const bodySchema = z - .object({ - actionIds: z - .array(z.string().nonempty()) +const bodySchema = z.strictObject({ + actionIds: z.tuple([z.string()], z.string()) .transform((v) => Array.from(new Set(v))) - }) - .strict(); + }); const paramsSchema = z.object({ apiKeyId: z.string().nonempty() diff --git a/server/routers/apiKeys/setApiKeyOrgs.ts b/server/routers/apiKeys/setApiKeyOrgs.ts index f03eec18..d60aad73 100644 --- a/server/routers/apiKeys/setApiKeyOrgs.ts +++ b/server/routers/apiKeys/setApiKeyOrgs.ts @@ -9,13 +9,10 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { eq, and, inArray } from "drizzle-orm"; -const bodySchema = z - .object({ - orgIds: z - .array(z.string().nonempty()) +const bodySchema = z.strictObject({ + orgIds: z.tuple([z.string()], z.string()) .transform((v) => Array.from(new Set(v))) - }) - .strict(); + }); const paramsSchema = z.object({ apiKeyId: z.string().nonempty() diff --git a/server/routers/auditLogs/queryRequstAuditLog.ts b/server/routers/auditLogs/queryRequstAuditLog.ts index 26cba417..7c412994 100644 --- a/server/routers/auditLogs/queryRequstAuditLog.ts +++ b/server/routers/auditLogs/queryRequstAuditLog.ts @@ -17,13 +17,13 @@ export const queryAccessAuditLogsQuery = z.object({ timeStart: z .string() .refine((val) => !isNaN(Date.parse(val)), { - message: "timeStart must be a valid ISO date string" + error: "timeStart must be a valid ISO date string" }) .transform((val) => Math.floor(new Date(val).getTime() / 1000)), timeEnd: z .string() .refine((val) => !isNaN(Date.parse(val)), { - message: "timeEnd must be a valid ISO date string" + error: "timeEnd must be a valid ISO date string" }) .transform((val) => Math.floor(new Date(val).getTime() / 1000)) .optional() @@ -37,13 +37,13 @@ export const queryAccessAuditLogsQuery = z.object({ .string() .optional() .transform(Number) - .pipe(z.number().int().positive()) + .pipe(z.int().positive()) .optional(), resourceId: z .string() .optional() .transform(Number) - .pipe(z.number().int().positive()) + .pipe(z.int().positive()) .optional(), actor: z.string().optional(), location: z.string().optional(), @@ -54,13 +54,13 @@ export const queryAccessAuditLogsQuery = z.object({ .optional() .default("1000") .transform(Number) - .pipe(z.number().int().positive()), + .pipe(z.int().positive()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) + .pipe(z.int().nonnegative()) }); export const queryRequestAuditLogsParams = z.object({ diff --git a/server/routers/auth/changePassword.ts b/server/routers/auth/changePassword.ts index 0164316e..fa007d37 100644 --- a/server/routers/auth/changePassword.ts +++ b/server/routers/auth/changePassword.ts @@ -22,13 +22,11 @@ import { sendEmail } from "@server/emails"; import ConfirmPasswordReset from "@server/emails/templates/NotifyResetPassword"; import config from "@server/lib/config"; -export const changePasswordBody = z - .object({ +export const changePasswordBody = z.strictObject({ oldPassword: z.string(), newPassword: passwordSchema, code: z.string().optional() - }) - .strict(); + }); export type ChangePasswordBody = z.infer; diff --git a/server/routers/auth/checkResourceSession.ts b/server/routers/auth/checkResourceSession.ts index 9840d564..39466400 100644 --- a/server/routers/auth/checkResourceSession.ts +++ b/server/routers/auth/checkResourceSession.ts @@ -7,10 +7,10 @@ import { response } from "@server/lib/response"; import { validateResourceSessionToken } from "@server/auth/sessions/resource"; import logger from "@server/logger"; -export const params = z.object({ +export const params = z.strictObject({ token: z.string(), - resourceId: z.string().transform(Number).pipe(z.number().int().positive()), -}).strict(); + resourceId: z.string().transform(Number).pipe(z.int().positive()), +}); export type CheckResourceSessionParams = z.infer; diff --git a/server/routers/auth/disable2fa.ts b/server/routers/auth/disable2fa.ts index da19c0d7..ebf6ab52 100644 --- a/server/routers/auth/disable2fa.ts +++ b/server/routers/auth/disable2fa.ts @@ -16,12 +16,10 @@ import config from "@server/lib/config"; import { unauthorized } from "@server/auth/unauthorizedResponse"; import { UserType } from "@server/types/UserTypes"; -export const disable2faBody = z - .object({ +export const disable2faBody = z.strictObject({ password: z.string(), code: z.string().optional() - }) - .strict(); + }); export type Disable2faBody = z.infer; diff --git a/server/routers/auth/login.ts b/server/routers/auth/login.ts index 418eaaa4..9c913054 100644 --- a/server/routers/auth/login.ts +++ b/server/routers/auth/login.ts @@ -20,14 +20,12 @@ import { verifySession } from "@server/auth/sessions/verifySession"; import { UserType } from "@server/types/UserTypes"; import { logAccessAudit } from "#dynamic/lib/logAccessAudit"; -export const loginBodySchema = z - .object({ - email: z.string().toLowerCase().email(), +export const loginBodySchema = z.strictObject({ + email: z.email().toLowerCase(), password: z.string(), code: z.string().optional(), resourceGuid: z.string().optional() - }) - .strict(); + }); export type LoginBody = z.infer; diff --git a/server/routers/auth/requestPasswordReset.ts b/server/routers/auth/requestPasswordReset.ts index a7e84b9e..0f9953e8 100644 --- a/server/routers/auth/requestPasswordReset.ts +++ b/server/routers/auth/requestPasswordReset.ts @@ -17,11 +17,9 @@ import ResetPasswordCode from "@server/emails/templates/ResetPasswordCode"; import { hashPassword } from "@server/auth/password"; import { UserType } from "@server/types/UserTypes"; -export const requestPasswordResetBody = z - .object({ - email: z.string().toLowerCase().email() - }) - .strict(); +export const requestPasswordResetBody = z.strictObject({ + email: z.email().toLowerCase() + }); export type RequestPasswordResetBody = z.infer; diff --git a/server/routers/auth/requestTotpSecret.ts b/server/routers/auth/requestTotpSecret.ts index 7c122a44..53d80147 100644 --- a/server/routers/auth/requestTotpSecret.ts +++ b/server/routers/auth/requestTotpSecret.ts @@ -16,12 +16,10 @@ import { UserType } from "@server/types/UserTypes"; import { verifySession } from "@server/auth/sessions/verifySession"; import config from "@server/lib/config"; -export const requestTotpSecretBody = z - .object({ +export const requestTotpSecretBody = z.strictObject({ password: z.string(), - email: z.string().email().optional() - }) - .strict(); + email: z.email().optional() + }); export type RequestTotpSecretBody = z.infer; diff --git a/server/routers/auth/resetPassword.ts b/server/routers/auth/resetPassword.ts index 14b4236b..aeb85558 100644 --- a/server/routers/auth/resetPassword.ts +++ b/server/routers/auth/resetPassword.ts @@ -17,14 +17,12 @@ import ConfirmPasswordReset from "@server/emails/templates/NotifyResetPassword"; import { sendEmail } from "@server/emails"; import { passwordSchema } from "@server/auth/passwordSchema"; -export const resetPasswordBody = z - .object({ - email: z.string().toLowerCase().email(), +export const resetPasswordBody = z.strictObject({ + email: z.email().toLowerCase(), token: z.string(), // reset secret code newPassword: passwordSchema, code: z.string().optional() // 2fa code - }) - .strict(); + }); export type ResetPasswordBody = z.infer; diff --git a/server/routers/auth/securityKey.ts b/server/routers/auth/securityKey.ts index 1e75764b..cde2f61a 100644 --- a/server/routers/auth/securityKey.ts +++ b/server/routers/auth/securityKey.ts @@ -99,28 +99,28 @@ async function clearChallenge(sessionId: string) { await db.delete(webauthnChallenge).where(eq(webauthnChallenge.sessionId, sessionId)); } -export const registerSecurityKeyBody = z.object({ +export const registerSecurityKeyBody = z.strictObject({ name: z.string().min(1), password: z.string().min(1), code: z.string().optional() -}).strict(); +}); -export const verifyRegistrationBody = z.object({ +export const verifyRegistrationBody = z.strictObject({ credential: z.any() -}).strict(); +}); -export const startAuthenticationBody = z.object({ - email: z.string().email().optional() -}).strict(); +export const startAuthenticationBody = z.strictObject({ + email: z.email().optional() +}); -export const verifyAuthenticationBody = z.object({ +export const verifyAuthenticationBody = z.strictObject({ credential: z.any() -}).strict(); +}); -export const deleteSecurityKeyBody = z.object({ +export const deleteSecurityKeyBody = z.strictObject({ password: z.string().min(1), code: z.string().optional() -}).strict(); +}); export async function startRegistration( req: Request, diff --git a/server/routers/auth/setServerAdmin.ts b/server/routers/auth/setServerAdmin.ts index 307f5504..9c2489cd 100644 --- a/server/routers/auth/setServerAdmin.ts +++ b/server/routers/auth/setServerAdmin.ts @@ -14,7 +14,7 @@ import { UserType } from "@server/types/UserTypes"; import moment from "moment"; export const bodySchema = z.object({ - email: z.string().toLowerCase().email(), + email: z.email().toLowerCase(), password: passwordSchema, setupToken: z.string().min(1, "Setup token is required") }); diff --git a/server/routers/auth/signup.ts b/server/routers/auth/signup.ts index e836d109..595a9b91 100644 --- a/server/routers/auth/signup.ts +++ b/server/routers/auth/signup.ts @@ -26,7 +26,7 @@ import { build } from "@server/build"; import resend, { AudienceIds, moveEmailToAudience } from "#dynamic/lib/resend"; export const signupBodySchema = z.object({ - email: z.string().toLowerCase().email(), + email: z.email().toLowerCase(), password: passwordSchema, inviteToken: z.string().optional(), inviteId: z.string().optional(), diff --git a/server/routers/auth/validateSetupToken.ts b/server/routers/auth/validateSetupToken.ts index e3c29833..1a4725b6 100644 --- a/server/routers/auth/validateSetupToken.ts +++ b/server/routers/auth/validateSetupToken.ts @@ -8,11 +8,9 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -const validateSetupTokenSchema = z - .object({ +const validateSetupTokenSchema = z.strictObject({ token: z.string().min(1, "Token is required") - }) - .strict(); + }); export type ValidateSetupTokenResponse = { valid: boolean; diff --git a/server/routers/auth/verifyEmail.ts b/server/routers/auth/verifyEmail.ts index 47a81c0a..8d31eb45 100644 --- a/server/routers/auth/verifyEmail.ts +++ b/server/routers/auth/verifyEmail.ts @@ -13,11 +13,9 @@ import logger from "@server/logger"; import { freeLimitSet, limitsService } from "@server/lib/billing"; import { build } from "@server/build"; -export const verifyEmailBody = z - .object({ +export const verifyEmailBody = z.strictObject({ code: z.string() - }) - .strict(); + }); export type VerifyEmailBody = z.infer; diff --git a/server/routers/auth/verifyTotp.ts b/server/routers/auth/verifyTotp.ts index c44c0c53..9243c9f9 100644 --- a/server/routers/auth/verifyTotp.ts +++ b/server/routers/auth/verifyTotp.ts @@ -18,13 +18,11 @@ import { generateBackupCodes } from "@server/lib/totp"; import { verifySession } from "@server/auth/sessions/verifySession"; import { unauthorized } from "@server/auth/unauthorizedResponse"; -export const verifyTotpBody = z - .object({ - email: z.string().email().optional(), +export const verifyTotpBody = z.strictObject({ + email: z.email().optional(), password: z.string().optional(), code: z.string() - }) - .strict(); + }); export type VerifyTotpBody = z.infer; diff --git a/server/routers/badger/verifySession.ts b/server/routers/badger/verifySession.ts index da5b0f18..d7fe9190 100644 --- a/server/routers/badger/verifySession.ts +++ b/server/routers/badger/verifySession.ts @@ -40,10 +40,10 @@ import { logRequestAudit } from "./logRequestAudit"; import cache from "@server/lib/cache"; const verifyResourceSessionSchema = z.object({ - sessions: z.record(z.string()).optional(), - headers: z.record(z.string()).optional(), - query: z.record(z.string()).optional(), - originalRequestURL: z.string().url(), + sessions: z.record(z.string(), z.string()).optional(), + headers: z.record(z.string(), z.string()).optional(), + query: z.record(z.string(), z.string()).optional(), + originalRequestURL: z.url(), scheme: z.string(), host: z.string(), path: z.string(), diff --git a/server/routers/blueprints/applyJSONBlueprint.ts b/server/routers/blueprints/applyJSONBlueprint.ts index 6860307b..f8c9caec 100644 --- a/server/routers/blueprints/applyJSONBlueprint.ts +++ b/server/routers/blueprints/applyJSONBlueprint.ts @@ -8,17 +8,13 @@ import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; import { applyBlueprint } from "@server/lib/blueprints/applyBlueprint"; -const applyBlueprintSchema = z - .object({ +const applyBlueprintSchema = z.strictObject({ blueprint: z.string() - }) - .strict(); + }); -const applyBlueprintParamsSchema = z - .object({ +const applyBlueprintParamsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); registry.registerPath({ method: "put", diff --git a/server/routers/blueprints/getBlueprint.ts b/server/routers/blueprints/getBlueprint.ts index 3d3f7366..45c36af7 100644 --- a/server/routers/blueprints/getBlueprint.ts +++ b/server/routers/blueprints/getBlueprint.ts @@ -12,15 +12,13 @@ import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; import { BlueprintData } from "./types"; -const getBlueprintSchema = z - .object({ +const getBlueprintSchema = z.strictObject({ blueprintId: z .string() .transform(stoi) - .pipe(z.number().int().positive()), + .pipe(z.int().positive()), orgId: z.string() - }) - .strict(); + }); async function query(blueprintId: number, orgId: string) { // Get the client diff --git a/server/routers/blueprints/listBlueprints.ts b/server/routers/blueprints/listBlueprints.ts index 5ae8b211..315abfed 100644 --- a/server/routers/blueprints/listBlueprints.ts +++ b/server/routers/blueprints/listBlueprints.ts @@ -10,28 +10,24 @@ import { fromZodError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; import { BlueprintData } from "./types"; -const listBluePrintsParamsSchema = z - .object({ +const listBluePrintsParamsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); -const listBluePrintsSchema = z - .object({ +const listBluePrintsSchema = z.strictObject({ limit: z .string() .optional() .default("1000") .transform(Number) - .pipe(z.number().int().nonnegative()), + .pipe(z.int().nonnegative()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) - }) - .strict(); + .pipe(z.int().nonnegative()) + }); async function queryBlueprints(orgId: string, limit: number, offset: number) { const res = await db diff --git a/server/routers/client/createClient.ts b/server/routers/client/createClient.ts index cb2bbd6e..d1346879 100644 --- a/server/routers/client/createClient.ts +++ b/server/routers/client/createClient.ts @@ -26,22 +26,18 @@ import { isIpInCidr } from "@server/lib/ip"; import { OpenAPITags, registry } from "@server/openApi"; import { listExitNodes } from "#dynamic/lib/exitNodes"; -const createClientParamsSchema = z - .object({ +const createClientParamsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); -const createClientSchema = z - .object({ +const createClientSchema = z.strictObject({ name: z.string().min(1).max(255), - siteIds: z.array(z.number().int().positive()), + siteIds: z.array(z.int().positive()), olmId: z.string(), secret: z.string(), subnet: z.string(), type: z.enum(["olm"]) - }) - .strict(); + }); export type CreateClientBody = z.infer; diff --git a/server/routers/client/deleteClient.ts b/server/routers/client/deleteClient.ts index a7512574..1f514c65 100644 --- a/server/routers/client/deleteClient.ts +++ b/server/routers/client/deleteClient.ts @@ -10,11 +10,9 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -const deleteClientSchema = z - .object({ - clientId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const deleteClientSchema = z.strictObject({ + clientId: z.string().transform(Number).pipe(z.int().positive()) + }); registry.registerPath({ method: "delete", diff --git a/server/routers/client/getClient.ts b/server/routers/client/getClient.ts index d362526f..a8730faf 100644 --- a/server/routers/client/getClient.ts +++ b/server/routers/client/getClient.ts @@ -11,11 +11,9 @@ import stoi from "@server/lib/stoi"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -const getClientSchema = z - .object({ - clientId: z.string().transform(stoi).pipe(z.number().int().positive()) - }) - .strict(); +const getClientSchema = z.strictObject({ + clientId: z.string().transform(stoi).pipe(z.int().positive()) + }); async function query(clientId: number) { // Get the client diff --git a/server/routers/client/listClients.ts b/server/routers/client/listClients.ts index 209b54b4..dfac03a7 100644 --- a/server/routers/client/listClients.ts +++ b/server/routers/client/listClients.ts @@ -78,11 +78,9 @@ async function getLatestOlmVersion(): Promise { } -const listClientsParamsSchema = z - .object({ +const listClientsParamsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); const listClientsSchema = z.object({ limit: z @@ -90,13 +88,13 @@ const listClientsSchema = z.object({ .optional() .default("1000") .transform(Number) - .pipe(z.number().int().positive()), + .pipe(z.int().positive()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) + .pipe(z.int().nonnegative()) }); function queryClients(orgId: string, accessibleClientIds: number[]) { diff --git a/server/routers/client/pickClientDefaults.ts b/server/routers/client/pickClientDefaults.ts index 6f452142..3d447ecd 100644 --- a/server/routers/client/pickClientDefaults.ts +++ b/server/routers/client/pickClientDefaults.ts @@ -15,11 +15,9 @@ export type PickClientDefaultsResponse = { subnet: string; }; -const pickClientDefaultsSchema = z - .object({ +const pickClientDefaultsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); registry.registerPath({ method: "get", diff --git a/server/routers/client/updateClient.ts b/server/routers/client/updateClient.ts index d458c4f8..27f85238 100644 --- a/server/routers/client/updateClient.ts +++ b/server/routers/client/updateClient.ts @@ -20,20 +20,16 @@ import { import { sendToExitNode } from "#dynamic/lib/exitNodes"; import { hashPassword } from "@server/auth/password"; -const updateClientParamsSchema = z - .object({ - clientId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const updateClientParamsSchema = z.strictObject({ + clientId: z.string().transform(Number).pipe(z.int().positive()) + }); -const updateClientSchema = z - .object({ +const updateClientSchema = z.strictObject({ name: z.string().min(1).max(255).optional(), siteIds: z - .array(z.number().int().positive()) + .array(z.int().positive()) .optional(), - }) - .strict(); + }); export type UpdateClientBody = z.infer; diff --git a/server/routers/domain/createOrgDomain.ts b/server/routers/domain/createOrgDomain.ts index 4c2451e3..3f223bce 100644 --- a/server/routers/domain/createOrgDomain.ts +++ b/server/routers/domain/createOrgDomain.ts @@ -15,20 +15,16 @@ import { isSecondLevelDomain, isValidDomain } from "@server/lib/validators"; import { build } from "@server/build"; import config from "@server/lib/config"; -const paramsSchema = z - .object({ +const paramsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); -const bodySchema = z - .object({ +const bodySchema = z.strictObject({ type: z.enum(["ns", "cname", "wildcard"]), baseDomain: subdomainSchema, certResolver: z.string().optional().nullable(), preferWildcardCert: z.boolean().optional().nullable() // optional, only for wildcard - }) - .strict(); + }); export type CreateDomainResponse = { diff --git a/server/routers/domain/deleteOrgDomain.ts b/server/routers/domain/deleteOrgDomain.ts index 8836584b..fe4a4805 100644 --- a/server/routers/domain/deleteOrgDomain.ts +++ b/server/routers/domain/deleteOrgDomain.ts @@ -10,12 +10,10 @@ import { and, eq } from "drizzle-orm"; import { usageService } from "@server/lib/billing/usageService"; import { FeatureId } from "@server/lib/billing"; -const paramsSchema = z - .object({ +const paramsSchema = z.strictObject({ domainId: z.string(), orgId: z.string() - }) - .strict(); + }); export type DeleteAccountDomainResponse = { success: boolean; diff --git a/server/routers/domain/getDNSRecords.ts b/server/routers/domain/getDNSRecords.ts index c705b4fa..239cc455 100644 --- a/server/routers/domain/getDNSRecords.ts +++ b/server/routers/domain/getDNSRecords.ts @@ -10,12 +10,10 @@ import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; import { getServerIp } from "@server/lib/serverIpService"; // your in-memory IP module -const getDNSRecordsSchema = z - .object({ +const getDNSRecordsSchema = z.strictObject({ domainId: z.string(), orgId: z.string() - }) - .strict(); + }); async function query(domainId: string) { const records = await db diff --git a/server/routers/domain/getDomain.ts b/server/routers/domain/getDomain.ts index 77bd18ae..408cf37d 100644 --- a/server/routers/domain/getDomain.ts +++ b/server/routers/domain/getDomain.ts @@ -10,14 +10,12 @@ import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; import { domain } from "zod/v4/core/regexes"; -const getDomainSchema = z - .object({ +const getDomainSchema = z.strictObject({ domainId: z .string() .optional(), orgId: z.string().optional() - }) - .strict(); + }); async function query(domainId?: string, orgId?: string) { if (domainId) { diff --git a/server/routers/domain/listDomains.ts b/server/routers/domain/listDomains.ts index 55ea99cb..48f22c6c 100644 --- a/server/routers/domain/listDomains.ts +++ b/server/routers/domain/listDomains.ts @@ -10,28 +10,24 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -const listDomainsParamsSchema = z - .object({ +const listDomainsParamsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); -const listDomainsSchema = z - .object({ +const listDomainsSchema = z.strictObject({ limit: z .string() .optional() .default("1000") .transform(Number) - .pipe(z.number().int().nonnegative()), + .pipe(z.int().nonnegative()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) - }) - .strict(); + .pipe(z.int().nonnegative()) + }); async function queryDomains(orgId: string, limit: number, offset: number) { const res = await db diff --git a/server/routers/domain/restartOrgDomain.ts b/server/routers/domain/restartOrgDomain.ts index f40f2516..f2bf7c39 100644 --- a/server/routers/domain/restartOrgDomain.ts +++ b/server/routers/domain/restartOrgDomain.ts @@ -8,12 +8,10 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { and, eq } from "drizzle-orm"; -const paramsSchema = z - .object({ +const paramsSchema = z.strictObject({ domainId: z.string(), orgId: z.string() - }) - .strict(); + }); export type RestartOrgDomainResponse = { success: boolean; diff --git a/server/routers/domain/updateDomain.ts b/server/routers/domain/updateDomain.ts index c684466e..08301189 100644 --- a/server/routers/domain/updateDomain.ts +++ b/server/routers/domain/updateDomain.ts @@ -9,19 +9,15 @@ import { fromError } from "zod-validation-error"; import { eq, and } from "drizzle-orm"; import { OpenAPITags, registry } from "@server/openApi"; -const paramsSchema = z - .object({ +const paramsSchema = z.strictObject({ orgId: z.string(), domainId: z.string() - }) - .strict(); + }); -const bodySchema = z - .object({ +const bodySchema = z.strictObject({ certResolver: z.string().optional().nullable(), preferWildcardCert: z.boolean().optional().nullable() - }) - .strict(); + }); export type UpdateDomainResponse = { domainId: string; diff --git a/server/routers/idp/createIdpOrgPolicy.ts b/server/routers/idp/createIdpOrgPolicy.ts index 448b39cd..b59d2fc7 100644 --- a/server/routers/idp/createIdpOrgPolicy.ts +++ b/server/routers/idp/createIdpOrgPolicy.ts @@ -11,19 +11,15 @@ import config from "@server/lib/config"; import { eq, and } from "drizzle-orm"; import { idp, idpOrg } from "@server/db"; -const paramsSchema = z - .object({ +const paramsSchema = z.strictObject({ idpId: z.coerce.number(), orgId: z.string() - }) - .strict(); + }); -const bodySchema = z - .object({ +const bodySchema = z.strictObject({ roleMapping: z.string().optional(), orgMapping: z.string().optional() - }) - .strict(); + }); export type CreateIdpOrgPolicyResponse = {}; diff --git a/server/routers/idp/createOidcIdp.ts b/server/routers/idp/createOidcIdp.ts index 67357d76..2548cb04 100644 --- a/server/routers/idp/createOidcIdp.ts +++ b/server/routers/idp/createOidcIdp.ts @@ -12,22 +12,20 @@ import { generateOidcRedirectUrl } from "@server/lib/idp/generateRedirectUrl"; import { encrypt } from "@server/lib/crypto"; import config from "@server/lib/config"; -const paramsSchema = z.object({}).strict(); +const paramsSchema = z.strictObject({}); -const bodySchema = z - .object({ +const bodySchema = z.strictObject({ name: z.string().nonempty(), clientId: z.string().nonempty(), clientSecret: z.string().nonempty(), - authUrl: z.string().url(), - tokenUrl: z.string().url(), + authUrl: z.url(), + tokenUrl: z.url(), identifierPath: z.string().nonempty(), emailPath: z.string().optional(), namePath: z.string().optional(), scopes: z.string().nonempty(), autoProvision: z.boolean().optional() - }) - .strict(); + }); export type CreateIdpResponse = { idpId: number; diff --git a/server/routers/idp/deleteIdpOrgPolicy.ts b/server/routers/idp/deleteIdpOrgPolicy.ts index 8314a6d5..424bae4f 100644 --- a/server/routers/idp/deleteIdpOrgPolicy.ts +++ b/server/routers/idp/deleteIdpOrgPolicy.ts @@ -10,12 +10,10 @@ import { idp, idpOrg } from "@server/db"; import { eq, and } from "drizzle-orm"; import { OpenAPITags, registry } from "@server/openApi"; -const paramsSchema = z - .object({ +const paramsSchema = z.strictObject({ idpId: z.coerce.number(), orgId: z.string() - }) - .strict(); + }); registry.registerPath({ method: "delete", diff --git a/server/routers/idp/generateOidcUrl.ts b/server/routers/idp/generateOidcUrl.ts index 3c81ce0b..d99f61ba 100644 --- a/server/routers/idp/generateOidcUrl.ts +++ b/server/routers/idp/generateOidcUrl.ts @@ -23,11 +23,9 @@ const paramsSchema = z }) .strict(); -const bodySchema = z - .object({ +const bodySchema = z.strictObject({ redirectUrl: z.string() - }) - .strict(); + }); const querySchema = z.object({ orgId: z.string().optional() // check what actuall calls it diff --git a/server/routers/idp/listIdpOrgPolicies.ts b/server/routers/idp/listIdpOrgPolicies.ts index bd288837..481cddad 100644 --- a/server/routers/idp/listIdpOrgPolicies.ts +++ b/server/routers/idp/listIdpOrgPolicies.ts @@ -14,22 +14,20 @@ const paramsSchema = z.object({ idpId: z.coerce.number() }); -const querySchema = z - .object({ +const querySchema = z.strictObject({ limit: z .string() .optional() .default("1000") .transform(Number) - .pipe(z.number().int().nonnegative()), + .pipe(z.int().nonnegative()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) - }) - .strict(); + .pipe(z.int().nonnegative()) + }); async function query(idpId: number, limit: number, offset: number) { const res = await db diff --git a/server/routers/idp/listIdps.ts b/server/routers/idp/listIdps.ts index 150b9f88..8ce2ab78 100644 --- a/server/routers/idp/listIdps.ts +++ b/server/routers/idp/listIdps.ts @@ -10,22 +10,20 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -const querySchema = z - .object({ +const querySchema = z.strictObject({ limit: z .string() .optional() .default("1000") .transform(Number) - .pipe(z.number().int().nonnegative()), + .pipe(z.int().nonnegative()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) - }) - .strict(); + .pipe(z.int().nonnegative()) + }); async function query(limit: number, offset: number) { const res = await db diff --git a/server/routers/idp/updateIdpOrgPolicy.ts b/server/routers/idp/updateIdpOrgPolicy.ts index ecbc6dbd..586af476 100644 --- a/server/routers/idp/updateIdpOrgPolicy.ts +++ b/server/routers/idp/updateIdpOrgPolicy.ts @@ -10,19 +10,15 @@ import { OpenAPITags, registry } from "@server/openApi"; import { eq, and } from "drizzle-orm"; import { idp, idpOrg } from "@server/db"; -const paramsSchema = z - .object({ +const paramsSchema = z.strictObject({ idpId: z.coerce.number(), orgId: z.string() - }) - .strict(); + }); -const bodySchema = z - .object({ +const bodySchema = z.strictObject({ roleMapping: z.string().optional(), orgMapping: z.string().optional() - }) - .strict(); + }); export type UpdateIdpOrgPolicyResponse = {}; diff --git a/server/routers/idp/updateOidcIdp.ts b/server/routers/idp/updateOidcIdp.ts index 53ece68e..c7ba0b0b 100644 --- a/server/routers/idp/updateOidcIdp.ts +++ b/server/routers/idp/updateOidcIdp.ts @@ -18,8 +18,7 @@ const paramsSchema = z }) .strict(); -const bodySchema = z - .object({ +const bodySchema = z.strictObject({ name: z.string().optional(), clientId: z.string().optional(), clientSecret: z.string().optional(), @@ -32,8 +31,7 @@ const bodySchema = z autoProvision: z.boolean().optional(), defaultRoleMapping: z.string().optional(), defaultOrgMapping: z.string().optional() - }) - .strict(); + }); export type UpdateIdpResponse = { idpId: number; diff --git a/server/routers/newt/createNewt.ts b/server/routers/newt/createNewt.ts index 3066e4ea..930c04be 100644 --- a/server/routers/newt/createNewt.ts +++ b/server/routers/newt/createNewt.ts @@ -23,12 +23,10 @@ export type CreateNewtResponse = { secret: string; }; -const createNewtSchema = z - .object({ +const createNewtSchema = z.strictObject({ newtId: z.string(), secret: z.string() - }) - .strict(); + }); export async function createNewt( req: Request, diff --git a/server/routers/newt/handleGetConfigMessage.ts b/server/routers/newt/handleGetConfigMessage.ts index 3eba94b9..fb40c398 100644 --- a/server/routers/newt/handleGetConfigMessage.ts +++ b/server/routers/newt/handleGetConfigMessage.ts @@ -18,7 +18,7 @@ import { sendToExitNode } from "#dynamic/lib/exitNodes"; const inputSchema = z.object({ publicKey: z.string(), - port: z.number().int().positive() + port: z.int().positive() }); type Input = z.infer; diff --git a/server/routers/olm/createOlm.ts b/server/routers/olm/createOlm.ts index 3066e4ea..930c04be 100644 --- a/server/routers/olm/createOlm.ts +++ b/server/routers/olm/createOlm.ts @@ -23,12 +23,10 @@ export type CreateNewtResponse = { secret: string; }; -const createNewtSchema = z - .object({ +const createNewtSchema = z.strictObject({ newtId: z.string(), secret: z.string() - }) - .strict(); + }); export async function createNewt( req: Request, diff --git a/server/routers/org/checkId.ts b/server/routers/org/checkId.ts index c5d00002..2a898c30 100644 --- a/server/routers/org/checkId.ts +++ b/server/routers/org/checkId.ts @@ -9,11 +9,9 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -const getOrgSchema = z - .object({ +const getOrgSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); export async function checkId( req: Request, diff --git a/server/routers/org/createOrg.ts b/server/routers/org/createOrg.ts index d8bcb9da..e44bf021 100644 --- a/server/routers/org/createOrg.ts +++ b/server/routers/org/createOrg.ts @@ -27,13 +27,11 @@ import { usageService } from "@server/lib/billing/usageService"; import { FeatureId } from "@server/lib/billing"; import { build } from "@server/build"; -const createOrgSchema = z - .object({ +const createOrgSchema = z.strictObject({ orgId: z.string(), name: z.string().min(1).max(255), subnet: z.string() - }) - .strict(); + }); registry.registerPath({ method: "put", diff --git a/server/routers/org/deleteOrg.ts b/server/routers/org/deleteOrg.ts index 8a424e5b..0e21a8c0 100644 --- a/server/routers/org/deleteOrg.ts +++ b/server/routers/org/deleteOrg.ts @@ -13,11 +13,9 @@ import { sendToClient } from "#dynamic/routers/ws"; import { deletePeer } from "../gerbil/peers"; import { OpenAPITags, registry } from "@server/openApi"; -const deleteOrgSchema = z - .object({ +const deleteOrgSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); export type DeleteOrgResponse = {}; diff --git a/server/routers/org/getOrg.ts b/server/routers/org/getOrg.ts index 2497f9a6..38a1c6ba 100644 --- a/server/routers/org/getOrg.ts +++ b/server/routers/org/getOrg.ts @@ -10,11 +10,9 @@ import logger from "@server/logger"; import { fromZodError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -const getOrgSchema = z - .object({ +const getOrgSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); export type GetOrgResponse = { org: Org; diff --git a/server/routers/org/getOrgOverview.ts b/server/routers/org/getOrgOverview.ts index 67a14464..90883fd7 100644 --- a/server/routers/org/getOrgOverview.ts +++ b/server/routers/org/getOrgOverview.ts @@ -18,11 +18,9 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromZodError } from "zod-validation-error"; -const getOrgParamsSchema = z - .object({ +const getOrgParamsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); export type GetOrgOverviewResponse = { orgName: string; diff --git a/server/routers/org/listOrgs.ts b/server/routers/org/listOrgs.ts index 07705e48..5819dc25 100644 --- a/server/routers/org/listOrgs.ts +++ b/server/routers/org/listOrgs.ts @@ -16,13 +16,13 @@ const listOrgsSchema = z.object({ .optional() .default("1000") .transform(Number) - .pipe(z.number().int().positive()), + .pipe(z.int().positive()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) + .pipe(z.int().nonnegative()) }); registry.registerPath({ diff --git a/server/routers/org/listUserOrgs.ts b/server/routers/org/listUserOrgs.ts index e3c0d06f..eb500250 100644 --- a/server/routers/org/listUserOrgs.ts +++ b/server/routers/org/listUserOrgs.ts @@ -20,13 +20,13 @@ const listOrgsSchema = z.object({ .optional() .default("1000") .transform(Number) - .pipe(z.number().int().positive()), + .pipe(z.int().positive()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) + .pipe(z.int().nonnegative()) }); // registry.registerPath({ diff --git a/server/routers/org/updateOrg.ts b/server/routers/org/updateOrg.ts index 8ab809e4..6e7a9b35 100644 --- a/server/routers/org/updateOrg.ts +++ b/server/routers/org/updateOrg.ts @@ -15,14 +15,11 @@ import { getOrgTierData } from "#dynamic/lib/billing"; import { TierId } from "@server/lib/billing/tiers"; import { cache } from "@server/lib/cache"; -const updateOrgParamsSchema = z - .object({ +const updateOrgParamsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); -const updateOrgBodySchema = z - .object({ +const updateOrgBodySchema = z.strictObject({ name: z.string().min(1).max(255).optional(), requireTwoFactor: z.boolean().optional(), maxSessionLengthHours: z.number().nullable().optional(), @@ -40,9 +37,8 @@ const updateOrgBodySchema = z .min(build === "saas" ? 0 : -1) .optional() }) - .strict() .refine((data) => Object.keys(data).length > 0, { - message: "At least one field must be provided for update" + error: "At least one field must be provided for update" }); registry.registerPath({ diff --git a/server/routers/resource/addEmailToResourceWhitelist.ts b/server/routers/resource/addEmailToResourceWhitelist.ts index c0d80468..f9cee838 100644 --- a/server/routers/resource/addEmailToResourceWhitelist.ts +++ b/server/routers/resource/addEmailToResourceWhitelist.ts @@ -10,29 +10,22 @@ import { fromError } from "zod-validation-error"; import { and, eq } from "drizzle-orm"; import { OpenAPITags, registry } from "@server/openApi"; -const addEmailToResourceWhitelistBodySchema = z - .object({ - email: z - .string() - .email() +const addEmailToResourceWhitelistBodySchema = z.strictObject({ + email: z.email() .or( z.string().regex(/^\*@[\w.-]+\.[a-zA-Z]{2,}$/, { - message: - "Invalid email address. Wildcard (*) must be the entire local part." + error: "Invalid email address. Wildcard (*) must be the entire local part." }) ) .transform((v) => v.toLowerCase()) - }) - .strict(); + }); -const addEmailToResourceWhitelistParamsSchema = z - .object({ +const addEmailToResourceWhitelistParamsSchema = z.strictObject({ resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); registry.registerPath({ method: "post", diff --git a/server/routers/resource/authWithAccessToken.ts b/server/routers/resource/authWithAccessToken.ts index bf0a9697..81ca7fbc 100644 --- a/server/routers/resource/authWithAccessToken.ts +++ b/server/routers/resource/authWithAccessToken.ts @@ -15,22 +15,18 @@ import config from "@server/lib/config"; import stoi from "@server/lib/stoi"; import { logAccessAudit } from "#dynamic/lib/logAccessAudit"; -const authWithAccessTokenBodySchema = z - .object({ +const authWithAccessTokenBodySchema = z.strictObject({ accessToken: z.string(), accessTokenId: z.string().optional() - }) - .strict(); + }); -const authWithAccessTokenParamsSchema = z - .object({ +const authWithAccessTokenParamsSchema = z.strictObject({ resourceId: z .string() .optional() .transform(stoi) - .pipe(z.number().int().positive().optional()) - }) - .strict(); + .pipe(z.int().positive().optional()) + }); export type AuthWithAccessTokenResponse = { session?: string; diff --git a/server/routers/resource/authWithPassword.ts b/server/routers/resource/authWithPassword.ts index 97daea3b..4c1f2058 100644 --- a/server/routers/resource/authWithPassword.ts +++ b/server/routers/resource/authWithPassword.ts @@ -15,20 +15,16 @@ import { verifyPassword } from "@server/auth/password"; import config from "@server/lib/config"; import { logAccessAudit } from "#dynamic/lib/logAccessAudit"; -export const authWithPasswordBodySchema = z - .object({ +export const authWithPasswordBodySchema = z.strictObject({ password: z.string() - }) - .strict(); + }); -export const authWithPasswordParamsSchema = z - .object({ +export const authWithPasswordParamsSchema = z.strictObject({ resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); export type AuthWithPasswordResponse = { session?: string; diff --git a/server/routers/resource/authWithPincode.ts b/server/routers/resource/authWithPincode.ts index 8ce5c1fe..59f80ee0 100644 --- a/server/routers/resource/authWithPincode.ts +++ b/server/routers/resource/authWithPincode.ts @@ -14,20 +14,16 @@ import { verifyPassword } from "@server/auth/password"; import config from "@server/lib/config"; import { logAccessAudit } from "#dynamic/lib/logAccessAudit"; -export const authWithPincodeBodySchema = z - .object({ +export const authWithPincodeBodySchema = z.strictObject({ pincode: z.string() - }) - .strict(); + }); -export const authWithPincodeParamsSchema = z - .object({ +export const authWithPincodeParamsSchema = z.strictObject({ resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); export type AuthWithPincodeResponse = { session?: string; diff --git a/server/routers/resource/authWithWhitelist.ts b/server/routers/resource/authWithWhitelist.ts index 11e417b6..11f84043 100644 --- a/server/routers/resource/authWithWhitelist.ts +++ b/server/routers/resource/authWithWhitelist.ts @@ -14,21 +14,17 @@ import logger from "@server/logger"; import config from "@server/lib/config"; import { logAccessAudit } from "#dynamic/lib/logAccessAudit"; -const authWithWhitelistBodySchema = z - .object({ - email: z.string().toLowerCase().email(), +const authWithWhitelistBodySchema = z.strictObject({ + email: z.email().toLowerCase(), otp: z.string().optional() - }) - .strict(); + }); -const authWithWhitelistParamsSchema = z - .object({ +const authWithWhitelistParamsSchema = z.strictObject({ resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); export type AuthWithWhitelistResponse = { otpSent?: boolean; diff --git a/server/routers/resource/createResource.ts b/server/routers/resource/createResource.ts index 2a4e67a7..b9ab3ce5 100644 --- a/server/routers/resource/createResource.ts +++ b/server/routers/resource/createResource.ts @@ -25,14 +25,11 @@ import { createCertificate } from "#dynamic/routers/certificates/createCertifica import { getUniqueResourceName } from "@server/db/names"; import { validateAndConstructDomain } from "@server/lib/domainUtils"; -const createResourceParamsSchema = z - .object({ +const createResourceParamsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); -const createHttpResourceSchema = z - .object({ +const createHttpResourceSchema = z.strictObject({ name: z.string().min(1).max(255), subdomain: z.string().nullable().optional(), http: z.boolean(), @@ -40,7 +37,6 @@ const createHttpResourceSchema = z domainId: z.string(), stickySession: z.boolean().optional(), }) - .strict() .refine( (data) => { if (data.subdomain) { @@ -48,18 +44,18 @@ const createHttpResourceSchema = z } return true; }, - { message: "Invalid subdomain" } + { + error: "Invalid subdomain" + } ); -const createRawResourceSchema = z - .object({ +const createRawResourceSchema = z.strictObject({ name: z.string().min(1).max(255), http: z.boolean(), protocol: z.enum(["tcp", "udp"]), - proxyPort: z.number().int().min(1).max(65535) + proxyPort: z.int().min(1).max(65535) // enableProxy: z.boolean().default(true) // always true now }) - .strict() .refine( (data) => { if (!config.getRawConfig().flags?.allow_raw_resources) { @@ -70,7 +66,7 @@ const createRawResourceSchema = z return true; }, { - message: "Raw resources are not allowed" + error: "Raw resources are not allowed" } ); diff --git a/server/routers/resource/createResourceRule.ts b/server/routers/resource/createResourceRule.ts index 1a5c07c2..c3e086b0 100644 --- a/server/routers/resource/createResourceRule.ts +++ b/server/routers/resource/createResourceRule.ts @@ -15,24 +15,20 @@ import { } from "@server/lib/validators"; import { OpenAPITags, registry } from "@server/openApi"; -const createResourceRuleSchema = z - .object({ +const createResourceRuleSchema = z.strictObject({ action: z.enum(["ACCEPT", "DROP", "PASS"]), match: z.enum(["CIDR", "IP", "PATH", "COUNTRY"]), value: z.string().min(1), - priority: z.number().int(), + priority: z.int(), enabled: z.boolean().optional() - }) - .strict(); + }); -const createResourceRuleParamsSchema = z - .object({ +const createResourceRuleParamsSchema = z.strictObject({ resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); registry.registerPath({ method: "put", diff --git a/server/routers/resource/deleteResource.ts b/server/routers/resource/deleteResource.ts index 3b0e9df4..a81208a5 100644 --- a/server/routers/resource/deleteResource.ts +++ b/server/routers/resource/deleteResource.ts @@ -14,14 +14,12 @@ import { getAllowedIps } from "../target/helpers"; import { OpenAPITags, registry } from "@server/openApi"; // Define Zod schema for request parameters validation -const deleteResourceSchema = z - .object({ +const deleteResourceSchema = z.strictObject({ resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); registry.registerPath({ method: "delete", diff --git a/server/routers/resource/deleteResourceRule.ts b/server/routers/resource/deleteResourceRule.ts index 6b404651..58cb7b48 100644 --- a/server/routers/resource/deleteResourceRule.ts +++ b/server/routers/resource/deleteResourceRule.ts @@ -10,15 +10,13 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -const deleteResourceRuleSchema = z - .object({ - ruleId: z.string().transform(Number).pipe(z.number().int().positive()), +const deleteResourceRuleSchema = z.strictObject({ + ruleId: z.string().transform(Number).pipe(z.int().positive()), resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); registry.registerPath({ method: "delete", diff --git a/server/routers/resource/getExchangeToken.ts b/server/routers/resource/getExchangeToken.ts index 28975234..8a0276a0 100644 --- a/server/routers/resource/getExchangeToken.ts +++ b/server/routers/resource/getExchangeToken.ts @@ -16,14 +16,12 @@ import { response } from "@server/lib/response"; import { checkOrgAccessPolicy } from "#dynamic/lib/checkOrgAccessPolicy"; import { logAccessAudit } from "#dynamic/lib/logAccessAudit"; -const getExchangeTokenParams = z - .object({ +const getExchangeTokenParams = z.strictObject({ resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); export type GetExchangeTokenResponse = { requestToken: string; diff --git a/server/routers/resource/getResource.ts b/server/routers/resource/getResource.ts index 0fdcdd0c..f2ce559e 100644 --- a/server/routers/resource/getResource.ts +++ b/server/routers/resource/getResource.ts @@ -11,18 +11,16 @@ import logger from "@server/logger"; import stoi from "@server/lib/stoi"; import { OpenAPITags, registry } from "@server/openApi"; -const getResourceSchema = z - .object({ +const getResourceSchema = z.strictObject({ resourceId: z .string() .optional() .transform(stoi) - .pipe(z.number().int().positive().optional()) + .pipe(z.int().positive().optional()) .optional(), niceId: z.string().optional(), orgId: z.string().optional() - }) - .strict(); + }); async function query(resourceId?: number, niceId?: string, orgId?: string) { if (resourceId) { diff --git a/server/routers/resource/getResourceAuthInfo.ts b/server/routers/resource/getResourceAuthInfo.ts index 834da7b3..60f8e586 100644 --- a/server/routers/resource/getResourceAuthInfo.ts +++ b/server/routers/resource/getResourceAuthInfo.ts @@ -15,11 +15,9 @@ import { fromError } from "zod-validation-error"; import logger from "@server/logger"; import { build } from "@server/build"; -const getResourceAuthInfoSchema = z - .object({ +const getResourceAuthInfoSchema = z.strictObject({ resourceGuid: z.string() - }) - .strict(); + }); export type GetResourceAuthInfoResponse = { resourceId: number; diff --git a/server/routers/resource/getResourceWhitelist.ts b/server/routers/resource/getResourceWhitelist.ts index 415cb714..3171352a 100644 --- a/server/routers/resource/getResourceWhitelist.ts +++ b/server/routers/resource/getResourceWhitelist.ts @@ -10,14 +10,12 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -const getResourceWhitelistSchema = z - .object({ +const getResourceWhitelistSchema = z.strictObject({ resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); async function queryWhitelist(resourceId: number) { return await db diff --git a/server/routers/resource/listResourceRoles.ts b/server/routers/resource/listResourceRoles.ts index 4676b01e..3dbb8c0d 100644 --- a/server/routers/resource/listResourceRoles.ts +++ b/server/routers/resource/listResourceRoles.ts @@ -10,14 +10,12 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -const listResourceRolesSchema = z - .object({ +const listResourceRolesSchema = z.strictObject({ resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); async function query(resourceId: number) { return await db diff --git a/server/routers/resource/listResourceRules.ts b/server/routers/resource/listResourceRules.ts index 727d50ba..bc2516a0 100644 --- a/server/routers/resource/listResourceRules.ts +++ b/server/routers/resource/listResourceRules.ts @@ -10,14 +10,12 @@ import { fromError } from "zod-validation-error"; import logger from "@server/logger"; import { OpenAPITags, registry } from "@server/openApi"; -const listResourceRulesParamsSchema = z - .object({ +const listResourceRulesParamsSchema = z.strictObject({ resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); const listResourceRulesSchema = z.object({ limit: z @@ -25,13 +23,13 @@ const listResourceRulesSchema = z.object({ .optional() .default("1000") .transform(Number) - .pipe(z.number().int().positive()), + .pipe(z.int().positive()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) + .pipe(z.int().nonnegative()) }); function queryResourceRules(resourceId: number) { diff --git a/server/routers/resource/listResourceUsers.ts b/server/routers/resource/listResourceUsers.ts index 0d96ac0d..b07bcf0a 100644 --- a/server/routers/resource/listResourceUsers.ts +++ b/server/routers/resource/listResourceUsers.ts @@ -10,14 +10,12 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -const listResourceUsersSchema = z - .object({ +const listResourceUsersSchema = z.strictObject({ resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); async function queryUsers(resourceId: number) { return await db diff --git a/server/routers/resource/listResources.ts b/server/routers/resource/listResources.ts index e612d5ec..a72dd763 100644 --- a/server/routers/resource/listResources.ts +++ b/server/routers/resource/listResources.ts @@ -20,11 +20,9 @@ import { fromZodError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; import { warn } from "console"; -const listResourcesParamsSchema = z - .object({ +const listResourcesParamsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); const listResourcesSchema = z.object({ limit: z @@ -32,14 +30,14 @@ const listResourcesSchema = z.object({ .optional() .default("1000") .transform(Number) - .pipe(z.number().int().nonnegative()), + .pipe(z.int().nonnegative()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) + .pipe(z.int().nonnegative()) }); // (resource fields + a single joined target) diff --git a/server/routers/resource/removeEmailFromResourceWhitelist.ts b/server/routers/resource/removeEmailFromResourceWhitelist.ts index 7667bf28..c2cac2de 100644 --- a/server/routers/resource/removeEmailFromResourceWhitelist.ts +++ b/server/routers/resource/removeEmailFromResourceWhitelist.ts @@ -10,29 +10,22 @@ import { fromError } from "zod-validation-error"; import { and, eq } from "drizzle-orm"; import { OpenAPITags, registry } from "@server/openApi"; -const removeEmailFromResourceWhitelistBodySchema = z - .object({ - email: z - .string() - .email() +const removeEmailFromResourceWhitelistBodySchema = z.strictObject({ + email: z.email() .or( z.string().regex(/^\*@[\w.-]+\.[a-zA-Z]{2,}$/, { - message: - "Invalid email address. Wildcard (*) must be the entire local part." + error: "Invalid email address. Wildcard (*) must be the entire local part." }) ) .transform((v) => v.toLowerCase()) - }) - .strict(); + }); -const removeEmailFromResourceWhitelistParamsSchema = z - .object({ +const removeEmailFromResourceWhitelistParamsSchema = z.strictObject({ resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); registry.registerPath({ method: "post", diff --git a/server/routers/resource/setResourceHeaderAuth.ts b/server/routers/resource/setResourceHeaderAuth.ts index dc0d417d..87ffbacd 100644 --- a/server/routers/resource/setResourceHeaderAuth.ts +++ b/server/routers/resource/setResourceHeaderAuth.ts @@ -11,15 +11,13 @@ import { hashPassword } from "@server/auth/password"; import { OpenAPITags, registry } from "@server/openApi"; const setResourceAuthMethodsParamsSchema = z.object({ - resourceId: z.string().transform(Number).pipe(z.number().int().positive()) + resourceId: z.string().transform(Number).pipe(z.int().positive()) }); -const setResourceAuthMethodsBodySchema = z - .object({ +const setResourceAuthMethodsBodySchema = z.strictObject({ user: z.string().min(4).max(100).nullable(), password: z.string().min(4).max(100).nullable() - }) - .strict(); + }); registry.registerPath({ method: "post", diff --git a/server/routers/resource/setResourcePassword.ts b/server/routers/resource/setResourcePassword.ts index 5ff485d2..3f9ce9f1 100644 --- a/server/routers/resource/setResourcePassword.ts +++ b/server/routers/resource/setResourcePassword.ts @@ -13,14 +13,12 @@ import { hashPassword } from "@server/auth/password"; import { OpenAPITags, registry } from "@server/openApi"; const setResourceAuthMethodsParamsSchema = z.object({ - resourceId: z.string().transform(Number).pipe(z.number().int().positive()) + resourceId: z.string().transform(Number).pipe(z.int().positive()) }); -const setResourceAuthMethodsBodySchema = z - .object({ +const setResourceAuthMethodsBodySchema = z.strictObject({ password: z.string().min(4).max(100).nullable() - }) - .strict(); + }); registry.registerPath({ method: "post", diff --git a/server/routers/resource/setResourcePincode.ts b/server/routers/resource/setResourcePincode.ts index 83af3c7a..6a88a279 100644 --- a/server/routers/resource/setResourcePincode.ts +++ b/server/routers/resource/setResourcePincode.ts @@ -14,17 +14,15 @@ import { hashPassword } from "@server/auth/password"; import { OpenAPITags, registry } from "@server/openApi"; const setResourceAuthMethodsParamsSchema = z.object({ - resourceId: z.string().transform(Number).pipe(z.number().int().positive()) + resourceId: z.string().transform(Number).pipe(z.int().positive()) }); -const setResourceAuthMethodsBodySchema = z - .object({ +const setResourceAuthMethodsBodySchema = z.strictObject({ pincode: z .string() .regex(/^\d{6}$/) .or(z.null()) - }) - .strict(); + }); registry.registerPath({ method: "post", diff --git a/server/routers/resource/setResourceRoles.ts b/server/routers/resource/setResourceRoles.ts index 7ea76d21..19b7b601 100644 --- a/server/routers/resource/setResourceRoles.ts +++ b/server/routers/resource/setResourceRoles.ts @@ -10,20 +10,16 @@ import { fromError } from "zod-validation-error"; import { eq, and, ne } from "drizzle-orm"; import { OpenAPITags, registry } from "@server/openApi"; -const setResourceRolesBodySchema = z - .object({ - roleIds: z.array(z.number().int().positive()) - }) - .strict(); +const setResourceRolesBodySchema = z.strictObject({ + roleIds: z.array(z.int().positive()) + }); -const setResourceRolesParamsSchema = z - .object({ +const setResourceRolesParamsSchema = z.strictObject({ resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); registry.registerPath({ method: "post", diff --git a/server/routers/resource/setResourceUsers.ts b/server/routers/resource/setResourceUsers.ts index 152c0f88..b5eca17c 100644 --- a/server/routers/resource/setResourceUsers.ts +++ b/server/routers/resource/setResourceUsers.ts @@ -10,20 +10,16 @@ import { fromError } from "zod-validation-error"; import { eq } from "drizzle-orm"; import { OpenAPITags, registry } from "@server/openApi"; -const setUserResourcesBodySchema = z - .object({ +const setUserResourcesBodySchema = z.strictObject({ userIds: z.array(z.string()) - }) - .strict(); + }); -const setUserResourcesParamsSchema = z - .object({ +const setUserResourcesParamsSchema = z.strictObject({ resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); registry.registerPath({ method: "post", diff --git a/server/routers/resource/setResourceWhitelist.ts b/server/routers/resource/setResourceWhitelist.ts index 16c9150b..417ef6d9 100644 --- a/server/routers/resource/setResourceWhitelist.ts +++ b/server/routers/resource/setResourceWhitelist.ts @@ -10,33 +10,26 @@ import { fromError } from "zod-validation-error"; import { and, eq } from "drizzle-orm"; import { OpenAPITags, registry } from "@server/openApi"; -const setResourceWhitelistBodySchema = z - .object({ +const setResourceWhitelistBodySchema = z.strictObject({ emails: z .array( - z - .string() - .email() + z.email() .or( z.string().regex(/^\*@[\w.-]+\.[a-zA-Z]{2,}$/, { - message: - "Invalid email address. Wildcard (*) must be the entire local part." + error: "Invalid email address. Wildcard (*) must be the entire local part." }) ) ) .max(50) .transform((v) => v.map((e) => e.toLowerCase())) - }) - .strict(); + }); -const setResourceWhitelistParamsSchema = z - .object({ +const setResourceWhitelistParamsSchema = z.strictObject({ resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); registry.registerPath({ method: "post", diff --git a/server/routers/resource/updateResource.ts b/server/routers/resource/updateResource.ts index 04a57ec1..1008bac9 100644 --- a/server/routers/resource/updateResource.ts +++ b/server/routers/resource/updateResource.ts @@ -25,17 +25,14 @@ import { validateAndConstructDomain } from "@server/lib/domainUtils"; import { validateHeaders } from "@server/lib/validators"; import { build } from "@server/build"; -const updateResourceParamsSchema = z - .object({ +const updateResourceParamsSchema = z.strictObject({ resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); -const updateHttpResourceBodySchema = z - .object({ +const updateHttpResourceBodySchema = z.strictObject({ name: z.string().min(1).max(255).optional(), niceId: z.string().min(1).max(255).optional(), subdomain: subdomainSchema.nullable().optional(), @@ -49,15 +46,14 @@ const updateHttpResourceBodySchema = z stickySession: z.boolean().optional(), tlsServerName: z.string().nullable().optional(), setHostHeader: z.string().nullable().optional(), - skipToIdpId: z.number().int().positive().nullable().optional(), + skipToIdpId: z.int().positive().nullable().optional(), headers: z - .array(z.object({ name: z.string(), value: z.string() })) + .array(z.strictObject({ name: z.string(), value: z.string() })) .nullable() .optional() }) - .strict() .refine((data) => Object.keys(data).length > 0, { - message: "At least one field must be provided for update" + error: "At least one field must be provided for update" }) .refine( (data) => { @@ -66,7 +62,9 @@ const updateHttpResourceBodySchema = z } return true; }, - { message: "Invalid subdomain" } + { + error: "Invalid subdomain" + } ) .refine( (data) => { @@ -76,8 +74,7 @@ const updateHttpResourceBodySchema = z return true; }, { - message: - "Invalid TLS Server Name. Use domain name format, or save empty to remove the TLS Server Name." + error: "Invalid TLS Server Name. Use domain name format, or save empty to remove the TLS Server Name." } ) .refine( @@ -88,26 +85,23 @@ const updateHttpResourceBodySchema = z return true; }, { - message: - "Invalid custom Host Header value. Use domain name format, or save empty to unset custom Host Header." + error: "Invalid custom Host Header value. Use domain name format, or save empty to unset custom Host Header." } ); export type UpdateResourceResponse = Resource; -const updateRawResourceBodySchema = z - .object({ +const updateRawResourceBodySchema = z.strictObject({ name: z.string().min(1).max(255).optional(), niceId: z.string().min(1).max(255).optional(), - proxyPort: z.number().int().min(1).max(65535).optional(), + proxyPort: z.int().min(1).max(65535).optional(), stickySession: z.boolean().optional(), enabled: z.boolean().optional(), proxyProtocol: z.boolean().optional(), - proxyProtocolVersion: z.number().int().min(1).optional() + proxyProtocolVersion: z.int().min(1).optional() }) - .strict() .refine((data) => Object.keys(data).length > 0, { - message: "At least one field must be provided for update" + error: "At least one field must be provided for update" }) .refine( (data) => { @@ -118,7 +112,9 @@ const updateRawResourceBodySchema = z } return true; }, - { message: "Cannot update proxyPort" } + { + error: "Cannot update proxyPort" + } ); registry.registerPath({ diff --git a/server/routers/resource/updateResourceRule.ts b/server/routers/resource/updateResourceRule.ts index 8df70c0f..b92c3d07 100644 --- a/server/routers/resource/updateResourceRule.ts +++ b/server/routers/resource/updateResourceRule.ts @@ -16,28 +16,24 @@ import { import { OpenAPITags, registry } from "@server/openApi"; // Define Zod schema for request parameters validation -const updateResourceRuleParamsSchema = z - .object({ - ruleId: z.string().transform(Number).pipe(z.number().int().positive()), +const updateResourceRuleParamsSchema = z.strictObject({ + ruleId: z.string().transform(Number).pipe(z.int().positive()), resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); // Define Zod schema for request body validation -const updateResourceRuleSchema = z - .object({ +const updateResourceRuleSchema = z.strictObject({ action: z.enum(["ACCEPT", "DROP", "PASS"]).optional(), match: z.enum(["CIDR", "IP", "PATH", "COUNTRY"]).optional(), value: z.string().min(1).optional(), - priority: z.number().int(), + priority: z.int(), enabled: z.boolean().optional() }) - .strict() .refine((data) => Object.keys(data).length > 0, { - message: "At least one field must be provided for update" + error: "At least one field must be provided for update" }); registry.registerPath({ diff --git a/server/routers/role/addRoleAction.ts b/server/routers/role/addRoleAction.ts index 62ab87b5..74540b78 100644 --- a/server/routers/role/addRoleAction.ts +++ b/server/routers/role/addRoleAction.ts @@ -9,17 +9,13 @@ import logger from "@server/logger"; import { eq } from "drizzle-orm"; import { fromError } from "zod-validation-error"; -const addRoleActionParamSchema = z - .object({ - roleId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const addRoleActionParamSchema = z.strictObject({ + roleId: z.string().transform(Number).pipe(z.int().positive()) + }); -const addRoleActionSchema = z - .object({ +const addRoleActionSchema = z.strictObject({ actionId: z.string() - }) - .strict(); + }); export async function addRoleAction( req: Request, diff --git a/server/routers/role/addRoleSite.ts b/server/routers/role/addRoleSite.ts index d268eed4..d33c733d 100644 --- a/server/routers/role/addRoleSite.ts +++ b/server/routers/role/addRoleSite.ts @@ -9,17 +9,13 @@ import logger from "@server/logger"; import { eq } from "drizzle-orm"; import { fromError } from "zod-validation-error"; -const addRoleSiteParamsSchema = z - .object({ - roleId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const addRoleSiteParamsSchema = z.strictObject({ + roleId: z.string().transform(Number).pipe(z.int().positive()) + }); -const addRoleSiteSchema = z - .object({ - siteId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const addRoleSiteSchema = z.strictObject({ + siteId: z.string().transform(Number).pipe(z.int().positive()) + }); export async function addRoleSite( req: Request, diff --git a/server/routers/role/createRole.ts b/server/routers/role/createRole.ts index f66c95e2..26573c6c 100644 --- a/server/routers/role/createRole.ts +++ b/server/routers/role/createRole.ts @@ -11,18 +11,14 @@ import { ActionsEnum } from "@server/auth/actions"; import { eq, and } from "drizzle-orm"; import { OpenAPITags, registry } from "@server/openApi"; -const createRoleParamsSchema = z - .object({ +const createRoleParamsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); -const createRoleSchema = z - .object({ +const createRoleSchema = z.strictObject({ name: z.string().min(1).max(255), description: z.string().optional() - }) - .strict(); + }); export const defaultRoleAllowedActions: ActionsEnum[] = [ ActionsEnum.getOrg, diff --git a/server/routers/role/deleteRole.ts b/server/routers/role/deleteRole.ts index 6806386e..e4d89b2f 100644 --- a/server/routers/role/deleteRole.ts +++ b/server/routers/role/deleteRole.ts @@ -10,17 +10,13 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -const deleteRoleSchema = z - .object({ - roleId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const deleteRoleSchema = z.strictObject({ + roleId: z.string().transform(Number).pipe(z.int().positive()) + }); -const deelteRoleBodySchema = z - .object({ - roleId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const deelteRoleBodySchema = z.strictObject({ + roleId: z.string().transform(Number).pipe(z.int().positive()) + }); registry.registerPath({ method: "delete", diff --git a/server/routers/role/getRole.ts b/server/routers/role/getRole.ts index 66dbb68f..afd6e83a 100644 --- a/server/routers/role/getRole.ts +++ b/server/routers/role/getRole.ts @@ -10,11 +10,9 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -const getRoleSchema = z - .object({ - roleId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const getRoleSchema = z.strictObject({ + roleId: z.string().transform(Number).pipe(z.int().positive()) + }); registry.registerPath({ method: "get", diff --git a/server/routers/role/listRoleActions.ts b/server/routers/role/listRoleActions.ts index cdf1391b..8392c296 100644 --- a/server/routers/role/listRoleActions.ts +++ b/server/routers/role/listRoleActions.ts @@ -9,11 +9,9 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -const listRoleActionsSchema = z - .object({ - roleId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const listRoleActionsSchema = z.strictObject({ + roleId: z.string().transform(Number).pipe(z.int().positive()) + }); export async function listRoleActions( req: Request, diff --git a/server/routers/role/listRoleResources.ts b/server/routers/role/listRoleResources.ts index ba254f1d..57a84c5c 100644 --- a/server/routers/role/listRoleResources.ts +++ b/server/routers/role/listRoleResources.ts @@ -9,11 +9,9 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -const listRoleResourcesSchema = z - .object({ - roleId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const listRoleResourcesSchema = z.strictObject({ + roleId: z.string().transform(Number).pipe(z.int().positive()) + }); export async function listRoleResources( req: Request, diff --git a/server/routers/role/listRoleSites.ts b/server/routers/role/listRoleSites.ts index 72f49e3a..f35e367c 100644 --- a/server/routers/role/listRoleSites.ts +++ b/server/routers/role/listRoleSites.ts @@ -9,11 +9,9 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -const listRoleSitesSchema = z - .object({ - roleId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const listRoleSitesSchema = z.strictObject({ + roleId: z.string().transform(Number).pipe(z.int().positive()) + }); export async function listRoleSites( req: Request, diff --git a/server/routers/role/listRoles.ts b/server/routers/role/listRoles.ts index 56ae8a3a..14a5c2d1 100644 --- a/server/routers/role/listRoles.ts +++ b/server/routers/role/listRoles.ts @@ -11,11 +11,9 @@ import { fromError } from "zod-validation-error"; import stoi from "@server/lib/stoi"; import { OpenAPITags, registry } from "@server/openApi"; -const listRolesParamsSchema = z - .object({ +const listRolesParamsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); const listRolesSchema = z.object({ limit: z @@ -23,13 +21,13 @@ const listRolesSchema = z.object({ .optional() .default("1000") .transform(Number) - .pipe(z.number().int().nonnegative()), + .pipe(z.int().nonnegative()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) + .pipe(z.int().nonnegative()) }); async function queryRoles(orgId: string, limit: number, offset: number) { diff --git a/server/routers/role/removeRoleAction.ts b/server/routers/role/removeRoleAction.ts index e643ae04..25fbaa29 100644 --- a/server/routers/role/removeRoleAction.ts +++ b/server/routers/role/removeRoleAction.ts @@ -9,17 +9,13 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -const removeRoleActionParamsSchema = z - .object({ - roleId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const removeRoleActionParamsSchema = z.strictObject({ + roleId: z.string().transform(Number).pipe(z.int().positive()) + }); -const removeRoleActionSchema = z - .object({ +const removeRoleActionSchema = z.strictObject({ actionId: z.string() - }) - .strict(); + }); export async function removeRoleAction( req: Request, diff --git a/server/routers/role/removeRoleResource.ts b/server/routers/role/removeRoleResource.ts index 4068b0bd..d2c7cae9 100644 --- a/server/routers/role/removeRoleResource.ts +++ b/server/routers/role/removeRoleResource.ts @@ -9,20 +9,16 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -const removeRoleResourceParamsSchema = z - .object({ - roleId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const removeRoleResourceParamsSchema = z.strictObject({ + roleId: z.string().transform(Number).pipe(z.int().positive()) + }); -const removeRoleResourceSchema = z - .object({ +const removeRoleResourceSchema = z.strictObject({ resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); export async function removeRoleResource( req: Request, diff --git a/server/routers/role/removeRoleSite.ts b/server/routers/role/removeRoleSite.ts index 2670272d..8092eed1 100644 --- a/server/routers/role/removeRoleSite.ts +++ b/server/routers/role/removeRoleSite.ts @@ -9,17 +9,13 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -const removeRoleSiteParamsSchema = z - .object({ - roleId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const removeRoleSiteParamsSchema = z.strictObject({ + roleId: z.string().transform(Number).pipe(z.int().positive()) + }); -const removeRoleSiteSchema = z - .object({ - siteId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const removeRoleSiteSchema = z.strictObject({ + siteId: z.string().transform(Number).pipe(z.int().positive()) + }); export async function removeRoleSite( req: Request, diff --git a/server/routers/role/updateRole.ts b/server/routers/role/updateRole.ts index 793be6eb..136ca389 100644 --- a/server/routers/role/updateRole.ts +++ b/server/routers/role/updateRole.ts @@ -9,20 +9,16 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -const updateRoleParamsSchema = z - .object({ - roleId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const updateRoleParamsSchema = z.strictObject({ + roleId: z.string().transform(Number).pipe(z.int().positive()) + }); -const updateRoleBodySchema = z - .object({ +const updateRoleBodySchema = z.strictObject({ name: z.string().min(1).max(255).optional(), description: z.string().optional() }) - .strict() .refine((data) => Object.keys(data).length > 0, { - message: "At least one field must be provided for update" + error: "At least one field must be provided for update" }); export async function updateRole( diff --git a/server/routers/site/createSite.ts b/server/routers/site/createSite.ts index f98a01dc..81a35451 100644 --- a/server/routers/site/createSite.ts +++ b/server/routers/site/createSite.ts @@ -19,16 +19,13 @@ import { isIpInCidr } from "@server/lib/ip"; import { verifyExitNodeOrgAccess } from "#dynamic/lib/exitNodes"; import { build } from "@server/build"; -const createSiteParamsSchema = z - .object({ +const createSiteParamsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); -const createSiteSchema = z - .object({ +const createSiteSchema = z.strictObject({ name: z.string().min(1).max(255), - exitNodeId: z.number().int().positive().optional(), + exitNodeId: z.int().positive().optional(), // subdomain: z // .string() // .min(1) @@ -41,8 +38,7 @@ const createSiteSchema = z secret: z.string().optional(), address: z.string().optional(), type: z.enum(["newt", "wireguard", "local"]) - }) - .strict(); + }); // .refine((data) => { // if (data.type === "local") { // return !config.getRawConfig().flags?.disable_local_sites; diff --git a/server/routers/site/deleteSite.ts b/server/routers/site/deleteSite.ts index 7a12e24a..a086e143 100644 --- a/server/routers/site/deleteSite.ts +++ b/server/routers/site/deleteSite.ts @@ -12,11 +12,9 @@ import { fromError } from "zod-validation-error"; import { sendToClient } from "#dynamic/routers/ws"; import { OpenAPITags, registry } from "@server/openApi"; -const deleteSiteSchema = z - .object({ - siteId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const deleteSiteSchema = z.strictObject({ + siteId: z.string().transform(Number).pipe(z.int().positive()) + }); registry.registerPath({ method: "delete", diff --git a/server/routers/site/getSite.ts b/server/routers/site/getSite.ts index a9785fa4..b6ce346a 100644 --- a/server/routers/site/getSite.ts +++ b/server/routers/site/getSite.ts @@ -11,18 +11,16 @@ import stoi from "@server/lib/stoi"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -const getSiteSchema = z - .object({ +const getSiteSchema = z.strictObject({ siteId: z .string() .optional() .transform(stoi) - .pipe(z.number().int().positive().optional()) + .pipe(z.int().positive().optional()) .optional(), niceId: z.string().optional(), orgId: z.string().optional() - }) - .strict(); + }); async function query(siteId?: number, niceId?: string, orgId?: string) { if (siteId) { diff --git a/server/routers/site/listSiteRoles.ts b/server/routers/site/listSiteRoles.ts index 009e0907..ec66d3c5 100644 --- a/server/routers/site/listSiteRoles.ts +++ b/server/routers/site/listSiteRoles.ts @@ -9,11 +9,9 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -const listSiteRolesSchema = z - .object({ - siteId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const listSiteRolesSchema = z.strictObject({ + siteId: z.string().transform(Number).pipe(z.int().positive()) + }); export async function listSiteRoles( req: Request, diff --git a/server/routers/site/listSites.ts b/server/routers/site/listSites.ts index cddf8c4b..f0854764 100644 --- a/server/routers/site/listSites.ts +++ b/server/routers/site/listSites.ts @@ -68,11 +68,9 @@ async function getLatestNewtVersion(): Promise { } } -const listSitesParamsSchema = z - .object({ +const listSitesParamsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); const listSitesSchema = z.object({ limit: z @@ -80,13 +78,13 @@ const listSitesSchema = z.object({ .optional() .default("1000") .transform(Number) - .pipe(z.number().int().positive()), + .pipe(z.int().positive()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) + .pipe(z.int().nonnegative()) }); function querySites(orgId: string, accessibleSiteIds: number[]) { diff --git a/server/routers/site/pickSiteDefaults.ts b/server/routers/site/pickSiteDefaults.ts index c4b3a087..029ae322 100644 --- a/server/routers/site/pickSiteDefaults.ts +++ b/server/routers/site/pickSiteDefaults.ts @@ -44,11 +44,9 @@ registry.registerPath({ responses: {} }); -const pickSiteDefaultsSchema = z - .object({ +const pickSiteDefaultsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); export async function pickSiteDefaults( req: Request, diff --git a/server/routers/site/socketIntegration.ts b/server/routers/site/socketIntegration.ts index 3a52dcd2..33893000 100644 --- a/server/routers/site/socketIntegration.ts +++ b/server/routers/site/socketIntegration.ts @@ -46,18 +46,14 @@ export interface Container { networks: Record; } -const siteIdParamsSchema = z - .object({ - siteId: z.string().transform(stoi).pipe(z.number().int().positive()) - }) - .strict(); +const siteIdParamsSchema = z.strictObject({ + siteId: z.string().transform(stoi).pipe(z.int().positive()) + }); -const DockerStatusSchema = z - .object({ +const DockerStatusSchema = z.strictObject({ isAvailable: z.boolean(), socketPath: z.string().optional() - }) - .strict(); + }); function validateSiteIdParams(params: any) { const parsedParams = siteIdParamsSchema.safeParse(params); diff --git a/server/routers/site/updateSite.ts b/server/routers/site/updateSite.ts index 2041420c..4c25d4c5 100644 --- a/server/routers/site/updateSite.ts +++ b/server/routers/site/updateSite.ts @@ -11,14 +11,11 @@ import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; import { isValidCIDR } from "@server/lib/validators"; -const updateSiteParamsSchema = z - .object({ - siteId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const updateSiteParamsSchema = z.strictObject({ + siteId: z.string().transform(Number).pipe(z.int().positive()) + }); -const updateSiteBodySchema = z - .object({ +const updateSiteBodySchema = z.strictObject({ name: z.string().min(1).max(255).optional(), niceId: z.string().min(1).max(255).optional(), dockerSocketEnabled: z.boolean().optional(), @@ -37,9 +34,8 @@ const updateSiteBodySchema = z // megabytesIn: z.number().int().nonnegative().optional(), // megabytesOut: z.number().int().nonnegative().optional(), }) - .strict() .refine((data) => Object.keys(data).length > 0, { - message: "At least one field must be provided for update" + error: "At least one field must be provided for update" }); registry.registerPath({ diff --git a/server/routers/siteResource/createSiteResource.ts b/server/routers/siteResource/createSiteResource.ts index ca223b04..b77b52e4 100644 --- a/server/routers/siteResource/createSiteResource.ts +++ b/server/routers/siteResource/createSiteResource.ts @@ -12,23 +12,19 @@ import { OpenAPITags, registry } from "@server/openApi"; import { addTargets } from "../client/targets"; import { getUniqueSiteResourceName } from "@server/db/names"; -const createSiteResourceParamsSchema = z - .object({ - siteId: z.string().transform(Number).pipe(z.number().int().positive()), +const createSiteResourceParamsSchema = z.strictObject({ + siteId: z.string().transform(Number).pipe(z.int().positive()), orgId: z.string() - }) - .strict(); + }); -const createSiteResourceSchema = z - .object({ +const createSiteResourceSchema = z.strictObject({ name: z.string().min(1).max(255), protocol: z.enum(["tcp", "udp"]), - proxyPort: z.number().int().positive(), - destinationPort: z.number().int().positive(), + proxyPort: z.int().positive(), + destinationPort: z.int().positive(), destinationIp: z.string(), enabled: z.boolean().default(true) - }) - .strict(); + }); export type CreateSiteResourceBody = z.infer; export type CreateSiteResourceResponse = SiteResource; diff --git a/server/routers/siteResource/deleteSiteResource.ts b/server/routers/siteResource/deleteSiteResource.ts index 347d4b53..02bc2c72 100644 --- a/server/routers/siteResource/deleteSiteResource.ts +++ b/server/routers/siteResource/deleteSiteResource.ts @@ -11,13 +11,11 @@ import logger from "@server/logger"; import { OpenAPITags, registry } from "@server/openApi"; import { removeTargets } from "../client/targets"; -const deleteSiteResourceParamsSchema = z - .object({ - siteResourceId: z.string().transform(Number).pipe(z.number().int().positive()), - siteId: z.string().transform(Number).pipe(z.number().int().positive()), +const deleteSiteResourceParamsSchema = z.strictObject({ + siteResourceId: z.string().transform(Number).pipe(z.int().positive()), + siteId: z.string().transform(Number).pipe(z.int().positive()), orgId: z.string() - }) - .strict(); + }); export type DeleteSiteResourceResponse = { message: string; diff --git a/server/routers/siteResource/getSiteResource.ts b/server/routers/siteResource/getSiteResource.ts index 09c01eb0..48f10b8b 100644 --- a/server/routers/siteResource/getSiteResource.ts +++ b/server/routers/siteResource/getSiteResource.ts @@ -10,19 +10,17 @@ import { fromError } from "zod-validation-error"; import logger from "@server/logger"; import { OpenAPITags, registry } from "@server/openApi"; -const getSiteResourceParamsSchema = z - .object({ +const getSiteResourceParamsSchema = z.strictObject({ siteResourceId: z .string() .optional() .transform((val) => val ? Number(val) : undefined) - .pipe(z.number().int().positive().optional()) + .pipe(z.int().positive().optional()) .optional(), - siteId: z.string().transform(Number).pipe(z.number().int().positive()), + siteId: z.string().transform(Number).pipe(z.int().positive()), niceId: z.string().optional(), orgId: z.string() - }) - .strict(); + }); async function query(siteResourceId?: number, siteId?: number, niceId?: string, orgId?: string) { if (siteResourceId && siteId && orgId) { diff --git a/server/routers/siteResource/listAllSiteResourcesByOrg.ts b/server/routers/siteResource/listAllSiteResourcesByOrg.ts index 948fc2c2..96b9a668 100644 --- a/server/routers/siteResource/listAllSiteResourcesByOrg.ts +++ b/server/routers/siteResource/listAllSiteResourcesByOrg.ts @@ -10,11 +10,9 @@ import { fromError } from "zod-validation-error"; import logger from "@server/logger"; import { OpenAPITags, registry } from "@server/openApi"; -const listAllSiteResourcesByOrgParamsSchema = z - .object({ +const listAllSiteResourcesByOrgParamsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); const listAllSiteResourcesByOrgQuerySchema = z.object({ limit: z @@ -22,13 +20,13 @@ const listAllSiteResourcesByOrgQuerySchema = z.object({ .optional() .default("1000") .transform(Number) - .pipe(z.number().int().positive()), + .pipe(z.int().positive()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) + .pipe(z.int().nonnegative()) }); export type ListAllSiteResourcesByOrgResponse = { diff --git a/server/routers/siteResource/listSiteResources.ts b/server/routers/siteResource/listSiteResources.ts index 7fdb7a85..e530952d 100644 --- a/server/routers/siteResource/listSiteResources.ts +++ b/server/routers/siteResource/listSiteResources.ts @@ -10,12 +10,10 @@ import { fromError } from "zod-validation-error"; import logger from "@server/logger"; import { OpenAPITags, registry } from "@server/openApi"; -const listSiteResourcesParamsSchema = z - .object({ - siteId: z.string().transform(Number).pipe(z.number().int().positive()), +const listSiteResourcesParamsSchema = z.strictObject({ + siteId: z.string().transform(Number).pipe(z.int().positive()), orgId: z.string() - }) - .strict(); + }); const listSiteResourcesQuerySchema = z.object({ limit: z @@ -23,13 +21,13 @@ const listSiteResourcesQuerySchema = z.object({ .optional() .default("100") .transform(Number) - .pipe(z.number().int().positive()), + .pipe(z.int().positive()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) + .pipe(z.int().nonnegative()) }); export type ListSiteResourcesResponse = { diff --git a/server/routers/siteResource/updateSiteResource.ts b/server/routers/siteResource/updateSiteResource.ts index f6f71124..fd316e74 100644 --- a/server/routers/siteResource/updateSiteResource.ts +++ b/server/routers/siteResource/updateSiteResource.ts @@ -11,27 +11,23 @@ import logger from "@server/logger"; import { OpenAPITags, registry } from "@server/openApi"; import { addTargets } from "../client/targets"; -const updateSiteResourceParamsSchema = z - .object({ +const updateSiteResourceParamsSchema = z.strictObject({ siteResourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()), - siteId: z.string().transform(Number).pipe(z.number().int().positive()), + .pipe(z.int().positive()), + siteId: z.string().transform(Number).pipe(z.int().positive()), orgId: z.string() - }) - .strict(); + }); -const updateSiteResourceSchema = z - .object({ +const updateSiteResourceSchema = z.strictObject({ name: z.string().min(1).max(255).optional(), protocol: z.enum(["tcp", "udp"]).optional(), - proxyPort: z.number().int().positive().optional(), - destinationPort: z.number().int().positive().optional(), + proxyPort: z.int().positive().optional(), + destinationPort: z.int().positive().optional(), destinationIp: z.string().optional(), enabled: z.boolean().optional() - }) - .strict(); + }); export type UpdateSiteResourceBody = z.infer; export type UpdateSiteResourceResponse = SiteResource; diff --git a/server/routers/supporterKey/validateSupporterKey.ts b/server/routers/supporterKey/validateSupporterKey.ts index 338c920e..d8b16421 100644 --- a/server/routers/supporterKey/validateSupporterKey.ts +++ b/server/routers/supporterKey/validateSupporterKey.ts @@ -9,12 +9,10 @@ import { supporterKey } from "@server/db"; import { db } from "@server/db"; import config from "@server/lib/config"; -const validateSupporterKeySchema = z - .object({ +const validateSupporterKeySchema = z.strictObject({ githubUsername: z.string().nonempty(), key: z.string().nonempty() - }) - .strict(); + }); export type ValidateSupporterKeyResponse = { valid: boolean; diff --git a/server/routers/target/createTarget.ts b/server/routers/target/createTarget.ts index b35d8d2a..6cf29da3 100644 --- a/server/routers/target/createTarget.ts +++ b/server/routers/target/createTarget.ts @@ -15,44 +15,39 @@ import { pickPort } from "./helpers"; import { isTargetValid } from "@server/lib/validators"; import { OpenAPITags, registry } from "@server/openApi"; -const createTargetParamsSchema = z - .object({ +const createTargetParamsSchema = z.strictObject({ resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); -const createTargetSchema = z - .object({ - siteId: z.number().int().positive(), +const createTargetSchema = z.strictObject({ + siteId: z.int().positive(), ip: z.string().refine(isTargetValid), method: z.string().optional().nullable(), - port: z.number().int().min(1).max(65535), + port: z.int().min(1).max(65535), enabled: z.boolean().default(true), hcEnabled: z.boolean().optional(), hcPath: z.string().min(1).optional().nullable(), hcScheme: z.string().optional().nullable(), hcMode: z.string().optional().nullable(), hcHostname: z.string().optional().nullable(), - hcPort: z.number().int().positive().optional().nullable(), - hcInterval: z.number().int().positive().min(5).optional().nullable(), - hcUnhealthyInterval: z - .number() - .int() + hcPort: z.int().positive().optional().nullable(), + hcInterval: z.int().positive().min(5).optional().nullable(), + hcUnhealthyInterval: z.int() .positive() .min(5) .optional() .nullable(), - hcTimeout: z.number().int().positive().min(1).optional().nullable(), + hcTimeout: z.int().positive().min(1).optional().nullable(), hcHeaders: z - .array(z.object({ name: z.string(), value: z.string() })) + .array(z.strictObject({ name: z.string(), value: z.string() })) .nullable() .optional(), hcFollowRedirects: z.boolean().optional().nullable(), hcMethod: z.string().min(1).optional().nullable(), - hcStatus: z.number().int().optional().nullable(), + hcStatus: z.int().optional().nullable(), path: z.string().optional().nullable(), pathMatchType: z .enum(["exact", "prefix", "regex"]) @@ -63,9 +58,8 @@ const createTargetSchema = z .enum(["exact", "prefix", "regex", "stripPrefix"]) .optional() .nullable(), - priority: z.number().int().min(1).max(1000).optional().nullable() - }) - .strict(); + priority: z.int().min(1).max(1000).optional().nullable() + }); export type CreateTargetResponse = Target & TargetHealthCheck; diff --git a/server/routers/target/deleteTarget.ts b/server/routers/target/deleteTarget.ts index 596691e4..a70b2a1e 100644 --- a/server/routers/target/deleteTarget.ts +++ b/server/routers/target/deleteTarget.ts @@ -13,11 +13,9 @@ import { removeTargets } from "../newt/targets"; import { getAllowedIps } from "./helpers"; import { OpenAPITags, registry } from "@server/openApi"; -const deleteTargetSchema = z - .object({ - targetId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const deleteTargetSchema = z.strictObject({ + targetId: z.string().transform(Number).pipe(z.int().positive()) + }); registry.registerPath({ method: "delete", diff --git a/server/routers/target/getTarget.ts b/server/routers/target/getTarget.ts index 864c02eb..7fe2e062 100644 --- a/server/routers/target/getTarget.ts +++ b/server/routers/target/getTarget.ts @@ -10,11 +10,9 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -const getTargetSchema = z - .object({ - targetId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const getTargetSchema = z.strictObject({ + targetId: z.string().transform(Number).pipe(z.int().positive()) + }); type GetTargetResponse = Target & Omit & { hcHeaders: { name: string; value: string; }[] | null; diff --git a/server/routers/target/listTargets.ts b/server/routers/target/listTargets.ts index 04966f6e..e97d577d 100644 --- a/server/routers/target/listTargets.ts +++ b/server/routers/target/listTargets.ts @@ -10,14 +10,12 @@ import { fromError } from "zod-validation-error"; import logger from "@server/logger"; import { OpenAPITags, registry } from "@server/openApi"; -const listTargetsParamsSchema = z - .object({ +const listTargetsParamsSchema = z.strictObject({ resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); const listTargetsSchema = z.object({ limit: z @@ -25,13 +23,13 @@ const listTargetsSchema = z.object({ .optional() .default("1000") .transform(Number) - .pipe(z.number().int().positive()), + .pipe(z.int().positive()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) + .pipe(z.int().nonnegative()) }); function queryTargets(resourceId: number) { diff --git a/server/routers/target/updateTarget.ts b/server/routers/target/updateTarget.ts index 6e9a8fc9..1889154c 100644 --- a/server/routers/target/updateTarget.ts +++ b/server/routers/target/updateTarget.ts @@ -15,47 +15,41 @@ import { isTargetValid } from "@server/lib/validators"; import { OpenAPITags, registry } from "@server/openApi"; import { vs } from "@react-email/components"; -const updateTargetParamsSchema = z - .object({ - targetId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); +const updateTargetParamsSchema = z.strictObject({ + targetId: z.string().transform(Number).pipe(z.int().positive()) + }); -const updateTargetBodySchema = z - .object({ - siteId: z.number().int().positive(), +const updateTargetBodySchema = z.strictObject({ + siteId: z.int().positive(), ip: z.string().refine(isTargetValid), method: z.string().min(1).max(10).optional().nullable(), - port: z.number().int().min(1).max(65535).optional(), + port: z.int().min(1).max(65535).optional(), enabled: z.boolean().optional(), hcEnabled: z.boolean().optional().nullable(), hcPath: z.string().min(1).optional().nullable(), hcScheme: z.string().optional().nullable(), hcMode: z.string().optional().nullable(), hcHostname: z.string().optional().nullable(), - hcPort: z.number().int().positive().optional().nullable(), - hcInterval: z.number().int().positive().min(5).optional().nullable(), - hcUnhealthyInterval: z - .number() - .int() + hcPort: z.int().positive().optional().nullable(), + hcInterval: z.int().positive().min(5).optional().nullable(), + hcUnhealthyInterval: z.int() .positive() .min(5) .optional() .nullable(), - hcTimeout: z.number().int().positive().min(1).optional().nullable(), - hcHeaders: z.array(z.object({ name: z.string(), value: z.string() })).nullable().optional(), + hcTimeout: z.int().positive().min(1).optional().nullable(), + hcHeaders: z.array(z.strictObject({ name: z.string(), value: z.string() })).nullable().optional(), hcFollowRedirects: z.boolean().optional().nullable(), hcMethod: z.string().min(1).optional().nullable(), - hcStatus: z.number().int().optional().nullable(), + hcStatus: z.int().optional().nullable(), path: z.string().optional().nullable(), pathMatchType: z.enum(["exact", "prefix", "regex"]).optional().nullable(), rewritePath: z.string().optional().nullable(), rewritePathType: z.enum(["exact", "prefix", "regex", "stripPrefix"]).optional().nullable(), - priority: z.number().int().min(1).max(1000).optional(), + priority: z.int().min(1).max(1000).optional(), }) - .strict() .refine((data) => Object.keys(data).length > 0, { - message: "At least one field must be provided for update" + error: "At least one field must be provided for update" }); registry.registerPath({ diff --git a/server/routers/user/acceptInvite.ts b/server/routers/user/acceptInvite.ts index 5e4264f9..30f61134 100644 --- a/server/routers/user/acceptInvite.ts +++ b/server/routers/user/acceptInvite.ts @@ -13,12 +13,10 @@ import { verifySession } from "@server/auth/sessions/verifySession"; import { usageService } from "@server/lib/billing/usageService"; import { FeatureId } from "@server/lib/billing"; -const acceptInviteBodySchema = z - .object({ +const acceptInviteBodySchema = z.strictObject({ token: z.string(), inviteId: z.string() - }) - .strict(); + }); export type AcceptInviteResponse = { accepted: boolean; diff --git a/server/routers/user/addUserAction.ts b/server/routers/user/addUserAction.ts index 074ebe9b..f75d5005 100644 --- a/server/routers/user/addUserAction.ts +++ b/server/routers/user/addUserAction.ts @@ -9,13 +9,11 @@ import logger from "@server/logger"; import { eq } from "drizzle-orm"; import { fromError } from "zod-validation-error"; -const addUserActionSchema = z - .object({ +const addUserActionSchema = z.strictObject({ userId: z.string(), actionId: z.string(), orgId: z.string() - }) - .strict(); + }); export async function addUserAction( req: Request, diff --git a/server/routers/user/addUserRole.ts b/server/routers/user/addUserRole.ts index 27f5e612..915ea64a 100644 --- a/server/routers/user/addUserRole.ts +++ b/server/routers/user/addUserRole.ts @@ -11,12 +11,10 @@ import { fromError } from "zod-validation-error"; import stoi from "@server/lib/stoi"; import { OpenAPITags, registry } from "@server/openApi"; -const addUserRoleParamsSchema = z - .object({ +const addUserRoleParamsSchema = z.strictObject({ userId: z.string(), roleId: z.string().transform(stoi).pipe(z.number()) - }) - .strict(); + }); export type AddUserRoleResponse = z.infer; diff --git a/server/routers/user/addUserSite.ts b/server/routers/user/addUserSite.ts index f094e20e..38ef264c 100644 --- a/server/routers/user/addUserSite.ts +++ b/server/routers/user/addUserSite.ts @@ -9,12 +9,10 @@ import logger from "@server/logger"; import { eq } from "drizzle-orm"; import { fromError } from "zod-validation-error"; -const addUserSiteSchema = z - .object({ +const addUserSiteSchema = z.strictObject({ userId: z.string(), - siteId: z.string().transform(Number).pipe(z.number().int().positive()) - }) - .strict(); + siteId: z.string().transform(Number).pipe(z.int().positive()) + }); export async function addUserSite( req: Request, diff --git a/server/routers/user/adminGetUser.ts b/server/routers/user/adminGetUser.ts index 0a961bec..bda14476 100644 --- a/server/routers/user/adminGetUser.ts +++ b/server/routers/user/adminGetUser.ts @@ -9,11 +9,9 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { OpenAPITags, registry } from "@server/openApi"; -const adminGetUserSchema = z - .object({ +const adminGetUserSchema = z.strictObject({ userId: z.string().min(1) - }) - .strict(); + }); registry.registerPath({ method: "get", diff --git a/server/routers/user/adminListUsers.ts b/server/routers/user/adminListUsers.ts index 308b9def..a3ad9cdd 100644 --- a/server/routers/user/adminListUsers.ts +++ b/server/routers/user/adminListUsers.ts @@ -9,22 +9,20 @@ import logger from "@server/logger"; import { idp, users } from "@server/db"; import { fromZodError } from "zod-validation-error"; -const listUsersSchema = z - .object({ +const listUsersSchema = z.strictObject({ limit: z .string() .optional() .default("1000") .transform(Number) - .pipe(z.number().int().nonnegative()), + .pipe(z.int().nonnegative()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) - }) - .strict(); + .pipe(z.int().nonnegative()) + }); async function queryUsers(limit: number, offset: number) { return await db diff --git a/server/routers/user/adminRemoveUser.ts b/server/routers/user/adminRemoveUser.ts index 14916ab9..02ad56d6 100644 --- a/server/routers/user/adminRemoveUser.ts +++ b/server/routers/user/adminRemoveUser.ts @@ -9,11 +9,9 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -const removeUserSchema = z - .object({ +const removeUserSchema = z.strictObject({ userId: z.string() - }) - .strict(); + }); export async function adminRemoveUser( req: Request, diff --git a/server/routers/user/adminUpdateUser2FA.ts b/server/routers/user/adminUpdateUser2FA.ts index becd2091..4bb2486a 100644 --- a/server/routers/user/adminUpdateUser2FA.ts +++ b/server/routers/user/adminUpdateUser2FA.ts @@ -10,17 +10,13 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -const updateUser2FAParamsSchema = z - .object({ +const updateUser2FAParamsSchema = z.strictObject({ userId: z.string() - }) - .strict(); + }); -const updateUser2FABodySchema = z - .object({ +const updateUser2FABodySchema = z.strictObject({ twoFactorSetupRequested: z.boolean() - }) - .strict(); + }); export type UpdateUser2FAResponse = { userId: string; diff --git a/server/routers/user/createOrgUser.ts b/server/routers/user/createOrgUser.ts index 29f94641..dccd0d65 100644 --- a/server/routers/user/createOrgUser.ts +++ b/server/routers/user/createOrgUser.ts @@ -16,21 +16,17 @@ import { build } from "@server/build"; import { getOrgTierData } from "#dynamic/lib/billing"; import { TierId } from "@server/lib/billing/tiers"; -const paramsSchema = z - .object({ +const paramsSchema = z.strictObject({ orgId: z.string().nonempty() - }) - .strict(); + }); -const bodySchema = z - .object({ - email: z - .string() +const bodySchema = z.strictObject({ + email: z.email() .toLowerCase() .optional() .refine((data) => { if (data) { - return z.string().email().safeParse(data).success; + return z.email().safeParse(data).success; } return true; }), @@ -39,8 +35,7 @@ const bodySchema = z type: z.enum(["internal", "oidc"]).optional(), idpId: z.number().optional(), roleId: z.number() - }) - .strict(); + }); export type CreateOrgUserResponse = {}; diff --git a/server/routers/user/getOrgUser.ts b/server/routers/user/getOrgUser.ts index 02ffd92c..4e09afd6 100644 --- a/server/routers/user/getOrgUser.ts +++ b/server/routers/user/getOrgUser.ts @@ -46,12 +46,10 @@ export type GetOrgUserResponse = NonNullable< Awaited> >; -const getOrgUserParamsSchema = z - .object({ +const getOrgUserParamsSchema = z.strictObject({ userId: z.string(), orgId: z.string() - }) - .strict(); + }); registry.registerPath({ method: "get", diff --git a/server/routers/user/inviteUser.ts b/server/routers/user/inviteUser.ts index 1cae46c9..f43ebeb8 100644 --- a/server/routers/user/inviteUser.ts +++ b/server/routers/user/inviteUser.ts @@ -21,21 +21,17 @@ import { FeatureId } from "@server/lib/billing"; import { build } from "@server/build"; import cache from "@server/lib/cache"; -const inviteUserParamsSchema = z - .object({ +const inviteUserParamsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); -const inviteUserBodySchema = z - .object({ - email: z.string().toLowerCase().email(), +const inviteUserBodySchema = z.strictObject({ + email: z.email().toLowerCase(), roleId: z.number(), validHours: z.number().gt(0).lte(168), sendEmail: z.boolean().optional(), regenerate: z.boolean().optional() - }) - .strict(); + }); export type InviteUserBody = z.infer; diff --git a/server/routers/user/listInvitations.ts b/server/routers/user/listInvitations.ts index c91a136d..a61e2372 100644 --- a/server/routers/user/listInvitations.ts +++ b/server/routers/user/listInvitations.ts @@ -10,28 +10,24 @@ import logger from "@server/logger"; import { fromZodError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -const listInvitationsParamsSchema = z - .object({ +const listInvitationsParamsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); -const listInvitationsQuerySchema = z - .object({ +const listInvitationsQuerySchema = z.strictObject({ limit: z .string() .optional() .default("1000") .transform(Number) - .pipe(z.number().int().nonnegative()), + .pipe(z.int().nonnegative()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) - }) - .strict(); + .pipe(z.int().nonnegative()) + }); async function queryInvitations(orgId: string, limit: number, offset: number) { return await db diff --git a/server/routers/user/listUsers.ts b/server/routers/user/listUsers.ts index a35da862..aa70874e 100644 --- a/server/routers/user/listUsers.ts +++ b/server/routers/user/listUsers.ts @@ -11,28 +11,24 @@ import { fromZodError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; import { eq } from "drizzle-orm"; -const listUsersParamsSchema = z - .object({ +const listUsersParamsSchema = z.strictObject({ orgId: z.string() - }) - .strict(); + }); -const listUsersSchema = z - .object({ +const listUsersSchema = z.strictObject({ limit: z .string() .optional() .default("1000") .transform(Number) - .pipe(z.number().int().nonnegative()), + .pipe(z.int().nonnegative()), offset: z .string() .optional() .default("0") .transform(Number) - .pipe(z.number().int().nonnegative()) - }) - .strict(); + .pipe(z.int().nonnegative()) + }); async function queryUsers(orgId: string, limit: number, offset: number) { return await db diff --git a/server/routers/user/removeInvitation.ts b/server/routers/user/removeInvitation.ts index e3ee40d0..44ec8c23 100644 --- a/server/routers/user/removeInvitation.ts +++ b/server/routers/user/removeInvitation.ts @@ -9,12 +9,10 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -const removeInvitationParamsSchema = z - .object({ +const removeInvitationParamsSchema = z.strictObject({ orgId: z.string(), inviteId: z.string() - }) - .strict(); + }); export async function removeInvitation( req: Request, diff --git a/server/routers/user/removeUserAction.ts b/server/routers/user/removeUserAction.ts index f0bd7d92..6e4c1a66 100644 --- a/server/routers/user/removeUserAction.ts +++ b/server/routers/user/removeUserAction.ts @@ -9,18 +9,14 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -const removeUserActionParamsSchema = z - .object({ +const removeUserActionParamsSchema = z.strictObject({ userId: z.string() - }) - .strict(); + }); -const removeUserActionSchema = z - .object({ +const removeUserActionSchema = z.strictObject({ actionId: z.string(), orgId: z.string() - }) - .strict(); + }); export async function removeUserAction( req: Request, diff --git a/server/routers/user/removeUserOrg.ts b/server/routers/user/removeUserOrg.ts index babccdd0..83ff6802 100644 --- a/server/routers/user/removeUserOrg.ts +++ b/server/routers/user/removeUserOrg.ts @@ -14,12 +14,10 @@ import { FeatureId } from "@server/lib/billing"; import { build } from "@server/build"; import { UserType } from "@server/types/UserTypes"; -const removeUserSchema = z - .object({ +const removeUserSchema = z.strictObject({ userId: z.string(), orgId: z.string() - }) - .strict(); + }); registry.registerPath({ method: "delete", diff --git a/server/routers/user/removeUserResource.ts b/server/routers/user/removeUserResource.ts index 186e8032..14dbb540 100644 --- a/server/routers/user/removeUserResource.ts +++ b/server/routers/user/removeUserResource.ts @@ -9,15 +9,13 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -const removeUserResourceSchema = z - .object({ +const removeUserResourceSchema = z.strictObject({ userId: z.string(), resourceId: z .string() .transform(Number) - .pipe(z.number().int().positive()) - }) - .strict(); + .pipe(z.int().positive()) + }); export async function removeUserResource( req: Request, diff --git a/server/routers/user/removeUserSite.ts b/server/routers/user/removeUserSite.ts index 7dbb4a15..6ed2288a 100644 --- a/server/routers/user/removeUserSite.ts +++ b/server/routers/user/removeUserSite.ts @@ -9,17 +9,13 @@ import createHttpError from "http-errors"; import logger from "@server/logger"; import { fromError } from "zod-validation-error"; -const removeUserSiteParamsSchema = z - .object({ +const removeUserSiteParamsSchema = z.strictObject({ userId: z.string() - }) - .strict(); + }); -const removeUserSiteSchema = z - .object({ - siteId: z.number().int().positive() - }) - .strict(); +const removeUserSiteSchema = z.strictObject({ + siteId: z.int().positive() + }); export async function removeUserSite( req: Request, diff --git a/server/routers/user/updateOrgUser.ts b/server/routers/user/updateOrgUser.ts index fb00b59f..e1000063 100644 --- a/server/routers/user/updateOrgUser.ts +++ b/server/routers/user/updateOrgUser.ts @@ -9,20 +9,16 @@ import logger from "@server/logger"; import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; -const paramsSchema = z - .object({ +const paramsSchema = z.strictObject({ userId: z.string(), orgId: z.string() - }) - .strict(); + }); -const bodySchema = z - .object({ +const bodySchema = z.strictObject({ autoProvisioned: z.boolean().optional() }) - .strict() .refine((data) => Object.keys(data).length > 0, { - message: "At least one field must be provided for update" + error: "At least one field must be provided for update" }); registry.registerPath({ diff --git a/src/app/[orgId]/settings/(private)/idp/[idpId]/general/page.tsx b/src/app/[orgId]/settings/(private)/idp/[idpId]/general/page.tsx index 1d0a682f..73c6a3cf 100644 --- a/src/app/[orgId]/settings/(private)/idp/[idpId]/general/page.tsx +++ b/src/app/[orgId]/settings/(private)/idp/[idpId]/general/page.tsx @@ -76,8 +76,8 @@ export default function GeneralPage() { .min(1, { message: t("idpClientSecretRequired") }), roleMapping: z.string().nullable().optional(), roleId: z.number().nullable().optional(), - authUrl: z.string().url({ message: t("idpErrorAuthUrlInvalid") }), - tokenUrl: z.string().url({ message: t("idpErrorTokenUrlInvalid") }), + authUrl: z.url({ message: t("idpErrorAuthUrlInvalid") }), + tokenUrl: z.url({ message: t("idpErrorTokenUrlInvalid") }), identifierPath: z.string().min(1, { message: t("idpPathRequired") }), emailPath: z.string().nullable().optional(), namePath: z.string().nullable().optional(), diff --git a/src/app/[orgId]/settings/(private)/idp/create/page.tsx b/src/app/[orgId]/settings/(private)/idp/create/page.tsx index ba580ca0..8667abda 100644 --- a/src/app/[orgId]/settings/(private)/idp/create/page.tsx +++ b/src/app/[orgId]/settings/(private)/idp/create/page.tsx @@ -64,13 +64,9 @@ export default function Page() { clientSecret: z .string() .min(1, { message: t("idpClientSecretRequired") }), - authUrl: z - .string() - .url({ message: t("idpErrorAuthUrlInvalid") }) + authUrl: z.url({ message: t("idpErrorAuthUrlInvalid") }) .optional(), - tokenUrl: z - .string() - .url({ message: t("idpErrorTokenUrlInvalid") }) + tokenUrl: z.url({ message: t("idpErrorTokenUrlInvalid") }) .optional(), identifierPath: z .string() diff --git a/src/app/[orgId]/settings/access/users/create/page.tsx b/src/app/[orgId]/settings/access/users/create/page.tsx index d789b2e2..9417282d 100644 --- a/src/app/[orgId]/settings/access/users/create/page.tsx +++ b/src/app/[orgId]/settings/access/users/create/page.tsx @@ -91,7 +91,7 @@ export default function Page() { const [dataLoaded, setDataLoaded] = useState(false); const internalFormSchema = z.object({ - email: z.string().email({ message: t("emailInvalid") }), + email: z.email({ message: t("emailInvalid") }), validForHours: z .string() .min(1, { message: t("inviteValidityDuration") }), @@ -99,16 +99,14 @@ export default function Page() { }); const googleAzureFormSchema = z.object({ - email: z.string().email({ message: t("emailInvalid") }), + email: z.email({ message: t("emailInvalid") }), name: z.string().optional(), roleId: z.string().min(1, { message: t("accessRoleSelectPlease") }) }); const genericOidcFormSchema = z.object({ username: z.string().min(1, { message: t("usernameRequired") }), - email: z - .string() - .email({ message: t("emailInvalid") }) + email: z.email({ message: t("emailInvalid") }) .optional() .or(z.literal("")), name: z.string().optional(), diff --git a/src/app/[orgId]/settings/clients/create/page.tsx b/src/app/[orgId]/settings/clients/create/page.tsx index b7194526..0f44d79c 100644 --- a/src/app/[orgId]/settings/clients/create/page.tsx +++ b/src/app/[orgId]/settings/clients/create/page.tsx @@ -103,7 +103,7 @@ export default function Page() { .refine((val) => val.length > 0, { message: t("siteRequired") }), - subnet: z.string().ip().min(1, { + subnet: z.union([z.ipv4(), z.ipv6()]).min(1, { message: t("subnetRequired") }) }); diff --git a/src/app/[orgId]/settings/resources/[niceId]/authentication/page.tsx b/src/app/[orgId]/settings/resources/[niceId]/authentication/page.tsx index 56c989c3..fe5f0ca2 100644 --- a/src/app/[orgId]/settings/resources/[niceId]/authentication/page.tsx +++ b/src/app/[orgId]/settings/resources/[niceId]/authentication/page.tsx @@ -921,9 +921,7 @@ export default function ResourceAuthenticationPage() { validateTag={( tag ) => { - return z - .string() - .email() + return z.email() .or( z .string() diff --git a/src/app/[orgId]/settings/resources/[niceId]/general/page.tsx b/src/app/[orgId]/settings/resources/[niceId]/general/page.tsx index 50155b3e..1e1ff56b 100644 --- a/src/app/[orgId]/settings/resources/[niceId]/general/page.tsx +++ b/src/app/[orgId]/settings/resources/[niceId]/general/page.tsx @@ -104,7 +104,7 @@ export default function GeneralForm() { name: z.string().min(1).max(255), niceId: z.string().min(1).max(255).optional(), domainId: z.string().optional(), - proxyPort: z.number().int().min(1).max(65535).optional(), + proxyPort: z.int().min(1).max(65535).optional(), // enableProxy: z.boolean().optional() }) .refine( diff --git a/src/app/[orgId]/settings/resources/[niceId]/proxy/page.tsx b/src/app/[orgId]/settings/resources/[niceId]/proxy/page.tsx index 461d3f1c..2e409cf0 100644 --- a/src/app/[orgId]/settings/resources/[niceId]/proxy/page.tsx +++ b/src/app/[orgId]/settings/resources/[niceId]/proxy/page.tsx @@ -123,10 +123,10 @@ const addTargetSchema = z ip: z.string().refine(isTargetValid), method: z.string().nullable(), port: z.coerce.number().int().positive(), - siteId: z - .number() - .int() - .positive({ message: "You must select a site for a target." }), + siteId: z.int() + .positive({ + error: "You must select a site for a target." + }), path: z.string().optional().nullable(), pathMatchType: z .enum(["exact", "prefix", "regex"]) @@ -137,7 +137,7 @@ const addTargetSchema = z .enum(["exact", "prefix", "regex", "stripPrefix"]) .optional() .nullable(), - priority: z.number().int().min(1).max(1000).optional() + priority: z.int().min(1).max(1000).optional() }) .refine( (data) => { @@ -169,7 +169,7 @@ const addTargetSchema = z return true; }, { - message: "Invalid path configuration" + error: "Invalid path configuration" } ) .refine( @@ -185,7 +185,7 @@ const addTargetSchema = z return true; }, { - message: "Invalid rewrite path configuration" + error: "Invalid rewrite path configuration" } ); @@ -292,7 +292,7 @@ export default function ReverseProxyTargets(props: { .array(z.object({ name: z.string(), value: z.string() })) .nullable(), proxyProtocol: z.boolean().optional(), - proxyProtocolVersion: z.number().int().min(1).max(2).optional() + proxyProtocolVersion: z.int().min(1).max(2).optional() }); const tlsSettingsSchema = z.object({ diff --git a/src/app/[orgId]/settings/resources/[niceId]/rules/page.tsx b/src/app/[orgId]/settings/resources/[niceId]/rules/page.tsx index dada372f..0c011d94 100644 --- a/src/app/[orgId]/settings/resources/[niceId]/rules/page.tsx +++ b/src/app/[orgId]/settings/resources/[niceId]/rules/page.tsx @@ -440,9 +440,7 @@ export default function ResourceRules(props: { type="number" onClick={(e) => e.currentTarget.focus()} onBlur={(e) => { - const parsed = z.coerce - .number() - .int() + const parsed = z.int() .optional() .safeParse(e.target.value); diff --git a/src/app/[orgId]/settings/resources/create/page.tsx b/src/app/[orgId]/settings/resources/create/page.tsx index ae5e452d..a4269a9f 100644 --- a/src/app/[orgId]/settings/resources/create/page.tsx +++ b/src/app/[orgId]/settings/resources/create/page.tsx @@ -128,7 +128,7 @@ const httpResourceFormSchema = z.object({ const tcpUdpResourceFormSchema = z.object({ protocol: z.string(), - proxyPort: z.number().int().min(1).max(65535) + proxyPort: z.int().min(1).max(65535) // enableProxy: z.boolean().default(false) }); @@ -137,7 +137,7 @@ const addTargetSchema = z ip: z.string().refine(isTargetValid), method: z.string().nullable(), port: z.coerce.number().int().positive(), - siteId: z.number().int().positive(), + siteId: z.int().positive(), path: z.string().optional().nullable(), pathMatchType: z .enum(["exact", "prefix", "regex"]) @@ -148,7 +148,7 @@ const addTargetSchema = z .enum(["exact", "prefix", "regex", "stripPrefix"]) .optional() .nullable(), - priority: z.number().int().min(1).max(1000).optional() + priority: z.int().min(1).max(1000).optional() }) .refine( (data) => { @@ -180,7 +180,7 @@ const addTargetSchema = z return true; }, { - message: "Invalid path configuration" + error: "Invalid path configuration" } ) .refine( @@ -196,7 +196,7 @@ const addTargetSchema = z return true; }, { - message: "Invalid rewrite path configuration" + error: "Invalid rewrite path configuration" } ); diff --git a/src/app/admin/idp/[idpId]/general/page.tsx b/src/app/admin/idp/[idpId]/general/page.tsx index 6274cda5..7eae6950 100644 --- a/src/app/admin/idp/[idpId]/general/page.tsx +++ b/src/app/admin/idp/[idpId]/general/page.tsx @@ -61,8 +61,8 @@ export default function GeneralPage() { name: z.string().min(2, { message: t('nameMin', {len: 2}) }), clientId: z.string().min(1, { message: t('idpClientIdRequired') }), clientSecret: z.string().min(1, { message: t('idpClientSecretRequired') }), - authUrl: z.string().url({ message: t('idpErrorAuthUrlInvalid') }), - tokenUrl: z.string().url({ message: t('idpErrorTokenUrlInvalid') }), + authUrl: z.url({ message: t('idpErrorAuthUrlInvalid') }), + tokenUrl: z.url({ message: t('idpErrorTokenUrlInvalid') }), identifierPath: z .string() .min(1, { message: t('idpPathRequired') }), diff --git a/src/app/admin/idp/create/page.tsx b/src/app/admin/idp/create/page.tsx index cd3682de..73d605a1 100644 --- a/src/app/admin/idp/create/page.tsx +++ b/src/app/admin/idp/create/page.tsx @@ -52,8 +52,8 @@ export default function Page() { type: z.enum(["oidc"]), clientId: z.string().min(1, { message: t('idpClientIdRequired') }), clientSecret: z.string().min(1, { message: t('idpClientSecretRequired') }), - authUrl: z.string().url({ message: t('idpErrorAuthUrlInvalid') }), - tokenUrl: z.string().url({ message: t('idpErrorTokenUrlInvalid') }), + authUrl: z.url({ message: t('idpErrorAuthUrlInvalid') }), + tokenUrl: z.url({ message: t('idpErrorTokenUrlInvalid') }), identifierPath: z .string() .min(1, { message: t('idpPathRequired') }), diff --git a/src/app/auth/reset-password/ResetPasswordForm.tsx b/src/app/auth/reset-password/ResetPasswordForm.tsx index 14199493..986c52e4 100644 --- a/src/app/auth/reset-password/ResetPasswordForm.tsx +++ b/src/app/auth/reset-password/ResetPasswordForm.tsx @@ -47,7 +47,7 @@ import { cleanRedirect } from "@app/lib/cleanRedirect"; import { useTranslations } from "next-intl"; const requestSchema = z.object({ - email: z.string().email() + email: z.email() }); export type ResetPasswordFormProps = { @@ -88,7 +88,7 @@ export default function ResetPasswordForm({ const formSchema = z .object({ - email: z.string().email({ message: t('emailInvalid') }), + email: z.email({ message: t('emailInvalid') }), token: z.string().min(8, { message: t('tokenInvalid') }), password: passwordSchema, confirmPassword: passwordSchema diff --git a/src/components/CreateInternalResourceDialog.tsx b/src/components/CreateInternalResourceDialog.tsx index 63dfc11d..68c62ff7 100644 --- a/src/components/CreateInternalResourceDialog.tsx +++ b/src/components/CreateInternalResourceDialog.tsx @@ -79,18 +79,14 @@ export default function CreateInternalResourceDialog({ .string() .min(1, t("createInternalResourceDialogNameRequired")) .max(255, t("createInternalResourceDialogNameMaxLength")), - siteId: z.number().int().positive(t("createInternalResourceDialogPleaseSelectSite")), + siteId: z.int().positive(t("createInternalResourceDialogPleaseSelectSite")), protocol: z.enum(["tcp", "udp"]), - proxyPort: z - .number() - .int() + proxyPort: z.int() .positive() .min(1, t("createInternalResourceDialogProxyPortMin")) .max(65535, t("createInternalResourceDialogProxyPortMax")), destinationIp: z.string(), - destinationPort: z - .number() - .int() + destinationPort: z.int() .positive() .min(1, t("createInternalResourceDialogDestinationPortMin")) .max(65535, t("createInternalResourceDialogDestinationPortMax")) diff --git a/src/components/EditInternalResourceDialog.tsx b/src/components/EditInternalResourceDialog.tsx index d09f0b6c..629da6a8 100644 --- a/src/components/EditInternalResourceDialog.tsx +++ b/src/components/EditInternalResourceDialog.tsx @@ -72,9 +72,9 @@ export default function EditInternalResourceDialog({ const formSchema = z.object({ name: z.string().min(1, t("editInternalResourceDialogNameRequired")).max(255, t("editInternalResourceDialogNameMaxLength")), protocol: z.enum(["tcp", "udp"]), - proxyPort: z.number().int().positive().min(1, t("editInternalResourceDialogProxyPortMin")).max(65535, t("editInternalResourceDialogProxyPortMax")), + proxyPort: z.int().positive().min(1, t("editInternalResourceDialogProxyPortMin")).max(65535, t("editInternalResourceDialogProxyPortMax")), destinationIp: z.string(), - destinationPort: z.number().int().positive().min(1, t("editInternalResourceDialogDestinationPortMin")).max(65535, t("editInternalResourceDialogDestinationPortMax")) + destinationPort: z.int().positive().min(1, t("editInternalResourceDialogDestinationPortMin")).max(65535, t("editInternalResourceDialogDestinationPortMax")) }); type FormData = z.infer; diff --git a/src/components/GenerateLicenseKeyForm.tsx b/src/components/GenerateLicenseKeyForm.tsx index 7dfd34ee..6a8d402f 100644 --- a/src/components/GenerateLicenseKeyForm.tsx +++ b/src/components/GenerateLicenseKeyForm.tsx @@ -63,7 +63,7 @@ export default function GenerateLicenseKeyForm({ // Personal form schema const personalFormSchema = z.object({ - email: z.string().email(), + email: z.email(), firstName: z.string().min(1), lastName: z.string().min(1), primaryUse: z.string().min(1), @@ -75,7 +75,7 @@ export default function GenerateLicenseKeyForm({ // Business form schema const businessFormSchema = z.object({ - email: z.string().email(), + email: z.email(), firstName: z.string().min(1), lastName: z.string().min(1), jobTitle: z.string().min(1), diff --git a/src/components/HealthCheckDialog.tsx b/src/components/HealthCheckDialog.tsx index 6fa36a5b..be5e5d45 100644 --- a/src/components/HealthCheckDialog.tsx +++ b/src/components/HealthCheckDialog.tsx @@ -80,24 +80,20 @@ export default function HealthCheckDialog({ hcMethod: z .string() .min(1, { message: t("healthCheckMethodRequired") }), - hcInterval: z - .number() - .int() + hcInterval: z.int() .positive() .min(5, { message: t("healthCheckIntervalMin") }), - hcTimeout: z - .number() - .int() + hcTimeout: z.int() .positive() .min(1, { message: t("healthCheckTimeoutMin") }), - hcStatus: z.number().int().positive().min(100).optional().nullable(), + hcStatus: z.int().positive().min(100).optional().nullable(), hcHeaders: z.array(z.object({ name: z.string(), value: z.string() })).nullable().optional(), hcScheme: z.string().optional(), hcHostname: z.string(), hcPort: z.number().positive().gt(0).lte(65535), hcFollowRedirects: z.boolean(), hcMode: z.string(), - hcUnhealthyInterval: z.number().int().positive().min(5) + hcUnhealthyInterval: z.int().positive().min(5) }); const form = useForm>({ diff --git a/src/components/IdpCreateWizard.tsx b/src/components/IdpCreateWizard.tsx index 937bd309..58093e6c 100644 --- a/src/components/IdpCreateWizard.tsx +++ b/src/components/IdpCreateWizard.tsx @@ -59,8 +59,8 @@ export function IdpCreateWizard({ onSubmit, defaultValues, loading = false }: Id type: z.enum(["oidc"]), clientId: z.string().min(1, { message: t('idpClientIdRequired') }), clientSecret: z.string().min(1, { message: t('idpClientSecretRequired') }), - authUrl: z.string().url({ message: t('idpErrorAuthUrlInvalid') }), - tokenUrl: z.string().url({ message: t('idpErrorTokenUrlInvalid') }), + authUrl: z.url({ message: t('idpErrorAuthUrlInvalid') }), + tokenUrl: z.url({ message: t('idpErrorTokenUrlInvalid') }), identifierPath: z .string() .min(1, { message: t('idpPathRequired') }), diff --git a/src/components/ResetPasswordForm.tsx b/src/components/ResetPasswordForm.tsx index e3e677b0..570a87ec 100644 --- a/src/components/ResetPasswordForm.tsx +++ b/src/components/ResetPasswordForm.tsx @@ -47,7 +47,7 @@ import { cleanRedirect } from "@app/lib/cleanRedirect"; import { useTranslations } from "next-intl"; const requestSchema = z.object({ - email: z.string().email() + email: z.email() }); export type ResetPasswordFormProps = { @@ -88,7 +88,7 @@ export default function ResetPasswordForm({ const formSchema = z .object({ - email: z.string().email({ message: t('emailInvalid') }), + email: z.email({ message: t('emailInvalid') }), token: z.string().min(8, { message: t('tokenInvalid') }), password: passwordSchema, confirmPassword: passwordSchema diff --git a/src/components/SupporterStatus.tsx b/src/components/SupporterStatus.tsx index 5a1a10bc..baa3721c 100644 --- a/src/components/SupporterStatus.tsx +++ b/src/components/SupporterStatus.tsx @@ -74,8 +74,12 @@ export default function SupporterStatus({ isCollapsed = false }: SupporterStatus const formSchema = z.object({ githubUsername: z .string() - .nonempty({ message: "GitHub username is required" }), - key: z.string().nonempty({ message: "Supporter key is required" }) + .nonempty({ + error: "GitHub username is required" + }), + key: z.string().nonempty({ + error: "Supporter key is required" + }) }); const form = useForm({ diff --git a/src/components/VerifyEmailForm.tsx b/src/components/VerifyEmailForm.tsx index 052ec359..39c07439 100644 --- a/src/components/VerifyEmailForm.tsx +++ b/src/components/VerifyEmailForm.tsx @@ -74,7 +74,7 @@ export default function VerifyEmailForm({ } const FormSchema = z.object({ - email: z.string().email({ message: t("emailInvalid") }), + email: z.email({ message: t("emailInvalid") }), pin: z.string().min(8, { message: t("verificationCodeLengthRequirements") }) From 58cf471bc46e4cd5cfb32d26348c2efad5613995 Mon Sep 17 00:00:00 2001 From: Lokowitz Date: Sun, 16 Nov 2025 14:29:19 +0000 Subject: [PATCH 13/29] fix z.coerce.number --- server/lib/validators.ts | 4 ++-- server/private/routers/loginPage/deleteLoginPage.ts | 2 +- server/private/routers/loginPage/loadLoginPage.ts | 4 ++-- server/private/routers/loginPage/updateLoginPage.ts | 2 +- server/private/routers/orgIdp/deleteOrgIdp.ts | 2 +- server/private/routers/orgIdp/getOrgIdp.ts | 2 +- server/private/routers/orgIdp/updateOrgOidcIdp.ts | 2 +- server/routers/idp/createIdpOrgPolicy.ts | 2 +- server/routers/idp/deleteIdp.ts | 2 +- server/routers/idp/deleteIdpOrgPolicy.ts | 2 +- server/routers/idp/generateOidcUrl.ts | 2 +- server/routers/idp/getIdp.ts | 2 +- server/routers/idp/listIdpOrgPolicies.ts | 2 +- server/routers/idp/updateIdpOrgPolicy.ts | 2 +- server/routers/idp/updateOidcIdp.ts | 2 +- server/routers/idp/validateOidcCallback.ts | 4 ++-- src/app/[orgId]/settings/resources/[niceId]/proxy/page.tsx | 2 +- src/app/[orgId]/settings/resources/[niceId]/rules/page.tsx | 2 +- src/app/[orgId]/settings/resources/create/page.tsx | 2 +- src/components/CreateShareLinkForm.tsx | 2 +- src/components/GenerateLicenseKeyForm.tsx | 4 ++-- 21 files changed, 25 insertions(+), 25 deletions(-) diff --git a/server/lib/validators.ts b/server/lib/validators.ts index db6ff26b..5bdd7a14 100644 --- a/server/lib/validators.ts +++ b/server/lib/validators.ts @@ -2,11 +2,11 @@ import z from "zod"; import ipaddr from "ipaddr.js"; export function isValidCIDR(cidr: string): boolean { - return z.string().cidr().safeParse(cidr).success; + return z.cidrv4().safeParse(cidr).success || z.cidrv6().safeParse(cidr).success; } export function isValidIP(ip: string): boolean { - return z.string().ip().safeParse(ip).success; + return z.ipv4().safeParse(ip).success || z.ipv6().safeParse(ip).success; } export function isValidUrlGlobPattern(pattern: string): boolean { diff --git a/server/private/routers/loginPage/deleteLoginPage.ts b/server/private/routers/loginPage/deleteLoginPage.ts index bf7941e7..5271ebd8 100644 --- a/server/private/routers/loginPage/deleteLoginPage.ts +++ b/server/private/routers/loginPage/deleteLoginPage.ts @@ -25,7 +25,7 @@ import { DeleteLoginPageResponse } from "@server/routers/loginPage/types"; const paramsSchema = z .object({ orgId: z.string(), - loginPageId: z.coerce.number() + loginPageId: z.coerce.number() }) .strict(); diff --git a/server/private/routers/loginPage/loadLoginPage.ts b/server/private/routers/loginPage/loadLoginPage.ts index 06038201..1b10e205 100644 --- a/server/private/routers/loginPage/loadLoginPage.ts +++ b/server/private/routers/loginPage/loadLoginPage.ts @@ -23,8 +23,8 @@ import { fromError } from "zod-validation-error"; import { LoadLoginPageResponse } from "@server/routers/loginPage/types"; const querySchema = z.object({ - resourceId: z.coerce.number().int().positive().optional(), - idpId: z.coerce.number().int().positive().optional(), + resourceId: z.coerce.number().int().positive().optional(), + idpId: z.coerce.number().int().positive().optional(), orgId: z.string().min(1).optional(), fullDomain: z.string().min(1) }); diff --git a/server/private/routers/loginPage/updateLoginPage.ts b/server/private/routers/loginPage/updateLoginPage.ts index 8a8e8ab0..0d02b124 100644 --- a/server/private/routers/loginPage/updateLoginPage.ts +++ b/server/private/routers/loginPage/updateLoginPage.ts @@ -31,7 +31,7 @@ import { UpdateLoginPageResponse } from "@server/routers/loginPage/types"; const paramsSchema = z .object({ orgId: z.string(), - loginPageId: z.coerce.number() + loginPageId: z.coerce.number() }) .strict(); diff --git a/server/private/routers/orgIdp/deleteOrgIdp.ts b/server/private/routers/orgIdp/deleteOrgIdp.ts index 711d1ce3..ca0112b2 100644 --- a/server/private/routers/orgIdp/deleteOrgIdp.ts +++ b/server/private/routers/orgIdp/deleteOrgIdp.ts @@ -26,7 +26,7 @@ import { OpenAPITags, registry } from "@server/openApi"; const paramsSchema = z .object({ orgId: z.string().optional(), // Optional; used with org idp in saas - idpId: z.coerce.number() + idpId: z.coerce.number() }) .strict(); diff --git a/server/private/routers/orgIdp/getOrgIdp.ts b/server/private/routers/orgIdp/getOrgIdp.ts index 0e6689fc..3ba85412 100644 --- a/server/private/routers/orgIdp/getOrgIdp.ts +++ b/server/private/routers/orgIdp/getOrgIdp.ts @@ -30,7 +30,7 @@ import { GetOrgIdpResponse } from "@server/routers/orgIdp/types"; const paramsSchema = z .object({ orgId: z.string().nonempty(), - idpId: z.coerce.number() + idpId: z.coerce.number() }) .strict(); diff --git a/server/private/routers/orgIdp/updateOrgOidcIdp.ts b/server/private/routers/orgIdp/updateOrgOidcIdp.ts index f3e76054..3826f6b3 100644 --- a/server/private/routers/orgIdp/updateOrgOidcIdp.ts +++ b/server/private/routers/orgIdp/updateOrgOidcIdp.ts @@ -31,7 +31,7 @@ import { TierId } from "@server/lib/billing/tiers"; const paramsSchema = z .object({ orgId: z.string().nonempty(), - idpId: z.coerce.number() + idpId: z.coerce.number() }) .strict(); diff --git a/server/routers/idp/createIdpOrgPolicy.ts b/server/routers/idp/createIdpOrgPolicy.ts index b59d2fc7..b8c947b0 100644 --- a/server/routers/idp/createIdpOrgPolicy.ts +++ b/server/routers/idp/createIdpOrgPolicy.ts @@ -12,7 +12,7 @@ import { eq, and } from "drizzle-orm"; import { idp, idpOrg } from "@server/db"; const paramsSchema = z.strictObject({ - idpId: z.coerce.number(), + idpId: z.coerce.number(), orgId: z.string() }); diff --git a/server/routers/idp/deleteIdp.ts b/server/routers/idp/deleteIdp.ts index 58b231b7..56c0ca98 100644 --- a/server/routers/idp/deleteIdp.ts +++ b/server/routers/idp/deleteIdp.ts @@ -13,7 +13,7 @@ import { OpenAPITags, registry } from "@server/openApi"; const paramsSchema = z .object({ orgId: z.string().optional(), // Optional; used with org idp in saas - idpId: z.coerce.number() + idpId: z.coerce.number() }) .strict(); diff --git a/server/routers/idp/deleteIdpOrgPolicy.ts b/server/routers/idp/deleteIdpOrgPolicy.ts index 424bae4f..c5f18282 100644 --- a/server/routers/idp/deleteIdpOrgPolicy.ts +++ b/server/routers/idp/deleteIdpOrgPolicy.ts @@ -11,7 +11,7 @@ import { eq, and } from "drizzle-orm"; import { OpenAPITags, registry } from "@server/openApi"; const paramsSchema = z.strictObject({ - idpId: z.coerce.number(), + idpId: z.coerce.number(), orgId: z.string() }); diff --git a/server/routers/idp/generateOidcUrl.ts b/server/routers/idp/generateOidcUrl.ts index d99f61ba..2db8783f 100644 --- a/server/routers/idp/generateOidcUrl.ts +++ b/server/routers/idp/generateOidcUrl.ts @@ -19,7 +19,7 @@ import { TierId } from "@server/lib/billing/tiers"; const paramsSchema = z .object({ - idpId: z.coerce.number() + idpId: z.coerce.number() }) .strict(); diff --git a/server/routers/idp/getIdp.ts b/server/routers/idp/getIdp.ts index a202f4ea..e8651c84 100644 --- a/server/routers/idp/getIdp.ts +++ b/server/routers/idp/getIdp.ts @@ -14,7 +14,7 @@ import { decrypt } from "@server/lib/crypto"; const paramsSchema = z .object({ - idpId: z.coerce.number() + idpId: z.coerce.number() }) .strict(); diff --git a/server/routers/idp/listIdpOrgPolicies.ts b/server/routers/idp/listIdpOrgPolicies.ts index 481cddad..087b52f8 100644 --- a/server/routers/idp/listIdpOrgPolicies.ts +++ b/server/routers/idp/listIdpOrgPolicies.ts @@ -11,7 +11,7 @@ import { fromError } from "zod-validation-error"; import { OpenAPITags, registry } from "@server/openApi"; const paramsSchema = z.object({ - idpId: z.coerce.number() + idpId: z.coerce.number() }); const querySchema = z.strictObject({ diff --git a/server/routers/idp/updateIdpOrgPolicy.ts b/server/routers/idp/updateIdpOrgPolicy.ts index 586af476..82d3b5f2 100644 --- a/server/routers/idp/updateIdpOrgPolicy.ts +++ b/server/routers/idp/updateIdpOrgPolicy.ts @@ -11,7 +11,7 @@ import { eq, and } from "drizzle-orm"; import { idp, idpOrg } from "@server/db"; const paramsSchema = z.strictObject({ - idpId: z.coerce.number(), + idpId: z.coerce.number(), orgId: z.string() }); diff --git a/server/routers/idp/updateOidcIdp.ts b/server/routers/idp/updateOidcIdp.ts index c7ba0b0b..1dbdd00a 100644 --- a/server/routers/idp/updateOidcIdp.ts +++ b/server/routers/idp/updateOidcIdp.ts @@ -14,7 +14,7 @@ import config from "@server/lib/config"; const paramsSchema = z .object({ - idpId: z.coerce.number() + idpId: z.coerce.number() }) .strict(); diff --git a/server/routers/idp/validateOidcCallback.ts b/server/routers/idp/validateOidcCallback.ts index 7d1da1c5..e248f844 100644 --- a/server/routers/idp/validateOidcCallback.ts +++ b/server/routers/idp/validateOidcCallback.ts @@ -40,7 +40,7 @@ const ensureTrailingSlash = (url: string): string => { const paramsSchema = z .object({ - idpId: z.coerce.number() + idpId: z.coerce.number() }) .strict(); @@ -51,7 +51,7 @@ const bodySchema = z.object({ }); const querySchema = z.object({ - loginPageId: z.coerce.number().optional() + loginPageId: z.coerce.number().optional() }); export type ValidateOidcUrlCallbackResponse = { diff --git a/src/app/[orgId]/settings/resources/[niceId]/proxy/page.tsx b/src/app/[orgId]/settings/resources/[niceId]/proxy/page.tsx index 2e409cf0..f7a5a559 100644 --- a/src/app/[orgId]/settings/resources/[niceId]/proxy/page.tsx +++ b/src/app/[orgId]/settings/resources/[niceId]/proxy/page.tsx @@ -122,7 +122,7 @@ const addTargetSchema = z .object({ ip: z.string().refine(isTargetValid), method: z.string().nullable(), - port: z.coerce.number().int().positive(), + port: z.coerce.number().int().positive(), siteId: z.int() .positive({ error: "You must select a site for a target." diff --git a/src/app/[orgId]/settings/resources/[niceId]/rules/page.tsx b/src/app/[orgId]/settings/resources/[niceId]/rules/page.tsx index 0c011d94..9bcea073 100644 --- a/src/app/[orgId]/settings/resources/[niceId]/rules/page.tsx +++ b/src/app/[orgId]/settings/resources/[niceId]/rules/page.tsx @@ -93,7 +93,7 @@ const addRuleSchema = z.object({ action: z.enum(["ACCEPT", "DROP", "PASS"]), match: z.string(), value: z.string(), - priority: z.coerce.number().int().optional() + priority: z.coerce.number().int().optional() }); type LocalRule = ArrayElement & { diff --git a/src/app/[orgId]/settings/resources/create/page.tsx b/src/app/[orgId]/settings/resources/create/page.tsx index a4269a9f..c3655239 100644 --- a/src/app/[orgId]/settings/resources/create/page.tsx +++ b/src/app/[orgId]/settings/resources/create/page.tsx @@ -136,7 +136,7 @@ const addTargetSchema = z .object({ ip: z.string().refine(isTargetValid), method: z.string().nullable(), - port: z.coerce.number().int().positive(), + port: z.coerce.number().int().positive(), siteId: z.int().positive(), path: z.string().optional().nullable(), pathMatchType: z diff --git a/src/components/CreateShareLinkForm.tsx b/src/components/CreateShareLinkForm.tsx index 51cc52ab..3cc203f3 100644 --- a/src/components/CreateShareLinkForm.tsx +++ b/src/components/CreateShareLinkForm.tsx @@ -108,7 +108,7 @@ export default function CreateShareLinkForm({ resourceName: z.string(), resourceUrl: z.string(), timeUnit: z.string(), - timeValue: z.coerce.number().int().positive().min(1), + timeValue: z.coerce.number().int().positive().min(1), title: z.string().optional() }); diff --git a/src/components/GenerateLicenseKeyForm.tsx b/src/components/GenerateLicenseKeyForm.tsx index 6a8d402f..6a380082 100644 --- a/src/components/GenerateLicenseKeyForm.tsx +++ b/src/components/GenerateLicenseKeyForm.tsx @@ -81,8 +81,8 @@ export default function GenerateLicenseKeyForm({ jobTitle: z.string().min(1), primaryUse: z.string().min(1), industry: z.string().min(1), - prospectiveUsers: z.coerce.number().optional(), - prospectiveSites: z.coerce.number().optional(), + prospectiveUsers: z.coerce.number().optional(), + prospectiveSites: z.coerce.number().optional(), companyName: z.string().min(1), countryOfResidence: z.string().min(1), stateProvinceRegion: z.string().min(1), From 5d2f65daa920898f38d3ffe72f32fa0a85c1b3f7 Mon Sep 17 00:00:00 2001 From: Lokowitz Date: Mon, 17 Nov 2025 13:23:30 +0000 Subject: [PATCH 14/29] fix for zod --- Makefile | 5 +- server/lib/blueprints/types.ts | 130 +++++------------- .../routers/auditLogs/queryAccessAuditLog.ts | 2 +- .../routers/auditLogs/queryActionAuditLog.ts | 2 +- .../routers/auditLogs/queryRequstAuditLog.ts | 2 +- .../[orgId]/settings/clients/create/page.tsx | 3 +- 6 files changed, 44 insertions(+), 100 deletions(-) diff --git a/Makefile b/Makefile index 3d4d8ad8..8805a3b7 100644 --- a/Makefile +++ b/Makefile @@ -101,4 +101,7 @@ test-local: - npx tsc --noEmit - docker build --build-arg DATABASE=pg -t fosrl/pangolin:postgresql-latest . - docker build --build-arg DATABASE=sqlite -t fosrl/pangolin:latest . - \ No newline at end of file + npm run set:saas + - npx tsc --noEmit + - docker build --build-arg DATABASE=pg -t fosrl/pangolin:postgresql-saas-latest . + - docker build --build-arg DATABASE=sqlite -t fosrl/pangolin:saas-latest . \ No newline at end of file diff --git a/server/lib/blueprints/types.ts b/server/lib/blueprints/types.ts index 490cd7f8..a5ee5700 100644 --- a/server/lib/blueprints/types.ts +++ b/server/lib/blueprints/types.ts @@ -116,6 +116,20 @@ export const ResourceSchema = z (target) => target == null || target.method !== undefined ); } + return true; + }, + { + path: ["targets"], + error: "When protocol is 'http', all targets must have a 'method' field" + + } + ) + .refine( + (resource) => { + if (isTargetsOnlyResource(resource)) { + return true; + } + // If protocol is tcp or udp, no target should have method field if (resource.protocol === "tcp" || resource.protocol === "udp") { return resource.targets.every( @@ -124,19 +138,9 @@ export const ResourceSchema = z } return true; }, - (resource) => { - if (resource.protocol === "http") { - return { - message: - "When protocol is 'http', all targets must have a 'method' field", - path: ["targets"] - }; - } - return { - message: - "When protocol is 'tcp' or 'udp', targets must not have a 'method' field", - path: ["targets"] - }; + { + path: ["targets"], + error: "When protocol is 'tcp' or 'udp', targets must not have a 'method' field" } ) .refine( @@ -218,30 +222,6 @@ export const ConfigSchema = z }) .refine( // Enforce the full-domain uniqueness across resources in the same stack - (config) => { - // Extract all full-domain values with their resource keys - const fullDomainMap = new Map(); - - Object.entries(config["proxy-resources"]).forEach( - ([resourceKey, resource]) => { - const fullDomain = resource["full-domain"]; - if (fullDomain) { - // Only process if full-domain is defined - if (!fullDomainMap.has(fullDomain)) { - fullDomainMap.set(fullDomain, []); - } - fullDomainMap.get(fullDomain)!.push(resourceKey); - } - } - ); - - // Find duplicates - const duplicates = Array.from(fullDomainMap.entries()).filter( - ([_, resourceKeys]) => resourceKeys.length > 1 - ); - - return duplicates.length === 0; - }, (config) => { // Extract duplicates for error message const fullDomainMap = new Map(); @@ -267,38 +247,16 @@ export const ConfigSchema = z ) .join("; "); - return { - message: `Duplicate 'full-domain' values found: ${duplicates}`, - path: ["resources"] - }; + if (duplicates.length !== 0) { + return { + path: ["resources"], + error: `Duplicate 'full-domain' values found: ${duplicates}` + }; + } } ) .refine( // Enforce proxy-port uniqueness within proxy-resources per protocol - (config) => { - const protocolPortMap = new Map(); - - Object.entries(config["proxy-resources"]).forEach( - ([resourceKey, resource]) => { - const proxyPort = resource["proxy-port"]; - const protocol = resource.protocol; - if (proxyPort !== undefined && protocol !== undefined) { - const key = `${protocol}:${proxyPort}`; - if (!protocolPortMap.has(key)) { - protocolPortMap.set(key, []); - } - protocolPortMap.get(key)!.push(resourceKey); - } - } - ); - - // Find duplicates - const duplicates = Array.from(protocolPortMap.entries()).filter( - ([_, resourceKeys]) => resourceKeys.length > 1 - ); - - return duplicates.length === 0; - }, (config) => { // Extract duplicates for error message const protocolPortMap = new Map(); @@ -327,36 +285,16 @@ export const ConfigSchema = z ) .join("; "); - return { - message: `Duplicate 'proxy-port' values found in proxy-resources: ${duplicates}`, - path: ["proxy-resources"] - }; + if (duplicates.length !== 0) { + return { + path: ["proxy-resources"], + error: `Duplicate 'proxy-port' values found in proxy-resources: ${duplicates}` + }; + } } ) .refine( // Enforce proxy-port uniqueness within client-resources - (config) => { - const proxyPortMap = new Map(); - - Object.entries(config["client-resources"]).forEach( - ([resourceKey, resource]) => { - const proxyPort = resource["proxy-port"]; - if (proxyPort !== undefined) { - if (!proxyPortMap.has(proxyPort)) { - proxyPortMap.set(proxyPort, []); - } - proxyPortMap.get(proxyPort)!.push(resourceKey); - } - } - ); - - // Find duplicates - const duplicates = Array.from(proxyPortMap.entries()).filter( - ([_, resourceKeys]) => resourceKeys.length > 1 - ); - - return duplicates.length === 0; - }, (config) => { // Extract duplicates for error message const proxyPortMap = new Map(); @@ -381,10 +319,12 @@ export const ConfigSchema = z ) .join("; "); - return { - message: `Duplicate 'proxy-port' values found in client-resources: ${duplicates}`, - path: ["client-resources"] - }; + if (duplicates.length !== 0) { + return { + path: ["client-resources"], + error: `Duplicate 'proxy-port' values found in client-resources: ${duplicates}` + }; + } } ); diff --git a/server/private/routers/auditLogs/queryAccessAuditLog.ts b/server/private/routers/auditLogs/queryAccessAuditLog.ts index 6329206d..3e0b4601 100644 --- a/server/private/routers/auditLogs/queryAccessAuditLog.ts +++ b/server/private/routers/auditLogs/queryAccessAuditLog.ts @@ -40,7 +40,7 @@ export const queryAccessAuditLogsQuery = z.object({ }) .transform((val) => Math.floor(new Date(val).getTime() / 1000)) .optional() - .default(new Date().toISOString()), + .prefault(new Date().toISOString()), action: z .union([z.boolean(), z.string()]) .transform((val) => (typeof val === "string" ? val === "true" : val)) diff --git a/server/private/routers/auditLogs/queryActionAuditLog.ts b/server/private/routers/auditLogs/queryActionAuditLog.ts index eb22cc0a..6a5bde6d 100644 --- a/server/private/routers/auditLogs/queryActionAuditLog.ts +++ b/server/private/routers/auditLogs/queryActionAuditLog.ts @@ -40,7 +40,7 @@ export const queryActionAuditLogsQuery = z.object({ }) .transform((val) => Math.floor(new Date(val).getTime() / 1000)) .optional() - .default(new Date().toISOString()), + .prefault(new Date().toISOString()), action: z.string().optional(), actorType: z.string().optional(), actorId: z.string().optional(), diff --git a/server/routers/auditLogs/queryRequstAuditLog.ts b/server/routers/auditLogs/queryRequstAuditLog.ts index 7c412994..342b7091 100644 --- a/server/routers/auditLogs/queryRequstAuditLog.ts +++ b/server/routers/auditLogs/queryRequstAuditLog.ts @@ -27,7 +27,7 @@ export const queryAccessAuditLogsQuery = z.object({ }) .transform((val) => Math.floor(new Date(val).getTime() / 1000)) .optional() - .default(new Date().toISOString()), + .prefault(new Date().toISOString()), action: z .union([z.boolean(), z.string()]) .transform((val) => (typeof val === "string" ? val === "true" : val)) diff --git a/src/app/[orgId]/settings/clients/create/page.tsx b/src/app/[orgId]/settings/clients/create/page.tsx index 0f44d79c..aaee4d31 100644 --- a/src/app/[orgId]/settings/clients/create/page.tsx +++ b/src/app/[orgId]/settings/clients/create/page.tsx @@ -103,7 +103,8 @@ export default function Page() { .refine((val) => val.length > 0, { message: t("siteRequired") }), - subnet: z.union([z.ipv4(), z.ipv6()]).min(1, { + subnet: z.union([z.ipv4(), z.ipv6()]) + .refine((val) => val.length > 0, { message: t("subnetRequired") }) }); From dc87df5d3865b6c703aa75d04fd9acaa0a0c2b21 Mon Sep 17 00:00:00 2001 From: Lokowitz Date: Mon, 17 Nov 2025 14:01:11 +0000 Subject: [PATCH 15/29] remove temp test --- Makefile | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/Makefile b/Makefile index 8805a3b7..6c538a47 100644 --- a/Makefile +++ b/Makefile @@ -91,17 +91,3 @@ test: clean: docker rmi pangolin - -test-local: - cp config/config.example.yml config/config.yml - npm run set:oss - npm run set:sqlite - npm run db:sqlite:generate - npm run db:sqlite:push - - npx tsc --noEmit - - docker build --build-arg DATABASE=pg -t fosrl/pangolin:postgresql-latest . - - docker build --build-arg DATABASE=sqlite -t fosrl/pangolin:latest . - npm run set:saas - - npx tsc --noEmit - - docker build --build-arg DATABASE=pg -t fosrl/pangolin:postgresql-saas-latest . - - docker build --build-arg DATABASE=sqlite -t fosrl/pangolin:saas-latest . \ No newline at end of file From 21f0501bc6bd1f29b58c52559bae95a964df19d9 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Mon, 17 Nov 2025 11:03:04 -0500 Subject: [PATCH 16/29] New translations en-us.json (French) --- messages/fr-FR.json | 293 +++++++++++++++++++++++++------------------- 1 file changed, 167 insertions(+), 126 deletions(-) diff --git a/messages/fr-FR.json b/messages/fr-FR.json index c688b9a2..276fa9bd 100644 --- a/messages/fr-FR.json +++ b/messages/fr-FR.json @@ -1,26 +1,26 @@ { - "setupCreate": "Créez votre organisation, votre site et vos ressources", + "setupCreate": "Créez votre organisation, vos nœuds et vos ressources", "setupNewOrg": "Nouvelle organisation", "setupCreateOrg": "Créer une organisation", "setupCreateResources": "Créer des ressources", "setupOrgName": "Nom de l'organisation", - "orgDisplayName": "Ceci est le nom d'affichage de votre organisation.", + "orgDisplayName": "Ceci est le nom affiché de votre organisation.", "orgId": "ID de l'organisation", - "setupIdentifierMessage": "Ceci est l'identifiant unique pour votre organisation. Il est séparé du nom affiché.", - "setupErrorIdentifier": "L'ID de l'organisation est déjà pris. Veuillez en choisir un autre.", + "setupIdentifierMessage": "Ceci est l'identifiant unique de votre organisation. Il est différent du nom.", + "setupErrorIdentifier": "Cet ID est déjà utilisé. Veuillez en choisir un autre.", "componentsErrorNoMemberCreate": "Vous n'êtes actuellement membre d'aucune organisation. Créez une organisation pour commencer.", "componentsErrorNoMember": "Vous n'êtes actuellement membre d'aucune organisation.", "welcome": "Bienvenue sur Pangolin !", "welcomeTo": "Bienvenue chez", "componentsCreateOrg": "Créer une organisation", - "componentsMember": "Vous êtes membre de {count, plural, =0 {aucune organisation} one {une organisation} other {# organisations}}.", + "componentsMember": "Vous {count, plural, =0 {n'} other {} }êtes membre {count, plural, =0 {d'aucune organisation} one {d'une organisation} other {de # organisations}}.", "componentsInvalidKey": "Clés de licence invalides ou expirées détectées. Veuillez respecter les conditions de licence pour continuer à utiliser toutes les fonctionnalités.", "dismiss": "Rejeter", - "componentsLicenseViolation": "Violation de licence : ce serveur utilise {usedSites} sites, ce qui dépasse la limite autorisée de {maxSites} sites. Respectez les conditions de licence pour continuer à utiliser toutes les fonctionnalités.", + "componentsLicenseViolation": "Violation de licence : ce serveur utilise {usedSites} nœuds, ce qui dépasse la limite autorisée de {maxSites} nœuds. Respectez les conditions de licence pour continuer à utiliser toutes les fonctionnalités.", "componentsSupporterMessage": "Merci de soutenir Pangolin en tant que {tier}!", "inviteErrorNotValid": "Nous sommes désolés, mais il semble que l'invitation à laquelle vous essayez d'accéder n'ait pas été acceptée ou ne soit plus valide.", "inviteErrorUser": "Nous sommes désolés, mais il semble que l'invitation à laquelle vous essayez d'accéder ne soit pas pour cet utilisateur.", - "inviteLoginUser": "Veuillez vous assurer que vous êtes connecté avec le bon utilisateur.", + "inviteLoginUser": "Veuillez vous assurer que vous êtes connecté avec le bon compte.", "inviteErrorNoUser": "Nous sommes désolés, mais il semble que l'invitation à laquelle vous essayez d'accéder ne concerne pas un utilisateur existant.", "inviteCreateUser": "Veuillez d'abord créer un compte.", "goHome": "Retour à l'accueil", @@ -29,35 +29,35 @@ "inviteNotAccepted": "Invitation non acceptée", "authCreateAccount": "Créez un compte pour commencer", "authNoAccount": "Vous n'avez pas de compte ?", - "email": "Courriel", + "email": "Adresse mail", "password": "Mot de passe", "confirmPassword": "Confirmer le mot de passe", "createAccount": "Créer un compte", "viewSettings": "Afficher les paramètres", - "delete": "Supprimez", + "delete": "Supprimer", "name": "Nom", "online": "En ligne", "offline": "Hors ligne", - "site": "Site", - "dataIn": "Données entrantes", - "dataOut": "Données sortantes", + "site": "Nœud", + "dataIn": "Données reçues", + "dataOut": "Données émises", "connectionType": "Type de connexion", "tunnelType": "Type de tunnel", "local": "Locale", - "edit": "Éditer", - "siteConfirmDelete": "Confirmer la suppression du site", - "siteDelete": "Supprimer le site", - "siteMessageRemove": "Une fois supprimé, le site ne sera plus accessible. Toutes les cibles associées au site seront également supprimées.", - "siteQuestionRemove": "Êtes-vous sûr de vouloir supprimer le site de l'organisation ?", - "siteManageSites": "Gérer les sites", - "siteDescription": "Autoriser la connectivité à votre réseau via des tunnels sécurisés", - "siteCreate": "Créer un site", - "siteCreateDescription2": "Suivez les étapes ci-dessous pour créer et connecter un nouveau site", - "siteCreateDescription": "Créez un nouveau site pour commencer à connecter vos ressources", + "edit": "Modifier", + "siteConfirmDelete": "Confirmer la suppression du nœud", + "siteDelete": "Supprimer le nœud", + "siteMessageRemove": "Une fois supprimé, le nœud ne sera plus accessible. Toutes les cibles associées au nœud seront également supprimées.", + "siteQuestionRemove": "Êtes-vous sûr de vouloir supprimer ce nœud de l'organisation ?", + "siteManageSites": "Gérer les nœuds", + "siteDescription": "Autoriser la connexion à votre réseau via des tunnels sécurisés", + "siteCreate": "Créer un nœud", + "siteCreateDescription2": "Suivez les étapes ci-dessous pour créer et connecter un nouveau nœud", + "siteCreateDescription": "Créez un nouveau nœud pour commencer à connecter vos ressources", "close": "Fermer", - "siteErrorCreate": "Erreur lors de la création du site", - "siteErrorCreateKeyPair": "Paire de clés ou site par défaut introuvable", - "siteErrorCreateDefaults": "Les valeurs par défaut du site sont introuvables", + "siteErrorCreate": "Erreur lors de la création du nœud", + "siteErrorCreateKeyPair": "Clés ou nœud par défaut introuvable", + "siteErrorCreateDefaults": "Les valeurs par défaut du nœud sont introuvables", "method": "Méthode", "siteMethodDescription": "C'est ainsi que vous exposerez les connexions.", "siteLearnNewt": "Apprenez à installer Newt sur votre système", @@ -65,12 +65,12 @@ "siteLoadWGConfig": "Chargement de la configuration WireGuard...", "siteDocker": "Développer pour obtenir plus de détails sur le déploiement Docker", "toggle": "Activer/désactiver", - "dockerCompose": "Composition Docker", - "dockerRun": "Exécution Docker", - "siteLearnLocal": "Les sites locaux ne font pas de tunnel, en savoir plus", + "dockerCompose": "Docker Compose", + "dockerRun": "Docker Run", + "siteLearnLocal": "Les nœuds locaux ne font pas de tunnel, en savoir plus", "siteConfirmCopy": "J'ai copié la configuration", - "searchSitesProgress": "Rechercher des sites...", - "siteAdd": "Ajouter un site", + "searchSitesProgress": "Rechercher des nœuds...", + "siteAdd": "Ajouter un nœud", "siteInstallNewt": "Installer Newt", "siteInstallNewtDescription": "Faites fonctionner Newt sur votre système", "WgConfiguration": "Configuration WireGuard", @@ -78,41 +78,41 @@ "operatingSystem": "Système d'exploitation", "commands": "Commandes", "recommended": "Recommandé", - "siteNewtDescription": "Pour une meilleure expérience d'utilisateur, utilisez Newt. Il utilise WireGuard sous le capot et vous permet de vous connecter à vos ressources privées par leur adresse LAN sur votre réseau privé à partir du tableau de bord Pangolin.", + "siteNewtDescription": "Pour une meilleure expérience d'utilisateur, utilisez Newt. Newt se base sur le protocole WireGuard et vous permet de vous connecter à vos ressources privées, par leur adresse LAN sur votre réseau privé, à partir de Pangolin.", "siteRunsInDocker": "Exécute dans Docker", - "siteRunsInShell": "Exécute en shell sur macOS, Linux et Windows", - "siteErrorDelete": "Erreur lors de la suppression du site", - "siteErrorUpdate": "Impossible de mettre à jour le site", - "siteErrorUpdateDescription": "Une erreur s'est produite lors de la mise à jour du site.", - "siteUpdated": "Site mis à jour", - "siteUpdatedDescription": "Le site a été mis à jour.", - "siteGeneralDescription": "Configurer les paramètres généraux de ce site", - "siteSettingDescription": "Configurer les paramètres de votre site", - "siteSetting": "Réglages {siteName}", + "siteRunsInShell": "Fonctionne depuis le shell sur macOS, Linux et Windows", + "siteErrorDelete": "Erreur lors de la suppression du nœud", + "siteErrorUpdate": "Impossible de mettre à jour le nœud", + "siteErrorUpdateDescription": "Une erreur s'est produite lors de la mise à jour du nœud.", + "siteUpdated": "Nœud mis à jour", + "siteUpdatedDescription": "Le nœud a été mis à jour.", + "siteGeneralDescription": "Configurer les paramètres par défaut de ce nœud", + "siteSettingDescription": "Configurer les paramètres de votre nœud", + "siteSetting": "Paramètres de {siteName}", "siteNewtTunnel": "Tunnel Newt (Recommandé)", "siteNewtTunnelDescription": "La façon la plus simple de créer un point d'entrée dans votre réseau. Pas de configuration supplémentaire.", "siteWg": "WireGuard basique", "siteWgDescription": "Utilisez n'importe quel client WireGuard pour établir un tunnel. Configuration NAT manuelle requise.", - "siteWgDescriptionSaas": "Utilisez n'importe quel client WireGuard pour établir un tunnel. Configuration NAT manuelle requise. FONCTIONNE UNIQUEMENT SUR DES NŒUDS AUTONOMES.", + "siteWgDescriptionSaas": "Utilisez n'importe quel client WireGuard pour établir un tunnel. Configuration NAT manuelle requise.", "siteLocalDescription": "Ressources locales seulement. Pas de tunneling.", "siteLocalDescriptionSaas": "Ressources locales uniquement. Pas de tunneling. Disponible uniquement sur les nœuds distants.", - "siteSeeAll": "Voir tous les sites", - "siteTunnelDescription": "Déterminez comment vous voulez vous connecter à votre site", + "siteSeeAll": "Voir tous les nœuds", + "siteTunnelDescription": "Déterminez comment vous voulez vous connecter à votre nœud", "siteNewtCredentials": "Identifiants Newt", - "siteNewtCredentialsDescription": "C'est ainsi que Newt s'authentifiera avec le serveur", + "siteNewtCredentialsDescription": "C'est comme ça que Newt s'authentifiera avec le serveur", "siteCredentialsSave": "Enregistrez vos identifiants", - "siteCredentialsSaveDescription": "Vous ne pourrez voir cela qu'une seule fois. Assurez-vous de le copier dans un endroit sécurisé.", - "siteInfo": "Informations sur le site", + "siteCredentialsSaveDescription": "Vous ne pourrez voir cela qu'une seule fois. Assurez-vous de l'enregistrer dans un endroit sécurisé.", + "siteInfo": "Informations du nœud", "status": "Statut", - "shareTitle": "Gérer les liens de partage", + "shareTitle": "Gérer les liens partageables", "shareDescription": "Créez des liens partageables pour accorder un accès temporaire ou permanent à vos ressources", - "shareSearch": "Rechercher des liens de partage...", - "shareCreate": "Créer un lien de partage", + "shareSearch": "Rechercher des liens partageables...", + "shareCreate": "Créer un lien partageable", "shareErrorDelete": "Impossible de supprimer le lien", "shareErrorDeleteMessage": "Une erreur s'est produite lors de la suppression du lien", "shareDeleted": "Lien supprimé", "shareDeletedDescription": "Le lien a été supprimé", - "shareTokenDescription": "Votre jeton d'accès peut être passé de deux façons : en tant que paramètre de requête ou dans les en-têtes de la requête. Elles doivent être transmises par le client à chaque demande d'accès authentifié.", + "shareTokenDescription": "Votre jeton d'accès peut être fourni de deux façons : en tant que paramètre de requête ou dans les en-têtes de la requête. Il doit être transmis par le client à chaque demande d'accès authentifié.", "accessToken": "Jeton d'accès", "usageExamples": "Exemples d'utilisation", "tokenId": "ID du jeton", @@ -124,16 +124,16 @@ "shareTokenSecurety": "Gardez votre jeton d'accès sécurisé. Ne le partagez pas dans des zones accessibles au public ou dans du code côté client.", "shareErrorFetchResource": "Impossible de récupérer les ressources", "shareErrorFetchResourceDescription": "Une erreur est survenue lors de la récupération des ressources", - "shareErrorCreate": "Impossible de créer le lien de partage", - "shareErrorCreateDescription": "Une erreur s'est produite lors de la création du lien de partage", + "shareErrorCreate": "Impossible de créer le lien partageable", + "shareErrorCreateDescription": "Une erreur s'est produite lors de la création du lien partageable", "shareCreateDescription": "N'importe qui avec ce lien peut accéder à la ressource", "shareTitleOptional": "Titre (facultatif)", "expireIn": "Expire dans", "neverExpire": "N'expire jamais", - "shareExpireDescription": "La durée d'expiration correspond à la période pendant laquelle le lien sera utilisable et permettra d'accéder à la ressource. Passé ce délai, le lien ne fonctionnera plus et les utilisateurs qui l'ont utilisé perdront l'accès à la ressource.", - "shareSeeOnce": "Vous ne pourrez voir ce lien qu'une seule fois. Assurez-vous de le copier.", + "shareExpireDescription": "Le délai d'expiration correspond à la période pendant laquelle le lien sera utilisable et permettra d'accéder à la ressource. Passé ce délai, le lien ne fonctionnera plus et les utilisateurs qui l'ont utilisé perdront l'accès à la ressource.", + "shareSeeOnce": "Vous ne pourrez voir ce lien qu'une seule fois. N'oubliez pas de le copier.", "shareAccessHint": "N'importe qui avec ce lien peut accéder à la ressource. Partagez-le avec précaution.", - "shareTokenUsage": "Voir Utilisation du jeton d'accès", + "shareTokenUsage": "Voir l'utilisation du jeton d'accès", "createLink": "Créer un lien", "resourcesNotFound": "Aucune ressource trouvée", "resourceSearch": "Rechercher des ressources", @@ -145,43 +145,43 @@ "never": "Jamais", "shareErrorSelectResource": "Veuillez sélectionner une ressource", "resourceTitle": "Gérer les ressources", - "resourceDescription": "Créez des proxy sécurisés pour vos applications privées", - "resourcesSearch": "Rechercher des ressources...", + "resourceDescription": "Créez des proxys sécurisés pour vos applications privées", + "resourcesSearch": "Chercher des ressources...", "resourceAdd": "Ajouter une ressource", - "resourceErrorDelte": "Erreur de suppression de la ressource", + "resourceErrorDelte": "Erreur lors de la de suppression de la ressource", "authentication": "Authentification", "protected": "Protégé", "notProtected": "Non Protégé", "resourceMessageRemove": "Une fois supprimée, la ressource ne sera plus accessible. Toutes les cibles associées à la ressource seront également supprimées.", - "resourceQuestionRemove": "Êtes-vous sûr de vouloir supprimer la ressource de l'organisation ?", + "resourceQuestionRemove": "Êtes-vous sûr de vouloir retirer la ressource de l'organisation ?", "resourceHTTP": "Ressource HTTPS", - "resourceHTTPDescription": "Requêtes de proxy vers votre application via HTTPS en utilisant un sous-domaine ou un domaine de base.", + "resourceHTTPDescription": "Requêtes de proxy vers votre application via HTTPS en utilisant un sous-domaine ou un domaine racine.", "resourceRaw": "Ressource TCP/UDP brute", - "resourceRawDescription": "Demandes de proxy vers votre application via TCP/UDP en utilisant un numéro de port.", + "resourceRawDescription": "Demandes de proxy vers votre application via TCP/UDP en utilisant un port.", "resourceCreate": "Créer une ressource", "resourceCreateDescription": "Suivez les étapes ci-dessous pour créer une nouvelle ressource", "resourceSeeAll": "Voir toutes les ressources", "resourceInfo": "Informations sur la ressource", "resourceNameDescription": "Ceci est le nom d'affichage de la ressource.", - "siteSelect": "Sélectionner un site", - "siteSearch": "Chercher un site", - "siteNotFound": "Aucun site trouvé.", + "siteSelect": "Sélectionnez un nœud", + "siteSearch": "Chercher un nœud", + "siteNotFound": "Aucun nœud trouvé.", "selectCountry": "Sélectionnez un pays", "searchCountries": "Recherchez des pays...", "noCountryFound": "Aucun pays trouvé.", "siteSelectionDescription": "Ce site fournira la connectivité à la cible.", "resourceType": "Type de ressource", - "resourceTypeDescription": "Déterminer comment vous voulez accéder à votre ressource", + "resourceTypeDescription": "Détermine comment vous voulez accéder à votre ressource", "resourceHTTPSSettings": "Paramètres HTTPS", - "resourceHTTPSSettingsDescription": "Configurer comment votre ressource sera accédée via HTTPS", + "resourceHTTPSSettingsDescription": "Configure comment votre ressource sera accédée via HTTPS", "domainType": "Type de domaine", "subdomain": "Sous-domaine", - "baseDomain": "Domaine de base", - "subdomnainDescription": "Le sous-domaine où votre ressource sera accessible.", + "baseDomain": "Domaine racine", + "subdomnainDescription": "Le sous-domaine depuis lequel cette ressource sera accessible.", "resourceRawSettings": "Paramètres TCP/UDP", - "resourceRawSettingsDescription": "Configurer comment votre ressource sera accédée via TCP/UDP. Vous mappez la ressource à un port sur le serveur Pangolin, de sorte que vous puissiez accéder à la ressource depuis server-public-ip:mapped-port.", + "resourceRawSettingsDescription": "Configurer comment votre ressource sera accédée via TCP/UDP. Vous mappez la ressource à un port sur le serveur Pangolin, de sorte que vous puissiez accéder à la ressource depuis ip-publique-du-serveur:port-mappé.", "protocol": "Protocole", - "protocolSelect": "Sélectionner un protocole", + "protocolSelect": "Choisir un protocole", "resourcePortNumber": "Numéro de port", "resourcePortNumberDescription": "Le numéro de port externe pour les requêtes de proxy.", "cancel": "Abandonner", @@ -203,17 +203,17 @@ "internal": "Interne", "rules": "Règles", "resourceSettingDescription": "Configurer les paramètres de votre ressource", - "resourceSetting": "Réglages {resourceName}", + "resourceSetting": "Réglages de {resourceName}", "alwaysAllow": "Toujours autoriser", "alwaysDeny": "Toujours refuser", "passToAuth": "Passer à l'authentification", - "orgSettingsDescription": "Configurer les paramètres généraux de votre organisation", + "orgSettingsDescription": "Configurer les paramètres de votre organisation", "orgGeneralSettings": "Paramètres de l'organisation", "orgGeneralSettingsDescription": "Gérer les détails et la configuration de votre organisation", "saveGeneralSettings": "Enregistrer les paramètres généraux", "saveSettings": "Enregistrer les paramètres", - "orgDangerZone": "Zone de danger", - "orgDangerZoneDescription": "Une fois que vous supprimez cette organisation, il n'y a pas de retour en arrière. Soyez certain.", + "orgDangerZone": "Zone dangereuse", + "orgDangerZoneDescription": "Une fois cette organisation supprimée, elle ne pourra plus être restaurée. Faites attention.", "orgDelete": "Supprimer l'organisation", "orgDeleteConfirm": "Confirmer la suppression de l'organisation", "orgMessageRemove": "Cette action est irréversible et supprimera toutes les données associées.", @@ -224,7 +224,7 @@ "orgErrorUpdate": "Échec de la mise à jour de l'organisation", "orgErrorUpdateMessage": "Une erreur s'est produite lors de la mise à jour de l'organisation.", "orgErrorFetch": "Impossible de récupérer les organisations", - "orgErrorFetchMessage": "Une erreur s'est produite lors de la liste de vos organisations", + "orgErrorFetchMessage": "Une erreur s'est produite lors de la récupération des organisations", "orgErrorDelete": "Échec de la suppression de l'organisation", "orgErrorDeleteMessage": "Une erreur s'est produite lors de la suppression de l'organisation.", "orgDeleted": "Organisation supprimée", @@ -233,21 +233,21 @@ "orgMissingMessage": "Impossible de régénérer l'invitation sans un ID d'organisation.", "accessUsersManage": "Gérer les utilisateurs", "accessUsersDescription": "Invitez des utilisateurs et ajoutez-les aux rôles pour gérer l'accès à votre organisation", - "accessUsersSearch": "Rechercher des utilisateurs...", + "accessUsersSearch": "Chercher des utilisateurs...", "accessUserCreate": "Créer un utilisateur", - "accessUserRemove": "Supprimer l'utilisateur", + "accessUserRemove": "Supprimer un utilisateur", "username": "Nom d'utilisateur", "identityProvider": "Fournisseur d'identité", "role": "Rôle", "nameRequired": "Le nom est requis", "accessRolesManage": "Gérer les rôles", "accessRolesDescription": "Configurer les rôles pour gérer l'accès à votre organisation", - "accessRolesSearch": "Rechercher des rôles...", + "accessRolesSearch": "Chercher des rôles...", "accessRolesAdd": "Ajouter un rôle", "accessRoleDelete": "Supprimer le rôle", "description": "Libellé", - "inviteTitle": "Invitations ouvertes", - "inviteDescription": "Gérer vos invitations à d'autres utilisateurs", + "inviteTitle": "Invitations actives", + "inviteDescription": "Gérez les invitations des autres utilisateurs", "inviteSearch": "Rechercher des invitations...", "minutes": "Minutes", "hours": "Heures", @@ -256,41 +256,41 @@ "months": "Mois", "years": "Années", "day": "{count, plural, one {# jour} other {# jours}}", - "apiKeysTitle": "Informations sur la clé API", - "apiKeysConfirmCopy2": "Vous devez confirmer que vous avez copié la clé API.", + "apiKeysTitle": "Informations sur la clé d'API", + "apiKeysConfirmCopy2": "Vous devez confirmer que vous avez copié la clé d'API.", "apiKeysErrorCreate": "Erreur lors de la création de la clé API", "apiKeysErrorSetPermission": "Erreur lors de la définition des permissions", - "apiKeysCreate": "Générer une clé API", - "apiKeysCreateDescription": "Générer une nouvelle clé API pour votre organisation", + "apiKeysCreate": "Générer une clé d'API", + "apiKeysCreateDescription": "Générer une nouvelle clé d'API pour votre organisation", "apiKeysGeneralSettings": "Permissions", - "apiKeysGeneralSettingsDescription": "Déterminez ce que cette clé API peut faire", - "apiKeysList": "Votre clé API", + "apiKeysGeneralSettingsDescription": "Déterminez ce que cette clé d\"API peut faire", + "apiKeysList": "Votre clé d\"API", "apiKeysSave": "Enregistrer votre clé API", - "apiKeysSaveDescription": "Vous ne pourrez voir cela qu'une seule fois. Assurez-vous de la copier dans un endroit sécurisé.", - "apiKeysInfo": "Votre clé API est :", - "apiKeysConfirmCopy": "J'ai copié la clé API", + "apiKeysSaveDescription": "Vous ne pourrez la voir qu'une seule fois. Assurez-vous de la copier dans un endroit sécurisé.", + "apiKeysInfo": "Votre clé d'API est :", + "apiKeysConfirmCopy": "J'ai copié la clé d\"API", "generate": "Générer", "done": "Terminé", - "apiKeysSeeAll": "Voir toutes les clés API", - "apiKeysPermissionsErrorLoadingActions": "Erreur lors du chargement des actions de la clé API", + "apiKeysSeeAll": "Voir toutes les clés d\"API", + "apiKeysPermissionsErrorLoadingActions": "Erreur lors du chargement des actions de la clé d\"API", "apiKeysPermissionsErrorUpdate": "Erreur lors de la définition des permissions", "apiKeysPermissionsUpdated": "Permissions mises à jour", "apiKeysPermissionsUpdatedDescription": "Les permissions ont été mises à jour.", "apiKeysPermissionsGeneralSettings": "Permissions", - "apiKeysPermissionsGeneralSettingsDescription": "Déterminez ce que cette clé API peut faire", + "apiKeysPermissionsGeneralSettingsDescription": "Déterminez ce que cette clé d'API peut faire", "apiKeysPermissionsSave": "Enregistrer les permissions", "apiKeysPermissionsTitle": "Permissions", - "apiKeys": "Clés API", - "searchApiKeys": "Rechercher des clés API...", - "apiKeysAdd": "Générer une clé API", - "apiKeysErrorDelete": "Erreur lors de la suppression de la clé API", - "apiKeysErrorDeleteMessage": "Erreur lors de la suppression de la clé API", - "apiKeysQuestionRemove": "Êtes-vous sûr de vouloir supprimer la clé API de l'organisation ?", - "apiKeysMessageRemove": "Une fois supprimée, la clé API ne pourra plus être utilisée.", - "apiKeysDeleteConfirm": "Confirmer la suppression de la clé API", - "apiKeysDelete": "Supprimer la clé API", - "apiKeysManage": "Gérer les clés API", - "apiKeysDescription": "Les clés API sont utilisées pour s'authentifier avec l'API d'intégration", + "apiKeys": "Clés d'API", + "searchApiKeys": "Rechercher des clés d'API...", + "apiKeysAdd": "Générer une clé d'API", + "apiKeysErrorDelete": "Erreur lors de la suppression de la clé d'API", + "apiKeysErrorDeleteMessage": "Erreur lors de la suppression de la clé d'API", + "apiKeysQuestionRemove": "Êtes-vous sûr de vouloir supprimer la clé d'API de l'organisation ?", + "apiKeysMessageRemove": "Une fois supprimée, la clé d'API ne pourra plus être utilisée.", + "apiKeysDeleteConfirm": "Confirmer la suppression de la clé d'API", + "apiKeysDelete": "Supprimer la clé d'API", + "apiKeysManage": "Gérer les clés d'API", + "apiKeysDescription": "Les clés d'API sont utilisées pour s'authentifier avec l'API d'intégration", "apiKeysSettings": "Paramètres de {apiKeyName}", "userTitle": "Gérer tous les utilisateurs", "userDescription": "Voir et gérer tous les utilisateurs du système", @@ -305,10 +305,10 @@ "userQuestionRemove": "Êtes-vous sûr de vouloir supprimer définitivement l'utilisateur du serveur?", "licenseKey": "Clé de licence", "valid": "Valide", - "numberOfSites": "Nombre de sites", + "numberOfSites": "Nombre de nœuds", "licenseKeySearch": "Rechercher des clés de licence...", "licenseKeyAdd": "Ajouter une clé de licence", - "type": "Type de texte", + "type": "Type", "licenseKeyRequired": "La clé de licence est requise", "licenseTermsAgree": "Vous devez accepter les conditions de licence", "licenseErrorKeyLoad": "Impossible de charger les clés de licence", @@ -611,7 +611,7 @@ "newtId": "ID Newt", "newtSecretKey": "Clé secrète Newt", "architecture": "Architecture", - "sites": "Espaces", + "sites": "Nœuds", "siteWgAnyClients": "Utilisez n'importe quel client WireGuard pour vous connecter. Vous devrez adresser vos ressources internes en utilisant l'IP du pair.", "siteWgCompatibleAllClients": "Compatible avec tous les clients WireGuard", "siteWgManualConfigurationRequired": "Configuration manuelle requise", @@ -1021,7 +1021,7 @@ "actionDeleteSite": "Supprimer un site", "actionGetSite": "Obtenir un site", "actionListSites": "Lister les sites", - "actionApplyBlueprint": "Appliquer le Plan", + "actionApplyBlueprint": "Appliquer la Config", "setupToken": "Jeton de configuration", "setupTokenDescription": "Entrez le jeton de configuration depuis la console du serveur.", "setupTokenRequired": "Le jeton de configuration est requis.", @@ -1149,7 +1149,7 @@ "apiKeysErrorNoUpdate": "Pas de clé API à mettre à jour", "sidebarOverview": "Aperçu", "sidebarHome": "Domicile", - "sidebarSites": "Espaces", + "sidebarSites": "Nœuds", "sidebarResources": "Ressource", "sidebarAccessControl": "Contrôle d'accès", "sidebarUsers": "Utilisateurs", @@ -1163,26 +1163,26 @@ "sidebarLicense": "Licence", "sidebarClients": "Clients", "sidebarDomains": "Domaines", - "sidebarBluePrints": "Plans", - "blueprints": "Plans", + "sidebarBluePrints": "Configs", + "blueprints": "Configs", "blueprintsDescription": "Appliquer les configurations déclaratives et afficher les exécutions précédentes", - "blueprintAdd": "Ajouter un Plan", - "blueprintGoBack": "Voir tous les plans", - "blueprintCreate": "Créer un Plan", - "blueprintCreateDescription2": "Suivez les étapes ci-dessous pour créer et appliquer un nouveau plan", - "blueprintDetails": "Détails du Plan", + "blueprintAdd": "Ajouter une Config", + "blueprintGoBack": "Voir toutes les Configs", + "blueprintCreate": "Créer une Config", + "blueprintCreateDescription2": "Suivez les étapes ci-dessous pour créer et appliquer une nouvelle config", + "blueprintDetails": "Détails de la Config", "blueprintDetailsDescription": "Voir le résultat du plan appliqué et les erreurs qui se sont produites", - "blueprintInfo": "Informations sur le Plan", + "blueprintInfo": "Informations sur la Config", "message": "Message", "blueprintContentsDescription": "Définissez le contenu YAML décrivant votre infrastructure", - "blueprintErrorCreateDescription": "Une erreur s'est produite lors de l'application du plan", - "blueprintErrorCreate": "Erreur lors de la création du plan", - "searchBlueprintProgress": "Rechercher des plans...", + "blueprintErrorCreateDescription": "Une erreur s'est produite lors de l'application de la config", + "blueprintErrorCreate": "Erreur lors de la création de la config", + "searchBlueprintProgress": "Rechercher des configs...", "appliedAt": "Appliqué à", "source": "Source", "contents": "Contenus", "parsedContents": "Contenu analysé (lecture seule)", - "enableDockerSocket": "Activer le Plan Docker", + "enableDockerSocket": "Activer la Config Docker", "enableDockerSocketDescription": "Activer le ramassage d'étiquettes de socket Docker pour les étiquettes de plan. Le chemin de socket doit être fourni à Newt.", "enableDockerSocketLink": "En savoir plus", "viewDockerContainers": "Voir les conteneurs Docker", @@ -1279,6 +1279,15 @@ "settingsErrorUpdateDescription": "Une erreur s'est produite lors de la mise à jour des paramètres", "sidebarCollapse": "Réduire", "sidebarExpand": "Développer", + "productUpdateMoreInfo": "{noOfUpdates} mises à jour de plus", + "productUpdateInfo": "{noOfUpdates} mises à jour", + "productUpdateWhatsNew": "Quoi de neuf", + "productUpdateTitle": "Mises à jour", + "productUpdateEmpty": "Aucune mise à jour", + "dismissAll": "Tout cacher", + "pangolinUpdateAvailable": "Mise à jour disponible", + "pangolinUpdateAvailableInfo": "La version {version} est prête à être installée", + "pangolinUpdateAvailableReleaseNotes": "Voir les notes de version", "newtUpdateAvailable": "Mise à jour disponible", "newtUpdateAvailableInfo": "Une nouvelle version de Newt est disponible. Veuillez mettre à jour vers la dernière version pour une meilleure expérience.", "domainPickerEnterDomain": "Domaine", @@ -1525,6 +1534,12 @@ "resourcesTableTheseResourcesForUseWith": "Ces ressources sont à utiliser avec", "resourcesTableClients": "Clients", "resourcesTableAndOnlyAccessibleInternally": "et sont uniquement accessibles en interne lorsqu'elles sont connectées avec un client.", + "resourcesTableNoTargets": "Aucune cible", + "resourcesTableHealthy": "Sain", + "resourcesTableDegraded": "Dégradé", + "resourcesTableOffline": "Hors ligne", + "resourcesTableUnknown": "Inconnu", + "resourcesTableNotMonitored": "Non-monitoré", "editInternalResourceDialogEditClientResource": "Modifier la ressource client", "editInternalResourceDialogUpdateResourceProperties": "Mettez à jour les propriétés de la ressource et la configuration de la cible pour {resourceName}.", "editInternalResourceDialogResourceProperties": "Propriétés de la ressource", @@ -2041,7 +2056,7 @@ "preferWildcardCertDescription": "Tentative de génération d'un certificat générique (nécessite un résolveur de certificat correctement configuré).", "recordName": "Nom de l'enregistrement", "auto": "Automatique", - "TTL": "TTC", + "TTL": "TTL", "howToAddRecords": "Comment ajouter des enregistrements", "dnsRecord": "Enregistrements DNS", "required": "Requis", @@ -2061,7 +2076,7 @@ "warning": "Avertissement", "proxyProtocolWarning": "Votre application backend doit être configurée pour accepter les connexions Proxy Protocol. Si votre backend ne prend pas en charge le protocole Proxy, activer ceci va casser toutes les connexions. Assurez-vous de configurer votre backend pour faire confiance aux en-têtes du protocole Proxy de Traefik.", "restarting": "Redémarrage...", - "manual": "Manuelle", + "manual": "Manuel", "messageSupport": "Soutien aux messages", "supportNotAvailableTitle": "Support non disponible", "supportNotAvailableDescription": "L'assistance n'est pas disponible pour le moment. Vous pouvez envoyer un e-mail à support@pangolin.net.", @@ -2081,19 +2096,45 @@ "supportSend": "Envoyer", "supportMessageSent": "Message envoyé !", "supportWillContact": "Nous vous contacterons sous peu!", - "selectLogRetention": "Sélectionner la durée de rétention du journal", + "selectLogRetention": "Sélectionner la durée de rétention des logs", "showColumns": "Afficher les colonnes", "hideColumns": "Cacher les colonnes", "columnVisibility": "Visibilité des colonnes", "toggleColumn": "Activer/désactiver la colonne {columnName}", "allColumns": "Toutes les colonnes", "defaultColumns": "Colonnes par défaut", - "customizeView": "Personnaliser la vue", + "customizeView": "Personnaliser l'apparence", "viewOptions": "Voir les options", "selectAll": "Tout sélectionner", "selectNone": "Ne rien sélectionner", "selectedResources": "Ressources sélectionnées", "enableSelected": "Activer la sélection", "disableSelected": "Désactiver la sélection", - "checkSelectedStatus": "Vérifier le statut de la sélection" -} \ No newline at end of file + "checkSelectedStatus": "Vérifier le statut de la sélection", + "credentials": "Identifiants", + "savecredentials": "Enregistrer les identifiants", + "regeneratecredentials": "Re-claver", + "regenerateCredentials": "Régénérer et enregistrer les identifiants", + "generatedcredentials": "Identifiants générés", + "copyandsavethesecredentials": "Copier et enregistrer ces identifiants", + "copyandsavethesecredentialsdescription": "Ces identifiants ne seront pas affichés à nouveaux une fois cette page fermée. Enregistrez-les maintenant.", + "credentialsSaved": "Identifiants enregistrés", + "credentialsSavedDescription": "Les identifiants ont été régénérés et enregistrés avec succès.", + "credentialsSaveError": "Erreur lors de l'enregistrement des identifiants", + "credentialsSaveErrorDescription": "Une erreur s'est produite lors de la régénération et l'enregistrement des identifiants.", + "regenerateCredentialsWarning": "La régénération de ces identifiants invalidera ceux actuellement utilisés. Assurez-vous de mettre à jour toutes les configurations qui les utilisent.", + "confirm": "Confirmer", + "regenerateCredentialsConfirmation": "Voulez-vous vraiment régénérer les identifiants ?", + "endpoint": "Endpoint", + "Id": "Id", + "SecretKey": "Clé privée", + "featureDisabledTooltip": "Cette fonctionnalité n'est disponible que dans la version entreprise et nécessite une licence pour être utilisée.", + "niceId": "Joli ID", + "niceIdUpdated": "Joli ID mis à jour", + "niceIdUpdatedSuccessfully": "Joli ID mis à jour avec succès", + "niceIdUpdateError": "Erreur lors de la mise à jour du joli ID", + "niceIdUpdateErrorDescription": "Erreur lors de la mise à jour du joli ID.", + "niceIdCannotBeEmpty": "Merci de renseigner un joli ID", + "enterIdentifier": "Entrez l'identifiant", + "identifier": "Identifiant" +} From 986f7121bd1eeac357941179c7a71131d24ed93c Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Mon, 17 Nov 2025 11:03:06 -0500 Subject: [PATCH 17/29] New translations en-us.json (Spanish) --- messages/es-ES.json | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/messages/es-ES.json b/messages/es-ES.json index e8409c25..1b33c928 100644 --- a/messages/es-ES.json +++ b/messages/es-ES.json @@ -1279,6 +1279,15 @@ "settingsErrorUpdateDescription": "Ocurrió un error al actualizar ajustes", "sidebarCollapse": "Colapsar", "sidebarExpand": "Expandir", + "productUpdateMoreInfo": "{noOfUpdates} actualizaciones más", + "productUpdateInfo": "{noOfUpdates} actualizaciones", + "productUpdateWhatsNew": "Novedades", + "productUpdateTitle": "Actualizaciones de producto", + "productUpdateEmpty": "Sin actualizaciones", + "dismissAll": "Descartar todo", + "pangolinUpdateAvailable": "Nueva versión disponible", + "pangolinUpdateAvailableInfo": "La versión {version} está lista para instalar", + "pangolinUpdateAvailableReleaseNotes": "Ver notas del lanzamiento", "newtUpdateAvailable": "Nueva actualización disponible", "newtUpdateAvailableInfo": "Hay una nueva versión de Newt disponible. Actualice a la última versión para la mejor experiencia.", "domainPickerEnterDomain": "Dominio", @@ -1525,6 +1534,12 @@ "resourcesTableTheseResourcesForUseWith": "Estos recursos son para uso con", "resourcesTableClients": "Clientes", "resourcesTableAndOnlyAccessibleInternally": "y solo son accesibles internamente cuando se conectan con un cliente.", + "resourcesTableNoTargets": "Sin objetivos", + "resourcesTableHealthy": "Saludable", + "resourcesTableDegraded": "Degrado", + "resourcesTableOffline": "Desconectado", + "resourcesTableUnknown": "Desconocido", + "resourcesTableNotMonitored": "No supervisado", "editInternalResourceDialogEditClientResource": "Editar recurso del cliente", "editInternalResourceDialogUpdateResourceProperties": "Actualizar las propiedades del recurso y la configuración del objetivo para {resourceName}.", "editInternalResourceDialogResourceProperties": "Propiedades del recurso", @@ -2095,5 +2110,31 @@ "selectedResources": "Recursos seleccionados", "enableSelected": "Habilitar seleccionados", "disableSelected": "Desactivar Seleccionado", - "checkSelectedStatus": "Comprobar el estado de selección" -} \ No newline at end of file + "checkSelectedStatus": "Comprobar el estado de selección", + "credentials": "Credenciales", + "savecredentials": "Guardar credenciales", + "regeneratecredentials": "Re-clave", + "regenerateCredentials": "Regenerar y guardar tus credenciales", + "generatedcredentials": "Credenciales generadas", + "copyandsavethesecredentials": "Copiar y guardar estas credenciales", + "copyandsavethesecredentialsdescription": "Estas credenciales no se mostrarán de nuevo después de salir de esta página. Guárdelas de forma segura ahora.", + "credentialsSaved": "Credenciales guardadas", + "credentialsSavedDescription": "Las credenciales se han regenerado y guardado correctamente.", + "credentialsSaveError": "Error al guardar las credenciales", + "credentialsSaveErrorDescription": "Se ha producido un error al regenerar y guardar las credenciales.", + "regenerateCredentialsWarning": "Regenerar las credenciales invalidará las anteriores. Asegúrese de actualizar cualquier configuración que use estas credenciales.", + "confirm": "Confirmar", + "regenerateCredentialsConfirmation": "¿Está seguro que desea regenerar las credenciales?", + "endpoint": "Endpoint", + "Id": "Id", + "SecretKey": "Clave secreta", + "featureDisabledTooltip": "Esta característica sólo está disponible en el plan empresarial y requiere una licencia para usarla.", + "niceId": "ID bonita", + "niceIdUpdated": "Bonito ID actualizado", + "niceIdUpdatedSuccessfully": "Bonito ID actualizado correctamente", + "niceIdUpdateError": "Error al actualizar Nice ID", + "niceIdUpdateErrorDescription": "Se ha producido un error al actualizar el ID de Niza.", + "niceIdCannotBeEmpty": "El ID de Niza no puede estar vacío", + "enterIdentifier": "Introducir identificador", + "identifier": "Identifier" +} From 269ff630aab86be27951c60b1358b9eb746207c1 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Mon, 17 Nov 2025 11:03:08 -0500 Subject: [PATCH 18/29] New translations en-us.json (Bulgarian) --- messages/bg-BG.json | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/messages/bg-BG.json b/messages/bg-BG.json index ff6a1ad4..7c31feb5 100644 --- a/messages/bg-BG.json +++ b/messages/bg-BG.json @@ -1279,6 +1279,15 @@ "settingsErrorUpdateDescription": "Възникна грешка при обновяване на настройките", "sidebarCollapse": "Свиване", "sidebarExpand": "Разширяване", + "productUpdateMoreInfo": "{noOfUpdates} още актуализации", + "productUpdateInfo": "{noOfUpdates} актуализации", + "productUpdateWhatsNew": "Какво ново", + "productUpdateTitle": "Актуализации на продукта", + "productUpdateEmpty": "Няма актуализации", + "dismissAll": "Отхвърляне на всички", + "pangolinUpdateAvailable": "Налична е нова версия", + "pangolinUpdateAvailableInfo": "Версия {version} е готова за инсталиране", + "pangolinUpdateAvailableReleaseNotes": "Преглед на бележките за издание", "newtUpdateAvailable": "Ново обновление", "newtUpdateAvailableInfo": "Нова версия на Newt е налична. Моля, обновете до последната версия за най-добро изживяване.", "domainPickerEnterDomain": "Домейн", @@ -1525,6 +1534,12 @@ "resourcesTableTheseResourcesForUseWith": "Тези ресурси са за използване с", "resourcesTableClients": "Клиенти", "resourcesTableAndOnlyAccessibleInternally": "и са достъпни само вътрешно при свързване с клиент.", + "resourcesTableNoTargets": "Без цели", + "resourcesTableHealthy": "Здрав", + "resourcesTableDegraded": "Влошен", + "resourcesTableOffline": "Извън линия", + "resourcesTableUnknown": "Неизвестно", + "resourcesTableNotMonitored": "Не е наблюдавано", "editInternalResourceDialogEditClientResource": "Редактиране на клиентски ресурс", "editInternalResourceDialogUpdateResourceProperties": "Актуализирайте свойствата на ресурса и конфигурацията на целите за {resourceName}.", "editInternalResourceDialogResourceProperties": "Свойствата на ресурса", @@ -2095,5 +2110,31 @@ "selectedResources": "Избрани ресурси", "enableSelected": "Разреши избраните", "disableSelected": "Забрани избраните", - "checkSelectedStatus": "Проверете състоянието на избраните" -} \ No newline at end of file + "checkSelectedStatus": "Проверете състоянието на избраните", + "credentials": "Удостоверения", + "savecredentials": "Запазване на удостоверения", + "regeneratecredentials": "Прегенериране", + "regenerateCredentials": "Прегенериране и запазване на удостоверенията ви", + "generatedcredentials": "Прегенерирани удостоверения", + "copyandsavethesecredentials": "Копирайте и запазете тези удостоверения", + "copyandsavethesecredentialsdescription": "Тези удостоверения няма да бъдат показани отново след като напуснете тази страница. Запазете ги сигурно сега.", + "credentialsSaved": "Удостоверенията са запазени", + "credentialsSavedDescription": "Удостоверенията бяха прегенерирани и успешно запазени.", + "credentialsSaveError": "Грешка при запазването на удостоверенията", + "credentialsSaveErrorDescription": "Възникна грешка при прегенерирането и запазването на удостоверенията.", + "regenerateCredentialsWarning": "Прегенерирането на удостоверения ще анулира предишните. Уверете се, че актуализирате всички конфигурации, които използват тези удостоверения.", + "confirm": "Потвърждаване", + "regenerateCredentialsConfirmation": "Сигурни ли сте, че искате да прегенерирате удостоверенията?", + "endpoint": "Крайна точка", + "Id": "Идентификатор", + "SecretKey": "Таен ключ", + "featureDisabledTooltip": "Тази функция е налична само в корпоративния пакет и изисква лиценз за използване.", + "niceId": "Красив ID", + "niceIdUpdated": "Красив ID е обновен", + "niceIdUpdatedSuccessfully": "Красив ID е успешно обновен", + "niceIdUpdateError": "Грешка при обновяването на Красив ID", + "niceIdUpdateErrorDescription": "Възникна грешка при обновяването на Красив ID.", + "niceIdCannotBeEmpty": "Красив ID не може да бъде празен", + "enterIdentifier": "Въведете идентификатор", + "identifier": "Идентификатор" +} From b00fea565691c938fe3cfbe8171bc4997c718a95 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Mon, 17 Nov 2025 11:03:09 -0500 Subject: [PATCH 19/29] New translations en-us.json (Czech) --- messages/cs-CZ.json | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/messages/cs-CZ.json b/messages/cs-CZ.json index 37c7a16d..ff1a6900 100644 --- a/messages/cs-CZ.json +++ b/messages/cs-CZ.json @@ -1279,6 +1279,15 @@ "settingsErrorUpdateDescription": "Došlo k chybě při aktualizaci nastavení", "sidebarCollapse": "Sbalit", "sidebarExpand": "Rozbalit", + "productUpdateMoreInfo": "{noOfUpdates} další aktualizace", + "productUpdateInfo": "Aktualizace {noOfUpdates}", + "productUpdateWhatsNew": "Co je nového", + "productUpdateTitle": "Aktualizace produktu", + "productUpdateEmpty": "Žádné aktualizace", + "dismissAll": "Odmítnout vše", + "pangolinUpdateAvailable": "K dispozici je nová verze", + "pangolinUpdateAvailableInfo": "Verze {version} je připravena k instalaci", + "pangolinUpdateAvailableReleaseNotes": "Zobrazit poznámky k vydání", "newtUpdateAvailable": "Dostupná aktualizace", "newtUpdateAvailableInfo": "Je k dispozici nová verze Newt. Pro nejlepší zážitek prosím aktualizujte na nejnovější verzi.", "domainPickerEnterDomain": "Doména", @@ -1525,6 +1534,12 @@ "resourcesTableTheseResourcesForUseWith": "Tyto zdroje jsou určeny pro použití s", "resourcesTableClients": "Klienti", "resourcesTableAndOnlyAccessibleInternally": "a jsou interně přístupné pouze v případě, že jsou propojeni s klientem.", + "resourcesTableNoTargets": "Žádné cíle", + "resourcesTableHealthy": "Zdravé", + "resourcesTableDegraded": "Rozklad", + "resourcesTableOffline": "Offline", + "resourcesTableUnknown": "Neznámý", + "resourcesTableNotMonitored": "Není sledováno", "editInternalResourceDialogEditClientResource": "Upravit klientský dokument", "editInternalResourceDialogUpdateResourceProperties": "Aktualizujte vlastnosti zdroje a cílovou konfiguraci pro {resourceName}.", "editInternalResourceDialogResourceProperties": "Vlastnosti zdroje", @@ -2095,5 +2110,31 @@ "selectedResources": "Vybrané zdroje", "enableSelected": "Povolit vybrané", "disableSelected": "Zakázat vybrané", - "checkSelectedStatus": "Zkontrolovat stav vybraného" -} \ No newline at end of file + "checkSelectedStatus": "Zkontrolovat stav vybraného", + "credentials": "Pověření", + "savecredentials": "Uložit přihlašovací údaje", + "regeneratecredentials": "Znovu klíče", + "regenerateCredentials": "Regenerovat a uložit vaše přihlašovací údaje", + "generatedcredentials": "Vygenerovaná pověření", + "copyandsavethesecredentials": "Zkopírovat a ukládat tato pověření", + "copyandsavethesecredentialsdescription": "Tyto přihlašovací údaje se znovu nezobrazí po opuštění této stránky. Uložte je bezpečně.", + "credentialsSaved": "Pověření uloženo", + "credentialsSavedDescription": "Pověření byla úspěšně obnovena a uložena.", + "credentialsSaveError": "Chyba při ukládání pověření", + "credentialsSaveErrorDescription": "Došlo k chybě při obnovování a ukládání přihlašovacích údajů.", + "regenerateCredentialsWarning": "Obnovení přihlašovacích údajů zneplatní ty předchozí. Ujistěte se, že aktualizujete všechny konfigurace, které tyto přihlašovací údaje používají.", + "confirm": "Potvrdit", + "regenerateCredentialsConfirmation": "Jste si jisti, že chcete obnovit přihlašovací údaje?", + "endpoint": "Endpoint", + "Id": "Id", + "SecretKey": "Tajný klíč", + "featureDisabledTooltip": "Tato funkce je dostupná pouze v podnikovém plánu a vyžaduje její používání.", + "niceId": "Pěkné ID", + "niceIdUpdated": "Nice ID aktualizováno", + "niceIdUpdatedSuccessfully": "Nice ID úspěšně aktualizováno", + "niceIdUpdateError": "Chyba při aktualizaci Nice ID", + "niceIdUpdateErrorDescription": "Došlo k chybě při aktualizaci identifikátoru Nice.", + "niceIdCannotBeEmpty": "Nice ID nemůže být prázdné", + "enterIdentifier": "Zadejte identifikátor", + "identifier": "Identifier" +} From 61a4f468ba268d6d79baff6b6cffbd0cad6b40a7 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Mon, 17 Nov 2025 11:03:11 -0500 Subject: [PATCH 20/29] New translations en-us.json (German) --- messages/de-DE.json | 65 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 53 insertions(+), 12 deletions(-) diff --git a/messages/de-DE.json b/messages/de-DE.json index a729533d..15a56f2d 100644 --- a/messages/de-DE.json +++ b/messages/de-DE.json @@ -1021,7 +1021,7 @@ "actionDeleteSite": "Standort löschen", "actionGetSite": "Standort abrufen", "actionListSites": "Standorte auflisten", - "actionApplyBlueprint": "Blueprint anwenden", + "actionApplyBlueprint": "Blaupause anwenden", "setupToken": "Setup-Token", "setupTokenDescription": "Geben Sie das Setup-Token von der Serverkonsole ein.", "setupTokenRequired": "Setup-Token ist erforderlich", @@ -1080,11 +1080,11 @@ "actionDeleteIdpOrg": "IDP-Organisationsrichtlinie löschen", "actionListIdpOrgs": "IDP-Organisationen auflisten", "actionUpdateIdpOrg": "IDP-Organisation aktualisieren", - "actionCreateClient": "Client erstellen", + "actionCreateClient": "Client anlegen", "actionDeleteClient": "Client löschen", "actionUpdateClient": "Client aktualisieren", - "actionListClients": "Clientsn auflisten", - "actionGetClient": "Client abrufen", + "actionListClients": "Clients auflisten", + "actionGetClient": "Clients abrufen", "actionCreateSiteResource": "Site-Ressource erstellen", "actionDeleteSiteResource": "Site-Ressource löschen", "actionGetSiteResource": "Site-Ressource abrufen", @@ -1175,9 +1175,9 @@ "blueprintInfo": "Blaupauseninformation", "message": "Nachricht", "blueprintContentsDescription": "Definieren Sie den YAML-Inhalt, der Ihre Infrastruktur beschreibt", - "blueprintErrorCreateDescription": "Fehler beim Anwenden des Blueprints", - "blueprintErrorCreate": "Fehler beim Erstellen des Blueprints", - "searchBlueprintProgress": "Blueprints suchen...", + "blueprintErrorCreateDescription": "Fehler beim Anwenden der Blaupause", + "blueprintErrorCreate": "Fehler beim Erstellen der Blaupause", + "searchBlueprintProgress": "Blaupausen suchen...", "appliedAt": "Angewandt am", "source": "Quelle", "contents": "Inhalt", @@ -1279,6 +1279,15 @@ "settingsErrorUpdateDescription": "Beim Aktualisieren der Einstellungen ist ein Fehler aufgetreten", "sidebarCollapse": "Zusammenklappen", "sidebarExpand": "Aufklappen", + "productUpdateMoreInfo": "{noOfUpdates} weitere Updates", + "productUpdateInfo": "{noOfUpdates} Updates", + "productUpdateWhatsNew": "Was ist neu", + "productUpdateTitle": "Produkt-Updates", + "productUpdateEmpty": "Keine Updates", + "dismissAll": "Alle verwerfen", + "pangolinUpdateAvailable": "Neue Version verfügbar", + "pangolinUpdateAvailableInfo": "Version {version} ist bereit zur Installation", + "pangolinUpdateAvailableReleaseNotes": "Versionshinweise anzeigen", "newtUpdateAvailable": "Update verfügbar", "newtUpdateAvailableInfo": "Eine neue Version von Newt ist verfügbar. Bitte aktualisieren Sie auf die neueste Version für das beste Erlebnis.", "domainPickerEnterDomain": "Domäne", @@ -1423,14 +1432,14 @@ }, "siteRequired": "Standort ist erforderlich.", "olmTunnel": "Olm-Tunnel", - "olmTunnelDescription": "Nutzen Sie Olm für die Clientverbindung", + "olmTunnelDescription": "Nutzen Sie Olm für die Kundenverbindung", "errorCreatingClient": "Fehler beim Erstellen des Clients", "clientDefaultsNotFound": "Standardeinstellungen des Clients nicht gefunden", "createClient": "Client erstellen", "createClientDescription": "Erstellen Sie einen neuen Client für die Verbindung zu Ihren Standorten.", "seeAllClients": "Alle Clients anzeigen", - "clientInformation": "Clientninformationen", - "clientNamePlaceholder": "Clientname", + "clientInformation": "Client Informationen", + "clientNamePlaceholder": "Client Name", "address": "Adresse", "subnetPlaceholder": "Subnetz", "addressDescription": "Die Adresse, die dieser Client für die Verbindung verwenden wird.", @@ -1525,6 +1534,12 @@ "resourcesTableTheseResourcesForUseWith": "Diese Ressourcen sind zur Verwendung mit", "resourcesTableClients": "Clients", "resourcesTableAndOnlyAccessibleInternally": "und sind nur intern zugänglich, wenn mit einem Client verbunden.", + "resourcesTableNoTargets": "Keine Ziele", + "resourcesTableHealthy": "Gesund", + "resourcesTableDegraded": "Degradiert", + "resourcesTableOffline": "Offline", + "resourcesTableUnknown": "Unbekannt", + "resourcesTableNotMonitored": "Nicht überwacht", "editInternalResourceDialogEditClientResource": "Client-Ressource bearbeiten", "editInternalResourceDialogUpdateResourceProperties": "Aktualisieren Sie die Ressourceneigenschaften und die Zielkonfiguration für {resourceName}.", "editInternalResourceDialogResourceProperties": "Ressourceneigenschaften", @@ -2095,5 +2110,31 @@ "selectedResources": "Ausgewählte Ressourcen", "enableSelected": "Ausgewählte aktivieren", "disableSelected": "Ausgewählte deaktivieren", - "checkSelectedStatus": "Status der Auswahl überprüfen" -} \ No newline at end of file + "checkSelectedStatus": "Status der Auswahl überprüfen", + "credentials": "Zugangsdaten", + "savecredentials": "Zugangsdaten speichern", + "regeneratecredentials": "Re-Key", + "regenerateCredentials": "Regenerieren und speichern Sie Ihre Zugangsdaten", + "generatedcredentials": "Generierte Zugangsdaten", + "copyandsavethesecredentials": "Diese Zugangsdaten kopieren und speichern", + "copyandsavethesecredentialsdescription": "Diese Zugangsdaten werden nach dem Verlassen dieser Seite nicht mehr angezeigt. Speichern Sie sie jetzt sicher.", + "credentialsSaved": "Zugangsdaten gespeichert", + "credentialsSavedDescription": "Zugangsdaten wurden neu erstellt und erfolgreich gespeichert.", + "credentialsSaveError": "Fehler beim Speichern der Zugangsdaten", + "credentialsSaveErrorDescription": "Beim Erneuern und Speichern der Zugangsdaten ist ein Fehler aufgetreten.", + "regenerateCredentialsWarning": "Das Regenerieren von Zugangsdaten wird die vorhergehenden ungültig machen. Bitte aktualisieren die Konfigurationen, welche diese Zugangsdaten verwenden.", + "confirm": "Bestätigen", + "regenerateCredentialsConfirmation": "Sind Sie sicher, dass Sie die Zugangsdaten neu generieren möchten?", + "endpoint": "Endpunkt", + "Id": "ID", + "SecretKey": "Geheimer Schlüssel", + "featureDisabledTooltip": "Diese Funktion ist nur im Enterprise-Plan verfügbar und erfordert eine Lizenz, um sie zu nutzen.", + "niceId": "Schöne ID", + "niceIdUpdated": "Schöne ID aktualisiert", + "niceIdUpdatedSuccessfully": "Nice ID erfolgreich aktualisiert", + "niceIdUpdateError": "Fehler beim Aktualisieren der Nizza-ID", + "niceIdUpdateErrorDescription": "Beim Aktualisieren der Nizza-ID ist ein Fehler aufgetreten.", + "niceIdCannotBeEmpty": "Nizza-ID darf nicht leer sein", + "enterIdentifier": "Identifikator eingeben", + "identifier": "Identifier" +} From 710f16ce68ae9fe1ad16b7a0cde2f7cd97e2e79b Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Mon, 17 Nov 2025 11:03:13 -0500 Subject: [PATCH 21/29] New translations en-us.json (Italian) --- messages/it-IT.json | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/messages/it-IT.json b/messages/it-IT.json index 0e8c2d83..08f1e405 100644 --- a/messages/it-IT.json +++ b/messages/it-IT.json @@ -1279,6 +1279,15 @@ "settingsErrorUpdateDescription": "Si è verificato un errore durante l'aggiornamento delle impostazioni", "sidebarCollapse": "Comprimi", "sidebarExpand": "Espandi", + "productUpdateMoreInfo": "{noOfUpdates} altri aggiornamenti", + "productUpdateInfo": "{noOfUpdates} aggiornamenti", + "productUpdateWhatsNew": "Novità", + "productUpdateTitle": "Aggiornamenti Prodotto", + "productUpdateEmpty": "Nessun aggiornamento", + "dismissAll": "Ignora tutto", + "pangolinUpdateAvailable": "Nuova versione disponibile", + "pangolinUpdateAvailableInfo": "La versione {version} è pronta per l'installazione", + "pangolinUpdateAvailableReleaseNotes": "Visualizza note di rilascio", "newtUpdateAvailable": "Aggiornamento Disponibile", "newtUpdateAvailableInfo": "È disponibile una nuova versione di Newt. Si prega di aggiornare all'ultima versione per la migliore esperienza.", "domainPickerEnterDomain": "Dominio", @@ -1525,6 +1534,12 @@ "resourcesTableTheseResourcesForUseWith": "Queste risorse sono per uso con", "resourcesTableClients": "Client", "resourcesTableAndOnlyAccessibleInternally": "e sono accessibili solo internamente quando connessi con un client.", + "resourcesTableNoTargets": "Nessun obiettivo", + "resourcesTableHealthy": "Sano", + "resourcesTableDegraded": "Degraded", + "resourcesTableOffline": "Offline", + "resourcesTableUnknown": "Sconosciuto", + "resourcesTableNotMonitored": "Non monitorato", "editInternalResourceDialogEditClientResource": "Modifica Risorsa Client", "editInternalResourceDialogUpdateResourceProperties": "Aggiorna le proprietà della risorsa e la configurazione del target per {resourceName}.", "editInternalResourceDialogResourceProperties": "Proprietà della Risorsa", @@ -2095,5 +2110,31 @@ "selectedResources": "Risorse Selezionate", "enableSelected": "Abilita Selezionati", "disableSelected": "Disabilita Selezionati", - "checkSelectedStatus": "Controlla lo stato dei selezionati" -} \ No newline at end of file + "checkSelectedStatus": "Controlla lo stato dei selezionati", + "credentials": "Credenziali", + "savecredentials": "Salva Credenziali", + "regeneratecredentials": "Ri-chiave", + "regenerateCredentials": "Rigenera e salva le tue credenziali", + "generatedcredentials": "Credenziali Generate", + "copyandsavethesecredentials": "Copia e salva queste credenziali", + "copyandsavethesecredentialsdescription": "Queste credenziali non verranno mostrate di nuovo dopo aver lasciato questa pagina. Salvarle in modo sicuro ora.", + "credentialsSaved": "Credenziali Salvate", + "credentialsSavedDescription": "Le credenziali sono state rigenerate e salvate con successo.", + "credentialsSaveError": "Errore Di Salvataggio Credenziali", + "credentialsSaveErrorDescription": "Errore durante la rigenerazione e il salvataggio delle credenziali.", + "regenerateCredentialsWarning": "Rigenerare le credenziali invaliderà quelle precedenti. Assicurarsi di aggiornare le configurazioni che utilizzano queste credenziali.", + "confirm": "Conferma", + "regenerateCredentialsConfirmation": "Sei sicuro di voler rigenerare le credenziali?", + "endpoint": "Endpoint", + "Id": "Id", + "SecretKey": "Chiave Segreta", + "featureDisabledTooltip": "Questa funzione è disponibile solo nel piano aziendale e richiede una licenza per utilizzarla.", + "niceId": "Simpatico ID", + "niceIdUpdated": "Nice ID Aggiornato", + "niceIdUpdatedSuccessfully": "Nizza Id Aggiornato Con Successo", + "niceIdUpdateError": "Errore nell'aggiornare Nice ID", + "niceIdUpdateErrorDescription": "Si è verificato un errore durante l'aggiornamento del Nice ID.", + "niceIdCannotBeEmpty": "Il Nice ID non può essere vuoto", + "enterIdentifier": "Inserisci identificatore", + "identifier": "Identifier" +} From 2162f5f76f704a0e4df2acf1772aff7e5ae04566 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Mon, 17 Nov 2025 11:03:14 -0500 Subject: [PATCH 22/29] New translations en-us.json (Korean) --- messages/ko-KR.json | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/messages/ko-KR.json b/messages/ko-KR.json index d892a5a2..2ce7f7e6 100644 --- a/messages/ko-KR.json +++ b/messages/ko-KR.json @@ -1279,6 +1279,15 @@ "settingsErrorUpdateDescription": "설정을 업데이트하는 동안 오류가 발생했습니다", "sidebarCollapse": "줄이기", "sidebarExpand": "확장하기", + "productUpdateMoreInfo": "{noOfUpdates}개의 더 많은 업데이트", + "productUpdateInfo": "{noOfUpdates}개 업데이트", + "productUpdateWhatsNew": "새로운 기능", + "productUpdateTitle": "제품 업데이트", + "productUpdateEmpty": "업데이트 없음", + "dismissAll": "모두 해제", + "pangolinUpdateAvailable": "새 버전 사용 가능", + "pangolinUpdateAvailableInfo": "버전 {version}을(를) 설치할 준비가 되었습니다", + "pangolinUpdateAvailableReleaseNotes": "릴리스 노트 보기", "newtUpdateAvailable": "업데이트 가능", "newtUpdateAvailableInfo": "뉴트의 새 버전이 출시되었습니다. 최상의 경험을 위해 최신 버전으로 업데이트하세요.", "domainPickerEnterDomain": "도메인", @@ -1525,6 +1534,12 @@ "resourcesTableTheseResourcesForUseWith": "이 리소스는 다음과 함께 사용하기 위한 것입니다.", "resourcesTableClients": "클라이언트", "resourcesTableAndOnlyAccessibleInternally": "클라이언트와 연결되었을 때만 내부적으로 접근 가능합니다.", + "resourcesTableNoTargets": "대상 없음", + "resourcesTableHealthy": "정상", + "resourcesTableDegraded": "저하됨", + "resourcesTableOffline": "오프라인", + "resourcesTableUnknown": "알 수 없음", + "resourcesTableNotMonitored": "모니터링되지 않음", "editInternalResourceDialogEditClientResource": "클라이언트 리소스 수정", "editInternalResourceDialogUpdateResourceProperties": "{resourceName}의 리소스 속성과 대상 구성을 업데이트하세요.", "editInternalResourceDialogResourceProperties": "리소스 속성", @@ -2095,5 +2110,31 @@ "selectedResources": "선택된 리소스", "enableSelected": "선택된 항목 활성화", "disableSelected": "선택된 항목 비활성화", - "checkSelectedStatus": "선택된 항목 상태 확인" -} \ No newline at end of file + "checkSelectedStatus": "선택된 항목 상태 확인", + "credentials": "자격 증명", + "savecredentials": "자격 증명 저장", + "regeneratecredentials": "재생성", + "regenerateCredentials": "자격 증명을 재생성하고 저장합니다", + "generatedcredentials": "생성된 자격 증명", + "copyandsavethesecredentials": "이 자격 증명을 복사하여 저장합니다", + "copyandsavethesecredentialsdescription": "이 페이지를 떠난 후에는 자격 증명이 다시 표시되지 않습니다. 지금 안전하게 저장하십시오.", + "credentialsSaved": "자격 증명 저장됨", + "credentialsSavedDescription": "자격 증명이 성공적으로 재생성 및 저장되었습니다.", + "credentialsSaveError": "자격 증명 저장 오류", + "credentialsSaveErrorDescription": "자격 증명을 재생성하고 저장하는 동안 오류가 발생했습니다.", + "regenerateCredentialsWarning": "자격 증명을 재생성하면 이전 자격 증명이 무효화됩니다. 이 자격 증명을 사용하는 모든 구성을 업데이트하십시오.", + "confirm": "확인", + "regenerateCredentialsConfirmation": "자격 증명을 재생성하시겠습니까?", + "endpoint": "엔드포인트", + "Id": "아이디", + "SecretKey": "비밀 키", + "featureDisabledTooltip": "이 기능은 엔터프라이즈 플랜에서만 사용할 수 있으며 라이센스가 필요합니다.", + "niceId": "예쁜 ID", + "niceIdUpdated": "예쁜 ID 업데이트됨", + "niceIdUpdatedSuccessfully": "예쁜 ID가 성공적으로 업데이트되었습니다", + "niceIdUpdateError": "예쁜 ID 업데이트 오류", + "niceIdUpdateErrorDescription": "예쁜 ID를 업데이트하는 동안 오류가 발생했습니다.", + "niceIdCannotBeEmpty": "예쁜 ID는 비워둘 수 없습니다", + "enterIdentifier": "식별자 입력", + "identifier": "식별자" +} From 612b04c26f1c6d28fd0f4acd037220803d8689ad Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Mon, 17 Nov 2025 11:03:16 -0500 Subject: [PATCH 23/29] New translations en-us.json (Dutch) --- messages/nl-NL.json | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/messages/nl-NL.json b/messages/nl-NL.json index 0a6c2ae5..73ba2acc 100644 --- a/messages/nl-NL.json +++ b/messages/nl-NL.json @@ -1279,6 +1279,15 @@ "settingsErrorUpdateDescription": "Er is een fout opgetreden bij het bijwerken van instellingen", "sidebarCollapse": "Inklappen", "sidebarExpand": "Uitklappen", + "productUpdateMoreInfo": "Nog {noOfUpdates} updates", + "productUpdateInfo": "{noOfUpdates} updates", + "productUpdateWhatsNew": "Wat is nieuw", + "productUpdateTitle": "Update Producten", + "productUpdateEmpty": "Geen updates", + "dismissAll": "Alles afwijzen", + "pangolinUpdateAvailable": "Nieuwe versie beschikbaar", + "pangolinUpdateAvailableInfo": "Versie {version} is klaar om te installeren", + "pangolinUpdateAvailableReleaseNotes": "Bekijk release notities", "newtUpdateAvailable": "Update beschikbaar", "newtUpdateAvailableInfo": "Er is een nieuwe versie van Newt beschikbaar. Update naar de nieuwste versie voor de beste ervaring.", "domainPickerEnterDomain": "Domein", @@ -1525,6 +1534,12 @@ "resourcesTableTheseResourcesForUseWith": "Deze bronnen zijn bedoeld voor gebruik met", "resourcesTableClients": "Clienten", "resourcesTableAndOnlyAccessibleInternally": "en zijn alleen intern toegankelijk wanneer verbonden met een client.", + "resourcesTableNoTargets": "Geen doelen", + "resourcesTableHealthy": "Gezond", + "resourcesTableDegraded": "Verminderde", + "resourcesTableOffline": "Offline", + "resourcesTableUnknown": "onbekend", + "resourcesTableNotMonitored": "Niet gecontroleerd", "editInternalResourceDialogEditClientResource": "Bewerk clientbron", "editInternalResourceDialogUpdateResourceProperties": "Werk de eigenschapen van de bron en doelconfiguratie bij voor {resourceName}.", "editInternalResourceDialogResourceProperties": "Bron eigenschappen", @@ -2095,5 +2110,31 @@ "selectedResources": "Geselecteerde bronnen", "enableSelected": "Selectie inschakelen", "disableSelected": "Selectie uitschakelen", - "checkSelectedStatus": "Controleer de status van de geselecteerde" -} \ No newline at end of file + "checkSelectedStatus": "Controleer de status van de geselecteerde", + "credentials": "Aanmeldgegevens", + "savecredentials": "Referenties opslaan", + "regeneratecredentials": "Hersleutel", + "regenerateCredentials": "Opnieuw genereren en opslaan van uw referenties", + "generatedcredentials": "Gegenereerde referenties", + "copyandsavethesecredentials": "Kopieer en bewaar deze inloggegevens", + "copyandsavethesecredentialsdescription": "Deze referenties worden niet meer getoond nadat u deze pagina verlaat. Sla ze nu veilig op.", + "credentialsSaved": "Referenties opgeslagen", + "credentialsSavedDescription": "Referenties werden met succes opnieuw gegenereerd en opgeslagen.", + "credentialsSaveError": "Fout bij opslaan referenties", + "credentialsSaveErrorDescription": "Er is een fout opgetreden tijdens het opnieuw genereren en opslaan van de inloggegevens.", + "regenerateCredentialsWarning": "Het opnieuw genereren van inloggegevens zal de vorige ongeldig maken. Zorg ervoor dat alle configuraties die deze inloggegevens gebruiken bijgewerkt worden.", + "confirm": "Bevestigen", + "regenerateCredentialsConfirmation": "Weet u zeker dat u de inloggegevens opnieuw wilt genereren?", + "endpoint": "Endpoint", + "Id": "Id", + "SecretKey": "Geheime sleutel", + "featureDisabledTooltip": "Deze functie is alleen beschikbaar in het bedrijfsplan en vereist een licentie om deze te gebruiken.", + "niceId": "Leuk ID", + "niceIdUpdated": "Leuke ID bijgewerkt", + "niceIdUpdatedSuccessfully": "Nice ID Updated Successfully", + "niceIdUpdateError": "Fout bij bijwerken ID Nice", + "niceIdUpdateErrorDescription": "Fout opgetreden tijdens het bijwerken van de ID van Nice.", + "niceIdCannotBeEmpty": "Nice ID mag niet leeg zijn", + "enterIdentifier": "ID invoeren", + "identifier": "Identifier" +} From a82969b778abe1962cd97c5c31aa797efecd77cb Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Mon, 17 Nov 2025 11:03:18 -0500 Subject: [PATCH 24/29] New translations en-us.json (Polish) --- messages/pl-PL.json | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/messages/pl-PL.json b/messages/pl-PL.json index 2acb3291..6c401dfa 100644 --- a/messages/pl-PL.json +++ b/messages/pl-PL.json @@ -1279,6 +1279,15 @@ "settingsErrorUpdateDescription": "Wystąpił błąd podczas aktualizacji ustawień", "sidebarCollapse": "Zwiń", "sidebarExpand": "Rozwiń", + "productUpdateMoreInfo": "{noOfUpdates} więcej aktualizacji", + "productUpdateInfo": "Aktualizacje {noOfUpdates}", + "productUpdateWhatsNew": "Co nowego", + "productUpdateTitle": "Aktualizacje produktu", + "productUpdateEmpty": "Brak aktualizacji", + "dismissAll": "Zamknij wszystkie", + "pangolinUpdateAvailable": "Dostępna jest nowa wersja", + "pangolinUpdateAvailableInfo": "Wersja {version} jest gotowa do zainstalowania", + "pangolinUpdateAvailableReleaseNotes": "Zobacz notatki o wydaniu", "newtUpdateAvailable": "Dostępna aktualizacja", "newtUpdateAvailableInfo": "Nowa wersja Newt jest dostępna. Prosimy o aktualizację do najnowszej wersji dla najlepszej pracy.", "domainPickerEnterDomain": "Domena", @@ -1525,6 +1534,12 @@ "resourcesTableTheseResourcesForUseWith": "Te zasoby są do użytku z", "resourcesTableClients": "Klientami", "resourcesTableAndOnlyAccessibleInternally": "i są dostępne tylko wewnętrznie po połączeniu z klientem.", + "resourcesTableNoTargets": "Brak celów", + "resourcesTableHealthy": "Zdrowe", + "resourcesTableDegraded": "Degradacja", + "resourcesTableOffline": "Offline", + "resourcesTableUnknown": "Nieznane", + "resourcesTableNotMonitored": "Nie monitorowano", "editInternalResourceDialogEditClientResource": "Edytuj zasób klienta", "editInternalResourceDialogUpdateResourceProperties": "Zaktualizuj właściwości zasobu i konfigurację celu dla {resourceName}.", "editInternalResourceDialogResourceProperties": "Właściwości zasobów", @@ -2095,5 +2110,31 @@ "selectedResources": "Wybrane Zasoby", "enableSelected": "Włącz zaznaczone", "disableSelected": "Wyłącz zaznaczone", - "checkSelectedStatus": "Sprawdź status zaznaczonych" -} \ No newline at end of file + "checkSelectedStatus": "Sprawdź status zaznaczonych", + "credentials": "Dane logowania", + "savecredentials": "Zapisz dane logowania", + "regeneratecredentials": "Przycisk ponownie", + "regenerateCredentials": "Ponownie wygeneruj i zapisz swoje dane logowania", + "generatedcredentials": "Wygenerowane dane logowania", + "copyandsavethesecredentials": "Skopiuj i zapisz te dane logowania", + "copyandsavethesecredentialsdescription": "Te dane uwierzytelniające nie będą wyświetlane ponownie po opuszczeniu tej strony. Zapisz je teraz bezpiecznie.", + "credentialsSaved": "Zapisano dane logowania", + "credentialsSavedDescription": "Dane logowania zostały wygenerowane i zapisane pomyślnie.", + "credentialsSaveError": "Błąd zapisu danych logowania", + "credentialsSaveErrorDescription": "Wystąpił błąd podczas regeneracji i zapisywania poświadczeń.", + "regenerateCredentialsWarning": "Regeneracja poświadczeń spowoduje unieważnienie poprzednich poświadczeń. Upewnij się, że zaktualizowano wszystkie konfiguracje, które używają tych poświadczeń.", + "confirm": "Potwierdź", + "regenerateCredentialsConfirmation": "Czy na pewno chcesz wygenerować dane logowania?", + "endpoint": "Endpoint", + "Id": "Id", + "SecretKey": "Sekretny klucz", + "featureDisabledTooltip": "Ta funkcja jest dostępna tylko w planie przedsiębiorstwa i wymaga licencji, aby z niej korzystać.", + "niceId": "Niepoprawne ID", + "niceIdUpdated": "Zaktualizowano błędne ID", + "niceIdUpdatedSuccessfully": "Zaktualizowano błędne ID", + "niceIdUpdateError": "Błąd podczas aktualizacji Nice ID", + "niceIdUpdateErrorDescription": "Wystąpił błąd podczas aktualizowania Nicei ID.", + "niceIdCannotBeEmpty": "Niepoprawny identyfikator nie może być pusty", + "enterIdentifier": "Wprowadź identyfikator", + "identifier": "Identifier" +} From 026ad2ccb92ef518743ce1acd5a2778040a91193 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Mon, 17 Nov 2025 11:03:19 -0500 Subject: [PATCH 25/29] New translations en-us.json (Portuguese) --- messages/pt-PT.json | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/messages/pt-PT.json b/messages/pt-PT.json index cb0bc29b..ed9a4551 100644 --- a/messages/pt-PT.json +++ b/messages/pt-PT.json @@ -1279,6 +1279,15 @@ "settingsErrorUpdateDescription": "Ocorreu um erro ao atualizar configurações", "sidebarCollapse": "Recolher", "sidebarExpand": "Expandir", + "productUpdateMoreInfo": "Mais {noOfUpdates} atualizações", + "productUpdateInfo": "Atualizações {noOfUpdates}", + "productUpdateWhatsNew": "Novidades", + "productUpdateTitle": "Atualizações de Produto", + "productUpdateEmpty": "Não há atualizações", + "dismissAll": "Recusar tudo", + "pangolinUpdateAvailable": "Nova versão disponível", + "pangolinUpdateAvailableInfo": "A versão {version} está pronta para ser instalada", + "pangolinUpdateAvailableReleaseNotes": "Ver notas de lançamento", "newtUpdateAvailable": "Nova Atualização Disponível", "newtUpdateAvailableInfo": "Uma nova versão do Newt está disponível. Atualize para a versão mais recente para uma melhor experiência.", "domainPickerEnterDomain": "Domínio", @@ -1525,6 +1534,12 @@ "resourcesTableTheseResourcesForUseWith": "Esses recursos são para uso com", "resourcesTableClients": "Clientes", "resourcesTableAndOnlyAccessibleInternally": "e são acessíveis apenas internamente quando conectados com um cliente.", + "resourcesTableNoTargets": "Nenhum alvo", + "resourcesTableHealthy": "Saudável", + "resourcesTableDegraded": "Degradado", + "resourcesTableOffline": "Desconectado", + "resourcesTableUnknown": "Desconhecido", + "resourcesTableNotMonitored": "Não monitorado", "editInternalResourceDialogEditClientResource": "Editar Recurso do Cliente", "editInternalResourceDialogUpdateResourceProperties": "Atualize as propriedades do recurso e a configuração do alvo para {resourceName}.", "editInternalResourceDialogResourceProperties": "Propriedades do Recurso", @@ -2095,5 +2110,31 @@ "selectedResources": "Recursos Selecionados", "enableSelected": "Habilitar Selecionados", "disableSelected": "Desativar Selecionados", - "checkSelectedStatus": "Status de Verificação dos Selecionados" -} \ No newline at end of file + "checkSelectedStatus": "Status de Verificação dos Selecionados", + "credentials": "Credenciais", + "savecredentials": "Salvar Credenciais", + "regeneratecredentials": "Rechave", + "regenerateCredentials": "Regenerar e salvar suas credenciais", + "generatedcredentials": "Credenciais Geradas", + "copyandsavethesecredentials": "Copiar e salvar estas credenciais", + "copyandsavethesecredentialsdescription": "Essas credenciais não serão exibidas novamente depois que você sair desta página. Salve elas com segurança agora.", + "credentialsSaved": "Credenciais salvas", + "credentialsSavedDescription": "As credenciais foram regeneradas e salvas com sucesso.", + "credentialsSaveError": "Erro ao Salvar Credenciais", + "credentialsSaveErrorDescription": "Ocorreu um erro enquanto regenerava e salvava as credenciais.", + "regenerateCredentialsWarning": "Regenerar credenciais irá invalidar as anteriores. Certifique-se de atualizar qualquer configuração que use essas credenciais.", + "confirm": "Confirmar", + "regenerateCredentialsConfirmation": "Você tem certeza que deseja recriar as credenciais?", + "endpoint": "Endpoint", + "Id": "Id", + "SecretKey": "Chave secreta", + "featureDisabledTooltip": "Este recurso só está disponível no plano corporativo e requer que uma licença utilize.", + "niceId": "Belo ID", + "niceIdUpdated": "Bom ID atualizado", + "niceIdUpdatedSuccessfully": "Bom ID atualizado com sucesso", + "niceIdUpdateError": "Erro ao atualizar Nice ID", + "niceIdUpdateErrorDescription": "Ocorreu um erro ao atualizar a ID de Nice.", + "niceIdCannotBeEmpty": "Bom ID não pode estar vazio", + "enterIdentifier": "Inserir identificador", + "identifier": "Identifier" +} From 2890ff2605cfc01e0a6c17828812071557a443fb Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Mon, 17 Nov 2025 11:03:21 -0500 Subject: [PATCH 26/29] New translations en-us.json (Russian) --- messages/ru-RU.json | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/messages/ru-RU.json b/messages/ru-RU.json index b3608b98..23c521c1 100644 --- a/messages/ru-RU.json +++ b/messages/ru-RU.json @@ -1279,6 +1279,15 @@ "settingsErrorUpdateDescription": "Произошла ошибка при обновлении настроек", "sidebarCollapse": "Свернуть", "sidebarExpand": "Развернуть", + "productUpdateMoreInfo": "{noOfUpdates} больше обновлений", + "productUpdateInfo": "{noOfUpdates} обновлений", + "productUpdateWhatsNew": "Что нового", + "productUpdateTitle": "Обновления продуктов", + "productUpdateEmpty": "Нет обновлений", + "dismissAll": "Отклонить все", + "pangolinUpdateAvailable": "Доступна новая версия", + "pangolinUpdateAvailableInfo": "Версия {version} готова к установке", + "pangolinUpdateAvailableReleaseNotes": "Просмотреть заметки о выпуске", "newtUpdateAvailable": "Доступно обновление", "newtUpdateAvailableInfo": "Доступна новая версия Newt. Пожалуйста, обновитесь до последней версии для лучшего опыта.", "domainPickerEnterDomain": "Домен", @@ -1525,6 +1534,12 @@ "resourcesTableTheseResourcesForUseWith": "Эти ресурсы предназначены для использования с", "resourcesTableClients": "Клиенты", "resourcesTableAndOnlyAccessibleInternally": "и доступны только внутренне при подключении с клиентом.", + "resourcesTableNoTargets": "Нет ярлыков", + "resourcesTableHealthy": "Здоровые", + "resourcesTableDegraded": "Ухудшение", + "resourcesTableOffline": "Оффлайн", + "resourcesTableUnknown": "Неизвестен", + "resourcesTableNotMonitored": "Не отслеживается", "editInternalResourceDialogEditClientResource": "Редактировать ресурс клиента", "editInternalResourceDialogUpdateResourceProperties": "Обновите свойства ресурса и настройку цели для {resourceName}.", "editInternalResourceDialogResourceProperties": "Свойства ресурса", @@ -2095,5 +2110,31 @@ "selectedResources": "Выбранные ресурсы", "enableSelected": "Включить выбранные", "disableSelected": "Отключить выбранные", - "checkSelectedStatus": "Проверить статус выбранных" -} \ No newline at end of file + "checkSelectedStatus": "Проверить статус выбранных", + "credentials": "Полномочия", + "savecredentials": "Сохранить учетные данные", + "regeneratecredentials": "Пере-ключ", + "regenerateCredentials": "Сгенерировать и сохранить ваши учетные данные", + "generatedcredentials": "Сгенерированные учетные данные", + "copyandsavethesecredentials": "Копировать и сохранить эти учетные данные", + "copyandsavethesecredentialsdescription": "Эти учетные данные не будут отображаться снова после того, как вы покинете эту страницу. Сохраните их сейчас.", + "credentialsSaved": "Учетные данные сохранены", + "credentialsSavedDescription": "Учетные данные были успешно восстановлены и сохранены.", + "credentialsSaveError": "Ошибка сохранения учетных данных", + "credentialsSaveErrorDescription": "Произошла ошибка при восстановлении и сохранении учетных данных.", + "regenerateCredentialsWarning": "Восстановление учётных данных приведет к недействительным предыдущим. Убедитесь, что все конфигурации, использующие эти учетные данные.", + "confirm": "Подтвердить", + "regenerateCredentialsConfirmation": "Вы уверены, что хотите восстановить учетные данные?", + "endpoint": "Endpoint", + "Id": "Id", + "SecretKey": "Секретный ключ", + "featureDisabledTooltip": "Эта функция доступна только в плане предприятия и требует лицензии на ее использование.", + "niceId": "Неплохой ID", + "niceIdUpdated": "Хороший ID обновлен", + "niceIdUpdatedSuccessfully": "Неплохой ID успешно обновлен", + "niceIdUpdateError": "Ошибка обновления Nice ID", + "niceIdUpdateErrorDescription": "Произошла ошибка при обновлении Nice ID.", + "niceIdCannotBeEmpty": "Неправильный ID не может быть пустым", + "enterIdentifier": "Введите идентификатор", + "identifier": "Identifier" +} From fef91010582a47b7afbf9afe254583a4285de23d Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Mon, 17 Nov 2025 11:03:23 -0500 Subject: [PATCH 27/29] New translations en-us.json (Turkish) --- messages/tr-TR.json | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/messages/tr-TR.json b/messages/tr-TR.json index a396059e..7fc8c5ff 100644 --- a/messages/tr-TR.json +++ b/messages/tr-TR.json @@ -1279,6 +1279,15 @@ "settingsErrorUpdateDescription": "Ayarları güncellerken bir hata oluştu", "sidebarCollapse": "Daralt", "sidebarExpand": "Genişlet", + "productUpdateMoreInfo": "{noOfUpdates} daha fazla güncelleme", + "productUpdateInfo": "{noOfUpdates} güncellemeler", + "productUpdateWhatsNew": "Neler Yeni", + "productUpdateTitle": "Ürün Güncellemeleri", + "productUpdateEmpty": "Güncelleme yok", + "dismissAll": "Hepsini Kapat", + "pangolinUpdateAvailable": "Yeni sürüm mevcut", + "pangolinUpdateAvailableInfo": "Sürüm {version} yüklenmeye hazır", + "pangolinUpdateAvailableReleaseNotes": "Sürüm notlarını görüntüleyin", "newtUpdateAvailable": "Güncelleme Mevcut", "newtUpdateAvailableInfo": "Newt'in yeni bir versiyonu mevcut. En iyi deneyim için lütfen en son sürüme güncelleyin.", "domainPickerEnterDomain": "Alan Adı", @@ -1525,6 +1534,12 @@ "resourcesTableTheseResourcesForUseWith": "Bu kaynaklar ile kullanılmak için", "resourcesTableClients": "İstemciler", "resourcesTableAndOnlyAccessibleInternally": "veyalnızca bir istemci ile bağlandığında dahili olarak erişilebilir.", + "resourcesTableNoTargets": "Hedef yok", + "resourcesTableHealthy": "Sağlıklı", + "resourcesTableDegraded": "Düşük Performanslı", + "resourcesTableOffline": "Çevrimdışı", + "resourcesTableUnknown": "Bilinmiyor", + "resourcesTableNotMonitored": "İzlenmiyor", "editInternalResourceDialogEditClientResource": "İstemci Kaynağı Düzenleyin", "editInternalResourceDialogUpdateResourceProperties": "{resourceName} için kaynak özelliklerini ve hedef yapılandırmasını güncelleyin.", "editInternalResourceDialogResourceProperties": "Kaynak Özellikleri", @@ -2095,5 +2110,31 @@ "selectedResources": "Seçilen Kaynaklar", "enableSelected": "Seçilenleri Etkinleştir", "disableSelected": "Seçilenleri Devre Dışı Bırak", - "checkSelectedStatus": "Seçilenlerin Durumunu Kontrol Et" -} \ No newline at end of file + "checkSelectedStatus": "Seçilenlerin Durumunu Kontrol Et", + "credentials": "Kimlik Bilgileri", + "savecredentials": "Kimlik Bilgilerini Kaydet", + "regeneratecredentials": "Yeniden Anahtarla", + "regenerateCredentials": "Kimlik bilgilerinizi yeniden oluşturun ve kaydedin", + "generatedcredentials": "Oluşturulan Kimlik Bilgileri", + "copyandsavethesecredentials": "Bu kimlik bilgilerini kopyalayın ve kaydedin", + "copyandsavethesecredentialsdescription": "Bu sayfadan ayrıldıktan sonra bu kimlik bilgileri tekrar gösterilmeyecek. Onları şimdi güvenli bir şekilde saklayın.", + "credentialsSaved": "Kimlik Bilgileri Kaydedildi", + "credentialsSavedDescription": "Kimlik bilgileri başarılı bir şekilde yeniden oluşturuldu ve kaydedildi.", + "credentialsSaveError": "Kimlik Bilgileri Kayıt Hatası", + "credentialsSaveErrorDescription": "Kimlik bilgilerini yeniden oluştururken ve kaydederken bir hata oluştu.", + "regenerateCredentialsWarning": "Kimlik bilgilerini yeniden oluşturmak önceki bilgileri geçersiz kılacaktır. Bu kimlik bilgilerini kullanan tüm yapılandırmaları güncellediğinizden emin olun.", + "confirm": "Onayla", + "regenerateCredentialsConfirmation": "Kimlik bilgilerini yeniden oluşturmak istediğinizden emin misiniz?", + "endpoint": "Uç Nokta", + "Id": "Kimlik", + "SecretKey": "Gizli Anahtar", + "featureDisabledTooltip": "Bu özellik yalnızca kurumsal planda mevcuttur ve kullanmak için lisans gerektirir.", + "niceId": "Güzel Kimlik", + "niceIdUpdated": "Güzel Kimlik Güncellendi", + "niceIdUpdatedSuccessfully": "Güzel Kimlik Başarıyla Güncellendi", + "niceIdUpdateError": "Güzel Kimlik güncellenirken hata", + "niceIdUpdateErrorDescription": "Güzel Kimlik güncellenirken bir hata oluştu.", + "niceIdCannotBeEmpty": "Güzel Kimlik boş olamaz", + "enterIdentifier": "Tanımlayıcıyı girin", + "identifier": "Tanımlayıcı" +} From a07ad843a2d7a7e51b8f8155fc25a8e4472000c2 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Mon, 17 Nov 2025 11:03:24 -0500 Subject: [PATCH 28/29] New translations en-us.json (Chinese Simplified) --- messages/zh-CN.json | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/messages/zh-CN.json b/messages/zh-CN.json index 87401859..6b13a912 100644 --- a/messages/zh-CN.json +++ b/messages/zh-CN.json @@ -1279,6 +1279,15 @@ "settingsErrorUpdateDescription": "更新设置时发生错误", "sidebarCollapse": "折叠", "sidebarExpand": "展开", + "productUpdateMoreInfo": "{noOfUpdates} 个更新", + "productUpdateInfo": "{noOfUpdates} 个更新", + "productUpdateWhatsNew": "新功能", + "productUpdateTitle": "产品更新", + "productUpdateEmpty": "无更新", + "dismissAll": "关闭所有", + "pangolinUpdateAvailable": "新版本可用", + "pangolinUpdateAvailableInfo": "版本 {version} 已准备就绪", + "pangolinUpdateAvailableReleaseNotes": "查看发布笔记", "newtUpdateAvailable": "更新可用", "newtUpdateAvailableInfo": "新版本的 Newt 已可用。请更新到最新版本以获得最佳体验。", "domainPickerEnterDomain": "域名", @@ -1525,6 +1534,12 @@ "resourcesTableTheseResourcesForUseWith": "这些资源供...使用", "resourcesTableClients": "客户端", "resourcesTableAndOnlyAccessibleInternally": "且仅在与客户端连接时可内部访问。", + "resourcesTableNoTargets": "没有目标", + "resourcesTableHealthy": "健康的", + "resourcesTableDegraded": "降级", + "resourcesTableOffline": "离线的", + "resourcesTableUnknown": "未知的", + "resourcesTableNotMonitored": "未监视的", "editInternalResourceDialogEditClientResource": "编辑客户端资源", "editInternalResourceDialogUpdateResourceProperties": "更新{resourceName}的资源属性和目标配置。", "editInternalResourceDialogResourceProperties": "资源属性", @@ -2095,5 +2110,31 @@ "selectedResources": "选定的资源", "enableSelected": "启用选中的", "disableSelected": "禁用选中的", - "checkSelectedStatus": "检查选中的状态" -} \ No newline at end of file + "checkSelectedStatus": "检查选中的状态", + "credentials": "全权证书", + "savecredentials": "保存证书", + "regeneratecredentials": "重置键", + "regenerateCredentials": "重新生成和保存您的凭据", + "generatedcredentials": "生成的证书", + "copyandsavethesecredentials": "复制和保存这些凭据", + "copyandsavethesecredentialsdescription": "这些凭据将不会在您离开此页面后再显示。现在安全地保存。", + "credentialsSaved": "凭据已保存", + "credentialsSavedDescription": "已成功生成和保存凭据。", + "credentialsSaveError": "证书保存错误", + "credentialsSaveErrorDescription": "更新和保存凭据时出错。", + "regenerateCredentialsWarning": "重新生成凭据将使以前的凭据失效。请确保更新使用这些凭据的任何配置。", + "confirm": "确认", + "regenerateCredentialsConfirmation": "您确定要重新生成凭据吗?", + "endpoint": "Endpoint", + "Id": "Id", + "SecretKey": "秘密密钥", + "featureDisabledTooltip": "此功能仅在企业计划中可用,需要许可证才能使用。", + "niceId": "好的 ID", + "niceIdUpdated": "好的 ID 已更新", + "niceIdUpdatedSuccessfully": "Nice ID 更新成功", + "niceIdUpdateError": "更新Nice ID时出错", + "niceIdUpdateErrorDescription": "更新Nice ID时出错。", + "niceIdCannotBeEmpty": "好的 ID 不能为空", + "enterIdentifier": "输入标识符", + "identifier": "Identifier" +} From 1736ad486a4c11552dbf2a77498c5b85ee515d56 Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Mon, 17 Nov 2025 11:03:26 -0500 Subject: [PATCH 29/29] New translations en-us.json (Norwegian Bokmal) --- messages/nb-NO.json | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/messages/nb-NO.json b/messages/nb-NO.json index fabeec04..c2f8f791 100644 --- a/messages/nb-NO.json +++ b/messages/nb-NO.json @@ -1279,6 +1279,15 @@ "settingsErrorUpdateDescription": "En feil oppstod under oppdatering av innstillinger", "sidebarCollapse": "Skjul", "sidebarExpand": "Utvid", + "productUpdateMoreInfo": "{noOfUpdates} flere oppdateringer", + "productUpdateInfo": "{noOfUpdates} oppdateringer", + "productUpdateWhatsNew": "Hva er nytt", + "productUpdateTitle": "Oppdateringer om produktet", + "productUpdateEmpty": "Ingen oppdateringer", + "dismissAll": "Avvis alle", + "pangolinUpdateAvailable": "Ny versjon tilgjengelig", + "pangolinUpdateAvailableInfo": "Versjon {version} er klar til å installere", + "pangolinUpdateAvailableReleaseNotes": "Se utgivelsnotater", "newtUpdateAvailable": "Oppdatering tilgjengelig", "newtUpdateAvailableInfo": "En ny versjon av Newt er tilgjengelig. Vennligst oppdater til den nyeste versjonen for den beste opplevelsen.", "domainPickerEnterDomain": "Domene", @@ -1525,6 +1534,12 @@ "resourcesTableTheseResourcesForUseWith": "Disse ressursene er til bruk med", "resourcesTableClients": "Klienter", "resourcesTableAndOnlyAccessibleInternally": "og er kun tilgjengelig internt når de er koblet til med en klient.", + "resourcesTableNoTargets": "Ingen mål", + "resourcesTableHealthy": "Frisk", + "resourcesTableDegraded": "Nedgradert", + "resourcesTableOffline": "Frakoblet", + "resourcesTableUnknown": "Ukjent", + "resourcesTableNotMonitored": "Ikke overvåket", "editInternalResourceDialogEditClientResource": "Rediger klientressurs", "editInternalResourceDialogUpdateResourceProperties": "Oppdater ressursens egenskaper og målkonfigurasjon for {resourceName}.", "editInternalResourceDialogResourceProperties": "Ressursegenskaper", @@ -2095,5 +2110,31 @@ "selectedResources": "Valgte ressurser", "enableSelected": "Aktiver valgte", "disableSelected": "Deaktiver valgte", - "checkSelectedStatus": "Kontroller status for valgte" -} \ No newline at end of file + "checkSelectedStatus": "Kontroller status for valgte", + "credentials": "Legitimasjon", + "savecredentials": "Lagre brukeropplysninger", + "regeneratecredentials": "Ny nøkkel", + "regenerateCredentials": "Regenerer og lagre opplysningene dine", + "generatedcredentials": "Genererte brukeropplysninger", + "copyandsavethesecredentials": "Kopier og lagre disse opplysningene", + "copyandsavethesecredentialsdescription": "Disse opplysningene vil ikke bli vist igjen etter at du forlater siden. Lagre dem trygt nå.", + "credentialsSaved": "Påloggingsinformasjon lagret", + "credentialsSavedDescription": "Påloggingsinformasjonen har blitt regenerert og lagret.", + "credentialsSaveError": "Påloggingsinformasjon lagre feil", + "credentialsSaveErrorDescription": "En feil oppstod under regenerering og lagring av legitimasjon.", + "regenerateCredentialsWarning": "Regenerering av legitimasjon vil ugyldiggjøre de forrige. Sørg for at alle konfigurasjoner som bruker disse legitimasjonene.", + "confirm": "Bekreft", + "regenerateCredentialsConfirmation": "Er du sikker på at du vil regenerere legetimasjonene?", + "endpoint": "Endpoint", + "Id": "Id", + "SecretKey": "Hemmelig nøkkel", + "featureDisabledTooltip": "Denne funksjonen er bare tilgjengelig i virksomhetsplanen og krever en lisens til å bruke den.", + "niceId": "God ID", + "niceIdUpdated": "Flott ID oppdatert", + "niceIdUpdatedSuccessfully": "Id-en ble oppdatert", + "niceIdUpdateError": "Feil under oppdatering av hyggelig ID", + "niceIdUpdateErrorDescription": "Det oppstod en feil under oppdatering av Nice ID.", + "niceIdCannotBeEmpty": "God ID kan ikke være tom", + "enterIdentifier": "Angi identifikator", + "identifier": "Identifier" +}