@based/schema 0.0.14 → 0.0.16
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 +8 -9
- package/dist/walker.js +35 -22
- package/dist/walker.js.map +1 -1
- package/package.json +1 -1
- package/src/set2/index.ts +71 -0
- package/src/walker.ts +52 -36
- package/test/walker.ts +23 -15
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
|
@@ -4,6 +4,7 @@ import { BasedSchemaType, BasedSchemaFields } from './types';
|
|
|
4
4
|
type Path = (string | number)[];
|
|
5
5
|
type ErrorHandler<T> = (args: Args<T>, code: ParseError) => void;
|
|
6
6
|
type Parse<T> = (args: Args<T>, key?: string | number, value?: any) => Promise<Args<T> | void>;
|
|
7
|
+
type BackTrack<T> = (args: Args<T>, fromBackTrack: any[], collectedCommands: any[]) => any;
|
|
7
8
|
export type Args<T, K extends keyof BasedSchemaFields = keyof BasedSchemaFields> = {
|
|
8
9
|
schema: BasedSchema;
|
|
9
10
|
parentValue?: any;
|
|
@@ -14,23 +15,21 @@ export type Args<T, K extends keyof BasedSchemaFields = keyof BasedSchemaFields>
|
|
|
14
15
|
key?: number | string;
|
|
15
16
|
value: any;
|
|
16
17
|
target: T;
|
|
18
|
+
fromBackTrack: any[];
|
|
17
19
|
parse: Parse<T>;
|
|
18
20
|
collect: (args: Args<T>) => any;
|
|
19
|
-
backtrack:
|
|
21
|
+
backtrack: BackTrack<T>;
|
|
20
22
|
requiresAsyncValidation: (validationType: any) => Promise<any>;
|
|
21
23
|
error: ErrorHandler<T>;
|
|
22
24
|
};
|
|
23
|
-
export type FieldParser<
|
|
24
|
-
export type KeyParser<T> = (args: Args<T, keyof BasedSchemaFields>) => Promise<Args<T> | void>;
|
|
25
|
+
export type FieldParser<K extends keyof BasedSchemaFields, T = any> = (args: Args<T, K>) => Promise<Args<T> | void>;
|
|
26
|
+
export type KeyParser<T = any> = (args: Args<T, keyof BasedSchemaFields>) => Promise<Args<T> | void>;
|
|
25
27
|
export type Opts<T> = {
|
|
26
28
|
schema: BasedSchema;
|
|
27
|
-
init: (
|
|
28
|
-
code: ParseError;
|
|
29
|
-
message: string;
|
|
30
|
-
}[]) => Promise<T>;
|
|
29
|
+
init: (args: Args<T>) => Promise<Args<T>>;
|
|
31
30
|
parsers: {
|
|
32
31
|
fields: Partial<{
|
|
33
|
-
[Key in keyof BasedSchemaFields]: FieldParser<
|
|
32
|
+
[Key in keyof BasedSchemaFields]: FieldParser<Key, T>;
|
|
34
33
|
}>;
|
|
35
34
|
keys: {
|
|
36
35
|
[key: string]: KeyParser<T>;
|
|
@@ -38,7 +37,7 @@ export type Opts<T> = {
|
|
|
38
37
|
any: KeyParser<T>;
|
|
39
38
|
};
|
|
40
39
|
collect?: (args: Args<T>) => any;
|
|
41
|
-
backtrack?:
|
|
40
|
+
backtrack?: BackTrack<T>;
|
|
42
41
|
requiresAsyncValidation?: (validationType: any) => Promise<boolean>;
|
|
43
42
|
errorsCollector?: ErrorHandler<T>;
|
|
44
43
|
};
|
package/dist/walker.js
CHANGED
|
@@ -7,21 +7,21 @@ const walk = async (opts, value) => {
|
|
|
7
7
|
opts.collect = () => { };
|
|
8
8
|
}
|
|
9
9
|
if (!('backtrack' in opts)) {
|
|
10
|
-
opts.backtrack = (c) =>
|
|
10
|
+
opts.backtrack = (args, btC, c) => btC;
|
|
11
11
|
}
|
|
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,19 +31,25 @@ 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
|
},
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
},
|
|
39
|
+
fromBackTrack,
|
|
40
|
+
backtrack: opts.backtrack,
|
|
42
41
|
error: errorsCollector,
|
|
43
|
-
requiresAsyncValidation:
|
|
42
|
+
requiresAsyncValidation: prevArgs.requiresAsyncValidation,
|
|
44
43
|
};
|
|
45
44
|
if (typeof args.value === 'object' && args.value !== null) {
|
|
46
45
|
const q = [];
|
|
46
|
+
if (args.typeSchema && !args.fieldSchema) {
|
|
47
|
+
// top level
|
|
48
|
+
}
|
|
49
|
+
if (args.fieldSchema) {
|
|
50
|
+
//
|
|
51
|
+
}
|
|
52
|
+
// first do key parsers
|
|
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;
|
|
@@ -78,28 +84,35 @@ const walk = async (opts, value) => {
|
|
|
78
84
|
}
|
|
79
85
|
}
|
|
80
86
|
await Promise.all(q);
|
|
81
|
-
if (fromBackTrack.length) {
|
|
82
|
-
args.backtrack(args, fromBackTrack);
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
87
|
+
if (fromBackTrack.length || collectedCommands.length) {
|
|
88
|
+
const x = args.backtrack(args, fromBackTrack, collectedCommands);
|
|
89
|
+
if (x) {
|
|
90
|
+
prevArgs.fromBackTrack?.push(x);
|
|
91
|
+
}
|
|
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":"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"}
|
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
|
|
|
@@ -13,6 +12,12 @@ type Parse<T> = (
|
|
|
13
12
|
value?: any
|
|
14
13
|
) => Promise<Args<T> | void> // If true will not continue
|
|
15
14
|
|
|
15
|
+
type BackTrack<T> = (
|
|
16
|
+
args: Args<T>,
|
|
17
|
+
fromBackTrack: any[],
|
|
18
|
+
collectedCommands: any[]
|
|
19
|
+
) => any
|
|
20
|
+
|
|
16
21
|
export type Args<
|
|
17
22
|
T,
|
|
18
23
|
K extends keyof BasedSchemaFields = keyof BasedSchemaFields
|
|
@@ -26,37 +31,34 @@ export type Args<
|
|
|
26
31
|
key?: number | string
|
|
27
32
|
value: any
|
|
28
33
|
target: T
|
|
34
|
+
fromBackTrack: any[]
|
|
29
35
|
parse: Parse<T>
|
|
30
36
|
collect: (args: Args<T>) => any
|
|
31
|
-
backtrack:
|
|
37
|
+
backtrack: BackTrack<T>
|
|
32
38
|
requiresAsyncValidation: (validationType: any) => Promise<any>
|
|
33
39
|
error: ErrorHandler<T>
|
|
34
40
|
}
|
|
35
41
|
|
|
36
|
-
export type FieldParser<
|
|
42
|
+
export type FieldParser<K extends keyof BasedSchemaFields, T = any> = (
|
|
37
43
|
args: Args<T, K>
|
|
38
44
|
) => Promise<Args<T> | void>
|
|
39
45
|
|
|
40
|
-
export type KeyParser<T> = (
|
|
46
|
+
export type KeyParser<T = any> = (
|
|
41
47
|
args: Args<T, keyof BasedSchemaFields>
|
|
42
48
|
) => Promise<Args<T> | void>
|
|
43
49
|
|
|
44
50
|
export type Opts<T> = {
|
|
45
51
|
schema: BasedSchema
|
|
46
|
-
init: (
|
|
47
|
-
value: any,
|
|
48
|
-
opts: Opts<T>,
|
|
49
|
-
errors: { code: ParseError; message: string }[]
|
|
50
|
-
) => Promise<T>
|
|
52
|
+
init: (args: Args<T>) => Promise<Args<T>>
|
|
51
53
|
parsers: {
|
|
52
54
|
fields: Partial<{
|
|
53
|
-
[Key in keyof BasedSchemaFields]: FieldParser<
|
|
55
|
+
[Key in keyof BasedSchemaFields]: FieldParser<Key, T>
|
|
54
56
|
}>
|
|
55
57
|
keys: { [key: string]: KeyParser<T> } // $list -> true
|
|
56
58
|
any: KeyParser<T> // y.x
|
|
57
59
|
}
|
|
58
60
|
collect?: (args: Args<T>) => any
|
|
59
|
-
backtrack?:
|
|
61
|
+
backtrack?: BackTrack<T>
|
|
60
62
|
requiresAsyncValidation?: (validationType: any) => Promise<boolean>
|
|
61
63
|
errorsCollector?: ErrorHandler<T>
|
|
62
64
|
}
|
|
@@ -75,24 +77,22 @@ export const walk = async <T>(
|
|
|
75
77
|
}
|
|
76
78
|
|
|
77
79
|
if (!('backtrack' in opts)) {
|
|
78
|
-
opts.backtrack = (c) =>
|
|
80
|
+
opts.backtrack = (args, btC, c) => btC
|
|
79
81
|
}
|
|
80
82
|
|
|
81
83
|
if (!('requiresAsyncValidation' in opts)) {
|
|
82
84
|
opts.requiresAsyncValidation = async () => true
|
|
83
85
|
}
|
|
84
86
|
|
|
85
|
-
const target = await opts.init(value, opts, errors)
|
|
86
|
-
|
|
87
87
|
const errorsCollector: ErrorHandler<T> = (args, code) => {
|
|
88
|
-
|
|
88
|
+
const err = {
|
|
89
89
|
code,
|
|
90
90
|
message: `Error in ${args.path.join('.')}`,
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
91
|
+
}
|
|
92
|
+
if (opts.errorsCollector) {
|
|
93
|
+
opts.errorsCollector(args, code)
|
|
94
|
+
}
|
|
95
|
+
errors.push(err)
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
const parse: Parse<T> = async (prevArgs, key, value) => {
|
|
@@ -104,19 +104,29 @@ export const walk = async <T>(
|
|
|
104
104
|
key: key ?? prevArgs.path[prevArgs.path.length - 1],
|
|
105
105
|
parentValue: value ? prevArgs.value : undefined,
|
|
106
106
|
value: value ?? prevArgs.value,
|
|
107
|
-
target,
|
|
108
|
-
parse,
|
|
107
|
+
target: prevArgs.target,
|
|
108
|
+
parse: prevArgs.parse,
|
|
109
109
|
collect: (args) => {
|
|
110
110
|
collectedCommands.push(opts.collect(args))
|
|
111
111
|
},
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
},
|
|
112
|
+
fromBackTrack,
|
|
113
|
+
backtrack: opts.backtrack,
|
|
115
114
|
error: errorsCollector,
|
|
116
|
-
requiresAsyncValidation:
|
|
115
|
+
requiresAsyncValidation: prevArgs.requiresAsyncValidation,
|
|
117
116
|
}
|
|
118
117
|
if (typeof args.value === 'object' && args.value !== null) {
|
|
119
118
|
const q: Promise<Args<T> | void>[] = []
|
|
119
|
+
|
|
120
|
+
if (args.typeSchema && !args.fieldSchema) {
|
|
121
|
+
// top level
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (args.fieldSchema) {
|
|
125
|
+
//
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// first do key parsers
|
|
129
|
+
|
|
120
130
|
if (Array.isArray(args.value)) {
|
|
121
131
|
for (let i = 0; i < args.value.length; i++) {
|
|
122
132
|
const parser = opts.parsers.keys[i] || opts.parsers.any
|
|
@@ -156,30 +166,36 @@ export const walk = async <T>(
|
|
|
156
166
|
|
|
157
167
|
await Promise.all(q)
|
|
158
168
|
|
|
159
|
-
if (fromBackTrack.length) {
|
|
160
|
-
args.backtrack(args, fromBackTrack)
|
|
161
|
-
|
|
162
|
-
|
|
169
|
+
if (fromBackTrack.length || collectedCommands.length) {
|
|
170
|
+
const x = args.backtrack(args, fromBackTrack, collectedCommands)
|
|
171
|
+
if (x) {
|
|
172
|
+
prevArgs.fromBackTrack?.push(x)
|
|
173
|
+
}
|
|
163
174
|
}
|
|
164
175
|
}
|
|
165
176
|
}
|
|
166
|
-
|
|
167
|
-
const args: Args<T> = {
|
|
177
|
+
const args: Args<T> = await opts.init(<Args<T>>{
|
|
168
178
|
schema: opts.schema,
|
|
169
179
|
path: [],
|
|
170
180
|
value,
|
|
171
|
-
target,
|
|
172
181
|
parse,
|
|
173
182
|
collect: opts.collect,
|
|
174
183
|
backtrack: opts.backtrack,
|
|
175
184
|
error: errorsCollector,
|
|
176
185
|
requiresAsyncValidation: opts.requiresAsyncValidation,
|
|
186
|
+
})
|
|
187
|
+
|
|
188
|
+
if (!args) {
|
|
189
|
+
return {
|
|
190
|
+
// TODO: temp
|
|
191
|
+
// @ts-ignore // for now
|
|
192
|
+
target: {},
|
|
193
|
+
errors,
|
|
194
|
+
}
|
|
177
195
|
}
|
|
178
|
-
|
|
179
196
|
await parse(args)
|
|
180
|
-
|
|
181
197
|
return {
|
|
182
|
-
target,
|
|
198
|
+
target: args.target,
|
|
183
199
|
errors,
|
|
184
200
|
}
|
|
185
201
|
}
|
package/test/walker.ts
CHANGED
|
@@ -36,19 +36,17 @@ test('walker', async (t) => {
|
|
|
36
36
|
const x = await walk(
|
|
37
37
|
{
|
|
38
38
|
schema,
|
|
39
|
-
init: async () => {
|
|
40
|
-
|
|
41
|
-
return { lullz: true }
|
|
39
|
+
init: async (args) => {
|
|
40
|
+
return { ...args, target: { lullz: true } }
|
|
42
41
|
},
|
|
43
42
|
parsers: {
|
|
44
43
|
keys: {
|
|
45
|
-
$list: async (args) => {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
},
|
|
44
|
+
// $list: async (args) => {
|
|
45
|
+
// return {
|
|
46
|
+
// ...args,
|
|
47
|
+
// value: { flapdrol: true },
|
|
48
|
+
// }
|
|
49
|
+
// },
|
|
52
50
|
},
|
|
53
51
|
fields: {
|
|
54
52
|
// string: () => {}
|
|
@@ -61,10 +59,21 @@ test('walker', async (t) => {
|
|
|
61
59
|
collect: (args) => {
|
|
62
60
|
return args.path.join('.')
|
|
63
61
|
},
|
|
64
|
-
backtrack: (args,
|
|
65
|
-
console.log(
|
|
66
|
-
|
|
67
|
-
|
|
62
|
+
backtrack: (args, fromBt, collected) => {
|
|
63
|
+
console.log(
|
|
64
|
+
' \n-----------BACK TRACK GOOD GO',
|
|
65
|
+
'\n',
|
|
66
|
+
'path:',
|
|
67
|
+
args.path.join('.'),
|
|
68
|
+
'\n',
|
|
69
|
+
'backtracked:',
|
|
70
|
+
JSON.stringify(fromBt),
|
|
71
|
+
'\n',
|
|
72
|
+
'collected:',
|
|
73
|
+
collected,
|
|
74
|
+
'--------------------'
|
|
75
|
+
)
|
|
76
|
+
return fromBt.length ? fromBt : collected
|
|
68
77
|
},
|
|
69
78
|
},
|
|
70
79
|
{
|
|
@@ -90,7 +99,6 @@ test('walker', async (t) => {
|
|
|
90
99
|
)
|
|
91
100
|
|
|
92
101
|
console.info('------------')
|
|
93
|
-
console.info(x)
|
|
94
102
|
|
|
95
103
|
t.true(true)
|
|
96
104
|
})
|