Compare commits

..
3 Commits
Author SHA1 Message Date
dreamhunter2333andClaude 8e5293f010 fix: enhance input validation with trim() for address creation
- Add trim() handling in newAddress() function to prevent whitespace issues
- Add trim() handling for address prefixes to ensure consistent formatting
- Add trim() handling in Telegram API address parsing for robustness
- Prevents edge cases with whitespace-only or padded input strings

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-04 02:06:53 +08:00
dreamhunter2333 711378cb11 feat: add var DISABLE_CUSTOM_ADDRESS_NAME and CREATE_ADDRESS_DEFAULT_DOMAIN_FIRST 2025-09-04 01:59:15 +08:00
Dream Hunter 648e9f7adf feat: add simplemode button at index (#714) 2025-08-27 20:22:52 +08:00
23 changed files with 969 additions and 889 deletions
+7 -1
View File
@@ -1,7 +1,13 @@
<!-- markdownlint-disable-file MD004 MD024 MD034 MD036 --> <!-- markdownlint-disable-file MD004 MD024 MD034 MD036 -->
# CHANGE LOG # CHANGE LOG
## main(v1.0.4) ## main(v1.0.5)
- feat: 新增 `DISABLE_CUSTOM_ADDRESS_NAME` 配置: 禁用自定义邮箱地址名称功能
- feat: 新增 `CREATE_ADDRESS_DEFAULT_DOMAIN_FIRST` 配置: 创建地址时优先使用第一个域名
- feat: |UI| 主页增加进入极简模式按钮
## v1.0.4
- feat: |UI| 优化极简模式主页, 增加全部邮件页面功能(删除/下载/附件/...), 可在 `外观` 中切换 - feat: |UI| 优化极简模式主页, 增加全部邮件页面功能(删除/下载/附件/...), 可在 `外观` 中切换
- feat: admin 账号设置页面增加 `邮件转发规则` 配置 - feat: admin 账号设置页面增加 `邮件转发规则` 配置
+2 -2
View File
@@ -1,5 +1,5 @@
<!-- markdownlint-disable-file MD033 MD045 --> <!-- markdownlint-disable-file MD033 MD045 -->
# 🚀 Cloudflare 临时邮箱 - 免费搭建临时邮件服务 # Cloudflare 临时邮箱 - 免费搭建临时邮件服务
<p align="center"> <p align="center">
<a href="https://temp-mail-docs.awsl.uk" target="_blank"> <a href="https://temp-mail-docs.awsl.uk" target="_blank">
@@ -81,7 +81,7 @@
<details open> <details open>
<summary>📖 目录(点击收缩/展开)</summary> <summary>📖 目录(点击收缩/展开)</summary>
- [🚀 Cloudflare 临时邮箱 - 免费搭建临时邮件服务](#-cloudflare-临时邮箱---免费搭建临时邮件服务) - [Cloudflare 临时邮箱 - 免费搭建临时邮件服务](#cloudflare-临时邮箱---免费搭建临时邮件服务)
- [📚 部署文档 - 快速开始](#-部署文档---快速开始) - [📚 部署文档 - 快速开始](#-部署文档---快速开始)
- [📝 更新日志](#-更新日志) - [📝 更新日志](#-更新日志)
- [🎯 在线体验](#-在线体验) - [🎯 在线体验](#-在线体验)
+3 -3
View File
@@ -1,6 +1,6 @@
{ {
"name": "cloudflare_temp_email", "name": "cloudflare_temp_email",
"version": "1.0.4", "version": "1.0.5",
"private": true, "private": true,
"type": "module", "type": "module",
"scripts": { "scripts": {
@@ -30,7 +30,7 @@
"naive-ui": "^2.42.0", "naive-ui": "^2.42.0",
"postal-mime": "^2.4.4", "postal-mime": "^2.4.4",
"vooks": "^0.2.12", "vooks": "^0.2.12",
"vue": "^3.5.19", "vue": "^3.5.20",
"vue-clipboard3": "^2.0.0", "vue-clipboard3": "^2.0.0",
"vue-i18n": "^11.1.11", "vue-i18n": "^11.1.11",
"vue-router": "^4.5.1" "vue-router": "^4.5.1"
@@ -47,7 +47,7 @@
"vite-plugin-wasm": "^3.5.0", "vite-plugin-wasm": "^3.5.0",
"workbox-build": "^7.3.0", "workbox-build": "^7.3.0",
"workbox-window": "^7.3.0", "workbox-window": "^7.3.0",
"wrangler": "^4.32.0" "wrangler": "^4.33.0"
}, },
"packageManager": "pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39" "packageManager": "pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39"
} }
+287 -286
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -78,6 +78,7 @@ const getOpenSettings = async (message, notification) => {
adminContact: res["adminContact"] || "", adminContact: res["adminContact"] || "",
enableUserCreateEmail: res["enableUserCreateEmail"] || false, enableUserCreateEmail: res["enableUserCreateEmail"] || false,
disableAnonymousUserCreateEmail: res["disableAnonymousUserCreateEmail"] || false, disableAnonymousUserCreateEmail: res["disableAnonymousUserCreateEmail"] || false,
disableCustomAddressName: res["disableCustomAddressName"] || false,
enableUserDeleteEmail: res["enableUserDeleteEmail"] || false, enableUserDeleteEmail: res["enableUserDeleteEmail"] || false,
enableAutoReply: res["enableAutoReply"] || false, enableAutoReply: res["enableAutoReply"] || false,
enableIndexAbout: res["enableIndexAbout"] || false, enableIndexAbout: res["enableIndexAbout"] || false,
+1
View File
@@ -22,6 +22,7 @@ export const useGlobalState = createGlobalState(
adminContact: '', adminContact: '',
enableUserCreateEmail: false, enableUserCreateEmail: false,
disableAnonymousUserCreateEmail: false, disableAnonymousUserCreateEmail: false,
disableCustomAddressName: false,
enableUserDeleteEmail: false, enableUserDeleteEmail: false,
enableAutoReply: false, enableAutoReply: false,
enableIndexAbout: false, enableIndexAbout: false,
+15 -1
View File
@@ -5,6 +5,8 @@ import { useRoute } from 'vue-router'
import { useGlobalState } from '../store' import { useGlobalState } from '../store'
import { api } from '../api' import { api } from '../api'
import { useIsMobile } from '../utils/composables'
import { FullscreenExitOutlined } from '@vicons/material'
import AddressBar from './index/AddressBar.vue'; import AddressBar from './index/AddressBar.vue';
import MailBox from '../components/MailBox.vue'; import MailBox from '../components/MailBox.vue';
@@ -15,12 +17,12 @@ import Appearance from './common/Appearance.vue';
import Webhook from './index/Webhook.vue'; import Webhook from './index/Webhook.vue';
import Attachment from './index/Attachment.vue'; import Attachment from './index/Attachment.vue';
import About from './common/About.vue'; import About from './common/About.vue';
import SimpleIndex from './index/SimpleIndex.vue'; import SimpleIndex from './index/SimpleIndex.vue';
const { loading, settings, openSettings, indexTab, globalTabplacement, useSimpleIndex } = useGlobalState() const { loading, settings, openSettings, indexTab, globalTabplacement, useSimpleIndex } = useGlobalState()
const message = useMessage() const message = useMessage()
const route = useRoute() const route = useRoute()
const isMobile = useIsMobile()
const SendMail = defineAsyncComponent(() => { const SendMail = defineAsyncComponent(() => {
loading.value = true; loading.value = true;
@@ -42,6 +44,7 @@ const { t } = useI18n({
saveToS3Success: 'save to s3 success', saveToS3Success: 'save to s3 success',
webhookSettings: 'Webhook Settings', webhookSettings: 'Webhook Settings',
query: 'Query', query: 'Query',
enterSimpleMode: 'Simple Mode',
}, },
zh: { zh: {
mailbox: '收件箱', mailbox: '收件箱',
@@ -55,6 +58,7 @@ const { t } = useI18n({
saveToS3Success: '保存到s3成功', saveToS3Success: '保存到s3成功',
webhookSettings: 'Webhook 设置', webhookSettings: 'Webhook 设置',
query: '查询', query: '查询',
enterSimpleMode: '极简模式',
} }
} }
}); });
@@ -133,6 +137,16 @@ onMounted(() => {
<div v-else> <div v-else>
<AddressBar /> <AddressBar />
<n-tabs v-if="settings.address" type="card" v-model:value="indexTab" :placement="globalTabplacement"> <n-tabs v-if="settings.address" type="card" v-model:value="indexTab" :placement="globalTabplacement">
<template #prefix v-if="!isMobile">
<n-button @click="useSimpleIndex = true" tertiary size="small">
<template #icon>
<n-icon>
<FullscreenExitOutlined />
</n-icon>
</template>
{{ t('enterSimpleMode') }}
</n-button>
</template>
<n-tab-pane name="mailbox" :tab="t('mailbox')"> <n-tab-pane name="mailbox" :tab="t('mailbox')">
<div v-if="showMailIdQuery" style="margin-bottom: 10px;"> <div v-if="showMailIdQuery" style="margin-bottom: 10px;">
<n-input-group> <n-input-group>
+10 -5
View File
@@ -84,6 +84,7 @@ const { locale, t } = useI18n({
credentialInput: 'Please input the Mail Address Credential', credentialInput: 'Please input the Mail Address Credential',
bindUserInfo: 'Logged in user, login without binding email or create new email address will bind to current user', bindUserInfo: 'Logged in user, login without binding email or create new email address will bind to current user',
bindUserAddressError: 'Error when bind email address to user', bindUserAddressError: 'Error when bind email address to user',
autoGeneratedName: 'Auto-generated name',
}, },
zh: { zh: {
login: '登录', login: '登录',
@@ -100,6 +101,7 @@ const { locale, t } = useI18n({
credentialInput: '请输入邮箱地址凭据', credentialInput: '请输入邮箱地址凭据',
bindUserInfo: '已登录用户, 登录未绑定邮箱或创建新邮箱地址将绑定到当前用户', bindUserInfo: '已登录用户, 登录未绑定邮箱或创建新邮箱地址将绑定到当前用户',
bindUserAddressError: '绑定邮箱地址到用户时错误', bindUserAddressError: '绑定邮箱地址到用户时错误',
autoGeneratedName: '自动生成名称',
} }
} }
}); });
@@ -147,8 +149,10 @@ const generateName = async () => {
const newEmail = async () => { const newEmail = async () => {
try { try {
// If custom names are disabled, send empty name to trigger backend auto-generation
const nameToSend = openSettings.value.disableCustomAddressName ? "" : emailName.value;
const res = await props.newAddressPath( const res = await props.newAddressPath(
emailName.value, nameToSend,
emailDomain.value, emailDomain.value,
cfToken.value cfToken.value
); );
@@ -240,19 +244,20 @@ onMounted(async () => {
<n-spin :show="generateNameLoading"> <n-spin :show="generateNameLoading">
<n-form> <n-form>
<span> <span>
<p>{{ t("getNewEmailTip1") + addressRegex.source }}</p> <p v-if="!openSettings.disableCustomAddressName">{{ t("getNewEmailTip1") + addressRegex.source }}</p>
<p>{{ t("getNewEmailTip2") }}</p> <p v-if="!openSettings.disableCustomAddressName">{{ t("getNewEmailTip2") }}</p>
<p>{{ t("getNewEmailTip3") }}</p> <p>{{ t("getNewEmailTip3") }}</p>
</span> </span>
<n-button @click="generateName" style="margin-bottom: 10px;"> <n-button v-if="!openSettings.disableCustomAddressName" @click="generateName" style="margin-bottom: 10px;">
{{ t('generateName') }} {{ t('generateName') }}
</n-button> </n-button>
<n-input-group> <n-input-group>
<n-input-group-label v-if="addressPrefix"> <n-input-group-label v-if="addressPrefix">
{{ addressPrefix }} {{ addressPrefix }}
</n-input-group-label> </n-input-group-label>
<n-input v-model:value="emailName" show-count :minlength="openSettings.minAddressLen" <n-input v-if="!openSettings.disableCustomAddressName" v-model:value="emailName" show-count :minlength="openSettings.minAddressLen"
:maxlength="openSettings.maxAddressLen" /> :maxlength="openSettings.maxAddressLen" />
<n-input v-else :value="t('autoGeneratedName')" disabled />
<n-input-group-label>@</n-input-group-label> <n-input-group-label>@</n-input-group-label>
<n-select v-model:value="emailDomain" :consistent-menu-width="false" <n-select v-model:value="emailDomain" :consistent-menu-width="false"
:options="domainsOptions" /> :options="domainsOptions" />
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "temp-email-pages", "name": "temp-email-pages",
"version": "1.0.4", "version": "1.0.5",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
@@ -11,7 +11,7 @@
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"devDependencies": { "devDependencies": {
"wrangler": "^4.32.0" "wrangler": "^4.33.0"
}, },
"packageManager": "pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39" "packageManager": "pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39"
} }
@@ -24,9 +24,9 @@ res = requests.post(
print(res.json()) print(res.json())
``` ```
# 批量创建随机用户名邮箱地址 API 示例 ## 批量创建随机用户名邮箱地址 API 示例
## 通过 admin API 批量新建邮箱地址 ### 通过 admin API 批量新建邮箱地址
这是一个 `python` 的例子,使用 `requests` 库发送邮件。 这是一个 `python` 的例子,使用 `requests` 库发送邮件。
+13 -11
View File
@@ -22,17 +22,19 @@
## 邮箱相关变量 ## 邮箱相关变量
| 变量名 | 类型 | 说明 | 示例 | | 变量名 | 类型 | 说明 | 示例 |
| ---------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | | ------------------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- |
| `PREFIX` | 文本 | 新建 `邮箱名称` 的默认前缀,不需要前缀可不配置 | `tmp` | | `PREFIX` | 文本 | 新建 `邮箱名称` 的默认前缀,不需要前缀可不配置 | `tmp` |
| `MIN_ADDRESS_LEN` | 数字 | `邮箱名称` 的最小长度 | `1` | | `MIN_ADDRESS_LEN` | 数字 | `邮箱名称` 的最小长度 | `1` |
| `MAX_ADDRESS_LEN` | 数字 | `邮箱名称` 的最大长度 | `30` | | `MAX_ADDRESS_LEN` | 数字 | `邮箱名称` 的最大长度 | `30` |
| `ADDRESS_CHECK_REGEX` | 文本 | `邮箱名称` 的正则表达式, 只用于检查 | `^(?!.*admin).*` | | `DISABLE_CUSTOM_ADDRESS_NAME` | 文本/JSON | 禁用自定义邮箱地址名称,如果设置为 true,则用户无法输入自定义邮箱名称,将由后台自动生成 | `true` |
| `ADDRESS_REGEX` | 文本 | `邮箱名称` 替换非法符号的正则表达式, 不在其中的符号将被替换,如果不设置,默认为 `[^a-z0-9]`, 需谨慎使用, 有些符号可能导致无法收件 | `[^a-z0-9]` | | `ADDRESS_CHECK_REGEX` | 文本 | `邮箱名称` 的正则表达式, 只用于检查 | `^(?!.*admin).*` |
| `DEFAULT_DOMAINS` | JSON | 默认用户可用的域名(未登录或未分配角色的用户) | `["awsl.uk", "dreamhunter2333.xyz"]` | | `ADDRESS_REGEX` | 文本 | `邮箱名称` 替换非法符号的正则表达式, 不在其中的符号将被替换,如果不设置,默认为 `[^a-z0-9]`, 需谨慎使用, 有些符号可能导致无法收件 | `[^a-z0-9]` |
| `DOMAIN_LABELS` | JSON | 对于中文域名,可以使用 DOMAIN_LABELS 显示域名的中文展示名称 | `["中文.awsl.uk", "dreamhunter2333.xyz"]` | | `DEFAULT_DOMAINS` | JSON | 默认用户可用的域名(未登录或未分配角色的用户) | `["awsl.uk", "dreamhunter2333.xyz"]` |
| `ENABLE_AUTO_REPLY` | 文本/JSON | 允许自动回复邮件 | `true` | | `CREATE_ADDRESS_DEFAULT_DOMAIN_FIRST` | 文本/JSON | 创建新地址时是否优先使用默认域名,如果设置为 true,当未指定域名时将使用第一个域名, 主要用于 telegram bot 场景 | `false` |
| `DEFAULT_SEND_BALANCE` | 文本/JSON | 默认发送邮件余额,如果不设置,将为 0 | `1` | | `DOMAIN_LABELS` | JSON | 对于中文域名,可以使用 DOMAIN_LABELS 显示域名的中文展示名称 | `["中文.awsl.uk", "dreamhunter2333.xyz"]` |
| `ENABLE_AUTO_REPLY` | 文本/JSON | 允许自动回复邮件 | `true` |
| `DEFAULT_SEND_BALANCE` | 文本/JSON | 默认发送邮件余额,如果不设置,将为 0 | `1` |
## 接受邮件相关变量 ## 接受邮件相关变量
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "temp-mail-docs", "name": "temp-mail-docs",
"private": true, "private": true,
"version": "1.0.4", "version": "1.0.5",
"type": "module", "type": "module",
"devDependencies": { "devDependencies": {
"@types/node": "^24.3.0", "@types/node": "^24.3.0",
"vitepress": "^1.6.4", "vitepress": "^1.6.4",
"wrangler": "^4.32.0" "wrangler": "^4.33.0"
}, },
"scripts": { "scripts": {
"dev": "vitepress dev docs", "dev": "vitepress dev docs",
+317 -317
View File
File diff suppressed because it is too large Load Diff
+7 -7
View File
@@ -1,6 +1,6 @@
{ {
"name": "cloudflare_temp_email", "name": "cloudflare_temp_email",
"version": "1.0.4", "version": "1.0.5",
"private": true, "private": true,
"type": "module", "type": "module",
"scripts": { "scripts": {
@@ -11,18 +11,18 @@
"build": "wrangler deploy --dry-run --outdir dist --minify" "build": "wrangler deploy --dry-run --outdir dist --minify"
}, },
"devDependencies": { "devDependencies": {
"@cloudflare/workers-types": "^4.20250822.0", "@cloudflare/workers-types": "^4.20250826.0",
"@eslint/js": "9.18.0", "@eslint/js": "9.18.0",
"@simplewebauthn/types": "10.0.0", "@simplewebauthn/types": "10.0.0",
"@types/node": "^22.17.2", "@types/node": "^22.18.0",
"eslint": "9.18.0", "eslint": "9.18.0",
"globals": "^15.15.0", "globals": "^15.15.0",
"typescript-eslint": "^8.40.0", "typescript-eslint": "^8.41.0",
"wrangler": "^4.32.0" "wrangler": "^4.33.0"
}, },
"dependencies": { "dependencies": {
"@aws-sdk/client-s3": "^3.873.0", "@aws-sdk/client-s3": "^3.876.0",
"@aws-sdk/s3-request-presigner": "^3.873.0", "@aws-sdk/s3-request-presigner": "^3.876.0",
"@simplewebauthn/server": "10.0.1", "@simplewebauthn/server": "10.0.1",
"hono": "^4.9.4", "hono": "^4.9.4",
"jsonpath-plus": "^10.3.0", "jsonpath-plus": "^10.3.0",
+231 -230
View File
@@ -14,11 +14,11 @@ importers:
.: .:
dependencies: dependencies:
'@aws-sdk/client-s3': '@aws-sdk/client-s3':
specifier: ^3.873.0 specifier: ^3.876.0
version: 3.873.0 version: 3.876.0
'@aws-sdk/s3-request-presigner': '@aws-sdk/s3-request-presigner':
specifier: ^3.873.0 specifier: ^3.876.0
version: 3.873.0 version: 3.876.0
'@simplewebauthn/server': '@simplewebauthn/server':
specifier: 10.0.1 specifier: 10.0.1
version: 10.0.1 version: 10.0.1
@@ -45,8 +45,8 @@ importers:
version: 1.1.5 version: 1.1.5
devDependencies: devDependencies:
'@cloudflare/workers-types': '@cloudflare/workers-types':
specifier: ^4.20250822.0 specifier: ^4.20250826.0
version: 4.20250822.0 version: 4.20250826.0
'@eslint/js': '@eslint/js':
specifier: 9.18.0 specifier: 9.18.0
version: 9.18.0 version: 9.18.0
@@ -54,8 +54,8 @@ importers:
specifier: 10.0.0 specifier: 10.0.0
version: 10.0.0 version: 10.0.0
'@types/node': '@types/node':
specifier: ^22.17.2 specifier: ^22.18.0
version: 22.17.2 version: 22.18.0
eslint: eslint:
specifier: 9.18.0 specifier: 9.18.0
version: 9.18.0 version: 9.18.0
@@ -63,11 +63,11 @@ importers:
specifier: ^15.15.0 specifier: ^15.15.0
version: 15.15.0 version: 15.15.0
typescript-eslint: typescript-eslint:
specifier: ^8.40.0 specifier: ^8.41.0
version: 8.40.0(eslint@9.18.0)(typescript@5.4.5) version: 8.41.0(eslint@9.18.0)(typescript@5.4.5)
wrangler: wrangler:
specifier: ^4.32.0 specifier: ^4.33.0
version: 4.32.0(@cloudflare/workers-types@4.20250822.0) version: 4.33.0(@cloudflare/workers-types@4.20250826.0)
packages: packages:
@@ -94,44 +94,44 @@ packages:
'@aws-crypto/util@5.2.0': '@aws-crypto/util@5.2.0':
resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==}
'@aws-sdk/client-s3@3.873.0': '@aws-sdk/client-s3@3.876.0':
resolution: {integrity: sha512-b+1lSEf+obcC508blw5qEDR1dyTiHViZXbf8G6nFospyqLJS0Vu2py+e+LG2VDVdAouZ8+RvW+uAi73KgsWl0w==} resolution: {integrity: sha512-rrdrB0IlHfRaY+qxo87iSPJJxjCZ2WIV0wKi0EWz02yBpq17c0o6Vzc8f1+ksR+IZGkGttQnD2j4UpItMdLSKg==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/client-sso@3.873.0': '@aws-sdk/client-sso@3.876.0':
resolution: {integrity: sha512-EmcrOgFODWe7IsLKFTeSXM9TlQ80/BO1MBISlr7w2ydnOaUYIiPGRRJnDpeIgMaNqT4Rr2cRN2RiMrbFO7gDdA==} resolution: {integrity: sha512-Vf0PMF7HVpvllrfPODnBZmlz6kT/y2AvOt1RQG3+qD0VrHWzShc5nwgRZ+yyP3xkKVhZsQ3sJapfZTFnjqMOYA==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/core@3.873.0': '@aws-sdk/core@3.876.0':
resolution: {integrity: sha512-WrROjp8X1VvmnZ4TBzwM7RF+EB3wRaY9kQJLXw+Aes0/3zRjUXvGIlseobGJMqMEGnM0YekD2F87UaVfot1xeQ==} resolution: {integrity: sha512-sVFBFkdoPOPyY13NaXO1E/R9O5J6ixzHnnRbqrbXYM2QQgLNPTKIiRtmVEuVoFV9YULg+/aKm7caix8m468y9w==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/credential-provider-env@3.873.0': '@aws-sdk/credential-provider-env@3.876.0':
resolution: {integrity: sha512-FWj1yUs45VjCADv80JlGshAttUHBL2xtTAbJcAxkkJZzLRKVkdyrepFWhv/95MvDyzfbT6PgJiWMdW65l/8ooA==} resolution: {integrity: sha512-cof7lwp2AlrAfRs0pt4W2KMS2VMBvEmpcti1UOFfSJIqkn+cyJliMJ8LHg22GI+kUexjvxdAqSbf3M7OHvEW+w==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/credential-provider-http@3.873.0': '@aws-sdk/credential-provider-http@3.876.0':
resolution: {integrity: sha512-0sIokBlXIsndjZFUfr3Xui8W6kPC4DAeBGAXxGi9qbFZ9PWJjn1vt2COLikKH3q2snchk+AsznREZG8NW6ezSg==} resolution: {integrity: sha512-wzmef2NBp2+X1l8D4Q8hx1G8oI3+WdvLdPev9VnVpRYZxYGRWVPl++wvCBsCn/ZL0mdWopPkhHA3kFexQhMzvg==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/credential-provider-ini@3.873.0': '@aws-sdk/credential-provider-ini@3.876.0':
resolution: {integrity: sha512-bQdGqh47Sk0+2S3C+N46aNQsZFzcHs7ndxYLARH/avYXf02Nl68p194eYFaAHJSQ1re5IbExU1+pbums7FJ9fA==} resolution: {integrity: sha512-JHbW6fqnJsVjGHCyko7B0NVPT1nEAPxkM3CGjUcVGsHgJBkxOLVCMQqTRyHcDdeHR2qeojlLoOHRz97xIHQjYw==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/credential-provider-node@3.873.0': '@aws-sdk/credential-provider-node@3.876.0':
resolution: {integrity: sha512-+v/xBEB02k2ExnSDL8+1gD6UizY4Q/HaIJkNSkitFynRiiTQpVOSkCkA0iWxzksMeN8k1IHTE5gzeWpkEjNwbA==} resolution: {integrity: sha512-eHbNt1+Hi43e8ANnwf6toapLSxfMiyGq459y3Uh6i7NBOiWWKEsOVcgOfUC3RCoqeikxovt1tFM2cEElWUIOhg==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/credential-provider-process@3.873.0': '@aws-sdk/credential-provider-process@3.876.0':
resolution: {integrity: sha512-ycFv9WN+UJF7bK/ElBq1ugWA4NMbYS//1K55bPQZb2XUpAM2TWFlEjG7DIyOhLNTdl6+CbHlCdhlKQuDGgmm0A==} resolution: {integrity: sha512-SMX4OlHvspu3gF4hxe7WAnZFhxpiCye+WlBSVoWfW/i9XNhtrZS1JMr29MK34GlCTk9qO7FlRwds/Z5k7xPpHg==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/credential-provider-sso@3.873.0': '@aws-sdk/credential-provider-sso@3.876.0':
resolution: {integrity: sha512-SudkAOZmjEEYgUrqlUUjvrtbWJeI54/0Xo87KRxm4kfBtMqSx0TxbplNUAk8Gkg4XQNY0o7jpG8tK7r2Wc2+uw==} resolution: {integrity: sha512-iP5dz9XqwePbgnh7Bdrq5e1319JpCRKLyomUfHH1XVeXkIHmwIJdmTj1Upeo1J8L/5cLHmhXAN6CTN11bLo8SA==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/credential-provider-web-identity@3.873.0': '@aws-sdk/credential-provider-web-identity@3.876.0':
resolution: {integrity: sha512-Gw2H21+VkA6AgwKkBtTtlGZ45qgyRZPSKWs0kUwXVlmGOiPz61t/lBX0vG6I06ZIz2wqeTJ5OA1pWZLqw1j0JQ==} resolution: {integrity: sha512-q/XSCP1uae5aB9veM8zcm6Gqu6A4ckX9ZbhHgCzURXVJDwp+nINW1hM9vppMjGw3ND9Ibx/adR+KfTI0TDMzqw==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/middleware-bucket-endpoint@3.873.0': '@aws-sdk/middleware-bucket-endpoint@3.873.0':
@@ -142,8 +142,8 @@ packages:
resolution: {integrity: sha512-GIqoc8WgRcf/opBOZXFLmplJQKwOMjiOMmDz9gQkaJ8FiVJoAp8EGVmK2TOWZMQUYsavvHYsHaor5R2xwPoGVg==} resolution: {integrity: sha512-GIqoc8WgRcf/opBOZXFLmplJQKwOMjiOMmDz9gQkaJ8FiVJoAp8EGVmK2TOWZMQUYsavvHYsHaor5R2xwPoGVg==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/middleware-flexible-checksums@3.873.0': '@aws-sdk/middleware-flexible-checksums@3.876.0':
resolution: {integrity: sha512-NNiy2Y876P5cgIhsDlHopbPZS3ugdfBW1va0WdpVBviwAs6KT4irPNPAOyF1/33N/niEDKx0fKQV7ROB70nNPA==} resolution: {integrity: sha512-Xfb9/XP0WcQq/yJxUubfzMUF0AYSX10UUIRbCJog0/lnDNocEiGEIaarwuQzoxb9QW9TQ1l5dDc/5bOMa1YVGw==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/middleware-host-header@3.873.0': '@aws-sdk/middleware-host-header@3.873.0':
@@ -154,44 +154,44 @@ packages:
resolution: {integrity: sha512-r+hIaORsW/8rq6wieDordXnA/eAu7xAPLue2InhoEX6ML7irP52BgiibHLpt9R0psiCzIHhju8qqKa4pJOrmiw==} resolution: {integrity: sha512-r+hIaORsW/8rq6wieDordXnA/eAu7xAPLue2InhoEX6ML7irP52BgiibHLpt9R0psiCzIHhju8qqKa4pJOrmiw==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/middleware-logger@3.873.0': '@aws-sdk/middleware-logger@3.876.0':
resolution: {integrity: sha512-QhNZ8X7pW68kFez9QxUSN65Um0Feo18ZmHxszQZNUhKDsXew/EG9NPQE/HgYcekcon35zHxC4xs+FeNuPurP2g==} resolution: {integrity: sha512-cpWJhOuMSyz9oV25Z/CMHCBTgafDCbv7fHR80nlRrPdPZ8ETNsahwRgltXP1QJJ8r3X/c1kwpOR7tc+RabVzNA==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/middleware-recursion-detection@3.873.0': '@aws-sdk/middleware-recursion-detection@3.873.0':
resolution: {integrity: sha512-OtgY8EXOzRdEWR//WfPkA/fXl0+WwE8hq0y9iw2caNyKPtca85dzrrZWnPqyBK/cpImosrpR1iKMYr41XshsCg==} resolution: {integrity: sha512-OtgY8EXOzRdEWR//WfPkA/fXl0+WwE8hq0y9iw2caNyKPtca85dzrrZWnPqyBK/cpImosrpR1iKMYr41XshsCg==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/middleware-sdk-s3@3.873.0': '@aws-sdk/middleware-sdk-s3@3.876.0':
resolution: {integrity: sha512-bOoWGH57ORK2yKOqJMmxBV4b3yMK8Pc0/K2A98MNPuQedXaxxwzRfsT2Qw+PpfYkiijrrNFqDYmQRGntxJ2h8A==} resolution: {integrity: sha512-h+TDs9EKAfXnrkogQpQz3o11zvs6Vh9+ehxyd35OcM7evnDeoV4GFjjnAKq+MxbBk/5Ewnvng+d6/WQDvMbj7Q==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/middleware-ssec@3.873.0': '@aws-sdk/middleware-ssec@3.873.0':
resolution: {integrity: sha512-AF55J94BoiuzN7g3hahy0dXTVZahVi8XxRBLgzNp6yQf0KTng+hb/V9UQZVYY1GZaDczvvvnqC54RGe9OZZ9zQ==} resolution: {integrity: sha512-AF55J94BoiuzN7g3hahy0dXTVZahVi8XxRBLgzNp6yQf0KTng+hb/V9UQZVYY1GZaDczvvvnqC54RGe9OZZ9zQ==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/middleware-user-agent@3.873.0': '@aws-sdk/middleware-user-agent@3.876.0':
resolution: {integrity: sha512-gHqAMYpWkPhZLwqB3Yj83JKdL2Vsb64sryo8LN2UdpElpS+0fT4yjqSxKTfp7gkhN6TCIxF24HQgbPk5FMYJWw==} resolution: {integrity: sha512-FR+8INfnbNv32QDQ5szxkWX6mB/QgezfNyx8LnAh1ErISZMmEFBxXXir+ZOfuV8vsmal1a6cy9qmnMNDaNnaNQ==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/nested-clients@3.873.0': '@aws-sdk/nested-clients@3.876.0':
resolution: {integrity: sha512-yg8JkRHuH/xO65rtmLOWcd9XQhxX1kAonp2CliXT44eA/23OBds6XoheY44eZeHfCTgutDLTYitvy3k9fQY6ZA==} resolution: {integrity: sha512-R4TZrkM2gUElTsotk8mt3y7iLG8TNi1LL1wgVdEEWSLOYTaFyglGdoNBMtEeP7lmXilaTy00AbYF6BakJvSTHg==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/region-config-resolver@3.873.0': '@aws-sdk/region-config-resolver@3.873.0':
resolution: {integrity: sha512-q9sPoef+BBG6PJnc4x60vK/bfVwvRWsPgcoQyIra057S/QGjq5VkjvNk6H8xedf6vnKlXNBwq9BaANBXnldUJg==} resolution: {integrity: sha512-q9sPoef+BBG6PJnc4x60vK/bfVwvRWsPgcoQyIra057S/QGjq5VkjvNk6H8xedf6vnKlXNBwq9BaANBXnldUJg==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/s3-request-presigner@3.873.0': '@aws-sdk/s3-request-presigner@3.876.0':
resolution: {integrity: sha512-DiVlfCpdR7EaZSNPQwBB1jq8INWezKMWb3BUOWxrOcIcS3p2WpKbYl0H76D6TCHvQzXRVgKSSM6tHuWPoJtUHA==} resolution: {integrity: sha512-Mmj9xZ+NWDxatIsVsQ4986fTpNcPhLbWMX0PcgGLsSd8CnciWFsy06i7LbCzXS6sr6QzLP5Yesfdj+WWxgnFNQ==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/signature-v4-multi-region@3.873.0': '@aws-sdk/signature-v4-multi-region@3.876.0':
resolution: {integrity: sha512-FQ5OIXw1rmDud7f/VO9y2Mg9rX1o4MnngRKUOD8mS9ALK4uxKrTczb4jA+uJLSLwTqMGs3bcB1RzbMW1zWTMwQ==} resolution: {integrity: sha512-OMDcuaVlC2rbze92w4QcNfuEA0IeT2GsT1ByZCwe+Y9tZwxzj7fCiOOU0UmJfa+juuQ/YBzVYxnkrkz3Rg6DEw==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/token-providers@3.873.0': '@aws-sdk/token-providers@3.876.0':
resolution: {integrity: sha512-BWOCeFeV/Ba8fVhtwUw/0Hz4wMm9fjXnMb4Z2a5he/jFlz5mt1/rr6IQ4MyKgzOaz24YrvqsJW2a0VUKOaYDvg==} resolution: {integrity: sha512-iU08kaQbhXnY0CC2TBcr7y/2PqPwZP2CTWX/Rbq0NvhOyteikfh7ASC+bRfLUp0XMSHKvSb+w2dh8a0lvx4oHg==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@aws-sdk/types@3.862.0': '@aws-sdk/types@3.862.0':
@@ -217,8 +217,8 @@ packages:
'@aws-sdk/util-user-agent-browser@3.873.0': '@aws-sdk/util-user-agent-browser@3.873.0':
resolution: {integrity: sha512-AcRdbK6o19yehEcywI43blIBhOCSo6UgyWcuOJX5CFF8k39xm1ILCjQlRRjchLAxWrm0lU0Q7XV90RiMMFMZtA==} resolution: {integrity: sha512-AcRdbK6o19yehEcywI43blIBhOCSo6UgyWcuOJX5CFF8k39xm1ILCjQlRRjchLAxWrm0lU0Q7XV90RiMMFMZtA==}
'@aws-sdk/util-user-agent-node@3.873.0': '@aws-sdk/util-user-agent-node@3.876.0':
resolution: {integrity: sha512-9MivTP+q9Sis71UxuBaIY3h5jxH0vN3/ZWGxO8ADL19S2OIfknrYSAfzE5fpoKROVBu0bS4VifHOFq4PY1zsxw==} resolution: {integrity: sha512-/ZIaeUt60JBdI0mNc7sZ8v3Tuzp8Pbe4gIAYnppGyF4KV8QA+Yu8tp2bGHfkKn150t1uvQ6P/4CwFfoGF34dzg==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
peerDependencies: peerDependencies:
aws-crt: '>=1.0.0' aws-crt: '>=1.0.0'
@@ -242,8 +242,8 @@ packages:
resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
'@cloudflare/unenv-preset@2.6.2': '@cloudflare/unenv-preset@2.6.3':
resolution: {integrity: sha512-C7/tW7Qy+wGOCmHXu7xpP1TF3uIhRoi7zVY7dmu/SOSGjPilK+lSQ2lIRILulZsT467ZJNlI0jBxMbd8LzkGRg==} resolution: {integrity: sha512-Bj3i0kHAKFh/fViM8RT5ToV7w5Q8bGUR6yw4R0pkNktn559rmBMNf0+hkRmX8BmVH4WTo1Ye79zjkCxnmNt4+g==}
peerDependencies: peerDependencies:
unenv: 2.0.0-rc.19 unenv: 2.0.0-rc.19
workerd: ^1.20250802.0 workerd: ^1.20250802.0
@@ -251,38 +251,38 @@ packages:
workerd: workerd:
optional: true optional: true
'@cloudflare/workerd-darwin-64@1.20250816.0': '@cloudflare/workerd-darwin-64@1.20250823.0':
resolution: {integrity: sha512-yN1Rga4ufTdrJPCP4gEqfB47i1lWi3teY5IoeQbUuKnjnCtm4pZvXur526JzCmaw60Jx+AEWf5tizdwRd5hHBQ==} resolution: {integrity: sha512-yRLJc1cQNqQYcDViOk7kpTXnR5XuBP7B/Ms5KBdlQ6eTr2Vsg9mfKqWKInjzY8/Cx+p+Sic2Tbld42gcYkiM2A==}
engines: {node: '>=16'} engines: {node: '>=16'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@cloudflare/workerd-darwin-arm64@1.20250816.0': '@cloudflare/workerd-darwin-arm64@1.20250823.0':
resolution: {integrity: sha512-WyKPMQhbU+TTf4uDz3SA7ZObspg7WzyJMv/7J4grSddpdx2A4Y4SfPu3wsZleAOIMOAEVi0A1sYDhdltKM7Mxg==} resolution: {integrity: sha512-KJnikUe6J29Ga1QMPKNCc8eHD56DdBlu5XE5LoBH/AYRrbS5UI1d5F844hUWoFKJb8KRaPIH9F849HZWfNa1vw==}
engines: {node: '>=16'} engines: {node: '>=16'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@cloudflare/workerd-linux-64@1.20250816.0': '@cloudflare/workerd-linux-64@1.20250823.0':
resolution: {integrity: sha512-NWHOuFnVBaPRhLHw8kjPO9GJmc2P/CTYbnNlNm0EThyi57o/oDx0ldWLJqEHlrdEPOw7zEVGBqM/6M+V9agC6w==} resolution: {integrity: sha512-4QFXq4eDWEAK5QjGxRe0XUTBax1Fgarc08HETL6q0y/KPZp2nOTLfjLjklTn/qEiztafNFoJEIwhkiknHeOi/g==}
engines: {node: '>=16'} engines: {node: '>=16'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@cloudflare/workerd-linux-arm64@1.20250816.0': '@cloudflare/workerd-linux-arm64@1.20250823.0':
resolution: {integrity: sha512-FR+/yhaWs7FhfC3GKsM3+usQVrGEweJ9qyh7p+R6HNwnobgKr/h5ATWvJ4obGJF6ZHHodgSe+gOSYR7fkJ1xAQ==} resolution: {integrity: sha512-sODSrSVe4W/maoBu76qb0sJGBhxhSM2Q2tg/+G7q1IPgRZSzArMKIPrW6nBnmBrrG1O0X6aoAdID6w5hfuEM4g==}
engines: {node: '>=16'} engines: {node: '>=16'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@cloudflare/workerd-windows-64@1.20250816.0': '@cloudflare/workerd-windows-64@1.20250823.0':
resolution: {integrity: sha512-0lqClj2UMhFa8tCBiiX7Zhd5Bjp0V+X8oNBG6V6WsR9p9/HlIHAGgwRAM7aYkyG+8KC8xlbC89O2AXUXLpHx0g==} resolution: {integrity: sha512-WaNqUOXUnrcEI+i2NI4+okA9CrJMI9n2XTfVtDg/pLvcA/ZPTz23MEFMZU1splr4SslS1th1NBO38RMPnDB4rA==}
engines: {node: '>=16'} engines: {node: '>=16'}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
'@cloudflare/workers-types@4.20250822.0': '@cloudflare/workers-types@4.20250826.0':
resolution: {integrity: sha512-SR5nxiclSEXS/lVwcfFCS/h7L99VWg0wa2B2CavdTAOwGznwTNcd3vmrrer3LwkqhAUQnDc2aZg3HbRvoh4LYw==} resolution: {integrity: sha512-nAbTVI81wFSxbESRbfGRlfL4WYNvq8T46yr1ukypHL8O2xnbZfQnQhC7ftSBmDqov8HqQSdqcz9jCgLjVh61SQ==}
'@cspotcode/source-map-support@0.8.1': '@cspotcode/source-map-support@0.8.1':
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
@@ -684,6 +684,7 @@ packages:
'@simplewebauthn/types@10.0.0': '@simplewebauthn/types@10.0.0':
resolution: {integrity: sha512-SFXke7xkgPRowY2E+8djKbdEznTVnD5R6GO7GPTthpHrokLvNKw8C3lFZypTxLI7KkCfGPfhtqB3d7OVGGa9jQ==} resolution: {integrity: sha512-SFXke7xkgPRowY2E+8djKbdEznTVnD5R6GO7GPTthpHrokLvNKw8C3lFZypTxLI7KkCfGPfhtqB3d7OVGGa9jQ==}
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
'@sindresorhus/is@7.0.2': '@sindresorhus/is@7.0.2':
resolution: {integrity: sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==} resolution: {integrity: sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==}
@@ -913,69 +914,69 @@ packages:
'@types/json-schema@7.0.15': '@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
'@types/node@22.17.2': '@types/node@22.18.0':
resolution: {integrity: sha512-gL6z5N9Jm9mhY+U2KXZpteb+09zyffliRkZyZOHODGATyC5B1Jt/7TzuuiLkFsSUMLbS1OLmlj/E+/3KF4Q/4w==} resolution: {integrity: sha512-m5ObIqwsUp6BZzyiy4RdZpzWGub9bqLJMvZDD0QMXhxjqMHMENlj+SqF5QxoUwaQNFe+8kz8XM8ZQhqkQPTgMQ==}
'@types/uuid@9.0.8': '@types/uuid@9.0.8':
resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==}
'@typescript-eslint/eslint-plugin@8.40.0': '@typescript-eslint/eslint-plugin@8.41.0':
resolution: {integrity: sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==} resolution: {integrity: sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
'@typescript-eslint/parser': ^8.40.0 '@typescript-eslint/parser': ^8.41.0
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/parser@8.40.0': '@typescript-eslint/parser@8.41.0':
resolution: {integrity: sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==} resolution: {integrity: sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/project-service@8.40.0': '@typescript-eslint/project-service@8.41.0':
resolution: {integrity: sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==} resolution: {integrity: sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/scope-manager@8.40.0': '@typescript-eslint/scope-manager@8.41.0':
resolution: {integrity: sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==} resolution: {integrity: sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/tsconfig-utils@8.40.0': '@typescript-eslint/tsconfig-utils@8.41.0':
resolution: {integrity: sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==} resolution: {integrity: sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/type-utils@8.40.0': '@typescript-eslint/type-utils@8.41.0':
resolution: {integrity: sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==} resolution: {integrity: sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/types@8.40.0': '@typescript-eslint/types@8.41.0':
resolution: {integrity: sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==} resolution: {integrity: sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/typescript-estree@8.40.0': '@typescript-eslint/typescript-estree@8.41.0':
resolution: {integrity: sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==} resolution: {integrity: sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/utils@8.40.0': '@typescript-eslint/utils@8.41.0':
resolution: {integrity: sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==} resolution: {integrity: sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0' typescript: '>=4.8.4 <6.0.0'
'@typescript-eslint/visitor-keys@8.40.0': '@typescript-eslint/visitor-keys@8.41.0':
resolution: {integrity: sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==} resolution: {integrity: sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
abort-controller@3.0.0: abort-controller@3.0.0:
@@ -1021,8 +1022,8 @@ packages:
blake3-wasm@2.1.5: blake3-wasm@2.1.5:
resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==}
bowser@2.12.0: bowser@2.12.1:
resolution: {integrity: sha512-HcOcTudTeEWgbHh0Y1Tyb6fdeR71m4b/QACf0D4KswGTsNeIJQmg38mRENZPAYPZvGFN3fk3604XbQEPdxXdKg==} resolution: {integrity: sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==}
brace-expansion@1.1.12: brace-expansion@1.1.12:
resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
@@ -1382,8 +1383,8 @@ packages:
mimetext@3.0.27: mimetext@3.0.27:
resolution: {integrity: sha512-mUhWAsZD1N/K6dbN4+a5Yq78OPnYQw1ubOSMasBntsLQ2S7KVNlvDEA8dwpr4a7PszWMzeslKahAprtwYMgaBA==} resolution: {integrity: sha512-mUhWAsZD1N/K6dbN4+a5Yq78OPnYQw1ubOSMasBntsLQ2S7KVNlvDEA8dwpr4a7PszWMzeslKahAprtwYMgaBA==}
miniflare@4.20250816.1: miniflare@4.20250823.0:
resolution: {integrity: sha512-2X8yMy5wWw0dF1pNU4kztzZgp0jWv2KMqAOOb2FeQ/b11yck4aczmYHi7UYD3uyOgtj8WFhwG/KdRWAaATTtRA==} resolution: {integrity: sha512-ofQRQ6rb/5P4nsz/J+xptdrN4zvYUm0wuezbKfaxbAGiIVTsM1vd+Pta5MtZwdQ6BKLM9tKMtU0rnbTzy3wntQ==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
hasBin: true hasBin: true
@@ -1590,8 +1591,8 @@ packages:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
typescript-eslint@8.40.0: typescript-eslint@8.41.0:
resolution: {integrity: sha512-Xvd2l+ZmFDPEt4oj1QEXzA4A2uUK6opvKu3eGN9aGjB8au02lIVcLyi375w94hHyejTOmzIU77L8ol2sRg9n7Q==} resolution: {integrity: sha512-n66rzs5OBXW3SFSnZHr2T685q1i4ODm2nulFJhMZBotaTavsS8TrI3d7bDlRSs9yWo7HmyWrN9qDu14Qv7Y0Dw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies: peerDependencies:
eslint: ^8.57.0 || ^9.0.0 eslint: ^8.57.0 || ^9.0.0
@@ -1608,8 +1609,8 @@ packages:
undici-types@6.21.0: undici-types@6.21.0:
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
undici@7.14.0: undici@7.15.0:
resolution: {integrity: sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==} resolution: {integrity: sha512-7oZJCPvvMvTd0OlqWsIxTuItTpJBpU1tcbVl24FMn3xt3+VSunwUasmfPJRE57oNO1KsZ4PgA1xTdAX4hq8NyQ==}
engines: {node: '>=20.18.1'} engines: {node: '>=20.18.1'}
unenv@2.0.0-rc.19: unenv@2.0.0-rc.19:
@@ -1640,17 +1641,17 @@ packages:
worker-mailer@1.1.5: worker-mailer@1.1.5:
resolution: {integrity: sha512-Yq+LiQ25CHjdQakO3IE/srzYFS94XVQH9e0z30y/NoPyw6vLiLacYDPOBDD9CLpEMhy6vTgLQbsJzFBt9/7E2w==} resolution: {integrity: sha512-Yq+LiQ25CHjdQakO3IE/srzYFS94XVQH9e0z30y/NoPyw6vLiLacYDPOBDD9CLpEMhy6vTgLQbsJzFBt9/7E2w==}
workerd@1.20250816.0: workerd@1.20250823.0:
resolution: {integrity: sha512-5gIvHPE/3QVlQR1Sc1NdBkWmqWj/TSgIbY/f/qs9lhiLBw/Da+HbNBTVYGjvwYqEb3NQ+XQM4gAm5b2+JJaUJg==} resolution: {integrity: sha512-95lToK9zeaC7bX5ZmlP/wz6zqoUPBk3hhec1JjEMGZrxsXY9cPRkjWNCcjDctQ17U97vjMcY/ymchgx7w8Cfmg==}
engines: {node: '>=16'} engines: {node: '>=16'}
hasBin: true hasBin: true
wrangler@4.32.0: wrangler@4.33.0:
resolution: {integrity: sha512-q7TRSavBW3Eg3pp4rxqKJwSK+u/ieFOBdNvUsq1P1EMmyj3//tN/iXDokFak+dkW0vDYjsVG3PfOfHxU92OS6w==} resolution: {integrity: sha512-LIVnW/VePLMca8Y4pKz4ycXc8yPfXwJJnOnpq65fRTh9lR4UAuqHvSNW4Vx4JJI3ZniRZXIM8pb+tSntd5161w==}
engines: {node: '>=18.0.0'} engines: {node: '>=18.0.0'}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
'@cloudflare/workers-types': ^4.20250816.0 '@cloudflare/workers-types': ^4.20250823.0
peerDependenciesMeta: peerDependenciesMeta:
'@cloudflare/workers-types': '@cloudflare/workers-types':
optional: true optional: true
@@ -1729,29 +1730,29 @@ snapshots:
'@smithy/util-utf8': 2.3.0 '@smithy/util-utf8': 2.3.0
tslib: 2.8.1 tslib: 2.8.1
'@aws-sdk/client-s3@3.873.0': '@aws-sdk/client-s3@3.876.0':
dependencies: dependencies:
'@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha1-browser': 5.2.0
'@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/sha256-js': 5.2.0
'@aws-sdk/core': 3.873.0 '@aws-sdk/core': 3.876.0
'@aws-sdk/credential-provider-node': 3.873.0 '@aws-sdk/credential-provider-node': 3.876.0
'@aws-sdk/middleware-bucket-endpoint': 3.873.0 '@aws-sdk/middleware-bucket-endpoint': 3.873.0
'@aws-sdk/middleware-expect-continue': 3.873.0 '@aws-sdk/middleware-expect-continue': 3.873.0
'@aws-sdk/middleware-flexible-checksums': 3.873.0 '@aws-sdk/middleware-flexible-checksums': 3.876.0
'@aws-sdk/middleware-host-header': 3.873.0 '@aws-sdk/middleware-host-header': 3.873.0
'@aws-sdk/middleware-location-constraint': 3.873.0 '@aws-sdk/middleware-location-constraint': 3.873.0
'@aws-sdk/middleware-logger': 3.873.0 '@aws-sdk/middleware-logger': 3.876.0
'@aws-sdk/middleware-recursion-detection': 3.873.0 '@aws-sdk/middleware-recursion-detection': 3.873.0
'@aws-sdk/middleware-sdk-s3': 3.873.0 '@aws-sdk/middleware-sdk-s3': 3.876.0
'@aws-sdk/middleware-ssec': 3.873.0 '@aws-sdk/middleware-ssec': 3.873.0
'@aws-sdk/middleware-user-agent': 3.873.0 '@aws-sdk/middleware-user-agent': 3.876.0
'@aws-sdk/region-config-resolver': 3.873.0 '@aws-sdk/region-config-resolver': 3.873.0
'@aws-sdk/signature-v4-multi-region': 3.873.0 '@aws-sdk/signature-v4-multi-region': 3.876.0
'@aws-sdk/types': 3.862.0 '@aws-sdk/types': 3.862.0
'@aws-sdk/util-endpoints': 3.873.0 '@aws-sdk/util-endpoints': 3.873.0
'@aws-sdk/util-user-agent-browser': 3.873.0 '@aws-sdk/util-user-agent-browser': 3.873.0
'@aws-sdk/util-user-agent-node': 3.873.0 '@aws-sdk/util-user-agent-node': 3.876.0
'@aws-sdk/xml-builder': 3.873.0 '@aws-sdk/xml-builder': 3.873.0
'@smithy/config-resolver': 4.1.5 '@smithy/config-resolver': 4.1.5
'@smithy/core': 3.8.0 '@smithy/core': 3.8.0
@@ -1792,20 +1793,20 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- aws-crt - aws-crt
'@aws-sdk/client-sso@3.873.0': '@aws-sdk/client-sso@3.876.0':
dependencies: dependencies:
'@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/sha256-js': 5.2.0
'@aws-sdk/core': 3.873.0 '@aws-sdk/core': 3.876.0
'@aws-sdk/middleware-host-header': 3.873.0 '@aws-sdk/middleware-host-header': 3.873.0
'@aws-sdk/middleware-logger': 3.873.0 '@aws-sdk/middleware-logger': 3.876.0
'@aws-sdk/middleware-recursion-detection': 3.873.0 '@aws-sdk/middleware-recursion-detection': 3.873.0
'@aws-sdk/middleware-user-agent': 3.873.0 '@aws-sdk/middleware-user-agent': 3.876.0
'@aws-sdk/region-config-resolver': 3.873.0 '@aws-sdk/region-config-resolver': 3.873.0
'@aws-sdk/types': 3.862.0 '@aws-sdk/types': 3.862.0
'@aws-sdk/util-endpoints': 3.873.0 '@aws-sdk/util-endpoints': 3.873.0
'@aws-sdk/util-user-agent-browser': 3.873.0 '@aws-sdk/util-user-agent-browser': 3.873.0
'@aws-sdk/util-user-agent-node': 3.873.0 '@aws-sdk/util-user-agent-node': 3.876.0
'@smithy/config-resolver': 4.1.5 '@smithy/config-resolver': 4.1.5
'@smithy/core': 3.8.0 '@smithy/core': 3.8.0
'@smithy/fetch-http-handler': 5.1.1 '@smithy/fetch-http-handler': 5.1.1
@@ -1835,7 +1836,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- aws-crt - aws-crt
'@aws-sdk/core@3.873.0': '@aws-sdk/core@3.876.0':
dependencies: dependencies:
'@aws-sdk/types': 3.862.0 '@aws-sdk/types': 3.862.0
'@aws-sdk/xml-builder': 3.873.0 '@aws-sdk/xml-builder': 3.873.0
@@ -1853,17 +1854,17 @@ snapshots:
fast-xml-parser: 5.2.5 fast-xml-parser: 5.2.5
tslib: 2.8.1 tslib: 2.8.1
'@aws-sdk/credential-provider-env@3.873.0': '@aws-sdk/credential-provider-env@3.876.0':
dependencies: dependencies:
'@aws-sdk/core': 3.873.0 '@aws-sdk/core': 3.876.0
'@aws-sdk/types': 3.862.0 '@aws-sdk/types': 3.862.0
'@smithy/property-provider': 4.0.5 '@smithy/property-provider': 4.0.5
'@smithy/types': 4.3.2 '@smithy/types': 4.3.2
tslib: 2.8.1 tslib: 2.8.1
'@aws-sdk/credential-provider-http@3.873.0': '@aws-sdk/credential-provider-http@3.876.0':
dependencies: dependencies:
'@aws-sdk/core': 3.873.0 '@aws-sdk/core': 3.876.0
'@aws-sdk/types': 3.862.0 '@aws-sdk/types': 3.862.0
'@smithy/fetch-http-handler': 5.1.1 '@smithy/fetch-http-handler': 5.1.1
'@smithy/node-http-handler': 4.1.1 '@smithy/node-http-handler': 4.1.1
@@ -1874,15 +1875,15 @@ snapshots:
'@smithy/util-stream': 4.2.4 '@smithy/util-stream': 4.2.4
tslib: 2.8.1 tslib: 2.8.1
'@aws-sdk/credential-provider-ini@3.873.0': '@aws-sdk/credential-provider-ini@3.876.0':
dependencies: dependencies:
'@aws-sdk/core': 3.873.0 '@aws-sdk/core': 3.876.0
'@aws-sdk/credential-provider-env': 3.873.0 '@aws-sdk/credential-provider-env': 3.876.0
'@aws-sdk/credential-provider-http': 3.873.0 '@aws-sdk/credential-provider-http': 3.876.0
'@aws-sdk/credential-provider-process': 3.873.0 '@aws-sdk/credential-provider-process': 3.876.0
'@aws-sdk/credential-provider-sso': 3.873.0 '@aws-sdk/credential-provider-sso': 3.876.0
'@aws-sdk/credential-provider-web-identity': 3.873.0 '@aws-sdk/credential-provider-web-identity': 3.876.0
'@aws-sdk/nested-clients': 3.873.0 '@aws-sdk/nested-clients': 3.876.0
'@aws-sdk/types': 3.862.0 '@aws-sdk/types': 3.862.0
'@smithy/credential-provider-imds': 4.0.7 '@smithy/credential-provider-imds': 4.0.7
'@smithy/property-provider': 4.0.5 '@smithy/property-provider': 4.0.5
@@ -1892,14 +1893,14 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- aws-crt - aws-crt
'@aws-sdk/credential-provider-node@3.873.0': '@aws-sdk/credential-provider-node@3.876.0':
dependencies: dependencies:
'@aws-sdk/credential-provider-env': 3.873.0 '@aws-sdk/credential-provider-env': 3.876.0
'@aws-sdk/credential-provider-http': 3.873.0 '@aws-sdk/credential-provider-http': 3.876.0
'@aws-sdk/credential-provider-ini': 3.873.0 '@aws-sdk/credential-provider-ini': 3.876.0
'@aws-sdk/credential-provider-process': 3.873.0 '@aws-sdk/credential-provider-process': 3.876.0
'@aws-sdk/credential-provider-sso': 3.873.0 '@aws-sdk/credential-provider-sso': 3.876.0
'@aws-sdk/credential-provider-web-identity': 3.873.0 '@aws-sdk/credential-provider-web-identity': 3.876.0
'@aws-sdk/types': 3.862.0 '@aws-sdk/types': 3.862.0
'@smithy/credential-provider-imds': 4.0.7 '@smithy/credential-provider-imds': 4.0.7
'@smithy/property-provider': 4.0.5 '@smithy/property-provider': 4.0.5
@@ -1909,20 +1910,20 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- aws-crt - aws-crt
'@aws-sdk/credential-provider-process@3.873.0': '@aws-sdk/credential-provider-process@3.876.0':
dependencies: dependencies:
'@aws-sdk/core': 3.873.0 '@aws-sdk/core': 3.876.0
'@aws-sdk/types': 3.862.0 '@aws-sdk/types': 3.862.0
'@smithy/property-provider': 4.0.5 '@smithy/property-provider': 4.0.5
'@smithy/shared-ini-file-loader': 4.0.5 '@smithy/shared-ini-file-loader': 4.0.5
'@smithy/types': 4.3.2 '@smithy/types': 4.3.2
tslib: 2.8.1 tslib: 2.8.1
'@aws-sdk/credential-provider-sso@3.873.0': '@aws-sdk/credential-provider-sso@3.876.0':
dependencies: dependencies:
'@aws-sdk/client-sso': 3.873.0 '@aws-sdk/client-sso': 3.876.0
'@aws-sdk/core': 3.873.0 '@aws-sdk/core': 3.876.0
'@aws-sdk/token-providers': 3.873.0 '@aws-sdk/token-providers': 3.876.0
'@aws-sdk/types': 3.862.0 '@aws-sdk/types': 3.862.0
'@smithy/property-provider': 4.0.5 '@smithy/property-provider': 4.0.5
'@smithy/shared-ini-file-loader': 4.0.5 '@smithy/shared-ini-file-loader': 4.0.5
@@ -1931,10 +1932,10 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- aws-crt - aws-crt
'@aws-sdk/credential-provider-web-identity@3.873.0': '@aws-sdk/credential-provider-web-identity@3.876.0':
dependencies: dependencies:
'@aws-sdk/core': 3.873.0 '@aws-sdk/core': 3.876.0
'@aws-sdk/nested-clients': 3.873.0 '@aws-sdk/nested-clients': 3.876.0
'@aws-sdk/types': 3.862.0 '@aws-sdk/types': 3.862.0
'@smithy/property-provider': 4.0.5 '@smithy/property-provider': 4.0.5
'@smithy/types': 4.3.2 '@smithy/types': 4.3.2
@@ -1959,12 +1960,12 @@ snapshots:
'@smithy/types': 4.3.2 '@smithy/types': 4.3.2
tslib: 2.8.1 tslib: 2.8.1
'@aws-sdk/middleware-flexible-checksums@3.873.0': '@aws-sdk/middleware-flexible-checksums@3.876.0':
dependencies: dependencies:
'@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32': 5.2.0
'@aws-crypto/crc32c': 5.2.0 '@aws-crypto/crc32c': 5.2.0
'@aws-crypto/util': 5.2.0 '@aws-crypto/util': 5.2.0
'@aws-sdk/core': 3.873.0 '@aws-sdk/core': 3.876.0
'@aws-sdk/types': 3.862.0 '@aws-sdk/types': 3.862.0
'@smithy/is-array-buffer': 4.0.0 '@smithy/is-array-buffer': 4.0.0
'@smithy/node-config-provider': 4.1.4 '@smithy/node-config-provider': 4.1.4
@@ -1988,7 +1989,7 @@ snapshots:
'@smithy/types': 4.3.2 '@smithy/types': 4.3.2
tslib: 2.8.1 tslib: 2.8.1
'@aws-sdk/middleware-logger@3.873.0': '@aws-sdk/middleware-logger@3.876.0':
dependencies: dependencies:
'@aws-sdk/types': 3.862.0 '@aws-sdk/types': 3.862.0
'@smithy/types': 4.3.2 '@smithy/types': 4.3.2
@@ -2001,9 +2002,9 @@ snapshots:
'@smithy/types': 4.3.2 '@smithy/types': 4.3.2
tslib: 2.8.1 tslib: 2.8.1
'@aws-sdk/middleware-sdk-s3@3.873.0': '@aws-sdk/middleware-sdk-s3@3.876.0':
dependencies: dependencies:
'@aws-sdk/core': 3.873.0 '@aws-sdk/core': 3.876.0
'@aws-sdk/types': 3.862.0 '@aws-sdk/types': 3.862.0
'@aws-sdk/util-arn-parser': 3.873.0 '@aws-sdk/util-arn-parser': 3.873.0
'@smithy/core': 3.8.0 '@smithy/core': 3.8.0
@@ -2024,9 +2025,9 @@ snapshots:
'@smithy/types': 4.3.2 '@smithy/types': 4.3.2
tslib: 2.8.1 tslib: 2.8.1
'@aws-sdk/middleware-user-agent@3.873.0': '@aws-sdk/middleware-user-agent@3.876.0':
dependencies: dependencies:
'@aws-sdk/core': 3.873.0 '@aws-sdk/core': 3.876.0
'@aws-sdk/types': 3.862.0 '@aws-sdk/types': 3.862.0
'@aws-sdk/util-endpoints': 3.873.0 '@aws-sdk/util-endpoints': 3.873.0
'@smithy/core': 3.8.0 '@smithy/core': 3.8.0
@@ -2034,20 +2035,20 @@ snapshots:
'@smithy/types': 4.3.2 '@smithy/types': 4.3.2
tslib: 2.8.1 tslib: 2.8.1
'@aws-sdk/nested-clients@3.873.0': '@aws-sdk/nested-clients@3.876.0':
dependencies: dependencies:
'@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/sha256-js': 5.2.0
'@aws-sdk/core': 3.873.0 '@aws-sdk/core': 3.876.0
'@aws-sdk/middleware-host-header': 3.873.0 '@aws-sdk/middleware-host-header': 3.873.0
'@aws-sdk/middleware-logger': 3.873.0 '@aws-sdk/middleware-logger': 3.876.0
'@aws-sdk/middleware-recursion-detection': 3.873.0 '@aws-sdk/middleware-recursion-detection': 3.873.0
'@aws-sdk/middleware-user-agent': 3.873.0 '@aws-sdk/middleware-user-agent': 3.876.0
'@aws-sdk/region-config-resolver': 3.873.0 '@aws-sdk/region-config-resolver': 3.873.0
'@aws-sdk/types': 3.862.0 '@aws-sdk/types': 3.862.0
'@aws-sdk/util-endpoints': 3.873.0 '@aws-sdk/util-endpoints': 3.873.0
'@aws-sdk/util-user-agent-browser': 3.873.0 '@aws-sdk/util-user-agent-browser': 3.873.0
'@aws-sdk/util-user-agent-node': 3.873.0 '@aws-sdk/util-user-agent-node': 3.876.0
'@smithy/config-resolver': 4.1.5 '@smithy/config-resolver': 4.1.5
'@smithy/core': 3.8.0 '@smithy/core': 3.8.0
'@smithy/fetch-http-handler': 5.1.1 '@smithy/fetch-http-handler': 5.1.1
@@ -2086,9 +2087,9 @@ snapshots:
'@smithy/util-middleware': 4.0.5 '@smithy/util-middleware': 4.0.5
tslib: 2.8.1 tslib: 2.8.1
'@aws-sdk/s3-request-presigner@3.873.0': '@aws-sdk/s3-request-presigner@3.876.0':
dependencies: dependencies:
'@aws-sdk/signature-v4-multi-region': 3.873.0 '@aws-sdk/signature-v4-multi-region': 3.876.0
'@aws-sdk/types': 3.862.0 '@aws-sdk/types': 3.862.0
'@aws-sdk/util-format-url': 3.873.0 '@aws-sdk/util-format-url': 3.873.0
'@smithy/middleware-endpoint': 4.1.18 '@smithy/middleware-endpoint': 4.1.18
@@ -2097,19 +2098,19 @@ snapshots:
'@smithy/types': 4.3.2 '@smithy/types': 4.3.2
tslib: 2.8.1 tslib: 2.8.1
'@aws-sdk/signature-v4-multi-region@3.873.0': '@aws-sdk/signature-v4-multi-region@3.876.0':
dependencies: dependencies:
'@aws-sdk/middleware-sdk-s3': 3.873.0 '@aws-sdk/middleware-sdk-s3': 3.876.0
'@aws-sdk/types': 3.862.0 '@aws-sdk/types': 3.862.0
'@smithy/protocol-http': 5.1.3 '@smithy/protocol-http': 5.1.3
'@smithy/signature-v4': 5.1.3 '@smithy/signature-v4': 5.1.3
'@smithy/types': 4.3.2 '@smithy/types': 4.3.2
tslib: 2.8.1 tslib: 2.8.1
'@aws-sdk/token-providers@3.873.0': '@aws-sdk/token-providers@3.876.0':
dependencies: dependencies:
'@aws-sdk/core': 3.873.0 '@aws-sdk/core': 3.876.0
'@aws-sdk/nested-clients': 3.873.0 '@aws-sdk/nested-clients': 3.876.0
'@aws-sdk/types': 3.862.0 '@aws-sdk/types': 3.862.0
'@smithy/property-provider': 4.0.5 '@smithy/property-provider': 4.0.5
'@smithy/shared-ini-file-loader': 4.0.5 '@smithy/shared-ini-file-loader': 4.0.5
@@ -2150,12 +2151,12 @@ snapshots:
dependencies: dependencies:
'@aws-sdk/types': 3.862.0 '@aws-sdk/types': 3.862.0
'@smithy/types': 4.3.2 '@smithy/types': 4.3.2
bowser: 2.12.0 bowser: 2.12.1
tslib: 2.8.1 tslib: 2.8.1
'@aws-sdk/util-user-agent-node@3.873.0': '@aws-sdk/util-user-agent-node@3.876.0':
dependencies: dependencies:
'@aws-sdk/middleware-user-agent': 3.873.0 '@aws-sdk/middleware-user-agent': 3.876.0
'@aws-sdk/types': 3.862.0 '@aws-sdk/types': 3.862.0
'@smithy/node-config-provider': 4.1.4 '@smithy/node-config-provider': 4.1.4
'@smithy/types': 4.3.2 '@smithy/types': 4.3.2
@@ -2176,28 +2177,28 @@ snapshots:
dependencies: dependencies:
mime: 3.0.0 mime: 3.0.0
'@cloudflare/unenv-preset@2.6.2(unenv@2.0.0-rc.19)(workerd@1.20250816.0)': '@cloudflare/unenv-preset@2.6.3(unenv@2.0.0-rc.19)(workerd@1.20250823.0)':
dependencies: dependencies:
unenv: 2.0.0-rc.19 unenv: 2.0.0-rc.19
optionalDependencies: optionalDependencies:
workerd: 1.20250816.0 workerd: 1.20250823.0
'@cloudflare/workerd-darwin-64@1.20250816.0': '@cloudflare/workerd-darwin-64@1.20250823.0':
optional: true optional: true
'@cloudflare/workerd-darwin-arm64@1.20250816.0': '@cloudflare/workerd-darwin-arm64@1.20250823.0':
optional: true optional: true
'@cloudflare/workerd-linux-64@1.20250816.0': '@cloudflare/workerd-linux-64@1.20250823.0':
optional: true optional: true
'@cloudflare/workerd-linux-arm64@1.20250816.0': '@cloudflare/workerd-linux-arm64@1.20250823.0':
optional: true optional: true
'@cloudflare/workerd-windows-64@1.20250816.0': '@cloudflare/workerd-windows-64@1.20250823.0':
optional: true optional: true
'@cloudflare/workers-types@4.20250822.0': {} '@cloudflare/workers-types@4.20250826.0': {}
'@cspotcode/source-map-support@0.8.1': '@cspotcode/source-map-support@0.8.1':
dependencies: dependencies:
@@ -2797,7 +2798,7 @@ snapshots:
'@smithy/property-provider': 4.0.5 '@smithy/property-provider': 4.0.5
'@smithy/smithy-client': 4.4.10 '@smithy/smithy-client': 4.4.10
'@smithy/types': 4.3.2 '@smithy/types': 4.3.2
bowser: 2.12.0 bowser: 2.12.1
tslib: 2.8.1 tslib: 2.8.1
'@smithy/util-defaults-mode-node@4.0.26': '@smithy/util-defaults-mode-node@4.0.26':
@@ -2870,20 +2871,20 @@ snapshots:
'@types/json-schema@7.0.15': {} '@types/json-schema@7.0.15': {}
'@types/node@22.17.2': '@types/node@22.18.0':
dependencies: dependencies:
undici-types: 6.21.0 undici-types: 6.21.0
'@types/uuid@9.0.8': {} '@types/uuid@9.0.8': {}
'@typescript-eslint/eslint-plugin@8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.18.0)(typescript@5.4.5))(eslint@9.18.0)(typescript@5.4.5)': '@typescript-eslint/eslint-plugin@8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.18.0)(typescript@5.4.5))(eslint@9.18.0)(typescript@5.4.5)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.12.1 '@eslint-community/regexpp': 4.12.1
'@typescript-eslint/parser': 8.40.0(eslint@9.18.0)(typescript@5.4.5) '@typescript-eslint/parser': 8.41.0(eslint@9.18.0)(typescript@5.4.5)
'@typescript-eslint/scope-manager': 8.40.0 '@typescript-eslint/scope-manager': 8.41.0
'@typescript-eslint/type-utils': 8.40.0(eslint@9.18.0)(typescript@5.4.5) '@typescript-eslint/type-utils': 8.41.0(eslint@9.18.0)(typescript@5.4.5)
'@typescript-eslint/utils': 8.40.0(eslint@9.18.0)(typescript@5.4.5) '@typescript-eslint/utils': 8.41.0(eslint@9.18.0)(typescript@5.4.5)
'@typescript-eslint/visitor-keys': 8.40.0 '@typescript-eslint/visitor-keys': 8.41.0
eslint: 9.18.0 eslint: 9.18.0
graphemer: 1.4.0 graphemer: 1.4.0
ignore: 7.0.5 ignore: 7.0.5
@@ -2893,41 +2894,41 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/parser@8.40.0(eslint@9.18.0)(typescript@5.4.5)': '@typescript-eslint/parser@8.41.0(eslint@9.18.0)(typescript@5.4.5)':
dependencies: dependencies:
'@typescript-eslint/scope-manager': 8.40.0 '@typescript-eslint/scope-manager': 8.41.0
'@typescript-eslint/types': 8.40.0 '@typescript-eslint/types': 8.41.0
'@typescript-eslint/typescript-estree': 8.40.0(typescript@5.4.5) '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.4.5)
'@typescript-eslint/visitor-keys': 8.40.0 '@typescript-eslint/visitor-keys': 8.41.0
debug: 4.4.1 debug: 4.4.1
eslint: 9.18.0 eslint: 9.18.0
typescript: 5.4.5 typescript: 5.4.5
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/project-service@8.40.0(typescript@5.4.5)': '@typescript-eslint/project-service@8.41.0(typescript@5.4.5)':
dependencies: dependencies:
'@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.4.5) '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.4.5)
'@typescript-eslint/types': 8.40.0 '@typescript-eslint/types': 8.41.0
debug: 4.4.1 debug: 4.4.1
typescript: 5.4.5 typescript: 5.4.5
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/scope-manager@8.40.0': '@typescript-eslint/scope-manager@8.41.0':
dependencies: dependencies:
'@typescript-eslint/types': 8.40.0 '@typescript-eslint/types': 8.41.0
'@typescript-eslint/visitor-keys': 8.40.0 '@typescript-eslint/visitor-keys': 8.41.0
'@typescript-eslint/tsconfig-utils@8.40.0(typescript@5.4.5)': '@typescript-eslint/tsconfig-utils@8.41.0(typescript@5.4.5)':
dependencies: dependencies:
typescript: 5.4.5 typescript: 5.4.5
'@typescript-eslint/type-utils@8.40.0(eslint@9.18.0)(typescript@5.4.5)': '@typescript-eslint/type-utils@8.41.0(eslint@9.18.0)(typescript@5.4.5)':
dependencies: dependencies:
'@typescript-eslint/types': 8.40.0 '@typescript-eslint/types': 8.41.0
'@typescript-eslint/typescript-estree': 8.40.0(typescript@5.4.5) '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.4.5)
'@typescript-eslint/utils': 8.40.0(eslint@9.18.0)(typescript@5.4.5) '@typescript-eslint/utils': 8.41.0(eslint@9.18.0)(typescript@5.4.5)
debug: 4.4.1 debug: 4.4.1
eslint: 9.18.0 eslint: 9.18.0
ts-api-utils: 2.1.0(typescript@5.4.5) ts-api-utils: 2.1.0(typescript@5.4.5)
@@ -2935,14 +2936,14 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/types@8.40.0': {} '@typescript-eslint/types@8.41.0': {}
'@typescript-eslint/typescript-estree@8.40.0(typescript@5.4.5)': '@typescript-eslint/typescript-estree@8.41.0(typescript@5.4.5)':
dependencies: dependencies:
'@typescript-eslint/project-service': 8.40.0(typescript@5.4.5) '@typescript-eslint/project-service': 8.41.0(typescript@5.4.5)
'@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.4.5) '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.4.5)
'@typescript-eslint/types': 8.40.0 '@typescript-eslint/types': 8.41.0
'@typescript-eslint/visitor-keys': 8.40.0 '@typescript-eslint/visitor-keys': 8.41.0
debug: 4.4.1 debug: 4.4.1
fast-glob: 3.3.3 fast-glob: 3.3.3
is-glob: 4.0.3 is-glob: 4.0.3
@@ -2953,20 +2954,20 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/utils@8.40.0(eslint@9.18.0)(typescript@5.4.5)': '@typescript-eslint/utils@8.41.0(eslint@9.18.0)(typescript@5.4.5)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.7.0(eslint@9.18.0) '@eslint-community/eslint-utils': 4.7.0(eslint@9.18.0)
'@typescript-eslint/scope-manager': 8.40.0 '@typescript-eslint/scope-manager': 8.41.0
'@typescript-eslint/types': 8.40.0 '@typescript-eslint/types': 8.41.0
'@typescript-eslint/typescript-estree': 8.40.0(typescript@5.4.5) '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.4.5)
eslint: 9.18.0 eslint: 9.18.0
typescript: 5.4.5 typescript: 5.4.5
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/visitor-keys@8.40.0': '@typescript-eslint/visitor-keys@8.41.0':
dependencies: dependencies:
'@typescript-eslint/types': 8.40.0 '@typescript-eslint/types': 8.41.0
eslint-visitor-keys: 4.2.1 eslint-visitor-keys: 4.2.1
abort-controller@3.0.0: abort-controller@3.0.0:
@@ -3006,7 +3007,7 @@ snapshots:
blake3-wasm@2.1.5: {} blake3-wasm@2.1.5: {}
bowser@2.12.0: {} bowser@2.12.1: {}
brace-expansion@1.1.12: brace-expansion@1.1.12:
dependencies: dependencies:
@@ -3379,7 +3380,7 @@ snapshots:
js-base64: 3.7.8 js-base64: 3.7.8
mime-types: 2.1.35 mime-types: 2.1.35
miniflare@4.20250816.1: miniflare@4.20250823.0:
dependencies: dependencies:
'@cspotcode/source-map-support': 0.8.1 '@cspotcode/source-map-support': 0.8.1
acorn: 8.14.0 acorn: 8.14.0
@@ -3388,8 +3389,8 @@ snapshots:
glob-to-regexp: 0.4.1 glob-to-regexp: 0.4.1
sharp: 0.33.5 sharp: 0.33.5
stoppable: 1.1.0 stoppable: 1.1.0
undici: 7.14.0 undici: 7.15.0
workerd: 1.20250816.0 workerd: 1.20250823.0
ws: 8.18.0 ws: 8.18.0
youch: 4.1.0-beta.10 youch: 4.1.0-beta.10
zod: 3.22.3 zod: 3.22.3
@@ -3596,12 +3597,12 @@ snapshots:
dependencies: dependencies:
prelude-ls: 1.2.1 prelude-ls: 1.2.1
typescript-eslint@8.40.0(eslint@9.18.0)(typescript@5.4.5): typescript-eslint@8.41.0(eslint@9.18.0)(typescript@5.4.5):
dependencies: dependencies:
'@typescript-eslint/eslint-plugin': 8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.18.0)(typescript@5.4.5))(eslint@9.18.0)(typescript@5.4.5) '@typescript-eslint/eslint-plugin': 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.18.0)(typescript@5.4.5))(eslint@9.18.0)(typescript@5.4.5)
'@typescript-eslint/parser': 8.40.0(eslint@9.18.0)(typescript@5.4.5) '@typescript-eslint/parser': 8.41.0(eslint@9.18.0)(typescript@5.4.5)
'@typescript-eslint/typescript-estree': 8.40.0(typescript@5.4.5) '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.4.5)
'@typescript-eslint/utils': 8.40.0(eslint@9.18.0)(typescript@5.4.5) '@typescript-eslint/utils': 8.41.0(eslint@9.18.0)(typescript@5.4.5)
eslint: 9.18.0 eslint: 9.18.0
typescript: 5.4.5 typescript: 5.4.5
transitivePeerDependencies: transitivePeerDependencies:
@@ -3613,7 +3614,7 @@ snapshots:
undici-types@6.21.0: {} undici-types@6.21.0: {}
undici@7.14.0: {} undici@7.15.0: {}
unenv@2.0.0-rc.19: unenv@2.0.0-rc.19:
dependencies: dependencies:
@@ -3644,26 +3645,26 @@ snapshots:
worker-mailer@1.1.5: {} worker-mailer@1.1.5: {}
workerd@1.20250816.0: workerd@1.20250823.0:
optionalDependencies: optionalDependencies:
'@cloudflare/workerd-darwin-64': 1.20250816.0 '@cloudflare/workerd-darwin-64': 1.20250823.0
'@cloudflare/workerd-darwin-arm64': 1.20250816.0 '@cloudflare/workerd-darwin-arm64': 1.20250823.0
'@cloudflare/workerd-linux-64': 1.20250816.0 '@cloudflare/workerd-linux-64': 1.20250823.0
'@cloudflare/workerd-linux-arm64': 1.20250816.0 '@cloudflare/workerd-linux-arm64': 1.20250823.0
'@cloudflare/workerd-windows-64': 1.20250816.0 '@cloudflare/workerd-windows-64': 1.20250823.0
wrangler@4.32.0(@cloudflare/workers-types@4.20250822.0): wrangler@4.33.0(@cloudflare/workers-types@4.20250826.0):
dependencies: dependencies:
'@cloudflare/kv-asset-handler': 0.4.0 '@cloudflare/kv-asset-handler': 0.4.0
'@cloudflare/unenv-preset': 2.6.2(unenv@2.0.0-rc.19)(workerd@1.20250816.0) '@cloudflare/unenv-preset': 2.6.3(unenv@2.0.0-rc.19)(workerd@1.20250823.0)
blake3-wasm: 2.1.5 blake3-wasm: 2.1.5
esbuild: 0.25.4 esbuild: 0.25.4
miniflare: 4.20250816.1 miniflare: 4.20250823.0
path-to-regexp: 6.3.0 path-to-regexp: 6.3.0
unenv: 2.0.0-rc.19 unenv: 2.0.0-rc.19
workerd: 1.20250816.0 workerd: 1.20250823.0
optionalDependencies: optionalDependencies:
'@cloudflare/workers-types': 4.20250822.0 '@cloudflare/workers-types': 4.20250826.0
fsevents: 2.3.3 fsevents: 2.3.3
transitivePeerDependencies: transitivePeerDependencies:
- bufferutil - bufferutil
+2
View File
@@ -14,6 +14,7 @@ api.get('/open_api/settings', async (c) => {
const auth = c.req.raw.headers.get("x-custom-auth"); const auth = c.req.raw.headers.get("x-custom-auth");
needAuth = !auth || !passwords.includes(auth); needAuth = !auth || !passwords.includes(auth);
} }
return c.json({ return c.json({
"title": c.env.TITLE, "title": c.env.TITLE,
"announcement": utils.getStringValue(c.env.ANNOUNCEMENT), "announcement": utils.getStringValue(c.env.ANNOUNCEMENT),
@@ -29,6 +30,7 @@ api.get('/open_api/settings', async (c) => {
"adminContact": c.env.ADMIN_CONTACT, "adminContact": c.env.ADMIN_CONTACT,
"enableUserCreateEmail": utils.getBooleanValue(c.env.ENABLE_USER_CREATE_EMAIL), "enableUserCreateEmail": utils.getBooleanValue(c.env.ENABLE_USER_CREATE_EMAIL),
"disableAnonymousUserCreateEmail": utils.getBooleanValue(c.env.DISABLE_ANONYMOUS_USER_CREATE_EMAIL), "disableAnonymousUserCreateEmail": utils.getBooleanValue(c.env.DISABLE_ANONYMOUS_USER_CREATE_EMAIL),
"disableCustomAddressName": utils.getBooleanValue(c.env.DISABLE_CUSTOM_ADDRESS_NAME),
"enableUserDeleteEmail": utils.getBooleanValue(c.env.ENABLE_USER_DELETE_EMAIL), "enableUserDeleteEmail": utils.getBooleanValue(c.env.ENABLE_USER_DELETE_EMAIL),
"enableAutoReply": utils.getBooleanValue(c.env.ENABLE_AUTO_REPLY), "enableAutoReply": utils.getBooleanValue(c.env.ENABLE_AUTO_REPLY),
"enableIndexAbout": utils.getBooleanValue(c.env.ENABLE_INDEX_ABOUT), "enableIndexAbout": utils.getBooleanValue(c.env.ENABLE_INDEX_ABOUT),
+36 -6
View File
@@ -8,6 +8,31 @@ import { AdminWebhookSettings, WebhookMail, WebhookSettings } from './models';
const DEFAULT_NAME_REGEX = /[^a-z0-9]/g; const DEFAULT_NAME_REGEX = /[^a-z0-9]/g;
export const generateRandomName = (c: Context<HonoCustomType>): string => {
// name min length min 1
const minLength = Math.max(
getIntValue(c.env.MIN_ADDRESS_LEN, 1),
1
);
// name max length min 1
const maxLength = Math.max(
getIntValue(c.env.MAX_ADDRESS_LEN, 30),
1
);
// Build full name recursively until minimum length is reached
const buildName = (currentName: string = ""): string => {
return currentName.length >= minLength
? currentName
: buildName(currentName + Math.random().toString(36).substring(2, 15));
};
const fullName = buildName();
// Return truncated to max length
return fullName.substring(0, Math.min(fullName.length, maxLength));
};
const checkNameRegex = (c: Context<HonoCustomType>, name: string) => { const checkNameRegex = (c: Context<HonoCustomType>, name: string) => {
let error = null; let error = null;
try { try {
@@ -76,8 +101,8 @@ export const newAddress = async (
enableCheckNameRegex?: boolean, enableCheckNameRegex?: boolean,
} }
): Promise<{ address: string, jwt: string }> => { ): Promise<{ address: string, jwt: string }> => {
// remove special characters // trim whitespace and remove special characters
name = name.replace(getNameRegex(c), '') name = name.trim().replace(getNameRegex(c), '')
// check name // check name
if (enableCheckNameRegex) { if (enableCheckNameRegex) {
await checkNameBlockList(c, name); await checkNameBlockList(c, name);
@@ -102,15 +127,20 @@ export const newAddress = async (
} }
// create address with prefix // create address with prefix
if (typeof addressPrefix === "string") { if (typeof addressPrefix === "string") {
name = addressPrefix + name; name = addressPrefix.trim() + name;
} else if (enablePrefix) { } else if (enablePrefix) {
name = getStringValue(c.env.PREFIX) + name; name = getStringValue(c.env.PREFIX).trim() + name;
} }
// check domain // check domain
const allowDomains = checkAllowDomains ? await getAllowDomains(c) : getDomains(c); const allowDomains = checkAllowDomains ? await getAllowDomains(c) : getDomains(c);
// if domain is not set, use the random domain // if domain is not set, select domain based on environment configuration
if (!domain && allowDomains.length > 0) { if (!domain && allowDomains.length > 0) {
domain = allowDomains[Math.floor(Math.random() * allowDomains.length)]; const createAddressDefaultDomainFirst = getBooleanValue(c.env.CREATE_ADDRESS_DEFAULT_DOMAIN_FIRST);
if (createAddressDefaultDomainFirst) {
domain = allowDomains[0];
} else {
domain = allowDomains[Math.floor(Math.random() * allowDomains.length)];
}
} }
// check domain is valid // check domain is valid
if (!domain || !allowDomains.includes(domain)) { if (!domain || !allowDomains.includes(domain)) {
+1 -1
View File
@@ -1,5 +1,5 @@
export const CONSTANTS = { export const CONSTANTS = {
VERSION: 'v' + '1.0.4', VERSION: 'v' + '1.0.5',
// DB Version // DB Version
DB_VERSION_KEY: 'db_version', DB_VERSION_KEY: 'db_version',
+8 -4
View File
@@ -2,7 +2,7 @@ import { Context, Hono } from 'hono'
import i18n from '../i18n'; import i18n from '../i18n';
import { getBooleanValue, getJsonSetting, checkCfTurnstile, getStringValue, getSplitStringListValue } from '../utils'; import { getBooleanValue, getJsonSetting, checkCfTurnstile, getStringValue, getSplitStringListValue } from '../utils';
import { newAddress, handleListQuery, deleteAddressWithData, getAddressPrefix, getAllowDomains, updateAddressUpdatedAt } from '../common' import { newAddress, handleListQuery, deleteAddressWithData, getAddressPrefix, getAllowDomains, updateAddressUpdatedAt, generateRandomName } from '../common'
import { CONSTANTS } from '../constants' import { CONSTANTS } from '../constants'
import auto_reply from './auto_reply' import auto_reply from './auto_reply'
import webhook_settings from './webhook_settings'; import webhook_settings from './webhook_settings';
@@ -123,9 +123,13 @@ api.post('/api/new_address', async (c) => {
} catch (error) { } catch (error) {
return c.text(msgs.TurnstileCheckFailedMsg, 500) return c.text(msgs.TurnstileCheckFailedMsg, 500)
} }
// if no name, generate random name // Check if custom email names are disabled from environment variable
if (!name) { const disableCustomAddressName = getBooleanValue(c.env.DISABLE_CUSTOM_ADDRESS_NAME);
name = Math.random().toString(36).substring(2, 15);
// if no name or custom names are disabled, generate random name
if (!name || disableCustomAddressName) {
// Generate random name with context-based length configuration
name = generateRandomName(c);
} }
// check name block list // check name block list
try { try {
+15 -8
View File
@@ -1,8 +1,8 @@
import { Context } from "hono"; import { Context } from "hono";
import { Jwt } from "hono/utils/jwt"; import { Jwt } from "hono/utils/jwt";
import { CONSTANTS } from "../constants"; import { CONSTANTS } from "../constants";
import { getIntValue, getJsonSetting } from "../utils"; import { getBooleanValue, getIntValue, getJsonSetting } from "../utils";
import { deleteAddressWithData, newAddress } from "../common"; import { deleteAddressWithData, newAddress, generateRandomName } from "../common";
export const tgUserNewAddress = async ( export const tgUserNewAddress = async (
c: Context<HonoCustomType>, userId: string, address: string c: Context<HonoCustomType>, userId: string, address: string
@@ -15,21 +15,28 @@ export const tgUserNewAddress = async (
throw Error("Rate limit exceeded") throw Error("Rate limit exceeded")
} }
} }
// @ts-ignore // Check if custom address names are disabled
address = address || Math.random().toString(36).substring(2, 15); const disableCustomAddressName = getBooleanValue(c.env.DISABLE_CUSTOM_ADDRESS_NAME);
const [name, domain] = address.includes("@") ? address.split("@") : [address, null];
// Parse address parameter - handle empty or whitespace-only address
const trimmedAddress = address ? address.trim() : "";
const [name, domain] = trimmedAddress.includes("@") ? trimmedAddress.split("@") : [trimmedAddress, null];
const jwtList = await c.env.KV.get<string[]>(`${CONSTANTS.TG_KV_PREFIX}:${userId}`, 'json') || []; const jwtList = await c.env.KV.get<string[]>(`${CONSTANTS.TG_KV_PREFIX}:${userId}`, 'json') || [];
if (jwtList.length >= getIntValue(c.env.TG_MAX_ADDRESS, 5)) { if (jwtList.length >= getIntValue(c.env.TG_MAX_ADDRESS, 5)) {
throw Error("绑定地址数量已达上限"); throw Error("绑定地址数量已达上限");
} }
// Generate name if disabled or not provided
const finalName = (!name || disableCustomAddressName) ? generateRandomName(c) : name;
// check name block list // check name block list
const value = await getJsonSetting(c, CONSTANTS.ADDRESS_BLOCK_LIST_KEY); const value = await getJsonSetting(c, CONSTANTS.ADDRESS_BLOCK_LIST_KEY);
const blockList = (value || []) as string[]; const blockList = (value || []) as string[];
if (blockList.some((item) => name.includes(item))) { if (blockList.some((item) => finalName.includes(item))) {
throw Error(`Name[${name}]is blocked`); throw Error(`Name[${finalName}]is blocked`);
} }
const res = await newAddress(c, { const res = await newAddress(c, {
name: name || Math.random().toString(36).substring(2, 15), name: finalName,
domain, domain,
enablePrefix: true enablePrefix: true
}); });
+1 -1
View File
@@ -18,7 +18,7 @@ const COMMANDS = [
}, },
{ {
command: "new", command: "new",
description: "新建邮箱地址, 如果要自定义邮箱地址, 请输入 /new <name>@<domain>, name [a-z0-9] 有效" description: "新建邮箱地址, 如果要自定义邮箱地址, 请输入 /new, 通过 /new <name>@<domain> 可以指定, name [a-z0-9] 有效, name 为空则随机生成, @<domain> 可选"
}, },
{ {
command: "address", command: "address",
+2
View File
@@ -24,6 +24,8 @@ type Bindings = {
MAX_ADDRESS_LEN: string | number | undefined MAX_ADDRESS_LEN: string | number | undefined
DEFAULT_DOMAINS: string | string[] | undefined DEFAULT_DOMAINS: string | string[] | undefined
DOMAINS: string | string[] | undefined DOMAINS: string | string[] | undefined
DISABLE_CUSTOM_ADDRESS_NAME: string | boolean | undefined
CREATE_ADDRESS_DEFAULT_DOMAIN_FIRST: string | boolean | undefined
ADMIN_USER_ROLE: string | undefined ADMIN_USER_ROLE: string | undefined
USER_DEFAULT_ROLE: string | UserRole | undefined USER_DEFAULT_ROLE: string | UserRole | undefined
USER_ROLES: string | UserRole[] | undefined USER_ROLES: string | UserRole[] | undefined
+4
View File
@@ -35,6 +35,8 @@ PREFIX = "tmp"
# (min, max) length of the adderss, if not set, the default is (1, 30) # (min, max) length of the adderss, if not set, the default is (1, 30)
# MIN_ADDRESS_LEN = 1 # MIN_ADDRESS_LEN = 1
# MAX_ADDRESS_LEN = 30 # MAX_ADDRESS_LEN = 30
# Disable custom email address name, if set true, users cannot input custom email name, will auto generate
# DISABLE_CUSTOM_ADDRESS_NAME = true
# IF YOU WANT TO MAKE YOUR SITE PRIVATE, UNCOMMENT THE FOLLOWING LINES # IF YOU WANT TO MAKE YOUR SITE PRIVATE, UNCOMMENT THE FOLLOWING LINES
# PASSWORDS = ["123", "456"] # PASSWORDS = ["123", "456"]
# For admin panel # For admin panel
@@ -43,6 +45,8 @@ PREFIX = "tmp"
# DISABLE_ADMIN_PASSWORD_CHECK = false # DISABLE_ADMIN_PASSWORD_CHECK = false
# ADMIN CONTACT, CAN BE ANY STRING # ADMIN CONTACT, CAN BE ANY STRING
# ADMIN_CONTACT = "xx@xx.xxx" # ADMIN_CONTACT = "xx@xx.xxx"
# Create new address with default domain first, if set true, will use first domain from DEFAULT_DOMAINS when no domain specified
# CREATE_ADDRESS_DEFAULT_DOMAIN_FIRST = false
DEFAULT_DOMAINS = ["xxx.xxx1" , "xxx.xxx2"] # domain name for no role users DEFAULT_DOMAINS = ["xxx.xxx1" , "xxx.xxx2"] # domain name for no role users
DOMAINS = ["xxx.xxx1" , "xxx.xxx2"] # all domain names DOMAINS = ["xxx.xxx1" , "xxx.xxx2"] # all domain names
# For chinese domain name, you can use DOMAIN_LABELS to show chinese domain name # For chinese domain name, you can use DOMAIN_LABELS to show chinese domain name