Files
OJ2/apps/api/src/runtime.ts
yuetsh ed56a209ea
Some checks failed
Deploy / deploy (push) Has been cancelled
chore(格式): Prettier 统一到全仓,后端和契约一次性格式化
原来只有 `apps/web` 在 Prettier 下(配置在 `apps/web/.prettierrc.toml`、脚本在
web 的 package.json),后端和契约从来没格式化过 —— 手写在 100 列上下,`db/schema.ts`
还是 drizzle-kit pull 留下的 tab 缩进。两套口径分叉久了,跨端改一处就得记着「这边
什么风格」。

- 配置搬到根目录 `.prettierrc.toml`,内容不变(`semi=false`,其余全默认,
  printWidth 80 —— 和前端已有的格式一致,不另立一套宽度);
- 脚本统一成根目录 `bun run fmt`,覆盖 `apps/*/src`、`apps/web/tests` 和两个构建
  配置;web 自己那份 `fmt` 和重复的 prettier 依赖删掉;
- `.prettierignore` 挡掉两类不该碰的:drizzle-kit 生成的 `src/db/meta/` 结构快照
  (它是 db:generate 的比对输入,只该由 drizzle-kit 写)、unplugin 每次 dev 都会
  重写的 `auto-imports.d.ts` / `components.d.ts`;
- 全量跑了一遍。纯格式,无行为改动:api typecheck / check:routes / check:ast、
  前端 type-check 全过,起 api 打了接口确认正常。前端这 39 个文件的小改动是
  prettier 版本漂移(类型断言的换行口径变了),不是新配置带来的。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 08:27:34 -06:00

56 lines
2.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { resolve } from "node:path"
/**
* 运行形态的判定:开发时是 `bun src/main.ts`,生产是 `bun build --compile` 出来的单二进制。
*
* 两者最要命的差别是**路径**。编译产物里 `import.meta.dir` 恒为 `/$bunfs/root`
* Bun 把内嵌文件摊在那个虚拟目录下),于是任何 `resolve(import.meta.dir, "../..")`
* 都会指到文件系统根:`data/test_case` 变成 `/data/test_case`。这种错误不会报错,
* 只会安静地读写错地方,所以必须显式分叉,不能靠"相对路径反正差不多"。
*/
export const isCompiled = import.meta.dir.startsWith("/$bunfs")
/**
* 起一个「自己」的子进程时该用的命令。SQL 判题要 fork 一个可被 SIGKILL 的子进程,
* 见 judge/sql/index.ts。
*
* - 编译后:二进制自己就是入口,`[binary, "sql-child"]`
* - 开发时:`process.execPath` 是 bun得把入口脚本一起带上`[bun, main.ts, "sql-child"]`
*/
export function selfCommand(subcommand: string): string[] {
if (isCompiled) return [process.execPath, subcommand]
return [process.execPath, resolve(import.meta.dir, "main.ts"), subcommand]
}
/**
* 相对路径的解析基准。
*
* - 编译后:按进程 cwd 解析。容器里 workdir 固定,且这些目录本来就该由环境变量显式给出,
* cwd 只是最后的兜底。
* - 开发时:按仓库根解析。因为 `bun run --filter '@oj2/api' dev` 会把 cwd 切到 apps/api/
* 而 docker/compose.dev.yml 挂给判题沙箱的是**仓库根**的 data/test_case —— 按 cwd 解析
* 就会落到 apps/api/data/ 下,两边不是同一个目录,新传的测试点判题时报「找不到测试数据」。
*/
export const pathBase = isCompiled
? process.cwd()
: resolve(import.meta.dir, "../../..")
/**
* 迁移文件(`0000_*.sql` … + `meta/_journal.json`)所在目录。
*
* 这些文件**不内嵌进二进制**,而是随镜像一起装到一个固定绝对路径下。
* 之所以能这么做、也应该这么做CLAUDE.md 里「单二进制是有代价的」那条讲的是
* 不能依赖 node_modules、不能拿 `import.meta.dir` 去推路径(编译后它恒为
* `/$bunfs/root`,往上几级就跑到文件系统根)。按一个**显式给定的绝对路径**读一个
* 数据目录不在此列。
*
* 换来的好处是 drizzle 的 `migrate()` 能原样用 —— 它靠 `_journal.json` 自动发现
* 迁移,和 Django 扫 `migrations/` 是一回事。要是改成内嵌,就得为每条迁移手写一行
* import那是迟早会漏的账。
*/
export const migrationsDir =
process.env.OJ2_MIGRATIONS_DIR ??
(isCompiled
? "/usr/local/share/oj2/migrations"
: resolve(import.meta.dir, "db"))