function trimSlashes(input: string): string { return input.trim().replace(/^\/+|\/+$/g, ""); } /** 静态资源 URL 前缀固定为 `/static`,不允许通过环境变量覆写。 */ export const STATIC_PUBLIC_PREFIX = "/static"; /** 静态资源根目录,默认 `static` */ export const STATIC_DIR = trimSlashes(process.env.STATIC_DIR ?? "static"); /** 媒体上传子目录(相对 STATIC_DIR),默认 `media` */ export const MEDIA_UPLOAD_SUBDIR = trimSlashes(process.env.MEDIA_UPLOAD_SUBDIR ?? "media"); /** 媒体上传目录(相对项目根),默认 `static/media` */ export const RELATIVE_ASSETS_DIR = `${STATIC_DIR}/${MEDIA_UPLOAD_SUBDIR}`; /** 临时目录(相对项目根),默认 `.tmp` */ export const RELATIVE_TMP_DIR = trimSlashes(process.env.TMP_DIR ?? ".tmp"); /** 与 `media` 返回及静态路径一致,无前导 host */ export const POST_MEDIA_PUBLIC_PREFIX = `/${RELATIVE_ASSETS_DIR}/`; /** 从未引用:created_at 起算;曾引用:dereferenced_at 起算 */ export const MEDIA_ORPHAN_GRACE_HOURS_NEVER_REF = 24; export const MEDIA_ORPHAN_GRACE_HOURS_AFTER_DEREF = 24; export const MEDIA_IMAGE_MAX_WIDTH_PX = 1920; export const MEDIA_WEBP_QUALITY = 82;