/** * 自检:不依赖 wrangler / 网络,直接验证最容易出错的那几块纯逻辑。 * node node_modules/.bin/esbuild tools/selftest.ts --bundle --platform=node --format=esm --outfile=tools/.selftest.mjs && node tools/.selftest.mjs */ import { md5, md5Lower } from '../src/lib/md5'; import { formatDateCN } from '../src/lib/util'; import { renderMarkdown } from '../src/lib/md'; import { hashPassword, verifyPassword, signToken, verifyToken } from '../src/lib/session'; import { parseSimpleYaml } from '../src/routes/admin'; import type { Env } from '../src/types'; let pass = 0; let fail = 0; function eq(name: string, actual: unknown, expected: unknown) { const a = JSON.stringify(actual); const e = JSON.stringify(expected); if (a === e) { pass++; console.log(` PASS ${name}`); } else { fail++; console.log(` FAIL ${name}\n 实际: ${a}\n 期望: ${e}`); } } function ok(name: string, cond: boolean) { eq(name, cond, true); } // ------------------------------------------------------------------ MD5 console.log('== MD5(Gravatar hash,必须与官方一致) =='); eq('md5("")', md5(''), 'd41d8cd98f00b204e9800998ecf8427e'); eq('md5("abc")', md5('abc'), '900150983cd24fb0d6963f7d28e17f72'); eq('md5("test@example.com")', md5('test@example.com'), '55502f40dc8b7c769880b10874abc9d0'); eq('md5("z@usj.cc")', md5('z@usj.cc'), '1cce0a22c2c7648eab76ec876c6a54d9'); eq('md5("优世界") 多字节', md5('优世界'), '7fc1dce97eead18fa9e9ae4fbb8044cb'); eq('md5 长输入(跨 block)', md5('a'.repeat(200)), '887f30b43b2867f4a9accceee7d16e6c'); eq('md5Lower 去空格+小写', md5Lower(' Z@USJ.CC '), '1cce0a22c2c7648eab76ec876c6a54d9'); async function main() { // ------------------------------------------------------------------ 时间 console.log('== 时间格式(Asia/Shanghai) =='); eq('1631363636000', formatDateCN(1631363636000), '2021-09-11 20:33:56'); eq('0', formatDateCN(0), '1970-01-01 08:00:00'); // ------------------------------------------------------------------ Markdown console.log('== Markdown 渲染 =='); ok('').includes('