@based/schema 0.0.16 → 1.0.1

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 (112) hide show
  1. package/dist/{set/error.d.ts → error.d.ts} +4 -2
  2. package/dist/{set/error.js → error.js} +2 -0
  3. package/dist/error.js.map +1 -0
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.js +1 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/set/fields/array.d.ts +2 -0
  8. package/dist/set/fields/array.js +96 -0
  9. package/dist/set/fields/array.js.map +1 -0
  10. package/dist/set/fields/index.d.ts +3 -0
  11. package/dist/set/fields/index.js +72 -0
  12. package/dist/set/fields/index.js.map +1 -0
  13. package/dist/set/fields/number.d.ts +4 -0
  14. package/dist/set/fields/number.js +121 -0
  15. package/dist/set/fields/number.js.map +1 -0
  16. package/dist/set/fields/object.d.ts +3 -0
  17. package/dist/set/fields/object.js +33 -0
  18. package/dist/set/fields/object.js.map +1 -0
  19. package/dist/set/fields/references.d.ts +3 -0
  20. package/dist/set/fields/references.js +106 -0
  21. package/dist/set/fields/references.js.map +1 -0
  22. package/dist/set/fields/set.d.ts +2 -0
  23. package/dist/set/fields/set.js +63 -0
  24. package/dist/set/fields/set.js.map +1 -0
  25. package/dist/set/fields/string.d.ts +3 -0
  26. package/dist/set/fields/string.js +190 -0
  27. package/dist/set/fields/string.js.map +1 -0
  28. package/dist/set/index.d.ts +2 -5
  29. package/dist/set/index.js +98 -126
  30. package/dist/set/index.js.map +1 -1
  31. package/dist/set/isValidId.d.ts +2 -0
  32. package/dist/set/isValidId.js +21 -0
  33. package/dist/set/isValidId.js.map +1 -0
  34. package/dist/set/types.d.ts +0 -5
  35. package/dist/set/types.js +0 -2
  36. package/dist/types.d.ts +7 -1
  37. package/dist/types.js.map +1 -1
  38. package/dist/walker/args.d.ts +31 -0
  39. package/dist/walker/args.js +120 -0
  40. package/dist/walker/args.js.map +1 -0
  41. package/dist/walker/index.d.ts +6 -0
  42. package/dist/walker/index.js +40 -0
  43. package/dist/walker/index.js.map +1 -0
  44. package/dist/walker/parse.d.ts +2 -0
  45. package/dist/walker/parse.js +157 -0
  46. package/dist/walker/parse.js.map +1 -0
  47. package/dist/walker/types.d.ts +44 -0
  48. package/dist/walker/types.js +9 -0
  49. package/dist/walker/types.js.map +1 -0
  50. package/package.json +2 -2
  51. package/src/{set/error.ts → error.ts} +3 -1
  52. package/src/index.ts +2 -2
  53. package/src/set/fields/array.ts +111 -0
  54. package/src/set/fields/index.ts +69 -0
  55. package/src/set/fields/number.ts +134 -0
  56. package/src/set/fields/object.ts +30 -0
  57. package/src/set/fields/references.ts +114 -0
  58. package/src/set/fields/set.ts +63 -0
  59. package/src/set/fields/string.ts +199 -0
  60. package/src/set/index.ts +103 -188
  61. package/src/set/isValidId.ts +23 -0
  62. package/src/set/types.ts +0 -20
  63. package/src/types.ts +4 -2
  64. package/src/walker/args.ts +159 -0
  65. package/src/walker/index.ts +35 -0
  66. package/src/walker/parse.ts +193 -0
  67. package/src/walker/types.ts +75 -0
  68. package/test/number.ts +289 -543
  69. package/test/reference.ts +150 -198
  70. package/test/rest.ts +227 -0
  71. package/test/string.ts +139 -183
  72. package/test/utils/index.ts +23 -0
  73. package/test/walker.ts +558 -3
  74. package/dist/set/collections.d.ts +0 -5
  75. package/dist/set/collections.js +0 -229
  76. package/dist/set/collections.js.map +0 -1
  77. package/dist/set/error.js.map +0 -1
  78. package/dist/set/number.d.ts +0 -4
  79. package/dist/set/number.js +0 -124
  80. package/dist/set/number.js.map +0 -1
  81. package/dist/set/parseDefaultAndValue.d.ts +0 -3
  82. package/dist/set/parseDefaultAndValue.js +0 -35
  83. package/dist/set/parseDefaultAndValue.js.map +0 -1
  84. package/dist/set/parsers.d.ts +0 -3
  85. package/dist/set/parsers.js +0 -42
  86. package/dist/set/parsers.js.map +0 -1
  87. package/dist/set/references.d.ts +0 -3
  88. package/dist/set/references.js +0 -84
  89. package/dist/set/references.js.map +0 -1
  90. package/dist/set/rest.d.ts +0 -5
  91. package/dist/set/rest.js +0 -76
  92. package/dist/set/rest.js.map +0 -1
  93. package/dist/set/string.d.ts +0 -3
  94. package/dist/set/string.js +0 -173
  95. package/dist/set/string.js.map +0 -1
  96. package/dist/set2/index.d.ts +0 -0
  97. package/dist/set2/index.js +0 -71
  98. package/dist/set2/index.js.map +0 -1
  99. package/dist/walker.d.ts +0 -51
  100. package/dist/walker.js +0 -120
  101. package/dist/walker.js.map +0 -1
  102. package/src/set/collections.ts +0 -338
  103. package/src/set/number.ts +0 -167
  104. package/src/set/parseDefaultAndValue.ts +0 -54
  105. package/src/set/parsers.ts +0 -20
  106. package/src/set/references.ts +0 -113
  107. package/src/set/rest.ts +0 -135
  108. package/src/set/string.ts +0 -254
  109. package/src/set2/index.ts +0 -71
  110. package/src/walker.ts +0 -201
  111. package/test/setWalker.ts +0 -494
  112. package/test/text.ts +0 -171
package/test/walker.ts CHANGED
@@ -1,11 +1,46 @@
1
1
  import test from 'ava'
2
- import { BasedSchema, validateType, walk } from '../src/index'
2
+ import { BasedSchema, setWalker, walk } from '../src/index'
3
+ import { wait } from '@saulx/utils'
3
4
 
4
5
  const schema: BasedSchema = {
5
6
  types: {
7
+ thing: {
8
+ prefix: 'ti',
9
+ fields: {
10
+ something: { type: 'string', format: 'strongPassword' },
11
+ },
12
+ },
6
13
  bla: {
7
14
  prefix: 'bl',
8
15
  fields: {
16
+ referencesToThings: {
17
+ type: 'references',
18
+ allowedTypes: ['thing'],
19
+ },
20
+ referenceToThing: {
21
+ type: 'reference',
22
+ allowedTypes: ['thing'],
23
+ },
24
+ exclusiveminmax: {
25
+ type: 'number',
26
+ minimum: 3,
27
+ exclusiveMinimum: true,
28
+ maximum: 6,
29
+ exclusiveMaximum: true,
30
+ },
31
+ text: {
32
+ type: 'text',
33
+ pattern: '[^xz]{1,10}',
34
+ },
35
+ timestamp: {
36
+ type: 'timestamp',
37
+ },
38
+ setOfNumbers: {
39
+ type: 'set',
40
+ items: {
41
+ type: 'number',
42
+ },
43
+ },
9
44
  name: {
10
45
  minLength: 3,
11
46
  maxLength: 6,
@@ -15,6 +50,17 @@ const schema: BasedSchema = {
15
50
  type: 'string',
16
51
  pattern: '\\${1,4}',
17
52
  },
53
+ flap: {
54
+ type: 'boolean',
55
+ },
56
+ x: {
57
+ type: 'object',
58
+ properties: {
59
+ flap: {
60
+ type: 'boolean',
61
+ },
62
+ },
63
+ },
18
64
  bla: {
19
65
  type: 'set',
20
66
  items: { type: 'string', minLength: 3, maxLength: 6 },
@@ -23,19 +69,20 @@ const schema: BasedSchema = {
23
69
  },
24
70
  },
25
71
  $defs: {},
26
- languages: ['en'],
72
+ languages: ['en', 'de', 'nl', 'ro', 'za', 'ae'],
27
73
  root: {
28
74
  fields: {},
29
75
  },
30
76
  prefixToTypeMapping: {
31
77
  bl: 'bla',
78
+ ti: 'thing',
32
79
  },
33
80
  }
34
81
 
35
82
  test('walker', async (t) => {
36
83
  const x = await walk(
84
+ schema,
37
85
  {
38
- schema,
39
86
  init: async (args) => {
40
87
  return { ...args, target: { lullz: true } }
41
88
  },
@@ -102,3 +149,511 @@ test('walker', async (t) => {
102
149
 
103
150
  t.true(true)
104
151
  })
152
+
153
+ test('set walker', async (t) => {
154
+ const schema: BasedSchema = {
155
+ types: {
156
+ bla: {
157
+ prefix: 'bl',
158
+ fields: {
159
+ record: {
160
+ type: 'record',
161
+ values: {
162
+ type: 'cardinality',
163
+ },
164
+ },
165
+ array: {
166
+ type: 'array',
167
+ values: {
168
+ type: 'object',
169
+ properties: {
170
+ uniqMap: {
171
+ type: 'record',
172
+ values: {
173
+ type: 'cardinality',
174
+ },
175
+ },
176
+ bla: { type: 'boolean' },
177
+ },
178
+ },
179
+ },
180
+ uniq: { type: 'cardinality' },
181
+ snup: { type: 'boolean' },
182
+ flap: {
183
+ type: 'object',
184
+ required: ['durp'],
185
+ properties: {
186
+ durp: { type: 'boolean' },
187
+ gurt: { type: 'boolean' },
188
+ durpi: {
189
+ enum: ['yuzi', 'jux', 'mr tony', 9000],
190
+ },
191
+ x: {
192
+ type: 'array',
193
+ values: {
194
+ type: 'boolean',
195
+ },
196
+ },
197
+ },
198
+ },
199
+ },
200
+ },
201
+ },
202
+ $defs: {},
203
+ languages: ['en'],
204
+ root: {
205
+ fields: {},
206
+ },
207
+ prefixToTypeMapping: {
208
+ bl: 'bla',
209
+ },
210
+ }
211
+
212
+ const x = await setWalker(schema, {
213
+ $id: 'bl1',
214
+ snup: false,
215
+ uniq: {
216
+ $value: 'wpeojwepojfewpio',
217
+ },
218
+ record: {
219
+ a: 1000,
220
+ b: 'bla',
221
+ c: { x: 'snap', y: 'flap' },
222
+ bla: { $value: { a: true, b: false } },
223
+ },
224
+ flap: {
225
+ gurt: true,
226
+ durpi: {
227
+ $value: 'jux',
228
+ },
229
+ x: [
230
+ true,
231
+ false,
232
+ false,
233
+ true,
234
+ { $value: false },
235
+ { $default: true, $value: false },
236
+ ],
237
+ },
238
+ array: {
239
+ $insert: {
240
+ $idx: 2,
241
+ $value: {
242
+ bla: false,
243
+ uniqMap: {
244
+ a: false,
245
+ b: { $value: { a: true, b: true }, c: { x: true } },
246
+ },
247
+ },
248
+ },
249
+ },
250
+ })
251
+
252
+ console.info('------------', x)
253
+ t.true(true)
254
+ })
255
+
256
+ test('perf setWalker', async (t) => {
257
+ let d = Date.now()
258
+ let collected = 0
259
+ let errs = 0
260
+ for (let i = 0; i < 1e5; i++) {
261
+ const x = await setWalker(schema, {
262
+ $id: 'bl120',
263
+ name: 'blasdsdsd',
264
+ x: { flap: true },
265
+ })
266
+ errs += x.errors.length
267
+ collected += x.collected.length
268
+ }
269
+ t.true(d < 1e3)
270
+ })
271
+
272
+ test.only('string', async (t) => {
273
+ // for (let i = 0; i < 10; i++) {
274
+ // console.log(
275
+ // (await setWalker(schema, { $id: 'bl120', name: 'blax' })).target
276
+ // .collected
277
+ // )
278
+ // }
279
+
280
+ // console.info('----------')
281
+ // console.log(
282
+ // (await setWalker(schema, { $id: 'bl120', name: { $value: 'blax' } }))
283
+ // .target.collected
284
+ // )
285
+ console.info('---- default ------')
286
+ const x = await setWalker(schema, {
287
+ $id: 'bl120',
288
+ name: { $default: 'blax' },
289
+ })
290
+
291
+ // TODO: Error also has to include path
292
+ console.log(
293
+ x.errors,
294
+ x.collected.map((v) => ({ path: v.path, value: v.value }))
295
+ )
296
+
297
+ console.info('---- default too many fields ------')
298
+ const y = await setWalker(schema, {
299
+ $id: 'bl120',
300
+ name: { $default: 'blax', meanboys: true },
301
+ })
302
+
303
+ // TODO: Error also has to include path
304
+ console.log(
305
+ y.errors,
306
+ y.collected.map((v) => ({ path: v.path, value: v.value }))
307
+ )
308
+
309
+ console.info('---- ------')
310
+ const z = await setWalker(schema, {
311
+ $id: 'bl120',
312
+ exclusiveminmax: { $default: 10, $decrement: 10 },
313
+ })
314
+
315
+ console.log(
316
+ z.errors,
317
+ z.collected.map((v) => ({ path: v.path, value: v.value }))
318
+ )
319
+
320
+ console.info('---- doink ------')
321
+ const j = await setWalker(schema, {
322
+ $id: 'bl120',
323
+ exclusiveminmax: { $default: 4, $decrement: 10 },
324
+ })
325
+
326
+ console.log(
327
+ j.errors,
328
+ j.collected.map((v) => ({ path: v.path, value: v.value }))
329
+ )
330
+
331
+ console.info('---- doink 2 ------')
332
+ const c = await setWalker(schema, {
333
+ $id: 'bl120',
334
+ exclusiveminmax: { $default: 4, $decrement: 10, flapperdeflip: true },
335
+ })
336
+
337
+ console.log(
338
+ c.errors,
339
+ c.collected.map((v) => ({ path: v.path, value: v.value }))
340
+ )
341
+
342
+ console.info('---- doink 3 ------')
343
+ const g = await setWalker(schema, {
344
+ $id: 'bl120',
345
+ timestamp: { $default: 4 },
346
+ })
347
+
348
+ console.log(
349
+ g.errors,
350
+ g.collected.map((v) => ({ path: v.path, value: v.value }))
351
+ )
352
+
353
+ console.info('---- doink 4 ------')
354
+ const d = await setWalker(schema, {
355
+ $id: 'bl120',
356
+ exclusiveminmax: { $value: 4 },
357
+ })
358
+
359
+ console.log(
360
+ d.errors,
361
+ d.collected.map((v) => ({ path: v.path, value: v.value }))
362
+ )
363
+
364
+ console.info('---- doink 5 ------')
365
+ let r = await setWalker(schema, {
366
+ $id: 'bl120',
367
+ text: { $value: 'x' },
368
+ })
369
+
370
+ console.log(
371
+ r.errors,
372
+ r.collected.map((v) => ({ path: v.path, value: v.value }))
373
+ )
374
+
375
+ console.info('---- doink 6 ------')
376
+ r = await setWalker(schema, {
377
+ $id: 'bl120',
378
+ $language: 'za',
379
+ text: { $value: 'sdsdds' },
380
+ })
381
+
382
+ console.log(
383
+ r.errors,
384
+ r.collected.map((v) => ({ path: v.path, value: v.value }))
385
+ )
386
+
387
+ console.info('---- doink 7 ------')
388
+ r = await setWalker(schema, {
389
+ $id: 'bl120',
390
+ $language: 'za',
391
+ text: { $default: 'sdsdds' },
392
+ })
393
+
394
+ console.log(r.errors)
395
+ console.dir(
396
+ r.collected.map((v) => ({ path: v.path, value: v.value })),
397
+ { depth: 10 }
398
+ )
399
+
400
+ console.info('---- doink 8 ------')
401
+ r = await setWalker(schema, {
402
+ $id: 'bl120',
403
+ $language: 'za',
404
+ text: { $default: 'sdsdds', en: { $default: 'flapflap' } },
405
+ })
406
+
407
+ console.log(r.errors)
408
+ console.dir(
409
+ r.collected.map((v) => ({ path: v.path, value: v.value })),
410
+ { depth: 10 }
411
+ )
412
+
413
+ console.info('---- doink 9 ------')
414
+ r = await setWalker(schema, {
415
+ $id: 'bl120',
416
+ $language: 'za',
417
+ text: { $default: { de: 'dsnfds' }, en: { $default: 'flapflap' } },
418
+ })
419
+
420
+ console.log(r.errors)
421
+ console.dir(
422
+ r.collected.map((v) => ({ path: v.path, value: v.value })),
423
+ { depth: 10 }
424
+ )
425
+
426
+ t.true(true)
427
+
428
+ console.info('---- doink 10 ------')
429
+ r = await setWalker(schema, {
430
+ $id: 'bl120',
431
+ $language: 'za',
432
+ text: {
433
+ $default: { de: 'dsnfds' },
434
+ nl: 'flapperonus',
435
+ en: { $default: 'flapflap' },
436
+ },
437
+ })
438
+
439
+ console.log(r.errors)
440
+ console.dir(
441
+ r.collected.map((v) => ({ path: v.path, value: v.value })),
442
+ { depth: 10 }
443
+ )
444
+
445
+ console.info('---- doink 11 ------')
446
+ r = await setWalker(schema, {
447
+ $id: 'bl120',
448
+ $language: 'za',
449
+ text: {
450
+ $default: { de: 'dsnfds' },
451
+ nl: 'flapperonus',
452
+ ro: { $value: 'durp' },
453
+ en: { $default: 'flapflap' },
454
+ },
455
+ })
456
+
457
+ console.log(r.errors)
458
+ console.dir(
459
+ r.collected.map((v) => ({ path: v.path, value: v.value })),
460
+ { depth: 10 }
461
+ )
462
+
463
+ console.info('---- doink 12 ------')
464
+ r = await setWalker(schema, {
465
+ $id: 'bl120',
466
+ $language: 'za',
467
+ text: {
468
+ $value: 'durp',
469
+ nl: 'flapperonus',
470
+ $default: {
471
+ ae: 'habibi',
472
+ },
473
+ ro: { $value: 'durp' },
474
+ en: { $default: 'flapflap' },
475
+ },
476
+ })
477
+
478
+ console.log(r.errors)
479
+ console.dir(
480
+ r.collected.map((v) => ({ path: v.path, value: v.value })),
481
+ { depth: 10 }
482
+ )
483
+
484
+ console.info('---- doink 13 ------')
485
+ r = await setWalker(schema, {
486
+ $id: 'bl120',
487
+ $language: 'za',
488
+ text: {
489
+ $value: 'xz',
490
+ nl: 'flapperonus',
491
+ $default: {
492
+ ae: 'habibi',
493
+ },
494
+ ro: { $value: 'durp' },
495
+ en: { $default: 'xzxz' },
496
+ },
497
+ })
498
+
499
+ console.log(r.errors)
500
+ console.dir(
501
+ r.collected.map((v) => ({ path: v.path, value: v.value })),
502
+ { depth: 10 }
503
+ )
504
+
505
+ console.info('---- doink 14 ------')
506
+ r = await setWalker(schema, {
507
+ $id: 'bl120',
508
+ $language: 'za',
509
+ text: {
510
+ $value: 'xz',
511
+ nl: 'flapperonus',
512
+ $default: {
513
+ ae: 'habibi',
514
+ },
515
+ ro: { $value: 'durp' },
516
+ en: { $default: 'xzxz' },
517
+ },
518
+ })
519
+
520
+ console.log(r.errors)
521
+ console.dir(
522
+ r.collected.map((v) => ({ path: v.path, value: v.value })),
523
+ { depth: 10 }
524
+ )
525
+
526
+ console.info('---- doink 15 ------')
527
+ r = await setWalker(schema, {
528
+ $id: 'bl120',
529
+ setOfNumbers: [1, 2, 3, 4, 5],
530
+ })
531
+
532
+ console.log(r.errors)
533
+ console.dir(
534
+ r.collected.map((v) => ({ path: v.path, value: v.value })),
535
+ { depth: 10 }
536
+ )
537
+
538
+ console.info('---- doink 16 ------')
539
+ r = await setWalker(schema, {
540
+ $id: 'bl120',
541
+ setOfNumbers: { $add: 20 },
542
+ })
543
+
544
+ console.log(r.errors)
545
+ console.dir(
546
+ r.collected.map((v) => ({ path: v.path, value: v.value })),
547
+ { depth: 10 }
548
+ )
549
+
550
+ console.info('---- doink 17 ------')
551
+ r = await setWalker(schema, {
552
+ $id: 'bl120',
553
+ setOfNumbers: { $add: [1, 2, 3, 4, 5, 6] },
554
+ })
555
+
556
+ console.log(r.errors)
557
+ console.dir(
558
+ r.collected.map((v) => ({ path: v.path, value: v.value })),
559
+ { depth: 10 }
560
+ )
561
+
562
+ console.info('---- doink 18 ------')
563
+ r = await setWalker(schema, {
564
+ $id: 'bl120',
565
+ setOfNumbers: { $remove: [1, 2, 3, 4, 5, 6] },
566
+ })
567
+
568
+ console.log(r.errors)
569
+ console.dir(
570
+ r.collected.map((v) => ({ path: v.path, value: v.value })),
571
+ { depth: 10 }
572
+ )
573
+
574
+ console.info('---- doink 19 ------')
575
+ r = await setWalker(schema, {
576
+ $id: 'bl120',
577
+ referenceToThing: 'sdfefewfewfewewffwe',
578
+ })
579
+
580
+ console.log(r.errors)
581
+ console.dir(
582
+ r.collected.map((v) => ({ path: v.path, value: v.value })),
583
+ { depth: 10 }
584
+ )
585
+
586
+ console.info('---- doink 20 ------')
587
+ r = await setWalker(schema, {
588
+ $id: 'bl120',
589
+ referenceToThing: 'tibla',
590
+ })
591
+
592
+ console.log(r.errors)
593
+ console.dir(
594
+ r.collected.map((v) => ({ path: v.path, value: v.value })),
595
+ { depth: 10 }
596
+ )
597
+
598
+ console.info('---- doink 21 ------')
599
+ r = await setWalker(schema, {
600
+ $id: 'bl120',
601
+ referenceToThing: 'blbla',
602
+ })
603
+
604
+ console.log(r.errors)
605
+ console.dir(
606
+ r.collected.map((v) => ({ path: v.path, value: v.value })),
607
+ { depth: 10 }
608
+ )
609
+
610
+ console.info('---- doink 22 ------')
611
+ r = await setWalker(schema, {
612
+ $id: 'bl120',
613
+ referencesToThings: ['blbla', 'ti123', 'ewiohfdoweihfw'],
614
+ })
615
+
616
+ console.log(r.errors)
617
+ console.dir(
618
+ r.collected.map((v) => ({ path: v.path, value: v.value })),
619
+ { depth: 10 }
620
+ )
621
+
622
+ console.info('---- doink 23 ------')
623
+ r = await setWalker(schema, {
624
+ $id: 'bl120',
625
+ referencesToThings: { $remove: ['ti123'] },
626
+ })
627
+
628
+ console.log(r.errors)
629
+ console.dir(
630
+ r.collected.map((v) => ({ path: v.path, value: v.value })),
631
+ { depth: 10 }
632
+ )
633
+
634
+ console.info('---- doink 24 ------')
635
+ r = await setWalker(schema, {
636
+ $id: 'bl120',
637
+ referencesToThings: { $add: ['blbla', 'ti123', 'ewiohfdoweihfw'] },
638
+ })
639
+
640
+ console.log(r.errors)
641
+ console.dir(
642
+ r.collected.map((v) => ({ path: v.path, value: v.value })),
643
+ { depth: 10 }
644
+ )
645
+
646
+ console.info('---- doink 25 ------')
647
+ r = await setWalker(schema, {
648
+ $id: 'bl120',
649
+ referencesToThings: { $add: 'ti123' },
650
+ })
651
+
652
+ console.log(r.errors)
653
+ console.dir(
654
+ r.collected.map((v) => ({ path: v.path, value: v.value })),
655
+ { depth: 10 }
656
+ )
657
+
658
+ t.true(true)
659
+ })
@@ -1,5 +0,0 @@
1
- import { Parser } from './types';
2
- export declare const set: Parser<'set'>;
3
- export declare const object: Parser<'object'>;
4
- export declare const array: Parser<'array'>;
5
- export declare const record: Parser<'record'>;