@cratis/fundamentals 7.24.0 → 7.24.1

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/JsonSerializer.ts CHANGED
@@ -423,6 +423,8 @@ export class JsonSerializer {
423
423
 
424
424
  /**
425
425
  * Deserialize an any instance to a specific instance type.
426
+ * Fields with an undefined input value keep their constructor defaults, except collections,
427
+ * which become empty arrays. Explicit null values override defaults.
426
428
  * @param {Constructor} targetType Type to deserialize to.
427
429
  * @param {*} instance Actual instance to deserialize.
428
430
  * @returns An instance of the target type.
@@ -458,6 +460,8 @@ export class JsonSerializer {
458
460
  // collection. An explicit null is left alone: that is the producer saying "no collection"
459
461
  // rather than "an empty one".
460
462
  value = [];
463
+ } else if (value === undefined) {
464
+ continue;
461
465
  }
462
466
 
463
467
  deserialized[field.name] = value;
@@ -1 +1 @@
1
- {"version":3,"file":"JsonSerializer.d.ts","sourceRoot":"","sources":["../JsonSerializer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAW5C,OAAO,EACH,aAAa,EAUhB,MAAM,QAAQ,CAAC;AAmVhB,qBAAa,cAAc;IACvB,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAoB;IAsBjE,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI,CAEvD;IAOD,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAGnC;IAQD,MAAM,CAAC,WAAW,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAGlG;IAQD,MAAM,CAAC,gBAAgB,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAGzG;IAQD,MAAM,CAAC,uBAAuB,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,CAyD/G;IAQD,MAAM,CAAC,4BAA4B,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,OAAO,EAAE,CAQvH;CACJ"}
1
+ {"version":3,"file":"JsonSerializer.d.ts","sourceRoot":"","sources":["../JsonSerializer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAW5C,OAAO,EACH,aAAa,EAUhB,MAAM,QAAQ,CAAC;AAmVhB,qBAAa,cAAc;IACvB,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAoB;IAsBjE,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI,CAEvD;IAOD,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAGnC;IAQD,MAAM,CAAC,WAAW,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAGlG;IAQD,MAAM,CAAC,gBAAgB,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAGzG;IAUD,MAAM,CAAC,uBAAuB,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,CA2D/G;IAQD,MAAM,CAAC,4BAA4B,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,OAAO,EAAE,CAQvH;CACJ"}
@@ -265,6 +265,9 @@ export class JsonSerializer {
265
265
  else if ((field.enumerable || field.type === Array) && value === undefined) {
266
266
  value = [];
267
267
  }
268
+ else if (value === undefined) {
269
+ continue;
270
+ }
268
271
  deserialized[field.name] = value;
269
272
  }
270
273
  const derivedTypeId = instance[JsonSerializer.DerivedTypeIdProperty];
@@ -1 +1 @@
1
- {"version":3,"file":"JsonSerializer.js","sourceRoot":"","sources":["../JsonSerializer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC1J,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAEH,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACxB,MAAM,QAAQ,CAAC;AAWhB,sBAAsB,EAAE,CAAC;AAGzB,MAAM,UAAU,GAAoB;IAChC,IAAI,iBAAiB,EAAE;IACvB,IAAI,qBAAqB,EAAE;IAC3B,IAAI,iBAAiB,EAAE;IACvB,IAAI,qBAAqB,EAAE;IAC3B,IAAI,qBAAqB,EAAE;IAC3B,IAAI,kBAAkB,EAAE;IACxB,IAAI,uBAAuB,EAAE;IAC7B,IAAI,oBAAoB,EAAE;IAC1B,IAAI,qBAAqB,EAAE;CAC9B,CAAC;AAOF,MAAM,eAAe,GAA+B,IAAI,GAAG,EAAyB,CAAC;AACrF,MAAM,cAAc,GAAoC,IAAI,GAAG,EAA8B,CAAC;AAE9F,MAAM,oBAAoB,GAAG,CAAC,SAAwB,EAAE,EAAE;IACtD,MAAM,GAAG,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACpB,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAClD,CAAC,CAAC;AAEF,UAAU,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAOzC,MAAM,YAAY,GAAG,CAAC,IAA6B,EAA6B,EAAE;IAC9E,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAE5B,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvE,OAAO,KAAK,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC,CAAC;AAOF,MAAM,UAAU,GAAG,CAAC,IAA6B,EAAW,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,eAAe,CAAC;AAGzG,MAAM,mBAAmB,GAAqC,IAAI,GAAG,CAA8B;IAC/F,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC;IAClC,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC;IAClC,CAAC,OAAO,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,KAAK,CAAC;CACvC,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAqC,IAAI,GAAG,CAA8B;IAChG,CAAC,MAAM,EAAE,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC;IAC/B,CAAC,MAAM,EAAE,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC;IAC/B,CAAC,OAAO,EAAE,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC;CACnC,CAAC,CAAC;AAWH,MAAM,WAAW,GAAG,CAAC,IAAiB,EAAW,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,gBAAgB,CAAC;AAEzF,MAAM,qBAAqB,GAAG,CAAC,IAAiB,EAAE,KAAU,EAAE,EAAE;IAC5D,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAIzB,IAAI,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;QAG/B,OAAO,qBAAqB,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACrE,CAAC;IAGD,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,SAAS,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAGD,IAAI,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAAC,IAAiB,EAAE,KAAU,EAAE,EAAE;IAE/D,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,SAAS,GAAI,IAAkD,CAAC,SAAS,CAAC;QAChF,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACpF,CAAC;IAGD,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,SAAS,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAGD,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,OAAO,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,cAAc,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AACnE,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAAC,KAAY,EAAE,KAAU,EAAE,EAAE;IAC3D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAExD,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,4BAA4B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACtD,CAAC;IAGD,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,wBAAwB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC;IAGD,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,SAAS,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAGD,IAAI,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,OAAO,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACtB,IAAI,KAAK,CAAC,cAAc,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAC9C,MAAM,aAAa,GAAG,KAAK,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACzF,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,IAAI,IAAI,CAAC;IAC7E,CAAC;IAED,OAAO,cAAc,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AACnE,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,GAAQ,EAAU,EAAE;IACzC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACpC,OAAO,EAAE,CAAC;IACd,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,GAAG,CAAC;IACf,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,SAAS,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACjF,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI,GAAG,YAAY,IAAI,EAAE,CAAC;QACtB,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IAID,IAAI,sBAAsB,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACrE,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAED,OAAO,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAyD;IAC3F,CAAC,WAAW,EAAE;YACV,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,IAAI,CAAC,EAAE;gBACV,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrB,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;gBACnC,CAAC;gBACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;SACJ,CAAC;IACF,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC9D,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC9D,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;CACjE,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAU,EAAE,CAEhD,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAEzF,MAAM,qBAAqB,GAAG,CAAC,IAAY,EAAE,KAA4B,EAAE,GAAW,EAAO,EAAE;IAC3F,IAAI,CAAC;QACD,OAAO,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACL,MAAM,IAAI,KAAK,CAAC,gBAAgB,GAAG,oBAAoB,IAAI,GAAG,CAAC,CAAC;IACpE,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,OAAoB,EAAE,GAAW,EAAO,EAAE;IACjE,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO,GAAG,CAAC;IACf,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACtB,OAAO,GAAG,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;IACxC,CAAC;IAED,MAAM,YAAY,GAAG,sBAAsB,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAChF,IAAI,YAAY,EAAE,CAAC;QACf,OAAO,qBAAqB,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7E,CAAC;IAGD,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,SAAS,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,cAAc,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,SAAkC,EAAE,KAAU,EAAO,EAAE;IAChF,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAExD,IAAI,CAAC,SAAS,EAAE,CAAC;QACb,OAAO,KAAK,CAAC;IACjB,CAAC;IAMD,OAAO,wBAAwB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,4BAA4B,GAAG,CAAC,KAAY,EAAE,KAAU,EAAsB,EAAE;IAClF,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAY,CAAC;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAE5C,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,eAAe,GAAG,iBAAiB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACxD,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACrE,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,QAAa,EAAE,EAAE;IAC7C,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAMjE,IAAI,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACpC,OAAO,qBAAqB,CAAC,QAAQ,CAAC,WAA0B,EAAE,QAAQ,CAAC,CAAC;IAChF,CAAC;IAGD,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACrC,OAAO,qBAAqB,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACjE,CAAC;IAGD,IAAI,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAChD,OAAO,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAE,CAAC,QAAQ,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,SAAS,GAAQ,EAAE,CAAC;IAO1B,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;IAC9G,IAAI,aAAa,EAAE,CAAC;QAChB,SAAS,CAAC,cAAc,CAAC,qBAAqB,CAAC,GAAG,aAAa,CAAC;IACpE,CAAC;IACD,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QAE1B,IAAI,QAAQ,KAAK,cAAc,CAAC,qBAAqB;YAAE,OAAO;QAC9D,IAAI,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC/B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACxC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACJ,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACtE,CAAC;QACL,CAAC;QAED,SAAS,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACrB,CAAC,CAAC;AAIF,qBAAqB,CAAC,UAAU,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAAC;AAK1E,MAAM,OAAO,cAAc;IACvB,MAAM,CAAU,qBAAqB,GAAW,gBAAgB,CAAC;IAsBjE,MAAM,CAAC,iBAAiB,CAAC,SAAwB;QAC7C,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAOD,MAAM,CAAC,SAAS,CAAC,KAAU;QACvB,MAAM,SAAS,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAQD,MAAM,CAAC,WAAW,CAAyB,UAAgC,EAAE,IAAY;QACrF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC,uBAAuB,CAAU,UAAU,EAAE,MAAM,CAAC,CAAC;IACrE,CAAC;IAQD,MAAM,CAAC,gBAAgB,CAAyB,UAAgC,EAAE,IAAY;QAC1F,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC,4BAA4B,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC;IAQD,MAAM,CAAC,uBAAuB,CAAyB,UAAgC,EAAE,QAAa;QAClG,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,UAAyB,CAAC,CAAC;QAElE,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;YACtD,OAAO,wBAAwB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,UAAU,EAAE,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACxC,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;oBACvB,MAAM,WAAW,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;oBAC9C,IAAI,WAAW,EAAE,CAAC;wBACd,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;wBACtF,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,yBAAyB,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;oBACvE,CAAC;gBACL,CAAC;qBAAM,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;oBAC1B,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,yBAAyB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;gBAChE,CAAC;qBAAM,CAAC;oBACJ,KAAK,GAAG,yBAAyB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACpD,CAAC;YACL,CAAC;iBAAM,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBAQ3E,KAAK,GAAG,EAAE,CAAC;YACf,CAAC;YAED,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QACrC,CAAC;QAOD,MAAM,aAAa,GAAG,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;QACrE,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;YACvD,YAAwC,CAAC,cAAc,CAAC,qBAAqB,CAAC,GAAG,aAAa,CAAC;QACpG,CAAC;QAED,IAAK,UAA0B,IAAI,MAAM,EAAE,CAAC;YACxC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACxD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;YAEH,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;gBAC/B,YAAY,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC1C,CAAC;QACL,CAAC;QAED,OAAO,YAAY,CAAC;IACxB,CAAC;IAQD,MAAM,CAAC,4BAA4B,CAAyB,UAAgC,EAAE,SAAc;QACxG,MAAM,YAAY,GAAc,EAAE,CAAC;QAEnC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAC/B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAU,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;QACnF,CAAC;QAED,OAAO,YAAY,CAAC;IACxB,CAAC;CACJ"}
1
+ {"version":3,"file":"JsonSerializer.js","sourceRoot":"","sources":["../JsonSerializer.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"JsonSerializer.d.ts","sourceRoot":"","sources":["../../JsonSerializer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAW5C,OAAO,EACH,aAAa,EAUhB,MAAM,QAAQ,CAAC;AAmVhB,qBAAa,cAAc;IACvB,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAoB;IAsBjE,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI;IASxD,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM;IAWpC,MAAM,CAAC,WAAW,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAWnG,MAAM,CAAC,gBAAgB,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE;IAW1G,MAAM,CAAC,uBAAuB,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO;IAiEhH,MAAM,CAAC,4BAA4B,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,OAAO,EAAE;CAS3H"}
1
+ {"version":3,"file":"JsonSerializer.d.ts","sourceRoot":"","sources":["../../JsonSerializer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAW5C,OAAO,EACH,aAAa,EAUhB,MAAM,QAAQ,CAAC;AAmVhB,qBAAa,cAAc;IACvB,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAoB;IAsBjE,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI;IASxD,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM;IAWpC,MAAM,CAAC,WAAW,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAWnG,MAAM,CAAC,gBAAgB,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE;IAa1G,MAAM,CAAC,uBAAuB,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO;IAmEhH,MAAM,CAAC,4BAA4B,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,OAAO,EAAE;CAS3H"}
@@ -276,6 +276,9 @@ class JsonSerializer {
276
276
  else if ((field.enumerable || field.type === Array) && value === undefined) {
277
277
  value = [];
278
278
  }
279
+ else if (value === undefined) {
280
+ continue;
281
+ }
279
282
  deserialized[field.name] = value;
280
283
  }
281
284
  const derivedTypeId = instance[JsonSerializer.DerivedTypeIdProperty];
@@ -1 +1 @@
1
- {"version":3,"file":"JsonSerializer.js","sources":["../../JsonSerializer.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { Constructor } from './Constructor';\nimport { DerivedType } from './DerivedType';\nimport { registerModuleInstance } from './duplicateInstanceGuard';\nimport { Field } from './Field';\nimport { Fields } from './Fields';\nimport { Guid } from './Guid';\nimport { DateOnly } from './DateOnly';\nimport { TimeOnly } from './TimeOnly';\nimport { TimeSpan } from './TimeSpan';\nimport { conceptAsTypeKey, dateOnlyTypeKey, declaredTypeKey, guidTypeKey, timeOnlyTypeKey, timeSpanTypeKey, typeKeyOf, valueMapTypeKey } from './typeKey';\nimport { ValueMap } from './ValueMap';\nimport { \n JsonConverter, \n DateJsonConverter, \n DateOnlyJsonConverter,\n GuidJsonConverter, \n TimeOnlyJsonConverter,\n TimeSpanJsonConverter, \n PointJsonConverter,\n LineStringJsonConverter,\n PolygonJsonConverter,\n ValueMapJsonConverter\n} from './json';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\ntype typeSerializer = (value: any) => any;\n\n// A second copy of this package in the same realm builds its own registry here, and brings its own\n// class objects. Convertible values still cross between the copies, because a type is recognized by\n// the key it declares - but a converter registered on one copy reaches only that one, and a version\n// pinned at the top level never reaches a nested copy. Announce it where the state that cannot be\n// shared is built.\nregisterModuleInstance();\n\n// Initialize converters\nconst converters: JsonConverter[] = [\n new DateJsonConverter(),\n new DateOnlyJsonConverter(),\n new GuidJsonConverter(),\n new TimeOnlyJsonConverter(),\n new TimeSpanJsonConverter(),\n new PointJsonConverter(),\n new LineStringJsonConverter(),\n new PolygonJsonConverter(),\n new ValueMapJsonConverter()\n];\n\n// Converters are found by the key a type declares, and only by the constructor when it declares none.\n// Keying on the constructor alone is what made a second copy of this package silently fatal: each copy\n// brings its own Guid, ConceptAs and ValueMap class objects, so neither recognized the other's. A key\n// crosses that boundary; a class object does not. A consumer's own type has no key and is found by\n// constructor, which is exact and needs nothing to cross.\nconst keyedConverters: Map<string, JsonConverter> = new Map<string, JsonConverter>();\nconst typeConverters: Map<Constructor, JsonConverter> = new Map<Constructor, JsonConverter>();\n\nconst registerConverterFor = (converter: JsonConverter) => {\n const key = declaredTypeKey(converter.type);\n if (key !== undefined) {\n keyedConverters.set(key, converter);\n }\n\n typeConverters.set(converter.type, converter);\n};\n\nconverters.forEach(registerConverterFor);\n\n/**\n * Finds the converter registered for a type, if any.\n * @param {Constructor} type The type to convert.\n * @returns {JsonConverter | undefined} The converter, or undefined when the type has none.\n */\nconst converterFor = (type: Constructor | undefined): JsonConverter | undefined => {\n if (!type) return undefined;\n\n const key = declaredTypeKey(type);\n const keyed = key === undefined ? undefined : keyedConverters.get(key);\n return keyed ?? typeConverters.get(type);\n};\n\n/**\n * Checks whether a type is a ValueMap, including one from another copy of this package.\n * @param {Constructor} type The type to check.\n * @returns {boolean} True when the type is a ValueMap.\n */\nconst isValueMap = (type: Constructor | undefined): boolean => declaredTypeKey(type) === valueMapTypeKey;\n\n// Add primitive type converters that don't need a full JsonConverter class\nconst primitiveConverters: Map<Constructor, typeSerializer> = new Map<Constructor, typeSerializer>([\n [Number, (value: number) => value],\n [String, (value: string) => value],\n [Boolean, (value: boolean) => value]\n]);\n\nconst primitiveSerializers: Map<Constructor, typeSerializer> = new Map<Constructor, typeSerializer>([\n [Number, (value: any) => value],\n [String, (value: any) => value],\n [Boolean, (value: any) => value]\n]);\n\n/**\n * Checks if a constructor is a ConceptAs type.\n * @param {Constructor} type The constructor to check.\n * @returns {boolean} True if the type extends ConceptAs.\n * @remarks\n * Reads the key rather than walking the prototype chain looking for this copy's ConceptAs. The key is a\n * static and a static is inherited, so every type deriving from ConceptAs carries it - including one\n * deriving from another copy's ConceptAs, which a prototype walk could never recognize.\n */\nconst isConceptAs = (type: Constructor): boolean => typeKeyOf(type) === conceptAsTypeKey;\n\nconst serializeValueForType = (type: Constructor, value: any) => {\n if (!value) return value;\n\n // If it's a ConceptAs instance, unwrap it and serialize the inner value recursively\n // This follows the C# pattern: recognize as concept, unwrap, then call serializer\n if (isConceptAs(value.constructor)) {\n const innerValue = value.value;\n // Recursively serialize the inner value to handle complex types\n // Use .constructor directly which works reliably for both primitives and objects\n return serializeValueForType(innerValue.constructor, innerValue);\n }\n\n // Check if there's a registered converter\n const converter = converterFor(type);\n if (converter) {\n return converter.write(value);\n }\n \n // Check primitive converters\n if (primitiveConverters.has(type)) {\n return primitiveConverters.get(type)!(value);\n }\n \n return convertTypesOnInstance(value);\n};\n\nconst deserializeValueFromType = (type: Constructor, value: any) => {\n // If it's a ConceptAs type, instantiate it with the value\n if (isConceptAs(type)) {\n const valueType = (type as Constructor & { valueType?: Constructor }).valueType;\n return new type(valueType ? deserializeValueFromType(valueType, value) : value);\n }\n \n // Check if there's a registered converter\n const converter = converterFor(type);\n if (converter) {\n return converter.read(value);\n }\n \n // Check primitive serializers\n if (primitiveSerializers.has(type)) {\n return primitiveSerializers.get(type)!(value);\n }\n \n return JsonSerializer.deserialize(type, JSON.stringify(value));\n};\n\nconst deserializeValueFromField = (field: Field, value: any) => {\n if (value === null || value === undefined) return value;\n\n if (isValueMap(field.type)) {\n return deserializeValueMapFromField(field, value);\n }\n\n // If it's a ConceptAs type, instantiate it with the value\n if (isConceptAs(field.type)) {\n return deserializeValueFromType(field.type, value);\n }\n\n // Check if there's a registered converter\n const converter = converterFor(field.type);\n if (converter) {\n return converter.read(value);\n }\n \n // Check primitive serializers\n if (primitiveSerializers.has(field.type)) {\n return primitiveSerializers.get(field.type)!(value);\n }\n \n let type = field.type;\n if (value[JsonSerializer.DerivedTypeIdProperty]) {\n const derivedTypeId = value[JsonSerializer.DerivedTypeIdProperty];\n const candidates = [...field.derivatives, ...DerivedType.getDerivedTypesFor(field.type)];\n type = candidates.find(_ => DerivedType.get(_) == derivedTypeId) || type;\n }\n\n return JsonSerializer.deserialize(type, JSON.stringify(value));\n};\n\nconst serializeMapKey = (key: any): string => {\n if (key === undefined || key === null) {\n return '';\n }\n\n if (typeof key === 'string') {\n return key;\n }\n\n if (typeof key === 'number' || typeof key === 'boolean' || typeof key === 'bigint') {\n return key.toString();\n }\n\n if (key instanceof Date) {\n return key.toISOString();\n }\n\n // Guid, DateOnly, TimeOnly and TimeSpan keys are their plain canonical strings, as a C# dictionary\n // writes them, rather than the quoted JSON string the generic path would produce.\n if (plainStringMapKeyTypes.has(declaredTypeKey(key.constructor) ?? '')) {\n return key.toString();\n }\n\n return JsonSerializer.serialize(key);\n};\n\nconst plainStringMapKeyTypes = new Map<string, { name: string; parse: (text: string) => any }>([\n [guidTypeKey, {\n name: 'Guid',\n parse: text => {\n if (!Guid.isGuid(text)) {\n throw new Error('Not a Guid.');\n }\n return Guid.parse(text);\n }\n }],\n [dateOnlyTypeKey, { name: 'DateOnly', parse: DateOnly.parse }],\n [timeOnlyTypeKey, { name: 'TimeOnly', parse: TimeOnly.parse }],\n [timeSpanTypeKey, { name: 'TimeSpan', parse: TimeSpan.parse }]\n]);\n\nconst unquoteLegacyMapKey = (key: string): string =>\n // Keys written before the plain form was adopted carry the JSON quotes of an embedded string.\n key.length >= 2 && key.startsWith('\"') && key.endsWith('\"') ? key.slice(1, -1) : key;\n\nconst readPlainStringMapKey = (name: string, parse: (text: string) => any, key: string): any => {\n try {\n return parse(unquoteLegacyMapKey(key));\n } catch {\n throw new Error(`The map key '${key}' is not a valid ${name}.`);\n }\n};\n\nconst deserializeMapKey = (keyType: Constructor, key: string): any => {\n if (keyType === String) {\n return key;\n }\n\n if (keyType === Number) {\n return Number(key);\n }\n\n if (keyType === Boolean) {\n return key.toLowerCase() === 'true';\n }\n\n const plainKeyType = plainStringMapKeyTypes.get(declaredTypeKey(keyType) ?? '');\n if (plainKeyType) {\n return readPlainStringMapKey(plainKeyType.name, plainKeyType.parse, key);\n }\n\n // Check if there's a converter for this type\n const converter = converterFor(keyType);\n if (converter) {\n return converter.read(key);\n }\n\n return JsonSerializer.deserialize(keyType, key);\n};\n\nconst deserializeMapValue = (valueType: Constructor | undefined, value: any): any => {\n if (value === null || value === undefined) return value;\n\n if (!valueType) {\n return value;\n }\n\n // A map value is an ordinary value of its declared type, so read it the way any other value of that\n // type is read. Resolving it here instead left out the concept and primitive cases, and the\n // primitive one lost data without a sound: a string value went through JsonSerializer.deserialize,\n // which built an empty String object because a primitive has no fields to populate.\n return deserializeValueFromType(valueType, value);\n};\n\nconst deserializeValueMapFromField = (field: Field, value: any): ValueMap<any, any> => {\n const valueMap = new ValueMap<any, any>();\n const keyType = field.genericArguments[0];\n const valueType = field.genericArguments[1];\n\n if (!value || !keyType) {\n return valueMap;\n }\n\n for (const key of Object.keys(value)) {\n const deserializedKey = deserializeMapKey(keyType, key);\n const deserializedValue = deserializeMapValue(valueType, value[key]);\n valueMap.set(deserializedKey, deserializedValue);\n }\n\n return valueMap;\n};\n\nconst convertTypesOnInstance = (instance: any) => {\n if (instance === null || instance === undefined) return instance;\n\n // A concept unwraps to its underlying value wherever it is reached, not only when it is reached\n // through a declared field. An array element and a map value arrive here rather than at\n // serializeValueForType, and without this they were written as the object a concept happens to be -\n // {\"value\": ...} where the receiver declared the underlying type.\n if (isConceptAs(instance.constructor)) {\n return serializeValueForType(instance.constructor as Constructor, instance);\n }\n\n // Check if there's a converter for this type\n if (converterFor(instance.constructor)) {\n return serializeValueForType(instance.constructor, instance);\n }\n \n // Check primitive converters\n if (primitiveConverters.has(instance.constructor)) {\n return primitiveConverters.get(instance.constructor)!(instance);\n }\n\n const properties = Object.getOwnPropertyNames(instance);\n const converted: any = {};\n\n // Emit the polymorphic type discriminator, preferring the registered type for the instance's\n // constructor and falling back to a discriminator preserved on the instance itself (e.g. a value\n // that was deserialized before its concrete type could be resolved). This keeps '_derivedTypeId'\n // flowing through serialization transparently — the caller never has to manage it — and is the\n // mirror of preserving it on deserialization.\n const derivedTypeId = DerivedType.get(instance.constructor) ?? instance[JsonSerializer.DerivedTypeIdProperty];\n if (derivedTypeId) {\n converted[JsonSerializer.DerivedTypeIdProperty] = derivedTypeId;\n }\n properties.forEach(property => {\n // The discriminator is handled above as a meta-property; never treat it as a data field.\n if (property === JsonSerializer.DerivedTypeIdProperty) return;\n let value = instance[property];\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n value = value.map(_ => convertTypesOnInstance(_));\n } else {\n value = serializeValueForType(value.__proto__.constructor, value);\n }\n }\n\n converted[property] = value;\n });\n\n return converted;\n};\n\n// Initialize ValueMapJsonConverter with helper functions to avoid circular dependencies\n// Must be done after serializeMapKey and convertTypesOnInstance are defined\nValueMapJsonConverter.setHelpers(serializeMapKey, convertTypesOnInstance);\n\n/**\n * Represents a serializer for JSON.\n */\nexport class JsonSerializer {\n static readonly DerivedTypeIdProperty: string = \"_derivedTypeId\";\n\n /**\n * Register a converter for the type it declares through its `type` property.\n * @param {JsonConverter} converter The converter to register.\n * @remarks\n * The converter is used for both directions - `read` on the way in, `write` on the way out - and\n * takes the place of any converter already registered for the same type, including the built-in\n * ones. Replacing a built-in changes the payloads the application produces and consumes, which is\n * the caller's to decide; nothing here second-guesses it.\n *\n * Two shapes resolve ahead of the converters, so a converter registered for them is not reached:\n *\n * - A type deriving from `ConceptAs` is unwrapped to its underlying value in both directions, and\n * converted as that value's type. Register for the underlying type to reach a concept.\n * - A `ValueMap` is read back from the declaring field's generic arguments rather than through a\n * converter. Note the asymmetry: writing a `ValueMap` *does* go through the registered converter,\n * so replacing that one changes only the outbound half.\n * - A `Guid`, `DateOnly`, `TimeOnly` or `TimeSpan` used as a `ValueMap` key always uses the plain\n * canonical string form and bypasses any registered converter for that type, so that keys stay\n * compatible with C# dictionaries.\n */\n static registerConverter(converter: JsonConverter): void {\n registerConverterFor(converter);\n }\n\n /**\n * Serialize with strong type information.\n * @param {*} value The value to serialize.\n * @returns A JSON string.\n */\n static serialize(value: any): string {\n const converted = convertTypesOnInstance(value);\n return JSON.stringify(converted);\n }\n\n /**\n * Deserialize a JSON string to the specific type.\n * @param {Constructor} targetType Type to deserialize to.\n * @param {string} json Actual JSON to deserialize.\n * @returns An instance of the target type.\n */\n static deserialize<TResult extends object>(targetType: Constructor<TResult>, json: string): TResult {\n const parsed = JSON.parse(json);\n return this.deserializeFromInstance<TResult>(targetType, parsed);\n }\n\n /**\n * Deserialize a array JSON string to an array of the specific instance type.\n * @param {Constructor} targetType Type to deserialize to.\n * @param {string} json Actual JSON to deserialize.\n * @returns An array of instances of the target type.\n */\n static deserializeArray<TResult extends object>(targetType: Constructor<TResult>, json: string): TResult[] {\n const parsed = JSON.parse(json);\n return this.deserializeArrayFromInstance(targetType, parsed);\n }\n\n /**\n * Deserialize an any instance to a specific instance type.\n * @param {Constructor} targetType Type to deserialize to.\n * @param {*} instance Actual instance to deserialize.\n * @returns An instance of the target type.\n */\n static deserializeFromInstance<TResult extends object>(targetType: Constructor<TResult>, instance: any): TResult {\n const fields = Fields.getFieldsForType(targetType as Constructor);\n\n if (converterFor(targetType) || isConceptAs(targetType)) {\n return deserializeValueFromType(targetType, instance);\n }\n\n const deserialized = new targetType();\n for (const field of fields) {\n let value = instance[field.name];\n if (value !== undefined && value !== null) {\n if (field.type === Array) {\n const elementType = field.genericArguments[0];\n if (elementType) {\n const elementField = new Field(field.name, elementType, false, field.derivatives, []);\n value = value.map(_ => deserializeValueFromField(elementField, _));\n }\n } else if (field.enumerable) {\n value = value.map(_ => deserializeValueFromField(field, _));\n } else {\n value = deserializeValueFromField(field, value);\n }\n } else if ((field.enumerable || field.type === Array) && value === undefined) {\n // A collection that is absent from the payload deserializes to an empty one rather than to\n // undefined. The declared type says the field is an array, and a producer that leaves an\n // empty collection out - which the Chronicle sink does deliberately, so that a parallel\n // replay cannot overwrite children a sibling event already wrote - would otherwise hand back\n // a value contradicting its own type, putting a null guard on every reader of every\n // collection. An explicit null is left alone: that is the producer saying \"no collection\"\n // rather than \"an empty one\".\n value = [];\n }\n\n deserialized[field.name] = value;\n }\n\n // Preserve the polymorphic type discriminator so it is never lost across (de)serialization\n // layers. '_derivedTypeId' is not a declared field, so it is otherwise dropped here — and a\n // derived value whose concrete type could not be resolved (e.g. its type was not yet\n // registered) would then have no discriminator left to re-resolve or round-trip with, and\n // would serialize back with no type information at all.\n const derivedTypeId = instance[JsonSerializer.DerivedTypeIdProperty];\n if (derivedTypeId !== undefined && derivedTypeId !== null) {\n (deserialized as Record<string, unknown>)[JsonSerializer.DerivedTypeIdProperty] = derivedTypeId;\n }\n\n if ((targetType as Constructor) == Object) {\n const objectFields = Object.keys(instance).filter((value) => {\n return !fields.some(_ => _.name == value);\n });\n\n for (const field of objectFields) {\n deserialized[field] = instance[field];\n }\n }\n\n return deserialized;\n }\n\n /**\n * Deserialize an array of any instances to an array of specific instance types.\n * @param {Constructor} targetType Type to deserialize to.\n * @param {instances} instances Actual instances to deserialize.\n * @returns An array of instances of the target type.\n */\n static deserializeArrayFromInstance<TResult extends object>(targetType: Constructor<TResult>, instances: any): TResult[] {\n const deserialized: TResult[] = [];\n\n for (const instance of instances) {\n deserialized.push(this.deserializeFromInstance<TResult>(targetType, instance));\n }\n\n return deserialized;\n }\n}\n"],"names":["registerModuleInstance","DateJsonConverter","DateOnlyJsonConverter","GuidJsonConverter","TimeOnlyJsonConverter","TimeSpanJsonConverter","PointJsonConverter","LineStringJsonConverter","PolygonJsonConverter","ValueMapJsonConverter","declaredTypeKey","valueMapTypeKey","typeKeyOf","conceptAsTypeKey","DerivedType","guidTypeKey","Guid","dateOnlyTypeKey","DateOnly","timeOnlyTypeKey","TimeOnly","timeSpanTypeKey","TimeSpan","ValueMap","Fields","Field"],"mappings":"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"}
1
+ {"version":3,"file":"JsonSerializer.js","sources":["../../JsonSerializer.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { Constructor } from './Constructor';\nimport { DerivedType } from './DerivedType';\nimport { registerModuleInstance } from './duplicateInstanceGuard';\nimport { Field } from './Field';\nimport { Fields } from './Fields';\nimport { Guid } from './Guid';\nimport { DateOnly } from './DateOnly';\nimport { TimeOnly } from './TimeOnly';\nimport { TimeSpan } from './TimeSpan';\nimport { conceptAsTypeKey, dateOnlyTypeKey, declaredTypeKey, guidTypeKey, timeOnlyTypeKey, timeSpanTypeKey, typeKeyOf, valueMapTypeKey } from './typeKey';\nimport { ValueMap } from './ValueMap';\nimport { \n JsonConverter, \n DateJsonConverter, \n DateOnlyJsonConverter,\n GuidJsonConverter, \n TimeOnlyJsonConverter,\n TimeSpanJsonConverter, \n PointJsonConverter,\n LineStringJsonConverter,\n PolygonJsonConverter,\n ValueMapJsonConverter\n} from './json';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\ntype typeSerializer = (value: any) => any;\n\n// A second copy of this package in the same realm builds its own registry here, and brings its own\n// class objects. Convertible values still cross between the copies, because a type is recognized by\n// the key it declares - but a converter registered on one copy reaches only that one, and a version\n// pinned at the top level never reaches a nested copy. Announce it where the state that cannot be\n// shared is built.\nregisterModuleInstance();\n\n// Initialize converters\nconst converters: JsonConverter[] = [\n new DateJsonConverter(),\n new DateOnlyJsonConverter(),\n new GuidJsonConverter(),\n new TimeOnlyJsonConverter(),\n new TimeSpanJsonConverter(),\n new PointJsonConverter(),\n new LineStringJsonConverter(),\n new PolygonJsonConverter(),\n new ValueMapJsonConverter()\n];\n\n// Converters are found by the key a type declares, and only by the constructor when it declares none.\n// Keying on the constructor alone is what made a second copy of this package silently fatal: each copy\n// brings its own Guid, ConceptAs and ValueMap class objects, so neither recognized the other's. A key\n// crosses that boundary; a class object does not. A consumer's own type has no key and is found by\n// constructor, which is exact and needs nothing to cross.\nconst keyedConverters: Map<string, JsonConverter> = new Map<string, JsonConverter>();\nconst typeConverters: Map<Constructor, JsonConverter> = new Map<Constructor, JsonConverter>();\n\nconst registerConverterFor = (converter: JsonConverter) => {\n const key = declaredTypeKey(converter.type);\n if (key !== undefined) {\n keyedConverters.set(key, converter);\n }\n\n typeConverters.set(converter.type, converter);\n};\n\nconverters.forEach(registerConverterFor);\n\n/**\n * Finds the converter registered for a type, if any.\n * @param {Constructor} type The type to convert.\n * @returns {JsonConverter | undefined} The converter, or undefined when the type has none.\n */\nconst converterFor = (type: Constructor | undefined): JsonConverter | undefined => {\n if (!type) return undefined;\n\n const key = declaredTypeKey(type);\n const keyed = key === undefined ? undefined : keyedConverters.get(key);\n return keyed ?? typeConverters.get(type);\n};\n\n/**\n * Checks whether a type is a ValueMap, including one from another copy of this package.\n * @param {Constructor} type The type to check.\n * @returns {boolean} True when the type is a ValueMap.\n */\nconst isValueMap = (type: Constructor | undefined): boolean => declaredTypeKey(type) === valueMapTypeKey;\n\n// Add primitive type converters that don't need a full JsonConverter class\nconst primitiveConverters: Map<Constructor, typeSerializer> = new Map<Constructor, typeSerializer>([\n [Number, (value: number) => value],\n [String, (value: string) => value],\n [Boolean, (value: boolean) => value]\n]);\n\nconst primitiveSerializers: Map<Constructor, typeSerializer> = new Map<Constructor, typeSerializer>([\n [Number, (value: any) => value],\n [String, (value: any) => value],\n [Boolean, (value: any) => value]\n]);\n\n/**\n * Checks if a constructor is a ConceptAs type.\n * @param {Constructor} type The constructor to check.\n * @returns {boolean} True if the type extends ConceptAs.\n * @remarks\n * Reads the key rather than walking the prototype chain looking for this copy's ConceptAs. The key is a\n * static and a static is inherited, so every type deriving from ConceptAs carries it - including one\n * deriving from another copy's ConceptAs, which a prototype walk could never recognize.\n */\nconst isConceptAs = (type: Constructor): boolean => typeKeyOf(type) === conceptAsTypeKey;\n\nconst serializeValueForType = (type: Constructor, value: any) => {\n if (!value) return value;\n\n // If it's a ConceptAs instance, unwrap it and serialize the inner value recursively\n // This follows the C# pattern: recognize as concept, unwrap, then call serializer\n if (isConceptAs(value.constructor)) {\n const innerValue = value.value;\n // Recursively serialize the inner value to handle complex types\n // Use .constructor directly which works reliably for both primitives and objects\n return serializeValueForType(innerValue.constructor, innerValue);\n }\n\n // Check if there's a registered converter\n const converter = converterFor(type);\n if (converter) {\n return converter.write(value);\n }\n \n // Check primitive converters\n if (primitiveConverters.has(type)) {\n return primitiveConverters.get(type)!(value);\n }\n \n return convertTypesOnInstance(value);\n};\n\nconst deserializeValueFromType = (type: Constructor, value: any) => {\n // If it's a ConceptAs type, instantiate it with the value\n if (isConceptAs(type)) {\n const valueType = (type as Constructor & { valueType?: Constructor }).valueType;\n return new type(valueType ? deserializeValueFromType(valueType, value) : value);\n }\n \n // Check if there's a registered converter\n const converter = converterFor(type);\n if (converter) {\n return converter.read(value);\n }\n \n // Check primitive serializers\n if (primitiveSerializers.has(type)) {\n return primitiveSerializers.get(type)!(value);\n }\n \n return JsonSerializer.deserialize(type, JSON.stringify(value));\n};\n\nconst deserializeValueFromField = (field: Field, value: any) => {\n if (value === null || value === undefined) return value;\n\n if (isValueMap(field.type)) {\n return deserializeValueMapFromField(field, value);\n }\n\n // If it's a ConceptAs type, instantiate it with the value\n if (isConceptAs(field.type)) {\n return deserializeValueFromType(field.type, value);\n }\n\n // Check if there's a registered converter\n const converter = converterFor(field.type);\n if (converter) {\n return converter.read(value);\n }\n \n // Check primitive serializers\n if (primitiveSerializers.has(field.type)) {\n return primitiveSerializers.get(field.type)!(value);\n }\n \n let type = field.type;\n if (value[JsonSerializer.DerivedTypeIdProperty]) {\n const derivedTypeId = value[JsonSerializer.DerivedTypeIdProperty];\n const candidates = [...field.derivatives, ...DerivedType.getDerivedTypesFor(field.type)];\n type = candidates.find(_ => DerivedType.get(_) == derivedTypeId) || type;\n }\n\n return JsonSerializer.deserialize(type, JSON.stringify(value));\n};\n\nconst serializeMapKey = (key: any): string => {\n if (key === undefined || key === null) {\n return '';\n }\n\n if (typeof key === 'string') {\n return key;\n }\n\n if (typeof key === 'number' || typeof key === 'boolean' || typeof key === 'bigint') {\n return key.toString();\n }\n\n if (key instanceof Date) {\n return key.toISOString();\n }\n\n // Guid, DateOnly, TimeOnly and TimeSpan keys are their plain canonical strings, as a C# dictionary\n // writes them, rather than the quoted JSON string the generic path would produce.\n if (plainStringMapKeyTypes.has(declaredTypeKey(key.constructor) ?? '')) {\n return key.toString();\n }\n\n return JsonSerializer.serialize(key);\n};\n\nconst plainStringMapKeyTypes = new Map<string, { name: string; parse: (text: string) => any }>([\n [guidTypeKey, {\n name: 'Guid',\n parse: text => {\n if (!Guid.isGuid(text)) {\n throw new Error('Not a Guid.');\n }\n return Guid.parse(text);\n }\n }],\n [dateOnlyTypeKey, { name: 'DateOnly', parse: DateOnly.parse }],\n [timeOnlyTypeKey, { name: 'TimeOnly', parse: TimeOnly.parse }],\n [timeSpanTypeKey, { name: 'TimeSpan', parse: TimeSpan.parse }]\n]);\n\nconst unquoteLegacyMapKey = (key: string): string =>\n // Keys written before the plain form was adopted carry the JSON quotes of an embedded string.\n key.length >= 2 && key.startsWith('\"') && key.endsWith('\"') ? key.slice(1, -1) : key;\n\nconst readPlainStringMapKey = (name: string, parse: (text: string) => any, key: string): any => {\n try {\n return parse(unquoteLegacyMapKey(key));\n } catch {\n throw new Error(`The map key '${key}' is not a valid ${name}.`);\n }\n};\n\nconst deserializeMapKey = (keyType: Constructor, key: string): any => {\n if (keyType === String) {\n return key;\n }\n\n if (keyType === Number) {\n return Number(key);\n }\n\n if (keyType === Boolean) {\n return key.toLowerCase() === 'true';\n }\n\n const plainKeyType = plainStringMapKeyTypes.get(declaredTypeKey(keyType) ?? '');\n if (plainKeyType) {\n return readPlainStringMapKey(plainKeyType.name, plainKeyType.parse, key);\n }\n\n // Check if there's a converter for this type\n const converter = converterFor(keyType);\n if (converter) {\n return converter.read(key);\n }\n\n return JsonSerializer.deserialize(keyType, key);\n};\n\nconst deserializeMapValue = (valueType: Constructor | undefined, value: any): any => {\n if (value === null || value === undefined) return value;\n\n if (!valueType) {\n return value;\n }\n\n // A map value is an ordinary value of its declared type, so read it the way any other value of that\n // type is read. Resolving it here instead left out the concept and primitive cases, and the\n // primitive one lost data without a sound: a string value went through JsonSerializer.deserialize,\n // which built an empty String object because a primitive has no fields to populate.\n return deserializeValueFromType(valueType, value);\n};\n\nconst deserializeValueMapFromField = (field: Field, value: any): ValueMap<any, any> => {\n const valueMap = new ValueMap<any, any>();\n const keyType = field.genericArguments[0];\n const valueType = field.genericArguments[1];\n\n if (!value || !keyType) {\n return valueMap;\n }\n\n for (const key of Object.keys(value)) {\n const deserializedKey = deserializeMapKey(keyType, key);\n const deserializedValue = deserializeMapValue(valueType, value[key]);\n valueMap.set(deserializedKey, deserializedValue);\n }\n\n return valueMap;\n};\n\nconst convertTypesOnInstance = (instance: any) => {\n if (instance === null || instance === undefined) return instance;\n\n // A concept unwraps to its underlying value wherever it is reached, not only when it is reached\n // through a declared field. An array element and a map value arrive here rather than at\n // serializeValueForType, and without this they were written as the object a concept happens to be -\n // {\"value\": ...} where the receiver declared the underlying type.\n if (isConceptAs(instance.constructor)) {\n return serializeValueForType(instance.constructor as Constructor, instance);\n }\n\n // Check if there's a converter for this type\n if (converterFor(instance.constructor)) {\n return serializeValueForType(instance.constructor, instance);\n }\n \n // Check primitive converters\n if (primitiveConverters.has(instance.constructor)) {\n return primitiveConverters.get(instance.constructor)!(instance);\n }\n\n const properties = Object.getOwnPropertyNames(instance);\n const converted: any = {};\n\n // Emit the polymorphic type discriminator, preferring the registered type for the instance's\n // constructor and falling back to a discriminator preserved on the instance itself (e.g. a value\n // that was deserialized before its concrete type could be resolved). This keeps '_derivedTypeId'\n // flowing through serialization transparently — the caller never has to manage it — and is the\n // mirror of preserving it on deserialization.\n const derivedTypeId = DerivedType.get(instance.constructor) ?? instance[JsonSerializer.DerivedTypeIdProperty];\n if (derivedTypeId) {\n converted[JsonSerializer.DerivedTypeIdProperty] = derivedTypeId;\n }\n properties.forEach(property => {\n // The discriminator is handled above as a meta-property; never treat it as a data field.\n if (property === JsonSerializer.DerivedTypeIdProperty) return;\n let value = instance[property];\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n value = value.map(_ => convertTypesOnInstance(_));\n } else {\n value = serializeValueForType(value.__proto__.constructor, value);\n }\n }\n\n converted[property] = value;\n });\n\n return converted;\n};\n\n// Initialize ValueMapJsonConverter with helper functions to avoid circular dependencies\n// Must be done after serializeMapKey and convertTypesOnInstance are defined\nValueMapJsonConverter.setHelpers(serializeMapKey, convertTypesOnInstance);\n\n/**\n * Represents a serializer for JSON.\n */\nexport class JsonSerializer {\n static readonly DerivedTypeIdProperty: string = \"_derivedTypeId\";\n\n /**\n * Register a converter for the type it declares through its `type` property.\n * @param {JsonConverter} converter The converter to register.\n * @remarks\n * The converter is used for both directions - `read` on the way in, `write` on the way out - and\n * takes the place of any converter already registered for the same type, including the built-in\n * ones. Replacing a built-in changes the payloads the application produces and consumes, which is\n * the caller's to decide; nothing here second-guesses it.\n *\n * Two shapes resolve ahead of the converters, so a converter registered for them is not reached:\n *\n * - A type deriving from `ConceptAs` is unwrapped to its underlying value in both directions, and\n * converted as that value's type. Register for the underlying type to reach a concept.\n * - A `ValueMap` is read back from the declaring field's generic arguments rather than through a\n * converter. Note the asymmetry: writing a `ValueMap` *does* go through the registered converter,\n * so replacing that one changes only the outbound half.\n * - A `Guid`, `DateOnly`, `TimeOnly` or `TimeSpan` used as a `ValueMap` key always uses the plain\n * canonical string form and bypasses any registered converter for that type, so that keys stay\n * compatible with C# dictionaries.\n */\n static registerConverter(converter: JsonConverter): void {\n registerConverterFor(converter);\n }\n\n /**\n * Serialize with strong type information.\n * @param {*} value The value to serialize.\n * @returns A JSON string.\n */\n static serialize(value: any): string {\n const converted = convertTypesOnInstance(value);\n return JSON.stringify(converted);\n }\n\n /**\n * Deserialize a JSON string to the specific type.\n * @param {Constructor} targetType Type to deserialize to.\n * @param {string} json Actual JSON to deserialize.\n * @returns An instance of the target type.\n */\n static deserialize<TResult extends object>(targetType: Constructor<TResult>, json: string): TResult {\n const parsed = JSON.parse(json);\n return this.deserializeFromInstance<TResult>(targetType, parsed);\n }\n\n /**\n * Deserialize a array JSON string to an array of the specific instance type.\n * @param {Constructor} targetType Type to deserialize to.\n * @param {string} json Actual JSON to deserialize.\n * @returns An array of instances of the target type.\n */\n static deserializeArray<TResult extends object>(targetType: Constructor<TResult>, json: string): TResult[] {\n const parsed = JSON.parse(json);\n return this.deserializeArrayFromInstance(targetType, parsed);\n }\n\n /**\n * Deserialize an any instance to a specific instance type.\n * Fields with an undefined input value keep their constructor defaults, except collections,\n * which become empty arrays. Explicit null values override defaults.\n * @param {Constructor} targetType Type to deserialize to.\n * @param {*} instance Actual instance to deserialize.\n * @returns An instance of the target type.\n */\n static deserializeFromInstance<TResult extends object>(targetType: Constructor<TResult>, instance: any): TResult {\n const fields = Fields.getFieldsForType(targetType as Constructor);\n\n if (converterFor(targetType) || isConceptAs(targetType)) {\n return deserializeValueFromType(targetType, instance);\n }\n\n const deserialized = new targetType();\n for (const field of fields) {\n let value = instance[field.name];\n if (value !== undefined && value !== null) {\n if (field.type === Array) {\n const elementType = field.genericArguments[0];\n if (elementType) {\n const elementField = new Field(field.name, elementType, false, field.derivatives, []);\n value = value.map(_ => deserializeValueFromField(elementField, _));\n }\n } else if (field.enumerable) {\n value = value.map(_ => deserializeValueFromField(field, _));\n } else {\n value = deserializeValueFromField(field, value);\n }\n } else if ((field.enumerable || field.type === Array) && value === undefined) {\n // A collection that is absent from the payload deserializes to an empty one rather than to\n // undefined. The declared type says the field is an array, and a producer that leaves an\n // empty collection out - which the Chronicle sink does deliberately, so that a parallel\n // replay cannot overwrite children a sibling event already wrote - would otherwise hand back\n // a value contradicting its own type, putting a null guard on every reader of every\n // collection. An explicit null is left alone: that is the producer saying \"no collection\"\n // rather than \"an empty one\".\n value = [];\n } else if (value === undefined) {\n continue;\n }\n\n deserialized[field.name] = value;\n }\n\n // Preserve the polymorphic type discriminator so it is never lost across (de)serialization\n // layers. '_derivedTypeId' is not a declared field, so it is otherwise dropped here — and a\n // derived value whose concrete type could not be resolved (e.g. its type was not yet\n // registered) would then have no discriminator left to re-resolve or round-trip with, and\n // would serialize back with no type information at all.\n const derivedTypeId = instance[JsonSerializer.DerivedTypeIdProperty];\n if (derivedTypeId !== undefined && derivedTypeId !== null) {\n (deserialized as Record<string, unknown>)[JsonSerializer.DerivedTypeIdProperty] = derivedTypeId;\n }\n\n if ((targetType as Constructor) == Object) {\n const objectFields = Object.keys(instance).filter((value) => {\n return !fields.some(_ => _.name == value);\n });\n\n for (const field of objectFields) {\n deserialized[field] = instance[field];\n }\n }\n\n return deserialized;\n }\n\n /**\n * Deserialize an array of any instances to an array of specific instance types.\n * @param {Constructor} targetType Type to deserialize to.\n * @param {instances} instances Actual instances to deserialize.\n * @returns An array of instances of the target type.\n */\n static deserializeArrayFromInstance<TResult extends object>(targetType: Constructor<TResult>, instances: any): TResult[] {\n const deserialized: TResult[] = [];\n\n for (const instance of instances) {\n deserialized.push(this.deserializeFromInstance<TResult>(targetType, instance));\n }\n\n return deserialized;\n }\n}\n"],"names":["registerModuleInstance","DateJsonConverter","DateOnlyJsonConverter","GuidJsonConverter","TimeOnlyJsonConverter","TimeSpanJsonConverter","PointJsonConverter","LineStringJsonConverter","PolygonJsonConverter","ValueMapJsonConverter","declaredTypeKey","valueMapTypeKey","typeKeyOf","conceptAsTypeKey","DerivedType","guidTypeKey","Guid","dateOnlyTypeKey","DateOnly","timeOnlyTypeKey","TimeOnly","timeSpanTypeKey","TimeSpan","ValueMap","Fields","Field"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"JsonSerializer.d.ts","sourceRoot":"","sources":["../../JsonSerializer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAW5C,OAAO,EACH,aAAa,EAUhB,MAAM,QAAQ,CAAC;AAmVhB,qBAAa,cAAc;IACvB,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAoB;IAsBjE,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI;IASxD,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM;IAWpC,MAAM,CAAC,WAAW,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAWnG,MAAM,CAAC,gBAAgB,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE;IAW1G,MAAM,CAAC,uBAAuB,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO;IAiEhH,MAAM,CAAC,4BAA4B,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,OAAO,EAAE;CAS3H"}
1
+ {"version":3,"file":"JsonSerializer.d.ts","sourceRoot":"","sources":["../../JsonSerializer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAW5C,OAAO,EACH,aAAa,EAUhB,MAAM,QAAQ,CAAC;AAmVhB,qBAAa,cAAc;IACvB,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAoB;IAsBjE,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI;IASxD,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM;IAWpC,MAAM,CAAC,WAAW,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAWnG,MAAM,CAAC,gBAAgB,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE;IAa1G,MAAM,CAAC,uBAAuB,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO;IAmEhH,MAAM,CAAC,4BAA4B,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,OAAO,EAAE;CAS3H"}
@@ -274,6 +274,9 @@ class JsonSerializer {
274
274
  else if ((field.enumerable || field.type === Array) && value === undefined) {
275
275
  value = [];
276
276
  }
277
+ else if (value === undefined) {
278
+ continue;
279
+ }
277
280
  deserialized[field.name] = value;
278
281
  }
279
282
  const derivedTypeId = instance[JsonSerializer.DerivedTypeIdProperty];
@@ -1 +1 @@
1
- {"version":3,"file":"JsonSerializer.js","sources":["../../JsonSerializer.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { Constructor } from './Constructor';\nimport { DerivedType } from './DerivedType';\nimport { registerModuleInstance } from './duplicateInstanceGuard';\nimport { Field } from './Field';\nimport { Fields } from './Fields';\nimport { Guid } from './Guid';\nimport { DateOnly } from './DateOnly';\nimport { TimeOnly } from './TimeOnly';\nimport { TimeSpan } from './TimeSpan';\nimport { conceptAsTypeKey, dateOnlyTypeKey, declaredTypeKey, guidTypeKey, timeOnlyTypeKey, timeSpanTypeKey, typeKeyOf, valueMapTypeKey } from './typeKey';\nimport { ValueMap } from './ValueMap';\nimport { \n JsonConverter, \n DateJsonConverter, \n DateOnlyJsonConverter,\n GuidJsonConverter, \n TimeOnlyJsonConverter,\n TimeSpanJsonConverter, \n PointJsonConverter,\n LineStringJsonConverter,\n PolygonJsonConverter,\n ValueMapJsonConverter\n} from './json';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\ntype typeSerializer = (value: any) => any;\n\n// A second copy of this package in the same realm builds its own registry here, and brings its own\n// class objects. Convertible values still cross between the copies, because a type is recognized by\n// the key it declares - but a converter registered on one copy reaches only that one, and a version\n// pinned at the top level never reaches a nested copy. Announce it where the state that cannot be\n// shared is built.\nregisterModuleInstance();\n\n// Initialize converters\nconst converters: JsonConverter[] = [\n new DateJsonConverter(),\n new DateOnlyJsonConverter(),\n new GuidJsonConverter(),\n new TimeOnlyJsonConverter(),\n new TimeSpanJsonConverter(),\n new PointJsonConverter(),\n new LineStringJsonConverter(),\n new PolygonJsonConverter(),\n new ValueMapJsonConverter()\n];\n\n// Converters are found by the key a type declares, and only by the constructor when it declares none.\n// Keying on the constructor alone is what made a second copy of this package silently fatal: each copy\n// brings its own Guid, ConceptAs and ValueMap class objects, so neither recognized the other's. A key\n// crosses that boundary; a class object does not. A consumer's own type has no key and is found by\n// constructor, which is exact and needs nothing to cross.\nconst keyedConverters: Map<string, JsonConverter> = new Map<string, JsonConverter>();\nconst typeConverters: Map<Constructor, JsonConverter> = new Map<Constructor, JsonConverter>();\n\nconst registerConverterFor = (converter: JsonConverter) => {\n const key = declaredTypeKey(converter.type);\n if (key !== undefined) {\n keyedConverters.set(key, converter);\n }\n\n typeConverters.set(converter.type, converter);\n};\n\nconverters.forEach(registerConverterFor);\n\n/**\n * Finds the converter registered for a type, if any.\n * @param {Constructor} type The type to convert.\n * @returns {JsonConverter | undefined} The converter, or undefined when the type has none.\n */\nconst converterFor = (type: Constructor | undefined): JsonConverter | undefined => {\n if (!type) return undefined;\n\n const key = declaredTypeKey(type);\n const keyed = key === undefined ? undefined : keyedConverters.get(key);\n return keyed ?? typeConverters.get(type);\n};\n\n/**\n * Checks whether a type is a ValueMap, including one from another copy of this package.\n * @param {Constructor} type The type to check.\n * @returns {boolean} True when the type is a ValueMap.\n */\nconst isValueMap = (type: Constructor | undefined): boolean => declaredTypeKey(type) === valueMapTypeKey;\n\n// Add primitive type converters that don't need a full JsonConverter class\nconst primitiveConverters: Map<Constructor, typeSerializer> = new Map<Constructor, typeSerializer>([\n [Number, (value: number) => value],\n [String, (value: string) => value],\n [Boolean, (value: boolean) => value]\n]);\n\nconst primitiveSerializers: Map<Constructor, typeSerializer> = new Map<Constructor, typeSerializer>([\n [Number, (value: any) => value],\n [String, (value: any) => value],\n [Boolean, (value: any) => value]\n]);\n\n/**\n * Checks if a constructor is a ConceptAs type.\n * @param {Constructor} type The constructor to check.\n * @returns {boolean} True if the type extends ConceptAs.\n * @remarks\n * Reads the key rather than walking the prototype chain looking for this copy's ConceptAs. The key is a\n * static and a static is inherited, so every type deriving from ConceptAs carries it - including one\n * deriving from another copy's ConceptAs, which a prototype walk could never recognize.\n */\nconst isConceptAs = (type: Constructor): boolean => typeKeyOf(type) === conceptAsTypeKey;\n\nconst serializeValueForType = (type: Constructor, value: any) => {\n if (!value) return value;\n\n // If it's a ConceptAs instance, unwrap it and serialize the inner value recursively\n // This follows the C# pattern: recognize as concept, unwrap, then call serializer\n if (isConceptAs(value.constructor)) {\n const innerValue = value.value;\n // Recursively serialize the inner value to handle complex types\n // Use .constructor directly which works reliably for both primitives and objects\n return serializeValueForType(innerValue.constructor, innerValue);\n }\n\n // Check if there's a registered converter\n const converter = converterFor(type);\n if (converter) {\n return converter.write(value);\n }\n \n // Check primitive converters\n if (primitiveConverters.has(type)) {\n return primitiveConverters.get(type)!(value);\n }\n \n return convertTypesOnInstance(value);\n};\n\nconst deserializeValueFromType = (type: Constructor, value: any) => {\n // If it's a ConceptAs type, instantiate it with the value\n if (isConceptAs(type)) {\n const valueType = (type as Constructor & { valueType?: Constructor }).valueType;\n return new type(valueType ? deserializeValueFromType(valueType, value) : value);\n }\n \n // Check if there's a registered converter\n const converter = converterFor(type);\n if (converter) {\n return converter.read(value);\n }\n \n // Check primitive serializers\n if (primitiveSerializers.has(type)) {\n return primitiveSerializers.get(type)!(value);\n }\n \n return JsonSerializer.deserialize(type, JSON.stringify(value));\n};\n\nconst deserializeValueFromField = (field: Field, value: any) => {\n if (value === null || value === undefined) return value;\n\n if (isValueMap(field.type)) {\n return deserializeValueMapFromField(field, value);\n }\n\n // If it's a ConceptAs type, instantiate it with the value\n if (isConceptAs(field.type)) {\n return deserializeValueFromType(field.type, value);\n }\n\n // Check if there's a registered converter\n const converter = converterFor(field.type);\n if (converter) {\n return converter.read(value);\n }\n \n // Check primitive serializers\n if (primitiveSerializers.has(field.type)) {\n return primitiveSerializers.get(field.type)!(value);\n }\n \n let type = field.type;\n if (value[JsonSerializer.DerivedTypeIdProperty]) {\n const derivedTypeId = value[JsonSerializer.DerivedTypeIdProperty];\n const candidates = [...field.derivatives, ...DerivedType.getDerivedTypesFor(field.type)];\n type = candidates.find(_ => DerivedType.get(_) == derivedTypeId) || type;\n }\n\n return JsonSerializer.deserialize(type, JSON.stringify(value));\n};\n\nconst serializeMapKey = (key: any): string => {\n if (key === undefined || key === null) {\n return '';\n }\n\n if (typeof key === 'string') {\n return key;\n }\n\n if (typeof key === 'number' || typeof key === 'boolean' || typeof key === 'bigint') {\n return key.toString();\n }\n\n if (key instanceof Date) {\n return key.toISOString();\n }\n\n // Guid, DateOnly, TimeOnly and TimeSpan keys are their plain canonical strings, as a C# dictionary\n // writes them, rather than the quoted JSON string the generic path would produce.\n if (plainStringMapKeyTypes.has(declaredTypeKey(key.constructor) ?? '')) {\n return key.toString();\n }\n\n return JsonSerializer.serialize(key);\n};\n\nconst plainStringMapKeyTypes = new Map<string, { name: string; parse: (text: string) => any }>([\n [guidTypeKey, {\n name: 'Guid',\n parse: text => {\n if (!Guid.isGuid(text)) {\n throw new Error('Not a Guid.');\n }\n return Guid.parse(text);\n }\n }],\n [dateOnlyTypeKey, { name: 'DateOnly', parse: DateOnly.parse }],\n [timeOnlyTypeKey, { name: 'TimeOnly', parse: TimeOnly.parse }],\n [timeSpanTypeKey, { name: 'TimeSpan', parse: TimeSpan.parse }]\n]);\n\nconst unquoteLegacyMapKey = (key: string): string =>\n // Keys written before the plain form was adopted carry the JSON quotes of an embedded string.\n key.length >= 2 && key.startsWith('\"') && key.endsWith('\"') ? key.slice(1, -1) : key;\n\nconst readPlainStringMapKey = (name: string, parse: (text: string) => any, key: string): any => {\n try {\n return parse(unquoteLegacyMapKey(key));\n } catch {\n throw new Error(`The map key '${key}' is not a valid ${name}.`);\n }\n};\n\nconst deserializeMapKey = (keyType: Constructor, key: string): any => {\n if (keyType === String) {\n return key;\n }\n\n if (keyType === Number) {\n return Number(key);\n }\n\n if (keyType === Boolean) {\n return key.toLowerCase() === 'true';\n }\n\n const plainKeyType = plainStringMapKeyTypes.get(declaredTypeKey(keyType) ?? '');\n if (plainKeyType) {\n return readPlainStringMapKey(plainKeyType.name, plainKeyType.parse, key);\n }\n\n // Check if there's a converter for this type\n const converter = converterFor(keyType);\n if (converter) {\n return converter.read(key);\n }\n\n return JsonSerializer.deserialize(keyType, key);\n};\n\nconst deserializeMapValue = (valueType: Constructor | undefined, value: any): any => {\n if (value === null || value === undefined) return value;\n\n if (!valueType) {\n return value;\n }\n\n // A map value is an ordinary value of its declared type, so read it the way any other value of that\n // type is read. Resolving it here instead left out the concept and primitive cases, and the\n // primitive one lost data without a sound: a string value went through JsonSerializer.deserialize,\n // which built an empty String object because a primitive has no fields to populate.\n return deserializeValueFromType(valueType, value);\n};\n\nconst deserializeValueMapFromField = (field: Field, value: any): ValueMap<any, any> => {\n const valueMap = new ValueMap<any, any>();\n const keyType = field.genericArguments[0];\n const valueType = field.genericArguments[1];\n\n if (!value || !keyType) {\n return valueMap;\n }\n\n for (const key of Object.keys(value)) {\n const deserializedKey = deserializeMapKey(keyType, key);\n const deserializedValue = deserializeMapValue(valueType, value[key]);\n valueMap.set(deserializedKey, deserializedValue);\n }\n\n return valueMap;\n};\n\nconst convertTypesOnInstance = (instance: any) => {\n if (instance === null || instance === undefined) return instance;\n\n // A concept unwraps to its underlying value wherever it is reached, not only when it is reached\n // through a declared field. An array element and a map value arrive here rather than at\n // serializeValueForType, and without this they were written as the object a concept happens to be -\n // {\"value\": ...} where the receiver declared the underlying type.\n if (isConceptAs(instance.constructor)) {\n return serializeValueForType(instance.constructor as Constructor, instance);\n }\n\n // Check if there's a converter for this type\n if (converterFor(instance.constructor)) {\n return serializeValueForType(instance.constructor, instance);\n }\n \n // Check primitive converters\n if (primitiveConverters.has(instance.constructor)) {\n return primitiveConverters.get(instance.constructor)!(instance);\n }\n\n const properties = Object.getOwnPropertyNames(instance);\n const converted: any = {};\n\n // Emit the polymorphic type discriminator, preferring the registered type for the instance's\n // constructor and falling back to a discriminator preserved on the instance itself (e.g. a value\n // that was deserialized before its concrete type could be resolved). This keeps '_derivedTypeId'\n // flowing through serialization transparently — the caller never has to manage it — and is the\n // mirror of preserving it on deserialization.\n const derivedTypeId = DerivedType.get(instance.constructor) ?? instance[JsonSerializer.DerivedTypeIdProperty];\n if (derivedTypeId) {\n converted[JsonSerializer.DerivedTypeIdProperty] = derivedTypeId;\n }\n properties.forEach(property => {\n // The discriminator is handled above as a meta-property; never treat it as a data field.\n if (property === JsonSerializer.DerivedTypeIdProperty) return;\n let value = instance[property];\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n value = value.map(_ => convertTypesOnInstance(_));\n } else {\n value = serializeValueForType(value.__proto__.constructor, value);\n }\n }\n\n converted[property] = value;\n });\n\n return converted;\n};\n\n// Initialize ValueMapJsonConverter with helper functions to avoid circular dependencies\n// Must be done after serializeMapKey and convertTypesOnInstance are defined\nValueMapJsonConverter.setHelpers(serializeMapKey, convertTypesOnInstance);\n\n/**\n * Represents a serializer for JSON.\n */\nexport class JsonSerializer {\n static readonly DerivedTypeIdProperty: string = \"_derivedTypeId\";\n\n /**\n * Register a converter for the type it declares through its `type` property.\n * @param {JsonConverter} converter The converter to register.\n * @remarks\n * The converter is used for both directions - `read` on the way in, `write` on the way out - and\n * takes the place of any converter already registered for the same type, including the built-in\n * ones. Replacing a built-in changes the payloads the application produces and consumes, which is\n * the caller's to decide; nothing here second-guesses it.\n *\n * Two shapes resolve ahead of the converters, so a converter registered for them is not reached:\n *\n * - A type deriving from `ConceptAs` is unwrapped to its underlying value in both directions, and\n * converted as that value's type. Register for the underlying type to reach a concept.\n * - A `ValueMap` is read back from the declaring field's generic arguments rather than through a\n * converter. Note the asymmetry: writing a `ValueMap` *does* go through the registered converter,\n * so replacing that one changes only the outbound half.\n * - A `Guid`, `DateOnly`, `TimeOnly` or `TimeSpan` used as a `ValueMap` key always uses the plain\n * canonical string form and bypasses any registered converter for that type, so that keys stay\n * compatible with C# dictionaries.\n */\n static registerConverter(converter: JsonConverter): void {\n registerConverterFor(converter);\n }\n\n /**\n * Serialize with strong type information.\n * @param {*} value The value to serialize.\n * @returns A JSON string.\n */\n static serialize(value: any): string {\n const converted = convertTypesOnInstance(value);\n return JSON.stringify(converted);\n }\n\n /**\n * Deserialize a JSON string to the specific type.\n * @param {Constructor} targetType Type to deserialize to.\n * @param {string} json Actual JSON to deserialize.\n * @returns An instance of the target type.\n */\n static deserialize<TResult extends object>(targetType: Constructor<TResult>, json: string): TResult {\n const parsed = JSON.parse(json);\n return this.deserializeFromInstance<TResult>(targetType, parsed);\n }\n\n /**\n * Deserialize a array JSON string to an array of the specific instance type.\n * @param {Constructor} targetType Type to deserialize to.\n * @param {string} json Actual JSON to deserialize.\n * @returns An array of instances of the target type.\n */\n static deserializeArray<TResult extends object>(targetType: Constructor<TResult>, json: string): TResult[] {\n const parsed = JSON.parse(json);\n return this.deserializeArrayFromInstance(targetType, parsed);\n }\n\n /**\n * Deserialize an any instance to a specific instance type.\n * @param {Constructor} targetType Type to deserialize to.\n * @param {*} instance Actual instance to deserialize.\n * @returns An instance of the target type.\n */\n static deserializeFromInstance<TResult extends object>(targetType: Constructor<TResult>, instance: any): TResult {\n const fields = Fields.getFieldsForType(targetType as Constructor);\n\n if (converterFor(targetType) || isConceptAs(targetType)) {\n return deserializeValueFromType(targetType, instance);\n }\n\n const deserialized = new targetType();\n for (const field of fields) {\n let value = instance[field.name];\n if (value !== undefined && value !== null) {\n if (field.type === Array) {\n const elementType = field.genericArguments[0];\n if (elementType) {\n const elementField = new Field(field.name, elementType, false, field.derivatives, []);\n value = value.map(_ => deserializeValueFromField(elementField, _));\n }\n } else if (field.enumerable) {\n value = value.map(_ => deserializeValueFromField(field, _));\n } else {\n value = deserializeValueFromField(field, value);\n }\n } else if ((field.enumerable || field.type === Array) && value === undefined) {\n // A collection that is absent from the payload deserializes to an empty one rather than to\n // undefined. The declared type says the field is an array, and a producer that leaves an\n // empty collection out - which the Chronicle sink does deliberately, so that a parallel\n // replay cannot overwrite children a sibling event already wrote - would otherwise hand back\n // a value contradicting its own type, putting a null guard on every reader of every\n // collection. An explicit null is left alone: that is the producer saying \"no collection\"\n // rather than \"an empty one\".\n value = [];\n }\n\n deserialized[field.name] = value;\n }\n\n // Preserve the polymorphic type discriminator so it is never lost across (de)serialization\n // layers. '_derivedTypeId' is not a declared field, so it is otherwise dropped here — and a\n // derived value whose concrete type could not be resolved (e.g. its type was not yet\n // registered) would then have no discriminator left to re-resolve or round-trip with, and\n // would serialize back with no type information at all.\n const derivedTypeId = instance[JsonSerializer.DerivedTypeIdProperty];\n if (derivedTypeId !== undefined && derivedTypeId !== null) {\n (deserialized as Record<string, unknown>)[JsonSerializer.DerivedTypeIdProperty] = derivedTypeId;\n }\n\n if ((targetType as Constructor) == Object) {\n const objectFields = Object.keys(instance).filter((value) => {\n return !fields.some(_ => _.name == value);\n });\n\n for (const field of objectFields) {\n deserialized[field] = instance[field];\n }\n }\n\n return deserialized;\n }\n\n /**\n * Deserialize an array of any instances to an array of specific instance types.\n * @param {Constructor} targetType Type to deserialize to.\n * @param {instances} instances Actual instances to deserialize.\n * @returns An array of instances of the target type.\n */\n static deserializeArrayFromInstance<TResult extends object>(targetType: Constructor<TResult>, instances: any): TResult[] {\n const deserialized: TResult[] = [];\n\n for (const instance of instances) {\n deserialized.push(this.deserializeFromInstance<TResult>(targetType, instance));\n }\n\n return deserialized;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"JsonSerializer.js","sources":["../../JsonSerializer.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { Constructor } from './Constructor';\nimport { DerivedType } from './DerivedType';\nimport { registerModuleInstance } from './duplicateInstanceGuard';\nimport { Field } from './Field';\nimport { Fields } from './Fields';\nimport { Guid } from './Guid';\nimport { DateOnly } from './DateOnly';\nimport { TimeOnly } from './TimeOnly';\nimport { TimeSpan } from './TimeSpan';\nimport { conceptAsTypeKey, dateOnlyTypeKey, declaredTypeKey, guidTypeKey, timeOnlyTypeKey, timeSpanTypeKey, typeKeyOf, valueMapTypeKey } from './typeKey';\nimport { ValueMap } from './ValueMap';\nimport { \n JsonConverter, \n DateJsonConverter, \n DateOnlyJsonConverter,\n GuidJsonConverter, \n TimeOnlyJsonConverter,\n TimeSpanJsonConverter, \n PointJsonConverter,\n LineStringJsonConverter,\n PolygonJsonConverter,\n ValueMapJsonConverter\n} from './json';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\ntype typeSerializer = (value: any) => any;\n\n// A second copy of this package in the same realm builds its own registry here, and brings its own\n// class objects. Convertible values still cross between the copies, because a type is recognized by\n// the key it declares - but a converter registered on one copy reaches only that one, and a version\n// pinned at the top level never reaches a nested copy. Announce it where the state that cannot be\n// shared is built.\nregisterModuleInstance();\n\n// Initialize converters\nconst converters: JsonConverter[] = [\n new DateJsonConverter(),\n new DateOnlyJsonConverter(),\n new GuidJsonConverter(),\n new TimeOnlyJsonConverter(),\n new TimeSpanJsonConverter(),\n new PointJsonConverter(),\n new LineStringJsonConverter(),\n new PolygonJsonConverter(),\n new ValueMapJsonConverter()\n];\n\n// Converters are found by the key a type declares, and only by the constructor when it declares none.\n// Keying on the constructor alone is what made a second copy of this package silently fatal: each copy\n// brings its own Guid, ConceptAs and ValueMap class objects, so neither recognized the other's. A key\n// crosses that boundary; a class object does not. A consumer's own type has no key and is found by\n// constructor, which is exact and needs nothing to cross.\nconst keyedConverters: Map<string, JsonConverter> = new Map<string, JsonConverter>();\nconst typeConverters: Map<Constructor, JsonConverter> = new Map<Constructor, JsonConverter>();\n\nconst registerConverterFor = (converter: JsonConverter) => {\n const key = declaredTypeKey(converter.type);\n if (key !== undefined) {\n keyedConverters.set(key, converter);\n }\n\n typeConverters.set(converter.type, converter);\n};\n\nconverters.forEach(registerConverterFor);\n\n/**\n * Finds the converter registered for a type, if any.\n * @param {Constructor} type The type to convert.\n * @returns {JsonConverter | undefined} The converter, or undefined when the type has none.\n */\nconst converterFor = (type: Constructor | undefined): JsonConverter | undefined => {\n if (!type) return undefined;\n\n const key = declaredTypeKey(type);\n const keyed = key === undefined ? undefined : keyedConverters.get(key);\n return keyed ?? typeConverters.get(type);\n};\n\n/**\n * Checks whether a type is a ValueMap, including one from another copy of this package.\n * @param {Constructor} type The type to check.\n * @returns {boolean} True when the type is a ValueMap.\n */\nconst isValueMap = (type: Constructor | undefined): boolean => declaredTypeKey(type) === valueMapTypeKey;\n\n// Add primitive type converters that don't need a full JsonConverter class\nconst primitiveConverters: Map<Constructor, typeSerializer> = new Map<Constructor, typeSerializer>([\n [Number, (value: number) => value],\n [String, (value: string) => value],\n [Boolean, (value: boolean) => value]\n]);\n\nconst primitiveSerializers: Map<Constructor, typeSerializer> = new Map<Constructor, typeSerializer>([\n [Number, (value: any) => value],\n [String, (value: any) => value],\n [Boolean, (value: any) => value]\n]);\n\n/**\n * Checks if a constructor is a ConceptAs type.\n * @param {Constructor} type The constructor to check.\n * @returns {boolean} True if the type extends ConceptAs.\n * @remarks\n * Reads the key rather than walking the prototype chain looking for this copy's ConceptAs. The key is a\n * static and a static is inherited, so every type deriving from ConceptAs carries it - including one\n * deriving from another copy's ConceptAs, which a prototype walk could never recognize.\n */\nconst isConceptAs = (type: Constructor): boolean => typeKeyOf(type) === conceptAsTypeKey;\n\nconst serializeValueForType = (type: Constructor, value: any) => {\n if (!value) return value;\n\n // If it's a ConceptAs instance, unwrap it and serialize the inner value recursively\n // This follows the C# pattern: recognize as concept, unwrap, then call serializer\n if (isConceptAs(value.constructor)) {\n const innerValue = value.value;\n // Recursively serialize the inner value to handle complex types\n // Use .constructor directly which works reliably for both primitives and objects\n return serializeValueForType(innerValue.constructor, innerValue);\n }\n\n // Check if there's a registered converter\n const converter = converterFor(type);\n if (converter) {\n return converter.write(value);\n }\n \n // Check primitive converters\n if (primitiveConverters.has(type)) {\n return primitiveConverters.get(type)!(value);\n }\n \n return convertTypesOnInstance(value);\n};\n\nconst deserializeValueFromType = (type: Constructor, value: any) => {\n // If it's a ConceptAs type, instantiate it with the value\n if (isConceptAs(type)) {\n const valueType = (type as Constructor & { valueType?: Constructor }).valueType;\n return new type(valueType ? deserializeValueFromType(valueType, value) : value);\n }\n \n // Check if there's a registered converter\n const converter = converterFor(type);\n if (converter) {\n return converter.read(value);\n }\n \n // Check primitive serializers\n if (primitiveSerializers.has(type)) {\n return primitiveSerializers.get(type)!(value);\n }\n \n return JsonSerializer.deserialize(type, JSON.stringify(value));\n};\n\nconst deserializeValueFromField = (field: Field, value: any) => {\n if (value === null || value === undefined) return value;\n\n if (isValueMap(field.type)) {\n return deserializeValueMapFromField(field, value);\n }\n\n // If it's a ConceptAs type, instantiate it with the value\n if (isConceptAs(field.type)) {\n return deserializeValueFromType(field.type, value);\n }\n\n // Check if there's a registered converter\n const converter = converterFor(field.type);\n if (converter) {\n return converter.read(value);\n }\n \n // Check primitive serializers\n if (primitiveSerializers.has(field.type)) {\n return primitiveSerializers.get(field.type)!(value);\n }\n \n let type = field.type;\n if (value[JsonSerializer.DerivedTypeIdProperty]) {\n const derivedTypeId = value[JsonSerializer.DerivedTypeIdProperty];\n const candidates = [...field.derivatives, ...DerivedType.getDerivedTypesFor(field.type)];\n type = candidates.find(_ => DerivedType.get(_) == derivedTypeId) || type;\n }\n\n return JsonSerializer.deserialize(type, JSON.stringify(value));\n};\n\nconst serializeMapKey = (key: any): string => {\n if (key === undefined || key === null) {\n return '';\n }\n\n if (typeof key === 'string') {\n return key;\n }\n\n if (typeof key === 'number' || typeof key === 'boolean' || typeof key === 'bigint') {\n return key.toString();\n }\n\n if (key instanceof Date) {\n return key.toISOString();\n }\n\n // Guid, DateOnly, TimeOnly and TimeSpan keys are their plain canonical strings, as a C# dictionary\n // writes them, rather than the quoted JSON string the generic path would produce.\n if (plainStringMapKeyTypes.has(declaredTypeKey(key.constructor) ?? '')) {\n return key.toString();\n }\n\n return JsonSerializer.serialize(key);\n};\n\nconst plainStringMapKeyTypes = new Map<string, { name: string; parse: (text: string) => any }>([\n [guidTypeKey, {\n name: 'Guid',\n parse: text => {\n if (!Guid.isGuid(text)) {\n throw new Error('Not a Guid.');\n }\n return Guid.parse(text);\n }\n }],\n [dateOnlyTypeKey, { name: 'DateOnly', parse: DateOnly.parse }],\n [timeOnlyTypeKey, { name: 'TimeOnly', parse: TimeOnly.parse }],\n [timeSpanTypeKey, { name: 'TimeSpan', parse: TimeSpan.parse }]\n]);\n\nconst unquoteLegacyMapKey = (key: string): string =>\n // Keys written before the plain form was adopted carry the JSON quotes of an embedded string.\n key.length >= 2 && key.startsWith('\"') && key.endsWith('\"') ? key.slice(1, -1) : key;\n\nconst readPlainStringMapKey = (name: string, parse: (text: string) => any, key: string): any => {\n try {\n return parse(unquoteLegacyMapKey(key));\n } catch {\n throw new Error(`The map key '${key}' is not a valid ${name}.`);\n }\n};\n\nconst deserializeMapKey = (keyType: Constructor, key: string): any => {\n if (keyType === String) {\n return key;\n }\n\n if (keyType === Number) {\n return Number(key);\n }\n\n if (keyType === Boolean) {\n return key.toLowerCase() === 'true';\n }\n\n const plainKeyType = plainStringMapKeyTypes.get(declaredTypeKey(keyType) ?? '');\n if (plainKeyType) {\n return readPlainStringMapKey(plainKeyType.name, plainKeyType.parse, key);\n }\n\n // Check if there's a converter for this type\n const converter = converterFor(keyType);\n if (converter) {\n return converter.read(key);\n }\n\n return JsonSerializer.deserialize(keyType, key);\n};\n\nconst deserializeMapValue = (valueType: Constructor | undefined, value: any): any => {\n if (value === null || value === undefined) return value;\n\n if (!valueType) {\n return value;\n }\n\n // A map value is an ordinary value of its declared type, so read it the way any other value of that\n // type is read. Resolving it here instead left out the concept and primitive cases, and the\n // primitive one lost data without a sound: a string value went through JsonSerializer.deserialize,\n // which built an empty String object because a primitive has no fields to populate.\n return deserializeValueFromType(valueType, value);\n};\n\nconst deserializeValueMapFromField = (field: Field, value: any): ValueMap<any, any> => {\n const valueMap = new ValueMap<any, any>();\n const keyType = field.genericArguments[0];\n const valueType = field.genericArguments[1];\n\n if (!value || !keyType) {\n return valueMap;\n }\n\n for (const key of Object.keys(value)) {\n const deserializedKey = deserializeMapKey(keyType, key);\n const deserializedValue = deserializeMapValue(valueType, value[key]);\n valueMap.set(deserializedKey, deserializedValue);\n }\n\n return valueMap;\n};\n\nconst convertTypesOnInstance = (instance: any) => {\n if (instance === null || instance === undefined) return instance;\n\n // A concept unwraps to its underlying value wherever it is reached, not only when it is reached\n // through a declared field. An array element and a map value arrive here rather than at\n // serializeValueForType, and without this they were written as the object a concept happens to be -\n // {\"value\": ...} where the receiver declared the underlying type.\n if (isConceptAs(instance.constructor)) {\n return serializeValueForType(instance.constructor as Constructor, instance);\n }\n\n // Check if there's a converter for this type\n if (converterFor(instance.constructor)) {\n return serializeValueForType(instance.constructor, instance);\n }\n \n // Check primitive converters\n if (primitiveConverters.has(instance.constructor)) {\n return primitiveConverters.get(instance.constructor)!(instance);\n }\n\n const properties = Object.getOwnPropertyNames(instance);\n const converted: any = {};\n\n // Emit the polymorphic type discriminator, preferring the registered type for the instance's\n // constructor and falling back to a discriminator preserved on the instance itself (e.g. a value\n // that was deserialized before its concrete type could be resolved). This keeps '_derivedTypeId'\n // flowing through serialization transparently — the caller never has to manage it — and is the\n // mirror of preserving it on deserialization.\n const derivedTypeId = DerivedType.get(instance.constructor) ?? instance[JsonSerializer.DerivedTypeIdProperty];\n if (derivedTypeId) {\n converted[JsonSerializer.DerivedTypeIdProperty] = derivedTypeId;\n }\n properties.forEach(property => {\n // The discriminator is handled above as a meta-property; never treat it as a data field.\n if (property === JsonSerializer.DerivedTypeIdProperty) return;\n let value = instance[property];\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n value = value.map(_ => convertTypesOnInstance(_));\n } else {\n value = serializeValueForType(value.__proto__.constructor, value);\n }\n }\n\n converted[property] = value;\n });\n\n return converted;\n};\n\n// Initialize ValueMapJsonConverter with helper functions to avoid circular dependencies\n// Must be done after serializeMapKey and convertTypesOnInstance are defined\nValueMapJsonConverter.setHelpers(serializeMapKey, convertTypesOnInstance);\n\n/**\n * Represents a serializer for JSON.\n */\nexport class JsonSerializer {\n static readonly DerivedTypeIdProperty: string = \"_derivedTypeId\";\n\n /**\n * Register a converter for the type it declares through its `type` property.\n * @param {JsonConverter} converter The converter to register.\n * @remarks\n * The converter is used for both directions - `read` on the way in, `write` on the way out - and\n * takes the place of any converter already registered for the same type, including the built-in\n * ones. Replacing a built-in changes the payloads the application produces and consumes, which is\n * the caller's to decide; nothing here second-guesses it.\n *\n * Two shapes resolve ahead of the converters, so a converter registered for them is not reached:\n *\n * - A type deriving from `ConceptAs` is unwrapped to its underlying value in both directions, and\n * converted as that value's type. Register for the underlying type to reach a concept.\n * - A `ValueMap` is read back from the declaring field's generic arguments rather than through a\n * converter. Note the asymmetry: writing a `ValueMap` *does* go through the registered converter,\n * so replacing that one changes only the outbound half.\n * - A `Guid`, `DateOnly`, `TimeOnly` or `TimeSpan` used as a `ValueMap` key always uses the plain\n * canonical string form and bypasses any registered converter for that type, so that keys stay\n * compatible with C# dictionaries.\n */\n static registerConverter(converter: JsonConverter): void {\n registerConverterFor(converter);\n }\n\n /**\n * Serialize with strong type information.\n * @param {*} value The value to serialize.\n * @returns A JSON string.\n */\n static serialize(value: any): string {\n const converted = convertTypesOnInstance(value);\n return JSON.stringify(converted);\n }\n\n /**\n * Deserialize a JSON string to the specific type.\n * @param {Constructor} targetType Type to deserialize to.\n * @param {string} json Actual JSON to deserialize.\n * @returns An instance of the target type.\n */\n static deserialize<TResult extends object>(targetType: Constructor<TResult>, json: string): TResult {\n const parsed = JSON.parse(json);\n return this.deserializeFromInstance<TResult>(targetType, parsed);\n }\n\n /**\n * Deserialize a array JSON string to an array of the specific instance type.\n * @param {Constructor} targetType Type to deserialize to.\n * @param {string} json Actual JSON to deserialize.\n * @returns An array of instances of the target type.\n */\n static deserializeArray<TResult extends object>(targetType: Constructor<TResult>, json: string): TResult[] {\n const parsed = JSON.parse(json);\n return this.deserializeArrayFromInstance(targetType, parsed);\n }\n\n /**\n * Deserialize an any instance to a specific instance type.\n * Fields with an undefined input value keep their constructor defaults, except collections,\n * which become empty arrays. Explicit null values override defaults.\n * @param {Constructor} targetType Type to deserialize to.\n * @param {*} instance Actual instance to deserialize.\n * @returns An instance of the target type.\n */\n static deserializeFromInstance<TResult extends object>(targetType: Constructor<TResult>, instance: any): TResult {\n const fields = Fields.getFieldsForType(targetType as Constructor);\n\n if (converterFor(targetType) || isConceptAs(targetType)) {\n return deserializeValueFromType(targetType, instance);\n }\n\n const deserialized = new targetType();\n for (const field of fields) {\n let value = instance[field.name];\n if (value !== undefined && value !== null) {\n if (field.type === Array) {\n const elementType = field.genericArguments[0];\n if (elementType) {\n const elementField = new Field(field.name, elementType, false, field.derivatives, []);\n value = value.map(_ => deserializeValueFromField(elementField, _));\n }\n } else if (field.enumerable) {\n value = value.map(_ => deserializeValueFromField(field, _));\n } else {\n value = deserializeValueFromField(field, value);\n }\n } else if ((field.enumerable || field.type === Array) && value === undefined) {\n // A collection that is absent from the payload deserializes to an empty one rather than to\n // undefined. The declared type says the field is an array, and a producer that leaves an\n // empty collection out - which the Chronicle sink does deliberately, so that a parallel\n // replay cannot overwrite children a sibling event already wrote - would otherwise hand back\n // a value contradicting its own type, putting a null guard on every reader of every\n // collection. An explicit null is left alone: that is the producer saying \"no collection\"\n // rather than \"an empty one\".\n value = [];\n } else if (value === undefined) {\n continue;\n }\n\n deserialized[field.name] = value;\n }\n\n // Preserve the polymorphic type discriminator so it is never lost across (de)serialization\n // layers. '_derivedTypeId' is not a declared field, so it is otherwise dropped here — and a\n // derived value whose concrete type could not be resolved (e.g. its type was not yet\n // registered) would then have no discriminator left to re-resolve or round-trip with, and\n // would serialize back with no type information at all.\n const derivedTypeId = instance[JsonSerializer.DerivedTypeIdProperty];\n if (derivedTypeId !== undefined && derivedTypeId !== null) {\n (deserialized as Record<string, unknown>)[JsonSerializer.DerivedTypeIdProperty] = derivedTypeId;\n }\n\n if ((targetType as Constructor) == Object) {\n const objectFields = Object.keys(instance).filter((value) => {\n return !fields.some(_ => _.name == value);\n });\n\n for (const field of objectFields) {\n deserialized[field] = instance[field];\n }\n }\n\n return deserialized;\n }\n\n /**\n * Deserialize an array of any instances to an array of specific instance types.\n * @param {Constructor} targetType Type to deserialize to.\n * @param {instances} instances Actual instances to deserialize.\n * @returns An array of instances of the target type.\n */\n static deserializeArrayFromInstance<TResult extends object>(targetType: Constructor<TResult>, instances: any): TResult[] {\n const deserialized: TResult[] = [];\n\n for (const instance of instances) {\n deserialized.push(this.deserializeFromInstance<TResult>(targetType, instance));\n }\n\n return deserialized;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":"7.0.2","root":[[92,131]],"packageJsons":["../node_modules/tslib/modules/package.json","../node_modules/tslib/package.json","../package.json"],"fileNames":["lib.es5.d.ts","lib.es2015.d.ts","lib.es2016.d.ts","lib.es2017.d.ts","lib.es2018.d.ts","lib.es2019.d.ts","lib.es2020.d.ts","lib.es2021.d.ts","lib.es2022.d.ts","lib.es2023.d.ts","lib.es2024.d.ts","lib.es2025.d.ts","lib.esnext.d.ts","lib.dom.d.ts","lib.dom.iterable.d.ts","lib.es2015.core.d.ts","lib.es2015.collection.d.ts","lib.es2015.generator.d.ts","lib.es2015.iterable.d.ts","lib.es2015.promise.d.ts","lib.es2015.proxy.d.ts","lib.es2015.reflect.d.ts","lib.es2015.symbol.d.ts","lib.es2015.symbol.wellknown.d.ts","lib.es2016.array.include.d.ts","lib.es2016.intl.d.ts","lib.es2017.arraybuffer.d.ts","lib.es2017.date.d.ts","lib.es2017.object.d.ts","lib.es2017.sharedmemory.d.ts","lib.es2017.string.d.ts","lib.es2017.intl.d.ts","lib.es2017.typedarrays.d.ts","lib.es2018.asyncgenerator.d.ts","lib.es2018.asynciterable.d.ts","lib.es2018.intl.d.ts","lib.es2018.promise.d.ts","lib.es2018.regexp.d.ts","lib.es2019.array.d.ts","lib.es2019.object.d.ts","lib.es2019.string.d.ts","lib.es2019.symbol.d.ts","lib.es2019.intl.d.ts","lib.es2020.bigint.d.ts","lib.es2020.date.d.ts","lib.es2020.promise.d.ts","lib.es2020.sharedmemory.d.ts","lib.es2020.string.d.ts","lib.es2020.symbol.wellknown.d.ts","lib.es2020.intl.d.ts","lib.es2020.number.d.ts","lib.es2021.promise.d.ts","lib.es2021.string.d.ts","lib.es2021.weakref.d.ts","lib.es2021.intl.d.ts","lib.es2022.array.d.ts","lib.es2022.error.d.ts","lib.es2022.intl.d.ts","lib.es2022.object.d.ts","lib.es2022.string.d.ts","lib.es2022.regexp.d.ts","lib.es2023.array.d.ts","lib.es2023.collection.d.ts","lib.es2023.intl.d.ts","lib.es2024.arraybuffer.d.ts","lib.es2024.collection.d.ts","lib.es2024.object.d.ts","lib.es2024.promise.d.ts","lib.es2024.regexp.d.ts","lib.es2024.sharedmemory.d.ts","lib.es2024.string.d.ts","lib.es2025.collection.d.ts","lib.es2025.float16.d.ts","lib.es2025.intl.d.ts","lib.es2025.iterator.d.ts","lib.es2025.promise.d.ts","lib.es2025.regexp.d.ts","lib.esnext.array.d.ts","lib.esnext.collection.d.ts","lib.esnext.date.d.ts","lib.esnext.decorators.d.ts","lib.esnext.disposable.d.ts","lib.esnext.error.d.ts","lib.esnext.intl.d.ts","lib.esnext.sharedmemory.d.ts","lib.esnext.temporal.d.ts","lib.esnext.typedarrays.d.ts","lib.decorators.d.ts","lib.decorators.legacy.d.ts","../node_modules/tslib/tslib.d.ts","../node_modules/tslib/modules/index.d.ts","../Constructor.ts","../typeKey.ts","../ConceptAs.ts","../Field.ts","../reflection.ts","../fieldDecoratorMetadata.ts","../Fields.ts","../StandardFieldDecoratorContext.ts","../fieldDecorator.ts","../DateOnly.ts","../DerivedType.ts","../IEquatable.ts","../Guid.ts","../duplicateInstanceGuard.ts","../TimeOnly.ts","../TimeSpan.ts","../ValueMap.ts","../json/JsonConverter.ts","../json/DateJsonConverter.ts","../json/DateOnlyJsonConverter.ts","../json/GuidJsonConverter.ts","../json/TimeOnlyJsonConverter.ts","../json/TimeSpanJsonConverter.ts","../geospatial/Point.ts","../geospatial/LinearRing.ts","../geospatial/LineString.ts","../geospatial/Polygon.ts","../geospatial/index.ts","../json/PointJsonConverter.ts","../json/LineStringJsonConverter.ts","../json/PolygonJsonConverter.ts","../json/ValueMapJsonConverter.ts","../json/index.ts","../JsonSerializer.ts","../PropertyAccessor.ts","../PropertyAccessorDescriptor.ts","../PropertyPathResolverProxyHandler.ts","../StandardClassDecoratorContext.ts","../derivedTypeDecorator.ts","../index.ts"],"fileInfos":[{"version":"16934abaab7026ac114da441aabea1a0","affectsGlobalScope":true,"impliedNodeFormat":1},"d4306fb2e47f74835e8674ffac07d76f","e437c5c1302869326c3bb93da85bbbcf","e4324975a566567b21d350615f1fc6ac","333b1b9a2a9ac3b8497dba5c63b5ba50","6cffacd662b6eb5fa7a36aa2ea366bfa","b4c34f9c23304dbef2d23698637ed638","e5cb86a5fc491796ecd1d2dd348d208f","feb6c6fb19cdb246a5d8acb36a6901c7","9443a7f109277ffaa79d893ed2549995","793cee405385076e27c24f409659dccd","09f69c6610266eaee1ac9e3e30df2c71","62bad718844246b8e17547f37bad6085",{"version":"aae8996e8b5684814785a42cbbefcd79","affectsGlobalScope":true,"impliedNodeFormat":1},"abad6dd56cc8caf095c165df8124d237",{"version":"926204c28cd3d073865348473ae28d2e","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"f25e42c801b2cb3cf2b39792006a9beb","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"6344b55f26a4e81d9608777dbfb877dd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"3c0ed28e53d3695b363e256ec1c023fd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"4c2761daba7f17141c25baa0821ac5da","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b87656acabd63e69379ff6ffcfe52fc7","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"597469522da047a5af5222cc6989f405","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1708ea4d34dc37fadadc63ca01127e80","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"55d97a8c6fbf34a30450a7b1e5f7a298","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"0ee05eb59426d33e374226d8dcfa708b","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"e347c14030993906efcfbb88915b6a05","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b0231263857c9b6a03641acdc9280ceb","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"3b15c4a83b598cacb4067676e6f0abed","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b417d97b7934cef63b1889abec0bbfbf","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"09a6cf4032ebba60ce22a501e663f881","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"2b056277dd138e8f5650fc04e20eaa8d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"e22cc07e3f3cc242ba52fa3f8ea1fc58","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"2c45da767a1bfbb220848df1bc4029e4","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b44c3e0fbaf2130cdcf6ac38b120ffa1","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b612fb5cf8e5d964b92063a75207632a","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"02705151a5e1551b9162a9ed8ab763f7","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"41025e398be9215d32e4337335da8f0b","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"52684c2b1f353a5538e4f275182a54cd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"6dedb6a4f90d1df3a6fbe5693e44886c","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"ca3f36fe3562c07e0f0d71c2bebd3f6d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"409974d6129befbb8226ddd1c6558568","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"4d9cfde2a1ae1b4925f1f9bc10848e5d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"7e1daecc66dd564144e3bb1a0266b5fd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"a8e1d9bb35fd0637f2f9fd2b2a54f2ec","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"4f168501772a6543182765bfd5f2fbfe","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"a19c80aad1b2162103496f5ba293a732","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b69afa63cd5d059851c78adb2856ee09","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"ae2fc5d954e9b0f5feee3d481b953c27","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1cfd3091a071d8b6feec15277643bafe","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1da2c1f258970fd3cc91184f69e91a9d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"a0d87491913d843139e0c993650a3235","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"4ef72aa378127e7b7abba915b0110b1e","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"3ec74c6a7d4463f0254db3a74cf75646","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"84c2bdfa470d075526cce6322d81b0b6","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"0b3844c2b8c73e4e1ab91431411cad11","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"4fc71cf4a15b8d99675a31df77f26e07","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"d1b49564ddaeca3df5b6dbae925d2242","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"6a25be566d60ccfc2d6e8b7bfdeefa83","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"8a20e27646985dfd58c57ca6566553dd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"9969f02ad3cdcbf4f709405cda44167f","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"9c9be4792a7a4f42c15ae7360bf28779","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"8cf777fe00349b71ee9c4b6f3fe7fd19","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"74f96bc192530c9723f572bfff3d3078","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1df91c56b25955c56387426f378173c5","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"38856f70edcd2115c355d96ec77cc09e","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"de8700156c1275465bcd473c28b359aa","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"d47cfdb6ede40518357bb5a4cd7cd9fb","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"6e5773860cd9e5b15e683113f642ab47","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"30ff5fe1682f7fcd629880476ca3c2e0","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"bf23d7d1b40b9015b694ddc2f011752f","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"2cc585d42e2c548f9f24a30a1989fd33","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"713906ce9d332d2242b7f05ed9304be3","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"0219894bfe5042c7e1aa2d22e4a91ed0","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"6009ffff7e43c93318804d2d28e37fe3","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"03be89b227587594fbb50509fc1c2e45","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b30df52dc24740c0bad7c55c3511df7d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"ab8d3c9b5ed5c2ab8f383607eef439f0","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"d950ec671d0a8e07f3c1a31e94abed86","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1abef2ace5eccb02d60dd73cd5a5ee4c","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"f5f0a3044029d1cc081b5887eb4deb07","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"d57c697f1446940ec4bfe669c962e2c4","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"be41035d7b941482a1e1ae6a5c5dcca5","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"10f7d9da7564f27f8ddf4a162b6da6d3","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1d0520af549e0c3581f15173cc713ca1","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"d65083f97fd741cff028472563eddb79","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"da7f24f00653ebac660ac1c0821ed33d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"7cb5ae9e65516ea2235f0721f6aac43c","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"f64453cbf9671f28158677fa5c43967a","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"33f317af5428801f944a478d2c1e38e5","affectsGlobalScope":true,"impliedNodeFormat":1},"68565f078f6cbaa18bac7ac1aee706a4",{"version":"6df9988546b1b8e15cb137c4ed46c629","impliedNodeFormat":99},{"version":"04bfab517bef8ec649195900a112645a","signature":"0aa13ceea7e7c3f53c785d7ca09fc461","impliedNodeFormat":1},{"version":"e285e85b907a1ede9eb00700121ab05f","signature":"25b556595c58144e9f689861cf51007e","impliedNodeFormat":1},{"version":"a7ffa0f207e5e558300b989f56e10ed8","signature":"dee26c2062ab4d0c96825cd9f06fc8ec","impliedNodeFormat":1},{"version":"30572a6c021fe02cf36ded539f81c4ab","signature":"86f3667a6b4bdf2ea2cb1b3d22824431","impliedNodeFormat":1},{"version":"d6444c005923a0e29b164735b3faf628","signature":"3ebc9c537c34634924dad5f75a5e826d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"eed8a4269d54d1b794fc93932726b39a","signature":"4c5307b1c87b22bd7862ce9245df2355","impliedNodeFormat":1},{"version":"4dad3ba63dfa4906aa5d59f3b088a12a","signature":"0c843f46bbfeb9f4f5e2f551ac701e71","impliedNodeFormat":1},{"version":"2a26f729ac58a50a4af8ae4cb949113b","signature":"56e1e5e440c94e1e1d7f6e87e79ad79a","impliedNodeFormat":1},{"version":"1a5c6baa45b220f4318f3265c59548eb","signature":"613a934507b0cfd0950cb8e6973dfedf","impliedNodeFormat":1},{"version":"d731cbfd510ddb328444fb249d252cb3","signature":"85dfb47ef84f3c5ef0429c39b952f287","impliedNodeFormat":1},{"version":"b361021d3d18d13aac63b35d4b0ef1d1","signature":"e574772f7137c7acb41b9b4cf9df058d","impliedNodeFormat":1},{"version":"10bacfe190f9fe270633c42af70386a1","signature":"38aed49039f4cd461d25f012f97b8c39","impliedNodeFormat":1},{"version":"cc34701bb2e1462b45d017a6fe2f141f","signature":"719dfec5f3283ec85710adbba78e6365","impliedNodeFormat":1},{"version":"4824fb9728966ca9f9ce17b9ce75f05c","signature":"c2020050bac2e38d3fa0a6b493982137","impliedNodeFormat":1},{"version":"cc3fad0a0da5a4555abcefe6d35941bd","signature":"7799c653c55840f04bdc9fc37a12673a","impliedNodeFormat":1},{"version":"78411c67d0196e7be373294362edcc40","signature":"819455b7d09613669008590152f72bfb","impliedNodeFormat":1},{"version":"a1749f74fd525e58a163f183940e7e09","signature":"6aa3c11249f9aaa1ac65d937ead30969","impliedNodeFormat":1},{"version":"351814ccfa1ba58ef45ec89a4aeb404c","signature":"f98eec2170a99869483d3eca900d0cc0","impliedNodeFormat":1},{"version":"5184ac9b0d8991786893fe84aa78d6b9","signature":"b5ebd566a1965c6a14cd722344ce6f6e","impliedNodeFormat":1},{"version":"c7735481ae825eb6bbcfd4a9805ba6c1","signature":"a7d694b86b36ce7df89de40ffc9402aa","impliedNodeFormat":1},{"version":"908d0f661e9c957f8aa06d19d4ab330d","signature":"6417e5a1c83740dd726339c7dcb25e00","impliedNodeFormat":1},{"version":"9e48231dbfedcc7214ebef6ea6286a23","signature":"6fbd3fb27221371a80b8e5096ab64669","impliedNodeFormat":1},{"version":"458e81f3aa2be4dce8b9c74ea9501bbb","signature":"cb18508ff8bbf75a7e3ab6a4326d04bc","impliedNodeFormat":1},{"version":"27ff541c8e95725471b6b63deda1cee5","signature":"58b7f36019024977c58e8f9578061940","impliedNodeFormat":1},{"version":"5a1c99c1b8aee61fe81f2c24580f964a","signature":"f54113fe7e33138fa6bef35633d9c756","impliedNodeFormat":1},{"version":"640a86079ef069627d498d92042be3fd","signature":"9ebee2bd622814352f911c1123c777bb","impliedNodeFormat":1},{"version":"c61a48c85d6c125ca9883e4b050cdca7","signature":"1c1616eb4a9ee2509a326a00d2bb66f7","impliedNodeFormat":1},{"version":"422db4edf8c3ce6cf7e553ebd6fb9d67","signature":"9cb1145b2a3893442ee4af6d07a433a1","impliedNodeFormat":1},{"version":"f5389e83dd9ce8454cf4c529c3f27303","signature":"f39ebf82376bef22974827fb45fc2868","impliedNodeFormat":1},{"version":"aa02a24e6da8595f2ddf20291c42af9f","signature":"1fb32a9a54778e35701953fde7d6a644","impliedNodeFormat":1},{"version":"5565dbac2a69a59c1fcba503a6e50586","signature":"5faf589f6dca05637ace1b1e2b65a5d9","impliedNodeFormat":1},{"version":"8e1e86bc20e3c61f979e2567130c7842","signature":"b862c86ba994a1012909a9193bf8fccb","impliedNodeFormat":1},{"version":"11d4a6190e2dfd54e76be78ac56a83d2","signature":"c008349de6f254aab2ea421ab4467148","impliedNodeFormat":1},{"version":"02c052f53ce07b8d44143efcc458b581","signature":"619e7562793b95efc8e4045b345c2958","impliedNodeFormat":1},{"version":"90afd3587a9a35670427e6961c843453","signature":"5c86fabce3450c64974c38377a4c7e78","impliedNodeFormat":1},{"version":"88e8ac668c482d4adea78be66563f1df","signature":"44105eab8a75458fcab12433d5d313c3","impliedNodeFormat":1},{"version":"975510ec28b104338b0200ad7da6681a","signature":"94ffea549c13e56a8cf4c04a811cbc75","impliedNodeFormat":1},{"version":"4233f8df71c1590dc418143794641f46","signature":"5c8de80b459b0cbf43397cfb4b8ff0d3","impliedNodeFormat":1},{"version":"77ef4441645eb9547648b763c0e124d6","signature":"d42cb94635f66e63be4724c41308e9c7","impliedNodeFormat":1},{"version":"22ac9c87f6f69a0d5e058def48f6029e","signature":"58604a62d80d6df338da00a0caafddb6","impliedNodeFormat":1}],"fileIdsList":[[93],[93,100],[92,96],[92],[92,95,96,97],[93,103],[92,93,95,98,101,102,104,105,106,107,108,124],[126],[92,96,102,129],[92,95,97,98,99],[92,95,96],[93,115],[115],[93,116],[115,116,117,118],[92,93,94,95,98,100,101,102,103,104,106,107,108,119,124,125,126,127,128,130],[92,109],[92,101,109],[92,104,109],[92,109,119],[92,106,109],[92,107,109],[92,108,109],[109,110,111,112,113,114,120,121,122,123],[90]],"options":{"allowJs":false,"assumeChangesOnlyAffectDirectDependencies":true,"checkJs":false,"composite":true,"emitDecoratorMetadata":true,"declaration":true,"declarationMap":true,"experimentalDecorators":true,"importHelpers":true,"jsx":4,"module":7,"newLine":2,"noFallthroughCasesInSwitch":true,"noImplicitAny":false,"noImplicitReturns":true,"outDir":"./","preserveConstEnums":true,"removeComments":true,"rootDir":"..","skipLibCheck":true,"strict":true,"strictNullChecks":true,"stripInternal":true,"sourceMap":true,"target":9,"allowSyntheticDefaultImports":true,"alwaysStrict":true,"esModuleInterop":true},"referencedMap":[[94,1],[101,2],[102,3],[95,4],[98,5],[104,6],[125,7],[127,8],[129,4],[106,2],[107,2],[108,1],[130,9],[100,10],[97,11],[117,12],[116,13],[115,2],[118,14],[119,15],[131,16],[110,17],[111,18],[112,19],[109,4],[121,20],[120,20],[122,20],[113,21],[114,22],[123,23],[124,24],[91,25],[93,4]],"latestChangedDtsFile":"./index.d.ts"}
1
+ {"version":"7.0.2","root":[[92,131]],"packageJsons":["../node_modules/tslib/modules/package.json","../node_modules/tslib/package.json","../package.json"],"fileNames":["lib.es5.d.ts","lib.es2015.d.ts","lib.es2016.d.ts","lib.es2017.d.ts","lib.es2018.d.ts","lib.es2019.d.ts","lib.es2020.d.ts","lib.es2021.d.ts","lib.es2022.d.ts","lib.es2023.d.ts","lib.es2024.d.ts","lib.es2025.d.ts","lib.esnext.d.ts","lib.dom.d.ts","lib.dom.iterable.d.ts","lib.es2015.core.d.ts","lib.es2015.collection.d.ts","lib.es2015.generator.d.ts","lib.es2015.iterable.d.ts","lib.es2015.promise.d.ts","lib.es2015.proxy.d.ts","lib.es2015.reflect.d.ts","lib.es2015.symbol.d.ts","lib.es2015.symbol.wellknown.d.ts","lib.es2016.array.include.d.ts","lib.es2016.intl.d.ts","lib.es2017.arraybuffer.d.ts","lib.es2017.date.d.ts","lib.es2017.object.d.ts","lib.es2017.sharedmemory.d.ts","lib.es2017.string.d.ts","lib.es2017.intl.d.ts","lib.es2017.typedarrays.d.ts","lib.es2018.asyncgenerator.d.ts","lib.es2018.asynciterable.d.ts","lib.es2018.intl.d.ts","lib.es2018.promise.d.ts","lib.es2018.regexp.d.ts","lib.es2019.array.d.ts","lib.es2019.object.d.ts","lib.es2019.string.d.ts","lib.es2019.symbol.d.ts","lib.es2019.intl.d.ts","lib.es2020.bigint.d.ts","lib.es2020.date.d.ts","lib.es2020.promise.d.ts","lib.es2020.sharedmemory.d.ts","lib.es2020.string.d.ts","lib.es2020.symbol.wellknown.d.ts","lib.es2020.intl.d.ts","lib.es2020.number.d.ts","lib.es2021.promise.d.ts","lib.es2021.string.d.ts","lib.es2021.weakref.d.ts","lib.es2021.intl.d.ts","lib.es2022.array.d.ts","lib.es2022.error.d.ts","lib.es2022.intl.d.ts","lib.es2022.object.d.ts","lib.es2022.string.d.ts","lib.es2022.regexp.d.ts","lib.es2023.array.d.ts","lib.es2023.collection.d.ts","lib.es2023.intl.d.ts","lib.es2024.arraybuffer.d.ts","lib.es2024.collection.d.ts","lib.es2024.object.d.ts","lib.es2024.promise.d.ts","lib.es2024.regexp.d.ts","lib.es2024.sharedmemory.d.ts","lib.es2024.string.d.ts","lib.es2025.collection.d.ts","lib.es2025.float16.d.ts","lib.es2025.intl.d.ts","lib.es2025.iterator.d.ts","lib.es2025.promise.d.ts","lib.es2025.regexp.d.ts","lib.esnext.array.d.ts","lib.esnext.collection.d.ts","lib.esnext.date.d.ts","lib.esnext.decorators.d.ts","lib.esnext.disposable.d.ts","lib.esnext.error.d.ts","lib.esnext.intl.d.ts","lib.esnext.sharedmemory.d.ts","lib.esnext.temporal.d.ts","lib.esnext.typedarrays.d.ts","lib.decorators.d.ts","lib.decorators.legacy.d.ts","../node_modules/tslib/tslib.d.ts","../node_modules/tslib/modules/index.d.ts","../Constructor.ts","../typeKey.ts","../ConceptAs.ts","../Field.ts","../reflection.ts","../fieldDecoratorMetadata.ts","../Fields.ts","../StandardFieldDecoratorContext.ts","../fieldDecorator.ts","../DateOnly.ts","../DerivedType.ts","../IEquatable.ts","../Guid.ts","../duplicateInstanceGuard.ts","../TimeOnly.ts","../TimeSpan.ts","../ValueMap.ts","../json/JsonConverter.ts","../json/DateJsonConverter.ts","../json/DateOnlyJsonConverter.ts","../json/GuidJsonConverter.ts","../json/TimeOnlyJsonConverter.ts","../json/TimeSpanJsonConverter.ts","../geospatial/Point.ts","../geospatial/LinearRing.ts","../geospatial/LineString.ts","../geospatial/Polygon.ts","../geospatial/index.ts","../json/PointJsonConverter.ts","../json/LineStringJsonConverter.ts","../json/PolygonJsonConverter.ts","../json/ValueMapJsonConverter.ts","../json/index.ts","../JsonSerializer.ts","../PropertyAccessor.ts","../PropertyAccessorDescriptor.ts","../PropertyPathResolverProxyHandler.ts","../StandardClassDecoratorContext.ts","../derivedTypeDecorator.ts","../index.ts"],"fileInfos":[{"version":"16934abaab7026ac114da441aabea1a0","affectsGlobalScope":true,"impliedNodeFormat":1},"d4306fb2e47f74835e8674ffac07d76f","e437c5c1302869326c3bb93da85bbbcf","e4324975a566567b21d350615f1fc6ac","333b1b9a2a9ac3b8497dba5c63b5ba50","6cffacd662b6eb5fa7a36aa2ea366bfa","b4c34f9c23304dbef2d23698637ed638","e5cb86a5fc491796ecd1d2dd348d208f","feb6c6fb19cdb246a5d8acb36a6901c7","9443a7f109277ffaa79d893ed2549995","793cee405385076e27c24f409659dccd","09f69c6610266eaee1ac9e3e30df2c71","62bad718844246b8e17547f37bad6085",{"version":"aae8996e8b5684814785a42cbbefcd79","affectsGlobalScope":true,"impliedNodeFormat":1},"abad6dd56cc8caf095c165df8124d237",{"version":"926204c28cd3d073865348473ae28d2e","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"f25e42c801b2cb3cf2b39792006a9beb","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"6344b55f26a4e81d9608777dbfb877dd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"3c0ed28e53d3695b363e256ec1c023fd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"4c2761daba7f17141c25baa0821ac5da","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b87656acabd63e69379ff6ffcfe52fc7","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"597469522da047a5af5222cc6989f405","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1708ea4d34dc37fadadc63ca01127e80","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"55d97a8c6fbf34a30450a7b1e5f7a298","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"0ee05eb59426d33e374226d8dcfa708b","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"e347c14030993906efcfbb88915b6a05","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b0231263857c9b6a03641acdc9280ceb","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"3b15c4a83b598cacb4067676e6f0abed","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b417d97b7934cef63b1889abec0bbfbf","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"09a6cf4032ebba60ce22a501e663f881","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"2b056277dd138e8f5650fc04e20eaa8d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"e22cc07e3f3cc242ba52fa3f8ea1fc58","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"2c45da767a1bfbb220848df1bc4029e4","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b44c3e0fbaf2130cdcf6ac38b120ffa1","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b612fb5cf8e5d964b92063a75207632a","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"02705151a5e1551b9162a9ed8ab763f7","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"41025e398be9215d32e4337335da8f0b","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"52684c2b1f353a5538e4f275182a54cd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"6dedb6a4f90d1df3a6fbe5693e44886c","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"ca3f36fe3562c07e0f0d71c2bebd3f6d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"409974d6129befbb8226ddd1c6558568","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"4d9cfde2a1ae1b4925f1f9bc10848e5d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"7e1daecc66dd564144e3bb1a0266b5fd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"a8e1d9bb35fd0637f2f9fd2b2a54f2ec","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"4f168501772a6543182765bfd5f2fbfe","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"a19c80aad1b2162103496f5ba293a732","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b69afa63cd5d059851c78adb2856ee09","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"ae2fc5d954e9b0f5feee3d481b953c27","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1cfd3091a071d8b6feec15277643bafe","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1da2c1f258970fd3cc91184f69e91a9d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"a0d87491913d843139e0c993650a3235","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"4ef72aa378127e7b7abba915b0110b1e","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"3ec74c6a7d4463f0254db3a74cf75646","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"84c2bdfa470d075526cce6322d81b0b6","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"0b3844c2b8c73e4e1ab91431411cad11","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"4fc71cf4a15b8d99675a31df77f26e07","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"d1b49564ddaeca3df5b6dbae925d2242","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"6a25be566d60ccfc2d6e8b7bfdeefa83","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"8a20e27646985dfd58c57ca6566553dd","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"9969f02ad3cdcbf4f709405cda44167f","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"9c9be4792a7a4f42c15ae7360bf28779","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"8cf777fe00349b71ee9c4b6f3fe7fd19","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"74f96bc192530c9723f572bfff3d3078","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1df91c56b25955c56387426f378173c5","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"38856f70edcd2115c355d96ec77cc09e","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"de8700156c1275465bcd473c28b359aa","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"d47cfdb6ede40518357bb5a4cd7cd9fb","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"6e5773860cd9e5b15e683113f642ab47","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"30ff5fe1682f7fcd629880476ca3c2e0","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"bf23d7d1b40b9015b694ddc2f011752f","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"2cc585d42e2c548f9f24a30a1989fd33","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"713906ce9d332d2242b7f05ed9304be3","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"0219894bfe5042c7e1aa2d22e4a91ed0","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"6009ffff7e43c93318804d2d28e37fe3","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"03be89b227587594fbb50509fc1c2e45","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"b30df52dc24740c0bad7c55c3511df7d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"ab8d3c9b5ed5c2ab8f383607eef439f0","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"d950ec671d0a8e07f3c1a31e94abed86","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1abef2ace5eccb02d60dd73cd5a5ee4c","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"f5f0a3044029d1cc081b5887eb4deb07","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"d57c697f1446940ec4bfe669c962e2c4","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"be41035d7b941482a1e1ae6a5c5dcca5","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"10f7d9da7564f27f8ddf4a162b6da6d3","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"1d0520af549e0c3581f15173cc713ca1","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"d65083f97fd741cff028472563eddb79","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"da7f24f00653ebac660ac1c0821ed33d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"7cb5ae9e65516ea2235f0721f6aac43c","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"f64453cbf9671f28158677fa5c43967a","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"33f317af5428801f944a478d2c1e38e5","affectsGlobalScope":true,"impliedNodeFormat":1},"68565f078f6cbaa18bac7ac1aee706a4",{"version":"6df9988546b1b8e15cb137c4ed46c629","impliedNodeFormat":99},{"version":"04bfab517bef8ec649195900a112645a","signature":"0aa13ceea7e7c3f53c785d7ca09fc461","impliedNodeFormat":1},{"version":"e285e85b907a1ede9eb00700121ab05f","signature":"25b556595c58144e9f689861cf51007e","impliedNodeFormat":1},{"version":"a7ffa0f207e5e558300b989f56e10ed8","signature":"dee26c2062ab4d0c96825cd9f06fc8ec","impliedNodeFormat":1},{"version":"30572a6c021fe02cf36ded539f81c4ab","signature":"86f3667a6b4bdf2ea2cb1b3d22824431","impliedNodeFormat":1},{"version":"d6444c005923a0e29b164735b3faf628","signature":"3ebc9c537c34634924dad5f75a5e826d","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"eed8a4269d54d1b794fc93932726b39a","signature":"4c5307b1c87b22bd7862ce9245df2355","impliedNodeFormat":1},{"version":"4dad3ba63dfa4906aa5d59f3b088a12a","signature":"0c843f46bbfeb9f4f5e2f551ac701e71","impliedNodeFormat":1},{"version":"2a26f729ac58a50a4af8ae4cb949113b","signature":"56e1e5e440c94e1e1d7f6e87e79ad79a","impliedNodeFormat":1},{"version":"1a5c6baa45b220f4318f3265c59548eb","signature":"613a934507b0cfd0950cb8e6973dfedf","impliedNodeFormat":1},{"version":"d731cbfd510ddb328444fb249d252cb3","signature":"85dfb47ef84f3c5ef0429c39b952f287","impliedNodeFormat":1},{"version":"b361021d3d18d13aac63b35d4b0ef1d1","signature":"e574772f7137c7acb41b9b4cf9df058d","impliedNodeFormat":1},{"version":"10bacfe190f9fe270633c42af70386a1","signature":"38aed49039f4cd461d25f012f97b8c39","impliedNodeFormat":1},{"version":"cc34701bb2e1462b45d017a6fe2f141f","signature":"719dfec5f3283ec85710adbba78e6365","impliedNodeFormat":1},{"version":"4824fb9728966ca9f9ce17b9ce75f05c","signature":"c2020050bac2e38d3fa0a6b493982137","impliedNodeFormat":1},{"version":"cc3fad0a0da5a4555abcefe6d35941bd","signature":"7799c653c55840f04bdc9fc37a12673a","impliedNodeFormat":1},{"version":"78411c67d0196e7be373294362edcc40","signature":"819455b7d09613669008590152f72bfb","impliedNodeFormat":1},{"version":"a1749f74fd525e58a163f183940e7e09","signature":"6aa3c11249f9aaa1ac65d937ead30969","impliedNodeFormat":1},{"version":"351814ccfa1ba58ef45ec89a4aeb404c","signature":"f98eec2170a99869483d3eca900d0cc0","impliedNodeFormat":1},{"version":"5184ac9b0d8991786893fe84aa78d6b9","signature":"b5ebd566a1965c6a14cd722344ce6f6e","impliedNodeFormat":1},{"version":"c7735481ae825eb6bbcfd4a9805ba6c1","signature":"a7d694b86b36ce7df89de40ffc9402aa","impliedNodeFormat":1},{"version":"908d0f661e9c957f8aa06d19d4ab330d","signature":"6417e5a1c83740dd726339c7dcb25e00","impliedNodeFormat":1},{"version":"9e48231dbfedcc7214ebef6ea6286a23","signature":"6fbd3fb27221371a80b8e5096ab64669","impliedNodeFormat":1},{"version":"458e81f3aa2be4dce8b9c74ea9501bbb","signature":"cb18508ff8bbf75a7e3ab6a4326d04bc","impliedNodeFormat":1},{"version":"27ff541c8e95725471b6b63deda1cee5","signature":"58b7f36019024977c58e8f9578061940","impliedNodeFormat":1},{"version":"5a1c99c1b8aee61fe81f2c24580f964a","signature":"f54113fe7e33138fa6bef35633d9c756","impliedNodeFormat":1},{"version":"640a86079ef069627d498d92042be3fd","signature":"9ebee2bd622814352f911c1123c777bb","impliedNodeFormat":1},{"version":"c61a48c85d6c125ca9883e4b050cdca7","signature":"1c1616eb4a9ee2509a326a00d2bb66f7","impliedNodeFormat":1},{"version":"422db4edf8c3ce6cf7e553ebd6fb9d67","signature":"9cb1145b2a3893442ee4af6d07a433a1","impliedNodeFormat":1},{"version":"f5389e83dd9ce8454cf4c529c3f27303","signature":"f39ebf82376bef22974827fb45fc2868","impliedNodeFormat":1},{"version":"aa02a24e6da8595f2ddf20291c42af9f","signature":"1fb32a9a54778e35701953fde7d6a644","impliedNodeFormat":1},{"version":"5565dbac2a69a59c1fcba503a6e50586","signature":"5faf589f6dca05637ace1b1e2b65a5d9","impliedNodeFormat":1},{"version":"8e1e86bc20e3c61f979e2567130c7842","signature":"b862c86ba994a1012909a9193bf8fccb","impliedNodeFormat":1},{"version":"11d4a6190e2dfd54e76be78ac56a83d2","signature":"c008349de6f254aab2ea421ab4467148","impliedNodeFormat":1},{"version":"8c1bb56950d259e4ac7b7a671d5d255e","signature":"619e7562793b95efc8e4045b345c2958","impliedNodeFormat":1},{"version":"90afd3587a9a35670427e6961c843453","signature":"5c86fabce3450c64974c38377a4c7e78","impliedNodeFormat":1},{"version":"88e8ac668c482d4adea78be66563f1df","signature":"44105eab8a75458fcab12433d5d313c3","impliedNodeFormat":1},{"version":"975510ec28b104338b0200ad7da6681a","signature":"94ffea549c13e56a8cf4c04a811cbc75","impliedNodeFormat":1},{"version":"4233f8df71c1590dc418143794641f46","signature":"5c8de80b459b0cbf43397cfb4b8ff0d3","impliedNodeFormat":1},{"version":"77ef4441645eb9547648b763c0e124d6","signature":"d42cb94635f66e63be4724c41308e9c7","impliedNodeFormat":1},{"version":"22ac9c87f6f69a0d5e058def48f6029e","signature":"58604a62d80d6df338da00a0caafddb6","impliedNodeFormat":1}],"fileIdsList":[[93],[93,100],[92,96],[92],[92,95,96,97],[93,103],[92,93,95,98,101,102,104,105,106,107,108,124],[126],[92,96,102,129],[92,95,97,98,99],[92,95,96],[93,115],[115],[93,116],[115,116,117,118],[92,93,94,95,98,100,101,102,103,104,106,107,108,119,124,125,126,127,128,130],[92,109],[92,101,109],[92,104,109],[92,109,119],[92,106,109],[92,107,109],[92,108,109],[109,110,111,112,113,114,120,121,122,123],[90]],"options":{"allowJs":false,"assumeChangesOnlyAffectDirectDependencies":true,"checkJs":false,"composite":true,"emitDecoratorMetadata":true,"declaration":true,"declarationMap":true,"experimentalDecorators":true,"importHelpers":true,"jsx":4,"module":7,"newLine":2,"noFallthroughCasesInSwitch":true,"noImplicitAny":false,"noImplicitReturns":true,"outDir":"./","preserveConstEnums":true,"removeComments":true,"rootDir":"..","skipLibCheck":true,"strict":true,"strictNullChecks":true,"stripInternal":true,"sourceMap":true,"target":9,"allowSyntheticDefaultImports":true,"alwaysStrict":true,"esModuleInterop":true},"referencedMap":[[94,1],[101,2],[102,3],[95,4],[98,5],[104,6],[125,7],[127,8],[129,4],[106,2],[107,2],[108,1],[130,9],[100,10],[97,11],[117,12],[116,13],[115,2],[118,14],[119,15],[131,16],[110,17],[111,18],[112,19],[109,4],[121,20],[120,20],[122,20],[113,21],[114,22],[123,23],[124,24],[91,25],[93,4]],"latestChangedDtsFile":"./index.d.ts"}
@@ -0,0 +1,9 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { field } from '../../fieldDecorator';
5
+
6
+ export class ChildWithDefaults {
7
+ @field(String)
8
+ label: string = 'child default';
9
+ }
@@ -0,0 +1,40 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { field } from '../../fieldDecorator';
5
+ import { ChildWithDefaults } from './child_with_defaults';
6
+
7
+ export class ModelWithDefaults {
8
+ readonly original = { label: 'original' };
9
+ readonly originalChild = new ChildWithDefaults();
10
+
11
+ @field(String)
12
+ nullable: string | null = null;
13
+
14
+ @field(String)
15
+ label: string = 'default';
16
+
17
+ @field(Number)
18
+ quantity: number = 42;
19
+
20
+ @field(Boolean)
21
+ enabled: boolean = true;
22
+
23
+ @field(Object)
24
+ mirror = this.original;
25
+
26
+ @field(Object)
27
+ self = this;
28
+
29
+ @field(String)
30
+ uninitialized?: string;
31
+
32
+ @field(Array, { genericArguments: [String] })
33
+ array: string[] | null = ['default'];
34
+
35
+ @field(String, true)
36
+ enumerable: string[] | null = ['default'];
37
+
38
+ @field(ChildWithDefaults)
39
+ child = this.originalChild;
40
+ }
@@ -0,0 +1,35 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { field } from '../../fieldDecorator';
5
+
6
+ export class ModelWithSetters {
7
+ private _label: string = 'default';
8
+ private _quantity: number = 1;
9
+
10
+ labelAssignments = 0;
11
+ quantityAssignments = 0;
12
+
13
+ @field(String)
14
+ sibling: string | null = null;
15
+
16
+ @field(String)
17
+ get label(): string {
18
+ return this._label;
19
+ }
20
+
21
+ set label(value: string) {
22
+ this.labelAssignments++;
23
+ this._label = `prefix:${value}`;
24
+ }
25
+
26
+ @field(Number)
27
+ get quantity(): number {
28
+ return this._quantity;
29
+ }
30
+
31
+ set quantity(value: number) {
32
+ this.quantityAssignments++;
33
+ this._quantity = value * 2;
34
+ }
35
+ }
@@ -0,0 +1,18 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { JsonSerializer } from '../../JsonSerializer';
5
+ import { ChildWithDefaults } from '../fixtures/child_with_defaults';
6
+ import { ModelWithDefaults } from '../fixtures/model_with_defaults';
7
+
8
+ describe('when deserializing fields with defaults with a nested object without values', () => {
9
+ let result: ModelWithDefaults;
10
+
11
+ beforeEach(() => {
12
+ result = JsonSerializer.deserialize(ModelWithDefaults, '{"child":{}}');
13
+ });
14
+
15
+ it('should deserialize a present nested object to its decorated type', () => result.child.should.be.instanceOf(ChildWithDefaults));
16
+ it('should replace the parent default instance', () => result.child.should.not.equal(result.originalChild));
17
+ it('should keep the absent nested field default', () => result.child.label.should.equal('child default'));
18
+ });
@@ -0,0 +1,16 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { JsonSerializer } from '../../JsonSerializer';
5
+ import { ModelWithDefaults } from '../fixtures/model_with_defaults';
6
+
7
+ describe('when deserializing fields with defaults with absent collections', () => {
8
+ let result: ModelWithDefaults;
9
+
10
+ beforeEach(() => {
11
+ result = JsonSerializer.deserialize(ModelWithDefaults, '{}');
12
+ });
13
+
14
+ it('should replace an absent generic array default with an empty array', () => result.array!.should.deep.equal([]));
15
+ it('should replace an absent enumerable default with an empty array', () => result.enumerable!.should.deep.equal([]));
16
+ });
@@ -0,0 +1,25 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { JsonSerializer } from '../../JsonSerializer';
5
+ import { ModelWithDefaults } from '../fixtures/model_with_defaults';
6
+
7
+ for (const input of [{}, { nullable: undefined, label: undefined, quantity: undefined, enabled: undefined, mirror: undefined, self: undefined, child: undefined }]) {
8
+ describe(`when deserializing fields with defaults with ${Object.keys(input).length ? 'undefined' : 'absent'} values`, () => {
9
+ let result: ModelWithDefaults;
10
+
11
+ beforeEach(() => {
12
+ result = JsonSerializer.deserializeFromInstance(ModelWithDefaults, input);
13
+ });
14
+
15
+ it('should keep a null initializer', () => [result.nullable].should.deep.equal([null]));
16
+ it('should keep a string initializer', () => result.label.should.equal('default'));
17
+ it('should keep a number initializer', () => result.quantity.should.equal(42));
18
+ it('should keep a boolean initializer', () => result.enabled.should.be.true);
19
+ it('should keep an object initializer by identity', () => result.mirror.should.equal(result.original));
20
+ it('should keep a reference to the returned instance', () => result.self.should.equal(result));
21
+ it('should leave a field without an initializer undefined', () => [result.uninitialized].should.deep.equal([undefined]));
22
+ it('should keep an absent nested instance by identity', () => result.child.should.equal(result.originalChild));
23
+ it('should keep the absent nested instance defaults', () => result.child.label.should.equal('child default'));
24
+ });
25
+ }
@@ -0,0 +1,19 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { JsonSerializer } from '../../JsonSerializer';
5
+ import { ModelWithDefaults } from '../fixtures/model_with_defaults';
6
+
7
+ describe('when deserializing fields with defaults with explicit null values', () => {
8
+ let result: ModelWithDefaults;
9
+
10
+ beforeEach(() => {
11
+ result = JsonSerializer.deserialize(ModelWithDefaults, '{"label":null,"quantity":null,"enabled":null,"mirror":null,"child":null}');
12
+ });
13
+
14
+ it('should override a string default with null', () => [result.label].should.deep.equal([null]));
15
+ it('should override a number default with null', () => [result.quantity].should.deep.equal([null]));
16
+ it('should override a boolean default with null', () => [result.enabled].should.deep.equal([null]));
17
+ it('should override an object default with null', () => [result.mirror].should.deep.equal([null]));
18
+ it('should override a nested instance default with null', () => [result.child].should.deep.equal([null]));
19
+ });
@@ -0,0 +1,16 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { JsonSerializer } from '../../JsonSerializer';
5
+ import { ModelWithDefaults } from '../fixtures/model_with_defaults';
6
+
7
+ describe('when deserializing fields with defaults with null collections', () => {
8
+ let result: ModelWithDefaults;
9
+
10
+ beforeEach(() => {
11
+ result = JsonSerializer.deserialize(ModelWithDefaults, '{"array":null,"enumerable":null}');
12
+ });
13
+
14
+ it('should replace the generic array default with null', () => [result.array].should.deep.equal([null]));
15
+ it('should replace the enumerable default with null', () => [result.enumerable].should.deep.equal([null]));
16
+ });
@@ -0,0 +1,19 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { JsonSerializer } from '../../JsonSerializer';
5
+ import { ModelWithSetters } from '../fixtures/model_with_setters';
6
+
7
+ describe('when deserializing fields with defaults with present setters and an absent sibling', () => {
8
+ let result: ModelWithSetters;
9
+
10
+ beforeEach(() => {
11
+ result = JsonSerializer.deserialize(ModelWithSetters, '{"label":"present","quantity":3}');
12
+ });
13
+
14
+ it('should invoke the string setter once', () => result.labelAssignments.should.equal(1));
15
+ it('should convert the string value once', () => result.label.should.equal('prefix:present'));
16
+ it('should invoke the number setter once', () => result.quantityAssignments.should.equal(1));
17
+ it('should convert the number value once', () => result.quantity.should.equal(6));
18
+ it('should keep the absent sibling default', () => [result.sibling].should.deep.equal([null]));
19
+ });
@@ -0,0 +1,30 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ import { JsonSerializer } from '../../JsonSerializer';
5
+ import { ChildWithDefaults } from '../fixtures/child_with_defaults';
6
+ import { ModelWithDefaults } from '../fixtures/model_with_defaults';
7
+
8
+ describe('when deserializing fields with defaults with present values', () => {
9
+ let result: ModelWithDefaults;
10
+
11
+ beforeEach(() => {
12
+ result = JsonSerializer.deserialize(ModelWithDefaults, JSON.stringify({
13
+ nullable: 'present',
14
+ label: '',
15
+ quantity: 0,
16
+ enabled: false,
17
+ mirror: { label: 'present' },
18
+ child: { label: 'present child' }
19
+ }));
20
+ });
21
+
22
+ it('should override a null default', () => result.nullable!.should.equal('present'));
23
+ it('should override a string default with an empty string', () => result.label.should.equal(''));
24
+ it('should override a number default with zero', () => result.quantity.should.equal(0));
25
+ it('should override a boolean default with false', () => result.enabled.should.be.false);
26
+ it('should override an object default', () => result.mirror.should.deep.equal({ label: 'present' }));
27
+ it('should deserialize a present nested object to its decorated type', () => result.child.should.be.instanceOf(ChildWithDefaults));
28
+ it('should override the nested object default', () => result.child.should.not.equal(result.originalChild));
29
+ it('should override the nested field default', () => result.child.label.should.equal('present child'));
30
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cratis/fundamentals",
3
- "version": "7.24.0",
3
+ "version": "7.24.1",
4
4
  "description": "The shared building blocks beneath the Cratis stack — GUIDs, concepts, derived-type serialization, property-path proxies, and decorators for TypeScript",
5
5
  "keywords": [
6
6
  "cratis",