7194d1bcef
Plan 4 Task 7(V2 spec §12.2):apps/preview-server 零依赖 node:http 服务—— 只读 succeeded job 的 dist + route-manifest(不查库),exact/ignore 双索引匹配 (query_key 行全串优先),html/asset 文件服务(manifest content_type 优先、 扩展名 MIME 表兜底、未知扩展 octet-stream)、redirect 301+Location、gone 410、 未命中 404 走 dist/404.html 自定义页;全响应 X-Robots-Tag noindex + HTML 响应 基础 CSP;回环绑定白名单(库级即拒);穿越预检先于 URL 解析(裸/编码点段、 反斜杠)+ target_file resolve+realpath 双检在 dist 内;目录请求一律 404(禁 列表);仅 GET/HEAD。sf.ts 增 preview:start(job 定位 + succeeded 校验 + 产物 行读取后即断池;--host 外值拒绝先于 DB 访问)。集成测试 12 例:真实构建产物 全链 + 手构 gone/MIME 探针行 + CLI 拒绝与子进程 happy path 冒烟。 Co-Authored-By: Claude Code <noreply@anthropic.com>
50 lines
1.9 KiB
JavaScript
50 lines
1.9 KiB
JavaScript
// eslint 9 flat config(Task 14):最小保守集——JS/TS recommended + 少量明显增益规则。
|
||
// 原则:不做风格警察;现有代码若对某规则大面积误报则降级该规则,而非批量改代码。
|
||
import eslint from '@eslint/js'
|
||
import tseslint from 'typescript-eslint'
|
||
|
||
export default tseslint.config(
|
||
// 依赖与构建产物不参与 lint
|
||
{ ignores: ['**/node_modules/**', '**/dist/**', 'coverage/**', '.artifacts/**', '**/.astro/**'] },
|
||
eslint.configs.recommended,
|
||
...tseslint.configs.recommended,
|
||
{
|
||
rules: {
|
||
// 未用变量报错,但允许下划线前缀显式豁免(测试/签名对齐常见)
|
||
'@typescript-eslint/no-unused-vars': [
|
||
'error',
|
||
{ argsIgnorePattern: '^_', varsIgnorePattern: '^_', caughtErrorsIgnorePattern: '^_' },
|
||
],
|
||
},
|
||
},
|
||
{
|
||
// 测试代码放宽 no-explicit-any:夹具行插入用 `as any` 表达"部分列 + 任意宽松形状"、
|
||
// catch (e: any) 取 postgres.js 错误细节,均为有意为之(49 处违例集中于此)。
|
||
// 生产代码(src/)保持该规则严格。
|
||
files: ['tests/**/*.ts', '**/test/**/*.ts'],
|
||
rules: {
|
||
'@typescript-eslint/no-explicit-any': 'off',
|
||
},
|
||
},
|
||
{
|
||
// Node 直跑的 .mjs 工具脚本(如 scripts/smoke-real-wxr.mjs、apps/preview-server/
|
||
// server.mjs):no-undef 对 TS 文件由 TS 接管而关闭,但 .mjs 仍生效且无 node
|
||
// 全局——此处显式声明 node 全局,否则 process/setInterval/URL 等误报 no-undef。
|
||
files: ['scripts/**/*.mjs', 'apps/preview-server/**/*.mjs'],
|
||
languageOptions: {
|
||
globals: {
|
||
process: 'readonly',
|
||
setInterval: 'readonly',
|
||
clearInterval: 'readonly',
|
||
setTimeout: 'readonly',
|
||
clearTimeout: 'readonly',
|
||
console: 'readonly',
|
||
performance: 'readonly',
|
||
Buffer: 'readonly',
|
||
URL: 'readonly',
|
||
URLSearchParams: 'readonly',
|
||
},
|
||
},
|
||
},
|
||
)
|