Schema Zod, tipos TypeScript e validador do portfolio.config.json usado pelos templates do OpenPortfolios.
npm install @openportfolios/schemaimport { validateConfig, SCHEMA_VERSION } from "@openportfolios/schema";
import config from "./portfolio.config.json";
const result = validateConfig(config);
if (result.success) {
// result.data é tipado como PortfolioConfig, com defaults aplicados
// (meta.scale, meta.language, meta.animations, meta.credits) e
// meta.favicon resolvido para person.avatar quando ausente.
console.log(result.data.person.name);
} else {
for (const error of result.errors) {
console.error(error.message); // ex: "meta.defaultTheme: Invalid option..."
}
}Também é possível usar o schema Zod diretamente:
import { portfolioConfigSchema, type PortfolioConfig } from "@openportfolios/schema";
const config: PortfolioConfig = portfolioConfigSchema.parse(json);portfolioConfigSchema— schema Zod do config completo, mais os sub-schemas (metaSchema,personSchema,aboutSchema,workExperienceItemSchema,educationItemSchema,projectItemSchema,skillsSchema,certificationItemSchema,blogSchema,discordActivitySchema,socialLinkSchema).- Tipos inferidos:
PortfolioConfig,PortfolioConfigInput,Meta,Person,SocialLink,About,WorkExperienceItem,EducationItem,ProjectItem,Skills,CertificationItem,Blog,DiscordActivity. validateConfig(json: unknown)— retorna{ success: true, data }ou{ success: false, errors }, onde cada erro tempath(ex:"projects.0.tags") emessage.SCHEMA_VERSION— versão do schema descrito por este pacote (atualmente1).
metaepersonsão obrigatórios;about,workExperience,education,projects,skills,certifications,blogediscordActivitysão opcionais e aceitamnull(e[]nas seções de lista) para ocultar a seção.- URLs (
ogImage,favicon,avatar,href,companyUrl,companyImage,certificationImage) são validadas como URL. - Limites:
person.socialaté 6 itens;tagsde experiência até 6;tagsde projeto até 3. - Campos de texto rico (
about.text,companyDescription,bullets,description) são strings comuns — a sintaxe de formatação não é validada.
A especificação completa do arquivo está na documentação do portfolio.config.json.