/* tslint:disable */ /* eslint-disable */ /** * This file was automatically generated by Payload. * DO NOT MODIFY IT BY HAND. Instead, modify your source Payload config, * and re-run `payload generate:types` to regenerate this file. */ /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "RecorderBiographies". */ export type RecorderBiographies = | { language: string | Language; biography: { root: { children: { type: string; version: number; [k: string]: unknown; }[]; direction: ('ltr' | 'rtl') | null; format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; indent: number; type: string; version: number; }; [k: string]: unknown; }; id?: string | null; }[] | null; /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "CategoryTranslations". */ export type CategoryTranslations = { language: string | Language; name: string; id?: string | null; }[]; export interface Config { collections: { pages: Page; collectibles: Collectible; folders: Folder; 'chronology-items': ChronologyItem; 'chronology-eras': ChronologyEra; notes: Note; images: Image; 'background-images': BackgroundImage; 'recorders-thumbnails': RecordersThumbnail; videos: Video; 'videos-channels': VideosChannel; tags: Tag; 'tags-groups': TagsGroup; recorders: Recorder; languages: Language; currencies: Currency; wordings: Wording; 'generic-contents': GenericContent; 'payload-preferences': PayloadPreference; 'payload-migrations': PayloadMigration; }; globals: { 'home-folders': HomeFolder; }; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "pages". */ export interface Page { id: string; slug: string; type: 'Content' | 'Post' | 'Generic'; thumbnail?: string | Image | null; backgroundImage?: string | BackgroundImage | null; tags?: (string | Tag)[] | null; authors?: (string | Recorder)[] | null; translations: { language: string | Language; sourceLanguage: string | Language; pretitle?: string | null; title: string; subtitle?: string | null; summary?: { root: { children: { type: string; version: number; [k: string]: unknown; }[]; direction: ('ltr' | 'rtl') | null; format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; indent: number; type: string; version: number; }; [k: string]: unknown; } | null; content: { root: { children: { type: string; version: number; [k: string]: unknown; }[]; direction: ('ltr' | 'rtl') | null; format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; indent: number; type: string; version: number; }; [k: string]: unknown; }; transcribers?: (string | Recorder)[] | null; translators?: (string | Recorder)[] | null; proofreaders?: (string | Recorder)[] | null; id?: string | null; }[]; folders?: (string | Folder)[] | null; collectibles?: (string | Collectible)[] | null; updatedBy: string | Recorder; updatedAt: string; createdAt: string; _status?: ('draft' | 'published') | null; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "images". */ export interface Image { id: string; updatedAt: string; createdAt: string; url?: string | null; filename?: string | null; mimeType?: string | null; filesize?: number | null; width?: number | null; height?: number | null; sizes?: { thumb?: { url?: string | null; width?: number | null; height?: number | null; mimeType?: string | null; filesize?: number | null; filename?: string | null; }; og?: { url?: string | null; width?: number | null; height?: number | null; mimeType?: string | null; filesize?: number | null; filename?: string | null; }; }; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "background-images". */ export interface BackgroundImage { id: string; updatedAt: string; createdAt: string; url?: string | null; filename?: string | null; mimeType?: string | null; filesize?: number | null; width?: number | null; height?: number | null; sizes?: { thumb?: { url?: string | null; width?: number | null; height?: number | null; mimeType?: string | null; filesize?: number | null; filename?: string | null; }; }; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "tags". */ export interface Tag { id: string; name?: string | null; slug: string; translations: { language: string | Language; name: string; id?: string | null; }[]; group: string | TagsGroup; updatedAt: string; createdAt: string; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "languages". */ export interface Language { id: string; name: string; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "tags-groups". */ export interface TagsGroup { id: string; slug: string; icon?: string | null; translations: { language: string | Language; name: string; id?: string | null; }[]; updatedAt: string; createdAt: string; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "recorders". */ export interface Recorder { id: string; username: string; avatar?: string | RecordersThumbnail | null; languages?: (string | Language)[] | null; biographies?: RecorderBiographies; role?: ('Admin' | 'Recorder' | 'Api')[] | null; anonymize: boolean; email: string; resetPasswordToken?: string | null; resetPasswordExpiration?: string | null; salt?: string | null; hash?: string | null; loginAttempts?: number | null; lockUntil?: string | null; password?: string | null; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "recorders-thumbnails". */ export interface RecordersThumbnail { id: string; recorder?: (string | null) | Recorder; updatedAt: string; createdAt: string; url?: string | null; filename?: string | null; mimeType?: string | null; filesize?: number | null; width?: number | null; height?: number | null; sizes?: { thumb?: { url?: string | null; width?: number | null; height?: number | null; mimeType?: string | null; filesize?: number | null; filename?: string | null; }; square?: { url?: string | null; width?: number | null; height?: number | null; mimeType?: string | null; filesize?: number | null; filename?: string | null; }; }; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "folders". */ export interface Folder { id: string; slug: string; icon?: string | null; translations: { language: string | Language; name: string; description?: { root: { children: { type: string; version: number; [k: string]: unknown; }[]; direction: ('ltr' | 'rtl') | null; format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; indent: number; type: string; version: number; }; [k: string]: unknown; } | null; id?: string | null; }[]; sections?: | { translations?: | { language: string | Language; name: string; id?: string | null; }[] | null; subfolders?: (string | Folder)[] | null; id?: string | null; }[] | null; files?: | ( | { relationTo: 'collectibles'; value: string | Collectible; } | { relationTo: 'pages'; value: string | Page; } )[] | null; updatedAt: string; createdAt: string; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "collectibles". */ export interface Collectible { id: string; slug: string; thumbnail?: string | Image | null; nature: 'Physical' | 'Digital'; languages?: (string | Language)[] | null; tags?: (string | Tag)[] | null; translations: { language: string | Language; pretitle?: string | null; title: string; subtitle?: string | null; description?: { root: { children: { type: string; version: number; [k: string]: unknown; }[]; direction: ('ltr' | 'rtl') | null; format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; indent: number; type: string; version: number; }; [k: string]: unknown; } | null; id?: string | null; }[]; backgroundImage?: string | BackgroundImage | null; gallery?: | { image: string | Image; id?: string | null; }[] | null; scansEnabled?: boolean | null; scans?: { scanners: (string | Recorder)[]; cleaners: (string | Recorder)[]; typesetters?: (string | Recorder)[] | null; coverEnabled?: boolean | null; cover?: { front?: string | Image | null; spine?: string | Image | null; back?: string | Image | null; insideFront?: string | Image | null; insideBack?: string | Image | null; flapFront?: string | Image | null; flapBack?: string | Image | null; insideFlapFront?: string | Image | null; insideFlapBack?: string | Image | null; }; dustjacketEnabled?: boolean | null; dustjacket?: { front?: string | Image | null; spine?: string | Image | null; back?: string | Image | null; insideFront?: string | Image | null; insideSpine?: string | Image | null; insideBack?: string | Image | null; flapFront?: string | Image | null; flapBack?: string | Image | null; insideFlapFront?: string | Image | null; insideFlapBack?: string | Image | null; }; obiEnabled?: boolean | null; obi?: { front?: string | Image | null; spine?: string | Image | null; back?: string | Image | null; insideFront?: string | Image | null; insideSpine?: string | Image | null; insideBack?: string | Image | null; flapFront?: string | Image | null; flapBack?: string | Image | null; insideFlapFront?: string | Image | null; insideFlapBack?: string | Image | null; }; pages?: | { page: number; image: string | Image; id?: string | null; }[] | null; }; urls?: | { url: string; id?: string | null; }[] | null; releaseDate?: string | null; priceEnabled?: boolean | null; price?: { amount: number; currency: string | Currency; }; sizeEnabled?: boolean | null; size?: { width: number; height: number; thickness?: number | null; }; weightEnabled?: boolean | null; weight?: { amount: number; }; pageInfoEnabled?: boolean | null; pageInfo?: { pageCount: number; bindingType?: ('Paperback' | 'Hardcover') | null; pageOrder?: ('Left to right' | 'Right to left') | null; }; folders?: (string | Folder)[] | null; parentItems?: (string | Collectible)[] | null; subitems?: (string | Collectible)[] | null; contents?: | { content: | { relationTo: 'pages'; value: string | Page; } | { relationTo: 'generic-contents'; value: string | GenericContent; }; range?: | ( | { start: number; end: number; id?: string | null; blockName?: string | null; blockType: 'pageRange'; } | { start: string; end: string; id?: string | null; blockName?: string | null; blockType: 'timeRange'; } | { translations?: | { language: string | Language; note: { root: { children: { type: string; version: number; [k: string]: unknown; }[]; direction: ('ltr' | 'rtl') | null; format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; indent: number; type: string; version: number; }; [k: string]: unknown; }; id?: string | null; }[] | null; id?: string | null; blockName?: string | null; blockType: 'other'; } )[] | null; id?: string | null; }[] | null; updatedBy: string | Recorder; updatedAt: string; createdAt: string; _status?: ('draft' | 'published') | null; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "currencies". */ export interface Currency { id: string; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "generic-contents". */ export interface GenericContent { id: string; name: string; translations: { language: string | Language; name: string; id?: string | null; }[]; updatedAt: string; createdAt: string; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "chronology-items". */ export interface ChronologyItem { id: string; name?: string | null; date: { year: number; month?: number | null; day?: number | null; }; events: { translations: { language: string | Language; sourceLanguage: string | Language; title?: string | null; description?: { root: { children: { type: string; version: number; [k: string]: unknown; }[]; direction: ('ltr' | 'rtl') | null; format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; indent: number; type: string; version: number; }; [k: string]: unknown; } | null; notes?: { root: { children: { type: string; version: number; [k: string]: unknown; }[]; direction: ('ltr' | 'rtl') | null; format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; indent: number; type: string; version: number; }; [k: string]: unknown; } | null; transcribers?: (string | Recorder)[] | null; translators?: (string | Recorder)[] | null; proofreaders?: (string | Recorder)[] | null; id?: string | null; }[]; id?: string | null; }[]; updatedBy: string | Recorder; updatedAt: string; createdAt: string; _status?: ('draft' | 'published') | null; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "chronology-eras". */ export interface ChronologyEra { id: string; slug: string; startingYear: number; endingYear: number; translations?: | { language: string | Language; title: string; description?: { root: { children: { type: string; version: number; [k: string]: unknown; }[]; direction: ('ltr' | 'rtl') | null; format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; indent: number; type: string; version: number; }; [k: string]: unknown; } | null; id?: string | null; }[] | null; events?: (string | ChronologyItem)[] | null; updatedAt: string; createdAt: string; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "notes". */ export interface Note { id: string; note: { root: { children: { type: string; version: number; [k: string]: unknown; }[]; direction: ('ltr' | 'rtl') | null; format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; indent: number; type: string; version: number; }; [k: string]: unknown; }; updatedAt: string; createdAt: string; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "videos". */ export interface Video { id: string; uid: string; gone: boolean; source: 'YouTube' | 'NicoNico' | 'Tumblr'; title: string; description?: string | null; likes?: number | null; views?: number | null; publishedDate: string; channel?: (string | null) | VideosChannel; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "videos-channels". */ export interface VideosChannel { id: string; uid: string; title: string; subscribers?: number | null; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "wordings". */ export interface Wording { id: string; name: string; translations: CategoryTranslations; updatedAt: string; createdAt: string; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "payload-preferences". */ export interface PayloadPreference { id: string; user: { relationTo: 'recorders'; value: string | Recorder; }; key?: string | null; value?: | { [k: string]: unknown; } | unknown[] | string | number | boolean | null; updatedAt: string; createdAt: string; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "payload-migrations". */ export interface PayloadMigration { id: string; name?: string | null; batch?: number | null; updatedAt: string; createdAt: string; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "home-folders". */ export interface HomeFolder { id: string; folders?: | { lightThumbnail?: string | Image | null; darkThumbnail?: string | Image | null; folder: string | Folder; id?: string | null; }[] | null; updatedAt?: string | null; createdAt?: string | null; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "LineBlock". */ export interface LineBlock { content: { root: { children: { type: string; version: number; [k: string]: unknown; }[]; direction: ('ltr' | 'rtl') | null; format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; indent: number; type: string; version: number; }; [k: string]: unknown; }; blockType: 'lineBlock'; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "CueBlock". */ export interface CueBlock { content: { root: { children: { type: string; version: number; [k: string]: unknown; }[]; direction: ('ltr' | 'rtl') | null; format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; indent: number; type: string; version: number; }; [k: string]: unknown; }; blockType: 'cueBlock'; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "TranscriptBlock". */ export interface TranscriptBlock { lines: (LineBlock | CueBlock)[]; id?: string | null; blockName?: string | null; blockType: 'transcriptBlock'; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "BreakBlock". */ export interface BreakBlock { type: 'Scene break' | 'Empty space' | 'Solid line' | 'Dotted line'; id?: string | null; blockName?: string | null; blockType: 'breakBlock'; } /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "SectionBlock". */ export interface SectionBlock { content: { root: { children: { type: string; version: number; [k: string]: unknown; }[]; direction: ('ltr' | 'rtl') | null; format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; indent: number; type: string; version: number; }; [k: string]: unknown; }; id?: string | null; blockName?: string | null; blockType: 'sectionBlock'; } /////////////// CONSTANTS /////////////// export enum Collections { ChronologyEras = "chronology-eras", ChronologyItems = "chronology-items", Currencies = "currencies", Files = "files", Languages = "languages", Notes = "notes", Pages = "pages", PagesThumbnails = "pages-thumbnails", Recorders = "recorders", RecordersThumbnails = "recorders-thumbnails", VideosChannels = "videos-channels", Videos = "videos", Folders = "folders", Tags = "tags", TagsGroups = "tags-groups", Images = "images", Wordings = "wordings", Collectibles = "collectibles", GenericContents = "generic-contents", BackgroundImages = "background-images", HomeFolders = "home-folders", } export enum CollectionGroups { Collections = "Collections", Media = "Media", Meta = "Meta", } export enum LanguageCodes { en = "English", fr = "French", ja = "Japan", es = "Spanish", "pt-br" = "Portuguese", "zh" = "Chinese", } export enum BreakBlockType { sceneBreak = "Scene break", space = "Empty space", solidLine = "Solid line", dottedLine = "Dotted line", } export enum CollectibleBindingTypes { Paperback = "Paperback", Hardcover = "Hardcover", } export enum CollectiblePageOrders { LeftToRight = "Left to right", RightToLeft = "Right to left", } export enum CollectibleNature { Physical = "Physical", Digital = "Digital", } export enum CollectibleContentType { None = "None", Indexes = "Index-based", Pages = "Page-based", } export enum RecordersRoles { Admin = "Admin", Recorder = "Recorder", Api = "Api", } export enum CollectionStatus { Draft = "draft", Published = "published", } export enum VideoSources { YouTube = "YouTube", NicoNico = "NicoNico", Tumblr = "Tumblr", } export enum PageType { Content = "Content", Post = "Post", Generic = "Generic", } /* RICH TEXT */ export type RichTextContent = { root: { children: RichTextNode[]; direction: ("ltr" | "rtl") | null; format: "left" | "start" | "center" | "right" | "end" | "justify" | ""; indent: number; type: string; version: number; }; [k: string]: unknown; }; export type RichTextNode = { type: string; version: number; [k: string]: unknown; }; export interface RichTextNodeWithChildren extends RichTextNode { children: RichTextNode[]; } export interface RichTextParagraphNode extends RichTextNodeWithChildren { type: "paragraph"; format: "left" | "start" | "center" | "right" | "end" | "justify" | ""; } export interface RichTextListNode extends RichTextNode { type: "list"; children: RichTextNodeWithChildren[]; listType: string; } export interface RichTextListNumberNode extends RichTextListNode { listType: "number"; } export interface RichTextListBulletNode extends RichTextListNode { listType: "bullet"; } export interface RichTextListCheckNode extends RichTextListNode { listType: "check"; } export interface RichTextLinebreakNode extends RichTextNode { type: "linebreak"; } export interface RichTextUploadNode extends RichTextNode { type: "upload"; relationTo: string; } export interface RichTextUploadImageNode extends RichTextUploadNode { relationTo: "images" | "background-images"; value: Image; } export interface RichTextTextNode extends RichTextNode { type: "text"; format: number; text: string; } export interface RichTextTabNode extends RichTextNode { type: "tab"; format: number; } export interface RichTextLinkNode extends RichTextNodeWithChildren { type: "link"; fields: { linkType: "internal" | "custom"; }; } export interface RichTextLinkInternalNode extends RichTextLinkNode { fields: { linkType: "internal"; newTab: boolean; doc: { relationTo: string; value: any; }; }; } export interface RichTextLinkCustomNode extends RichTextLinkNode { fields: { linkType: "custom"; newTab: boolean; url: string; }; } export interface RichTextBlockNode extends RichTextNode { type: "block"; fields: { blockType: string; }; } export interface RichTextSectionBlock extends RichTextBlockNode { fields: SectionBlock; anchorHash: string; } export interface RichTextTranscriptBlock extends RichTextBlockNode { fields: TranscriptBlock; } export interface RichTextBreakBlock extends RichTextBlockNode { fields: BreakBlock; anchorHash: string; } export const isNodeParagraphNode = (node: RichTextNode): node is RichTextParagraphNode => node.type === "paragraph"; export const isNodeUploadNode = (node: RichTextNode): node is RichTextUploadNode => node.type === "upload"; export const isUploadNodeImageNode = (node: RichTextUploadNode): node is RichTextUploadImageNode => node.relationTo === "images" || node.relationTo === "background-images"; export const isNodeListNode = (node: RichTextNode): node is RichTextListNode => node.type === "list"; export const isListNodeNumberListNode = (node: RichTextListNode): node is RichTextListNumberNode => node.listType === "number"; export const isListNodeBulletListNode = (node: RichTextListNode): node is RichTextListBulletNode => node.listType === "bullet"; export const isListNodeCheckListNode = (node: RichTextListNode): node is RichTextListCheckNode => node.listType === "check"; export const isNodeLinebreakNode = (node: RichTextNode): node is RichTextLinebreakNode => node.type === "linebreak"; export const isNodeTextNode = (node: RichTextNode): node is RichTextTextNode => node.type === "text"; export const isNodeTabNode = (node: RichTextNode): node is RichTextTabNode => node.type === "tab"; export const isNodeLinkNode = (node: RichTextNode): node is RichTextLinkNode => node.type === "link"; export const isLinkNodeInternalLinkNode = ( node: RichTextLinkNode ): node is RichTextLinkInternalNode => node.fields.linkType === "internal"; export const isLinkNodeCustomLinkNode = (node: RichTextLinkNode): node is RichTextLinkCustomNode => node.fields.linkType === "custom"; export const isNodeBlockNode = (node: RichTextNode): node is RichTextBlockNode => node.type === "block"; export const isBlockNodeSectionBlock = (node: RichTextBlockNode): node is RichTextSectionBlock => node.fields.blockType === "sectionBlock"; export const isBlockNodeTranscriptBlock = ( node: RichTextBlockNode ): node is RichTextTranscriptBlock => node.fields.blockType === "transcriptBlock"; export const isBlockNodeBreakBlock = (node: RichTextBlockNode): node is RichTextBreakBlock => node.fields.blockType === "breakBlock"; /* BLOCKS */ /* TODO: TO BE REMOVED WHEN https://github.com/payloadcms/payload/issues/5216 is closed */ export interface CueBlock { content: RichTextContent; blockType: "cueBlock"; id?: string | null; blockName?: string | null; } export interface LineBlock { content: RichTextContent; blockType: "lineBlock"; id?: string | null; blockName?: string | null; } export interface GenericBlock { id?: string | null; blockName?: string | null; blockType: string; } export const isBlockCueBlock = (block: GenericBlock): block is CueBlock => block.blockType === "cueBlock"; export const isBlockLineBlock = (block: GenericBlock): block is LineBlock => block.blockType === "lineBlock"; ////////////////// SDK ////////////////// import NodeCache from "node-cache"; const REFRESH_FREQUENCY_IN_SEC = 60; const CACHE = new NodeCache({ checkperiod: REFRESH_FREQUENCY_IN_SEC, deleteOnExpire: true, forceString: true, maxKeys: 1, }); const TOKEN_KEY = "token"; type PayloadLoginResponse = { token: string; exp: number; }; const refreshToken = async () => { const loginUrl = payloadApiUrl(Collections.Recorders, "login"); const loginResult = await fetch(loginUrl, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ email: import.meta.env.PAYLOAD_USER, password: import.meta.env.PAYLOAD_PASSWORD, }), }); logResponse(loginResult); if (loginResult.status !== 200) { throw new Error("Unable to login"); } const loginJson = (await loginResult.json()) as PayloadLoginResponse; const { token, exp } = loginJson; const now = Math.floor(Date.now() / 1000); const ttl = Math.floor(exp - now - REFRESH_FREQUENCY_IN_SEC * 2); const ttlInMinutes = Math.floor(ttl / 60); console.log("Token was refreshed. TTL is", ttlInMinutes, "minutes."); CACHE.set(TOKEN_KEY, token, ttl); return token; }; const getToken = async (): Promise<string> => { const cachedToken = CACHE.get<string>(TOKEN_KEY); if (cachedToken !== undefined) { const cachedTokenTtl = CACHE.getTtl(TOKEN_KEY) as number; const diffInMinutes = Math.floor((cachedTokenTtl - Date.now()) / 1000 / 60); console.log("Retrieved token from cache. TTL is", diffInMinutes, "minutes."); return cachedToken; } console.log("Refreshing token"); return await refreshToken(); }; const injectAuth = async (init?: RequestInit): Promise<RequestInit> => ({ ...init, headers: { ...init?.headers, Authorization: `JWT ${await getToken()}` }, }); const logResponse = (res: Response) => console.log(res.status, res.statusText, res.url); const payloadApiUrl = (collection: Collections, endpoint?: string, isGlobal?: boolean): string => `${import.meta.env.PAYLOAD_API_URL}/${isGlobal === undefined ? "" : "globals/"}${collection}${endpoint === undefined ? "" : `/${endpoint}`}`; const request = async (url: string, init?: RequestInit): Promise<Response> => { const result = await fetch(url, await injectAuth(init)); logResponse(result); if (result.status !== 200) { throw new Error("Unhandled fetch error"); } return result; }; // SDK and Types export type EndpointEra = { slug: string; startingYear: number; endingYear: number; translations: { language: string; title: string; description?: RichTextContent; }[]; items: { date: { year: number; month?: number; day?: number; }; events: { translations: { language: string; sourceLanguage: string; title?: string; description?: RichTextContent; notes?: RichTextContent; transcribers: EndpointRecorder[]; translators: EndpointRecorder[]; proofreaders: EndpointRecorder[]; }[]; }[]; }[]; }; export type EndpointFolderPreview = { slug: string; icon?: string; translations: { language: string; name: string; description?: RichTextContent; }[]; }; export type EndpointFolder = EndpointFolderPreview & { sections: | { type: "single"; subfolders: EndpointFolderPreview[] } | { type: "multiple"; sections: { translations: { language: string; name: string }[]; subfolders: EndpointFolderPreview[]; }[]; }; files: ( | { relationTo: "collectibles"; value: EndpointCollectiblePreview; } | { relationTo: "pages"; value: EndpointPagePreview; } )[]; }; export type EndpointHomeFolder = EndpointFolderPreview & { lightThumbnail?: PayloadImage; darkThumbnail?: PayloadImage; }; export type EndpointRecorder = { id: string; username: string; avatar?: PayloadImage; languages: string[]; biographies: { language: string; biography: RichTextContent; }[]; }; export type EndpointWording = { name: string; translations: { language: string; name: string; }[]; }; export type EndpointTag = { slug: string; translations: { language: string; name: string; }[]; }; export type EndpointTagsGroup = { slug: string; icon: string; translations: { language: string; name: string; }[]; tags: EndpointTag[]; }; export type EndpointPagePreview = { slug: string; type: PageType; thumbnail?: PayloadImage; authors: EndpointRecorder[]; tagGroups: EndpointTagsGroup[]; translations: { language: string; pretitle?: string; title: string; subtitle?: string; }[]; status: "draft" | "published"; }; export type EndpointPage = EndpointPagePreview & { backgroundImage?: PayloadImage; translations: (EndpointPagePreview["translations"][number] & { sourceLanguage: string; summary?: RichTextContent; content: RichTextContent; transcribers: EndpointRecorder[]; translators: EndpointRecorder[]; proofreaders: EndpointRecorder[]; toc: TableOfContentEntry[]; })[]; parentPages: ParentPage[]; }; export type ParentPage = { slug: string; collection: Collections; translations: { language: string; name: string }[]; tag: string; }; export type EndpointCollectiblePreview = { slug: string; thumbnail?: PayloadImage; translations: { language: string; pretitle?: string; title: string; subtitle?: string; description?: RichTextContent; }[]; tagGroups: EndpointTagsGroup[]; status: "draft" | "published"; releaseDate?: string; languages: string[]; }; export type EndpointCollectible = EndpointCollectiblePreview & { backgroundImage?: PayloadImage; nature: CollectibleNature; gallery: PayloadImage[]; scans: PayloadImage[]; urls: { url: string; label: string }[]; price?: { amount: number; currency: string; }; size?: { width: number; height: number; thickness?: number; }; weight?: number; pageInfo?: { pageCount: number; bindingType?: CollectibleBindingTypes; pageOrder?: CollectiblePageOrders; }; subitems: EndpointCollectiblePreview[]; contents: { content: | { relationTo: "pages"; value: EndpointPagePreview; } | { relationTo: "generic-contents"; value: { translations: { language: string; name: string; }[]; }; }; range?: | { type: "pageRange"; start: number; end: number; } | { type: "timeRange"; start: string; end: string; } | { type: "other"; translations: { language: string; note: RichTextContent; }[]; }; }[]; parentPages: ParentPage[]; }; export type TableOfContentEntry = { prefix: string; title: string; type: "sceneBreak" | "break" | "section"; index: number; children: TableOfContentEntry[]; }; export type PayloadImage = { url: string; width: number; height: number; mimeType: string; filename: string; }; export const payload = { getEras: async (): Promise<EndpointEra[]> => await (await request(payloadApiUrl(Collections.ChronologyEras, `all`))).json(), getHomeFolders: async (): Promise<EndpointHomeFolder[]> => await (await request(payloadApiUrl(Collections.HomeFolders, `all`, true))).json(), getFolder: async (slug: string): Promise<EndpointFolder> => await (await request(payloadApiUrl(Collections.Folders, `slug/${slug}`))).json(), getLanguages: async (): Promise<Language[]> => await (await request(payloadApiUrl(Collections.Languages, `all`))).json(), getCurrencies: async (): Promise<Currency[]> => await (await request(payloadApiUrl(Collections.Currencies, `all`))).json(), getWordings: async (): Promise<EndpointWording[]> => await (await request(payloadApiUrl(Collections.Wordings, `all`))).json(), getRecorders: async (): Promise<EndpointRecorder[]> => await (await request(payloadApiUrl(Collections.Recorders, `all`))).json(), getPage: async (slug: string): Promise<EndpointPage> => await (await request(payloadApiUrl(Collections.Pages, `slug/${slug}`))).json(), getCollectible: async (slug: string): Promise<EndpointCollectible> => await (await request(payloadApiUrl(Collections.Collectibles, `slug/${slug}`))).json(), };