objectmodel 4.3.1 → 4.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,53 @@
1
+ import {expectType} from 'tsd';
2
+ import { Model, ObjectModel } from "../src/object-model"
3
+
4
+ expectType<{ a: number, b: "b" }>(Model({ a: Number, b: <const>"b" })({ a: 1, b: "b" }))
5
+
6
+ expectType<{
7
+ product: {
8
+ name: string,
9
+ quantity: number
10
+ },
11
+ orderDate: Date
12
+ }>(new ObjectModel({
13
+ product: {
14
+ name: String,
15
+ quantity: Number,
16
+ },
17
+ orderDate: Date
18
+ })({
19
+ product: { name: "Apple Pie", quantity: 1 },
20
+ orderDate: new Date()
21
+ }))
22
+
23
+ const Person = ObjectModel({ name: String, female: Boolean })
24
+ const Man = Person.extend({ female: false })
25
+ const Mother = Person.extend({ female: true, child: Person })
26
+
27
+ let joanna = new Person({ name: "Joanna", female: true })
28
+ let joe = new Man({ name: "Joe" })
29
+ let ann = new Mother({ name: "Ann", child: joanna })
30
+ expectType<{ name: string, female: boolean }>(joanna)
31
+ expectType<{ name: string, female: boolean }>(joe)
32
+ expectType<{ name: string, female: boolean }>(ann.child)
33
+
34
+ class ClassPerson extends ObjectModel({ name: String, female: Boolean }){
35
+ constructor({ name, female }: { name: string, female: boolean }){
36
+ if(!female) name = `Mr ${name}`
37
+ super({ name, female })
38
+ }
39
+ }
40
+
41
+ class ClassMother extends ClassPerson.extend({ female: true, child: ClassPerson }){
42
+ constructor({ name, child }: { name: string, child: ClassPerson }){
43
+ super({ name: `Mrs ${name}`, female: true })
44
+ this.child = child
45
+ }
46
+ }
47
+
48
+ joanna = new ClassPerson({ name: "Joanna", female: true })
49
+ ann = new ClassMother({ name: "Ann", child: joanna })
50
+
51
+ expectType<ClassMother>(ann)
52
+ expectType<string>(ann.name)
53
+ expectType<ClassPerson>(ann.child)
@@ -0,0 +1,17 @@
1
+ import {expectType} from 'tsd';
2
+ import { ObjectModel } from '../src/object-model';
3
+ import { SetModel } from '../src/set-model';
4
+
5
+ expectType<Set<string>>(SetModel(String)(new Set(["one", "two"])));
6
+
7
+ const Question = ObjectModel({
8
+ answer: Number
9
+ });
10
+
11
+ const Quiz = SetModel([Question, String, Boolean]);
12
+
13
+ expectType<Set<{ answer: number } | string | boolean>>(Quiz(new Set()));
14
+
15
+ const SetModel1 = SetModel(String)
16
+ const SetModel2 = SetModel1.extend(Date, Number)
17
+ expectType<Set<string | Date | number>>(SetModel2([1,"2",new Date()]))
@@ -0,0 +1,43 @@
1
+ import { ArrayModel } from "../src/array-model"
2
+ import { FunctionModel, FunctionSignature } from "../src/function-model"
3
+ import { MapModel } from "../src/map-model"
4
+ import { SetModel } from "../src/set-model"
5
+ import { BasicModel, ObjectModel } from "../src/object-model"
6
+ import { Class, Prev } from "./helpers"
7
+
8
+
9
+ export type ModelDefinition = any
10
+ export type ObjectModelDefinition = Record<string | number | symbol, unknown>
11
+
12
+ export type FromDefinition<T, Depth extends Prev[number] = 5> =
13
+ [Depth] extends [never] ? never /* Depth limit reached */
14
+ : T extends BasicModel<infer U> ? FromDefinition<U, Prev[Depth]>
15
+ : T extends ArrayModel<infer U> ? FromDefinition<U, Prev[Depth]>[]
16
+ : T extends ObjectModel<infer D> ? FromObjectModelDefinition<D>
17
+ : T extends FunctionModel<infer Args, infer Return> ? FunctionSignature<Args, Return>
18
+ : T extends MapModel<infer Key, infer Value> ? Map<FromDefinition<Key, Prev[Depth]>, FromDefinition<Value, Prev[Depth]>>
19
+ : T extends SetModel<infer U> ? Set<FromDefinition<U, Prev[Depth]>>
20
+ : T extends StringConstructor | RegExp ? string
21
+ : T extends NumberConstructor ? number
22
+ : T extends BooleanConstructor ? boolean
23
+ : T extends new () => infer ConstructorType ? ConstructorType
24
+ : T extends Class ? InstanceType<T>
25
+ : T extends ObjectModelDefinition ? FromObjectModelDefinition<T>
26
+ : T extends readonly [...infer U] ? FromUnionDefinition<U>
27
+ : T extends any[] ? FromDefinition<T[number], Prev[Depth]> // TypeScript can't infer array literals as tuples for now without <const> assertions, see https://github.com/microsoft/TypeScript/issues/16656
28
+ : T
29
+
30
+ export type FromObjectModelDefinition<D extends object> = { [K in keyof D]: FromDefinition<D[K]> }
31
+
32
+ export type FromUnionDefinition<T extends any[]> = T extends [infer X] ? Optional<X>
33
+ : FromDefinition<T[number]>
34
+
35
+ export type Optional<T> = FromDefinition<T> | undefined | null
36
+
37
+ export type ExtendObjectDefinition<D extends ObjectModelDefinition, E extends (ObjectModelDefinition | ObjectModel<any>)[]> =
38
+ E extends [infer F, ...infer Rest extends (ObjectModelDefinition | ObjectModel<any>)[]]
39
+ ? F extends ObjectModel<infer FD>
40
+ ? ExtendObjectDefinition<D & FD, Rest>
41
+ : F extends ObjectModelDefinition ? ExtendObjectDefinition<D & FromObjectModelDefinition<F>, Rest>
42
+ : never
43
+ : D
@@ -0,0 +1,4 @@
1
+ export type Class = abstract new (...args: any) => any
2
+
3
+ /* Used to depth-limit recursive types */
4
+ export type Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
package/types/index.d.ts CHANGED
@@ -1,132 +1,10 @@
1
1
  // TypeScript definition file for ObjectModel
2
2
 
3
- export interface Model {
4
- (value?: any): any;
5
-
6
- definition: any;
7
- assertions: Assertion[];
8
- default: any;
9
- name: string;
10
-
11
- conventionForConstant(variableName: string): boolean;
12
- conventionForPrivate(variableName: string): boolean;
13
-
14
- toString(stack?: any[]): string;
15
-
16
- as(name: string): this;
17
-
18
- defaultTo(defaultValue: any): this;
19
-
20
- test(value: any, errorCollector?: (errors: ModelError[]) => void): boolean;
21
-
22
- errorCollector(errors: ModelError[]): void;
23
-
24
- assert(assertion: Assertion, description?: string | Function): this;
25
-
26
- }
27
-
28
- export interface ModelConstructor {
29
- (definition: any): ObjectModel;
30
- new(definition: any): ObjectModel;
31
- CHECK_ONCE: symbol;
32
- }
33
-
34
- export interface BasicModel extends Model {
35
- (): any;
36
- new(): any;
37
- (value: any): any
38
- new(value: any): any
39
-
40
- extend(...otherDefinitions: Array<any>): this;
41
- }
42
-
43
- export interface BasicModelConstructor {
44
- (definition: any): BasicModel
45
- new(definition: any): BasicModel;
46
- }
47
-
48
- export interface ObjectModel extends Model {
49
- (): Object;
50
- new(): Object;
51
- (object: object): Object;
52
- new(object: object): Object;
53
-
54
- extend(...otherDefinitions: Array<Object | ObjectModel>): this;
55
- }
56
-
57
- export interface ObjectModelConstructor {
58
- (definition: Object): ObjectModel;
59
- new(definition: Object): ObjectModel;
60
- }
61
-
62
- export interface ArrayModel extends Model {
63
- <T>(): Array<T>;
64
- new <T>(): Array<T>;
65
- <T>(array: Array<T>): Array<T>;
66
- new <T>(array: Array<T>): Array<T>;
67
-
68
- extend(...otherElementDefinitions: Array<any>): this;
69
- }
70
-
71
- export interface ArrayModelConstructor {
72
- (itemDefinition: any): ArrayModel;
73
- new(itemDefinition: any): ArrayModel;
74
- }
75
-
76
- export interface FunctionModel extends Model {
77
- (): Function;
78
- new(): Function;
79
- (fn: Function): Function;
80
- new(fn: Function): Function;
81
-
82
- definition: { arguments: any[], return: any };
83
-
84
- return(returnValueDefinition: any): FunctionModel;
85
-
86
- extend(otherArgsDefinitions: Array<any>, otherReturnValuesDefinitions: Array<any>): this;
87
- }
88
-
89
- export interface FunctionModelConstructor {
90
- (...argumentsDefinitions: any[]): FunctionModel;
91
- new(...argumentsDefinitions: any[]): FunctionModel;
92
- }
93
-
94
- export interface MapModel extends Model {
95
- (): Map<any, any>;
96
- new(): Map<any, any>;
97
- (iterable: Map<any, any> | Array<[any, any]>): Map<any, any>;
98
- new(iterable: Map<any, any> | Array<[any, any]>): Map<any, any>;
99
-
100
- extend(otherKeyDefinitions: Array<any>, otherValueDefinitions: Array<any>): this;
101
- }
102
-
103
- export interface MapModelConstructor {
104
- (keyDefinition: any, valueDefinition: any): MapModel;
105
- new(keyDefinition: any, valueDefinition: any): MapModel;
106
- }
107
-
108
- export interface SetModel extends Model {
109
- (): Set<any>;
110
- new(): Set<any>;
111
- (set: Set<any> | Array<any>): Set<any>;
112
- new(set: Set<any> | Array<any>): Set<any>;
113
-
114
- extend(...otherElementDefinitions: Array<any>): this;
115
- }
116
-
117
- export interface SetModelConstructor {
118
- (itemDefinition: any): SetModel;
119
- new(itemDefinition: any): SetModel;
120
- }
121
-
122
- export type Assertion = (variable: any) => boolean
123
-
124
- export interface ModelError {
125
- message: string;
126
- expected: any;
127
- received: any;
128
- path: string;
129
- }
3
+ import { ArrayModelConstructor } from "../src/array-model";
4
+ import { FunctionModelConstructor } from "../src/function-model";
5
+ import { MapModelConstructor } from "../src/map-model";
6
+ import { ModelConstructor, BasicModelConstructor, ObjectModelConstructor } from "../src/object-model";
7
+ import { SetModelConstructor } from "../src/set-model";
130
8
 
131
9
  export const Any: any;
132
10
  export const Model: ModelConstructor;
@@ -135,4 +13,4 @@ export const ObjectModel: ObjectModelConstructor;
135
13
  export const ArrayModel: ArrayModelConstructor;
136
14
  export const FunctionModel: FunctionModelConstructor;
137
15
  export const MapModel: MapModelConstructor;
138
- export const SetModel: SetModelConstructor;
16
+ export const SetModel: SetModelConstructor;
package/.travis.yml DELETED
@@ -1,3 +0,0 @@
1
- language: node_js
2
- node_js:
3
- - "13"