development
js 133 lines 2.51 KB
Raw
1 import { defineDocumentType, makeSource } from "contentlayer2/source-files";
2
3 /** @type {import('contentlayer2/source-files').ComputedFields} */
4 const computedFields = {
5 slug: {
6 type: "string",
7 resolve: (doc) => `/${doc._raw.flattenedPath}`,
8 },
9 slugAsParams: {
10 type: "string",
11 resolve: (doc) => doc._raw.flattenedPath.split("/").slice(1).join("/"),
12 },
13 };
14
15 const ktiComputedFields = {
16 slug: {
17 type: "string",
18 resolve: (doc) => `/kti/apa-itu-${doc._raw.flattenedPath.split("/").pop()}`,
19 },
20 term: {
21 type: "string",
22 resolve: (doc) => `apa-itu-${doc._raw.flattenedPath.split("/").pop()}`,
23 },
24 };
25
26 export const Page = defineDocumentType(() => ({
27 name: "Page",
28 filePathPattern: `pages/**/*.mdx`,
29 contentType: "mdx",
30 fields: {
31 title: {
32 type: "string",
33 required: true,
34 },
35 description: {
36 type: "string",
37 },
38 lastmod: {
39 type: "date",
40 required: true,
41 },
42 },
43 computedFields,
44 }));
45
46 export const Post = defineDocumentType(() => ({
47 name: "Post",
48 filePathPattern: `posts/**/*.mdx`,
49 contentType: "mdx",
50 fields: {
51 title: {
52 type: "string",
53 required: true,
54 },
55 description: {
56 type: "string",
57 },
58 date: {
59 type: "date",
60 required: true,
61 },
62 lastmod: {
63 type: "date",
64 required: true,
65 },
66 published: {
67 type: "boolean",
68 required: true,
69 },
70 },
71 computedFields,
72 }));
73
74 export const Kti = defineDocumentType(() => ({
75 name: "Kti",
76 filePathPattern: `kti/**/*.mdx`,
77 contentType: "mdx",
78 fields: {
79 title: {
80 type: "string",
81 required: true,
82 },
83 term: {
84 type: "string",
85 required: true,
86 },
87 category: {
88 type: "string",
89 required: true,
90 },
91 tags: {
92 type: "list",
93 of: { type: "string" },
94 required: false,
95 },
96 description: {
97 type: "string",
98 required: true,
99 },
100 englishTerm: {
101 type: "string",
102 required: false,
103 },
104 acronym: {
105 type: "string",
106 required: false,
107 },
108 relatedTerms: {
109 type: "list",
110 of: { type: "string" },
111 required: false,
112 },
113 difficulty: {
114 type: "enum",
115 options: ["pemula", "menengah", "lanjut"],
116 required: true,
117 },
118 lastmod: {
119 type: "date",
120 required: true,
121 },
122 published: {
123 type: "boolean",
124 required: true,
125 },
126 },
127 computedFields: ktiComputedFields,
128 }));
129
130 export default makeSource({
131 contentDirPath: "./content",
132 documentTypes: [Post, Page, Kti],
133 });