@based/schema 4.1.1 → 5.0.0-alpha.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 (123) hide show
  1. package/README.md +152 -0
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.js +2 -0
  4. package/dist/lang.d.ts +152 -0
  5. package/dist/lang.js +149 -0
  6. package/dist/mermaid.d.ts +3 -0
  7. package/dist/mermaid.js +24 -0
  8. package/dist/parse/assert.d.ts +1 -1
  9. package/dist/parse/assert.js +2 -2
  10. package/dist/parse/errors.d.ts +2 -0
  11. package/dist/parse/errors.js +2 -0
  12. package/dist/parse/index.d.ts +5 -4
  13. package/dist/parse/index.js +43 -41
  14. package/dist/parse/props.js +159 -75
  15. package/dist/parse/utils.d.ts +2 -2
  16. package/dist/parse/utils.js +11 -2
  17. package/dist/types.d.ts +66 -23
  18. package/dist/types.js +93 -0
  19. package/package.json +4 -3
  20. package/dist/parsePayload/index.d.ts +0 -3
  21. package/dist/parsePayload/index.js +0 -2
  22. package/dist/parseSchema/assert.d.ts +0 -6
  23. package/dist/parseSchema/assert.js +0 -27
  24. package/dist/parseSchema/errors.d.ts +0 -19
  25. package/dist/parseSchema/errors.js +0 -19
  26. package/dist/parseSchema/index.d.ts +0 -20
  27. package/dist/parseSchema/index.js +0 -132
  28. package/dist/parseSchema/props.d.ts +0 -7
  29. package/dist/parseSchema/props.js +0 -256
  30. package/dist/parseSchema/utils.d.ts +0 -3
  31. package/dist/parseSchema/utils.js +0 -29
  32. package/dist/src/compat/index.d.ts +0 -6
  33. package/dist/src/compat/index.js +0 -217
  34. package/dist/src/compat/oldSchemaType.d.ts +0 -93
  35. package/dist/src/compat/oldSchemaType.js +0 -2
  36. package/dist/src/display/index.d.ts +0 -2
  37. package/dist/src/display/index.js +0 -16
  38. package/dist/src/display/number.d.ts +0 -4
  39. package/dist/src/display/number.js +0 -97
  40. package/dist/src/display/string.d.ts +0 -5
  41. package/dist/src/display/string.js +0 -26
  42. package/dist/src/display/timestamp.d.ts +0 -5
  43. package/dist/src/display/timestamp.js +0 -134
  44. package/dist/src/error.d.ts +0 -21
  45. package/dist/src/error.js +0 -23
  46. package/dist/src/index.d.ts +0 -6
  47. package/dist/src/index.js +0 -7
  48. package/dist/src/languages.d.ts +0 -188
  49. package/dist/src/languages.js +0 -188
  50. package/dist/src/set/fields/array.d.ts +0 -2
  51. package/dist/src/set/fields/array.js +0 -119
  52. package/dist/src/set/fields/index.d.ts +0 -3
  53. package/dist/src/set/fields/index.js +0 -85
  54. package/dist/src/set/fields/number.d.ts +0 -4
  55. package/dist/src/set/fields/number.js +0 -123
  56. package/dist/src/set/fields/object.d.ts +0 -3
  57. package/dist/src/set/fields/object.js +0 -28
  58. package/dist/src/set/fields/references.d.ts +0 -3
  59. package/dist/src/set/fields/references.js +0 -136
  60. package/dist/src/set/fields/set.d.ts +0 -2
  61. package/dist/src/set/fields/set.js +0 -59
  62. package/dist/src/set/fields/string.d.ts +0 -3
  63. package/dist/src/set/fields/string.js +0 -289
  64. package/dist/src/set/index.d.ts +0 -3
  65. package/dist/src/set/index.js +0 -205
  66. package/dist/src/set/isValidId.d.ts +0 -2
  67. package/dist/src/set/isValidId.js +0 -17
  68. package/dist/src/types.d.ts +0 -205
  69. package/dist/src/types.js +0 -113
  70. package/dist/src/updateSchema.d.ts +0 -2
  71. package/dist/src/updateSchema.js +0 -12
  72. package/dist/src/validateSchema/basedSchemaTypeValidator.d.ts +0 -3
  73. package/dist/src/validateSchema/basedSchemaTypeValidator.js +0 -45
  74. package/dist/src/validateSchema/fieldValidators.d.ts +0 -27
  75. package/dist/src/validateSchema/fieldValidators.js +0 -360
  76. package/dist/src/validateSchema/index.d.ts +0 -17
  77. package/dist/src/validateSchema/index.js +0 -109
  78. package/dist/src/validateSchema/utils.d.ts +0 -25
  79. package/dist/src/validateSchema/utils.js +0 -61
  80. package/dist/src/walker/args.d.ts +0 -36
  81. package/dist/src/walker/args.js +0 -158
  82. package/dist/src/walker/index.d.ts +0 -6
  83. package/dist/src/walker/index.js +0 -31
  84. package/dist/src/walker/parse.d.ts +0 -3
  85. package/dist/src/walker/parse.js +0 -182
  86. package/dist/src/walker/types.d.ts +0 -45
  87. package/dist/src/walker/types.js +0 -7
  88. package/dist/test/array.d.ts +0 -1
  89. package/dist/test/array.js +0 -342
  90. package/dist/test/compat.d.ts +0 -1
  91. package/dist/test/compat.js +0 -97
  92. package/dist/test/data/newSchemas.d.ts +0 -2
  93. package/dist/test/data/newSchemas.js +0 -489
  94. package/dist/test/data/oldSchemas.d.ts +0 -2
  95. package/dist/test/data/oldSchemas.js +0 -5058
  96. package/dist/test/display.d.ts +0 -1
  97. package/dist/test/display.js +0 -103
  98. package/dist/test/json.d.ts +0 -1
  99. package/dist/test/json.js +0 -40
  100. package/dist/test/number.d.ts +0 -1
  101. package/dist/test/number.js +0 -374
  102. package/dist/test/reference.d.ts +0 -1
  103. package/dist/test/reference.js +0 -188
  104. package/dist/test/rest.d.ts +0 -1
  105. package/dist/test/rest.js +0 -168
  106. package/dist/test/set.d.ts +0 -1
  107. package/dist/test/set.js +0 -95
  108. package/dist/test/string.d.ts +0 -1
  109. package/dist/test/string.js +0 -120
  110. package/dist/test/text.d.ts +0 -1
  111. package/dist/test/text.js +0 -324
  112. package/dist/test/utils/index.d.ts +0 -11
  113. package/dist/test/utils/index.js +0 -17
  114. package/dist/test/validateSchema/basic.d.ts +0 -1
  115. package/dist/test/validateSchema/basic.js +0 -94
  116. package/dist/test/validateSchema/fields.d.ts +0 -1
  117. package/dist/test/validateSchema/fields.js +0 -436
  118. package/dist/test/validateSchema/languages.d.ts +0 -1
  119. package/dist/test/validateSchema/languages.js +0 -124
  120. package/dist/test/validateSchema/realWorld.d.ts +0 -1
  121. package/dist/test/validateSchema/realWorld.js +0 -13
  122. package/dist/test/walker.d.ts +0 -1
  123. package/dist/test/walker.js +0 -289
@@ -1,3 +0,0 @@
1
- import { FieldParser } from '../../walker/index.js';
2
- export declare const object: FieldParser<'object'>;
3
- export declare const record: FieldParser<'record'>;
@@ -1,28 +0,0 @@
1
- import { ParseError } from '../../error.js';
2
- export const object = async (args) => {
3
- if (typeof args.value !== 'object' || args.value === null) {
4
- args.error(ParseError.incorrectFormat);
5
- return;
6
- }
7
- const isArray = Array.isArray(args.value);
8
- if (isArray) {
9
- args.error(ParseError.incorrectFormat);
10
- return;
11
- }
12
- args.collect();
13
- return args;
14
- };
15
- export const record = async (args) => {
16
- if (typeof args.value !== 'object' || args.value === null) {
17
- args.error(ParseError.incorrectFormat);
18
- return;
19
- }
20
- const isArray = Array.isArray(args.value);
21
- if (isArray) {
22
- args.error(ParseError.incorrectFormat);
23
- return;
24
- }
25
- args.collect();
26
- return args;
27
- };
28
- //# sourceMappingURL=object.js.map
@@ -1,3 +0,0 @@
1
- import { FieldParser } from '../../walker/index.js';
2
- export declare const reference: FieldParser<'reference'>;
3
- export declare const references: FieldParser<'references'>;
@@ -1,136 +0,0 @@
1
- import { ParseError } from '../../error.js';
2
- import { isValidId } from '../isValidId.js';
3
- async function parseOperator(args, key) {
4
- if (Array.isArray(args.value[key])) {
5
- const n = args.create({
6
- key,
7
- skipCollection: true,
8
- value: args.value[key],
9
- });
10
- await n.parse();
11
- if (n.value?.$value) {
12
- return n.value.$value;
13
- }
14
- return [];
15
- }
16
- const n = args.create({
17
- value: args.value[key],
18
- key,
19
- skipCollection: true,
20
- });
21
- await reference(n);
22
- return [n.value];
23
- }
24
- const typeIsAllowed = (args, type) => {
25
- if ('allowedType' in args.fieldSchema) {
26
- const t = args.fieldSchema.allowedType;
27
- return typeof t === 'string' && t === type;
28
- }
29
- return true;
30
- };
31
- export const reference = async (args) => {
32
- // TODO: setting an object here , handling $alias (both async hooks)
33
- // Block if path contains $remove (maybe not for $alias)
34
- if (typeof args.value === 'object') {
35
- if (args.root._opts.asyncOperationHandler) {
36
- if (args.value.type && !typeIsAllowed(args, args.value.type)) {
37
- args.error(ParseError.referenceIsIncorrectType);
38
- return;
39
- }
40
- if (!args.target.errors.length) {
41
- args.value = await args.root._opts.asyncOperationHandler(args, 'modifyObject');
42
- }
43
- }
44
- else {
45
- args.error(ParseError.nestedModifyObjectNotAllowed);
46
- return;
47
- }
48
- }
49
- if (!isValidId(args.schema, args.value)) {
50
- args.error(ParseError.incorrectFormat);
51
- return;
52
- }
53
- const prefix = args.value.slice(0, 2);
54
- const targetType = args.schema.prefixToTypeMapping[prefix];
55
- if (typeIsAllowed(args, targetType)) {
56
- args.collect();
57
- }
58
- else {
59
- args.error(ParseError.referenceIsIncorrectType);
60
- }
61
- };
62
- function parseSortableOp(args, value, op) {
63
- if (typeof value[op] !== 'object') {
64
- args.error(ParseError.incorrectFormat);
65
- return;
66
- }
67
- if (!args.fieldSchema.sortable) {
68
- args.error(ParseError.incorrectFieldType);
69
- return;
70
- }
71
- switch (typeof value[op].$idx) {
72
- case 'bigint':
73
- break;
74
- case 'number':
75
- value[op].$idx = BigInt(value[op].$idx);
76
- break;
77
- default:
78
- args.error(ParseError.incorrectFormat);
79
- return;
80
- }
81
- if (Array.isArray(value[op].$value)) {
82
- // NOP
83
- }
84
- else if (typeof value[op].$value === 'string') {
85
- value[op].$value = [value[op].$value];
86
- }
87
- else {
88
- args.error(ParseError.incorrectFormat);
89
- return;
90
- }
91
- }
92
- export const references = async (args) => {
93
- const { value } = args;
94
- if (typeof value !== 'object' || value === null) {
95
- args.error(ParseError.incorrectFormat);
96
- return;
97
- }
98
- args.stop();
99
- if (Array.isArray(value)) {
100
- const parseValues = await Promise.all(value.map(async (id, key) => {
101
- const n = args.create({
102
- value: id,
103
- key,
104
- skipCollection: true,
105
- });
106
- await reference(n);
107
- return n.value;
108
- }));
109
- args.value = { $value: parseValues };
110
- }
111
- else {
112
- for (const key in args.value) {
113
- if (key === '$add') {
114
- args.value.$add = await parseOperator(args, key);
115
- }
116
- else if (key === '$remove') {
117
- args.value.$remove = await parseOperator(args, key);
118
- }
119
- else if (key === '$assign') {
120
- parseSortableOp(args, value, '$assign');
121
- }
122
- else if (key === '$insert') {
123
- parseSortableOp(args, value, '$insert');
124
- }
125
- else if (key === '$move') {
126
- parseSortableOp(args, value, '$move');
127
- value.$move.$value.reverse();
128
- }
129
- else {
130
- args.create({ key }).error(ParseError.fieldDoesNotExist);
131
- }
132
- }
133
- }
134
- args.collect();
135
- };
136
- //# sourceMappingURL=references.js.map
@@ -1,2 +0,0 @@
1
- import { FieldParser } from '../../walker/index.js';
2
- export declare const set: FieldParser<'set'>;
@@ -1,59 +0,0 @@
1
- import { ParseError } from '../../error.js';
2
- async function parseOperator(args, key) {
3
- if (Array.isArray(args.value[key])) {
4
- const n = args.create({
5
- key,
6
- skipCollection: true,
7
- value: args.value[key],
8
- });
9
- await n.parse();
10
- if (n.value?.$value) {
11
- return n.value.$value;
12
- }
13
- return [];
14
- }
15
- const n = args.create({
16
- key,
17
- skipCollection: true,
18
- value: args.value[key],
19
- fieldSchema: args.fieldSchema.items,
20
- });
21
- await n.parse();
22
- return [n.value];
23
- }
24
- export const set = async (args) => {
25
- if (typeof args.value !== 'object' || args.value === null) {
26
- args.error(ParseError.incorrectFormat);
27
- return;
28
- }
29
- args.stop();
30
- const isArray = Array.isArray(args.value);
31
- if (isArray) {
32
- const newArgs = [];
33
- for (let i = 0; i < args.value.length; i++) {
34
- newArgs.push(args.create({
35
- key: i,
36
- value: args.value[i],
37
- fieldSchema: args.fieldSchema.items,
38
- skipCollection: true,
39
- }));
40
- }
41
- await Promise.all(newArgs.map((args) => args.parse()));
42
- args.value = { $value: newArgs.map((args) => args.value) };
43
- }
44
- else {
45
- for (const key in args.value) {
46
- if (key === '$add') {
47
- args.value.$add = await parseOperator(args, key);
48
- }
49
- else if (key === '$remove') {
50
- args.value.$remove = await parseOperator(args, key);
51
- }
52
- else {
53
- args.create({ key }).error(ParseError.fieldDoesNotExist);
54
- }
55
- }
56
- }
57
- args.collect();
58
- };
59
- //# sourceMappingURL=set.js.map
@@ -1,3 +0,0 @@
1
- import { FieldParser } from '../../walker/index.js';
2
- export declare const string: FieldParser<'string'>;
3
- export declare const text: FieldParser<'text'>;
@@ -1,289 +0,0 @@
1
- import { ParseError } from '../../error.js';
2
- import validators from 'validator';
3
- const formatPatterns = {
4
- email: validators.isEmail,
5
- URL: validators.isURL,
6
- MACAddress: validators.isMACAddress,
7
- IP: validators.isIP,
8
- IPRange: validators.isIPRange,
9
- FQDN: validators.isFQDN,
10
- IBAN: validators.isIBAN,
11
- BIC: validators.isBIC,
12
- alpha: validators.isAlpha,
13
- alphaLocales: validators.isAlphaLocales,
14
- alphanumeric: validators.isAlphanumeric,
15
- alphanumericLocales: validators.isAlphanumericLocales,
16
- passportNumber: validators.isPassportNumber,
17
- port: validators.isPort,
18
- lowercase: validators.isLowercase,
19
- uppercase: validators.isUppercase,
20
- ascii: validators.isAscii,
21
- semVer: validators.isSemVer,
22
- surrogatePair: validators.isSurrogatePair,
23
- IMEI: validators.isIMEI,
24
- hexadecimal: validators.isHexadecimal,
25
- octal: validators.isOctal,
26
- hexColor: validators.isHexColor,
27
- rgbColor: validators.isRgbColor,
28
- HSL: validators.isHSL,
29
- ISRC: validators.isISRC,
30
- MD5: validators.isMD5,
31
- JWT: validators.isJWT,
32
- UUID: validators.isUUID,
33
- luhnNumber: validators.isLuhnNumber,
34
- creditCard: validators.isCreditCard,
35
- identityCard: validators.isIdentityCard,
36
- EAN: validators.isEAN,
37
- ISIN: validators.isISIN,
38
- ISBN: validators.isISBN,
39
- ISSN: validators.isISSN,
40
- mobilePhone: validators.isMobilePhone,
41
- mobilePhoneLocales: validators.isMobilePhoneLocales,
42
- postalCode: validators.isPostalCode,
43
- postalCodeLocales: validators.isPostalCodeLocales,
44
- ethereumAddress: validators.isEthereumAddress,
45
- currency: validators.isCurrency,
46
- btcAddress: validators.isBtcAddress,
47
- ISO6391: validators.isISO6391,
48
- ISO8601: validators.isISO8601,
49
- RFC3339: validators.isRFC3339,
50
- ISO31661Alpha2: validators.isISO31661Alpha2,
51
- ISO31661Alpha3: validators.isISO31661Alpha3,
52
- ISO4217: validators.isISO4217,
53
- base32: validators.isBase32,
54
- base58: validators.isBase58,
55
- base64: validators.isBase64,
56
- dataURI: validators.isDataURI,
57
- magnetURI: validators.isMagnetURI,
58
- mimeType: validators.isMimeType,
59
- latLong: validators.isLatLong,
60
- slug: validators.isSlug,
61
- strongPassword: validators.isStrongPassword,
62
- taxID: validators.isTaxID,
63
- licensePlate: validators.isLicensePlate,
64
- VAT: validators.isVAT,
65
- code: () => true,
66
- javascript: () => true,
67
- typescript: () => true,
68
- python: () => true,
69
- rust: () => true,
70
- css: () => true,
71
- html: () => true,
72
- json: () => true,
73
- markdown: () => true,
74
- clike: () => true,
75
- // Can add some more checks for this...
76
- basedId: (value) => typeof value === 'string' && value.length < 16,
77
- basedType: (value) => typeof value === 'string' && value.length < 64,
78
- };
79
- const validateString = (args, value) => {
80
- if (typeof value !== 'string') {
81
- args.error(ParseError.incorrectFormat);
82
- return false;
83
- }
84
- if (args.fieldSchema.minLength && value.length < args.fieldSchema.minLength) {
85
- args.error(ParseError.subceedsMinimum);
86
- return false;
87
- }
88
- if (args.fieldSchema.maxLength && value.length > args.fieldSchema.maxLength) {
89
- args.error(ParseError.exceedsMaximum);
90
- return false;
91
- }
92
- if (args.fieldSchema.pattern) {
93
- const re = new RegExp(args.fieldSchema.pattern);
94
- if (!re.test(value)) {
95
- args.error(ParseError.incorrectFormat);
96
- return false;
97
- }
98
- }
99
- if (args.fieldSchema.format &&
100
- !formatPatterns[args.fieldSchema.format](value)) {
101
- args.error(ParseError.incorrectFormat);
102
- return false;
103
- }
104
- return true;
105
- };
106
- export const string = async (args) => {
107
- if (!validateString(args, args.value)) {
108
- return;
109
- }
110
- args.collect();
111
- };
112
- // --- bla
113
- // if typeof === string
114
- export const text = async (args) => {
115
- const value = args.value;
116
- args.stop();
117
- if (value === null) {
118
- args.error(ParseError.incorrectFormat);
119
- return;
120
- }
121
- if (typeof value === 'object') {
122
- for (const key in value) {
123
- if (key === '$merge') {
124
- if (typeof value.$merge !== 'boolean') {
125
- args.error(ParseError.incorrectFormat);
126
- return;
127
- }
128
- }
129
- else if (key === '$delete') {
130
- if (value[key] !== true) {
131
- args.error(ParseError.incorrectFormat);
132
- return;
133
- }
134
- args.collect({ $delete: true });
135
- return;
136
- }
137
- else if (key === '$value') {
138
- const valueArgs = args.create({
139
- path: args.path,
140
- value: args.value[key],
141
- });
142
- valueArgs._stopObject = true;
143
- await valueArgs.parse();
144
- }
145
- else if (key === '$default') {
146
- if (value[key] === null) {
147
- args.error(ParseError.incorrectFormat);
148
- return;
149
- }
150
- if (typeof value[key] === 'object') {
151
- for (const k in value[key]) {
152
- if (!validateString(args, args.value[key][k])) {
153
- args.error(ParseError.incorrectFormat);
154
- return;
155
- }
156
- args
157
- .create({
158
- key: k,
159
- fieldSchema: { type: 'string' },
160
- value: { $default: args.value[key][k] },
161
- })
162
- .collect();
163
- }
164
- }
165
- else if (typeof value[key] !== 'string') {
166
- args.error(ParseError.incorrectFormat);
167
- return;
168
- }
169
- else if (!args.target.$language) {
170
- args.error(ParseError.noLanguageFound);
171
- return;
172
- }
173
- else if (!validateString(args, value[key])) {
174
- args.error(ParseError.incorrectFormat);
175
- return;
176
- }
177
- else {
178
- args
179
- .create({
180
- fieldSchema: { type: 'string' },
181
- key: args.target.$language,
182
- value: { $default: args.value[key] },
183
- })
184
- .collect();
185
- }
186
- }
187
- else if ((args.schema.translations || [])
188
- .concat(args.schema.language)
189
- .includes(key)) {
190
- if (value[key] && typeof value[key] === 'object') {
191
- for (const k in value[key]) {
192
- if (k === '$delete') {
193
- if (value[key].$delete !== true) {
194
- args.error(ParseError.incorrectFormat);
195
- return;
196
- }
197
- args
198
- .create({
199
- key,
200
- fieldSchema: { type: 'string' },
201
- value: args.value[key],
202
- })
203
- .collect();
204
- }
205
- else if (k === '$value') {
206
- if (!validateString(args, value[key].$value)) {
207
- args.create({ key }).error(ParseError.incorrectFormat);
208
- }
209
- else {
210
- args
211
- .create({
212
- key,
213
- fieldSchema: { type: 'string' },
214
- value: args.value[key].$value,
215
- })
216
- .collect();
217
- }
218
- }
219
- else if (k === '$default') {
220
- if (!validateString(args, value[key].$default)) {
221
- args.create({ key }).error(ParseError.incorrectFormat);
222
- }
223
- else {
224
- args
225
- .create({
226
- key,
227
- fieldSchema: { type: 'string' },
228
- value: { $default: args.value[key].$default },
229
- })
230
- .collect();
231
- }
232
- }
233
- else {
234
- args
235
- .create({ path: [...args.path, key, k] })
236
- .error(ParseError.fieldDoesNotExist);
237
- return;
238
- }
239
- }
240
- }
241
- else {
242
- if (!validateString(args, args.value[key])) {
243
- args.error(ParseError.incorrectFormat);
244
- return;
245
- }
246
- args
247
- .create({
248
- key,
249
- fieldSchema: { type: 'string' },
250
- value: args.value[key],
251
- })
252
- .collect();
253
- }
254
- }
255
- else {
256
- args.create({ key }).error(ParseError.languageNotSupported);
257
- }
258
- }
259
- if (!args._stopObject) {
260
- args.collect();
261
- }
262
- return;
263
- }
264
- if (typeof value !== 'string') {
265
- args.error(ParseError.incorrectFormat);
266
- return;
267
- }
268
- if (!args.target.$language) {
269
- args.error(ParseError.noLanguageFound);
270
- return;
271
- }
272
- if (!validateString(args, args.value)) {
273
- args.error(ParseError.incorrectFormat);
274
- return;
275
- }
276
- args
277
- .create({
278
- value,
279
- key: args.target.$language,
280
- fieldSchema: { type: 'string' },
281
- })
282
- .collect();
283
- if (!args._stopObject) {
284
- args.collect({
285
- [args.target.$language]: value,
286
- });
287
- }
288
- };
289
- //# sourceMappingURL=string.js.map
@@ -1,3 +0,0 @@
1
- import { BasedSchema, BasedSetTarget } from '../types.js';
2
- import { AsyncOperation } from '../walker/index.js';
3
- export declare const setWalker: (schema: BasedSchema, value: any, asyncOperationHandler?: AsyncOperation<BasedSetTarget>) => Promise<BasedSetTarget>;