@based/schema 0.0.6 → 0.0.8
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/deepPartial.d.ts +0 -0
- package/dist/deepPartial.js +3 -0
- package/dist/deepPartial.js.map +1 -0
- package/dist/set/checkDefaultAndValue.d.ts +3 -0
- package/dist/set/checkDefaultAndValue.js +33 -0
- package/dist/set/checkDefaultAndValue.js.map +1 -0
- package/dist/set/collections.js +80 -56
- package/dist/set/collections.js.map +1 -1
- package/dist/set/enum.d.ts +2 -0
- package/dist/set/enum.js +15 -0
- package/dist/set/enum.js.map +1 -0
- package/dist/set/error.d.ts +4 -1
- package/dist/set/error.js +3 -0
- package/dist/set/error.js.map +1 -1
- package/dist/set/fieldValidator.d.ts +6 -0
- package/dist/set/fieldValidator.js +144 -0
- package/dist/set/fieldValidator.js.map +1 -0
- package/dist/set/handleError.d.ts +1 -0
- package/dist/set/handleError.js +9 -0
- package/dist/set/handleError.js.map +1 -0
- package/dist/set/index.d.ts +1 -1
- package/dist/set/index.js +5 -3
- package/dist/set/index.js.map +1 -1
- package/dist/set/number copy.d.ts +4 -0
- package/dist/set/number copy.js +57 -0
- package/dist/set/number copy.js.map +1 -0
- package/dist/set/number.js +86 -33
- package/dist/set/number.js.map +1 -1
- package/dist/set/parseDefaultAndValue.d.ts +3 -0
- package/dist/set/parseDefaultAndValue.js +33 -0
- package/dist/set/parseDefaultAndValue.js.map +1 -0
- package/dist/set/references.js +10 -14
- package/dist/set/references.js.map +1 -1
- package/dist/set/rest copy.d.ts +5 -0
- package/dist/set/rest copy.js +53 -0
- package/dist/set/rest copy.js.map +1 -0
- package/dist/set/rest.js +45 -22
- package/dist/set/rest.js.map +1 -1
- package/dist/set/string.js +41 -21
- package/dist/set/string.js.map +1 -1
- package/dist/set/types.d.ts +1 -1
- package/dist/setWalker.d.ts +11 -0
- package/dist/setWalker.js +189 -0
- package/dist/setWalker.js.map +1 -0
- package/dist/transformers.d.ts +3 -0
- package/dist/transformers.js +18 -0
- package/dist/transformers.js.map +1 -0
- package/dist/typeWalker.d.ts +3 -0
- package/dist/typeWalker.js +18 -0
- package/dist/typeWalker.js.map +1 -0
- package/dist/validate.d.ts +4 -0
- package/dist/validate.js +34 -0
- package/dist/validate.js.map +1 -0
- package/dist/validateFields.d.ts +4 -0
- package/dist/validateFields.js +34 -0
- package/dist/validateFields.js.map +1 -0
- package/dist/validateSchema copy.d.ts +4 -0
- package/dist/validateSchema copy.js +34 -0
- package/dist/validateSchema copy.js.map +1 -0
- package/package.json +1 -1
- package/src/set/collections.ts +111 -88
- package/src/set/error.ts +3 -0
- package/src/set/index.ts +6 -3
- package/src/set/number.ts +109 -37
- package/src/set/parseDefaultAndValue.ts +44 -0
- package/src/set/references.ts +14 -14
- package/src/set/rest.ts +80 -21
- package/src/set/string.ts +75 -23
- package/src/set/types.ts +3 -2
- package/test/setWalker.ts +93 -5
- package/dist/parse.d.ts +0 -2
- package/dist/parse.js +0 -9
- package/dist/parse.js.map +0 -1
package/src/set/collections.ts
CHANGED
|
@@ -8,53 +8,45 @@ export const set: Parser<'set'> = async (
|
|
|
8
8
|
fieldSchema,
|
|
9
9
|
typeSchema,
|
|
10
10
|
target,
|
|
11
|
-
handlers
|
|
11
|
+
handlers,
|
|
12
|
+
noCollect
|
|
12
13
|
) => {
|
|
13
14
|
const q: Promise<void>[] = []
|
|
14
15
|
const fieldDef = fieldSchema.items
|
|
15
16
|
if (Array.isArray(value)) {
|
|
16
|
-
const handlerNest = {
|
|
17
|
-
...handlers,
|
|
18
|
-
collect: ({ value }) => {
|
|
19
|
-
parsedArray.push(value)
|
|
20
|
-
},
|
|
21
|
-
}
|
|
22
17
|
const parsedArray = []
|
|
23
18
|
for (let i = 0; i < value.length; i++) {
|
|
24
19
|
q.push(
|
|
25
|
-
fieldWalker(
|
|
26
|
-
|
|
27
|
-
value
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
handlerNest
|
|
32
|
-
)
|
|
20
|
+
fieldWalker([...path, i], value[i], fieldDef, typeSchema, target, {
|
|
21
|
+
...handlers,
|
|
22
|
+
collect: ({ value }) => {
|
|
23
|
+
parsedArray.push(value)
|
|
24
|
+
},
|
|
25
|
+
})
|
|
33
26
|
)
|
|
34
27
|
}
|
|
35
28
|
await Promise.all(q)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const handlerNest = {
|
|
45
|
-
...handlers,
|
|
46
|
-
collect: () => {},
|
|
29
|
+
if (!noCollect) {
|
|
30
|
+
handlers.collect({
|
|
31
|
+
path,
|
|
32
|
+
value: { $value: parsedArray },
|
|
33
|
+
typeSchema,
|
|
34
|
+
fieldSchema,
|
|
35
|
+
target,
|
|
36
|
+
})
|
|
47
37
|
}
|
|
38
|
+
} else {
|
|
48
39
|
if (value.$add) {
|
|
49
40
|
for (let i = 0; i < value.$add.length; i++) {
|
|
50
41
|
q.push(
|
|
51
42
|
fieldWalker(
|
|
52
|
-
|
|
43
|
+
path,
|
|
53
44
|
value.$add[i],
|
|
54
45
|
fieldDef,
|
|
55
46
|
typeSchema,
|
|
56
47
|
target,
|
|
57
|
-
|
|
48
|
+
handlers,
|
|
49
|
+
true
|
|
58
50
|
)
|
|
59
51
|
)
|
|
60
52
|
}
|
|
@@ -63,18 +55,21 @@ export const set: Parser<'set'> = async (
|
|
|
63
55
|
for (let i = 0; i < value.$add.length; i++) {
|
|
64
56
|
q.push(
|
|
65
57
|
fieldWalker(
|
|
66
|
-
|
|
58
|
+
path,
|
|
67
59
|
value.$delete[i],
|
|
68
60
|
fieldDef,
|
|
69
61
|
typeSchema,
|
|
70
62
|
target,
|
|
71
|
-
|
|
63
|
+
handlers,
|
|
64
|
+
true
|
|
72
65
|
)
|
|
73
66
|
)
|
|
74
67
|
}
|
|
75
68
|
}
|
|
76
69
|
await Promise.all(q)
|
|
77
|
-
|
|
70
|
+
if (!noCollect) {
|
|
71
|
+
handlers.collect({ path, value, typeSchema, fieldSchema, target })
|
|
72
|
+
}
|
|
78
73
|
}
|
|
79
74
|
}
|
|
80
75
|
|
|
@@ -84,7 +79,8 @@ export const object: Parser<'object'> = async (
|
|
|
84
79
|
fieldSchema,
|
|
85
80
|
typeSchema,
|
|
86
81
|
target,
|
|
87
|
-
handlers
|
|
82
|
+
handlers,
|
|
83
|
+
noCollect
|
|
88
84
|
) => {
|
|
89
85
|
if (typeof value !== 'object') {
|
|
90
86
|
error(path, ParseError.incorrectFormat)
|
|
@@ -106,127 +102,153 @@ export const object: Parser<'object'> = async (
|
|
|
106
102
|
propDef,
|
|
107
103
|
typeSchema,
|
|
108
104
|
target,
|
|
109
|
-
handlers
|
|
105
|
+
handlers,
|
|
106
|
+
noCollect
|
|
110
107
|
)
|
|
111
108
|
)
|
|
112
109
|
}
|
|
113
110
|
await Promise.all(q)
|
|
114
111
|
}
|
|
115
112
|
|
|
113
|
+
// unshift // only allow 1 command
|
|
116
114
|
export const array: Parser<'array'> = async (
|
|
117
115
|
path,
|
|
118
116
|
value,
|
|
119
117
|
fieldSchema,
|
|
120
118
|
typeSchema,
|
|
121
119
|
target,
|
|
122
|
-
handlers
|
|
120
|
+
handlers,
|
|
121
|
+
noCollect
|
|
123
122
|
) => {
|
|
124
123
|
const isArray = Array.isArray(value)
|
|
124
|
+
let parsedValue = value
|
|
125
|
+
let opCount = 0
|
|
125
126
|
if (typeof value === 'object' && !isArray) {
|
|
126
127
|
if (value.$insert) {
|
|
128
|
+
opCount++
|
|
127
129
|
if (
|
|
128
130
|
typeof value.$insert !== 'object' ||
|
|
129
131
|
value.$insert.$idx === undefined
|
|
130
132
|
) {
|
|
131
|
-
error(
|
|
133
|
+
error(path, ParseError.incorrectFormat)
|
|
132
134
|
} else {
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
}
|
|
135
|
+
const insert = Array.isArray(value.$insert.$value)
|
|
136
|
+
? value.$insert.$value
|
|
137
|
+
: [value.$insert.$value]
|
|
137
138
|
const q: Promise<void>[] = []
|
|
138
|
-
|
|
139
|
-
for (let i = 0; i < value.$insert.$value.length; i++) {
|
|
140
|
-
q.push(
|
|
141
|
-
fieldWalker(
|
|
142
|
-
[...path, 'insert', i],
|
|
143
|
-
value.$insert.$value[i],
|
|
144
|
-
fieldSchema.values,
|
|
145
|
-
typeSchema,
|
|
146
|
-
target,
|
|
147
|
-
nestedHandler
|
|
148
|
-
)
|
|
149
|
-
)
|
|
150
|
-
}
|
|
151
|
-
} else {
|
|
139
|
+
for (let i = 0; i < insert.length; i++) {
|
|
152
140
|
q.push(
|
|
153
141
|
fieldWalker(
|
|
154
|
-
|
|
155
|
-
|
|
142
|
+
path,
|
|
143
|
+
insert[i],
|
|
156
144
|
fieldSchema.values,
|
|
157
145
|
typeSchema,
|
|
158
146
|
target,
|
|
159
|
-
|
|
147
|
+
handlers,
|
|
148
|
+
true
|
|
160
149
|
)
|
|
161
150
|
)
|
|
162
151
|
}
|
|
163
152
|
await Promise.all(q)
|
|
164
153
|
}
|
|
165
154
|
}
|
|
166
|
-
if (value.$remove
|
|
167
|
-
|
|
155
|
+
if (value.$remove) {
|
|
156
|
+
opCount++
|
|
157
|
+
if (opCount > 1) {
|
|
158
|
+
error(path, ParseError.multipleOperationsNotAllowed)
|
|
159
|
+
}
|
|
160
|
+
if (value.$remove.$idx === undefined) {
|
|
161
|
+
error(path, ParseError.incorrectFormat)
|
|
162
|
+
}
|
|
168
163
|
}
|
|
169
164
|
if (value.$push) {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
collect: () => {},
|
|
165
|
+
opCount++
|
|
166
|
+
if (opCount > 1) {
|
|
167
|
+
error(path, ParseError.multipleOperationsNotAllowed)
|
|
174
168
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
169
|
+
|
|
170
|
+
const q: Promise<void>[] = []
|
|
171
|
+
const push = Array.isArray(value.$push) ? value.$push : [value.$push]
|
|
172
|
+
for (let i = 0; i < push.length; i++) {
|
|
173
|
+
q.push(
|
|
174
|
+
fieldWalker(
|
|
175
|
+
path,
|
|
176
|
+
push[i],
|
|
177
|
+
fieldSchema.values,
|
|
178
|
+
typeSchema,
|
|
179
|
+
target,
|
|
180
|
+
handlers,
|
|
181
|
+
true
|
|
186
182
|
)
|
|
187
|
-
|
|
188
|
-
}
|
|
183
|
+
)
|
|
184
|
+
}
|
|
185
|
+
await Promise.all(q)
|
|
186
|
+
parsedValue = { $push: push }
|
|
187
|
+
}
|
|
188
|
+
if (value.$unshift) {
|
|
189
|
+
opCount++
|
|
190
|
+
if (opCount > 1) {
|
|
191
|
+
error(path, ParseError.multipleOperationsNotAllowed)
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const q: Promise<void>[] = []
|
|
195
|
+
const unshift = Array.isArray(value.$unshift)
|
|
196
|
+
? value.$unshift
|
|
197
|
+
: [value.$unshift]
|
|
198
|
+
for (let i = 0; i < unshift.length; i++) {
|
|
189
199
|
q.push(
|
|
190
200
|
fieldWalker(
|
|
191
|
-
|
|
192
|
-
|
|
201
|
+
path,
|
|
202
|
+
unshift[i],
|
|
193
203
|
fieldSchema.values,
|
|
194
204
|
typeSchema,
|
|
195
205
|
target,
|
|
196
|
-
|
|
206
|
+
handlers,
|
|
207
|
+
true
|
|
197
208
|
)
|
|
198
209
|
)
|
|
199
210
|
}
|
|
200
211
|
await Promise.all(q)
|
|
212
|
+
parsedValue = { $unshift: unshift }
|
|
201
213
|
}
|
|
202
214
|
if (value.$assign) {
|
|
215
|
+
opCount++
|
|
216
|
+
if (opCount > 1) {
|
|
217
|
+
error(path, ParseError.multipleOperationsNotAllowed)
|
|
218
|
+
}
|
|
219
|
+
|
|
203
220
|
if (
|
|
204
221
|
typeof value.$assign !== 'object' ||
|
|
205
222
|
value.$assign.$idx === undefined
|
|
206
223
|
) {
|
|
207
|
-
error(
|
|
224
|
+
error(path, ParseError.incorrectFormat)
|
|
208
225
|
} else {
|
|
209
226
|
await fieldWalker(
|
|
210
|
-
|
|
227
|
+
path,
|
|
211
228
|
value.$assign.$value,
|
|
212
229
|
fieldSchema.values,
|
|
213
230
|
typeSchema,
|
|
214
231
|
target,
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
collect: () => {},
|
|
218
|
-
}
|
|
232
|
+
handlers,
|
|
233
|
+
true
|
|
219
234
|
)
|
|
220
235
|
}
|
|
221
236
|
}
|
|
222
|
-
|
|
237
|
+
|
|
238
|
+
if (!noCollect) {
|
|
239
|
+
handlers.collect({
|
|
240
|
+
path,
|
|
241
|
+
value: parsedValue,
|
|
242
|
+
typeSchema,
|
|
243
|
+
fieldSchema,
|
|
244
|
+
target,
|
|
245
|
+
})
|
|
246
|
+
}
|
|
223
247
|
return
|
|
224
248
|
}
|
|
225
|
-
|
|
226
249
|
if (!isArray) {
|
|
227
250
|
error(path, ParseError.incorrectFieldType)
|
|
228
251
|
}
|
|
229
|
-
|
|
230
252
|
const q: Promise<void>[] = []
|
|
231
253
|
for (let i = 0; i < value.length; i++) {
|
|
232
254
|
q.push(
|
|
@@ -236,7 +258,8 @@ export const array: Parser<'array'> = async (
|
|
|
236
258
|
fieldSchema.values,
|
|
237
259
|
typeSchema,
|
|
238
260
|
target,
|
|
239
|
-
handlers
|
|
261
|
+
handlers,
|
|
262
|
+
noCollect
|
|
240
263
|
)
|
|
241
264
|
)
|
|
242
265
|
}
|
package/src/set/error.ts
CHANGED
package/src/set/index.ts
CHANGED
|
@@ -14,7 +14,8 @@ export const fieldWalker = async (
|
|
|
14
14
|
fieldSchema: BasedSchemaField,
|
|
15
15
|
typeSchema: BasedSchemaType,
|
|
16
16
|
target: BasedSetTarget,
|
|
17
|
-
handlers: BasedSetHandlers
|
|
17
|
+
handlers: BasedSetHandlers,
|
|
18
|
+
noCollect?: boolean
|
|
18
19
|
): Promise<void> => {
|
|
19
20
|
if ('$ref' in fieldSchema) {
|
|
20
21
|
// TODO: when we have this it has to get it from the schema and redo the parsing with the correct fieldSchema
|
|
@@ -24,7 +25,9 @@ export const fieldWalker = async (
|
|
|
24
25
|
|
|
25
26
|
const valueIsObject = value && valueType === 'object'
|
|
26
27
|
if (valueIsObject && value.$delete === true) {
|
|
27
|
-
|
|
28
|
+
if (!noCollect) {
|
|
29
|
+
handlers.collect({ path, value, typeSchema, fieldSchema, target })
|
|
30
|
+
}
|
|
28
31
|
return
|
|
29
32
|
}
|
|
30
33
|
|
|
@@ -43,7 +46,7 @@ export const fieldWalker = async (
|
|
|
43
46
|
|
|
44
47
|
const parse = parsers[typeDef]
|
|
45
48
|
|
|
46
|
-
await parse(path, value, fieldSchema, typeSchema, target, handlers)
|
|
49
|
+
await parse(path, value, fieldSchema, typeSchema, target, handlers, noCollect)
|
|
47
50
|
|
|
48
51
|
return
|
|
49
52
|
}
|
package/src/set/number.ts
CHANGED
|
@@ -1,5 +1,79 @@
|
|
|
1
1
|
import { Parser } from './types'
|
|
2
2
|
import { error, ParseError } from './error'
|
|
3
|
+
import {
|
|
4
|
+
BasedSchemaFieldInteger,
|
|
5
|
+
BasedSchemaFieldNumber,
|
|
6
|
+
BasedSchemaFieldTimeStamp,
|
|
7
|
+
} from '../types'
|
|
8
|
+
|
|
9
|
+
const validate = (
|
|
10
|
+
path: (number | string)[],
|
|
11
|
+
value: any,
|
|
12
|
+
fieldSchema:
|
|
13
|
+
| BasedSchemaFieldInteger
|
|
14
|
+
| BasedSchemaFieldNumber
|
|
15
|
+
| BasedSchemaFieldTimeStamp
|
|
16
|
+
): number => {
|
|
17
|
+
if (typeof value !== 'number') {
|
|
18
|
+
error(path, ParseError.incorrectFormat)
|
|
19
|
+
}
|
|
20
|
+
if (fieldSchema.type === 'integer' && value - Math.floor(value) !== 0) {
|
|
21
|
+
error(path, ParseError.incorrectFormat)
|
|
22
|
+
}
|
|
23
|
+
if (
|
|
24
|
+
fieldSchema.multipleOf &&
|
|
25
|
+
value / fieldSchema.multipleOf -
|
|
26
|
+
Math.floor(value / fieldSchema.multipleOf) !==
|
|
27
|
+
0
|
|
28
|
+
) {
|
|
29
|
+
error(path, ParseError.incorrectFormat)
|
|
30
|
+
}
|
|
31
|
+
if (fieldSchema.maximum) {
|
|
32
|
+
if (fieldSchema.exclusiveMaximum && value > value) {
|
|
33
|
+
error(path, ParseError.exceedsMaximum)
|
|
34
|
+
} else if (value >= value) {
|
|
35
|
+
error(path, ParseError.exceedsMaximum)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (fieldSchema.minimum) {
|
|
39
|
+
if (fieldSchema.exclusiveMinimum && value < value) {
|
|
40
|
+
error(path, ParseError.subceedsMinimum)
|
|
41
|
+
} else if (value <= value) {
|
|
42
|
+
error(path, ParseError.subceedsMinimum)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return value
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const shared = (
|
|
49
|
+
path: (number | string)[],
|
|
50
|
+
value: any,
|
|
51
|
+
fieldSchema:
|
|
52
|
+
| BasedSchemaFieldInteger
|
|
53
|
+
| BasedSchemaFieldNumber
|
|
54
|
+
| BasedSchemaFieldTimeStamp
|
|
55
|
+
): any => {
|
|
56
|
+
if (typeof value === 'object') {
|
|
57
|
+
if (value.$increment) {
|
|
58
|
+
validate([...path, '$increment'], value.$increment, fieldSchema)
|
|
59
|
+
}
|
|
60
|
+
if (value.$decrement) {
|
|
61
|
+
validate([...path, '$decrement'], value.$decrement, fieldSchema)
|
|
62
|
+
}
|
|
63
|
+
if (value.$value !== undefined) {
|
|
64
|
+
validate(path, value.$value, fieldSchema)
|
|
65
|
+
}
|
|
66
|
+
if (value.$default !== undefined) {
|
|
67
|
+
if (value.$value !== undefined) {
|
|
68
|
+
error(path, ParseError.valueAndDefault)
|
|
69
|
+
}
|
|
70
|
+
validate(path, value.$default, fieldSchema)
|
|
71
|
+
}
|
|
72
|
+
} else {
|
|
73
|
+
validate(path, value, fieldSchema)
|
|
74
|
+
}
|
|
75
|
+
return value
|
|
76
|
+
}
|
|
3
77
|
|
|
4
78
|
export const timestamp: Parser<'timestamp'> = async (
|
|
5
79
|
path,
|
|
@@ -7,7 +81,8 @@ export const timestamp: Parser<'timestamp'> = async (
|
|
|
7
81
|
fieldSchema,
|
|
8
82
|
typeSchema,
|
|
9
83
|
target,
|
|
10
|
-
handlers
|
|
84
|
+
handlers,
|
|
85
|
+
noCollect
|
|
11
86
|
) => {
|
|
12
87
|
if (typeof value === 'string') {
|
|
13
88
|
if (value === 'now') {
|
|
@@ -16,31 +91,20 @@ export const timestamp: Parser<'timestamp'> = async (
|
|
|
16
91
|
const d = new Date(value)
|
|
17
92
|
value = d.valueOf()
|
|
18
93
|
if (isNaN(value)) {
|
|
19
|
-
|
|
94
|
+
error(path, ParseError.incorrectFormat)
|
|
20
95
|
}
|
|
21
96
|
}
|
|
22
97
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
// }
|
|
34
|
-
// }
|
|
35
|
-
|
|
36
|
-
// if (fieldSchema.minimum) {
|
|
37
|
-
// if (fieldSchema.exclusiveMinimum && value < value) {
|
|
38
|
-
// throw createError(path, target.type, 'timestamp', value)
|
|
39
|
-
// } else if (value <= value) {
|
|
40
|
-
// throw createError(path, target.type, 'timestamp', value)
|
|
41
|
-
// }
|
|
42
|
-
// }
|
|
43
|
-
handlers.collect({ path, value, typeSchema, fieldSchema, target })
|
|
98
|
+
const parsedValue = shared(path, value, fieldSchema)
|
|
99
|
+
if (!noCollect) {
|
|
100
|
+
handlers.collect({
|
|
101
|
+
path,
|
|
102
|
+
value: parsedValue,
|
|
103
|
+
typeSchema,
|
|
104
|
+
fieldSchema,
|
|
105
|
+
target,
|
|
106
|
+
})
|
|
107
|
+
}
|
|
44
108
|
}
|
|
45
109
|
|
|
46
110
|
export const number: Parser<'number'> = async (
|
|
@@ -49,16 +113,19 @@ export const number: Parser<'number'> = async (
|
|
|
49
113
|
fieldSchema,
|
|
50
114
|
typeSchema,
|
|
51
115
|
target,
|
|
52
|
-
handlers
|
|
116
|
+
handlers,
|
|
117
|
+
noCollect
|
|
53
118
|
) => {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
119
|
+
const parsedValue = shared(path, value, fieldSchema)
|
|
120
|
+
if (!noCollect) {
|
|
121
|
+
handlers.collect({
|
|
122
|
+
path,
|
|
123
|
+
value: parsedValue,
|
|
124
|
+
typeSchema,
|
|
125
|
+
fieldSchema,
|
|
126
|
+
target,
|
|
127
|
+
})
|
|
59
128
|
}
|
|
60
|
-
|
|
61
|
-
handlers.collect({ path, value, typeSchema, fieldSchema, target })
|
|
62
129
|
}
|
|
63
130
|
|
|
64
131
|
export const integer: Parser<'integer'> = async (
|
|
@@ -67,12 +134,17 @@ export const integer: Parser<'integer'> = async (
|
|
|
67
134
|
fieldSchema,
|
|
68
135
|
typeSchema,
|
|
69
136
|
target,
|
|
70
|
-
handlers
|
|
137
|
+
handlers,
|
|
138
|
+
noCollect
|
|
71
139
|
) => {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
140
|
+
const parsedValue = shared(path, value, fieldSchema)
|
|
141
|
+
if (!noCollect) {
|
|
142
|
+
handlers.collect({
|
|
143
|
+
path,
|
|
144
|
+
value: parsedValue,
|
|
145
|
+
typeSchema,
|
|
146
|
+
fieldSchema,
|
|
147
|
+
target,
|
|
148
|
+
})
|
|
76
149
|
}
|
|
77
|
-
handlers.collect({ path, value, typeSchema, fieldSchema, target })
|
|
78
150
|
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { BasedSchemaFields } from '../types'
|
|
2
|
+
import { Parser } from './types'
|
|
3
|
+
import { error, ParseError } from './error'
|
|
4
|
+
import parsers from './parsers'
|
|
5
|
+
|
|
6
|
+
export const parseValueAndDefault: Parser<keyof BasedSchemaFields> = async (
|
|
7
|
+
path,
|
|
8
|
+
value,
|
|
9
|
+
fieldSchema,
|
|
10
|
+
typeSchema,
|
|
11
|
+
target,
|
|
12
|
+
handlers,
|
|
13
|
+
noCollect
|
|
14
|
+
): Promise<boolean> => {
|
|
15
|
+
let handled = false
|
|
16
|
+
if (typeof value === 'object') {
|
|
17
|
+
const typeDef = fieldSchema.type ?? ('enum' in fieldSchema ? 'enum' : '')
|
|
18
|
+
const parse = parsers[typeDef]
|
|
19
|
+
if (value.$value !== undefined) {
|
|
20
|
+
// TODO: for errors handle path a bit smarter...
|
|
21
|
+
parse(path, value.$value, fieldSchema, typeSchema, target, handlers, true)
|
|
22
|
+
handled = true
|
|
23
|
+
}
|
|
24
|
+
if (value.$default !== undefined) {
|
|
25
|
+
if (value.$value !== undefined) {
|
|
26
|
+
error(path, ParseError.valueAndDefault)
|
|
27
|
+
}
|
|
28
|
+
parse(
|
|
29
|
+
path,
|
|
30
|
+
value.$default,
|
|
31
|
+
fieldSchema,
|
|
32
|
+
typeSchema,
|
|
33
|
+
target,
|
|
34
|
+
handlers,
|
|
35
|
+
true
|
|
36
|
+
)
|
|
37
|
+
handled = true
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (handled && !noCollect) {
|
|
41
|
+
handlers.collect({ path, value, typeSchema, fieldSchema, target })
|
|
42
|
+
}
|
|
43
|
+
return handled
|
|
44
|
+
}
|
package/src/set/references.ts
CHANGED
|
@@ -7,7 +7,8 @@ export const reference: Parser<'reference'> = async (
|
|
|
7
7
|
fieldSchema,
|
|
8
8
|
typeSchema,
|
|
9
9
|
target,
|
|
10
|
-
handlers
|
|
10
|
+
handlers,
|
|
11
|
+
noCollect
|
|
11
12
|
) => {
|
|
12
13
|
// $no root
|
|
13
14
|
// prob pass these as options
|
|
@@ -50,7 +51,9 @@ export const reference: Parser<'reference'> = async (
|
|
|
50
51
|
error(path, ParseError.referenceIsIncorrectType)
|
|
51
52
|
}
|
|
52
53
|
}
|
|
53
|
-
|
|
54
|
+
if (!noCollect) {
|
|
55
|
+
handlers.collect({ path, value, typeSchema, fieldSchema, target })
|
|
56
|
+
}
|
|
54
57
|
}
|
|
55
58
|
|
|
56
59
|
export const references: Parser<'references'> = async (
|
|
@@ -59,15 +62,12 @@ export const references: Parser<'references'> = async (
|
|
|
59
62
|
fieldSchema,
|
|
60
63
|
typeSchema,
|
|
61
64
|
target,
|
|
62
|
-
handlers
|
|
65
|
+
handlers,
|
|
66
|
+
noCollect
|
|
63
67
|
) => {
|
|
64
68
|
// default
|
|
65
69
|
// $no root
|
|
66
70
|
if (Array.isArray(value)) {
|
|
67
|
-
const handler = {
|
|
68
|
-
...handlers,
|
|
69
|
-
collect: () => {},
|
|
70
|
-
}
|
|
71
71
|
await Promise.all(
|
|
72
72
|
value.map((v, i) => {
|
|
73
73
|
return reference(
|
|
@@ -77,17 +77,14 @@ export const references: Parser<'references'> = async (
|
|
|
77
77
|
{ ...fieldSchema, type: 'reference' },
|
|
78
78
|
typeSchema,
|
|
79
79
|
target,
|
|
80
|
-
|
|
80
|
+
handlers,
|
|
81
|
+
true
|
|
81
82
|
)
|
|
82
83
|
})
|
|
83
84
|
)
|
|
84
85
|
value = { $value: value }
|
|
85
86
|
} else if (typeof value === 'object') {
|
|
86
87
|
if (value.$add) {
|
|
87
|
-
const handler = {
|
|
88
|
-
...handlers,
|
|
89
|
-
collect: () => {},
|
|
90
|
-
}
|
|
91
88
|
await Promise.all(
|
|
92
89
|
value.$add.map((v, i) => {
|
|
93
90
|
return reference(
|
|
@@ -97,11 +94,14 @@ export const references: Parser<'references'> = async (
|
|
|
97
94
|
{ ...fieldSchema, type: 'reference' },
|
|
98
95
|
typeSchema,
|
|
99
96
|
target,
|
|
100
|
-
|
|
97
|
+
handlers,
|
|
98
|
+
true
|
|
101
99
|
)
|
|
102
100
|
})
|
|
103
101
|
)
|
|
104
102
|
}
|
|
105
103
|
}
|
|
106
|
-
|
|
104
|
+
if (!noCollect) {
|
|
105
|
+
handlers.collect({ path, value, typeSchema, fieldSchema, target })
|
|
106
|
+
}
|
|
107
107
|
}
|