@based/schema 0.0.12 → 0.0.13
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/walker.d.ts +6 -4
- package/dist/walker.js +28 -8
- package/dist/walker.js.map +1 -1
- package/package.json +1 -1
- package/src/walker.ts +41 -13
- package/test/walker.ts +4 -7
package/dist/walker.d.ts
CHANGED
|
@@ -11,11 +11,12 @@ export type Args<T, K extends keyof BasedSchemaFields = keyof BasedSchemaFields>
|
|
|
11
11
|
fieldSchema?: BasedSchemaFields[K];
|
|
12
12
|
typeSchema?: BasedSchemaType;
|
|
13
13
|
path: Path;
|
|
14
|
+
key?: number | string;
|
|
14
15
|
value: any;
|
|
15
16
|
target: T;
|
|
16
17
|
parse: Parse<T>;
|
|
17
18
|
collect: (args: Args<T>) => any;
|
|
18
|
-
backtrack: (collectedCommands: any[]) => any;
|
|
19
|
+
backtrack: (args: Args<T>, collectedCommands: any[]) => any;
|
|
19
20
|
requiresAsyncValidation: (validationType: any) => Promise<any>;
|
|
20
21
|
error: ErrorHandler<T>;
|
|
21
22
|
};
|
|
@@ -36,9 +37,10 @@ export type Opts<T> = {
|
|
|
36
37
|
};
|
|
37
38
|
any: KeyParser<T>;
|
|
38
39
|
};
|
|
39
|
-
collect
|
|
40
|
-
backtrack:
|
|
41
|
-
requiresAsyncValidation
|
|
40
|
+
collect?: (args: Args<T>) => any;
|
|
41
|
+
backtrack?: (args: Args<T>, collectedCommands: any[]) => any;
|
|
42
|
+
requiresAsyncValidation?: (validationType: any) => Promise<boolean>;
|
|
43
|
+
errorsCollector?: ErrorHandler<T>;
|
|
42
44
|
};
|
|
43
45
|
export declare const walk: <T>(opts: Opts<T>, value: any) => Promise<{
|
|
44
46
|
target: T;
|
package/dist/walker.js
CHANGED
|
@@ -3,6 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.walk = void 0;
|
|
4
4
|
const walk = async (opts, value) => {
|
|
5
5
|
const errors = [];
|
|
6
|
+
if (!('collect' in opts)) {
|
|
7
|
+
opts.collect = () => { };
|
|
8
|
+
}
|
|
9
|
+
if (!('backtrack' in opts)) {
|
|
10
|
+
opts.backtrack = (c) => c;
|
|
11
|
+
}
|
|
12
|
+
if (!('requiresAsyncValidation' in opts)) {
|
|
13
|
+
opts.requiresAsyncValidation = async () => true;
|
|
14
|
+
}
|
|
6
15
|
const target = await opts.init(value, opts, errors);
|
|
7
16
|
const errorsCollector = (args, code) => {
|
|
8
17
|
errors.push({
|
|
@@ -10,21 +19,25 @@ const walk = async (opts, value) => {
|
|
|
10
19
|
message: `Error in ${args.path.join('.')}`,
|
|
11
20
|
});
|
|
12
21
|
};
|
|
22
|
+
if (!('errorsCollector' in opts)) {
|
|
23
|
+
opts.errorsCollector = errorsCollector;
|
|
24
|
+
}
|
|
13
25
|
const parse = async (prevArgs, key, value) => {
|
|
14
26
|
const collectedCommands = [];
|
|
15
27
|
const fromBackTrack = [];
|
|
16
28
|
const args = {
|
|
17
29
|
schema: opts.schema,
|
|
18
30
|
path: key ? [...prevArgs.path, key] : prevArgs.path,
|
|
31
|
+
key: key ?? prevArgs.path[prevArgs.path.length - 1],
|
|
19
32
|
parentValue: value ? prevArgs.value : undefined,
|
|
20
33
|
value: value ?? prevArgs.value,
|
|
21
34
|
target,
|
|
22
|
-
parse
|
|
35
|
+
parse,
|
|
23
36
|
collect: (args) => {
|
|
24
37
|
collectedCommands.push(opts.collect(args));
|
|
25
38
|
},
|
|
26
|
-
backtrack: (args) => {
|
|
27
|
-
fromBackTrack.push(opts.backtrack(args));
|
|
39
|
+
backtrack: (args, commands) => {
|
|
40
|
+
fromBackTrack.push(opts.backtrack(args, commands));
|
|
28
41
|
},
|
|
29
42
|
error: errorsCollector,
|
|
30
43
|
requiresAsyncValidation: opts.requiresAsyncValidation,
|
|
@@ -33,9 +46,17 @@ const walk = async (opts, value) => {
|
|
|
33
46
|
const q = [];
|
|
34
47
|
if (Array.isArray(args.value)) {
|
|
35
48
|
for (let i = 0; i < args.value.length; i++) {
|
|
36
|
-
//
|
|
37
49
|
const parser = opts.parsers.keys[i] || opts.parsers.any;
|
|
38
|
-
q.push(
|
|
50
|
+
q.push((async () => {
|
|
51
|
+
const newArgs = await parser({
|
|
52
|
+
...args,
|
|
53
|
+
value: args.value[i],
|
|
54
|
+
path: [...args.path, i],
|
|
55
|
+
});
|
|
56
|
+
if (newArgs) {
|
|
57
|
+
return parse(newArgs);
|
|
58
|
+
}
|
|
59
|
+
})());
|
|
39
60
|
}
|
|
40
61
|
}
|
|
41
62
|
else {
|
|
@@ -53,12 +74,11 @@ const walk = async (opts, value) => {
|
|
|
53
74
|
})());
|
|
54
75
|
}
|
|
55
76
|
}
|
|
56
|
-
await Promise.all(q);
|
|
57
77
|
if (fromBackTrack.length) {
|
|
58
|
-
|
|
78
|
+
args.backtrack(args, fromBackTrack);
|
|
59
79
|
}
|
|
60
80
|
else if (collectedCommands.length) {
|
|
61
|
-
|
|
81
|
+
args.backtrack(args, collectedCommands);
|
|
62
82
|
}
|
|
63
83
|
}
|
|
64
84
|
};
|
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/walker.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
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'
|
|
4
5
|
|
|
5
6
|
type Path = (string | number)[]
|
|
6
7
|
|
|
@@ -22,11 +23,12 @@ export type Args<
|
|
|
22
23
|
fieldSchema?: BasedSchemaFields[K]
|
|
23
24
|
typeSchema?: BasedSchemaType
|
|
24
25
|
path: Path
|
|
26
|
+
key?: number | string
|
|
25
27
|
value: any
|
|
26
28
|
target: T
|
|
27
29
|
parse: Parse<T>
|
|
28
30
|
collect: (args: Args<T>) => any
|
|
29
|
-
backtrack: (collectedCommands: any[]) => any
|
|
31
|
+
backtrack: (args: Args<T>, collectedCommands: any[]) => any
|
|
30
32
|
requiresAsyncValidation: (validationType: any) => Promise<any>
|
|
31
33
|
error: ErrorHandler<T>
|
|
32
34
|
}
|
|
@@ -53,9 +55,10 @@ export type Opts<T> = {
|
|
|
53
55
|
keys: { [key: string]: KeyParser<T> } // $list -> true
|
|
54
56
|
any: KeyParser<T> // y.x
|
|
55
57
|
}
|
|
56
|
-
collect
|
|
57
|
-
backtrack:
|
|
58
|
-
requiresAsyncValidation
|
|
58
|
+
collect?: (args: Args<T>) => any
|
|
59
|
+
backtrack?: (args: Args<T>, collectedCommands: any[]) => any // from back TRACKS OR COLLECT
|
|
60
|
+
requiresAsyncValidation?: (validationType: any) => Promise<boolean>
|
|
61
|
+
errorsCollector?: ErrorHandler<T>
|
|
59
62
|
}
|
|
60
63
|
|
|
61
64
|
export const walk = async <T>(
|
|
@@ -66,6 +69,19 @@ export const walk = async <T>(
|
|
|
66
69
|
errors: { code: ParseError; message: string }[]
|
|
67
70
|
}> => {
|
|
68
71
|
const errors: { code: ParseError; message: string }[] = []
|
|
72
|
+
|
|
73
|
+
if (!('collect' in opts)) {
|
|
74
|
+
opts.collect = () => {}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (!('backtrack' in opts)) {
|
|
78
|
+
opts.backtrack = (c) => c
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (!('requiresAsyncValidation' in opts)) {
|
|
82
|
+
opts.requiresAsyncValidation = async () => true
|
|
83
|
+
}
|
|
84
|
+
|
|
69
85
|
const target = await opts.init(value, opts, errors)
|
|
70
86
|
|
|
71
87
|
const errorsCollector: ErrorHandler<T> = (args, code) => {
|
|
@@ -75,21 +91,26 @@ export const walk = async <T>(
|
|
|
75
91
|
})
|
|
76
92
|
}
|
|
77
93
|
|
|
94
|
+
if (!('errorsCollector' in opts)) {
|
|
95
|
+
opts.errorsCollector = errorsCollector
|
|
96
|
+
}
|
|
97
|
+
|
|
78
98
|
const parse: Parse<T> = async (prevArgs, key, value) => {
|
|
79
99
|
const collectedCommands: any[] = []
|
|
80
100
|
const fromBackTrack: any[] = []
|
|
81
101
|
const args: Args<T> = {
|
|
82
102
|
schema: opts.schema,
|
|
83
103
|
path: key ? [...prevArgs.path, key] : prevArgs.path,
|
|
104
|
+
key: key ?? prevArgs.path[prevArgs.path.length - 1],
|
|
84
105
|
parentValue: value ? prevArgs.value : undefined,
|
|
85
106
|
value: value ?? prevArgs.value,
|
|
86
107
|
target,
|
|
87
|
-
parse
|
|
108
|
+
parse,
|
|
88
109
|
collect: (args) => {
|
|
89
110
|
collectedCommands.push(opts.collect(args))
|
|
90
111
|
},
|
|
91
|
-
backtrack: (args) => {
|
|
92
|
-
fromBackTrack.push(opts.backtrack(args))
|
|
112
|
+
backtrack: (args, commands) => {
|
|
113
|
+
fromBackTrack.push(opts.backtrack(args, commands))
|
|
93
114
|
},
|
|
94
115
|
error: errorsCollector,
|
|
95
116
|
requiresAsyncValidation: opts.requiresAsyncValidation,
|
|
@@ -98,10 +119,18 @@ export const walk = async <T>(
|
|
|
98
119
|
const q: Promise<Args<T> | void>[] = []
|
|
99
120
|
if (Array.isArray(args.value)) {
|
|
100
121
|
for (let i = 0; i < args.value.length; i++) {
|
|
101
|
-
//
|
|
102
122
|
const parser = opts.parsers.keys[i] || opts.parsers.any
|
|
103
123
|
q.push(
|
|
104
|
-
|
|
124
|
+
(async () => {
|
|
125
|
+
const newArgs = await parser({
|
|
126
|
+
...args,
|
|
127
|
+
value: args.value[i],
|
|
128
|
+
path: [...args.path, i],
|
|
129
|
+
})
|
|
130
|
+
if (newArgs) {
|
|
131
|
+
return parse(newArgs)
|
|
132
|
+
}
|
|
133
|
+
})()
|
|
105
134
|
)
|
|
106
135
|
}
|
|
107
136
|
} else {
|
|
@@ -114,7 +143,6 @@ export const walk = async <T>(
|
|
|
114
143
|
value: args.value[key],
|
|
115
144
|
path: [...args.path, key],
|
|
116
145
|
})
|
|
117
|
-
|
|
118
146
|
if (newArgs) {
|
|
119
147
|
return parse(newArgs)
|
|
120
148
|
}
|
|
@@ -122,11 +150,11 @@ export const walk = async <T>(
|
|
|
122
150
|
)
|
|
123
151
|
}
|
|
124
152
|
}
|
|
125
|
-
|
|
153
|
+
|
|
126
154
|
if (fromBackTrack.length) {
|
|
127
|
-
|
|
155
|
+
args.backtrack(args, fromBackTrack)
|
|
128
156
|
} else if (collectedCommands.length) {
|
|
129
|
-
|
|
157
|
+
args.backtrack(args, collectedCommands)
|
|
130
158
|
}
|
|
131
159
|
}
|
|
132
160
|
}
|
package/test/walker.ts
CHANGED
|
@@ -45,6 +45,7 @@ test('walker', async (t) => {
|
|
|
45
45
|
$list: async (args) => {
|
|
46
46
|
return {
|
|
47
47
|
...args,
|
|
48
|
+
|
|
48
49
|
value: { flapdrol: true },
|
|
49
50
|
}
|
|
50
51
|
},
|
|
@@ -53,22 +54,18 @@ test('walker', async (t) => {
|
|
|
53
54
|
// string: () => {}
|
|
54
55
|
},
|
|
55
56
|
any: async (args) => {
|
|
57
|
+
args.collect(args)
|
|
56
58
|
return args
|
|
57
59
|
},
|
|
58
60
|
},
|
|
59
61
|
collect: (args) => {
|
|
60
|
-
// console.log(' lulz collect dat command', args.path)
|
|
61
62
|
return args.path.join('.')
|
|
62
63
|
},
|
|
63
|
-
backtrack: (collectedCommands) => {
|
|
64
|
+
backtrack: (args, collectedCommands) => {
|
|
64
65
|
console.log(' \n-----------BACK TRACK GOOD GO', collectedCommands)
|
|
65
66
|
// if return next btrack will not receive backtrack from commands
|
|
66
67
|
return collectedCommands
|
|
67
68
|
},
|
|
68
|
-
requiresAsyncValidation: async (validateType) => {
|
|
69
|
-
// console.info('lullz async validaion at the end!')
|
|
70
|
-
return true
|
|
71
|
-
},
|
|
72
69
|
},
|
|
73
70
|
{
|
|
74
71
|
gurk: [1, 2, 3, 4],
|
|
@@ -93,7 +90,7 @@ test('walker', async (t) => {
|
|
|
93
90
|
)
|
|
94
91
|
|
|
95
92
|
console.info('------------')
|
|
96
|
-
|
|
93
|
+
console.info(x)
|
|
97
94
|
|
|
98
95
|
t.true(true)
|
|
99
96
|
})
|