_includes/resources/tip/TipModels.ts (79 lines of code) (raw):

import { Static, Type } from "@sinclair/typebox"; import { getThumbnailPath, Resource, ResourceFrontmatter, } from "../../../src/ResourceModels"; import { EleventyPage } from "../../../src/models"; import { ThumbnailField, VideoField, VideoVerticalField, } from "../commonModels"; import { TIP_RESOURCE_TYPE } from "../../../src/resourceType"; import path from "upath"; // noinspection DuplicatedCode export const TipFrontmatter = Type.Intersect([ ResourceFrontmatter, ThumbnailField, VideoField, VideoVerticalField, Type.Object({ animatedGif: Type.Optional( Type.Object( { file: Type.String({ description: "File name of the animated GIF, can be webm or gif", }), width: Type.Optional( Type.Number({ description: "Width the animated GIF should be rendered", }), ), height: Type.Optional( Type.Number({ description: "Height the animated GIF should be rendered", }), ), }, { description: "Animated GIF to show in this tip" }, ), ), screenshot: Type.Optional( Type.String({ description: "File name of a screenshot to show in this tip", }), ), seealso: Type.Optional( Type.Any({ description: "Item(s) to show in the See Also section of this tip", }), ), }), ]); export type TipFrontmatter = Static<typeof TipFrontmatter>; export class Tip extends Resource<TIP_RESOURCE_TYPE> implements TipFrontmatter { animatedGif?: TipFrontmatter["animatedGif"]; screenshot?: TipFrontmatter["screenshot"]; seealso?: any; thumbnail: TipFrontmatter["thumbnail"]; video?: TipFrontmatter["video"]; videoVertical?: TipFrontmatter["videoVertical"]; static frontmatterSchema = TipFrontmatter; constructor({ data, page }: { data: TipFrontmatter; page: EleventyPage }) { // noinspection DuplicatedCode super({ data, page }); this.animatedGif = data.animatedGif; if (this.animatedGif) { this.animatedGif.file = path.join(page.url, this.animatedGif.file); } this.video = data.video; this.videoVertical = data.videoVertical; this.screenshot = data.screenshot ? path.join(page.url, data.screenshot) : undefined; this.seealso = data.seealso; this.thumbnail = getThumbnailPath(data.thumbnail, page.url); } getThumbnail(): string { return this.thumbnail; } }