feat: add grouped TechLog route contracts
This commit is contained in:
@@ -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);
|
||||
Reference in New Issue
Block a user