_includes/resources/link/LinkModels.ts (56 lines of code) (raw):
import { Static, Type } from "@sinclair/typebox";
import {
getThumbnailPath,
Resource,
ResourceFrontmatter,
} from "../../../src/ResourceModels";
import { EleventyPage } from "../../../src/models";
import { VideoType } from "../common/VideoProp";
import { LINK_RESOURCE, LINK_RESOURCE_TYPE } from "../../../src/resourceType";
import { ThumbnailField } from "../commonModels";
// @ts-ignore
import { getContentType } from "../../../public/assets/js/utils";
import path from "upath";
export const LinkFrontmatter = Type.Intersect([
ResourceFrontmatter,
ThumbnailField,
Type.Object({
screenshot: Type.Optional(
Type.String({
description: "File name of a screenshot to show in this link",
}),
),
video: Type.Optional(VideoType),
linkURL: Type.String({
description: "URL of external resource to link to",
}),
}),
]);
export type LinkFrontmatter = Static<typeof LinkFrontmatter>;
export class Link
extends Resource<LINK_RESOURCE_TYPE>
implements LinkFrontmatter
{
linkURL: string;
screenshot?: LinkFrontmatter["screenshot"];
thumbnail: LinkFrontmatter["thumbnail"];
video?: LinkFrontmatter["video"];
static frontmatterSchema = LinkFrontmatter;
constructor({ data, page }: { data: LinkFrontmatter; page: EleventyPage }) {
super({ data, page });
this.linkURL = data.linkURL;
this.video = data.video;
this.thumbnail = getThumbnailPath(data.thumbnail, page.url);
this.screenshot = data.screenshot
? path.join(page.url, data.screenshot)
: undefined;
}
getThumbnail(): string {
return this.thumbnail;
}
describeContentType(): string {
return getContentType(this.resourceType, this.linkURL);
}
}
export const isLink = (resource: Resource | undefined): resource is Link => {
return resource?.resourceType === LINK_RESOURCE;
};