@based/schema 2.2.10 → 2.2.12

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 (95) hide show
  1. package/dist/{display → src/display}/index.d.ts +1 -1
  2. package/dist/src/display/index.js +16 -0
  3. package/dist/{display → src/display}/number.js +1 -3
  4. package/dist/{display → src/display}/string.js +1 -3
  5. package/dist/{display → src/display}/timestamp.js +1 -3
  6. package/dist/{error.js → src/error.js} +2 -5
  7. package/dist/src/index.d.ts +5 -0
  8. package/dist/src/index.js +6 -0
  9. package/dist/{languages.js → src/languages.js} +1 -4
  10. package/dist/src/set/fields/array.d.ts +2 -0
  11. package/dist/{set → src/set}/fields/array.js +10 -14
  12. package/dist/src/set/fields/index.d.ts +3 -0
  13. package/dist/src/set/fields/index.js +71 -0
  14. package/dist/{set → src/set}/fields/number.d.ts +1 -1
  15. package/dist/{set → src/set}/fields/number.js +15 -21
  16. package/dist/{set → src/set}/fields/object.d.ts +1 -1
  17. package/dist/src/set/fields/object.js +28 -0
  18. package/dist/{set → src/set}/fields/references.d.ts +1 -1
  19. package/dist/{set → src/set}/fields/references.js +13 -18
  20. package/dist/src/set/fields/set.d.ts +2 -0
  21. package/dist/{set → src/set}/fields/set.js +4 -8
  22. package/dist/{set → src/set}/fields/string.d.ts +1 -1
  23. package/dist/{set → src/set}/fields/string.js +87 -95
  24. package/dist/{set → src/set}/index.d.ts +2 -2
  25. package/dist/{set → src/set}/index.js +21 -25
  26. package/dist/{set → src/set}/isValidId.d.ts +1 -1
  27. package/dist/{set → src/set}/isValidId.js +1 -5
  28. package/dist/{types.d.ts → src/types.d.ts} +7 -6
  29. package/dist/src/types.js +23 -0
  30. package/dist/src/updateSchema.d.ts +2 -0
  31. package/dist/src/updateSchema.js +12 -0
  32. package/dist/src/validateSchema.d.ts +4 -0
  33. package/dist/{validateSchema.js → src/validateSchema.js} +5 -11
  34. package/dist/{walker → src/walker}/args.d.ts +4 -4
  35. package/dist/{walker → src/walker}/args.js +8 -12
  36. package/dist/src/walker/index.d.ts +6 -0
  37. package/dist/src/walker/index.js +31 -0
  38. package/dist/{walker → src/walker}/parse.d.ts +1 -1
  39. package/dist/{walker → src/walker}/parse.js +7 -11
  40. package/dist/{walker → src/walker}/types.d.ts +3 -3
  41. package/dist/{walker → src/walker}/types.js +2 -5
  42. package/dist/test/array.d.ts +1 -0
  43. package/dist/test/array.js +342 -0
  44. package/dist/test/display.d.ts +1 -0
  45. package/dist/test/display.js +103 -0
  46. package/dist/test/number.d.ts +1 -0
  47. package/dist/test/number.js +374 -0
  48. package/dist/test/reference.d.ts +1 -0
  49. package/dist/test/reference.js +186 -0
  50. package/dist/test/rest.d.ts +1 -0
  51. package/dist/test/rest.js +168 -0
  52. package/dist/test/set.d.ts +1 -0
  53. package/dist/test/set.js +95 -0
  54. package/dist/test/string.d.ts +1 -0
  55. package/dist/test/string.js +120 -0
  56. package/dist/test/text.d.ts +1 -0
  57. package/dist/test/text.js +324 -0
  58. package/dist/test/utils/index.d.ts +11 -0
  59. package/dist/test/utils/index.js +17 -0
  60. package/dist/test/validateSchema.d.ts +1 -0
  61. package/dist/test/validateSchema.js +38 -0
  62. package/dist/test/walker.d.ts +1 -0
  63. package/dist/test/walker.js +289 -0
  64. package/package.json +8 -13
  65. package/dist/display/dateString copy.d.ts +0 -3
  66. package/dist/display/dateString copy.js +0 -127
  67. package/dist/display/dateString.d.ts +0 -3
  68. package/dist/display/dateString.js +0 -127
  69. package/dist/display/display.d.ts +0 -1
  70. package/dist/display/display.js +0 -8
  71. package/dist/display/index.js +0 -26
  72. package/dist/display/number copy.d.ts +0 -3
  73. package/dist/display/number copy.js +0 -81
  74. package/dist/display.d.ts +0 -2
  75. package/dist/display.js +0 -8
  76. package/dist/index.d.ts +0 -5
  77. package/dist/index.js +0 -22
  78. package/dist/set/fields/array.d.ts +0 -2
  79. package/dist/set/fields/index.d.ts +0 -3
  80. package/dist/set/fields/index.js +0 -74
  81. package/dist/set/fields/object.js +0 -33
  82. package/dist/set/fields/set.d.ts +0 -2
  83. package/dist/set/types.d.ts +0 -0
  84. package/dist/set/types.js +0 -1
  85. package/dist/types.js +0 -27
  86. package/dist/updateSchema.d.ts +0 -2
  87. package/dist/updateSchema.js +0 -16
  88. package/dist/validateSchema.d.ts +0 -4
  89. package/dist/walker/index.d.ts +0 -6
  90. package/dist/walker/index.js +0 -49
  91. /package/dist/{display → src/display}/number.d.ts +0 -0
  92. /package/dist/{display → src/display}/string.d.ts +0 -0
  93. /package/dist/{display → src/display}/timestamp.d.ts +0 -0
  94. /package/dist/{error.d.ts → src/error.d.ts} +0 -0
  95. /package/dist/{languages.d.ts → src/languages.d.ts} +0 -0
@@ -0,0 +1,324 @@
1
+ import { setWalker } from '../src/index.js';
2
+ import test from 'ava';
3
+ import { resultCollect } from './utils/index.js';
4
+ const schema = {
5
+ types: {
6
+ thing: {
7
+ prefix: 'ti',
8
+ fields: {
9
+ something: { type: 'string', format: 'strongPassword' },
10
+ },
11
+ },
12
+ bla: {
13
+ prefix: 'bl',
14
+ fields: {
15
+ text: {
16
+ type: 'text',
17
+ pattern: '[^xz]{1,10}',
18
+ },
19
+ },
20
+ },
21
+ },
22
+ $defs: {},
23
+ language: 'en',
24
+ translations: ['de', 'nl', 'ro', 'za', 'ae'],
25
+ languageFallbacks: {
26
+ en: ['en'],
27
+ de: ['en'],
28
+ fr: ['aa'],
29
+ },
30
+ root: {
31
+ fields: {},
32
+ },
33
+ prefixToTypeMapping: {
34
+ bl: 'bla',
35
+ ti: 'thing',
36
+ },
37
+ };
38
+ let r;
39
+ test('throw error no language', async (t) => {
40
+ let r = await setWalker(schema, {
41
+ $id: 'bl120',
42
+ text: { $value: 'x' },
43
+ });
44
+ t.true(r.errors.length > 0);
45
+ });
46
+ test('simple case', async (t) => {
47
+ let r = await setWalker(schema, {
48
+ $id: 'bl120',
49
+ text: { en: 'flap' },
50
+ });
51
+ t.deepEqual(resultCollect(r), [
52
+ { path: ['text', 'en'], value: 'flap' },
53
+ { path: ['text'], value: { en: 'flap' } },
54
+ ]);
55
+ });
56
+ test('simple case $value', async (t) => {
57
+ let r = await setWalker(schema, {
58
+ $id: 'bl120',
59
+ text: { en: { $value: 'flap' } },
60
+ });
61
+ t.deepEqual(resultCollect(r), [
62
+ { path: ['text', 'en'], value: 'flap' },
63
+ { path: ['text'], value: { en: { $value: 'flap' } } },
64
+ ]);
65
+ });
66
+ test('simple case $language', async (t) => {
67
+ let r = await setWalker(schema, {
68
+ $id: 'bl120',
69
+ $language: 'en',
70
+ text: 'flap',
71
+ });
72
+ t.deepEqual(resultCollect(r), [
73
+ { path: ['text', 'en'], value: 'flap' },
74
+ { path: ['text'], value: { en: 'flap' } },
75
+ ]);
76
+ });
77
+ test('simple case with value', async (t) => {
78
+ r = await setWalker(schema, {
79
+ $id: 'bl120',
80
+ $language: 'za',
81
+ text: { $value: 'flap' },
82
+ });
83
+ t.deepEqual(resultCollect(r), [
84
+ { path: ['text', 'za'], value: 'flap' },
85
+ { path: ['text'], value: { $value: 'flap' } },
86
+ ]);
87
+ });
88
+ test('simple case $value /w obj', async (t) => {
89
+ let r = await setWalker(schema, {
90
+ $id: 'bl120',
91
+ text: { $value: { en: 'flap' } },
92
+ });
93
+ t.deepEqual(resultCollect(r), [
94
+ { path: ['text', 'en'], value: 'flap' },
95
+ { path: ['text'], value: { $value: { en: 'flap' } } },
96
+ ]);
97
+ });
98
+ test('text default', async (t) => {
99
+ r = await setWalker(schema, {
100
+ $id: 'bl120',
101
+ $language: 'za',
102
+ text: { $default: 'sdsdds' },
103
+ });
104
+ t.deepEqual(resultCollect(r), [
105
+ { path: ['text', 'za'], value: { $default: 'sdsdds' } },
106
+ { path: ['text'], value: { $default: 'sdsdds' } },
107
+ ]);
108
+ });
109
+ test('default and lang:default', async (t) => {
110
+ r = await setWalker(schema, {
111
+ $id: 'bl120',
112
+ $language: 'za',
113
+ text: { $default: 'sdsdds', en: { $default: 'flapflap' } },
114
+ });
115
+ t.deepEqual(resultCollect(r), [
116
+ { path: ['text', 'za'], value: { $default: 'sdsdds' } },
117
+ { path: ['text', 'en'], value: { $default: 'flapflap' } },
118
+ {
119
+ path: ['text'],
120
+ value: { $default: 'sdsdds', en: { $default: 'flapflap' } },
121
+ },
122
+ ]);
123
+ });
124
+ test('default: lang, lang', async (t) => {
125
+ r = await setWalker(schema, {
126
+ $id: 'bl120',
127
+ $language: 'za',
128
+ text: { $default: { de: 'dsnfds' }, en: { $default: 'flapflap' } },
129
+ });
130
+ t.deepEqual(resultCollect(r), [
131
+ { path: ['text', 'de'], value: { $default: 'dsnfds' } },
132
+ { path: ['text', 'en'], value: { $default: 'flapflap' } },
133
+ {
134
+ path: ['text'],
135
+ value: { $default: { de: 'dsnfds' }, en: { $default: 'flapflap' } },
136
+ },
137
+ ]);
138
+ });
139
+ test('defaullt:lang, lang, lang:default', async (t) => {
140
+ r = await setWalker(schema, {
141
+ $id: 'bl120',
142
+ $language: 'za',
143
+ text: {
144
+ $default: { de: 'dsnfds' },
145
+ nl: 'flapperonus',
146
+ en: { $default: 'flapflap' },
147
+ },
148
+ });
149
+ t.deepEqual(resultCollect(r), [
150
+ { path: ['text', 'de'], value: { $default: 'dsnfds' } },
151
+ { path: ['text', 'nl'], value: 'flapperonus' },
152
+ { path: ['text', 'en'], value: { $default: 'flapflap' } },
153
+ {
154
+ path: ['text'],
155
+ value: {
156
+ $default: { de: 'dsnfds' },
157
+ nl: 'flapperonus',
158
+ en: { $default: 'flapflap' },
159
+ },
160
+ },
161
+ ]);
162
+ });
163
+ test('default:lang, lang, lang:value, lang:default', async (t) => {
164
+ r = await setWalker(schema, {
165
+ $id: 'bl120',
166
+ $language: 'za',
167
+ text: {
168
+ $default: { de: 'dsnfds' },
169
+ nl: 'flapperonus',
170
+ ro: { $value: 'durp' },
171
+ en: { $default: 'flapflap' },
172
+ },
173
+ });
174
+ t.deepEqual(resultCollect(r), [
175
+ { path: ['text', 'de'], value: { $default: 'dsnfds' } },
176
+ { path: ['text', 'nl'], value: 'flapperonus' },
177
+ { path: ['text', 'ro'], value: 'durp' },
178
+ { path: ['text', 'en'], value: { $default: 'flapflap' } },
179
+ {
180
+ path: ['text'],
181
+ value: {
182
+ $default: { de: 'dsnfds' },
183
+ nl: 'flapperonus',
184
+ ro: { $value: 'durp' },
185
+ en: { $default: 'flapflap' },
186
+ },
187
+ },
188
+ ]);
189
+ });
190
+ test('value:lang, lang, default:lang, lang:value, lang:default', async (t) => {
191
+ r = await setWalker(schema, {
192
+ $id: 'bl120',
193
+ $language: 'za',
194
+ text: {
195
+ $value: 'durp',
196
+ nl: 'flapperonus',
197
+ $default: {
198
+ ae: 'habibi',
199
+ },
200
+ ro: { $value: 'durp' },
201
+ en: { $default: 'flapflap' },
202
+ },
203
+ });
204
+ t.deepEqual(resultCollect(r), [
205
+ { path: ['text', 'za'], value: 'durp' },
206
+ { path: ['text', 'nl'], value: 'flapperonus' },
207
+ { path: ['text', 'ae'], value: { $default: 'habibi' } },
208
+ { path: ['text', 'ro'], value: 'durp' },
209
+ { path: ['text', 'en'], value: { $default: 'flapflap' } },
210
+ {
211
+ path: ['text'],
212
+ value: {
213
+ $value: 'durp',
214
+ nl: 'flapperonus',
215
+ $default: {
216
+ ae: 'habibi',
217
+ },
218
+ ro: { $value: 'durp' },
219
+ en: { $default: 'flapflap' },
220
+ },
221
+ },
222
+ ]);
223
+ });
224
+ test('value: wrong pattern, lang, default:lang, lang:value, lang:default', async (t) => {
225
+ r = await setWalker(schema, {
226
+ $id: 'bl120',
227
+ $language: 'za',
228
+ text: {
229
+ $value: 'xz',
230
+ nl: 'flapperonus',
231
+ $default: {
232
+ ae: 'habibi',
233
+ },
234
+ ro: { $value: 'durp' },
235
+ en: { $default: 'xzxz' },
236
+ },
237
+ });
238
+ t.true(r.errors.length > 0);
239
+ });
240
+ test('text delete', async (t) => {
241
+ r = await setWalker(schema, {
242
+ $id: 'bl120',
243
+ text: {
244
+ $delete: true,
245
+ },
246
+ });
247
+ t.deepEqual(resultCollect(r), [{ path: ['text'], value: { $delete: true } }]);
248
+ });
249
+ test('text delete single language', async (t) => {
250
+ r = await setWalker(schema, {
251
+ $id: 'bl120',
252
+ text: {
253
+ en: {
254
+ $delete: true,
255
+ },
256
+ },
257
+ });
258
+ t.deepEqual(resultCollect(r), [
259
+ { path: ['text', 'en'], value: { $delete: true } },
260
+ {
261
+ path: ['text'],
262
+ value: {
263
+ en: {
264
+ $delete: true,
265
+ },
266
+ },
267
+ },
268
+ ]);
269
+ });
270
+ test('just delete', async (t) => {
271
+ r = await setWalker(schema, {
272
+ $id: 'bl120',
273
+ $delete: true,
274
+ });
275
+ t.true(r.errors.length === 1);
276
+ });
277
+ test('$default in collected path', async (t) => {
278
+ r = await setWalker(schema, {
279
+ $id: 'bl120',
280
+ text: {
281
+ en: {
282
+ $default: 'title',
283
+ },
284
+ },
285
+ });
286
+ t.is(r.errors.length, 0);
287
+ t.deepEqual(resultCollect(r), [
288
+ { path: ['text', 'en'], value: { $default: 'title' } },
289
+ {
290
+ path: ['text'],
291
+ value: {
292
+ en: {
293
+ $default: 'title',
294
+ },
295
+ },
296
+ },
297
+ ]);
298
+ });
299
+ test('$default in collected path + $merge:false', async (t) => {
300
+ r = await setWalker(schema, {
301
+ $id: 'bl120',
302
+ text: {
303
+ $merge: false,
304
+ en: {
305
+ $default: 'title',
306
+ },
307
+ },
308
+ });
309
+ t.is(r.errors.length, 0);
310
+ t.deepEqual(resultCollect(r), [
311
+ { path: ['text'], value: { $delete: true } },
312
+ { path: ['text', 'en'], value: { $default: 'title' } },
313
+ {
314
+ path: ['text'],
315
+ value: {
316
+ $merge: false,
317
+ en: {
318
+ $default: 'title',
319
+ },
320
+ },
321
+ },
322
+ ]);
323
+ });
324
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1,11 @@
1
+ import { Path } from '@saulx/utils';
2
+ import { BasedSetTarget } from '../../src/index.js';
3
+ import { ParseError } from '../../src/error.js';
4
+ export declare const resultCollect: (...results: BasedSetTarget[]) => {
5
+ path: Path;
6
+ value: any;
7
+ }[];
8
+ export declare const errorCollect: (...results: BasedSetTarget[]) => {
9
+ path: Path;
10
+ code: ParseError;
11
+ }[];
@@ -0,0 +1,17 @@
1
+ export const resultCollect = (...results) => {
2
+ const assertableResults = [];
3
+ for (let i = 0; i < results.length; i++) {
4
+ assertableResults.push(...results[i].collected.map((v) => ({ path: v.path, value: v.value })));
5
+ }
6
+ return assertableResults;
7
+ };
8
+ export const errorCollect = (...results) => {
9
+ const errors = [];
10
+ for (let i = 0; i < results.length; i++) {
11
+ if (results[i].errors) {
12
+ errors.push(...results[i].errors);
13
+ }
14
+ }
15
+ return errors;
16
+ };
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,38 @@
1
+ import test from 'ava';
2
+ import { validateSchema } from '../src/index.js';
3
+ test.serial('throw on invalid schema', async (t) => {
4
+ const prefixError = t.throws(() => {
5
+ validateSchema({
6
+ $defs: {
7
+ yuzi: {
8
+ type: 'string',
9
+ title: 'BLA',
10
+ description: 'SNURP',
11
+ },
12
+ },
13
+ types: {
14
+ bla: {
15
+ prefix: 'fix',
16
+ fields: {
17
+ yuzi: {
18
+ type: 'object',
19
+ customValidator: async (_value, _path, _target) => {
20
+ return true;
21
+ },
22
+ properties: {
23
+ gurt: {
24
+ $ref: '/$defs/yuzi',
25
+ },
26
+ flap: {
27
+ enum: ['bla', 'blap', 'flip'],
28
+ },
29
+ },
30
+ },
31
+ },
32
+ },
33
+ },
34
+ });
35
+ });
36
+ t.is(prefixError.message, 'Incorrect prefix "fix" for type "bla" has to be a string of 2 alphanumerical characters e.g. "Az", "ab", "cc", "10"');
37
+ });
38
+ //# sourceMappingURL=validateSchema.js.map
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,289 @@
1
+ import test from 'ava';
2
+ import { setWalker, walk } from '../src/index.js';
3
+ const schema = {
4
+ types: {
5
+ thing: {
6
+ prefix: 'ti',
7
+ fields: {
8
+ priority: { type: 'number' },
9
+ something: { type: 'string', format: 'strongPassword' },
10
+ },
11
+ },
12
+ bla: {
13
+ prefix: 'bl',
14
+ fields: {
15
+ referencesToThings: {
16
+ type: 'references',
17
+ allowedTypes: ['thing'],
18
+ },
19
+ referenceToThing: {
20
+ type: 'reference',
21
+ allowedTypes: ['thing'],
22
+ },
23
+ enum: {
24
+ enum: ['tony', 'jim'],
25
+ },
26
+ exclusiveminmax: {
27
+ type: 'number',
28
+ minimum: 3,
29
+ exclusiveMinimum: true,
30
+ maximum: 6,
31
+ exclusiveMaximum: true,
32
+ },
33
+ text: {
34
+ type: 'text',
35
+ pattern: '[^xz]{1,10}',
36
+ },
37
+ timestamp: {
38
+ type: 'timestamp',
39
+ },
40
+ setOfNumbers: {
41
+ type: 'set',
42
+ items: {
43
+ type: 'number',
44
+ },
45
+ },
46
+ intarray: {
47
+ type: 'array',
48
+ values: {
49
+ type: 'integer',
50
+ },
51
+ },
52
+ object: {
53
+ type: 'object',
54
+ properties: {
55
+ flap: { type: 'boolean' },
56
+ },
57
+ },
58
+ name: {
59
+ minLength: 3,
60
+ maxLength: 6,
61
+ type: 'string',
62
+ },
63
+ phonkName: {
64
+ type: 'string',
65
+ pattern: '\\${1,4}',
66
+ },
67
+ flap: {
68
+ type: 'boolean',
69
+ },
70
+ x: {
71
+ type: 'object',
72
+ properties: {
73
+ flap: {
74
+ type: 'boolean',
75
+ },
76
+ },
77
+ },
78
+ record: {
79
+ type: 'record',
80
+ values: {
81
+ type: 'object',
82
+ properties: {
83
+ bla: {
84
+ type: 'array',
85
+ values: {
86
+ type: 'object',
87
+ properties: {
88
+ snux: {
89
+ type: 'object',
90
+ properties: {
91
+ x: {
92
+ type: 'number',
93
+ },
94
+ },
95
+ },
96
+ flap: { type: 'number' },
97
+ },
98
+ },
99
+ },
100
+ },
101
+ },
102
+ },
103
+ bla: {
104
+ type: 'set',
105
+ items: { type: 'string', minLength: 3, maxLength: 6 },
106
+ },
107
+ },
108
+ },
109
+ },
110
+ $defs: {},
111
+ language: 'en',
112
+ translations: ['de', 'nl', 'ro', 'za', 'ae'],
113
+ root: {
114
+ fields: {},
115
+ },
116
+ prefixToTypeMapping: {
117
+ bl: 'bla',
118
+ ti: 'thing',
119
+ },
120
+ };
121
+ test('backtracking', async (t) => {
122
+ const results = [];
123
+ const setObj = {
124
+ x: {
125
+ y: {
126
+ a: 10,
127
+ bla: [1, 2, 3, 4, 5],
128
+ },
129
+ c: 40,
130
+ },
131
+ };
132
+ await walk(schema, {
133
+ init: async () => {
134
+ return { target: { lullz: true } };
135
+ },
136
+ parsers: {
137
+ keys: {},
138
+ fields: {},
139
+ any: async (args) => {
140
+ args.collect();
141
+ return args;
142
+ },
143
+ },
144
+ collect: (args) => {
145
+ return args.path.join('.');
146
+ },
147
+ backtrack: (args, fromBt, collected) => {
148
+ results.push({ path: args.path, bt: [...fromBt] });
149
+ return fromBt.length ? fromBt : collected;
150
+ },
151
+ }, setObj);
152
+ t.deepEqual(results, [
153
+ { path: ['x', 'y', 'bla'], bt: [] },
154
+ {
155
+ path: ['x', 'y'],
156
+ bt: [['x.y.bla.0', 'x.y.bla.1', 'x.y.bla.2', 'x.y.bla.3', 'x.y.bla.4']],
157
+ },
158
+ {
159
+ path: ['x'],
160
+ bt: [[['x.y.bla.0', 'x.y.bla.1', 'x.y.bla.2', 'x.y.bla.3', 'x.y.bla.4']]],
161
+ },
162
+ {
163
+ path: [],
164
+ bt: [
165
+ [[['x.y.bla.0', 'x.y.bla.1', 'x.y.bla.2', 'x.y.bla.3', 'x.y.bla.4']]],
166
+ ],
167
+ },
168
+ ]);
169
+ const results2 = [];
170
+ await walk(schema, {
171
+ init: async () => {
172
+ return { target: { lullz: true } };
173
+ },
174
+ parsers: {
175
+ keys: {},
176
+ fields: {},
177
+ any: async (args) => {
178
+ args.collect();
179
+ return { target: { lullz: true } };
180
+ },
181
+ },
182
+ collect: (args) => {
183
+ return args.path.join('.');
184
+ },
185
+ backtrack: (args, fromBt, collected) => {
186
+ results2.push({ path: args.path, bt: [...fromBt] });
187
+ return fromBt.length ? fromBt : collected;
188
+ },
189
+ }, setObj);
190
+ t.deepEqual(results, results2);
191
+ const results3 = [];
192
+ let cnt = 0;
193
+ await walk(schema, {
194
+ init: async () => {
195
+ return { target: { lullz: true } };
196
+ },
197
+ parsers: {
198
+ keys: {},
199
+ fields: {},
200
+ any: async (args) => {
201
+ cnt++;
202
+ args.collect();
203
+ return cnt % 2 ? args : { target: { lullz: true } };
204
+ },
205
+ },
206
+ collect: (args) => {
207
+ return args.path.join('.');
208
+ },
209
+ backtrack: (args, fromBt, collected) => {
210
+ results3.push({ path: args.path, bt: [...fromBt] });
211
+ return fromBt.length ? fromBt : collected;
212
+ },
213
+ }, setObj);
214
+ t.deepEqual(results, results3);
215
+ });
216
+ test.only('parseTop update target', async (t) => {
217
+ const parsed = [];
218
+ await walk(schema, {
219
+ init: async () => {
220
+ return { target: { path: [] } };
221
+ },
222
+ parsers: {
223
+ keys: {},
224
+ fields: {},
225
+ any: async (args) => {
226
+ args.collect();
227
+ if (args.prev.key !== args.key) {
228
+ return {
229
+ parseTopLevel: true,
230
+ target: {
231
+ path: args.path.join('.'),
232
+ prevTarget: args.target.id,
233
+ id: args.id,
234
+ },
235
+ value: args.value,
236
+ };
237
+ }
238
+ },
239
+ },
240
+ collect: (args) => {
241
+ parsed.push({ path: args.path, target: args.target });
242
+ return args.path.join('.');
243
+ },
244
+ }, {
245
+ x: {
246
+ y: {
247
+ z: 'bla!',
248
+ },
249
+ },
250
+ });
251
+ t.deepEqual(parsed, [
252
+ { path: ['x'], target: { path: [] } },
253
+ {
254
+ path: ['x'],
255
+ target: { path: 'x', prevTarget: undefined, id: 2 },
256
+ },
257
+ {
258
+ path: ['x', 'y'],
259
+ target: { path: 'x', prevTarget: undefined, id: 2 },
260
+ },
261
+ { path: ['x', 'y'], target: { path: 'x.y', prevTarget: 2, id: 4 } },
262
+ {
263
+ path: ['x', 'y', 'z'],
264
+ target: { path: 'x.y', prevTarget: 2, id: 4 },
265
+ },
266
+ {
267
+ path: ['x', 'y', 'z'],
268
+ target: { path: 'x.y.z', prevTarget: 4, id: 6 },
269
+ },
270
+ ]);
271
+ });
272
+ test.serial('perf setWalker', async (t) => {
273
+ let d = Date.now();
274
+ let collected = 0;
275
+ let errs = 0;
276
+ for (let i = 0; i < 1e5; i++) {
277
+ const x = await setWalker(schema, {
278
+ $id: 'bl120',
279
+ name: 'blasdsdsd',
280
+ x: { flap: true },
281
+ });
282
+ errs += x.errors.length;
283
+ collected += x.collected.length;
284
+ }
285
+ d = Date.now() - d;
286
+ console.info('setting 200k', d, 'ms');
287
+ t.true(d < 1e3);
288
+ });
289
+ //# sourceMappingURL=walker.js.map