@based/schema 0.0.5 → 0.0.7

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 (48) hide show
  1. package/dist/set/collections.d.ts +5 -0
  2. package/dist/set/collections.js +123 -0
  3. package/dist/set/collections.js.map +1 -0
  4. package/dist/set/error.d.ts +10 -0
  5. package/dist/set/error.js +19 -0
  6. package/dist/set/error.js.map +1 -0
  7. package/dist/set/index.d.ts +1 -1
  8. package/dist/set/index.js +13 -17
  9. package/dist/set/index.js.map +1 -1
  10. package/dist/set/number copy.d.ts +4 -0
  11. package/dist/set/number copy.js +57 -0
  12. package/dist/set/number copy.js.map +1 -0
  13. package/dist/set/number.d.ts +4 -0
  14. package/dist/set/number.js +98 -0
  15. package/dist/set/number.js.map +1 -0
  16. package/dist/set/parsers.d.ts +2 -5
  17. package/dist/set/parsers.js +35 -357
  18. package/dist/set/parsers.js.map +1 -1
  19. package/dist/set/references.d.ts +3 -0
  20. package/dist/set/references.js +77 -0
  21. package/dist/set/references.js.map +1 -0
  22. package/dist/set/rest copy.d.ts +5 -0
  23. package/dist/set/rest copy.js +53 -0
  24. package/dist/set/rest copy.js.map +1 -0
  25. package/dist/set/rest.d.ts +5 -0
  26. package/dist/set/rest.js +57 -0
  27. package/dist/set/rest.js.map +1 -0
  28. package/dist/set/string.d.ts +3 -0
  29. package/dist/set/string.js +149 -0
  30. package/dist/set/string.js.map +1 -0
  31. package/dist/set/types.d.ts +5 -0
  32. package/dist/set/types.js +3 -0
  33. package/dist/set/types.js.map +1 -0
  34. package/dist/types.d.ts +36 -17
  35. package/dist/types.js.map +1 -1
  36. package/package.json +3 -1
  37. package/src/set/collections.ts +215 -0
  38. package/src/set/error.ts +17 -0
  39. package/src/set/index.ts +14 -21
  40. package/src/set/number.ts +136 -0
  41. package/src/set/parsers.ts +17 -553
  42. package/src/set/references.ts +107 -0
  43. package/src/set/rest.ts +83 -0
  44. package/src/set/string.ts +184 -0
  45. package/src/set/types.ts +20 -0
  46. package/src/types.ts +105 -20
  47. package/test/setWalker.ts +23 -7
  48. package/src/set/handleError.ts +0 -15
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.text = exports.string = void 0;
7
+ const error_1 = require("./error");
8
+ const validator_1 = __importDefault(require("validator"));
9
+ const formatPatterns = {
10
+ email: validator_1.default.isEmail,
11
+ URL: validator_1.default.isURL,
12
+ MACAddress: validator_1.default.isMACAddress,
13
+ IP: validator_1.default.isIP,
14
+ IPRange: validator_1.default.isIPRange,
15
+ FQDN: validator_1.default.isFQDN,
16
+ IBAN: validator_1.default.isIBAN,
17
+ BIC: validator_1.default.isBIC,
18
+ alpha: validator_1.default.isAlpha,
19
+ alphaLocales: validator_1.default.isAlphaLocales,
20
+ alphanumeric: validator_1.default.isAlphanumeric,
21
+ alphanumericLocales: validator_1.default.isAlphanumericLocales,
22
+ passportNumber: validator_1.default.isPassportNumber,
23
+ port: validator_1.default.isPort,
24
+ lowercase: validator_1.default.isLowercase,
25
+ uppercase: validator_1.default.isUppercase,
26
+ ascii: validator_1.default.isAscii,
27
+ semVer: validator_1.default.isSemVer,
28
+ surrogatePair: validator_1.default.isSurrogatePair,
29
+ IMEI: validator_1.default.isIMEI,
30
+ hexadecimal: validator_1.default.isHexadecimal,
31
+ octal: validator_1.default.isOctal,
32
+ hexColor: validator_1.default.isHexColor,
33
+ rgbColor: validator_1.default.isRgbColor,
34
+ HSL: validator_1.default.isHSL,
35
+ ISRC: validator_1.default.isISRC,
36
+ MD5: validator_1.default.isMD5,
37
+ JWT: validator_1.default.isJWT,
38
+ UUID: validator_1.default.isUUID,
39
+ luhnNumber: validator_1.default.isLuhnNumber,
40
+ creditCard: validator_1.default.isCreditCard,
41
+ identityCard: validator_1.default.isIdentityCard,
42
+ EAN: validator_1.default.isEAN,
43
+ ISIN: validator_1.default.isISIN,
44
+ ISBN: validator_1.default.isISBN,
45
+ ISSN: validator_1.default.isISSN,
46
+ mobilePhone: validator_1.default.isMobilePhone,
47
+ mobilePhoneLocales: validator_1.default.isMobilePhoneLocales,
48
+ postalCode: validator_1.default.isPostalCode,
49
+ postalCodeLocales: validator_1.default.isPostalCodeLocales,
50
+ ethereumAddress: validator_1.default.isEthereumAddress,
51
+ currency: validator_1.default.isCurrency,
52
+ btcAddress: validator_1.default.isBtcAddress,
53
+ ISO6391: validator_1.default.isISO6391,
54
+ ISO8601: validator_1.default.isISO8601,
55
+ RFC3339: validator_1.default.isRFC3339,
56
+ ISO31661Alpha2: validator_1.default.isISO31661Alpha2,
57
+ ISO31661Alpha3: validator_1.default.isISO31661Alpha3,
58
+ ISO4217: validator_1.default.isISO4217,
59
+ base32: validator_1.default.isBase32,
60
+ base58: validator_1.default.isBase58,
61
+ base64: validator_1.default.isBase64,
62
+ dataURI: validator_1.default.isDataURI,
63
+ magnetURI: validator_1.default.isMagnetURI,
64
+ mimeType: validator_1.default.isMimeType,
65
+ latLong: validator_1.default.isLatLong,
66
+ slug: validator_1.default.isSlug,
67
+ strongPassword: validator_1.default.isStrongPassword,
68
+ taxID: validator_1.default.isTaxID,
69
+ licensePlate: validator_1.default.isLicensePlate,
70
+ VAT: validator_1.default.isVAT,
71
+ };
72
+ const validate = (path, value, fieldSchema) => {
73
+ if (typeof value !== 'string') {
74
+ (0, error_1.error)(path, error_1.ParseError.incorrectFormat);
75
+ }
76
+ if (fieldSchema.minLength && value.length < fieldSchema.minLength) {
77
+ (0, error_1.error)(path, error_1.ParseError.subceedsMinimum);
78
+ }
79
+ if (fieldSchema.maxLength && value.length > fieldSchema.maxLength) {
80
+ (0, error_1.error)(path, error_1.ParseError.exceedsMaximum);
81
+ }
82
+ if (fieldSchema.pattern) {
83
+ const re = new RegExp(fieldSchema.pattern);
84
+ if (!re.test(value)) {
85
+ (0, error_1.error)(path, error_1.ParseError.incorrectFormat);
86
+ }
87
+ }
88
+ if (fieldSchema.format && !formatPatterns[fieldSchema.format](value)) {
89
+ (0, error_1.error)(path, error_1.ParseError.incorrectFormat);
90
+ }
91
+ };
92
+ const string = async (path, value, fieldSchema, typeSchema, target, handlers, noCollect) => {
93
+ validate(path, value, fieldSchema);
94
+ if (!noCollect) {
95
+ handlers.collect({ path, value, typeSchema, fieldSchema, target });
96
+ }
97
+ };
98
+ exports.string = string;
99
+ const text = async (path, value, fieldSchema, typeSchema, target, handlers, noCollect) => {
100
+ const valueType = typeof value;
101
+ if (target.$language && valueType === 'string') {
102
+ validate(path, value, fieldSchema);
103
+ if (!noCollect) {
104
+ handlers.collect({
105
+ path,
106
+ value: { [target.$language]: value },
107
+ typeSchema,
108
+ fieldSchema,
109
+ target,
110
+ });
111
+ }
112
+ return;
113
+ }
114
+ if (valueType !== 'object') {
115
+ (0, error_1.error)(path, error_1.ParseError.incorrectFormat);
116
+ }
117
+ for (const key in value) {
118
+ const newPath = [...path, key];
119
+ if (typeof value[key] === 'object') {
120
+ if (value[key].$value) {
121
+ (0, exports.text)([...path, key, '$value'], value[key].$value, fieldSchema, typeSchema, target, handlers, true);
122
+ }
123
+ // if (value[key].$default) {
124
+ // }
125
+ if (!noCollect) {
126
+ handlers.collect({
127
+ path: newPath,
128
+ value: null,
129
+ typeSchema,
130
+ fieldSchema,
131
+ target,
132
+ });
133
+ }
134
+ continue;
135
+ }
136
+ validate(newPath, value[key], fieldSchema);
137
+ if (!noCollect) {
138
+ handlers.collect({
139
+ path: newPath,
140
+ value: value[key],
141
+ typeSchema,
142
+ fieldSchema,
143
+ target,
144
+ });
145
+ }
146
+ }
147
+ };
148
+ exports.text = text;
149
+ //# sourceMappingURL=string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/set/string.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { BasedSchemaType, BasedSetHandlers, BasedSetTarget, BasedSchemaFields } from '../types';
2
+ export type Parser<K extends keyof BasedSchemaFields> = (path: (string | number)[], value: any, fieldSchema: BasedSchemaFields[K], typeSchema: BasedSchemaType, target: BasedSetTarget, handlers: BasedSetHandlers, noCollect?: boolean) => Promise<void>;
3
+ export type Parsers = {
4
+ [Key in keyof BasedSchemaFields]: Parser<Key>;
5
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/set/types.ts"],"names":[],"mappings":""}
package/dist/types.d.ts CHANGED
@@ -4,19 +4,27 @@ export type AllowedTypes = (string | {
4
4
  type?: string;
5
5
  $filter: any | any[];
6
6
  })[];
7
- export type BasedSchemaFieldType = 'array' | 'object' | 'record' | 'set' | 'string' | 'boolean' | 'number' | 'float' | 'json' | 'integer' | 'timestamp' | 'reference' | 'references' | 'text' | 'hyperloglog';
7
+ export type BasedSchemaFieldType = 'array' | 'object' | 'record' | 'set' | 'string' | 'boolean' | 'number' | 'json' | 'integer' | 'timestamp' | 'reference' | 'references' | 'text' | 'cardinality';
8
8
  export declare const isCollection: (type: string) => boolean;
9
9
  export type BasedSchemaPattern = string;
10
10
  export type BasedSchemaLanguage = Language;
11
11
  export type BasedSchemaTypePrefix = string;
12
12
  export type BasedSchemaContentMediaType = 'text/html' | 'text/plain' | 'text/markdown' | 'image/png' | 'image/jpeg' | 'video/mp4' | string;
13
13
  export type BasedSchemaFieldShared = {
14
+ hooks?: {
15
+ interval?: number;
16
+ hook: string;
17
+ } | {
18
+ interval?: number;
19
+ hook: string;
20
+ }[];
14
21
  type?: BasedSchemaFieldType;
15
22
  $id?: string;
16
23
  $schema?: string;
17
24
  isRequired?: boolean;
18
25
  title?: string;
19
26
  description?: string;
27
+ index?: number;
20
28
  readOnly?: boolean;
21
29
  writeOnly?: boolean;
22
30
  $comment?: string;
@@ -27,21 +35,20 @@ export type BasedSchemaFieldShared = {
27
35
  [key: string]: BasedSchemaField;
28
36
  };
29
37
  };
30
- export type BasedSchemaFieldString = {
31
- type: 'string';
38
+ export type BasedSchemaStringShared = {
32
39
  minLength?: number;
33
40
  maxLength?: number;
34
41
  contentMediaEncoding?: string;
35
42
  contentMediaType?: BasedSchemaContentMediaType;
36
43
  pattern?: BasedSchemaPattern;
37
- format?: 'email' | 'hostname' | 'ipv4' | 'ipv6' | 'uuid' | 'uri';
38
- } & BasedSchemaFieldShared;
44
+ format?: 'email' | 'URL' | 'MACAddress' | 'IP' | 'IPRange' | 'FQDN' | 'IBAN' | 'BIC' | 'alpha' | 'alphaLocales' | 'alphanumeric' | 'alphanumericLocales' | 'passportNumber' | 'port' | 'lowercase' | 'uppercase' | 'ascii' | 'semVer' | 'surrogatePair' | 'IMEI' | 'hexadecimal' | 'octal' | 'hexColor' | 'rgbColor' | 'HSL' | 'ISRC' | 'MD5' | 'JWT' | 'UUID' | 'luhnNumber' | 'creditCard' | 'identityCard' | 'EAN' | 'ISIN' | 'ISBN' | 'ISSN' | 'mobilePhone' | 'mobilePhoneLocales' | 'postalCode' | 'postalCodeLocales' | 'ethereumAddress' | 'currency' | 'btcAddress' | 'ISO6391' | 'ISO8601' | 'RFC3339' | 'ISO31661Alpha2' | 'ISO31661Alpha3' | 'ISO4217' | 'base32' | 'base58' | 'base64' | 'dataURI' | 'magnetURI' | 'mimeType' | 'latLong' | 'slug' | 'strongPassword' | 'taxID' | 'licensePlate' | 'VAT';
45
+ };
46
+ export type BasedSchemaFieldString = {
47
+ type: 'string';
48
+ } & BasedSchemaFieldShared & BasedSchemaStringShared;
39
49
  export type BasedSchemaFieldEnum = {
40
50
  enum: any[];
41
51
  } & BasedSchemaFieldShared;
42
- export type BasedSchemaFieldConst = {
43
- const: any;
44
- } & BasedSchemaFieldShared;
45
52
  type NumberDefaults = {
46
53
  multipleOf?: number;
47
54
  minimum?: number;
@@ -52,8 +59,8 @@ type NumberDefaults = {
52
59
  export type BasedSchemaFieldNumber = NumberDefaults & {
53
60
  type: 'number';
54
61
  };
55
- export type BasedSchemaFieldHyperLogLog = {
56
- type: 'hyperloglog';
62
+ export type BasedSchemaFieldCardinality = {
63
+ type: 'cardinality';
57
64
  };
58
65
  export type BasedSchemaFieldInteger = NumberDefaults & {
59
66
  type: 'integer';
@@ -71,12 +78,7 @@ export type BasedSchemaFieldPrimitive = BasedSchemaFieldString | BasedSchemaFiel
71
78
  export type BasedSchemaFieldText = {
72
79
  type: 'text';
73
80
  required?: BasedSchemaLanguage[];
74
- contentMediaType?: BasedSchemaContentMediaType;
75
- minLength?: number;
76
- maxLength?: number;
77
- contentMediaEncoding?: string;
78
- pattern?: BasedSchemaPattern;
79
- } & BasedSchemaFieldShared;
81
+ } & BasedSchemaFieldShared & BasedSchemaStringShared;
80
82
  export type BasedSchemaFieldObject = {
81
83
  type: 'object';
82
84
  properties: {
@@ -111,11 +113,28 @@ export type BasedSchemaFieldReferences = {
111
113
  };
112
114
  allowedTypes?: AllowedTypes;
113
115
  } & BasedSchemaFieldShared;
114
- export type BasedSchemaField = BasedSchemaFieldEnumerable | BasedSchemaFieldPrimitive | BasedSchemaFieldReference | BasedSchemaFieldReferences | BasedSchemaFieldHyperLogLog | {
116
+ export type BasedSchemaField = BasedSchemaFieldEnumerable | BasedSchemaFieldPrimitive | BasedSchemaFieldReference | BasedSchemaFieldReferences | BasedSchemaFieldCardinality | {
115
117
  type?: BasedSchemaFieldType;
116
118
  isRequired?: boolean;
117
119
  $ref: string;
118
120
  };
121
+ export type BasedSchemaFields = {
122
+ enum: BasedSchemaFieldEnum;
123
+ array: BasedSchemaFieldArray;
124
+ object: BasedSchemaFieldObject;
125
+ set: BasedSchemaFieldSet;
126
+ record: BasedSchemaFieldRecord;
127
+ string: BasedSchemaFieldString;
128
+ boolean: BasedSchemaFieldBoolean;
129
+ number: BasedSchemaFieldNumber;
130
+ json: BasedSchemaFieldJSON;
131
+ integer: BasedSchemaFieldInteger;
132
+ timestamp: BasedSchemaFieldTimeStamp;
133
+ reference: BasedSchemaFieldReference;
134
+ references: BasedSchemaFieldReferences;
135
+ text: BasedSchemaFieldText;
136
+ cardinality: BasedSchemaFieldCardinality;
137
+ };
119
138
  export type BasedSchemaType = {
120
139
  fields: {
121
140
  [name: string]: BasedSchemaField;
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAuCO,MAAM,YAAY,GAAG,CAAC,IAAY,EAAW,EAAE;IACpD,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,CAAA;AACnE,CAAC,CAAA;AAFY,QAAA,YAAY,gBAExB"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAsCO,MAAM,YAAY,GAAG,CAAC,IAAY,EAAW,EAAE;IACpD,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,CAAA;AACnE,CAAC,CAAA;AAFY,QAAA,YAAY,gBAExB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@based/schema",
3
- "version": "0.0.5",
3
+ "version": "0.0.7",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -11,6 +11,8 @@
11
11
  },
12
12
  "sideEffects": false,
13
13
  "dependencies": {
14
+ "validator": "^13.9.0",
15
+ "@saulx/hash": "^2.0.0",
14
16
  "@saulx/utils": "^3.2.2"
15
17
  },
16
18
  "ava": {
@@ -0,0 +1,215 @@
1
+ import { Parser } from './types'
2
+ import { error, ParseError } from './error'
3
+ import { fieldWalker } from '.'
4
+
5
+ export const set: Parser<'set'> = async (
6
+ path,
7
+ value,
8
+ fieldSchema,
9
+ typeSchema,
10
+ target,
11
+ handlers,
12
+ noCollect
13
+ ) => {
14
+ const q: Promise<void>[] = []
15
+ const fieldDef = fieldSchema.items
16
+ if (Array.isArray(value)) {
17
+ const parsedArray = []
18
+ for (let i = 0; i < value.length; i++) {
19
+ q.push(
20
+ fieldWalker([...path, i], value[i], fieldDef, typeSchema, target, {
21
+ ...handlers,
22
+ collect: ({ value }) => {
23
+ parsedArray.push(value)
24
+ },
25
+ })
26
+ )
27
+ }
28
+ await Promise.all(q)
29
+ if (!noCollect) {
30
+ handlers.collect({
31
+ path,
32
+ value: { $value: parsedArray },
33
+ typeSchema,
34
+ fieldSchema,
35
+ target,
36
+ })
37
+ }
38
+ } else {
39
+ if (value.$add) {
40
+ for (let i = 0; i < value.$add.length; i++) {
41
+ q.push(
42
+ fieldWalker(
43
+ [...path, '$add', i],
44
+ value.$add[i],
45
+ fieldDef,
46
+ typeSchema,
47
+ target,
48
+ handlers,
49
+ true
50
+ )
51
+ )
52
+ }
53
+ }
54
+ if (value.$delete) {
55
+ for (let i = 0; i < value.$add.length; i++) {
56
+ q.push(
57
+ fieldWalker(
58
+ [...path, '$delete', i],
59
+ value.$delete[i],
60
+ fieldDef,
61
+ typeSchema,
62
+ target,
63
+ handlers,
64
+ true
65
+ )
66
+ )
67
+ }
68
+ }
69
+ await Promise.all(q)
70
+ if (!noCollect) {
71
+ handlers.collect({ path, value, typeSchema, fieldSchema, target })
72
+ }
73
+ }
74
+ }
75
+
76
+ export const object: Parser<'object'> = async (
77
+ path,
78
+ value,
79
+ fieldSchema,
80
+ typeSchema,
81
+ target,
82
+ handlers,
83
+ noCollect
84
+ ) => {
85
+ if (typeof value !== 'object') {
86
+ error(path, ParseError.incorrectFormat)
87
+ }
88
+ const isArray = Array.isArray(value)
89
+ if (isArray) {
90
+ error(path, ParseError.incorrectFormat)
91
+ }
92
+ const q: Promise<void>[] = []
93
+ for (const key in value) {
94
+ const propDef = fieldSchema.properties[key]
95
+ if (!propDef) {
96
+ error([...path, key], ParseError.fieldDoesNotExist)
97
+ }
98
+ q.push(
99
+ fieldWalker(
100
+ [...path, key],
101
+ value[key],
102
+ propDef,
103
+ typeSchema,
104
+ target,
105
+ handlers,
106
+ noCollect
107
+ )
108
+ )
109
+ }
110
+ await Promise.all(q)
111
+ }
112
+
113
+ export const array: Parser<'array'> = async (
114
+ path,
115
+ value,
116
+ fieldSchema,
117
+ typeSchema,
118
+ target,
119
+ handlers,
120
+ noCollect
121
+ ) => {
122
+ const isArray = Array.isArray(value)
123
+ if (typeof value === 'object' && !isArray) {
124
+ if (value.$insert) {
125
+ if (
126
+ typeof value.$insert !== 'object' ||
127
+ value.$insert.$idx === undefined
128
+ ) {
129
+ error([...path, '$insert'], ParseError.incorrectFormat)
130
+ } else {
131
+ const insert = Array.isArray(value.$insert.$value)
132
+ ? value.$insert.$value
133
+ : [value.$insert.$value]
134
+ const q: Promise<void>[] = []
135
+ for (let i = 0; i < insert.length; i++) {
136
+ q.push(
137
+ fieldWalker(
138
+ [...path, 'insert', i],
139
+ insert[i],
140
+ fieldSchema.values,
141
+ typeSchema,
142
+ target,
143
+ handlers,
144
+ true
145
+ )
146
+ )
147
+ }
148
+ await Promise.all(q)
149
+ }
150
+ }
151
+ if (value.$remove && value.$remove.$idx === undefined) {
152
+ error([...path, '$remove'], ParseError.incorrectFormat)
153
+ }
154
+ if (value.$push) {
155
+ const q: Promise<void>[] = []
156
+ const push = Array.isArray(value.$push) ? value.$push : [value.$push]
157
+ for (let i = 0; i < push.length; i++) {
158
+ q.push(
159
+ fieldWalker(
160
+ [...path, i],
161
+ push[i],
162
+ fieldSchema.values,
163
+ typeSchema,
164
+ target,
165
+ handlers,
166
+ true
167
+ )
168
+ )
169
+ }
170
+ await Promise.all(q)
171
+ }
172
+ if (value.$assign) {
173
+ if (
174
+ typeof value.$assign !== 'object' ||
175
+ value.$assign.$idx === undefined
176
+ ) {
177
+ error([...path, '$assign'], ParseError.incorrectFormat)
178
+ } else {
179
+ await fieldWalker(
180
+ [...path, '$assign', '$value'],
181
+ value.$assign.$value,
182
+ fieldSchema.values,
183
+ typeSchema,
184
+ target,
185
+ handlers,
186
+ true
187
+ )
188
+ }
189
+ }
190
+ if (!noCollect) {
191
+ handlers.collect({ path, value, typeSchema, fieldSchema, target })
192
+ }
193
+ return
194
+ }
195
+ if (!isArray) {
196
+ error(path, ParseError.incorrectFieldType)
197
+ }
198
+ const q: Promise<void>[] = []
199
+ for (let i = 0; i < value.length; i++) {
200
+ q.push(
201
+ fieldWalker(
202
+ [...path, i],
203
+ value[i],
204
+ fieldSchema.values,
205
+ typeSchema,
206
+ target,
207
+ handlers,
208
+ noCollect
209
+ )
210
+ )
211
+ }
212
+ await Promise.all(q)
213
+ }
214
+
215
+ export const record: Parser<'record'> = async (path, value, fieldSchema) => {}
@@ -0,0 +1,17 @@
1
+ export enum ParseError {
2
+ 'incorrectFieldType',
3
+ 'incorrectNodeType',
4
+ 'exceedsMaximum',
5
+ 'subceedsMinimum',
6
+ 'fieldDoesNotExist',
7
+ 'incorrectFormat',
8
+ 'referenceIsIncorrectType',
9
+ }
10
+
11
+ export const error = (
12
+ path: (number | string)[],
13
+ error: ParseError,
14
+ type?: string // nice to give as option
15
+ ) => {
16
+ throw new Error(`Field: "${path.join('.')}" ${ParseError[error]}`)
17
+ }
package/src/set/index.ts CHANGED
@@ -5,20 +5,17 @@ import {
5
5
  BasedSchema,
6
6
  BasedSetTarget,
7
7
  } from '../types'
8
- import { createError } from './handleError'
8
+ import { error, ParseError } from './error'
9
9
  import parsers from './parsers'
10
10
 
11
- // Collect is a pretty good place for checking if a user is allowed to set something
12
- // also make collect async
13
- // add extra function for loading required
14
-
15
11
  export const fieldWalker = async (
16
12
  path: (string | number)[],
17
13
  value: any,
18
14
  fieldSchema: BasedSchemaField,
19
15
  typeSchema: BasedSchemaType,
20
16
  target: BasedSetTarget,
21
- handlers: BasedSetHandlers
17
+ handlers: BasedSetHandlers,
18
+ noCollect?: boolean
22
19
  ): Promise<void> => {
23
20
  if ('$ref' in fieldSchema) {
24
21
  // TODO: when we have this it has to get it from the schema and redo the parsing with the correct fieldSchema
@@ -28,26 +25,28 @@ export const fieldWalker = async (
28
25
 
29
26
  const valueIsObject = value && valueType === 'object'
30
27
  if (valueIsObject && value.$delete === true) {
31
- handlers.collect({ path, value, typeSchema, fieldSchema, target })
28
+ if (!noCollect) {
29
+ handlers.collect({ path, value, typeSchema, fieldSchema, target })
30
+ }
32
31
  return
33
32
  }
34
33
 
35
34
  const typeDef = fieldSchema.type ?? ('enum' in fieldSchema ? 'enum' : '')
36
35
 
37
36
  if (!typeDef) {
38
- throw createError(path, target.type, typeDef, path[path.length - 1])
37
+ error(path, ParseError.fieldDoesNotExist)
39
38
  }
40
39
 
41
40
  if ('customValidator' in fieldSchema) {
42
41
  const customValidator = fieldSchema.customValidator
43
42
  if (!(await customValidator(value, path, target))) {
44
- throw createError(path, target.type, typeDef, value)
43
+ error(path, ParseError.incorrectFormat)
45
44
  }
46
45
  }
47
46
 
48
47
  const parse = parsers[typeDef]
49
48
 
50
- await parse(path, value, fieldSchema, typeSchema, target, handlers)
49
+ await parse(path, value, fieldSchema, typeSchema, target, handlers, noCollect)
51
50
 
52
51
  return
53
52
  }
@@ -62,15 +61,13 @@ export const setWalker = async (
62
61
  if (value.$id) {
63
62
  type = schema.prefixToTypeMapping[value.$id.slice(0, 2)]
64
63
  if (!type) {
65
- throw new Error(`Cannot find type for $id ${value.$id}`)
64
+ error([value.$id], ParseError.incorrectNodeType)
66
65
  }
67
66
  }
68
67
 
69
68
  if (value.type) {
70
69
  if (type && value.type !== type) {
71
- throw new Error(
72
- `type from "$id" ${value.$id} does not match "type" field ${value.type}`
73
- )
70
+ error([value.$id, value.type], ParseError.incorrectNodeType)
74
71
  }
75
72
  type = value.type
76
73
  }
@@ -78,7 +75,7 @@ export const setWalker = async (
78
75
  const schemaType = schema.types[type]
79
76
 
80
77
  if (!schemaType) {
81
- throw new Error(`Cannot find schema definition for type ${type}`)
78
+ error([type], ParseError.incorrectNodeType)
82
79
  }
83
80
 
84
81
  const target: BasedSetTarget = {
@@ -95,14 +92,10 @@ export const setWalker = async (
95
92
  const q: Promise<void>[] = []
96
93
 
97
94
  for (const key in value) {
98
- if (key[0] === '$') {
99
- console.info('key is operator', key)
100
- } else {
95
+ if (key[0] !== '$') {
101
96
  const fieldSchema = schemaType.fields[key]
102
97
  if (!fieldSchema) {
103
- throw new Error(
104
- `Field does not exist in schema "${key}" on type "${type}"`
105
- )
98
+ error([key], ParseError.fieldDoesNotExist)
106
99
  } else {
107
100
  q.push(
108
101
  fieldWalker(