Slide 13
Slide 13 text
契約の実物は zod の型
// contract/envelope.ts
export const viewSchema = z.discriminatedUnion('viewKind', [
tableSchema, detailSchema, formSchema,
calendarSchema, ganttSchema, settingsSchema, ...
])
契約が dresscode-ui の本体資産
React のコンポーネントは契約の一つのレンダラにすぎない
export const schemaEnvelope = envelopeHeader.extend({
view: viewSchema,
})
// contract/table.ts
export const columnSchema = z.object({
field:
z.string().min(1),
label:
z.string(),
cellType: z.union([cellType, z.string()]),
sortable: z.boolean(),
align:
z.union([columnAlign, z.null()]).default(null),
})
react を import しない
contract と core が react に依存していないことを、
dependency-cruiser が毎回検査する
知らない値が来ても落とさない
未知の cellType は契約が string として通し、FallbackCell で描
く。union にメンバーを足しても後方互換
この zod の型が契約の実体
契約は JSON Schema / OpenAPI に射影できる。配るときはドキュメントと同じバージョンで出している
13