feat(admin): add production error center and refresh CMS dependencies
This commit is contained in:
1 parent
c6b919c01d
commit
816e3875c2
47 files changed
+1545
-547
No files matched your search
@@ -0,0 +1,56 @@
|
||||
import { mkdtemp, rm } from "node:fs/promises";
|
||||
import os from "node:os";
|
||||
import path from "node:path";
|
||||
import { expect, it } from "vitest";
|
||||
import { createErrorRecord, ErrorStore } from "./error-monitor";
|
||||
|
||||
it("redacts secrets in messages, stack and context while retaining a reference", () => {
|
||||
const r = createErrorRecord(
|
||||
"server",
|
||||
"payment.failed",
|
||||
new Error("https://user:password@host/a?token=abc password=hello"),
|
||||
{
|
||||
token: "secret",
|
||||
path: "/a?session=hidden",
|
||||
nested: { password: "never" },
|
||||
},
|
||||
);
|
||||
const text = JSON.stringify(r);
|
||||
for (const secret of ["password@", "token=abc", "hello", "hidden", "never"])
|
||||
expect(text).not.toContain(secret);
|
||||
expect(r.id).toBeTruthy();
|
||||
expect(r.stack).toContain("Error");
|
||||
});
|
||||
it("persists across instances and groups repeated errors without losing references", async () => {
|
||||
const dir = await mkdtemp(path.join(os.tmpdir(), "cms-errors-"));
|
||||
try {
|
||||
const store = new ErrorStore(dir);
|
||||
const a = createErrorRecord("server", "test", new Error("failed"));
|
||||
await store.append(a);
|
||||
await store.append({ ...a, id: "second" });
|
||||
const result = await new ErrorStore(dir).read();
|
||||
expect(result.records).toHaveLength(2);
|
||||
expect(result.records[0].fingerprint).toBe(result.records[1].fingerprint);
|
||||
} finally {
|
||||
await rm(dir, { recursive: true, force: true });
|
||||
}
|
||||
});
|
||||
it("resolves a group and reopens it when a later occurrence arrives", async () => {
|
||||
const dir = await mkdtemp(path.join(os.tmpdir(), "cms-errors-"));
|
||||
try {
|
||||
const store = new ErrorStore(dir);
|
||||
const a = createErrorRecord("server", "test", new Error("failed"));
|
||||
await store.append(a);
|
||||
await store.resolve(a.fingerprint);
|
||||
expect((await store.read()).records[0].resolved).toBe(true);
|
||||
await store.append({
|
||||
...a,
|
||||
id: "later",
|
||||
at: new Date(Date.now() + 1000).toISOString(),
|
||||
});
|
||||
expect((await store.read()).records[0].resolved).toBe(false);
|
||||
await expect(store.resolve("../escape")).rejects.toThrow();
|
||||
} finally {
|
||||
await rm(dir, { recursive: true, force: true });
|
||||
}
|
||||
});
|
||||
Reference in new issue
Block a user