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.
- package/dist/object-model.cjs +380 -387
- package/dist/object-model.js +380 -387
- package/dist/object-model.js.map +1 -1
- package/dist/object-model.min.js +2 -2
- package/dist/object-model.min.js.map +1 -1
- package/index.html +4 -4
- package/package.json +70 -64
- package/src/array-model.d.ts +16 -0
- package/src/array-model.js +68 -68
- package/src/devtool-formatter.js +198 -198
- package/src/function-model.d.ts +24 -0
- package/src/function-model.js +58 -65
- package/src/index.js +4 -4
- package/src/map-model.d.ts +18 -0
- package/src/map-model.js +48 -48
- package/src/object-model.d.ts +74 -0
- package/src/set-model.d.ts +16 -0
- package/src/set-model.js +41 -41
- package/test/array-model.test-d.ts +24 -0
- package/test/basic-model.test-d.ts +30 -0
- package/test/function-model.spec.cjs +161 -162
- package/test/function-model.test-d.ts +18 -0
- package/test/map-model.test-d.ts +21 -0
- package/test/object-model.spec.cjs +1345 -1346
- package/test/object-model.test-d.ts +53 -0
- package/test/set-model.test-d.ts +17 -0
- package/types/definitions.d.ts +43 -0
- package/types/helpers.d.ts +4 -0
- package/types/index.d.ts +6 -128
- package/.travis.yml +0 -3
|
@@ -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
|
package/types/index.d.ts
CHANGED
|
@@ -1,132 +1,10 @@
|
|
|
1
1
|
// TypeScript definition file for ObjectModel
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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