summaryrefslogtreecommitdiffhomepage
path: root/vhosts/blog/nuldoc-src/slide/slide.ts
blob: 8fe99eabf7c0437e697dbd0ace052280e47771e6 (plain)
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import { SlideError } from "../errors.ts";
import { Revision, stringToDate } from "../revision.ts";
import { z } from "zod/mod.ts";

export const SlideMetadataSchema = z.object({
  slide: z.object({
    uuid: z.string(),
    title: z.string(),
    event: z.string(),
    talkType: z.string(),
    link: z.string(),
    tags: z.array(z.string()),
    revisions: z.array(z.object({
      date: z.string(),
      remark: z.string(),
      isInternal: z.boolean().optional(),
    })),
  }),
});

export type SlideMetadata = z.infer<typeof SlideMetadataSchema>;

export type Slide = {
  sourceFilePath: string;
  uuid: string;
  title: string;
  event: string;
  talkType: string;
  slideLink: string;
  tags: string[];
  revisions: Revision[];
};

export function createNewSlideFromMetadata(
  { slide }: SlideMetadata,
  sourceFilePath: string,
): Slide {
  const revisions = slide.revisions.map(
    (rev, i) => {
      const date = rev.date;
      const remark = rev.remark;
      const isInternal = rev.isInternal ?? false;
      return {
        number: i + 1,
        date: stringToDate(date),
        remark,
        isInternal,
      };
    },
  );
  if (revisions.length === 0) {
    throw new SlideError(
      `[slide.new] 'slide.revisions' field is empty`,
    );
  }

  return {
    sourceFilePath: sourceFilePath,
    uuid: slide.uuid,
    title: slide.title,
    event: slide.event,
    talkType: slide.talkType,
    slideLink: slide.link,
    tags: slide.tags,
    revisions: revisions,
  };
}