merge ts-final

This commit is contained in:
Dan Ribbens
2020-11-22 01:35:16 -05:00
4 changed files with 133 additions and 58 deletions

View File

@@ -15,6 +15,7 @@ export type Collection = {
singular: string;
plural: string;
};
fields: Field[];
admin?: {
useAsTitle?: string;
defaultColumns?: string[];
@@ -63,10 +64,10 @@ export type Collection = {
}
};
config: {[key: string]: any};
fields: Field[];
upload: {
imageSizes: ImageSize[];
staticURL: string;
staticDir: string;
adminThumbnail?: string;
};
};

View File

@@ -1,3 +1,4 @@
/* eslint-disable no-use-before-define */
import { CSSProperties } from 'react';
import { PayloadRequest } from '../../express/types/payloadRequest';
import { Access } from '../../config/types';
@@ -10,41 +11,19 @@ export type FieldHook = (args: {
operation?: 'create' | 'update',
req?: PayloadRequest}) => Promise<any> | any;
export type Field = {
type FieldBase = {
name: string;
label: string;
slug?: string;
label?: string;
type:
| 'number'
| 'text'
| 'email'
| 'textarea'
| 'richText'
| 'code'
| 'radio'
| 'checkbox'
| 'date'
| 'upload'
| 'relationship'
| 'row'
| 'array'
| 'group'
| 'select'
| 'blocks';
localized?: boolean;
hidden?: boolean;
required?: boolean;
unique?: boolean;
defaultValue?: any;
hidden?: boolean;
localized?: boolean;
maxLength?: number;
height?: number;
validate?: (value: any, field: Field) => any;
access?: {
create?: Access;
read?: Access;
update?: Access;
delete?: Access;
};
blocks: Field[];
relationTo?: string;
fields?: Field[];
// eslint-disable-next-line no-use-before-define
hooks?: {
beforeValidate?: FieldHook[];
beforeChange?: FieldHook[];
@@ -52,11 +31,109 @@ export type Field = {
afterRead?: FieldHook[];
}
admin?: {
position?: string;
position?: 'sidebar';
width?: string;
style?: CSSProperties;
readOnly?: boolean;
disabled?: boolean;
condition?: () => any;
condition?: (...args: any[]) => any | void;
components?: { [key: string]: JSX.Element | (() => JSX.Element) };
};
access?: {
create?: Access;
read?: Access;
update?: Access;
delete?: Access;
admin?: Access;
unlock?: Access;
};
}
export type StandardField = FieldBase & {
fields?: Field[];
}
export type NumberField = StandardField & { type: 'number'; };
export type TextField = StandardField & { type: 'text'; };
export type EmailField = StandardField & { type: 'email'; };
export type TextareaField = StandardField & { type: 'textarea'; };
export type CodeField = StandardField & { type: 'code'; };
export type CheckboxField = StandardField & { type: 'checkbox'; };
export type DateField = StandardField & { type: 'date'; };
export type GroupField = StandardField & { type: 'group'; };
export type RowField = StandardField & { type: 'row'; };
export type UploadField = FieldBase & {
type: 'upload';
relationTo: string;
}
export type SelectField = FieldBase & {
type: 'select';
options: {
value: string;
label: string;
}[];
hasMany?: boolean;
}
export type SelectManyField = SelectField & {
hasMany: true;
}
type RelationShipSingleField = FieldBase & {
type: 'relationship';
relationTo: string;
hasMany?: false;
}
type RelationShipManyField = FieldBase & {
type: 'relationship';
relationTo: string[] | string;
hasMany: true;
}
export type RelationshipField = RelationShipSingleField | RelationShipManyField;
type RichTextElements = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'blockquote' | 'ul' | 'ol' | 'link';
type RichTextLeaves = 'bold' | 'italic' | 'underline' | 'strikethrough';
export type RichTextField = FieldBase & {
type: 'richText';
admin?: {
elements?: RichTextElements[];
leaves?: RichTextLeaves[];
}
}
export type ArrayField = FieldBase & {
type: 'array';
minRows?: number;
maxRows?: number;
fields?: Field[];
}
export type RadioField = FieldBase & {
type: 'radio';
options: {
value: string;
label: string;
}[];
}
export type Block = {
slug: string,
labels: {
singular: string;
plural: string;
};
fields: Field[],
}
export type BlockField = FieldBase & {
type: 'blocks';
minRows?: number;
maxRows?: number;
blocks?: Block[];
};
export type Field = NumberField | TextField | EmailField | TextareaField | CodeField | CheckboxField | DateField | BlockField | RadioField | RelationshipField | ArrayField | RichTextField | GroupField | RowField | SelectField | SelectManyField | UploadField;

View File

@@ -1,8 +1,9 @@
/* eslint-disable no-use-before-define */
import { Schema } from 'mongoose';
import { MissingFieldInputOptions } from '../errors';
import { ArrayField, BlockField, CheckboxField, CodeField, DateField, EmailField, Field, GroupField, NumberField, RadioField, RelationshipField, RichTextField, RowField, SelectField, TextareaField, TextField, UploadField } from '../fields/config/types';
const setBlockDiscriminators = (fields, schema) => {
const setBlockDiscriminators = (fields: Field[], schema) => {
fields.forEach((field) => {
if (field.type === 'blocks' && field.blocks && field.blocks.length > 0) {
field.blocks.forEach((block) => {
@@ -24,7 +25,7 @@ const setBlockDiscriminators = (fields, schema) => {
});
};
const formatBaseSchema = (field) => {
const formatBaseSchema = (field: Field) => {
const createAccess = field.access && field.access.create;
const condition = field.admin && field.admin.condition;
@@ -38,7 +39,7 @@ const formatBaseSchema = (field) => {
};
};
const buildSchema = (configFields, options = {}) => {
const buildSchema = (configFields: Field[], options = {}): Schema => {
let fields = {};
configFields.forEach((field) => {
@@ -57,31 +58,31 @@ const buildSchema = (configFields, options = {}) => {
};
const fieldToSchemaMap = {
number: (field, fields) => ({
number: (field: NumberField, fields: Field[]) => ({
...fields,
[field.name]: { ...formatBaseSchema(field), type: Number },
}),
text: (field, fields) => ({
text: (field: TextField, fields: Field[]) => ({
...fields,
[field.name]: { ...formatBaseSchema(field), type: String },
}),
email: (field, fields) => ({
email: (field: EmailField, fields: Field[]) => ({
...fields,
[field.name]: { ...formatBaseSchema(field), type: String },
}),
textarea: (field, fields) => ({
textarea: (field: TextareaField, fields: Field[]) => ({
...fields,
[field.name]: { ...formatBaseSchema(field), type: String },
}),
richText: (field, fields) => ({
richText: (field: RichTextField, fields: Field[]) => ({
...fields,
[field.name]: { ...formatBaseSchema(field), type: Schema.Types.Mixed },
}),
code: (field, fields) => ({
code: (field: CodeField, fields: Field[]) => ({
...fields,
[field.name]: { ...formatBaseSchema(field), type: String },
}),
radio: (field, fields) => {
radio: (field: RadioField, fields: Field[]) => {
if (!field.options || field.options.length === 0) {
throw new MissingFieldInputOptions(field);
}
@@ -97,18 +98,18 @@ const fieldToSchemaMap = {
return {
...fields,
[field.name]: field.hasMany ? [schema] : schema,
[field.name]: field.hasMany ? [schema] : schema, // TODO: radio group with hasMany??
};
},
checkbox: (field, fields) => ({
checkbox: (field: CheckboxField, fields: Field[]) => ({
...fields,
[field.name]: { ...formatBaseSchema(field), type: Boolean },
}),
date: (field, fields) => ({
date: (field: DateField, fields: Field[]) => ({
...fields,
[field.name]: { ...formatBaseSchema(field), type: Date },
}),
upload: (field, fields) => ({
upload: (field: UploadField, fields: Field[]) => ({
...fields,
[field.name]: {
...formatBaseSchema(field),
@@ -116,8 +117,8 @@ const fieldToSchemaMap = {
ref: field.relationTo,
},
}),
relationship: (field, fields) => {
let schema = {};
relationship: (field: RelationshipField, fields: Field[]) => {
let schema: { [key: string]: any } = {};
if (Array.isArray(field.relationTo)) {
schema.value = {
@@ -146,7 +147,7 @@ const fieldToSchemaMap = {
[field.name]: schema,
};
},
row: (field, fields) => {
row: (field: RowField, fields: Field[]) => {
const newFields = { ...fields };
field.fields.forEach((rowField) => {
@@ -160,7 +161,7 @@ const fieldToSchemaMap = {
return newFields;
},
array: (field, fields) => {
array: (field: ArrayField, fields: Field[]) => {
const schema = buildSchema(field.fields, { _id: false, id: false });
return {
@@ -171,7 +172,7 @@ const fieldToSchemaMap = {
},
};
},
group: (field, fields) => {
group: (field: GroupField, fields: Field[]) => {
const schema = buildSchema(field.fields, { _id: false, id: false });
return {
@@ -183,7 +184,7 @@ const fieldToSchemaMap = {
},
};
},
select: (field, fields) => {
select: (field: SelectField, fields: Field[]) => {
if (!field.options || field.options.length === 0) {
throw new MissingFieldInputOptions(field);
}
@@ -202,7 +203,7 @@ const fieldToSchemaMap = {
[field.name]: field.hasMany ? [schema] : schema,
};
},
blocks: (field, fields) => {
blocks: (field: BlockField, fields: Field[]) => {
const flexibleSchema = new Schema({ blockName: String }, { discriminatorKey: 'blockType', _id: false, id: false });
return {