_includes/resources/playlist/PlaylistModels.ts (53 lines of code) (raw):

import { Static, Type } from "@sinclair/typebox"; import { getThumbnailPath, Resource, ResourceFrontmatter, ResourceMap, } from "../../../src/ResourceModels"; import { EleventyPage } from "../../../src/models"; import { ThumbnailField } from "../commonModels"; import { PLAYLIST_RESOURCE_TYPE } from "../../../src/resourceType"; export const PlaylistFrontmatter = Type.Intersect([ ResourceFrontmatter, ThumbnailField, Type.Object({ playlistItems: Type.Array(Type.String()), }), ]); export type PlaylistFrontmatter = Static<typeof PlaylistFrontmatter>; export class Playlist extends Resource<PLAYLIST_RESOURCE_TYPE> implements PlaylistFrontmatter { playlistItems: string[]; playlistResources: Resource[]; thumbnail: PlaylistFrontmatter["thumbnail"]; static frontmatterSchema: any = PlaylistFrontmatter; constructor({ data, page, }: { data: PlaylistFrontmatter; page: EleventyPage; }) { super({ data, page }); this.playlistItems = data.playlistItems; this.playlistResources = []; this.thumbnail = getThumbnailPath(data.thumbnail, page.url); } resolve(allResources: ResourceMap) { super.resolve(allResources); // then call this this.playlistItems.forEach((pi) => { const playlistResource = allResources.get(pi); if (playlistResource) { this.playlistResources.push(playlistResource); } else { throw new Error(`Playlist resource ${pi} not found in ${this.url}`); } }); } getThumbnail(): string { return this.thumbnail; } }