diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..40ccf5d --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,46 @@ +# hotsrm 持续集成:元数据校验、lint、类型检查、翻译覆盖、启动测试,以及体系文件检查。 +# 元数据错误在运行时是静默的,这里把 AGENTS.md §6 的验证项变成合入前必过的门槛。 + +name: CI + +on: + push: + branches: [main] + pull_request: + +permissions: + contents: read + +jobs: + metadata: + name: Metadata + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@v7 + # pnpm 要在 setup-node 之前装好,`cache: pnpm` 需要它;版本取 package.json 的 packageManager。 + - uses: pnpm/action-setup@v6 + - uses: actions/setup-node@v7 + with: + node-version: '22' + cache: pnpm + - run: pnpm install --frozen-lockfile + - run: pnpm validate + - run: pnpm lint + - run: pnpm typecheck + - run: pnpm i18n:check + - run: pnpm test + - run: pnpm build + + governance: + name: Governance templates + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - uses: actions/checkout@v7 + - uses: actions/setup-python@v6 + with: + python-version: '3.12' + - run: pip install pyyaml + - run: python3 governance/scripts/build.py --check + - run: python3 governance/scripts/build.py --check --packs bulk,hazmat,soe diff --git a/.gitignore b/.gitignore index 3ac2b6f..acae373 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,10 @@ # 生成物 build/ __pycache__/ +# ObjectStack +node_modules/ +dist/ +.objectstack/ +*.log +.env +.env.* diff --git a/AGENTS.md b/AGENTS.md index b46388e..6e1e581 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -78,4 +78,5 @@ hotsrm 是基于 [ObjectStack](https://github.com/objectstack-ai/objectstack) - 体系文件:`python3 governance/scripts/build.py --check` 与 `python3 governance/scripts/build.py --check --packs bulk,hazmat,soe` 都通过;改了模板的, 生成 Word 打开检查版式。 -- 元数据(有代码之后):校验、类型检查、lint、构建、测试全部通过;每种扩展包组合都能构建。 +- 元数据:`pnpm validate`、`pnpm lint`、`pnpm typecheck`、`pnpm i18n:check`、`pnpm test`、 + `pnpm build` 全部通过(CI 同样跑这些);有扩展包之后,每种扩展包组合都能构建。 diff --git a/README.md b/README.md index 73cddb2..e9986c9 100644 --- a/README.md +++ b/README.md @@ -61,21 +61,32 @@ hotsrm/ │ └── adr/ 决策记录 ├── governance/ 体系文件模板与生成脚本 ├── params/ 参数定义与示例默认值(制度与系统共用) -├── src/ 〔待建〕 +├── src/ │ ├── core/ 核心(type: app) -│ ├── bulk/ hazmat/ soe/ 三个扩展包(type: module) -│ └── bridges/ 扩展包之间的联动(type: module) -├── test/ 门户隔离、封标、组合构建、flow 测试 〔待建〕 -├── objectstack.composition.ts 按开关选出要组合的模块 〔待建〕 -├── objectstack.config.ts 合成一个发布制品 〔待建〕 -└── objectstack.manifest.json 标准版的应用标识 〔待建〕 +│ ├── bulk/ hazmat/ soe/ 三个扩展包(type: module) 〔待建〕 +│ └── bridges/ 扩展包之间的联动(type: module) 〔待建〕 +├── test/ 启动测试;门户隔离、封标、组合构建、flow 测试随功能补齐 +├── objectstack.composition.ts 按开关选出要组合的模块 +├── objectstack.config.ts 合成一个发布制品 +└── objectstack.manifest.json 标准版的应用标识(市场展示信息) ``` -## 当前状态 +## 本地开发 + +需要 Node 22 和 pnpm 10。 + +```bash +pnpm install +pnpm dev # 本地启动(内存库) +pnpm validate # 每次改元数据后跑;其余检查见 AGENTS.md §6 +``` + +定时 flow(证书到期扫描)受部署开关 `OS_AUTOMATION_SCHEDULED_WORK_ENABLED` 控制,平台默认关闭,本地和 +托管云都要显式打开才会运行;托管云上如何为本应用打开,待与平台确认。 -设计阶段:核心设计、三个扩展包设计、第一批决策记录、参数文件首版、体系文件生成脚本和 -第一份模板(QP-01)已完成。文档目录见 -[docs/README.md](./docs/README.md);参与开发前先读 [AGENTS.md](./AGENTS.md)。 +## 当前状态 -下一步:补齐第一批体系文件模板,然后按[核心设计第一期](./docs/design/07-delivery-plan.md) -实现应用包。 +v0.1 开发中:工程骨架、CI 和核心应用外壳(`srm_workbench` 工作台、采购品类)已就位。 +建议的 v0.1 范围是内部工作台上的供应商主数据、准入审批和资质到期预警,门户、寻源和 ERP 集成 +放在后续版本。设计文档目录见 [docs/README.md](./docs/README.md);参与开发前先读 +[AGENTS.md](./AGENTS.md)。 diff --git a/docs/design/02-domain-model.md b/docs/design/02-domain-model.md index d097991..263253e 100644 --- a/docs/design/02-domain-model.md +++ b/docs/design/02-domain-model.md @@ -202,7 +202,7 @@ erDiagram | 字段 | 类型 | 说明 | |---|---|---| | `name` | text | 必填 | -| `contact_role` | multiselect | `admin` 主账号 / `sales` 商务 / `logistics` 物流 / `quality` 质量 / `finance` 财务 | +| `contact_function` | multiselect | `admin` 主账号 / `sales` 商务 / `logistics` 物流 / `quality` 质量 / `finance` 财务 | | `mobile` / `email` | phone / email | email 必填(门户邀请与通知用) | | `portal_user` | user | 已开通门户账号时关联的平台用户;该用户同时被任命到供应商的门户岗位(见 [04 §3](./04-security-and-portal.md#3-供应商门户的数据隔离)) | | `is_primary` | boolean | 默认 false;每家供应商至多一位主联系人(校验规则) | @@ -276,6 +276,11 @@ erDiagram | `reject_reason` | textarea | | | `cycle_days` | number | 从提交到批准的天数,批准时由 flow 写入(准入周期指标) | +> v0.1(内部代录,见 [07 §1.1](./07-delivery-plan.md#11-第一期的拆分))先实现一个子集:申请由内部人员为已登记的 +> 潜在或淘汰供应商发起,直接关联 `supplier`;申请品类用多值 lookup `applied_categories`(不经匿名表单, +> 可以读品类对象);不含现场审核分支和公司资料等表单字段;`approval_status` 记录审批节点的结论。 +> 公开表单与门户随 v0.2 加入时再补齐本表其余字段。 + **`srm_supplier_audit` 供应商审核**(OWD `private`):`audit_no`、`supplier` (lookup)、`application`(lookup,可空)、`audit_type`(`admission` 准入 / `annual` 年度 / `special` 专项)、`audit_date`、`auditors`(user,多选)、`checklist_score` diff --git a/docs/design/03-processes-and-automation.md b/docs/design/03-processes-and-automation.md index e2987e2..576936d 100644 --- a/docs/design/03-processes-and-automation.md +++ b/docs/design/03-processes-and-automation.md @@ -299,6 +299,11 @@ stateDiagram-v2 | 资质恢复 | 证书写入后的记录触发 | 重新计算:每一种必备资质类型都有 `status == 'valid'` 且 `verified == true` 的证书时,`qualification_alert = false`(四期起关闭对应风险事件)。只上传新证书而未经 SQE 核验,不会解除异常 | | 外部风险 | `schedule`:每周一 04:00(四期) | flow 按批 `loop` 合格供应商,`http` 节点调用企业信息服务;新出现的经营异常、失信、重大诉讼、股权变更按 `external_ref` 去重后建风险事件,`high` 级通知品类经理(FR-903) | +> v0.1 先实现其中的一部分:`srm_certificate_expire_sweep` 每日一次,把证书状态对齐到已过期 / 即将到期(30 天内)/ +> 有效(有效期被延长时恢复);`srm_supplier_qualification_recalc` 在证书状态或「必备」标志变化后重算 +> `qualification_alert`。到期提醒通知、`is_mandatory` 按品类必备资质自动写入、「经 SQE 核验才解除」随门户版本 +> (v0.2)加入;v0.1 由内部人员维护证书与「必备」标志。 + ## 12. 审批矩阵 审批人一律按**岗位**或**记录上的人员字段**解析,不写死具体的人;换人只改岗位任命, diff --git a/docs/design/07-delivery-plan.md b/docs/design/07-delivery-plan.md index 1fcbbb6..043f64b 100644 --- a/docs/design/07-delivery-plan.md +++ b/docs/design/07-delivery-plan.md @@ -32,6 +32,17 @@ gantt 第一期试运行(2 个品类) :after p1, 4w ``` +### 1.1 第一期的拆分 + +第一期按可独立验收的小版本推进,每个版本一个次版本号。按 2026-10-23 的产品决定(面向已有 ERP 的大型企业,只做基础核心包,暂不集成 ERP),v0.3 完成即为当前第一期的终点: + +| 版本 | 范围 | 随版本落地的红线测试 | +|---|---|---| +| v0.1 | 内部工作台:品类、工厂、供应商及联系人 / 证书 / 供货品类资格、准入申请与两级审批、资质到期扫描;由内部人员代录 | — (无面向供应商的对象,无报价) | +| v0.2 | 供应商门户:门户岗位与 RLS、公开注册表单、门户补录、供应商审核 | 04 §3.7 隔离测试 | +| v0.3 | 寻源:寻源单 / 明细 / 邀请、报价、开标、比价矩阵、定标审批、价格库 | 封标测试 | +| 暂缓 | ERP 集成 I1–I6、物料、银行账户:等客户需要时再排期;银行与付款始终留在 ERP | — | + **上线策略**:第一期先选 **2 个品类、20–30 家供应商**试运行 4 周,跑通准入与至少 5 张 询价单后再全面推广;推广按品类分批,而不是按工厂。 diff --git a/objectstack.composition.ts b/objectstack.composition.ts new file mode 100644 index 0000000..efb14f2 --- /dev/null +++ b/objectstack.composition.ts @@ -0,0 +1,6 @@ +import core from './src/core/index.js'; + +// 选出要合成进制品的模块(ADR-0002)。目前只有核心;扩展包落地后在这里按开关加入, +// 两个扩展包同时选中时带上对应的桥接模块。 +// objectstack.config.ts 不能有具名导出(构建按严格的 stack schema 解析它),所以选择逻辑放在这里。 +export const stacks = [core]; diff --git a/objectstack.config.ts b/objectstack.config.ts new file mode 100644 index 0000000..278de7d --- /dev/null +++ b/objectstack.config.ts @@ -0,0 +1,5 @@ +import { composeStacks } from '@objectstack/spec'; +import { stacks } from './objectstack.composition.js'; + +// 把选中的模块合成一个发布制品(ADR-0002);`preserve` 保留每个包各自的身份。 +export default composeStacks(stacks, { manifest: 'preserve' }); diff --git a/objectstack.manifest.json b/objectstack.manifest.json new file mode 100644 index 0000000..73df112 --- /dev/null +++ b/objectstack.manifest.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://schemas.objectstack.dev/template-manifest.json", + "name": "hotsrm", + "specVersion": "^18.0.0", + "engines": { + "protocol": "^18.0.0" + }, + "manifestId": "app.objectstack.hotsrm", + "displayName": "hotsrm", + "description": "供应商关系管理(SRM):供应商全生命周期、寻源定价、订单协同、质量、绩效、对账与供应商门户。", + "tagline": "基于 ObjectStack 的供应商关系管理。", + "category": "srm", + "isStarter": false, + "publisher": "objectstack", + "homepageUrl": "https://github.com/objectstack-ai/hotsrm", + "tags": ["srm", "procurement", "supplier", "sourcing"], + "skills": [ + "objectstack-platform", + "objectstack-data", + "objectstack-ui", + "objectstack-automation" + ], + "readmePath": "README.md" +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..98bf99b --- /dev/null +++ b/package.json @@ -0,0 +1,32 @@ +{ + "name": "hotsrm", + "version": "0.1.0", + "private": true, + "type": "module", + "engines": { + "pnpm": ">=10.15" + }, + "scripts": { + "dev": "objectstack dev", + "start": "objectstack start", + "build": "objectstack build", + "validate": "objectstack validate", + "lint": "objectstack lint --strict", + "typecheck": "tsc --noEmit", + "test": "vitest run", + "i18n:check": "objectstack i18n check --strict", + "verify": "pnpm validate && pnpm lint && pnpm typecheck && pnpm i18n:check && pnpm test && pnpm build" + }, + "dependencies": { + "@objectstack/runtime": "18.0.0", + "@objectstack/spec": "18.0.0" + }, + "devDependencies": { + "@objectstack/cli": "18.0.0", + "@objectstack/skills": "18.0.0", + "@objectstack/verify": "18.0.0", + "typescript": "^5.3.0", + "vitest": "~4.0.0" + }, + "packageManager": "pnpm@10.28.0" +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..1ba2274 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,5625 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@objectstack/runtime': + specifier: 18.0.0 + version: 18.0.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.7)(mongodb@7.7.0)(nanostores@1.5.5)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)) + '@objectstack/spec': + specifier: 18.0.0 + version: 18.0.0 + devDependencies: + '@objectstack/cli': + specifier: 18.0.0 + version: 18.0.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(kysely@0.29.7)(mongodb@7.7.0)(nanostores@1.5.5)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)) + '@objectstack/skills': + specifier: 18.0.0 + version: 18.0.0 + '@objectstack/verify': + specifier: 18.0.0 + version: 18.0.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(@objectstack/driver-mongodb@18.0.0)(@objectstack/driver-sqlite-wasm@18.0.0(better-sqlite3@13.0.3))(better-call@1.4.0(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.7)(mongodb@7.7.0)(nanostores@1.5.5)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)) + typescript: + specifier: ^5.3.0 + version: 5.9.3 + vitest: + specifier: ~4.0.0 + version: 4.0.18(tsx@4.23.15)(yaml@2.9.1) + +packages: + + '@authenio/xml-encryption@6.0.2': + resolution: {integrity: sha512-/jv5qO935fH4Ma+fxh5rJLRYZvUM57fd/I74IiSoR8cFm+sgjszXFEEn1PkqZhhBD4MVkH2YT+/UDY+pnW0S0Q==} + + '@better-auth/core@1.7.3': + resolution: {integrity: sha512-JdP7lOkyE83jgjn7RilJj1XvZ7n2JjRsErKJuaXchjyuNo6cf1iVd3GtbhAtiUyJJkWdk8yL+LaUBKT80H0zLA==} + peerDependencies: + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.1 + '@cloudflare/workers-types': '>=4' + '@opentelemetry/api': ^1.9.0 + better-call: 1.4.0 + jose: ^6.1.0 + kysely: ^0.28.5 || ^0.29.0 + nanostores: ^1.0.1 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + '@opentelemetry/api': + optional: true + + '@better-auth/drizzle-adapter@1.7.3': + resolution: {integrity: sha512-S+nQRlxbUhkR43LrSv8c98ZvOvmv3nrtOnHkiZXkdDkr60PWp7maC2cqgzZ2C9exCC1a+4TugJlx2jRL+r+/9A==} + peerDependencies: + '@better-auth/core': ^1.7.3 + '@better-auth/utils': 0.4.2 + drizzle-orm: ^0.45.2 || >=1.0.0-rc.1 <2.0.0 + peerDependenciesMeta: + drizzle-orm: + optional: true + + '@better-auth/kysely-adapter@1.7.3': + resolution: {integrity: sha512-UIsyJMIrjUnT+yTaS6dkCxYYmtPwxFHxwSJ8+CLty2II5w9BewlDxDA0/QzhoL/InYCPxQ5Y6xIgLHZG1dhwRA==} + peerDependencies: + '@better-auth/core': ^1.7.3 + '@better-auth/utils': 0.4.2 + kysely: ^0.28.17 || ^0.29.0 + peerDependenciesMeta: + kysely: + optional: true + + '@better-auth/memory-adapter@1.7.3': + resolution: {integrity: sha512-WdLANFY/QWC3G351RCzxU+Y9YlW+BQ1oG9NwBTSOUWQw5rZ87ws+weU8tvAMO7sQ4C9gKIlkOKBKUKXrSt91Tw==} + peerDependencies: + '@better-auth/core': ^1.7.3 + '@better-auth/utils': 0.4.2 + + '@better-auth/mongo-adapter@1.7.3': + resolution: {integrity: sha512-YL9m01tNogmFmRvOWJ46M9WwE6HirCXHDell29mtsQB/Qs1TPNLrgj7ybGMMGhQuyj6S218+8Wbls8m9s+i8RQ==} + peerDependencies: + '@better-auth/core': ^1.7.3 + '@better-auth/utils': 0.4.2 + mongodb: ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + mongodb: + optional: true + + '@better-auth/oauth-provider@1.7.3': + resolution: {integrity: sha512-Eoajj68F1ETmp4NBM98tgj1Uiip4cZiFqFsijAWIvOEQTejr/67PWK1/92N8PiNdLf03ezUWU538W93rd9fyIw==} + peerDependencies: + '@better-auth/core': ^1.7.3 + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.1 + better-auth: ^1.7.3 + better-call: 1.4.0 + + '@better-auth/prisma-adapter@1.7.3': + resolution: {integrity: sha512-TJ/DhlU7oLzrC626/1wfYA1Pl+lVsXa/zXBZ8d7Rlc2YO5fGd5fsAYJdRrYMyA51iZEo+rWLXMhZ0cez1BamsQ==} + peerDependencies: + '@better-auth/core': ^1.7.3 + '@better-auth/utils': 0.4.2 + '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 + prisma: ^5.0.0 || ^6.0.0 || ^7.0.0 + peerDependenciesMeta: + '@prisma/client': + optional: true + prisma: + optional: true + + '@better-auth/scim@1.7.3': + resolution: {integrity: sha512-1/L7zIEUAb1jxlzWKkqbDAD4Jz7u83yZg15TSaIaKcFe1dpCdNxkzQRrjbPLUfnVtBh/vnk10uLxVFCtbMdrdg==} + peerDependencies: + '@better-auth/core': ^1.7.3 + '@better-auth/utils': 0.4.2 + better-auth: ^1.7.3 + better-call: 1.4.0 + + '@better-auth/sso@1.7.3': + resolution: {integrity: sha512-inxETRuOfyy8m0uEJSfi9uhScp4RkQ7ZYI+GRj+Jtz6ml/p5wTzNOjYZsG43TroUTDfrElF6CYQON5/Xk1XdmA==} + peerDependencies: + '@better-auth/core': ^1.7.3 + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.1 + better-auth: ^1.7.3 + better-call: 1.4.0 + + '@better-auth/telemetry@1.7.3': + resolution: {integrity: sha512-aixgHbJhGvS8PRczX/LR3murYyBnIvOGmJw37ZZBMg6ZtLR/UBJAkufbDi1HYn5THSuTJ3D5DtY85Ahh/ABQtw==} + peerDependencies: + '@better-auth/core': ^1.7.3 + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.1 + + '@better-auth/utils@0.4.2': + resolution: {integrity: sha512-AUxrvu+HaaODsUyzDxFgwd/8RZ1yZaYo42LXKSrU2oGgR38pS1ij8nqQKNgtTWoYGpNevNXtCfgTy6loHveW9A==} + + '@better-auth/utils@0.5.0': + resolution: {integrity: sha512-BL8W4EfIZFwlu0r54m3v1ztjDhu6dDe/amLTm0xybmbZaNgYUqhD3SjpAsnq0q8YD6/ki4iwIgxJNLP/N3TxiA==} + + '@better-fetch/fetch@1.3.1': + resolution: {integrity: sha512-ABkD1WhyfPZprKRQI3bhATjeiFuNWC9PXhfGWqL+sg/gKrM977oFrYkdb4msM3hgUGonr7KlOsOFT5TU2rht9g==} + + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@fast-csv/format@4.3.5': + resolution: {integrity: sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==} + + '@fast-csv/parse@4.3.6': + resolution: {integrity: sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==} + + '@hono/node-server@2.1.5': + resolution: {integrity: sha512-MgP/I06GdvsilDspMk/qmRzpk8LOUStP6jFAbSRi40W09DhoyUn+Mj7eyKICPqeYKybOjVFLVIAQzvu1bfIa7Q==} + engines: {node: '>=20'} + peerDependencies: + hono: ^4 || ^5.0.0-0 + + '@jitl/quickjs-ffi-types@0.32.0': + resolution: {integrity: sha512-v9T+GQpmk43VDJ7d72sf0Nexhk+ArvtUihW27dy7lqAl0zBObFKtSBBIm5RBjwIhE8VwsPPm9PNuvPvNqLWUEg==} + + '@jitl/quickjs-wasmfile-debug-asyncify@0.32.0': + resolution: {integrity: sha512-EX8zbXwGqCgAE764M+qvkHtyXDi/FUoMBea0JnES7vCM3P7a2+EOZOjGv85wtZ2sJhI1oJ+nekmqpOODFDY+hw==} + + '@jitl/quickjs-wasmfile-debug-sync@0.32.0': + resolution: {integrity: sha512-LeYWrPGC1uNCTBWvibo3ZLJj0CSVNYUXvJpXMCmuQ5Sap2cCACc3uvGvYV4homHHBAzfw5akoTqMMS4YFRtw+Q==} + + '@jitl/quickjs-wasmfile-release-asyncify@0.32.0': + resolution: {integrity: sha512-3oSwPfja12ICz4aIblB58cuY8JlEq5Txt8Cut4VLo+LH47QN+mzCnSgnbB03hWzg1LBcc+VyyI9UOag7a1NF+Q==} + + '@jitl/quickjs-wasmfile-release-sync@0.32.0': + resolution: {integrity: sha512-BKNDI/TPBfGlLNGYpLrhcDGXmIk4xHm4MRAisOBnOzpXVn9HZWsfmMAc9WMBrAHjvvds6HOikKeaOBKdPdpVrg==} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@marcbachmann/cel-js@8.0.0': + resolution: {integrity: sha512-oaTrAziGr3zDLFiMt/yLU3nZuRMawyWQB5X1a0I7s9eGy3JYzX9l8ZXXHyMd64nzbeVFZTewuUShwsZQdK6UCA==} + engines: {node: '>=20.19.0'} + hasBin: true + + '@modelcontextprotocol/sdk@1.32.1': + resolution: {integrity: sha512-2DdE+SJDtzLEEWzY1ZjY7Q+VcPhcV1KisD3zI4u0XZyktsjHum1mwbMI+JaulUBi2OZk+KJAi2uPXzxichPkdw==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + + '@mongodb-js/saslprep@1.6.1': + resolution: {integrity: sha512-D4CQtk9IwjCLAvCf1xvHEod3960q8XMUzfmdRU9qjUNlHnesGuTOvJcOTaPm9koZ1caUKA2aTbszZiAkcmSgmg==} + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] + + '@noble/ciphers@2.4.0': + resolution: {integrity: sha512-AnjFn0Jv92laAkvMrghlFZq4qQCIN/4DxFV/eooqtC2YTjB7kBeLMS2T9KJX4Dn+ZVXLOwK0lSgqDtx9gvxtiw==} + engines: {node: '>= 20.19.0'} + + '@noble/hashes@2.4.0': + resolution: {integrity: sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==} + engines: {node: '>= 20.19.0'} + + '@nodable/entities@3.1.0': + resolution: {integrity: sha512-LsS/DjHr+uDM647Gru/cA8+J3a3HfhttwCKLyuoyN7yXTFCxKBtSgMQBvrW9yNPa2/zDRUNuGPaH5QUFoa4arQ==} + + '@objectstack/account@18.0.0': + resolution: {integrity: sha512-2StPx86qMYlyp6mDg+d3exC56yEsuyJQlB/N80EekohTVPdcyjgfXksSnl2YsXjw/4/BgtTrcIHvoD3E+wK3Uw==} + engines: {node: '>=22.0.0'} + + '@objectstack/cli@18.0.0': + resolution: {integrity: sha512-u4d2HMDf6XD4eoX0NOte/2i5BPAxSUTzFWmBy1UFrmGo9vpucdIhTG5GZLu4Asd1lx388A68KgTsM2JZJLRtoQ==} + engines: {node: '>=22.0.0'} + hasBin: true + peerDependencies: + '@objectstack/driver-turso': ^18.0.0 + peerDependenciesMeta: + '@objectstack/driver-turso': + optional: true + + '@objectstack/client@18.0.0': + resolution: {integrity: sha512-OMQ95n8s/rMaOTJQW0ZL40YOznSCXdQb7hVN5PGVUuRQNuOm1HiQcn+FjNaeY5LoKCx/sa1/6tVKlX7UXcXphQ==} + engines: {node: '>=22.0.0'} + + '@objectstack/cloud-connection@18.0.0': + resolution: {integrity: sha512-b4yjwj1UMIG+KFbTE1W4uVh7KdiehCvwUfHhovH/hh2dBesBs3XZ1gHJiRyJIAPr/fGxF8n+APDiHlG1uWodrQ==} + engines: {node: '>=22.0.0'} + + '@objectstack/connector-imap@18.0.0': + resolution: {integrity: sha512-3emfVW64XoFfKRaFIwxLnz8tXQVMH1uaJQY43g2YStLU2jm7mrf5EkZFXqWMf021d/VePm8lJLKX7oOAqbgWjA==} + + '@objectstack/console@18.0.0': + resolution: {integrity: sha512-oXLDm2uhankO6YPj3MXWALbIogO583KNEZ20kQsm9l4L4oTbwKRQCuMSiyI1+2t5Nauu9q64LKqXlv1zlQ5Kog==} + + '@objectstack/core@18.0.0': + resolution: {integrity: sha512-gEipd3w71ZZ/w1iWy9FNm4uMDvnP2O3MxWlM7h7o2YCWfOp4EIwfMhdTdfyERSp9Csvp/xJUvPpyfBnBs2xOyg==} + engines: {node: '>=22.0.0'} + + '@objectstack/driver-memory@18.0.0': + resolution: {integrity: sha512-TWx+NqOIPMnIhvmUEUKj2BuYu62dt4eXENahmv9b92r9QrgBTt+MgTcOehBjgewWOeglUNAc2CTtjjUD1uzajw==} + engines: {node: '>=22.0.0'} + + '@objectstack/driver-mongodb@18.0.0': + resolution: {integrity: sha512-NvCHSMYsgSn9CmlMEM7vERclHhKHEITuR9jB+vEaByMo34oMDfMUMA+ym3fVQuTFZdMqxbJP5NX7Nq6cV9wR9w==} + engines: {node: '>=22.0.0'} + + '@objectstack/driver-sql@18.0.0': + resolution: {integrity: sha512-NEQOK3MK6wVdPa+hegx9O1iV4cr5vshWl6+ijOlt4YNcLIIhy1wd73EcSnNEIRQsMJ0hngy4HiE8JDzS4e6ijQ==} + engines: {node: '>=22.0.0'} + peerDependencies: + mysql2: ^3.0.0 + pg: ^8.0.0 + tedious: ^18.0.0 + peerDependenciesMeta: + mysql2: + optional: true + pg: + optional: true + tedious: + optional: true + + '@objectstack/driver-sqlite-wasm@18.0.0': + resolution: {integrity: sha512-PF6ujlapT0vbEptI/qqrwhlBYgkISTeojFkwtrpf4FRNP8nLtd+MIIeoH8+dXmURD3uSUo/+iwfoAOCYXMIhzw==} + engines: {node: '>=22.0.0'} + + '@objectstack/formula@18.0.0': + resolution: {integrity: sha512-u8ASHzq4WgCS4Tt8OCQOq9kRXDqnw8YEMn67zHjzZXZuWT3Ft1wfJVmm07z16jwwv3GjkS+CpGXCuqTv9EAmCg==} + + '@objectstack/lint@18.0.0': + resolution: {integrity: sha512-HtjZRyELYX5nOYh1dtP0qbM7tDSdZPd0RwUrHadiIRxNswnhUBsCWNVn8s2DKTbXXh+Q9HCsyNicSC1frNSHRg==} + engines: {node: '>=22.0.0'} + + '@objectstack/mcp@18.0.0': + resolution: {integrity: sha512-6Mtf6GoUHsPgQwKFAsbpQ6b+ArGq0dzVe2UtUVEe+Ey8704L2WosCHAPfAltHkeOEY3WMnyfMfJpvQjOXI94UA==} + engines: {node: '>=22.0.0'} + + '@objectstack/metadata-core@18.0.0': + resolution: {integrity: sha512-9RBUvw+94/i82g5xTTU7zTiaHOSIS6qmWBomDjxcHkk8qhIJliktnWVXq8N/D6n/tWhu+EZ3XUInCynilA81Kw==} + engines: {node: '>=22.0.0'} + + '@objectstack/metadata-fs@18.0.0': + resolution: {integrity: sha512-V7Jg/t0rev2egbuC7ba717KlKCx5O+z3YkD8mByxzsm2y8Nx3W5cHQNLlYEGcUQQ8WF74ws6JnLhTE0F97fZCw==} + engines: {node: '>=22.0.0'} + + '@objectstack/metadata-protocol@18.0.0': + resolution: {integrity: sha512-N3bBuAN9exKaQ6RtgI8PGbpO36FnaXv2CTulkRc8JFNNYxWAXRglKeR5mXy2SzHKKOjV9UAn4RjuEowHJ6FASw==} + engines: {node: '>=22.0.0'} + + '@objectstack/metadata@18.0.0': + resolution: {integrity: sha512-/0BbBFYYR+m5i0AZLYDqYbPL+Fa1OJOp/arCApo8SCKWyyP2lcL/V7qUM3lUOn7FdUvQxEavuJe2gLOLIma9uA==} + engines: {node: '>=22.0.0'} + + '@objectstack/objectql@18.0.0': + resolution: {integrity: sha512-PwMbpzAGRlwninCMG2F6apx60K4A5J4ULquPSYDau8uEqTnoaNbHnsXlgF+aeIQN5Lz3Z6TL4ocRBB0njE+mmg==} + engines: {node: '>=22.0.0'} + + '@objectstack/observability@18.0.0': + resolution: {integrity: sha512-XmyJ1H+JubpvamcBqxEHKwtNS5ECrJZCpYu336Wh+SgSfx1qkKX1ikQvzCL8fR32KzLBz8L8IocjId3Z5klHxQ==} + engines: {node: '>=22.0.0'} + + '@objectstack/platform-objects@18.0.0': + resolution: {integrity: sha512-rvKi+/FuwYnXqmjHSml8l8AqPqqSYoFEdvvpPU+jzYBz+Z4I6dktzAnhMVG7vKMEcO22OhAuzEpAssb82ipHig==} + engines: {node: '>=22.0.0'} + + '@objectstack/plugin-approvals@18.0.0': + resolution: {integrity: sha512-beXZqrPCHSkkNjj9WC11yy5EWaxvi6avOWVmSmfXbRjoCojZeFI6EuinVeZMa/zsKEBBnQD58VwT4WdTUAbAAg==} + + '@objectstack/plugin-audit@18.0.0': + resolution: {integrity: sha512-kFgOXiIB/7Z2nRd5Qa0DK3HTG3Qg8NMW7FD5z1JQjCiuAqGiOEU7KutHtHJ3Xvzl/YrmzKSC4L/ac/f85FqTkA==} + engines: {node: '>=22.0.0'} + + '@objectstack/plugin-auth@18.0.0': + resolution: {integrity: sha512-xsTOqSW9Ka0DP5XXPpbtsaWq61iKFsg94eww/7tA3u37oF3UtpQlcP2sMIJd9/aZjRgs/Tebpo1Bm2b+DD36Ow==} + engines: {node: '>=22.0.0'} + + '@objectstack/plugin-email@18.0.0': + resolution: {integrity: sha512-lAvfh74662wTwTl6HC0Qcb8hUCb5xw8bB0lEeFZbcu/SPz9I5k77fpAJ76BYdj73/q9sol97vU38+ihITH/rDA==} + + '@objectstack/plugin-hono-server@18.0.0': + resolution: {integrity: sha512-j2PQ5EhGK2EdfQAlILeVMUf39gL5dVypsGApu3ABhx8F7KTU0sd5xfXzQks36EK9owBgTVdgxFgpxqfh/xQq2A==} + engines: {node: '>=22.0.0'} + + '@objectstack/plugin-pinyin-search@18.0.0': + resolution: {integrity: sha512-z4PEjRjAHc6wZrGrqsArgve2a94WNf54lJKt1fIn11yXP1Ta9xth2wvaqJ1msOpqBEjASE3IwyoPmxvp1ZpE0A==} + + '@objectstack/plugin-security@18.0.0': + resolution: {integrity: sha512-0rFD7cGvvU/xXJ+xJAIzPNHqJgucwbWEPNbHeJvFfSAfWrmC38ATpovws++pHlh8fk9QhOxArBSXfbe8qkk8JA==} + engines: {node: '>=22.0.0'} + + '@objectstack/plugin-sharing@18.0.0': + resolution: {integrity: sha512-v/7Ajh5M7BGOgkjjrHPxZp6rz3Q2YIWqcTDE+uwpVQ5Ffya/Xi3pQ7BJ6yhss+oti8PbRiwNcsxhq8fL9JFANA==} + + '@objectstack/plugin-webhooks@18.0.0': + resolution: {integrity: sha512-7EhDyfPNTodIK5CEhBA28RtJR4zzQ7czQ5a8X/Dr/yOByplwa+iNx+Bc5OGDEr3+kVLxRdotS+j92Eo2dACaLQ==} + + '@objectstack/rest@18.0.0': + resolution: {integrity: sha512-genwaOi4AaljWhazirpma6BkPKuEbo5BWgZyiacMA0zOIBs5C8VnyErRktmLjsvI4JiPaWdzjLWr+YJOnDCzwg==} + engines: {node: '>=22.0.0'} + + '@objectstack/runtime@18.0.0': + resolution: {integrity: sha512-MHENPgorNqqU/lMm6sySghIuHjQxlal+by9Srtim2E/7nVADuvtLXyqGnkqcScgNkdrMlNQOfoY2UFpSypcPiQ==} + engines: {node: '>=22.0.0'} + peerDependencies: + '@objectstack/driver-turso': ^18.0.0 + peerDependenciesMeta: + '@objectstack/driver-turso': + optional: true + + '@objectstack/sdui-parser@18.0.0': + resolution: {integrity: sha512-djjJfdAj+PKVQ4CKcfBQQkNYPNTg6nMAsxUk9lr3WOL7JfdX5KO8vY8SVXyKnN/RT4Lni5/R4r7kgduHR/zDNQ==} + + '@objectstack/service-analytics@18.0.0': + resolution: {integrity: sha512-XxVCMwnfYKm0iwzl73rmmuFsnOwl8TkJMbonYpvJ0qzzqhfq4IwS8TH+sUIXfjB8ZBnPwGGPsRSFXqURxUfXWg==} + engines: {node: '>=22.0.0'} + + '@objectstack/service-automation@18.0.0': + resolution: {integrity: sha512-wiZvZMxkIsx0+k2RVfXhvT6oHZEg6h1rv5PDg8RHFrfz7xjWQGjoDflj3q4uottBaaFhmty+z6noe3P3y3PBAw==} + engines: {node: '>=22.0.0'} + + '@objectstack/service-cache@18.0.0': + resolution: {integrity: sha512-s72W/KuRJiDpCEzPonMZoyPC2Rv1zDyH7yvDeK6cv9Rvx/jVafrGqDEUd++g92ouejg50HTpyxUXGDeBnextPQ==} + engines: {node: '>=22.0.0'} + + '@objectstack/service-cluster@18.0.0': + resolution: {integrity: sha512-1nhwPI2w8amfe+USczu+y4S2YRV/rMh13OVNWCNuPl2MFgWsXxua4bE/HNl11WEsFTLE0VAleMQO/y0/2L8Tog==} + + '@objectstack/service-datasource@18.0.0': + resolution: {integrity: sha512-yJ+yTpnzrVMWMF0IdfaJXbYLDaQHOvbZpwEe4BYdVL04qsT1FqJQHuNAbtZUNvqP3OZBOrHShkS5ftBE1ff6OQ==} + peerDependencies: + '@objectstack/driver-mongodb': ^18.0.0 + '@objectstack/driver-sqlite-wasm': ^18.0.0 + '@objectstack/driver-turso': ^18.0.0 + peerDependenciesMeta: + '@objectstack/driver-mongodb': + optional: true + '@objectstack/driver-sqlite-wasm': + optional: true + '@objectstack/driver-turso': + optional: true + + '@objectstack/service-i18n@18.0.0': + resolution: {integrity: sha512-HxB0Cp/vY6sQZxt0fmSD9o3bOYVuUZm5A5r+9UfmPsP6hWesW1Rwr0OgytpZ9Wt9njPZo4IyUOK++NOni+Nmzg==} + engines: {node: '>=22.0.0'} + + '@objectstack/service-job@18.0.0': + resolution: {integrity: sha512-KeC7WzYRp7Xaf0nmRS+Fd13C61uhVqa9c087a8A+8KsmfFw5YgGlQQxjZXMRP1jnWJ+4cuqQ+jNHv47wov5rNA==} + engines: {node: '>=22.0.0'} + + '@objectstack/service-mailbox@18.0.0': + resolution: {integrity: sha512-Si5MScKAU1LYC3ImT5Tun1X7ZUBezarZo3Qw9I5ns+lluDuBAMa7zvqz4ua1lsVF5FmMXJmH8OimuWnTcy8yMQ==} + engines: {node: '>=22.0.0'} + + '@objectstack/service-messaging@18.0.0': + resolution: {integrity: sha512-zTcFcIZ1r7gubHUCaKPDNw4+HHKRNCCylYVtBIpGFXCv8qUNCBCpvD3NaIOMqtSLEmzJp0lVR82mvRwwHQdvaw==} + engines: {node: '>=22.0.0'} + + '@objectstack/service-package@18.0.0': + resolution: {integrity: sha512-jRC8+T9SCOOZk2S3lI96+QcwKSnOjgDuMkF+SteYTysSuqe0USjfcLRR/wkR4uy1UTczXc48yinbniz0h7xp4A==} + engines: {node: '>=22.0.0'} + + '@objectstack/service-queue@18.0.0': + resolution: {integrity: sha512-+Lz2sR9tX/6eAUDe7L+2QJK49nHTYNjJnhvrwFYtc+dbWpgauG7nb9BepTkbCjC8jmGNdlUTLpGYa+lKGIEtDw==} + engines: {node: '>=22.0.0'} + + '@objectstack/service-realtime@18.0.0': + resolution: {integrity: sha512-N4L1iT5SrnDdB47/QJAVwA8wvIS2xRBpm/hfs7eZjH2p2uI5w5XQm3AFROX4LPglCuNA6A74GPMhRY5WcXZv/w==} + engines: {node: '>=22.0.0'} + + '@objectstack/service-settings@18.0.0': + resolution: {integrity: sha512-DKXjwOrAAUJyyVN3pTmGhtldjsHcxwLuOUrdZeOXcUDdMn0v/DPlWLSyofDXH/snbKEUwTkq46klfCj28w3Vvw==} + engines: {node: '>=22.0.0'} + + '@objectstack/service-sms@18.0.0': + resolution: {integrity: sha512-9R9dk82oa93S2RUfa+O/GvS+BMFZHc3n/QY0PZ/rSz/DEXCh2n88k+Y9E/YMVPdCtAjjVmW4lODoyIXZeUa5mQ==} + + '@objectstack/service-storage@18.0.0': + resolution: {integrity: sha512-D2Z/TesgVYnHHxTJY/ui+eufnSTT8p3Gxnz3aAGVV3L4l0YEq7dhKed2rjoZvCysxpQOeFP/7ThVMUBE8BxSEA==} + engines: {node: '>=22.0.0'} + peerDependencies: + '@aws-sdk/client-s3': ^3.0.0 + '@aws-sdk/s3-request-presigner': ^3.0.0 + peerDependenciesMeta: + '@aws-sdk/client-s3': + optional: true + '@aws-sdk/s3-request-presigner': + optional: true + + '@objectstack/setup@18.0.0': + resolution: {integrity: sha512-lqefO8Gx0kdjTjIg8b/QAoSAax6f8QV8Do9FVLcKlidaDVBthH64+LnM7bz8X44uvfJ6tWAYNzX3Ns5CQyFG2A==} + engines: {node: '>=22.0.0'} + + '@objectstack/skills@18.0.0': + resolution: {integrity: sha512-iGB94cYYjL+ncByoio5bTsqCuZoatEnVqiuCMj4HYpjWaw3xg8e4lVUmk+YHddwvHTrUxZIdD8UuxqyFf4rEqA==} + + '@objectstack/spec@18.0.0': + resolution: {integrity: sha512-oZQ/eFw25Gk/afaxME0TE44Wu4KVcPWK+5i9wXXpXLmnqpFj2syUGztRW+Zup/R7sbGUpq6YJ+ULic7o2dpFKg==} + engines: {node: '>=22.0.0'} + peerDependencies: + ai: ^7.0.0 + peerDependenciesMeta: + ai: + optional: true + + '@objectstack/trigger-api@18.0.0': + resolution: {integrity: sha512-tDVkPAqi0XvB44s4ZkmTHGLDRS7l0YRf+PtwIJbMfrXjbha7m5xuiTDvOtkYya92eW6a9Y8gWJyMlRdbK9Zr6Q==} + + '@objectstack/trigger-record-change@18.0.0': + resolution: {integrity: sha512-z/mlXaf7AsSxs5G+mR982Ebs6rdzix+FbZi2leuY4C8e7vMpNNuJksNAHM0wQmfKRuRaBKsrS+mJ5fJkp7gq+w==} + engines: {node: '>=22.0.0'} + + '@objectstack/trigger-schedule@18.0.0': + resolution: {integrity: sha512-tiHjVq+kDttrbvs9iwkniCjYWVE/AopziR7oYe6Y6Z2AsRqH8ZjJd2jMtqHvqOSnAF9iYHKbmDxPv92SFzh/Aw==} + engines: {node: '>=22.0.0'} + + '@objectstack/types@18.0.0': + resolution: {integrity: sha512-NTtislPnGE4ZlDwIfiYy4HrtJtbRiCLYh/muoE0C6cHQpsC267gEneb7tgFr9dnput9XoBKBJnj9HkwODkPZOA==} + engines: {node: '>=22.0.0'} + + '@objectstack/verify@18.0.0': + resolution: {integrity: sha512-36d4eiiikhhd9qWf59GQBkO8FzeO2oUSQq5vgiacnT7vUQEcZha/I/LO1+LBRWOURUZJ5lJyrLy8Nhe8s8vVAQ==} + engines: {node: '>=22.0.0'} + + '@oclif/core@5.1.9': + resolution: {integrity: sha512-jZfN6pxHkgDpHD0dk4nhtaUtYdK39oZoWJCfmkpp7CUE+6mUZSb3WDrdBHnxI5n6CJIiWBrLchM7rBvuV0lRSA==} + engines: {node: '>=22.0.0'} + + '@opentelemetry/semantic-conventions@1.43.0': + resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} + engines: {node: '>=14'} + + '@rollup/rollup-android-arm-eabi@4.65.0': + resolution: {integrity: sha512-t2AnVba25baFdq7gczzS13JyVcdubLVbFX1X04mxrggDrTQPUXNv3XM0k9H1hr5tqvg7AVvtQ720QHAj0iYqhg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.65.0': + resolution: {integrity: sha512-dNONUaEwPGhl/nuO2KV8VABWlcjYyU6KtZGN8dQv5OS5JU7JSCxPijVNKXbRJd0iuTzTiJ4TjPt/4bbvDRNiMQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.65.0': + resolution: {integrity: sha512-zWQqUH+9zavr2Bxuzfpuv2SIF3X31cr58TvSQC9o1GhpOvkqRwr60GkZdQcudyT/BEgdpdSafjgd2I13MbTL7g==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.65.0': + resolution: {integrity: sha512-RQYreBFWtO4//hIuOaZkYUnF/lPU4lz35dveDimDshWCJvVisVtJ/shmT9bkXK8wFJY+FJF89X6F3Cq1qI3LCw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.65.0': + resolution: {integrity: sha512-A0NfMj6Cuh/9BE5k3awJKv6HoxFVXIcLAb6SZqAMoxUHPA1ZNNK4RsGuUPD/vL7nEAm9LG+ZzXWWTrnC0XtkpA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.65.0': + resolution: {integrity: sha512-BI6/H7q3aP0I7S7GOrjyxTjgEJlSnovXE38+bdxBpuKN6z+d//uF+T+VQ3Q7ltJL/71p17ufartARX9Ja5gOGQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.65.0': + resolution: {integrity: sha512-W1vUprf09RWaVWnsFP1vlUkEWJzTZlpObOEAYZXt9Fq0UVAOYEkeGr7wBX7McKqqIQskXdBnpiOMgwPujordgA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.65.0': + resolution: {integrity: sha512-s8QTcZWgrl9haFzEGIqyE5BWyo89pFDGLMBFZ752WYxk8DJwNU/O1X6pZgPw829d9/sm6CCHyrMP3aurt76p1Q==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.65.0': + resolution: {integrity: sha512-ke1f6dLRzkqveyjjF2fkEwQYZvxHtNNwjegY8nJrwcO0Bdqr8CzFO/pKE0Bns13cx0qz2Ba2Y0Hs3dSwMdnHxA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.65.0': + resolution: {integrity: sha512-926SMeUcy4y18Rz/w2aJiUKOnyAnm6czg72bXkQEaeemsll+Wr0hnsjb2BGRpHvWgwAMYy5ACJCotbvfLCfj0A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.65.0': + resolution: {integrity: sha512-6T7JNRP1hc4hqF2dUsEoVLOt9K8tmODoCLldtQRYnrddGGQY8Gqe2pM/qMMUo7EMowpP7oa2N95k0/8sYK/ipw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.65.0': + resolution: {integrity: sha512-SImGFl1Je5kpyAgOCPONVT7h6ASV8mAUwGRjY7eZvVjPg//PfHOXgI+P241RF/+HqsA4PP3qD527ysWFKNQyhQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.65.0': + resolution: {integrity: sha512-XeDTbmPF1Yu5asfXGPrMkWoxTDhgryQbmw5Q1+R582O51VNCk23J6f2pDrsAp5YkneBVBwtExx6ZGOb9D2aQ6A==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.65.0': + resolution: {integrity: sha512-VS55JUI/1nsljmV/jfqNkLZXFw8uMO8nNlfoHmSevNf6fO3neuhyDvx9dv3c/Ytt8r/431SL8Qax1dpYvOMZTg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.65.0': + resolution: {integrity: sha512-Vblw84TbX7RS4la1Y4+yQ7aore/oSyaNtFbppuBr5Vs/4LfBeXKq9dIfoExw6zOvRERqd2rRAjnZRaMhH/0x5w==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.65.0': + resolution: {integrity: sha512-7+gHjtONvKgwR9InTKFaLq53f6YzBJkgeMRBENdWTsQr+spahGqQm8HF5aXpq8i4JaRrOqYyv6Zn1WltDTxaZQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.65.0': + resolution: {integrity: sha512-KvNDC0J6s4vVHhtJ6KrDXU0Er0au/hmRIBq/+1maCV8TseGupeKizq0bWcrbp2HE1T8xoknvN0Q/KZ/YF0qX3w==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.65.0': + resolution: {integrity: sha512-GExdD15WPvu/x/drELjVam7vX8EsPgvTMOa/iJL/p/4m/oOqzbb7JXZg8fXR4hlXtg/sF2zyTZ3bR0AEtEMlhQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.65.0': + resolution: {integrity: sha512-8sT9PemIZfIMED4Vd4KGoOXVDj5CMSWNcGdbheRUx9TYS03yOWdT2Q0lXPyEyNBB9YTilwewIQKNIBk6Nxi0Kg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.65.0': + resolution: {integrity: sha512-pO6Ehi0jo5yE0R6PltKhJhv9mlIiyzBJk5N5NUF2OF6xtVKI+1bdXxj/rb0jGXy3hck1ELVT0QPY3tzkAm360w==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.65.0': + resolution: {integrity: sha512-vo7N3/+cjjPDYr8vtxC+qSNgWa9sDvJ7g8N8R5SWqFY4WiNH1ULcAU70SKVyHeiIZOYYwNP9pTipmhN5sl1NPw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.65.0': + resolution: {integrity: sha512-ArwvgFAbjKcDM7qqotZ4OVYf+UMT9xH2YzkCzK4+AuZSDihMlz1Ekoe4INwBVXzn2mnJzuIYOcSx07iTBijGRQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.65.0': + resolution: {integrity: sha512-QGMmK4/cxKE/36FoLMSHQBCyymv/eFTnsCvvsBF0rgmOvVbvX78VWZRerL3dHa77f4pM6Xcc2iGDhJ10w/svKQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.65.0': + resolution: {integrity: sha512-XfKYFWHIPs4HPODIMsGF1IKlS3H1e3WokUZIgpmn4+uNnZBlnRDDHEylNyazbQXwhMKZre68OjtRYbKqb5+j8w==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.65.0': + resolution: {integrity: sha512-wPWi++K4Bs1VR4XihOhfGi4IGX6Cub7FlerTf8X2v+2BtDHddgSqWCXwGD+h2yAe4/niIhNDwAltioOC+wEogQ==} + cpu: [x64] + os: [win32] + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@ts-morph/common@0.29.0': + resolution: {integrity: sha512-35oUmphHbJvQ/+UTwFNme/t2p3FoKiGJ5auTjjpNTop2dyREspirjMy82PLSC1pnDJ8ah1GU98hwpVt64YXQsg==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/node@14.18.63': + resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} + + '@types/webidl-conversions@7.0.3': + resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} + + '@types/whatwg-url@13.0.0': + resolution: {integrity: sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q==} + + '@vitest/expect@4.0.18': + resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} + + '@vitest/mocker@4.0.18': + resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.0.18': + resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} + + '@vitest/runner@4.0.18': + resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} + + '@vitest/snapshot@4.0.18': + resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} + + '@vitest/spy@4.0.18': + resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} + + '@vitest/utils@4.0.18': + resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} + + '@xmldom/is-dom-node@1.0.1': + resolution: {integrity: sha512-CJDxIgE5I0FH+ttq/Fxy6nRpxP70+e2O048EPe85J2use3XKdatVM7dDVvFNjQudd9B49NPoZ+8PG49zj4Er8Q==} + engines: {node: '>= 16'} + + '@xmldom/xmldom@0.8.15': + resolution: {integrity: sha512-/5NV/vDALVFDXgLmfsy9TRCBlKwO2LNBFzpzvb9iIj+jR+eSc6DLYYvVOdivT/jm7MtU6TebYuRmzEOI7w40UA==} + engines: {node: '>=10.0.0'} + + '@xmldom/xmldom@0.9.12': + resolution: {integrity: sha512-5AXjrcMClTryPe9LgZrygpB1lj7s0S9E0+W+AHaVKAVyHanafK86iPSvG5xHVSp/jC+VH1UXu0TAEmY279xH7A==} + engines: {node: '>=14.6'} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansis@3.17.0: + resolution: {integrity: sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==} + engines: {node: '>=14'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anynum@1.0.1: + resolution: {integrity: sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==} + + archiver-utils@2.1.0: + resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} + engines: {node: '>= 6'} + + archiver-utils@3.0.4: + resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} + engines: {node: '>= 10'} + + archiver@5.3.2: + resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} + engines: {node: '>= 10'} + + argparse@3.0.3: + resolution: {integrity: sha512-Sn98ftV3KfsO8xfLPHG6oT8y+b0yvbrLgZjgPDXsharNY15tTAjqIsIju4S32nl6/iEUNNE4v+yL2Zhm8ooP3w==} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + better-auth@1.7.3: + resolution: {integrity: sha512-8xGp68JQ+l36kniDEgP8bP99TLi1GdEv0NTEUBkyqnYnus/cgFUZseUfqUHKzr2BAsg2O6aD88I9f0U68shanQ==} + peerDependencies: + '@lynx-js/react': '*' + '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 + '@sveltejs/kit': ^2.0.0 + '@tanstack/react-start': ^1.0.0 + '@tanstack/solid-start': ^1.0.0 + better-sqlite3: ^12.0.0 + drizzle-kit: '>=0.31.4 || >=1.0.0-beta.1' + drizzle-orm: ^0.45.2 || >=1.0.0-rc.1 <2.0.0 + mongodb: ^6.0.0 || ^7.0.0 + mysql2: ^3.0.0 + next: ^14.0.0 || ^15.0.0 || ^16.0.0 + pg: ^8.0.0 + prisma: ^5.0.0 || ^6.0.0 || ^7.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + solid-js: ^1.0.0 + svelte: ^4.0.0 || ^5.0.0 + vitest: ^2.0.0 || ^3.0.0 || ^4.0.0 + vue: ^3.0.0 + peerDependenciesMeta: + '@lynx-js/react': + optional: true + '@prisma/client': + optional: true + '@sveltejs/kit': + optional: true + '@tanstack/react-start': + optional: true + '@tanstack/solid-start': + optional: true + better-sqlite3: + optional: true + drizzle-kit: + optional: true + drizzle-orm: + optional: true + mongodb: + optional: true + mysql2: + optional: true + next: + optional: true + pg: + optional: true + prisma: + optional: true + react: + optional: true + react-dom: + optional: true + solid-js: + optional: true + svelte: + optional: true + vitest: + optional: true + vue: + optional: true + + better-call@1.4.0: + resolution: {integrity: sha512-bBKOT4vv1kZLDgxVePdilk/Jwkn+dtRRsmi3DzHcDP+WnswyVl6dR59l2HEeP/0cB+bDoopASAesWDPIdd/zZA==} + peerDependencies: + zod: ^4.0.0 + peerDependenciesMeta: + zod: + optional: true + + better-sqlite3@13.0.3: + resolution: {integrity: sha512-RbOBxmLBG8uvFUc15X9+9SFemKcQ0WBuISBVkpuiaUB2qblC8UWlHEjdWVoZ8AdhSwmoEgsiXKfopX0CQxaACQ==} + engines: {node: '>=22'} + + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + + binary@0.3.0: + resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + bluebird@3.4.7: + resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} + + body-parser@2.4.0: + resolution: {integrity: sha512-Ifk1KcLrxaGt1occQagQNFNNOqRt1LFuehEnHHzB8Z6cRgIxRU1TBaiIsUiCdA+gy5PL7Y1IX31DNKkRmxtXjQ==} + engines: {node: '>=18'} + + brace-expansion@1.1.21: + resolution: {integrity: sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==} + + brace-expansion@2.1.7: + resolution: {integrity: sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==} + + brace-expansion@5.0.12: + resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} + engines: {node: 20 || >=22} + + bson@7.3.3: + resolution: {integrity: sha512-oz3LwE3qGEhTCSyhzQRLY3Bj1NLOsjFMf6tcmY5J8M+3R7EVcmoBfSHWvjUK3yXCLDUsGpIuB3aQL4nDZ1EV/g==} + engines: {node: '>=20.19.0'} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-indexof-polyfill@1.0.2: + resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} + engines: {node: '>=0.10'} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffers@0.1.1: + resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} + engines: {node: '>=0.2.0'} + + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + chai@6.3.0: + resolution: {integrity: sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==} + engines: {node: '>=18'} + + chainsaw@0.1.0: + resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} + + chalk@6.0.1: + resolution: {integrity: sha512-/Ce6KNm3vIbWdMlNna6RVIZ/ICQxnJxCicet5LBKK9ZffBkqzDw0xh9EiKSljdRtiIQ1S1z4YgcscUUGzNCWrA==} + engines: {node: '>=22'} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + clean-stack@3.0.1: + resolution: {integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==} + engines: {node: '>=10'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + code-block-writer@13.0.3: + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@15.0.0: + resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} + engines: {node: '>=22.12.0'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + compress-commons@4.1.2: + resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} + engines: {node: '>= 10'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + content-disposition@2.0.1: + resolution: {integrity: sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + content-type@2.1.0: + resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==} + engines: {node: '>=18'} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@4.0.3: + resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} + engines: {node: '>= 10'} + + create-objectstack@18.0.0: + resolution: {integrity: sha512-dfTpMCJzZU131GqYQ/txWSKJMBKdpbMcCdMrU1pFs1wmCnXjuK1WlaLmHi8UYmR6iN/Oj4XNzoc2gVi0C8t6dA==} + engines: {node: '>=22.0.0'} + hasBin: true + + croner@10.0.1: + resolution: {integrity: sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g==} + engines: {node: '>=18.0'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + dayjs@1.11.23: + resolution: {integrity: sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dotenv-flow@4.1.0: + resolution: {integrity: sha512-0cwP9jpQBQfyHwvE0cRhraZMkdV45TQedA8AAUZMsFzvmLcQyc1HPv+oX0OOYwLFjIlvgVepQ+WuQHbqDaHJZg==} + engines: {node: '>= 12.0.0'} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + ejs@6.0.1: + resolution: {integrity: sha512-UaaM14yby8U3k02ihS1Bmj5Kz2d7CCQM1scxpgs4Mhkq8F1wR2gl3+Ts4h5Ne4Mnt7M9m4Dw7jsuMr3+xO4vZA==} + engines: {node: '>=0.12.18'} + hasBin: true + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + es-abstract-get@1.0.0: + resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==} + engines: {node: '>= 0.4'} + + es-abstract@1.24.2: + resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.4: + resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==} + engines: {node: '>= 0.4'} + + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventsource-parser@3.1.1: + resolution: {integrity: sha512-EKN1vKAMcZ8MlYMpaNuxN6R9yakzH6uajHcHVTqWJzvu5pWw9DyhbP35HH8MVBQ+dZjAfDxk+A8NiR9KWaXiyQ==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + + exceljs@4.4.0: + resolution: {integrity: sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==} + engines: {node: '>=8.3.0'} + + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + engines: {node: '>=12.0.0'} + + express-rate-limit@8.7.1: + resolution: {integrity: sha512-2FXbqkygil3mZiXzEtM0IjE/UBmBNot0J1GEVrJT4JbrvwOSoEtqtO+wHbiMQELWe1eNvHoYRg2dkjOid+6JkA==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@5.3.0: + resolution: {integrity: sha512-qCqy1xSoaugxOD4IVHb1ZWdkvCF2W3aE2okKouWj8VwJ+ztskSiXoBnCSJqfKT+cVPJhuJqe9YLbY425+Zh00g==} + engines: {node: '>= 18'} + + fast-csv@4.3.6: + resolution: {integrity: sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==} + engines: {node: '>=10.0.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-uri@3.1.9: + resolution: {integrity: sha512-hS/0Wt3Ya043oKXs0sIxrMpKQITXhMLIrVAKKXi4gozGC9v7YRWVnXIZzjNPTO02M9BdxLCWqK1yRXgNziVyJQ==} + + fast-xml-builder@1.3.1: + resolution: {integrity: sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug==} + + fast-xml-parser@5.11.2: + resolution: {integrity: sha512-R9iDuNrQYeQut46cn2r2wHKn4HYzVDvDm5J1wW+koZewykv0yuO2HChTYeZtrULyHIDM9cj9TUXloCsueCQUog==} + hasBin: true + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + fstream@1.0.12: + resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} + engines: {node: '>=0.6'} + deprecated: This package is no longer supported. + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.2.0: + resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + getopts@2.3.0: + resolution: {integrity: sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==} + + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + hono@4.13.13: + resolution: {integrity: sha512-CQ46U0ZkAGmbT/4UxdzzGJpacP2IeKgY4a5/tOI9AABbpOMfK739wfDXmv1usCk+3RkKj1hQy4/fjhiwa2xlrA==} + engines: {node: '>=16.9.0'} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + interpret@2.2.0: + resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} + engines: {node: '>= 0.10'} + + ip-address@10.7.4: + resolution: {integrity: sha512-DWBMKyeM25D70nrIiTkgQth59/G+naKOTep6huF9j+GmeK3DMD60Zvxg5d5qQnz+38AHgou6ean2LECX+lrKDg==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.17.0: + resolution: {integrity: sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-document.all@1.0.0: + resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} + engines: {node: '>= 0.4'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-unsafe@2.0.2: + resolution: {integrity: sha512-HgbIHPBH0KHHCcjLfGsCvhtPTVxjaAZlXjwdz7/GQC40SjSe4sfQsar8J5VFo8JOSbarkpV0OLG95bbaNd9aAQ==} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jose@6.2.13: + resolution: {integrity: sha512-7TIg10ZE1x82YediN+lcrPNvGMKge9yFHQD+Qho/b8y2adfugU3AsvvHfxV0fzyFllT6l9xCjf4RWY9g/Z9PJQ==} + + js-yaml@5.5.0: + resolution: {integrity: sha512-paNr4LFIFPjeeSmwNYdrb8FafLLG/Cr2Af3GjbsHJ5CxIjH4r0c2emlmRdAtpPAieP1gRVzk6buBbVP5gBMGAg==} + hasBin: true + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + + jszip@3.10.2: + resolution: {integrity: sha512-3l+rb15IOWtUhU0H5MFqES/T6Kh7abYwjosBey/vD6hDt8zoEffkSC5Ws5SGtgVw3gBx2NEbhTeSW1+kWkpyTQ==} + + knex@3.3.0: + resolution: {integrity: sha512-LgWl031hNuLv9Lhxdd9093zULa2aNcoP04Bk29e5NidgRcEr/T0rAr2WYi4BhjTiCDoQiRU56meUE5rppLKZzQ==} + engines: {node: '>=16'} + hasBin: true + peerDependencies: + better-sqlite3: '*' + mariadb: '*' + mysql: '*' + mysql2: '*' + pg: '*' + pg-native: '*' + pg-query-stream: ^4.14.0 + sqlite3: '*' + tedious: '*' + peerDependenciesMeta: + better-sqlite3: + optional: true + mariadb: + optional: true + mysql: + optional: true + mysql2: + optional: true + pg: + optional: true + pg-native: + optional: true + pg-query-stream: + optional: true + sqlite3: + optional: true + tedious: + optional: true + + kysely@0.29.7: + resolution: {integrity: sha512-fmIq+7kv4WbFm2tcfznRzikqB4cuNpgZ40PSU2fAJ2/OO5XhojqnTPrmgrCjYSRJVwBln03XcRXJGnw9H099IQ==} + engines: {node: '>=22.0.0'} + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + + lilconfig@3.1.4: + resolution: {integrity: sha512-zJZyBmQhArDRefuWTypZxwDpFDIYmrj8ypSBvwGD5P13Y95s6DjzKgu4DVdGbeQa5PDEsAOCAPNk4X+QOR006w==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + listenercount@1.0.1: + resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.difference@4.5.0: + resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} + + lodash.escaperegexp@4.1.2: + resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} + + lodash.flatten@4.4.0: + resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} + + lodash.groupby@4.6.0: + resolution: {integrity: sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + + lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + + lodash.isnil@4.0.0: + resolution: {integrity: sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isundefined@3.0.1: + resolution: {integrity: sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==} + + lodash.union@4.6.0: + resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + + lru-cache@11.5.3: + resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} + engines: {node: 20 || >=22} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@1.1.1: + resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==} + engines: {node: '>= 0.8'} + + memory-pager@1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + mingo@7.2.5: + resolution: {integrity: sha512-lZR31XnwGQuDHebGyLTlW095BI19qfaYE/IAcVkmBDRyn7DnEwYLQFMfnwFVr+bmc+42a3elhOB2ZBL73i782A==} + + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mongodb-connection-string-url@7.0.2: + resolution: {integrity: sha512-ZoS07RoFqpKYQwAk59qmrx8+jJHNHU30UjlU96QktiGn1ltvDr+vCznLX5DiUBLEpMAHatHNWV1nM/74ul66kA==} + engines: {node: '>=20.19.0'} + + mongodb@7.7.0: + resolution: {integrity: sha512-XG1xXEqyouAV8GCb3PuRaujofeXKpAJAPvXYWZgHl6Dz4QHSJ1nRLl0+GpqaLTwKvC0RFE9truOur34RNFY1nw==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.806.0 + '@mongodb-js/zstd': ^7.0.0 + gcp-metadata: ^7.0.1 + kerberos: ^7.0.0 + mongodb-client-encryption: ^7.2.0 + snappy: ^7.3.2 + socks: ^2.8.6 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.20: + resolution: {integrity: sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@6.0.2: + resolution: {integrity: sha512-hIvVOb9Qr1p/9CNNLOe0OlWvgx/ziTsVwKN/GDSsuArN2K0wDiafP3s0SWmsm7o2BdnyS8Z9Z64NFBUbn6ziBg==} + engines: {node: ^22 || ^24 || >=26} + hasBin: true + + nanostores@1.5.5: + resolution: {integrity: sha512-FixtE239Gl6Gz0ZGCK0WzvNwObNCIwVT+L7zQcf1QgcA6AzBxblzqe9OT88qiucNkhsjSOqiogSaF5jVbJiqSA==} + engines: {node: ^20.0.0 || >=22.0.0} + + negotiator@1.1.0: + resolution: {integrity: sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg==} + engines: {node: '>=18'} + + node-addon-api@8.9.2: + resolution: {integrity: sha512-VijLXbi3UACN69I0JVXJsX4tjACjNoQDgv2gTF6sx2wWEi8tkSg2eX8p5gSIFi8z2+DL3oHmY6OyKce38SDolg==} + engines: {node: ^18 || ^20 || >= 21} + + nodemailer@10.2.1: + resolution: {integrity: sha512-ZrDNsPFoDMwefNs7sJwrYiEJ/CG4ClJWDZv05iNJsEBWa8GRDry1QJHTJxsuTAY9eDDKjX4k+q3SxslXJOao7w==} + engines: {node: '>=20.0.0'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + obug@2.2.1: + resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} + engines: {node: '>=12.20.0'} + + on-finished@2.4.2: + resolution: {integrity: sha512-ATWUv387i+nLD49EiDoOft5scf32Vsdz3ktrQJG9bi7jRFmaXTssvyvj1EmeKVVgvesbqUtvQQvaS2TpTukAZQ==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + own-keys@1.0.2: + resolution: {integrity: sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==} + engines: {node: '>= 0.4'} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-expression-matcher@1.6.2: + resolution: {integrity: sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==} + engines: {node: '>=14.0.0'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pg-connection-string@2.14.1: + resolution: {integrity: sha512-qR3kGNPBLpCNtz0evbKA0Y/MRFXwSSdT+pTJvYp/bXTcReZbvX1kzF0IyTc1QnxqF7AZbOeBhNL8R5mYQZV/MA==} + + pg-connection-string@2.6.2: + resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + + pinyin-pro@3.29.5: + resolution: {integrity: sha512-Fk5YoRmtdHqJWqAuzYVG/NzvzeCbaG+ZEwbY6Nbps3QAIrvQQEtcm49frcyCM8i2b5najnzPDtYqrHRYTTiuwQ==} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postal-mime@4.1.4: + resolution: {integrity: sha512-+6Qsn7Q2TSLMScfN4X2VQIclPRKgDAtKhytQex3fVSV/+HgVaawtsQGzKYDQLQIBR7b4Vfg+88WRGvuF/kwLSw==} + engines: {node: '>=20'} + + postcss@8.5.31: + resolution: {integrity: sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg==} + engines: {node: ^10 || ^12 || >=14} + + powershell-utils@0.1.0: + resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} + engines: {node: '>=20'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + proxy-addr@2.0.8: + resolution: {integrity: sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==} + engines: {node: '>= 0.10'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.16.1: + resolution: {integrity: sha512-5Px6J7rfHBAGUhNQ3es4YzcOdBBw0SDcVtThJml4RdnKw4tKs2epA0kPZ+K8X+WiHktT93RHVcQ/3ym5aTCgtg==} + engines: {node: '>=0.6'} + + quickjs-emscripten-core@0.32.0: + resolution: {integrity: sha512-QFnPfjFey8EqknSrSxe1hZrf1/8z7/6s1QzGOmKo6++02r7QRRX7ZoyNaZh7JuVjWsVW87KnQrbZqnHkOAzUyg==} + + quickjs-emscripten@0.32.0: + resolution: {integrity: sha512-So0Sqw869y/S2oE3Nuc0uT3Dhqgvsj8FSrwBdsuTosVsG8ME5/OcudU1GxsrIFdFABgy17GHnTVO9TYV/bLQcA==} + engines: {node: '>=16.0.0'} + + range-parser@1.3.0: + resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} + engines: {node: '>= 0.6'} + + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + + readdirp@5.1.1: + resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} + engines: {node: '>= 20.19.0'} + + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.13: + resolution: {integrity: sha512-Dj/cW9zBV2aRj6XzCxuGIs3ESZKv02jixne3q6jFZYZ3/Tg09gHHviSMDL4kObh9pqSahdRHEnDoaP2gn8YLhA==} + engines: {node: '>= 0.4'} + hasBin: true + + rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup@4.65.0: + resolution: {integrity: sha512-QVCvQUTGDN6JRwi3jVGCY3H4aTHvi9rX0LyoBMkGUvdh/Z6O51CzcLz85BWZaTCDGhl6ySGqYZs+xI1jmPqGcw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rou3@0.9.2: + resolution: {integrity: sha512-3SOzvaAg8rkHrXtRjpCvCvbyO5to9oOO27Z/XqHEYXfMRVSw/qMIVdmaOk9W2lcRLtR6dlqTjo9hDeJk70QBYQ==} + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + samlify@2.15.1: + resolution: {integrity: sha512-peZitMO2cAnf0pY45H0yw0Drqmby7U91yRovH3AH8TdwYCNRnmidVORXIjcK+21cBk3Mjl8EVz8Nvuw/v20rAw==} + + saxes@5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + + set-cookie-parser@3.2.1: + resolution: {integrity: sha512-Npd1Pt+4zb3BrSZDPd2qFwRpS6b1EUEasRrO8xS0zMJi0fApXXK5YuzP0minyJnxwnFHoVoJwA55q0A0cu63gQ==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + source-map-js@1.2.2: + resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} + engines: {node: '>=0.10.0'} + + sparse-bitfield@3.0.3: + resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + + sql.js@1.15.1: + resolution: {integrity: sha512-i0M/6s+lcl67Flm/1m8/AeVU5caDramlILXU/udUwpTQym2qKMSe2sJiXB5d5WXFB272aj4B2v1JbtQ93ID3Pg==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string.prototype.trim@1.2.11: + resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.10: + resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strnum@2.5.1: + resolution: {integrity: sha512-UM4nTLWzQiDBseVxUGxN0wJzIk0UU89Qi7pKXz9qISo+lhviJikTuikBsK/oFRlpvYHvSdz0TVoLyQ+sEpYwxA==} + + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tarn@3.1.2: + resolution: {integrity: sha512-3RTvqKZcK/17jnJ8rMKFXbyNogywTs1z0gVPPwFsJGX46rkmUHOdIaSQ/aVO1rS7nH+soiXiWk7rvUXxndm8Dg==} + engines: {node: '>=8.0.0'} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tildify@2.0.0: + resolution: {integrity: sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==} + engines: {node: '>=8'} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@1.3.1: + resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} + engines: {node: '>=18'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + tinyrainbow@3.2.0: + resolution: {integrity: sha512-LgO3D9yZJjApUiuUfl9iFAwrtaX4+lok3wJIqttGoKCHlWUqHqbQpnxCf82L8FjgKsh4iGo78hqJwgL8F6To2A==} + engines: {node: '>=14.0.0'} + + tldts-core@7.4.19: + resolution: {integrity: sha512-goNXV6Ho9TIOfpJZanTd6CKG5DyYgYAL+k+22T0SLh8l6+KHIfBUPFuePuSZv05UttIaaLmI9tb7TmGIdK5AkQ==} + + tldts@7.4.19: + resolution: {integrity: sha512-48dH6aSpQnpbzDUc4vIQZ1VjB8tkK+e8c1yx05/SZK+rkssgjEOlxDd/yU8/a4vGYQ9vRgJr9dwMq9TJ0b3X2Q==} + hasBin: true + + tmp@0.2.7: + resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} + engines: {node: '>=14.14'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + + traverse@0.3.10: + resolution: {integrity: sha512-pd6fq5qmiFuPA3TpdqBCqJXlOrSdCSt0l9IZDg83Vbf4x3m/X18prEwMMVM5LXp9vGL9NxjeiDGBrTasqyngXQ==} + engines: {node: '>= 0.4'} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + ts-morph@28.0.0: + resolution: {integrity: sha512-Wp3tnZ2bzwxyTZMtgWVzXDfm7lB1Drz+y9DmmYH/L702PQhPyVrp3pkou3yIz4qjS14GY9kcpmLiOOMvl8oG1g==} + + tsx@4.23.15: + resolution: {integrity: sha512-Yiex1Ovn8z2xPpOWckIiysV1SSyRMY9BkLF++q0yKiDxCqRhosKfMg3janKkiLBwZ5c/YryloKwGZcrEmtwxKw==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.5: + resolution: {integrity: sha512-0FHJvLPqZ7KJzp17O13jfsAjsqazgrxBu2zEK95PmUz8lv2+GjRuxUInCr2Rk9Dms3ihN21zJ929ZO43yJ95QQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.8: + resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} + engines: {node: '>= 0.4'} + + typedarray.prototype.slice@1.0.6: + resolution: {integrity: sha512-r+7YvGfM5TkTiDQ5EqWi/Z4L4KP3jUI+YCmTtWg1tmTHUw6xladLJqzR2heMaHBIM0TTFLZmn/EkIaEHYs/bIA==} + engines: {node: '>= 0.4'} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unzipper@0.10.14: + resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). + hasBin: true + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite@7.3.7: + resolution: {integrity: sha512-AHEzTORMbi7/7aXp7w7KZ5+DCUdSeLsJz0grY8xHpc9DHdYb0vQu6DqJfm2tOw3gDExNgPgnJTXxM6syYFHaCA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@4.0.18: + resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.18 + '@vitest/browser-preview': 4.0.18 + '@vitest/browser-webdriverio': 4.0.18 + '@vitest/ui': 4.0.18 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.24: + resolution: {integrity: sha512-wk4Mf4pR5mRP7eYuuTBCIQ9d0ud2Fv2jRLQpfgnRjbOxAFHmjKFValgTpitVKzJJS8ajnYQV2Du1SZ8j6b/EUQ==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + wsl-utils@0.4.0: + resolution: {integrity: sha512-9YmF+2sFEd+T7TkwlmE337F0IVzfDvDknhtpBQxxXzEOfgPphGlFYpyx0cTuCIFj8/p+sqwBYAeGxOMNSzPPDA==} + engines: {node: '>=20'} + + xml-crypto@6.4.0: + resolution: {integrity: sha512-d21ModhBO/+QWWAmOjyDeQJuHNmsR/HtOxyBchiTbKfGNKuHYwQNd+SlLhwyyrwoAGLp4Qc6BQ7nAtnM47dHSQ==} + engines: {node: '>=16'} + + xml-escape@1.1.0: + resolution: {integrity: sha512-B/T4sDK8Z6aUh/qNr7mjKAwwncIljFuUP+DO/D5hloYFj+90O88z8Wf7oSucZTHxBAsC1/CTP4rtx/x1Uf72Mg==} + + xml-naming@0.3.0: + resolution: {integrity: sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==} + engines: {node: '>=16.0.0'} + + xml@1.0.1: + resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + xpath@0.0.33: + resolution: {integrity: sha512-NNXnzrkDrAzalLhIUc01jO2mOzXGXh1JwPgkihcLLzw98c0WgYDmmjSh1Kl3wzaxSVWMuA+fe0WTWOBDWCBmNA==} + engines: {node: '>=0.6.0'} + + xpath@0.0.35: + resolution: {integrity: sha512-8O+m2N04SwLpGw/1Grz2HD8ejnWDV7M1dMPgKKuOjhYh5W9H4pel/+06kInohIdpS2FeSbL4i8ID8c4tpxwq9Q==} + engines: {node: '>=0.6.0'} + + yaml@2.9.1: + resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==} + engines: {node: '>= 14.6'} + hasBin: true + + zip-stream@4.1.1: + resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} + engines: {node: '>= 10'} + + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + + zod@4.6.7: + resolution: {integrity: sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==} + +snapshots: + + '@authenio/xml-encryption@6.0.2': + dependencies: + '@xmldom/xmldom': 0.8.15 + escape-html: 1.0.3 + + '@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)': + dependencies: + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.1 + '@opentelemetry/semantic-conventions': 1.43.0 + '@standard-schema/spec': 1.1.0 + better-call: 1.4.0(zod@4.6.7) + jose: 6.2.13 + kysely: 0.29.7 + nanostores: 1.5.5 + zod: 4.6.7 + + '@better-auth/core@1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5)': + dependencies: + '@better-auth/utils': 0.5.0 + '@better-fetch/fetch': 1.3.1 + '@opentelemetry/semantic-conventions': 1.43.0 + '@standard-schema/spec': 1.1.0 + better-call: 1.4.0(zod@4.6.7) + jose: 6.2.13 + kysely: 0.29.7 + nanostores: 1.5.5 + zod: 4.6.7 + + '@better-auth/drizzle-adapter@1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.4.2)': + dependencies: + '@better-auth/core': 1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/utils': 0.4.2 + + '@better-auth/kysely-adapter@1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(kysely@0.29.7)': + dependencies: + '@better-auth/core': 1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/utils': 0.4.2 + optionalDependencies: + kysely: 0.29.7 + + '@better-auth/memory-adapter@1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.4.2)': + dependencies: + '@better-auth/core': 1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/utils': 0.4.2 + + '@better-auth/mongo-adapter@1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(mongodb@7.7.0)': + dependencies: + '@better-auth/core': 1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/utils': 0.4.2 + optionalDependencies: + mongodb: 7.7.0 + + '@better-auth/oauth-provider@1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-auth@1.7.3(better-sqlite3@13.0.3)(mongodb@7.7.0)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)))(better-call@1.4.0(zod@4.6.7))': + dependencies: + '@better-auth/core': 1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/utils': 0.5.0 + '@better-fetch/fetch': 1.3.1 + better-auth: 1.7.3(better-sqlite3@13.0.3)(mongodb@7.7.0)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)) + better-call: 1.4.0(zod@4.6.7) + jose: 6.2.13 + zod: 4.6.7 + + '@better-auth/prisma-adapter@1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.4.2)': + dependencies: + '@better-auth/core': 1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/utils': 0.4.2 + + '@better-auth/scim@1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)(better-auth@1.7.3(better-sqlite3@13.0.3)(mongodb@7.7.0)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)))(better-call@1.4.0(zod@4.6.7))': + dependencies: + '@better-auth/core': 1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/utils': 0.5.0 + '@noble/hashes': 2.4.0 + better-auth: 1.7.3(better-sqlite3@13.0.3)(mongodb@7.7.0)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)) + better-call: 1.4.0(zod@4.6.7) + zod: 4.6.7 + + '@better-auth/sso@1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-auth@1.7.3(better-sqlite3@13.0.3)(mongodb@7.7.0)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)))(better-call@1.4.0(zod@4.6.7))': + dependencies: + '@better-auth/core': 1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/utils': 0.5.0 + '@better-fetch/fetch': 1.3.1 + '@xmldom/xmldom': 0.9.12 + better-auth: 1.7.3(better-sqlite3@13.0.3)(mongodb@7.7.0)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)) + better-call: 1.4.0(zod@4.6.7) + fast-xml-parser: 5.11.2 + jose: 6.2.13 + samlify: 2.15.1 + tldts: 7.4.19 + zod: 4.6.7 + + '@better-auth/telemetry@1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)': + dependencies: + '@better-auth/core': 1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.1 + + '@better-auth/utils@0.4.2': + dependencies: + '@noble/hashes': 2.4.0 + + '@better-auth/utils@0.5.0': + dependencies: + '@noble/hashes': 2.4.0 + + '@better-fetch/fetch@1.3.1': {} + + '@esbuild/aix-ppc64@0.28.2': + optional: true + + '@esbuild/android-arm64@0.28.2': + optional: true + + '@esbuild/android-arm@0.28.2': + optional: true + + '@esbuild/android-x64@0.28.2': + optional: true + + '@esbuild/darwin-arm64@0.28.2': + optional: true + + '@esbuild/darwin-x64@0.28.2': + optional: true + + '@esbuild/freebsd-arm64@0.28.2': + optional: true + + '@esbuild/freebsd-x64@0.28.2': + optional: true + + '@esbuild/linux-arm64@0.28.2': + optional: true + + '@esbuild/linux-arm@0.28.2': + optional: true + + '@esbuild/linux-ia32@0.28.2': + optional: true + + '@esbuild/linux-loong64@0.28.2': + optional: true + + '@esbuild/linux-mips64el@0.28.2': + optional: true + + '@esbuild/linux-ppc64@0.28.2': + optional: true + + '@esbuild/linux-riscv64@0.28.2': + optional: true + + '@esbuild/linux-s390x@0.28.2': + optional: true + + '@esbuild/linux-x64@0.28.2': + optional: true + + '@esbuild/netbsd-arm64@0.28.2': + optional: true + + '@esbuild/netbsd-x64@0.28.2': + optional: true + + '@esbuild/openbsd-arm64@0.28.2': + optional: true + + '@esbuild/openbsd-x64@0.28.2': + optional: true + + '@esbuild/openharmony-arm64@0.28.2': + optional: true + + '@esbuild/sunos-x64@0.28.2': + optional: true + + '@esbuild/win32-arm64@0.28.2': + optional: true + + '@esbuild/win32-ia32@0.28.2': + optional: true + + '@esbuild/win32-x64@0.28.2': + optional: true + + '@fast-csv/format@4.3.5': + dependencies: + '@types/node': 14.18.63 + lodash.escaperegexp: 4.1.2 + lodash.isboolean: 3.0.3 + lodash.isequal: 4.5.0 + lodash.isfunction: 3.0.9 + lodash.isnil: 4.0.0 + + '@fast-csv/parse@4.3.6': + dependencies: + '@types/node': 14.18.63 + lodash.escaperegexp: 4.1.2 + lodash.groupby: 4.6.0 + lodash.isfunction: 3.0.9 + lodash.isnil: 4.0.0 + lodash.isundefined: 3.0.1 + lodash.uniq: 4.5.0 + + '@hono/node-server@2.1.5(hono@4.13.13)': + dependencies: + hono: 4.13.13 + + '@jitl/quickjs-ffi-types@0.32.0': {} + + '@jitl/quickjs-wasmfile-debug-asyncify@0.32.0': + dependencies: + '@jitl/quickjs-ffi-types': 0.32.0 + + '@jitl/quickjs-wasmfile-debug-sync@0.32.0': + dependencies: + '@jitl/quickjs-ffi-types': 0.32.0 + + '@jitl/quickjs-wasmfile-release-asyncify@0.32.0': + dependencies: + '@jitl/quickjs-ffi-types': 0.32.0 + + '@jitl/quickjs-wasmfile-release-sync@0.32.0': + dependencies: + '@jitl/quickjs-ffi-types': 0.32.0 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.6.0': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.6.0 + + '@marcbachmann/cel-js@8.0.0': {} + + '@modelcontextprotocol/sdk@1.32.1(zod@4.6.7)': + dependencies: + '@hono/node-server': 2.1.5(hono@4.13.13) + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.1.1 + express: 5.3.0 + express-rate-limit: 8.7.1(express@5.3.0) + hono: 4.13.13 + jose: 6.2.13 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 4.6.7 + zod-to-json-schema: 3.25.2(zod@4.6.7) + transitivePeerDependencies: + - supports-color + + '@mongodb-js/saslprep@1.6.1': + dependencies: + sparse-bitfield: 3.0.3 + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true + + '@noble/ciphers@2.4.0': {} + + '@noble/hashes@2.4.0': {} + + '@nodable/entities@3.1.0': {} + + '@objectstack/account@18.0.0': + dependencies: + '@objectstack/platform-objects': 18.0.0 + '@objectstack/spec': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/cli@18.0.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(kysely@0.29.7)(mongodb@7.7.0)(nanostores@1.5.5)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1))': + dependencies: + '@objectstack/account': 18.0.0 + '@objectstack/client': 18.0.0 + '@objectstack/cloud-connection': 18.0.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.7)(mongodb@7.7.0)(nanostores@1.5.5)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)) + '@objectstack/console': 18.0.0 + '@objectstack/core': 18.0.0 + '@objectstack/driver-memory': 18.0.0 + '@objectstack/driver-mongodb': 18.0.0 + '@objectstack/driver-sql': 18.0.0 + '@objectstack/driver-sqlite-wasm': 18.0.0(better-sqlite3@13.0.3) + '@objectstack/formula': 18.0.0 + '@objectstack/lint': 18.0.0 + '@objectstack/mcp': 18.0.0 + '@objectstack/metadata': 18.0.0 + '@objectstack/metadata-core': 18.0.0 + '@objectstack/metadata-protocol': 18.0.0 + '@objectstack/objectql': 18.0.0 + '@objectstack/observability': 18.0.0 + '@objectstack/platform-objects': 18.0.0 + '@objectstack/plugin-approvals': 18.0.0 + '@objectstack/plugin-audit': 18.0.0 + '@objectstack/plugin-auth': 18.0.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.7)(mongodb@7.7.0)(nanostores@1.5.5)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)) + '@objectstack/plugin-email': 18.0.0 + '@objectstack/plugin-hono-server': 18.0.0 + '@objectstack/plugin-pinyin-search': 18.0.0 + '@objectstack/plugin-security': 18.0.0 + '@objectstack/plugin-sharing': 18.0.0 + '@objectstack/plugin-webhooks': 18.0.0 + '@objectstack/rest': 18.0.0 + '@objectstack/runtime': 18.0.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.7)(mongodb@7.7.0)(nanostores@1.5.5)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)) + '@objectstack/service-analytics': 18.0.0 + '@objectstack/service-automation': 18.0.0 + '@objectstack/service-cache': 18.0.0 + '@objectstack/service-datasource': 18.0.0(@objectstack/driver-mongodb@18.0.0)(@objectstack/driver-sqlite-wasm@18.0.0(better-sqlite3@13.0.3)) + '@objectstack/service-job': 18.0.0 + '@objectstack/service-mailbox': 18.0.0 + '@objectstack/service-messaging': 18.0.0 + '@objectstack/service-package': 18.0.0 + '@objectstack/service-queue': 18.0.0 + '@objectstack/service-realtime': 18.0.0 + '@objectstack/service-settings': 18.0.0 + '@objectstack/service-sms': 18.0.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.7)(mongodb@7.7.0)(nanostores@1.5.5)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)) + '@objectstack/service-storage': 18.0.0 + '@objectstack/setup': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/trigger-api': 18.0.0 + '@objectstack/trigger-record-change': 18.0.0 + '@objectstack/trigger-schedule': 18.0.0 + '@objectstack/types': 18.0.0 + '@objectstack/verify': 18.0.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(@objectstack/driver-mongodb@18.0.0)(@objectstack/driver-sqlite-wasm@18.0.0(better-sqlite3@13.0.3))(better-call@1.4.0(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.7)(mongodb@7.7.0)(nanostores@1.5.5)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)) + '@oclif/core': 5.1.9 + bundle-require: 5.1.0(esbuild@0.28.2) + chalk: 6.0.1 + chokidar: 5.0.0 + create-objectstack: 18.0.0 + dotenv-flow: 4.1.0 + esbuild: 0.28.2 + ts-morph: 28.0.0 + tsx: 4.23.15 + yaml: 2.9.1 + zod: 4.6.7 + optionalDependencies: + better-sqlite3: 13.0.3 + transitivePeerDependencies: + - '@aws-sdk/client-s3' + - '@aws-sdk/credential-providers' + - '@aws-sdk/s3-request-presigner' + - '@better-auth/utils' + - '@better-fetch/fetch' + - '@cfworker/json-schema' + - '@cloudflare/workers-types' + - '@lynx-js/react' + - '@mongodb-js/zstd' + - '@opentelemetry/api' + - '@prisma/client' + - '@sveltejs/kit' + - '@tanstack/react-start' + - '@tanstack/solid-start' + - ai + - better-call + - drizzle-kit + - drizzle-orm + - gcp-metadata + - kerberos + - kysely + - mariadb + - mongodb + - mongodb-client-encryption + - mysql + - mysql2 + - nanostores + - next + - pg + - pg-native + - pg-query-stream + - prisma + - react + - react-dom + - snappy + - socks + - solid-js + - sqlite3 + - supports-color + - svelte + - tedious + - vitest + - vue + + '@objectstack/client@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/spec': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/cloud-connection@18.0.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.7)(mongodb@7.7.0)(nanostores@1.5.5)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1))': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/metadata-core': 18.0.0 + '@objectstack/metadata-protocol': 18.0.0 + '@objectstack/objectql': 18.0.0 + '@objectstack/runtime': 18.0.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.7)(mongodb@7.7.0)(nanostores@1.5.5)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)) + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@better-auth/utils' + - '@better-fetch/fetch' + - '@cloudflare/workers-types' + - '@lynx-js/react' + - '@mongodb-js/zstd' + - '@objectstack/driver-turso' + - '@opentelemetry/api' + - '@prisma/client' + - '@sveltejs/kit' + - '@tanstack/react-start' + - '@tanstack/solid-start' + - ai + - better-call + - better-sqlite3 + - drizzle-kit + - drizzle-orm + - gcp-metadata + - kerberos + - kysely + - mariadb + - mongodb + - mongodb-client-encryption + - mysql + - mysql2 + - nanostores + - next + - pg + - pg-native + - pg-query-stream + - prisma + - react + - react-dom + - snappy + - socks + - solid-js + - sqlite3 + - supports-color + - svelte + - tedious + - vitest + - vue + + '@objectstack/connector-imap@18.0.0': {} + + '@objectstack/console@18.0.0': {} + + '@objectstack/core@18.0.0': + dependencies: + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + zod: 4.6.7 + transitivePeerDependencies: + - ai + + '@objectstack/driver-memory@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + mingo: 7.2.5 + transitivePeerDependencies: + - ai + + '@objectstack/driver-mongodb@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + mongodb: 7.7.0 + nanoid: 6.0.2 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - ai + - gcp-metadata + - kerberos + - mongodb-client-encryption + - snappy + - socks + + '@objectstack/driver-sql@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/observability': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + knex: 3.3.0(better-sqlite3@13.0.3) + nanoid: 6.0.2 + optionalDependencies: + better-sqlite3: 13.0.3 + transitivePeerDependencies: + - ai + - mariadb + - mysql + - pg-native + - pg-query-stream + - sqlite3 + - supports-color + + '@objectstack/driver-sqlite-wasm@18.0.0(better-sqlite3@13.0.3)': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/driver-sql': 18.0.0 + '@objectstack/spec': 18.0.0 + knex: 3.3.0(better-sqlite3@13.0.3) + nanoid: 6.0.2 + sql.js: 1.15.1 + transitivePeerDependencies: + - ai + - better-sqlite3 + - mariadb + - mysql + - mysql2 + - pg + - pg-native + - pg-query-stream + - sqlite3 + - supports-color + - tedious + + '@objectstack/formula@18.0.0': + dependencies: + '@marcbachmann/cel-js': 8.0.0 + '@objectstack/spec': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/lint@18.0.0': + dependencies: + '@objectstack/formula': 18.0.0 + '@objectstack/sdui-parser': 18.0.0 + '@objectstack/spec': 18.0.0 + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + sucrase: 3.35.1 + typescript: 6.0.3 + transitivePeerDependencies: + - ai + + '@objectstack/mcp@18.0.0': + dependencies: + '@modelcontextprotocol/sdk': 1.32.1(zod@4.6.7) + '@objectstack/core': 18.0.0 + '@objectstack/formula': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + zod: 4.6.7 + transitivePeerDependencies: + - '@cfworker/json-schema' + - ai + - supports-color + + '@objectstack/metadata-core@18.0.0': + dependencies: + '@objectstack/spec': 18.0.0 + zod: 4.6.7 + transitivePeerDependencies: + - ai + + '@objectstack/metadata-fs@18.0.0': + dependencies: + '@objectstack/metadata-core': 18.0.0 + chokidar: 5.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/metadata-protocol@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/formula': 18.0.0 + '@objectstack/lint': 18.0.0 + '@objectstack/metadata': 18.0.0 + '@objectstack/metadata-core': 18.0.0 + '@objectstack/sdui-parser': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + zod: 4.6.7 + transitivePeerDependencies: + - ai + + '@objectstack/metadata@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/metadata-core': 18.0.0 + '@objectstack/metadata-fs': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + chokidar: 5.0.0 + glob: 13.0.6 + js-yaml: 5.5.0 + zod: 4.6.7 + transitivePeerDependencies: + - ai + + '@objectstack/objectql@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/formula': 18.0.0 + '@objectstack/metadata': 18.0.0 + '@objectstack/metadata-core': 18.0.0 + '@objectstack/metadata-protocol': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + zod: 4.6.7 + transitivePeerDependencies: + - ai + + '@objectstack/observability@18.0.0': + dependencies: + '@objectstack/spec': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/platform-objects@18.0.0': + dependencies: + '@objectstack/metadata-core': 18.0.0 + '@objectstack/spec': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/plugin-approvals@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/formula': 18.0.0 + '@objectstack/metadata-core': 18.0.0 + '@objectstack/platform-objects': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/plugin-audit@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/metadata-core': 18.0.0 + '@objectstack/objectql': 18.0.0 + '@objectstack/platform-objects': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/plugin-auth@18.0.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.7)(mongodb@7.7.0)(nanostores@1.5.5)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1))': + dependencies: + '@better-auth/core': 1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/oauth-provider': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-auth@1.7.3(better-sqlite3@13.0.3)(mongodb@7.7.0)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)))(better-call@1.4.0(zod@4.6.7)) + '@better-auth/scim': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)(better-auth@1.7.3(better-sqlite3@13.0.3)(mongodb@7.7.0)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)))(better-call@1.4.0(zod@4.6.7)) + '@better-auth/sso': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-auth@1.7.3(better-sqlite3@13.0.3)(mongodb@7.7.0)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)))(better-call@1.4.0(zod@4.6.7)) + '@noble/hashes': 2.4.0 + '@objectstack/core': 18.0.0 + '@objectstack/platform-objects': 18.0.0 + '@objectstack/rest': 18.0.0 + '@objectstack/service-messaging': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + better-auth: 1.7.3(better-sqlite3@13.0.3)(mongodb@7.7.0)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)) + jose: 6.2.13 + transitivePeerDependencies: + - '@better-auth/utils' + - '@better-fetch/fetch' + - '@cloudflare/workers-types' + - '@lynx-js/react' + - '@opentelemetry/api' + - '@prisma/client' + - '@sveltejs/kit' + - '@tanstack/react-start' + - '@tanstack/solid-start' + - ai + - better-call + - better-sqlite3 + - drizzle-kit + - drizzle-orm + - kysely + - mongodb + - mysql2 + - nanostores + - next + - pg + - prisma + - react + - react-dom + - solid-js + - svelte + - vitest + - vue + + '@objectstack/plugin-email@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/formula': 18.0.0 + '@objectstack/platform-objects': 18.0.0 + '@objectstack/spec': 18.0.0 + nodemailer: 10.2.1 + transitivePeerDependencies: + - ai + + '@objectstack/plugin-hono-server@18.0.0': + dependencies: + '@hono/node-server': 2.1.5(hono@4.13.13) + '@objectstack/core': 18.0.0 + '@objectstack/observability': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + hono: 4.13.13 + transitivePeerDependencies: + - ai + + '@objectstack/plugin-pinyin-search@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/objectql': 18.0.0 + '@objectstack/types': 18.0.0 + pinyin-pro: 3.29.5 + transitivePeerDependencies: + - ai + + '@objectstack/plugin-security@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/formula': 18.0.0 + '@objectstack/metadata-core': 18.0.0 + '@objectstack/platform-objects': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/plugin-sharing@18.0.0': + dependencies: + '@noble/hashes': 2.4.0 + '@objectstack/core': 18.0.0 + '@objectstack/formula': 18.0.0 + '@objectstack/metadata-core': 18.0.0 + '@objectstack/objectql': 18.0.0 + '@objectstack/platform-objects': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/plugin-webhooks@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/platform-objects': 18.0.0 + '@objectstack/service-messaging': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/rest@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/metadata': 18.0.0 + '@objectstack/metadata-core': 18.0.0 + '@objectstack/observability': 18.0.0 + '@objectstack/platform-objects': 18.0.0 + '@objectstack/service-package': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + exceljs: 4.4.0 + zod: 4.6.7 + transitivePeerDependencies: + - ai + + '@objectstack/runtime@18.0.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.7)(mongodb@7.7.0)(nanostores@1.5.5)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1))': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/driver-memory': 18.0.0 + '@objectstack/driver-sql': 18.0.0 + '@objectstack/driver-sqlite-wasm': 18.0.0(better-sqlite3@13.0.3) + '@objectstack/formula': 18.0.0 + '@objectstack/metadata': 18.0.0 + '@objectstack/metadata-core': 18.0.0 + '@objectstack/metadata-protocol': 18.0.0 + '@objectstack/objectql': 18.0.0 + '@objectstack/observability': 18.0.0 + '@objectstack/plugin-auth': 18.0.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.7)(mongodb@7.7.0)(nanostores@1.5.5)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)) + '@objectstack/plugin-security': 18.0.0 + '@objectstack/rest': 18.0.0 + '@objectstack/service-cluster': 18.0.0 + '@objectstack/service-datasource': 18.0.0(@objectstack/driver-mongodb@18.0.0)(@objectstack/driver-sqlite-wasm@18.0.0(better-sqlite3@13.0.3)) + '@objectstack/service-i18n': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + quickjs-emscripten: 0.32.0 + zod: 4.6.7 + optionalDependencies: + '@objectstack/driver-mongodb': 18.0.0 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@better-auth/utils' + - '@better-fetch/fetch' + - '@cloudflare/workers-types' + - '@lynx-js/react' + - '@mongodb-js/zstd' + - '@opentelemetry/api' + - '@prisma/client' + - '@sveltejs/kit' + - '@tanstack/react-start' + - '@tanstack/solid-start' + - ai + - better-call + - better-sqlite3 + - drizzle-kit + - drizzle-orm + - gcp-metadata + - kerberos + - kysely + - mariadb + - mongodb + - mongodb-client-encryption + - mysql + - mysql2 + - nanostores + - next + - pg + - pg-native + - pg-query-stream + - prisma + - react + - react-dom + - snappy + - socks + - solid-js + - sqlite3 + - supports-color + - svelte + - tedious + - vitest + - vue + + '@objectstack/sdui-parser@18.0.0': {} + + '@objectstack/service-analytics@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/service-automation@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/formula': 18.0.0 + '@objectstack/metadata-core': 18.0.0 + '@objectstack/metadata-protocol': 18.0.0 + '@objectstack/platform-objects': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/service-cache@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/observability': 18.0.0 + '@objectstack/spec': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/service-cluster@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/spec': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/service-datasource@18.0.0(@objectstack/driver-mongodb@18.0.0)(@objectstack/driver-sqlite-wasm@18.0.0(better-sqlite3@13.0.3))': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/driver-memory': 18.0.0 + '@objectstack/driver-sql': 18.0.0 + '@objectstack/metadata-core': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + pg-connection-string: 2.14.1 + optionalDependencies: + '@objectstack/driver-mongodb': 18.0.0 + '@objectstack/driver-sqlite-wasm': 18.0.0(better-sqlite3@13.0.3) + transitivePeerDependencies: + - ai + - mariadb + - mysql + - mysql2 + - pg + - pg-native + - pg-query-stream + - sqlite3 + - supports-color + - tedious + + '@objectstack/service-i18n@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/service-job@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/platform-objects': 18.0.0 + '@objectstack/spec': 18.0.0 + croner: 10.0.1 + transitivePeerDependencies: + - ai + + '@objectstack/service-mailbox@18.0.0': + dependencies: + '@objectstack/connector-imap': 18.0.0 + '@objectstack/core': 18.0.0 + '@objectstack/platform-objects': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + postal-mime: 4.1.4 + transitivePeerDependencies: + - ai + + '@objectstack/service-messaging@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/platform-objects': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/service-package@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/metadata-core': 18.0.0 + '@objectstack/spec': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/service-queue@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/platform-objects': 18.0.0 + '@objectstack/spec': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/service-realtime@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/platform-objects': 18.0.0 + '@objectstack/spec': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/service-settings@18.0.0': + dependencies: + '@noble/ciphers': 2.4.0 + '@objectstack/core': 18.0.0 + '@objectstack/platform-objects': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/service-sms@18.0.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.7)(mongodb@7.7.0)(nanostores@1.5.5)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1))': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/plugin-auth': 18.0.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.7)(mongodb@7.7.0)(nanostores@1.5.5)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)) + '@objectstack/spec': 18.0.0 + transitivePeerDependencies: + - '@better-auth/utils' + - '@better-fetch/fetch' + - '@cloudflare/workers-types' + - '@lynx-js/react' + - '@opentelemetry/api' + - '@prisma/client' + - '@sveltejs/kit' + - '@tanstack/react-start' + - '@tanstack/solid-start' + - ai + - better-call + - better-sqlite3 + - drizzle-kit + - drizzle-orm + - kysely + - mongodb + - mysql2 + - nanostores + - next + - pg + - prisma + - react + - react-dom + - solid-js + - svelte + - vitest + - vue + + '@objectstack/service-storage@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/observability': 18.0.0 + '@objectstack/platform-objects': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/setup@18.0.0': + dependencies: + '@objectstack/platform-objects': 18.0.0 + '@objectstack/spec': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/skills@18.0.0': {} + + '@objectstack/spec@18.0.0': + dependencies: + pg-connection-string: 2.14.1 + zod: 4.6.7 + + '@objectstack/trigger-api@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/spec': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/trigger-record-change@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/spec': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/trigger-schedule@18.0.0': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/metadata-core': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/types': 18.0.0 + croner: 10.0.1 + transitivePeerDependencies: + - ai + + '@objectstack/types@18.0.0': + dependencies: + '@objectstack/spec': 18.0.0 + transitivePeerDependencies: + - ai + + '@objectstack/verify@18.0.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(@objectstack/driver-mongodb@18.0.0)(@objectstack/driver-sqlite-wasm@18.0.0(better-sqlite3@13.0.3))(better-call@1.4.0(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.7)(mongodb@7.7.0)(nanostores@1.5.5)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1))': + dependencies: + '@objectstack/core': 18.0.0 + '@objectstack/mcp': 18.0.0 + '@objectstack/metadata': 18.0.0 + '@objectstack/objectql': 18.0.0 + '@objectstack/platform-objects': 18.0.0 + '@objectstack/plugin-approvals': 18.0.0 + '@objectstack/plugin-audit': 18.0.0 + '@objectstack/plugin-auth': 18.0.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.7)(mongodb@7.7.0)(nanostores@1.5.5)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)) + '@objectstack/plugin-email': 18.0.0 + '@objectstack/plugin-hono-server': 18.0.0 + '@objectstack/plugin-pinyin-search': 18.0.0 + '@objectstack/plugin-security': 18.0.0 + '@objectstack/plugin-sharing': 18.0.0 + '@objectstack/plugin-webhooks': 18.0.0 + '@objectstack/rest': 18.0.0 + '@objectstack/runtime': 18.0.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.7)(mongodb@7.7.0)(nanostores@1.5.5)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)) + '@objectstack/service-analytics': 18.0.0 + '@objectstack/service-automation': 18.0.0 + '@objectstack/service-cache': 18.0.0 + '@objectstack/service-datasource': 18.0.0(@objectstack/driver-mongodb@18.0.0)(@objectstack/driver-sqlite-wasm@18.0.0(better-sqlite3@13.0.3)) + '@objectstack/service-job': 18.0.0 + '@objectstack/service-mailbox': 18.0.0 + '@objectstack/service-messaging': 18.0.0 + '@objectstack/service-package': 18.0.0 + '@objectstack/service-queue': 18.0.0 + '@objectstack/service-realtime': 18.0.0 + '@objectstack/service-settings': 18.0.0 + '@objectstack/service-sms': 18.0.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.7)(mongodb@7.7.0)(nanostores@1.5.5)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)) + '@objectstack/service-storage': 18.0.0 + '@objectstack/spec': 18.0.0 + '@objectstack/trigger-api': 18.0.0 + '@objectstack/trigger-record-change': 18.0.0 + '@objectstack/trigger-schedule': 18.0.0 + '@objectstack/types': 18.0.0 + transitivePeerDependencies: + - '@aws-sdk/client-s3' + - '@aws-sdk/credential-providers' + - '@aws-sdk/s3-request-presigner' + - '@better-auth/utils' + - '@better-fetch/fetch' + - '@cfworker/json-schema' + - '@cloudflare/workers-types' + - '@lynx-js/react' + - '@mongodb-js/zstd' + - '@objectstack/driver-mongodb' + - '@objectstack/driver-sqlite-wasm' + - '@objectstack/driver-turso' + - '@opentelemetry/api' + - '@prisma/client' + - '@sveltejs/kit' + - '@tanstack/react-start' + - '@tanstack/solid-start' + - ai + - better-call + - better-sqlite3 + - drizzle-kit + - drizzle-orm + - gcp-metadata + - kerberos + - kysely + - mariadb + - mongodb + - mongodb-client-encryption + - mysql + - mysql2 + - nanostores + - next + - pg + - pg-native + - pg-query-stream + - prisma + - react + - react-dom + - snappy + - socks + - solid-js + - sqlite3 + - supports-color + - svelte + - tedious + - vitest + - vue + + '@oclif/core@5.1.9': + dependencies: + ansi-escapes: 4.3.2 + ansis: 3.17.0 + clean-stack: 3.0.1 + cli-spinners: 2.9.2 + debug: 4.4.3(supports-color@8.1.1) + ejs: 6.0.1 + get-package-type: 0.1.0 + indent-string: 4.0.0 + lilconfig: 3.1.4 + minimatch: 10.2.6 + semver: 7.8.5 + string-width: 4.2.3 + supports-color: 8.1.1 + tinyglobby: 0.2.17 + widest-line: 3.1.0 + wordwrap: 1.0.0 + wrap-ansi: 7.0.0 + wsl-utils: 0.4.0 + + '@opentelemetry/semantic-conventions@1.43.0': {} + + '@rollup/rollup-android-arm-eabi@4.65.0': + optional: true + + '@rollup/rollup-android-arm64@4.65.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.65.0': + optional: true + + '@rollup/rollup-darwin-x64@4.65.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.65.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.65.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.65.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.65.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.65.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.65.0': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.65.0': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.65.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.65.0': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.65.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.65.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.65.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.65.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.65.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.65.0': + optional: true + + '@rollup/rollup-openbsd-x64@4.65.0': + optional: true + + '@rollup/rollup-openharmony-arm64@4.65.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.65.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.65.0': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.65.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.65.0': + optional: true + + '@standard-schema/spec@1.1.0': {} + + '@ts-morph/common@0.29.0': + dependencies: + minimatch: 10.2.6 + path-browserify: 1.0.1 + tinyglobby: 0.2.17 + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.9': {} + + '@types/node@14.18.63': {} + + '@types/webidl-conversions@7.0.3': {} + + '@types/whatwg-url@13.0.0': + dependencies: + '@types/webidl-conversions': 7.0.3 + + '@vitest/expect@4.0.18': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + chai: 6.3.0 + tinyrainbow: 3.2.0 + + '@vitest/mocker@4.0.18(vite@7.3.7(tsx@4.23.15)(yaml@2.9.1))': + dependencies: + '@vitest/spy': 4.0.18 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.7(tsx@4.23.15)(yaml@2.9.1) + + '@vitest/pretty-format@4.0.18': + dependencies: + tinyrainbow: 3.2.0 + + '@vitest/runner@4.0.18': + dependencies: + '@vitest/utils': 4.0.18 + pathe: 2.0.3 + + '@vitest/snapshot@4.0.18': + dependencies: + '@vitest/pretty-format': 4.0.18 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.0.18': {} + + '@vitest/utils@4.0.18': + dependencies: + '@vitest/pretty-format': 4.0.18 + tinyrainbow: 3.2.0 + + '@xmldom/is-dom-node@1.0.1': {} + + '@xmldom/xmldom@0.8.15': {} + + '@xmldom/xmldom@0.9.12': {} + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.1.0 + + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.9 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansis@3.17.0: {} + + any-promise@1.3.0: {} + + anynum@1.0.1: {} + + archiver-utils@2.1.0: + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 2.3.8 + + archiver-utils@3.0.4: + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + + archiver@5.3.2: + dependencies: + archiver-utils: 2.1.0 + async: 3.2.6 + buffer-crc32: 0.2.13 + readable-stream: 3.6.2 + readdir-glob: 1.1.3 + tar-stream: 2.2.0 + zip-stream: 4.1.1 + + argparse@3.0.3: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + assertion-error@2.0.1: {} + + async-function@1.0.0: {} + + async@3.2.6: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + balanced-match@1.0.2: {} + + balanced-match@4.0.4: {} + + base64-js@1.5.1: {} + + better-auth@1.7.3(better-sqlite3@13.0.3)(mongodb@7.7.0)(vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1)): + dependencies: + '@better-auth/core': 1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5) + '@better-auth/drizzle-adapter': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.4.2) + '@better-auth/kysely-adapter': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(kysely@0.29.7) + '@better-auth/memory-adapter': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.4.2) + '@better-auth/mongo-adapter': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(mongodb@7.7.0) + '@better-auth/prisma-adapter': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.4.2) + '@better-auth/telemetry': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.7))(jose@6.2.13)(kysely@0.29.7)(nanostores@1.5.5))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1) + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.1 + '@noble/ciphers': 2.4.0 + '@noble/hashes': 2.4.0 + better-call: 1.4.0(zod@4.6.7) + defu: 6.1.7 + jose: 6.2.13 + kysely: 0.29.7 + nanostores: 1.5.5 + zod: 4.6.7 + optionalDependencies: + better-sqlite3: 13.0.3 + mongodb: 7.7.0 + vitest: 4.0.18(tsx@4.23.15)(yaml@2.9.1) + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@opentelemetry/api' + + better-call@1.4.0(zod@4.6.7): + dependencies: + '@better-auth/utils': 0.5.0 + '@better-fetch/fetch': 1.3.1 + rou3: 0.9.2 + set-cookie-parser: 3.2.1 + optionalDependencies: + zod: 4.6.7 + + better-sqlite3@13.0.3: + dependencies: + node-addon-api: 8.9.2 + optional: true + + big-integer@1.6.52: {} + + binary@0.3.0: + dependencies: + buffers: 0.1.1 + chainsaw: 0.1.0 + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + bluebird@3.4.7: {} + + body-parser@2.4.0: + dependencies: + bytes: 3.1.2 + content-type: 2.1.0 + debug: 4.4.3(supports-color@8.1.1) + http-errors: 2.0.1 + iconv-lite: 0.7.3 + on-finished: 2.4.2 + qs: 6.16.1 + raw-body: 3.0.2 + type-is: 2.1.0 + transitivePeerDependencies: + - supports-color + + brace-expansion@1.1.21: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.1.7: + dependencies: + balanced-match: 1.0.2 + + brace-expansion@5.0.12: + dependencies: + balanced-match: 4.0.4 + + bson@7.3.3: {} + + buffer-crc32@0.2.13: {} + + buffer-indexof-polyfill@1.0.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffers@0.1.1: {} + + bundle-require@5.1.0(esbuild@0.28.2): + dependencies: + esbuild: 0.28.2 + load-tsconfig: 0.2.5 + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.9: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + chai@6.3.0: {} + + chainsaw@0.1.0: + dependencies: + traverse: 0.3.10 + + chalk@6.0.1: {} + + chokidar@5.0.0: + dependencies: + readdirp: 5.1.1 + + clean-stack@3.0.1: + dependencies: + escape-string-regexp: 4.0.0 + + cli-spinners@2.9.2: {} + + code-block-writer@13.0.3: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colorette@2.0.19: {} + + commander@10.0.1: {} + + commander@15.0.0: {} + + commander@4.1.1: {} + + compress-commons@4.1.2: + dependencies: + buffer-crc32: 0.2.13 + crc32-stream: 4.0.3 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + + concat-map@0.0.1: {} + + content-disposition@2.0.1: {} + + content-type@1.0.5: {} + + content-type@2.1.0: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + core-util-is@1.0.3: {} + + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + crc-32@1.2.2: {} + + crc32-stream@4.0.3: + dependencies: + crc-32: 1.2.2 + readable-stream: 3.6.2 + + create-objectstack@18.0.0: + dependencies: + chalk: 6.0.1 + commander: 15.0.0 + + croner@10.0.1: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + dayjs@1.11.23: {} + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + debug@4.4.3(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + defu@6.1.7: {} + + depd@2.0.0: {} + + dotenv-flow@4.1.0: + dependencies: + dotenv: 16.6.1 + + dotenv@16.6.1: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer2@0.1.4: + dependencies: + readable-stream: 2.3.8 + + ee-first@1.1.1: {} + + ejs@6.0.1: {} + + emoji-regex@8.0.0: {} + + encodeurl@2.0.0: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + es-abstract-get@1.0.0: + dependencies: + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + is-callable: 1.2.7 + object-inspect: 1.13.4 + + es-abstract@1.24.2: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.4 + function.prototype.name: 1.2.0 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.2 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.4 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.11 + string.prototype.trimend: 1.0.10 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.5 + typed-array-length: 1.0.8 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.24 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + es-to-primitive@1.3.4: + dependencies: + es-abstract-get: 1.0.0 + es-define-property: 1.0.1 + es-errors: 1.3.0 + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild@0.28.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + + esm@3.2.25: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + etag@1.8.1: {} + + eventsource-parser@3.1.1: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.1.1 + + exceljs@4.4.0: + dependencies: + archiver: 5.3.2 + dayjs: 1.11.23 + fast-csv: 4.3.6 + jszip: 3.10.2 + readable-stream: 3.6.2 + saxes: 5.0.1 + tmp: 0.2.7 + unzipper: 0.10.14 + uuid: 8.3.2 + + expect-type@1.4.0: {} + + express-rate-limit@8.7.1(express@5.3.0): + dependencies: + debug: 4.4.3(supports-color@8.1.1) + express: 5.3.0 + ip-address: 10.7.4 + transitivePeerDependencies: + - supports-color + + express@5.3.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.4.0 + content-disposition: 2.0.1 + content-type: 2.1.0 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3(supports-color@8.1.1) + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.2 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.8 + qs: 6.16.1 + range-parser: 1.3.0 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.1.0 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + fast-csv@4.3.6: + dependencies: + '@fast-csv/format': 4.3.5 + '@fast-csv/parse': 4.3.6 + + fast-deep-equal@3.1.3: {} + + fast-uri@3.1.9: {} + + fast-xml-builder@1.3.1: + dependencies: + path-expression-matcher: 1.6.2 + xml-naming: 0.3.0 + + fast-xml-parser@5.11.2: + dependencies: + '@nodable/entities': 3.1.0 + fast-xml-builder: 1.3.1 + is-unsafe: 2.0.2 + path-expression-matcher: 1.6.2 + strnum: 2.5.1 + xml-naming: 0.3.0 + + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + + finalhandler@2.1.1: + dependencies: + debug: 4.4.3(supports-color@8.1.1) + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.2 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + forwarded@0.2.0: {} + + fresh@2.0.0: {} + + fs-constants@1.0.0: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + fstream@1.0.12: + dependencies: + graceful-fs: 4.2.11 + inherits: 2.0.4 + mkdirp: 0.5.6 + rimraf: 2.7.1 + + function-bind@1.1.2: {} + + function.prototype.name@1.2.0: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + es-define-property: 1.0.1 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + hasown: 2.0.4 + is-callable: 1.2.7 + is-document.all: 1.0.0 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-package-type@0.1.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + getopts@2.3.0: {} + + glob@13.0.6: + dependencies: + minimatch: 10.2.6 + minipass: 7.1.3 + path-scurry: 2.0.2 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + hono@4.13.13: {} + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + iconv-lite@0.7.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + immediate@3.0.6: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.4 + side-channel: 1.1.1 + + interpret@2.2.0: {} + + ip-address@10.7.4: {} + + ipaddr.js@1.9.1: {} + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.17.0: + dependencies: + hasown: 2.0.4 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-docker@3.0.0: {} + + is-document.all@1.0.0: + dependencies: + call-bound: 1.0.4 + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-promise@4.0.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.24 + + is-unsafe@2.0.2: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + jose@6.2.13: {} + + js-yaml@5.5.0: + dependencies: + argparse: 3.0.3 + + json-schema-traverse@1.0.0: {} + + json-schema-typed@8.0.2: {} + + jszip@3.10.2: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + + knex@3.3.0(better-sqlite3@13.0.3): + dependencies: + colorette: 2.0.19 + commander: 10.0.1 + debug: 4.3.4 + escalade: 3.2.0 + esm: 3.2.25 + get-package-type: 0.1.0 + getopts: 2.3.0 + interpret: 2.2.0 + lodash: 4.18.1 + pg-connection-string: 2.6.2 + rechoir: 0.8.0 + resolve-from: 5.0.0 + tarn: 3.1.2 + tildify: 2.0.0 + optionalDependencies: + better-sqlite3: 13.0.3 + transitivePeerDependencies: + - supports-color + + kysely@0.29.7: {} + + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + + lie@3.3.0: + dependencies: + immediate: 3.0.6 + + lilconfig@3.1.4: {} + + lines-and-columns@1.2.4: {} + + listenercount@1.0.1: {} + + load-tsconfig@0.2.5: {} + + lodash.defaults@4.2.0: {} + + lodash.difference@4.5.0: {} + + lodash.escaperegexp@4.1.2: {} + + lodash.flatten@4.4.0: {} + + lodash.groupby@4.6.0: {} + + lodash.isboolean@3.0.3: {} + + lodash.isequal@4.5.0: {} + + lodash.isfunction@3.0.9: {} + + lodash.isnil@4.0.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isundefined@3.0.1: {} + + lodash.union@4.6.0: {} + + lodash.uniq@4.5.0: {} + + lodash@4.18.1: {} + + lru-cache@11.5.3: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + + math-intrinsics@1.1.0: {} + + media-typer@1.1.1: {} + + memory-pager@1.5.0: {} + + merge-descriptors@2.0.0: {} + + mime-db@1.54.0: {} + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + + mingo@7.2.5: {} + + minimatch@10.2.6: + dependencies: + brace-expansion: 5.0.12 + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.21 + + minimatch@5.1.9: + dependencies: + brace-expansion: 2.1.7 + + minimist@1.2.8: {} + + minipass@7.1.3: {} + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + mongodb-connection-string-url@7.0.2: + dependencies: + '@types/whatwg-url': 13.0.0 + whatwg-url: 14.2.0 + + mongodb@7.7.0: + dependencies: + '@mongodb-js/saslprep': 1.6.1 + bson: 7.3.3 + mongodb-connection-string-url: 7.0.2 + + ms@2.1.2: {} + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.20: {} + + nanoid@6.0.2: {} + + nanostores@1.5.5: {} + + negotiator@1.1.0: + dependencies: + content-type: 2.1.0 + + node-addon-api@8.9.2: + optional: true + + nodemailer@10.2.1: {} + + normalize-path@3.0.0: {} + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + obug@2.2.1: {} + + on-finished@2.4.2: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + own-keys@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + pako@1.0.11: {} + + parseurl@1.3.3: {} + + path-browserify@1.0.1: {} + + path-expression-matcher@1.6.2: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@2.0.2: + dependencies: + lru-cache: 11.5.3 + minipass: 7.1.3 + + path-to-regexp@8.4.2: {} + + pathe@2.0.3: {} + + pg-connection-string@2.14.1: {} + + pg-connection-string@2.6.2: {} + + picocolors@1.1.1: {} + + picomatch@4.0.7: {} + + pinyin-pro@3.29.5: {} + + pirates@4.0.7: {} + + pkce-challenge@5.0.1: {} + + possible-typed-array-names@1.1.0: {} + + postal-mime@4.1.4: {} + + postcss@8.5.31: + dependencies: + nanoid: 3.3.20 + picocolors: 1.1.1 + source-map-js: 1.2.2 + + powershell-utils@0.1.0: {} + + process-nextick-args@2.0.1: {} + + proxy-addr@2.0.8: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + punycode@2.3.1: {} + + qs@6.16.1: + dependencies: + es-define-property: 1.0.1 + side-channel: 1.1.1 + + quickjs-emscripten-core@0.32.0: + dependencies: + '@jitl/quickjs-ffi-types': 0.32.0 + + quickjs-emscripten@0.32.0: + dependencies: + '@jitl/quickjs-wasmfile-debug-asyncify': 0.32.0 + '@jitl/quickjs-wasmfile-debug-sync': 0.32.0 + '@jitl/quickjs-wasmfile-release-asyncify': 0.32.0 + '@jitl/quickjs-wasmfile-release-sync': 0.32.0 + quickjs-emscripten-core: 0.32.0 + + range-parser@1.3.0: {} + + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + unpipe: 1.0.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.9 + + readdirp@5.1.1: {} + + rechoir@0.8.0: + dependencies: + resolve: 1.22.13 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + require-from-string@2.0.2: {} + + resolve-from@5.0.0: {} + + resolve@1.22.13: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.17.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + rimraf@2.7.1: + dependencies: + glob: 7.2.3 + + rollup@4.65.0: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.65.0 + '@rollup/rollup-android-arm64': 4.65.0 + '@rollup/rollup-darwin-arm64': 4.65.0 + '@rollup/rollup-darwin-x64': 4.65.0 + '@rollup/rollup-freebsd-arm64': 4.65.0 + '@rollup/rollup-freebsd-x64': 4.65.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.65.0 + '@rollup/rollup-linux-arm-musleabihf': 4.65.0 + '@rollup/rollup-linux-arm64-gnu': 4.65.0 + '@rollup/rollup-linux-arm64-musl': 4.65.0 + '@rollup/rollup-linux-loong64-gnu': 4.65.0 + '@rollup/rollup-linux-loong64-musl': 4.65.0 + '@rollup/rollup-linux-ppc64-gnu': 4.65.0 + '@rollup/rollup-linux-ppc64-musl': 4.65.0 + '@rollup/rollup-linux-riscv64-gnu': 4.65.0 + '@rollup/rollup-linux-riscv64-musl': 4.65.0 + '@rollup/rollup-linux-s390x-gnu': 4.65.0 + '@rollup/rollup-linux-x64-gnu': 4.65.0 + '@rollup/rollup-linux-x64-musl': 4.65.0 + '@rollup/rollup-openbsd-x64': 4.65.0 + '@rollup/rollup-openharmony-arm64': 4.65.0 + '@rollup/rollup-win32-arm64-msvc': 4.65.0 + '@rollup/rollup-win32-ia32-msvc': 4.65.0 + '@rollup/rollup-win32-x64-gnu': 4.65.0 + '@rollup/rollup-win32-x64-msvc': 4.65.0 + fsevents: 2.3.3 + + rou3@0.9.2: {} + + router@2.2.0: + dependencies: + debug: 4.4.3(supports-color@8.1.1) + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.4.2 + transitivePeerDependencies: + - supports-color + + safe-array-concat@1.1.4: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safer-buffer@2.1.2: {} + + samlify@2.15.1: + dependencies: + '@authenio/xml-encryption': 6.0.2 + '@xmldom/xmldom': 0.9.12 + xml: 1.0.1 + xml-crypto: 6.4.0 + xml-escape: 1.1.0 + xpath: 0.0.35 + + saxes@5.0.1: + dependencies: + xmlchars: 2.2.0 + + semver@7.8.5: {} + + send@1.2.1: + dependencies: + debug: 4.4.3(supports-color@8.1.1) + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.2 + range-parser: 1.3.0 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + + set-cookie-parser@3.2.1: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + + setimmediate@1.0.5: {} + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + siginfo@2.0.0: {} + + source-map-js@1.2.2: {} + + sparse-bitfield@3.0.3: + dependencies: + memory-pager: 1.5.0 + + sql.js@1.15.1: {} + + stackback@0.0.2: {} + + statuses@2.0.2: {} + + std-env@3.10.0: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string.prototype.trim@1.2.11: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 + has-property-descriptors: 1.0.2 + safe-regex-test: 1.1.0 + + string.prototype.trimend@1.0.10: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strnum@2.5.1: + dependencies: + anynum: 1.0.1 + + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.17 + ts-interface-checker: 0.1.13 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tarn@3.1.2: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tildify@2.0.0: {} + + tinybench@2.9.0: {} + + tinyexec@1.3.1: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + + tinyrainbow@3.2.0: {} + + tldts-core@7.4.19: {} + + tldts@7.4.19: + dependencies: + tldts-core: 7.4.19 + + tmp@0.2.7: {} + + toidentifier@1.0.1: {} + + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + + traverse@0.3.10: + dependencies: + define-data-property: 1.1.4 + es-to-primitive: 1.3.4 + gopd: 1.2.0 + typedarray.prototype.slice: 1.0.6 + which-typed-array: 1.1.24 + + ts-interface-checker@0.1.13: {} + + ts-morph@28.0.0: + dependencies: + '@ts-morph/common': 0.29.0 + code-block-writer: 13.0.3 + + tsx@4.23.15: + dependencies: + esbuild: 0.28.2 + optionalDependencies: + fsevents: 2.3.3 + + type-fest@0.21.3: {} + + type-is@2.1.0: + dependencies: + content-type: 2.1.0 + media-typer: 1.1.1 + mime-types: 3.0.2 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.5: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.8: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typedarray.prototype.slice@1.0.6: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + get-proto: 1.0.1 + math-intrinsics: 1.1.0 + typed-array-buffer: 1.0.3 + typed-array-byte-offset: 1.0.5 + + typescript@5.9.3: {} + + typescript@6.0.3: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + unpipe@1.0.0: {} + + unzipper@0.10.14: + dependencies: + big-integer: 1.6.52 + binary: 0.3.0 + bluebird: 3.4.7 + buffer-indexof-polyfill: 1.0.2 + duplexer2: 0.1.4 + fstream: 1.0.12 + graceful-fs: 4.2.11 + listenercount: 1.0.1 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + + util-deprecate@1.0.2: {} + + uuid@8.3.2: {} + + vary@1.1.2: {} + + vite@7.3.7(tsx@4.23.15)(yaml@2.9.1): + dependencies: + esbuild: 0.28.2 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + postcss: 8.5.31 + rollup: 4.65.0 + tinyglobby: 0.2.17 + optionalDependencies: + fsevents: 2.3.3 + tsx: 4.23.15 + yaml: 2.9.1 + + vitest@4.0.18(tsx@4.23.15)(yaml@2.9.1): + dependencies: + '@vitest/expect': 4.0.18 + '@vitest/mocker': 4.0.18(vite@7.3.7(tsx@4.23.15)(yaml@2.9.1)) + '@vitest/pretty-format': 4.0.18 + '@vitest/runner': 4.0.18 + '@vitest/snapshot': 4.0.18 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + es-module-lexer: 1.7.0 + expect-type: 1.4.0 + magic-string: 0.30.21 + obug: 2.2.1 + pathe: 2.0.3 + picomatch: 4.0.7 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.3.1 + tinyglobby: 0.2.17 + tinyrainbow: 3.2.0 + vite: 7.3.7(tsx@4.23.15)(yaml@2.9.1) + why-is-node-running: 2.3.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + + webidl-conversions@7.0.0: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.2.0 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.24 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.24: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + widest-line@3.1.0: + dependencies: + string-width: 4.2.3 + + wordwrap@1.0.0: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + wsl-utils@0.4.0: + dependencies: + is-wsl: 3.1.1 + powershell-utils: 0.1.0 + + xml-crypto@6.4.0: + dependencies: + '@xmldom/is-dom-node': 1.0.1 + '@xmldom/xmldom': 0.8.15 + xpath: 0.0.33 + + xml-escape@1.1.0: {} + + xml-naming@0.3.0: {} + + xml@1.0.1: {} + + xmlchars@2.2.0: {} + + xpath@0.0.33: {} + + xpath@0.0.35: {} + + yaml@2.9.1: {} + + zip-stream@4.1.1: + dependencies: + archiver-utils: 3.0.4 + compress-commons: 4.1.2 + readable-stream: 3.6.2 + + zod-to-json-schema@3.25.2(zod@4.6.7): + dependencies: + zod: 4.6.7 + + zod@4.6.7: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..ef62964 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,21 @@ +# Older pnpm needs this key; empty because this project is not a monorepo. +packages: [] + +# Build-script approvals for pnpm 10.0–10.25, which do not read allowBuilds. +onlyBuiltDependencies: + - better-sqlite3 + - esbuild + +# The same approvals for pnpm 10.26 and later; pnpm 11 reads only this key. +allowBuilds: + better-sqlite3: true + esbuild: true + +# Upstream peer ranges measured harmless; this only silences the warning. +peerDependencyRules: + allowedVersions: + 'better-auth>better-sqlite3': '13' + '@better-auth/core>@better-auth/utils': '0.5.0' + '@better-auth/oauth-provider>@better-auth/utils': '0.5.0' + '@better-auth/scim>@better-auth/utils': '0.5.0' + '@better-auth/sso>@better-auth/utils': '0.5.0' diff --git a/src/core/apps/index.ts b/src/core/apps/index.ts new file mode 100644 index 0000000..b3fdd00 --- /dev/null +++ b/src/core/apps/index.ts @@ -0,0 +1 @@ +export { Workbench } from './workbench.app.js'; diff --git a/src/core/apps/workbench.app.ts b/src/core/apps/workbench.app.ts new file mode 100644 index 0000000..318ed5e --- /dev/null +++ b/src/core/apps/workbench.app.ts @@ -0,0 +1,32 @@ +import { App } from '@objectstack/spec/ui'; + +// 内部工作台。导航按分组组织,扩展包往分组里挂菜单(ADR-0002)。 +export const Workbench = App.create({ + name: 'srm_workbench', + label: 'SRM 工作台', + icon: 'handshake', + navigation: [ + { + id: 'group_supplier', + type: 'group', + label: '供应商', + icon: 'factory', + expanded: true, + children: [ + { id: 'nav_supplier', type: 'object', objectName: 'srm_supplier', label: '供应商', icon: 'factory' }, + { id: 'nav_application', type: 'object', objectName: 'srm_supplier_application', label: '准入申请', icon: 'clipboard-check' }, + { id: 'nav_certificate', type: 'object', objectName: 'srm_supplier_certificate', label: '资质证书', icon: 'badge-check' }, + ], + }, + { + id: 'group_master_data', + type: 'group', + label: '基础数据', + icon: 'database', + children: [ + { id: 'nav_category', type: 'object', objectName: 'srm_category', label: '采购品类', icon: 'folder-tree' }, + { id: 'nav_plant', type: 'object', objectName: 'srm_plant', label: '工厂', icon: 'warehouse' }, + ], + }, + ], +}); diff --git a/src/core/data/index.ts b/src/core/data/index.ts new file mode 100644 index 0000000..eadf11f --- /dev/null +++ b/src/core/data/index.ts @@ -0,0 +1,38 @@ +import { defineSeed } from '@objectstack/spec/data'; +import { Category } from '../objects/category.object.js'; +import { Plant } from '../objects/plant.object.js'; +import { Supplier } from '../objects/supplier.object.js'; + +// 演示数据。全部是标明「示例」的虚构值,不对应任何真实企业(AGENTS.md 红线 5)。 +// 用 ignore 只补缺不覆盖:每次启动都会重放种子,upsert 会把用户改过的记录(如准入后的供应商状态)改回初值。 + +const categories = defineSeed(Category, { + mode: 'ignore', + externalId: 'code', + records: [ + { code: 'ELEC', name: '电子元器件', risk_class: 'high', is_direct: true, mandatory_cert_types: ['business_license', 'iso9001'] }, + { code: 'PACK', name: '包装材料', risk_class: 'low', is_direct: true, mandatory_cert_types: ['business_license'] }, + { code: 'MRO', name: '工业品与备件', risk_class: 'medium', is_direct: false, mandatory_cert_types: ['business_license'] }, + ], +}); + +const plants = defineSeed(Plant, { + mode: 'ignore', + externalId: 'code', + records: [ + { code: 'P100', name: '示例一厂', legal_entity: '示例制造有限公司' }, + { code: 'P200', name: '示例二厂', legal_entity: '示例制造有限公司' }, + ], +}); + +const suppliers = defineSeed(Supplier, { + mode: 'ignore', + externalId: 'name', + records: [ + { name: '示例电子科技有限公司', short_name: '示例电子', country: 'cn', credit_code: '91000000MA0EXAMP01', supplier_type: 'manufacturer', status: 'qualified', risk_level: 'low' }, + { name: '示例包装制品有限公司', short_name: '示例包装', country: 'cn', credit_code: '91000000MA0EXAMP02', supplier_type: 'manufacturer', status: 'potential' }, + { name: 'Example Components GmbH', short_name: 'Example Components', country: 'de', registration_no: 'DE000000000', supplier_type: 'distributor', status: 'potential' }, + ], +}); + +export const SrmSeedData = [categories, plants, suppliers]; diff --git a/src/core/flows/admission/approval.flow.ts b/src/core/flows/admission/approval.flow.ts new file mode 100644 index 0000000..d64dd91 --- /dev/null +++ b/src/core/flows/admission/approval.flow.ts @@ -0,0 +1,139 @@ +import { P, cel } from '@objectstack/spec'; +import type * as Automation from '@objectstack/spec/automation'; + +// P1 步骤 6–7(03 §3):申请进入「准入评审」时发起两级审批。 +// 第 1 级是申请上的初审人,第 2 级是采购总监岗位;任一级驳回,申请退回「资料审核」。 +// 批准后:申请→准入通过,供应商→合格,按申请品类建供货品类资格(v0.1 没有现场审核,一律合格)。 +export const AdmissionApprovalFlow: Automation.Flow = { + name: 'srm_admission_approval', + label: '准入评审', + type: 'record_change', + status: 'active', + runAs: 'system', + + nodes: [ + { + id: 'start', + type: 'start', + label: '进入准入评审', + config: { + objectName: 'srm_supplier_application', + triggerType: 'record-after-update', + condition: P`record.status == 'admission_review' && has(previous.status) && previous.status != 'admission_review'`, + }, + }, + { + id: 'review_reviewer', + type: 'approval', + label: '初审人审批', + config: { + approvers: [{ type: 'field', value: 'reviewer' }], + onEmptyApprovers: 'admin_rescue', + behavior: 'first_response', + lockRecord: true, + approvalStatusField: 'approval_status', + }, + }, + { + id: 'review_director', + type: 'approval', + label: '采购总监审批', + config: { + approvers: [{ type: 'position', value: 'srm_procurement_director' }], + // 岗位没人时交给组织管理员,避免申请卡在锁定状态 + onEmptyApprovers: 'admin_rescue', + behavior: 'first_response', + lockRecord: true, + approvalStatusField: 'approval_status', + }, + }, + { + id: 'mark_approved', + type: 'update_record', + label: '申请准入通过', + config: { + objectName: 'srm_supplier_application', + filter: { id: cel`record.id` }, + fields: { status: 'approved', approved_date: cel`today()` }, + }, + }, + { + id: 'supplier_qualified', + type: 'update_record', + label: '供应商合格', + config: { objectName: 'srm_supplier', filter: { id: cel`record.supplier` }, fields: { status: 'qualified' } }, + }, + { + id: 'each_category', + type: 'loop', + label: '逐个申请品类', + config: { + collection: cel`record.applied_categories`, + iteratorVariable: 'categoryId', + body: { + nodes: [ + { + id: 'guard_category', + type: 'try_catch', + label: '单个品类', + config: { + try: { + nodes: [ + { + id: 'grant_category', + type: 'create_record', + label: '建供货品类资格', + config: { + objectName: 'srm_supplier_category', + fields: { + supplier: cel`record.supplier`, + category: cel`categoryId`, + status: 'qualified', + approved_date: cel`today()`, + }, + }, + }, + ], + }, + // 重新准入的供应商可能已有该品类的资格记录(唯一约束),改为恢复合格 + catch: { + nodes: [ + { + id: 'restore_category', + type: 'update_record', + label: '恢复已有品类资格', + config: { + objectName: 'srm_supplier_category', + filter: { supplier: cel`record.supplier`, category: cel`categoryId` }, + fields: { status: 'qualified', approved_date: cel`today()` }, + }, + }, + ], + }, + }, + }, + ], + }, + }, + }, + { + id: 'back_to_doc_review', + type: 'update_record', + label: '退回资料审核', + config: { objectName: 'srm_supplier_application', filter: { id: cel`record.id` }, fields: { status: 'doc_review' } }, + }, + { id: 'end', type: 'end', label: '结束' }, + ], + + edges: [ + { id: 'e1', source: 'start', target: 'review_reviewer', type: 'default' }, + { id: 'e2', source: 'review_reviewer', target: 'review_director', type: 'default', label: 'approve' }, + { id: 'e3', source: 'review_reviewer', target: 'back_to_doc_review', type: 'default', label: 'reject' }, + { id: 'e4', source: 'review_director', target: 'mark_approved', type: 'default', label: 'approve' }, + { id: 'e5', source: 'review_director', target: 'back_to_doc_review', type: 'default', label: 'reject' }, + { id: 'e6', source: 'mark_approved', target: 'supplier_qualified', type: 'default' }, + { id: 'e7', source: 'supplier_qualified', target: 'each_category', type: 'default' }, + { id: 'e8', source: 'each_category', target: 'end', type: 'default' }, + { id: 'e9', source: 'back_to_doc_review', target: 'end', type: 'default' }, + ], +}; diff --git a/src/core/flows/admission/intake.flow.ts b/src/core/flows/admission/intake.flow.ts new file mode 100644 index 0000000..9ffd146 --- /dev/null +++ b/src/core/flows/admission/intake.flow.ts @@ -0,0 +1,40 @@ +import { cel } from '@objectstack/spec'; +import type * as Automation from '@objectstack/spec/automation'; + +// P1 步骤 1–2(03 §3)的 v0.1 版本:申请建立后,供应商进入「准入中」,申请进入「资料审核」。 +// 查重与建档在登记供应商时已由唯一约束完成,这里不再重复。 +export const ApplicationIntakeFlow: Automation.Flow = { + name: 'srm_application_intake', + label: '准入申请受理', + type: 'record_change', + status: 'active', + runAs: 'system', + + nodes: [ + { + id: 'start', + type: 'start', + label: '申请已提交', + config: { objectName: 'srm_supplier_application', triggerType: 'record-after-create' }, + }, + { + id: 'supplier_qualifying', + type: 'update_record', + label: '供应商进入准入中', + config: { objectName: 'srm_supplier', filter: { id: cel`record.supplier` }, fields: { status: 'qualifying' } }, + }, + { + id: 'to_doc_review', + type: 'update_record', + label: '申请进入资料审核', + config: { objectName: 'srm_supplier_application', filter: { id: cel`record.id` }, fields: { status: 'doc_review' } }, + }, + { id: 'end', type: 'end', label: '结束' }, + ], + + edges: [ + { id: 'e1', source: 'start', target: 'supplier_qualifying', type: 'default' }, + { id: 'e2', source: 'supplier_qualifying', target: 'to_doc_review', type: 'default' }, + { id: 'e3', source: 'to_doc_review', target: 'end', type: 'default' }, + ], +}; diff --git a/src/core/flows/admission/rejection.flow.ts b/src/core/flows/admission/rejection.flow.ts new file mode 100644 index 0000000..becbc4d --- /dev/null +++ b/src/core/flows/admission/rejection.flow.ts @@ -0,0 +1,40 @@ +import { P, cel } from '@objectstack/spec'; +import type * as Automation from '@objectstack/spec/automation'; + +// P1 步骤 8(03 §3):申请未通过,供应商从「准入中」回到「潜在」。 +export const AdmissionRejectionFlow: Automation.Flow = { + name: 'srm_admission_rejection', + label: '准入未通过', + type: 'record_change', + status: 'active', + runAs: 'system', + + nodes: [ + { + id: 'start', + type: 'start', + label: '申请未通过', + config: { + objectName: 'srm_supplier_application', + triggerType: 'record-after-update', + condition: P`record.status == 'rejected' && has(previous.status) && previous.status != 'rejected'`, + }, + }, + { + id: 'supplier_potential', + type: 'update_record', + label: '供应商回到潜在', + config: { + objectName: 'srm_supplier', + filter: { id: cel`record.supplier` }, + fields: { status: 'potential' }, + }, + }, + { id: 'end', type: 'end', label: '结束' }, + ], + + edges: [ + { id: 'e1', source: 'start', target: 'supplier_potential', type: 'default' }, + { id: 'e2', source: 'supplier_potential', target: 'end', type: 'default' }, + ], +}; diff --git a/src/core/flows/index.ts b/src/core/flows/index.ts new file mode 100644 index 0000000..d95d6ee --- /dev/null +++ b/src/core/flows/index.ts @@ -0,0 +1,5 @@ +export { ApplicationIntakeFlow } from './admission/intake.flow.js'; +export { AdmissionApprovalFlow } from './admission/approval.flow.js'; +export { AdmissionRejectionFlow } from './admission/rejection.flow.js'; +export { CertificateSweepFlow } from './qualification/certificate-sweep.flow.js'; +export { QualificationRecalcFlow } from './qualification/qualification-recalc.flow.js'; diff --git a/src/core/flows/qualification/certificate-sweep.flow.ts b/src/core/flows/qualification/certificate-sweep.flow.ts new file mode 100644 index 0000000..ad314be --- /dev/null +++ b/src/core/flows/qualification/certificate-sweep.flow.ts @@ -0,0 +1,100 @@ +import { cel } from '@objectstack/spec'; +import type * as Automation from '@objectstack/spec/automation'; + +// 每条证书一次更新,失败只跳过该条,不中断整次扫描 +const eachCertificate = (key: string, collection: ReturnType, status: string): Automation.FlowNode => ({ + id: `each_${key}`, + type: 'loop', + label: `逐条置为 ${status}`, + config: { + collection, + iteratorVariable: 'cert', + body: { + nodes: [ + { + id: `guard_${key}`, + type: 'try_catch', + label: '单条证书', + config: { + try: { + nodes: [ + { + id: `set_${key}`, + type: 'update_record', + label: `置为 ${status}`, + config: { objectName: 'srm_supplier_certificate', filter: { id: cel`cert.id` }, fields: { status } }, + }, + ], + }, + catch: { nodes: [{ id: `skip_${key}`, type: 'assignment', label: '跳过该条' }] }, + }, + }, + ], + }, + }, +}); + +// P10 到期生效与到期提醒(03 §11):每日追赶式扫描,按有效期把证书状态对齐到 +// 已过期 / 即将到期(30 天内)/ 有效。只处理状态与日期不符的证书,重复运行不重复处理(03 §2.3 R2); +// 有效期被延长的证书也在这里恢复为有效。供应商的资质异常标志由 srm_supplier_qualification_recalc 维护。 +export const CertificateSweepFlow: Automation.Flow = { + name: 'srm_certificate_expire_sweep', + label: '证书到期扫描', + type: 'schedule', + status: 'active', + runAs: 'system', + + nodes: [ + { id: 'start', type: 'start', label: '每日 01:00', config: { schedule: '0 1 * * *' } }, + { + id: 'find_expired', + type: 'get_record', + label: '已过期但未标记', + config: { + objectName: 'srm_supplier_certificate', + filter: { status: { $ne: 'expired' }, valid_to: { $lt: cel`isoDate(today())` } }, + limit: 500, + outputVariable: 'expiredList', + }, + }, + eachCertificate('expired', cel`expiredList`, 'expired'), + { + id: 'find_expiring', + type: 'get_record', + label: '30 天内到期但未标记', + config: { + objectName: 'srm_supplier_certificate', + filter: { + status: { $ne: 'expiring' }, + valid_to: { $gte: cel`isoDate(today())`, $lte: cel`isoDate(addDays(today(), 30))` }, + }, + limit: 500, + outputVariable: 'expiringList', + }, + }, + eachCertificate('expiring', cel`expiringList`, 'expiring'), + { + id: 'find_renewed', + type: 'get_record', + label: '有效期已延长', + config: { + objectName: 'srm_supplier_certificate', + filter: { status: { $ne: 'valid' }, valid_to: { $gt: cel`isoDate(addDays(today(), 30))` } }, + limit: 500, + outputVariable: 'renewedList', + }, + }, + eachCertificate('renewed', cel`renewedList`, 'valid'), + { id: 'end', type: 'end', label: '结束' }, + ], + + edges: [ + { id: 'e1', source: 'start', target: 'find_expired', type: 'default' }, + { id: 'e2', source: 'find_expired', target: 'each_expired', type: 'default' }, + { id: 'e3', source: 'each_expired', target: 'find_expiring', type: 'default' }, + { id: 'e4', source: 'find_expiring', target: 'each_expiring', type: 'default' }, + { id: 'e5', source: 'each_expiring', target: 'find_renewed', type: 'default' }, + { id: 'e6', source: 'find_renewed', target: 'each_renewed', type: 'default' }, + { id: 'e7', source: 'each_renewed', target: 'end', type: 'default' }, + ], +}; diff --git a/src/core/flows/qualification/qualification-recalc.flow.ts b/src/core/flows/qualification/qualification-recalc.flow.ts new file mode 100644 index 0000000..6432c29 --- /dev/null +++ b/src/core/flows/qualification/qualification-recalc.flow.ts @@ -0,0 +1,60 @@ +import { P, cel } from '@objectstack/spec'; +import type * as Automation from '@objectstack/spec/automation'; + +// P10 资质异常与恢复(03 §11,FR-902):证书状态或「必备」标志变化后重新计算供应商的 +// qualification_alert——还有任何一张必备证书已过期就为 true,否则为 false。 +// v0.1 由内部人员维护证书,暂不要求「经 SQE 核验」才解除;门户版本(v0.2)加上 verified 条件。 +export const QualificationRecalcFlow: Automation.Flow = { + name: 'srm_supplier_qualification_recalc', + label: '资质异常重算', + type: 'record_change', + status: 'active', + runAs: 'system', + + nodes: [ + { + id: 'start', + type: 'start', + label: '证书状态变化', + config: { + objectName: 'srm_supplier_certificate', + triggerType: 'record-after-update', + condition: P`(has(record.status) && has(previous.status) && record.status != previous.status) + || (has(record.is_mandatory) && has(previous.is_mandatory) && record.is_mandatory != previous.is_mandatory)`, + }, + }, + { + id: 'find_expired_mandatory', + type: 'get_record', + label: '找一张已过期的必备证书', + config: { + objectName: 'srm_supplier_certificate', + filter: { supplier: cel`record.supplier`, is_mandatory: true, status: 'expired' }, + outputVariable: 'expiredMandatory', + }, + }, + { id: 'check', type: 'decision', label: '还有过期的必备证书?' }, + { + id: 'raise_alert', + type: 'update_record', + label: '标记资质异常', + config: { objectName: 'srm_supplier', filter: { id: cel`record.supplier` }, fields: { qualification_alert: true } }, + }, + { + id: 'clear_alert', + type: 'update_record', + label: '解除资质异常', + config: { objectName: 'srm_supplier', filter: { id: cel`record.supplier` }, fields: { qualification_alert: false } }, + }, + { id: 'end', type: 'end', label: '结束' }, + ], + + edges: [ + { id: 'e1', source: 'start', target: 'find_expired_mandatory', type: 'default' }, + { id: 'e2', source: 'find_expired_mandatory', target: 'check', type: 'default' }, + { id: 'e3', source: 'check', target: 'raise_alert', type: 'conditional', condition: P`expiredMandatory != null`, label: '有' }, + { id: 'e4', source: 'check', target: 'clear_alert', type: 'conditional', condition: P`expiredMandatory == null`, label: '没有' }, + { id: 'e5', source: 'raise_alert', target: 'end', type: 'default' }, + { id: 'e6', source: 'clear_alert', target: 'end', type: 'default' }, + ], +}; diff --git a/src/core/index.ts b/src/core/index.ts new file mode 100644 index 0000000..f59b9e8 --- /dev/null +++ b/src/core/index.ts @@ -0,0 +1,44 @@ +import { defineStack } from '@objectstack/spec'; +import * as objects from './objects/index.js'; +import * as picklists from './picklists/index.js'; +import * as views from './views/index.js'; +import * as flows from './flows/index.js'; +import * as apps from './apps/index.js'; +import * as translations from './translations/index.js'; +import { SrmSeedData } from './data/index.js'; +import { SrmPermissionSets } from './security/permission-sets.js'; +import { SrmPositions } from './security/positions.js'; + +// 通用核心(type: app,命名空间 srm)。扩展包在 objectstack.config.ts 里与它合成一个应用。 +export default defineStack({ + manifest: { + id: 'app.objectstack.hotsrm', + namespace: 'srm', + version: '0.1.0', + type: 'app', + name: 'hotsrm', + description: '供应商关系管理(SRM)', + engines: { protocol: '^18.0.0' }, + }, + + // auth + ui:登录页和控制台;automation + triggers + job:记录触发与定时 flow;approvals:审批节点; + // messaging:站内通知;audit:字段历史(trackHistory)。 + requires: ['auth', 'ui', 'automation', 'triggers', 'job', 'approvals', 'messaging', 'audit'], + + data: SrmSeedData, + + objects: Object.values(objects), + picklists: Object.values(picklists), + views: Object.values(views), + flows: Object.values(flows), + apps: Object.values(apps), + permissions: SrmPermissionSets, + positions: SrmPositions, + + i18n: { + defaultLocale: 'zh-CN', + supportedLocales: ['zh-CN', 'en'], + fallbackLocale: 'zh-CN', + }, + translations: Object.values(translations), +}); diff --git a/src/core/objects/category.object.ts b/src/core/objects/category.object.ts new file mode 100644 index 0000000..9d70aae --- /dev/null +++ b/src/core/objects/category.object.ts @@ -0,0 +1,36 @@ +import { ObjectSchema, Field } from '@objectstack/spec/data'; + +// 采购品类(02 §4.1)。 +export const Category = ObjectSchema.create({ + name: 'srm_category', + label: '采购品类', + pluralLabel: '采购品类', + icon: 'folder-tree', + sharingModel: 'public_read', + + fieldGroups: [ + { key: 'basic', label: '基本信息', icon: 'folder-tree' }, + { key: 'admission', label: '准入要求', icon: 'shield-check' }, + ], + + fields: { + code: Field.text({ label: '品类编码', group: 'basic', required: true, unique: true, maxLength: 40 }), + name: Field.text({ label: '品类名称', group: 'basic', required: true, searchable: true, maxLength: 100 }), + parent: { type: 'tree', label: '上级品类', group: 'basic', reference: 'srm_category' }, + category_manager: Field.user({ label: '品类经理', group: 'basic' }), + sqe: Field.user({ label: 'SQE', group: 'basic' }), + is_direct: Field.boolean({ label: '直接物料', group: 'basic', defaultValue: true }), + risk_class: Field.select({ + label: '风险等级', + group: 'admission', + required: true, + defaultValue: 'medium', + options: [ + { label: '高', value: 'high' }, + { label: '中', value: 'medium' }, + { label: '低', value: 'low' }, + ], + }), + mandatory_cert_types: { type: 'multiselect', label: '必备资质类型', group: 'admission', picklist: 'srm_cert_type' }, + }, +}); diff --git a/src/core/objects/index.ts b/src/core/objects/index.ts new file mode 100644 index 0000000..9eee422 --- /dev/null +++ b/src/core/objects/index.ts @@ -0,0 +1,7 @@ +export { Category } from './category.object.js'; +export { Plant } from './plant.object.js'; +export { Supplier } from './supplier.object.js'; +export { SupplierContact } from './supplier-contact.object.js'; +export { SupplierCertificate } from './supplier-certificate.object.js'; +export { SupplierCategory } from './supplier-category.object.js'; +export { SupplierApplication } from './supplier-application.object.js'; diff --git a/src/core/objects/plant.object.ts b/src/core/objects/plant.object.ts new file mode 100644 index 0000000..4dce464 --- /dev/null +++ b/src/core/objects/plant.object.ts @@ -0,0 +1,22 @@ +import { ObjectSchema, Field } from '@objectstack/spec/data'; + +// 工厂 / 收货地点(02 §4.1)。ERP 集成之前用种子数据或导入维护。 +export const Plant = ObjectSchema.create({ + name: 'srm_plant', + label: '工厂', + pluralLabel: '工厂', + icon: 'warehouse', + sharingModel: 'public_read', + + fieldGroups: [ + { key: 'basic', label: '基本信息', icon: 'warehouse' }, + ], + + fields: { + code: Field.text({ label: '工厂编码', group: 'basic', required: true, unique: true, maxLength: 40 }), + name: Field.text({ label: '工厂名称', group: 'basic', required: true, searchable: true, maxLength: 100 }), + erp_plant_id: Field.text({ label: 'ERP 工厂编号', group: 'basic', unique: true, maxLength: 40 }), + legal_entity: Field.text({ label: '所属法人', group: 'basic', maxLength: 200 }), + address: Field.address({ label: '地址', group: 'basic' }), + }, +}); diff --git a/src/core/objects/supplier-application.object.ts b/src/core/objects/supplier-application.object.ts new file mode 100644 index 0000000..474e507 --- /dev/null +++ b/src/core/objects/supplier-application.object.ts @@ -0,0 +1,100 @@ +import { P } from '@objectstack/spec'; +import { ObjectSchema, Field } from '@objectstack/spec/data'; + +// 准入申请(02 §4.2、§5.2)。v0.1 由内部人员为已登记的潜在供应商发起:没有公开表单和门户, +// 所以申请直接关联供应商,申请品类用多值 lookup;现场审核分支随供应商审核对象加入(v0.2)。 +export const SupplierApplication = ObjectSchema.create({ + name: 'srm_supplier_application', + label: '准入申请', + pluralLabel: '准入申请', + icon: 'clipboard-check', + sharingModel: 'private', + enable: { trackHistory: true }, + stageField: 'status', + nameField: 'application_no', + + fieldGroups: [ + { key: 'application', label: '申请信息', icon: 'clipboard-check' }, + { key: 'review', label: '审核', icon: 'shield-check' }, + ], + + fields: { + application_no: Field.autonumber({ label: '申请编号', group: 'application', autonumberFormat: 'APP{YYYY}{00000}' }), + supplier: Field.lookup('srm_supplier', { label: '供应商', group: 'application', required: true }), + applied_categories: { + type: 'lookup', + label: '申请品类', + group: 'application', + reference: 'srm_category', + multiple: true, + required: true, + }, + status: Field.select({ + label: '状态', + group: 'review', + defaultValue: 'submitted', + options: [ + { label: '已提交', value: 'submitted', kind: 'open' }, + { label: '资料审核', value: 'doc_review', kind: 'open' }, + { label: '退回补充', value: 'returned', kind: 'open' }, + { label: '准入评审', value: 'admission_review', kind: 'open' }, + { label: '准入通过', value: 'approved', kind: 'won' }, + { label: '未通过', value: 'rejected', kind: 'lost' }, + ], + }), + reviewer: Field.user({ label: '初审人', group: 'review' }), + // 审批节点写入的审批结论,只读 + approval_status: Field.select({ + label: '审批结论', + group: 'review', + readonly: true, + options: [ + { label: '审批中', value: 'pending' }, + { label: '已批准', value: 'approved' }, + { label: '已驳回', value: 'rejected' }, + ], + }), + approved_date: Field.date({ label: '批准日期', group: 'review', readonly: true }), + reject_reason: Field.textarea({ label: '未通过原因', group: 'review' }), + }, + + validations: [ + { + name: 'application_status_flow', + type: 'state_machine', + field: 'status', + message: '准入申请状态不允许这样变更', + initialStates: ['submitted'], + transitions: { + submitted: ['doc_review', 'rejected'], + doc_review: ['admission_review', 'returned', 'rejected'], + returned: ['doc_review'], + admission_review: ['approved', 'rejected', 'doc_review'], + }, + }, + { + // 只有潜在或已淘汰的供应商能发起准入(02 §5.1:淘汰后只能经新的准入申请重新走全流程) + name: 'supplier_admissible', + type: 'script', + severity: 'error', + events: ['insert'], + message: '只有「潜在」或「淘汰」状态的供应商可以发起准入申请', + condition: P`has(record.supplier.status) && record.supplier.status != 'potential' && record.supplier.status != 'eliminated'`, + }, + { + // 评审要有初审人:第 1 级审批人取自该字段 + name: 'reviewer_before_review', + type: 'script', + severity: 'error', + message: '进入准入评审前需要指定初审人', + condition: P`record.status == 'admission_review' && (!has(record.reviewer) || record.reviewer == null || isBlank(record.reviewer))`, + }, + { + name: 'reject_reason_required', + type: 'script', + severity: 'error', + message: '未通过时需要填写原因', + condition: P`record.status == 'rejected' && (!has(record.reject_reason) || record.reject_reason == null || isBlank(record.reject_reason))`, + }, + ], +}); diff --git a/src/core/objects/supplier-category.object.ts b/src/core/objects/supplier-category.object.ts new file mode 100644 index 0000000..93168fd --- /dev/null +++ b/src/core/objects/supplier-category.object.ts @@ -0,0 +1,36 @@ +import { ObjectSchema, Field } from '@objectstack/spec/data'; + +// 供货品类资格(02 §4.1):同一供应商同一品类一条。source_application 随准入申请对象加入。 +export const SupplierCategory = ObjectSchema.create({ + name: 'srm_supplier_category', + label: '供货品类资格', + pluralLabel: '供货品类资格', + icon: 'tags', + nameField: 'category', + sharingModel: 'controlled_by_parent', + + fieldGroups: [ + { key: 'qualification', label: '品类资格', icon: 'tags' }, + ], + + fields: { + supplier: Field.masterDetail('srm_supplier', { label: '供应商', required: true, deleteBehavior: 'cascade' }), + category: Field.lookup('srm_category', { label: '品类', group: 'qualification', required: true }), + status: Field.select({ + label: '资格状态', + group: 'qualification', + required: true, + defaultValue: 'trial', + options: [ + { label: '试供', value: 'trial' }, + { label: '合格', value: 'qualified' }, + { label: '暂停', value: 'suspended' }, + ], + }), + approved_date: Field.date({ label: '批准日期', group: 'qualification' }), + }, + + indexes: [ + { name: 'srm_supplier_category_unique', fields: ['supplier', 'category'], unique: 'organization' }, + ], +}); diff --git a/src/core/objects/supplier-certificate.object.ts b/src/core/objects/supplier-certificate.object.ts new file mode 100644 index 0000000..58f8635 --- /dev/null +++ b/src/core/objects/supplier-certificate.object.ts @@ -0,0 +1,49 @@ +import { P } from '@objectstack/spec'; +import { ObjectSchema, Field } from '@objectstack/spec/data'; + +// 资质证书(02 §4.1)。status 与 verified 由 flow 维护(资质扫描、核验证书)。 +export const SupplierCertificate = ObjectSchema.create({ + name: 'srm_supplier_certificate', + label: '资质证书', + pluralLabel: '资质证书', + icon: 'badge-check', + nameField: 'cert_type', + sharingModel: 'controlled_by_parent', + + fieldGroups: [ + { key: 'certificate', label: '证书信息', icon: 'badge-check' }, + { key: 'review', label: '状态与核验', icon: 'shield-check' }, + ], + + fields: { + supplier: Field.masterDetail('srm_supplier', { label: '供应商', required: true, deleteBehavior: 'cascade' }), + cert_type: Field.select({ label: '资质类型', group: 'certificate', required: true, picklist: 'srm_cert_type' }), + is_mandatory: Field.boolean({ label: '必备资质', group: 'review', defaultValue: false }), + cert_no: Field.text({ label: '证书编号', group: 'certificate', maxLength: 100 }), + issuer: Field.text({ label: '发证机构', group: 'certificate', maxLength: 200 }), + valid_from: Field.date({ label: '生效日期', group: 'certificate' }), + valid_to: Field.date({ label: '有效期至', group: 'certificate' }), + attachment: Field.file({ label: '扫描件', group: 'certificate', required: true }), + status: Field.select({ + label: '状态', + group: 'review', + defaultValue: 'valid', + options: [ + { label: '有效', value: 'valid' }, + { label: '即将到期', value: 'expiring' }, + { label: '已过期', value: 'expired' }, + ], + }), + verified: Field.boolean({ label: '已核验', group: 'review', defaultValue: false }), + }, + + validations: [ + { + name: 'valid_to_after_valid_from', + type: 'script', + severity: 'error', + message: '有效期至不能早于生效日期', + condition: P`has(record.valid_from) && has(record.valid_to) && record.valid_from != null && record.valid_to != null && !isBlank(record.valid_from) && !isBlank(record.valid_to) && record.valid_to < record.valid_from`, + }, + ], +}); diff --git a/src/core/objects/supplier-contact.object.ts b/src/core/objects/supplier-contact.object.ts new file mode 100644 index 0000000..5844a6f --- /dev/null +++ b/src/core/objects/supplier-contact.object.ts @@ -0,0 +1,35 @@ +import { ObjectSchema, Field } from '@objectstack/spec/data'; + +// 供应商联系人(02 §4.1)。portal_user 随门户版本加入。 +export const SupplierContact = ObjectSchema.create({ + name: 'srm_supplier_contact', + label: '供应商联系人', + pluralLabel: '供应商联系人', + icon: 'contact', + sharingModel: 'controlled_by_parent', + + fieldGroups: [ + { key: 'contact', label: '联系人信息', icon: 'contact' }, + ], + + fields: { + supplier: Field.masterDetail('srm_supplier', { label: '供应商', required: true, deleteBehavior: 'cascade' }), + name: Field.text({ label: '姓名', group: 'contact', required: true, searchable: true, maxLength: 50 }), + contact_function: { + type: 'multiselect', + label: '职能', + group: 'contact', + options: [ + { label: '主账号', value: 'admin' }, + { label: '商务', value: 'sales' }, + { label: '物流', value: 'logistics' }, + { label: '质量', value: 'quality' }, + { label: '财务', value: 'finance' }, + ], + }, + mobile: Field.phone({ label: '手机', group: 'contact' }), + email: Field.email({ label: '邮箱', group: 'contact', required: true }), + is_primary: Field.boolean({ label: '主联系人', group: 'contact', defaultValue: false }), + active: Field.boolean({ label: '有效', group: 'contact', defaultValue: true }), + }, +}); diff --git a/src/core/objects/supplier.object.ts b/src/core/objects/supplier.object.ts new file mode 100644 index 0000000..df243ce --- /dev/null +++ b/src/core/objects/supplier.object.ts @@ -0,0 +1,136 @@ +import { P } from '@objectstack/spec'; +import { ObjectSchema, Field } from '@objectstack/spec/data'; + +// 供应商(02 §4.1、§5.1)。门户岗位、绩效等级等字段随对应版本加入。 +export const Supplier = ObjectSchema.create({ + name: 'srm_supplier', + label: '供应商', + pluralLabel: '供应商', + icon: 'factory', + sharingModel: 'public_read', + enable: { trackHistory: true }, + stageField: 'status', + + fieldGroups: [ + { key: 'basic', label: '基本信息', icon: 'building' }, + { key: 'registration', label: '工商与税务', icon: 'landmark' }, + { key: 'qualification', label: '准入与资质', icon: 'shield-check' }, + ], + + fields: { + supplier_no: Field.autonumber({ label: '供应商编号', group: 'basic', autonumberFormat: 'SUP{0000000}' }), + name: Field.text({ label: '公司全称', group: 'basic', required: true, searchable: true, maxLength: 200 }), + short_name: Field.text({ label: '简称', group: 'basic', searchable: true, maxLength: 50 }), + country: Field.select({ label: '国家 / 地区', group: 'basic', required: true, defaultValue: 'cn', picklist: 'srm_country' }), + // 境内按统一社会信用代码、境外按「国家 / 地区 + 注册号」查重(BR-01,ADR-0007) + credit_code: Field.text({ + label: '统一社会信用代码', + group: 'registration', + unique: true, + maxLength: 18, + requiredWhen: P`record.country == 'cn'`, + visibleWhen: P`record.country == 'cn'`, + }), + registration_no: Field.text({ + label: '注册号 / 税号', + group: 'registration', + maxLength: 50, + requiredWhen: P`record.country != 'cn'`, + visibleWhen: P`record.country != 'cn'`, + }), + supplier_type: Field.select({ + label: '供应商类型', + group: 'basic', + options: [ + { label: '生产商', value: 'manufacturer' }, + { label: '代理分销', value: 'distributor' }, + { label: '服务商', value: 'service' }, + { label: '物流商', value: 'logistics' }, + ], + }), + status: Field.select({ + label: '状态', + group: 'qualification', + defaultValue: 'potential', + options: [ + { label: '潜在', value: 'potential', kind: 'open' }, + { label: '准入中', value: 'qualifying', kind: 'open' }, + { label: '合格', value: 'qualified', kind: 'won' }, + { label: '冻结', value: 'frozen', kind: 'lost' }, + { label: '淘汰', value: 'eliminated', kind: 'lost' }, + { label: '黑名单', value: 'blacklisted', kind: 'lost' }, + ], + }), + // 不是状态:不改变是否合格,只阻止新的寻源邀请(BR-04),由资质扫描 flow 维护 + qualification_alert: Field.boolean({ label: '资质异常', group: 'qualification', defaultValue: false }), + risk_level: Field.select({ + label: '风险等级', + group: 'qualification', + options: [ + { label: '低', value: 'low' }, + { label: '中', value: 'medium' }, + { label: '高', value: 'high' }, + ], + }), + registered_capital: Field.currency({ label: '注册资本', group: 'registration' }), + established_date: Field.date({ label: '成立日期', group: 'registration' }), + legal_representative: Field.text({ label: '法定代表人', group: 'registration', maxLength: 50 }), + taxpayer_type: Field.select({ + label: '纳税人类型', + group: 'registration', + options: [ + { label: '一般纳税人', value: 'general' }, + { label: '小规模纳税人', value: 'small_scale' }, + { label: '境外', value: 'overseas' }, + ], + }), + address: Field.address({ label: '注册地址', group: 'basic' }), + website: Field.url({ label: '网站', group: 'basic' }), + is_related_party: Field.boolean({ label: '关联方', group: 'qualification', defaultValue: false }), + erp_vendor_code: Field.text({ label: 'ERP 供应商编码', group: 'registration', unique: true, maxLength: 40 }), + contact_count: Field.summary({ + label: '联系人数', + group: 'qualification', + summaryOperations: { object: 'srm_supplier_contact', field: 'id', function: 'count' }, + }), + expired_certificate_count: Field.summary({ + label: '过期证书数', + group: 'qualification', + summaryOperations: { + object: 'srm_supplier_certificate', + field: 'id', + function: 'count', + filter: { status: 'expired' }, + }, + }), + }, + + indexes: [ + { name: 'srm_supplier_overseas_identity', fields: ['country', 'registration_no'], unique: 'organization' }, + ], + + validations: [ + { + name: 'supplier_status_flow', + type: 'state_machine', + field: 'status', + message: '供应商状态不允许这样变更', + initialStates: ['potential'], + transitions: { + potential: ['qualifying', 'eliminated'], + qualifying: ['qualified', 'potential'], + qualified: ['frozen', 'eliminated', 'blacklisted'], + frozen: ['qualified', 'eliminated', 'blacklisted'], + eliminated: ['qualifying', 'blacklisted'], + blacklisted: ['eliminated'], + }, + }, + { + name: 'credit_code_format', + type: 'script', + severity: 'error', + message: '统一社会信用代码应为 18 位数字或大写字母', + condition: P`has(record.credit_code) && record.credit_code != null && !isBlank(record.credit_code) && !record.credit_code.matches('^[0-9A-Z]{18}$')`, + }, + ], +}); diff --git a/src/core/picklists/cert-type.picklist.ts b/src/core/picklists/cert-type.picklist.ts new file mode 100644 index 0000000..cd236eb --- /dev/null +++ b/src/core/picklists/cert-type.picklist.ts @@ -0,0 +1,17 @@ +import { definePicklist } from '@objectstack/spec/data'; + +// 资质类型:证书的 cert_type 与品类的 mandatory_cert_types 共用;扩展包按需追加(02 §1)。 +export const CertTypePicklist = definePicklist({ + name: 'srm_cert_type', + label: '资质类型', + options: [ + { label: '营业执照', value: 'business_license' }, + { label: 'ISO 9001', value: 'iso9001' }, + { label: 'IATF 16949', value: 'iatf16949' }, + { label: 'ISO 14001', value: 'iso14001' }, + { label: 'ISO 45001', value: 'iso45001' }, + { label: '生产许可', value: 'production_license' }, + { label: '3C 认证', value: 'ccc' }, + { label: '其他', value: 'other' }, + ], +}); diff --git a/src/core/picklists/country.picklist.ts b/src/core/picklists/country.picklist.ts new file mode 100644 index 0000000..15d131e --- /dev/null +++ b/src/core/picklists/country.picklist.ts @@ -0,0 +1,20 @@ +import { definePicklist } from '@objectstack/spec/data'; + +// 注册地国家 / 地区,ISO 3166-1 两位代码小写(ADR-0007)。先放常见值,按需追加。 +export const CountryPicklist = definePicklist({ + name: 'srm_country', + label: '国家 / 地区', + options: [ + { label: '中国', value: 'cn' }, + { label: '中国香港', value: 'hk' }, + { label: '中国澳门', value: 'mo' }, + { label: '中国台湾', value: 'tw' }, + { label: '日本', value: 'jp' }, + { label: '韩国', value: 'kr' }, + { label: '新加坡', value: 'sg' }, + { label: '美国', value: 'us' }, + { label: '德国', value: 'de' }, + { label: '英国', value: 'gb' }, + { label: '法国', value: 'fr' }, + ], +}); diff --git a/src/core/picklists/index.ts b/src/core/picklists/index.ts new file mode 100644 index 0000000..af609ac --- /dev/null +++ b/src/core/picklists/index.ts @@ -0,0 +1,2 @@ +export { CountryPicklist } from './country.picklist.js'; +export { CertTypePicklist } from './cert-type.picklist.js'; diff --git a/src/core/security/permission-sets.ts b/src/core/security/permission-sets.ts new file mode 100644 index 0000000..c92d8a5 --- /dev/null +++ b/src/core/security/permission-sets.ts @@ -0,0 +1,89 @@ +// 内部权限集(04 §2.2)的 v0.1 子集。一律不设 isDefault(AGENTS.md 红线 2)。 +// 状态类字段(供应商状态、资质异常、证书状态)只由 flow 写入,权限集里一律只读。 + +const read = { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }; +const write = { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }; +const flowOwned = { readable: true, editable: false }; + +// 内部员工的基础:读基础数据与供应商主数据 +export const InternalBasePermissionSet = { + name: 'srm_internal_base', + label: 'SRM 内部基础', + objects: { + srm_category: read, + srm_plant: read, + srm_supplier: read, + srm_supplier_contact: read, + srm_supplier_certificate: read, + srm_supplier_category: read, + }, +}; + +// 品类经理等:维护供应商档案与子信息,发起和推进准入申请 +export const SupplierAdminPermissionSet = { + name: 'srm_supplier_admin', + label: 'SRM 供应商管理', + objects: { + srm_supplier: write, + srm_supplier_contact: { ...write, allowDelete: true }, + srm_supplier_certificate: write, + srm_supplier_category: write, + srm_supplier_application: write, + }, + fields: { + 'srm_supplier.status': flowOwned, + 'srm_supplier.qualification_alert': flowOwned, + 'srm_supplier_certificate.status': flowOwned, + 'srm_supplier_category.status': flowOwned, + 'srm_supplier_category.approved_date': flowOwned, + }, +}; + +// SQE:v0.1 由 SQE 维护证书(门户版本改为供应商上传、SQE 经 screen flow 核验) +export const QualityPermissionSet = { + name: 'srm_quality', + label: 'SRM 质量', + objects: { + srm_supplier: { ...read, allowEdit: true }, + srm_supplier_certificate: write, + srm_supplier_application: read, + }, + fields: { + 'srm_supplier.status': flowOwned, + 'srm_supplier.qualification_alert': flowOwned, + 'srm_supplier_certificate.status': flowOwned, + }, +}; + +// 管理层:全部只读;审批由 flow 授予,不需要写权限 +export const ExecutivePermissionSet = { + name: 'srm_executive', + label: 'SRM 管理层', + objects: { + srm_category: read, + srm_plant: read, + srm_supplier: read, + srm_supplier_contact: read, + srm_supplier_certificate: read, + srm_supplier_category: read, + srm_supplier_application: read, + }, +}; + +// 系统管理员:维护品类与工厂等配置 +export const AdminPermissionSet = { + name: 'srm_admin', + label: 'SRM 系统管理员', + objects: { + srm_category: { ...write, allowDelete: true }, + srm_plant: { ...write, allowDelete: true }, + }, +}; + +export const SrmPermissionSets = [ + InternalBasePermissionSet, + SupplierAdminPermissionSet, + QualityPermissionSet, + ExecutivePermissionSet, + AdminPermissionSet, +]; diff --git a/src/core/security/positions.ts b/src/core/security/positions.ts new file mode 100644 index 0000000..72e2b99 --- /dev/null +++ b/src/core/security/positions.ts @@ -0,0 +1,8 @@ +// 内部岗位(04 §2.1)的 v0.1 子集:只列 v0.1 流程用到的岗位,其余随对应版本加入。 +export const SrmPositions = [ + { name: 'srm_procurement_director', label: '采购总监', permissionSets: ['srm_internal_base', 'srm_executive'] }, + { name: 'srm_category_manager', label: '品类经理', permissionSets: ['srm_internal_base', 'srm_supplier_admin'] }, + { name: 'srm_buyer', label: '采购员', permissionSets: ['srm_internal_base'] }, + { name: 'srm_sqe', label: 'SQE', permissionSets: ['srm_internal_base', 'srm_quality'] }, + { name: 'srm_admin', label: 'SRM 系统管理员', permissionSets: ['srm_internal_base', 'srm_admin'] }, +]; diff --git a/src/core/translations/en.ts b/src/core/translations/en.ts new file mode 100644 index 0000000..fae5d5e --- /dev/null +++ b/src/core/translations/en.ts @@ -0,0 +1,224 @@ +import type { TranslationData } from '@objectstack/spec/system'; + +// 源码里的标签是中文;英文词条覆盖全部对象、字段、选项、视图与导航(ADR-0007)。 +export const en: TranslationData = { + objects: { + srm_category: { + label: 'Purchasing Category', + pluralLabel: 'Purchasing Categories', + _sections: { basic: { label: 'Basic Information' }, admission: { label: 'Admission Requirements' } }, + fields: { + code: { label: 'Category Code' }, + name: { label: 'Category Name' }, + parent: { label: 'Parent Category' }, + category_manager: { label: 'Category Manager' }, + sqe: { label: 'SQE' }, + is_direct: { label: 'Direct Material' }, + risk_class: { + label: 'Risk Class', + options: { high: 'High', medium: 'Medium', low: 'Low' }, + }, + mandatory_cert_types: { label: 'Mandatory Certificate Types' }, + }, + _views: { default: { label: 'All Categories' } }, + }, + srm_plant: { + label: 'Plant', + pluralLabel: 'Plants', + _sections: { basic: { label: 'Basic Information' } }, + fields: { + code: { label: 'Plant Code' }, + name: { label: 'Plant Name' }, + erp_plant_id: { label: 'ERP Plant ID' }, + legal_entity: { label: 'Legal Entity' }, + address: { label: 'Address' }, + }, + _views: { default: { label: 'All Plants' } }, + }, + srm_supplier: { + label: 'Supplier', + pluralLabel: 'Suppliers', + _sections: { + basic: { label: 'Basic Information' }, + registration: { label: 'Registration and Tax' }, + qualification: { label: 'Admission and Qualification' }, + }, + _validations: { + supplier_status_flow: { message: 'This supplier status change is not allowed' }, + credit_code_format: { message: 'The Unified Social Credit Code must be 18 digits or uppercase letters' }, + }, + fields: { + supplier_no: { label: 'Supplier No.' }, + name: { label: 'Legal Name' }, + short_name: { label: 'Short Name' }, + country: { label: 'Country / Region' }, + credit_code: { label: 'Unified Social Credit Code' }, + registration_no: { label: 'Registration / Tax No.' }, + supplier_type: { + label: 'Supplier Type', + options: { manufacturer: 'Manufacturer', distributor: 'Distributor', service: 'Service Provider', logistics: 'Logistics Provider' }, + }, + status: { + label: 'Status', + options: { + potential: 'Potential', + qualifying: 'Qualifying', + qualified: 'Qualified', + frozen: 'Frozen', + eliminated: 'Eliminated', + blacklisted: 'Blacklisted', + }, + }, + qualification_alert: { label: 'Qualification Alert' }, + risk_level: { label: 'Risk Level', options: { low: 'Low', medium: 'Medium', high: 'High' } }, + registered_capital: { label: 'Registered Capital' }, + established_date: { label: 'Established Date' }, + legal_representative: { label: 'Legal Representative' }, + taxpayer_type: { + label: 'Taxpayer Type', + options: { general: 'General Taxpayer', small_scale: 'Small-scale Taxpayer', overseas: 'Overseas' }, + }, + address: { label: 'Registered Address' }, + website: { label: 'Website' }, + is_related_party: { label: 'Related Party' }, + erp_vendor_code: { label: 'ERP Vendor Code' }, + contact_count: { label: 'Contacts' }, + expired_certificate_count: { label: 'Expired Certificates' }, + }, + _views: { + default: { label: 'All Suppliers' }, + qualification_alert: { label: 'Qualification Alerts' }, + }, + }, + srm_supplier_contact: { + label: 'Supplier Contact', + pluralLabel: 'Supplier Contacts', + _sections: { contact: { label: 'Contact Information' } }, + fields: { + supplier: { label: 'Supplier' }, + name: { label: 'Name' }, + contact_function: { + label: 'Function', + options: { admin: 'Primary Account', sales: 'Sales', logistics: 'Logistics', quality: 'Quality', finance: 'Finance' }, + }, + mobile: { label: 'Mobile' }, + email: { label: 'Email' }, + is_primary: { label: 'Primary Contact' }, + active: { label: 'Active' }, + }, + }, + srm_supplier_certificate: { + label: 'Certificate', + pluralLabel: 'Certificates', + _sections: { certificate: { label: 'Certificate' }, review: { label: 'Status and Verification' } }, + _validations: { valid_to_after_valid_from: { message: 'Valid To cannot be earlier than Valid From' } }, + fields: { + supplier: { label: 'Supplier' }, + cert_type: { label: 'Certificate Type' }, + is_mandatory: { label: 'Mandatory' }, + cert_no: { label: 'Certificate No.' }, + issuer: { label: 'Issuer' }, + valid_from: { label: 'Valid From' }, + valid_to: { label: 'Valid To' }, + attachment: { label: 'Scan' }, + status: { label: 'Status', options: { valid: 'Valid', expiring: 'Expiring', expired: 'Expired' } }, + verified: { label: 'Verified' }, + }, + _views: { + default: { label: 'All Certificates' }, + expiring: { label: 'Expiring and Expired' }, + }, + }, + srm_supplier_category: { + label: 'Category Qualification', + pluralLabel: 'Category Qualifications', + _sections: { qualification: { label: 'Category Qualification' } }, + fields: { + supplier: { label: 'Supplier' }, + category: { label: 'Category' }, + status: { label: 'Qualification Status', options: { trial: 'Trial', qualified: 'Qualified', suspended: 'Suspended' } }, + approved_date: { label: 'Approved Date' }, + }, + }, + srm_supplier_application: { + label: 'Admission Application', + pluralLabel: 'Admission Applications', + _sections: { application: { label: 'Application' }, review: { label: 'Review' } }, + _validations: { + application_status_flow: { message: 'This application status change is not allowed' }, + supplier_admissible: { message: 'Only a Potential or Eliminated supplier can apply for admission' }, + reviewer_before_review: { message: 'Assign a reviewer before the admission review' }, + reject_reason_required: { message: 'Enter a reason when rejecting' }, + }, + fields: { + application_no: { label: 'Application No.' }, + supplier: { label: 'Supplier' }, + applied_categories: { label: 'Applied Categories' }, + status: { + label: 'Status', + options: { + submitted: 'Submitted', + doc_review: 'Document Review', + returned: 'Returned', + admission_review: 'Admission Review', + approved: 'Approved', + rejected: 'Rejected', + }, + }, + reviewer: { label: 'Reviewer' }, + approval_status: { label: 'Approval Result', options: { pending: 'Pending', approved: 'Approved', rejected: 'Rejected' } }, + approved_date: { label: 'Approved Date' }, + reject_reason: { label: 'Rejection Reason' }, + }, + _views: { + default: { label: 'All Applications' }, + in_progress: { label: 'In Progress' }, + }, + }, + }, + picklists: { + srm_country: { + label: 'Country / Region', + options: { + cn: 'China', + hk: 'Hong Kong SAR, China', + mo: 'Macao SAR, China', + tw: 'Taiwan, China', + jp: 'Japan', + kr: 'South Korea', + sg: 'Singapore', + us: 'United States', + de: 'Germany', + gb: 'United Kingdom', + fr: 'France', + }, + }, + srm_cert_type: { + label: 'Certificate Type', + options: { + business_license: 'Business License', + iso9001: 'ISO 9001', + iatf16949: 'IATF 16949', + iso14001: 'ISO 14001', + iso45001: 'ISO 45001', + production_license: 'Production License', + ccc: 'CCC Certification', + other: 'Other', + }, + }, + }, + apps: { + srm_workbench: { + label: 'SRM Workbench', + navigation: { + group_supplier: { label: 'Suppliers' }, + nav_supplier: { label: 'Suppliers' }, + nav_application: { label: 'Admission Applications' }, + nav_certificate: { label: 'Certificates' }, + group_master_data: { label: 'Master Data' }, + nav_category: { label: 'Purchasing Categories' }, + nav_plant: { label: 'Plants' }, + }, + }, + }, +}; diff --git a/src/core/translations/index.ts b/src/core/translations/index.ts new file mode 100644 index 0000000..be434d0 --- /dev/null +++ b/src/core/translations/index.ts @@ -0,0 +1,4 @@ +import { defineTranslationBundle } from '@objectstack/spec/system'; +import { en } from './en.js'; + +export const SrmTranslations = defineTranslationBundle({ en }); diff --git a/src/core/views/category.view.ts b/src/core/views/category.view.ts new file mode 100644 index 0000000..b31e66b --- /dev/null +++ b/src/core/views/category.view.ts @@ -0,0 +1,19 @@ +import { defineView } from '@objectstack/spec'; + +export const CategoryViews = defineView({ + list: { + label: '全部品类', + type: 'grid', + data: { provider: 'object', object: 'srm_category' }, + columns: [ + { field: 'code' }, + { field: 'name' }, + { field: 'parent' }, + { field: 'risk_class' }, + { field: 'is_direct' }, + { field: 'category_manager' }, + { field: 'sqe' }, + ], + sort: [{ field: 'code', order: 'asc' }], + }, +}); diff --git a/src/core/views/index.ts b/src/core/views/index.ts new file mode 100644 index 0000000..0f81929 --- /dev/null +++ b/src/core/views/index.ts @@ -0,0 +1,5 @@ +export { CategoryViews } from './category.view.js'; +export { PlantViews } from './plant.view.js'; +export { SupplierViews } from './supplier.view.js'; +export { SupplierCertificateViews } from './supplier-certificate.view.js'; +export { SupplierApplicationViews } from './supplier-application.view.js'; diff --git a/src/core/views/plant.view.ts b/src/core/views/plant.view.ts new file mode 100644 index 0000000..d48a29a --- /dev/null +++ b/src/core/views/plant.view.ts @@ -0,0 +1,11 @@ +import { defineView } from '@objectstack/spec'; + +export const PlantViews = defineView({ + list: { + label: '全部工厂', + type: 'grid', + data: { provider: 'object', object: 'srm_plant' }, + columns: [{ field: 'code' }, { field: 'name' }, { field: 'legal_entity' }, { field: 'erp_plant_id' }], + sort: [{ field: 'code', order: 'asc' }], + }, +}); diff --git a/src/core/views/supplier-application.view.ts b/src/core/views/supplier-application.view.ts new file mode 100644 index 0000000..22ce0cb --- /dev/null +++ b/src/core/views/supplier-application.view.ts @@ -0,0 +1,31 @@ +import { defineView } from '@objectstack/spec'; + +const data = { provider: 'object' as const, object: 'srm_supplier_application' }; +const columns = [ + { field: 'application_no' }, + { field: 'supplier' }, + { field: 'applied_categories' }, + { field: 'status' }, + { field: 'reviewer' }, + { field: 'approval_status' }, +]; + +export const SupplierApplicationViews = defineView({ + list: { + label: '全部准入申请', + type: 'grid', + data, + columns, + sort: [{ field: 'application_no', order: 'desc' }], + }, + + listViews: { + in_progress: { + label: '进行中', + type: 'grid', + data, + columns, + filter: [{ field: 'status', operator: 'in', value: ['submitted', 'doc_review', 'returned', 'admission_review'] }], + }, + }, +}); diff --git a/src/core/views/supplier-certificate.view.ts b/src/core/views/supplier-certificate.view.ts new file mode 100644 index 0000000..9b99a99 --- /dev/null +++ b/src/core/views/supplier-certificate.view.ts @@ -0,0 +1,32 @@ +import { defineView } from '@objectstack/spec'; + +const data = { provider: 'object' as const, object: 'srm_supplier_certificate' }; +const columns = [ + { field: 'supplier' }, + { field: 'cert_type' }, + { field: 'cert_no' }, + { field: 'valid_to' }, + { field: 'status' }, + { field: 'verified' }, +]; + +export const SupplierCertificateViews = defineView({ + list: { + label: '全部证书', + type: 'grid', + data, + columns, + sort: [{ field: 'valid_to', order: 'asc' }], + }, + + listViews: { + expiring: { + label: '即将到期与已过期', + type: 'grid', + data, + columns, + filter: [{ field: 'status', operator: 'in', value: ['expiring', 'expired'] }], + sort: [{ field: 'valid_to', order: 'asc' }], + }, + }, +}); diff --git a/src/core/views/supplier.view.ts b/src/core/views/supplier.view.ts new file mode 100644 index 0000000..ab156b7 --- /dev/null +++ b/src/core/views/supplier.view.ts @@ -0,0 +1,31 @@ +import { defineView } from '@objectstack/spec'; + +const data = { provider: 'object' as const, object: 'srm_supplier' }; + +export const SupplierViews = defineView({ + list: { + label: '全部供应商', + type: 'grid', + data, + columns: [ + { field: 'supplier_no' }, + { field: 'name' }, + { field: 'country' }, + { field: 'supplier_type' }, + { field: 'status' }, + { field: 'qualification_alert' }, + { field: 'risk_level' }, + ], + sort: [{ field: 'supplier_no', order: 'desc' }], + }, + + listViews: { + qualification_alert: { + label: '资质异常', + type: 'grid', + data, + columns: [{ field: 'supplier_no' }, { field: 'name' }, { field: 'status' }, { field: 'expired_certificate_count' }], + filter: [{ field: 'qualification_alert', operator: 'equals', value: true }], + }, + }, +}); diff --git a/test/admission.test.ts b/test/admission.test.ts new file mode 100644 index 0000000..fd81e9c --- /dev/null +++ b/test/admission.test.ts @@ -0,0 +1,110 @@ +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { bootStack, type VerifyStack } from '@objectstack/verify'; +import config from '../objectstack.config'; +import { Category, Supplier, SupplierApplication, SupplierCategory } from '../src/core/objects'; + +// P1 准入(03 §3)的 v0.1 版本:受理 → 资料审核 → 两级审批 → 合格 / 退回 / 未通过。 +describe('supplier admission', () => { + let stack: VerifyStack; + let admin: string; + let adminId: string; + let seq = 0; + + const newSupplier = () => + stack.hooks.run( + Supplier.name, + 'insert', + { name: `准入测试供应商 ${++seq}`, credit_code: `91000000MA0ADM${String(seq).padStart(4, '0')}` }, + { as: admin }, + ); + const newCategory = () => + stack.hooks.run(Category.name, 'insert', { code: `ADM${++seq}`, name: `准入测试品类 ${seq}` }, { as: admin }); + const read = async (object: string, id: string) => (await stack.rows(object, { id }, { as: admin }))[0]!; + const update = (object: string, doc: Record) => stack.hooks.run(object, 'update', doc, { as: admin }); + + // 当前待决的审批请求 + const pendingRequest = async (recordId: string) => { + const rows = await stack.rows('sys_approval_request', { record_id: recordId }); + return rows.find((r) => r.status === 'pending'); + }; + const decide = async (recordId: string, verdict: 'approve' | 'reject') => { + const request = await pendingRequest(recordId); + expect(request, 'no pending approval request').toBeTruthy(); + const res = await stack.apiAs(admin, 'POST', `/approvals/requests/${request!.id}/${verdict}`, { comment: verdict }); + expect(res.status, await res.clone().text()).toBe(200); + }; + + const applyFor = async (categories: string[]) => { + const supplier = await newSupplier(); + const app = await stack.hooks.run( + SupplierApplication.name, + 'insert', + { supplier: supplier.id, applied_categories: categories, reviewer: adminId }, + { as: admin }, + ); + return { supplier: supplier.id as string, app: app.id as string }; + }; + + beforeAll(async () => { + stack = await bootStack(config); + admin = await stack.signIn(); + const [me] = await stack.rows('sys_user', {}); + adminId = String(me!.id); + }); + + afterAll(async () => { + await stack?.stop(); + }); + + it('moves a new application to document review and the supplier to qualifying', async () => { + const category = await newCategory(); + const { supplier, app } = await applyFor([category.id]); + expect((await read(SupplierApplication.name, app)).status).toBe('doc_review'); + expect((await read(Supplier.name, supplier)).status).toBe('qualifying'); + }); + + it('refuses an application for a supplier that is already qualifying', async () => { + const category = await newCategory(); + const { supplier } = await applyFor([category.id]); + await expect( + stack.hooks.run(SupplierApplication.name, 'insert', { supplier, applied_categories: [category.id] }, { as: admin }), + ).rejects.toMatchObject({ code: 'VALIDATION_FAILED' }); + }); + + it('qualifies the supplier and its categories after both approvals', async () => { + const [a, b] = [await newCategory(), await newCategory()]; + const { supplier, app } = await applyFor([a.id, b.id]); + await update(SupplierApplication.name, { id: app, status: 'admission_review' }); + + await decide(app, 'approve'); + expect((await read(SupplierApplication.name, app)).status).toBe('admission_review'); + await decide(app, 'approve'); + + const application = await read(SupplierApplication.name, app); + expect(application.status).toBe('approved'); + expect(application.approved_date).toBeTruthy(); + expect((await read(Supplier.name, supplier)).status).toBe('qualified'); + const grants = await stack.rows(SupplierCategory.name, { supplier }, { as: admin }); + expect(grants.map((g) => g.category).sort()).toEqual([a.id, b.id].sort()); + expect(grants.every((g) => g.status === 'qualified')).toBe(true); + }); + + it('returns the application to document review when an approver rejects', async () => { + const category = await newCategory(); + const { supplier, app } = await applyFor([category.id]); + await update(SupplierApplication.name, { id: app, status: 'admission_review' }); + await decide(app, 'reject'); + expect((await read(SupplierApplication.name, app)).status).toBe('doc_review'); + expect((await read(Supplier.name, supplier)).status).toBe('qualifying'); + }); + + it('sends the supplier back to potential when the application is rejected', async () => { + const category = await newCategory(); + const { supplier, app } = await applyFor([category.id]); + await expect(update(SupplierApplication.name, { id: app, status: 'rejected' })).rejects.toMatchObject({ + code: 'VALIDATION_FAILED', + }); + await update(SupplierApplication.name, { id: app, status: 'rejected', reject_reason: '资质不全' }); + expect((await read(Supplier.name, supplier)).status).toBe('potential'); + }); +}); diff --git a/test/boot.test.ts b/test/boot.test.ts new file mode 100644 index 0000000..5736cbb --- /dev/null +++ b/test/boot.test.ts @@ -0,0 +1,42 @@ +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { bootStack, type VerifyStack } from '@objectstack/verify'; +import config from '../objectstack.config'; +import { Category } from '../src/core/objects'; + +// 在进程内用内存库启动整个应用,走与 REST API 相同的校验和权限路径。 +describe('core boots', () => { + let stack: VerifyStack; + let admin: string; + + beforeAll(async () => { + stack = await bootStack(config); + admin = await stack.signIn(); + }); + + afterAll(async () => { + await stack?.stop(); + }); + + it('identifies as the hotsrm app', () => { + expect(config.manifest).toMatchObject({ id: 'app.objectstack.hotsrm', namespace: 'srm', type: 'app' }); + }); + + it('refuses a category without a code', async () => { + await expect( + stack.hooks.run(Category.name, 'insert', { name: '电子元器件' }, { as: admin }), + ).rejects.toMatchObject({ + code: 'VALIDATION_FAILED', + fields: [{ field: 'code', code: 'required' }], + }); + }); + + it('saves a category with its defaults', async () => { + const row = await stack.hooks.run( + Category.name, + 'insert', + { code: 'BOOT', name: '启动测试品类' }, + { as: admin }, + ); + expect(row).toMatchObject({ code: 'BOOT', risk_class: 'medium', is_direct: true }); + }); +}); diff --git a/test/permissions.test.ts b/test/permissions.test.ts new file mode 100644 index 0000000..a788af9 --- /dev/null +++ b/test/permissions.test.ts @@ -0,0 +1,66 @@ +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { bootStack, type VerifyStack } from '@objectstack/verify'; +import config from '../objectstack.config'; +import { Supplier, SupplierApplication } from '../src/core/objects'; +import { SrmPermissionSets } from '../src/core/security/permission-sets'; + +// 内部岗位与权限集(04 §2):采购员只读,品类经理维护档案但不能直接改状态。 +describe('internal permissions', () => { + let stack: VerifyStack; + let seq = 0; + + const person = async (position: string) => { + const token = await stack.signUp(`${position}-${++seq}@example.com`); + const context = await stack.contextFor(token); + const org = context.tenantId ? { organization_id: String(context.tenantId) } : {}; + await stack.seed('sys_user_position', [{ user_id: String(context.userId), position, ...org }]); + return token; + }; + const supplierDoc = () => ({ name: `权限测试供应商 ${++seq}`, credit_code: `91000000MA0PRM${String(seq).padStart(4, '0')}` }); + + beforeAll(async () => { + stack = await bootStack(config); + }); + + afterAll(async () => { + await stack?.stop(); + }); + + it('sets no internal permission set as the default', () => { + expect(SrmPermissionSets.filter((set) => 'isDefault' in set)).toEqual([]); + }); + + it('lets a buyer read suppliers but not create one', async () => { + const buyer = await person('srm_buyer'); + expect((await stack.rows(Supplier.name, {}, { as: buyer })).length).toBeGreaterThan(0); + await expect(stack.hooks.run(Supplier.name, 'insert', supplierDoc(), { as: buyer })).rejects.toBeTruthy(); + }); + + it('lets a category manager register a supplier and apply for admission', async () => { + const manager = await person('srm_category_manager'); + const supplier = await stack.hooks.run(Supplier.name, 'insert', supplierDoc(), { as: manager }); + const [category] = await stack.rows('srm_category', { code: 'ELEC' }, { as: manager }); + const app = await stack.hooks.run( + SupplierApplication.name, + 'insert', + { supplier: supplier.id, applied_categories: [category!.id] }, + { as: manager }, + ); + expect(app.id).toBeTruthy(); + }); + + it('does not let a category manager set the supplier status directly', async () => { + const manager = await person('srm_category_manager'); + const supplier = await stack.hooks.run(Supplier.name, 'insert', supplierDoc(), { as: manager }); + await expect( + stack.hooks.run(Supplier.name, 'update', { id: supplier.id, status: 'eliminated' }, { as: manager }), + ).rejects.toBeTruthy(); + const [row] = await stack.rows(Supplier.name, { id: supplier.id }, { as: manager }); + expect(row!.status).toBe('potential'); + }); + + it('keeps admission applications out of a buyer\'s reach', async () => { + const buyer = await person('srm_buyer'); + await expect(stack.rows(SupplierApplication.name, {}, { as: buyer })).rejects.toBeTruthy(); + }); +}); diff --git a/test/qualification.test.ts b/test/qualification.test.ts new file mode 100644 index 0000000..12552f0 --- /dev/null +++ b/test/qualification.test.ts @@ -0,0 +1,101 @@ +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { bootStack, type VerifyStack } from '@objectstack/verify'; +import config from '../objectstack.config'; +import { Supplier, SupplierCertificate } from '../src/core/objects'; + +// P10 资质监控(03 §11):每日扫描对齐证书状态,必备证书过期时供应商标记资质异常,延期后解除。 +describe('qualification monitoring', () => { + let stack: VerifyStack; + let admin: string; + let seq = 0; + + const day = (offset: number) => new Date(Date.now() + offset * 86_400_000).toISOString().slice(0, 10); + const read = async (object: string, id: string) => (await stack.rows(object, { id }, { as: admin }))[0]!; + const sweep = async () => { + const run = await stack.flows.run('srm_certificate_expire_sweep', {}, { system: true }); + expect(run.success, JSON.stringify(run)).toBe(true); + }; + + const newSupplier = async () => + (await stack.hooks.run( + Supplier.name, + 'insert', + { name: `资质测试供应商 ${++seq}`, credit_code: `91000000MA0QUA${String(seq).padStart(4, '0')}` }, + { as: admin }, + )).id as string; + const newCertificate = async (supplier: string, validTo: string, isMandatory: boolean) => { + const name = `cert-${++seq}.pdf`; + const [file] = await stack.seed('sys_file', [ + { key: `attachments/${name}`, name, mime_type: 'application/pdf', size: 1, scope: 'attachments', status: 'committed' }, + ]); + const cert = await stack.hooks.run( + SupplierCertificate.name, + 'insert', + { supplier, cert_type: 'iso9001', valid_from: day(-400), valid_to: validTo, is_mandatory: isMandatory, attachment: String(file!.id) }, + { as: admin }, + ); + return cert.id as string; + }; + + beforeAll(async () => { + stack = await bootStack(config); + admin = await stack.signIn(); + }); + + afterAll(async () => { + await stack?.stop(); + }); + + it('expires a mandatory certificate and raises the qualification alert', async () => { + const supplier = await newSupplier(); + const cert = await newCertificate(supplier, day(-1), true); + await sweep(); + expect((await read(SupplierCertificate.name, cert)).status).toBe('expired'); + expect((await read(Supplier.name, supplier)).qualification_alert).toBe(true); + }); + + it('clears the alert once the expired certificate is renewed', async () => { + const supplier = await newSupplier(); + const cert = await newCertificate(supplier, day(-1), true); + await sweep(); + await stack.hooks.run(SupplierCertificate.name, 'update', { id: cert, valid_to: day(365) }, { as: admin }); + await sweep(); + expect((await read(SupplierCertificate.name, cert)).status).toBe('valid'); + expect((await read(Supplier.name, supplier)).qualification_alert).toBe(false); + }); + + it('marks a certificate due within 30 days as expiring without an alert', async () => { + const supplier = await newSupplier(); + const cert = await newCertificate(supplier, day(10), true); + await sweep(); + expect((await read(SupplierCertificate.name, cert)).status).toBe('expiring'); + expect((await read(Supplier.name, supplier)).qualification_alert).toBe(false); + }); + + it('does not raise the alert for an optional certificate', async () => { + const supplier = await newSupplier(); + const cert = await newCertificate(supplier, day(-1), false); + await sweep(); + expect((await read(SupplierCertificate.name, cert)).status).toBe('expired'); + expect((await read(Supplier.name, supplier)).qualification_alert).toBe(false); + }); + + it('keeps the alert while another mandatory certificate is still expired', async () => { + const supplier = await newSupplier(); + const first = await newCertificate(supplier, day(-1), true); + await newCertificate(supplier, day(-2), true); + await sweep(); + await stack.hooks.run(SupplierCertificate.name, 'update', { id: first, valid_to: day(365) }, { as: admin }); + await sweep(); + expect((await read(Supplier.name, supplier)).qualification_alert).toBe(true); + }); + + it('changes nothing on a second run', async () => { + const supplier = await newSupplier(); + const cert = await newCertificate(supplier, day(-1), true); + await sweep(); + const before = await read(SupplierCertificate.name, cert); + await sweep(); + expect((await read(SupplierCertificate.name, cert)).updated_at).toBe(before.updated_at); + }); +}); diff --git a/test/supplier.test.ts b/test/supplier.test.ts new file mode 100644 index 0000000..8d0ea05 --- /dev/null +++ b/test/supplier.test.ts @@ -0,0 +1,108 @@ +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; +import { bootStack, type VerifyStack } from '@objectstack/verify'; +import config from '../objectstack.config'; +import { Category, Supplier, SupplierCategory, SupplierCertificate, SupplierContact } from '../src/core/objects'; + +// 供应商主数据的规则:查重(BR-01)、状态机(02 §5.1)、证书有效期、汇总字段。 +describe('supplier master data', () => { + let stack: VerifyStack; + let admin: string; + let seq = 0; + + // 每个用例用自己的信用代码,互不干扰 + const creditCode = () => `91000000MA0TEST${String(++seq).padStart(3, '0')}`; + const newSupplier = (extra: Record = {}) => + stack.hooks.run(Supplier.name, 'insert', { name: `测试供应商 ${++seq}`, credit_code: creditCode(), ...extra }, { as: admin }); + + // 证书扫描件必填;一条文件记录只能被一个字段引用,所以每张证书各建一条 + const newScan = async () => { + const name = `scan-${++seq}.pdf`; + const [file] = await stack.seed('sys_file', [ + { key: `attachments/${name}`, name, mime_type: 'application/pdf', size: 1, scope: 'attachments', status: 'committed' }, + ]); + return String(file?.id); + }; + + beforeAll(async () => { + stack = await bootStack(config); + admin = await stack.signIn(); + }); + + afterAll(async () => { + await stack?.stop(); + }); + + it('starts a new supplier as potential with a supplier number', async () => { + const row = await newSupplier(); + expect(row.status).toBe('potential'); + expect(row.qualification_alert).toBe(false); + expect(row.supplier_no).toMatch(/^SUP\d{7}$/); + }); + + it('refuses a duplicate credit code', async () => { + const code = creditCode(); + await newSupplier({ credit_code: code }); + await expect(newSupplier({ credit_code: code })).rejects.toBeTruthy(); + }); + + it('refuses a malformed credit code', async () => { + await expect(newSupplier({ credit_code: 'abc123' })).rejects.toMatchObject({ code: 'VALIDATION_FAILED' }); + }); + + it('requires a registration number for an overseas supplier, not a credit code', async () => { + await expect(newSupplier({ country: 'de', credit_code: null })).rejects.toMatchObject({ code: 'VALIDATION_FAILED' }); + const row = await newSupplier({ country: 'de', credit_code: null, registration_no: `DE${seq}` }); + expect(row.country).toBe('de'); + }); + + it('refuses an overseas duplicate by country and registration number', async () => { + await newSupplier({ country: 'jp', credit_code: null, registration_no: 'JP-0001' }); + await expect(newSupplier({ country: 'jp', credit_code: null, registration_no: 'JP-0001' })).rejects.toBeTruthy(); + }); + + it('follows the status state machine', async () => { + const row = await newSupplier(); + await expect( + stack.hooks.run(Supplier.name, 'update', { id: row.id, status: 'qualified' }, { as: admin }), + ).rejects.toMatchObject({ code: 'VALIDATION_FAILED' }); + const qualifying = await stack.hooks.run(Supplier.name, 'update', { id: row.id, status: 'qualifying' }, { as: admin }); + expect(qualifying.status).toBe('qualifying'); + }); + + it('refuses a certificate that expires before it starts', async () => { + const supplier = await newSupplier(); + await expect( + stack.hooks.run( + SupplierCertificate.name, + 'insert', + { supplier: supplier.id, cert_type: 'iso9001', valid_from: '2026-06-01', valid_to: '2026-01-01', attachment: await newScan() }, + { as: admin }, + ), + ).rejects.toThrow(/Valid To cannot be earlier/); + }); + + it('counts contacts and expired certificates on the supplier', async () => { + const supplier = await newSupplier(); + await stack.hooks.run(SupplierContact.name, 'insert', { supplier: supplier.id, name: '张三', email: 'zhang@example.com' }, { as: admin }); + for (const status of ['valid', 'expired']) { + await stack.hooks.run( + SupplierCertificate.name, + 'insert', + { supplier: supplier.id, cert_type: 'iso9001', status, attachment: await newScan() }, + { as: admin }, + ); + } + const [row] = await stack.rows(Supplier.name, { id: supplier.id }, { as: admin }); + expect(row).toMatchObject({ contact_count: 1, expired_certificate_count: 1 }); + }); + + it('allows one qualification per supplier and category', async () => { + const supplier = await newSupplier(); + const category = await stack.hooks.run(Category.name, 'insert', { code: `T${seq}`, name: '测试品类' }, { as: admin }); + const first = await stack.hooks.run(SupplierCategory.name, 'insert', { supplier: supplier.id, category: category.id }, { as: admin }); + expect(first.status).toBe('trial'); + await expect( + stack.hooks.run(SupplierCategory.name, 'insert', { supplier: supplier.id, category: category.id }, { as: admin }), + ).rejects.toBeTruthy(); + }); +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..e6973cc --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "allowImportingTsExtensions": false, + "noEmit": true, + "isolatedModules": true + }, + "include": ["*.ts", "src/**/*", "test/**/*"] +} diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..21573f4 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from 'vitest/config'; + +// `pnpm test` runs every `*.test.ts` in this project. A test that boots the +// app (see note.test.ts) runs the real engine in this process, so two settings +// differ from vitest's defaults. +export default defineConfig({ + test: { + // Booting the stack takes a few seconds, longer on a busy CI runner, and + // the boot runs in a `beforeAll` hook: allow it more than the default 10s. + hookTimeout: 60_000, + // The stack logs while it boots and while it shuts down. A log line that + // arrives while vitest is closing a test worker can fail a run in which + // every test passed. Printing logs straight to the terminal, instead of + // through vitest's console capture, removes that failure. + disableConsoleIntercept: true, + // At its default level the engine logs one `[Registry]` line for every + // item it registers while booting, over a hundred for this starter alone. + // `warn` keeps the engine's warnings and errors and drops that chatter. + env: { OS_REGISTRY_LOG: 'warn' }, + }, +});