@stackbit/types
Version:
Types for Stackbit config and Content Source Interface
384 lines (336 loc) • 10.5 kB
text/typescript
import { FieldType, StyleProps } from './model-fields';
export type DocumentField =
| DocumentStringLikeField
| DocumentNumberField
| DocumentBooleanField
| DocumentJsonField
| DocumentStyleField
| DocumentRichTextField
| DocumentImageField
| DocumentObjectField
| DocumentModelField
| DocumentReferenceField
| DocumentCrossReferenceField
| DocumentListField;
export type DocumentFieldNonLocalized =
| DocumentStringLikeFieldNonLocalized
| DocumentNumberFieldNonLocalized
| DocumentBooleanFieldNonLocalized
| DocumentJsonFieldNonLocalized
| DocumentStyleFieldNonLocalized
| DocumentRichTextFieldNonLocalized
| DocumentImageFieldNonLocalized
| DocumentObjectFieldNonLocalized
| DocumentModelFieldNonLocalized
| DocumentReferenceFieldNonLocalized
| DocumentCrossReferenceFieldNonLocalized
| DocumentListFieldNonLocalized;
export type DocumentFieldLocalized =
| DocumentStringLikeFieldLocalized
| DocumentNumberFieldLocalized
| DocumentBooleanFieldLocalized
| DocumentJsonFieldLocalized
| DocumentStyleFieldLocalized
| DocumentRichTextFieldLocalized
| DocumentImageFieldLocalized
| DocumentObjectFieldLocalized
| DocumentModelFieldLocalized
| DocumentReferenceFieldLocalized
| DocumentCrossReferenceFieldLocalized
| DocumentListFieldLocalized;
// utility types
export type DocumentFieldBaseProps = DocumentFieldBasePropsForDocumentField<DocumentField>;
export type DocumentFieldSpecificProps = DocumentFieldSpecificPropsForDocumentField<DocumentFieldLocalized>;
export type ExtractByType<Union extends { type: FieldType }, Type extends FieldType> = Union extends {
type: Type;
}
? Union
: never;
export type DocumentFieldForType<Type extends FieldType> = ExtractByType<DocumentField, Type>;
export type DocumentFieldNonLocalizedForType<Type extends FieldType> = ExtractByType<DocumentFieldNonLocalized, Type>;
export type DocumentFieldLocalizedForType<Type extends FieldType> = ExtractByType<DocumentFieldLocalized, Type>;
export type DocumentFieldBasePropsForType<Type extends FieldType> = ExtractByType<DocumentFieldBaseProps, Type>;
export type DocumentFieldSpecificPropsForType<Type extends FieldType> = DocumentFieldSpecificPropsForDocumentField<
DocumentFieldLocalizedForType<Type>
>;
export type DocumentFieldBasePropsForDocumentField<DocField extends DocumentField> = DocField extends {
localized?: false;
}
? Omit<
DocField,
| keyof DocumentFieldSpecificPropsForDocumentField<DocumentFieldLocalizedForType<DocField['type']>>
| 'localized'
>
: never;
export type DocumentFieldSpecificPropsForDocumentField<DocField extends DocumentFieldLocalized> = DocField extends {
locales: Record<string, infer Props>;
}
? Omit<Props, 'locale'>
: never;
// string like
export type DocumentStringLikeFieldTypes =
| 'string'
| 'url'
| 'slug'
| 'text'
| 'markdown'
| 'html'
| 'enum'
| 'date'
| 'datetime'
| 'color'
// TODO: file should be expressed like image type
| 'file';
export type DocumentStringLikeField = DocumentStringLikeFieldForType<DocumentStringLikeFieldTypes>;
export type DocumentStringLikeFieldNonLocalized =
DistributeDocumentStringLikeFieldNonLocalized<DocumentStringLikeFieldTypes>;
export type DocumentStringLikeFieldLocalized = DistributeDocumentStringFieldLocalized<DocumentStringLikeFieldTypes>;
export type DocumentStringLikeFieldForType<Type> = Type extends DocumentStringLikeFieldTypes
? DocumentStringLikeFieldNonLocalizedForType<Type> | DocumentStringLikeFieldLocalizedForType<Type>
: never;
export type DistributeDocumentStringLikeFieldNonLocalized<Type> = Type extends DocumentStringLikeFieldTypes
? DocumentStringLikeFieldNonLocalizedForType<Type>
: never;
export type DistributeDocumentStringFieldLocalized<Type> = Type extends DocumentStringLikeFieldTypes
? DocumentStringLikeFieldLocalizedForType<Type>
: never;
export interface DocumentStringLikeFieldNonLocalizedForType<Type extends DocumentStringLikeFieldTypes> {
type: Type;
localized?: false;
value: string;
}
export interface DocumentStringLikeFieldLocalizedForType<Type extends DocumentStringLikeFieldTypes> {
type: Type;
localized: true;
locales: Record<
string,
{
locale: string;
value: string;
}
>;
}
// number
export type DocumentNumberField = DocumentNumberFieldNonLocalized | DocumentNumberFieldLocalized;
export interface DocumentNumberFieldNonLocalized {
type: 'number';
localized?: false;
value: number;
}
export interface DocumentNumberFieldLocalized {
type: 'number';
localized: true;
locales: Record<
string,
{
locale: string;
value: number;
}
>;
}
// boolean
export type DocumentBooleanField = DocumentBooleanFieldNonLocalized | DocumentBooleanFieldLocalized;
export interface DocumentBooleanFieldNonLocalized {
type: 'boolean';
localized?: false;
value: boolean;
}
export interface DocumentBooleanFieldLocalized {
type: 'boolean';
localized: true;
locales: Record<
string,
{
locale: string;
value: boolean;
}
>;
}
// style
export type DocumentStyleField = DocumentStyleFieldNonLocalized | DocumentStyleFieldLocalized;
export type DocumentStyleFieldValue = Record<string, Partial<Record<StyleProps, any>>>;
export interface DocumentStyleFieldNonLocalized {
type: 'style';
localized?: false;
value: DocumentStyleFieldValue;
}
export interface DocumentStyleFieldLocalized {
type: 'style';
localized: true;
locales: Record<
string,
{
locale: string;
value: DocumentStyleFieldValue;
}
>;
}
// json
export type DocumentJsonField = DocumentJsonFieldNonLocalized | DocumentJsonFieldLocalized;
export interface DocumentJsonFieldNonLocalized {
type: 'json';
localized?: false;
value: any;
}
export interface DocumentJsonFieldLocalized {
type: 'json';
localized: true;
locales: Record<
string,
{
locale: string;
value: any;
}
>;
}
export type DocumentRichTextField = DocumentRichTextFieldNonLocalized | DocumentRichTextFieldLocalized;
// richText
// TODO: richText value should be well defined according to Stackbit's internal rich-text format
export type DocumentRichTextFieldValue = any;
export interface DocumentRichTextFieldNonLocalized {
type: 'richText';
localized?: false;
value: DocumentRichTextFieldValue;
hint?: string;
}
export interface DocumentRichTextFieldLocalized {
type: 'richText';
localized: true;
locales: Record<
string,
{
locale: string;
value: DocumentRichTextFieldValue;
hint?: string;
}
>;
}
// image
export type DocumentImageField = DocumentImageFieldNonLocalized | DocumentImageFieldLocalized;
export interface DocumentImageFieldNonLocalized {
type: 'image';
localized?: false;
source?: string;
sourceData?: any;
fields?: ImageFields;
}
export interface DocumentImageFieldLocalized {
type: 'image';
localized: true;
source?: string;
locales: Record<
string,
{
locale: string;
sourceData?: any;
fields?: ImageFields;
}
>;
}
export type ImageFields = {
title: DocumentStringLikeFieldForType<'string'>;
url: DocumentStringLikeFieldForType<'string'>;
};
// object
export type DocumentObjectField = DocumentObjectFieldNonLocalized | DocumentObjectFieldLocalized;
export interface DocumentObjectFieldNonLocalized {
type: 'object';
localized?: false;
fields: Record<string, DocumentField>;
}
export interface DocumentObjectFieldLocalized {
type: 'object';
localized: true;
locales: Record<
string,
{
locale: string;
fields: Record<string, DocumentField>;
}
>;
}
// model
export type DocumentModelField = DocumentModelFieldNonLocalized | DocumentModelFieldLocalized;
export interface DocumentModelFieldNonLocalized {
type: 'model';
localized?: false;
modelName: string;
fields: Record<string, DocumentField>;
}
export interface DocumentModelFieldLocalized {
type: 'model';
localized: true;
locales: Record<
string,
{
locale: string;
modelName: string;
fields: Record<string, DocumentField>;
}
>;
}
// reference
export type DocumentReferenceField = DocumentReferenceFieldNonLocalized | DocumentReferenceFieldLocalized;
export interface DocumentReferenceFieldNonLocalized {
type: 'reference';
refType: 'document' | 'asset';
localized?: false;
refId: string;
}
export interface DocumentReferenceFieldLocalized {
type: 'reference';
refType: 'document' | 'asset';
localized: true;
locales: Record<
string,
{
locale: string;
refId: string;
}
>;
}
// cross-reference
export type DocumentCrossReferenceField =
| DocumentCrossReferenceFieldNonLocalized
| DocumentCrossReferenceFieldLocalized;
export interface DocumentCrossReferenceFieldNonLocalized {
type: 'cross-reference';
refType: 'document' | 'asset';
localized?: false;
refId: string;
refSrcType: string;
refProjectId: string;
}
export interface DocumentCrossReferenceFieldLocalized {
type: 'cross-reference';
refType: 'document' | 'asset';
localized: true;
locales: Record<
string,
{
locale: string;
refId: string;
refSrcType: string;
refProjectId: string;
}
>;
}
// list
export type DocumentListField = DocumentListFieldNonLocalized | DocumentListFieldLocalized;
export type DocumentListFieldItems = Exclude<DocumentFieldNonLocalized, DocumentListFieldNonLocalized>;
export interface DocumentListFieldNonLocalized {
type: 'list';
localized?: false;
items: DocumentListFieldItems[];
}
export interface DocumentListFieldLocalized {
type: 'list';
localized: true;
locales: Record<
string,
{
locale: string;
items: DocumentListFieldItems[];
}
>;
}