Skip to content

Commit

Permalink
Explicit types for SchemaTypes
Browse files Browse the repository at this point in the history
  • Loading branch information
b-gran committed Oct 26, 2019
1 parent ac2eb60 commit 72d1e9c
Showing 1 changed file with 73 additions and 34 deletions.
107 changes: 73 additions & 34 deletions index.d.ts
Original file line number Diff line number Diff line change
@@ -1,64 +1,103 @@
import * as React from 'react'

type IsRequiredOption = {
required: boolean,
required?: boolean,
}

// TODO: all of the schema types can be enumerated
type FunctionSchemaType <TOptions> = ((x: unknown) => boolean)
type BaseSchemaType<TOptions> = ((x: unknown) => boolean)
& { _isSchemaType: true, _type: string, } & TOptions
type SchemaTypeFactory<TOptions> = (options?: TOptions) => BaseSchemaType<TOptions>

type StringSchemaTypeFactory = SchemaTypeFactory<IsRequiredOption>
type StringSchemaType = BaseSchemaType<IsRequiredOption>

type BooleanSchemaTypeFactory = SchemaTypeFactory<IsRequiredOption>
type BooleanSchemaType = BaseSchemaType<IsRequiredOption>

type NumberSchemaTypeFactory = SchemaTypeFactory<IsRequiredOption>
type NumberSchemaType = BaseSchemaType<IsRequiredOption>

type FunctionSchemaTypeFactory = SchemaTypeFactory<IsRequiredOption>
type FunctionSchemaType = BaseSchemaType<IsRequiredOption>

type DateSchemaTypeFactory = SchemaTypeFactory<IsRequiredOption>
type DateSchemaType = BaseSchemaType<IsRequiredOption>

type ArraySchemaTypeFactory = SchemaTypeFactory<IsRequiredOption>
type ArraySchemaType = BaseSchemaType<IsRequiredOption>

type AnyObjectSchemaTypeFactory = SchemaTypeFactory<IsRequiredOption>
type AnyObjectSchemaType = BaseSchemaType<IsRequiredOption>

type ArrayOfSchemaTypeFactory = (type: SchemaType) => SchemaTypeFactory<IsRequiredOption>
type ArrayOfSchemaType = BaseSchemaType<IsRequiredOption>

type AnySchemaTypeFactory = SchemaTypeFactory<IsRequiredOption>
type AnySchemaType = BaseSchemaType<IsRequiredOption>

interface ObjectSchemaType {
// TODO: avoid hardcoded option type
[key: string]: FunctionSchemaType<IsRequiredOption> | ObjectSchemaType,
[key: string]: SchemaType,
}
type SchemaType = FunctionSchemaType<IsRequiredOption> | ObjectSchemaType
type SchemaTypeFactory = (options?: IsRequiredOption) => SchemaType

type SchemaType =
StringSchemaType
| BooleanSchemaType
| NumberSchemaType
| FunctionSchemaType
| DateSchemaType
| ArraySchemaType
| AnyObjectSchemaType
| ArrayOfSchemaType
| AnySchemaType
| ObjectSchemaType

export const SchemaTypes: {
any: SchemaTypeFactory,
string: SchemaTypeFactory,
boolean: SchemaTypeFactory,
function: SchemaTypeFactory,
number: SchemaTypeFactory,
date: SchemaTypeFactory,
array: SchemaTypeFactory,
object: SchemaTypeFactory,
arrayOf: (type: SchemaType) => SchemaTypeFactory,
};
any: AnySchemaTypeFactory,
string: StringSchemaTypeFactory,
boolean: BooleanSchemaTypeFactory,
function: FunctionSchemaTypeFactory,
number: NumberSchemaTypeFactory,
date: DateSchemaTypeFactory,
array: ArraySchemaTypeFactory,
object: AnyObjectSchemaTypeFactory,
arrayOf: ArrayOfSchemaTypeFactory,
}

export const matchesSchema: (schema: SchemaType, test: unknown) => boolean

type BaseEditorProps = {
// TODO: this is wrong. The set of valid schematypes and options should be predefined
type: SchemaType,
className?: string,
}

type EditablePrimitive = number | string | boolean

interface EditableObject {
[key: string]: Editable,
}

interface EditableArray {
[key: number]: Editable,
}

type Editable = EditablePrimitive | EditableObject | EditableArray

export class ObjectEditor <TObject extends Editable> extends
React.Component<BaseEditorProps & {
object?: TObject,
onUpdateElement: (object: TObject) => void,
parentVisible?: boolean,
}> {}

export class ArrayEditor <TObject extends Editable> extends
React.Component<BaseEditorProps & {
object?: Array<TObject>,
onUpdateElement: (object: TObject, index: number) => void,
onRemoveElements: (indices: Array<Number>) => void,
onAddElement: (object: TObject) => void,
parentVisible?: boolean,
defaultRowsPerPage?: number,
}> {}
export class ObjectEditor<TObject extends Editable> extends React.Component<BaseEditorProps & {
object?: TObject,
onUpdateElement: (object: TObject) => void,
parentVisible?: boolean,
}> {
}

export class ArrayEditor<TObject extends Editable> extends React.Component<BaseEditorProps & {
object?: Array<TObject>,
onUpdateElement: (object: TObject, index: number) => void,
onRemoveElements: (indices: Array<Number>) => void,
onAddElement: (object: TObject) => void,
parentVisible?: boolean,
defaultRowsPerPage?: number,
}> {
}

export const PropTypes: {
SchemaType: unknown, // TODO
Expand Down

0 comments on commit 72d1e9c

Please sign in to comment.