解析去运行时化(三层架构,plans/refactor/organize-script-refactor.md): - 同步 = 纯镜像:upsertOriginGood 不再写解析列、不再自动挂族;详情同步仍触发重算 - 整理 = 显式人工动作(OrganizeService):解析列回填 → 派生标签(人工接管永不 覆盖)→ auto-group 建族 → 全量重算;入口 CLI(pnpm --filter @inkreach/api organize)+ POST /product-families/organize + 后台「整理」按钮 - 重算 = 纯结构化聚合:不再按名称重派生标签(防上游改名倒灌,回归测试覆盖); 矩阵维度只认标签/CUSTOM 显式标签,未整理成员不进矩阵;工艺=不打印时 印花数量以单面占位(纯结构化规则);「恢复自动」走整理的单链接派生 - 派生默认补齐(脚本层假设):名称无单/双面且工艺非不打印 → 印花数量单面印花 - goods 服务建品/更新后仅镜像标签+重算(不派生);含商品名入库规范化 (normalizeGoodName,管理员输入边界质检) - organize.service.spec 由 tag-sync spec 迁移 + 防倒灌回归;sync/recompute/ public/families spec 全部适配;API 173/173,admin typecheck+22/22
83 lines
2.7 KiB
JSON
83 lines
2.7 KiB
JSON
{
|
|
"name": "@inkreach/api",
|
|
"private": true,
|
|
"version": "1.0.0",
|
|
"description": "NestJS backend for InkReach Product Center",
|
|
"main": "dist/main.js",
|
|
"scripts": {
|
|
"build": "nest build",
|
|
"format": "prettier --write \"src/**/*.ts\"",
|
|
"dev": "nest start --watch",
|
|
"start": "nest start",
|
|
"start:dev": "nest start --watch",
|
|
"start:debug": "nest start --debug --watch",
|
|
"start:prod": "node dist/main",
|
|
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
|
|
"test": "jest",
|
|
"test:watch": "jest --watch",
|
|
"test:cov": "jest --coverage",
|
|
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
|
|
"test:e2e": "jest --config ./test/jest-e2e.json",
|
|
"prisma:generate": "prisma generate",
|
|
"prisma:migrate": "prisma migrate dev",
|
|
"prisma:studio": "prisma studio",
|
|
"configure:product-center-icons": "ts-node prisma/configure-product-center-icons.ts",
|
|
"import:product-detail": "ts-node prisma/import-product-detail.ts",
|
|
"backfill:product-families": "ts-node prisma/backfill-product-families.ts",
|
|
"organize": "ts-node prisma/backfill-product-families.ts"
|
|
},
|
|
"dependencies": {
|
|
"@nestjs/axios": "^3.0.1",
|
|
"@nestjs/common": "^10.3.0",
|
|
"@nestjs/config": "^3.1.1",
|
|
"@nestjs/core": "^10.3.0",
|
|
"@nestjs/jwt": "^10.2.0",
|
|
"@nestjs/passport": "^10.0.3",
|
|
"@nestjs/platform-express": "^10.3.0",
|
|
"@nestjs/schedule": "^4.0.0",
|
|
"@nestjs/swagger": "^7.1.17",
|
|
"@nestjs/throttler": "^6.5.0",
|
|
"@prisma/client": "^5.8.0",
|
|
"@types/multer": "^2.2.0",
|
|
"axios": "^1.6.5",
|
|
"bcrypt": "^5.1.1",
|
|
"class-transformer": "^0.5.1",
|
|
"class-validator": "^0.14.0",
|
|
"cookie-parser": "^1.4.7",
|
|
"express": "^4.21.0",
|
|
"helmet": "^8.3.0",
|
|
"multer": "^2.2.0",
|
|
"passport": "^0.7.0",
|
|
"passport-jwt": "^4.0.1",
|
|
"reflect-metadata": "^0.2.1",
|
|
"rxjs": "^7.8.1"
|
|
},
|
|
"devDependencies": {
|
|
"@nestjs/cli": "^10.2.1",
|
|
"@nestjs/schematics": "^10.0.3",
|
|
"@nestjs/testing": "^10.3.0",
|
|
"@types/bcrypt": "^5.0.2",
|
|
"@types/cookie-parser": "^1.4.10",
|
|
"@types/express": "^4.17.21",
|
|
"@types/jest": "^29.5.11",
|
|
"@types/node": "^20.10.6",
|
|
"@types/passport-jwt": "^4.0.0",
|
|
"@types/supertest": "^6.0.2",
|
|
"@typescript-eslint/eslint-plugin": "^6.17.0",
|
|
"@typescript-eslint/parser": "^6.17.0",
|
|
"eslint": "^8.56.0",
|
|
"eslint-config-prettier": "^9.1.0",
|
|
"eslint-plugin-prettier": "^5.1.2",
|
|
"jest": "^29.7.0",
|
|
"prettier": "^3.1.1",
|
|
"prisma": "^5.8.0",
|
|
"source-map-support": "^0.5.21",
|
|
"supertest": "^6.3.3",
|
|
"ts-jest": "^29.1.1",
|
|
"ts-loader": "^9.5.1",
|
|
"ts-node": "^10.9.2",
|
|
"tsconfig-paths": "^4.2.0",
|
|
"typescript": "^5.3.3"
|
|
}
|
|
}
|