@cratis/fundamentals 7.16.8 → 7.17.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.
Files changed (245) hide show
  1. package/ConceptAs.ts +3 -0
  2. package/DateOnly.ts +112 -0
  3. package/Guid.ts +3 -0
  4. package/JsonSerializer.ts +99 -39
  5. package/TimeOnly.ts +108 -0
  6. package/TimeSpan.ts +4 -0
  7. package/ValueMap.ts +3 -0
  8. package/dist/ConceptAs.d.ts +2 -0
  9. package/dist/ConceptAs.d.ts.map +1 -1
  10. package/dist/ConceptAs.js +2 -0
  11. package/dist/ConceptAs.js.map +1 -1
  12. package/dist/DateOnly.d.ts +14 -0
  13. package/dist/DateOnly.d.ts.map +1 -0
  14. package/dist/DateOnly.js +51 -0
  15. package/dist/DateOnly.js.map +1 -0
  16. package/dist/Guid.d.ts +2 -0
  17. package/dist/Guid.d.ts.map +1 -1
  18. package/dist/Guid.js +2 -0
  19. package/dist/Guid.js.map +1 -1
  20. package/dist/JsonSerializer.d.ts +2 -0
  21. package/dist/JsonSerializer.d.ts.map +1 -1
  22. package/dist/JsonSerializer.js +42 -35
  23. package/dist/JsonSerializer.js.map +1 -1
  24. package/dist/TimeOnly.d.ts +13 -0
  25. package/dist/TimeOnly.d.ts.map +1 -0
  26. package/dist/TimeOnly.js +58 -0
  27. package/dist/TimeOnly.js.map +1 -0
  28. package/dist/TimeSpan.d.ts +2 -0
  29. package/dist/TimeSpan.d.ts.map +1 -1
  30. package/dist/TimeSpan.js +2 -0
  31. package/dist/TimeSpan.js.map +1 -1
  32. package/dist/ValueMap.d.ts +2 -0
  33. package/dist/ValueMap.d.ts.map +1 -1
  34. package/dist/ValueMap.js +2 -0
  35. package/dist/ValueMap.js.map +1 -1
  36. package/dist/cjs/ConceptAs.d.ts +2 -0
  37. package/dist/cjs/ConceptAs.d.ts.map +1 -1
  38. package/dist/cjs/ConceptAs.js +3 -0
  39. package/dist/cjs/ConceptAs.js.map +1 -1
  40. package/dist/cjs/DateOnly.d.ts +14 -0
  41. package/dist/cjs/DateOnly.d.ts.map +1 -0
  42. package/dist/cjs/DateOnly.js +56 -0
  43. package/dist/cjs/DateOnly.js.map +1 -0
  44. package/dist/cjs/Guid.d.ts +2 -0
  45. package/dist/cjs/Guid.d.ts.map +1 -1
  46. package/dist/cjs/Guid.js +3 -0
  47. package/dist/cjs/Guid.js.map +1 -1
  48. package/dist/cjs/JsonSerializer.d.ts +2 -0
  49. package/dist/cjs/JsonSerializer.d.ts.map +1 -1
  50. package/dist/cjs/JsonSerializer.js +43 -34
  51. package/dist/cjs/JsonSerializer.js.map +1 -1
  52. package/dist/cjs/TimeOnly.d.ts +13 -0
  53. package/dist/cjs/TimeOnly.d.ts.map +1 -0
  54. package/dist/cjs/TimeOnly.js +63 -0
  55. package/dist/cjs/TimeOnly.js.map +1 -0
  56. package/dist/cjs/TimeSpan.d.ts +2 -0
  57. package/dist/cjs/TimeSpan.d.ts.map +1 -1
  58. package/dist/cjs/TimeSpan.js +2 -0
  59. package/dist/cjs/TimeSpan.js.map +1 -1
  60. package/dist/cjs/ValueMap.d.ts +2 -0
  61. package/dist/cjs/ValueMap.d.ts.map +1 -1
  62. package/dist/cjs/ValueMap.js +3 -0
  63. package/dist/cjs/ValueMap.js.map +1 -1
  64. package/dist/cjs/duplicateInstanceGuard.d.ts +2 -0
  65. package/dist/cjs/duplicateInstanceGuard.d.ts.map +1 -0
  66. package/dist/cjs/duplicateInstanceGuard.js +53 -0
  67. package/dist/cjs/duplicateInstanceGuard.js.map +1 -0
  68. package/dist/cjs/geospatial/LineString.d.ts +2 -0
  69. package/dist/cjs/geospatial/LineString.d.ts.map +1 -1
  70. package/dist/cjs/geospatial/LineString.js +3 -0
  71. package/dist/cjs/geospatial/LineString.js.map +1 -1
  72. package/dist/cjs/geospatial/Point.d.ts +2 -0
  73. package/dist/cjs/geospatial/Point.d.ts.map +1 -1
  74. package/dist/cjs/geospatial/Point.js +2 -0
  75. package/dist/cjs/geospatial/Point.js.map +1 -1
  76. package/dist/cjs/geospatial/Polygon.d.ts +2 -0
  77. package/dist/cjs/geospatial/Polygon.d.ts.map +1 -1
  78. package/dist/cjs/geospatial/Polygon.js +3 -0
  79. package/dist/cjs/geospatial/Polygon.js.map +1 -1
  80. package/dist/cjs/geospatial/index.js +14 -0
  81. package/dist/cjs/geospatial/index.js.map +1 -0
  82. package/dist/cjs/index.d.ts +3 -0
  83. package/dist/cjs/index.d.ts.map +1 -1
  84. package/dist/cjs/index.js +14 -0
  85. package/dist/cjs/index.js.map +1 -1
  86. package/dist/cjs/json/DateOnlyJsonConverter.d.ts +9 -0
  87. package/dist/cjs/json/DateOnlyJsonConverter.d.ts.map +1 -0
  88. package/dist/cjs/json/DateOnlyJsonConverter.js +19 -0
  89. package/dist/cjs/json/DateOnlyJsonConverter.js.map +1 -0
  90. package/dist/cjs/json/JsonConverter.d.ts.map +1 -1
  91. package/dist/cjs/json/JsonConverter.js.map +1 -1
  92. package/dist/cjs/json/TimeOnlyJsonConverter.d.ts +9 -0
  93. package/dist/cjs/json/TimeOnlyJsonConverter.d.ts.map +1 -0
  94. package/dist/cjs/json/TimeOnlyJsonConverter.js +19 -0
  95. package/dist/cjs/json/TimeOnlyJsonConverter.js.map +1 -0
  96. package/dist/cjs/json/index.d.ts +2 -0
  97. package/dist/cjs/json/index.d.ts.map +1 -1
  98. package/dist/cjs/json/index.js +26 -0
  99. package/dist/cjs/json/index.js.map +1 -0
  100. package/dist/cjs/typeKey.d.ts +7 -0
  101. package/dist/cjs/typeKey.d.ts.map +1 -0
  102. package/dist/cjs/typeKey.js +14 -0
  103. package/dist/cjs/typeKey.js.map +1 -0
  104. package/dist/duplicateInstanceGuard.d.ts +2 -0
  105. package/dist/duplicateInstanceGuard.d.ts.map +1 -0
  106. package/dist/duplicateInstanceGuard.js +49 -0
  107. package/dist/duplicateInstanceGuard.js.map +1 -0
  108. package/dist/esm/ConceptAs.d.ts +2 -0
  109. package/dist/esm/ConceptAs.d.ts.map +1 -1
  110. package/dist/esm/ConceptAs.js +3 -0
  111. package/dist/esm/ConceptAs.js.map +1 -1
  112. package/dist/esm/DateOnly.d.ts +14 -0
  113. package/dist/esm/DateOnly.d.ts.map +1 -0
  114. package/dist/esm/DateOnly.js +54 -0
  115. package/dist/esm/DateOnly.js.map +1 -0
  116. package/dist/esm/Guid.d.ts +2 -0
  117. package/dist/esm/Guid.d.ts.map +1 -1
  118. package/dist/esm/Guid.js +3 -0
  119. package/dist/esm/Guid.js.map +1 -1
  120. package/dist/esm/JsonSerializer.d.ts +2 -0
  121. package/dist/esm/JsonSerializer.d.ts.map +1 -1
  122. package/dist/esm/JsonSerializer.js +43 -34
  123. package/dist/esm/JsonSerializer.js.map +1 -1
  124. package/dist/esm/TimeOnly.d.ts +13 -0
  125. package/dist/esm/TimeOnly.d.ts.map +1 -0
  126. package/dist/esm/TimeOnly.js +61 -0
  127. package/dist/esm/TimeOnly.js.map +1 -0
  128. package/dist/esm/TimeSpan.d.ts +2 -0
  129. package/dist/esm/TimeSpan.d.ts.map +1 -1
  130. package/dist/esm/TimeSpan.js +2 -0
  131. package/dist/esm/TimeSpan.js.map +1 -1
  132. package/dist/esm/ValueMap.d.ts +2 -0
  133. package/dist/esm/ValueMap.d.ts.map +1 -1
  134. package/dist/esm/ValueMap.js +3 -0
  135. package/dist/esm/ValueMap.js.map +1 -1
  136. package/dist/esm/duplicateInstanceGuard.d.ts +2 -0
  137. package/dist/esm/duplicateInstanceGuard.d.ts.map +1 -0
  138. package/dist/esm/duplicateInstanceGuard.js +51 -0
  139. package/dist/esm/duplicateInstanceGuard.js.map +1 -0
  140. package/dist/esm/geospatial/LineString.d.ts +2 -0
  141. package/dist/esm/geospatial/LineString.d.ts.map +1 -1
  142. package/dist/esm/geospatial/LineString.js +3 -0
  143. package/dist/esm/geospatial/LineString.js.map +1 -1
  144. package/dist/esm/geospatial/Point.d.ts +2 -0
  145. package/dist/esm/geospatial/Point.d.ts.map +1 -1
  146. package/dist/esm/geospatial/Point.js +2 -0
  147. package/dist/esm/geospatial/Point.js.map +1 -1
  148. package/dist/esm/geospatial/Polygon.d.ts +2 -0
  149. package/dist/esm/geospatial/Polygon.d.ts.map +1 -1
  150. package/dist/esm/geospatial/Polygon.js +3 -0
  151. package/dist/esm/geospatial/Polygon.js.map +1 -1
  152. package/dist/esm/geospatial/index.js +5 -0
  153. package/dist/esm/geospatial/index.js.map +1 -0
  154. package/dist/esm/index.d.ts +3 -0
  155. package/dist/esm/index.d.ts.map +1 -1
  156. package/dist/esm/index.js +5 -0
  157. package/dist/esm/index.js.map +1 -1
  158. package/dist/esm/json/DateOnlyJsonConverter.d.ts +9 -0
  159. package/dist/esm/json/DateOnlyJsonConverter.d.ts.map +1 -0
  160. package/dist/esm/json/DateOnlyJsonConverter.js +17 -0
  161. package/dist/esm/json/DateOnlyJsonConverter.js.map +1 -0
  162. package/dist/esm/json/JsonConverter.d.ts.map +1 -1
  163. package/dist/esm/json/JsonConverter.js.map +1 -1
  164. package/dist/esm/json/TimeOnlyJsonConverter.d.ts +9 -0
  165. package/dist/esm/json/TimeOnlyJsonConverter.d.ts.map +1 -0
  166. package/dist/esm/json/TimeOnlyJsonConverter.js +17 -0
  167. package/dist/esm/json/TimeOnlyJsonConverter.js.map +1 -0
  168. package/dist/esm/json/index.d.ts +2 -0
  169. package/dist/esm/json/index.d.ts.map +1 -1
  170. package/dist/esm/json/index.js +11 -0
  171. package/dist/esm/json/index.js.map +1 -0
  172. package/dist/esm/typeKey.d.ts +7 -0
  173. package/dist/esm/typeKey.d.ts.map +1 -0
  174. package/dist/esm/typeKey.js +8 -0
  175. package/dist/esm/typeKey.js.map +1 -0
  176. package/dist/geospatial/LineString.d.ts +2 -0
  177. package/dist/geospatial/LineString.d.ts.map +1 -1
  178. package/dist/geospatial/LineString.js +2 -0
  179. package/dist/geospatial/LineString.js.map +1 -1
  180. package/dist/geospatial/Point.d.ts +2 -0
  181. package/dist/geospatial/Point.d.ts.map +1 -1
  182. package/dist/geospatial/Point.js +2 -0
  183. package/dist/geospatial/Point.js.map +1 -1
  184. package/dist/geospatial/Polygon.d.ts +2 -0
  185. package/dist/geospatial/Polygon.d.ts.map +1 -1
  186. package/dist/geospatial/Polygon.js +2 -0
  187. package/dist/geospatial/Polygon.js.map +1 -1
  188. package/dist/index.d.ts +3 -0
  189. package/dist/index.d.ts.map +1 -1
  190. package/dist/index.js +3 -0
  191. package/dist/index.js.map +1 -1
  192. package/dist/json/DateOnlyJsonConverter.d.ts +9 -0
  193. package/dist/json/DateOnlyJsonConverter.d.ts.map +1 -0
  194. package/dist/json/DateOnlyJsonConverter.js +14 -0
  195. package/dist/json/DateOnlyJsonConverter.js.map +1 -0
  196. package/dist/json/JsonConverter.d.ts.map +1 -1
  197. package/dist/json/JsonConverter.js.map +1 -1
  198. package/dist/json/TimeOnlyJsonConverter.d.ts +9 -0
  199. package/dist/json/TimeOnlyJsonConverter.d.ts.map +1 -0
  200. package/dist/json/TimeOnlyJsonConverter.js +14 -0
  201. package/dist/json/TimeOnlyJsonConverter.js.map +1 -0
  202. package/dist/json/index.d.ts +2 -0
  203. package/dist/json/index.d.ts.map +1 -1
  204. package/dist/json/index.js +2 -0
  205. package/dist/json/index.js.map +1 -1
  206. package/dist/tsconfig.tsbuildinfo +1 -1
  207. package/dist/typeKey.d.ts +7 -0
  208. package/dist/typeKey.d.ts.map +1 -0
  209. package/dist/typeKey.js +6 -0
  210. package/dist/typeKey.js.map +1 -0
  211. package/duplicateInstanceGuard.ts +114 -0
  212. package/for_DateOnly/when_parsing_a_calendar_date.ts +13 -0
  213. package/for_DateOnly/when_reading_it_west_of_utc.ts +24 -0
  214. package/for_JsonSerializer/RegisteredConverterTypes.ts +45 -0
  215. package/for_JsonSerializer/when_a_converter_is_registered_for_a_concept.ts +46 -0
  216. package/for_JsonSerializer/when_a_converter_is_registered_for_a_type_that_already_has_one.ts +25 -0
  217. package/for_JsonSerializer/when_a_converter_is_registered_for_a_type_the_package_already_converts.ts +51 -0
  218. package/for_JsonSerializer/when_a_converter_is_registered_for_a_value_map.ts +49 -0
  219. package/for_JsonSerializer/when_a_converter_is_registered_for_an_unknown_type.ts +30 -0
  220. package/for_JsonSerializer/when_a_type_comes_from_another_copy_of_the_package.ts +63 -0
  221. package/for_JsonSerializer/when_deserializing_temporal_values.ts +31 -0
  222. package/for_JsonSerializer/when_metadata_is_written_by_another_copy_of_the_package.ts +46 -0
  223. package/for_JsonSerializer/when_no_converter_is_registered_for_a_type.ts +32 -0
  224. package/for_JsonSerializer/when_round_tripping_a_value_map_of_primitive_values.ts +35 -0
  225. package/for_JsonSerializer/when_round_tripping_concepts_outside_a_declared_field.ts +39 -0
  226. package/for_TimeOnly/when_parsing_a_time_of_day.ts +17 -0
  227. package/for_TimeOnly/when_parsing_the_shapes_the_server_sends.ts +24 -0
  228. package/for_duplicateInstanceGuard/given/a_realm.ts +62 -0
  229. package/for_duplicateInstanceGuard/when_a_second_copy_is_loaded.ts +28 -0
  230. package/for_duplicateInstanceGuard/when_a_third_copy_is_loaded.ts +20 -0
  231. package/for_duplicateInstanceGuard/when_checking_the_package_manifest.ts +26 -0
  232. package/for_duplicateInstanceGuard/when_one_copy_is_loaded.ts +17 -0
  233. package/for_duplicateInstanceGuard/when_one_copy_registers_more_than_once.ts +20 -0
  234. package/for_duplicateInstanceGuard/when_something_else_holds_the_global_key.ts +25 -0
  235. package/for_duplicateInstanceGuard/when_the_runtime_has_no_console.ts +30 -0
  236. package/geospatial/LineString.ts +3 -0
  237. package/geospatial/Point.ts +3 -0
  238. package/geospatial/Polygon.ts +3 -0
  239. package/index.ts +3 -0
  240. package/json/DateOnlyJsonConverter.ts +28 -0
  241. package/json/JsonConverter.ts +5 -0
  242. package/json/TimeOnlyJsonConverter.ts +28 -0
  243. package/json/index.ts +2 -0
  244. package/package.json +1 -1
  245. package/typeKey.ts +54 -0
@@ -1 +1 @@
1
- {"version":3,"file":"Guid.js","sources":["../../Guid.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 { IEquatable } from './IEquatable';\n\nconst guidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;\nconst lookUpTable: string[] = [];\n(() => {\n for (let i = 0; i < 256; i += 1) {\n lookUpTable[i] = (i < 16 ? '0' : '') + (i).toString(16);\n }\n})();\n\nconst getString = (num: number) => {\n return num.toString(16).padStart(2, '0');\n};\n\n/**\n * Represents a Guid according to the http://www.ietf.org/rfc/rfc4122.txt\n *\n * @export\n * @class Guid\n */\nexport class Guid implements IEquatable {\n\n /**\n * Gets an empty {Guid}\n */\n static readonly empty = new Guid([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);\n\n private _stringVersion = '';\n\n\n /**\n * Initializes a new instance of the {Guid} class.\n * @param {number[]|Uint8Array} bytes - The 16 bytes that represents a {Guid}.\n */\n constructor(readonly bytes: number[] | Uint8Array | undefined) {\n if( bytes === undefined ) {\n this._stringVersion = Guid.empty.toString();\n return;\n }\n\n this._stringVersion = '' +\n getString(bytes[3]) + getString(bytes[2]) + getString(bytes[1]) + getString(bytes[0]) +\n '-' +\n getString(bytes[5]) + getString(bytes[4]) +\n '-' +\n getString(bytes[7]) + getString(bytes[6]) +\n '-' +\n getString(bytes[8]) + getString(bytes[9]) +\n '-' +\n getString(bytes[10]) + getString(bytes[11]) + getString(bytes[12]) + getString(bytes[13]) + getString(bytes[14]) + getString(bytes[15]);\n }\n\n /**\n * Create a new {Guid}\n * @returns {Guid}\n */\n static create(): Guid {\n const d0 = Math.random() * 0xFFFFFFFF | 0;\n const d1 = Math.random() * 0xFFFFFFFF | 0;\n const d2 = Math.random() * 0xFFFFFFFF | 0;\n const d3 = Math.random() * 0xFFFFFFFF | 0;\n\n const bytes = [\n lookUpTable[d0 & 0xFF],\n lookUpTable[d0 >> 8 & 0xFF],\n lookUpTable[d0 >> 16 & 0xFF],\n lookUpTable[d0 >> 24 & 0xFF],\n lookUpTable[d1 & 0xFF],\n lookUpTable[d1 >> 8 & 0xFF],\n lookUpTable[d1 >> 16 & 0x0F | 0x40],\n lookUpTable[d1 >> 24 & 0xFF],\n lookUpTable[d2 & 0x3F | 0x80],\n lookUpTable[d2 >> 8 & 0xFF],\n lookUpTable[d2 >> 16 & 0xFF],\n lookUpTable[d2 >> 24 & 0xFF],\n lookUpTable[d3 & 0xFF],\n lookUpTable[d3 >> 8 & 0xFF],\n lookUpTable[d3 >> 16 & 0xFF],\n lookUpTable[d3 >> 24 & 0xFF]\n ];\n\n return new Guid(bytes.map(_ => parseInt(`0x${_}`, 16)));\n }\n\n /**\n * Parses a string and turns it into a {Guid}.\n * @param {string} guid String representation of guid.\n */\n static parse(guid: string): Guid {\n const bytes: number[] = [];\n guid.split('-').map((number, index) => {\n const bytesInChar = index < 3 ? number.match(/.{1,2}/g)?.reverse() : number.match(/.{1,2}/g);\n bytesInChar?.map((byte) => { bytes.push(parseInt(byte, 16)); });\n });\n\n return new Guid(bytes);\n }\n\n /**\n * Check if a string is a valid {Guid}\n * @param {string} value Value to check.\n * @returns True if it is, false if not.\n */\n static isGuid(value: string): boolean {\n return guidRegex.test(value);\n }\n\n /**\n * Parses if the type is a string parse, otherwise pass through the input as desired output type.\n * @template T Type to handle for\n * @param {string|T} input String or the generic type.\n * @returns identifier Parsed or passed through\n */\n static as<T extends Guid = Guid>(input: string | T): T {\n if (typeof input === 'string') {\n return Guid.parse(input) as T;\n }\n return input as T;\n }\n\n /**\n * @inheritdoc\n */\n equals(other: object): boolean {\n const actualOther = other instanceof Guid ? other : other.toString();\n if (typeof actualOther === 'string' && !Guid.isGuid(actualOther)) {\n return false;\n }\n\n return Guid.as(actualOther).toString() === this.toString();\n }\n\n /**\n * Return a string representation of the {Guid} in the format: 00000000-0000-0000-0000-000000000000\n * @returns {string}\n */\n toString(): string {\n return this._stringVersion;\n }\n\n /**\n * Converts the {Guid} to a string that works in JSON serialization.\n * @returns {string}\n */\n toJSON(): string {\n return this._stringVersion;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Guid.js","sources":["../../Guid.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 { IEquatable } from './IEquatable';\nimport { typeKey } from './typeKey';\n\nconst guidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;\nconst lookUpTable: string[] = [];\n(() => {\n for (let i = 0; i < 256; i += 1) {\n lookUpTable[i] = (i < 16 ? '0' : '') + (i).toString(16);\n }\n})();\n\nconst getString = (num: number) => {\n return num.toString(16).padStart(2, '0');\n};\n\n/**\n * Represents a Guid according to the http://www.ietf.org/rfc/rfc4122.txt\n *\n * @export\n * @class Guid\n */\nexport class Guid implements IEquatable {\n static readonly [typeKey] = 'Guid';\n\n\n /**\n * Gets an empty {Guid}\n */\n static readonly empty = new Guid([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);\n\n private _stringVersion = '';\n\n\n /**\n * Initializes a new instance of the {Guid} class.\n * @param {number[]|Uint8Array} bytes - The 16 bytes that represents a {Guid}.\n */\n constructor(readonly bytes: number[] | Uint8Array | undefined) {\n if( bytes === undefined ) {\n this._stringVersion = Guid.empty.toString();\n return;\n }\n\n this._stringVersion = '' +\n getString(bytes[3]) + getString(bytes[2]) + getString(bytes[1]) + getString(bytes[0]) +\n '-' +\n getString(bytes[5]) + getString(bytes[4]) +\n '-' +\n getString(bytes[7]) + getString(bytes[6]) +\n '-' +\n getString(bytes[8]) + getString(bytes[9]) +\n '-' +\n getString(bytes[10]) + getString(bytes[11]) + getString(bytes[12]) + getString(bytes[13]) + getString(bytes[14]) + getString(bytes[15]);\n }\n\n /**\n * Create a new {Guid}\n * @returns {Guid}\n */\n static create(): Guid {\n const d0 = Math.random() * 0xFFFFFFFF | 0;\n const d1 = Math.random() * 0xFFFFFFFF | 0;\n const d2 = Math.random() * 0xFFFFFFFF | 0;\n const d3 = Math.random() * 0xFFFFFFFF | 0;\n\n const bytes = [\n lookUpTable[d0 & 0xFF],\n lookUpTable[d0 >> 8 & 0xFF],\n lookUpTable[d0 >> 16 & 0xFF],\n lookUpTable[d0 >> 24 & 0xFF],\n lookUpTable[d1 & 0xFF],\n lookUpTable[d1 >> 8 & 0xFF],\n lookUpTable[d1 >> 16 & 0x0F | 0x40],\n lookUpTable[d1 >> 24 & 0xFF],\n lookUpTable[d2 & 0x3F | 0x80],\n lookUpTable[d2 >> 8 & 0xFF],\n lookUpTable[d2 >> 16 & 0xFF],\n lookUpTable[d2 >> 24 & 0xFF],\n lookUpTable[d3 & 0xFF],\n lookUpTable[d3 >> 8 & 0xFF],\n lookUpTable[d3 >> 16 & 0xFF],\n lookUpTable[d3 >> 24 & 0xFF]\n ];\n\n return new Guid(bytes.map(_ => parseInt(`0x${_}`, 16)));\n }\n\n /**\n * Parses a string and turns it into a {Guid}.\n * @param {string} guid String representation of guid.\n */\n static parse(guid: string): Guid {\n const bytes: number[] = [];\n guid.split('-').map((number, index) => {\n const bytesInChar = index < 3 ? number.match(/.{1,2}/g)?.reverse() : number.match(/.{1,2}/g);\n bytesInChar?.map((byte) => { bytes.push(parseInt(byte, 16)); });\n });\n\n return new Guid(bytes);\n }\n\n /**\n * Check if a string is a valid {Guid}\n * @param {string} value Value to check.\n * @returns True if it is, false if not.\n */\n static isGuid(value: string): boolean {\n return guidRegex.test(value);\n }\n\n /**\n * Parses if the type is a string parse, otherwise pass through the input as desired output type.\n * @template T Type to handle for\n * @param {string|T} input String or the generic type.\n * @returns identifier Parsed or passed through\n */\n static as<T extends Guid = Guid>(input: string | T): T {\n if (typeof input === 'string') {\n return Guid.parse(input) as T;\n }\n return input as T;\n }\n\n /**\n * @inheritdoc\n */\n equals(other: object): boolean {\n const actualOther = other instanceof Guid ? other : other.toString();\n if (typeof actualOther === 'string' && !Guid.isGuid(actualOther)) {\n return false;\n }\n\n return Guid.as(actualOther).toString() === this.toString();\n }\n\n /**\n * Return a string representation of the {Guid} in the format: 00000000-0000-0000-0000-000000000000\n * @returns {string}\n */\n toString(): string {\n return this._stringVersion;\n }\n\n /**\n * Converts the {Guid} to a string that works in JSON serialization.\n * @returns {string}\n */\n toJSON(): string {\n return this._stringVersion;\n }\n}\n"],"names":["typeKey"],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import { Constructor } from './Constructor';
2
+ import { JsonConverter } from './json';
2
3
  export declare class JsonSerializer {
3
4
  static readonly DerivedTypeIdProperty: string;
5
+ static registerConverter(converter: JsonConverter): void;
4
6
  static serialize(value: any): string;
5
7
  static deserialize<TResult extends object>(targetType: Constructor<TResult>, json: string): TResult;
6
8
  static deserializeArray<TResult extends object>(targetType: Constructor<TResult>, json: string): TResult[];
@@ -1 +1 @@
1
- {"version":3,"file":"JsonSerializer.d.ts","sourceRoot":"","sources":["../../JsonSerializer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAgR5C,qBAAa,cAAc;IACvB,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAoB;IAOjE,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;IA2DhH,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;AAO5C,OAAO,EACH,aAAa,EAUhB,MAAM,QAAQ,CAAC;AAsShB,qBAAa,cAAc;IACvB,MAAM,CAAC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAoB;IAmBjE,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;IA2DhH,MAAM,CAAC,4BAA4B,CAAC,OAAO,SAAS,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,OAAO,EAAE;CAS3H"}
@@ -1,32 +1,50 @@
1
1
  'use strict';
2
2
 
3
- var ConceptAs = require('./ConceptAs.js');
4
3
  var DerivedType = require('./DerivedType.js');
4
+ var duplicateInstanceGuard = require('./duplicateInstanceGuard.js');
5
5
  var Fields = require('./Fields.js');
6
+ var typeKey = require('./typeKey.js');
6
7
  var ValueMap = require('./ValueMap.js');
7
8
  var DateJsonConverter = require('./json/DateJsonConverter.js');
9
+ var DateOnlyJsonConverter = require('./json/DateOnlyJsonConverter.js');
8
10
  var GuidJsonConverter = require('./json/GuidJsonConverter.js');
11
+ var TimeOnlyJsonConverter = require('./json/TimeOnlyJsonConverter.js');
9
12
  var TimeSpanJsonConverter = require('./json/TimeSpanJsonConverter.js');
10
13
  var PointJsonConverter = require('./json/PointJsonConverter.js');
11
14
  var LineStringJsonConverter = require('./json/LineStringJsonConverter.js');
12
15
  var PolygonJsonConverter = require('./json/PolygonJsonConverter.js');
13
16
  var ValueMapJsonConverter = require('./json/ValueMapJsonConverter.js');
14
17
 
18
+ duplicateInstanceGuard.registerModuleInstance();
15
19
  const converters = [
16
20
  new DateJsonConverter.DateJsonConverter(),
21
+ new DateOnlyJsonConverter.DateOnlyJsonConverter(),
17
22
  new GuidJsonConverter.GuidJsonConverter(),
23
+ new TimeOnlyJsonConverter.TimeOnlyJsonConverter(),
18
24
  new TimeSpanJsonConverter.TimeSpanJsonConverter(),
19
25
  new PointJsonConverter.PointJsonConverter(),
20
26
  new LineStringJsonConverter.LineStringJsonConverter(),
21
27
  new PolygonJsonConverter.PolygonJsonConverter(),
22
28
  new ValueMapJsonConverter.ValueMapJsonConverter()
23
29
  ];
30
+ const keyedConverters = new Map();
24
31
  const typeConverters = new Map();
25
- const typeSerializers = new Map();
26
- for (const converter of converters) {
32
+ const registerConverterFor = (converter) => {
33
+ const key = typeKey.declaredTypeKey(converter.type);
34
+ if (key !== undefined) {
35
+ keyedConverters.set(key, converter);
36
+ }
27
37
  typeConverters.set(converter.type, converter);
28
- typeSerializers.set(converter.type, converter);
29
- }
38
+ };
39
+ converters.forEach(registerConverterFor);
40
+ const converterFor = (type) => {
41
+ if (!type)
42
+ return undefined;
43
+ const key = typeKey.declaredTypeKey(type);
44
+ const keyed = key === undefined ? undefined : keyedConverters.get(key);
45
+ return keyed ?? typeConverters.get(type);
46
+ };
47
+ const isValueMap = (type) => typeKey.declaredTypeKey(type) === typeKey.valueMapTypeKey;
30
48
  const primitiveConverters = new Map([
31
49
  [Number, (value) => value],
32
50
  [String, (value) => value],
@@ -37,27 +55,16 @@ const primitiveSerializers = new Map([
37
55
  [String, (value) => value],
38
56
  [Boolean, (value) => value]
39
57
  ]);
40
- const isConceptAs = (type) => {
41
- if (!type || !type.prototype)
42
- return false;
43
- let proto = type.prototype;
44
- while (proto) {
45
- if (proto === ConceptAs.ConceptAs.prototype) {
46
- return true;
47
- }
48
- proto = Object.getPrototypeOf(proto);
49
- }
50
- return false;
51
- };
58
+ const isConceptAs = (type) => typeKey.typeKeyOf(type) === typeKey.conceptAsTypeKey;
52
59
  const serializeValueForType = (type, value) => {
53
60
  if (!value)
54
61
  return value;
55
- if (value instanceof ConceptAs.ConceptAs) {
62
+ if (isConceptAs(value.constructor)) {
56
63
  const innerValue = value.value;
57
64
  return serializeValueForType(innerValue.constructor, innerValue);
58
65
  }
59
- if (typeConverters.has(type)) {
60
- const converter = typeConverters.get(type);
66
+ const converter = converterFor(type);
67
+ if (converter) {
61
68
  return converter.write(value);
62
69
  }
63
70
  if (primitiveConverters.has(type)) {
@@ -69,8 +76,8 @@ const deserializeValueFromType = (type, value) => {
69
76
  if (isConceptAs(type)) {
70
77
  return new type(value);
71
78
  }
72
- if (typeSerializers.has(type)) {
73
- const converter = typeSerializers.get(type);
79
+ const converter = converterFor(type);
80
+ if (converter) {
74
81
  return converter.read(value);
75
82
  }
76
83
  if (primitiveSerializers.has(type)) {
@@ -79,14 +86,14 @@ const deserializeValueFromType = (type, value) => {
79
86
  return JsonSerializer.deserialize(type, JSON.stringify(value));
80
87
  };
81
88
  const deserializeValueFromField = (field, value) => {
82
- if (field.type === ValueMap.ValueMap) {
89
+ if (isValueMap(field.type)) {
83
90
  return deserializeValueMapFromField(field, value);
84
91
  }
85
92
  if (isConceptAs(field.type)) {
86
93
  return new field.type(value);
87
94
  }
88
- if (typeSerializers.has(field.type)) {
89
- const converter = typeSerializers.get(field.type);
95
+ const converter = converterFor(field.type);
96
+ if (converter) {
90
97
  return converter.read(value);
91
98
  }
92
99
  if (primitiveSerializers.has(field.type)) {
@@ -125,8 +132,8 @@ const deserializeMapKey = (keyType, key) => {
125
132
  if (keyType === Boolean) {
126
133
  return key.toLowerCase() === 'true';
127
134
  }
128
- if (typeSerializers.has(keyType)) {
129
- const converter = typeSerializers.get(keyType);
135
+ const converter = converterFor(keyType);
136
+ if (converter) {
130
137
  return converter.read(key);
131
138
  }
132
139
  return JsonSerializer.deserialize(keyType, key);
@@ -135,11 +142,7 @@ const deserializeMapValue = (valueType, value) => {
135
142
  if (!valueType) {
136
143
  return value;
137
144
  }
138
- if (typeSerializers.has(valueType)) {
139
- const converter = typeSerializers.get(valueType);
140
- return converter.read(value);
141
- }
142
- return JsonSerializer.deserialize(valueType, JSON.stringify(value));
145
+ return deserializeValueFromType(valueType, value);
143
146
  };
144
147
  const deserializeValueMapFromField = (field, value) => {
145
148
  const valueMap = new ValueMap.ValueMap();
@@ -156,7 +159,10 @@ const deserializeValueMapFromField = (field, value) => {
156
159
  return valueMap;
157
160
  };
158
161
  const convertTypesOnInstance = (instance) => {
159
- if (typeConverters.has(instance.constructor)) {
162
+ if (isConceptAs(instance.constructor)) {
163
+ return serializeValueForType(instance.constructor, instance);
164
+ }
165
+ if (converterFor(instance.constructor)) {
160
166
  return serializeValueForType(instance.constructor, instance);
161
167
  }
162
168
  if (primitiveConverters.has(instance.constructor)) {
@@ -187,6 +193,9 @@ const convertTypesOnInstance = (instance) => {
187
193
  ValueMapJsonConverter.ValueMapJsonConverter.setHelpers(serializeMapKey, convertTypesOnInstance);
188
194
  class JsonSerializer {
189
195
  static DerivedTypeIdProperty = "_derivedTypeId";
196
+ static registerConverter(converter) {
197
+ registerConverterFor(converter);
198
+ }
190
199
  static serialize(value) {
191
200
  const converted = convertTypesOnInstance(value);
192
201
  return JSON.stringify(converted);
@@ -201,7 +210,7 @@ class JsonSerializer {
201
210
  }
202
211
  static deserializeFromInstance(targetType, instance) {
203
212
  const fields = Fields.Fields.getFieldsForType(targetType);
204
- if (typeSerializers.has(targetType)) {
213
+ if (converterFor(targetType)) {
205
214
  return deserializeValueFromType(targetType, instance);
206
215
  }
207
216
  const deserialized = new targetType();
@@ -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 { ConceptAs } from './ConceptAs';\nimport { Constructor } from './Constructor';\nimport { DerivedType } from './DerivedType';\nimport { Field } from './Field';\nimport { Fields } from './Fields';\nimport { ValueMap } from './ValueMap';\nimport { \n JsonConverter, \n DateJsonConverter, \n GuidJsonConverter, \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// Initialize converters\nconst converters: JsonConverter[] = [\n new DateJsonConverter(),\n new GuidJsonConverter(),\n new TimeSpanJsonConverter(),\n new PointJsonConverter(),\n new LineStringJsonConverter(),\n new PolygonJsonConverter(),\n new ValueMapJsonConverter()\n];\n\n// Build converter maps from the converters\nconst typeConverters: Map<Constructor, JsonConverter> = new Map<Constructor, JsonConverter>();\nconst typeSerializers: Map<Constructor, JsonConverter> = new Map<Constructor, JsonConverter>();\n\nfor (const converter of converters) {\n typeConverters.set(converter.type, converter);\n typeSerializers.set(converter.type, converter);\n}\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 */\nconst isConceptAs = (type: Constructor): boolean => {\n if (!type || !type.prototype) return false;\n \n // Check if the prototype chain includes ConceptAs\n let proto = type.prototype;\n while (proto) {\n // Check if this prototype is ConceptAs.prototype\n if (proto === ConceptAs.prototype) {\n return true;\n }\n proto = Object.getPrototypeOf(proto);\n }\n return false;\n};\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 (value instanceof ConceptAs) {\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 if (typeConverters.has(type)) {\n const converter = typeConverters.get(type)!;\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 return new type(value);\n }\n \n // Check if there's a registered converter\n if (typeSerializers.has(type)) {\n const converter = typeSerializers.get(type)!;\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 (field.type === ValueMap) {\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 new field.type(value);\n }\n\n // Check if there's a registered converter\n if (typeSerializers.has(field.type)) {\n const converter = typeSerializers.get(field.type)!;\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 return JsonSerializer.serialize(key);\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 // Check if there's a converter for this type\n if (typeSerializers.has(keyType)) {\n const converter = typeSerializers.get(keyType)!;\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 (!valueType) {\n return value;\n }\n\n // Check if there's a converter for this type\n if (typeSerializers.has(valueType)) {\n const converter = typeSerializers.get(valueType)!;\n return converter.read(value);\n }\n\n return JsonSerializer.deserialize(valueType, JSON.stringify(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 // Check if there's a converter for this type\n if (typeConverters.has(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) {\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 * 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 (typeSerializers.has(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) {\n if (field.enumerable) {\n value = value.map(_ => deserializeValueFromField(field, _));\n } else {\n value = deserializeValueFromField(field, value);\n }\n } else if (field.enumerable && 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":["DateJsonConverter","GuidJsonConverter","TimeSpanJsonConverter","PointJsonConverter","LineStringJsonConverter","PolygonJsonConverter","ValueMapJsonConverter","ConceptAs","ValueMap","DerivedType","Fields"],"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 { conceptAsTypeKey, declaredTypeKey, 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 return new type(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 (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 new 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 return JsonSerializer.serialize(key);\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 // 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 (!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 // 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) {\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 */\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)) {\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) {\n if (field.enumerable) {\n value = value.map(_ => deserializeValueFromField(field, _));\n } else {\n value = deserializeValueFromField(field, value);\n }\n } else if (field.enumerable && 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","ValueMap","Fields"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { typeKey } from './typeKey';
2
+ export declare class TimeOnly {
3
+ static readonly [typeKey] = "TimeOnly";
4
+ hour: number;
5
+ minute: number;
6
+ second: number;
7
+ millisecond: number;
8
+ static from(hour: number, minute: number, second?: number, millisecond?: number): TimeOnly;
9
+ static parse(value: string): TimeOnly;
10
+ toString(): string;
11
+ equals(other: TimeOnly | undefined | null): boolean;
12
+ }
13
+ //# sourceMappingURL=TimeOnly.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimeOnly.d.ts","sourceRoot":"","sources":["../../TimeOnly.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,qBAAa,QAAQ;IACjB,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,cAAc;IAMvC,IAAI,EAAG,MAAM,CAAC;IAMd,MAAM,EAAG,MAAM,CAAC;IAMhB,MAAM,EAAG,MAAM,CAAC;IAMhB,WAAW,EAAG,MAAM,CAAC;IAUrB,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,EAAE,WAAW,GAAE,MAAU,GAAG,QAAQ;IAkBhG,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ;IAmBrC,QAAQ,IAAI,MAAM;IAalB,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO;CAOtD"}
@@ -0,0 +1,63 @@
1
+ 'use strict';
2
+
3
+ var _tslib = require('./_virtual/_tslib.js');
4
+ var fieldDecorator = require('./fieldDecorator.js');
5
+ var typeKey = require('./typeKey.js');
6
+
7
+ const timeOnlyRegex = /^(\d{2}):(\d{2})(?::(\d{2}))?(?:\.(\d{1,7}))?$/;
8
+ class TimeOnly {
9
+ static [typeKey.typeKey] = 'TimeOnly';
10
+ hour;
11
+ minute;
12
+ second;
13
+ millisecond;
14
+ static from(hour, minute, second = 0, millisecond = 0) {
15
+ const timeOnly = new TimeOnly();
16
+ timeOnly.hour = hour;
17
+ timeOnly.minute = minute;
18
+ timeOnly.second = second;
19
+ timeOnly.millisecond = millisecond;
20
+ return timeOnly;
21
+ }
22
+ static parse(value) {
23
+ const match = timeOnlyRegex.exec(value);
24
+ if (match === null) {
25
+ throw new Error(`Invalid TimeOnly format: ${value}`);
26
+ }
27
+ const fraction = match[4] ? match[4].padEnd(3, '0').substring(0, 3) : '0';
28
+ return TimeOnly.from(parseInt(match[1], 10), parseInt(match[2], 10), match[3] ? parseInt(match[3], 10) : 0, parseInt(fraction, 10));
29
+ }
30
+ toString() {
31
+ const hour = this.hour.toString().padStart(2, '0');
32
+ const minute = this.minute.toString().padStart(2, '0');
33
+ const second = this.second.toString().padStart(2, '0');
34
+ const time = `${hour}:${minute}:${second}`;
35
+ return this.millisecond > 0 ? `${time}.${this.millisecond.toString().padStart(3, '0')}` : time;
36
+ }
37
+ equals(other) {
38
+ return !!other &&
39
+ this.hour === other.hour &&
40
+ this.minute === other.minute &&
41
+ this.second === other.second &&
42
+ this.millisecond === other.millisecond;
43
+ }
44
+ }
45
+ _tslib.__decorate([
46
+ fieldDecorator.field(Number),
47
+ _tslib.__metadata("design:type", Number)
48
+ ], TimeOnly.prototype, "hour", void 0);
49
+ _tslib.__decorate([
50
+ fieldDecorator.field(Number),
51
+ _tslib.__metadata("design:type", Number)
52
+ ], TimeOnly.prototype, "minute", void 0);
53
+ _tslib.__decorate([
54
+ fieldDecorator.field(Number),
55
+ _tslib.__metadata("design:type", Number)
56
+ ], TimeOnly.prototype, "second", void 0);
57
+ _tslib.__decorate([
58
+ fieldDecorator.field(Number),
59
+ _tslib.__metadata("design:type", Number)
60
+ ], TimeOnly.prototype, "millisecond", void 0);
61
+
62
+ exports.TimeOnly = TimeOnly;
63
+ //# sourceMappingURL=TimeOnly.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimeOnly.js","sources":["../../TimeOnly.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 { field } from './fieldDecorator';\nimport { typeKey } from './typeKey';\n\nconst timeOnlyRegex = /^(\\d{2}):(\\d{2})(?::(\\d{2}))?(?:\\.(\\d{1,7}))?$/;\n\n/**\n * Represents a time of day with no date and no time zone.\n * @remarks\n * Deliberately not a JavaScript `Date`. A `Date` needs a date, and a time of day has none: `new Date('14:30:45')`\n * is not an instant pinned to some default day, it is `Invalid Date`. The value is destroyed outright rather than\n * merely shifted, which makes this the starker of the two temporal cases.\n */\nexport class TimeOnly {\n static readonly [typeKey] = 'TimeOnly';\n\n /**\n * The hour, 0 through 23.\n */\n @field(Number)\n hour!: number;\n\n /**\n * The minute, 0 through 59.\n */\n @field(Number)\n minute!: number;\n\n /**\n * The second, 0 through 59.\n */\n @field(Number)\n second!: number;\n\n /**\n * The millisecond, 0 through 999.\n */\n @field(Number)\n millisecond!: number;\n\n /**\n * Creates a {@link TimeOnly} from its parts.\n * @param hour The hour.\n * @param minute The minute.\n * @param second The second.\n * @param millisecond The millisecond.\n * @returns The {@link TimeOnly}.\n */\n static from(hour: number, minute: number, second: number = 0, millisecond: number = 0): TimeOnly {\n const timeOnly = new TimeOnly();\n timeOnly.hour = hour;\n timeOnly.minute = minute;\n timeOnly.second = second;\n timeOnly.millisecond = millisecond;\n return timeOnly;\n }\n\n /**\n * Parses the ISO-8601 time of day the server sends, `HH:mm`, `HH:mm:ss` or `HH:mm:ss.fffffff`.\n * @param value The value to parse.\n * @returns The {@link TimeOnly}.\n * @remarks\n * The seconds and the fraction are both optional because the server omits them when they are zero, and the\n * fraction carries up to seven digits where JavaScript holds three - so it is truncated rather than rounded,\n * which keeps a parse followed by a render from moving the value forward.\n */\n static parse(value: string): TimeOnly {\n const match = timeOnlyRegex.exec(value);\n if (match === null) {\n throw new Error(`Invalid TimeOnly format: ${value}`);\n }\n\n const fraction = match[4] ? match[4].padEnd(3, '0').substring(0, 3) : '0';\n\n return TimeOnly.from(\n parseInt(match[1], 10),\n parseInt(match[2], 10),\n match[3] ? parseInt(match[3], 10) : 0,\n parseInt(fraction, 10));\n }\n\n /**\n * Gets the ISO-8601 representation, `HH:mm:ss` - or `HH:mm:ss.fff` when there is a fractional part.\n * @returns The string.\n */\n toString(): string {\n const hour = this.hour.toString().padStart(2, '0');\n const minute = this.minute.toString().padStart(2, '0');\n const second = this.second.toString().padStart(2, '0');\n const time = `${hour}:${minute}:${second}`;\n return this.millisecond > 0 ? `${time}.${this.millisecond.toString().padStart(3, '0')}` : time;\n }\n\n /**\n * Determines whether this is the same time of day as another.\n * @param other The other time.\n * @returns True when they are the same time.\n */\n equals(other: TimeOnly | undefined | null): boolean {\n return !!other &&\n this.hour === other.hour &&\n this.minute === other.minute &&\n this.second === other.second &&\n this.millisecond === other.millisecond;\n }\n}\n"],"names":["typeKey","__decorate","field"],"mappings":"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"}
@@ -1,4 +1,6 @@
1
+ import { typeKey } from './typeKey';
1
2
  export declare class TimeSpan {
3
+ static readonly [typeKey] = "TimeSpan";
2
4
  ticks: number;
3
5
  days: number;
4
6
  hours: number;
@@ -1 +1 @@
1
- {"version":3,"file":"TimeSpan.d.ts","sourceRoot":"","sources":["../../TimeSpan.ts"],"names":[],"mappings":"AAUA,qBAAa,QAAQ;IAGjB,KAAK,EAAG,MAAM,CAAC;IAGf,IAAI,EAAG,MAAM,CAAC;IAGd,KAAK,EAAG,MAAM,CAAC;IAGf,YAAY,EAAG,MAAM,CAAC;IAGtB,YAAY,EAAG,MAAM,CAAC;IAGtB,WAAW,EAAG,MAAM,CAAC;IAGrB,OAAO,EAAG,MAAM,CAAC;IAGjB,OAAO,EAAG,MAAM,CAAC;IAGjB,SAAS,EAAG,MAAM,CAAC;IAGnB,UAAU,EAAG,MAAM,CAAC;IAGpB,iBAAiB,EAAG,MAAM,CAAC;IAG3B,iBAAiB,EAAG,MAAM,CAAC;IAG3B,gBAAgB,EAAG,MAAM,CAAC;IAG1B,YAAY,EAAG,MAAM,CAAC;IAGtB,YAAY,EAAG,MAAM,CAAC;IAStB,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ;IAoDrC,QAAQ,IAAI,MAAM;IA0ClB,MAAM,IAAI,MAAM;CAGnB"}
1
+ {"version":3,"file":"TimeSpan.d.ts","sourceRoot":"","sources":["../../TimeSpan.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,qBAAa,QAAQ;IACjB,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,cAAc;IAIvC,KAAK,EAAG,MAAM,CAAC;IAGf,IAAI,EAAG,MAAM,CAAC;IAGd,KAAK,EAAG,MAAM,CAAC;IAGf,YAAY,EAAG,MAAM,CAAC;IAGtB,YAAY,EAAG,MAAM,CAAC;IAGtB,WAAW,EAAG,MAAM,CAAC;IAGrB,OAAO,EAAG,MAAM,CAAC;IAGjB,OAAO,EAAG,MAAM,CAAC;IAGjB,SAAS,EAAG,MAAM,CAAC;IAGnB,UAAU,EAAG,MAAM,CAAC;IAGpB,iBAAiB,EAAG,MAAM,CAAC;IAG3B,iBAAiB,EAAG,MAAM,CAAC;IAG3B,gBAAgB,EAAG,MAAM,CAAC;IAG1B,YAAY,EAAG,MAAM,CAAC;IAGtB,YAAY,EAAG,MAAM,CAAC;IAStB,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ;IAoDrC,QAAQ,IAAI,MAAM;IA0ClB,MAAM,IAAI,MAAM;CAGnB"}
@@ -1,10 +1,12 @@
1
1
  'use strict';
2
2
 
3
3
  var _tslib = require('./_virtual/_tslib.js');
4
+ var typeKey = require('./typeKey.js');
4
5
  var fieldDecorator = require('./fieldDecorator.js');
5
6
 
6
7
  const timeSpanRegex = /^(-)?(?:(\d+)\.)?(\d{1,2}):(\d{2}):(\d{2})(?:\.(\d{1,7}))?$/;
7
8
  class TimeSpan {
9
+ static [typeKey.typeKey] = 'TimeSpan';
8
10
  ticks;
9
11
  days;
10
12
  hours;
@@ -1 +1 @@
1
- {"version":3,"file":"TimeSpan.js","sources":["../../TimeSpan.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 { field } from './fieldDecorator';\n\nconst timeSpanRegex = /^(-)?(?:(\\d+)\\.)?(\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d{1,7}))?$/;\n\n/**\n * Represents a time interval.\n */\nexport class TimeSpan {\n \n @field(Number)\n ticks!: number;\n\n @field(Number)\n days!: number;\n\n @field(Number)\n hours!: number;\n\n @field(Number)\n milliseconds!: number;\n\n @field(Number)\n microseconds!: number;\n\n @field(Number)\n nanoseconds!: number;\n\n @field(Number)\n minutes!: number;\n\n @field(Number)\n seconds!: number;\n\n @field(Number)\n totalDays!: number;\n\n @field(Number)\n totalHours!: number;\n\n @field(Number)\n totalMilliseconds!: number;\n\n @field(Number)\n totalMicroseconds!: number;\n\n @field(Number)\n totalNanoseconds!: number;\n\n @field(Number)\n totalMinutes!: number;\n\n @field(Number)\n totalSeconds!: number;\n\n /**\n * Parses a C# compatible TimeSpan string and returns a TimeSpan instance.\n * The string format should match: [-][d.]hh:mm:ss[.fffffff]\n * @param {string} value String representation of TimeSpan.\n * @returns {TimeSpan} A TimeSpan instance with all properties populated.\n * @throws {Error} If the string format is invalid.\n */\n static parse(value: string): TimeSpan {\n const match = timeSpanRegex.exec(value);\n if (match === null) {\n throw new Error(`Invalid TimeSpan format: ${value}`);\n }\n\n const isNegative = match[1] === '-';\n const days = match[2] ? parseInt(match[2], 10) : 0;\n const hours = parseInt(match[3], 10);\n const minutes = parseInt(match[4], 10);\n const seconds = parseInt(match[5], 10);\n const fractionalSeconds = match[6] ? match[6].padEnd(7, '0') : '0000000';\n\n const ticksPerDay = 864000000000;\n const ticksPerHour = 36000000000;\n const ticksPerMinute = 600000000;\n const ticksPerSecond = 10000000;\n\n const ticks =\n days * ticksPerDay +\n hours * ticksPerHour +\n minutes * ticksPerMinute +\n seconds * ticksPerSecond +\n parseInt(fractionalSeconds, 10);\n\n const finalTicks = isNegative ? -ticks : ticks;\n\n const timeSpan = new TimeSpan();\n timeSpan.ticks = finalTicks;\n timeSpan.days = Math.floor(Math.abs(finalTicks) / ticksPerDay) * (isNegative ? -1 : 1);\n timeSpan.hours = Math.floor((Math.abs(finalTicks) / ticksPerHour) % 24);\n timeSpan.minutes = Math.floor((Math.abs(finalTicks) / ticksPerMinute) % 60);\n timeSpan.seconds = Math.floor((Math.abs(finalTicks) / ticksPerSecond) % 60);\n timeSpan.milliseconds = Math.floor((Math.abs(finalTicks) / 10000) % 1000);\n timeSpan.microseconds = Math.floor((Math.abs(finalTicks) / 10) % 1000);\n timeSpan.nanoseconds = Math.floor((Math.abs(finalTicks) % 10) * 100);\n timeSpan.totalDays = finalTicks / ticksPerDay;\n timeSpan.totalHours = finalTicks / ticksPerHour;\n timeSpan.totalMinutes = finalTicks / ticksPerMinute;\n timeSpan.totalSeconds = finalTicks / ticksPerSecond;\n timeSpan.totalMilliseconds = finalTicks / 10000;\n timeSpan.totalMicroseconds = finalTicks / 10;\n timeSpan.totalNanoseconds = finalTicks * 100;\n\n return timeSpan;\n }\n\n /**\n * Converts the TimeSpan to a C# compatible string format.\n * Returns the TimeSpan in format: [-][d.]hh:mm:ss[.fffffff]\n * @returns {string} C# compatible TimeSpan string representation.\n */\n toString(): string {\n const isNegative = this.ticks < 0;\n const absTicks = Math.abs(this.ticks);\n\n const ticksPerDay = 864000000000;\n const ticksPerHour = 36000000000;\n const ticksPerMinute = 600000000;\n const ticksPerSecond = 10000000;\n\n const days = Math.floor(absTicks / ticksPerDay);\n const hours = Math.floor((absTicks / ticksPerHour) % 24);\n const minutes = Math.floor((absTicks / ticksPerMinute) % 60);\n const seconds = Math.floor((absTicks / ticksPerSecond) % 60);\n const fractionalTicks = absTicks % ticksPerSecond;\n\n const parts: string[] = [];\n\n if (isNegative) {\n parts.push('-');\n }\n\n if (days > 0) {\n parts.push(`${days}.`);\n }\n\n parts.push(`${hours.toString().padStart(2, '0')}:`);\n parts.push(`${minutes.toString().padStart(2, '0')}:`);\n parts.push(`${seconds.toString().padStart(2, '0')}`);\n\n if (fractionalTicks > 0) {\n const fractionalStr = fractionalTicks.toString().padStart(7, '0').replace(/0+$/, '');\n parts.push(`.${fractionalStr}`);\n }\n\n return parts.join('');\n }\n\n /**\n * Converts the TimeSpan to a JSON string that works in JSON serialization.\n * Returns the TimeSpan in C# compatible format: [-][d.]hh:mm:ss[.fffffff]\n * @returns {string} C# compatible TimeSpan string representation.\n */\n toJSON(): string {\n return this.toString();\n }\n}\n"],"names":["__decorate","field"],"mappings":"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"}
1
+ {"version":3,"file":"TimeSpan.js","sources":["../../TimeSpan.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 { typeKey } from './typeKey';\n\nimport { field } from './fieldDecorator';\n\nconst timeSpanRegex = /^(-)?(?:(\\d+)\\.)?(\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d{1,7}))?$/;\n\n/**\n * Represents a time interval.\n */\nexport class TimeSpan {\n static readonly [typeKey] = 'TimeSpan';\n\n \n @field(Number)\n ticks!: number;\n\n @field(Number)\n days!: number;\n\n @field(Number)\n hours!: number;\n\n @field(Number)\n milliseconds!: number;\n\n @field(Number)\n microseconds!: number;\n\n @field(Number)\n nanoseconds!: number;\n\n @field(Number)\n minutes!: number;\n\n @field(Number)\n seconds!: number;\n\n @field(Number)\n totalDays!: number;\n\n @field(Number)\n totalHours!: number;\n\n @field(Number)\n totalMilliseconds!: number;\n\n @field(Number)\n totalMicroseconds!: number;\n\n @field(Number)\n totalNanoseconds!: number;\n\n @field(Number)\n totalMinutes!: number;\n\n @field(Number)\n totalSeconds!: number;\n\n /**\n * Parses a C# compatible TimeSpan string and returns a TimeSpan instance.\n * The string format should match: [-][d.]hh:mm:ss[.fffffff]\n * @param {string} value String representation of TimeSpan.\n * @returns {TimeSpan} A TimeSpan instance with all properties populated.\n * @throws {Error} If the string format is invalid.\n */\n static parse(value: string): TimeSpan {\n const match = timeSpanRegex.exec(value);\n if (match === null) {\n throw new Error(`Invalid TimeSpan format: ${value}`);\n }\n\n const isNegative = match[1] === '-';\n const days = match[2] ? parseInt(match[2], 10) : 0;\n const hours = parseInt(match[3], 10);\n const minutes = parseInt(match[4], 10);\n const seconds = parseInt(match[5], 10);\n const fractionalSeconds = match[6] ? match[6].padEnd(7, '0') : '0000000';\n\n const ticksPerDay = 864000000000;\n const ticksPerHour = 36000000000;\n const ticksPerMinute = 600000000;\n const ticksPerSecond = 10000000;\n\n const ticks =\n days * ticksPerDay +\n hours * ticksPerHour +\n minutes * ticksPerMinute +\n seconds * ticksPerSecond +\n parseInt(fractionalSeconds, 10);\n\n const finalTicks = isNegative ? -ticks : ticks;\n\n const timeSpan = new TimeSpan();\n timeSpan.ticks = finalTicks;\n timeSpan.days = Math.floor(Math.abs(finalTicks) / ticksPerDay) * (isNegative ? -1 : 1);\n timeSpan.hours = Math.floor((Math.abs(finalTicks) / ticksPerHour) % 24);\n timeSpan.minutes = Math.floor((Math.abs(finalTicks) / ticksPerMinute) % 60);\n timeSpan.seconds = Math.floor((Math.abs(finalTicks) / ticksPerSecond) % 60);\n timeSpan.milliseconds = Math.floor((Math.abs(finalTicks) / 10000) % 1000);\n timeSpan.microseconds = Math.floor((Math.abs(finalTicks) / 10) % 1000);\n timeSpan.nanoseconds = Math.floor((Math.abs(finalTicks) % 10) * 100);\n timeSpan.totalDays = finalTicks / ticksPerDay;\n timeSpan.totalHours = finalTicks / ticksPerHour;\n timeSpan.totalMinutes = finalTicks / ticksPerMinute;\n timeSpan.totalSeconds = finalTicks / ticksPerSecond;\n timeSpan.totalMilliseconds = finalTicks / 10000;\n timeSpan.totalMicroseconds = finalTicks / 10;\n timeSpan.totalNanoseconds = finalTicks * 100;\n\n return timeSpan;\n }\n\n /**\n * Converts the TimeSpan to a C# compatible string format.\n * Returns the TimeSpan in format: [-][d.]hh:mm:ss[.fffffff]\n * @returns {string} C# compatible TimeSpan string representation.\n */\n toString(): string {\n const isNegative = this.ticks < 0;\n const absTicks = Math.abs(this.ticks);\n\n const ticksPerDay = 864000000000;\n const ticksPerHour = 36000000000;\n const ticksPerMinute = 600000000;\n const ticksPerSecond = 10000000;\n\n const days = Math.floor(absTicks / ticksPerDay);\n const hours = Math.floor((absTicks / ticksPerHour) % 24);\n const minutes = Math.floor((absTicks / ticksPerMinute) % 60);\n const seconds = Math.floor((absTicks / ticksPerSecond) % 60);\n const fractionalTicks = absTicks % ticksPerSecond;\n\n const parts: string[] = [];\n\n if (isNegative) {\n parts.push('-');\n }\n\n if (days > 0) {\n parts.push(`${days}.`);\n }\n\n parts.push(`${hours.toString().padStart(2, '0')}:`);\n parts.push(`${minutes.toString().padStart(2, '0')}:`);\n parts.push(`${seconds.toString().padStart(2, '0')}`);\n\n if (fractionalTicks > 0) {\n const fractionalStr = fractionalTicks.toString().padStart(7, '0').replace(/0+$/, '');\n parts.push(`.${fractionalStr}`);\n }\n\n return parts.join('');\n }\n\n /**\n * Converts the TimeSpan to a JSON string that works in JSON serialization.\n * Returns the TimeSpan in C# compatible format: [-][d.]hh:mm:ss[.fffffff]\n * @returns {string} C# compatible TimeSpan string representation.\n */\n toJSON(): string {\n return this.toString();\n }\n}\n"],"names":["typeKey","__decorate","field"],"mappings":"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"}
@@ -1,4 +1,6 @@
1
+ import { typeKey } from './typeKey';
1
2
  export declare class ValueMap<TKey, TValue> {
3
+ static readonly [typeKey] = "ValueMap";
2
4
  private readonly _entries;
3
5
  set(key: TKey, value: TValue): this;
4
6
  get(key: TKey): TValue | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"ValueMap.d.ts","sourceRoot":"","sources":["../../ValueMap.ts"],"names":[],"mappings":"AAMA,qBAAa,QAAQ,CAAC,IAAI,EAAE,MAAM;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAStD,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAiBnC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS;IASlC,OAAO,IAAI,gBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAI3C,OAAO,CAAC,MAAM;CAejB"}
1
+ {"version":3,"file":"ValueMap.d.ts","sourceRoot":"","sources":["../../ValueMap.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,qBAAa,QAAQ,CAAC,IAAI,EAAE,MAAM;IAC9B,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,cAAc;IAEvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAStD,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAiBnC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS;IASlC,OAAO,IAAI,gBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAI3C,OAAO,CAAC,MAAM;CAejB"}
@@ -1,6 +1,9 @@
1
1
  'use strict';
2
2
 
3
+ var typeKey = require('./typeKey.js');
4
+
3
5
  class ValueMap {
6
+ static [typeKey.typeKey] = 'ValueMap';
4
7
  _entries = [];
5
8
  set(key, value) {
6
9
  const index = this._entries.findIndex(([existingKey]) => this.equals(existingKey, key));
@@ -1 +1 @@
1
- {"version":3,"file":"ValueMap.js","sources":["../../ValueMap.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\n/**\n * Represents a map that compares object keys by value.\n */\nexport class ValueMap<TKey, TValue> {\n private readonly _entries: Array<[TKey, TValue]> = [];\n\n /**\n * Adds a new entry or updates an existing entry for the provided key.\n *\n * @param key Key to add or update.\n * @param value Value to associate with the key.\n * @returns The current map instance for chaining.\n */\n set(key: TKey, value: TValue): this {\n const index = this._entries.findIndex(([existingKey]) => this.equals(existingKey, key));\n if (index >= 0) {\n this._entries[index][1] = value;\n } else {\n this._entries.push([key, value]);\n }\n\n return this;\n }\n\n /**\n * Gets the value associated with the provided key.\n *\n * @param key Key to look up.\n * @returns The matching value, or undefined when no entry matches.\n */\n get(key: TKey): TValue | undefined {\n return this._entries.find(([existingKey]) => this.equals(existingKey, key))?.[1];\n }\n\n /**\n * Gets an iterator over all key-value entries in insertion order.\n *\n * @returns Iterator for the map entries.\n */\n entries(): IterableIterator<[TKey, TValue]> {\n return this._entries.values();\n }\n\n private equals(first: TKey, second: TKey): boolean {\n if (first === second) {\n return true;\n }\n\n if (first === undefined || first === null || second === undefined || second === null) {\n return false;\n }\n\n if (typeof first === 'object' && typeof second === 'object') {\n return JSON.stringify(first) === JSON.stringify(second);\n }\n\n return false;\n }\n}"],"names":[],"mappings":";;MAMa,QAAQ,CAAA;IACA,QAAQ,GAA0B,EAAE;IASrD,GAAG,CAAC,GAAS,EAAE,KAAa,EAAA;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACvF,QAAA,IAAI,KAAK,IAAI,CAAC,EAAE;YACZ,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK;QACnC;aAAO;YACH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACpC;AAEA,QAAA,OAAO,IAAI;IACf;AAQA,IAAA,GAAG,CAAC,GAAS,EAAA;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACpF;IAOA,OAAO,GAAA;AACH,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;IACjC;IAEQ,MAAM,CAAC,KAAW,EAAE,MAAY,EAAA;AACpC,QAAA,IAAI,KAAK,KAAK,MAAM,EAAE;AAClB,YAAA,OAAO,IAAI;QACf;AAEA,QAAA,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,EAAE;AAClF,YAAA,OAAO,KAAK;QAChB;QAEA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AACzD,YAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QAC3D;AAEA,QAAA,OAAO,KAAK;IAChB;AACH;;;;"}
1
+ {"version":3,"file":"ValueMap.js","sources":["../../ValueMap.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.\nimport { typeKey } from './typeKey';\n\n/**\n * Represents a map that compares object keys by value.\n */\nexport class ValueMap<TKey, TValue> {\n static readonly [typeKey] = 'ValueMap';\n\n private readonly _entries: Array<[TKey, TValue]> = [];\n\n /**\n * Adds a new entry or updates an existing entry for the provided key.\n *\n * @param key Key to add or update.\n * @param value Value to associate with the key.\n * @returns The current map instance for chaining.\n */\n set(key: TKey, value: TValue): this {\n const index = this._entries.findIndex(([existingKey]) => this.equals(existingKey, key));\n if (index >= 0) {\n this._entries[index][1] = value;\n } else {\n this._entries.push([key, value]);\n }\n\n return this;\n }\n\n /**\n * Gets the value associated with the provided key.\n *\n * @param key Key to look up.\n * @returns The matching value, or undefined when no entry matches.\n */\n get(key: TKey): TValue | undefined {\n return this._entries.find(([existingKey]) => this.equals(existingKey, key))?.[1];\n }\n\n /**\n * Gets an iterator over all key-value entries in insertion order.\n *\n * @returns Iterator for the map entries.\n */\n entries(): IterableIterator<[TKey, TValue]> {\n return this._entries.values();\n }\n\n private equals(first: TKey, second: TKey): boolean {\n if (first === second) {\n return true;\n }\n\n if (first === undefined || first === null || second === undefined || second === null) {\n return false;\n }\n\n if (typeof first === 'object' && typeof second === 'object') {\n return JSON.stringify(first) === JSON.stringify(second);\n }\n\n return false;\n }\n}"],"names":["typeKey"],"mappings":";;;;MAOa,QAAQ,CAAA;AACjB,IAAA,QAAiBA,eAAO,IAAI,UAAU;IAErB,QAAQ,GAA0B,EAAE;IASrD,GAAG,CAAC,GAAS,EAAE,KAAa,EAAA;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACvF,QAAA,IAAI,KAAK,IAAI,CAAC,EAAE;YACZ,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK;QACnC;aAAO;YACH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACpC;AAEA,QAAA,OAAO,IAAI;IACf;AAQA,IAAA,GAAG,CAAC,GAAS,EAAA;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACpF;IAOA,OAAO,GAAA;AACH,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;IACjC;IAEQ,MAAM,CAAC,KAAW,EAAE,MAAY,EAAA;AACpC,QAAA,IAAI,KAAK,KAAK,MAAM,EAAE;AAClB,YAAA,OAAO,IAAI;QACf;AAEA,QAAA,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,EAAE;AAClF,YAAA,OAAO,KAAK;QAChB;QAEA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AACzD,YAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QAC3D;AAEA,QAAA,OAAO,KAAK;IAChB;;;;;"}
@@ -0,0 +1,2 @@
1
+ export declare const registerModuleInstance: () => void;
2
+ //# sourceMappingURL=duplicateInstanceGuard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicateInstanceGuard.d.ts","sourceRoot":"","sources":["../../duplicateInstanceGuard.ts"],"names":[],"mappings":"AAkGA,eAAO,MAAM,sBAAsB,QAAO,IAezC,CAAC"}