All files / src content.config.ts

0% Statements 0/0
0% Branches 0/0
0% Functions 0/0
0% Lines 0/0

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41                                                                                 
import { defineCollection, z } from "astro:content";
import { glob } from "astro/loaders";
 
const blog = defineCollection({
  // 記事の URL は frontmatter の slug がそのまま決めているので、
  // Content Layer の id にもそれを使って従来の URL を維持する
  loader: glob({
    pattern: "**/*.md",
    base: "./src/content/blog",
    generateId: ({ data, entry }) =>
      typeof data.slug === "string" && data.slug.length > 0
        ? data.slug
        : entry.replace(/\.md$/, ""),
  }),
  schema: z.object({
    slug: z.string(),
    title: z.string(),
    date: z.coerce.date(),
    description: z.string().optional().default(""),
    tags: z.array(z.string()).optional().default([]),
    headerImage: z.string().optional().default(""),
    updatedDate: z.coerce.date().optional(),
    faq: z
      .array(
        z.object({
          question: z.string(),
          answer: z.string(),
        }),
      )
      .optional()
      .default([]),
    templateKey: z.string().optional(),
    useAi: z.boolean().optional().default(false),
    noindex: z.boolean().optional().default(false),
    premium: z.boolean().optional().default(false),
    priceUsd: z.number().optional().default(0.05),
  }),
});
 
export const collections = { blog };