586d715455
- registerSource(db, input):wxr/sitemap/媒体目录三类输入登记为 content-addressed 快照——流式 copy+sha256 单遍双算(64KB 块),副本落 storage/snapshots/<kind>/<sha256前2>/<sha256>(文件)或 <sha256>/(媒体整树), 后续任务只读副本;UNIQUE(site,kind,sha256) 幂等(重复登记复用既有行) - media_bundle 哈希钉死:排序相对路径('/' 归一)+ 每文件 sha256 → canonical JSON(键排序无空白)→ 再 sha256;不含 mtime、不依赖遍历顺序;完整清单 (path/bytes/sha256)入 metadata jsonb;符号链接(含 junction)跳过并记录 - site 按 key select-then-insert upsert(23505 竞态重查);connection 判重键 (site_id,name) 为应用层 select-then-insert(表无库级唯一,注释注明) - 路径安全:输入 realpath 后须在 allowedRoots 白名单内(缺省 storage/incoming), ENOENT/越界/类型不符抛带 code 的 SourceRegisterError;全部输入先校验后摄取, 任何失败零落库零复制 - 报告落 artifacts/register/<runId>/reports/register.json(runId=时间戳+随机; 输入清单/哈希/大小/耗时) - scripts/sf.ts(commander):wxr:probe 只读诊断(任意可读路径,IO/损坏文件出 报告不崩——Task 6 fatalError 契约)出 JSON/HTML 报告;source:register 调服务 出摘要。CLI 机制钉死:根 devDep tsx + 根 script sf + commander 根依赖,TS 源码 直连(@sf/* 经 tsconfig paths,不经 dist) - source.module.ts:Nest 注册 SourceRegisterService(standalone context 用); register.service.ts 刻意零装饰器(CLI/测试直 import 不拉 reflect-metadata) - launder 类型垫片改经 triple-slash 引用随 html.ts 进任意编译程序(apps/api 与 根程序直连适配器源码的新场景);apps/api 增 @sf/adapter-wp workspace 依赖与 paths 映射(register.service 消费 ADAPTER_VERSION 单源) - 测试 +7(tests/integration/source-register.test.ts,临时库 + tmpdir storage/ 报告根 finally 清理):三输入登记/清单哈希定义对拍/重复登记幂等/mtime 排除/ 副本布局与内容一致/路径安全六分支/junction 跳过/报告契约;全套 260 绿 Co-Authored-By: Claude Code <noreply@anthropic.com>
28 lines
801 B
JSON
28 lines
801 B
JSON
{
|
||
"name": "@sf/api",
|
||
"version": "0.1.0",
|
||
"description": "SiteForge API:NestJS 模块化单体骨架(本切片以 standalone context 供 CLI 使用,不监听端口)+ Drizzle/postgres.js 接入",
|
||
"type": "module",
|
||
"scripts": {
|
||
"build": "tsc -p tsconfig.build.json",
|
||
"typecheck": "tsc -p tsconfig.json --noEmit",
|
||
"db:generate": "drizzle-kit generate",
|
||
"db:migrate": "drizzle-kit migrate"
|
||
},
|
||
"dependencies": {
|
||
"@nestjs/common": "^10.4.22",
|
||
"@nestjs/core": "^10.4.22",
|
||
"@sf/adapter-wp": "workspace:*",
|
||
"drizzle-orm": "^0.45.4",
|
||
"postgres": "^3.4.9",
|
||
"reflect-metadata": "^0.2.2",
|
||
"rxjs": "^7.8.1"
|
||
},
|
||
"devDependencies": {
|
||
"@types/node": "^22",
|
||
"dotenv": "^18.0.8",
|
||
"drizzle-kit": "^0.31.11",
|
||
"typescript": "^5.6.0"
|
||
}
|
||
}
|