Files
Reactive-Resume/packages/resume/src/stylesheet/render-data.ts
T
2026-07-30 12:39:15 +02:00

50 lines
1.5 KiB
TypeScript

import type { ResumeData, StyleRule } from "@reactive-resume/schema/resume/data";
import { resumeDataSchema } from "@reactive-resume/schema/resume/data";
export type RenderDataProjection = {
picture: ResumeData["picture"];
basics: ResumeData["basics"];
summary: ResumeData["summary"];
sections: ResumeData["sections"];
customSections: ResumeData["customSections"];
metadata: {
template: ResumeData["metadata"]["template"];
layout: ResumeData["metadata"]["layout"];
page: ResumeData["metadata"]["page"];
design: ResumeData["metadata"]["design"];
typography: ResumeData["metadata"]["typography"];
styleRules?: StyleRule[];
stylesheet?: never;
notes?: never;
};
};
function project(data: ResumeData): RenderDataProjection {
const parsed = resumeDataSchema.parse(data);
const includeLegacyRules = parsed.metadata.stylesheet?.mode !== "semantic";
return {
picture: parsed.picture,
basics: parsed.basics,
summary: parsed.summary,
sections: parsed.sections,
customSections: parsed.customSections,
metadata: {
template: parsed.metadata.template,
layout: parsed.metadata.layout,
page: parsed.metadata.page,
design: parsed.metadata.design,
typography: parsed.metadata.typography,
...(includeLegacyRules ? { styleRules: parsed.metadata.styleRules } : {}),
},
};
}
export function projectRenderData(data: ResumeData): RenderDataProjection {
return project(data);
}
export function projectPublicRenderData(data: ResumeData): RenderDataProjection {
return project(data);
}