Files
portfolio/src/content.config.ts

99 lines
2.4 KiB
TypeScript

import { glob } from "astro/loaders";
import { defineCollection, z } from "astro:content";
const projects = defineCollection({
loader: glob({ pattern: "**/*.mdx", base: "./projects" }),
schema: z.object({
title: z.string(),
role: z.string(),
type: z.string(),
date: z.date(),
description: z.string(),
slug: z.string(),
ongoing: z.boolean().optional().default(false),
keyFigure: z
.array(
z.object({
title: z.string(),
name: z.string(),
href: z.string().optional()
})
)
.optional(),
frontPage: z
.object({
order: z.number()
})
.optional(),
images: z.object({
hero: z.object({
src: z.preprocess(
(val) => `/src/assets/img/project-heros/${val}`,
z.string()
),
alt: z.string()
}),
other: z
.preprocess((val) => `/src/assets/img/projects/${val}`, z.string())
.optional()
}),
externalLinks: z
.array(
z.object({
name: z.string(),
href: z.string(),
icon: z.string()
})
)
.optional()
})
});
const awards = defineCollection({
loader: glob({ pattern: "**/*.mdx", base: "./src/assets/awards" }),
schema: z.object({
title: z.string(),
giver: z.string(),
date: z.date()
})
});
const tracks = defineCollection({
loader: glob({ pattern: "**/*.json", base: "./src/assets/tracks" }),
schema: ({ image }) =>
z.object({
src: z.preprocess((val) => `/audio/${val}`, z.string()),
metadata: z.object({
title: z.string(),
subtitle: z.string().optional(),
extra: z.string().optional(),
artist: z.string().optional().default("Nathan Cummins"),
artwork: z
.preprocess((val) => `/src/assets/img/tracks/${val}`, image())
.optional()
}),
autoQueue: z
.object({
order: z.number()
})
.optional(),
card: z
.object({
image: z.object({
src: z.preprocess(
(val) => `/src/assets/img/tracks/${val}`,
image()
),
alt: z.string()
}),
text: z.object({
primary: z.string(),
secondary: z.string()
})
})
.optional()
})
});
export const collections = { projects, awards, tracks };