feat: add grouped TechLog route contracts

This commit is contained in:
DongHyeonka
2026-08-15 20:30:32 +09:00
parent 27dda3e0e3
commit adb8613cb9
15 changed files with 887 additions and 67 deletions
@@ -0,0 +1,56 @@
import { z } from "zod";
function first(value: unknown): unknown {
return Array.isArray(value) ? value[0] : value;
}
const optionalString = z.preprocess(first, z.string().optional());
const optionalSelection = z.preprocess((value) => {
const selected = first(value);
if (typeof selected !== "string") return selected;
const normalized = selected.trim();
return normalized || undefined;
}, z.string().optional());
const nonEmptyParams = <Key extends string>(key: Key) =>
z.object({ [key]: z.string().min(1) } as Record<Key, z.ZodString>).strict();
export const TECH_LOG_ROUTE_CODECS = Object.freeze({
TechLogExploreKindParams: nonEmptyParams("kind"),
TechLogSlugParams: nonEmptyParams("slug"),
TechLogVersionParams: nonEmptyParams("version"),
TechLogDocumentIdParams: nonEmptyParams("id"),
TechLogPublicationEventIdParams: nonEmptyParams("publicationEventId"),
TechLogStudioSplat: z
.object({ "*": z.string().min(1).optional() })
.strict(),
TechLogHomeSearch: z
.object({
focus: optionalString,
state: optionalString,
})
.strip(),
TechLogExploreSearch: z
.object({
type: optionalString,
topic: optionalSelection,
project: optionalSelection,
})
.strip(),
TechLogExploreKindSearch: z
.object({
topic: optionalSelection,
project: optionalSelection,
})
.strip(),
TechLogSearchQuery: z
.object({
q: optionalSelection,
})
.strip(),
TechLogCaseStateSearch: z
.object({
state: optionalString,
})
.strip(),
} as const);