@syncbridge/common 0.12.4 → 0.12.5

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.
package/constants.js CHANGED
@@ -1,4 +1,4 @@
1
- export const version = '0.12.4';
1
+ export const version = '0.12.5';
2
2
  export const CLASS_METADATA = Symbol.for('CLASS_METADATA');
3
3
  export const CLASS_TYPE = Symbol.for('CLASS_TYPE');
4
4
  export const VARIABLE_CONTAINER = Symbol.for('VARIABLE_CONTAINER');
@@ -22,6 +22,7 @@ export declare class VariableMetadata {
22
22
  format?: VariableFormat;
23
23
  enumValues?: (string | number)[];
24
24
  isArray?: boolean;
25
+ nullable?: boolean;
25
26
  minOccurs?: number;
26
27
  maxOccurs?: number;
27
28
  required?: boolean;
@@ -92,6 +92,12 @@ __decorate([
92
92
  }),
93
93
  __metadata("design:type", Boolean)
94
94
  ], VariableMetadata.prototype, "isArray", void 0);
95
+ __decorate([
96
+ ApiField({
97
+ description: 'Determines if "null" values is allowed',
98
+ }),
99
+ __metadata("design:type", Boolean)
100
+ ], VariableMetadata.prototype, "nullable", void 0);
95
101
  __decorate([
96
102
  ApiField({
97
103
  description: 'Minimum number of items in the array. Available if isArray is true',
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@syncbridge/common",
3
- "version": "0.12.4",
3
+ "version": "0.12.5",
4
4
  "description": "SyncBridge Common utilities",
5
5
  "author": "Panates Inc",
6
6
  "license": "MIT",
7
7
  "dependencies": {
8
- "@jsopen/objects": "^2.2.1",
8
+ "@jsopen/objects": "^2.2.2",
9
9
  "fast-deep-equal": "^3.1.3",
10
10
  "node-events-async": "^1.5.2",
11
11
  "caller-callsite": "^6.0.0",
@@ -149,71 +149,77 @@ function _decodeVariables(stackExecutor, codec, metadata, profile, options) {
149
149
  stackExecutor.execute(k, () => {
150
150
  if (defVariable == null)
151
151
  return;
152
- const fns = [];
153
- if (defVariable.ignored) {
154
- if (defVariable.default === undefined)
152
+ let valueFn = isAny;
153
+ /* If variable is ignored and no default value is set, field should be undefined */
154
+ if (defVariable.ignored && defVariable.default === undefined) {
155
+ target[k] = vg.isUndefined({ coerce: true });
156
+ return;
157
+ }
158
+ /* If variable is ignored and a default value is set, field should be set to default value */
159
+ if (defVariable.ignored && defVariable.default !== undefined) {
160
+ if (defVariable.default === null) {
161
+ target[k] = null;
155
162
  return;
156
- fns.push(vg.fixed(defVariable.default));
163
+ }
164
+ valueFn = vg.fixed(defVariable.default);
157
165
  }
158
166
  switch (defVariable.type) {
159
167
  case VariableType.String: {
160
168
  switch (defVariable.format) {
161
169
  case 'hex':
162
- fns.push(isHex);
170
+ valueFn = isHex;
163
171
  break;
164
172
  case 'base64':
165
- fns.push(isBase64);
173
+ valueFn = isBase64;
166
174
  break;
167
175
  case 'url':
168
- fns.push(isURL);
176
+ valueFn = isURL;
169
177
  break;
170
178
  case 'email':
171
- fns.push(isEmail);
179
+ valueFn = isEmail;
172
180
  break;
173
181
  case 'date':
174
- fns.push(vg.isDateString({
182
+ valueFn = vg.isDateString({
175
183
  precisionMin: 'day',
176
184
  precisionMax: 'day',
177
185
  trim: true,
178
- }));
186
+ });
179
187
  break;
180
188
  case 'date-time':
181
- fns.push(isDateString);
189
+ valueFn = isDateString;
182
190
  break;
183
191
  case 'time':
184
- fns.push(isTime);
192
+ valueFn = isTime;
185
193
  break;
186
194
  default:
187
- fns.push(isString);
195
+ valueFn = isString;
188
196
  }
189
- if (defVariable.pattern)
190
- fns.push(vg.matches(defVariable.pattern));
191
197
  break;
192
198
  }
193
199
  case VariableType.Secret: {
194
- fns.push(isString);
200
+ valueFn = isString;
195
201
  if (options?.cryptoSecretKey) {
196
202
  if (codec === 'decode')
197
- fns.push(secretDecryptor(options.cryptoSecretKey));
203
+ valueFn = secretDecryptor(options.cryptoSecretKey);
198
204
  else
199
- fns.push(secretEncryptor(options.cryptoSecretKey));
205
+ valueFn = secretEncryptor(options.cryptoSecretKey);
200
206
  }
201
207
  break;
202
208
  }
203
209
  case VariableType.Number: {
204
- fns.push(isNumber);
210
+ valueFn = isNumber;
205
211
  break;
206
212
  }
207
213
  case VariableType.BigInt: {
208
- fns.push(isBigint);
214
+ valueFn = isBigint;
209
215
  break;
210
216
  }
211
217
  case VariableType.Boolean: {
212
- fns.push(isBoolean);
218
+ valueFn = isBoolean;
213
219
  break;
214
220
  }
215
221
  case VariableType.Enum: {
216
- fns.push(vg.isEnum(defVariable.enumValues));
222
+ valueFn = vg.isEnum(defVariable.enumValues);
217
223
  break;
218
224
  }
219
225
  case VariableType.Nested: {
@@ -221,50 +227,61 @@ function _decodeVariables(stackExecutor, codec, metadata, profile, options) {
221
227
  delete target[k];
222
228
  }
223
229
  else {
224
- fns.push(validator(old => {
230
+ valueFn = validator(old => {
225
231
  if (!old)
226
232
  return;
227
233
  const v = {};
228
234
  process(defVariable.variables, v, old);
229
235
  return v;
230
- }));
231
- // fns.push(isAny);
236
+ });
232
237
  }
233
238
  break;
234
239
  }
235
- default:
236
- fns.push(isAny);
237
240
  }
241
+ /* */
242
+ let hasDefault = false;
243
+ if (defVariable.default !== undefined &&
244
+ (options?.setDefaultValues ?? true)) {
245
+ hasDefault = true;
246
+ valueFn = vg.required(valueFn, { default: defVariable.default });
247
+ }
248
+ /* Validation rules for each data value */
238
249
  if (codec === 'decode') {
250
+ const fns = [];
251
+ if (defVariable.type === VariableType.String) {
252
+ if (defVariable.pattern)
253
+ fns.push(vg.matches(defVariable.pattern));
254
+ }
239
255
  if (defVariable.minValue)
240
256
  fns.push(vg.isGte(defVariable.minValue));
241
257
  if (defVariable.maxValue)
242
258
  fns.push(vg.isLt(defVariable.maxValue));
259
+ if (fns.length)
260
+ valueFn =
261
+ fns.length > 1 ? vg.pipe(fns, { returnIndex: 0 }) : fns[0];
243
262
  }
244
- let fn = fns.length > 1 ? vg.pipe(fns) : fns[0];
245
263
  if (defVariable.isArray) {
246
- fn = vg.isArray(fn);
247
- if (defVariable.minOccurs !== null || defVariable.maxOccurs) {
248
- const p = [fn];
249
- if (defVariable.minOccurs != null)
250
- p.push(vg.lengthMin(1));
251
- if (defVariable.maxOccurs != null)
252
- p.push(vg.lengthMax(defVariable.maxOccurs));
253
- fn = vg.pipe(p, { returnIndex: 0 });
264
+ valueFn = vg.isArray(valueFn);
265
+ /* Validation rules for each array */
266
+ if (codec === 'decode') {
267
+ const fns = [];
268
+ if (defVariable.minOccurs !== null || defVariable.maxOccurs) {
269
+ if (defVariable.minOccurs != null)
270
+ fns.push(vg.lengthMin(1));
271
+ if (defVariable.maxOccurs != null)
272
+ fns.push(vg.lengthMax(defVariable.maxOccurs));
273
+ }
274
+ if (fns.length)
275
+ valueFn =
276
+ fns.length > 1 ? vg.pipe(fns, { returnIndex: 0 }) : fns[0];
254
277
  }
255
278
  }
256
- if (options?.setDefaultValues ?? true) {
257
- fn =
258
- defVariable.required || defVariable.default != null
259
- ? vg.required(fn, { default: defVariable.default })
260
- : vg.optional(fn);
279
+ if (!defVariable.required && !hasDefault) {
280
+ valueFn = defVariable.nullable
281
+ ? vg.nullable(valueFn)
282
+ : vg.optional(valueFn);
261
283
  }
262
- else
263
- fn =
264
- !defVariable.required || defVariable.default != null
265
- ? vg.optional(fn)
266
- : vg.required(fn);
267
- target[k] = fn(oldVals?.[k], { coerce: true });
284
+ target[k] = valueFn(oldVals?.[k], { coerce: true });
268
285
  });
269
286
  }
270
287
  };