@based/schema 0.0.14 → 0.0.15
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/set2/index.js +70 -0
- package/dist/set2/index.js.map +1 -1
- package/dist/walker.d.ts +4 -7
- package/dist/walker.js +25 -12
- package/dist/walker.js.map +1 -1
- package/package.json +1 -1
- package/src/set2/index.ts +71 -0
- package/src/walker.ts +32 -26
- package/test/walker.ts +3 -3
package/dist/set2/index.js
CHANGED
|
@@ -1 +1,71 @@
|
|
|
1
|
+
// import { ParseError } from '../set/error'
|
|
2
|
+
// import { BasedSchema, BasedSetTarget } from '../types'
|
|
3
|
+
// import { walk } from '../walker'
|
|
4
|
+
// export const setWalker2 = (schema: BasedSchema, value: any) => {
|
|
5
|
+
// return walk<BasedSetTarget>(
|
|
6
|
+
// {
|
|
7
|
+
// schema,
|
|
8
|
+
// parsers: {
|
|
9
|
+
// keys: {},
|
|
10
|
+
// fields: {
|
|
11
|
+
// object: async (args) => {
|
|
12
|
+
// if (typeof value !== 'object') {
|
|
13
|
+
// args.error(args, ParseError.incorrectFormat)
|
|
14
|
+
// return
|
|
15
|
+
// }
|
|
16
|
+
// const isArray = Array.isArray(value)
|
|
17
|
+
// if (isArray) {
|
|
18
|
+
// args.error(args, ParseError.incorrectFormat)
|
|
19
|
+
// return
|
|
20
|
+
// }
|
|
21
|
+
// const q: Promise<any>[] = []
|
|
22
|
+
// for (const key in value) {
|
|
23
|
+
// q.push(args.parse(args, key, value[key]))
|
|
24
|
+
// }
|
|
25
|
+
// await Promise.all(q)
|
|
26
|
+
// },
|
|
27
|
+
// boolean: async (args) => {
|
|
28
|
+
// if (typeof value !== 'boolean') {
|
|
29
|
+
// args.error(args, ParseError.incorrectFormat)
|
|
30
|
+
// return
|
|
31
|
+
// }
|
|
32
|
+
// args.collect(args)
|
|
33
|
+
// },
|
|
34
|
+
// },
|
|
35
|
+
// any: async (args) => {
|
|
36
|
+
// args.error(args, ParseError.fieldDoesNotExist)
|
|
37
|
+
// },
|
|
38
|
+
// },
|
|
39
|
+
// init: async (value, args) => {
|
|
40
|
+
// let type: string
|
|
41
|
+
// if (value.$id) {
|
|
42
|
+
// type = schema.prefixToTypeMapping[value.$id.slice(0, 2)]
|
|
43
|
+
// if (!type) {
|
|
44
|
+
// args.error(args, ParseError.incorrectFieldType)
|
|
45
|
+
// return
|
|
46
|
+
// }
|
|
47
|
+
// }
|
|
48
|
+
// if (value.type) {
|
|
49
|
+
// if (type && value.type !== type) {
|
|
50
|
+
// args.error(args, ParseError.incorrectNodeType)
|
|
51
|
+
// return
|
|
52
|
+
// }
|
|
53
|
+
// type = value.type
|
|
54
|
+
// }
|
|
55
|
+
// const schemaType = schema.types[type]
|
|
56
|
+
// if (!schemaType) {
|
|
57
|
+
// args.error(args, ParseError.incorrectNodeType)
|
|
58
|
+
// return
|
|
59
|
+
// }
|
|
60
|
+
// const target: BasedSetTarget = {
|
|
61
|
+
// type,
|
|
62
|
+
// schema,
|
|
63
|
+
// required: [],
|
|
64
|
+
// }
|
|
65
|
+
// return { ...args, target }
|
|
66
|
+
// },
|
|
67
|
+
// },
|
|
68
|
+
// value
|
|
69
|
+
// )
|
|
70
|
+
// }
|
|
1
71
|
//# sourceMappingURL=index.js.map
|
package/dist/set2/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/set2/index.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/set2/index.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,yDAAyD;AACzD,mCAAmC;AAEnC,mEAAmE;AACnE,iCAAiC;AACjC,QAAQ;AACR,gBAAgB;AAChB,mBAAmB;AACnB,oBAAoB;AACpB,oBAAoB;AACpB,sCAAsC;AACtC,+CAA+C;AAC/C,6DAA6D;AAC7D,uBAAuB;AACvB,gBAAgB;AAChB,mDAAmD;AACnD,6BAA6B;AAC7B,6DAA6D;AAC7D,uBAAuB;AACvB,gBAAgB;AAChB,2CAA2C;AAC3C,yCAAyC;AACzC,0DAA0D;AAC1D,gBAAgB;AAChB,mCAAmC;AACnC,eAAe;AACf,uCAAuC;AACvC,gDAAgD;AAChD,6DAA6D;AAC7D,uBAAuB;AACvB,gBAAgB;AAChB,iCAAiC;AACjC,eAAe;AACf,aAAa;AACb,iCAAiC;AACjC,2DAA2D;AAC3D,aAAa;AACb,WAAW;AACX,uCAAuC;AACvC,2BAA2B;AAC3B,2BAA2B;AAC3B,qEAAqE;AACrE,yBAAyB;AACzB,8DAA8D;AAC9D,qBAAqB;AACrB,cAAc;AACd,YAAY;AACZ,4BAA4B;AAC5B,+CAA+C;AAC/C,6DAA6D;AAC7D,qBAAqB;AACrB,cAAc;AACd,8BAA8B;AAC9B,YAAY;AACZ,gDAAgD;AAChD,6BAA6B;AAC7B,2DAA2D;AAC3D,mBAAmB;AACnB,YAAY;AACZ,2CAA2C;AAC3C,kBAAkB;AAClB,oBAAoB;AACpB,0BAA0B;AAC1B,YAAY;AACZ,qCAAqC;AACrC,WAAW;AACX,SAAS;AACT,YAAY;AACZ,MAAM;AACN,IAAI"}
|
package/dist/walker.d.ts
CHANGED
|
@@ -20,17 +20,14 @@ export type Args<T, K extends keyof BasedSchemaFields = keyof BasedSchemaFields>
|
|
|
20
20
|
requiresAsyncValidation: (validationType: any) => Promise<any>;
|
|
21
21
|
error: ErrorHandler<T>;
|
|
22
22
|
};
|
|
23
|
-
export type FieldParser<
|
|
24
|
-
export type KeyParser<T> = (args: Args<T, keyof BasedSchemaFields>) => Promise<Args<T> | void>;
|
|
23
|
+
export type FieldParser<K extends keyof BasedSchemaFields, T = any> = (args: Args<T, K>) => Promise<Args<T> | void>;
|
|
24
|
+
export type KeyParser<T = any> = (args: Args<T, keyof BasedSchemaFields>) => Promise<Args<T> | void>;
|
|
25
25
|
export type Opts<T> = {
|
|
26
26
|
schema: BasedSchema;
|
|
27
|
-
init: (
|
|
28
|
-
code: ParseError;
|
|
29
|
-
message: string;
|
|
30
|
-
}[]) => Promise<T>;
|
|
27
|
+
init: (args: Args<T>) => Promise<Args<T>>;
|
|
31
28
|
parsers: {
|
|
32
29
|
fields: Partial<{
|
|
33
|
-
[Key in keyof BasedSchemaFields]: FieldParser<
|
|
30
|
+
[Key in keyof BasedSchemaFields]: FieldParser<Key, T>;
|
|
34
31
|
}>;
|
|
35
32
|
keys: {
|
|
36
33
|
[key: string]: KeyParser<T>;
|
package/dist/walker.js
CHANGED
|
@@ -12,16 +12,16 @@ const walk = async (opts, value) => {
|
|
|
12
12
|
if (!('requiresAsyncValidation' in opts)) {
|
|
13
13
|
opts.requiresAsyncValidation = async () => true;
|
|
14
14
|
}
|
|
15
|
-
const target = await opts.init(value, opts, errors);
|
|
16
15
|
const errorsCollector = (args, code) => {
|
|
17
|
-
|
|
16
|
+
const err = {
|
|
18
17
|
code,
|
|
19
18
|
message: `Error in ${args.path.join('.')}`,
|
|
20
|
-
}
|
|
19
|
+
};
|
|
20
|
+
if (opts.errorsCollector) {
|
|
21
|
+
opts.errorsCollector(args, code);
|
|
22
|
+
}
|
|
23
|
+
errors.push(err);
|
|
21
24
|
};
|
|
22
|
-
if (!('errorsCollector' in opts)) {
|
|
23
|
-
opts.errorsCollector = errorsCollector;
|
|
24
|
-
}
|
|
25
25
|
const parse = async (prevArgs, key, value) => {
|
|
26
26
|
const collectedCommands = [];
|
|
27
27
|
const fromBackTrack = [];
|
|
@@ -31,8 +31,8 @@ const walk = async (opts, value) => {
|
|
|
31
31
|
key: key ?? prevArgs.path[prevArgs.path.length - 1],
|
|
32
32
|
parentValue: value ? prevArgs.value : undefined,
|
|
33
33
|
value: value ?? prevArgs.value,
|
|
34
|
-
target,
|
|
35
|
-
parse,
|
|
34
|
+
target: prevArgs.target,
|
|
35
|
+
parse: prevArgs.parse,
|
|
36
36
|
collect: (args) => {
|
|
37
37
|
collectedCommands.push(opts.collect(args));
|
|
38
38
|
},
|
|
@@ -44,6 +44,12 @@ const walk = async (opts, value) => {
|
|
|
44
44
|
};
|
|
45
45
|
if (typeof args.value === 'object' && args.value !== null) {
|
|
46
46
|
const q = [];
|
|
47
|
+
if (args.typeSchema && !args.fieldSchema) {
|
|
48
|
+
// top level
|
|
49
|
+
}
|
|
50
|
+
if (args.fieldSchema) {
|
|
51
|
+
//
|
|
52
|
+
}
|
|
47
53
|
if (Array.isArray(args.value)) {
|
|
48
54
|
for (let i = 0; i < args.value.length; i++) {
|
|
49
55
|
const parser = opts.parsers.keys[i] || opts.parsers.any;
|
|
@@ -86,20 +92,27 @@ const walk = async (opts, value) => {
|
|
|
86
92
|
}
|
|
87
93
|
}
|
|
88
94
|
};
|
|
89
|
-
const args = {
|
|
95
|
+
const args = await opts.init({
|
|
90
96
|
schema: opts.schema,
|
|
91
97
|
path: [],
|
|
92
98
|
value,
|
|
93
|
-
target,
|
|
94
99
|
parse,
|
|
95
100
|
collect: opts.collect,
|
|
96
101
|
backtrack: opts.backtrack,
|
|
97
102
|
error: errorsCollector,
|
|
98
103
|
requiresAsyncValidation: opts.requiresAsyncValidation,
|
|
99
|
-
};
|
|
104
|
+
});
|
|
105
|
+
if (!args) {
|
|
106
|
+
return {
|
|
107
|
+
// TODO: temp
|
|
108
|
+
// @ts-ignore // for now
|
|
109
|
+
target: {},
|
|
110
|
+
errors,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
100
113
|
await parse(args);
|
|
101
114
|
return {
|
|
102
|
-
target,
|
|
115
|
+
target: args.target,
|
|
103
116
|
errors,
|
|
104
117
|
};
|
|
105
118
|
};
|
package/dist/walker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walker.js","sourceRoot":"","sources":["../src/walker.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"walker.js","sourceRoot":"","sources":["../src/walker.ts"],"names":[],"mappings":";;;AA0DO,MAAM,IAAI,GAAG,KAAK,EACvB,IAAa,EACb,KAAU,EAIT,EAAE;IACH,MAAM,MAAM,GAA4C,EAAE,CAAA;IAE1D,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,EAAE;QACxB,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;KACxB;IAED,IAAI,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC,EAAE;QAC1B,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;KAC1B;IAED,IAAI,CAAC,CAAC,yBAAyB,IAAI,IAAI,CAAC,EAAE;QACxC,IAAI,CAAC,uBAAuB,GAAG,KAAK,IAAI,EAAE,CAAC,IAAI,CAAA;KAChD;IAED,MAAM,eAAe,GAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;QACtD,MAAM,GAAG,GAAG;YACV,IAAI;YACJ,OAAO,EAAE,YAAY,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;SAC3C,CAAA;QACD,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;SACjC;QACD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAClB,CAAC,CAAA;IAED,MAAM,KAAK,GAAa,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACrD,MAAM,iBAAiB,GAAU,EAAE,CAAA;QACnC,MAAM,aAAa,GAAU,EAAE,CAAA;QAC/B,MAAM,IAAI,GAAY;YACpB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI;YACnD,GAAG,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YACnD,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YAC/C,KAAK,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK;YAC9B,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBAChB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;YAC5C,CAAC;YACD,SAAS,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;gBAC5B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;YACpD,CAAC;YACD,KAAK,EAAE,eAAe;YACtB,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;SACtD,CAAA;QACD,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE;YACzD,MAAM,CAAC,GAA8B,EAAE,CAAA;YAEvC,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBACxC,YAAY;aACb;YAED,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,EAAE;aACH;YAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;gBAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAA;oBACvD,MAAM,CAAC,GAAG,CAAC,CAAA;oBACX,CAAC,CAAC,IAAI,CACJ,CAAC,KAAK,IAAI,EAAE;wBACV,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC;4BAC3B,GAAG,IAAI;4BACP,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;4BACpB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;4BACvB,GAAG,EAAE,CAAC;yBACP,CAAC,CAAA;wBACF,IAAI,OAAO,EAAE;4BACX,OAAO,KAAK,CAAC,OAAO,CAAC,CAAA;yBACtB;oBACH,CAAC,CAAC,EAAE,CACL,CAAA;iBACF;aACF;iBAAM;gBACL,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE;oBAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAA;oBACzD,CAAC,CAAC,IAAI,CACJ,CAAC,KAAK,IAAI,EAAE;wBACV,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC;4BAC3B,GAAG,IAAI;4BACP,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;4BACtB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC;4BACzB,GAAG;yBACJ,CAAC,CAAA;wBACF,IAAI,OAAO,EAAE;4BACX,OAAO,KAAK,CAAC,OAAO,CAAC,CAAA;yBACtB;oBACH,CAAC,CAAC,EAAE,CACL,CAAA;iBACF;aACF;YAED,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACpB,IAAI,aAAa,CAAC,MAAM,EAAE;gBACxB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;aACpC;iBAAM,IAAI,iBAAiB,CAAC,MAAM,EAAE;gBACnC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAA;aACxC;SACF;IACH,CAAC,CAAA;IACD,MAAM,IAAI,GAAY,MAAM,IAAI,CAAC,IAAI,CAAU;QAC7C,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,EAAE;QACR,KAAK;QACL,KAAK;QACL,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,KAAK,EAAE,eAAe;QACtB,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;KACtD,CAAC,CAAA;IAEF,IAAI,CAAC,IAAI,EAAE;QACT,OAAO;YACL,aAAa;YACb,wBAAwB;YACxB,MAAM,EAAE,EAAE;YACV,MAAM;SACP,CAAA;KACF;IACD,MAAM,KAAK,CAAC,IAAI,CAAC,CAAA;IACjB,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM;KACP,CAAA;AACH,CAAC,CAAA;AApIY,QAAA,IAAI,QAoIhB"}
|
package/package.json
CHANGED
package/src/set2/index.ts
CHANGED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// import { ParseError } from '../set/error'
|
|
2
|
+
// import { BasedSchema, BasedSetTarget } from '../types'
|
|
3
|
+
// import { walk } from '../walker'
|
|
4
|
+
|
|
5
|
+
// export const setWalker2 = (schema: BasedSchema, value: any) => {
|
|
6
|
+
// return walk<BasedSetTarget>(
|
|
7
|
+
// {
|
|
8
|
+
// schema,
|
|
9
|
+
// parsers: {
|
|
10
|
+
// keys: {},
|
|
11
|
+
// fields: {
|
|
12
|
+
// object: async (args) => {
|
|
13
|
+
// if (typeof value !== 'object') {
|
|
14
|
+
// args.error(args, ParseError.incorrectFormat)
|
|
15
|
+
// return
|
|
16
|
+
// }
|
|
17
|
+
// const isArray = Array.isArray(value)
|
|
18
|
+
// if (isArray) {
|
|
19
|
+
// args.error(args, ParseError.incorrectFormat)
|
|
20
|
+
// return
|
|
21
|
+
// }
|
|
22
|
+
// const q: Promise<any>[] = []
|
|
23
|
+
// for (const key in value) {
|
|
24
|
+
// q.push(args.parse(args, key, value[key]))
|
|
25
|
+
// }
|
|
26
|
+
// await Promise.all(q)
|
|
27
|
+
// },
|
|
28
|
+
// boolean: async (args) => {
|
|
29
|
+
// if (typeof value !== 'boolean') {
|
|
30
|
+
// args.error(args, ParseError.incorrectFormat)
|
|
31
|
+
// return
|
|
32
|
+
// }
|
|
33
|
+
// args.collect(args)
|
|
34
|
+
// },
|
|
35
|
+
// },
|
|
36
|
+
// any: async (args) => {
|
|
37
|
+
// args.error(args, ParseError.fieldDoesNotExist)
|
|
38
|
+
// },
|
|
39
|
+
// },
|
|
40
|
+
// init: async (value, args) => {
|
|
41
|
+
// let type: string
|
|
42
|
+
// if (value.$id) {
|
|
43
|
+
// type = schema.prefixToTypeMapping[value.$id.slice(0, 2)]
|
|
44
|
+
// if (!type) {
|
|
45
|
+
// args.error(args, ParseError.incorrectFieldType)
|
|
46
|
+
// return
|
|
47
|
+
// }
|
|
48
|
+
// }
|
|
49
|
+
// if (value.type) {
|
|
50
|
+
// if (type && value.type !== type) {
|
|
51
|
+
// args.error(args, ParseError.incorrectNodeType)
|
|
52
|
+
// return
|
|
53
|
+
// }
|
|
54
|
+
// type = value.type
|
|
55
|
+
// }
|
|
56
|
+
// const schemaType = schema.types[type]
|
|
57
|
+
// if (!schemaType) {
|
|
58
|
+
// args.error(args, ParseError.incorrectNodeType)
|
|
59
|
+
// return
|
|
60
|
+
// }
|
|
61
|
+
// const target: BasedSetTarget = {
|
|
62
|
+
// type,
|
|
63
|
+
// schema,
|
|
64
|
+
// required: [],
|
|
65
|
+
// }
|
|
66
|
+
// return { ...args, target }
|
|
67
|
+
// },
|
|
68
|
+
// },
|
|
69
|
+
// value
|
|
70
|
+
// )
|
|
71
|
+
// }
|
package/src/walker.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { ParseError } from './set/error'
|
|
2
2
|
import { BasedSchema, BasedSetHandlers, BasedSetTarget } from './types'
|
|
3
3
|
import { BasedSchemaType, BasedSchemaFields } from './types'
|
|
4
|
-
import { SetOptional } from 'type-fest'
|
|
5
4
|
|
|
6
5
|
type Path = (string | number)[]
|
|
7
6
|
|
|
@@ -33,24 +32,20 @@ export type Args<
|
|
|
33
32
|
error: ErrorHandler<T>
|
|
34
33
|
}
|
|
35
34
|
|
|
36
|
-
export type FieldParser<
|
|
35
|
+
export type FieldParser<K extends keyof BasedSchemaFields, T = any> = (
|
|
37
36
|
args: Args<T, K>
|
|
38
37
|
) => Promise<Args<T> | void>
|
|
39
38
|
|
|
40
|
-
export type KeyParser<T> = (
|
|
39
|
+
export type KeyParser<T = any> = (
|
|
41
40
|
args: Args<T, keyof BasedSchemaFields>
|
|
42
41
|
) => Promise<Args<T> | void>
|
|
43
42
|
|
|
44
43
|
export type Opts<T> = {
|
|
45
44
|
schema: BasedSchema
|
|
46
|
-
init: (
|
|
47
|
-
value: any,
|
|
48
|
-
opts: Opts<T>,
|
|
49
|
-
errors: { code: ParseError; message: string }[]
|
|
50
|
-
) => Promise<T>
|
|
45
|
+
init: (args: Args<T>) => Promise<Args<T>>
|
|
51
46
|
parsers: {
|
|
52
47
|
fields: Partial<{
|
|
53
|
-
[Key in keyof BasedSchemaFields]: FieldParser<
|
|
48
|
+
[Key in keyof BasedSchemaFields]: FieldParser<Key, T>
|
|
54
49
|
}>
|
|
55
50
|
keys: { [key: string]: KeyParser<T> } // $list -> true
|
|
56
51
|
any: KeyParser<T> // y.x
|
|
@@ -82,17 +77,15 @@ export const walk = async <T>(
|
|
|
82
77
|
opts.requiresAsyncValidation = async () => true
|
|
83
78
|
}
|
|
84
79
|
|
|
85
|
-
const target = await opts.init(value, opts, errors)
|
|
86
|
-
|
|
87
80
|
const errorsCollector: ErrorHandler<T> = (args, code) => {
|
|
88
|
-
|
|
81
|
+
const err = {
|
|
89
82
|
code,
|
|
90
83
|
message: `Error in ${args.path.join('.')}`,
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
84
|
+
}
|
|
85
|
+
if (opts.errorsCollector) {
|
|
86
|
+
opts.errorsCollector(args, code)
|
|
87
|
+
}
|
|
88
|
+
errors.push(err)
|
|
96
89
|
}
|
|
97
90
|
|
|
98
91
|
const parse: Parse<T> = async (prevArgs, key, value) => {
|
|
@@ -104,8 +97,8 @@ export const walk = async <T>(
|
|
|
104
97
|
key: key ?? prevArgs.path[prevArgs.path.length - 1],
|
|
105
98
|
parentValue: value ? prevArgs.value : undefined,
|
|
106
99
|
value: value ?? prevArgs.value,
|
|
107
|
-
target,
|
|
108
|
-
parse,
|
|
100
|
+
target: prevArgs.target,
|
|
101
|
+
parse: prevArgs.parse,
|
|
109
102
|
collect: (args) => {
|
|
110
103
|
collectedCommands.push(opts.collect(args))
|
|
111
104
|
},
|
|
@@ -117,6 +110,15 @@ export const walk = async <T>(
|
|
|
117
110
|
}
|
|
118
111
|
if (typeof args.value === 'object' && args.value !== null) {
|
|
119
112
|
const q: Promise<Args<T> | void>[] = []
|
|
113
|
+
|
|
114
|
+
if (args.typeSchema && !args.fieldSchema) {
|
|
115
|
+
// top level
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (args.fieldSchema) {
|
|
119
|
+
//
|
|
120
|
+
}
|
|
121
|
+
|
|
120
122
|
if (Array.isArray(args.value)) {
|
|
121
123
|
for (let i = 0; i < args.value.length; i++) {
|
|
122
124
|
const parser = opts.parsers.keys[i] || opts.parsers.any
|
|
@@ -155,7 +157,6 @@ export const walk = async <T>(
|
|
|
155
157
|
}
|
|
156
158
|
|
|
157
159
|
await Promise.all(q)
|
|
158
|
-
|
|
159
160
|
if (fromBackTrack.length) {
|
|
160
161
|
args.backtrack(args, fromBackTrack)
|
|
161
162
|
} else if (collectedCommands.length) {
|
|
@@ -163,23 +164,28 @@ export const walk = async <T>(
|
|
|
163
164
|
}
|
|
164
165
|
}
|
|
165
166
|
}
|
|
166
|
-
|
|
167
|
-
const args: Args<T> = {
|
|
167
|
+
const args: Args<T> = await opts.init(<Args<T>>{
|
|
168
168
|
schema: opts.schema,
|
|
169
169
|
path: [],
|
|
170
170
|
value,
|
|
171
|
-
target,
|
|
172
171
|
parse,
|
|
173
172
|
collect: opts.collect,
|
|
174
173
|
backtrack: opts.backtrack,
|
|
175
174
|
error: errorsCollector,
|
|
176
175
|
requiresAsyncValidation: opts.requiresAsyncValidation,
|
|
176
|
+
})
|
|
177
|
+
|
|
178
|
+
if (!args) {
|
|
179
|
+
return {
|
|
180
|
+
// TODO: temp
|
|
181
|
+
// @ts-ignore // for now
|
|
182
|
+
target: {},
|
|
183
|
+
errors,
|
|
184
|
+
}
|
|
177
185
|
}
|
|
178
|
-
|
|
179
186
|
await parse(args)
|
|
180
|
-
|
|
181
187
|
return {
|
|
182
|
-
target,
|
|
188
|
+
target: args.target,
|
|
183
189
|
errors,
|
|
184
190
|
}
|
|
185
191
|
}
|
package/test/walker.ts
CHANGED
|
@@ -36,9 +36,9 @@ test('walker', async (t) => {
|
|
|
36
36
|
const x = await walk(
|
|
37
37
|
{
|
|
38
38
|
schema,
|
|
39
|
-
init: async () => {
|
|
40
|
-
console.log('init!\n')
|
|
41
|
-
return { lullz: true }
|
|
39
|
+
init: async (args) => {
|
|
40
|
+
console.log('init!\n', args)
|
|
41
|
+
return { ...args, target: { lullz: true } }
|
|
42
42
|
},
|
|
43
43
|
parsers: {
|
|
44
44
|
keys: {
|