Files
JunoZ-DEVandClaude Fable 5.1 5c95b5219f feat(security): API 增加全局限流,修正站点地图脚本的 XML 实体解码顺序
- 注册 @fastify/rate-limit,默认每个来源 IP 每分钟 600 次,RATE_LIMIT_MAX 可调、0 关闭
- submit-baidu-urls 的 decodeXmlEntities 最后替换 &,避免二次解码
- 对应 CodeQL js/missing-rate-limiting 与 js/double-escaping 告警

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-16 05:19:20 +08:00

81 lines
3.8 KiB
JSON

{
"name": "@lindyson/api",
"private": true,
"version": "0.1.0",
"license": "Apache-2.0",
"type": "module",
"scripts": {
"build": "node --input-type=module --eval \"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json",
"canary:prompt-wizard:local": "npm run build && node dist/tools/canaryPromptWizardV6.js",
"canary:prompt-wizard:local:prod": "node dist/tools/canaryPromptWizardV6.js",
"canary:prompt-wizard:legacy": "tsx src/tools/canaryPromptWizardProvider.ts",
"eval:prompt-wizard-v3": "tsx src/tools/evaluatePromptWizardV3BlindSet.ts",
"eval:prompt-wizard-v3:prod": "node dist/tools/evaluatePromptWizardV3BlindSet.js",
"canary:seedream": "tsx src/tools/canarySeedreamProvider.ts",
"canary:seedream:prod": "node dist/tools/canarySeedreamProvider.js",
"canary:seedance-25-shadow": "tsx src/tools/canarySeedance25Shadow.ts",
"canary:seedance-25-shadow:prod": "node dist/tools/canarySeedance25Shadow.js",
"backfill:image-thumbnails": "tsx src/tools/backfillImageThumbnails.ts",
"backfill:image-thumbnails:prod": "node dist/tools/backfillImageThumbnails.js",
"backfill:image-metadata": "tsx src/tools/backfillImageMetadata.ts",
"backfill:image-metadata:prod": "node dist/tools/backfillImageMetadata.js",
"backfill:uploaded-video-thumbnails": "tsx src/tools/backfillUploadedVideoThumbnails.ts",
"backfill:uploaded-video-thumbnails:prod": "node dist/tools/backfillUploadedVideoThumbnails.js",
"recover:generated-video-thumbnails": "tsx src/tools/backfillUploadedVideoThumbnails.ts --generated",
"recover:generated-video-thumbnails:prod": "node dist/tools/backfillUploadedVideoThumbnails.js --generated",
"import:provider-operational-usage": "tsx src/tools/importProviderOperationalUsage.ts",
"import:provider-operational-usage:prod": "node dist/tools/importProviderOperationalUsage.js",
"audit:provider-billing": "tsx src/tools/auditProviderBillingAttribution.ts",
"audit:provider-billing:prod": "node dist/tools/auditProviderBillingAttribution.js",
"check": "npm run typecheck && npm run test",
"db:migrate": "tsx src/db/migrate.ts",
"db:migrate:prod": "node dist/db/migrate.js",
"db:bootstrap-admin": "tsx src/db/bootstrapAdmin.ts",
"db:bootstrap-admin:prod": "node dist/db/bootstrapAdmin.js",
"db:seed": "tsx src/db/seed.ts",
"db:seed:prod": "node dist/db/seed.js",
"db:seed:dev": "tsx src/db/seedDevelopmentFixtures.ts",
"dev": "tsx watch src/server.ts",
"recover:seedance-task": "node dist/tools/recoverSeedanceTask.js",
"start": "node dist/server.js",
"test": "vitest run",
"typecheck": "tsc --noEmit -p tsconfig.json",
"worker:dev": "tsx watch src/worker/generationWorker.ts",
"worker:start": "node dist/worker/generationWorker.js"
},
"dependencies": {
"@aws-sdk/client-s3": "3.1150.0",
"@aws-sdk/s3-request-presigner": "3.1150.0",
"@fastify/cors": "^11.3.1",
"@fastify/formbody": "^8.0.2",
"@fastify/jwt": "^10.2.4",
"@fastify/middie": "9.3.5",
"@fastify/rate-limit": "^10.3.0",
"@lindyson/api-contracts": "0.1.0",
"@modelcontextprotocol/node": "2.1.1",
"@modelcontextprotocol/server": "2.3.1",
"bcryptjs": "^2.4.3",
"bullmq": "^5.35.1",
"fastify": "5.12.5",
"fastify-type-provider-zod": "4.0.1",
"file-type": "22.1.1",
"ipaddr.js": "2.5.0",
"nanoid": "^6.0.2",
"node-html-parser": "^9.0.4",
"oidc-provider": "9.12.2",
"pg": "^8.23.1",
"sharp": "0.35.5",
"zod": "^3.24.1",
"zod-to-json-schema": "3.25.2"
},
"devDependencies": {
"@types/bcryptjs": "^2.4.6",
"@types/node": "^26.0.0",
"@types/oidc-provider": "9.12.1",
"@types/pg": "^8.23.1",
"tsx": "^4.23.15",
"typescript": "^6.0.3",
"vitest": "^4.1.9"
}
}