feat(oauth2): add email format transformation support (#818)

* feat(oauth2): add email format transformation support

- Add enableEmailFormat, userEmailFormat, userEmailReplace fields
- Support regex pattern matching and replacement template ($1, $2, etc.)
- Add Linux Do OAuth2 template with email format pre-configured
- Add input length limit (256 chars) to prevent ReDoS attacks
- Update admin UI with conditional display and tooltips
- Update documentation (zh/en) with configuration examples

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* chore: update lock files and version

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: restore accessTokenFormat as optional field

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Dream Hunter
2026-01-23 21:30:44 +08:00
committed by GitHub
parent e4c96c9868
commit decede7ed3
13 changed files with 906 additions and 791 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "cloudflare_temp_email",
"version": "1.2.1",
"version": "1.3.0",
"private": true,
"type": "module",
"scripts": {
@@ -11,24 +11,24 @@
"build": "wrangler deploy --dry-run --outdir dist --minify"
},
"devDependencies": {
"@cloudflare/workers-types": "^4.20260118.0",
"@cloudflare/workers-types": "^4.20260123.0",
"@eslint/js": "9.39.1",
"@simplewebauthn/types": "10.0.0",
"@types/node": "^25.0.9",
"@types/node": "^25.0.10",
"eslint": "9.39.1",
"globals": "^16.5.0",
"typescript-eslint": "^8.53.0",
"wrangler": "^4.59.2"
"typescript-eslint": "^8.53.1",
"wrangler": "^4.60.0"
},
"dependencies": {
"@aws-sdk/client-s3": "3.888.0",
"@aws-sdk/s3-request-presigner": "3.888.0",
"@simplewebauthn/server": "10.0.1",
"hono": "^4.11.4",
"hono": "^4.11.5",
"jsonpath-plus": "^10.3.0",
"mimetext": "^3.0.27",
"postal-mime": "^2.7.3",
"resend": "^6.7.0",
"resend": "^6.8.0",
"telegraf": "4.16.3",
"worker-mailer": "^1.2.1"
},

386
worker/pnpm-lock.yaml generated
View File

@@ -23,8 +23,8 @@ importers:
specifier: 10.0.1
version: 10.0.1
hono:
specifier: ^4.11.4
version: 4.11.4
specifier: ^4.11.5
version: 4.11.5
jsonpath-plus:
specifier: ^10.3.0
version: 10.3.0
@@ -35,8 +35,8 @@ importers:
specifier: ^2.7.3
version: 2.7.3
resend:
specifier: ^6.7.0
version: 6.7.0(@react-email/render@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
specifier: ^6.8.0
version: 6.8.0(@react-email/render@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
telegraf:
specifier: 4.16.3
version: 4.16.3(patch_hash=4ce8461c7f21d886ddd30d13d2be4fc8c72134fd7ffa5da3b27319c883447eed)
@@ -45,8 +45,8 @@ importers:
version: 1.2.1
devDependencies:
'@cloudflare/workers-types':
specifier: ^4.20260118.0
version: 4.20260118.0
specifier: ^4.20260123.0
version: 4.20260123.0
'@eslint/js':
specifier: 9.39.1
version: 9.39.1
@@ -54,8 +54,8 @@ importers:
specifier: 10.0.0
version: 10.0.0
'@types/node':
specifier: ^25.0.9
version: 25.0.9
specifier: ^25.0.10
version: 25.0.10
eslint:
specifier: 9.39.1
version: 9.39.1
@@ -63,11 +63,11 @@ importers:
specifier: ^16.5.0
version: 16.5.0
typescript-eslint:
specifier: ^8.53.0
version: 8.53.0(eslint@9.39.1)(typescript@5.4.5)
specifier: ^8.53.1
version: 8.53.1(eslint@9.39.1)(typescript@5.4.5)
wrangler:
specifier: ^4.59.2
version: 4.59.2(@cloudflare/workers-types@4.20260118.0)
specifier: ^4.60.0
version: 4.60.0(@cloudflare/workers-types@4.20260123.0)
packages:
@@ -210,8 +210,8 @@ packages:
resolution: {integrity: sha512-ABDSP6KsrdD+JC7qwMqUpLXqPidvfgT+Q+W8sGGuk/IBy7smgZDOdYSZLE4VBbQpH3N/zSJuslAWhL2x37Qwww==}
engines: {node: '>=18.0.0'}
'@aws-sdk/util-locate-window@3.965.2':
resolution: {integrity: sha512-qKgO7wAYsXzhwCHhdbaKFyxd83Fgs8/1Ka+jjSPrv2Ll7mB55Wbwlo0kkfMLh993/yEc8aoDIAc1Fz9h4Spi4Q==}
'@aws-sdk/util-locate-window@3.965.3':
resolution: {integrity: sha512-FNUqAjlKAGA7GM05kywE99q8wiPHPZqrzhq3wXRga6PRD6A0kzT85Pb0AzYBVTBRpSrKyyr6M92Y6bnSBVp2BA==}
engines: {node: '>=20.0.0'}
'@aws-sdk/util-user-agent-browser@3.887.0':
@@ -246,47 +246,47 @@ packages:
resolution: {integrity: sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==}
engines: {node: '>=18.0.0'}
'@cloudflare/unenv-preset@2.10.0':
resolution: {integrity: sha512-/uII4vLQXhzCAZzEVeYAjFLBNg2nqTJ1JGzd2lRF6ItYe6U2zVoYGfeKpGx/EkBF6euiU+cyBXgMdtJih+nQ6g==}
'@cloudflare/unenv-preset@2.11.0':
resolution: {integrity: sha512-z3hxFajL765VniNPGV0JRStZolNz63gU3B3AktwoGdDlnQvz5nP+Ah4RL04PONlZQjwmDdGHowEStJ94+RsaJg==}
peerDependencies:
unenv: 2.0.0-rc.24
workerd: ^1.20251221.0
workerd: ^1.20260115.0
peerDependenciesMeta:
workerd:
optional: true
'@cloudflare/workerd-darwin-64@1.20260114.0':
resolution: {integrity: sha512-HNlsRkfNgardCig2P/5bp/dqDECsZ4+NU5XewqArWxMseqt3C5daSuptI620s4pn7Wr0ZKg7jVLH0PDEBkA+aA==}
'@cloudflare/workerd-darwin-64@1.20260120.0':
resolution: {integrity: sha512-JLHx3p5dpwz4wjVSis45YNReftttnI3ndhdMh5BUbbpdreN/g0jgxNt5Qp9tDFqEKl++N63qv+hxJiIIvSLR+Q==}
engines: {node: '>=16'}
cpu: [x64]
os: [darwin]
'@cloudflare/workerd-darwin-arm64@1.20260114.0':
resolution: {integrity: sha512-qyE1UdFnAlxzb+uCfN/d9c8icch7XRiH49/DjoqEa+bCDihTuRS7GL1RmhVIqHJhb3pX3DzxmKgQZBDBL83Inw==}
'@cloudflare/workerd-darwin-arm64@1.20260120.0':
resolution: {integrity: sha512-1Md2tCRhZjwajsZNOiBeOVGiS3zbpLPzUDjHr4+XGTXWOA6FzzwScJwQZLa0Doc28Cp4Nr1n7xGL0Dwiz1XuOA==}
engines: {node: '>=16'}
cpu: [arm64]
os: [darwin]
'@cloudflare/workerd-linux-64@1.20260114.0':
resolution: {integrity: sha512-Z0BLvAj/JPOabzads2ddDEfgExWTlD22pnwsuNbPwZAGTSZeQa3Y47eGUWyHk+rSGngknk++S7zHTGbKuG7RRg==}
'@cloudflare/workerd-linux-64@1.20260120.0':
resolution: {integrity: sha512-O0mIfJfvU7F8N5siCoRDaVDuI12wkz2xlG4zK6/Ct7U9c9FiE0ViXNFWXFQm5PPj+qbkNRyhjUwhP+GCKTk5EQ==}
engines: {node: '>=16'}
cpu: [x64]
os: [linux]
'@cloudflare/workerd-linux-arm64@1.20260114.0':
resolution: {integrity: sha512-kPUmEtUxUWlr9PQ64kuhdK0qyo8idPe5IIXUgi7xCD7mDd6EOe5J7ugDpbfvfbYKEjx4DpLvN2t45izyI/Sodw==}
'@cloudflare/workerd-linux-arm64@1.20260120.0':
resolution: {integrity: sha512-aRHO/7bjxVpjZEmVVcpmhbzpN6ITbFCxuLLZSW0H9O0C0w40cDCClWSi19T87Ax/PQcYjFNT22pTewKsupkckA==}
engines: {node: '>=16'}
cpu: [arm64]
os: [linux]
'@cloudflare/workerd-windows-64@1.20260114.0':
resolution: {integrity: sha512-MJnKgm6i1jZGyt2ZHQYCnRlpFTEZcK2rv9y7asS3KdVEXaDgGF8kOns5u6YL6/+eMogfZuHRjfDS+UqRTUYIFA==}
'@cloudflare/workerd-windows-64@1.20260120.0':
resolution: {integrity: sha512-ASZIz1E8sqZQqQCgcfY1PJbBpUDrxPt8NZ+lqNil0qxnO4qX38hbCsdDF2/TDAuq0Txh7nu8ztgTelfNDlb4EA==}
engines: {node: '>=16'}
cpu: [x64]
os: [win32]
'@cloudflare/workers-types@4.20260118.0':
resolution: {integrity: sha512-t+2Q421kAQqwBzMUDvgg2flp8zFVxOpiAyZPbyNcnPxMDHf0z3B7LqBIVQawwI6ntZinbk9f4oUmaA5bGeYwlg==}
'@cloudflare/workers-types@4.20260123.0':
resolution: {integrity: sha512-pQccZ8IDLFKkvdKBXZRPkbMtWtS7vVz1giJGkAAZ5cZH2RHK5Bs6p1OoVZA8Z2Sry8Q0tZbZ5Yjud4R7SrG3KQ==}
'@cspotcode/source-map-support@0.8.1':
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
@@ -732,8 +732,8 @@ packages:
resolution: {integrity: sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==}
engines: {node: '>=18.0.0'}
'@smithy/core@3.20.7':
resolution: {integrity: sha512-aO7jmh3CtrmPsIJxUwYIzI5WVlMK8BMCPQ4D4nTzqTqBhbzvxHNzBMGcEg13yg/z9R2Qsz49NUFl0F0lVbTVFw==}
'@smithy/core@3.21.1':
resolution: {integrity: sha512-NUH8R4O6FkN8HKMojzbGg/5pNjsfTjlMmeFclyPfPaXXUrbr5TzhWgbf7t92wfrpCHRgpjyz7ffASIS3wX28aA==}
engines: {node: '>=18.0.0'}
'@smithy/credential-provider-imds@4.2.8':
@@ -796,12 +796,12 @@ packages:
resolution: {integrity: sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==}
engines: {node: '>=18.0.0'}
'@smithy/middleware-endpoint@4.4.8':
resolution: {integrity: sha512-TV44qwB/T0OMMzjIuI+JeS0ort3bvlPJ8XIH0MSlGADraXpZqmyND27ueuAL3E14optleADWqtd7dUgc2w+qhQ==}
'@smithy/middleware-endpoint@4.4.11':
resolution: {integrity: sha512-/WqsrycweGGfb9sSzME4CrsuayjJF6BueBmkKlcbeU5q18OhxRrvvKlmfw3tpDsK5ilx2XUJvoukwxHB0nHs/Q==}
engines: {node: '>=18.0.0'}
'@smithy/middleware-retry@4.4.24':
resolution: {integrity: sha512-yiUY1UvnbUFfP5izoKLtfxDSTRv724YRRwyiC/5HYY6vdsVDcDOXKSXmkJl/Hovcxt5r+8tZEUAdrOaCJwrl9Q==}
'@smithy/middleware-retry@4.4.27':
resolution: {integrity: sha512-xFUYCGRVsfgiN5EjsJJSzih9+yjStgMTCLANPlf0LVQkPDYCe0hz97qbdTZosFOiYlGBlHYityGRxrQ/hxhfVQ==}
engines: {node: '>=18.0.0'}
'@smithy/middleware-serde@4.2.9':
@@ -848,8 +848,8 @@ packages:
resolution: {integrity: sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==}
engines: {node: '>=18.0.0'}
'@smithy/smithy-client@4.10.9':
resolution: {integrity: sha512-Je0EvGXVJ0Vrrr2lsubq43JGRIluJ/hX17aN/W/A0WfE+JpoMdI8kwk2t9F0zTX9232sJDGcoH4zZre6m6f/sg==}
'@smithy/smithy-client@4.10.12':
resolution: {integrity: sha512-VKO/HKoQ5OrSHW6AJUmEnUKeXI1/5LfCwO9cwyao7CmLvGnZeM1i36Lyful3LK1XU7HwTVieTqO1y2C/6t3qtA==}
engines: {node: '>=18.0.0'}
'@smithy/types@4.12.0':
@@ -884,12 +884,12 @@ packages:
resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==}
engines: {node: '>=18.0.0'}
'@smithy/util-defaults-mode-browser@4.3.23':
resolution: {integrity: sha512-mMg+r/qDfjfF/0psMbV4zd7F/i+rpyp7Hjh0Wry7eY15UnzTEId+xmQTGDU8IdZtDfbGQxuWNfgBZKBj+WuYbA==}
'@smithy/util-defaults-mode-browser@4.3.26':
resolution: {integrity: sha512-vva0dzYUTgn7DdE0uaha10uEdAgmdLnNFowKFjpMm6p2R0XDk5FHPX3CBJLzWQkQXuEprsb0hGz9YwbicNWhjw==}
engines: {node: '>=18.0.0'}
'@smithy/util-defaults-mode-node@4.2.26':
resolution: {integrity: sha512-EQqe/WkbCinah0h1lMWh9ICl0Ob4lyl20/10WTB35SC9vDQfD8zWsOT+x2FIOXKAoZQ8z/y0EFMoodbcqWJY/w==}
'@smithy/util-defaults-mode-node@4.2.29':
resolution: {integrity: sha512-c6D7IUBsZt/aNnTBHMTf+OVh+h/JcxUUgfTcIJaWRe6zhOum1X+pNKSZtZ+7fbOn5I99XVFtmrnXKv8yHHErTQ==}
engines: {node: '>=18.0.0'}
'@smithy/util-endpoints@3.2.8':
@@ -947,69 +947,69 @@ packages:
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
'@types/node@25.0.9':
resolution: {integrity: sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw==}
'@types/node@25.0.10':
resolution: {integrity: sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==}
'@types/uuid@9.0.8':
resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==}
'@typescript-eslint/eslint-plugin@8.53.0':
resolution: {integrity: sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg==}
'@typescript-eslint/eslint-plugin@8.53.1':
resolution: {integrity: sha512-cFYYFZ+oQFi6hUnBTbLRXfTJiaQtYE3t4O692agbBl+2Zy+eqSKWtPjhPXJu1G7j4RLjKgeJPDdq3EqOwmX5Ag==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
'@typescript-eslint/parser': ^8.53.0
'@typescript-eslint/parser': ^8.53.1
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/parser@8.53.0':
resolution: {integrity: sha512-npiaib8XzbjtzS2N4HlqPvlpxpmZ14FjSJrteZpPxGUaYPlvhzlzUZ4mZyABo0EFrOWnvyd0Xxroq//hKhtAWg==}
'@typescript-eslint/parser@8.53.1':
resolution: {integrity: sha512-nm3cvFN9SqZGXjmw5bZ6cGmvJSyJPn0wU9gHAZZHDnZl2wF9PhHv78Xf06E0MaNk4zLVHL8hb2/c32XvyJOLQg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/project-service@8.53.0':
resolution: {integrity: sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg==}
'@typescript-eslint/project-service@8.53.1':
resolution: {integrity: sha512-WYC4FB5Ra0xidsmlPb+1SsnaSKPmS3gsjIARwbEkHkoWloQmuzcfypljaJcR78uyLA1h8sHdWWPHSLDI+MtNog==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/scope-manager@8.53.0':
resolution: {integrity: sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g==}
'@typescript-eslint/scope-manager@8.53.1':
resolution: {integrity: sha512-Lu23yw1uJMFY8cUeq7JlrizAgeQvWugNQzJp8C3x8Eo5Jw5Q2ykMdiiTB9vBVOOUBysMzmRRmUfwFrZuI2C4SQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/tsconfig-utils@8.53.0':
resolution: {integrity: sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA==}
'@typescript-eslint/tsconfig-utils@8.53.1':
resolution: {integrity: sha512-qfvLXS6F6b1y43pnf0pPbXJ+YoXIC7HKg0UGZ27uMIemKMKA6XH2DTxsEDdpdN29D+vHV07x/pnlPNVLhdhWiA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/type-utils@8.53.0':
resolution: {integrity: sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw==}
'@typescript-eslint/type-utils@8.53.1':
resolution: {integrity: sha512-MOrdtNvyhy0rHyv0ENzub1d4wQYKb2NmIqG7qEqPWFW7Mpy2jzFC3pQ2yKDvirZB7jypm5uGjF2Qqs6OIqu47w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/types@8.53.0':
resolution: {integrity: sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==}
'@typescript-eslint/types@8.53.1':
resolution: {integrity: sha512-jr/swrr2aRmUAUjW5/zQHbMaui//vQlsZcJKijZf3M26bnmLj8LyZUpj8/Rd6uzaek06OWsqdofN/Thenm5O8A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/typescript-estree@8.53.0':
resolution: {integrity: sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw==}
'@typescript-eslint/typescript-estree@8.53.1':
resolution: {integrity: sha512-RGlVipGhQAG4GxV1s34O91cxQ/vWiHJTDHbXRr0li2q/BGg3RR/7NM8QDWgkEgrwQYCvmJV9ichIwyoKCQ+DTg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/utils@8.53.0':
resolution: {integrity: sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA==}
'@typescript-eslint/utils@8.53.1':
resolution: {integrity: sha512-c4bMvGVWW4hv6JmDUEG7fSYlWOl3II2I4ylt0NM+seinYQlZMQIaKaXIIVJWt9Ofh6whrpM+EdDQXKXjNovvrg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/visitor-keys@8.53.0':
resolution: {integrity: sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw==}
'@typescript-eslint/visitor-keys@8.53.1':
resolution: {integrity: sha512-oy+wV7xDKFPRyNggmXuZQSBzvoLnpmJs+GhzRhPjrxl2b/jIlyjVokzm47CZCDUdXKr2zd7ZLodPfOBpOPyPlg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
abort-controller@3.0.0:
@@ -1086,8 +1086,8 @@ packages:
resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==}
engines: {node: '>=18'}
core-js-pure@3.47.0:
resolution: {integrity: sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==}
core-js-pure@3.48.0:
resolution: {integrity: sha512-1slJgk89tWC51HQ1AEqG+s2VuwpTRr8ocu4n20QUcH1v9lAN0RXen0Q0AABa/DK1I7RrNWLucplOHMx8hfTGTw==}
cross-fetch@4.1.0:
resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==}
@@ -1255,8 +1255,8 @@ packages:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
hono@4.11.4:
resolution: {integrity: sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==}
hono@4.11.5:
resolution: {integrity: sha512-WemPi9/WfyMwZs+ZUXdiwcCh9Y+m7L+8vki9MzDw3jJ+W9Lc+12HGsd368Qc1vZi1xwW8BWMMsnK5efYKPdt4g==}
engines: {node: '>=16.9.0'}
html-to-text@9.0.5:
@@ -1357,8 +1357,8 @@ packages:
mimetext@3.0.27:
resolution: {integrity: sha512-mUhWAsZD1N/K6dbN4+a5Yq78OPnYQw1ubOSMasBntsLQ2S7KVNlvDEA8dwpr4a7PszWMzeslKahAprtwYMgaBA==}
miniflare@4.20260114.0:
resolution: {integrity: sha512-QwHT7S6XqGdQxIvql1uirH/7/i3zDEt0B/YBXTYzMfJtVCR4+ue3KPkU+Bl0zMxvpgkvjh9+eCHhJbKEqya70A==}
miniflare@4.20260120.0:
resolution: {integrity: sha512-XXZyE2pDKMtP5OLuv0LPHEAzIYhov4jrYjcqrhhqtxGGtXneWOHvXIPo+eV8sqwqWd3R7j4DlEKcyb+87BR49Q==}
engines: {node: '>=18.0.0'}
hasBin: true
@@ -1439,8 +1439,8 @@ packages:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
prettier@3.8.0:
resolution: {integrity: sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==}
prettier@3.8.1:
resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==}
engines: {node: '>=14'}
hasBin: true
@@ -1467,8 +1467,8 @@ packages:
resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
engines: {node: '>=0.10.0'}
resend@6.7.0:
resolution: {integrity: sha512-2ZV0NDZsh4Gh+Nd1hvluZIitmGJ59O4+OxMufymG6Y8uz1Jgt2uS1seSENnkIUlmwg7/dwmfIJC9rAufByz7wA==}
resend@6.8.0:
resolution: {integrity: sha512-fDOXGqafQfQXl8nXe93wr93pus8tW7YPpowenE3SmG7dJJf0hH3xUWm3xqacnPvhqjCQTJH9xETg07rmUeSuqQ==}
engines: {node: '>=20'}
peerDependencies:
'@react-email/render': '*'
@@ -1556,8 +1556,8 @@ packages:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'}
typescript-eslint@8.53.0:
resolution: {integrity: sha512-xHURCQNxZ1dsWn0sdOaOfCSQG0HKeqSj9OexIxrz6ypU6wHYOdX2I3D2b8s8wFSsSOYJb+6q283cLiLlkEsBYw==}
typescript-eslint@8.53.1:
resolution: {integrity: sha512-gB+EVQfP5RDElh9ittfXlhZJdjSU4jUSTyE2+ia8CYyNvet4ElfaLlAIqDvQV9JPknKx0jQH1racTYe/4LaLSg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@@ -1571,8 +1571,8 @@ packages:
undici-types@7.16.0:
resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
undici@7.14.0:
resolution: {integrity: sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==}
undici@7.18.2:
resolution: {integrity: sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==}
engines: {node: '>=20.18.1'}
unenv@2.0.0-rc.24:
@@ -1607,17 +1607,17 @@ packages:
worker-mailer@1.2.1:
resolution: {integrity: sha512-gS2ei/mrpRqNs+AHmqxhT6vFPwCLw2qnz5ShmyGD0ULaU0Q9hxnFAcx9jhAip/MnD6+MjgnQu6hQQgA8mlOkVA==}
workerd@1.20260114.0:
resolution: {integrity: sha512-kTJ+jNdIllOzWuVA3NRQRvywP0T135zdCjAE2dAUY1BFbxM6fmMZV8BbskEoQ4hAODVQUfZQmyGctcwvVCKxFA==}
workerd@1.20260120.0:
resolution: {integrity: sha512-R6X/VQOkwLTBGLp4VRUwLQZZVxZ9T9J8pGiJ6GQUMaRkY7TVWrCSkVfoNMM1/YyFsY5UYhhPoQe5IehnhZ3Pdw==}
engines: {node: '>=16'}
hasBin: true
wrangler@4.59.2:
resolution: {integrity: sha512-Z4xn6jFZTaugcOKz42xvRAYKgkVUERHVbuCJ5+f+gK+R6k12L02unakPGOA0L0ejhUl16dqDjKe4tmL9sedHcw==}
wrangler@4.60.0:
resolution: {integrity: sha512-n4kibm/xY0Qd5G2K/CbAQeVeOIlwPNVglmFjlDRCCYk3hZh8IggO/rg8AXt/vByK2Sxsugl5Z7yvgWxrUbmS6g==}
engines: {node: '>=20.0.0'}
hasBin: true
peerDependencies:
'@cloudflare/workers-types': ^4.20260114.0
'@cloudflare/workers-types': ^4.20260120.0
peerDependenciesMeta:
'@cloudflare/workers-types':
optional: true
@@ -1666,7 +1666,7 @@ snapshots:
'@aws-crypto/supports-web-crypto': 5.2.0
'@aws-crypto/util': 5.2.0
'@aws-sdk/types': 3.887.0
'@aws-sdk/util-locate-window': 3.965.2
'@aws-sdk/util-locate-window': 3.965.3
'@smithy/util-utf8': 2.3.0
tslib: 2.8.1
@@ -1676,7 +1676,7 @@ snapshots:
'@aws-crypto/supports-web-crypto': 5.2.0
'@aws-crypto/util': 5.2.0
'@aws-sdk/types': 3.887.0
'@aws-sdk/util-locate-window': 3.965.2
'@aws-sdk/util-locate-window': 3.965.3
'@smithy/util-utf8': 2.3.0
tslib: 2.8.1
@@ -1721,7 +1721,7 @@ snapshots:
'@aws-sdk/util-user-agent-node': 3.888.0
'@aws-sdk/xml-builder': 3.887.0
'@smithy/config-resolver': 4.4.6
'@smithy/core': 3.20.7
'@smithy/core': 3.21.1
'@smithy/eventstream-serde-browser': 4.2.8
'@smithy/eventstream-serde-config-resolver': 4.3.8
'@smithy/eventstream-serde-node': 4.2.8
@@ -1732,21 +1732,21 @@ snapshots:
'@smithy/invalid-dependency': 4.2.8
'@smithy/md5-js': 4.2.8
'@smithy/middleware-content-length': 4.2.8
'@smithy/middleware-endpoint': 4.4.8
'@smithy/middleware-retry': 4.4.24
'@smithy/middleware-endpoint': 4.4.11
'@smithy/middleware-retry': 4.4.27
'@smithy/middleware-serde': 4.2.9
'@smithy/middleware-stack': 4.2.8
'@smithy/node-config-provider': 4.3.8
'@smithy/node-http-handler': 4.4.8
'@smithy/protocol-http': 5.3.8
'@smithy/smithy-client': 4.10.9
'@smithy/smithy-client': 4.10.12
'@smithy/types': 4.12.0
'@smithy/url-parser': 4.2.8
'@smithy/util-base64': 4.3.0
'@smithy/util-body-length-browser': 4.2.0
'@smithy/util-body-length-node': 4.2.1
'@smithy/util-defaults-mode-browser': 4.3.23
'@smithy/util-defaults-mode-node': 4.2.26
'@smithy/util-defaults-mode-browser': 4.3.26
'@smithy/util-defaults-mode-node': 4.2.29
'@smithy/util-endpoints': 3.2.8
'@smithy/util-middleware': 4.2.8
'@smithy/util-retry': 4.2.8
@@ -1774,26 +1774,26 @@ snapshots:
'@aws-sdk/util-user-agent-browser': 3.887.0
'@aws-sdk/util-user-agent-node': 3.888.0
'@smithy/config-resolver': 4.4.6
'@smithy/core': 3.20.7
'@smithy/core': 3.21.1
'@smithy/fetch-http-handler': 5.3.9
'@smithy/hash-node': 4.2.8
'@smithy/invalid-dependency': 4.2.8
'@smithy/middleware-content-length': 4.2.8
'@smithy/middleware-endpoint': 4.4.8
'@smithy/middleware-retry': 4.4.24
'@smithy/middleware-endpoint': 4.4.11
'@smithy/middleware-retry': 4.4.27
'@smithy/middleware-serde': 4.2.9
'@smithy/middleware-stack': 4.2.8
'@smithy/node-config-provider': 4.3.8
'@smithy/node-http-handler': 4.4.8
'@smithy/protocol-http': 5.3.8
'@smithy/smithy-client': 4.10.9
'@smithy/smithy-client': 4.10.12
'@smithy/types': 4.12.0
'@smithy/url-parser': 4.2.8
'@smithy/util-base64': 4.3.0
'@smithy/util-body-length-browser': 4.2.0
'@smithy/util-body-length-node': 4.2.1
'@smithy/util-defaults-mode-browser': 4.3.23
'@smithy/util-defaults-mode-node': 4.2.26
'@smithy/util-defaults-mode-browser': 4.3.26
'@smithy/util-defaults-mode-node': 4.2.29
'@smithy/util-endpoints': 3.2.8
'@smithy/util-middleware': 4.2.8
'@smithy/util-retry': 4.2.8
@@ -1806,12 +1806,12 @@ snapshots:
dependencies:
'@aws-sdk/types': 3.887.0
'@aws-sdk/xml-builder': 3.887.0
'@smithy/core': 3.20.7
'@smithy/core': 3.21.1
'@smithy/node-config-provider': 4.3.8
'@smithy/property-provider': 4.2.8
'@smithy/protocol-http': 5.3.8
'@smithy/signature-v4': 5.3.8
'@smithy/smithy-client': 4.10.9
'@smithy/smithy-client': 4.10.12
'@smithy/types': 4.12.0
'@smithy/util-base64': 4.3.0
'@smithy/util-body-length-browser': 4.2.0
@@ -1836,7 +1836,7 @@ snapshots:
'@smithy/node-http-handler': 4.4.8
'@smithy/property-provider': 4.2.8
'@smithy/protocol-http': 5.3.8
'@smithy/smithy-client': 4.10.9
'@smithy/smithy-client': 4.10.12
'@smithy/types': 4.12.0
'@smithy/util-stream': 4.5.10
tslib: 2.8.1
@@ -1974,11 +1974,11 @@ snapshots:
'@aws-sdk/core': 3.888.0
'@aws-sdk/types': 3.887.0
'@aws-sdk/util-arn-parser': 3.873.0
'@smithy/core': 3.20.7
'@smithy/core': 3.21.1
'@smithy/node-config-provider': 4.3.8
'@smithy/protocol-http': 5.3.8
'@smithy/signature-v4': 5.3.8
'@smithy/smithy-client': 4.10.9
'@smithy/smithy-client': 4.10.12
'@smithy/types': 4.12.0
'@smithy/util-config-provider': 4.2.0
'@smithy/util-middleware': 4.2.8
@@ -1997,7 +1997,7 @@ snapshots:
'@aws-sdk/core': 3.888.0
'@aws-sdk/types': 3.887.0
'@aws-sdk/util-endpoints': 3.887.0
'@smithy/core': 3.20.7
'@smithy/core': 3.21.1
'@smithy/protocol-http': 5.3.8
'@smithy/types': 4.12.0
tslib: 2.8.1
@@ -2017,26 +2017,26 @@ snapshots:
'@aws-sdk/util-user-agent-browser': 3.887.0
'@aws-sdk/util-user-agent-node': 3.888.0
'@smithy/config-resolver': 4.4.6
'@smithy/core': 3.20.7
'@smithy/core': 3.21.1
'@smithy/fetch-http-handler': 5.3.9
'@smithy/hash-node': 4.2.8
'@smithy/invalid-dependency': 4.2.8
'@smithy/middleware-content-length': 4.2.8
'@smithy/middleware-endpoint': 4.4.8
'@smithy/middleware-retry': 4.4.24
'@smithy/middleware-endpoint': 4.4.11
'@smithy/middleware-retry': 4.4.27
'@smithy/middleware-serde': 4.2.9
'@smithy/middleware-stack': 4.2.8
'@smithy/node-config-provider': 4.3.8
'@smithy/node-http-handler': 4.4.8
'@smithy/protocol-http': 5.3.8
'@smithy/smithy-client': 4.10.9
'@smithy/smithy-client': 4.10.12
'@smithy/types': 4.12.0
'@smithy/url-parser': 4.2.8
'@smithy/util-base64': 4.3.0
'@smithy/util-body-length-browser': 4.2.0
'@smithy/util-body-length-node': 4.2.1
'@smithy/util-defaults-mode-browser': 4.3.23
'@smithy/util-defaults-mode-node': 4.2.26
'@smithy/util-defaults-mode-browser': 4.3.26
'@smithy/util-defaults-mode-node': 4.2.29
'@smithy/util-endpoints': 3.2.8
'@smithy/util-middleware': 4.2.8
'@smithy/util-retry': 4.2.8
@@ -2059,9 +2059,9 @@ snapshots:
'@aws-sdk/signature-v4-multi-region': 3.888.0
'@aws-sdk/types': 3.887.0
'@aws-sdk/util-format-url': 3.887.0
'@smithy/middleware-endpoint': 4.4.8
'@smithy/middleware-endpoint': 4.4.11
'@smithy/protocol-http': 5.3.8
'@smithy/smithy-client': 4.10.9
'@smithy/smithy-client': 4.10.12
'@smithy/types': 4.12.0
tslib: 2.8.1
@@ -2110,7 +2110,7 @@ snapshots:
'@smithy/types': 4.12.0
tslib: 2.8.1
'@aws-sdk/util-locate-window@3.965.2':
'@aws-sdk/util-locate-window@3.965.3':
dependencies:
tslib: 2.8.1
@@ -2138,34 +2138,34 @@ snapshots:
'@babel/runtime-corejs3@7.28.6':
dependencies:
core-js-pure: 3.47.0
core-js-pure: 3.48.0
'@babel/runtime@7.28.6': {}
'@cloudflare/kv-asset-handler@0.4.2': {}
'@cloudflare/unenv-preset@2.10.0(unenv@2.0.0-rc.24)(workerd@1.20260114.0)':
'@cloudflare/unenv-preset@2.11.0(unenv@2.0.0-rc.24)(workerd@1.20260120.0)':
dependencies:
unenv: 2.0.0-rc.24
optionalDependencies:
workerd: 1.20260114.0
workerd: 1.20260120.0
'@cloudflare/workerd-darwin-64@1.20260114.0':
'@cloudflare/workerd-darwin-64@1.20260120.0':
optional: true
'@cloudflare/workerd-darwin-arm64@1.20260114.0':
'@cloudflare/workerd-darwin-arm64@1.20260120.0':
optional: true
'@cloudflare/workerd-linux-64@1.20260114.0':
'@cloudflare/workerd-linux-64@1.20260120.0':
optional: true
'@cloudflare/workerd-linux-arm64@1.20260114.0':
'@cloudflare/workerd-linux-arm64@1.20260120.0':
optional: true
'@cloudflare/workerd-windows-64@1.20260114.0':
'@cloudflare/workerd-windows-64@1.20260120.0':
optional: true
'@cloudflare/workers-types@4.20260118.0': {}
'@cloudflare/workers-types@4.20260123.0': {}
'@cspotcode/source-map-support@0.8.1':
dependencies:
@@ -2476,7 +2476,7 @@ snapshots:
'@react-email/render@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
html-to-text: 9.0.5
prettier: 3.8.0
prettier: 3.8.1
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
react-promise-suspense: 0.3.4
@@ -2529,7 +2529,7 @@ snapshots:
'@smithy/util-middleware': 4.2.8
tslib: 2.8.1
'@smithy/core@3.20.7':
'@smithy/core@3.21.1':
dependencies:
'@smithy/middleware-serde': 4.2.9
'@smithy/protocol-http': 5.3.8
@@ -2633,9 +2633,9 @@ snapshots:
'@smithy/types': 4.12.0
tslib: 2.8.1
'@smithy/middleware-endpoint@4.4.8':
'@smithy/middleware-endpoint@4.4.11':
dependencies:
'@smithy/core': 3.20.7
'@smithy/core': 3.21.1
'@smithy/middleware-serde': 4.2.9
'@smithy/node-config-provider': 4.3.8
'@smithy/shared-ini-file-loader': 4.4.3
@@ -2644,12 +2644,12 @@ snapshots:
'@smithy/util-middleware': 4.2.8
tslib: 2.8.1
'@smithy/middleware-retry@4.4.24':
'@smithy/middleware-retry@4.4.27':
dependencies:
'@smithy/node-config-provider': 4.3.8
'@smithy/protocol-http': 5.3.8
'@smithy/service-error-classification': 4.2.8
'@smithy/smithy-client': 4.10.9
'@smithy/smithy-client': 4.10.12
'@smithy/types': 4.12.0
'@smithy/util-middleware': 4.2.8
'@smithy/util-retry': 4.2.8
@@ -2723,10 +2723,10 @@ snapshots:
'@smithy/util-utf8': 4.2.0
tslib: 2.8.1
'@smithy/smithy-client@4.10.9':
'@smithy/smithy-client@4.10.12':
dependencies:
'@smithy/core': 3.20.7
'@smithy/middleware-endpoint': 4.4.8
'@smithy/core': 3.21.1
'@smithy/middleware-endpoint': 4.4.11
'@smithy/middleware-stack': 4.2.8
'@smithy/protocol-http': 5.3.8
'@smithy/types': 4.12.0
@@ -2771,20 +2771,20 @@ snapshots:
dependencies:
tslib: 2.8.1
'@smithy/util-defaults-mode-browser@4.3.23':
'@smithy/util-defaults-mode-browser@4.3.26':
dependencies:
'@smithy/property-provider': 4.2.8
'@smithy/smithy-client': 4.10.9
'@smithy/smithy-client': 4.10.12
'@smithy/types': 4.12.0
tslib: 2.8.1
'@smithy/util-defaults-mode-node@4.2.26':
'@smithy/util-defaults-mode-node@4.2.29':
dependencies:
'@smithy/config-resolver': 4.4.6
'@smithy/credential-provider-imds': 4.2.8
'@smithy/node-config-provider': 4.3.8
'@smithy/property-provider': 4.2.8
'@smithy/smithy-client': 4.10.9
'@smithy/smithy-client': 4.10.12
'@smithy/types': 4.12.0
tslib: 2.8.1
@@ -2854,20 +2854,20 @@ snapshots:
'@types/json-schema@7.0.15': {}
'@types/node@25.0.9':
'@types/node@25.0.10':
dependencies:
undici-types: 7.16.0
'@types/uuid@9.0.8': {}
'@typescript-eslint/eslint-plugin@8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.1)(typescript@5.4.5))(eslint@9.39.1)(typescript@5.4.5)':
'@typescript-eslint/eslint-plugin@8.53.1(@typescript-eslint/parser@8.53.1(eslint@9.39.1)(typescript@5.4.5))(eslint@9.39.1)(typescript@5.4.5)':
dependencies:
'@eslint-community/regexpp': 4.12.2
'@typescript-eslint/parser': 8.53.0(eslint@9.39.1)(typescript@5.4.5)
'@typescript-eslint/scope-manager': 8.53.0
'@typescript-eslint/type-utils': 8.53.0(eslint@9.39.1)(typescript@5.4.5)
'@typescript-eslint/utils': 8.53.0(eslint@9.39.1)(typescript@5.4.5)
'@typescript-eslint/visitor-keys': 8.53.0
'@typescript-eslint/parser': 8.53.1(eslint@9.39.1)(typescript@5.4.5)
'@typescript-eslint/scope-manager': 8.53.1
'@typescript-eslint/type-utils': 8.53.1(eslint@9.39.1)(typescript@5.4.5)
'@typescript-eslint/utils': 8.53.1(eslint@9.39.1)(typescript@5.4.5)
'@typescript-eslint/visitor-keys': 8.53.1
eslint: 9.39.1
ignore: 7.0.5
natural-compare: 1.4.0
@@ -2876,41 +2876,41 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/parser@8.53.0(eslint@9.39.1)(typescript@5.4.5)':
'@typescript-eslint/parser@8.53.1(eslint@9.39.1)(typescript@5.4.5)':
dependencies:
'@typescript-eslint/scope-manager': 8.53.0
'@typescript-eslint/types': 8.53.0
'@typescript-eslint/typescript-estree': 8.53.0(typescript@5.4.5)
'@typescript-eslint/visitor-keys': 8.53.0
'@typescript-eslint/scope-manager': 8.53.1
'@typescript-eslint/types': 8.53.1
'@typescript-eslint/typescript-estree': 8.53.1(typescript@5.4.5)
'@typescript-eslint/visitor-keys': 8.53.1
debug: 4.4.3
eslint: 9.39.1
typescript: 5.4.5
transitivePeerDependencies:
- supports-color
'@typescript-eslint/project-service@8.53.0(typescript@5.4.5)':
'@typescript-eslint/project-service@8.53.1(typescript@5.4.5)':
dependencies:
'@typescript-eslint/tsconfig-utils': 8.53.0(typescript@5.4.5)
'@typescript-eslint/types': 8.53.0
'@typescript-eslint/tsconfig-utils': 8.53.1(typescript@5.4.5)
'@typescript-eslint/types': 8.53.1
debug: 4.4.3
typescript: 5.4.5
transitivePeerDependencies:
- supports-color
'@typescript-eslint/scope-manager@8.53.0':
'@typescript-eslint/scope-manager@8.53.1':
dependencies:
'@typescript-eslint/types': 8.53.0
'@typescript-eslint/visitor-keys': 8.53.0
'@typescript-eslint/types': 8.53.1
'@typescript-eslint/visitor-keys': 8.53.1
'@typescript-eslint/tsconfig-utils@8.53.0(typescript@5.4.5)':
'@typescript-eslint/tsconfig-utils@8.53.1(typescript@5.4.5)':
dependencies:
typescript: 5.4.5
'@typescript-eslint/type-utils@8.53.0(eslint@9.39.1)(typescript@5.4.5)':
'@typescript-eslint/type-utils@8.53.1(eslint@9.39.1)(typescript@5.4.5)':
dependencies:
'@typescript-eslint/types': 8.53.0
'@typescript-eslint/typescript-estree': 8.53.0(typescript@5.4.5)
'@typescript-eslint/utils': 8.53.0(eslint@9.39.1)(typescript@5.4.5)
'@typescript-eslint/types': 8.53.1
'@typescript-eslint/typescript-estree': 8.53.1(typescript@5.4.5)
'@typescript-eslint/utils': 8.53.1(eslint@9.39.1)(typescript@5.4.5)
debug: 4.4.3
eslint: 9.39.1
ts-api-utils: 2.4.0(typescript@5.4.5)
@@ -2918,14 +2918,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/types@8.53.0': {}
'@typescript-eslint/types@8.53.1': {}
'@typescript-eslint/typescript-estree@8.53.0(typescript@5.4.5)':
'@typescript-eslint/typescript-estree@8.53.1(typescript@5.4.5)':
dependencies:
'@typescript-eslint/project-service': 8.53.0(typescript@5.4.5)
'@typescript-eslint/tsconfig-utils': 8.53.0(typescript@5.4.5)
'@typescript-eslint/types': 8.53.0
'@typescript-eslint/visitor-keys': 8.53.0
'@typescript-eslint/project-service': 8.53.1(typescript@5.4.5)
'@typescript-eslint/tsconfig-utils': 8.53.1(typescript@5.4.5)
'@typescript-eslint/types': 8.53.1
'@typescript-eslint/visitor-keys': 8.53.1
debug: 4.4.3
minimatch: 9.0.5
semver: 7.7.3
@@ -2935,20 +2935,20 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/utils@8.53.0(eslint@9.39.1)(typescript@5.4.5)':
'@typescript-eslint/utils@8.53.1(eslint@9.39.1)(typescript@5.4.5)':
dependencies:
'@eslint-community/eslint-utils': 4.9.1(eslint@9.39.1)
'@typescript-eslint/scope-manager': 8.53.0
'@typescript-eslint/types': 8.53.0
'@typescript-eslint/typescript-estree': 8.53.0(typescript@5.4.5)
'@typescript-eslint/scope-manager': 8.53.1
'@typescript-eslint/types': 8.53.1
'@typescript-eslint/typescript-estree': 8.53.1(typescript@5.4.5)
eslint: 9.39.1
typescript: 5.4.5
transitivePeerDependencies:
- supports-color
'@typescript-eslint/visitor-keys@8.53.0':
'@typescript-eslint/visitor-keys@8.53.1':
dependencies:
'@typescript-eslint/types': 8.53.0
'@typescript-eslint/types': 8.53.1
eslint-visitor-keys: 4.2.1
abort-controller@3.0.0:
@@ -3021,7 +3021,7 @@ snapshots:
cookie@1.1.1: {}
core-js-pure@3.47.0: {}
core-js-pure@3.48.0: {}
cross-fetch@4.1.0:
dependencies:
@@ -3220,7 +3220,7 @@ snapshots:
has-flag@4.0.0: {}
hono@4.11.4: {}
hono@4.11.5: {}
html-to-text@9.0.5:
dependencies:
@@ -3319,12 +3319,12 @@ snapshots:
js-base64: 3.7.8
mime-types: 2.1.35
miniflare@4.20260114.0:
miniflare@4.20260120.0:
dependencies:
'@cspotcode/source-map-support': 0.8.1
sharp: 0.34.5
undici: 7.14.0
workerd: 1.20260114.0
undici: 7.18.2
workerd: 1.20260120.0
ws: 8.18.0
youch: 4.1.0-beta.10
zod: 3.25.76
@@ -3396,7 +3396,7 @@ snapshots:
prelude-ls@1.2.1: {}
prettier@3.8.0:
prettier@3.8.1:
optional: true
punycode@2.3.1: {}
@@ -3424,7 +3424,7 @@ snapshots:
loose-envify: 1.4.0
optional: true
resend@6.7.0(@react-email/render@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)):
resend@6.8.0(@react-email/render@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)):
dependencies:
svix: 1.84.1
optionalDependencies:
@@ -3538,12 +3538,12 @@ snapshots:
dependencies:
prelude-ls: 1.2.1
typescript-eslint@8.53.0(eslint@9.39.1)(typescript@5.4.5):
typescript-eslint@8.53.1(eslint@9.39.1)(typescript@5.4.5):
dependencies:
'@typescript-eslint/eslint-plugin': 8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.1)(typescript@5.4.5))(eslint@9.39.1)(typescript@5.4.5)
'@typescript-eslint/parser': 8.53.0(eslint@9.39.1)(typescript@5.4.5)
'@typescript-eslint/typescript-estree': 8.53.0(typescript@5.4.5)
'@typescript-eslint/utils': 8.53.0(eslint@9.39.1)(typescript@5.4.5)
'@typescript-eslint/eslint-plugin': 8.53.1(@typescript-eslint/parser@8.53.1(eslint@9.39.1)(typescript@5.4.5))(eslint@9.39.1)(typescript@5.4.5)
'@typescript-eslint/parser': 8.53.1(eslint@9.39.1)(typescript@5.4.5)
'@typescript-eslint/typescript-estree': 8.53.1(typescript@5.4.5)
'@typescript-eslint/utils': 8.53.1(eslint@9.39.1)(typescript@5.4.5)
eslint: 9.39.1
typescript: 5.4.5
transitivePeerDependencies:
@@ -3553,7 +3553,7 @@ snapshots:
undici-types@7.16.0: {}
undici@7.14.0: {}
undici@7.18.2: {}
unenv@2.0.0-rc.24:
dependencies:
@@ -3582,26 +3582,26 @@ snapshots:
worker-mailer@1.2.1: {}
workerd@1.20260114.0:
workerd@1.20260120.0:
optionalDependencies:
'@cloudflare/workerd-darwin-64': 1.20260114.0
'@cloudflare/workerd-darwin-arm64': 1.20260114.0
'@cloudflare/workerd-linux-64': 1.20260114.0
'@cloudflare/workerd-linux-arm64': 1.20260114.0
'@cloudflare/workerd-windows-64': 1.20260114.0
'@cloudflare/workerd-darwin-64': 1.20260120.0
'@cloudflare/workerd-darwin-arm64': 1.20260120.0
'@cloudflare/workerd-linux-64': 1.20260120.0
'@cloudflare/workerd-linux-arm64': 1.20260120.0
'@cloudflare/workerd-windows-64': 1.20260120.0
wrangler@4.59.2(@cloudflare/workers-types@4.20260118.0):
wrangler@4.60.0(@cloudflare/workers-types@4.20260123.0):
dependencies:
'@cloudflare/kv-asset-handler': 0.4.2
'@cloudflare/unenv-preset': 2.10.0(unenv@2.0.0-rc.24)(workerd@1.20260114.0)
'@cloudflare/unenv-preset': 2.11.0(unenv@2.0.0-rc.24)(workerd@1.20260120.0)
blake3-wasm: 2.1.5
esbuild: 0.27.0
miniflare: 4.20260114.0
miniflare: 4.20260120.0
path-to-regexp: 6.3.0
unenv: 2.0.0-rc.24
workerd: 1.20260114.0
workerd: 1.20260120.0
optionalDependencies:
'@cloudflare/workers-types': 4.20260118.0
'@cloudflare/workers-types': 4.20260123.0
fsevents: 2.3.3
transitivePeerDependencies:
- bufferutil

View File

@@ -155,6 +155,9 @@ export type UserOauth2Settings = {
redirectURL: string;
logoutURL?: string;
userEmailKey: string;
enableEmailFormat?: boolean; // Enable email format transformation
userEmailFormat?: string; // Regex pattern to match email
userEmailReplace?: string; // Replacement template using $1, $2, etc.
scope: string;
enableMailAllowList?: boolean | undefined;
mailAllowList?: string[] | undefined;

View File

@@ -68,7 +68,7 @@ export default {
}
const userInfo = await userRes.json<any>()
const email = await (async () => {
const rawEmail = await (async () => {
if (setting.userEmailKey.startsWith("$")) {
const { JSONPath } = await import('jsonpath-plus');
const email = JSONPath({
@@ -83,6 +83,26 @@ export default {
return email;
})()
if (!rawEmail) {
return c.text(msgs.Oauth2FailedGetUserEmailMsg, 400);
}
// Apply email format transformation if enabled
const email = (() => {
const rawEmailStr = String(rawEmail).slice(0, 256).trim(); // 限制长度防止 ReDoS
if (!setting.enableEmailFormat || !setting.userEmailFormat) {
return rawEmailStr;
}
try {
const regex = new RegExp(setting.userEmailFormat);
const replacement = setting.userEmailReplace || '$1';
return rawEmailStr.replace(regex, replacement).trim();
} catch (e) {
console.error(`Invalid regex in userEmailFormat: ${setting.userEmailFormat}`, e);
return rawEmailStr;
}
})();
if (!email) {
return c.text(msgs.Oauth2FailedGetUserEmailMsg, 400);
}