diff options
author | João Augusto Costa Branco Marado Torres <torres.dev@disroot.org> | 2025-06-28 18:14:22 -0300 |
---|---|---|
committer | João Augusto Costa Branco Marado Torres <torres.dev@disroot.org> | 2025-06-28 18:14:22 -0300 |
commit | 79fd506d30eef3d113f4a8e3ab9ebd9004f1e8cc (patch) | |
tree | 96ff57c92e897c3cc3331e23043d20f1665c7d0a /src/content.config.ts | |
parent | a1eac976b20e39f86d5944fbec68e2a0f8ffb746 (diff) |
feat: index page
Signed-off-by: João Augusto Costa Branco Marado Torres <torres.dev@disroot.org>
Diffstat (limited to 'src/content.config.ts')
-rw-r--r-- | src/content.config.ts | 103 |
1 files changed, 3 insertions, 100 deletions
diff --git a/src/content.config.ts b/src/content.config.ts index f652cc3..821faf5 100644 --- a/src/content.config.ts +++ b/src/content.config.ts @@ -1,114 +1,17 @@ import { file, glob } from "astro/loaders"; -import { defineCollection, reference, z } from "astro:content"; +import { defineCollection, type z } from "astro:content"; //import { parse } from "@std/toml"; import { parse } from "toml"; -import { EntityTypesEnum, KeywordsEnum, LicensesEnum } from "./consts.ts"; -import { get, instanciate } from "./utils/anonymous.ts"; -import { isValidLocale } from "./utils/lang.ts"; - -const Blog = z.object({ - title: z.string().trim(), - subtitle: z.string().trim().optional(), - description: z.string().trim().optional(), - keywords: z.array(KeywordsEnum).optional().refine( - (keywords) => new Set(keywords).size === (keywords?.length ?? 0), - { - message: "Keywords must be unique", - }, - ).transform((keywords) => - keywords !== undefined ? new Set(keywords).values().toArray() : undefined - ), - dateCreated: z.coerce.date(), - dateUpdated: z.coerce.date().optional(), - locationCreated: z.string().trim().optional(), - relatedPosts: z.array(reference("blog")).default([]).refine( - (posts) => new Set(posts).size === (posts?.length ?? 0), - { - message: "Related posts referenced multiple times", - }, - ).transform((x) => new Set(x)).transform((set) => set.values().toArray()), - lang: z.string().trim().refine(isValidLocale), - translationOf: reference("blog").optional(), - signers: z.array( - z.object({ entity: reference("entity"), role: EntityTypesEnum }), - ).optional().refine( - (signers) => { - if (signers === undefined) return true; - return signers.filter((s) => s.role === "author").length <= 1; - }, - { - message: "There can only be one author", - }, - ).refine( - (signers) => { - const ids = signers?.map(get("entity")) ?? []; - return new Set(ids).size === ids.length; - }, - { - message: "Reusing signers", - }, - //).transform((signers) => - // Object.fromEntries(new Map(signers?.map(({ entity, ...rest }) => [entity, rest]) ?? [])) - ), - license: LicensesEnum, -}).refine( - ({ dateCreated, dateUpdated }) => - dateUpdated === undefined || dateCreated.getTime() <= dateUpdated.getTime(), - { message: "Update before creation" }, -).refine( - ({ translationOf, keywords }) => - translationOf !== undefined || (keywords?.length ?? 0) > 0, - { - message: "Originals must include at least one keyword", - path: ["keywords"], - }, -).refine( - ({ translationOf, keywords }) => - (translationOf === undefined) !== ((keywords?.length ?? 0) <= 0), - { - message: "we will use this information from the original, " + - "so no need to specify it for translations", - path: ["keywords"], - }, -).refine( - ({ translationOf, relatedPosts }) => - (translationOf === undefined) || (relatedPosts.length <= 0), - { - message: "we will use this information from the original, " + - "so no need to specify it for translations", - path: ["relatedPosts"], - }, -).refine( - ({ translationOf, signers = [] }) => - (translationOf === undefined) || - (signers.values().every(({ role }) => role !== "translator")), - { - message: "There can't be translator signers on non translated work", - path: ["signers"], - }, -); +import { Blog, Entity } from "./lib/collection/schemas.ts"; const blog = defineCollection({ loader: glob({ base: "./public/blog", pattern: "+([0-9a-z-]).md" }), schema: Blog, }); -export type Blog = z.infer<typeof Blog>; - -const Entity = z.object({ - websites: z.array(z.string().url().trim()).default([]).transform((websites) => - websites.map(instanciate(URL)) - ), - publickey: z.object({ - armor: z.string().trim(), - }), -}); - -type Entity = z.infer<typeof Entity>; - const entity = defineCollection({ loader: file("./src/content/entities.toml", { - parser: (text) => parse(text).entities as Entity[], + parser: (text) => parse(text).entities as z.infer<typeof Entity>[], }), schema: Entity, }); |