@based/schema 1.3.2 → 2.1.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 (71) hide show
  1. package/dist/set/fields/string.d.ts.map +1 -1
  2. package/dist/set/fields/string.js +3 -1
  3. package/dist/set/fields/string.js.map +1 -1
  4. package/dist/set/index.d.ts.map +1 -1
  5. package/dist/set/index.js +3 -1
  6. package/dist/set/index.js.map +1 -1
  7. package/dist/types.d.ts +5 -2
  8. package/dist/types.d.ts.map +1 -1
  9. package/dist/types.js +17 -1
  10. package/dist/types.js.map +1 -1
  11. package/dist/updateSchema.js +1 -1
  12. package/dist/updateSchema.js.map +1 -1
  13. package/dist/validateSchema.d.ts.map +1 -1
  14. package/dist/validateSchema.js +5 -2
  15. package/dist/validateSchema.js.map +1 -1
  16. package/package.json +1 -1
  17. package/dist/set/collections.d.ts +0 -5
  18. package/dist/set/collections.js +0 -211
  19. package/dist/set/collections.js.map +0 -1
  20. package/dist/set/error.d.ts +0 -15
  21. package/dist/set/error.js +0 -24
  22. package/dist/set/error.js.map +0 -1
  23. package/dist/set/number.d.ts +0 -4
  24. package/dist/set/number.js +0 -111
  25. package/dist/set/number.js.map +0 -1
  26. package/dist/set/parseDefaultAndValue.d.ts +0 -3
  27. package/dist/set/parseDefaultAndValue.js +0 -33
  28. package/dist/set/parseDefaultAndValue.js.map +0 -1
  29. package/dist/set/parsers.d.ts +0 -3
  30. package/dist/set/parsers.js +0 -42
  31. package/dist/set/parsers.js.map +0 -1
  32. package/dist/set/references.d.ts +0 -3
  33. package/dist/set/references.js +0 -77
  34. package/dist/set/references.js.map +0 -1
  35. package/dist/set/rest.d.ts +0 -5
  36. package/dist/set/rest.js +0 -76
  37. package/dist/set/rest.js.map +0 -1
  38. package/dist/set/string.d.ts +0 -3
  39. package/dist/set/string.js +0 -173
  40. package/dist/set/string.js.map +0 -1
  41. package/src/error.ts +0 -19
  42. package/src/index.ts +0 -7
  43. package/src/languages.ts +0 -188
  44. package/src/set/fields/array.ts +0 -155
  45. package/src/set/fields/index.ts +0 -70
  46. package/src/set/fields/number.ts +0 -144
  47. package/src/set/fields/object.ts +0 -31
  48. package/src/set/fields/references.ts +0 -140
  49. package/src/set/fields/set.ts +0 -63
  50. package/src/set/fields/string.ts +0 -287
  51. package/src/set/index.ts +0 -182
  52. package/src/set/isValidId.ts +0 -23
  53. package/src/set/types.ts +0 -0
  54. package/src/types.ts +0 -361
  55. package/src/updateSchema.ts +0 -18
  56. package/src/validateSchema.ts +0 -61
  57. package/src/walker/args.ts +0 -209
  58. package/src/walker/index.ts +0 -48
  59. package/src/walker/parse.ts +0 -233
  60. package/src/walker/types.ts +0 -81
  61. package/test/array.ts +0 -388
  62. package/test/number.ts +0 -435
  63. package/test/reference.ts +0 -218
  64. package/test/rest.ts +0 -184
  65. package/test/set.ts +0 -103
  66. package/test/string.ts +0 -118
  67. package/test/text.ts +0 -342
  68. package/test/utils/index.ts +0 -23
  69. package/test/validateSchema.ts +0 -41
  70. package/test/walker.ts +0 -318
  71. 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
- }