@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.
Files changed (73) hide show
  1. package/dist/deepPartial.d.ts +0 -0
  2. package/dist/deepPartial.js +3 -0
  3. package/dist/deepPartial.js.map +1 -0
  4. package/dist/set/checkDefaultAndValue.d.ts +3 -0
  5. package/dist/set/checkDefaultAndValue.js +33 -0
  6. package/dist/set/checkDefaultAndValue.js.map +1 -0
  7. package/dist/set/collections.js +80 -56
  8. package/dist/set/collections.js.map +1 -1
  9. package/dist/set/enum.d.ts +2 -0
  10. package/dist/set/enum.js +15 -0
  11. package/dist/set/enum.js.map +1 -0
  12. package/dist/set/error.d.ts +4 -1
  13. package/dist/set/error.js +3 -0
  14. package/dist/set/error.js.map +1 -1
  15. package/dist/set/fieldValidator.d.ts +6 -0
  16. package/dist/set/fieldValidator.js +144 -0
  17. package/dist/set/fieldValidator.js.map +1 -0
  18. package/dist/set/handleError.d.ts +1 -0
  19. package/dist/set/handleError.js +9 -0
  20. package/dist/set/handleError.js.map +1 -0
  21. package/dist/set/index.d.ts +1 -1
  22. package/dist/set/index.js +5 -3
  23. package/dist/set/index.js.map +1 -1
  24. package/dist/set/number copy.d.ts +4 -0
  25. package/dist/set/number copy.js +57 -0
  26. package/dist/set/number copy.js.map +1 -0
  27. package/dist/set/number.js +86 -33
  28. package/dist/set/number.js.map +1 -1
  29. package/dist/set/parseDefaultAndValue.d.ts +3 -0
  30. package/dist/set/parseDefaultAndValue.js +33 -0
  31. package/dist/set/parseDefaultAndValue.js.map +1 -0
  32. package/dist/set/references.js +10 -14
  33. package/dist/set/references.js.map +1 -1
  34. package/dist/set/rest copy.d.ts +5 -0
  35. package/dist/set/rest copy.js +53 -0
  36. package/dist/set/rest copy.js.map +1 -0
  37. package/dist/set/rest.js +45 -22
  38. package/dist/set/rest.js.map +1 -1
  39. package/dist/set/string.js +41 -21
  40. package/dist/set/string.js.map +1 -1
  41. package/dist/set/types.d.ts +1 -1
  42. package/dist/setWalker.d.ts +11 -0
  43. package/dist/setWalker.js +189 -0
  44. package/dist/setWalker.js.map +1 -0
  45. package/dist/transformers.d.ts +3 -0
  46. package/dist/transformers.js +18 -0
  47. package/dist/transformers.js.map +1 -0
  48. package/dist/typeWalker.d.ts +3 -0
  49. package/dist/typeWalker.js +18 -0
  50. package/dist/typeWalker.js.map +1 -0
  51. package/dist/validate.d.ts +4 -0
  52. package/dist/validate.js +34 -0
  53. package/dist/validate.js.map +1 -0
  54. package/dist/validateFields.d.ts +4 -0
  55. package/dist/validateFields.js +34 -0
  56. package/dist/validateFields.js.map +1 -0
  57. package/dist/validateSchema copy.d.ts +4 -0
  58. package/dist/validateSchema copy.js +34 -0
  59. package/dist/validateSchema copy.js.map +1 -0
  60. package/package.json +1 -1
  61. package/src/set/collections.ts +111 -88
  62. package/src/set/error.ts +3 -0
  63. package/src/set/index.ts +6 -3
  64. package/src/set/number.ts +109 -37
  65. package/src/set/parseDefaultAndValue.ts +44 -0
  66. package/src/set/references.ts +14 -14
  67. package/src/set/rest.ts +80 -21
  68. package/src/set/string.ts +75 -23
  69. package/src/set/types.ts +3 -2
  70. package/test/setWalker.ts +93 -5
  71. package/dist/parse.d.ts +0 -2
  72. package/dist/parse.js +0 -9
  73. package/dist/parse.js.map +0 -1
@@ -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
- [...path, i],
27
- value[i],
28
- fieldDef,
29
- typeSchema,
30
- target,
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
- handlers.collect({
37
- path,
38
- value: { $value: parsedArray },
39
- typeSchema,
40
- fieldSchema,
41
- target,
42
- })
43
- } else {
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
- [...path, '$add', i],
43
+ path,
53
44
  value.$add[i],
54
45
  fieldDef,
55
46
  typeSchema,
56
47
  target,
57
- handlerNest
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
- [...path, '$delete', i],
58
+ path,
67
59
  value.$delete[i],
68
60
  fieldDef,
69
61
  typeSchema,
70
62
  target,
71
- handlerNest
63
+ handlers,
64
+ true
72
65
  )
73
66
  )
74
67
  }
75
68
  }
76
69
  await Promise.all(q)
77
- handlers.collect({ path, value, typeSchema, fieldSchema, target })
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([...path, '$insert'], ParseError.incorrectFormat)
133
+ error(path, ParseError.incorrectFormat)
132
134
  } else {
133
- const nestedHandler = {
134
- ...handlers,
135
- collect: () => {},
136
- }
135
+ const insert = Array.isArray(value.$insert.$value)
136
+ ? value.$insert.$value
137
+ : [value.$insert.$value]
137
138
  const q: Promise<void>[] = []
138
- if (Array.isArray(value.$insert.$value)) {
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
- [...path, '$insert'],
155
- value.$insert.$value,
142
+ path,
143
+ insert[i],
156
144
  fieldSchema.values,
157
145
  typeSchema,
158
146
  target,
159
- nestedHandler
147
+ handlers,
148
+ true
160
149
  )
161
150
  )
162
151
  }
163
152
  await Promise.all(q)
164
153
  }
165
154
  }
166
- if (value.$remove && value.$remove.$idx === undefined) {
167
- error([...path, '$remove'], ParseError.incorrectFormat)
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
- const q: Promise<void>[] = []
171
- const nestedHandler = {
172
- ...handlers,
173
- collect: () => {},
165
+ opCount++
166
+ if (opCount > 1) {
167
+ error(path, ParseError.multipleOperationsNotAllowed)
174
168
  }
175
- if (Array.isArray(value.$push)) {
176
- for (let i = 0; i < value.$push.length; i++) {
177
- q.push(
178
- fieldWalker(
179
- [...path, i],
180
- value.$push[i],
181
- fieldSchema.values,
182
- typeSchema,
183
- target,
184
- nestedHandler
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
- } else {
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
- [...path, '$push'],
192
- value.$push,
201
+ path,
202
+ unshift[i],
193
203
  fieldSchema.values,
194
204
  typeSchema,
195
205
  target,
196
- nestedHandler
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([...path, '$assign'], ParseError.incorrectFormat)
224
+ error(path, ParseError.incorrectFormat)
208
225
  } else {
209
226
  await fieldWalker(
210
- [...path, '$assign', '$value'],
227
+ path,
211
228
  value.$assign.$value,
212
229
  fieldSchema.values,
213
230
  typeSchema,
214
231
  target,
215
- {
216
- ...handlers,
217
- collect: () => {},
218
- }
232
+ handlers,
233
+ true
219
234
  )
220
235
  }
221
236
  }
222
- handlers.collect({ path, value, typeSchema, fieldSchema, target })
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
@@ -6,6 +6,9 @@ export enum ParseError {
6
6
  'fieldDoesNotExist',
7
7
  'incorrectFormat',
8
8
  'referenceIsIncorrectType',
9
+ 'valueAndDefault',
10
+ 'defaultNotSupported',
11
+ 'multipleOperationsNotAllowed',
9
12
  }
10
13
 
11
14
  export const error = (
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
- handlers.collect({ path, value, typeSchema, fieldSchema, target })
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
- throw error(path, ParseError.incorrectFormat)
94
+ error(path, ParseError.incorrectFormat)
20
95
  }
21
96
  }
22
97
  }
23
- // // smaller then / larger then steps
24
- // if (typeof value !== 'number') {
25
- // throw createError(path, target.type, 'timestamp', value)
26
- // }
27
-
28
- // if (fieldSchema.maximum) {
29
- // if (fieldSchema.exclusiveMaximum && value > value) {
30
- // throw createError(path, target.type, 'timestamp', value)
31
- // } else if (value >= value) {
32
- // throw createError(path, target.type, 'timestamp', value)
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
- // value .default
55
- // $increment / $decrement
56
-
57
- if (typeof value !== 'number') {
58
- error(path, ParseError.incorrectFormat)
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
- // value .default
73
- // $increment / $decrement
74
- if (typeof value !== 'number' || value - Math.floor(value) !== 0) {
75
- error(path, ParseError.incorrectFormat)
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
+ }
@@ -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
- handlers.collect({ path, value, typeSchema, fieldSchema, target })
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
- handler
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
- handler
97
+ handlers,
98
+ true
101
99
  )
102
100
  })
103
101
  )
104
102
  }
105
103
  }
106
- handlers.collect({ path, value, typeSchema, fieldSchema, target })
104
+ if (!noCollect) {
105
+ handlers.collect({ path, value, typeSchema, fieldSchema, target })
106
+ }
107
107
  }