UNPKG

@cotype/core

Version:

<h2 align="center"> <img src="https://cotype.dev/logo.svg" alt="cotype" /> </h2>

385 lines (341 loc) • 7.36 kB
import { Model } from "./models"; /** * Options for list views. */ export type ListOpts = { offset?: string | number; limit?: string | number; order?: string; orderBy?: string; models?: string[]; search?: { prop?: string; term?: string; scope?: "title" | "global"; }; }; export type ContentFormat = "html" | "plaintext" | "json" | "markdown"; export type MediaListOpts = { offset?: string | number; limit?: string | number; order?: string; orderBy?: string; mimetype?: string; search?: string; }; export type PreviewOpts = { publishedOnly?: boolean; ignoreSchedule?: boolean; }; /** * Criteria to search for contents. */ export type Criteria = { [field: string]: { eq?: any; ne?: any; lt?: any; gt?: any; gte?: any; lte?: any; like?: any; path?: string; }; }; /** * Joins to resolve referenes in contents. */ export type Join = { [field: string]: string[]; }; /** * Metadata extracted from media files. */ export type Meta = { id: string; size: number; originalname: string; mimetype: string | null; imagetype: string | null; width: number | null; height: number | null; }; export type ImageMeta = { focusX: number | null; focusY: number | null; tags: string[] | null; credit: string | null; alt: string | null; }; export type Media = Meta & ImageMeta & { created_at: string; }; /** * Settings (like Users & Roles). */ export type Settings = { id: string; [key: string]: any; }; /** * Permissions defined by a Role. */ export type Permissions = { settings: boolean; preview: boolean; content: { [model: string]: number; }; }; /** * A (human) user of the system. */ export type User = { id: string; name: string; email: string; password: string; role: number; picture: string; }; /** * The user performing a request. */ export type Principal = { id: string | null; name: string; permissions: Permissions; }; /** * Items displayed in list views. */ export type Item = { id: string; type: string; model: string; title: string; image?: string | undefined; kind: string; childCount?: string; orderValue?: string; }; export type VersionItem = Item & { rev: number; latest: boolean; published_rev: boolean; latest_rev: number; author_name: string; date: string; }; export type Schedule = { visibleFrom?: null | Date; visibleUntil?: null | Date; }; export type Data = { [field: string]: any; }; export type DataRecord = Schedule & { id: string; data: Data; }; /** * The REST API uses this format instead of DataRecord */ export type Record = { _id: string; } & Data; export type Content = DataRecord & { type: string; author: string; date: Date | string; }; export type ContentWithRefs = Content & { _refs: Refs; }; export type Refs = { media: MediaRefs; content: ContentRefs; }; export type MediaRefs = { [id: string]: Meta; }; export type ContentRefs = { [type: string]: { [id: string]: Content; }; }; export type SearchResultItem = { id: string; model: string; title: string; description?: string; image: string | undefined; url: string; }; export type Revision = DataRecord & { rev: number; }; export type ListChunkWithRefs<ItemType> = { total: number; items: ItemType[]; _refs: Refs; }; export type ListChunk<ItemType> = { total: number; items: ItemType[]; }; export type ReadOnlyDataSource = { contentTypes: string[]; list( principal: Principal, model: Model, opts: ListOpts, criteria?: Criteria ): Promise<ListChunk<Item>>; load( principal: Principal, model: Model, id: string, join: Join, format?: string, previewOpts?: PreviewOpts ): Promise<ContentWithRefs | null>; loadInternal( principal: Principal, model: Model, id: string, previewOpts?: PreviewOpts ): Promise<Content | null>; loadItem( principal: Principal, model: Model, id: string ): Promise<Item | null>; find( principal: Principal, model: Model, opts: ListOpts, format: string, join: Join, criteria?: Criteria, previewOpts?: PreviewOpts ): Promise<ListChunkWithRefs<Content>>; findInternal( principal: Principal, model: Model, opts: ListOpts, criteria?: Criteria, previewOpts?: PreviewOpts ): Promise<ListChunk<Content>>; }; export type WritableDataSource = ReadOnlyDataSource & { create( principal: Principal, model: Model, data: object, models: Model[] ): Promise<string>; delete(principal: Principal, model: Model, id: string): Promise<void>; update( principal: Principal, model: Model, id: string, data: object, models: Model[] ): Promise<{ id: string; data: object }>; }; export type VersionedDataSource = WritableDataSource & { listVersions( principal: Principal, model: Model, id: string ): Promise<Array<VersionItem & { published: boolean }>>; loadRevision( principal: Principal, model: Model, id: string, rev: number ): Promise<Revision>; publishRevision( principal: Principal, model: Model, id: string, rev: string | number, models: Model[] ): Promise<void>; createRevision( principal: Principal, model: Model, id: string, data: object, models: Model[] ): Promise<number>; schedule( principal: Principal, model: Model, id: string, schedule: Schedule ): Promise<void>; }; export type DataSource = | ReadOnlyDataSource | WritableDataSource | VersionedDataSource; export type ExternalDataSource = DataSource & { contentTypes: string[]; }; export type QuillDelta = { ops: any[]; }; export type MediaHelper = { original(image: string): string; fromOriginal(image: string): string; }; export type CONVERTER_SPREAD_INSTRUCTION = "$$CONVERTER_SPREAD"; export type ConverterInstructions<From, To> = { $$CONVERTER_SPREAD?: (input: From) => Partial<To> | Promise<Partial<To>>; } & { [key in keyof To]?: (input: From) => To[key] | Promise<To[key]> }; export interface Converter<ApiDataSet, HubDataSet> { fromHub(input: HubDataSet): Promise<ApiDataSet>; toHub(input: ApiDataSet): Promise<HubDataSet>; } export interface ConverterConstructor { SPREAD: CONVERTER_SPREAD_INSTRUCTION; new <ApiDataSet, HubDataSet>( passThrough: Array<keyof ApiDataSet>, toHub?: ConverterInstructions<ApiDataSet, HubDataSet>, fromHub?: ConverterInstructions<HubDataSet, ApiDataSet> ): Converter<ApiDataSet, HubDataSet>; } export type ExternalDataSourceHelper = { richtextToHtml: (delta: QuillDelta) => string; media: MediaHelper; Converter: ConverterConstructor; }; export interface ThumbnailProvider { getThumbUrl(id: string, format: string): Promise<string | null>; } export type BaseUrls = { cms: string; media?: string; preview?: string; }; type PostHook = (model: Model, data: Data) => Promise<void>; type PreHook = (model: Model, data: Data) => Promise<Data>; export type PreHooks = { onCreate?: PreHook; onSave?: PreHook; }; export type PostHooks = { onCreate?: PostHook; onSave?: PostHook; onDelete?: PostHook; onPublish?: PostHook; onUnpublish?: PostHook; onSchedule?: PostHook; }; export type ContentHooks = { preHooks?: PreHooks; postHooks?: PostHooks; };