@based/schema 2.0.0 → 2.2.0

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 (107) hide show
  1. package/dist/display/dateString copy.d.ts +3 -0
  2. package/dist/display/dateString copy.js +127 -0
  3. package/dist/display/dateString copy.js.map +1 -0
  4. package/dist/display/dateString.d.ts +3 -0
  5. package/dist/display/dateString.js +127 -0
  6. package/dist/display/dateString.js.map +1 -0
  7. package/dist/display/display.d.ts +1 -0
  8. package/dist/display/display.js +8 -0
  9. package/dist/display/display.js.map +1 -0
  10. package/dist/display/index.d.ts +2 -0
  11. package/dist/display/index.js +26 -0
  12. package/dist/display/index.js.map +1 -0
  13. package/dist/display/number copy.d.ts +3 -0
  14. package/dist/display/number copy.js +81 -0
  15. package/dist/display/number copy.js.map +1 -0
  16. package/dist/display/number.d.ts +3 -0
  17. package/dist/display/number.js +89 -0
  18. package/dist/display/number.js.map +1 -0
  19. package/dist/display/string.d.ts +3 -0
  20. package/dist/display/string.js +23 -0
  21. package/dist/display/string.js.map +1 -0
  22. package/dist/display/timestamp.d.ts +3 -0
  23. package/dist/display/timestamp.js +127 -0
  24. package/dist/display/timestamp.js.map +1 -0
  25. package/dist/display.d.ts +2 -0
  26. package/dist/display.js +8 -0
  27. package/dist/display.js.map +1 -0
  28. package/dist/error.d.ts +0 -1
  29. package/dist/error.js +1 -1
  30. package/dist/error.js.map +1 -1
  31. package/dist/index.d.ts +1 -1
  32. package/dist/index.js +1 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/languages.d.ts +0 -1
  35. package/dist/set/fields/array.d.ts +0 -1
  36. package/dist/set/fields/index.d.ts +0 -1
  37. package/dist/set/fields/number.d.ts +0 -1
  38. package/dist/set/fields/object.d.ts +0 -1
  39. package/dist/set/fields/references.d.ts +0 -1
  40. package/dist/set/fields/set.d.ts +0 -1
  41. package/dist/set/fields/string.d.ts +0 -1
  42. package/dist/set/index.d.ts +0 -1
  43. package/dist/set/isValidId.d.ts +0 -1
  44. package/dist/set/types.d.ts +0 -1
  45. package/dist/types.d.ts +15 -5
  46. package/dist/types.js +19 -1
  47. package/dist/types.js.map +1 -1
  48. package/dist/updateSchema.d.ts +0 -1
  49. package/dist/validateSchema.d.ts +0 -1
  50. package/dist/walker/args.d.ts +0 -1
  51. package/dist/walker/index.d.ts +0 -1
  52. package/dist/walker/parse.d.ts +0 -1
  53. package/dist/walker/types.d.ts +0 -1
  54. package/dist/walker/types.js +1 -1
  55. package/dist/walker/types.js.map +1 -1
  56. package/package.json +4 -3
  57. package/dist/error.d.ts.map +0 -1
  58. package/dist/index.d.ts.map +0 -1
  59. package/dist/languages.d.ts.map +0 -1
  60. package/dist/set/fields/array.d.ts.map +0 -1
  61. package/dist/set/fields/index.d.ts.map +0 -1
  62. package/dist/set/fields/number.d.ts.map +0 -1
  63. package/dist/set/fields/object.d.ts.map +0 -1
  64. package/dist/set/fields/references.d.ts.map +0 -1
  65. package/dist/set/fields/set.d.ts.map +0 -1
  66. package/dist/set/fields/string.d.ts.map +0 -1
  67. package/dist/set/index.d.ts.map +0 -1
  68. package/dist/set/isValidId.d.ts.map +0 -1
  69. package/dist/set/types.d.ts.map +0 -1
  70. package/dist/types.d.ts.map +0 -1
  71. package/dist/updateSchema.d.ts.map +0 -1
  72. package/dist/validateSchema.d.ts.map +0 -1
  73. package/dist/walker/args.d.ts.map +0 -1
  74. package/dist/walker/index.d.ts.map +0 -1
  75. package/dist/walker/parse.d.ts.map +0 -1
  76. package/dist/walker/types.d.ts.map +0 -1
  77. package/src/error.ts +0 -19
  78. package/src/index.ts +0 -7
  79. package/src/languages.ts +0 -188
  80. package/src/set/fields/array.ts +0 -155
  81. package/src/set/fields/index.ts +0 -70
  82. package/src/set/fields/number.ts +0 -144
  83. package/src/set/fields/object.ts +0 -31
  84. package/src/set/fields/references.ts +0 -140
  85. package/src/set/fields/set.ts +0 -63
  86. package/src/set/fields/string.ts +0 -291
  87. package/src/set/index.ts +0 -186
  88. package/src/set/isValidId.ts +0 -23
  89. package/src/set/types.ts +0 -0
  90. package/src/types.ts +0 -365
  91. package/src/updateSchema.ts +0 -18
  92. package/src/validateSchema.ts +0 -64
  93. package/src/walker/args.ts +0 -209
  94. package/src/walker/index.ts +0 -48
  95. package/src/walker/parse.ts +0 -233
  96. package/src/walker/types.ts +0 -81
  97. package/test/array.ts +0 -388
  98. package/test/number.ts +0 -435
  99. package/test/reference.ts +0 -219
  100. package/test/rest.ts +0 -185
  101. package/test/set.ts +0 -104
  102. package/test/string.ts +0 -118
  103. package/test/text.ts +0 -348
  104. package/test/utils/index.ts +0 -23
  105. package/test/validateSchema.ts +0 -41
  106. package/test/walker.ts +0 -319
  107. package/tsconfig.json +0 -9
package/src/languages.ts DELETED
@@ -1,188 +0,0 @@
1
- export const languages = {
2
- ab: 'Abkhazian',
3
- aa: 'Afar',
4
- af: 'Afrikaans',
5
- ak: 'Akan',
6
- sq: 'Albanian',
7
- am: 'Amharic',
8
- ar: 'Arabic',
9
- an: 'Aragonese',
10
- hy: 'Armenian',
11
- as: 'Assamese',
12
- av: 'Avaric',
13
- ae: 'Avestan',
14
- ay: 'Aymara',
15
- az: 'Azerbaijani',
16
- bm: 'Bambara',
17
- ba: 'Bashkir',
18
- eu: 'Basque',
19
- be: 'Belarusian',
20
- bn: 'Bengali',
21
- bh: 'Bihari languages',
22
- bi: 'Bislama',
23
- bs: 'Bosnian',
24
- br: 'Breton',
25
- bg: 'Bulgarian',
26
- my: 'Burmese',
27
- ca: 'Catalan, Valencian',
28
- km: 'Central Khmer',
29
- ch: 'Chamorro',
30
- ce: 'Chechen',
31
- ny: 'Chichewa, Chewa, Nyanja',
32
- zh: 'Chinese',
33
- cu: 'Church Slavonic, Old Bulgarian, Old Church Slavonic',
34
- cv: 'Chuvash',
35
- kw: 'Cornish',
36
- co: 'Corsican',
37
- cr: 'Cree',
38
- hr: 'Croatian',
39
- cs: 'Czech',
40
- da: 'Danish',
41
- dv: 'Divehi, Dhivehi, Maldivian',
42
- nl: 'Dutch, Flemish',
43
- dz: 'Dzongkha',
44
- en: 'English',
45
- eo: 'Esperanto',
46
- et: 'Estonian',
47
- ee: 'Ewe',
48
- fo: 'Faroese',
49
- fj: 'Fijian',
50
- fi: 'Finnish',
51
- fr: 'French',
52
- ff: 'Fulah',
53
- gd: 'Gaelic, Scottish Gaelic',
54
- gl: 'Galician',
55
- lg: 'Ganda',
56
- ka: 'Georgian',
57
- de: 'German',
58
- ki: 'Gikuyu, Kikuyu',
59
- el: 'Greek (Modern)',
60
- kl: 'Greenlandic, Kalaallisut',
61
- gn: 'Guarani',
62
- gu: 'Gujarati',
63
- ht: 'Haitian, Haitian Creole',
64
- ha: 'Hausa',
65
- he: 'Hebrew',
66
- hz: 'Herero',
67
- hi: 'Hindi',
68
- ho: 'Hiri Motu',
69
- hu: 'Hungarian',
70
- is: 'Icelandic',
71
- io: 'Ido',
72
- ig: 'Igbo',
73
- id: 'Indonesian',
74
- ia: 'Interlingua (International Auxiliary Language Association)',
75
- ie: 'Interlingue',
76
- iu: 'Inuktitut',
77
- ik: 'Inupiaq',
78
- ga: 'Irish',
79
- it: 'Italian',
80
- ja: 'Japanese',
81
- jv: 'Javanese',
82
- kn: 'Kannada',
83
- kr: 'Kanuri',
84
- ks: 'Kashmiri',
85
- kk: 'Kazakh',
86
- rw: 'Kinyarwanda',
87
- kv: 'Komi',
88
- kg: 'Kongo',
89
- ko: 'Korean',
90
- kj: 'Kwanyama, Kuanyama',
91
- ku: 'Kurdish',
92
- ky: 'Kyrgyz',
93
- lo: 'Lao',
94
- la: 'Latin',
95
- lv: 'Latvian',
96
- lb: 'Letzeburgesch, Luxembourgish',
97
- li: 'Limburgish, Limburgan, Limburger',
98
- ln: 'Lingala',
99
- lt: 'Lithuanian',
100
- lu: 'Luba-Katanga',
101
- mk: 'Macedonian',
102
- mg: 'Malagasy',
103
- ms: 'Malay',
104
- ml: 'Malayalam',
105
- mt: 'Maltese',
106
- gv: 'Manx',
107
- mi: 'Maori',
108
- mr: 'Marathi',
109
- mh: 'Marshallese',
110
- ro: 'Moldovan, Moldavian, Romanian',
111
- mn: 'Mongolian',
112
- na: 'Nauru',
113
- nv: 'Navajo, Navaho',
114
- nd: 'Northern Ndebele',
115
- ng: 'Ndonga',
116
- ne: 'Nepali',
117
- se: 'Northern Sami',
118
- no: 'Norwegian',
119
- nb: 'Norwegian Bokmål',
120
- nn: 'Norwegian Nynorsk',
121
- ii: 'Nuosu, Sichuan Yi',
122
- oc: 'Occitan (post 1500)',
123
- oj: 'Ojibwa',
124
- or: 'Oriya',
125
- om: 'Oromo',
126
- os: 'Ossetian, Ossetic',
127
- pi: 'Pali',
128
- pa: 'Panjabi, Punjabi',
129
- ps: 'Pashto, Pushto',
130
- fa: 'Persian',
131
- pl: 'Polish',
132
- pt: 'Portuguese',
133
- qu: 'Quechua',
134
- rm: 'Romansh',
135
- rn: 'Rundi',
136
- ru: 'Russian',
137
- sm: 'Samoan',
138
- sg: 'Sango',
139
- sa: 'Sanskrit',
140
- sc: 'Sardinian',
141
- sr: 'Serbian',
142
- sn: 'Shona',
143
- sd: 'Sindhi',
144
- si: 'Sinhala, Sinhalese',
145
- sk: 'Slovak',
146
- sl: 'Slovenian',
147
- so: 'Somali',
148
- st: 'Sotho, Southern',
149
- nr: 'South Ndebele',
150
- es: 'Spanish, Castilian',
151
- su: 'Sundanese',
152
- sw: 'Swahili',
153
- ss: 'Swati',
154
- sv: 'Swedish',
155
- tl: 'Tagalog',
156
- ty: 'Tahitian',
157
- tg: 'Tajik',
158
- ta: 'Tamil',
159
- tt: 'Tatar',
160
- te: 'Telugu',
161
- th: 'Thai',
162
- bo: 'Tibetan',
163
- ti: 'Tigrinya',
164
- to: 'Tonga (Tonga Islands)',
165
- ts: 'Tsonga',
166
- tn: 'Tswana',
167
- tr: 'Turkish',
168
- tk: 'Turkmen',
169
- tw: 'Twi',
170
- ug: 'Uighur, Uyghur',
171
- uk: 'Ukrainian',
172
- ur: 'Urdu',
173
- uz: 'Uzbek',
174
- ve: 'Venda',
175
- vi: 'Vietnamese',
176
- vo: 'Volap_k',
177
- wa: 'Walloon',
178
- cy: 'Welsh',
179
- fy: 'Western Frisian',
180
- wo: 'Wolof',
181
- xh: 'Xhosa',
182
- yi: 'Yiddish',
183
- yo: 'Yoruba',
184
- za: 'Zhuang, Chuang',
185
- zu: 'Zulu',
186
- }
187
-
188
- export type Language = keyof typeof languages
@@ -1,155 +0,0 @@
1
- import { setByPath } from '@saulx/utils'
2
- import { ParseError } from '../../error'
3
- import { FieldParser, ArgsClass } from '../../walker'
4
- import { BasedSetTarget } from '../../types'
5
-
6
- const collectOperation = (
7
- fromArgs: ArgsClass<BasedSetTarget, 'array'>,
8
- collected: any[],
9
- value: any,
10
- makeNegative?: number
11
- ) => {
12
- fromArgs.collect(value)
13
- if (collected.length) {
14
- const collect = fromArgs.root._opts.collect
15
- for (const args of collected) {
16
- if (makeNegative) {
17
- args.path[fromArgs.path.length] =
18
- args.path[fromArgs.path.length] - makeNegative
19
-
20
- collect(args)
21
- } else {
22
- collect(args)
23
- }
24
- }
25
- }
26
- }
27
-
28
- const parseArray = async (
29
- args: ArgsClass<BasedSetTarget, 'array'>,
30
- value: any,
31
- idx: number = 0
32
- ): Promise<{ collected: ArgsClass<BasedSetTarget>[]; arr: any[] }> => {
33
- const fromValue = Array.isArray(value) ? value : [value]
34
- const q: Promise<any>[] = []
35
- const arr = new Array(fromValue.length)
36
- const collectNested = ['object', 'record', 'text'].includes(
37
- args.fieldSchema.values.type
38
- )
39
- const collected: ArgsClass<BasedSetTarget>[] = []
40
- for (let i = 0; i < fromValue.length; i++) {
41
- q.push(
42
- args.parse({
43
- key: i + idx,
44
- value: fromValue[i],
45
- fieldSchema: args.fieldSchema.values,
46
- collect: (nArgs) => {
47
- const p = nArgs.path.slice(args.path.length)
48
- // @ts-ignore
49
- p[0] = p[0] - idx
50
- setByPath(arr, p, nArgs.value)
51
- if (collectNested) {
52
- collected.push(nArgs)
53
- }
54
- },
55
- })
56
- )
57
- }
58
- await Promise.all(q)
59
- return { arr, collected }
60
- }
61
-
62
- const operations: {
63
- [key: string]: (
64
- args: ArgsClass<BasedSetTarget, 'array'>,
65
- value: any
66
- ) => Promise<void>
67
- } = {
68
- $insert: async (args, value) => {
69
- if (typeof value.$insert.$idx !== 'number') {
70
- args.error(ParseError.incorrectFormat)
71
- return
72
- }
73
- const { collected, arr } = await parseArray(
74
- args,
75
- value.$insert.$value,
76
- value.$insert.$idx
77
- )
78
- value.$insert.$value = arr
79
- collectOperation(args, collected, value)
80
- },
81
- $push: async (args, value) => {
82
- const { collected, arr } = await parseArray(
83
- args,
84
- value.$push.$value ?? value.$push
85
- )
86
- value.$push = arr
87
- collectOperation(args, collected, value, arr.length)
88
- },
89
- $unshift: async (args, value) => {
90
- const { collected, arr } = await parseArray(
91
- args,
92
- value.$unshift.$value ?? value.$unshift
93
- )
94
- value.$unshift = arr
95
- collectOperation(args, collected, value)
96
- },
97
- $remove: async (args, value) => {
98
- if (typeof value.$remove.$idx !== 'number') {
99
- args.error(ParseError.incorrectFormat)
100
- return
101
- }
102
- args.collect(value)
103
- },
104
- $assign: async (args, value) => {
105
- if (
106
- typeof value.$assign !== 'object' ||
107
- typeof value.$assign.$idx !== 'number'
108
- ) {
109
- args.error(ParseError.incorrectFormat)
110
- return
111
- }
112
- await args.parse({
113
- key: value.$assign.$idx,
114
- value: value.$assign.$value,
115
- fieldSchema: args.fieldSchema.values,
116
- })
117
- },
118
- }
119
-
120
- export const array: FieldParser<'array'> = async (args) => {
121
- args.stop()
122
- if (typeof args.value !== 'object') {
123
- args.error(ParseError.incorrectFormat)
124
- return
125
- }
126
- let value = '$value' in args.value ? args.value.$value : args.value
127
- if (Array.isArray(value)) {
128
- const q: Promise<any>[] = []
129
- args.collect({ $delete: true })
130
- for (let i = 0; i < value.length; i++) {
131
- q.push(
132
- args.parse({
133
- key: i,
134
- value: args.value[i],
135
- fieldSchema: args.fieldSchema.values,
136
- })
137
- )
138
- }
139
- await Promise.all(q)
140
- return
141
- }
142
- let hasOperation = false
143
- for (const key in value) {
144
- if (operations[key]) {
145
- if (hasOperation) {
146
- args.error(ParseError.multipleOperationsNotAllowed)
147
- return
148
- }
149
- await operations[key](args, value)
150
- hasOperation = true
151
- } else {
152
- args.error(ParseError.fieldDoesNotExist)
153
- }
154
- }
155
- }
@@ -1,70 +0,0 @@
1
- import { FieldParsers } from '../../walker'
2
- import { ParseError } from '../../error'
3
- import { BasedSetTarget } from '../../types'
4
- import { array } from './array'
5
- import { object, record } from './object'
6
- import { number, integer, timestamp } from './number'
7
- import { string, text } from './string'
8
- import { reference, references } from './references'
9
- import { set } from './set'
10
- import { hashObjectIgnoreKeyOrder, hash } from '@saulx/hash'
11
- import { deepEqual } from '@saulx/utils'
12
-
13
- export const fields: Partial<FieldParsers<BasedSetTarget>> = {
14
- array,
15
- object,
16
- record,
17
- number,
18
- integer,
19
- timestamp,
20
- string,
21
- set,
22
- text,
23
- reference,
24
- references,
25
- cardinality: async (args) => {
26
- let hashedValue: string
27
- if (args.value && typeof args.value === 'object') {
28
- args.stop()
29
- if (args.value.$default !== undefined) {
30
- args.error(ParseError.defaultNotSupported)
31
- return
32
- }
33
- if (args.value.$value !== undefined) {
34
- hashedValue = hashObjectIgnoreKeyOrder(args.value.$value).toString(16)
35
- } else {
36
- hashedValue = hashObjectIgnoreKeyOrder(args.value).toString(16)
37
- }
38
- } else {
39
- hashedValue = hash(args.value).toString(16)
40
- }
41
- args.collect(hashedValue)
42
- },
43
- boolean: async (args) => {
44
- if (typeof args.value !== 'boolean') {
45
- args.error(ParseError.incorrectFormat)
46
- return
47
- }
48
- args.collect()
49
- },
50
- json: async (args) => {
51
- args.stop()
52
- try {
53
- const parsedValue = JSON.stringify(args.value)
54
- args.collect(parsedValue)
55
- } catch (err) {
56
- args.error(ParseError.invalidJSON)
57
- }
58
- },
59
- enum: async (args) => {
60
- // args.stop()
61
- const enumValues = args.fieldSchema.enum
62
- for (let i = 0; i < enumValues.length; i++) {
63
- if (deepEqual(enumValues[i], args.value)) {
64
- args.collect(i)
65
- return
66
- }
67
- }
68
- args.error(ParseError.incorrectFormat)
69
- },
70
- }
@@ -1,144 +0,0 @@
1
- import { ParseError } from '../../error'
2
- import { FieldParser, ArgsClass } from '../../walker'
3
- import { BasedSetTarget } from '../../types'
4
-
5
- type NumberTypes = 'number' | 'timestamp' | 'integer'
6
-
7
- const validateNumber = (
8
- args: ArgsClass<BasedSetTarget, NumberTypes>,
9
- value: number,
10
- ignoreMinMax?: boolean
11
- ): boolean => {
12
- const { fieldSchema } = args
13
- if (typeof value !== 'number') {
14
- args.error(ParseError.incorrectFormat)
15
- return false
16
- }
17
-
18
- if (isNaN(value)) {
19
- args.error(ParseError.incorrectFormat)
20
- return false
21
- }
22
-
23
- if (value === Infinity || value === -Infinity) {
24
- args.error(ParseError.infinityNotSupported)
25
- return false
26
- }
27
-
28
- if (fieldSchema.type === 'integer' && value - Math.floor(value) !== 0) {
29
- args.error(ParseError.incorrectFormat)
30
- return false
31
- }
32
-
33
- if (
34
- fieldSchema.multipleOf &&
35
- value / fieldSchema.multipleOf -
36
- Math.floor(value / fieldSchema.multipleOf) !==
37
- 0
38
- ) {
39
- args.error(ParseError.incorrectFormat)
40
- return false
41
- }
42
-
43
- if (ignoreMinMax) {
44
- // TODO: will be handled in the actual modify command
45
- return true
46
- }
47
-
48
- if (fieldSchema.maximum) {
49
- if (fieldSchema.exclusiveMaximum) {
50
- if (value >= fieldSchema.maximum) {
51
- args.error(ParseError.exceedsMaximum)
52
- return false
53
- }
54
- } else if (value > fieldSchema.maximum) {
55
- args.error(ParseError.exceedsMaximum)
56
- return false
57
- }
58
- }
59
-
60
- if (fieldSchema.minimum) {
61
- if (fieldSchema.exclusiveMinimum) {
62
- if (value <= fieldSchema.minimum) {
63
- args.error(ParseError.subceedsMinimum)
64
- return false
65
- }
66
- } else if (value < fieldSchema.minimum) {
67
- args.error(ParseError.subceedsMinimum)
68
- return false
69
- }
70
- }
71
-
72
- return true
73
- }
74
-
75
- const validate = (
76
- args: ArgsClass<BasedSetTarget, NumberTypes>,
77
- value: any
78
- ): boolean => {
79
- if (value === null) {
80
- return false
81
- }
82
-
83
- if (typeof value !== 'object') {
84
- return validateNumber(args, value)
85
- }
86
- if ('$value' in value) {
87
- return
88
- }
89
-
90
- args.stop()
91
- for (const key in value) {
92
- if (key === '$default') {
93
- if (!validateNumber(args, value.$default)) {
94
- return false
95
- }
96
- } else if (key === '$increment') {
97
- if (!validateNumber(args, value.$increment, true)) {
98
- return false
99
- }
100
- } else if (key === '$decrement') {
101
- if (!validateNumber(args, value.$decrement, true)) {
102
- return false
103
- }
104
- } else {
105
- args.create({ key }).error(ParseError.fieldDoesNotExist)
106
- return false
107
- }
108
- }
109
- return true
110
- }
111
-
112
- export const number: FieldParser<'number'> = async (args) => {
113
- if (!validate(args, args.value)) {
114
- return
115
- }
116
- args.collect()
117
- }
118
-
119
- export const integer: FieldParser<'integer'> = async (args) => {
120
- if (!validate(args, args.value)) {
121
- return
122
- }
123
- args.collect()
124
- }
125
-
126
- export const timestamp: FieldParser<'timestamp'> = async (args) => {
127
- if (typeof args.value === 'string') {
128
- if (args.value === 'now') {
129
- // TODO: + 1s + 10s etc
130
- args.value = Date.now()
131
- } else {
132
- const d = new Date(args.value)
133
- args.value = d.valueOf()
134
- if (isNaN(args.value)) {
135
- args.error(ParseError.incorrectFormat)
136
- return
137
- }
138
- }
139
- }
140
- if (!validateNumber(args, args.value)) {
141
- return
142
- }
143
- args.collect()
144
- }
@@ -1,31 +0,0 @@
1
- import { ParseError } from '../../error'
2
- import { FieldParser } from '../../walker'
3
-
4
- export const object: FieldParser<'object'> = async (args) => {
5
- if (typeof args.value !== 'object' || args.value === null) {
6
- args.error(ParseError.incorrectFormat)
7
- return
8
- }
9
-
10
- const isArray = Array.isArray(args.value)
11
- if (isArray) {
12
- args.error(ParseError.incorrectFormat)
13
- return
14
- }
15
- args.collect()
16
- return args
17
- }
18
-
19
- export const record: FieldParser<'record'> = async (args) => {
20
- if (typeof args.value !== 'object' || args.value === null) {
21
- args.error(ParseError.incorrectFormat)
22
- return
23
- }
24
- const isArray = Array.isArray(args.value)
25
- if (isArray) {
26
- args.error(ParseError.incorrectFormat)
27
- return
28
- }
29
- args.collect()
30
- return args
31
- }