test(repo): guard timeline live preview boundaries

This commit is contained in:
2026-04-01 09:43:14 +02:00
parent 5e8babd1e6
commit 167eec31de
2 changed files with 53 additions and 0 deletions
+34
View File
@@ -100,6 +100,40 @@ export const rules = [
], ],
forbidden: [], forbidden: [],
}, },
{
file: "apps/web/src/hooks/timelineLivePreview.ts",
maxLines: 140,
required: [
{
pattern: /\bexport function scheduleLivePreview\b/,
message: "timeline live preview helpers must keep frame scheduling centralized",
},
{
pattern: /\bexport function clearLivePreview\b/,
message: "timeline live preview helpers must keep preview reset logic centralized",
},
{
pattern: /\bexport function preserveLivePreview\b/,
message: "timeline live preview helpers must keep snapshot preservation centralized",
},
],
forbidden: [],
},
{
file: "apps/web/src/hooks/useTimelineDrag.ts",
required: [
{
pattern: /from "\.\/timelineLivePreview\.js"/,
message: "timeline drag must keep live preview behavior delegated to the extracted helper module",
},
],
forbidden: [
{
pattern: /\bfunction (?:toPxValue|joinTransforms|captureLivePreviewTargets|renderLivePreview|scheduleLivePreview|clearLivePreview|datesMatch|preserveLivePreview)\b/,
message: "timeline drag must not re-inline live preview helper implementations",
},
],
},
{ {
file: "docker-compose.prod.yml", file: "docker-compose.prod.yml",
required: [ required: [
@@ -4,6 +4,7 @@ import {
collectArchitectureGuardrailViolations, collectArchitectureGuardrailViolations,
countLines, countLines,
evaluateRule, evaluateRule,
rules,
} from "./check-architecture-guardrails.mjs"; } from "./check-architecture-guardrails.mjs";
describe("architecture guardrails", () => { describe("architecture guardrails", () => {
@@ -66,4 +67,22 @@ describe("architecture guardrails", () => {
"apps/web/src/example.ts: file grew to 4 lines and exceeds maxLines=2; split the ownership surface before expanding it further", "apps/web/src/example.ts: file grew to 4 lines and exceeds maxLines=2; split the ownership surface before expanding it further",
]); ]);
}); });
it("guards the extracted timeline live preview ownership boundary", () => {
const dragRule = rules.find((rule) => rule.file === "apps/web/src/hooks/useTimelineDrag.ts");
const livePreviewRule = rules.find((rule) => rule.file === "apps/web/src/hooks/timelineLivePreview.ts");
assert.ok(dragRule);
assert.ok(livePreviewRule);
assert.deepEqual(evaluateRule(dragRule, "function clearLivePreview() {}\n"), [
"apps/web/src/hooks/useTimelineDrag.ts: missing guardrail anchor: timeline drag must keep live preview behavior delegated to the extracted helper module",
"apps/web/src/hooks/useTimelineDrag.ts: forbidden pattern matched: timeline drag must not re-inline live preview helper implementations",
]);
assert.deepEqual(evaluateRule(livePreviewRule, "export function scheduleLivePreview() {}\n"), [
"apps/web/src/hooks/timelineLivePreview.ts: missing guardrail anchor: timeline live preview helpers must keep preview reset logic centralized",
"apps/web/src/hooks/timelineLivePreview.ts: missing guardrail anchor: timeline live preview helpers must keep snapshot preservation centralized",
]);
});
}); });