File size: 1,400 Bytes
acfefde | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | // 端到端:setSetting -> push 到云端 -> hydrate 拉回本地。用 npx tsx 跑。
import "dotenv/config";
import { setSetting, getSetting, deleteSettings } from "../src/server/db";
import { hydrateFromSupabase } from "../src/server/hydrate";
import { createClient } from "@supabase/supabase-js";
const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));
const stamp = `v-${Date.now()}`;
setSetting("selftest.sync", stamp); // 本地写 + fire-and-forget push
console.log("local set:", getSetting("selftest.sync"));
await sleep(3000); // 等 push 落地
const c = createClient(process.env.SUPABASE_URL as string, process.env.SUPABASE_SERVICE_KEY as string, {
auth: { persistSession: false, autoRefreshToken: false }
});
const remote = await c.from("app_settings").select("value").eq("key", "selftest.sync");
console.log("push ->", remote.data?.[0]?.value === stamp ? "PUSH OK" : `PUSH FAIL (${JSON.stringify(remote.data)})`);
await hydrateFromSupabase(); // 拉回本地(验证 hydrate 不崩 + named params 正确)
console.log("after hydrate local:", getSetting("selftest.sync"));
deleteSettings(["selftest.sync"]); // 清理:本地删 + push 删云端
await sleep(1500);
const after = await c.from("app_settings").select("value").eq("key", "selftest.sync");
console.log("cleanup ->", (after.data?.length ?? 0) === 0 ? "CLEAN OK" : "still present");
process.exit(0);
|