@dipscope/type-manager 7.0.0-beta.0 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (387) hide show
  1. package/CHANGELOG.md +262 -262
  2. package/CONTRIBUTING.md +58 -58
  3. package/LICENSE.md +201 -201
  4. package/README.md +1901 -1901
  5. package/dist/es2015/alias.js +1 -1
  6. package/dist/es2015/any.js +2 -2
  7. package/dist/es2015/custom-context.js +57 -57
  8. package/dist/es2015/custom-key.js +7 -7
  9. package/dist/es2015/custom-option.js +1 -1
  10. package/dist/es2015/custom-value-resolver.js +1 -1
  11. package/dist/es2015/custom-value.js +1 -1
  12. package/dist/es2015/default-value-resolver.js +1 -1
  13. package/dist/es2015/default-value.js +1 -1
  14. package/dist/es2015/discriminant.js +1 -1
  15. package/dist/es2015/discriminator.js +1 -1
  16. package/dist/es2015/factories/index.js +1 -1
  17. package/dist/es2015/factories/type-factory.js +33 -33
  18. package/dist/es2015/factory.js +1 -1
  19. package/dist/es2015/functions/get-own-reflect-metadata.js +7 -7
  20. package/dist/es2015/functions/get-reflect-metadata.js +7 -7
  21. package/dist/es2015/functions/get-words.js +4 -4
  22. package/dist/es2015/functions/index.js +18 -18
  23. package/dist/es2015/functions/is-arrow-function.js +4 -4
  24. package/dist/es2015/functions/is-ctor-function.js +4 -4
  25. package/dist/es2015/functions/is-data-view.js +3 -3
  26. package/dist/es2015/functions/is-float-32-array.js +3 -3
  27. package/dist/es2015/functions/is-float-64-array.js +3 -3
  28. package/dist/es2015/functions/is-int-16-array.js +3 -3
  29. package/dist/es2015/functions/is-int-32-array.js +3 -3
  30. package/dist/es2015/functions/is-int-8-array.js +3 -3
  31. package/dist/es2015/functions/is-uint-16-array.js +3 -3
  32. package/dist/es2015/functions/is-uint-32-array.js +3 -3
  33. package/dist/es2015/functions/is-uint-8-array.js +3 -3
  34. package/dist/es2015/functions/is-uint-8-clamped-array.js +3 -3
  35. package/dist/es2015/functions/json-parse.js +3 -3
  36. package/dist/es2015/functions/json-stringify.js +66 -66
  37. package/dist/es2015/functions/name-of.js +7 -7
  38. package/dist/es2015/generic-argument.js +1 -1
  39. package/dist/es2015/generic-metadata-resolver.js +1 -1
  40. package/dist/es2015/generic-metadata.js +1 -1
  41. package/dist/es2015/generic-structure.js +1 -1
  42. package/dist/es2015/index.js +70 -70
  43. package/dist/es2015/inject-index.js +1 -1
  44. package/dist/es2015/inject-internals.js +1 -1
  45. package/dist/es2015/inject-metadata.js +62 -62
  46. package/dist/es2015/inject-options.js +1 -1
  47. package/dist/es2015/inject-sorter.js +1 -1
  48. package/dist/es2015/inject-sorters/asc-inject-sorter.js +13 -13
  49. package/dist/es2015/inject-sorters/desc-inject-sorter.js +13 -13
  50. package/dist/es2015/inject-sorters/index.js +2 -2
  51. package/dist/es2015/inject.js +23 -23
  52. package/dist/es2015/injector.js +1 -1
  53. package/dist/es2015/injectors/index.js +1 -1
  54. package/dist/es2015/injectors/singleton-injector.js +30 -30
  55. package/dist/es2015/log-level.js +7 -7
  56. package/dist/es2015/log.js +49 -49
  57. package/dist/es2015/metadata.js +80 -80
  58. package/dist/es2015/naming-convention.js +1 -1
  59. package/dist/es2015/naming-conventions/camel-case-naming-convention.js +16 -16
  60. package/dist/es2015/naming-conventions/flat-case-naming-convention.js +12 -12
  61. package/dist/es2015/naming-conventions/flat-upper-case-naming-convention.js +12 -12
  62. package/dist/es2015/naming-conventions/index.js +8 -8
  63. package/dist/es2015/naming-conventions/kebab-case-naming-convention.js +16 -16
  64. package/dist/es2015/naming-conventions/kebab-upper-case-naming-convention.js +16 -16
  65. package/dist/es2015/naming-conventions/pascal-case-naming-convention.js +17 -17
  66. package/dist/es2015/naming-conventions/snake-case-naming-convention.js +16 -16
  67. package/dist/es2015/naming-conventions/snake-upper-case-naming-convention.js +16 -16
  68. package/dist/es2015/property-internals.js +1 -1
  69. package/dist/es2015/property-metadata.js +268 -268
  70. package/dist/es2015/property-name.js +1 -1
  71. package/dist/es2015/property-options.js +1 -1
  72. package/dist/es2015/property-sorter.js +1 -1
  73. package/dist/es2015/property-sorters/asc-property-sorter.js +13 -13
  74. package/dist/es2015/property-sorters/desc-property-sorter.js +13 -13
  75. package/dist/es2015/property-sorters/index.js +2 -2
  76. package/dist/es2015/property.js +38 -38
  77. package/dist/es2015/reference-callback.js +1 -1
  78. package/dist/es2015/reference-handler.js +1 -1
  79. package/dist/es2015/reference-handlers/circular-reference-handler.js +35 -35
  80. package/dist/es2015/reference-handlers/index.js +3 -3
  81. package/dist/es2015/reference-handlers/json-path-reference-handler.js +68 -68
  82. package/dist/es2015/reference-handlers/plain-reference-handler.js +31 -31
  83. package/dist/es2015/reference-key.js +1 -1
  84. package/dist/es2015/reference-value-getter.js +1 -1
  85. package/dist/es2015/reference-value-setter.js +1 -1
  86. package/dist/es2015/reference-value.js +1 -1
  87. package/dist/es2015/serializer-context-options.js +1 -1
  88. package/dist/es2015/serializer-context.js +281 -281
  89. package/dist/es2015/serializer.js +1 -1
  90. package/dist/es2015/serializers/any-serializer.js +21 -21
  91. package/dist/es2015/serializers/array-buffer-serializer.js +40 -40
  92. package/dist/es2015/serializers/array-serializer.js +59 -59
  93. package/dist/es2015/serializers/boolean-serializer.js +54 -54
  94. package/dist/es2015/serializers/data-view-serializer.js +41 -41
  95. package/dist/es2015/serializers/date-serializer.js +33 -33
  96. package/dist/es2015/serializers/float-32-array-serializer.js +34 -34
  97. package/dist/es2015/serializers/float-64-array-serializer.js +34 -34
  98. package/dist/es2015/serializers/index.js +21 -21
  99. package/dist/es2015/serializers/int-16-array-serializer.js +34 -34
  100. package/dist/es2015/serializers/int-32-array-serializer.js +34 -34
  101. package/dist/es2015/serializers/int-8-array-serializer.js +34 -34
  102. package/dist/es2015/serializers/map-serializer.js +95 -95
  103. package/dist/es2015/serializers/number-serializer.js +48 -48
  104. package/dist/es2015/serializers/set-serializer.js +61 -61
  105. package/dist/es2015/serializers/string-serializer.js +54 -54
  106. package/dist/es2015/serializers/type-serializer.js +120 -120
  107. package/dist/es2015/serializers/uint-16-array-serializer.js +34 -34
  108. package/dist/es2015/serializers/uint-32-array-serializer.js +34 -34
  109. package/dist/es2015/serializers/uint-8-array-serializer.js +34 -34
  110. package/dist/es2015/serializers/uint-8-clamped-array-serializer.js +34 -34
  111. package/dist/es2015/serializers/unknown-serializer.js +21 -21
  112. package/dist/es2015/type-abstraction.js +1 -1
  113. package/dist/es2015/type-argument.js +1 -1
  114. package/dist/es2015/type-configuration.js +1 -1
  115. package/dist/es2015/type-context-entry.js +8 -8
  116. package/dist/es2015/type-context.js +30 -30
  117. package/dist/es2015/type-ctor.js +1 -1
  118. package/dist/es2015/type-fn.js +1 -1
  119. package/dist/es2015/type-internals.js +1 -1
  120. package/dist/es2015/type-like.js +1 -1
  121. package/dist/es2015/type-manager-options.js +1 -1
  122. package/dist/es2015/type-manager.js +319 -319
  123. package/dist/es2015/type-metadata-resolver.js +1 -1
  124. package/dist/es2015/type-metadata-symbol.js +1 -1
  125. package/dist/es2015/type-metadata.js +413 -413
  126. package/dist/es2015/type-name.js +1 -1
  127. package/dist/es2015/type-options-base.js +1 -1
  128. package/dist/es2015/type-options.js +1 -1
  129. package/dist/es2015/type-resolver.js +1 -1
  130. package/dist/es2015/type.js +7 -7
  131. package/dist/es2015/unknown.js +2 -2
  132. package/dist/es5/alias.js +1 -1
  133. package/dist/es5/any.js +6 -6
  134. package/dist/es5/custom-context.js +93 -93
  135. package/dist/es5/custom-key.js +9 -9
  136. package/dist/es5/custom-option.js +1 -1
  137. package/dist/es5/custom-value-resolver.js +1 -1
  138. package/dist/es5/custom-value.js +1 -1
  139. package/dist/es5/default-value-resolver.js +1 -1
  140. package/dist/es5/default-value.js +1 -1
  141. package/dist/es5/discriminant.js +1 -1
  142. package/dist/es5/discriminator.js +1 -1
  143. package/dist/es5/factories/index.js +1 -1
  144. package/dist/es5/factories/type-factory.js +59 -59
  145. package/dist/es5/factory.js +1 -1
  146. package/dist/es5/functions/get-own-reflect-metadata.js +7 -7
  147. package/dist/es5/functions/get-reflect-metadata.js +7 -7
  148. package/dist/es5/functions/get-words.js +4 -4
  149. package/dist/es5/functions/index.js +18 -18
  150. package/dist/es5/functions/is-arrow-function.js +4 -4
  151. package/dist/es5/functions/is-ctor-function.js +4 -4
  152. package/dist/es5/functions/is-data-view.js +3 -3
  153. package/dist/es5/functions/is-float-32-array.js +3 -3
  154. package/dist/es5/functions/is-float-64-array.js +3 -3
  155. package/dist/es5/functions/is-int-16-array.js +3 -3
  156. package/dist/es5/functions/is-int-32-array.js +3 -3
  157. package/dist/es5/functions/is-int-8-array.js +3 -3
  158. package/dist/es5/functions/is-uint-16-array.js +3 -3
  159. package/dist/es5/functions/is-uint-32-array.js +3 -3
  160. package/dist/es5/functions/is-uint-8-array.js +3 -3
  161. package/dist/es5/functions/is-uint-8-clamped-array.js +3 -3
  162. package/dist/es5/functions/json-parse.js +3 -3
  163. package/dist/es5/functions/json-stringify.js +66 -66
  164. package/dist/es5/functions/name-of.js +7 -7
  165. package/dist/es5/generic-argument.js +1 -1
  166. package/dist/es5/generic-metadata-resolver.js +1 -1
  167. package/dist/es5/generic-metadata.js +1 -1
  168. package/dist/es5/generic-structure.js +1 -1
  169. package/dist/es5/index.js +70 -70
  170. package/dist/es5/inject-index.js +1 -1
  171. package/dist/es5/inject-internals.js +1 -1
  172. package/dist/es5/inject-metadata.js +83 -83
  173. package/dist/es5/inject-options.js +1 -1
  174. package/dist/es5/inject-sorter.js +1 -1
  175. package/dist/es5/inject-sorters/asc-inject-sorter.js +17 -17
  176. package/dist/es5/inject-sorters/desc-inject-sorter.js +17 -17
  177. package/dist/es5/inject-sorters/index.js +2 -2
  178. package/dist/es5/inject.js +23 -23
  179. package/dist/es5/injector.js +1 -1
  180. package/dist/es5/injectors/index.js +1 -1
  181. package/dist/es5/injectors/singleton-injector.js +44 -44
  182. package/dist/es5/log-level.js +7 -7
  183. package/dist/es5/log.js +64 -64
  184. package/dist/es5/metadata.js +105 -105
  185. package/dist/es5/naming-convention.js +1 -1
  186. package/dist/es5/naming-conventions/camel-case-naming-convention.js +20 -20
  187. package/dist/es5/naming-conventions/flat-case-naming-convention.js +16 -16
  188. package/dist/es5/naming-conventions/flat-upper-case-naming-convention.js +16 -16
  189. package/dist/es5/naming-conventions/index.js +8 -8
  190. package/dist/es5/naming-conventions/kebab-case-naming-convention.js +20 -20
  191. package/dist/es5/naming-conventions/kebab-upper-case-naming-convention.js +20 -20
  192. package/dist/es5/naming-conventions/pascal-case-naming-convention.js +21 -21
  193. package/dist/es5/naming-conventions/snake-case-naming-convention.js +20 -20
  194. package/dist/es5/naming-conventions/snake-upper-case-naming-convention.js +20 -20
  195. package/dist/es5/property-internals.js +1 -1
  196. package/dist/es5/property-metadata.js +377 -377
  197. package/dist/es5/property-name.js +1 -1
  198. package/dist/es5/property-options.js +1 -1
  199. package/dist/es5/property-sorter.js +1 -1
  200. package/dist/es5/property-sorters/asc-property-sorter.js +17 -17
  201. package/dist/es5/property-sorters/desc-property-sorter.js +17 -17
  202. package/dist/es5/property-sorters/index.js +2 -2
  203. package/dist/es5/property.js +38 -38
  204. package/dist/es5/reference-callback.js +1 -1
  205. package/dist/es5/reference-handler.js +1 -1
  206. package/dist/es5/reference-handlers/circular-reference-handler.js +39 -39
  207. package/dist/es5/reference-handlers/index.js +3 -3
  208. package/dist/es5/reference-handlers/json-path-reference-handler.js +92 -92
  209. package/dist/es5/reference-handlers/plain-reference-handler.js +35 -35
  210. package/dist/es5/reference-key.js +1 -1
  211. package/dist/es5/reference-value-getter.js +1 -1
  212. package/dist/es5/reference-value-setter.js +1 -1
  213. package/dist/es5/reference-value.js +1 -1
  214. package/dist/es5/serializer-context-options.js +1 -1
  215. package/dist/es5/serializer-context.js +416 -416
  216. package/dist/es5/serializer.js +1 -1
  217. package/dist/es5/serializers/any-serializer.js +25 -25
  218. package/dist/es5/serializers/array-buffer-serializer.js +44 -44
  219. package/dist/es5/serializers/array-serializer.js +69 -69
  220. package/dist/es5/serializers/boolean-serializer.js +58 -58
  221. package/dist/es5/serializers/data-view-serializer.js +45 -45
  222. package/dist/es5/serializers/date-serializer.js +37 -37
  223. package/dist/es5/serializers/float-32-array-serializer.js +38 -38
  224. package/dist/es5/serializers/float-64-array-serializer.js +38 -38
  225. package/dist/es5/serializers/index.js +21 -21
  226. package/dist/es5/serializers/int-16-array-serializer.js +38 -38
  227. package/dist/es5/serializers/int-32-array-serializer.js +38 -38
  228. package/dist/es5/serializers/int-8-array-serializer.js +38 -38
  229. package/dist/es5/serializers/map-serializer.js +114 -114
  230. package/dist/es5/serializers/number-serializer.js +52 -52
  231. package/dist/es5/serializers/set-serializer.js +77 -77
  232. package/dist/es5/serializers/string-serializer.js +58 -58
  233. package/dist/es5/serializers/type-serializer.js +153 -153
  234. package/dist/es5/serializers/uint-16-array-serializer.js +38 -38
  235. package/dist/es5/serializers/uint-32-array-serializer.js +38 -38
  236. package/dist/es5/serializers/uint-8-array-serializer.js +38 -38
  237. package/dist/es5/serializers/uint-8-clamped-array-serializer.js +38 -38
  238. package/dist/es5/serializers/unknown-serializer.js +25 -25
  239. package/dist/es5/type-abstraction.js +1 -1
  240. package/dist/es5/type-argument.js +1 -1
  241. package/dist/es5/type-configuration.js +1 -1
  242. package/dist/es5/type-context-entry.js +10 -10
  243. package/dist/es5/type-context.js +32 -32
  244. package/dist/es5/type-ctor.js +1 -1
  245. package/dist/es5/type-fn.js +1 -1
  246. package/dist/es5/type-internals.js +1 -1
  247. package/dist/es5/type-like.js +1 -1
  248. package/dist/es5/type-manager-options.js +1 -1
  249. package/dist/es5/type-manager.js +412 -412
  250. package/dist/es5/type-metadata-resolver.js +1 -1
  251. package/dist/es5/type-metadata-symbol.js +1 -1
  252. package/dist/es5/type-metadata.js +563 -563
  253. package/dist/es5/type-name.js +1 -1
  254. package/dist/es5/type-options-base.js +1 -1
  255. package/dist/es5/type-options.js +1 -1
  256. package/dist/es5/type-resolver.js +1 -1
  257. package/dist/es5/type.js +7 -7
  258. package/dist/es5/unknown.js +6 -6
  259. package/dist/types/alias.d.ts +6 -6
  260. package/dist/types/any.d.ts +9 -9
  261. package/dist/types/custom-context.d.ts +88 -88
  262. package/dist/types/custom-key.d.ts +28 -28
  263. package/dist/types/custom-option.d.ts +10 -10
  264. package/dist/types/custom-value-resolver.d.ts +6 -6
  265. package/dist/types/custom-value.d.ts +6 -6
  266. package/dist/types/default-value-resolver.d.ts +7 -7
  267. package/dist/types/default-value.d.ts +7 -7
  268. package/dist/types/discriminant.d.ts +8 -8
  269. package/dist/types/discriminator.d.ts +6 -6
  270. package/dist/types/factories/index.d.ts +1 -1
  271. package/dist/types/factories/type-factory.d.ts +19 -19
  272. package/dist/types/factory.d.ts +18 -18
  273. package/dist/types/functions/get-own-reflect-metadata.d.ts +9 -9
  274. package/dist/types/functions/get-reflect-metadata.d.ts +10 -10
  275. package/dist/types/functions/get-words.d.ts +8 -8
  276. package/dist/types/functions/index.d.ts +18 -18
  277. package/dist/types/functions/is-arrow-function.d.ts +8 -8
  278. package/dist/types/functions/is-ctor-function.d.ts +8 -8
  279. package/dist/types/functions/is-data-view.d.ts +8 -8
  280. package/dist/types/functions/is-float-32-array.d.ts +8 -8
  281. package/dist/types/functions/is-float-64-array.d.ts +8 -8
  282. package/dist/types/functions/is-int-16-array.d.ts +8 -8
  283. package/dist/types/functions/is-int-32-array.d.ts +8 -8
  284. package/dist/types/functions/is-int-8-array.d.ts +8 -8
  285. package/dist/types/functions/is-uint-16-array.d.ts +8 -8
  286. package/dist/types/functions/is-uint-32-array.d.ts +8 -8
  287. package/dist/types/functions/is-uint-8-array.d.ts +8 -8
  288. package/dist/types/functions/is-uint-8-clamped-array.d.ts +8 -8
  289. package/dist/types/functions/json-parse.d.ts +9 -9
  290. package/dist/types/functions/json-stringify.d.ts +10 -10
  291. package/dist/types/functions/name-of.d.ts +8 -8
  292. package/dist/types/generic-argument.d.ts +7 -7
  293. package/dist/types/generic-metadata-resolver.d.ts +7 -7
  294. package/dist/types/generic-metadata.d.ts +7 -7
  295. package/dist/types/generic-structure.d.ts +7 -7
  296. package/dist/types/index.d.ts +70 -70
  297. package/dist/types/inject-index.d.ts +6 -6
  298. package/dist/types/inject-internals.d.ts +14 -14
  299. package/dist/types/inject-metadata.d.ts +117 -117
  300. package/dist/types/inject-options.d.ts +22 -22
  301. package/dist/types/inject-sorter.d.ts +19 -19
  302. package/dist/types/inject-sorters/asc-inject-sorter.d.ts +20 -20
  303. package/dist/types/inject-sorters/desc-inject-sorter.d.ts +20 -20
  304. package/dist/types/inject-sorters/index.d.ts +2 -2
  305. package/dist/types/inject.d.ts +10 -10
  306. package/dist/types/injector.d.ts +16 -16
  307. package/dist/types/injectors/index.d.ts +1 -1
  308. package/dist/types/injectors/singleton-injector.d.ts +31 -31
  309. package/dist/types/log-level.d.ts +11 -11
  310. package/dist/types/log.d.ts +95 -95
  311. package/dist/types/metadata.d.ts +99 -99
  312. package/dist/types/naming-convention.d.ts +15 -15
  313. package/dist/types/naming-conventions/camel-case-naming-convention.d.ts +26 -26
  314. package/dist/types/naming-conventions/flat-case-naming-convention.d.ts +25 -25
  315. package/dist/types/naming-conventions/flat-upper-case-naming-convention.d.ts +25 -25
  316. package/dist/types/naming-conventions/index.d.ts +8 -8
  317. package/dist/types/naming-conventions/kebab-case-naming-convention.d.ts +26 -26
  318. package/dist/types/naming-conventions/kebab-upper-case-naming-convention.d.ts +26 -26
  319. package/dist/types/naming-conventions/pascal-case-naming-convention.d.ts +26 -26
  320. package/dist/types/naming-conventions/snake-case-naming-convention.d.ts +26 -26
  321. package/dist/types/naming-conventions/snake-upper-case-naming-convention.d.ts +26 -26
  322. package/dist/types/property-internals.d.ts +35 -35
  323. package/dist/types/property-metadata.d.ts +359 -359
  324. package/dist/types/property-name.d.ts +6 -6
  325. package/dist/types/property-options.d.ts +116 -116
  326. package/dist/types/property-sorter.d.ts +19 -19
  327. package/dist/types/property-sorters/asc-property-sorter.d.ts +20 -20
  328. package/dist/types/property-sorters/desc-property-sorter.d.ts +20 -20
  329. package/dist/types/property-sorters/index.d.ts +2 -2
  330. package/dist/types/property.d.ts +13 -13
  331. package/dist/types/reference-callback.d.ts +7 -7
  332. package/dist/types/reference-handler.d.ts +31 -31
  333. package/dist/types/reference-handlers/circular-reference-handler.d.ts +32 -32
  334. package/dist/types/reference-handlers/index.d.ts +3 -3
  335. package/dist/types/reference-handlers/json-path-reference-handler.d.ts +55 -55
  336. package/dist/types/reference-handlers/plain-reference-handler.d.ts +33 -33
  337. package/dist/types/reference-key.d.ts +6 -6
  338. package/dist/types/reference-value-getter.d.ts +7 -7
  339. package/dist/types/reference-value-setter.d.ts +7 -7
  340. package/dist/types/reference-value.d.ts +6 -6
  341. package/dist/types/serializer-context-options.d.ts +50 -50
  342. package/dist/types/serializer-context.d.ts +418 -418
  343. package/dist/types/serializer.d.ts +27 -27
  344. package/dist/types/serializers/any-serializer.d.ts +28 -28
  345. package/dist/types/serializers/array-buffer-serializer.d.ts +28 -28
  346. package/dist/types/serializers/array-serializer.d.ts +28 -28
  347. package/dist/types/serializers/boolean-serializer.d.ts +37 -37
  348. package/dist/types/serializers/data-view-serializer.d.ts +28 -28
  349. package/dist/types/serializers/date-serializer.d.ts +28 -28
  350. package/dist/types/serializers/float-32-array-serializer.d.ts +28 -28
  351. package/dist/types/serializers/float-64-array-serializer.d.ts +28 -28
  352. package/dist/types/serializers/index.d.ts +21 -21
  353. package/dist/types/serializers/int-16-array-serializer.d.ts +28 -28
  354. package/dist/types/serializers/int-32-array-serializer.d.ts +28 -28
  355. package/dist/types/serializers/int-8-array-serializer.d.ts +28 -28
  356. package/dist/types/serializers/map-serializer.d.ts +28 -28
  357. package/dist/types/serializers/number-serializer.d.ts +37 -37
  358. package/dist/types/serializers/set-serializer.d.ts +28 -28
  359. package/dist/types/serializers/string-serializer.d.ts +37 -37
  360. package/dist/types/serializers/type-serializer.d.ts +28 -28
  361. package/dist/types/serializers/uint-16-array-serializer.d.ts +28 -28
  362. package/dist/types/serializers/uint-32-array-serializer.d.ts +28 -28
  363. package/dist/types/serializers/uint-8-array-serializer.d.ts +28 -28
  364. package/dist/types/serializers/uint-8-clamped-array-serializer.d.ts +28 -28
  365. package/dist/types/serializers/unknown-serializer.d.ts +28 -28
  366. package/dist/types/type-abstraction.d.ts +6 -6
  367. package/dist/types/type-argument.d.ts +9 -9
  368. package/dist/types/type-configuration.d.ts +16 -16
  369. package/dist/types/type-context-entry.d.ts +36 -36
  370. package/dist/types/type-context.d.ts +70 -70
  371. package/dist/types/type-ctor.d.ts +6 -6
  372. package/dist/types/type-fn.d.ts +8 -8
  373. package/dist/types/type-internals.d.ts +14 -14
  374. package/dist/types/type-like.d.ts +7 -7
  375. package/dist/types/type-manager-options.d.ts +33 -33
  376. package/dist/types/type-manager.d.ts +413 -413
  377. package/dist/types/type-metadata-resolver.d.ts +8 -8
  378. package/dist/types/type-metadata-symbol.d.ts +6 -6
  379. package/dist/types/type-metadata.d.ts +513 -513
  380. package/dist/types/type-name.d.ts +6 -6
  381. package/dist/types/type-options-base.d.ts +106 -106
  382. package/dist/types/type-options.d.ts +72 -72
  383. package/dist/types/type-resolver.d.ts +7 -7
  384. package/dist/types/type.d.ts +9 -9
  385. package/dist/types/unknown.d.ts +9 -9
  386. package/dist/umd/index.js.map +1 -1
  387. package/package.json +63 -63
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","mappings":"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","sources":["webpack://$DSTypeManager/webpack/universalModuleDefinition","webpack://$DSTypeManager/./src/any.ts","webpack://$DSTypeManager/./src/custom-context.ts","webpack://$DSTypeManager/./src/custom-key.ts","webpack://$DSTypeManager/./src/factories/index.ts","webpack://$DSTypeManager/./src/factories/type-factory.ts","webpack://$DSTypeManager/./src/functions/get-own-reflect-metadata.ts","webpack://$DSTypeManager/./src/functions/get-reflect-metadata.ts","webpack://$DSTypeManager/./src/functions/get-words.ts","webpack://$DSTypeManager/./src/functions/index.ts","webpack://$DSTypeManager/./src/functions/is-arrow-function.ts","webpack://$DSTypeManager/./src/functions/is-ctor-function.ts","webpack://$DSTypeManager/./src/functions/is-data-view.ts","webpack://$DSTypeManager/./src/functions/is-float-32-array.ts","webpack://$DSTypeManager/./src/functions/is-float-64-array.ts","webpack://$DSTypeManager/./src/functions/is-int-16-array.ts","webpack://$DSTypeManager/./src/functions/is-int-32-array.ts","webpack://$DSTypeManager/./src/functions/is-int-8-array.ts","webpack://$DSTypeManager/./src/functions/is-uint-16-array.ts","webpack://$DSTypeManager/./src/functions/is-uint-32-array.ts","webpack://$DSTypeManager/./src/functions/is-uint-8-array.ts","webpack://$DSTypeManager/./src/functions/is-uint-8-clamped-array.ts","webpack://$DSTypeManager/./src/functions/json-parse.ts","webpack://$DSTypeManager/./src/functions/json-stringify.ts","webpack://$DSTypeManager/./src/functions/name-of.ts","webpack://$DSTypeManager/./src/index.ts","webpack://$DSTypeManager/./src/inject-metadata.ts","webpack://$DSTypeManager/./src/inject-sorters/asc-inject-sorter.ts","webpack://$DSTypeManager/./src/inject-sorters/desc-inject-sorter.ts","webpack://$DSTypeManager/./src/inject-sorters/index.ts","webpack://$DSTypeManager/./src/inject.ts","webpack://$DSTypeManager/./src/injectors/index.ts","webpack://$DSTypeManager/./src/injectors/singleton-injector.ts","webpack://$DSTypeManager/./src/log-level.ts","webpack://$DSTypeManager/./src/log.ts","webpack://$DSTypeManager/./src/metadata.ts","webpack://$DSTypeManager/./src/naming-conventions/camel-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/flat-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/flat-upper-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/index.ts","webpack://$DSTypeManager/./src/naming-conventions/kebab-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/kebab-upper-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/pascal-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/snake-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/snake-upper-case-naming-convention.ts","webpack://$DSTypeManager/./src/property-metadata.ts","webpack://$DSTypeManager/./src/property-sorters/asc-property-sorter.ts","webpack://$DSTypeManager/./src/property-sorters/desc-property-sorter.ts","webpack://$DSTypeManager/./src/property-sorters/index.ts","webpack://$DSTypeManager/./src/property.ts","webpack://$DSTypeManager/./src/reference-handlers/circular-reference-handler.ts","webpack://$DSTypeManager/./src/reference-handlers/index.ts","webpack://$DSTypeManager/./src/reference-handlers/json-path-reference-handler.ts","webpack://$DSTypeManager/./src/reference-handlers/plain-reference-handler.ts","webpack://$DSTypeManager/./src/serializer-context.ts","webpack://$DSTypeManager/./src/serializers/any-serializer.ts","webpack://$DSTypeManager/./src/serializers/array-buffer-serializer.ts","webpack://$DSTypeManager/./src/serializers/array-serializer.ts","webpack://$DSTypeManager/./src/serializers/boolean-serializer.ts","webpack://$DSTypeManager/./src/serializers/data-view-serializer.ts","webpack://$DSTypeManager/./src/serializers/date-serializer.ts","webpack://$DSTypeManager/./src/serializers/float-32-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/float-64-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/index.ts","webpack://$DSTypeManager/./src/serializers/int-16-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/int-32-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/int-8-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/map-serializer.ts","webpack://$DSTypeManager/./src/serializers/number-serializer.ts","webpack://$DSTypeManager/./src/serializers/set-serializer.ts","webpack://$DSTypeManager/./src/serializers/string-serializer.ts","webpack://$DSTypeManager/./src/serializers/type-serializer.ts","webpack://$DSTypeManager/./src/serializers/uint-16-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/uint-32-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/uint-8-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/uint-8-clamped-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/unknown-serializer.ts","webpack://$DSTypeManager/./src/type-context-entry.ts","webpack://$DSTypeManager/./src/type-context.ts","webpack://$DSTypeManager/./src/type-manager.ts","webpack://$DSTypeManager/./src/type-metadata-symbol.ts","webpack://$DSTypeManager/./src/type-metadata.ts","webpack://$DSTypeManager/./src/type.ts","webpack://$DSTypeManager/./src/unknown.ts","webpack://$DSTypeManager/external umd {\"commonjs\":\"lodash\",\"commonjs2\":\"lodash\",\"amd\":\"lodash\",\"root\":\"_\"}","webpack://$DSTypeManager/webpack/bootstrap","webpack://$DSTypeManager/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"lodash\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"$DSTypeManager\", [\"lodash\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"$DSTypeManager\"] = factory(require(\"lodash\"));\n\telse\n\t\troot[\"$DSTypeManager\"] = factory(root[\"_\"]);\n})(this, (__WEBPACK_EXTERNAL_MODULE__7607__) => {\nreturn ","/**\r\n * In type script there is no explicit class for any type but sometimes such serialization is required.\r\n * This simple class will allow direct serialization and deserialization. No transformations will be applied \r\n * for properties which specify it as a type argument.\r\n * \r\n * @type {Any}\r\n */\r\nexport class Any\r\n{\r\n \r\n}\r\n","import { isNil, isUndefined } from 'lodash';\r\nimport { CustomKey } from './custom-key';\r\nimport { CustomOption } from './custom-option';\r\nimport { CustomValue } from './custom-value';\r\n\r\n/**\r\n * Custom context class to encapsulate custom values attached to metadata.\r\n * \r\n * @type {CustomContext}\r\n */\r\nexport class CustomContext\r\n{\r\n /**\r\n * Custom options.\r\n * \r\n * @type {Array<CustomOption>}\r\n */\r\n public readonly customOptions: Array<CustomOption>;\r\n\r\n /**\r\n * Custom value map.\r\n * \r\n * @type {Map<CustomKey<any>, CustomValue>}\r\n */\r\n public readonly customValueMap: Map<CustomKey<any>, CustomValue> = new Map<CustomKey<any>, CustomValue>();\r\n\r\n /**\r\n * Constructor.\r\n * \r\n * @param {Array<CustomOption>} customOptions Custom options.\r\n */\r\n public constructor(customOptions: Array<CustomOption> = new Array<CustomOption>())\r\n {\r\n this.customOptions = this.constructCustomOptions(customOptions);\r\n\r\n this.configure(customOptions);\r\n\r\n return;\r\n }\r\n\r\n /**\r\n * Constructs initial custom options by removing duplicates. \r\n * All references are kept.\r\n * \r\n * @param {Array<CustomOption>} customOptions Custom options.\r\n * \r\n * @returns {CustomOptions} Constructed custom options.\r\n */\r\n private constructCustomOptions(customOptions: Array<CustomOption>): Array<CustomOption>\r\n {\r\n const customValueMap = new Map<CustomKey<any>, CustomValue>();\r\n\r\n for (const [customKey, customValue] of customOptions)\r\n {\r\n customValueMap.set(customKey, customValue);\r\n }\r\n\r\n customOptions.splice(0, customOptions.length);\r\n\r\n for (const [customKey, customValue] of customValueMap.entries())\r\n {\r\n customOptions.push([customKey, customValue]);\r\n }\r\n\r\n return customOptions;\r\n }\r\n\r\n /**\r\n * Sets value for a custom key.\r\n * \r\n * @param {CustomKey} customKey Custom key.\r\n * @param {CustomValue} customValue Custom value.\r\n * \r\n * @returns {CustomContext} Custom context.\r\n */\r\n public set<TCustomValue>(customKey: CustomKey<TCustomValue>, customValue: TCustomValue): CustomContext\r\n {\r\n const customOptions = this.customOptions;\r\n\r\n this.customValueMap.set(customKey, customValue);\r\n\r\n for (let i = 0; i < customOptions.length; i++)\r\n {\r\n if (customOptions[i][0] === customKey)\r\n {\r\n customOptions[i][1] = customValue;\r\n\r\n return this;\r\n }\r\n }\r\n\r\n customOptions.push([customKey, customValue]);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Gets value by custom key.\r\n * \r\n * @param {CustomKey} customKey Custom key.\r\n * \r\n * @returns {CustomValue} Custom value.\r\n */\r\n public get<TCustomValue>(customKey: CustomKey<TCustomValue>): TCustomValue\r\n {\r\n let customValue = this.customValueMap.get(customKey);\r\n \r\n if (isUndefined(customValue) && !isNil(customKey.customValueResolver))\r\n {\r\n customValue = customKey.customValueResolver();\r\n }\r\n\r\n return customValue;\r\n }\r\n\r\n /**\r\n * Checks if type context has a custom key.\r\n * \r\n * @param {CustomKey} customKey Custom key.\r\n * \r\n * @returns {boolean} True when type context has a custom key. False otherwise.\r\n */\r\n public has<TCustomValue>(customKey: CustomKey<TCustomValue>): boolean\r\n {\r\n return this.customValueMap.has(customKey);\r\n }\r\n\r\n /**\r\n * Gets iterable for keys inside the context.\r\n * \r\n * @returns {IterableIterator<CustomValue>} Iterable for keys inside the context.\r\n */\r\n public keys(): IterableIterator<CustomKey<any>>\r\n {\r\n return this.customValueMap.keys();\r\n }\r\n\r\n /**\r\n * Gets iterable for values inside the context.\r\n * \r\n * @returns {IterableIterator<CustomValue>} Iterable for values inside the context.\r\n */\r\n public values(): IterableIterator<CustomValue>\r\n {\r\n return this.customValueMap.values();\r\n }\r\n\r\n /**\r\n * Gets iterable for entries inside the context.\r\n * \r\n * @returns {IterableIterator<[CustomKey<any>, CustomValue]>} Iterable for entries inside the context.\r\n */\r\n public entries(): IterableIterator<[CustomKey<any>, CustomValue]>\r\n {\r\n return this.customValueMap.entries();\r\n }\r\n\r\n /**\r\n * Configures custom context based on custom options.\r\n * \r\n * @param {Array<CustomOption>} customOptions Custom options.\r\n * \r\n * @returns {CustomContext} Custom context.\r\n */\r\n public configure(customOptions: Array<CustomOption>): CustomContext\r\n {\r\n for (const [customKey, customValue] of customOptions)\r\n {\r\n this.set(customKey, customValue);\r\n }\r\n\r\n return this;\r\n }\r\n}\r\n","import { CustomValueResolver } from './custom-value-resolver';\r\n\r\n/**\r\n * Key used to describe custom value. Such key is explicitly defined and used\r\n * by type manager plugins to store strongly typed custom values within a metadata.\r\n * \r\n * @type {CustomKey<TCustomValue>}\r\n */\r\nexport class CustomKey<TCustomValue>\r\n{\r\n /**\r\n * Description.\r\n * \r\n * @type {string}\r\n */\r\n public readonly description: string;\r\n\r\n /**\r\n * Custom value resolver.\r\n * \r\n * @type {CustomValueResolver<TCustomValue}\r\n */\r\n public readonly customValueResolver?: CustomValueResolver<TCustomValue>;\r\n \r\n /**\r\n * Constructor.\r\n * \r\n * @param {string} description Description.\r\n * @param {CustomValueResolver<TCustomValue>} customValueResolver Custom value resolver.\r\n */\r\n public constructor(description: string, customValueResolver?: CustomValueResolver<TCustomValue>)\r\n {\r\n this.description = description;\r\n this.customValueResolver = customValueResolver;\r\n\r\n return;\r\n }\r\n}\r\n","export * from './type-factory';\r\n","import { isNil, isUndefined } from 'lodash';\r\nimport { Factory } from '../factory';\r\nimport { isCtorFunction } from '../functions/is-ctor-function';\r\nimport { Injector } from '../injector';\r\nimport { TypeContext } from '../type-context';\r\n\r\n/**\r\n * Type factory.\r\n * \r\n * @type {TypeFactory}\r\n */\r\nexport class TypeFactory implements Factory\r\n{\r\n /**\r\n * Builds type described by provided type metadata.\r\n * \r\n * @param {TypeContext<TType>} typeContext Type context.\r\n * @param {Injector} injector Injector.\r\n * \r\n * @returns {Record<string, any>} Type instance described by provided type metadata.\r\n */\r\n public build<TType>(typeContext: TypeContext<TType>, injector: Injector): TType\r\n {\r\n const typeMetadata = typeContext.typeMetadata;\r\n const typeCtor = isCtorFunction(typeMetadata.typeFn) ? typeMetadata.typeFn : undefined;\r\n\r\n if (isNil(typeCtor))\r\n {\r\n throw new Error(`${typeMetadata.typeName}: cannot build instance of abstract type.`);\r\n }\r\n \r\n const injectedKeys = new Array<any>();\r\n const args = new Array<any>(typeCtor.length).fill(undefined);\r\n\r\n for (const injectMetadata of typeMetadata.sortedInjectMetadatas)\r\n {\r\n const argKey = injectMetadata.key;\r\n\r\n if (!isNil(argKey))\r\n {\r\n args[injectMetadata.injectIndex] = typeContext.get(argKey)?.value;\r\n\r\n injectedKeys.push(argKey);\r\n\r\n continue;\r\n }\r\n\r\n args[injectMetadata.injectIndex] = injector.get(injectMetadata.typeMetadata);\r\n }\r\n\r\n const type = new typeCtor(...args) as any;\r\n\r\n for (const typeContextEntry of typeContext.values())\r\n {\r\n const propertyMetadata = typeContextEntry.propertyMetadata;\r\n\r\n if (\r\n !isNil(propertyMetadata)\r\n && !isUndefined(typeContextEntry.value)\r\n && !injectedKeys.includes(propertyMetadata.propertyName)\r\n )\r\n {\r\n type[propertyMetadata.propertyName] = typeContextEntry.value;\r\n }\r\n }\r\n\r\n return type;\r\n }\r\n}\r\n","import { isFunction, isObject } from 'lodash';\r\n\r\n/**\r\n * Reflect class declaration.\r\n * \r\n * @type {Reflect}\r\n */\r\ndeclare class Reflect\r\n{\r\n /**\r\n * Gets metadata value of an own metadata key of an object or property.\r\n * \r\n * @param {string} metadataKey Unique metadata key.\r\n * @param {any} target Target to extract from. \r\n * \r\n * @returns {any} Metadata for a key or undefined if metadata is not present.\r\n */\r\n public static getOwnMetadata(metadataKey: string, target: any): any;\r\n}\r\n\r\n/**\r\n * Gets own reflect metadata.\r\n * \r\n * @param {string} metadataKey Unique metadata key.\r\n * @param {any} target Target to extract from. \r\n * \r\n * @returns {any} Metadata for a key or undefined if metadata is not present.\r\n */\r\nexport function getOwnReflectMetadata(metadataKey: string, target: any): any\r\n{\r\n if (isObject(Reflect) && isFunction(Reflect.getOwnMetadata))\r\n {\r\n return Reflect.getOwnMetadata(metadataKey, target);\r\n }\r\n\r\n return undefined;\r\n}\r\n","import { isFunction, isObject } from 'lodash';\r\n\r\n/**\r\n * Reflect class declaration.\r\n * \r\n * @type {Reflect}\r\n */\r\ndeclare class Reflect \r\n{\r\n /**\r\n * Gets metadata value of a metadata key on the prototype chain of an object or property.\r\n * \r\n * @param {string} metadataKey Unique metadata key.\r\n * @param {any} target Target to extract from. \r\n * @param {string|symbol} propertyKey Key in a target.\r\n * \r\n * @returns {any} Metadata for a key or undefined if metadata is not present.\r\n */\r\n public static getMetadata(metadataKey: string, target: any, propertyKey: string | symbol): any;\r\n}\r\n\r\n/**\r\n * Gets reflect metadata.\r\n * \r\n * @param {string} metadataKey Unique metadata key.\r\n * @param {any} target Target to extract from. \r\n * @param {string|symbol} propertyKey Key in a target.\r\n * \r\n * @returns {any} Metadata for a key or undefined if metadata is not present.\r\n */\r\nexport function getReflectMetadata(metadataKey: string, target: any, propertyKey: string | symbol): any\r\n{\r\n if (isObject(Reflect) && isFunction(Reflect.getMetadata))\r\n {\r\n return Reflect.getMetadata(metadataKey, target, propertyKey);\r\n }\r\n\r\n return undefined;\r\n}\r\n","import { words } from 'lodash';\r\n\r\n/**\r\n * Gets words from a string.\r\n *\r\n * @param {string} x String.\r\n * \r\n * @returns {Array<string>} Array with the words of provided string.\r\n */\r\nexport function getWords(x: string): Array<string>\r\n{\r\n return words(x);\r\n}\r\n","export * from './get-own-reflect-metadata';\r\nexport * from './get-reflect-metadata';\r\nexport * from './get-words';\r\nexport * from './is-arrow-function';\r\nexport * from './is-ctor-function';\r\nexport * from './is-data-view';\r\nexport * from './is-float-32-array';\r\nexport * from './is-float-64-array';\r\nexport * from './is-int-8-array';\r\nexport * from './is-int-16-array';\r\nexport * from './is-int-32-array';\r\nexport * from './is-uint-8-array';\r\nexport * from './is-uint-8-clamped-array';\r\nexport * from './is-uint-16-array';\r\nexport * from './is-uint-32-array';\r\nexport * from './json-parse';\r\nexport * from './json-stringify';\r\nexport * from './name-of';\r\n","import { isFunction } from 'lodash';\r\n\r\n/**\r\n * Checks if value is an arrow function.\r\n * \r\n * @param {any} x Input value.\r\n * \r\n * @returns {boolean} True when value is an arrow function. False otherwise.\r\n */\r\nexport function isArrowFunction(x: any): x is (...args: Array<any>) => any\r\n{\r\n return isFunction(x) && x.prototype && x.prototype.constructor === x && x.name === '';\r\n}\r\n","import { isFunction } from 'lodash';\r\n\r\n/**\r\n * Checks if value is a constructor function.\r\n * \r\n * @param {any} x Input value.\r\n * \r\n * @returns {boolean} True when value is a constructor function. False otherwise.\r\n */\r\nexport function isCtorFunction(x: any): x is new (...args: Array<any>) => any\r\n{\r\n return isFunction(x) && x.prototype && x.prototype.constructor === x && x.name !== '';\r\n}\r\n","/**\r\n * Checks if value is data view.\r\n * \r\n * @param {any} x Input value.\r\n * \r\n * @returns {boolean} True when value is data view. False otherwise.\r\n */\r\nexport function isDataView(x: any): x is DataView\r\n{\r\n return x instanceof DataView;\r\n}\r\n","/**\r\n * Checks if value is float 32 array.\r\n * \r\n * @param {any} x Input value.\r\n * \r\n * @returns {boolean} True when value is float 32 array. False otherwise.\r\n */\r\nexport function isFloat32Array(x: any): x is Float32Array\r\n{\r\n return x instanceof Float32Array;\r\n}\r\n","/**\r\n * Checks if value is float 64 array.\r\n * \r\n * @param {any} x Input value.\r\n * \r\n * @returns {boolean} True when value is float 64 array. False otherwise.\r\n */\r\nexport function isFloat64Array(x: any): x is Float64Array\r\n{\r\n return x instanceof Float64Array;\r\n}\r\n","/**\r\n * Checks if value is int 16 array.\r\n * \r\n * @param {any} x Input value.\r\n * \r\n * @returns {boolean} True when value is int 16 array. False otherwise.\r\n */\r\nexport function isInt16Array(x: any): x is Int16Array\r\n{\r\n return x instanceof Int16Array;\r\n}\r\n","/**\r\n * Checks if value is int 32 array.\r\n * \r\n * @param {any} x Input value.\r\n * \r\n * @returns {boolean} True when value is int 32 array. False otherwise.\r\n */\r\nexport function isInt32Array(x: any): x is Int32Array\r\n{\r\n return x instanceof Int32Array;\r\n}\r\n","/**\r\n * Checks if value is int 8 array.\r\n * \r\n * @param {any} x Input value.\r\n * \r\n * @returns {boolean} True when value is int 8 array. False otherwise.\r\n */\r\nexport function isInt8Array(x: any): x is Int8Array\r\n{\r\n return x instanceof Int8Array;\r\n}\r\n","/**\r\n * Checks if value is uint 16 array.\r\n * \r\n * @param {any} x Input value.\r\n * \r\n * @returns {boolean} True when value is uint 16 array. False otherwise.\r\n */\r\nexport function isUint16Array(x: any): x is Uint16Array\r\n{\r\n return x instanceof Uint16Array;\r\n}\r\n","/**\r\n * Checks if value is uint 32 array.\r\n * \r\n * @param {any} x Input value.\r\n * \r\n * @returns {boolean} True when value is uint 32 array. False otherwise.\r\n */\r\nexport function isUint32Array(x: any): x is Uint32Array\r\n{\r\n return x instanceof Uint32Array;\r\n}\r\n","/**\r\n * Checks if value is uint 8 array.\r\n * \r\n * @param {any} x Input value.\r\n * \r\n * @returns {boolean} True when value is uint 8 array. False otherwise.\r\n */\r\nexport function isUint8Array(x: any): x is Uint8Array\r\n{\r\n return x instanceof Uint8Array;\r\n}\r\n","/**\r\n * Checks if value is uint 8 clamped array.\r\n * \r\n * @param {any} x Input value.\r\n * \r\n * @returns {boolean} True when value is uint 8 clamped array. False otherwise.\r\n */\r\nexport function isUint8ClampedArray(x: any): x is Uint8ClampedArray\r\n{\r\n return x instanceof Uint8ClampedArray;\r\n}\r\n","/**\r\n * Function which returns consistent results when parse JSON object.\r\n * \r\n * @param {string} x A valid JSON string.\r\n * @param {Function} reviver A function that transforms the results. This function is called for each member of the object.\r\n * \r\n * @returns {any} Consistent JSON parse result.\r\n */\r\nexport function jsonParse(\r\n x: string,\r\n reviver?: (this: any, key: string, value: any) => any | undefined\r\n): any\r\n{\r\n return JSON.parse(x, reviver);\r\n}\r\n","/**\r\n * Function which returns consistent results when stringify JSON object.\r\n * \r\n * @param {any} x Input value, usually an object or array, to be converted.\r\n * @param {Function|Array<number>|Array<string>} replacer A function that transforms the results or an array of strings and numbers that acts as an approved list.\r\n * @param {string|number} space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\r\n * \r\n * @returns {string} Consistent JSON string which can be used for hashing.\r\n */\r\nexport function jsonStringify(\r\n x: any, \r\n replacer?: (this: any, key: string, value: any) => any | Array<number> | Array<string> | null,\r\n space?: string | number\r\n): string\r\n{\r\n\tconst spacing = typeof space === 'number' ? new Array(isFinite(space) ? space + 1 : 0).join(' ') : (space ?? '');\r\n\tconst separator = spacing ? ': ' : ':';\r\n\tconst seen = new Array<any>();\r\n\t\r\n\tconst stringify = (parent: any, key: any, node: any, level: number): any =>\r\n {\r\n\t\tif (node && node.toJSON && typeof node.toJSON === 'function')\r\n {\r\n\t\t\tnode = node.toJSON();\r\n\t\t}\r\n\r\n\t\tif (replacer)\r\n\t\t{\r\n\t\t\tnode = replacer.call(parent, key, node);\r\n\t\t}\r\n\r\n\t\tif (node === undefined)\r\n {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (typeof node === 'number')\r\n\t\t{\r\n\t\t\treturn isFinite(node) ? '' + node : 'null';\r\n\t\t}\r\n\r\n\t\tif (typeof node !== 'object')\r\n {\r\n\t\t\treturn JSON.stringify(node);\r\n\t\t}\r\n\r\n\t\tlet i = 0;\r\n\t\tlet indent = '';\r\n\t\tlet out = '';\r\n\r\n\t\tif (spacing)\r\n\t\t{\r\n\t\t\tindent += '\\n';\r\n\r\n\t\t\tfor (i = 0; i < level + 1; i++)\r\n\t\t\t{\r\n\t\t\t\tindent += spacing;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (Array.isArray(node))\r\n {\r\n\t\t\tout += '['; \r\n\r\n\t\t\tfor (i = 0; i < node.length; i++)\r\n {\r\n\t\t\t\tif (i) \r\n\t\t\t\t{\r\n\t\t\t\t\tout += ',';\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst value = stringify(node, i, node[i], level + 1) || 'null';\r\n\r\n\t\t\t\tout += indent + spacing + value;\r\n\t\t\t}\r\n\r\n\t\t\tout += indent;\r\n\t\t\tout += ']';\r\n\r\n\t\t\treturn out;\r\n\t\t}\r\n\r\n\t\tif (node === null)\r\n\t\t{\r\n\t\t\treturn 'null';\r\n\t\t}\r\n\r\n\t\tif (seen.indexOf(node) !== -1)\r\n {\r\n\t\t\tthrow new TypeError('Converting circular structure to JSON.');\r\n\t\t}\r\n\r\n\t\tconst seenIndex = seen.push(node) - 1;\r\n\t\tconst keys = Object.keys(node).sort();\r\n\r\n\t\tfor (i = 0; i < keys.length; i++)\r\n {\r\n\t\t\tconst key = keys[i];\r\n\t\t\tconst value = stringify(node, key, node[key], level + 1);\r\n\r\n\t\t\tif (!value) \r\n {\r\n continue; \r\n }\r\n\r\n\t\t\tif (out)\r\n\t\t\t{\r\n\t\t\t\tout += ',';\r\n\t\t\t}\r\n\r\n\t\t\tout += indent + spacing + JSON.stringify(key) + separator + value;\r\n\t\t}\r\n\r\n\t\tseen.splice(seenIndex, 1);\r\n\r\n\t\treturn '{' + out + indent + '}';\r\n\t};\r\n\t\r\n\treturn stringify({ '': x }, '', x, 0);\r\n}\r\n","import { isFunction } from 'lodash';\r\n\r\n/**\r\n * Defines name for any value.\r\n * \r\n * @param {any} x Input value.\r\n * \r\n * @returns {boolean} Name when present. Unknown otherwise.\r\n */\r\nexport function nameOf(x: any): string\r\n{\r\n if (isFunction(x))\r\n {\r\n return x.name;\r\n }\r\n\r\n return 'Unknown';\r\n}\r\n","export * from './factories';\r\nexport * from './functions';\r\nexport * from './inject-sorters';\r\nexport * from './injectors';\r\nexport * from './naming-conventions';\r\nexport * from './property-sorters';\r\nexport * from './reference-handlers';\r\nexport * from './serializers';\r\nexport * from './alias';\r\nexport * from './any';\r\nexport * from './custom-context';\r\nexport * from './custom-key';\r\nexport * from './custom-option';\r\nexport * from './custom-value-resolver';\r\nexport * from './custom-value';\r\nexport * from './default-value-resolver';\r\nexport * from './default-value';\r\nexport * from './discriminant';\r\nexport * from './discriminator';\r\nexport * from './factory';\r\nexport * from './generic-argument';\r\nexport * from './generic-metadata-resolver';\r\nexport * from './generic-metadata';\r\nexport * from './generic-structure';\r\nexport * from './inject-index';\r\nexport * from './inject-internals';\r\nexport * from './inject-metadata';\r\nexport * from './inject-options';\r\nexport * from './inject-sorter';\r\nexport * from './inject';\r\nexport * from './injector';\r\nexport * from './log-level';\r\nexport * from './log';\r\nexport * from './metadata';\r\nexport * from './naming-convention';\r\nexport * from './property-internals';\r\nexport * from './property-metadata';\r\nexport * from './property-name';\r\nexport * from './property-options';\r\nexport * from './property-sorter';\r\nexport * from './property';\r\nexport * from './reference-callback';\r\nexport * from './reference-handler';\r\nexport * from './reference-key';\r\nexport * from './reference-value-getter';\r\nexport * from './reference-value-setter';\r\nexport * from './reference-value';\r\nexport * from './serializer-context-options';\r\nexport * from './serializer-context';\r\nexport * from './serializer';\r\nexport * from './type-abstraction';\r\nexport * from './type-argument';\r\nexport * from './type-configuration';\r\nexport * from './type-context-entry';\r\nexport * from './type-context';\r\nexport * from './type-ctor';\r\nexport * from './type-fn';\r\nexport * from './type-like';\r\nexport * from './type-internals';\r\nexport * from './type-manager-options';\r\nexport * from './type-manager';\r\nexport * from './type-metadata-resolver';\r\nexport * from './type-metadata-symbol';\r\nexport * from './type-metadata';\r\nexport * from './type-name';\r\nexport * from './type-options-base';\r\nexport * from './type-options';\r\nexport * from './type-resolver';\r\nexport * from './type';\r\nexport * from './unknown';\r\n","import { isUndefined } from 'lodash';\r\nimport { getOwnReflectMetadata } from './functions/get-own-reflect-metadata';\r\nimport { InjectIndex } from './inject-index';\r\nimport { InjectInternals } from './inject-internals';\r\nimport { InjectOptions } from './inject-options';\r\nimport { Metadata } from './metadata';\r\nimport { TypeFn } from './type-fn';\r\nimport { TypeMetadata } from './type-metadata';\r\nimport { TypeMetadataResolver } from './type-metadata-resolver';\r\nimport { Unknown } from './unknown';\r\n\r\n/**\r\n * Main class used to describe an injection.\r\n * \r\n * @type {InjectMetadata<TDeclaringType, TType>}\r\n */\r\nexport class InjectMetadata<TDeclaringType, TType> extends Metadata\r\n{\r\n /**\r\n * Type metadata to which inject metadata belongs to.\r\n * \r\n * @type {TypeMetadata<TDeclaringType>}\r\n */\r\n public readonly declaringTypeMetadata: TypeMetadata<TDeclaringType>;\r\n\r\n /**\r\n * Index of injection within a type constructor function.\r\n * \r\n * @type {InjectIndex}\r\n */\r\n public readonly injectIndex: InjectIndex;\r\n\r\n /**\r\n * Inject options.\r\n * \r\n * @type {InjectOptions<TType>}\r\n */\r\n public readonly injectOptions: InjectOptions<TType>;\r\n\r\n /**\r\n * Inject internals.\r\n * \r\n * @type {InjectInternals}\r\n */\r\n public readonly injectInternals: InjectInternals;\r\n\r\n /**\r\n * Type function defined using reflect metadata.\r\n * \r\n * Used as a fallback when type function is not defined.\r\n * \r\n * @type {TypeFn<TType>}\r\n */\r\n public readonly reflectTypeFn?: TypeFn<TType>;\r\n\r\n /**\r\n * Constructor.\r\n * \r\n * @param {TypeMetadata<TDeclaringType>} declaringTypeMetadata Type metadata to which inject metadata belongs to.\r\n * @param {InjectIndex} injectIndex Index of injection within a type constructor function.\r\n * @param {InjectOptions<TType>} injectOptions Inject options.\r\n */\r\n public constructor(\r\n declaringTypeMetadata: TypeMetadata<TDeclaringType>, \r\n injectIndex: InjectIndex, \r\n injectOptions: InjectOptions<TType>\r\n )\r\n {\r\n super(declaringTypeMetadata.typeManager);\r\n\r\n this.declaringTypeMetadata = declaringTypeMetadata;\r\n this.reflectTypeFn = (getOwnReflectMetadata('design:paramtypes', declaringTypeMetadata.typeFn) ?? new Array<TypeFn<TType>>())[injectIndex];\r\n this.injectIndex = injectIndex;\r\n this.injectOptions = this.constructInjectOptions(injectOptions);\r\n this.injectInternals = this.constructInjectInternals();\r\n\r\n this.configure(injectOptions);\r\n\r\n return;\r\n }\r\n\r\n /**\r\n * Gets key.\r\n * \r\n * @returns {string|undefined} Key or undefined.\r\n */\r\n public get key(): string | undefined\r\n {\r\n return this.injectOptions.key;\r\n }\r\n\r\n /**\r\n * Gets type function.\r\n * \r\n * @returns {TypeFn<TType>|undefined} Type constructor or undefined.\r\n */\r\n public get typeFn(): TypeFn<TType> | undefined\r\n {\r\n return this.injectOptions.typeFn;\r\n }\r\n\r\n /**\r\n * Gets type metadata resolver.\r\n * \r\n * @returns {TypeMetadataResolver<TType>} Type metadata resolver.\r\n */\r\n public get typeMetadataResolver(): TypeMetadataResolver<TType>\r\n {\r\n return this.injectInternals.typeMetadataResolver;\r\n }\r\n\r\n /**\r\n * Gets inject type metadata.\r\n * \r\n * @returns {TypeMetadata<TType>} Type metadata.\r\n */\r\n public get typeMetadata(): TypeMetadata<TType>\r\n {\r\n const typeMetadata = this.typeMetadataResolver(this.typeFn);\r\n const unknownFn = Unknown as TypeFn<any>;\r\n\r\n if (typeMetadata.typeFn === unknownFn)\r\n {\r\n throw new Error(`${this.declaringTypeMetadata.typeName}[${this.injectIndex}]: cannot resolve constructor injection type metadata. This is usually caused by invalid configuration.`);\r\n }\r\n\r\n return typeMetadata;\r\n }\r\n\r\n /**\r\n * Constructs initial inject options by extending passed options \r\n * with default values if they are not overriden. All references are kept.\r\n * \r\n * @param {InjectOptions<TType>} injectOptions Inject options.\r\n * \r\n * @returns {InjectOptions<TType>} Constructed inject options.\r\n */\r\n private constructInjectOptions(injectOptions: InjectOptions<TType>): InjectOptions<TType>\r\n {\r\n injectOptions.typeFn = injectOptions.typeFn ?? this.reflectTypeFn;\r\n\r\n return injectOptions;\r\n }\r\n\r\n /**\r\n * Constructs inject internals.\r\n * \r\n * @returns {InjectInternals} Constructed inject internals.\r\n */\r\n private constructInjectInternals(): InjectInternals\r\n {\r\n const typeMetadataResolver = this.defineTypeMetadataResolver(this.injectOptions.typeFn);\r\n const injectInternals = { typeMetadataResolver: typeMetadataResolver };\r\n\r\n return injectInternals;\r\n }\r\n\r\n /**\r\n * Configures key.\r\n * \r\n * @param {string|undefined} key Key.\r\n * \r\n * @returns {InjectMetadata<TDeclaringType, TType>} Current instance of inject metadata.\r\n */\r\n public hasKey(key: string | undefined): InjectMetadata<TDeclaringType, TType>\r\n {\r\n this.injectOptions.key = key;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures type function.\r\n * \r\n * @param {TypeFn<TType>|undefined} typeFn Type function.\r\n * \r\n * @returns {InjectMetadata<TDeclaringType, TType>} Current instance of inject metadata.\r\n */\r\n public hasTypeFn(typeFn: TypeFn<TType> | undefined): InjectMetadata<TDeclaringType, TType>\r\n {\r\n this.injectOptions.typeFn = typeFn ?? this.reflectTypeFn;\r\n this.injectInternals.typeMetadataResolver = this.defineTypeMetadataResolver(this.injectOptions.typeFn);\r\n \r\n return this;\r\n }\r\n \r\n /**\r\n * Configures inject metadata based on provided options.\r\n * \r\n * @param {InjectOptions<TType>} injectOptions Inject options.\r\n * \r\n * @returns {InjectMetadata<TDeclaringType, TType>} Current instance of inject metadata.\r\n */\r\n public configure(injectOptions: InjectOptions<TType>): InjectMetadata<TDeclaringType, TType>\r\n {\r\n if (!isUndefined(injectOptions.key))\r\n {\r\n this.hasKey(injectOptions.key);\r\n }\r\n \r\n if (!isUndefined(injectOptions.typeFn))\r\n {\r\n this.hasTypeFn(injectOptions.typeFn);\r\n }\r\n\r\n return this;\r\n }\r\n}\r\n","import { InjectMetadata } from '../inject-metadata';\r\nimport { InjectSorter } from '../inject-sorter';\r\n\r\n/**\r\n * Represents asc inject sorter which sorts type injects in\r\n * ascending order by index.\r\n * \r\n * @type {AscInjectSorter}\r\n */\r\nexport class AscInjectSorter implements InjectSorter\r\n{\r\n /**\r\n * Sort type injects. It is expected to return a negative value if the value of first property \r\n * is less than the value of second property, zero if they are equal, and a positive value otherwise.\r\n * \r\n * @param {InjectMetadata<TType, any>} x First inject.\r\n * @param {InjectMetadata<TType, any>} y Second inject.\r\n * \r\n * @returns {number} Sort result.\r\n */\r\n public sort<TType>(x: InjectMetadata<TType, any>, y: InjectMetadata<TType, any>): number\r\n {\r\n const a = x.injectIndex;\r\n const b = y.injectIndex;\r\n\r\n if (a < b)\r\n {\r\n return -1;\r\n }\r\n\r\n if (a > b)\r\n {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n }\r\n}\r\n","import { InjectMetadata } from '../inject-metadata';\r\nimport { InjectSorter } from '../inject-sorter';\r\n\r\n/**\r\n * Represents desc inject sorter which sorts type injects in\r\n * descending order by index.\r\n * \r\n * @type {DescInjectSorter}\r\n */\r\nexport class DescInjectSorter implements InjectSorter\r\n{\r\n /**\r\n * Sort type injects. It is expected to return a negative value if the value of first property \r\n * is less than the value of second property, zero if they are equal, and a positive value otherwise.\r\n * \r\n * @param {InjectMetadata<TType, any>} x First inject.\r\n * @param {InjectMetadata<TType, any>} y Second inject.\r\n * \r\n * @returns {number} Sort result.\r\n */\r\n public sort<TType>(x: InjectMetadata<TType, any>, y: InjectMetadata<TType, any>): number\r\n {\r\n const a = x.injectIndex;\r\n const b = y.injectIndex;\r\n\r\n if (a < b)\r\n {\r\n return 1;\r\n }\r\n\r\n if (a > b)\r\n {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n }\r\n}\r\n","export * from './asc-inject-sorter';\r\nexport * from './desc-inject-sorter';\r\n","import { isFunction, isNumber, isObject, isString, isUndefined } from 'lodash';\r\nimport { isCtorFunction } from './functions/is-ctor-function';\r\nimport { nameOf } from './functions/name-of';\r\nimport { InjectOptions } from './inject-options';\r\nimport { TypeFn } from './type-fn';\r\nimport { TypeManager } from './type-manager';\r\n\r\n/**\r\n * Inject decorator.\r\n * \r\n * @param {TypeFn<TType>|InjectOptions<TType>|string} x Type function, inject options or parameter key from type context.\r\n * \r\n * @returns {ParameterDecorator} Parameter decorator.\r\n */\r\nexport function Inject<TType>(x: TypeFn<TType> | InjectOptions<TType> | string): ParameterDecorator\r\n{\r\n const injectOptions = (isObject(x) ? x : {}) as InjectOptions<TType>;\r\n\r\n if (isUndefined(injectOptions.key) && isString(x))\r\n {\r\n injectOptions.key = x;\r\n }\r\n\r\n if (isUndefined(injectOptions.typeFn) && isFunction(x))\r\n {\r\n injectOptions.typeFn = x as TypeFn<TType>;\r\n }\r\n\r\n return function (target: any, propertyName: string | symbol, injectIndex: number): void\r\n {\r\n if (!isCtorFunction(target))\r\n {\r\n throw new Error(`${nameOf(target.constructor)}.${String(propertyName)}: inject decorator cannot be applied to a method.`);\r\n }\r\n\r\n if (!isNumber(injectIndex))\r\n {\r\n throw new Error(`${nameOf(target)}.${String(propertyName)}: inject decorator cannot be applied to a property.`);\r\n }\r\n\r\n TypeManager.configureTypeMetadata(target).configureInjectMetadata(injectIndex, injectOptions);\r\n\r\n return;\r\n };\r\n}\r\n","export * from './singleton-injector';\r\n","import { isNil } from 'lodash';\r\nimport { isCtorFunction } from '../functions/is-ctor-function';\r\nimport { Injector } from '../injector';\r\nimport { TypeMetadata } from '../type-metadata';\r\n\r\n/**\r\n * Singleton injector.\r\n * \r\n * @type {SingletonInjector}\r\n */\r\nexport class SingletonInjector implements Injector\r\n{\r\n /**\r\n * Map with resolved types.\r\n * \r\n * @type {WeakMap<TypeMetadata<any>, any>}\r\n */\r\n private readonly instanceMap: WeakMap<TypeMetadata<any>, any> = new WeakMap<TypeMetadata<any>, any>();\r\n\r\n /**\r\n * Method to get instance described by type metadata.\r\n * \r\n * @param {TypeMetadata<TType>} typeMetadata Type metadata.\r\n * \r\n * @returns {TType} Instance of type described by type metadata or undefined.\r\n */\r\n public get<TType>(typeMetadata: TypeMetadata<TType>): TType | undefined\r\n {\r\n if (!typeMetadata.injectable)\r\n {\r\n throw new Error(`${typeMetadata.typeName}: cannot resolve type! Have you registered it as injectable?`);\r\n }\r\n\r\n const instance = this.instanceMap.get(typeMetadata);\r\n\r\n if (isNil(instance))\r\n {\r\n return this.init(typeMetadata);\r\n }\r\n\r\n return instance;\r\n }\r\n\r\n /**\r\n * Creates instance described by type metadata.\r\n * \r\n * @param {TypeMetadata<TType>} typeMetadata Type metadata.\r\n * \r\n * @returns {TType} Type instance described by type metadata.\r\n */\r\n private init<TType>(typeMetadata: TypeMetadata<TType>): TType\r\n {\r\n const typeCtor = isCtorFunction(typeMetadata.typeFn) ? typeMetadata.typeFn : undefined;\r\n\r\n if (isNil(typeCtor))\r\n {\r\n throw new Error(`${typeMetadata.typeName}: cannot inject instance of abstract type.`);\r\n }\r\n\r\n const args = new Array<any>();\r\n\r\n for (const injectMetadata of typeMetadata.injectMetadataMap.values())\r\n {\r\n args[injectMetadata.injectIndex] = this.get(injectMetadata.typeMetadata);\r\n }\r\n\r\n const instance = new typeCtor(...args);\r\n\r\n this.instanceMap.set(typeMetadata, instance);\r\n\r\n return instance;\r\n }\r\n}\r\n","/**\r\n * Log level.\r\n * \r\n * @type {LogLevel}\r\n */\r\nexport enum LogLevel\r\n{\r\n Info,\r\n Warn,\r\n Error,\r\n None\r\n}\r\n","import { isFunction, isObject } from 'lodash';\r\nimport { LogLevel } from './log-level';\r\n\r\n/**\r\n * Main logger class used by serializers for displaying messages.\r\n * \r\n * @type {Log}\r\n */\r\nexport class Log\r\n{\r\n /**\r\n * Log level defines what kind of messages should be displayed in console.\r\n * \r\n * @type {LogLevel}\r\n */\r\n public readonly logLevel: LogLevel;\r\n\r\n /**\r\n * Info enabled?\r\n * \r\n * @type {boolean}\r\n */\r\n public readonly infoEnabled: boolean;\r\n\r\n /**\r\n * Warn enabled?\r\n * \r\n * @type {boolean}\r\n */\r\n public readonly warnEnabled: boolean;\r\n\r\n /**\r\n * Error enabled?\r\n * \r\n * @type {boolean}\r\n */\r\n public readonly errorEnabled: boolean;\r\n\r\n /**\r\n * Supports console?\r\n * \r\n * @type {boolean}\r\n */\r\n public readonly supportsConsole: boolean;\r\n\r\n /**\r\n * Supports console log?\r\n * \r\n * @type {boolean}\r\n */\r\n public readonly supportsConsoleLog: boolean;\r\n\r\n /**\r\n * Supports console info?\r\n * \r\n * @type {boolean}\r\n */\r\n public readonly supportsConsoleInfo: boolean;\r\n\r\n /**\r\n * Supports console warn?\r\n * \r\n * @type {boolean}\r\n */\r\n public readonly supportsConsoleWarn: boolean;\r\n\r\n /**\r\n * Supports console error?\r\n * \r\n * @type {boolean}\r\n */\r\n public readonly supportsConsoleError: boolean;\r\n\r\n /**\r\n * Constructor.\r\n * \r\n * @param {LogLevel} logLevel Log level.\r\n */\r\n public constructor(logLevel: LogLevel)\r\n {\r\n this.logLevel = logLevel;\r\n this.infoEnabled = this.logLevel <= LogLevel.Info;\r\n this.warnEnabled = this.logLevel <= LogLevel.Warn;\r\n this.errorEnabled = this.logLevel <= LogLevel.Error;\r\n this.supportsConsole = isObject(console);\r\n this.supportsConsoleLog = this.supportsConsole && isFunction(console.log);\r\n this.supportsConsoleInfo = this.supportsConsole && isFunction(console.info);\r\n this.supportsConsoleWarn = this.supportsConsole && isFunction(console.warn);\r\n this.supportsConsoleError = this.supportsConsole && isFunction(console.error);\r\n\r\n return;\r\n }\r\n\r\n /**\r\n * Displays info message.\r\n * \r\n * @param {string} message Message to display.\r\n * @param {Array<any>} optionalParams Optional data related to a message.\r\n * \r\n * @returns {void}\r\n */\r\n public info(message: string, ...optionalParams: Array<any>): void\r\n {\r\n if (this.supportsConsoleInfo)\r\n {\r\n console.info(message, ...optionalParams);\r\n\r\n return;\r\n }\r\n\r\n if (this.supportsConsoleLog)\r\n {\r\n console.log(`INFO: ${message}`, ...optionalParams);\r\n\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n /**\r\n * Displays warn message.\r\n * \r\n * @param {string} message Message to display.\r\n * @param {Array<any>} optionalParams Optional data related to a message.\r\n * \r\n * @returns {void}\r\n */\r\n public warn(message: any, ...optionalParams: Array<any>): void\r\n {\r\n if (this.supportsConsoleWarn)\r\n {\r\n console.warn(message, ...optionalParams);\r\n\r\n return;\r\n }\r\n\r\n if (this.supportsConsoleLog)\r\n {\r\n console.log(`WARN: ${message}`, ...optionalParams);\r\n \r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n /**\r\n * Displays error message.\r\n * \r\n * @param {string} message Message to display.\r\n * @param {Array<any>} optionalParams Optional data related to a message.\r\n * \r\n * @returns {void}\r\n */\r\n public error(message: string, ...optionalParams: Array<any>): void \r\n {\r\n if (this.supportsConsoleError)\r\n {\r\n console.error(message, ...optionalParams);\r\n\r\n return;\r\n }\r\n\r\n if (this.supportsConsoleLog)\r\n {\r\n console.log(`ERROR: ${message}`, ...optionalParams);\r\n \r\n return;\r\n }\r\n\r\n return;\r\n }\r\n}\r\n","import { isArray, isNil, isString } from 'lodash';\r\nimport { Alias } from './alias';\r\nimport { isArrowFunction } from './functions/is-arrow-function';\r\nimport { GenericArgument } from './generic-argument';\r\nimport { GenericMetadata } from './generic-metadata';\r\nimport { GenericMetadataResolver } from './generic-metadata-resolver';\r\nimport { GenericStructure } from './generic-structure';\r\nimport { TypeArgument } from './type-argument';\r\nimport { TypeFn } from './type-fn';\r\nimport { TypeManager } from './type-manager';\r\nimport { TypeMetadata } from './type-metadata';\r\nimport { TypeMetadataResolver } from './type-metadata-resolver';\r\nimport { TypeResolver } from './type-resolver';\r\nimport { Unknown } from './unknown';\r\n\r\n/**\r\n * Metadata class.\r\n * \r\n * Encapsulates common methods and properties which can be used by all types of metadata.\r\n * \r\n * @type {Metadata}\r\n */\r\nexport class Metadata\r\n{\r\n /**\r\n * Type manager.\r\n * \r\n * @type {TypeManager}\r\n */\r\n public readonly typeManager: TypeManager;\r\n\r\n /**\r\n * Type function map for types with aliases.\r\n * \r\n * @type {Map<Alias, TypeFn<any>>}\r\n */\r\n public readonly typeFnMap: Map<Alias, TypeFn<any>>;\r\n \r\n /**\r\n * Constructor.\r\n * \r\n * @param {TypeManager} typeManager Type manager.\r\n */\r\n public constructor(typeManager: TypeManager)\r\n {\r\n this.typeManager = typeManager;\r\n this.typeFnMap = typeManager.typeFnMap;\r\n\r\n return;\r\n }\r\n\r\n /**\r\n * Defines type metadata resolver for provided type argument.\r\n * \r\n * @param {TypeArgument<any>} typeArgument Type argument.\r\n * \r\n * @returns {TypeMetadataResolver<any>} Defined type metadata resolver.\r\n */\r\n public defineTypeMetadataResolver(typeArgument: TypeArgument<any>): TypeMetadataResolver<any>\r\n {\r\n if (isNil(typeArgument))\r\n {\r\n return this.resolveTypeMetadataUsingUnknownTypeFn.bind(this);\r\n }\r\n\r\n if (isString(typeArgument))\r\n {\r\n return this.resolveTypeMetadataUsingAlias.bind(this);\r\n }\r\n\r\n if (isArrowFunction(typeArgument))\r\n {\r\n return this.resolveTypeMetadataUsingTypeResolver.bind(this);\r\n }\r\n\r\n return this.resolveTypeMetadataUsingTypeFn.bind(this);\r\n }\r\n\r\n /**\r\n * Resolves type metadata using unknown type function.\r\n * \r\n * @returns {TypeMetadata<any>} Type metadata resolved using unknown type function.\r\n */\r\n private resolveTypeMetadataUsingUnknownTypeFn(): TypeMetadata<any>\r\n {\r\n const typeFn = Unknown as TypeFn<any>;\r\n\r\n return this.typeManager.extractTypeMetadata(typeFn);\r\n }\r\n\r\n /**\r\n * Resolves type metadata using alias.\r\n * \r\n * @param {TypeArgument<any>} typeArgument Type argument.\r\n * \r\n * @returns {TypeMetadata<any>} Type metadata resolved using alias.\r\n */\r\n private resolveTypeMetadataUsingAlias(typeArgument: TypeArgument<any>): TypeMetadata<any>\r\n {\r\n const alias = typeArgument as Alias;\r\n const typeFn = this.typeFnMap.get(alias);\r\n\r\n if (isNil(typeFn))\r\n {\r\n throw new Error(`Cannot resolve type metadata for provided type alias: ${alias}. This is usually caused by invalid configuration.`);\r\n }\r\n\r\n return this.typeManager.extractTypeMetadata(typeFn);\r\n }\r\n\r\n /**\r\n * Resolves type metadata using type function.\r\n * \r\n * @param {TypeMetadata<any>} typeArgument Type argument.\r\n * \r\n * @returns {TypeMetadata<any>} Type metadata resolved using type function.\r\n */\r\n private resolveTypeMetadataUsingTypeFn(typeArgument: TypeArgument<any>): TypeMetadata<any>\r\n {\r\n const typeFn = typeArgument as TypeFn<any>;\r\n\r\n return this.typeManager.extractTypeMetadata(typeFn);\r\n }\r\n\r\n /**\r\n * Resolves type metadata using type resolver.\r\n * \r\n * @param {TypeMetadata<any>} typeArgument Type argument.\r\n * \r\n * @returns {TypeMetadata<any>} Type metadata resolved using type resolver.\r\n */\r\n private resolveTypeMetadataUsingTypeResolver(typeArgument: TypeArgument<any>): TypeMetadata<any>\r\n {\r\n const typeResolver = typeArgument as TypeResolver<any>;\r\n\r\n return this.typeManager.extractTypeMetadata(typeResolver());\r\n }\r\n\r\n /**\r\n * Defines generic structures based on generic arguments.\r\n * \r\n * @param {Array<GenericArgument<any>>} genericArguments Generic arguments.\r\n * \r\n * @returns {Array<GenericStructure<any>>} Generic structures.\r\n */\r\n public defineGenericStructures(genericArguments: Array<GenericArgument<any>>): Array<GenericStructure<any>>\r\n {\r\n const genericStructures = new Array<GenericStructure<any>>();\r\n\r\n for (const genericArgument of genericArguments)\r\n {\r\n const genericTypeArgument = isArray(genericArgument) ? genericArgument[0] : genericArgument;\r\n const genericGenericArguments = isArray(genericArgument) ? genericArgument[1] : new Array<GenericArgument<any>>();\r\n \r\n genericStructures.push([\r\n genericTypeArgument,\r\n this.defineGenericStructures(genericGenericArguments)\r\n ]);\r\n }\r\n\r\n return genericStructures;\r\n }\r\n\r\n /**\r\n * Defines generic metadata resolvers based on provided generic structures.\r\n * \r\n * @param {Array<GenericStructure<any>>} genericStructures Generic structures.\r\n * \r\n * @returns {Array<GenericMetadataResolver<any>>} Generics metadata resolvers.\r\n */\r\n public defineGenericMetadataResolvers(genericStructures: Array<GenericStructure<any>>): Array<GenericMetadataResolver<any>>\r\n {\r\n const genericMetadataResolvers = new Array<GenericMetadataResolver<any>>();\r\n\r\n for (const genericStructure of genericStructures)\r\n {\r\n const genericTypeArgument = genericStructure[0];\r\n const genericGenericStructures = genericStructure[1];\r\n \r\n genericMetadataResolvers.push([\r\n this.defineTypeMetadataResolver(genericTypeArgument), \r\n this.defineGenericMetadataResolvers(genericGenericStructures)\r\n ]);\r\n }\r\n\r\n return genericMetadataResolvers;\r\n }\r\n\r\n /**\r\n * Defines generic metadatas based on provided generic structures and metadata resolvers.\r\n * \r\n * @param {Array<GenericStructure<any>>} genericStructures Generic structures.\r\n * @param {Array<GenericMetadataResolver<any>>} genericMetadataResolvers Generic metadata resolvers.\r\n * \r\n * @returns {Array<GenericMetadata<any>>} Generics metadatas.\r\n */\r\n public defineGenericMetadatas(\r\n genericStructures: Array<GenericStructure<any>>, \r\n genericMetadataResolvers: Array<GenericMetadataResolver<any>>\r\n ): Array<GenericMetadata<any>>\r\n {\r\n const genericMetadatas = new Array<GenericMetadata<any>>();\r\n\r\n for (let i = 0; i < genericStructures.length; i++)\r\n {\r\n const genericTypeArgument = genericStructures[i][0];\r\n const genericMetadataResolver = genericMetadataResolvers[i][0];\r\n const genericGenericStructures = genericStructures[i][1];\r\n const genericGenericMetadataResolvers = genericMetadataResolvers[i][1];\r\n\r\n genericMetadatas.push([\r\n genericMetadataResolver(genericTypeArgument),\r\n this.defineGenericMetadatas(genericGenericStructures, genericGenericMetadataResolvers)\r\n ]);\r\n }\r\n\r\n return genericMetadatas;\r\n }\r\n}\r\n","import { getWords } from '../functions/get-words';\r\nimport { NamingConvention } from '../naming-convention';\r\n\r\n/**\r\n * Camel case naming convention.\r\n * \r\n * @type {CamelCaseNamingConvention}\r\n */\r\nexport class CamelCaseNamingConvention implements NamingConvention\r\n{\r\n /**\r\n * Converts name from provided to target one.\r\n *\r\n * @param {string} name Name.\r\n *\r\n * @returns {string} Converted name.\r\n */\r\n public convert(name: string): string\r\n {\r\n return getWords(name).reduce(this.reduce, '');\r\n }\r\n\r\n /**\r\n * Reduce function.\r\n * \r\n * @param {string} result Result string.\r\n * @param {string} word Word to process. \r\n * @param {number} index Word index.\r\n * \r\n * @returns {string} Reduced string.\r\n */\r\n private reduce(result: string, word: string, index: number): string\r\n {\r\n if (word.length === 0)\r\n {\r\n return result;\r\n }\r\n\r\n const wordLowerCased = word.toLowerCase();\r\n\r\n if (index === 0)\r\n {\r\n return wordLowerCased;\r\n }\r\n\r\n return `${result}${wordLowerCased[0].toUpperCase()}${wordLowerCased.slice(1)}`;\r\n }\r\n}\r\n","import { getWords } from '../functions/get-words';\r\nimport { NamingConvention } from '../naming-convention';\r\n\r\n/**\r\n * Flat case naming convention.\r\n * \r\n * @type {FlatCaseNamingConvention}\r\n */\r\nexport class FlatCaseNamingConvention implements NamingConvention\r\n{\r\n /**\r\n * Converts name from provided to target one.\r\n *\r\n * @param {string} name Name.\r\n *\r\n * @returns {string} Converted name.\r\n */\r\n public convert(name: string): string\r\n {\r\n return getWords(name).reduce(this.reduce, '');\r\n }\r\n\r\n /**\r\n * Reduce function.\r\n * \r\n * @param {string} result Result string.\r\n * @param {string} word Word to process.\r\n * \r\n * @returns {string} Reduced string.\r\n */\r\n private reduce(result: string, word: string): string\r\n {\r\n if (word.length === 0)\r\n {\r\n return result;\r\n }\r\n\r\n return `${result}${word.toLowerCase()}`;\r\n }\r\n}\r\n","import { getWords } from '../functions/get-words';\r\nimport { NamingConvention } from '../naming-convention';\r\n\r\n/**\r\n * Flat upper case naming convention.\r\n * \r\n * @type {FlatUpperCaseNamingConvention}\r\n */\r\nexport class FlatUpperCaseNamingConvention implements NamingConvention\r\n{\r\n /**\r\n * Converts name from provided to target one.\r\n *\r\n * @param {string} name Name.\r\n *\r\n * @returns {string} Converted name.\r\n */\r\n public convert(name: string): string\r\n {\r\n return getWords(name).reduce(this.reduce, '');\r\n }\r\n\r\n /**\r\n * Reduce function.\r\n * \r\n * @param {string} result Result string.\r\n * @param {string} word Word to process.\r\n * \r\n * @returns {string} Reduced string.\r\n */\r\n private reduce(result: string, word: string): string\r\n {\r\n if (word.length === 0)\r\n {\r\n return result;\r\n }\r\n\r\n return `${result}${word.toUpperCase()}`;\r\n }\r\n}\r\n","export * from './camel-case-naming-convention';\r\nexport * from './flat-case-naming-convention';\r\nexport * from './flat-upper-case-naming-convention';\r\nexport * from './kebab-case-naming-convention';\r\nexport * from './kebab-upper-case-naming-convention';\r\nexport * from './pascal-case-naming-convention';\r\nexport * from './snake-case-naming-convention';\r\nexport * from './snake-upper-case-naming-convention';\r\n","import { getWords } from '../functions/get-words';\r\nimport { NamingConvention } from '../naming-convention';\r\n\r\n/**\r\n * Kebab case naming convention.\r\n * \r\n * @type {KebabCaseNamingConvention}\r\n */\r\nexport class KebabCaseNamingConvention implements NamingConvention\r\n{\r\n /**\r\n * Converts name from provided to target one.\r\n *\r\n * @param {string} name Name.\r\n *\r\n * @returns {string} Converted name.\r\n */\r\n public convert(name: string): string\r\n {\r\n return getWords(name).reduce(this.reduce, '');\r\n }\r\n\r\n /**\r\n * Reduce function.\r\n * \r\n * @param {string} result Result string.\r\n * @param {string} word Word to process. \r\n * @param {number} index Word index.\r\n * \r\n * @returns {string} Reduced string.\r\n */\r\n private reduce(result: string, word: string, index: number): string\r\n {\r\n if (word.length === 0)\r\n {\r\n return result;\r\n }\r\n\r\n const wordLowerCased = word.toLowerCase();\r\n\r\n if (index === 0)\r\n {\r\n return wordLowerCased;\r\n }\r\n\r\n return `${result}-${wordLowerCased}`;\r\n }\r\n}\r\n","import { getWords } from '../functions/get-words';\r\nimport { NamingConvention } from '../naming-convention';\r\n\r\n/**\r\n * Kebab upper naming case.\r\n * \r\n * @type {KebabUpperCaseNamingConvention}\r\n */\r\nexport class KebabUpperCaseNamingConvention implements NamingConvention\r\n{\r\n /**\r\n * Converts name from provided to target one.\r\n *\r\n * @param {string} name Name.\r\n *\r\n * @returns {string} Converted name.\r\n */\r\n public convert(name: string): string\r\n {\r\n return getWords(name).reduce(this.reduce, '');\r\n }\r\n\r\n /**\r\n * Reduce function.\r\n * \r\n * @param {string} result Result string.\r\n * @param {string} word Word to process. \r\n * @param {number} index Word index.\r\n * \r\n * @returns {string} Reduced string.\r\n */\r\n private reduce(result: string, word: string, index: number): string\r\n {\r\n if (word.length === 0)\r\n {\r\n return result;\r\n }\r\n\r\n const wordUpperCased = word.toUpperCase();\r\n\r\n if (index === 0)\r\n {\r\n return wordUpperCased;\r\n }\r\n\r\n return `${result}-${wordUpperCased}`;\r\n }\r\n}\r\n","import { getWords } from '../functions/get-words';\r\nimport { NamingConvention } from '../naming-convention';\r\n\r\n/**\r\n * Pascal case naming convention.\r\n * \r\n * @type {PascalCaseNamingConvention}\r\n */\r\nexport class PascalCaseNamingConvention implements NamingConvention\r\n{\r\n /**\r\n * Converts name from provided to target one.\r\n *\r\n * @param {string} name Name.\r\n *\r\n * @returns {string} Converted name.\r\n */\r\n public convert(name: string): string\r\n {\r\n return getWords(name).reduce(this.reduce, '');\r\n }\r\n\r\n /**\r\n * Reduce function.\r\n * \r\n * @param {string} result Result string.\r\n * @param {string} word Word to process. \r\n * @param {number} index Word index.\r\n * \r\n * @returns {string} Reduced string.\r\n */\r\n private reduce(result: string, word: string, index: number): string\r\n {\r\n if (word.length === 0)\r\n {\r\n return result;\r\n }\r\n\r\n const wordLowerCased = word.toLowerCase();\r\n const wordPascalCased = `${wordLowerCased[0].toUpperCase()}${wordLowerCased.slice(1)}`;\r\n\r\n if (index === 0)\r\n {\r\n return wordPascalCased;\r\n }\r\n\r\n return `${result}${wordPascalCased}`;\r\n }\r\n}\r\n","import { getWords } from '../functions/get-words';\r\nimport { NamingConvention } from '../naming-convention';\r\n\r\n/**\r\n * Snake case naming convention.\r\n *\r\n * @type {SnakeCaseNamingConvention}\r\n */\r\nexport class SnakeCaseNamingConvention implements NamingConvention\r\n{\r\n /**\r\n * Converts name from provided to target one.\r\n *\r\n * @param {string} name Name.\r\n *\r\n * @returns {string} Converted name.\r\n */\r\n public convert(name: string): string\r\n {\r\n return getWords(name).reduce(this.reduce, '');\r\n }\r\n\r\n /**\r\n * Reduce function.\r\n * \r\n * @param {string} result Result string.\r\n * @param {string} word Word to process. \r\n * @param {number} index Word index.\r\n * \r\n * @returns {string} Reduced string.\r\n */\r\n private reduce(result: string, word: string, index: number): string\r\n {\r\n if (word.length === 0)\r\n {\r\n return result;\r\n }\r\n\r\n const wordLowerCased = word.toLowerCase();\r\n\r\n if (index === 0)\r\n {\r\n return wordLowerCased;\r\n }\r\n\r\n return `${result}_${wordLowerCased}`;\r\n }\r\n}\r\n","import { getWords } from '../functions/get-words';\r\nimport { NamingConvention } from '../naming-convention';\r\n\r\n/**\r\n * Snake upper case naming convention.\r\n * \r\n * @type {SnakeUpperCaseNamingConvention}\r\n */\r\nexport class SnakeUpperCaseNamingConvention implements NamingConvention\r\n{\r\n /**\r\n * Converts name from provided to target one.\r\n *\r\n * @param {string} name Name.\r\n *\r\n * @returns {string} Converted name.\r\n */\r\n public convert(name: string): string\r\n {\r\n return getWords(name).reduce(this.reduce, '');\r\n }\r\n\r\n /**\r\n * Reduce function.\r\n * \r\n * @param {string} result Result string.\r\n * @param {string} word Word to process. \r\n * @param {number} index Word index.\r\n * \r\n * @returns {string} Reduced string.\r\n */\r\n private reduce(result: string, word: string, index: number): string\r\n {\r\n if (word.length === 0)\r\n {\r\n return result;\r\n }\r\n\r\n const wordUpperCased = word.toUpperCase();\r\n\r\n if (index === 0)\r\n {\r\n return wordUpperCased;\r\n }\r\n\r\n return `${result}_${wordUpperCased}`;\r\n }\r\n}\r\n","import { isFunction, isNil, isUndefined } from 'lodash';\r\nimport { Alias } from './alias';\r\nimport { CustomContext } from './custom-context';\r\nimport { CustomOption } from './custom-option';\r\nimport { DefaultValue } from './default-value';\r\nimport { getReflectMetadata } from './functions/get-reflect-metadata';\r\nimport { GenericArgument } from './generic-argument';\r\nimport { GenericMetadata } from './generic-metadata';\r\nimport { GenericMetadataResolver } from './generic-metadata-resolver';\r\nimport { GenericStructure } from './generic-structure';\r\nimport { Metadata } from './metadata';\r\nimport { NamingConvention } from './naming-convention';\r\nimport { PropertyInternals } from './property-internals';\r\nimport { PropertyName } from './property-name';\r\nimport { PropertyOptions } from './property-options';\r\nimport { ReferenceHandler } from './reference-handler';\r\nimport { Serializer } from './serializer';\r\nimport { TypeArgument } from './type-argument';\r\nimport { TypeFn } from './type-fn';\r\nimport { TypeMetadata } from './type-metadata';\r\nimport { TypeMetadataResolver } from './type-metadata-resolver';\r\n\r\n/**\r\n * Main class used to describe a certain property.\r\n * \r\n * @type {PropertyMetadata<TDeclaringType, TType>}\r\n */\r\nexport class PropertyMetadata<TDeclaringType, TType> extends Metadata\r\n{\r\n /**\r\n * Type metadata to which property metadata belongs to.\r\n * \r\n * @type {TypeMetadata<TDeclaringType>}\r\n */\r\n public readonly declaringTypeMetadata: TypeMetadata<TDeclaringType>;\r\n\r\n /**\r\n * Property name as declared in type.\r\n * \r\n * @type {PropertyName}\r\n */\r\n public readonly propertyName: PropertyName;\r\n\r\n /**\r\n * Property options.\r\n * \r\n * @type {PropertyOptions<TType>}\r\n */\r\n public readonly propertyOptions: PropertyOptions<TType>;\r\n\r\n /**\r\n * Property internals.\r\n * \r\n * @type {PropertyInternals}\r\n */\r\n public readonly propertyInternals: PropertyInternals;\r\n\r\n /**\r\n * Type function defined using reflect metadata.\r\n * \r\n * Used as a fallback when type argument is not defined.\r\n * \r\n * @type {TypeFn<TType>}\r\n */\r\n public readonly reflectTypeFn?: TypeFn<TType>;\r\n\r\n /**\r\n * Constructor.\r\n * \r\n * @param {TypeMetadata<TDeclaringType>} declaringTypeMetadata Type metadata to which property metadata belongs to.\r\n * @param {PropertyName} propertyName Property name.\r\n * @param {PropertyOptions<TType>} propertyOptions Property options.\r\n */\r\n public constructor(\r\n declaringTypeMetadata: TypeMetadata<TDeclaringType>, \r\n propertyName: PropertyName,\r\n propertyOptions: PropertyOptions<TType>\r\n )\r\n {\r\n super(declaringTypeMetadata.typeManager);\r\n\r\n this.declaringTypeMetadata = declaringTypeMetadata;\r\n this.propertyName = propertyName;\r\n this.reflectTypeFn = getReflectMetadata('design:type', declaringTypeMetadata.typeFn.prototype, propertyName);\r\n this.propertyOptions = this.constructPropertyOptions(propertyOptions);\r\n this.propertyInternals = this.constructPropertyInternals();\r\n \r\n this.configure(propertyOptions);\r\n\r\n return;\r\n }\r\n\r\n /**\r\n * Gets alias.\r\n * \r\n * @returns {Alias|undefined} Alias or undefined.\r\n */\r\n public get alias(): Alias | undefined\r\n {\r\n return this.propertyOptions.alias;\r\n }\r\n\r\n /**\r\n * Gets custom options.\r\n * \r\n * @returns {Array<CustomOption>} Custom options.\r\n */\r\n public get customOptions(): Array<CustomOption> | undefined\r\n {\r\n return this.propertyOptions.customOptions;\r\n }\r\n \r\n /**\r\n * Gets custom context.\r\n * \r\n * @returns {CustomContext} Custom context.\r\n */\r\n public get customContext(): CustomContext\r\n {\r\n let customContext = this.propertyInternals.customContext;\r\n\r\n if (isNil(customContext))\r\n {\r\n this.propertyOptions.customOptions = new Array<CustomOption>();\r\n this.propertyInternals.customContext = new CustomContext(this.propertyOptions.customOptions);\r\n\r\n customContext = this.propertyInternals.customContext;\r\n }\r\n\r\n return customContext;\r\n }\r\n\r\n /**\r\n * Gets serialized null value.\r\n * \r\n * @returns {any|undefined} Resolved serialized null value or undefined.\r\n */\r\n public get serializedNullValue(): any | undefined\r\n {\r\n if (this.preserveNull)\r\n {\r\n return null;\r\n }\r\n\r\n return this.serializedDefaultValue;\r\n }\r\n\r\n /**\r\n * Gets serialized default value.\r\n * \r\n * @returns {any|undefined} Resolved serialized default value or undefined.\r\n */\r\n public get serializedDefaultValue(): any | undefined\r\n {\r\n if (this.useDefaultValue)\r\n {\r\n const serializedDefaultValue = this.propertyOptions.defaultValue \r\n ?? this.propertyOptions.serializedDefaultValue \r\n ?? this.typeMetadata.serializedDefaultValue;\r\n\r\n const defaultValue = isFunction(serializedDefaultValue) \r\n ? serializedDefaultValue() \r\n : serializedDefaultValue;\r\n\r\n return defaultValue;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Gets deserialized null value.\r\n * \r\n * @returns {any|undefined} Resolved deserialized null value or undefined.\r\n */\r\n public get deserializedNullValue(): any | undefined\r\n {\r\n if (this.preserveNull)\r\n {\r\n return null;\r\n }\r\n\r\n return this.deserializedDefaultValue;\r\n }\r\n \r\n /**\r\n * Gets deserialized default value.\r\n * \r\n * @returns {any|undefined} Resolved deserialized default value or undefined.\r\n */\r\n public get deserializedDefaultValue(): any | undefined\r\n {\r\n if (this.useDefaultValue)\r\n {\r\n const deserializedDefaultValue = this.propertyOptions.defaultValue \r\n ?? this.propertyOptions.deserializedDefaultValue \r\n ?? this.typeMetadata.deserializedDefaultValue;\r\n\r\n const defaultValue = isFunction(deserializedDefaultValue) \r\n ? deserializedDefaultValue() \r\n : deserializedDefaultValue;\r\n\r\n return defaultValue;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Gets serialized property name.\r\n * \r\n * @returns {string} Serialized property name.\r\n */\r\n public get serializedPropertyName(): string\r\n {\r\n const alias = this.alias;\r\n\r\n if (isNil(alias))\r\n {\r\n const namingConvention = this.namingConvention ?? this.declaringTypeMetadata.namingConvention;\r\n const propertyName = namingConvention ? namingConvention.convert(this.propertyName) : this.propertyName;\r\n\r\n return propertyName;\r\n }\r\n\r\n return alias;\r\n }\r\n\r\n /**\r\n * Gets deserialized property name.\r\n * \r\n * @returns {string} Deserialized property name.\r\n */\r\n public get deserializedPropertyName(): string\r\n {\r\n return this.propertyName;\r\n }\r\n\r\n /**\r\n * Gets deserializable value.\r\n * \r\n * @returns {boolean|undefined} Deserializable indicator or undefined.\r\n */\r\n public get deserializable(): boolean | undefined\r\n {\r\n return this.propertyOptions.deserializable;\r\n }\r\n\r\n /**\r\n * Gets generic arguments.\r\n * \r\n * @returns {Array<GenericArgument<any>>|undefined} Generic arguments or undefined.\r\n */\r\n public get genericArguments(): Array<GenericArgument<any>> | undefined\r\n {\r\n return this.propertyOptions.genericArguments;\r\n }\r\n\r\n /**\r\n * Gets generic structures.\r\n * \r\n * @returns {Array<GenericStructure<any>>|undefined} Generic structures or undefined.\r\n */\r\n public get genericStructures(): Array<GenericStructure<any>> | undefined\r\n {\r\n return this.propertyInternals.genericStructures;\r\n }\r\n\r\n /**\r\n * Gets generic metadata resolvers.\r\n * \r\n * @returns {Array<GenericMetadataResolver<any>>|undefined} Generic metadata resolvers or undefined.\r\n */\r\n public get genericMetadataResolvers(): Array<GenericMetadataResolver<any>> | undefined\r\n {\r\n return this.propertyInternals.genericMetadataResolvers;\r\n }\r\n\r\n /**\r\n * Gets generic metadatas.\r\n * \r\n * @returns {Array<GenericMetadata<any>>|undefined} Generic metadatas.\r\n */\r\n public get genericMetadatas(): Array<GenericMetadata<any>> | undefined\r\n {\r\n const genericStructures = this.genericStructures;\r\n const genericMetadataResolvers = this.genericMetadataResolvers;\r\n\r\n if (isNil(genericStructures) || isNil(genericMetadataResolvers))\r\n {\r\n return undefined;\r\n }\r\n\r\n return this.defineGenericMetadatas(genericStructures, genericMetadataResolvers);\r\n }\r\n\r\n /**\r\n * Gets naming convention.\r\n * \r\n * @returns {NamingConvention|undefined} Naming convention or undefined.\r\n */\r\n public get namingConvention(): NamingConvention | undefined\r\n {\r\n return this.propertyOptions.namingConvention ?? this.typeMetadata.namingConvention;\r\n }\r\n\r\n /**\r\n * Gets reference handler.\r\n * \r\n * @returns {ReferenceHandler} Reference handler.\r\n */\r\n public get referenceHandler(): ReferenceHandler \r\n {\r\n return this.propertyOptions.referenceHandler ?? this.typeMetadata.referenceHandler;\r\n }\r\n\r\n /**\r\n * Gets serializable value.\r\n * \r\n * @returns {boolean|undefined} Serializable indicator or undefined.\r\n */\r\n public get serializable(): boolean | undefined\r\n {\r\n return this.propertyOptions.serializable;\r\n }\r\n\r\n /**\r\n * Checks if serialization configured.\r\n * \r\n * @returns {boolean} True when serialization configured. False otherwise.\r\n */\r\n public get serializationConfigured(): boolean\r\n {\r\n return !isNil(this.serializable) || !isNil(this.deserializable);\r\n }\r\n\r\n /**\r\n * Gets serializer.\r\n * \r\n * @returns {Serializer<TType>} Serializer.\r\n */\r\n public get serializer(): Serializer<TType> \r\n {\r\n return this.propertyOptions.serializer ?? this.typeMetadata.serializer;\r\n }\r\n\r\n /**\r\n * Gets type argument.\r\n * \r\n * @returns {TypeArgument} Type argument.\r\n */\r\n public get typeArgument(): TypeArgument<TType>\r\n {\r\n return this.propertyOptions.typeArgument;\r\n }\r\n\r\n /**\r\n * Gets type metadata resolver.\r\n * \r\n * @returns {TypeMetadataResolver<TType>} Type metadata resolver.\r\n */\r\n public get typeMetadataResolver(): TypeMetadataResolver<TType>\r\n {\r\n return this.propertyInternals.typeMetadataResolver;\r\n }\r\n\r\n /**\r\n * Gets type metadata.\r\n * \r\n * @returns {TypeMetadata<TType>} Type metadata.\r\n */\r\n public get typeMetadata(): TypeMetadata<TType>\r\n {\r\n return this.typeMetadataResolver(this.typeArgument);\r\n }\r\n\r\n /**\r\n * Gets indicator if null value should be preserved.\r\n * \r\n * @returns {boolean} True when null value should be preserved. False otherwise.\r\n */\r\n public get preserveNull(): boolean\r\n {\r\n return this.propertyOptions.preserveNull ?? this.typeMetadata.preserveNull;\r\n }\r\n\r\n /**\r\n * Gets indicator if default value should be used.\r\n * \r\n * @returns {boolean} Use default value indicator.\r\n */\r\n public get useDefaultValue(): boolean\r\n {\r\n return this.propertyOptions.useDefaultValue ?? this.typeMetadata.useDefaultValue;\r\n }\r\n\r\n /**\r\n * Gets indicator if implicit conversion should be used.\r\n * \r\n * @returns {boolean} Use implicit conversion indicator.\r\n */\r\n public get useImplicitConversion(): boolean\r\n {\r\n return this.propertyOptions.useImplicitConversion ?? this.typeMetadata.useImplicitConversion;\r\n }\r\n\r\n /**\r\n * Constructs initial property options by extending passed options \r\n * with default values if they are not overriden. All references are kept.\r\n * \r\n * @param {PropertyOptions<TType>} propertyOptions Type options.\r\n * \r\n * @returns {PropertyOptions<TType>} Constructed property options.\r\n */\r\n private constructPropertyOptions(propertyOptions: PropertyOptions<TType>): PropertyOptions<TType>\r\n {\r\n propertyOptions.typeArgument = propertyOptions.typeArgument ?? this.reflectTypeFn;\r\n\r\n return propertyOptions;\r\n }\r\n\r\n /**\r\n * Constructs property internals.\r\n * \r\n * @returns {PropertyInternals} Constructed property internals.\r\n */\r\n private constructPropertyInternals(): PropertyInternals\r\n {\r\n const typeMetadataResolver = this.defineTypeMetadataResolver(this.propertyOptions.typeArgument);\r\n const customOptions = this.propertyOptions.customOptions;\r\n const customContext = isNil(customOptions) ? undefined : new CustomContext(customOptions);\r\n const propertyInternals = { typeMetadataResolver: typeMetadataResolver, customContext: customContext };\r\n\r\n return propertyInternals;\r\n }\r\n\r\n /**\r\n * Configures alias.\r\n * \r\n * @param {Alias} alias Alias.\r\n * \r\n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\r\n */\r\n public hasAlias(alias: Alias | undefined): PropertyMetadata<TDeclaringType, TType>\r\n {\r\n this.propertyOptions.alias = alias;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures custom options.\r\n * \r\n * @param {Array<CustomOption>|undefined} customOptions Custom options.\r\n * \r\n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\r\n */\r\n private hasCustomOptions(customOptions: Array<CustomOption> | undefined): PropertyMetadata<TDeclaringType, TType>\r\n {\r\n if (!isNil(customOptions))\r\n {\r\n this.customContext.configure(customOptions);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures default value.\r\n * \r\n * @param {DefaultValue} defaultValue Default value.\r\n * \r\n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\r\n */\r\n public hasDefaultValue(defaultValue: DefaultValue): PropertyMetadata<TDeclaringType, TType>\r\n {\r\n this.propertyOptions.defaultValue = defaultValue;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures serialized default value.\r\n * \r\n * @param {DefaultValue} serializedDefaultValue Serialized default value.\r\n * \r\n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\r\n */\r\n public hasSerializedDefaultValue(serializedDefaultValue: DefaultValue): PropertyMetadata<TDeclaringType, TType>\r\n {\r\n this.propertyOptions.serializedDefaultValue = serializedDefaultValue;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures deserialized default value.\r\n * \r\n * @param {DefaultValue} deserializedDefaultValue Deserialized default value.\r\n * \r\n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\r\n */\r\n public hasDeserializedDefaultValue(deserializedDefaultValue: DefaultValue): PropertyMetadata<TDeclaringType, TType>\r\n {\r\n this.propertyOptions.deserializedDefaultValue = deserializedDefaultValue;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures deserializable.\r\n * \r\n * @param {boolean} deserializable Deserializable.\r\n * \r\n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\r\n */\r\n public isDeserializable(deserializable: boolean = true): PropertyMetadata<TDeclaringType, TType>\r\n {\r\n this.propertyOptions.deserializable = deserializable;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures serializable.\r\n * \r\n * @param {boolean} serializable Serializable.\r\n * \r\n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\r\n */\r\n public isSerializable(serializable: boolean = true): PropertyMetadata<TDeclaringType, TType>\r\n {\r\n this.propertyOptions.serializable = serializable;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures generic arguments.\r\n * \r\n * @param {Array<GenericArgument<any>>|undefined} genericArguments Generic arguments.\r\n * \r\n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\r\n */\r\n public hasGenericArguments(genericArguments: Array<GenericArgument<any>> | undefined): PropertyMetadata<TDeclaringType, TType>\r\n {\r\n this.propertyOptions.genericArguments = genericArguments;\r\n\r\n if (isNil(genericArguments))\r\n {\r\n this.propertyInternals.genericStructures = undefined;\r\n this.propertyInternals.genericMetadataResolvers = undefined;\r\n\r\n return this;\r\n }\r\n\r\n const genericStructures = this.defineGenericStructures(genericArguments);\r\n\r\n this.propertyInternals.genericStructures = genericStructures;\r\n this.propertyInternals.genericMetadataResolvers = this.defineGenericMetadataResolvers(genericStructures);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures naming convention.\r\n * \r\n * @param {NamingConvention|undefined} namingConvention Naming convention.\r\n * \r\n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\r\n */\r\n public hasNamingConvention(namingConvention: NamingConvention | undefined): PropertyMetadata<TDeclaringType, TType>\r\n {\r\n this.propertyOptions.namingConvention = namingConvention;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures reference handler.\r\n * \r\n * @param {ReferenceHandler|undefined} referenceHandler Reference handler.\r\n * \r\n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\r\n */\r\n public hasReferenceHandler(referenceHandler: ReferenceHandler | undefined): PropertyMetadata<TDeclaringType, TType>\r\n {\r\n this.propertyOptions.referenceHandler = referenceHandler;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures serializer.\r\n * \r\n * @param {Serializer<TType>|undefined} serializer Serializer.\r\n * \r\n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\r\n */\r\n public hasSerializer(serializer: Serializer<TType> | undefined): PropertyMetadata<TDeclaringType, TType>\r\n {\r\n this.propertyOptions.serializer = serializer;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures type argument.\r\n * \r\n * @param {TypeArgument<TType>|undefined} typeArgument Type argument.\r\n * \r\n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\r\n */\r\n public hasTypeArgument(typeArgument: TypeArgument<TType> | undefined): PropertyMetadata<TDeclaringType, TType>\r\n {\r\n this.propertyOptions.typeArgument = typeArgument ?? this.reflectTypeFn;\r\n this.propertyInternals.typeMetadataResolver = this.defineTypeMetadataResolver(this.propertyOptions.typeArgument);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures preserve null.\r\n * \r\n * @param {boolean} preserveNull Preserve null.\r\n * \r\n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\r\n */\r\n public shouldPreserveNull(preserveNull: boolean = true): PropertyMetadata<TDeclaringType, TType>\r\n {\r\n this.propertyOptions.preserveNull = preserveNull;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures use default value.\r\n * \r\n * @param {boolean} useDefaultValue Use default value.\r\n * \r\n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\r\n */\r\n public shouldUseDefaultValue(useDefaultValue: boolean = true): PropertyMetadata<TDeclaringType, TType>\r\n {\r\n this.propertyOptions.useDefaultValue = useDefaultValue;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures use implicit convertion.\r\n * \r\n * @param {boolean} useImplicitConversion Use implicit convertion.\r\n * \r\n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\r\n */\r\n public shouldUseImplicitConversion(useImplicitConversion: boolean = true): PropertyMetadata<TDeclaringType, TType>\r\n {\r\n this.propertyOptions.useImplicitConversion = useImplicitConversion;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures property metadata based on provided options.\r\n * \r\n * @param {PropertyOptions<TType>} propertyOptions Property options.\r\n * \r\n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\r\n */\r\n public configure(propertyOptions: PropertyOptions<TType>): PropertyMetadata<TDeclaringType, TType>\r\n {\r\n if (!isUndefined(propertyOptions.alias))\r\n {\r\n this.hasAlias(propertyOptions.alias);\r\n }\r\n\r\n if (!isUndefined(propertyOptions.customOptions))\r\n {\r\n this.hasCustomOptions(propertyOptions.customOptions);\r\n }\r\n\r\n if (!isUndefined(propertyOptions.defaultValue))\r\n {\r\n this.hasDefaultValue(propertyOptions.defaultValue);\r\n }\r\n\r\n if (!isUndefined(propertyOptions.serializedDefaultValue))\r\n {\r\n this.hasSerializedDefaultValue(propertyOptions.serializedDefaultValue);\r\n }\r\n\r\n if (!isUndefined(propertyOptions.deserializedDefaultValue))\r\n {\r\n this.hasDeserializedDefaultValue(propertyOptions.deserializedDefaultValue);\r\n }\r\n\r\n if (!isUndefined(propertyOptions.deserializable))\r\n {\r\n this.isDeserializable(propertyOptions.deserializable);\r\n }\r\n\r\n if (!isUndefined(propertyOptions.genericArguments)) \r\n {\r\n this.hasGenericArguments(propertyOptions.genericArguments);\r\n }\r\n\r\n if (!isUndefined(propertyOptions.namingConvention))\r\n {\r\n this.hasNamingConvention(propertyOptions.namingConvention);\r\n }\r\n\r\n if (!isUndefined(propertyOptions.referenceHandler)) \r\n {\r\n this.hasReferenceHandler(propertyOptions.referenceHandler);\r\n }\r\n\r\n if (!isUndefined(propertyOptions.serializable)) \r\n {\r\n this.isSerializable(propertyOptions.serializable);\r\n }\r\n\r\n if (!isUndefined(propertyOptions.serializer)) \r\n {\r\n this.hasSerializer(propertyOptions.serializer);\r\n }\r\n\r\n if (!isUndefined(propertyOptions.typeArgument)) \r\n {\r\n this.hasTypeArgument(propertyOptions.typeArgument);\r\n }\r\n\r\n if (!isUndefined(propertyOptions.preserveNull))\r\n {\r\n this.shouldPreserveNull(propertyOptions.preserveNull);\r\n }\r\n\r\n if (!isUndefined(propertyOptions.useDefaultValue))\r\n {\r\n this.shouldUseDefaultValue(propertyOptions.useDefaultValue);\r\n }\r\n\r\n if (!isUndefined(propertyOptions.useImplicitConversion)) \r\n {\r\n this.shouldUseImplicitConversion(propertyOptions.useImplicitConversion);\r\n }\r\n\r\n return this;\r\n }\r\n}\r\n","import { PropertyMetadata } from '../property-metadata';\r\nimport { PropertySorter } from '../property-sorter';\r\n\r\n/**\r\n * Represents asc property sorter which sorts type properties in\r\n * ascending order by name.\r\n * \r\n * @type {AscPropertySorter}\r\n */\r\nexport class AscPropertySorter implements PropertySorter\r\n{\r\n /**\r\n * Sort type properties. It is expected to return a negative value if the value of first property \r\n * is less than the value of second property, zero if they are equal, and a positive value otherwise.\r\n * \r\n * @param {PropertyMetadata<TType, any>} x First property.\r\n * @param {PropertyMetadata<TType, any>} y Second property.\r\n * \r\n * @returns {number} Sort result.\r\n */\r\n public sort<TType>(x: PropertyMetadata<TType, any>, y: PropertyMetadata<TType, any>): number\r\n {\r\n const a = x.propertyName.toLowerCase();\r\n const b = y.propertyName.toLowerCase();\r\n\r\n if (a < b)\r\n {\r\n return -1;\r\n }\r\n\r\n if (a > b)\r\n {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n }\r\n}\r\n","import { PropertyMetadata } from '../property-metadata';\r\nimport { PropertySorter } from '../property-sorter';\r\n\r\n/**\r\n * Represents desc property sorter which sorts type properties in\r\n * descending order by name.\r\n * \r\n * @type {DescPropertySorter}\r\n */\r\nexport class DescPropertySorter implements PropertySorter\r\n{\r\n /**\r\n * Sort type properties. It is expected to return a negative value if the value of first property \r\n * is less than the value of second property, zero if they are equal, and a positive value otherwise.\r\n * \r\n * @param {PropertyMetadata<TType, any>} x First property.\r\n * @param {PropertyMetadata<TType, any>} y Second property.\r\n * \r\n * @returns {number} Sort result.\r\n */\r\n public sort<TType>(x: PropertyMetadata<TType, any>, y: PropertyMetadata<TType, any>): number\r\n {\r\n const a = x.propertyName.toLowerCase();\r\n const b = y.propertyName.toLowerCase();\r\n\r\n if (a < b)\r\n {\r\n return 1;\r\n }\r\n\r\n if (a > b)\r\n {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n }\r\n}\r\n","export * from './asc-property-sorter';\r\nexport * from './desc-property-sorter';\r\n","import { isArray, isFunction, isObject, isString, isSymbol, merge } from 'lodash';\r\nimport { isCtorFunction } from './functions/is-ctor-function';\r\nimport { nameOf } from './functions/name-of';\r\nimport { GenericArgument } from './generic-argument';\r\nimport { PropertyOptions } from './property-options';\r\nimport { TypeArgument } from './type-argument';\r\nimport { TypeManager } from './type-manager';\r\n\r\n/**\r\n * Property decorator.\r\n * \r\n * @param {TypeArgument<TType>|Array<GenericArgument<any>>|PropertyOptions<TType>} x Type argument, generic arguments or property options.\r\n * @param {Array<GenericArgument<any>>|PropertyOptions<TType>} y Generic arguments or property options if first parameter is type argument.\r\n * @param {PropertyOptions<TType>} z Property options if second parameter are generic arguments.\r\n * \r\n * @returns {PropertyDecorator} Property decorator.\r\n */\r\nexport function Property<TType>(\r\n x?: TypeArgument<TType> | Array<GenericArgument<any>> | PropertyOptions<TType>, \r\n y?: Array<GenericArgument<any>> | PropertyOptions<TType>,\r\n z?: PropertyOptions<TType>\r\n): PropertyDecorator\r\n{\r\n const propertyOptions = {} as PropertyOptions<TType>;\r\n\r\n if (isObject(z))\r\n {\r\n merge(propertyOptions, z);\r\n }\r\n\r\n if (isObject(y) && !isArray(y))\r\n {\r\n merge(propertyOptions, y);\r\n }\r\n\r\n if (isObject(x) && !isArray(x))\r\n {\r\n merge(propertyOptions, x);\r\n }\r\n\r\n if (isArray(y))\r\n {\r\n propertyOptions.genericArguments = y;\r\n }\r\n\r\n if (isArray(x))\r\n {\r\n propertyOptions.genericArguments = x;\r\n }\r\n\r\n if (isString(x) || isFunction(x) || isCtorFunction(x))\r\n {\r\n propertyOptions.typeArgument = x;\r\n }\r\n\r\n return function (target: any, propertyName: string | symbol): void\r\n {\r\n if (isCtorFunction(target))\r\n {\r\n throw new Error(`${nameOf(target)}.${String(propertyName)}: property decorator cannot be applied to a static member.`);\r\n }\r\n\r\n if (isSymbol(propertyName))\r\n {\r\n throw new Error(`${nameOf(target.constructor)}.${String(propertyName)}: property decorator cannot be applied to a symbol.`);\r\n }\r\n\r\n if (isFunction(target[propertyName]))\r\n {\r\n throw new Error(`${nameOf(target.constructor)}.${String(propertyName)}: property decorator cannot be applied to a method.`);\r\n }\r\n\r\n TypeManager.configureTypeMetadata(target.constructor).configurePropertyMetadata(propertyName, propertyOptions);\r\n\r\n return;\r\n };\r\n}\r\n","import { isNil } from 'lodash';\r\nimport { ReferenceHandler } from '../reference-handler';\r\nimport { ReferenceKey } from '../reference-key';\r\nimport { ReferenceValue } from '../reference-value';\r\nimport { ReferenceValueGetter } from '../reference-value-getter';\r\nimport { SerializerContext } from '../serializer-context';\r\n\r\n/**\r\n * Circular reference handler which preserves references as is even if the circular is detected.\r\n * \r\n * @type {CircularReferenceHandler}\r\n */\r\nexport class CircularReferenceHandler implements ReferenceHandler\r\n{\r\n /**\r\n * Defines reference. Called during serialization.\r\n * \r\n * @param {SerializerContext<any>} serializerContext Serializer context.\r\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a serializing object.\r\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\r\n * \r\n * @returns {ReferenceValue} Resolved reference value.\r\n */\r\n public define(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\r\n {\r\n const referenceMap = serializerContext.referenceMap;\r\n const referenceValue = referenceMap.get(referenceKey);\r\n\r\n if (isNil(referenceValue))\r\n {\r\n referenceMap.set(referenceKey, referenceKey);\r\n\r\n const value = referenceValueGetter();\r\n\r\n referenceMap.set(referenceKey, value);\r\n\r\n serializerContext.resolveReferenceCallbacks(referenceKey);\r\n\r\n return value;\r\n }\r\n\r\n if (referenceValue === referenceKey)\r\n {\r\n serializerContext.registerReferenceCallback(referenceKey);\r\n\r\n return undefined;\r\n }\r\n\r\n return referenceValue;\r\n }\r\n\r\n /**\r\n * Restores reference. Called during deserialization.\r\n * \r\n * @param {SerializerContext<any>} serializerContext Serializer context.\r\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a deserializing object.\r\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\r\n * \r\n * @returns {ReferenceValue} Resolved reference value.\r\n */\r\n public restore(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\r\n {\r\n const referenceMap = serializerContext.referenceMap;\r\n const referenceValue = referenceMap.get(referenceKey);\r\n\r\n if (isNil(referenceValue))\r\n {\r\n referenceMap.set(referenceKey, referenceKey);\r\n\r\n const value = referenceValueGetter();\r\n\r\n referenceMap.set(referenceKey, value);\r\n\r\n serializerContext.resolveReferenceCallbacks(referenceKey);\r\n\r\n return value;\r\n }\r\n\r\n if (referenceValue === referenceKey)\r\n {\r\n serializerContext.registerReferenceCallback(referenceKey);\r\n\r\n return undefined;\r\n }\r\n\r\n return referenceValue;\r\n }\r\n}\r\n","export * from './circular-reference-handler';\r\nexport * from './json-path-reference-handler';\r\nexport * from './plain-reference-handler';\r\n","import { isNil, isObject, isString } from 'lodash';\r\nimport { ReferenceHandler } from '../reference-handler';\r\nimport { ReferenceKey } from '../reference-key';\r\nimport { ReferenceValue } from '../reference-value';\r\nimport { ReferenceValueGetter } from '../reference-value-getter';\r\nimport { SerializerContext } from '../serializer-context';\r\n\r\n/**\r\n * Json path reference handler preserves references using JSONPath.\r\n * \r\n * @type {JsonPathReferenceHandler}\r\n */\r\nexport class JsonPathReferenceHandler implements ReferenceHandler\r\n{\r\n /**\r\n * Regular expression used to get array key from a certain place of the JSONPath.\r\n * \r\n * @type {RegExp}\r\n */\r\n private readonly arrayKeyRegExp: RegExp = new RegExp('\\\\[\\\\\\'?([^\\\\\\'\\\\[\\\\]]+)\\\\\\'?\\\\]', 'g');\r\n\r\n /**\r\n * Defines reference. Called during serialization.\r\n * \r\n * @param {SerializerContext<any>} serializerContext Serializer context.\r\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a serializing object.\r\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\r\n * \r\n * @returns {ReferenceValue} Resolved reference value.\r\n */\r\n public define(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\r\n {\r\n const referenceMap = serializerContext.referenceMap;\r\n const referencePath = referenceMap.get(referenceKey);\r\n\r\n if (isNil(referencePath))\r\n {\r\n referenceMap.set(referenceKey, serializerContext.jsonPath);\r\n\r\n const value = referenceValueGetter();\r\n\r\n return value;\r\n }\r\n\r\n return { $ref: referencePath };\r\n }\r\n\r\n /**\r\n * Restores reference. Called during deserialization.\r\n * \r\n * @param {SerializerContext<any>} serializerContext Serializer context.\r\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a deserializing object.\r\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\r\n * \r\n * @returns {ReferenceValue} Resolved reference value.\r\n */\r\n public restore(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\r\n {\r\n const referenceMap = serializerContext.referenceMap;\r\n const referenceTarget = this.defineReferenceTarget(serializerContext, referenceKey);\r\n const referenceValue = referenceMap.get(referenceTarget);\r\n\r\n if (isNil(referenceValue))\r\n {\r\n referenceMap.set(referenceTarget, referenceTarget);\r\n\r\n const value = referenceValueGetter();\r\n\r\n referenceMap.set(referenceTarget, value);\r\n\r\n serializerContext.resolveReferenceCallbacks(referenceTarget);\r\n\r\n return value;\r\n }\r\n \r\n if (referenceTarget !== referenceKey) \r\n {\r\n serializerContext.pushReferenceCallback(referenceTarget, () =>\r\n {\r\n serializerContext.resolveReferenceCallbacks(referenceKey);\r\n });\r\n }\r\n\r\n if (referenceTarget === referenceValue)\r\n {\r\n serializerContext.registerReferenceCallback(referenceTarget);\r\n\r\n return undefined;\r\n }\r\n\r\n return referenceValue;\r\n }\r\n\r\n /**\r\n * Defines reference target based on reference key.\r\n * \r\n * @param {SerializerContext<any>} serializerContext Serializer context.\r\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a deserializing object.\r\n * \r\n * @returns {ReferenceKey} Reference which acts as a target key in context of JSONPath.\r\n */\r\n private defineReferenceTarget(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey): ReferenceKey\r\n {\r\n const $ = serializerContext.$;\r\n const referencePath = referenceKey.$ref;\r\n\r\n if (!isString(referencePath) || !isObject($))\r\n {\r\n return referenceKey;\r\n }\r\n\r\n if (referencePath === '$')\r\n {\r\n return $;\r\n }\r\n\r\n const referencePathArray = this.convertReferencePathToArray(referencePath);\r\n\r\n referencePathArray.shift();\r\n\r\n let referenceTarget = $ as Record<string, any>;\r\n\r\n for (let i = 0; i < referencePathArray.length; i++)\r\n {\r\n referenceTarget = referenceTarget[referencePathArray[i]];\r\n }\r\n\r\n return referenceTarget;\r\n }\r\n\r\n /**\r\n * Converts reference path to array.\r\n * \r\n * @param {string} referencePath Reference path.\r\n * \r\n * @returns {Array<string>} Array reference path.\r\n */\r\n private convertReferencePathToArray(referencePath: string): Array<string> \r\n {\r\n const array = new Array<string>();\r\n const parts = referencePath.split('.');\r\n\r\n for (const part of parts) \r\n {\r\n const keys = part.split(this.arrayKeyRegExp);\r\n\r\n for (const key of keys)\r\n {\r\n if (key.length > 0) \r\n {\r\n array.push(key);\r\n }\r\n }\r\n }\r\n\r\n return array;\r\n }\r\n}\r\n","import { isNil } from 'lodash';\r\nimport { ReferenceHandler } from '../reference-handler';\r\nimport { ReferenceKey } from '../reference-key';\r\nimport { ReferenceValue } from '../reference-value';\r\nimport { ReferenceValueGetter } from '../reference-value-getter';\r\nimport { SerializerContext } from '../serializer-context';\r\n\r\n/**\r\n * Plain reference handler preserves references except circular. If circular reference is detected the it will \r\n * be setted to undefined so only first occurance is handled.\r\n * \r\n * @type {PlainReferenceHandler}\r\n */\r\nexport class PlainReferenceHandler implements ReferenceHandler\r\n{\r\n /**\r\n * Defines reference. Called during serialization.\r\n * \r\n * @param {SerializerContext<any>} serializerContext Serializer context.\r\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a serializing object.\r\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\r\n * \r\n * @returns {ReferenceValue} Resolved reference value.\r\n */\r\n public define(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\r\n {\r\n const referenceMap = serializerContext.referenceMap;\r\n const referenceValue = referenceMap.get(referenceKey);\r\n\r\n if (isNil(referenceValue))\r\n {\r\n referenceMap.set(referenceKey, referenceKey);\r\n\r\n const value = referenceValueGetter();\r\n\r\n referenceMap.set(referenceKey, value);\r\n\r\n return value;\r\n }\r\n\r\n if (referenceValue === referenceKey)\r\n {\r\n return undefined;\r\n }\r\n\r\n return referenceValue;\r\n }\r\n\r\n /**\r\n * Restores reference. Called during deserialization.\r\n * \r\n * @param {SerializerContext<any>} serializerContext Serializer context.\r\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a deserializing object.\r\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\r\n * \r\n * @returns {ReferenceValue} Resolved reference value.\r\n */\r\n public restore(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\r\n {\r\n const referenceMap = serializerContext.referenceMap;\r\n const referenceValue = referenceMap.get(referenceKey);\r\n\r\n if (isNil(referenceValue))\r\n {\r\n referenceMap.set(referenceKey, referenceKey);\r\n\r\n const value = referenceValueGetter();\r\n\r\n referenceMap.set(referenceKey, value);\r\n\r\n return value;\r\n }\r\n\r\n if (referenceValue === referenceKey)\r\n {\r\n return undefined;\r\n }\r\n\r\n return referenceValue;\r\n }\r\n}\r\n","import { isNil, isNumber, isUndefined } from 'lodash';\r\nimport { Discriminant } from './discriminant';\r\nimport { Discriminator } from './discriminator';\r\nimport { Factory } from './factory';\r\nimport { isCtorFunction } from './functions/is-ctor-function';\r\nimport { GenericMetadata } from './generic-metadata';\r\nimport { GenericMetadataResolver } from './generic-metadata-resolver';\r\nimport { GenericStructure } from './generic-structure';\r\nimport { Injector } from './injector';\r\nimport { Log } from './log';\r\nimport { Metadata } from './metadata';\r\nimport { NamingConvention } from './naming-convention';\r\nimport { PropertyMetadata } from './property-metadata';\r\nimport { ReferenceCallback } from './reference-callback';\r\nimport { ReferenceHandler } from './reference-handler';\r\nimport { ReferenceKey } from './reference-key';\r\nimport { ReferenceValue } from './reference-value';\r\nimport { ReferenceValueGetter } from './reference-value-getter';\r\nimport { ReferenceValueSetter } from './reference-value-setter';\r\nimport { Serializer } from './serializer';\r\nimport { SerializerContextOptions } from './serializer-context-options';\r\nimport { TypeFn } from './type-fn';\r\nimport { TypeLike } from './type-like';\r\nimport { TypeMetadata } from './type-metadata';\r\n\r\n/**\r\n * Serializer context of a certain type.\r\n * \r\n * @type {SerializerContext<TType>}\r\n */\r\nexport class SerializerContext<TType> extends Metadata\r\n{\r\n /**\r\n * Serializer context root.\r\n * \r\n * This is a value passed to the root serializer.\r\n * \r\n * @type {any}\r\n */\r\n public readonly $: any;\r\n\r\n /**\r\n * Reference map.\r\n * \r\n * Used to preserve object references.\r\n * \r\n * @type {Map<ReferenceKey, ReferenceValue>}\r\n */\r\n public readonly referenceMap: Map<ReferenceKey, ReferenceValue>;\r\n \r\n /**\r\n * Reference callback map.\r\n * \r\n * Used to assign object references in a later time due to circular dependency.\r\n * \r\n * @type {Map<ReferenceKey, Array<ReferenceCallback>>}\r\n */\r\n public readonly referenceCallbackMap: Map<ReferenceKey, Array<ReferenceCallback>>;\r\n\r\n /**\r\n * Serializer context options.\r\n * \r\n * @type {SerializerContext<TType>}\r\n */\r\n public readonly serializerContextOptions: SerializerContextOptions<TType>;\r\n\r\n /**\r\n * Parent serializer context.\r\n * \r\n * Present when any serializer defines child context.\r\n * \r\n * @type {SerializerContext<any>}\r\n */\r\n public readonly parentSerializerContext?: SerializerContext<any>;\r\n\r\n /**\r\n * Constructor.\r\n * \r\n * @param {any} $ Serializer context root.\r\n * @param {Map<ReferenceKey, ReferenceValue>} referenceMap Reference map.\r\n * @param {Map<ReferenceKey, Array<ReferenceCallback>>} referenceCallbackMap Reference callback map.\r\n * @param {SerializerContextOptions<TType>} serializerContextOptions Serializer context options.\r\n * @param {SerializerContext<any>} parentSerializerContext Parent serializer context.\r\n */\r\n public constructor(\r\n $: any,\r\n referenceMap: Map<ReferenceKey, ReferenceValue>,\r\n referenceCallbackMap: Map<ReferenceKey, Array<ReferenceCallback>>,\r\n serializerContextOptions: SerializerContextOptions<TType>, \r\n parentSerializerContext?: SerializerContext<any>\r\n )\r\n {\r\n super(serializerContextOptions.typeMetadata.typeManager);\r\n\r\n this.$ = $;\r\n this.referenceMap = referenceMap,\r\n this.referenceCallbackMap = referenceCallbackMap;\r\n this.serializerContextOptions = serializerContextOptions;\r\n this.parentSerializerContext = parentSerializerContext;\r\n\r\n return;\r\n }\r\n\r\n /**\r\n * Gets json path key.\r\n * \r\n * @returns {string|number} Json path key.\r\n */\r\n public get jsonPathKey(): any\r\n {\r\n return this.serializerContextOptions.jsonPathKey;\r\n }\r\n\r\n /**\r\n * Gets reference value setter.\r\n * \r\n * @returns {ReferenceValueSetter|undefined} Reference value setter or undefined if not present.\r\n */\r\n public get referenceValueSetter(): ReferenceValueSetter | undefined\r\n {\r\n return this.serializerContextOptions.referenceValueSetter;\r\n }\r\n\r\n /**\r\n * Gets serialized null value.\r\n * \r\n * @returns {any|undefined} Resolved serialized null value or undefined.\r\n */\r\n public get serializedNullValue(): any | undefined\r\n {\r\n if (this.preserveNull)\r\n {\r\n return null;\r\n }\r\n\r\n return this.serializedDefaultValue;\r\n }\r\n\r\n /**\r\n * Gets serialized default value.\r\n * \r\n * @returns {any|undefined} Resolved serialized default value or undefined.\r\n */\r\n public get serializedDefaultValue(): any | undefined\r\n {\r\n if (this.useDefaultValue)\r\n {\r\n return this.propertyMetadata?.serializedDefaultValue ?? this.typeMetadata.serializedDefaultValue;\r\n }\r\n\r\n return undefined;\r\n }\r\n \r\n /**\r\n * Gets deserialized null value.\r\n * \r\n * @returns {any|undefined} Resolved deserialized null value or undefined.\r\n */\r\n public get deserializedNullValue(): any | undefined\r\n {\r\n if (this.preserveNull)\r\n {\r\n return null;\r\n }\r\n\r\n return this.deserializedDefaultValue;\r\n }\r\n\r\n /**\r\n * Gets deserialized default value.\r\n * \r\n * @returns {any|undefined} Resolved deserialized default value or undefined.\r\n */\r\n public get deserializedDefaultValue(): any | undefined\r\n {\r\n if (this.useDefaultValue)\r\n {\r\n return this.propertyMetadata?.deserializedDefaultValue ?? this.typeMetadata.deserializedDefaultValue;\r\n }\r\n \r\n return undefined;\r\n }\r\n\r\n /**\r\n * Gets json path from serializer context root.\r\n * \r\n * @returns {string} Json path.\r\n */\r\n public get jsonPath(): string\r\n {\r\n const jsonPathKey = this.jsonPathKey;\r\n const parentSerializerContext = this.parentSerializerContext;\r\n\r\n if (isNil(parentSerializerContext))\r\n {\r\n return jsonPathKey;\r\n }\r\n\r\n if (isNumber(jsonPathKey))\r\n {\r\n return `${parentSerializerContext.jsonPath}[${jsonPathKey}]`;\r\n }\r\n\r\n return `${parentSerializerContext.jsonPath}['${jsonPathKey}']`;\r\n }\r\n\r\n /**\r\n * Gets discriminant.\r\n * \r\n * @returns {Discriminant} Discriminant.\r\n */\r\n public get discriminant(): Discriminant\r\n {\r\n return this.typeMetadata.discriminant;\r\n }\r\n\r\n /**\r\n * Gets discriminant map.\r\n * \r\n * @returns {Map<TypeFn<any>, Discriminant>} Discriminant map.\r\n */\r\n public get discriminantMap(): Map<TypeFn<any>, Discriminant>\r\n {\r\n return this.typeMetadata.discriminantMap;\r\n }\r\n\r\n /**\r\n * Gets discriminator.\r\n * \r\n * @returns {Discriminator} Discriminator.\r\n */\r\n public get discriminator(): Discriminator\r\n {\r\n return this.typeMetadata.discriminator;\r\n }\r\n\r\n /**\r\n * Gets factory.\r\n * \r\n * @returns {Factory} Factory.\r\n */\r\n public get factory(): Factory\r\n {\r\n return this.typeMetadata.factory;\r\n }\r\n\r\n /**\r\n * Gets generic structures.\r\n * \r\n * @returns {Array<GenericStructure<any>>|undefined} Generic structures or undefined.\r\n */\r\n public get genericStructures(): Array<GenericStructure<any>> | undefined\r\n {\r\n return this.serializerContextOptions.genericStructures;\r\n }\r\n\r\n /**\r\n * Gets generic metadata resolvers.\r\n * \r\n * @returns {Array<GenericMetadataResolver<any>>|undefined} Generic metadata resolvers or undefined.\r\n */\r\n public get genericMetadataResolvers(): Array<GenericMetadataResolver<any>> | undefined\r\n {\r\n return this.serializerContextOptions.genericMetadataResolvers;\r\n }\r\n\r\n /**\r\n * Gets generic metadatas.\r\n * \r\n * @returns {Array<GenericMetadata<any>>|undefined} Generic metadatas.\r\n */\r\n public get genericMetadatas(): Array<GenericMetadata<any>> | undefined\r\n {\r\n const genericStructures = this.genericStructures;\r\n const genericMetadataResolvers = this.genericMetadataResolvers;\r\n\r\n if (isNil(genericStructures) || isNil(genericMetadataResolvers))\r\n {\r\n return undefined;\r\n }\r\n\r\n return this.defineGenericMetadatas(genericStructures, genericMetadataResolvers);\r\n }\r\n\r\n /**\r\n * Gets injector.\r\n * \r\n * @returns {Injector} Injector\r\n */\r\n public get injector(): Injector\r\n {\r\n return this.typeMetadata.injector;\r\n }\r\n\r\n /**\r\n * Gets log.\r\n * \r\n * @returns {Log} Log instance.\r\n */\r\n public get log(): Log\r\n {\r\n return this.typeMetadata.log;\r\n }\r\n\r\n /**\r\n * Gets context name.\r\n * \r\n * @returns {string} Context name.\r\n */\r\n public get name(): string\r\n {\r\n if (isNil(this.propertyMetadata))\r\n {\r\n return this.typeMetadata.typeName;\r\n }\r\n\r\n return `${this.propertyMetadata.declaringTypeMetadata.typeName}.${this.propertyMetadata.propertyName}`;\r\n }\r\n\r\n /**\r\n * Gets naming convention.\r\n * \r\n * @returns {NamingConvention|undefined} Naming convention or undefined.\r\n */\r\n public get namingConvention(): NamingConvention | undefined\r\n {\r\n return this.propertyMetadata?.namingConvention ?? this.typeMetadata.namingConvention;\r\n }\r\n\r\n /**\r\n * Gets indicator if context is polymorphic.\r\n * \r\n * @returns {boolean} True when context is polymorphic. False otherwise.\r\n */\r\n public get polymorphic(): boolean\r\n {\r\n return this.typeMetadata.polymorphic;\r\n }\r\n\r\n /**\r\n * Gets property metadata.\r\n * \r\n * @returns {PropertyMetadata<any, TType>|undefined} Property metadata or undefined.\r\n */\r\n public get propertyMetadata(): PropertyMetadata<any, TType> | undefined\r\n {\r\n return this.serializerContextOptions.propertyMetadata;\r\n }\r\n\r\n /**\r\n * Gets indicator if discriminator should be preserved.\r\n * \r\n * @returns {boolean} True when discriminator should be preserved. False otherwise.\r\n */\r\n public get preserveDiscriminator(): boolean \r\n {\r\n return this.typeMetadata.preserveDiscriminator;\r\n }\r\n\r\n /**\r\n * Gets reference handler.\r\n * \r\n * @returns {ReferenceHandler} Reference handler.\r\n */\r\n public get referenceHandler(): ReferenceHandler\r\n {\r\n return this.propertyMetadata?.referenceHandler ?? this.typeMetadata.referenceHandler;\r\n }\r\n\r\n /**\r\n * Gets serializer.\r\n * \r\n * @returns {Serializer<TType>} Serializer.\r\n */\r\n public get serializer(): Serializer<TType>\r\n {\r\n return this.propertyMetadata?.serializer ?? this.typeMetadata.serializer;\r\n }\r\n\r\n /**\r\n * Gets type metadata.\r\n * \r\n * @returns {TypeMetadata<TType>} Type metadata.\r\n */\r\n public get typeMetadata(): TypeMetadata<TType>\r\n {\r\n return this.serializerContextOptions.typeMetadata;\r\n }\r\n\r\n /**\r\n * Gets indicator if null value should be preserved.\r\n * \r\n * @returns {boolean} True when null value should be preserved. False otherwise.\r\n */\r\n public get preserveNull(): boolean\r\n {\r\n return this.propertyMetadata?.preserveNull ?? this.typeMetadata.preserveNull;\r\n }\r\n\r\n /**\r\n * Gets indicator if default value should be used.\r\n * \r\n * @returns {boolean} True when type should use default value. False otherwise.\r\n */\r\n public get useDefaultValue(): boolean\r\n {\r\n return this.propertyMetadata?.useDefaultValue ?? this.typeMetadata.useDefaultValue;\r\n }\r\n\r\n /**\r\n * Gets indicator if implicit conversion should be used.\r\n * \r\n * @returns {boolean} True when type should use implicit conversion. False otherwise.\r\n */\r\n public get useImplicitConversion(): boolean\r\n {\r\n return this.propertyMetadata?.useImplicitConversion ?? this.typeMetadata.useImplicitConversion;\r\n }\r\n\r\n /**\r\n * Serializes provided value using context.\r\n * \r\n * @param {TypeLike<TType>} x Some value.\r\n * \r\n * @returns {TypeLike<any>} Value serialized by context.\r\n */\r\n public serialize(x: TypeLike<TType>): TypeLike<any>\r\n {\r\n return this.serializer.serialize(x, this);\r\n }\r\n\r\n /**\r\n * Deserializes provided value using context.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * \r\n * @returns {TypeLike<TType>} Value deserialized by context.\r\n */\r\n public deserialize(x: TypeLike<any>): TypeLike<TType>\r\n {\r\n return this.serializer.deserialize(x, this);\r\n }\r\n\r\n /**\r\n * Defines reference. \r\n * \r\n * May be called during serialization to define reference.\r\n * \r\n * @param {ReferenceKey} referenceKey Reference key.\r\n * @param {ReferenceValueGetter} referenceValueGetter Reference value getter.\r\n * \r\n * @returns {ReferenceValue} Reference value.\r\n */\r\n public defineReference(referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\r\n {\r\n return this.referenceHandler.define(this, referenceKey, referenceValueGetter);\r\n }\r\n\r\n /**\r\n * Restores reference.\r\n * \r\n * May be called during deserialization to restore reference.\r\n * \r\n * @param {ReferenceKey} referenceKey Reference key.\r\n * @param {ReferenceValueGetter} referenceValueGetter Reference value getter.\r\n * \r\n * @returns {ReferenceValue} Reference value.\r\n */\r\n public restoreReference(referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\r\n {\r\n return this.referenceHandler.restore(this, referenceKey, referenceValueGetter);\r\n }\r\n\r\n /**\r\n * Registers callback for provided reference key.\r\n * \r\n * May be called by reference handlers to register a callback resolver for a circular reference.\r\n * \r\n * @param {ReferenceKey} referenceKey Reference key.\r\n * \r\n * @returns {void}\r\n */\r\n public registerReferenceCallback(referenceKey: ReferenceKey): void\r\n {\r\n const referenceValueSetter = this.referenceValueSetter;\r\n\r\n if (isNil(referenceValueSetter))\r\n {\r\n return;\r\n }\r\n\r\n this.pushReferenceCallback(referenceKey, () =>\r\n {\r\n const referenceValue = this.referenceMap.get(referenceKey);\r\n\r\n referenceValueSetter(referenceValue);\r\n });\r\n\r\n return;\r\n }\r\n\r\n /**\r\n * Pushes callback for provided reference key.\r\n * \r\n * Called by reference handlers during handling of circular references.\r\n * \r\n * @param {ReferenceKey} referenceKey Reference key.\r\n * @param {ReferenceCallback} referenceCallback Reference callback.\r\n * \r\n * @returns {void}\r\n */\r\n public pushReferenceCallback(referenceKey: ReferenceKey, referenceCallback: ReferenceCallback): void\r\n {\r\n let referenceCallbacks = this.referenceCallbackMap.get(referenceKey);\r\n\r\n if (isNil(referenceCallbacks))\r\n {\r\n referenceCallbacks = [];\r\n\r\n this.referenceCallbackMap.set(referenceKey, referenceCallbacks);\r\n }\r\n\r\n referenceCallbacks.push(referenceCallback);\r\n\r\n return;\r\n }\r\n\r\n /**\r\n * Resolves callbacks for provided reference key.\r\n * \r\n * May be called by reference handlers when circular references can be resolved.\r\n * \r\n * @param {ReferenceKey} referenceKey Reference key.\r\n * \r\n * @returns {void}\r\n */\r\n public resolveReferenceCallbacks(referenceKey: ReferenceKey): void\r\n {\r\n const referenceCallbacks = this.referenceCallbackMap.get(referenceKey);\r\n\r\n if (isNil(referenceCallbacks))\r\n {\r\n return;\r\n }\r\n\r\n for (const referenceCallback of referenceCallbacks)\r\n {\r\n referenceCallback();\r\n }\r\n\r\n return;\r\n }\r\n\r\n /**\r\n * Defines serializer context options based on partial.\r\n * \r\n * @param {Partial<SerializerContextOptions<any>>} serializerContextOptions Partial serializer context options.\r\n * \r\n * @returns {SerializerContextOptions<any>} Complete serializer context options.\r\n */\r\n private defineSerializerContextOptions(serializerContextOptions: Partial<SerializerContextOptions<any>>): SerializerContextOptions<any>\r\n {\r\n return {\r\n jsonPathKey: serializerContextOptions.jsonPathKey ?? this.serializerContextOptions.jsonPathKey,\r\n typeMetadata: serializerContextOptions.typeMetadata ?? this.serializerContextOptions.typeMetadata,\r\n genericStructures: serializerContextOptions.genericStructures ?? this.serializerContextOptions.genericStructures,\r\n genericMetadataResolvers: serializerContextOptions.genericMetadataResolvers ?? this.serializerContextOptions.genericMetadataResolvers,\r\n propertyMetadata: serializerContextOptions.propertyMetadata ?? this.serializerContextOptions.propertyMetadata,\r\n referenceValueSetter: serializerContextOptions.referenceValueSetter ?? this.serializerContextOptions.referenceValueSetter\r\n };\r\n }\r\n\r\n /**\r\n * Defines child serializer context.\r\n * \r\n * Called by serializers on drill down.\r\n * \r\n * @param {Partial<SerializerContextOptions<any>>} childSerializerContextOptions Child serializer context options.\r\n * \r\n * @returns {SerializerContext<any>} Child serializer context.\r\n */\r\n public defineChildSerializerContext(childSerializerContextOptions: Partial<SerializerContextOptions<any>>): SerializerContext<any>\r\n {\r\n const parentSerializerContext = isNil(childSerializerContextOptions.jsonPathKey) ? this.parentSerializerContext : this;\r\n const serializerContextOptions = this.defineSerializerContextOptions(childSerializerContextOptions);\r\n\r\n return new SerializerContext(this.$, this.referenceMap, this.referenceCallbackMap, serializerContextOptions, parentSerializerContext);\r\n }\r\n\r\n /**\r\n * Defines generic serializer context.\r\n * \r\n * Called by serializers which work with generics.\r\n * \r\n * @param {number} genericIndex Generic index.\r\n * \r\n * @returns {SerializerContext<any>} Generic serializer context.\r\n */\r\n public defineGenericSerializerContext(genericIndex: number): SerializerContext<any>\r\n {\r\n const genericStructures = this.genericStructures;\r\n const genericMetadataResolvers = this.genericMetadataResolvers;\r\n\r\n if (isNil(genericStructures) || isNil(genericMetadataResolvers))\r\n {\r\n throw new Error(`${this.jsonPath}: cannot define generic arguments. This is usually caused by invalid configuration.`);\r\n }\r\n\r\n const genericStructure = genericStructures[genericIndex];\r\n const genericMetadataResolver = genericMetadataResolvers[genericIndex];\r\n\r\n if (isNil(genericStructure) || isNil(genericMetadataResolver))\r\n {\r\n throw new Error(`${this.jsonPath}: cannot define generic argument for index ${genericIndex}. This is usually caused by invalid configuration.`);\r\n }\r\n\r\n const genericTypeArgument = genericStructure[0];\r\n const genericGenericStructures = genericStructure[1];\r\n const genericTypeMetadataResolver = genericMetadataResolver[0];\r\n const genericGenericMetadataResolvers = genericMetadataResolver[1];\r\n const typeMetadata = genericTypeMetadataResolver(genericTypeArgument);\r\n const serializerContextOptions = this.defineSerializerContextOptions(this.serializerContextOptions);\r\n\r\n serializerContextOptions.typeMetadata = typeMetadata;\r\n serializerContextOptions.genericStructures = genericGenericStructures;\r\n serializerContextOptions.genericMetadataResolvers = genericGenericMetadataResolvers;\r\n serializerContextOptions.propertyMetadata = undefined;\r\n\r\n return new SerializerContext(this.$, this.referenceMap, this.referenceCallbackMap, serializerContextOptions, this.parentSerializerContext);\r\n }\r\n\r\n /**\r\n * Defines polymorphic serializer context.\r\n * \r\n * Called by serializers which work with polymorphic types.\r\n * \r\n * @param {TypeFn<any>|Record<string, any>} x Type function or record.\r\n * \r\n * @returns {SerializerContext<any>} Polymorphic serializer context.\r\n */\r\n public definePolymorphicSerializerContext(x: TypeFn<any> | Record<string, any>): SerializerContext<any>\r\n {\r\n return isCtorFunction(x) ? this.definePolymorphicSerializerContextByTypeFn(x) : this.definePolymorphicSerializerContextByDiscriminant(x);\r\n }\r\n\r\n /**\r\n * Defines polymorphic serializer context by type function.\r\n * \r\n * @param {TypeFn<any>} typeFn Type function.\r\n * \r\n * @returns {SerializerContext<any>} Polymorphic serializer context.\r\n */\r\n private definePolymorphicSerializerContextByTypeFn(typeFn: TypeFn<any>): SerializerContext<any>\r\n {\r\n const discriminant = this.discriminantMap.get(typeFn);\r\n\r\n if (isNil(discriminant))\r\n {\r\n throw new Error(`${this.jsonPath}: cannot define discriminant of polymorphic type. This is usually caused by invalid configuration.`);\r\n }\r\n\r\n const typeMetadata = this.typeManager.extractTypeMetadata(typeFn);\r\n const serializerContextOptions = this.defineSerializerContextOptions(this.serializerContextOptions);\r\n\r\n serializerContextOptions.typeMetadata = typeMetadata;\r\n\r\n return new SerializerContext(this.$, this.referenceMap, this.referenceCallbackMap, serializerContextOptions, this.parentSerializerContext);\r\n }\r\n\r\n /**\r\n * Defines polymorphic serializer context by discriminant.\r\n * \r\n * @param {Record<string, any>} record Some record.\r\n * \r\n * @returns {SerializerContext<any>} Polymorphic serializer context.\r\n */\r\n private definePolymorphicSerializerContextByDiscriminant(record: Record<string, any>): SerializerContext<any>\r\n {\r\n for (const [typeCtor, discriminant] of this.discriminantMap)\r\n {\r\n const typeMetadata = this.typeManager.extractTypeMetadata(typeCtor);\r\n\r\n if (record[typeMetadata.discriminator] === discriminant)\r\n {\r\n const serializerContextOptions = this.defineSerializerContextOptions(this.serializerContextOptions);\r\n\r\n serializerContextOptions.typeMetadata = typeMetadata;\r\n\r\n return new SerializerContext(this.$, this.referenceMap, this.referenceCallbackMap, serializerContextOptions, this.parentSerializerContext);\r\n }\r\n }\r\n\r\n throw new Error(`${this.jsonPath}: cannot define discriminant of polymorphic type. This is usually caused by invalid configuration.`);\r\n }\r\n\r\n /**\r\n * Configures json path key.\r\n * \r\n * @param {string|number} jsonPathKey Json path key.\r\n * \r\n * @returns {SerializerContext<TType>} Current instance of serializer context.\r\n */\r\n public hasJsonPathKey(jsonPathKey: string | number): SerializerContext<TType>\r\n {\r\n this.serializerContextOptions.jsonPathKey = jsonPathKey;\r\n\r\n return this;\r\n }\r\n \r\n /**\r\n * Configures reference value setter.\r\n * \r\n * @param {ReferenceValueSetter} referenceValueSetter Reference value setter.\r\n * \r\n * @returns {SerializerContext<TType>} Current instance of serializer context.\r\n */\r\n public hasReferenceValueSetter(referenceValueSetter: ReferenceValueSetter): SerializerContext<TType>\r\n {\r\n this.serializerContextOptions.referenceValueSetter = referenceValueSetter;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures generic structures.\r\n * \r\n * @param {Array<GenericStructure<any>>|undefined} genericStructures Generic structures.\r\n * \r\n * @returns {SerializerContext<TType>} Current instance of serializer context.\r\n */\r\n public hasGenericStructures(genericStructures: Array<GenericStructure<any>> | undefined): SerializerContext<TType>\r\n {\r\n this.serializerContextOptions.genericStructures = genericStructures;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures generic metadata resolvers.\r\n * \r\n * @param {Array<GenericMetadataResolver<any>>|undefined} genericMetadataResolvers Generic metadata resolvers.\r\n * \r\n * @returns {SerializerContext<TType>} Current instance of serializer context.\r\n */\r\n public hasGenericMetadataResolvers(genericMetadataResolvers: Array<GenericMetadataResolver<any>> | undefined): SerializerContext<TType>\r\n {\r\n this.serializerContextOptions.genericMetadataResolvers = genericMetadataResolvers;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures property metadata\r\n * \r\n * @param {PropertyMetadata<any,TType>|undefined} propertyMetadata Property metadata.\r\n * \r\n * @returns {SerializerContext<TType>} Current instance of serializer context.\r\n */\r\n public hasPropertyMetadata(propertyMetadata: PropertyMetadata<any, TType> | undefined): SerializerContext<TType>\r\n {\r\n this.serializerContextOptions.propertyMetadata = propertyMetadata;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures type metadata\r\n * \r\n * @param {TypeMetadata<TType>} typeMetadata Type metadata.\r\n * \r\n * @returns {SerializerContext<TType>} Current instance of serializer context.\r\n */\r\n public hasTypeMetadata(typeMetadata: TypeMetadata<TType>): SerializerContext<TType>\r\n {\r\n this.serializerContextOptions.typeMetadata = typeMetadata;\r\n\r\n return this;\r\n }\r\n \r\n /**\r\n * Configures serializer context based on provided options.\r\n * \r\n * @param {SerializerContextOptions<TType>} serializerContextOptions Serializer context options.\r\n * \r\n * @returns {SerializerContext<TType>} Current instance of serializer context.\r\n */\r\n public configure(serializerContextOptions: SerializerContextOptions<TType>): SerializerContext<TType>\r\n {\r\n if (!isUndefined(serializerContextOptions.jsonPathKey))\r\n {\r\n this.hasJsonPathKey(serializerContextOptions.jsonPathKey);\r\n }\r\n\r\n if (!isUndefined(serializerContextOptions.referenceValueSetter))\r\n {\r\n this.hasReferenceValueSetter(serializerContextOptions.referenceValueSetter);\r\n }\r\n\r\n if (!isUndefined(serializerContextOptions.genericStructures))\r\n {\r\n this.hasGenericStructures(serializerContextOptions.genericStructures);\r\n }\r\n\r\n if (!isUndefined(serializerContextOptions.genericMetadataResolvers))\r\n {\r\n this.hasGenericMetadataResolvers(serializerContextOptions.genericMetadataResolvers);\r\n }\r\n\r\n if (!isUndefined(serializerContextOptions.propertyMetadata))\r\n {\r\n this.hasPropertyMetadata(serializerContextOptions.propertyMetadata);\r\n }\r\n\r\n if (!isUndefined(serializerContextOptions.typeMetadata))\r\n {\r\n this.hasTypeMetadata(serializerContextOptions.typeMetadata);\r\n }\r\n\r\n return this;\r\n }\r\n}\r\n","import { isNull, isUndefined } from 'lodash';\r\nimport { Serializer } from '../serializer';\r\nimport { SerializerContext } from '../serializer-context';\r\nimport { TypeLike } from '../type-like';\r\n\r\n/**\r\n * Any serializer.\r\n * \r\n * @type {AnySerializer}\r\n */\r\nexport class AnySerializer implements Serializer<any>\r\n{\r\n /**\r\n * Serializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<any>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Serialized value or undefined.\r\n */\r\n public serialize(x: TypeLike<any>, serializerContext: SerializerContext<any>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.serializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.serializedNullValue;\r\n }\r\n\r\n return x;\r\n }\r\n\r\n /**\r\n * Deserializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<any>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Deserialized value.\r\n */\r\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<any>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.deserializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.deserializedNullValue;\r\n }\r\n\r\n return x;\r\n }\r\n}\r\n","import { isArrayBuffer, isNull, isString, isUndefined } from 'lodash';\r\nimport { Serializer } from '../serializer';\r\nimport { SerializerContext } from '../serializer-context';\r\nimport { TypeLike } from '../type-like';\r\n\r\n/**\r\n * Array buffer serializer.\r\n * \r\n * @type {ArrayBufferSerializer}\r\n */\r\nexport class ArrayBufferSerializer implements Serializer<ArrayBuffer>\r\n{\r\n /**\r\n * Serializes provided value.\r\n * \r\n * @param {TypeLike<ArrayBuffer>} x Some value.\r\n * @param {SerializerContext<ArrayBuffer>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Serialized value or undefined.\r\n */\r\n public serialize(x: TypeLike<ArrayBuffer>, serializerContext: SerializerContext<ArrayBuffer>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.serializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.serializedNullValue;\r\n }\r\n\r\n if (isArrayBuffer(x))\r\n {\r\n const arrayBufferView = new Uint16Array(x);\r\n const charCodeArray = Array.from(arrayBufferView);\r\n\r\n return charCodeArray.map(c => String.fromCharCode(c)).join('');\r\n }\r\n\r\n if (serializerContext.log.errorEnabled)\r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as array buffer.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Deserializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<ArrayBuffer>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<ArrayBuffer>} Deserialized value.\r\n */\r\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<ArrayBuffer>): TypeLike<ArrayBuffer>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.deserializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.deserializedNullValue;\r\n }\r\n\r\n if (isString(x))\r\n {\r\n const arrayBuffer = new ArrayBuffer(x.length * 2);\r\n const arrayBufferView = new Uint16Array(arrayBuffer);\r\n \r\n for (let i = 0; i < x.length; i++)\r\n {\r\n arrayBufferView[i] = x.charCodeAt(i);\r\n }\r\n \r\n return arrayBuffer;\r\n }\r\n \r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as array buffer.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n","import { isArray, isNull, isUndefined } from 'lodash';\r\nimport { Serializer } from '../serializer';\r\nimport { SerializerContext } from '../serializer-context';\r\nimport { TypeLike } from '../type-like';\r\n\r\n/**\r\n * Array serializer.\r\n * \r\n * @type {ArraySerializer}\r\n */\r\nexport class ArraySerializer implements Serializer<Array<any>>\r\n{\r\n /**\r\n * Serializes provided value.\r\n * \r\n * @param {TypeLike<Array<any>>} x Some value.\r\n * @param {SerializerContext<Array<any>>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Serialized value or undefined.\r\n */\r\n public serialize(x: TypeLike<Array<any>>, serializerContext: SerializerContext<Array<any>>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.serializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.serializedNullValue;\r\n }\r\n\r\n if (isArray(x))\r\n {\r\n return serializerContext.defineReference(x, () =>\r\n {\r\n const arrayInput = x;\r\n const arrayOutput = new Array<any>(x.length);\r\n const genericSerializerContext = serializerContext.defineGenericSerializerContext(0);\r\n \r\n const valueSerializerContext = genericSerializerContext.defineChildSerializerContext({ \r\n jsonPathKey: genericSerializerContext.jsonPathKey \r\n });\r\n\r\n for (let i = 0; i < arrayInput.length; i++)\r\n {\r\n valueSerializerContext.hasJsonPathKey(i);\r\n valueSerializerContext.hasReferenceValueSetter(v => arrayOutput[i] = v);\r\n\r\n arrayOutput[i] = valueSerializerContext.serialize(arrayInput[i]);\r\n }\r\n \r\n return arrayOutput;\r\n });\r\n }\r\n\r\n if (serializerContext.log.errorEnabled)\r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as array.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Deserializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<Array<any>>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<Array<any>>} Deserialized value.\r\n */\r\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Array<any>>): TypeLike<Array<any>>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.deserializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.deserializedNullValue;\r\n }\r\n\r\n if (isArray(x))\r\n {\r\n return serializerContext.restoreReference(x, () =>\r\n {\r\n const arrayInput = x;\r\n const arrayOutput = new Array<any>(x.length);\r\n const genericSerializerContext = serializerContext.defineGenericSerializerContext(0);\r\n\r\n const valueSerializerContext = genericSerializerContext.defineChildSerializerContext({ \r\n jsonPathKey: genericSerializerContext.jsonPathKey \r\n });\r\n \r\n for (let i = 0; i < arrayInput.length; i++)\r\n {\r\n valueSerializerContext.hasJsonPathKey(i);\r\n valueSerializerContext.hasReferenceValueSetter(v => arrayOutput[i] = v);\r\n \r\n arrayOutput[i] = valueSerializerContext.deserialize(arrayInput[i]);\r\n }\r\n \r\n return arrayOutput;\r\n });\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as array.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n","import { isBoolean, isNull, isNumber, isString, isUndefined } from 'lodash';\r\nimport { Serializer } from '../serializer';\r\nimport { SerializerContext } from '../serializer-context';\r\nimport { TypeLike } from '../type-like';\r\n\r\n/**\r\n * Boolean serializer.\r\n * \r\n * @type {BooleanSerializer}\r\n */\r\nexport class BooleanSerializer implements Serializer<boolean>\r\n{\r\n /**\r\n * Serializes provided value.\r\n * \r\n * @param {TypeLike<boolean>} x Some value.\r\n * @param {SerializerContext<boolean>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Serialized value or undefined.\r\n */\r\n public serialize(x: TypeLike<boolean>, serializerContext: SerializerContext<boolean>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.serializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.serializedNullValue;\r\n }\r\n\r\n if (isBoolean(x))\r\n {\r\n return x;\r\n }\r\n\r\n if (serializerContext.useImplicitConversion) \r\n {\r\n return this.convert(x, serializerContext);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as boolean.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Deserializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<boolean>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<boolean>} Deserialized value.\r\n */\r\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<boolean>): TypeLike<boolean>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.deserializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.deserializedNullValue;\r\n }\r\n\r\n if (isBoolean(x))\r\n {\r\n return x;\r\n }\r\n\r\n if (serializerContext.useImplicitConversion) \r\n {\r\n return this.convert(x, serializerContext);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as boolean.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Converts provided value to the target type value.\r\n * \r\n * @param {any} x Some value.\r\n * @param {SerializerContext<boolean>} serializerContext Type serializer context.\r\n * \r\n * @returns {boolean|undefined} Converted value or undefined.\r\n */\r\n private convert(x: any, serializerContext: SerializerContext<boolean>): boolean | undefined\r\n {\r\n if (isString(x) && (x === 'true' || x === 'false'))\r\n {\r\n return x === 'true';\r\n }\r\n\r\n if (isString(x) && (x === '1' || x === '0'))\r\n {\r\n return x === '1';\r\n }\r\n\r\n if (isNumber(x) && (x === 1 || x === 0))\r\n {\r\n return x === 1;\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot convert value to boolean.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n","import { isNull, isString, isUndefined } from 'lodash';\r\nimport { isDataView } from '../functions/is-data-view';\r\nimport { Serializer } from '../serializer';\r\nimport { SerializerContext } from '../serializer-context';\r\nimport { TypeLike } from '../type-like';\r\n\r\n/**\r\n * Data view serializer.\r\n * \r\n * @type {DataViewSerializer}\r\n */\r\nexport class DataViewSerializer implements Serializer<DataView>\r\n{\r\n /**\r\n * Serializes provided value.\r\n * \r\n * @param {TypeLike<DataView>} x Some value.\r\n * @param {SerializerContext<DataView>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Serialized value or undefined.\r\n */\r\n public serialize(x: TypeLike<DataView>, serializerContext: SerializerContext<DataView>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.serializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.serializedNullValue;\r\n }\r\n\r\n if (isDataView(x))\r\n {\r\n const arrayBufferView = new Uint16Array(x.buffer);\r\n const charCodeArray = Array.from(arrayBufferView);\r\n\r\n return charCodeArray.map(c => String.fromCharCode(c)).join('');\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as data view.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Deserializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<DataView>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<DataView>} Deserialized value.\r\n */\r\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<DataView>): TypeLike<DataView>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.deserializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.deserializedNullValue;\r\n }\r\n\r\n if (isString(x))\r\n {\r\n const arrayBuffer = new ArrayBuffer(x.length * 2);\r\n const arrayBufferView = new Uint16Array(arrayBuffer);\r\n \r\n for (let i = 0; i < x.length; i++)\r\n {\r\n arrayBufferView[i] = x.charCodeAt(i);\r\n }\r\n \r\n return new DataView(arrayBuffer);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as data view.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n","import { isDate, isNull, isString, isUndefined } from 'lodash';\r\nimport { Serializer } from '../serializer';\r\nimport { SerializerContext } from '../serializer-context';\r\nimport { TypeLike } from '../type-like';\r\n\r\n/**\r\n * Date serializer.\r\n * \r\n * @type {DateSerializer}\r\n */\r\nexport class DateSerializer implements Serializer<Date>\r\n{\r\n /**\r\n * Serializes provided value.\r\n * \r\n * @param {TypeLike<Date>} x Some value.\r\n * @param {SerializerContext<Date>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Serialized value or undefined.\r\n */\r\n public serialize(x: TypeLike<Date>, serializerContext: SerializerContext<Date>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.serializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.serializedNullValue;\r\n }\r\n\r\n if (isDate(x))\r\n {\r\n return x.toISOString();\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as date.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Deserializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<Date>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<Date>} Deserialized value.\r\n */\r\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Date>): TypeLike<Date>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.deserializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.deserializedNullValue;\r\n }\r\n\r\n if (isString(x))\r\n {\r\n return new Date(x);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as date.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n","import { isArray, isNull, isUndefined } from 'lodash';\r\nimport { isFloat32Array } from '../functions/is-float-32-array';\r\nimport { Serializer } from '../serializer';\r\nimport { SerializerContext } from '../serializer-context';\r\nimport { TypeLike } from '../type-like';\r\n\r\n/**\r\n * Float 32 array serializer.\r\n * \r\n * @type {Float32ArraySerializer}\r\n */\r\nexport class Float32ArraySerializer implements Serializer<Float32Array>\r\n{\r\n /**\r\n * Serializes provided value.\r\n * \r\n * @param {TypeLike<Float32Array>} x Some value.\r\n * @param {SerializerContext<Float32Array>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Serialized value or undefined.\r\n */\r\n public serialize(x: TypeLike<Float32Array>, serializerContext: SerializerContext<Float32Array>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.serializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.serializedNullValue;\r\n }\r\n\r\n if (isFloat32Array(x))\r\n {\r\n return Array.from(x);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as float 32 array.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Deserializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<Float32Array>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<Float32Array>} Deserialized value.\r\n */\r\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Float32Array>): TypeLike<Float32Array>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.deserializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.deserializedNullValue;\r\n }\r\n\r\n if (isArray(x))\r\n {\r\n return Float32Array.from(x);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as float 32 array.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n","import { isArray, isNull, isUndefined } from 'lodash';\r\nimport { isFloat64Array } from '../functions/is-float-64-array';\r\nimport { Serializer } from '../serializer';\r\nimport { SerializerContext } from '../serializer-context';\r\nimport { TypeLike } from '../type-like';\r\n\r\n/**\r\n * Float 64 array serializer.\r\n * \r\n * @type {Float64ArraySerializer}\r\n */\r\nexport class Float64ArraySerializer implements Serializer<Float64Array>\r\n{\r\n /**\r\n * Serializes provided value.\r\n * \r\n * @param {TypeLike<Float64Array>} x Some value.\r\n * @param {SerializerContext<Float64Array>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Serialized value or undefined.\r\n */\r\n public serialize(x: TypeLike<Float64Array>, serializerContext: SerializerContext<Float64Array>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.serializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.serializedNullValue;\r\n }\r\n\r\n if (isFloat64Array(x))\r\n {\r\n return Array.from(x);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as float 64 array.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Deserializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<Float64Array>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<Float64Array>} Deserialized value.\r\n */\r\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Float64Array>): TypeLike<Float64Array>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.deserializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.deserializedNullValue;\r\n }\r\n\r\n if (isArray(x))\r\n {\r\n return Float64Array.from(x);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value to a float 64 array.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n","export * from './any-serializer';\r\nexport * from './array-buffer-serializer';\r\nexport * from './array-serializer';\r\nexport * from './boolean-serializer';\r\nexport * from './data-view-serializer';\r\nexport * from './date-serializer';\r\nexport * from './float-32-array-serializer';\r\nexport * from './float-64-array-serializer';\r\nexport * from './int-8-array-serializer';\r\nexport * from './int-16-array-serializer';\r\nexport * from './int-32-array-serializer';\r\nexport * from './map-serializer';\r\nexport * from './number-serializer';\r\nexport * from './set-serializer';\r\nexport * from './string-serializer';\r\nexport * from './type-serializer';\r\nexport * from './uint-8-array-serializer';\r\nexport * from './uint-8-clamped-array-serializer';\r\nexport * from './uint-16-array-serializer';\r\nexport * from './uint-32-array-serializer';\r\nexport * from './unknown-serializer';\r\n","import { isArray, isNull, isUndefined } from 'lodash';\r\nimport { isInt16Array } from '../functions/is-int-16-array';\r\nimport { Serializer } from '../serializer';\r\nimport { SerializerContext } from '../serializer-context';\r\nimport { TypeLike } from '../type-like';\r\n\r\n/**\r\n * Int 16 array serializer.\r\n * \r\n * @type {Int16ArraySerializer}\r\n */\r\nexport class Int16ArraySerializer implements Serializer<Int16Array>\r\n{\r\n /**\r\n * Serializes provided value.\r\n * \r\n * @param {TypeLike<Int16Array>} x Some value.\r\n * @param {SerializerContext<Int16Array>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Serialized value or undefined.\r\n */\r\n public serialize(x: TypeLike<Int16Array>, serializerContext: SerializerContext<Int16Array>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.serializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.serializedNullValue;\r\n }\r\n\r\n if (isInt16Array(x))\r\n {\r\n return Array.from(x);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as int 16 array.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Deserializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<Int16Array>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<Int16Array>} Deserialized value.\r\n */\r\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Int16Array>): TypeLike<Int16Array>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.deserializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.deserializedNullValue;\r\n }\r\n\r\n if (isArray(x))\r\n {\r\n return Int16Array.from(x);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as int 16 array.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n","import { isArray, isNull, isUndefined } from 'lodash';\r\nimport { isInt32Array } from '../functions/is-int-32-array';\r\nimport { Serializer } from '../serializer';\r\nimport { SerializerContext } from '../serializer-context';\r\nimport { TypeLike } from '../type-like';\r\n\r\n/**\r\n * Int 32 array serializer.\r\n * \r\n * @type {Int32ArraySerializer}\r\n */\r\nexport class Int32ArraySerializer implements Serializer<Int32Array>\r\n{\r\n /**\r\n * Serializes provided value.\r\n * \r\n * @param {TypeLike<Int32Array>} x Some value.\r\n * @param {SerializerContext<Int32Array>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Serialized value or undefined.\r\n */\r\n public serialize(x: TypeLike<Int32Array>, serializerContext: SerializerContext<Int32Array>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.serializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.serializedNullValue;\r\n }\r\n\r\n if (isInt32Array(x))\r\n {\r\n return Array.from(x);\r\n }\r\n \r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as int 32 array.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Deserializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<Int32Array>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<Int32Array>} Deserialized value.\r\n */\r\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Int32Array>): TypeLike<Int32Array>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.deserializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.deserializedNullValue;\r\n }\r\n\r\n if (isArray(x))\r\n {\r\n return Int32Array.from(x);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as int 32 array.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n","import { isArray, isNull, isUndefined } from 'lodash';\r\nimport { isInt8Array } from '../functions/is-int-8-array';\r\nimport { Serializer } from '../serializer';\r\nimport { SerializerContext } from '../serializer-context';\r\nimport { TypeLike } from '../type-like';\r\n\r\n/**\r\n * Int 8 array serializer.\r\n * \r\n * @type {Int8ArraySerializer}\r\n */\r\nexport class Int8ArraySerializer implements Serializer<Int8Array>\r\n{\r\n /**\r\n * Serializes provided value.\r\n * \r\n * @param {TypeLike<Int8Array>} x Some value.\r\n * @param {SerializerContext<Int8Array>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Serialized value or undefined.\r\n */\r\n public serialize(x: TypeLike<Int8Array>, serializerContext: SerializerContext<Int8Array>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.serializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.serializedNullValue;\r\n }\r\n\r\n if (isInt8Array(x))\r\n {\r\n return Array.from(x);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as int 8 array.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Deserializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<Int8Array>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<Int8Array>} Deserialized value.\r\n */\r\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Int8Array>): TypeLike<Int8Array>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.deserializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.deserializedNullValue;\r\n }\r\n\r\n if (isArray(x))\r\n {\r\n return Int8Array.from(x);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as int 8 array.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n","import { isArray, isMap, isNull, isUndefined } from 'lodash';\r\nimport { Serializer } from '../serializer';\r\nimport { SerializerContext } from '../serializer-context';\r\nimport { TypeLike } from '../type-like';\r\n\r\n/**\r\n * Map serializer.\r\n * \r\n * @type {MapSerializer}\r\n */\r\nexport class MapSerializer implements Serializer<Map<any, any>>\r\n{\r\n /**\r\n * Serializes provided value.\r\n * \r\n * @param {TypeLike<Map<any, any>>} x Some value.\r\n * @param {SerializerContext<Map<any, any>>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Serialized value or undefined.\r\n */\r\n public serialize(x: TypeLike<Map<any, any>>, serializerContext: SerializerContext<Map<any, any>>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.serializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.serializedNullValue;\r\n }\r\n\r\n if (isMap(x))\r\n {\r\n return serializerContext.defineReference(x, () =>\r\n {\r\n const map = x;\r\n const array = new Array<any>(x.keys.length);\r\n const genericKeySerializerContext = serializerContext.defineGenericSerializerContext(0);\r\n const genericValueSerializerContext = serializerContext.defineGenericSerializerContext(1);\r\n\r\n const keyArraySerializerContext = genericKeySerializerContext.defineChildSerializerContext({ \r\n jsonPathKey: genericKeySerializerContext.jsonPathKey \r\n });\r\n\r\n const valueArraySerializerContext = genericValueSerializerContext.defineChildSerializerContext({ \r\n jsonPathKey: genericValueSerializerContext.jsonPathKey \r\n });\r\n\r\n const keySerializerContext = keyArraySerializerContext.defineChildSerializerContext({\r\n jsonPathKey: 'key',\r\n typeMetadata: genericKeySerializerContext.typeMetadata\r\n });\r\n\r\n const valueSerializerContext = valueArraySerializerContext.defineChildSerializerContext({\r\n jsonPathKey: 'value',\r\n typeMetadata: genericValueSerializerContext.typeMetadata\r\n });\r\n \r\n let i = -1;\r\n\r\n for (const [mk, mv] of map.entries())\r\n {\r\n i++;\r\n\r\n keyArraySerializerContext.hasJsonPathKey(i);\r\n valueArraySerializerContext.hasJsonPathKey(i);\r\n keySerializerContext.hasReferenceValueSetter(v => array[i][keySerializerContext.jsonPathKey] = v);\r\n valueSerializerContext.hasReferenceValueSetter(v => array[i][valueSerializerContext.jsonPathKey] = v);\r\n\r\n array[i] = {};\r\n array[i][keySerializerContext.jsonPathKey] = keySerializerContext.serialize(mk);\r\n array[i][valueSerializerContext.jsonPathKey] = valueSerializerContext.serialize(mv);\r\n }\r\n\r\n return array;\r\n });\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as map.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Deserializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<Map<any, any>>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<Map<any, any>>} Deserialized value.\r\n */\r\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Map<any, any>>): TypeLike<Map<any, any>>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.deserializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.deserializedNullValue;\r\n }\r\n\r\n if (isArray(x))\r\n {\r\n return serializerContext.restoreReference(x, () =>\r\n {\r\n const array = x;\r\n const map = new Map<any, any>();\r\n const genericKeySerializerContext = serializerContext.defineGenericSerializerContext(0);\r\n const genericValueSerializerContext = serializerContext.defineGenericSerializerContext(1);\r\n\r\n const keyArraySerializerContext = genericKeySerializerContext.defineChildSerializerContext({ \r\n jsonPathKey: genericKeySerializerContext.jsonPathKey \r\n });\r\n \r\n const valueArraySerializerContext = genericValueSerializerContext.defineChildSerializerContext({ \r\n jsonPathKey: genericValueSerializerContext.jsonPathKey \r\n });\r\n\r\n const keySerializerContext = keyArraySerializerContext.defineChildSerializerContext({\r\n jsonPathKey: 'key',\r\n typeMetadata: genericKeySerializerContext.typeMetadata\r\n });\r\n\r\n const valueSerializerContext = valueArraySerializerContext.defineChildSerializerContext({\r\n jsonPathKey: 'value',\r\n typeMetadata: genericValueSerializerContext.typeMetadata\r\n });\r\n\r\n for (let i = 0; i < array.length; i++)\r\n {\r\n const mk = array[i][keySerializerContext.jsonPathKey];\r\n const mv = array[i][valueSerializerContext.jsonPathKey];\r\n\r\n keyArraySerializerContext.hasJsonPathKey(i);\r\n valueArraySerializerContext.hasJsonPathKey(i);\r\n\r\n keySerializerContext.hasReferenceValueSetter(v => map.set(v, undefined));\r\n\r\n const key = keySerializerContext.deserialize(mk);\r\n\r\n valueSerializerContext.hasReferenceValueSetter(v => map.set(key, v));\r\n \r\n const value = valueSerializerContext.deserialize(mv);\r\n \r\n map.set(key, value);\r\n }\r\n\r\n return map;\r\n });\r\n }\r\n\r\n if (serializerContext.log.errorEnabled)\r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: Cannot deserialize value as map!`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n","import { isBoolean, isNull, isNumber, isString, isUndefined } from 'lodash';\r\nimport { Serializer } from '../serializer';\r\nimport { SerializerContext } from '../serializer-context';\r\nimport { TypeLike } from '../type-like';\r\n\r\n/**\r\n * Number serializer.\r\n * \r\n * @type {NumberSerializer}\r\n */\r\nexport class NumberSerializer implements Serializer<number>\r\n{\r\n /**\r\n * Serializes provided value.\r\n * \r\n * @param {TypeLike<number>} x Some value.\r\n * @param {SerializerContext<number>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Serialized value or undefined.\r\n */\r\n public serialize(x: TypeLike<number>, serializerContext: SerializerContext<number>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.serializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.serializedNullValue;\r\n }\r\n\r\n if (isNumber(x))\r\n {\r\n return x;\r\n }\r\n\r\n if (serializerContext.useImplicitConversion) \r\n {\r\n return this.convert(x, serializerContext);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as number.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Deserializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<number>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<number>} Deserialized value.\r\n */\r\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<number>): TypeLike<number>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.deserializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.deserializedNullValue;\r\n }\r\n\r\n if (isNumber(x))\r\n {\r\n return x;\r\n }\r\n\r\n if (serializerContext.useImplicitConversion) \r\n {\r\n return this.convert(x, serializerContext);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as number.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Converts provided value to the target type value.\r\n * \r\n * @param {any} x Some value.\r\n * @param {SerializerContext<number>} serializerContext Serializer context.\r\n * \r\n * @returns {number|undefined} Converted value or undefined.\r\n */\r\n private convert(x: any, serializerContext: SerializerContext<number>): number | undefined\r\n {\r\n if (isString(x) || isBoolean(x))\r\n {\r\n return Number(x);\r\n }\r\n \r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot convert value to a number.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n","import { isArray, isNull, isSet, isUndefined } from 'lodash';\r\nimport { Serializer } from '../serializer';\r\nimport { SerializerContext } from '../serializer-context';\r\nimport { TypeLike } from '../type-like';\r\n\r\n/**\r\n * Set serializer.\r\n * \r\n * @type {SetSerializer}\r\n */\r\nexport class SetSerializer implements Serializer<Set<any>>\r\n{\r\n /**\r\n * Serializes provided value.\r\n * \r\n * @param {TypeLike<Set<any>>} x Some value.\r\n * @param {SerializerContext<Set<any>>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Serialized value or undefined.\r\n */\r\n public serialize(x: TypeLike<Set<any>>, serializerContext: SerializerContext<Set<any>>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.serializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.serializedNullValue;\r\n }\r\n\r\n if (isSet(x))\r\n {\r\n return serializerContext.defineReference(x, () =>\r\n {\r\n const set = x;\r\n const array = new Array<any>();\r\n const genericSerializerContext = serializerContext.defineGenericSerializerContext(0);\r\n\r\n const valueSerializerContext = genericSerializerContext.defineChildSerializerContext({ \r\n jsonPathKey: genericSerializerContext.jsonPathKey \r\n });\r\n\r\n let i = -1;\r\n \r\n for (const v of set)\r\n {\r\n i++;\r\n\r\n valueSerializerContext.hasJsonPathKey(i);\r\n valueSerializerContext.hasReferenceValueSetter(v => array[i] = v);\r\n\r\n array[i] = valueSerializerContext.serialize(v);\r\n }\r\n\r\n return array;\r\n });\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as set.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Deserializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<Set<any>>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<Set<any>>} Deserialized value.\r\n */\r\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Set<any>>): TypeLike<Set<any>>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.deserializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.deserializedNullValue;\r\n }\r\n\r\n if (isArray(x))\r\n {\r\n return serializerContext.restoreReference(x, () =>\r\n {\r\n const array = x;\r\n const set = new Set<any>();\r\n const genericSerializerContext = serializerContext.defineGenericSerializerContext(0);\r\n \r\n const valueSerializerContext = genericSerializerContext.defineChildSerializerContext({ \r\n jsonPathKey: genericSerializerContext.jsonPathKey \r\n });\r\n \r\n for (let i = 0; i < array.length; i++)\r\n {\r\n valueSerializerContext.hasJsonPathKey(i);\r\n valueSerializerContext.hasReferenceValueSetter(v => set.add(v));\r\n\r\n set.add(valueSerializerContext.deserialize(array[i]));\r\n }\r\n\r\n return set;\r\n });\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as set.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n","import { isBoolean, isDate, isNull, isNumber, isObject, isString, isUndefined } from 'lodash';\r\nimport { Serializer } from '../serializer';\r\nimport { SerializerContext } from '../serializer-context';\r\nimport { TypeLike } from '../type-like';\r\n\r\n/**\r\n * String serializer.\r\n * \r\n * @type {StringSerializer}\r\n */\r\nexport class StringSerializer implements Serializer<string>\r\n{\r\n /**\r\n * Serializes provided value.\r\n * \r\n * @param {TypeLike<string>} x Some value.\r\n * @param {SerializerContext<string>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Serialized value or undefined.\r\n */\r\n public serialize(x: TypeLike<string>, serializerContext: SerializerContext<string>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.serializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.serializedNullValue;\r\n }\r\n\r\n if (isString(x))\r\n {\r\n return x;\r\n }\r\n \r\n if (serializerContext.useImplicitConversion) \r\n {\r\n return this.convert(x, serializerContext);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as string.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Deserializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<string>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<string>} Deserialized value.\r\n */\r\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<string>): TypeLike<string>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.deserializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.deserializedNullValue;\r\n }\r\n\r\n if (isString(x))\r\n {\r\n return x;\r\n }\r\n\r\n if (serializerContext.useImplicitConversion) \r\n {\r\n return this.convert(x, serializerContext);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as string.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Converts provided value to the target type value.\r\n * \r\n * @param {any} x Some value.\r\n * @param {SerializerContext<string>} serializerContext Type serializer context.\r\n * \r\n * @returns {string|undefined} Converted value or original value.\r\n */\r\n private convert(x: any, serializerContext: SerializerContext<string>): string | undefined\r\n {\r\n if (isNumber(x) || isBoolean(x)) \r\n {\r\n return String(x);\r\n }\r\n\r\n if (isDate(x))\r\n {\r\n return x.toISOString();\r\n }\r\n\r\n if (isObject(x))\r\n {\r\n return JSON.stringify(x);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot convert value to string.`, x);\r\n }\r\n \r\n return undefined;\r\n }\r\n}\r\n","import { isNil, isNull, isObject, isUndefined } from 'lodash';\r\nimport { Serializer } from '../serializer';\r\nimport { SerializerContext } from '../serializer-context';\r\nimport { TypeContext } from '../type-context';\r\nimport { TypeContextEntry } from '../type-context-entry';\r\nimport { TypeLike } from '../type-like';\r\n\r\n/**\r\n * Type serializer.\r\n * \r\n * @type {TypeSerializer}\r\n */\r\nexport class TypeSerializer implements Serializer<Record<string, any>>\r\n{\r\n /**\r\n * Serializes provided value.\r\n * \r\n * @param {TypeLike<Record<string, any>>} x Some value.\r\n * @param {SerializerContext<Record<string, any>>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Serialized value or undefined.\r\n */\r\n public serialize(x: TypeLike<Record<string, any>>, serializerContext: SerializerContext<Record<string, any>>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.serializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.serializedNullValue;\r\n }\r\n\r\n if (isObject(x))\r\n {\r\n return serializerContext.defineReference(x, () =>\r\n {\r\n const type = x as Record<string, any>;\r\n\r\n const typeSerializerContext = serializerContext.polymorphic \r\n ? serializerContext.definePolymorphicSerializerContext(x.constructor) \r\n : serializerContext;\r\n\r\n const propertySerializerContext = typeSerializerContext.defineChildSerializerContext({ \r\n jsonPathKey: typeSerializerContext.jsonPathKey \r\n });\r\n\r\n const typeMetadata = typeSerializerContext.typeMetadata;\r\n const object = {} as Record<string, any>;\r\n\r\n for (const propertyMetadata of typeMetadata.sortedPropertyMetadatas)\r\n {\r\n if (propertyMetadata.serializationConfigured && !propertyMetadata.serializable)\r\n {\r\n continue;\r\n }\r\n\r\n const serializedPropertyName = propertyMetadata.serializedPropertyName;\r\n const deserializedPropertyName = propertyMetadata.deserializedPropertyName;\r\n const propertyValue = type[deserializedPropertyName];\r\n\r\n propertySerializerContext.hasJsonPathKey(serializedPropertyName);\r\n propertySerializerContext.hasPropertyMetadata(propertyMetadata);\r\n propertySerializerContext.hasTypeMetadata(propertyMetadata.typeMetadata);\r\n propertySerializerContext.hasGenericStructures(propertyMetadata.genericStructures);\r\n propertySerializerContext.hasGenericMetadataResolvers(propertyMetadata.genericMetadataResolvers);\r\n \r\n propertySerializerContext.hasReferenceValueSetter(v => \r\n {\r\n const declaringObject = propertySerializerContext.referenceMap.get(type);\r\n \r\n if (!isNil(declaringObject))\r\n {\r\n declaringObject[serializedPropertyName] = v;\r\n }\r\n });\r\n\r\n const value = propertySerializerContext.serialize(propertyValue);\r\n\r\n object[serializedPropertyName] = value;\r\n }\r\n\r\n if (typeSerializerContext.preserveDiscriminator)\r\n {\r\n object[typeSerializerContext.discriminator] = typeSerializerContext.discriminant;\r\n } \r\n else if (object.hasOwnProperty(typeSerializerContext.discriminator))\r\n {\r\n delete object[typeSerializerContext.discriminator];\r\n }\r\n\r\n return object;\r\n });\r\n }\r\n\r\n if (serializerContext.log.errorEnabled)\r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as type.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Deserializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<Record<string, any>>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<Record<string, any>>} Deserialized value or undefined.\r\n */\r\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Record<string, any>>): TypeLike<Record<string, any>>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.deserializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.deserializedNullValue;\r\n }\r\n\r\n if (isObject(x))\r\n {\r\n return serializerContext.restoreReference(x, () =>\r\n {\r\n const object = x as Record<string, any>;\r\n\r\n const typeSerializerContext = serializerContext.polymorphic \r\n ? serializerContext.definePolymorphicSerializerContext(x) \r\n : serializerContext;\r\n \r\n const propertySerializerContext = typeSerializerContext.defineChildSerializerContext({ \r\n jsonPathKey: typeSerializerContext.jsonPath \r\n });\r\n\r\n const typeMetadata = typeSerializerContext.typeMetadata;\r\n const typeContext = new TypeContext(typeMetadata);\r\n\r\n for (const propertyMetadata of typeMetadata.sortedPropertyMetadatas)\r\n {\r\n if (propertyMetadata.serializationConfigured && !propertyMetadata.deserializable)\r\n {\r\n continue;\r\n }\r\n\r\n const serializedPropertyName = propertyMetadata.serializedPropertyName;\r\n const deserializedPropertyName = propertyMetadata.deserializedPropertyName;\r\n const propertyValue = object[serializedPropertyName];\r\n\r\n propertySerializerContext.hasJsonPathKey(deserializedPropertyName);\r\n propertySerializerContext.hasPropertyMetadata(propertyMetadata);\r\n propertySerializerContext.hasTypeMetadata(propertyMetadata.typeMetadata);\r\n propertySerializerContext.hasGenericStructures(propertyMetadata.genericStructures);\r\n propertySerializerContext.hasGenericMetadataResolvers(propertyMetadata.genericMetadataResolvers);\r\n\r\n propertySerializerContext.hasReferenceValueSetter(v => \r\n {\r\n const declaringType = propertySerializerContext.referenceMap.get(object);\r\n \r\n if (!isNil(declaringType))\r\n {\r\n declaringType[deserializedPropertyName] = v;\r\n }\r\n });\r\n\r\n const value = propertySerializerContext.deserialize(propertyValue);\r\n\r\n typeContext.set(deserializedPropertyName, new TypeContextEntry(deserializedPropertyName, value, propertyMetadata));\r\n typeContext.set(serializedPropertyName, new TypeContextEntry(serializedPropertyName, value, propertyMetadata));\r\n }\r\n\r\n for (const propertyName in object)\r\n {\r\n if (object.hasOwnProperty(propertyName))\r\n {\r\n typeContext.set(propertyName, new TypeContextEntry(propertyName, object[propertyName]));\r\n }\r\n }\r\n \r\n const factory = typeSerializerContext.factory;\r\n const injector = typeSerializerContext.injector;\r\n const type = factory.build(typeContext, injector);\r\n\r\n if (typeSerializerContext.preserveDiscriminator)\r\n {\r\n type[typeSerializerContext.discriminator] = typeSerializerContext.discriminant;\r\n }\r\n else if (type.hasOwnProperty(typeSerializerContext.discriminator))\r\n {\r\n delete type[typeSerializerContext.discriminator];\r\n }\r\n\r\n return type;\r\n });\r\n }\r\n \r\n if (serializerContext.log.errorEnabled)\r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as type.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n","import { isArray, isNull, isUndefined } from 'lodash';\r\nimport { isUint16Array } from '../functions/is-uint-16-array';\r\nimport { Serializer } from '../serializer';\r\nimport { SerializerContext } from '../serializer-context';\r\nimport { TypeLike } from '../type-like';\r\n\r\n/**\r\n * Uint 16 array serializer.\r\n * \r\n * @type {Uint16ArraySerializer}\r\n */\r\nexport class Uint16ArraySerializer implements Serializer<Uint16Array>\r\n{\r\n /**\r\n * Serializes provided value.\r\n * \r\n * @param {TypeLike<Uint16Array>} x Some value.\r\n * @param {SerializerContext<Uint16Array>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Serialized value or undefined.\r\n */\r\n public serialize(x: TypeLike<Uint16Array>, serializerContext: SerializerContext<Uint16Array>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.serializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.serializedNullValue;\r\n }\r\n\r\n if (isUint16Array(x))\r\n {\r\n return Array.from(x);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as uint 16 array.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Deserializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<Uint16Array>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<Uint16Array>} Deserialized value.\r\n */\r\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Uint16Array>): TypeLike<Uint16Array>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.deserializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.deserializedNullValue;\r\n }\r\n\r\n if (isArray(x))\r\n {\r\n return Uint16Array.from(x);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as uint 16 array.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n","import { isArray, isNull, isUndefined } from 'lodash';\r\nimport { isUint32Array } from '../functions/is-uint-32-array';\r\nimport { Serializer } from '../serializer';\r\nimport { SerializerContext } from '../serializer-context';\r\nimport { TypeLike } from '../type-like';\r\n\r\n/**\r\n * Uint 32 array serializer.\r\n * \r\n * @type {Uint32ArraySerializer}\r\n */\r\nexport class Uint32ArraySerializer implements Serializer<Uint32Array>\r\n{\r\n /**\r\n * Serializes provided value.\r\n * \r\n * @param {TypeLike<Uint32Array>} x Some value.\r\n * @param {SerializerContext<Uint32Array>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Serialized value or undefined.\r\n */\r\n public serialize(x: TypeLike<Uint32Array>, serializerContext: SerializerContext<Uint32Array>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.serializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.serializedNullValue;\r\n }\r\n\r\n if (isUint32Array(x))\r\n {\r\n return Array.from(x);\r\n }\r\n \r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as uint 32 array.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Deserializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<Uint32Array>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<Uint32Array>} Deserialized value.\r\n */\r\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Uint32Array>): TypeLike<Uint32Array>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.deserializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.deserializedNullValue;\r\n }\r\n\r\n if (isArray(x))\r\n {\r\n return Uint32Array.from(x);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as uint 32 array.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n","import { isArray, isNull, isUndefined } from 'lodash';\r\nimport { isUint8Array } from '../functions/is-uint-8-array';\r\nimport { Serializer } from '../serializer';\r\nimport { SerializerContext } from '../serializer-context';\r\nimport { TypeLike } from '../type-like';\r\n\r\n/**\r\n * Uint 8 array serializer.\r\n * \r\n * @type {Uint8ArraySerializer}\r\n */\r\nexport class Uint8ArraySerializer implements Serializer<Uint8Array>\r\n{\r\n /**\r\n * Serializes provided value.\r\n * \r\n * @param {TypeLike<Uint8Array>} x Some value.\r\n * @param {SerializerContext<Uint8Array>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Serialized value or undefined.\r\n */\r\n public serialize(x: TypeLike<Uint8Array>, serializerContext: SerializerContext<Uint8Array>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.serializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.serializedNullValue;\r\n }\r\n\r\n if (isUint8Array(x))\r\n {\r\n return Array.from(x);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as uint 8 array.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Deserializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<Uint8Array>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<Uint8Array>} Deserialized value.\r\n */\r\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Uint8Array>): TypeLike<Uint8Array>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.deserializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.deserializedNullValue;\r\n }\r\n\r\n if (isArray(x))\r\n {\r\n return Uint8Array.from(x);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as uint 8 array.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n","import { isArray, isNull, isUndefined } from 'lodash';\r\nimport { isUint8ClampedArray } from '../functions/is-uint-8-clamped-array';\r\nimport { Serializer } from '../serializer';\r\nimport { SerializerContext } from '../serializer-context';\r\nimport { TypeLike } from '../type-like';\r\n\r\n/**\r\n * Uint 8 clamped array serializer.\r\n * \r\n * @type {Uint8ClampedArraySerializer}\r\n */\r\nexport class Uint8ClampedArraySerializer implements Serializer<Uint8ClampedArray>\r\n{\r\n /**\r\n * Serializes provided value.\r\n * \r\n * @param {TypeLike<Uint8ClampedArray>} x Some value.\r\n * @param {SerializerContext<Uint8ClampedArray>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Serialized value or undefined.\r\n */\r\n public serialize(x: TypeLike<Uint8ClampedArray>, serializerContext: SerializerContext<Uint8ClampedArray>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.serializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.serializedNullValue;\r\n }\r\n\r\n if (isUint8ClampedArray(x))\r\n {\r\n return Array.from(x);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as uint 8 clamped array.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Deserializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<Uint8ClampedArray>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<Uint8ClampedArray>} Deserialized value.\r\n */\r\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Uint8ClampedArray>): TypeLike<Uint8ClampedArray>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.deserializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.deserializedNullValue;\r\n }\r\n\r\n if (isArray(x))\r\n {\r\n return Uint8ClampedArray.from(x);\r\n }\r\n\r\n if (serializerContext.log.errorEnabled) \r\n {\r\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as uint 8 clamped array.`, x);\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n","import { isNull, isUndefined } from 'lodash';\r\nimport { Serializer } from '../serializer';\r\nimport { SerializerContext } from '../serializer-context';\r\nimport { TypeLike } from '../type-like';\r\n\r\n/**\r\n * Unknown serializer.\r\n * \r\n * @type {UnknownSerializer}\r\n */\r\nexport class UnknownSerializer implements Serializer<unknown>\r\n{\r\n /**\r\n * Serializes provided value.\r\n * \r\n * @param {TypeLike<unknown>} x Some value.\r\n * @param {SerializerContext<unknown>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<any>} Serialized value or undefined.\r\n */\r\n public serialize(x: TypeLike<unknown>, serializerContext: SerializerContext<unknown>): TypeLike<any>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.serializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.serializedNullValue;\r\n }\r\n\r\n return x;\r\n }\r\n\r\n /**\r\n * Deserializes provided value.\r\n * \r\n * @param {TypeLike<any>} x Some value.\r\n * @param {SerializerContext<unknown>} serializerContext Serializer context.\r\n * \r\n * @returns {TypeLike<unknown>} Deserialized value.\r\n */\r\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<unknown>): TypeLike<unknown>\r\n {\r\n if (isUndefined(x))\r\n {\r\n return serializerContext.deserializedDefaultValue;\r\n }\r\n\r\n if (isNull(x))\r\n {\r\n return serializerContext.deserializedNullValue;\r\n }\r\n\r\n return x;\r\n }\r\n}\r\n","import { PropertyMetadata } from './property-metadata';\r\n\r\n/**\r\n * Represents a data entry defined within a scope of a type.\r\n * \r\n * @type {TypeContextEntry<TDeclaringType, TType>}\r\n */\r\nexport class TypeContextEntry<TDeclaringType, TType>\r\n{\r\n /**\r\n * Unique key.\r\n * \r\n * @type {string}\r\n */\r\n public readonly key: string;\r\n\r\n /**\r\n * Value behind a key. \r\n * \r\n * If property metadata is defined then this is deserialized value. Original otherwise.\r\n * \r\n * @type {any}\r\n */\r\n public readonly value: any;\r\n\r\n /**\r\n * Property metadata behind a key.\r\n * \r\n * @type {PropertyMetadata<TDeclaringType, TType>}\r\n */\r\n public readonly propertyMetadata?: PropertyMetadata<TDeclaringType, TType>;\r\n\r\n /**\r\n * Constructor.\r\n * \r\n * @param {string} key Unique key. \r\n * @param {any} value Value behind a key.\r\n * @param {PropertyMetadata<TDeclaringType, TType>} propertyMetadata Property metadata behind a key.\r\n */\r\n public constructor(key: string, value: any, propertyMetadata?: PropertyMetadata<TDeclaringType, TType>)\r\n {\r\n this.key = key;\r\n this.value = value;\r\n this.propertyMetadata = propertyMetadata;\r\n\r\n return;\r\n }\r\n}\r\n","import { isNil } from 'lodash';\r\nimport { TypeContextEntry } from './type-context-entry';\r\nimport { TypeMetadata } from './type-metadata';\r\n\r\n/**\r\n * Type context class to encapsulate type values before building an object.\r\n * \r\n * @type {TypeContext<TType>}\r\n */\r\nexport class TypeContext<TType>\r\n{\r\n /**\r\n * Type metadata.\r\n * \r\n * @type {TypeMetadata<TType>}\r\n */\r\n public readonly typeMetadata: TypeMetadata<TType>;\r\n\r\n /**\r\n * Type context entry map.\r\n * \r\n * @type {Map<string, TypeContextEntry<TType, any>>}\r\n */\r\n public readonly typeContextEntryMap: Map<string, TypeContextEntry<TType, any>> = new Map<string, TypeContextEntry<TType, any>>();\r\n\r\n /**\r\n * Constructor.\r\n * \r\n * @param {TypeMetadata<TType>} typeMetadata Type metadata.\r\n */\r\n public constructor(typeMetadata: TypeMetadata<TType>)\r\n {\r\n this.typeMetadata = typeMetadata;\r\n\r\n return;\r\n }\r\n\r\n /**\r\n * Sets value for key.\r\n * \r\n * @param {string} key Key.\r\n * @param {TypeContextEntry<TType, any>} value Value.\r\n * \r\n * @returns {TypeContext<TType>} Current type context.\r\n */\r\n public set(key: string, value: TypeContextEntry<TType, any>): TypeContext<TType>\r\n {\r\n const typeContextEntry = this.typeContextEntryMap.get(key);\r\n\r\n if (isNil(typeContextEntry))\r\n {\r\n this.typeContextEntryMap.set(key, value);\r\n }\r\n \r\n return this;\r\n }\r\n\r\n /**\r\n * Gets value by key.\r\n * \r\n * @param {string} key Key.\r\n * \r\n * @returns {TypeContextEntry<TType, any>} Type context entry or undefined.\r\n */\r\n public get(key: string): TypeContextEntry<TType, any> | undefined\r\n {\r\n return this.typeContextEntryMap.get(key);\r\n }\r\n\r\n /**\r\n * Checks if type context has a key.\r\n * \r\n * @param {string} key Key.\r\n * \r\n * @returns {boolean} True when type context has a key. False otherwise.\r\n */\r\n public has(key: string): boolean\r\n {\r\n return this.typeContextEntryMap.has(key);\r\n }\r\n \r\n /**\r\n * Gets iterable for keys inside the context.\r\n * \r\n * @returns {IterableIterator<string>} Iterable for keys inside the context.\r\n */\r\n public keys(): IterableIterator<string>\r\n {\r\n return this.typeContextEntryMap.keys();\r\n }\r\n\r\n /**\r\n * Gets iterable for values inside the context.\r\n * \r\n * @returns {IterableIterator<TypeContextEntry<TType, any>>} Iterable for values inside the context.\r\n */\r\n public values(): IterableIterator<TypeContextEntry<TType, any>>\r\n {\r\n return this.typeContextEntryMap.values();\r\n }\r\n\r\n /**\r\n * Gets iterable for entries inside the context.\r\n * \r\n * @returns {IterableIterator<[string, TypeContextEntry<TType, any>]>} Iterable for entries inside the context.\r\n */\r\n public entries(): IterableIterator<[string, TypeContextEntry<TType, any>]>\r\n {\r\n return this.typeContextEntryMap.entries();\r\n }\r\n}\r\n","import { assign, isArray, isNil, isUndefined } from 'lodash';\r\nimport { Alias } from './alias';\r\nimport { Any } from './any';\r\nimport { CustomContext } from './custom-context';\r\nimport { CustomOption } from './custom-option';\r\nimport { TypeFactory } from './factories/type-factory';\r\nimport { jsonParse } from './functions/json-parse';\r\nimport { jsonStringify } from './functions/json-stringify';\r\nimport { GenericArgument } from './generic-argument';\r\nimport { SingletonInjector } from './injectors/singleton-injector';\r\nimport { Log } from './log';\r\nimport { LogLevel } from './log-level';\r\nimport { ReferenceCallback } from './reference-callback';\r\nimport { CircularReferenceHandler } from './reference-handlers/circular-reference-handler';\r\nimport { ReferenceKey } from './reference-key';\r\nimport { ReferenceValue } from './reference-value';\r\nimport { SerializerContext } from './serializer-context';\r\nimport { AnySerializer } from './serializers/any-serializer';\r\nimport { ArrayBufferSerializer } from './serializers/array-buffer-serializer';\r\nimport { ArraySerializer } from './serializers/array-serializer';\r\nimport { BooleanSerializer } from './serializers/boolean-serializer';\r\nimport { DataViewSerializer } from './serializers/data-view-serializer';\r\nimport { DateSerializer } from './serializers/date-serializer';\r\nimport { Float32ArraySerializer } from './serializers/float-32-array-serializer';\r\nimport { Float64ArraySerializer } from './serializers/float-64-array-serializer';\r\nimport { Int16ArraySerializer } from './serializers/int-16-array-serializer';\r\nimport { Int32ArraySerializer } from './serializers/int-32-array-serializer';\r\nimport { Int8ArraySerializer } from './serializers/int-8-array-serializer';\r\nimport { MapSerializer } from './serializers/map-serializer';\r\nimport { NumberSerializer } from './serializers/number-serializer';\r\nimport { SetSerializer } from './serializers/set-serializer';\r\nimport { StringSerializer } from './serializers/string-serializer';\r\nimport { TypeSerializer } from './serializers/type-serializer';\r\nimport { Uint16ArraySerializer } from './serializers/uint-16-array-serializer';\r\nimport { Uint32ArraySerializer } from './serializers/uint-32-array-serializer';\r\nimport { Uint8ArraySerializer } from './serializers/uint-8-array-serializer';\r\nimport { Uint8ClampedArraySerializer } from './serializers/uint-8-clamped-array-serializer';\r\nimport { UnknownSerializer } from './serializers/unknown-serializer';\r\nimport { TypeConfiguration } from './type-configuration';\r\nimport { TypeFn } from './type-fn';\r\nimport { TypeLike } from './type-like';\r\nimport { TypeManagerOptions } from './type-manager-options';\r\nimport { TypeMetadata } from './type-metadata';\r\nimport { typeMetadataSymbol } from './type-metadata-symbol';\r\nimport { TypeOptions } from './type-options';\r\nimport { TypeOptionsBase } from './type-options-base';\r\nimport { Unknown } from './unknown';\r\n\r\n/**\r\n * Type manager class.\r\n * \r\n * @type {TypeManager}\r\n */\r\nexport class TypeManager\r\n{\r\n /**\r\n * Static shared options of any type which applied to any instance of type manager\r\n * by default.\r\n * \r\n * @type {TypeOptionsBase<any>}\r\n */\r\n public static readonly defaultTypeOptionsBase: TypeOptionsBase<any> = {\r\n discriminator: '$type',\r\n factory: new TypeFactory(),\r\n injector: new SingletonInjector(),\r\n log: new Log(LogLevel.Error),\r\n preserveDiscriminator: false,\r\n referenceHandler: new CircularReferenceHandler(),\r\n serializer: new TypeSerializer(),\r\n preserveNull: true,\r\n useDefaultValue: false,\r\n useImplicitConversion: false\r\n };\r\n\r\n /**\r\n * Static type options per type which applied to any instance of type manager\r\n * by default.\r\n * \r\n * @type {Map<TypeFn<any>, TypeOptions<any>>}\r\n */\r\n public static readonly defaultTypeOptionsMap: Map<TypeFn<any>, TypeOptions<any>> = new Map<TypeFn<any>, TypeOptions<any>>([\r\n [Any, { serializer: new AnySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\r\n [ArrayBuffer, { serializer: new ArrayBufferSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\r\n [Array, { serializer: new ArraySerializer(), serializedDefaultValue: () => [], deserializedDefaultValue: () => [] }],\r\n [Boolean, { serializer: new BooleanSerializer(), serializedDefaultValue: false, deserializedDefaultValue: false }],\r\n [DataView, { serializer: new DataViewSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\r\n [Date, { serializer: new DateSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\r\n [Float32Array, { serializer: new Float32ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\r\n [Float64Array, { serializer: new Float64ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\r\n [Int8Array, { serializer: new Int8ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\r\n [Int16Array, { serializer: new Int16ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\r\n [Int32Array, { serializer: new Int32ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\r\n [Map, { serializer: new MapSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\r\n [Number, { serializer: new NumberSerializer(), serializedDefaultValue: 0, deserializedDefaultValue: 0 }],\r\n [Set, { serializer: new SetSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\r\n [String, { serializer: new StringSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\r\n [Uint8Array, { serializer: new Uint8ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\r\n [Uint8ClampedArray, { serializer: new Uint8ClampedArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\r\n [Uint16Array, { serializer: new Uint16ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\r\n [Uint32Array, { serializer: new Uint32ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\r\n [Unknown, { serializer: new UnknownSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }]\r\n ]);\r\n\r\n /**\r\n * Static type manager instance which is used for decorator based configurations and\r\n * static declarative based configurations.\r\n *\r\n * @type {TypeManager}\r\n */\r\n public static readonly staticTypeManager: TypeManager = new TypeManager();\r\n\r\n /**\r\n * Type function map for types with aliases.\r\n * \r\n * @type {Map<Alias, TypeFn<any>>}\r\n */\r\n public readonly typeFnMap: Map<Alias, TypeFn<any>> = new Map<Alias, TypeFn<any>>();\r\n\r\n /**\r\n * Symbol of current instance which is used to store type metadata within types.\r\n * \r\n * @type {symbol}\r\n */\r\n public readonly symbol: symbol;\r\n\r\n /**\r\n * Type manager options.\r\n * \r\n * @type {TypeManagerOptions}\r\n */\r\n public readonly typeManagerOptions: TypeManagerOptions;\r\n\r\n /**\r\n * Custom context.\r\n * \r\n * @type {CustomContext}\r\n */\r\n public readonly customContext: CustomContext;\r\n\r\n /**\r\n * Constructor.\r\n * \r\n * Creating an instance of type manager allows to have multiple configs. By default only static \r\n * instance of type manager is created on the background and all decorator based and declarative based\r\n * configurations are applied to it. Note that all options which are passed to a constructor are\r\n * mutated and all references are kept. This allow to have different managers with intersected data.\r\n * If such behaviour is not required then use configure methods after creating instance of type manager.\r\n * \r\n * @param {TypeManagerOptions} typeManagerOptions Type manager options.\r\n */\r\n public constructor(typeManagerOptions: TypeManagerOptions = {})\r\n {\r\n this.symbol = Symbol(typeMetadataSymbol.description);\r\n this.typeManagerOptions = this.constructTypeManagerOptions(typeManagerOptions);\r\n this.customContext = this.constructCustomContext();\r\n\r\n this.configure(typeManagerOptions);\r\n\r\n return;\r\n }\r\n\r\n /**\r\n * Gets type function map in static context.\r\n * \r\n * @returns {Map<Alias, TypeFn<any>>} Type function map.\r\n */\r\n public static get typeFnMap(): Map<Alias, TypeFn<any>>\r\n {\r\n return this.staticTypeManager.typeFnMap;\r\n }\r\n\r\n /**\r\n * Gets symbol in static context.\r\n * \r\n * @returns {symbol} Type manager symbol.\r\n */\r\n public static get symbol(): symbol\r\n {\r\n return this.staticTypeManager.symbol;\r\n }\r\n\r\n /**\r\n * Gets type manager options in static context.\r\n * \r\n * @returns {TypeManagerOptions} Type manager options.\r\n */\r\n public static get typeManagerOptions(): TypeManagerOptions\r\n {\r\n return this.staticTypeManager.typeManagerOptions;\r\n }\r\n\r\n /**\r\n * Gets type options base in static context.\r\n * \r\n * @returns {TypeOptionsBase<any>} Type options base.\r\n */\r\n public static get typeOptionsBase(): TypeOptionsBase<any>\r\n {\r\n return this.staticTypeManager.typeOptionsBase;\r\n }\r\n\r\n /**\r\n * Gets type options base.\r\n * \r\n * @returns {TypeOptionsBase<any>} Type options base.\r\n */\r\n public get typeOptionsBase(): TypeOptionsBase<any>\r\n {\r\n let typeOptionsBase = this.typeManagerOptions.typeOptionsBase;\r\n\r\n if (isNil(typeOptionsBase))\r\n {\r\n typeOptionsBase = {};\r\n\r\n this.typeManagerOptions.typeOptionsBase = this.constructTypeOptionsBase(typeOptionsBase);\r\n }\r\n\r\n return typeOptionsBase as TypeOptionsBase<any>;\r\n }\r\n\r\n /**\r\n * Gets type options map in static context.\r\n * \r\n * @returns {Map<TypeFn<any>, TypeOptions<any>>} Type options map.\r\n */\r\n public static get typeOptionsMap(): Map<TypeFn<any>, TypeOptions<any>>\r\n {\r\n return this.staticTypeManager.typeOptionsMap;\r\n }\r\n\r\n /**\r\n * Gets type options map.\r\n * \r\n * @returns {Map<TypeFn<any>, TypeOptions<any>>} Type options map.\r\n */\r\n public get typeOptionsMap(): Map<TypeFn<any>, TypeOptions<any>>\r\n {\r\n let typeOptionsMap = this.typeManagerOptions.typeOptionsMap;\r\n\r\n if (isNil(typeOptionsMap))\r\n {\r\n typeOptionsMap = new Map<TypeFn<any>, TypeOptions<any>>();\r\n\r\n this.typeManagerOptions.typeOptionsMap = this.constructTypeOptionsMap(typeOptionsMap);\r\n }\r\n\r\n return typeOptionsMap;\r\n }\r\n\r\n /**\r\n * Gets type configuration map in static context.\r\n * \r\n * @returns {Map<TypeFn<any>, TypeConfiguration<any>>} Type configuration map.\r\n */\r\n public static get typeConfigurationMap(): Map<TypeFn<any>, TypeConfiguration<any>>\r\n {\r\n return this.staticTypeManager.typeConfigurationMap;\r\n }\r\n\r\n /**\r\n * Gets type configuration map.\r\n * \r\n * @returns {Map<TypeFn<any>, TypeConfiguration<any>>} Type configuration map.\r\n */\r\n public get typeConfigurationMap(): Map<TypeFn<any>, TypeConfiguration<any>>\r\n {\r\n let typeConfigurationMap = this.typeManagerOptions.typeConfigurationMap;\r\n\r\n if (isNil(typeConfigurationMap))\r\n {\r\n typeConfigurationMap = new Map<TypeFn<any>, TypeConfiguration<any>>();\r\n\r\n this.typeManagerOptions.typeConfigurationMap = typeConfigurationMap;\r\n }\r\n\r\n return typeConfigurationMap;\r\n }\r\n\r\n /**\r\n * Constructs initial type manager options by extending passed options \r\n * with default values if they are not overriden. All references are kept.\r\n * \r\n * @param {TypeManagerOptions} typeManagerOptions Type manager options.\r\n * \r\n * @returns {TypeManagerOptions} Constructed type manager options.\r\n */\r\n private constructTypeManagerOptions(typeManagerOptions: TypeManagerOptions): TypeManagerOptions\r\n {\r\n let typeOptionsBase = typeManagerOptions.typeOptionsBase;\r\n\r\n if (isNil(typeOptionsBase))\r\n {\r\n typeOptionsBase = {};\r\n\r\n typeManagerOptions.typeOptionsBase = this.constructTypeOptionsBase(typeOptionsBase);\r\n }\r\n\r\n let typeOptionsMap = typeManagerOptions.typeOptionsMap;\r\n\r\n if (isNil(typeOptionsMap))\r\n {\r\n typeOptionsMap = new Map<TypeFn<any>, TypeOptions<any>>();\r\n\r\n typeManagerOptions.typeOptionsMap = this.constructTypeOptionsMap(typeOptionsMap);\r\n }\r\n\r\n return typeManagerOptions;\r\n }\r\n\r\n /**\r\n * Constructs type options base.\r\n * \r\n * @param {Partial<TypeOptionsBase<any>>} typeOptionsBase Type options base.\r\n * \r\n * @returns {Partial<TypeOptionsBase<any>>} Constructed type options base.\r\n */\r\n private constructTypeOptionsBase(typeOptionsBase: Partial<TypeOptionsBase<any>>): Partial<TypeOptionsBase<any>>\r\n {\r\n const initialTypeOptionsBase = assign({}, TypeManager.defaultTypeOptionsBase, typeOptionsBase);\r\n \r\n assign(typeOptionsBase, initialTypeOptionsBase);\r\n\r\n return typeOptionsBase;\r\n }\r\n\r\n /**\r\n * Constructs type options map.\r\n * \r\n * @param {Map<TypeFn<any>, TypeOptions<any>>} typeOptionsMap Type options map.\r\n * \r\n * @returns {Map<TypeFn<any>, TypeOptions<any>>} Constructed type options map.\r\n */\r\n private constructTypeOptionsMap(typeOptionsMap: Map<TypeFn<any>, TypeOptions<any>>): Map<TypeFn<any>, TypeOptions<any>>\r\n {\r\n const initialTypeOptionsMap = new Map<TypeFn<any>, TypeOptions<any>>();\r\n\r\n for (const [typeFn, typeOptions] of TypeManager.defaultTypeOptionsMap)\r\n {\r\n let mapTypeOptions = initialTypeOptionsMap.get(typeFn);\r\n\r\n if (isNil(mapTypeOptions))\r\n {\r\n mapTypeOptions = {};\r\n }\r\n\r\n initialTypeOptionsMap.set(typeFn, assign(mapTypeOptions, typeOptions));\r\n }\r\n\r\n for (const [typeFn, typeOptions] of typeOptionsMap)\r\n {\r\n let mapTypeOptions = initialTypeOptionsMap.get(typeFn);\r\n\r\n if (isNil(mapTypeOptions))\r\n {\r\n mapTypeOptions = {};\r\n }\r\n\r\n initialTypeOptionsMap.set(typeFn, assign(typeOptions, assign(mapTypeOptions, typeOptions)));\r\n }\r\n\r\n typeOptionsMap.clear();\r\n\r\n for (const [typeFn, typeOptions] of initialTypeOptionsMap)\r\n {\r\n typeOptionsMap.set(typeFn, typeOptions);\r\n }\r\n\r\n return typeOptionsMap;\r\n }\r\n \r\n /**\r\n * Constructs custom context.\r\n * \r\n * @returns {CustomContext} Constructed custom context.\r\n */\r\n private constructCustomContext(): CustomContext\r\n {\r\n const customOptions = this.typeOptionsBase.customOptions ?? new Array<CustomOption>();\r\n const customContext = new CustomContext(customOptions);\r\n\r\n this.typeOptionsBase.customOptions = customOptions;\r\n\r\n return customContext;\r\n }\r\n\r\n /**\r\n * Configures type metadata for provided type function in a static context.\r\n * \r\n * @param {TypeFn<TType>} typeFn Type function.\r\n * @param {TypeOptions<TType>} typeOptions Type options.\r\n * \r\n * @returns {TypeMetadata<TType>} Type metadata for provided type function.\r\n */\r\n public static configureTypeMetadata<TType>(typeFn: TypeFn<TType>, typeOptions?: TypeOptions<TType>): TypeMetadata<TType>\r\n {\r\n return this.staticTypeManager.configureTypeMetadata(typeFn, typeOptions);\r\n }\r\n\r\n /**\r\n * Configures type metadata for provided type function.\r\n * \r\n * @param {TypeFn<TType>} typeFn Type function.\r\n * @param {TypeOptions<TType>} typeOptions Type options.\r\n * \r\n * @returns {TypeMetadata<TType>} Type metadata for provided type function.\r\n */\r\n public configureTypeMetadata<TType>(typeFn: TypeFn<TType>, typeOptions?: TypeOptions<TType>): TypeMetadata<TType>\r\n {\r\n const symbol = this.symbol;\r\n const prototype = typeFn.prototype;\r\n const typeMetadataDefined = prototype.hasOwnProperty(symbol);\r\n const typeMetadata = typeMetadataDefined ? prototype[symbol] as TypeMetadata<TType> : this.declareTypeMetadata(typeFn, typeOptions);\r\n\r\n if (!typeMetadataDefined)\r\n {\r\n Object.defineProperty(prototype, symbol, {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: typeMetadata\r\n });\r\n }\r\n \r\n if (typeMetadataDefined && !isNil(typeOptions))\r\n {\r\n typeMetadata.configure(typeOptions);\r\n }\r\n\r\n return typeMetadata;\r\n }\r\n\r\n /**\r\n * Declares type metadata for provided type function based on general configuration.\r\n * \r\n * @param {TypeFn<TType>} typeFn Type function.\r\n * @param {TypeOptions<TType>} typeOptions Type options.\r\n * \r\n * @returns {TypeMetadata<TType>} Type metadata.\r\n */\r\n private declareTypeMetadata<TType>(typeFn: TypeFn<TType>, typeOptions?: TypeOptions<TType>): TypeMetadata<TType>\r\n {\r\n let mapTypeOptions = this.typeOptionsMap.get(typeFn);\r\n\r\n if (isNil(mapTypeOptions))\r\n {\r\n mapTypeOptions = typeOptions ?? {};\r\n\r\n this.typeOptionsMap.set(typeFn, mapTypeOptions);\r\n }\r\n\r\n const symbol = this.symbol;\r\n const parentPrototype = Object.getPrototypeOf(typeFn.prototype) ?? {};\r\n const parentTypeMetadata = parentPrototype[symbol];\r\n const typeMetadata = new TypeMetadata(this, typeFn, mapTypeOptions, parentTypeMetadata);\r\n\r\n return typeMetadata;\r\n }\r\n\r\n /**\r\n * Extracts type metadata from provided type function in static context.\r\n * \r\n * @param {TypeFn<TType>} typeFn Type function.\r\n * \r\n * @returns {TypeMetadata<TType>} Type metadata for provided type function.\r\n */\r\n public static extractTypeMetadata<TType>(typeFn: TypeFn<TType>): TypeMetadata<TType>\r\n {\r\n return this.staticTypeManager.extractTypeMetadata(typeFn);\r\n }\r\n\r\n /**\r\n * Extracts type metadata from provided type function.\r\n * \r\n * @param {TypeFn<TType>} typeFn Type function.\r\n * \r\n * @returns {TypeMetadata<TType>} Type metadata for provided type function.\r\n */\r\n public extractTypeMetadata<TType>(typeFn: TypeFn<TType>): TypeMetadata<TType>\r\n {\r\n const symbol = this.symbol;\r\n const prototype = typeFn.prototype;\r\n const typeMetadataDefined = prototype.hasOwnProperty(symbol);\r\n const typeMetadata = typeMetadataDefined ? prototype[symbol] as TypeMetadata<TType> : this.configureTypeMetadata(typeFn);\r\n\r\n return typeMetadata;\r\n }\r\n\r\n /**\r\n * Applies shared type options in static context.\r\n * \r\n * @param {Partial<TypeOptionsBase<TType>>} typeOptionsBase Type options base.\r\n * \r\n * @returns {TypeManager} Static instance of type manager.\r\n */\r\n public static applyTypeOptionsBase<TType>(typeOptionsBase: Partial<TypeOptionsBase<TType>>): TypeManager\r\n {\r\n return this.staticTypeManager.applyTypeOptionsBase(typeOptionsBase);\r\n }\r\n \r\n /**\r\n * Applies shared type options.\r\n * \r\n * @param {Partial<TypeOptionsBase<TType>>} typeOptionsBase Type options base.\r\n * \r\n * @returns {TypeManager} Instance of type manager.\r\n */\r\n public applyTypeOptionsBase<TType>(typeOptionsBase: Partial<TypeOptionsBase<TType>>): TypeManager\r\n {\r\n const customOptions = this.typeOptionsBase.customOptions;\r\n\r\n assign(this.typeOptionsBase, typeOptionsBase, { customOptions: customOptions });\r\n\r\n if (!isNil(typeOptionsBase.customOptions))\r\n {\r\n this.customContext.configure(typeOptionsBase.customOptions);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Applies type options map in static context.\r\n * \r\n * @param {Map<TypeFn<TType>, TypeOptions<TType>>} typeOptionsMap Type options map.\r\n * \r\n * @returns {TypeManager} Static instance of type manager.\r\n */\r\n public static applyTypeOptionsMap<TType>(typeOptionsMap: Map<TypeFn<TType>, TypeOptions<TType>>): TypeManager\r\n {\r\n return this.staticTypeManager.applyTypeOptionsMap(typeOptionsMap);\r\n }\r\n\r\n /**\r\n * Applies type options map.\r\n * \r\n * @param {Map<TypeFn<TType>, TypeOptions<TType>>} typeOptionsMap Type options map.\r\n * \r\n * @returns {TypeManager} Instance of type manager.\r\n */\r\n public applyTypeOptionsMap<TType>(typeOptionsMap: Map<TypeFn<TType>, TypeOptions<TType>>): TypeManager\r\n {\r\n for (const [typeFn, typeOptions] of typeOptionsMap)\r\n {\r\n this.applyTypeOptions(typeFn, typeOptions);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Applies type options in static context.\r\n * \r\n * @param {TypeFn<TType>} typeFn Type function.\r\n * @param {TypeOptions<TType>} typeOptions Type options.\r\n * \r\n * @returns {TypeManager} Static instance of type manager.\r\n */\r\n public static applyTypeOptions<TType>(typeFn: TypeFn<TType>, typeOptions: TypeOptions<TType>): TypeManager\r\n {\r\n return this.staticTypeManager.applyTypeOptions(typeFn, typeOptions);\r\n }\r\n\r\n /**\r\n * Applies type options.\r\n * \r\n * @param {TypeFn<TType>} typeFn Type function.\r\n * @param {TypeOptions<TType>} typeOptions Type options.\r\n * \r\n * @returns {TypeManager} Instance of type manager.\r\n */\r\n public applyTypeOptions<TType>(typeFn: TypeFn<TType>, typeOptions: TypeOptions<TType>): TypeManager\r\n {\r\n const typeMetadata = this.extractTypeMetadata(typeFn);\r\n\r\n typeMetadata.configure(typeOptions);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Applies type configuration map in static context.\r\n * \r\n * @param {Map<TypeFn<TType>, TypeConfiguration<TType>>} typeConfigurationMap Type configuration map.\r\n * \r\n * @returns {TypeManager} Static instance of type manager.\r\n */\r\n public static applyTypeConfigurationMap<TType>(typeConfigurationMap: Map<TypeFn<TType>, TypeConfiguration<TType>>): TypeManager\r\n {\r\n return this.staticTypeManager.applyTypeConfigurationMap(typeConfigurationMap);\r\n }\r\n\r\n /**\r\n * Applies type configuration map.\r\n * \r\n * @param {Map<TypeFn<TType>, TypeConfiguration<TType>>} typeConfigurationMap Type configuration map.\r\n * \r\n * @returns {TypeManager} Instance of type manager.\r\n */\r\n public applyTypeConfigurationMap<TType>(typeConfigurationMap: Map<TypeFn<TType>, TypeConfiguration<TType>>): TypeManager\r\n {\r\n for (const [typeFn, typeConfiguration] of typeConfigurationMap)\r\n {\r\n this.applyTypeConfiguration(typeFn, typeConfiguration);\r\n }\r\n \r\n return this;\r\n }\r\n\r\n /**\r\n * Applies type configuration in static context.\r\n * \r\n * @param {TypeFn<TType>} typeFn Type function.\r\n * @param {TypeConfiguration<TType>} typeConfiguration Type configuration.\r\n * \r\n * @returns {TypeManager} Static instance of type manager.\r\n */\r\n public static applyTypeConfiguration<TType>(typeFn: TypeFn<TType>, typeConfiguration: TypeConfiguration<TType>): TypeManager\r\n {\r\n return this.staticTypeManager.applyTypeConfiguration(typeFn, typeConfiguration);\r\n }\r\n \r\n /**\r\n * Applies type configuration.\r\n * \r\n * @param {TypeFn<TType>} typeFn Type function.\r\n * @param {TypeConfiguration<TType>} typeConfiguration Type configuration.\r\n * \r\n * @returns {TypeManager} Instance of type manager.\r\n */\r\n public applyTypeConfiguration<TType>(typeFn: TypeFn<TType>, typeConfiguration: TypeConfiguration<TType>): TypeManager\r\n {\r\n const typeMetadata = this.extractTypeMetadata(typeFn);\r\n\r\n typeConfiguration.configure(typeMetadata);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures type manager in static context.\r\n * \r\n * @param {TypeManagerOptions} typeManagerOptions Type manager options.\r\n * \r\n * @returns {TypeManager} Static instance of type manager.\r\n */\r\n public static configure(typeManagerOptions: TypeManagerOptions): TypeManager\r\n {\r\n return this.staticTypeManager.configure(typeManagerOptions);\r\n }\r\n\r\n /**\r\n * Configures type manager.\r\n * \r\n * @param {TypeManagerOptions} typeManagerOptions Type manager options.\r\n * \r\n * @returns {TypeManager} Instance of type manager.\r\n */\r\n public configure(typeManagerOptions: TypeManagerOptions): TypeManager\r\n {\r\n if (!isUndefined(typeManagerOptions.typeOptionsBase)) \r\n {\r\n this.applyTypeOptionsBase(typeManagerOptions.typeOptionsBase);\r\n }\r\n\r\n if (!isUndefined(typeManagerOptions.typeOptionsMap)) \r\n {\r\n this.applyTypeOptionsMap(typeManagerOptions.typeOptionsMap);\r\n }\r\n\r\n if (!isUndefined(typeManagerOptions.typeConfigurationMap)) \r\n {\r\n this.applyTypeConfigurationMap(typeManagerOptions.typeConfigurationMap);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Defines serializer context for x in static context.\r\n * \r\n * @param {TypeFn<TType>} typeFn Type function.\r\n * @param {any} x Some value.\r\n * @param {Array<GenericArgument<any>>} genericArguments Generic arguments.\r\n * \r\n * @returns {SerializerContext<TType>} Serializer context.\r\n */\r\n public static defineSerializerContext<TType>(typeFn: TypeFn<TType>, x: any, genericArguments?: Array<GenericArgument<any>>): SerializerContext<TType>\r\n {\r\n return this.staticTypeManager.defineSerializerContext(typeFn, x, genericArguments);\r\n }\r\n\r\n /**\r\n * Defines serializer context for x.\r\n * \r\n * @param {TypeFn<TType>} typeFn Type function.\r\n * @param {any} x Some value.\r\n * @param {Array<GenericArgument<any>>} genericArguments Generic arguments.\r\n * \r\n * @returns {SerializerContext<TType>} Serializer context.\r\n */\r\n public defineSerializerContext<TType>(typeFn: TypeFn<TType>, x: any, genericArguments?: Array<GenericArgument<any>>): SerializerContext<TType>\r\n {\r\n const typeMetadata = this.extractTypeMetadata(typeFn);\r\n const genericStructures = isNil(genericArguments) ? undefined : typeMetadata.defineGenericStructures(genericArguments);\r\n const genericMetadataResolvers = isNil(genericStructures) ? undefined : typeMetadata.defineGenericMetadataResolvers(genericStructures);\r\n\r\n return new SerializerContext(x, new Map<ReferenceKey, ReferenceValue>(), new Map<ReferenceKey, Array<ReferenceCallback>>(), \r\n {\r\n jsonPathKey: '$',\r\n typeMetadata: typeMetadata,\r\n genericStructures: genericStructures,\r\n genericMetadataResolvers: genericMetadataResolvers\r\n });\r\n }\r\n \r\n /**\r\n * Serializes provided value based on the type in static context.\r\n * \r\n * @param {TypeFn<TType>} typeFn Type function.\r\n * @param {TypeLike<TType>} x Input value.\r\n * \r\n * @returns {TypeLike<any>} Object created from provided input value or undefined. \r\n */\r\n public static serialize<TType>(typeFn: TypeFn<TType>, x: undefined): any;\r\n public static serialize<TType>(typeFn: TypeFn<TType>, x: null): null;\r\n public static serialize<TType>(typeFn: TypeFn<TType>, x: Array<TType>): Array<any>;\r\n public static serialize<TType>(typeFn: TypeFn<TType>, x: TType): any;\r\n public static serialize<TType>(typeFn: TypeFn<TType>, x: TypeLike<TType | Array<TType>>): TypeLike<any>\r\n {\r\n return this.staticTypeManager.serialize(typeFn, x);\r\n }\r\n\r\n /**\r\n * Serializes provided value based on the type function.\r\n * \r\n * @param {TypeFn<TType>} typeFn Type function.\r\n * @param {TypeLike<TType>} x Input value.\r\n * \r\n * @returns {TypeLike<any>} Object created from provided input value or undefined. \r\n */\r\n public serialize<TType>(typeFn: TypeFn<TType>, x: undefined): any;\r\n public serialize<TType>(typeFn: TypeFn<TType>, x: null): null;\r\n public serialize<TType>(typeFn: TypeFn<TType>, x: Array<TType>): Array<any>;\r\n public serialize<TType>(typeFn: TypeFn<TType>, x: TType): any;\r\n public serialize<TType>(typeFn: TypeFn<TType>, x: TypeLike<TType | Array<TType>>): TypeLike<any>\r\n {\r\n const arrayFn = Array as TypeFn<any>;\r\n\r\n if (isArray(x) && typeFn !== arrayFn)\r\n {\r\n return this.defineSerializerContext(arrayFn, x, [typeFn]).serialize(x);\r\n }\r\n\r\n return this.defineSerializerContext(typeFn, x).serialize(x as any);\r\n }\r\n\r\n /**\r\n * Deserializes provided value based on the type function in static context.\r\n * \r\n * @param {TypeFn<TType>} typeFn Type function.\r\n * @param {TypeLike<any>} x Input value.\r\n *\r\n * @returns {TypeLike<TType>} Type created from provided input value or undefined.\r\n */\r\n public static deserialize<TType>(typeFn: TypeFn<TType>, x: undefined): any;\r\n public static deserialize<TType>(typeFn: TypeFn<TType>, x: null): null;\r\n public static deserialize<TType>(typeFn: TypeFn<TType>, x: Array<any>): Array<TType>;\r\n public static deserialize<TType>(typeFn: TypeFn<TType>, x: any): TType;\r\n public static deserialize<TType>(typeFn: TypeFn<TType>, x: TypeLike<any>): TypeLike<TType | Array<TType>>\r\n {\r\n return this.staticTypeManager.deserialize(typeFn, x);\r\n }\r\n\r\n /**\r\n * Deserializes provided value based on the type function.\r\n * \r\n * @param {TypeFn<TType>} typeFn Type function.\r\n * @param {TypeLike<any>} x Input value.\r\n *\r\n * @returns {TypeLike<TType>} Type created from provided input value or undefined.\r\n */\r\n public deserialize<TType>(typeFn: TypeFn<TType>, x: undefined): any;\r\n public deserialize<TType>(typeFn: TypeFn<TType>, x: null): null;\r\n public deserialize<TType>(typeFn: TypeFn<TType>, x: Array<any>): Array<TType>;\r\n public deserialize<TType>(typeFn: TypeFn<TType>, x: any): TType;\r\n public deserialize<TType>(typeFn: TypeFn<TType>, x: TypeLike<any>): TypeLike<TType | Array<TType>>\r\n {\r\n const arrayFn = Array as TypeFn<any>;\r\n\r\n if (isArray(x) && typeFn !== arrayFn)\r\n {\r\n return this.defineSerializerContext(arrayFn, x, [typeFn]).deserialize(x);\r\n }\r\n\r\n return this.defineSerializerContext(typeFn, x).deserialize(x as any);\r\n }\r\n\r\n /**\r\n * Converts provided value to a JavaScript Object Notation (JSON) string in static context.\r\n * \r\n * @param {TypeFn<TType>} typeFn Type function.\r\n * @param {any} x Input value, usually an object or array, to be converted.\r\n * @param {Function|Array<number>|Array<string>} replacer A function that transforms the results or an array of strings and numbers that acts as an approved list.\r\n * @param {string|number} space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\r\n * \r\n * @returns {string} JSON string.\r\n */\r\n public static stringify<TType>(typeFn: TypeFn<TType>, x: any, replacer?: (this: any, key: string, value: any) => any | Array<number> | Array<string> | null, space?: string | number): string\r\n {\r\n return this.staticTypeManager.stringify(typeFn, x, replacer, space);\r\n }\r\n\r\n /**\r\n * Converts provided value to a JavaScript Object Notation (JSON) string.\r\n * \r\n * @param {TypeFn<TType>} typeFn Type function.\r\n * @param {any} x Input value, usually an object or array, to be converted.\r\n * @param {Function|Array<number>|Array<string>} replacer A function that transforms the results or an array of strings and numbers that acts as an approved list.\r\n * @param {string|number} space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\r\n * \r\n * @returns {string} JSON string.\r\n */\r\n public stringify<TType>(typeFn: TypeFn<TType>, x: any, replacer?: (this: any, key: string, value: any) => any | Array<number> | Array<string> | null, space?: string | number): string\r\n {\r\n return jsonStringify(this.serialize(typeFn, x), replacer, space);\r\n }\r\n\r\n /**\r\n * Converts a JavaScript Object Notation (JSON) string into a type in static context.\r\n * \r\n * @param {TypeFn<TType>} typeFn Type function.\r\n * @param {string} x A valid JSON string.\r\n * @param {Function} reviver A function that transforms the results. This function is called for each member of the object.\r\n * \r\n * @returns {TypeLike<TType>} Type created from provided input value or undefined.\r\n */\r\n public static parse<TType>(typeFn: TypeFn<TType>, x: string, reviver?: (this: any, key: string, value: any) => any): TypeLike<TType>\r\n {\r\n return this.staticTypeManager.parse(typeFn, x, reviver);\r\n }\r\n \r\n /**\r\n * Converts a JavaScript Object Notation (JSON) string into a type.\r\n * \r\n * @param {TypeFn<TType>} typeFn Type function.\r\n * @param {string} x A valid JSON string.\r\n * @param {Function} reviver A function that transforms the results. This function is called for each member of the object.\r\n * \r\n * @returns {TypeLike<TType>} Type created from provided input value or undefined.\r\n */\r\n public parse<TType>(typeFn: TypeFn<TType>, x: string, reviver?: (this: any, key: string, value: any) => any): TypeLike<TType>\r\n {\r\n return this.deserialize(typeFn, jsonParse(x, reviver));\r\n }\r\n}\r\n","/**\r\n * Unique symbol used to store type metadata.\r\n * \r\n * @type {unique symbol}\r\n */\r\n export const typeMetadataSymbol: unique symbol = Symbol.for('$DSTypeMetadata');\r\n","import { isFunction, isNil, isUndefined } from 'lodash';\r\nimport { Alias } from './alias';\r\nimport { CustomContext } from './custom-context';\r\nimport { CustomOption } from './custom-option';\r\nimport { DefaultValue } from './default-value';\r\nimport { Discriminant } from './discriminant';\r\nimport { Discriminator } from './discriminator';\r\nimport { Factory } from './factory';\r\nimport { getOwnReflectMetadata } from './functions/get-own-reflect-metadata';\r\nimport { nameOf } from './functions/name-of';\r\nimport { InjectIndex } from './inject-index';\r\nimport { InjectMetadata } from './inject-metadata';\r\nimport { InjectOptions } from './inject-options';\r\nimport { InjectSorter } from './inject-sorter';\r\nimport { Injector } from './injector';\r\nimport { Log } from './log';\r\nimport { Metadata } from './metadata';\r\nimport { NamingConvention } from './naming-convention';\r\nimport { PropertyMetadata } from './property-metadata';\r\nimport { PropertyName } from './property-name';\r\nimport { PropertyOptions } from './property-options';\r\nimport { PropertySorter } from './property-sorter';\r\nimport { ReferenceHandler } from './reference-handler';\r\nimport { Serializer } from './serializer';\r\nimport { TypeFn } from './type-fn';\r\nimport { TypeInternals } from './type-internals';\r\nimport { TypeManager } from './type-manager';\r\nimport { TypeName } from './type-name';\r\nimport { TypeOptions } from './type-options';\r\nimport { TypeOptionsBase } from './type-options-base';\r\n\r\n/**\r\n * Main class used to describe a certain type.\r\n * \r\n * @type {TypeMetadata<TType>}\r\n */\r\nexport class TypeMetadata<TType> extends Metadata\r\n{\r\n /**\r\n * Type name. \r\n * \r\n * Defined at runtime based on the constructor function.\r\n * \r\n * @type {TypeName}\r\n */\r\n public readonly typeName: TypeName;\r\n\r\n /**\r\n * Type function.\r\n * \r\n * @type {TypeFn<TType>}\r\n */\r\n public readonly typeFn: TypeFn<TType>;\r\n\r\n /**\r\n * Type options used by default.\r\n * \r\n * @type {TypeOptionsBase<TType>}\r\n */\r\n public readonly typeOptionsBase: TypeOptionsBase<TType>;\r\n\r\n /**\r\n * Type options.\r\n * \r\n * @type {TypeOptions<TType>}\r\n */\r\n public readonly typeOptions: TypeOptions<TType>;\r\n\r\n /**\r\n * Type internals.\r\n * \r\n * @type {TypeInternals}\r\n */\r\n public readonly typeInternals: TypeInternals;\r\n\r\n /**\r\n * Children type metadata map.\r\n * \r\n * @type {Map<TypeFn<TType>, TypeMetadata<any>>}\r\n */\r\n public readonly childrenTypeMetadataMap: Map<TypeFn<any>, TypeMetadata<any>> = new Map<TypeFn<any>, TypeMetadata<any>>();\r\n\r\n /**\r\n * Discriminant map.\r\n * \r\n * @type {Map<TypeFn<any>, Discriminant>}\r\n */\r\n public readonly discriminantMap: Map<TypeFn<any>, Discriminant> = new Map<TypeFn<any>, Discriminant>();\r\n\r\n /**\r\n * Properties defined for a type.\r\n * \r\n * @type {Map<PropertyName, PropertyMetadata<TType, any>>}\r\n */\r\n public readonly propertyMetadataMap: Map<PropertyName, PropertyMetadata<TType, any>> = new Map<PropertyName, PropertyMetadata<TType, any>>();\r\n\r\n /**\r\n * Injections defined for a type.\r\n * \r\n * @type {Map<InjectIndex, InjectMetadata<TType, any>>}\r\n */\r\n public readonly injectMetadataMap: Map<InjectIndex, InjectMetadata<TType, any>> = new Map<InjectIndex, InjectMetadata<TType, any>>();\r\n\r\n /**\r\n * Parent type metadata.\r\n * \r\n * @type {TypeMetadata<any>}\r\n */\r\n public readonly parentTypeMetadata?: TypeMetadata<any>;\r\n\r\n /**\r\n * Constructor.\r\n * \r\n * @param {TypeManager} typeManager Type manager.\r\n * @param {TypeFn<any>} typeFn Type function.\r\n * @param {TypeOptions<TType>} typeOptions Type options.\r\n * @param {TypeMetadata<any>} parentTypeMetadata Parent type metadata.\r\n */\r\n public constructor(\r\n typeManager: TypeManager,\r\n typeFn: TypeFn<TType>,\r\n typeOptions: TypeOptions<TType>,\r\n parentTypeMetadata?: TypeMetadata<any>\r\n )\r\n {\r\n super(typeManager);\r\n\r\n this.typeName = nameOf(typeFn);\r\n this.typeFn = typeFn;\r\n this.typeOptionsBase = typeManager.typeOptionsBase;\r\n this.typeOptions = this.constructTypeOptions(typeOptions);\r\n this.typeInternals = this.constructTypeInternals();\r\n this.parentTypeMetadata = parentTypeMetadata;\r\n\r\n this.deriveParentTypeMetadataProperties();\r\n this.hasDiscriminant(this.discriminant);\r\n this.configure(typeOptions);\r\n\r\n return;\r\n }\r\n\r\n /**\r\n * Gets alias.\r\n * \r\n * @returns {Alias|undefined} Alias or undefined.\r\n */\r\n public get alias(): Alias | undefined\r\n {\r\n return this.typeOptions.alias;\r\n }\r\n\r\n /**\r\n * Gets custom options.\r\n * \r\n * @returns {Array<CustomOption>} Custom options.\r\n */\r\n public get customOptions(): Array<CustomOption> | undefined\r\n {\r\n return this.typeOptions.customOptions;\r\n }\r\n \r\n /**\r\n * Gets custom context.\r\n * \r\n * @returns {CustomContext} Custom context.\r\n */\r\n public get customContext(): CustomContext\r\n {\r\n let customContext = this.typeInternals.customContext;\r\n\r\n if (isNil(customContext))\r\n {\r\n this.typeOptions.customOptions = new Array<CustomOption>();\r\n this.typeInternals.customContext = new CustomContext(this.typeOptions.customOptions);\r\n\r\n customContext = this.typeInternals.customContext;\r\n }\r\n\r\n return customContext;\r\n }\r\n\r\n /**\r\n * Gets serialized null value.\r\n * \r\n * @returns {any|undefined} Resolved serialized null value or undefined.\r\n */\r\n public get serializedNullValue(): any | undefined\r\n {\r\n if (this.preserveNull)\r\n {\r\n return null;\r\n }\r\n\r\n return this.serializedDefaultValue;\r\n }\r\n\r\n /**\r\n * Gets serialized default value.\r\n * \r\n * @returns {any|undefined} Resolved serialized default value or undefined.\r\n */\r\n public get serializedDefaultValue(): any | undefined\r\n {\r\n if (this.useDefaultValue)\r\n {\r\n const serializedDefaultValue = this.typeOptions.defaultValue \r\n ?? this.typeOptions.serializedDefaultValue;\r\n\r\n const defaultValue = isFunction(serializedDefaultValue) \r\n ? serializedDefaultValue() \r\n : serializedDefaultValue;\r\n\r\n return defaultValue;\r\n }\r\n \r\n return undefined;\r\n }\r\n\r\n /**\r\n * Gets deserialized null value.\r\n * \r\n * @returns {any|undefined} Resolved deserialized null value or undefined.\r\n */\r\n public get deserializedNullValue(): any | undefined\r\n {\r\n if (this.preserveNull)\r\n {\r\n return null;\r\n }\r\n\r\n return this.deserializedDefaultValue;\r\n }\r\n \r\n /**\r\n * Gets deserialized default value.\r\n * \r\n * @returns {any|undefined} Resolved deserialized default value or undefined.\r\n */\r\n public get deserializedDefaultValue(): any | undefined\r\n {\r\n if (this.useDefaultValue)\r\n {\r\n const deserializedDefaultValue = this.typeOptions.defaultValue \r\n ?? this.typeOptions.deserializedDefaultValue;\r\n\r\n const defaultValue = isFunction(deserializedDefaultValue) \r\n ? deserializedDefaultValue() \r\n : deserializedDefaultValue;\r\n\r\n return defaultValue;\r\n }\r\n\r\n return undefined;\r\n }\r\n \r\n /**\r\n * Gets discriminant.\r\n * \r\n * @returns {Discriminant} Discriminant.\r\n */\r\n public get discriminant(): Discriminant\r\n {\r\n return this.typeOptions.discriminant ?? this.typeName;\r\n }\r\n\r\n /**\r\n * Gets discriminator.\r\n * \r\n * @returns {Discriminator} Discriminator.\r\n */\r\n public get discriminator(): Discriminator\r\n {\r\n return this.typeOptions.discriminator ?? this.typeOptionsBase.discriminator;\r\n }\r\n\r\n /**\r\n * Gets factory.\r\n * \r\n * @returns {Factory} Factory.\r\n */\r\n public get factory(): Factory\r\n {\r\n return this.typeOptions.factory ?? this.typeOptionsBase.factory;\r\n }\r\n\r\n /**\r\n * Gets injectable value.\r\n * \r\n * @returns {boolean|undefined} Injectable indicator or undefined.\r\n */\r\n public get injectable(): boolean | undefined\r\n {\r\n return this.typeOptions.injectable;\r\n }\r\n\r\n /**\r\n * Gets injector.\r\n * \r\n * @returns {Injector} Injector.\r\n */\r\n public get injector(): Injector\r\n {\r\n return this.typeOptions.injector ?? this.typeOptionsBase.injector;\r\n }\r\n\r\n /**\r\n * Gets log.\r\n * \r\n * @returns {Log} Log instance.\r\n */\r\n public get log(): Log\r\n {\r\n return this.typeOptions.log ?? this.typeOptionsBase.log;\r\n }\r\n\r\n /**\r\n * Gets naming convention.\r\n * \r\n * @returns {NamingConvention|undefined} Naming convention or undefined.\r\n */\r\n public get namingConvention(): NamingConvention | undefined\r\n {\r\n return this.typeOptions.namingConvention ?? this.typeOptionsBase.namingConvention;\r\n }\r\n\r\n /**\r\n * Gets indicator if current type metadata is polymorphic.\r\n * \r\n * @returns {boolean} True when type metadata is polymorphic. False otherwise.\r\n */\r\n public get polymorphic(): boolean\r\n {\r\n return this.discriminantMap.size > 1;\r\n }\r\n\r\n /**\r\n * Gets indicator if discriminator should be preserved.\r\n * \r\n * @returns {boolean} True when discriminator should be preserved. False otherwise.\r\n */\r\n public get preserveDiscriminator(): boolean \r\n {\r\n return this.typeOptions.preserveDiscriminator ?? this.typeOptionsBase.preserveDiscriminator;\r\n }\r\n\r\n /**\r\n * Gets reference handler.\r\n * \r\n * @returns {ReferenceHandler} Reference handler.\r\n */\r\n public get referenceHandler(): ReferenceHandler\r\n {\r\n return this.typeOptions.referenceHandler ?? this.typeOptionsBase.referenceHandler;\r\n }\r\n\r\n /**\r\n * Gets serializer.\r\n * \r\n * @returns {Serializer<TType>} Serializer.\r\n */\r\n public get serializer(): Serializer<TType>\r\n {\r\n return this.typeOptions.serializer ?? this.typeOptionsBase.serializer;\r\n }\r\n\r\n /**\r\n * Gets indicator if null value should be preserved.\r\n * \r\n * @returns {boolean} True when null value should be preserved. False otherwise.\r\n */\r\n public get preserveNull(): boolean\r\n {\r\n return this.typeOptions.preserveNull ?? this.typeOptionsBase.preserveNull;\r\n }\r\n\r\n /**\r\n * Gets indicator if default value should be used.\r\n * \r\n * @returns {boolean} True when type should use default value. False otherwise.\r\n */\r\n public get useDefaultValue(): boolean\r\n {\r\n return this.typeOptions.useDefaultValue ?? this.typeOptionsBase.useDefaultValue;\r\n }\r\n\r\n /**\r\n * Gets indicator if implicit conversion should be used.\r\n * \r\n * @returns {boolean} True when type should use implicit conversion. False otherwise.\r\n */\r\n public get useImplicitConversion(): boolean\r\n {\r\n return this.typeOptions.useImplicitConversion ?? this.typeOptionsBase.useImplicitConversion;\r\n }\r\n\r\n /**\r\n * Gets property sorter.\r\n * \r\n * @returns {PropertySorter|undefined} Property sorter or undefined.\r\n */\r\n public get propertySorter(): PropertySorter | undefined\r\n {\r\n return this.typeOptions.propertySorter ?? this.typeOptionsBase.propertySorter;\r\n }\r\n\r\n /**\r\n * Gets sorted property metadatas.\r\n * \r\n * @returns {IterableIterator<PropertyMetadata<TType, any>>} Iterable of property metadatas.\r\n */\r\n public get sortedPropertyMetadatas(): IterableIterator<PropertyMetadata<TType, any>>\r\n {\r\n const propertySorter = this.propertySorter;\r\n const propertyMetadatas = this.propertyMetadataMap.values();\r\n\r\n if (isNil(propertySorter))\r\n {\r\n return propertyMetadatas;\r\n }\r\n\r\n const sortedPropertyMetadatas = Array.from(propertyMetadatas).sort(propertySorter.sort);\r\n\r\n return sortedPropertyMetadatas[Symbol.iterator]();\r\n }\r\n\r\n /**\r\n * Gets inject sorter.\r\n * \r\n * @returns {InjectSorter|undefined} Property sorter or undefined.\r\n */\r\n public get injectSorter(): InjectSorter | undefined\r\n {\r\n return this.typeOptions.injectSorter ?? this.typeOptionsBase.injectSorter;\r\n }\r\n\r\n /**\r\n * Gets sorted inject metadatas.\r\n * \r\n * @returns {IterableIterator<InjectMetadata<TType, any>>} Iterable of inject metadatas.\r\n */\r\n public get sortedInjectMetadatas(): IterableIterator<InjectMetadata<TType, any>>\r\n {\r\n const injectSorter = this.injectSorter;\r\n const injectMetadatas = this.injectMetadataMap.values();\r\n\r\n if (isNil(injectSorter))\r\n {\r\n return injectMetadatas;\r\n }\r\n \r\n const sortedInjectMetadatas = Array.from(injectMetadatas).sort(injectSorter.sort);\r\n \r\n return sortedInjectMetadatas[Symbol.iterator]();\r\n }\r\n\r\n /**\r\n * Gets property options map.\r\n * \r\n * @returns {Map<PropertyName, PropertyOptions<any>>} Property options map.\r\n */\r\n public get propertyOptionsMap(): Map<PropertyName, PropertyOptions<any>>\r\n {\r\n let propertyOptionsMap = this.typeOptions.propertyOptionsMap;\r\n\r\n if (isNil(propertyOptionsMap))\r\n {\r\n propertyOptionsMap = new Map<PropertyName, PropertyOptions<any>>();\r\n\r\n this.typeOptions.propertyOptionsMap = propertyOptionsMap;\r\n }\r\n\r\n return propertyOptionsMap;\r\n }\r\n\r\n /**\r\n * Gets inject options map.\r\n * \r\n * @returns {Map<InjectIndex, InjectOptions<any>>} Inject options map.\r\n */\r\n public get injectOptionsMap(): Map<InjectIndex, InjectOptions<any>>\r\n {\r\n let injectOptionsMap = this.typeOptions.injectOptionsMap;\r\n\r\n if (isNil(injectOptionsMap))\r\n {\r\n injectOptionsMap = new Map<InjectIndex, InjectOptions<any>>();\r\n\r\n this.typeOptions.injectOptionsMap = injectOptionsMap;\r\n }\r\n\r\n return injectOptionsMap;\r\n }\r\n\r\n /**\r\n * Constructs initial type options by extending passed options \r\n * with default values if they are not overriden. All references are kept.\r\n * \r\n * @param {TypeOptions<TType>} typeOptions Type options.\r\n * \r\n * @returns {TypeOptions<TType>} Constructed type options.\r\n */\r\n private constructTypeOptions(typeOptions: TypeOptions<TType>): TypeOptions<TType>\r\n {\r\n return typeOptions;\r\n }\r\n\r\n /**\r\n * Constructs type internals.\r\n * \r\n * @returns {TypeInternals} Constructed type internals.\r\n */\r\n private constructTypeInternals(): TypeInternals\r\n {\r\n const customOptions = this.typeOptions.customOptions;\r\n const customContext = isNil(customOptions) ? undefined : new CustomContext(customOptions);\r\n const typeInternals = { customContext: customContext };\r\n\r\n return typeInternals;\r\n }\r\n\r\n /**\r\n * Derives parent type metadata properties.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n private deriveParentTypeMetadataProperties(): TypeMetadata<TType>\r\n {\r\n if (isNil(this.parentTypeMetadata)) \r\n {\r\n return this;\r\n }\r\n\r\n for (const [propertyName, propertyMetadata] of this.parentTypeMetadata.propertyMetadataMap)\r\n {\r\n this.propertyMetadataMap.set(propertyName, propertyMetadata);\r\n }\r\n\r\n this.parentTypeMetadata.childrenTypeMetadataMap.set(this.typeFn, this);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Reflects inject metadata.\r\n * \r\n * Used to configure inject metadata based on reflect metadata as inject decorators may be omitted.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public reflectInjectMetadata(): TypeMetadata<TType>\r\n {\r\n if (this.typeFn.length === 0)\r\n {\r\n return this;\r\n }\r\n\r\n const injectTypeFns = (getOwnReflectMetadata('design:paramtypes', this.typeFn) ?? new Array<TypeFn<any>>()) as Array<TypeFn<any>>;\r\n\r\n for (let injectIndex = 0; injectIndex < injectTypeFns.length; injectIndex++)\r\n {\r\n if (!this.injectMetadataMap.has(injectIndex))\r\n {\r\n this.configureInjectMetadata(injectIndex, { typeFn: injectTypeFns[injectIndex] });\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures alias.\r\n * \r\n * @param {Alias|undefined} alias Alias.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public hasAlias(alias: Alias | undefined): TypeMetadata<TType>\r\n {\r\n this.releaseAlias();\r\n\r\n this.typeOptions.alias = alias;\r\n\r\n if (!isNil(alias)) \r\n {\r\n this.typeFnMap.set(alias, this.typeFn);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Releases alias.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata. \r\n */\r\n private releaseAlias(): TypeMetadata<TType>\r\n {\r\n const alias = this.alias;\r\n\r\n if (!isNil(alias) && this.typeFnMap.has(alias))\r\n {\r\n this.typeFnMap.delete(alias);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures custom options.\r\n * \r\n * @param {Array<CustomOption>|undefined} customOptions Custom options.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n private hasCustomOptions(customOptions: Array<CustomOption> | undefined): TypeMetadata<TType>\r\n {\r\n if (!isNil(customOptions))\r\n {\r\n this.customContext.configure(customOptions);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures default value.\r\n * \r\n * @param {DefaultValue} defaultValue Default value.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public hasDefaultValue(defaultValue: DefaultValue): TypeMetadata<TType>\r\n {\r\n this.typeOptions.defaultValue = defaultValue;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures serialized default value.\r\n * \r\n * @param {DefaultValue} serializedDefaultValue Serialized default value.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public hasSerializedDefaultValue(serializedDefaultValue: DefaultValue): TypeMetadata<TType>\r\n {\r\n this.typeOptions.serializedDefaultValue = serializedDefaultValue;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures deserialized default value.\r\n * \r\n * @param {DefaultValue} deserializedDefaultValue Deserialized default value.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public hasDeserializedDefaultValue(deserializedDefaultValue: DefaultValue): TypeMetadata<TType>\r\n {\r\n this.typeOptions.deserializedDefaultValue = deserializedDefaultValue;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures discriminator.\r\n * \r\n * @param {Discriminator|undefined} discriminator Discriminator.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public hasDiscriminator(discriminator: Discriminator | undefined): TypeMetadata<TType>\r\n {\r\n this.typeOptions.discriminator = discriminator;\r\n\r\n return this;\r\n }\r\n \r\n /**\r\n * Configures discriminant.\r\n * \r\n * @param {Discriminant|undefined} discriminant Discriminant.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public hasDiscriminant(discriminant: Discriminant | undefined): TypeMetadata<TType>\r\n {\r\n this.typeOptions.discriminant = discriminant;\r\n\r\n if (!isNil(discriminant)) \r\n {\r\n this.provideDiscriminant(this.typeFn, discriminant);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Provides discriminant.\r\n * \r\n * @param {TypeFn<any>} typeFn Type function.\r\n * @param {Discriminant} discriminant Discriminant.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n private provideDiscriminant(typeFn: TypeFn<any>, discriminant: Discriminant): TypeMetadata<TType>\r\n {\r\n this.discriminantMap.set(typeFn, discriminant);\r\n\r\n if (!isNil(this.parentTypeMetadata))\r\n {\r\n this.parentTypeMetadata.provideDiscriminant(typeFn, discriminant);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures factory.\r\n * \r\n * @param {Factory|undefined} factory Factory.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public hasFactory(factory: Factory | undefined): TypeMetadata<TType>\r\n {\r\n this.typeOptions.factory = factory;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures injectable.\r\n * \r\n * @param {boolean} injectable Injectable.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public isInjectable(injectable: boolean = true): TypeMetadata<TType>\r\n {\r\n this.typeOptions.injectable = injectable;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures injector.\r\n * \r\n * @param {Injector|undefined} injector Injector.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public hasInjector(injector: Injector | undefined): TypeMetadata<TType>\r\n {\r\n this.typeOptions.injector = injector;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures log.\r\n * \r\n * @param {Log|undefined} log Log.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public hasLog(log: Log | undefined): TypeMetadata<TType>\r\n {\r\n this.typeOptions.log = log;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures naming convention.\r\n * \r\n * @param {NamingConvention|undefined} namingConvention Naming convention.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public hasNamingConvention(namingConvention: NamingConvention | undefined): TypeMetadata<TType>\r\n {\r\n this.typeOptions.namingConvention = namingConvention;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures preserve discriminator.\r\n * \r\n * @param {boolean} preserveDiscriminator Preserve discriminator.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public shouldPreserveDiscriminator(preserveDiscriminator: boolean = true): TypeMetadata<TType>\r\n {\r\n this.typeOptions.preserveDiscriminator = preserveDiscriminator;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures reference handler.\r\n * \r\n * @param {ReferenceHandler|undefined} referenceHandler Reference handler.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public hasReferenceHandler(referenceHandler: ReferenceHandler | undefined): TypeMetadata<TType>\r\n {\r\n this.typeOptions.referenceHandler = referenceHandler;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures serializer.\r\n * \r\n * @param {Serializer<TType>|undefined} serializer Serializer.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public hasSerializer(serializer: Serializer<TType> | undefined): TypeMetadata<TType>\r\n {\r\n this.typeOptions.serializer = serializer;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures preserve null.\r\n * \r\n * @param {boolean} preserveNull Preserve null.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public shouldPreserveNull(preserveNull: boolean = true): TypeMetadata<TType>\r\n {\r\n this.typeOptions.preserveNull = preserveNull;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures use default value.\r\n * \r\n * @param {boolean} useDefaultValue Use default value.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public shouldUseDefaultValue(useDefaultValue: boolean = true): TypeMetadata<TType>\r\n {\r\n this.typeOptions.useDefaultValue = useDefaultValue;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures use implicit convertion.\r\n * \r\n * @param {boolean} useImplicitConversion Use implicit convertion.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public shouldUseImplicitConversion(useImplicitConversion: boolean = true): TypeMetadata<TType>\r\n {\r\n this.typeOptions.useImplicitConversion = useImplicitConversion;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures property sorter.\r\n * \r\n * @param {PropertySorter|undefined} propertySorter Property sorter.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public hasPropertySorter(propertySorter: PropertySorter | undefined): TypeMetadata<TType>\r\n {\r\n this.typeOptions.propertySorter = propertySorter;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures inject sorter.\r\n * \r\n * @param {InjectSorter|undefined} injectSorter Inject sorter.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public hasInjectSorter(injectSorter: InjectSorter | undefined): TypeMetadata<TType>\r\n {\r\n this.typeOptions.injectSorter = injectSorter;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures certain property metadata.\r\n * \r\n * @param {PropertyName} propertyName Property name. \r\n * @param {PropertyOptions<TPropertyType>} propertyOptions Property options.\r\n * \r\n * @returns {PropertyMetadata<TType, TPropertyType>} Configured property metadata.\r\n */\r\n public configurePropertyMetadata<TPropertyType>(propertyName: PropertyName, propertyOptions?: PropertyOptions<TPropertyType>): PropertyMetadata<TType, TPropertyType>\r\n {\r\n let propertyMetadata = this.propertyMetadataMap.get(propertyName);\r\n\r\n if (isNil(propertyMetadata))\r\n {\r\n propertyMetadata = new PropertyMetadata(this, propertyName, propertyOptions ?? {});\r\n\r\n this.propertyMetadataMap.set(propertyName, propertyMetadata);\r\n this.propertyOptionsMap.set(propertyName, propertyMetadata.propertyOptions);\r\n\r\n return propertyMetadata;\r\n }\r\n\r\n if (!isNil(propertyOptions))\r\n {\r\n propertyMetadata.configure(propertyOptions);\r\n }\r\n\r\n return propertyMetadata;\r\n }\r\n\r\n /**\r\n * Configures certain inject metadata.\r\n * \r\n * @param {InjectIndex} injectIndex Inject index. \r\n * @param {InjectOptions<TInjectType>} injectOptions Inject options.\r\n * \r\n * @returns {InjectMetadata<TType, TInjectType>} Configured inject metadata.\r\n */\r\n public configureInjectMetadata<TInjectType>(injectIndex: InjectIndex, injectOptions?: InjectOptions<TInjectType>): InjectMetadata<TType, TInjectType>\r\n {\r\n let injectMetadata = this.injectMetadataMap.get(injectIndex);\r\n\r\n if (isNil(injectMetadata))\r\n {\r\n injectMetadata = new InjectMetadata(this, injectIndex, injectOptions ?? {});\r\n\r\n this.injectMetadataMap.set(injectIndex, injectMetadata);\r\n this.injectOptionsMap.set(injectIndex, injectMetadata.injectOptions);\r\n \r\n return injectMetadata;\r\n }\r\n \r\n if (!isNil(injectOptions))\r\n {\r\n injectMetadata.configure(injectOptions);\r\n }\r\n\r\n return injectMetadata;\r\n }\r\n\r\n /**\r\n * Configures property metadata map.\r\n * \r\n * @param {Map<PropertyName, PropertyOptions<TPropertyType>>} propertyOptionsMap Property options map.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public hasPropertyMetadataMap<TPropertyType>(propertyOptionsMap: Map<PropertyName, PropertyOptions<TPropertyType>>): TypeMetadata<TType>\r\n {\r\n for (const [propertyName, propertyOptions] of propertyOptionsMap)\r\n {\r\n this.configurePropertyMetadata(propertyName, propertyOptions);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures inject metadata map.\r\n * \r\n * @param {Map<InjectIndex, InjectOptions<TInjectType>>} injectOptionsMap Inject options map.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public hasInjectMetadataMap<TInjectType>(injectOptionsMap: Map<InjectIndex, InjectOptions<TInjectType>>): TypeMetadata<TType>\r\n {\r\n for (const [injectIndex, injectOptions] of injectOptionsMap)\r\n {\r\n this.configureInjectMetadata(injectIndex, injectOptions);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Configures type metadata based on provided options.\r\n * \r\n * @param {TypeOptions<TType>} typeOptions Type options.\r\n * \r\n * @returns {TypeMetadata<TType>} Current instance of type metadata.\r\n */\r\n public configure(typeOptions: TypeOptions<TType>): TypeMetadata<TType>\r\n {\r\n if (!isUndefined(typeOptions.alias)) \r\n {\r\n this.hasAlias(typeOptions.alias);\r\n }\r\n\r\n if (!isUndefined(typeOptions.customOptions))\r\n {\r\n this.hasCustomOptions(typeOptions.customOptions);\r\n }\r\n\r\n if (!isUndefined(typeOptions.defaultValue))\r\n {\r\n this.hasDefaultValue(typeOptions.defaultValue);\r\n }\r\n\r\n if (!isUndefined(typeOptions.serializedDefaultValue))\r\n {\r\n this.hasSerializedDefaultValue(typeOptions.serializedDefaultValue);\r\n }\r\n\r\n if (!isUndefined(typeOptions.deserializedDefaultValue)) \r\n {\r\n this.hasDeserializedDefaultValue(typeOptions.deserializedDefaultValue);\r\n }\r\n\r\n if (!isUndefined(typeOptions.discriminator)) \r\n {\r\n this.hasDiscriminator(typeOptions.discriminator);\r\n }\r\n\r\n if (!isUndefined(typeOptions.discriminant))\r\n {\r\n this.hasDiscriminant(typeOptions.discriminant);\r\n }\r\n\r\n if (!isUndefined(typeOptions.factory)) \r\n {\r\n this.hasFactory(typeOptions.factory);\r\n }\r\n\r\n if (!isUndefined(typeOptions.injectable))\r\n {\r\n this.isInjectable(typeOptions.injectable);\r\n }\r\n\r\n if (!isUndefined(typeOptions.injector))\r\n {\r\n this.hasInjector(typeOptions.injector);\r\n }\r\n\r\n if (!isUndefined(typeOptions.log))\r\n {\r\n this.hasLog(typeOptions.log);\r\n }\r\n\r\n if (!isUndefined(typeOptions.namingConvention))\r\n {\r\n this.hasNamingConvention(typeOptions.namingConvention);\r\n }\r\n\r\n if (!isUndefined(typeOptions.preserveDiscriminator))\r\n {\r\n this.shouldPreserveDiscriminator(typeOptions.preserveDiscriminator);\r\n }\r\n\r\n if (!isUndefined(typeOptions.referenceHandler))\r\n {\r\n this.hasReferenceHandler(typeOptions.referenceHandler);\r\n }\r\n\r\n if (!isUndefined(typeOptions.serializer))\r\n {\r\n this.hasSerializer(typeOptions.serializer);\r\n }\r\n\r\n if (!isUndefined(typeOptions.preserveNull))\r\n {\r\n this.shouldPreserveNull(typeOptions.preserveNull);\r\n }\r\n\r\n if (!isUndefined(typeOptions.useDefaultValue)) \r\n {\r\n this.shouldUseDefaultValue(typeOptions.useDefaultValue);\r\n }\r\n\r\n if (!isUndefined(typeOptions.useImplicitConversion)) \r\n {\r\n this.shouldUseImplicitConversion(typeOptions.useImplicitConversion);\r\n }\r\n\r\n if (!isUndefined(typeOptions.propertyOptionsMap))\r\n {\r\n this.hasPropertyMetadataMap(typeOptions.propertyOptionsMap);\r\n }\r\n\r\n if (!isUndefined(typeOptions.injectOptionsMap))\r\n {\r\n this.hasInjectMetadataMap(typeOptions.injectOptionsMap);\r\n }\r\n\r\n if (!isUndefined(typeOptions.propertySorter))\r\n {\r\n this.hasPropertySorter(typeOptions.propertySorter);\r\n }\r\n\r\n if (!isUndefined(typeOptions.injectSorter))\r\n {\r\n this.hasInjectSorter(typeOptions.injectSorter);\r\n }\r\n\r\n return this;\r\n }\r\n}\r\n","import { TypeManager } from './type-manager';\r\nimport { TypeOptions } from './type-options';\r\n\r\n/**\r\n * Type decorator.\r\n * \r\n * @param {TypeOptions<TType>} typeOptions Type options.\r\n *\r\n * @returns {ClassDecorator} Class decorator.\r\n */\r\nexport function Type<TType>(typeOptions?: TypeOptions<TType>): ClassDecorator\r\n{\r\n return function (target: any): any\r\n {\r\n TypeManager.configureTypeMetadata(target, typeOptions).reflectInjectMetadata();\r\n\r\n return target;\r\n };\r\n}\r\n","/**\r\n * In type script there is no explicit class for unknown type. We want to allow serialization and \r\n * deserialization without specify any serializers. However such behaviour should be visible in the \r\n * type metadata.\r\n * \r\n * @type {Unknown}\r\n */\r\nexport class Unknown\r\n{\r\n \r\n}\r\n","module.exports = __WEBPACK_EXTERNAL_MODULE__7607__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(3465);\n"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE__7607__","Any","customOptions","Array","customValueMap","Map","constructCustomOptions","configure","customKey","customValue","set","splice","length","entries","push","i","get","isUndefined","isNil","customValueResolver","has","keys","values","CustomContext","CustomKey","description","build","typeContext","injector","typeMetadata","typeCtor","isCtorFunction","typeFn","undefined","Error","typeName","injectedKeys","args","fill","sortedInjectMetadatas","injectMetadata","argKey","key","injectIndex","value","type","typeContextEntry","propertyMetadata","includes","propertyName","TypeFactory","metadataKey","target","isObject","Reflect","isFunction","getOwnMetadata","propertyKey","getMetadata","x","words","prototype","constructor","name","DataView","Float32Array","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Uint8Array","Uint8ClampedArray","reviver","JSON","parse","replacer","space","spacing","isFinite","join","separator","seen","stringify","parent","node","level","toJSON","call","indent","out","isArray","indexOf","TypeError","seenIndex","Object","sort","declaringTypeMetadata","injectOptions","typeManager","reflectTypeFn","getOwnReflectMetadata","constructInjectOptions","injectInternals","constructInjectInternals","typeMetadataResolver","unknownFn","Unknown","defineTypeMetadataResolver","hasKey","hasTypeFn","Metadata","InjectMetadata","y","a","b","AscInjectSorter","DescInjectSorter","isString","nameOf","String","isNumber","TypeManager","configureTypeMetadata","configureInjectMetadata","instanceMap","WeakMap","injectable","instance","init","injectMetadataMap","SingletonInjector","LogLevel","logLevel","infoEnabled","Info","warnEnabled","Warn","errorEnabled","supportsConsole","console","supportsConsoleLog","log","supportsConsoleInfo","info","supportsConsoleWarn","warn","supportsConsoleError","error","message","optionalParams","Log","typeFnMap","typeArgument","resolveTypeMetadataUsingUnknownTypeFn","bind","resolveTypeMetadataUsingAlias","isArrowFunction","resolveTypeMetadataUsingTypeResolver","resolveTypeMetadataUsingTypeFn","extractTypeMetadata","alias","typeResolver","defineGenericStructures","genericArguments","genericStructures","genericArgument","genericTypeArgument","genericGenericArguments","defineGenericMetadataResolvers","genericMetadataResolvers","genericStructure","genericGenericStructures","defineGenericMetadatas","genericMetadatas","genericMetadataResolver","genericGenericMetadataResolvers","convert","getWords","reduce","result","word","index","wordLowerCased","toLowerCase","toUpperCase","slice","CamelCaseNamingConvention","FlatCaseNamingConvention","FlatUpperCaseNamingConvention","KebabCaseNamingConvention","wordUpperCased","KebabUpperCaseNamingConvention","wordPascalCased","PascalCaseNamingConvention","SnakeCaseNamingConvention","SnakeUpperCaseNamingConvention","propertyOptions","getReflectMetadata","constructPropertyOptions","propertyInternals","constructPropertyInternals","customContext","preserveNull","serializedDefaultValue","useDefaultValue","defaultValue","deserializedDefaultValue","namingConvention","deserializable","referenceHandler","serializable","serializer","useImplicitConversion","hasAlias","hasCustomOptions","hasDefaultValue","hasSerializedDefaultValue","hasDeserializedDefaultValue","isDeserializable","isSerializable","hasGenericArguments","hasNamingConvention","hasReferenceHandler","hasSerializer","hasTypeArgument","shouldPreserveNull","shouldUseDefaultValue","shouldUseImplicitConversion","PropertyMetadata","AscPropertySorter","DescPropertySorter","z","merge","isSymbol","configurePropertyMetadata","serializerContext","referenceKey","referenceValueGetter","referenceMap","referenceValue","resolveReferenceCallbacks","registerReferenceCallback","restore","CircularReferenceHandler","arrayKeyRegExp","RegExp","referencePath","jsonPath","$ref","referenceTarget","defineReferenceTarget","pushReferenceCallback","$","referencePathArray","convertReferencePathToArray","shift","array","parts","split","JsonPathReferenceHandler","PlainReferenceHandler","referenceCallbackMap","serializerContextOptions","parentSerializerContext","jsonPathKey","referenceValueSetter","discriminant","discriminantMap","discriminator","polymorphic","preserveDiscriminator","serialize","deserialize","defineReference","restoreReference","referenceCallback","referenceCallbacks","defineSerializerContextOptions","defineChildSerializerContext","childSerializerContextOptions","SerializerContext","defineGenericSerializerContext","genericIndex","genericTypeMetadataResolver","definePolymorphicSerializerContext","definePolymorphicSerializerContextByTypeFn","definePolymorphicSerializerContextByDiscriminant","record","hasJsonPathKey","hasReferenceValueSetter","hasGenericStructures","hasGenericMetadataResolvers","hasPropertyMetadata","hasTypeMetadata","isNull","serializedNullValue","deserializedNullValue","AnySerializer","isArrayBuffer","arrayBufferView","from","map","c","fromCharCode","arrayBuffer","ArrayBuffer","charCodeAt","ArrayBufferSerializer","arrayInput","arrayOutput","genericSerializerContext","valueSerializerContext","v","ArraySerializer","isBoolean","BooleanSerializer","isDataView","buffer","DataViewSerializer","isDate","toISOString","Date","DateSerializer","isFloat32Array","Float32ArraySerializer","isFloat64Array","Float64ArraySerializer","isInt16Array","Int16ArraySerializer","isInt32Array","Int32ArraySerializer","isInt8Array","Int8ArraySerializer","isMap","genericKeySerializerContext","genericValueSerializerContext","keyArraySerializerContext","valueArraySerializerContext","keySerializerContext","mk","mv","MapSerializer","Number","NumberSerializer","isSet","Set","add","SetSerializer","StringSerializer","typeSerializerContext","propertySerializerContext","object","serializationConfigured","serializedPropertyName","deserializedPropertyName","propertyValue","declaringObject","sortedPropertyMetadatas","hasOwnProperty","TypeContext","declaringType","TypeContextEntry","TypeSerializer","isUint16Array","Uint16ArraySerializer","isUint32Array","Uint32ArraySerializer","isUint8Array","Uint8ArraySerializer","isUint8ClampedArray","Uint8ClampedArraySerializer","UnknownSerializer","typeContextEntryMap","typeManagerOptions","symbol","Symbol","typeMetadataSymbol","constructTypeManagerOptions","constructCustomContext","staticTypeManager","typeOptionsBase","constructTypeOptionsBase","typeOptionsMap","constructTypeOptionsMap","typeConfigurationMap","initialTypeOptionsBase","assign","defaultTypeOptionsBase","initialTypeOptionsMap","defaultTypeOptionsMap","typeOptions","mapTypeOptions","clear","typeMetadataDefined","declareTypeMetadata","defineProperty","enumerable","configurable","writable","parentTypeMetadata","getPrototypeOf","TypeMetadata","applyTypeOptionsBase","applyTypeOptionsMap","applyTypeOptions","applyTypeConfigurationMap","typeConfiguration","applyTypeConfiguration","defineSerializerContext","arrayFn","jsonStringify","jsonParse","Boolean","for","childrenTypeMetadataMap","propertyMetadataMap","constructTypeOptions","typeInternals","constructTypeInternals","deriveParentTypeMetadataProperties","hasDiscriminant","size","propertySorter","propertyMetadatas","iterator","injectSorter","injectMetadatas","propertyOptionsMap","injectOptionsMap","reflectInjectMetadata","injectTypeFns","releaseAlias","delete","hasDiscriminator","provideDiscriminant","hasFactory","isInjectable","hasInjector","hasLog","shouldPreserveDiscriminator","hasPropertySorter","hasInjectSorter","hasPropertyMetadataMap","hasInjectMetadataMap","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""}
1
+ {"version":3,"file":"index.js","mappings":"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","sources":["webpack://$DSTypeManager/webpack/universalModuleDefinition","webpack://$DSTypeManager/./src/any.ts","webpack://$DSTypeManager/./src/custom-context.ts","webpack://$DSTypeManager/./src/custom-key.ts","webpack://$DSTypeManager/./src/factories/index.ts","webpack://$DSTypeManager/./src/factories/type-factory.ts","webpack://$DSTypeManager/./src/functions/get-own-reflect-metadata.ts","webpack://$DSTypeManager/./src/functions/get-reflect-metadata.ts","webpack://$DSTypeManager/./src/functions/get-words.ts","webpack://$DSTypeManager/./src/functions/index.ts","webpack://$DSTypeManager/./src/functions/is-arrow-function.ts","webpack://$DSTypeManager/./src/functions/is-ctor-function.ts","webpack://$DSTypeManager/./src/functions/is-data-view.ts","webpack://$DSTypeManager/./src/functions/is-float-32-array.ts","webpack://$DSTypeManager/./src/functions/is-float-64-array.ts","webpack://$DSTypeManager/./src/functions/is-int-16-array.ts","webpack://$DSTypeManager/./src/functions/is-int-32-array.ts","webpack://$DSTypeManager/./src/functions/is-int-8-array.ts","webpack://$DSTypeManager/./src/functions/is-uint-16-array.ts","webpack://$DSTypeManager/./src/functions/is-uint-32-array.ts","webpack://$DSTypeManager/./src/functions/is-uint-8-array.ts","webpack://$DSTypeManager/./src/functions/is-uint-8-clamped-array.ts","webpack://$DSTypeManager/./src/functions/json-parse.ts","webpack://$DSTypeManager/./src/functions/json-stringify.ts","webpack://$DSTypeManager/./src/functions/name-of.ts","webpack://$DSTypeManager/./src/index.ts","webpack://$DSTypeManager/./src/inject-metadata.ts","webpack://$DSTypeManager/./src/inject-sorters/asc-inject-sorter.ts","webpack://$DSTypeManager/./src/inject-sorters/desc-inject-sorter.ts","webpack://$DSTypeManager/./src/inject-sorters/index.ts","webpack://$DSTypeManager/./src/inject.ts","webpack://$DSTypeManager/./src/injectors/index.ts","webpack://$DSTypeManager/./src/injectors/singleton-injector.ts","webpack://$DSTypeManager/./src/log-level.ts","webpack://$DSTypeManager/./src/log.ts","webpack://$DSTypeManager/./src/metadata.ts","webpack://$DSTypeManager/./src/naming-conventions/camel-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/flat-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/flat-upper-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/index.ts","webpack://$DSTypeManager/./src/naming-conventions/kebab-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/kebab-upper-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/pascal-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/snake-case-naming-convention.ts","webpack://$DSTypeManager/./src/naming-conventions/snake-upper-case-naming-convention.ts","webpack://$DSTypeManager/./src/property-metadata.ts","webpack://$DSTypeManager/./src/property-sorters/asc-property-sorter.ts","webpack://$DSTypeManager/./src/property-sorters/desc-property-sorter.ts","webpack://$DSTypeManager/./src/property-sorters/index.ts","webpack://$DSTypeManager/./src/property.ts","webpack://$DSTypeManager/./src/reference-handlers/circular-reference-handler.ts","webpack://$DSTypeManager/./src/reference-handlers/index.ts","webpack://$DSTypeManager/./src/reference-handlers/json-path-reference-handler.ts","webpack://$DSTypeManager/./src/reference-handlers/plain-reference-handler.ts","webpack://$DSTypeManager/./src/serializer-context.ts","webpack://$DSTypeManager/./src/serializers/any-serializer.ts","webpack://$DSTypeManager/./src/serializers/array-buffer-serializer.ts","webpack://$DSTypeManager/./src/serializers/array-serializer.ts","webpack://$DSTypeManager/./src/serializers/boolean-serializer.ts","webpack://$DSTypeManager/./src/serializers/data-view-serializer.ts","webpack://$DSTypeManager/./src/serializers/date-serializer.ts","webpack://$DSTypeManager/./src/serializers/float-32-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/float-64-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/index.ts","webpack://$DSTypeManager/./src/serializers/int-16-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/int-32-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/int-8-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/map-serializer.ts","webpack://$DSTypeManager/./src/serializers/number-serializer.ts","webpack://$DSTypeManager/./src/serializers/set-serializer.ts","webpack://$DSTypeManager/./src/serializers/string-serializer.ts","webpack://$DSTypeManager/./src/serializers/type-serializer.ts","webpack://$DSTypeManager/./src/serializers/uint-16-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/uint-32-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/uint-8-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/uint-8-clamped-array-serializer.ts","webpack://$DSTypeManager/./src/serializers/unknown-serializer.ts","webpack://$DSTypeManager/./src/type-context-entry.ts","webpack://$DSTypeManager/./src/type-context.ts","webpack://$DSTypeManager/./src/type-manager.ts","webpack://$DSTypeManager/./src/type-metadata-symbol.ts","webpack://$DSTypeManager/./src/type-metadata.ts","webpack://$DSTypeManager/./src/type.ts","webpack://$DSTypeManager/./src/unknown.ts","webpack://$DSTypeManager/external umd {\"commonjs\":\"lodash\",\"commonjs2\":\"lodash\",\"amd\":\"lodash\",\"root\":\"_\"}","webpack://$DSTypeManager/webpack/bootstrap","webpack://$DSTypeManager/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"lodash\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"$DSTypeManager\", [\"lodash\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"$DSTypeManager\"] = factory(require(\"lodash\"));\n\telse\n\t\troot[\"$DSTypeManager\"] = factory(root[\"_\"]);\n})(this, (__WEBPACK_EXTERNAL_MODULE__7607__) => {\nreturn ","/**\n * In type script there is no explicit class for any type but sometimes such serialization is required.\n * This simple class will allow direct serialization and deserialization. No transformations will be applied \n * for properties which specify it as a type argument.\n * \n * @type {Any}\n */\nexport class Any\n{\n \n}\n","import { isNil, isUndefined } from 'lodash';\nimport { CustomKey } from './custom-key';\nimport { CustomOption } from './custom-option';\nimport { CustomValue } from './custom-value';\n\n/**\n * Custom context class to encapsulate custom values attached to metadata.\n * \n * @type {CustomContext}\n */\nexport class CustomContext\n{\n /**\n * Custom options.\n * \n * @type {Array<CustomOption>}\n */\n public readonly customOptions: Array<CustomOption>;\n\n /**\n * Custom value map.\n * \n * @type {Map<CustomKey<any>, CustomValue>}\n */\n public readonly customValueMap: Map<CustomKey<any>, CustomValue> = new Map<CustomKey<any>, CustomValue>();\n\n /**\n * Constructor.\n * \n * @param {Array<CustomOption>} customOptions Custom options.\n */\n public constructor(customOptions: Array<CustomOption> = new Array<CustomOption>())\n {\n this.customOptions = this.constructCustomOptions(customOptions);\n\n this.configure(customOptions);\n\n return;\n }\n\n /**\n * Constructs initial custom options by removing duplicates. \n * All references are kept.\n * \n * @param {Array<CustomOption>} customOptions Custom options.\n * \n * @returns {CustomOptions} Constructed custom options.\n */\n private constructCustomOptions(customOptions: Array<CustomOption>): Array<CustomOption>\n {\n const customValueMap = new Map<CustomKey<any>, CustomValue>();\n\n for (const [customKey, customValue] of customOptions)\n {\n customValueMap.set(customKey, customValue);\n }\n\n customOptions.splice(0, customOptions.length);\n\n for (const [customKey, customValue] of customValueMap.entries())\n {\n customOptions.push([customKey, customValue]);\n }\n\n return customOptions;\n }\n\n /**\n * Sets value for a custom key.\n * \n * @param {CustomKey} customKey Custom key.\n * @param {CustomValue} customValue Custom value.\n * \n * @returns {CustomContext} Custom context.\n */\n public set<TCustomValue>(customKey: CustomKey<TCustomValue>, customValue: TCustomValue): CustomContext\n {\n const customOptions = this.customOptions;\n\n this.customValueMap.set(customKey, customValue);\n\n for (let i = 0; i < customOptions.length; i++)\n {\n if (customOptions[i][0] === customKey)\n {\n customOptions[i][1] = customValue;\n\n return this;\n }\n }\n\n customOptions.push([customKey, customValue]);\n\n return this;\n }\n\n /**\n * Gets value by custom key.\n * \n * @param {CustomKey} customKey Custom key.\n * \n * @returns {CustomValue} Custom value.\n */\n public get<TCustomValue>(customKey: CustomKey<TCustomValue>): TCustomValue\n {\n let customValue = this.customValueMap.get(customKey);\n \n if (isUndefined(customValue) && !isNil(customKey.customValueResolver))\n {\n customValue = customKey.customValueResolver();\n }\n\n return customValue;\n }\n\n /**\n * Checks if type context has a custom key.\n * \n * @param {CustomKey} customKey Custom key.\n * \n * @returns {boolean} True when type context has a custom key. False otherwise.\n */\n public has<TCustomValue>(customKey: CustomKey<TCustomValue>): boolean\n {\n return this.customValueMap.has(customKey);\n }\n\n /**\n * Gets iterable for keys inside the context.\n * \n * @returns {IterableIterator<CustomValue>} Iterable for keys inside the context.\n */\n public keys(): IterableIterator<CustomKey<any>>\n {\n return this.customValueMap.keys();\n }\n\n /**\n * Gets iterable for values inside the context.\n * \n * @returns {IterableIterator<CustomValue>} Iterable for values inside the context.\n */\n public values(): IterableIterator<CustomValue>\n {\n return this.customValueMap.values();\n }\n\n /**\n * Gets iterable for entries inside the context.\n * \n * @returns {IterableIterator<[CustomKey<any>, CustomValue]>} Iterable for entries inside the context.\n */\n public entries(): IterableIterator<[CustomKey<any>, CustomValue]>\n {\n return this.customValueMap.entries();\n }\n\n /**\n * Configures custom context based on custom options.\n * \n * @param {Array<CustomOption>} customOptions Custom options.\n * \n * @returns {CustomContext} Custom context.\n */\n public configure(customOptions: Array<CustomOption>): CustomContext\n {\n for (const [customKey, customValue] of customOptions)\n {\n this.set(customKey, customValue);\n }\n\n return this;\n }\n}\n","import { CustomValueResolver } from './custom-value-resolver';\n\n/**\n * Key used to describe custom value. Such key is explicitly defined and used\n * by type manager plugins to store strongly typed custom values within a metadata.\n * \n * @type {CustomKey<TCustomValue>}\n */\nexport class CustomKey<TCustomValue>\n{\n /**\n * Description.\n * \n * @type {string}\n */\n public readonly description: string;\n\n /**\n * Custom value resolver.\n * \n * @type {CustomValueResolver<TCustomValue}\n */\n public readonly customValueResolver?: CustomValueResolver<TCustomValue>;\n \n /**\n * Constructor.\n * \n * @param {string} description Description.\n * @param {CustomValueResolver<TCustomValue>} customValueResolver Custom value resolver.\n */\n public constructor(description: string, customValueResolver?: CustomValueResolver<TCustomValue>)\n {\n this.description = description;\n this.customValueResolver = customValueResolver;\n\n return;\n }\n}\n","export * from './type-factory';\n","import { isNil, isUndefined } from 'lodash';\nimport { Factory } from '../factory';\nimport { isCtorFunction } from '../functions/is-ctor-function';\nimport { Injector } from '../injector';\nimport { TypeContext } from '../type-context';\n\n/**\n * Type factory.\n * \n * @type {TypeFactory}\n */\nexport class TypeFactory implements Factory\n{\n /**\n * Builds type described by provided type metadata.\n * \n * @param {TypeContext<TType>} typeContext Type context.\n * @param {Injector} injector Injector.\n * \n * @returns {Record<string, any>} Type instance described by provided type metadata.\n */\n public build<TType>(typeContext: TypeContext<TType>, injector: Injector): TType\n {\n const typeMetadata = typeContext.typeMetadata;\n const typeCtor = isCtorFunction(typeMetadata.typeFn) ? typeMetadata.typeFn : undefined;\n\n if (isNil(typeCtor))\n {\n throw new Error(`${typeMetadata.typeName}: cannot build instance of abstract type.`);\n }\n \n const injectedKeys = new Array<any>();\n const args = new Array<any>(typeCtor.length).fill(undefined);\n\n for (const injectMetadata of typeMetadata.sortedInjectMetadatas)\n {\n const argKey = injectMetadata.key;\n\n if (!isNil(argKey))\n {\n args[injectMetadata.injectIndex] = typeContext.get(argKey)?.value;\n\n injectedKeys.push(argKey);\n\n continue;\n }\n\n args[injectMetadata.injectIndex] = injector.get(injectMetadata.typeMetadata);\n }\n\n const type = new typeCtor(...args) as any;\n\n for (const typeContextEntry of typeContext.values())\n {\n const propertyMetadata = typeContextEntry.propertyMetadata;\n\n if (\n !isNil(propertyMetadata)\n && !isUndefined(typeContextEntry.value)\n && !injectedKeys.includes(propertyMetadata.propertyName)\n )\n {\n type[propertyMetadata.propertyName] = typeContextEntry.value;\n }\n }\n\n return type;\n }\n}\n","import { isFunction, isObject } from 'lodash';\n\n/**\n * Reflect class declaration.\n * \n * @type {Reflect}\n */\ndeclare class Reflect\n{\n /**\n * Gets metadata value of an own metadata key of an object or property.\n * \n * @param {string} metadataKey Unique metadata key.\n * @param {any} target Target to extract from. \n * \n * @returns {any} Metadata for a key or undefined if metadata is not present.\n */\n public static getOwnMetadata(metadataKey: string, target: any): any;\n}\n\n/**\n * Gets own reflect metadata.\n * \n * @param {string} metadataKey Unique metadata key.\n * @param {any} target Target to extract from. \n * \n * @returns {any} Metadata for a key or undefined if metadata is not present.\n */\nexport function getOwnReflectMetadata(metadataKey: string, target: any): any\n{\n if (isObject(Reflect) && isFunction(Reflect.getOwnMetadata))\n {\n return Reflect.getOwnMetadata(metadataKey, target);\n }\n\n return undefined;\n}\n","import { isFunction, isObject } from 'lodash';\n\n/**\n * Reflect class declaration.\n * \n * @type {Reflect}\n */\ndeclare class Reflect \n{\n /**\n * Gets metadata value of a metadata key on the prototype chain of an object or property.\n * \n * @param {string} metadataKey Unique metadata key.\n * @param {any} target Target to extract from. \n * @param {string|symbol} propertyKey Key in a target.\n * \n * @returns {any} Metadata for a key or undefined if metadata is not present.\n */\n public static getMetadata(metadataKey: string, target: any, propertyKey: string | symbol): any;\n}\n\n/**\n * Gets reflect metadata.\n * \n * @param {string} metadataKey Unique metadata key.\n * @param {any} target Target to extract from. \n * @param {string|symbol} propertyKey Key in a target.\n * \n * @returns {any} Metadata for a key or undefined if metadata is not present.\n */\nexport function getReflectMetadata(metadataKey: string, target: any, propertyKey: string | symbol): any\n{\n if (isObject(Reflect) && isFunction(Reflect.getMetadata))\n {\n return Reflect.getMetadata(metadataKey, target, propertyKey);\n }\n\n return undefined;\n}\n","import { words } from 'lodash';\n\n/**\n * Gets words from a string.\n *\n * @param {string} x String.\n * \n * @returns {Array<string>} Array with the words of provided string.\n */\nexport function getWords(x: string): Array<string>\n{\n return words(x);\n}\n","export * from './get-own-reflect-metadata';\nexport * from './get-reflect-metadata';\nexport * from './get-words';\nexport * from './is-arrow-function';\nexport * from './is-ctor-function';\nexport * from './is-data-view';\nexport * from './is-float-32-array';\nexport * from './is-float-64-array';\nexport * from './is-int-8-array';\nexport * from './is-int-16-array';\nexport * from './is-int-32-array';\nexport * from './is-uint-8-array';\nexport * from './is-uint-8-clamped-array';\nexport * from './is-uint-16-array';\nexport * from './is-uint-32-array';\nexport * from './json-parse';\nexport * from './json-stringify';\nexport * from './name-of';\n","import { isFunction } from 'lodash';\n\n/**\n * Checks if value is an arrow function.\n * \n * @param {any} x Input value.\n * \n * @returns {boolean} True when value is an arrow function. False otherwise.\n */\nexport function isArrowFunction(x: any): x is (...args: Array<any>) => any\n{\n return isFunction(x) && x.prototype && x.prototype.constructor === x && x.name === '';\n}\n","import { isFunction } from 'lodash';\n\n/**\n * Checks if value is a constructor function.\n * \n * @param {any} x Input value.\n * \n * @returns {boolean} True when value is a constructor function. False otherwise.\n */\nexport function isCtorFunction(x: any): x is new (...args: Array<any>) => any\n{\n return isFunction(x) && x.prototype && x.prototype.constructor === x && x.name !== '';\n}\n","/**\n * Checks if value is data view.\n * \n * @param {any} x Input value.\n * \n * @returns {boolean} True when value is data view. False otherwise.\n */\nexport function isDataView(x: any): x is DataView\n{\n return x instanceof DataView;\n}\n","/**\n * Checks if value is float 32 array.\n * \n * @param {any} x Input value.\n * \n * @returns {boolean} True when value is float 32 array. False otherwise.\n */\nexport function isFloat32Array(x: any): x is Float32Array\n{\n return x instanceof Float32Array;\n}\n","/**\n * Checks if value is float 64 array.\n * \n * @param {any} x Input value.\n * \n * @returns {boolean} True when value is float 64 array. False otherwise.\n */\nexport function isFloat64Array(x: any): x is Float64Array\n{\n return x instanceof Float64Array;\n}\n","/**\n * Checks if value is int 16 array.\n * \n * @param {any} x Input value.\n * \n * @returns {boolean} True when value is int 16 array. False otherwise.\n */\nexport function isInt16Array(x: any): x is Int16Array\n{\n return x instanceof Int16Array;\n}\n","/**\n * Checks if value is int 32 array.\n * \n * @param {any} x Input value.\n * \n * @returns {boolean} True when value is int 32 array. False otherwise.\n */\nexport function isInt32Array(x: any): x is Int32Array\n{\n return x instanceof Int32Array;\n}\n","/**\n * Checks if value is int 8 array.\n * \n * @param {any} x Input value.\n * \n * @returns {boolean} True when value is int 8 array. False otherwise.\n */\nexport function isInt8Array(x: any): x is Int8Array\n{\n return x instanceof Int8Array;\n}\n","/**\n * Checks if value is uint 16 array.\n * \n * @param {any} x Input value.\n * \n * @returns {boolean} True when value is uint 16 array. False otherwise.\n */\nexport function isUint16Array(x: any): x is Uint16Array\n{\n return x instanceof Uint16Array;\n}\n","/**\n * Checks if value is uint 32 array.\n * \n * @param {any} x Input value.\n * \n * @returns {boolean} True when value is uint 32 array. False otherwise.\n */\nexport function isUint32Array(x: any): x is Uint32Array\n{\n return x instanceof Uint32Array;\n}\n","/**\n * Checks if value is uint 8 array.\n * \n * @param {any} x Input value.\n * \n * @returns {boolean} True when value is uint 8 array. False otherwise.\n */\nexport function isUint8Array(x: any): x is Uint8Array\n{\n return x instanceof Uint8Array;\n}\n","/**\n * Checks if value is uint 8 clamped array.\n * \n * @param {any} x Input value.\n * \n * @returns {boolean} True when value is uint 8 clamped array. False otherwise.\n */\nexport function isUint8ClampedArray(x: any): x is Uint8ClampedArray\n{\n return x instanceof Uint8ClampedArray;\n}\n","/**\n * Function which returns consistent results when parse JSON object.\n * \n * @param {string} x A valid JSON string.\n * @param {Function} reviver A function that transforms the results. This function is called for each member of the object.\n * \n * @returns {any} Consistent JSON parse result.\n */\nexport function jsonParse(\n x: string,\n reviver?: (this: any, key: string, value: any) => any | undefined\n): any\n{\n return JSON.parse(x, reviver);\n}\n","/**\n * Function which returns consistent results when stringify JSON object.\n * \n * @param {any} x Input value, usually an object or array, to be converted.\n * @param {Function|Array<number>|Array<string>} replacer A function that transforms the results or an array of strings and numbers that acts as an approved list.\n * @param {string|number} space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\n * \n * @returns {string} Consistent JSON string which can be used for hashing.\n */\nexport function jsonStringify(\n x: any, \n replacer?: (this: any, key: string, value: any) => any | Array<number> | Array<string> | null,\n space?: string | number\n): string\n{\n\tconst spacing = typeof space === 'number' ? new Array(isFinite(space) ? space + 1 : 0).join(' ') : (space ?? '');\n\tconst separator = spacing ? ': ' : ':';\n\tconst seen = new Array<any>();\n\t\n\tconst stringify = (parent: any, key: any, node: any, level: number): any =>\n {\n\t\tif (node && node.toJSON && typeof node.toJSON === 'function')\n {\n\t\t\tnode = node.toJSON();\n\t\t}\n\n\t\tif (replacer)\n\t\t{\n\t\t\tnode = replacer.call(parent, key, node);\n\t\t}\n\n\t\tif (node === undefined)\n {\n\t\t\treturn;\n\t\t}\n\n\t\tif (typeof node === 'number')\n\t\t{\n\t\t\treturn isFinite(node) ? '' + node : 'null';\n\t\t}\n\n\t\tif (typeof node !== 'object')\n {\n\t\t\treturn JSON.stringify(node);\n\t\t}\n\n\t\tlet i = 0;\n\t\tlet indent = '';\n\t\tlet out = '';\n\n\t\tif (spacing)\n\t\t{\n\t\t\tindent += '\\n';\n\n\t\t\tfor (i = 0; i < level + 1; i++)\n\t\t\t{\n\t\t\t\tindent += spacing;\n\t\t\t}\n\t\t}\n\n\t\tif (Array.isArray(node))\n {\n\t\t\tout += '['; \n\n\t\t\tfor (i = 0; i < node.length; i++)\n {\n\t\t\t\tif (i) \n\t\t\t\t{\n\t\t\t\t\tout += ',';\n\t\t\t\t}\n\n\t\t\t\tconst value = stringify(node, i, node[i], level + 1) || 'null';\n\n\t\t\t\tout += indent + spacing + value;\n\t\t\t}\n\n\t\t\tout += indent;\n\t\t\tout += ']';\n\n\t\t\treturn out;\n\t\t}\n\n\t\tif (node === null)\n\t\t{\n\t\t\treturn 'null';\n\t\t}\n\n\t\tif (seen.indexOf(node) !== -1)\n {\n\t\t\tthrow new TypeError('Converting circular structure to JSON.');\n\t\t}\n\n\t\tconst seenIndex = seen.push(node) - 1;\n\t\tconst keys = Object.keys(node).sort();\n\n\t\tfor (i = 0; i < keys.length; i++)\n {\n\t\t\tconst key = keys[i];\n\t\t\tconst value = stringify(node, key, node[key], level + 1);\n\n\t\t\tif (!value) \n {\n continue; \n }\n\n\t\t\tif (out)\n\t\t\t{\n\t\t\t\tout += ',';\n\t\t\t}\n\n\t\t\tout += indent + spacing + JSON.stringify(key) + separator + value;\n\t\t}\n\n\t\tseen.splice(seenIndex, 1);\n\n\t\treturn '{' + out + indent + '}';\n\t};\n\t\n\treturn stringify({ '': x }, '', x, 0);\n}\n","import { isFunction } from 'lodash';\n\n/**\n * Defines name for any value.\n * \n * @param {any} x Input value.\n * \n * @returns {boolean} Name when present. Unknown otherwise.\n */\nexport function nameOf(x: any): string\n{\n if (isFunction(x))\n {\n return x.name;\n }\n\n return 'Unknown';\n}\n","export * from './factories';\nexport * from './functions';\nexport * from './inject-sorters';\nexport * from './injectors';\nexport * from './naming-conventions';\nexport * from './property-sorters';\nexport * from './reference-handlers';\nexport * from './serializers';\nexport * from './alias';\nexport * from './any';\nexport * from './custom-context';\nexport * from './custom-key';\nexport * from './custom-option';\nexport * from './custom-value-resolver';\nexport * from './custom-value';\nexport * from './default-value-resolver';\nexport * from './default-value';\nexport * from './discriminant';\nexport * from './discriminator';\nexport * from './factory';\nexport * from './generic-argument';\nexport * from './generic-metadata-resolver';\nexport * from './generic-metadata';\nexport * from './generic-structure';\nexport * from './inject-index';\nexport * from './inject-internals';\nexport * from './inject-metadata';\nexport * from './inject-options';\nexport * from './inject-sorter';\nexport * from './inject';\nexport * from './injector';\nexport * from './log-level';\nexport * from './log';\nexport * from './metadata';\nexport * from './naming-convention';\nexport * from './property-internals';\nexport * from './property-metadata';\nexport * from './property-name';\nexport * from './property-options';\nexport * from './property-sorter';\nexport * from './property';\nexport * from './reference-callback';\nexport * from './reference-handler';\nexport * from './reference-key';\nexport * from './reference-value-getter';\nexport * from './reference-value-setter';\nexport * from './reference-value';\nexport * from './serializer-context-options';\nexport * from './serializer-context';\nexport * from './serializer';\nexport * from './type-abstraction';\nexport * from './type-argument';\nexport * from './type-configuration';\nexport * from './type-context-entry';\nexport * from './type-context';\nexport * from './type-ctor';\nexport * from './type-fn';\nexport * from './type-like';\nexport * from './type-internals';\nexport * from './type-manager-options';\nexport * from './type-manager';\nexport * from './type-metadata-resolver';\nexport * from './type-metadata-symbol';\nexport * from './type-metadata';\nexport * from './type-name';\nexport * from './type-options-base';\nexport * from './type-options';\nexport * from './type-resolver';\nexport * from './type';\nexport * from './unknown';\n","import { isUndefined } from 'lodash';\nimport { getOwnReflectMetadata } from './functions/get-own-reflect-metadata';\nimport { InjectIndex } from './inject-index';\nimport { InjectInternals } from './inject-internals';\nimport { InjectOptions } from './inject-options';\nimport { Metadata } from './metadata';\nimport { TypeFn } from './type-fn';\nimport { TypeMetadata } from './type-metadata';\nimport { TypeMetadataResolver } from './type-metadata-resolver';\nimport { Unknown } from './unknown';\n\n/**\n * Main class used to describe an injection.\n * \n * @type {InjectMetadata<TDeclaringType, TType>}\n */\nexport class InjectMetadata<TDeclaringType, TType> extends Metadata\n{\n /**\n * Type metadata to which inject metadata belongs to.\n * \n * @type {TypeMetadata<TDeclaringType>}\n */\n public readonly declaringTypeMetadata: TypeMetadata<TDeclaringType>;\n\n /**\n * Index of injection within a type constructor function.\n * \n * @type {InjectIndex}\n */\n public readonly injectIndex: InjectIndex;\n\n /**\n * Inject options.\n * \n * @type {InjectOptions<TType>}\n */\n public readonly injectOptions: InjectOptions<TType>;\n\n /**\n * Inject internals.\n * \n * @type {InjectInternals}\n */\n public readonly injectInternals: InjectInternals;\n\n /**\n * Type function defined using reflect metadata.\n * \n * Used as a fallback when type function is not defined.\n * \n * @type {TypeFn<TType>}\n */\n public readonly reflectTypeFn?: TypeFn<TType>;\n\n /**\n * Constructor.\n * \n * @param {TypeMetadata<TDeclaringType>} declaringTypeMetadata Type metadata to which inject metadata belongs to.\n * @param {InjectIndex} injectIndex Index of injection within a type constructor function.\n * @param {InjectOptions<TType>} injectOptions Inject options.\n */\n public constructor(\n declaringTypeMetadata: TypeMetadata<TDeclaringType>, \n injectIndex: InjectIndex, \n injectOptions: InjectOptions<TType>\n )\n {\n super(declaringTypeMetadata.typeManager);\n\n this.declaringTypeMetadata = declaringTypeMetadata;\n this.reflectTypeFn = (getOwnReflectMetadata('design:paramtypes', declaringTypeMetadata.typeFn) ?? new Array<TypeFn<TType>>())[injectIndex];\n this.injectIndex = injectIndex;\n this.injectOptions = this.constructInjectOptions(injectOptions);\n this.injectInternals = this.constructInjectInternals();\n\n this.configure(injectOptions);\n\n return;\n }\n\n /**\n * Gets key.\n * \n * @returns {string|undefined} Key or undefined.\n */\n public get key(): string | undefined\n {\n return this.injectOptions.key;\n }\n\n /**\n * Gets type function.\n * \n * @returns {TypeFn<TType>|undefined} Type constructor or undefined.\n */\n public get typeFn(): TypeFn<TType> | undefined\n {\n return this.injectOptions.typeFn;\n }\n\n /**\n * Gets type metadata resolver.\n * \n * @returns {TypeMetadataResolver<TType>} Type metadata resolver.\n */\n public get typeMetadataResolver(): TypeMetadataResolver<TType>\n {\n return this.injectInternals.typeMetadataResolver;\n }\n\n /**\n * Gets inject type metadata.\n * \n * @returns {TypeMetadata<TType>} Type metadata.\n */\n public get typeMetadata(): TypeMetadata<TType>\n {\n const typeMetadata = this.typeMetadataResolver(this.typeFn);\n const unknownFn = Unknown as TypeFn<any>;\n\n if (typeMetadata.typeFn === unknownFn)\n {\n throw new Error(`${this.declaringTypeMetadata.typeName}[${this.injectIndex}]: cannot resolve constructor injection type metadata. This is usually caused by invalid configuration.`);\n }\n\n return typeMetadata;\n }\n\n /**\n * Constructs initial inject options by extending passed options \n * with default values if they are not overriden. All references are kept.\n * \n * @param {InjectOptions<TType>} injectOptions Inject options.\n * \n * @returns {InjectOptions<TType>} Constructed inject options.\n */\n private constructInjectOptions(injectOptions: InjectOptions<TType>): InjectOptions<TType>\n {\n injectOptions.typeFn = injectOptions.typeFn ?? this.reflectTypeFn;\n\n return injectOptions;\n }\n\n /**\n * Constructs inject internals.\n * \n * @returns {InjectInternals} Constructed inject internals.\n */\n private constructInjectInternals(): InjectInternals\n {\n const typeMetadataResolver = this.defineTypeMetadataResolver(this.injectOptions.typeFn);\n const injectInternals = { typeMetadataResolver: typeMetadataResolver };\n\n return injectInternals;\n }\n\n /**\n * Configures key.\n * \n * @param {string|undefined} key Key.\n * \n * @returns {InjectMetadata<TDeclaringType, TType>} Current instance of inject metadata.\n */\n public hasKey(key: string | undefined): InjectMetadata<TDeclaringType, TType>\n {\n this.injectOptions.key = key;\n\n return this;\n }\n\n /**\n * Configures type function.\n * \n * @param {TypeFn<TType>|undefined} typeFn Type function.\n * \n * @returns {InjectMetadata<TDeclaringType, TType>} Current instance of inject metadata.\n */\n public hasTypeFn(typeFn: TypeFn<TType> | undefined): InjectMetadata<TDeclaringType, TType>\n {\n this.injectOptions.typeFn = typeFn ?? this.reflectTypeFn;\n this.injectInternals.typeMetadataResolver = this.defineTypeMetadataResolver(this.injectOptions.typeFn);\n \n return this;\n }\n \n /**\n * Configures inject metadata based on provided options.\n * \n * @param {InjectOptions<TType>} injectOptions Inject options.\n * \n * @returns {InjectMetadata<TDeclaringType, TType>} Current instance of inject metadata.\n */\n public configure(injectOptions: InjectOptions<TType>): InjectMetadata<TDeclaringType, TType>\n {\n if (!isUndefined(injectOptions.key))\n {\n this.hasKey(injectOptions.key);\n }\n \n if (!isUndefined(injectOptions.typeFn))\n {\n this.hasTypeFn(injectOptions.typeFn);\n }\n\n return this;\n }\n}\n","import { InjectMetadata } from '../inject-metadata';\nimport { InjectSorter } from '../inject-sorter';\n\n/**\n * Represents asc inject sorter which sorts type injects in\n * ascending order by index.\n * \n * @type {AscInjectSorter}\n */\nexport class AscInjectSorter implements InjectSorter\n{\n /**\n * Sort type injects. It is expected to return a negative value if the value of first property \n * is less than the value of second property, zero if they are equal, and a positive value otherwise.\n * \n * @param {InjectMetadata<TType, any>} x First inject.\n * @param {InjectMetadata<TType, any>} y Second inject.\n * \n * @returns {number} Sort result.\n */\n public sort<TType>(x: InjectMetadata<TType, any>, y: InjectMetadata<TType, any>): number\n {\n const a = x.injectIndex;\n const b = y.injectIndex;\n\n if (a < b)\n {\n return -1;\n }\n\n if (a > b)\n {\n return 1;\n }\n\n return 0;\n }\n}\n","import { InjectMetadata } from '../inject-metadata';\nimport { InjectSorter } from '../inject-sorter';\n\n/**\n * Represents desc inject sorter which sorts type injects in\n * descending order by index.\n * \n * @type {DescInjectSorter}\n */\nexport class DescInjectSorter implements InjectSorter\n{\n /**\n * Sort type injects. It is expected to return a negative value if the value of first property \n * is less than the value of second property, zero if they are equal, and a positive value otherwise.\n * \n * @param {InjectMetadata<TType, any>} x First inject.\n * @param {InjectMetadata<TType, any>} y Second inject.\n * \n * @returns {number} Sort result.\n */\n public sort<TType>(x: InjectMetadata<TType, any>, y: InjectMetadata<TType, any>): number\n {\n const a = x.injectIndex;\n const b = y.injectIndex;\n\n if (a < b)\n {\n return 1;\n }\n\n if (a > b)\n {\n return -1;\n }\n\n return 0;\n }\n}\n","export * from './asc-inject-sorter';\nexport * from './desc-inject-sorter';\n","import { isFunction, isNumber, isObject, isString, isUndefined } from 'lodash';\nimport { isCtorFunction } from './functions/is-ctor-function';\nimport { nameOf } from './functions/name-of';\nimport { InjectOptions } from './inject-options';\nimport { TypeFn } from './type-fn';\nimport { TypeManager } from './type-manager';\n\n/**\n * Inject decorator.\n * \n * @param {TypeFn<TType>|InjectOptions<TType>|string} x Type function, inject options or parameter key from type context.\n * \n * @returns {ParameterDecorator} Parameter decorator.\n */\nexport function Inject<TType>(x: TypeFn<TType> | InjectOptions<TType> | string): ParameterDecorator\n{\n const injectOptions = (isObject(x) ? x : {}) as InjectOptions<TType>;\n\n if (isUndefined(injectOptions.key) && isString(x))\n {\n injectOptions.key = x;\n }\n\n if (isUndefined(injectOptions.typeFn) && isFunction(x))\n {\n injectOptions.typeFn = x as TypeFn<TType>;\n }\n\n return function (target: any, propertyName: string | symbol, injectIndex: number): void\n {\n if (!isCtorFunction(target))\n {\n throw new Error(`${nameOf(target.constructor)}.${String(propertyName)}: inject decorator cannot be applied to a method.`);\n }\n\n if (!isNumber(injectIndex))\n {\n throw new Error(`${nameOf(target)}.${String(propertyName)}: inject decorator cannot be applied to a property.`);\n }\n\n TypeManager.configureTypeMetadata(target).configureInjectMetadata(injectIndex, injectOptions);\n\n return;\n };\n}\n","export * from './singleton-injector';\n","import { isNil } from 'lodash';\nimport { isCtorFunction } from '../functions/is-ctor-function';\nimport { Injector } from '../injector';\nimport { TypeMetadata } from '../type-metadata';\n\n/**\n * Singleton injector.\n * \n * @type {SingletonInjector}\n */\nexport class SingletonInjector implements Injector\n{\n /**\n * Map with resolved types.\n * \n * @type {WeakMap<TypeMetadata<any>, any>}\n */\n private readonly instanceMap: WeakMap<TypeMetadata<any>, any> = new WeakMap<TypeMetadata<any>, any>();\n\n /**\n * Method to get instance described by type metadata.\n * \n * @param {TypeMetadata<TType>} typeMetadata Type metadata.\n * \n * @returns {TType} Instance of type described by type metadata or undefined.\n */\n public get<TType>(typeMetadata: TypeMetadata<TType>): TType | undefined\n {\n if (!typeMetadata.injectable)\n {\n throw new Error(`${typeMetadata.typeName}: cannot resolve type! Have you registered it as injectable?`);\n }\n\n const instance = this.instanceMap.get(typeMetadata);\n\n if (isNil(instance))\n {\n return this.init(typeMetadata);\n }\n\n return instance;\n }\n\n /**\n * Creates instance described by type metadata.\n * \n * @param {TypeMetadata<TType>} typeMetadata Type metadata.\n * \n * @returns {TType} Type instance described by type metadata.\n */\n private init<TType>(typeMetadata: TypeMetadata<TType>): TType\n {\n const typeCtor = isCtorFunction(typeMetadata.typeFn) ? typeMetadata.typeFn : undefined;\n\n if (isNil(typeCtor))\n {\n throw new Error(`${typeMetadata.typeName}: cannot inject instance of abstract type.`);\n }\n\n const args = new Array<any>();\n\n for (const injectMetadata of typeMetadata.injectMetadataMap.values())\n {\n args[injectMetadata.injectIndex] = this.get(injectMetadata.typeMetadata);\n }\n\n const instance = new typeCtor(...args);\n\n this.instanceMap.set(typeMetadata, instance);\n\n return instance;\n }\n}\n","/**\n * Log level.\n * \n * @type {LogLevel}\n */\nexport enum LogLevel\n{\n Info,\n Warn,\n Error,\n None\n}\n","import { isFunction, isObject } from 'lodash';\nimport { LogLevel } from './log-level';\n\n/**\n * Main logger class used by serializers for displaying messages.\n * \n * @type {Log}\n */\nexport class Log\n{\n /**\n * Log level defines what kind of messages should be displayed in console.\n * \n * @type {LogLevel}\n */\n public readonly logLevel: LogLevel;\n\n /**\n * Info enabled?\n * \n * @type {boolean}\n */\n public readonly infoEnabled: boolean;\n\n /**\n * Warn enabled?\n * \n * @type {boolean}\n */\n public readonly warnEnabled: boolean;\n\n /**\n * Error enabled?\n * \n * @type {boolean}\n */\n public readonly errorEnabled: boolean;\n\n /**\n * Supports console?\n * \n * @type {boolean}\n */\n public readonly supportsConsole: boolean;\n\n /**\n * Supports console log?\n * \n * @type {boolean}\n */\n public readonly supportsConsoleLog: boolean;\n\n /**\n * Supports console info?\n * \n * @type {boolean}\n */\n public readonly supportsConsoleInfo: boolean;\n\n /**\n * Supports console warn?\n * \n * @type {boolean}\n */\n public readonly supportsConsoleWarn: boolean;\n\n /**\n * Supports console error?\n * \n * @type {boolean}\n */\n public readonly supportsConsoleError: boolean;\n\n /**\n * Constructor.\n * \n * @param {LogLevel} logLevel Log level.\n */\n public constructor(logLevel: LogLevel)\n {\n this.logLevel = logLevel;\n this.infoEnabled = this.logLevel <= LogLevel.Info;\n this.warnEnabled = this.logLevel <= LogLevel.Warn;\n this.errorEnabled = this.logLevel <= LogLevel.Error;\n this.supportsConsole = isObject(console);\n this.supportsConsoleLog = this.supportsConsole && isFunction(console.log);\n this.supportsConsoleInfo = this.supportsConsole && isFunction(console.info);\n this.supportsConsoleWarn = this.supportsConsole && isFunction(console.warn);\n this.supportsConsoleError = this.supportsConsole && isFunction(console.error);\n\n return;\n }\n\n /**\n * Displays info message.\n * \n * @param {string} message Message to display.\n * @param {Array<any>} optionalParams Optional data related to a message.\n * \n * @returns {void}\n */\n public info(message: string, ...optionalParams: Array<any>): void\n {\n if (this.supportsConsoleInfo)\n {\n console.info(message, ...optionalParams);\n\n return;\n }\n\n if (this.supportsConsoleLog)\n {\n console.log(`INFO: ${message}`, ...optionalParams);\n\n return;\n }\n\n return;\n }\n\n /**\n * Displays warn message.\n * \n * @param {string} message Message to display.\n * @param {Array<any>} optionalParams Optional data related to a message.\n * \n * @returns {void}\n */\n public warn(message: any, ...optionalParams: Array<any>): void\n {\n if (this.supportsConsoleWarn)\n {\n console.warn(message, ...optionalParams);\n\n return;\n }\n\n if (this.supportsConsoleLog)\n {\n console.log(`WARN: ${message}`, ...optionalParams);\n \n return;\n }\n\n return;\n }\n\n /**\n * Displays error message.\n * \n * @param {string} message Message to display.\n * @param {Array<any>} optionalParams Optional data related to a message.\n * \n * @returns {void}\n */\n public error(message: string, ...optionalParams: Array<any>): void \n {\n if (this.supportsConsoleError)\n {\n console.error(message, ...optionalParams);\n\n return;\n }\n\n if (this.supportsConsoleLog)\n {\n console.log(`ERROR: ${message}`, ...optionalParams);\n \n return;\n }\n\n return;\n }\n}\n","import { isArray, isNil, isString } from 'lodash';\nimport { Alias } from './alias';\nimport { isArrowFunction } from './functions/is-arrow-function';\nimport { GenericArgument } from './generic-argument';\nimport { GenericMetadata } from './generic-metadata';\nimport { GenericMetadataResolver } from './generic-metadata-resolver';\nimport { GenericStructure } from './generic-structure';\nimport { TypeArgument } from './type-argument';\nimport { TypeFn } from './type-fn';\nimport { TypeManager } from './type-manager';\nimport { TypeMetadata } from './type-metadata';\nimport { TypeMetadataResolver } from './type-metadata-resolver';\nimport { TypeResolver } from './type-resolver';\nimport { Unknown } from './unknown';\n\n/**\n * Metadata class.\n * \n * Encapsulates common methods and properties which can be used by all types of metadata.\n * \n * @type {Metadata}\n */\nexport class Metadata\n{\n /**\n * Type manager.\n * \n * @type {TypeManager}\n */\n public readonly typeManager: TypeManager;\n\n /**\n * Type function map for types with aliases.\n * \n * @type {Map<Alias, TypeFn<any>>}\n */\n public readonly typeFnMap: Map<Alias, TypeFn<any>>;\n \n /**\n * Constructor.\n * \n * @param {TypeManager} typeManager Type manager.\n */\n public constructor(typeManager: TypeManager)\n {\n this.typeManager = typeManager;\n this.typeFnMap = typeManager.typeFnMap;\n\n return;\n }\n\n /**\n * Defines type metadata resolver for provided type argument.\n * \n * @param {TypeArgument<any>} typeArgument Type argument.\n * \n * @returns {TypeMetadataResolver<any>} Defined type metadata resolver.\n */\n public defineTypeMetadataResolver(typeArgument: TypeArgument<any>): TypeMetadataResolver<any>\n {\n if (isNil(typeArgument))\n {\n return this.resolveTypeMetadataUsingUnknownTypeFn.bind(this);\n }\n\n if (isString(typeArgument))\n {\n return this.resolveTypeMetadataUsingAlias.bind(this);\n }\n\n if (isArrowFunction(typeArgument))\n {\n return this.resolveTypeMetadataUsingTypeResolver.bind(this);\n }\n\n return this.resolveTypeMetadataUsingTypeFn.bind(this);\n }\n\n /**\n * Resolves type metadata using unknown type function.\n * \n * @returns {TypeMetadata<any>} Type metadata resolved using unknown type function.\n */\n private resolveTypeMetadataUsingUnknownTypeFn(): TypeMetadata<any>\n {\n const typeFn = Unknown as TypeFn<any>;\n\n return this.typeManager.extractTypeMetadata(typeFn);\n }\n\n /**\n * Resolves type metadata using alias.\n * \n * @param {TypeArgument<any>} typeArgument Type argument.\n * \n * @returns {TypeMetadata<any>} Type metadata resolved using alias.\n */\n private resolveTypeMetadataUsingAlias(typeArgument: TypeArgument<any>): TypeMetadata<any>\n {\n const alias = typeArgument as Alias;\n const typeFn = this.typeFnMap.get(alias);\n\n if (isNil(typeFn))\n {\n throw new Error(`Cannot resolve type metadata for provided type alias: ${alias}. This is usually caused by invalid configuration.`);\n }\n\n return this.typeManager.extractTypeMetadata(typeFn);\n }\n\n /**\n * Resolves type metadata using type function.\n * \n * @param {TypeMetadata<any>} typeArgument Type argument.\n * \n * @returns {TypeMetadata<any>} Type metadata resolved using type function.\n */\n private resolveTypeMetadataUsingTypeFn(typeArgument: TypeArgument<any>): TypeMetadata<any>\n {\n const typeFn = typeArgument as TypeFn<any>;\n\n return this.typeManager.extractTypeMetadata(typeFn);\n }\n\n /**\n * Resolves type metadata using type resolver.\n * \n * @param {TypeMetadata<any>} typeArgument Type argument.\n * \n * @returns {TypeMetadata<any>} Type metadata resolved using type resolver.\n */\n private resolveTypeMetadataUsingTypeResolver(typeArgument: TypeArgument<any>): TypeMetadata<any>\n {\n const typeResolver = typeArgument as TypeResolver<any>;\n\n return this.typeManager.extractTypeMetadata(typeResolver());\n }\n\n /**\n * Defines generic structures based on generic arguments.\n * \n * @param {Array<GenericArgument<any>>} genericArguments Generic arguments.\n * \n * @returns {Array<GenericStructure<any>>} Generic structures.\n */\n public defineGenericStructures(genericArguments: Array<GenericArgument<any>>): Array<GenericStructure<any>>\n {\n const genericStructures = new Array<GenericStructure<any>>();\n\n for (const genericArgument of genericArguments)\n {\n const genericTypeArgument = isArray(genericArgument) ? genericArgument[0] : genericArgument;\n const genericGenericArguments = isArray(genericArgument) ? genericArgument[1] : new Array<GenericArgument<any>>();\n \n genericStructures.push([\n genericTypeArgument,\n this.defineGenericStructures(genericGenericArguments)\n ]);\n }\n\n return genericStructures;\n }\n\n /**\n * Defines generic metadata resolvers based on provided generic structures.\n * \n * @param {Array<GenericStructure<any>>} genericStructures Generic structures.\n * \n * @returns {Array<GenericMetadataResolver<any>>} Generics metadata resolvers.\n */\n public defineGenericMetadataResolvers(genericStructures: Array<GenericStructure<any>>): Array<GenericMetadataResolver<any>>\n {\n const genericMetadataResolvers = new Array<GenericMetadataResolver<any>>();\n\n for (const genericStructure of genericStructures)\n {\n const genericTypeArgument = genericStructure[0];\n const genericGenericStructures = genericStructure[1];\n \n genericMetadataResolvers.push([\n this.defineTypeMetadataResolver(genericTypeArgument), \n this.defineGenericMetadataResolvers(genericGenericStructures)\n ]);\n }\n\n return genericMetadataResolvers;\n }\n\n /**\n * Defines generic metadatas based on provided generic structures and metadata resolvers.\n * \n * @param {Array<GenericStructure<any>>} genericStructures Generic structures.\n * @param {Array<GenericMetadataResolver<any>>} genericMetadataResolvers Generic metadata resolvers.\n * \n * @returns {Array<GenericMetadata<any>>} Generics metadatas.\n */\n public defineGenericMetadatas(\n genericStructures: Array<GenericStructure<any>>, \n genericMetadataResolvers: Array<GenericMetadataResolver<any>>\n ): Array<GenericMetadata<any>>\n {\n const genericMetadatas = new Array<GenericMetadata<any>>();\n\n for (let i = 0; i < genericStructures.length; i++)\n {\n const genericTypeArgument = genericStructures[i][0];\n const genericMetadataResolver = genericMetadataResolvers[i][0];\n const genericGenericStructures = genericStructures[i][1];\n const genericGenericMetadataResolvers = genericMetadataResolvers[i][1];\n\n genericMetadatas.push([\n genericMetadataResolver(genericTypeArgument),\n this.defineGenericMetadatas(genericGenericStructures, genericGenericMetadataResolvers)\n ]);\n }\n\n return genericMetadatas;\n }\n}\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Camel case naming convention.\n * \n * @type {CamelCaseNamingConvention}\n */\nexport class CamelCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process. \n * @param {number} index Word index.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string, index: number): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n const wordLowerCased = word.toLowerCase();\n\n if (index === 0)\n {\n return wordLowerCased;\n }\n\n return `${result}${wordLowerCased[0].toUpperCase()}${wordLowerCased.slice(1)}`;\n }\n}\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Flat case naming convention.\n * \n * @type {FlatCaseNamingConvention}\n */\nexport class FlatCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n return `${result}${word.toLowerCase()}`;\n }\n}\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Flat upper case naming convention.\n * \n * @type {FlatUpperCaseNamingConvention}\n */\nexport class FlatUpperCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n return `${result}${word.toUpperCase()}`;\n }\n}\n","export * from './camel-case-naming-convention';\nexport * from './flat-case-naming-convention';\nexport * from './flat-upper-case-naming-convention';\nexport * from './kebab-case-naming-convention';\nexport * from './kebab-upper-case-naming-convention';\nexport * from './pascal-case-naming-convention';\nexport * from './snake-case-naming-convention';\nexport * from './snake-upper-case-naming-convention';\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Kebab case naming convention.\n * \n * @type {KebabCaseNamingConvention}\n */\nexport class KebabCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process. \n * @param {number} index Word index.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string, index: number): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n const wordLowerCased = word.toLowerCase();\n\n if (index === 0)\n {\n return wordLowerCased;\n }\n\n return `${result}-${wordLowerCased}`;\n }\n}\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Kebab upper naming case.\n * \n * @type {KebabUpperCaseNamingConvention}\n */\nexport class KebabUpperCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process. \n * @param {number} index Word index.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string, index: number): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n const wordUpperCased = word.toUpperCase();\n\n if (index === 0)\n {\n return wordUpperCased;\n }\n\n return `${result}-${wordUpperCased}`;\n }\n}\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Pascal case naming convention.\n * \n * @type {PascalCaseNamingConvention}\n */\nexport class PascalCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process. \n * @param {number} index Word index.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string, index: number): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n const wordLowerCased = word.toLowerCase();\n const wordPascalCased = `${wordLowerCased[0].toUpperCase()}${wordLowerCased.slice(1)}`;\n\n if (index === 0)\n {\n return wordPascalCased;\n }\n\n return `${result}${wordPascalCased}`;\n }\n}\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Snake case naming convention.\n *\n * @type {SnakeCaseNamingConvention}\n */\nexport class SnakeCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process. \n * @param {number} index Word index.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string, index: number): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n const wordLowerCased = word.toLowerCase();\n\n if (index === 0)\n {\n return wordLowerCased;\n }\n\n return `${result}_${wordLowerCased}`;\n }\n}\n","import { getWords } from '../functions/get-words';\nimport { NamingConvention } from '../naming-convention';\n\n/**\n * Snake upper case naming convention.\n * \n * @type {SnakeUpperCaseNamingConvention}\n */\nexport class SnakeUpperCaseNamingConvention implements NamingConvention\n{\n /**\n * Converts name from provided to target one.\n *\n * @param {string} name Name.\n *\n * @returns {string} Converted name.\n */\n public convert(name: string): string\n {\n return getWords(name).reduce(this.reduce, '');\n }\n\n /**\n * Reduce function.\n * \n * @param {string} result Result string.\n * @param {string} word Word to process. \n * @param {number} index Word index.\n * \n * @returns {string} Reduced string.\n */\n private reduce(result: string, word: string, index: number): string\n {\n if (word.length === 0)\n {\n return result;\n }\n\n const wordUpperCased = word.toUpperCase();\n\n if (index === 0)\n {\n return wordUpperCased;\n }\n\n return `${result}_${wordUpperCased}`;\n }\n}\n","import { isFunction, isNil, isUndefined } from 'lodash';\nimport { Alias } from './alias';\nimport { CustomContext } from './custom-context';\nimport { CustomOption } from './custom-option';\nimport { DefaultValue } from './default-value';\nimport { getReflectMetadata } from './functions/get-reflect-metadata';\nimport { GenericArgument } from './generic-argument';\nimport { GenericMetadata } from './generic-metadata';\nimport { GenericMetadataResolver } from './generic-metadata-resolver';\nimport { GenericStructure } from './generic-structure';\nimport { Metadata } from './metadata';\nimport { NamingConvention } from './naming-convention';\nimport { PropertyInternals } from './property-internals';\nimport { PropertyName } from './property-name';\nimport { PropertyOptions } from './property-options';\nimport { ReferenceHandler } from './reference-handler';\nimport { Serializer } from './serializer';\nimport { TypeArgument } from './type-argument';\nimport { TypeFn } from './type-fn';\nimport { TypeMetadata } from './type-metadata';\nimport { TypeMetadataResolver } from './type-metadata-resolver';\n\n/**\n * Main class used to describe a certain property.\n * \n * @type {PropertyMetadata<TDeclaringType, TType>}\n */\nexport class PropertyMetadata<TDeclaringType, TType> extends Metadata\n{\n /**\n * Type metadata to which property metadata belongs to.\n * \n * @type {TypeMetadata<TDeclaringType>}\n */\n public readonly declaringTypeMetadata: TypeMetadata<TDeclaringType>;\n\n /**\n * Property name as declared in type.\n * \n * @type {PropertyName}\n */\n public readonly propertyName: PropertyName;\n\n /**\n * Property options.\n * \n * @type {PropertyOptions<TType>}\n */\n public readonly propertyOptions: PropertyOptions<TType>;\n\n /**\n * Property internals.\n * \n * @type {PropertyInternals}\n */\n public readonly propertyInternals: PropertyInternals;\n\n /**\n * Type function defined using reflect metadata.\n * \n * Used as a fallback when type argument is not defined.\n * \n * @type {TypeFn<TType>}\n */\n public readonly reflectTypeFn?: TypeFn<TType>;\n\n /**\n * Constructor.\n * \n * @param {TypeMetadata<TDeclaringType>} declaringTypeMetadata Type metadata to which property metadata belongs to.\n * @param {PropertyName} propertyName Property name.\n * @param {PropertyOptions<TType>} propertyOptions Property options.\n */\n public constructor(\n declaringTypeMetadata: TypeMetadata<TDeclaringType>, \n propertyName: PropertyName,\n propertyOptions: PropertyOptions<TType>\n )\n {\n super(declaringTypeMetadata.typeManager);\n\n this.declaringTypeMetadata = declaringTypeMetadata;\n this.propertyName = propertyName;\n this.reflectTypeFn = getReflectMetadata('design:type', declaringTypeMetadata.typeFn.prototype, propertyName);\n this.propertyOptions = this.constructPropertyOptions(propertyOptions);\n this.propertyInternals = this.constructPropertyInternals();\n \n this.configure(propertyOptions);\n\n return;\n }\n\n /**\n * Gets alias.\n * \n * @returns {Alias|undefined} Alias or undefined.\n */\n public get alias(): Alias | undefined\n {\n return this.propertyOptions.alias;\n }\n\n /**\n * Gets custom options.\n * \n * @returns {Array<CustomOption>} Custom options.\n */\n public get customOptions(): Array<CustomOption> | undefined\n {\n return this.propertyOptions.customOptions;\n }\n \n /**\n * Gets custom context.\n * \n * @returns {CustomContext} Custom context.\n */\n public get customContext(): CustomContext\n {\n let customContext = this.propertyInternals.customContext;\n\n if (isNil(customContext))\n {\n this.propertyOptions.customOptions = new Array<CustomOption>();\n this.propertyInternals.customContext = new CustomContext(this.propertyOptions.customOptions);\n\n customContext = this.propertyInternals.customContext;\n }\n\n return customContext;\n }\n\n /**\n * Gets serialized null value.\n * \n * @returns {any|undefined} Resolved serialized null value or undefined.\n */\n public get serializedNullValue(): any | undefined\n {\n if (this.preserveNull)\n {\n return null;\n }\n\n return this.serializedDefaultValue;\n }\n\n /**\n * Gets serialized default value.\n * \n * @returns {any|undefined} Resolved serialized default value or undefined.\n */\n public get serializedDefaultValue(): any | undefined\n {\n if (this.useDefaultValue)\n {\n const serializedDefaultValue = this.propertyOptions.defaultValue \n ?? this.propertyOptions.serializedDefaultValue \n ?? this.typeMetadata.serializedDefaultValue;\n\n const defaultValue = isFunction(serializedDefaultValue) \n ? serializedDefaultValue() \n : serializedDefaultValue;\n\n return defaultValue;\n }\n\n return undefined;\n }\n\n /**\n * Gets deserialized null value.\n * \n * @returns {any|undefined} Resolved deserialized null value or undefined.\n */\n public get deserializedNullValue(): any | undefined\n {\n if (this.preserveNull)\n {\n return null;\n }\n\n return this.deserializedDefaultValue;\n }\n \n /**\n * Gets deserialized default value.\n * \n * @returns {any|undefined} Resolved deserialized default value or undefined.\n */\n public get deserializedDefaultValue(): any | undefined\n {\n if (this.useDefaultValue)\n {\n const deserializedDefaultValue = this.propertyOptions.defaultValue \n ?? this.propertyOptions.deserializedDefaultValue \n ?? this.typeMetadata.deserializedDefaultValue;\n\n const defaultValue = isFunction(deserializedDefaultValue) \n ? deserializedDefaultValue() \n : deserializedDefaultValue;\n\n return defaultValue;\n }\n\n return undefined;\n }\n\n /**\n * Gets serialized property name.\n * \n * @returns {string} Serialized property name.\n */\n public get serializedPropertyName(): string\n {\n const alias = this.alias;\n\n if (isNil(alias))\n {\n const namingConvention = this.namingConvention ?? this.declaringTypeMetadata.namingConvention;\n const propertyName = namingConvention ? namingConvention.convert(this.propertyName) : this.propertyName;\n\n return propertyName;\n }\n\n return alias;\n }\n\n /**\n * Gets deserialized property name.\n * \n * @returns {string} Deserialized property name.\n */\n public get deserializedPropertyName(): string\n {\n return this.propertyName;\n }\n\n /**\n * Gets deserializable value.\n * \n * @returns {boolean|undefined} Deserializable indicator or undefined.\n */\n public get deserializable(): boolean | undefined\n {\n return this.propertyOptions.deserializable;\n }\n\n /**\n * Gets generic arguments.\n * \n * @returns {Array<GenericArgument<any>>|undefined} Generic arguments or undefined.\n */\n public get genericArguments(): Array<GenericArgument<any>> | undefined\n {\n return this.propertyOptions.genericArguments;\n }\n\n /**\n * Gets generic structures.\n * \n * @returns {Array<GenericStructure<any>>|undefined} Generic structures or undefined.\n */\n public get genericStructures(): Array<GenericStructure<any>> | undefined\n {\n return this.propertyInternals.genericStructures;\n }\n\n /**\n * Gets generic metadata resolvers.\n * \n * @returns {Array<GenericMetadataResolver<any>>|undefined} Generic metadata resolvers or undefined.\n */\n public get genericMetadataResolvers(): Array<GenericMetadataResolver<any>> | undefined\n {\n return this.propertyInternals.genericMetadataResolvers;\n }\n\n /**\n * Gets generic metadatas.\n * \n * @returns {Array<GenericMetadata<any>>|undefined} Generic metadatas.\n */\n public get genericMetadatas(): Array<GenericMetadata<any>> | undefined\n {\n const genericStructures = this.genericStructures;\n const genericMetadataResolvers = this.genericMetadataResolvers;\n\n if (isNil(genericStructures) || isNil(genericMetadataResolvers))\n {\n return undefined;\n }\n\n return this.defineGenericMetadatas(genericStructures, genericMetadataResolvers);\n }\n\n /**\n * Gets naming convention.\n * \n * @returns {NamingConvention|undefined} Naming convention or undefined.\n */\n public get namingConvention(): NamingConvention | undefined\n {\n return this.propertyOptions.namingConvention ?? this.typeMetadata.namingConvention;\n }\n\n /**\n * Gets reference handler.\n * \n * @returns {ReferenceHandler} Reference handler.\n */\n public get referenceHandler(): ReferenceHandler \n {\n return this.propertyOptions.referenceHandler ?? this.typeMetadata.referenceHandler;\n }\n\n /**\n * Gets serializable value.\n * \n * @returns {boolean|undefined} Serializable indicator or undefined.\n */\n public get serializable(): boolean | undefined\n {\n return this.propertyOptions.serializable;\n }\n\n /**\n * Checks if serialization configured.\n * \n * @returns {boolean} True when serialization configured. False otherwise.\n */\n public get serializationConfigured(): boolean\n {\n return !isNil(this.serializable) || !isNil(this.deserializable);\n }\n\n /**\n * Gets serializer.\n * \n * @returns {Serializer<TType>} Serializer.\n */\n public get serializer(): Serializer<TType> \n {\n return this.propertyOptions.serializer ?? this.typeMetadata.serializer;\n }\n\n /**\n * Gets type argument.\n * \n * @returns {TypeArgument} Type argument.\n */\n public get typeArgument(): TypeArgument<TType>\n {\n return this.propertyOptions.typeArgument;\n }\n\n /**\n * Gets type metadata resolver.\n * \n * @returns {TypeMetadataResolver<TType>} Type metadata resolver.\n */\n public get typeMetadataResolver(): TypeMetadataResolver<TType>\n {\n return this.propertyInternals.typeMetadataResolver;\n }\n\n /**\n * Gets type metadata.\n * \n * @returns {TypeMetadata<TType>} Type metadata.\n */\n public get typeMetadata(): TypeMetadata<TType>\n {\n return this.typeMetadataResolver(this.typeArgument);\n }\n\n /**\n * Gets indicator if null value should be preserved.\n * \n * @returns {boolean} True when null value should be preserved. False otherwise.\n */\n public get preserveNull(): boolean\n {\n return this.propertyOptions.preserveNull ?? this.typeMetadata.preserveNull;\n }\n\n /**\n * Gets indicator if default value should be used.\n * \n * @returns {boolean} Use default value indicator.\n */\n public get useDefaultValue(): boolean\n {\n return this.propertyOptions.useDefaultValue ?? this.typeMetadata.useDefaultValue;\n }\n\n /**\n * Gets indicator if implicit conversion should be used.\n * \n * @returns {boolean} Use implicit conversion indicator.\n */\n public get useImplicitConversion(): boolean\n {\n return this.propertyOptions.useImplicitConversion ?? this.typeMetadata.useImplicitConversion;\n }\n\n /**\n * Constructs initial property options by extending passed options \n * with default values if they are not overriden. All references are kept.\n * \n * @param {PropertyOptions<TType>} propertyOptions Type options.\n * \n * @returns {PropertyOptions<TType>} Constructed property options.\n */\n private constructPropertyOptions(propertyOptions: PropertyOptions<TType>): PropertyOptions<TType>\n {\n propertyOptions.typeArgument = propertyOptions.typeArgument ?? this.reflectTypeFn;\n\n return propertyOptions;\n }\n\n /**\n * Constructs property internals.\n * \n * @returns {PropertyInternals} Constructed property internals.\n */\n private constructPropertyInternals(): PropertyInternals\n {\n const typeMetadataResolver = this.defineTypeMetadataResolver(this.propertyOptions.typeArgument);\n const customOptions = this.propertyOptions.customOptions;\n const customContext = isNil(customOptions) ? undefined : new CustomContext(customOptions);\n const propertyInternals = { typeMetadataResolver: typeMetadataResolver, customContext: customContext };\n\n return propertyInternals;\n }\n\n /**\n * Configures alias.\n * \n * @param {Alias} alias Alias.\n * \n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\n */\n public hasAlias(alias: Alias | undefined): PropertyMetadata<TDeclaringType, TType>\n {\n this.propertyOptions.alias = alias;\n\n return this;\n }\n\n /**\n * Configures custom options.\n * \n * @param {Array<CustomOption>|undefined} customOptions Custom options.\n * \n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\n */\n private hasCustomOptions(customOptions: Array<CustomOption> | undefined): PropertyMetadata<TDeclaringType, TType>\n {\n if (!isNil(customOptions))\n {\n this.customContext.configure(customOptions);\n }\n\n return this;\n }\n\n /**\n * Configures default value.\n * \n * @param {DefaultValue} defaultValue Default value.\n * \n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\n */\n public hasDefaultValue(defaultValue: DefaultValue): PropertyMetadata<TDeclaringType, TType>\n {\n this.propertyOptions.defaultValue = defaultValue;\n\n return this;\n }\n\n /**\n * Configures serialized default value.\n * \n * @param {DefaultValue} serializedDefaultValue Serialized default value.\n * \n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\n */\n public hasSerializedDefaultValue(serializedDefaultValue: DefaultValue): PropertyMetadata<TDeclaringType, TType>\n {\n this.propertyOptions.serializedDefaultValue = serializedDefaultValue;\n\n return this;\n }\n\n /**\n * Configures deserialized default value.\n * \n * @param {DefaultValue} deserializedDefaultValue Deserialized default value.\n * \n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\n */\n public hasDeserializedDefaultValue(deserializedDefaultValue: DefaultValue): PropertyMetadata<TDeclaringType, TType>\n {\n this.propertyOptions.deserializedDefaultValue = deserializedDefaultValue;\n\n return this;\n }\n\n /**\n * Configures deserializable.\n * \n * @param {boolean} deserializable Deserializable.\n * \n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\n */\n public isDeserializable(deserializable: boolean = true): PropertyMetadata<TDeclaringType, TType>\n {\n this.propertyOptions.deserializable = deserializable;\n\n return this;\n }\n\n /**\n * Configures serializable.\n * \n * @param {boolean} serializable Serializable.\n * \n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\n */\n public isSerializable(serializable: boolean = true): PropertyMetadata<TDeclaringType, TType>\n {\n this.propertyOptions.serializable = serializable;\n\n return this;\n }\n\n /**\n * Configures generic arguments.\n * \n * @param {Array<GenericArgument<any>>|undefined} genericArguments Generic arguments.\n * \n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\n */\n public hasGenericArguments(genericArguments: Array<GenericArgument<any>> | undefined): PropertyMetadata<TDeclaringType, TType>\n {\n this.propertyOptions.genericArguments = genericArguments;\n\n if (isNil(genericArguments))\n {\n this.propertyInternals.genericStructures = undefined;\n this.propertyInternals.genericMetadataResolvers = undefined;\n\n return this;\n }\n\n const genericStructures = this.defineGenericStructures(genericArguments);\n\n this.propertyInternals.genericStructures = genericStructures;\n this.propertyInternals.genericMetadataResolvers = this.defineGenericMetadataResolvers(genericStructures);\n\n return this;\n }\n\n /**\n * Configures naming convention.\n * \n * @param {NamingConvention|undefined} namingConvention Naming convention.\n * \n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\n */\n public hasNamingConvention(namingConvention: NamingConvention | undefined): PropertyMetadata<TDeclaringType, TType>\n {\n this.propertyOptions.namingConvention = namingConvention;\n\n return this;\n }\n\n /**\n * Configures reference handler.\n * \n * @param {ReferenceHandler|undefined} referenceHandler Reference handler.\n * \n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\n */\n public hasReferenceHandler(referenceHandler: ReferenceHandler | undefined): PropertyMetadata<TDeclaringType, TType>\n {\n this.propertyOptions.referenceHandler = referenceHandler;\n\n return this;\n }\n\n /**\n * Configures serializer.\n * \n * @param {Serializer<TType>|undefined} serializer Serializer.\n * \n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\n */\n public hasSerializer(serializer: Serializer<TType> | undefined): PropertyMetadata<TDeclaringType, TType>\n {\n this.propertyOptions.serializer = serializer;\n\n return this;\n }\n\n /**\n * Configures type argument.\n * \n * @param {TypeArgument<TType>|undefined} typeArgument Type argument.\n * \n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\n */\n public hasTypeArgument(typeArgument: TypeArgument<TType> | undefined): PropertyMetadata<TDeclaringType, TType>\n {\n this.propertyOptions.typeArgument = typeArgument ?? this.reflectTypeFn;\n this.propertyInternals.typeMetadataResolver = this.defineTypeMetadataResolver(this.propertyOptions.typeArgument);\n\n return this;\n }\n\n /**\n * Configures preserve null.\n * \n * @param {boolean} preserveNull Preserve null.\n * \n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\n */\n public shouldPreserveNull(preserveNull: boolean = true): PropertyMetadata<TDeclaringType, TType>\n {\n this.propertyOptions.preserveNull = preserveNull;\n\n return this;\n }\n\n /**\n * Configures use default value.\n * \n * @param {boolean} useDefaultValue Use default value.\n * \n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\n */\n public shouldUseDefaultValue(useDefaultValue: boolean = true): PropertyMetadata<TDeclaringType, TType>\n {\n this.propertyOptions.useDefaultValue = useDefaultValue;\n\n return this;\n }\n\n /**\n * Configures use implicit convertion.\n * \n * @param {boolean} useImplicitConversion Use implicit convertion.\n * \n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\n */\n public shouldUseImplicitConversion(useImplicitConversion: boolean = true): PropertyMetadata<TDeclaringType, TType>\n {\n this.propertyOptions.useImplicitConversion = useImplicitConversion;\n\n return this;\n }\n\n /**\n * Configures property metadata based on provided options.\n * \n * @param {PropertyOptions<TType>} propertyOptions Property options.\n * \n * @returns {PropertyMetadata<TDeclaringType, TType>} Current instance of property metadata.\n */\n public configure(propertyOptions: PropertyOptions<TType>): PropertyMetadata<TDeclaringType, TType>\n {\n if (!isUndefined(propertyOptions.alias))\n {\n this.hasAlias(propertyOptions.alias);\n }\n\n if (!isUndefined(propertyOptions.customOptions))\n {\n this.hasCustomOptions(propertyOptions.customOptions);\n }\n\n if (!isUndefined(propertyOptions.defaultValue))\n {\n this.hasDefaultValue(propertyOptions.defaultValue);\n }\n\n if (!isUndefined(propertyOptions.serializedDefaultValue))\n {\n this.hasSerializedDefaultValue(propertyOptions.serializedDefaultValue);\n }\n\n if (!isUndefined(propertyOptions.deserializedDefaultValue))\n {\n this.hasDeserializedDefaultValue(propertyOptions.deserializedDefaultValue);\n }\n\n if (!isUndefined(propertyOptions.deserializable))\n {\n this.isDeserializable(propertyOptions.deserializable);\n }\n\n if (!isUndefined(propertyOptions.genericArguments)) \n {\n this.hasGenericArguments(propertyOptions.genericArguments);\n }\n\n if (!isUndefined(propertyOptions.namingConvention))\n {\n this.hasNamingConvention(propertyOptions.namingConvention);\n }\n\n if (!isUndefined(propertyOptions.referenceHandler)) \n {\n this.hasReferenceHandler(propertyOptions.referenceHandler);\n }\n\n if (!isUndefined(propertyOptions.serializable)) \n {\n this.isSerializable(propertyOptions.serializable);\n }\n\n if (!isUndefined(propertyOptions.serializer)) \n {\n this.hasSerializer(propertyOptions.serializer);\n }\n\n if (!isUndefined(propertyOptions.typeArgument)) \n {\n this.hasTypeArgument(propertyOptions.typeArgument);\n }\n\n if (!isUndefined(propertyOptions.preserveNull))\n {\n this.shouldPreserveNull(propertyOptions.preserveNull);\n }\n\n if (!isUndefined(propertyOptions.useDefaultValue))\n {\n this.shouldUseDefaultValue(propertyOptions.useDefaultValue);\n }\n\n if (!isUndefined(propertyOptions.useImplicitConversion)) \n {\n this.shouldUseImplicitConversion(propertyOptions.useImplicitConversion);\n }\n\n return this;\n }\n}\n","import { PropertyMetadata } from '../property-metadata';\nimport { PropertySorter } from '../property-sorter';\n\n/**\n * Represents asc property sorter which sorts type properties in\n * ascending order by name.\n * \n * @type {AscPropertySorter}\n */\nexport class AscPropertySorter implements PropertySorter\n{\n /**\n * Sort type properties. It is expected to return a negative value if the value of first property \n * is less than the value of second property, zero if they are equal, and a positive value otherwise.\n * \n * @param {PropertyMetadata<TType, any>} x First property.\n * @param {PropertyMetadata<TType, any>} y Second property.\n * \n * @returns {number} Sort result.\n */\n public sort<TType>(x: PropertyMetadata<TType, any>, y: PropertyMetadata<TType, any>): number\n {\n const a = x.propertyName.toLowerCase();\n const b = y.propertyName.toLowerCase();\n\n if (a < b)\n {\n return -1;\n }\n\n if (a > b)\n {\n return 1;\n }\n\n return 0;\n }\n}\n","import { PropertyMetadata } from '../property-metadata';\nimport { PropertySorter } from '../property-sorter';\n\n/**\n * Represents desc property sorter which sorts type properties in\n * descending order by name.\n * \n * @type {DescPropertySorter}\n */\nexport class DescPropertySorter implements PropertySorter\n{\n /**\n * Sort type properties. It is expected to return a negative value if the value of first property \n * is less than the value of second property, zero if they are equal, and a positive value otherwise.\n * \n * @param {PropertyMetadata<TType, any>} x First property.\n * @param {PropertyMetadata<TType, any>} y Second property.\n * \n * @returns {number} Sort result.\n */\n public sort<TType>(x: PropertyMetadata<TType, any>, y: PropertyMetadata<TType, any>): number\n {\n const a = x.propertyName.toLowerCase();\n const b = y.propertyName.toLowerCase();\n\n if (a < b)\n {\n return 1;\n }\n\n if (a > b)\n {\n return -1;\n }\n\n return 0;\n }\n}\n","export * from './asc-property-sorter';\nexport * from './desc-property-sorter';\n","import { isArray, isFunction, isObject, isString, isSymbol, merge } from 'lodash';\nimport { isCtorFunction } from './functions/is-ctor-function';\nimport { nameOf } from './functions/name-of';\nimport { GenericArgument } from './generic-argument';\nimport { PropertyOptions } from './property-options';\nimport { TypeArgument } from './type-argument';\nimport { TypeManager } from './type-manager';\n\n/**\n * Property decorator.\n * \n * @param {TypeArgument<TType>|Array<GenericArgument<any>>|PropertyOptions<TType>} x Type argument, generic arguments or property options.\n * @param {Array<GenericArgument<any>>|PropertyOptions<TType>} y Generic arguments or property options if first parameter is type argument.\n * @param {PropertyOptions<TType>} z Property options if second parameter are generic arguments.\n * \n * @returns {PropertyDecorator} Property decorator.\n */\nexport function Property<TType>(\n x?: TypeArgument<TType> | Array<GenericArgument<any>> | PropertyOptions<TType>, \n y?: Array<GenericArgument<any>> | PropertyOptions<TType>,\n z?: PropertyOptions<TType>\n): PropertyDecorator\n{\n const propertyOptions = {} as PropertyOptions<TType>;\n\n if (isObject(z))\n {\n merge(propertyOptions, z);\n }\n\n if (isObject(y) && !isArray(y))\n {\n merge(propertyOptions, y);\n }\n\n if (isObject(x) && !isArray(x))\n {\n merge(propertyOptions, x);\n }\n\n if (isArray(y))\n {\n propertyOptions.genericArguments = y;\n }\n\n if (isArray(x))\n {\n propertyOptions.genericArguments = x;\n }\n\n if (isString(x) || isFunction(x) || isCtorFunction(x))\n {\n propertyOptions.typeArgument = x;\n }\n\n return function (target: any, propertyName: string | symbol): void\n {\n if (isCtorFunction(target))\n {\n throw new Error(`${nameOf(target)}.${String(propertyName)}: property decorator cannot be applied to a static member.`);\n }\n\n if (isSymbol(propertyName))\n {\n throw new Error(`${nameOf(target.constructor)}.${String(propertyName)}: property decorator cannot be applied to a symbol.`);\n }\n\n if (isFunction(target[propertyName]))\n {\n throw new Error(`${nameOf(target.constructor)}.${String(propertyName)}: property decorator cannot be applied to a method.`);\n }\n\n TypeManager.configureTypeMetadata(target.constructor).configurePropertyMetadata(propertyName, propertyOptions);\n\n return;\n };\n}\n","import { isNil } from 'lodash';\nimport { ReferenceHandler } from '../reference-handler';\nimport { ReferenceKey } from '../reference-key';\nimport { ReferenceValue } from '../reference-value';\nimport { ReferenceValueGetter } from '../reference-value-getter';\nimport { SerializerContext } from '../serializer-context';\n\n/**\n * Circular reference handler which preserves references as is even if the circular is detected.\n * \n * @type {CircularReferenceHandler}\n */\nexport class CircularReferenceHandler implements ReferenceHandler\n{\n /**\n * Defines reference. Called during serialization.\n * \n * @param {SerializerContext<any>} serializerContext Serializer context.\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a serializing object.\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\n * \n * @returns {ReferenceValue} Resolved reference value.\n */\n public define(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n const referenceMap = serializerContext.referenceMap;\n const referenceValue = referenceMap.get(referenceKey);\n\n if (isNil(referenceValue))\n {\n referenceMap.set(referenceKey, referenceKey);\n\n const value = referenceValueGetter();\n\n referenceMap.set(referenceKey, value);\n\n serializerContext.resolveReferenceCallbacks(referenceKey);\n\n return value;\n }\n\n if (referenceValue === referenceKey)\n {\n serializerContext.registerReferenceCallback(referenceKey);\n\n return undefined;\n }\n\n return referenceValue;\n }\n\n /**\n * Restores reference. Called during deserialization.\n * \n * @param {SerializerContext<any>} serializerContext Serializer context.\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a deserializing object.\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\n * \n * @returns {ReferenceValue} Resolved reference value.\n */\n public restore(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n const referenceMap = serializerContext.referenceMap;\n const referenceValue = referenceMap.get(referenceKey);\n\n if (isNil(referenceValue))\n {\n referenceMap.set(referenceKey, referenceKey);\n\n const value = referenceValueGetter();\n\n referenceMap.set(referenceKey, value);\n\n serializerContext.resolveReferenceCallbacks(referenceKey);\n\n return value;\n }\n\n if (referenceValue === referenceKey)\n {\n serializerContext.registerReferenceCallback(referenceKey);\n\n return undefined;\n }\n\n return referenceValue;\n }\n}\n","export * from './circular-reference-handler';\nexport * from './json-path-reference-handler';\nexport * from './plain-reference-handler';\n","import { isNil, isObject, isString } from 'lodash';\nimport { ReferenceHandler } from '../reference-handler';\nimport { ReferenceKey } from '../reference-key';\nimport { ReferenceValue } from '../reference-value';\nimport { ReferenceValueGetter } from '../reference-value-getter';\nimport { SerializerContext } from '../serializer-context';\n\n/**\n * Json path reference handler preserves references using JSONPath.\n * \n * @type {JsonPathReferenceHandler}\n */\nexport class JsonPathReferenceHandler implements ReferenceHandler\n{\n /**\n * Regular expression used to get array key from a certain place of the JSONPath.\n * \n * @type {RegExp}\n */\n private readonly arrayKeyRegExp: RegExp = new RegExp('\\\\[\\\\\\'?([^\\\\\\'\\\\[\\\\]]+)\\\\\\'?\\\\]', 'g');\n\n /**\n * Defines reference. Called during serialization.\n * \n * @param {SerializerContext<any>} serializerContext Serializer context.\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a serializing object.\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\n * \n * @returns {ReferenceValue} Resolved reference value.\n */\n public define(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n const referenceMap = serializerContext.referenceMap;\n const referencePath = referenceMap.get(referenceKey);\n\n if (isNil(referencePath))\n {\n referenceMap.set(referenceKey, serializerContext.jsonPath);\n\n const value = referenceValueGetter();\n\n return value;\n }\n\n return { $ref: referencePath };\n }\n\n /**\n * Restores reference. Called during deserialization.\n * \n * @param {SerializerContext<any>} serializerContext Serializer context.\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a deserializing object.\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\n * \n * @returns {ReferenceValue} Resolved reference value.\n */\n public restore(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n const referenceMap = serializerContext.referenceMap;\n const referenceTarget = this.defineReferenceTarget(serializerContext, referenceKey);\n const referenceValue = referenceMap.get(referenceTarget);\n\n if (isNil(referenceValue))\n {\n referenceMap.set(referenceTarget, referenceTarget);\n\n const value = referenceValueGetter();\n\n referenceMap.set(referenceTarget, value);\n\n serializerContext.resolveReferenceCallbacks(referenceTarget);\n\n return value;\n }\n \n if (referenceTarget !== referenceKey) \n {\n serializerContext.pushReferenceCallback(referenceTarget, () =>\n {\n serializerContext.resolveReferenceCallbacks(referenceKey);\n });\n }\n\n if (referenceTarget === referenceValue)\n {\n serializerContext.registerReferenceCallback(referenceTarget);\n\n return undefined;\n }\n\n return referenceValue;\n }\n\n /**\n * Defines reference target based on reference key.\n * \n * @param {SerializerContext<any>} serializerContext Serializer context.\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a deserializing object.\n * \n * @returns {ReferenceKey} Reference which acts as a target key in context of JSONPath.\n */\n private defineReferenceTarget(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey): ReferenceKey\n {\n const $ = serializerContext.$;\n const referencePath = referenceKey.$ref;\n\n if (!isString(referencePath) || !isObject($))\n {\n return referenceKey;\n }\n\n if (referencePath === '$')\n {\n return $;\n }\n\n const referencePathArray = this.convertReferencePathToArray(referencePath);\n\n referencePathArray.shift();\n\n let referenceTarget = $ as Record<string, any>;\n\n for (let i = 0; i < referencePathArray.length; i++)\n {\n referenceTarget = referenceTarget[referencePathArray[i]];\n }\n\n return referenceTarget;\n }\n\n /**\n * Converts reference path to array.\n * \n * @param {string} referencePath Reference path.\n * \n * @returns {Array<string>} Array reference path.\n */\n private convertReferencePathToArray(referencePath: string): Array<string> \n {\n const array = new Array<string>();\n const parts = referencePath.split('.');\n\n for (const part of parts) \n {\n const keys = part.split(this.arrayKeyRegExp);\n\n for (const key of keys)\n {\n if (key.length > 0) \n {\n array.push(key);\n }\n }\n }\n\n return array;\n }\n}\n","import { isNil } from 'lodash';\nimport { ReferenceHandler } from '../reference-handler';\nimport { ReferenceKey } from '../reference-key';\nimport { ReferenceValue } from '../reference-value';\nimport { ReferenceValueGetter } from '../reference-value-getter';\nimport { SerializerContext } from '../serializer-context';\n\n/**\n * Plain reference handler preserves references except circular. If circular reference is detected the it will \n * be setted to undefined so only first occurance is handled.\n * \n * @type {PlainReferenceHandler}\n */\nexport class PlainReferenceHandler implements ReferenceHandler\n{\n /**\n * Defines reference. Called during serialization.\n * \n * @param {SerializerContext<any>} serializerContext Serializer context.\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a serializing object.\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\n * \n * @returns {ReferenceValue} Resolved reference value.\n */\n public define(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n const referenceMap = serializerContext.referenceMap;\n const referenceValue = referenceMap.get(referenceKey);\n\n if (isNil(referenceValue))\n {\n referenceMap.set(referenceKey, referenceKey);\n\n const value = referenceValueGetter();\n\n referenceMap.set(referenceKey, value);\n\n return value;\n }\n\n if (referenceValue === referenceKey)\n {\n return undefined;\n }\n\n return referenceValue;\n }\n\n /**\n * Restores reference. Called during deserialization.\n * \n * @param {SerializerContext<any>} serializerContext Serializer context.\n * @param {ReferenceKey} referenceKey Reference which acts as a key. This is basically a deserializing object.\n * @param {ReferenceValueGetter} referenceValueGetter Function to get a reference value when one is not yet present for a key.\n * \n * @returns {ReferenceValue} Resolved reference value.\n */\n public restore(serializerContext: SerializerContext<any>, referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n const referenceMap = serializerContext.referenceMap;\n const referenceValue = referenceMap.get(referenceKey);\n\n if (isNil(referenceValue))\n {\n referenceMap.set(referenceKey, referenceKey);\n\n const value = referenceValueGetter();\n\n referenceMap.set(referenceKey, value);\n\n return value;\n }\n\n if (referenceValue === referenceKey)\n {\n return undefined;\n }\n\n return referenceValue;\n }\n}\n","import { isNil, isNumber, isUndefined } from 'lodash';\nimport { Discriminant } from './discriminant';\nimport { Discriminator } from './discriminator';\nimport { Factory } from './factory';\nimport { isCtorFunction } from './functions/is-ctor-function';\nimport { GenericMetadata } from './generic-metadata';\nimport { GenericMetadataResolver } from './generic-metadata-resolver';\nimport { GenericStructure } from './generic-structure';\nimport { Injector } from './injector';\nimport { Log } from './log';\nimport { Metadata } from './metadata';\nimport { NamingConvention } from './naming-convention';\nimport { PropertyMetadata } from './property-metadata';\nimport { ReferenceCallback } from './reference-callback';\nimport { ReferenceHandler } from './reference-handler';\nimport { ReferenceKey } from './reference-key';\nimport { ReferenceValue } from './reference-value';\nimport { ReferenceValueGetter } from './reference-value-getter';\nimport { ReferenceValueSetter } from './reference-value-setter';\nimport { Serializer } from './serializer';\nimport { SerializerContextOptions } from './serializer-context-options';\nimport { TypeFn } from './type-fn';\nimport { TypeLike } from './type-like';\nimport { TypeMetadata } from './type-metadata';\n\n/**\n * Serializer context of a certain type.\n * \n * @type {SerializerContext<TType>}\n */\nexport class SerializerContext<TType> extends Metadata\n{\n /**\n * Serializer context root.\n * \n * This is a value passed to the root serializer.\n * \n * @type {any}\n */\n public readonly $: any;\n\n /**\n * Reference map.\n * \n * Used to preserve object references.\n * \n * @type {Map<ReferenceKey, ReferenceValue>}\n */\n public readonly referenceMap: Map<ReferenceKey, ReferenceValue>;\n \n /**\n * Reference callback map.\n * \n * Used to assign object references in a later time due to circular dependency.\n * \n * @type {Map<ReferenceKey, Array<ReferenceCallback>>}\n */\n public readonly referenceCallbackMap: Map<ReferenceKey, Array<ReferenceCallback>>;\n\n /**\n * Serializer context options.\n * \n * @type {SerializerContext<TType>}\n */\n public readonly serializerContextOptions: SerializerContextOptions<TType>;\n\n /**\n * Parent serializer context.\n * \n * Present when any serializer defines child context.\n * \n * @type {SerializerContext<any>}\n */\n public readonly parentSerializerContext?: SerializerContext<any>;\n\n /**\n * Constructor.\n * \n * @param {any} $ Serializer context root.\n * @param {Map<ReferenceKey, ReferenceValue>} referenceMap Reference map.\n * @param {Map<ReferenceKey, Array<ReferenceCallback>>} referenceCallbackMap Reference callback map.\n * @param {SerializerContextOptions<TType>} serializerContextOptions Serializer context options.\n * @param {SerializerContext<any>} parentSerializerContext Parent serializer context.\n */\n public constructor(\n $: any,\n referenceMap: Map<ReferenceKey, ReferenceValue>,\n referenceCallbackMap: Map<ReferenceKey, Array<ReferenceCallback>>,\n serializerContextOptions: SerializerContextOptions<TType>, \n parentSerializerContext?: SerializerContext<any>\n )\n {\n super(serializerContextOptions.typeMetadata.typeManager);\n\n this.$ = $;\n this.referenceMap = referenceMap,\n this.referenceCallbackMap = referenceCallbackMap;\n this.serializerContextOptions = serializerContextOptions;\n this.parentSerializerContext = parentSerializerContext;\n\n return;\n }\n\n /**\n * Gets json path key.\n * \n * @returns {string|number} Json path key.\n */\n public get jsonPathKey(): any\n {\n return this.serializerContextOptions.jsonPathKey;\n }\n\n /**\n * Gets reference value setter.\n * \n * @returns {ReferenceValueSetter|undefined} Reference value setter or undefined if not present.\n */\n public get referenceValueSetter(): ReferenceValueSetter | undefined\n {\n return this.serializerContextOptions.referenceValueSetter;\n }\n\n /**\n * Gets serialized null value.\n * \n * @returns {any|undefined} Resolved serialized null value or undefined.\n */\n public get serializedNullValue(): any | undefined\n {\n if (this.preserveNull)\n {\n return null;\n }\n\n return this.serializedDefaultValue;\n }\n\n /**\n * Gets serialized default value.\n * \n * @returns {any|undefined} Resolved serialized default value or undefined.\n */\n public get serializedDefaultValue(): any | undefined\n {\n if (this.useDefaultValue)\n {\n return this.propertyMetadata?.serializedDefaultValue ?? this.typeMetadata.serializedDefaultValue;\n }\n\n return undefined;\n }\n \n /**\n * Gets deserialized null value.\n * \n * @returns {any|undefined} Resolved deserialized null value or undefined.\n */\n public get deserializedNullValue(): any | undefined\n {\n if (this.preserveNull)\n {\n return null;\n }\n\n return this.deserializedDefaultValue;\n }\n\n /**\n * Gets deserialized default value.\n * \n * @returns {any|undefined} Resolved deserialized default value or undefined.\n */\n public get deserializedDefaultValue(): any | undefined\n {\n if (this.useDefaultValue)\n {\n return this.propertyMetadata?.deserializedDefaultValue ?? this.typeMetadata.deserializedDefaultValue;\n }\n \n return undefined;\n }\n\n /**\n * Gets json path from serializer context root.\n * \n * @returns {string} Json path.\n */\n public get jsonPath(): string\n {\n const jsonPathKey = this.jsonPathKey;\n const parentSerializerContext = this.parentSerializerContext;\n\n if (isNil(parentSerializerContext))\n {\n return jsonPathKey;\n }\n\n if (isNumber(jsonPathKey))\n {\n return `${parentSerializerContext.jsonPath}[${jsonPathKey}]`;\n }\n\n return `${parentSerializerContext.jsonPath}['${jsonPathKey}']`;\n }\n\n /**\n * Gets discriminant.\n * \n * @returns {Discriminant} Discriminant.\n */\n public get discriminant(): Discriminant\n {\n return this.typeMetadata.discriminant;\n }\n\n /**\n * Gets discriminant map.\n * \n * @returns {Map<TypeFn<any>, Discriminant>} Discriminant map.\n */\n public get discriminantMap(): Map<TypeFn<any>, Discriminant>\n {\n return this.typeMetadata.discriminantMap;\n }\n\n /**\n * Gets discriminator.\n * \n * @returns {Discriminator} Discriminator.\n */\n public get discriminator(): Discriminator\n {\n return this.typeMetadata.discriminator;\n }\n\n /**\n * Gets factory.\n * \n * @returns {Factory} Factory.\n */\n public get factory(): Factory\n {\n return this.typeMetadata.factory;\n }\n\n /**\n * Gets generic structures.\n * \n * @returns {Array<GenericStructure<any>>|undefined} Generic structures or undefined.\n */\n public get genericStructures(): Array<GenericStructure<any>> | undefined\n {\n return this.serializerContextOptions.genericStructures;\n }\n\n /**\n * Gets generic metadata resolvers.\n * \n * @returns {Array<GenericMetadataResolver<any>>|undefined} Generic metadata resolvers or undefined.\n */\n public get genericMetadataResolvers(): Array<GenericMetadataResolver<any>> | undefined\n {\n return this.serializerContextOptions.genericMetadataResolvers;\n }\n\n /**\n * Gets generic metadatas.\n * \n * @returns {Array<GenericMetadata<any>>|undefined} Generic metadatas.\n */\n public get genericMetadatas(): Array<GenericMetadata<any>> | undefined\n {\n const genericStructures = this.genericStructures;\n const genericMetadataResolvers = this.genericMetadataResolvers;\n\n if (isNil(genericStructures) || isNil(genericMetadataResolvers))\n {\n return undefined;\n }\n\n return this.defineGenericMetadatas(genericStructures, genericMetadataResolvers);\n }\n\n /**\n * Gets injector.\n * \n * @returns {Injector} Injector\n */\n public get injector(): Injector\n {\n return this.typeMetadata.injector;\n }\n\n /**\n * Gets log.\n * \n * @returns {Log} Log instance.\n */\n public get log(): Log\n {\n return this.typeMetadata.log;\n }\n\n /**\n * Gets context name.\n * \n * @returns {string} Context name.\n */\n public get name(): string\n {\n if (isNil(this.propertyMetadata))\n {\n return this.typeMetadata.typeName;\n }\n\n return `${this.propertyMetadata.declaringTypeMetadata.typeName}.${this.propertyMetadata.propertyName}`;\n }\n\n /**\n * Gets naming convention.\n * \n * @returns {NamingConvention|undefined} Naming convention or undefined.\n */\n public get namingConvention(): NamingConvention | undefined\n {\n return this.propertyMetadata?.namingConvention ?? this.typeMetadata.namingConvention;\n }\n\n /**\n * Gets indicator if context is polymorphic.\n * \n * @returns {boolean} True when context is polymorphic. False otherwise.\n */\n public get polymorphic(): boolean\n {\n return this.typeMetadata.polymorphic;\n }\n\n /**\n * Gets property metadata.\n * \n * @returns {PropertyMetadata<any, TType>|undefined} Property metadata or undefined.\n */\n public get propertyMetadata(): PropertyMetadata<any, TType> | undefined\n {\n return this.serializerContextOptions.propertyMetadata;\n }\n\n /**\n * Gets indicator if discriminator should be preserved.\n * \n * @returns {boolean} True when discriminator should be preserved. False otherwise.\n */\n public get preserveDiscriminator(): boolean \n {\n return this.typeMetadata.preserveDiscriminator;\n }\n\n /**\n * Gets reference handler.\n * \n * @returns {ReferenceHandler} Reference handler.\n */\n public get referenceHandler(): ReferenceHandler\n {\n return this.propertyMetadata?.referenceHandler ?? this.typeMetadata.referenceHandler;\n }\n\n /**\n * Gets serializer.\n * \n * @returns {Serializer<TType>} Serializer.\n */\n public get serializer(): Serializer<TType>\n {\n return this.propertyMetadata?.serializer ?? this.typeMetadata.serializer;\n }\n\n /**\n * Gets type metadata.\n * \n * @returns {TypeMetadata<TType>} Type metadata.\n */\n public get typeMetadata(): TypeMetadata<TType>\n {\n return this.serializerContextOptions.typeMetadata;\n }\n\n /**\n * Gets indicator if null value should be preserved.\n * \n * @returns {boolean} True when null value should be preserved. False otherwise.\n */\n public get preserveNull(): boolean\n {\n return this.propertyMetadata?.preserveNull ?? this.typeMetadata.preserveNull;\n }\n\n /**\n * Gets indicator if default value should be used.\n * \n * @returns {boolean} True when type should use default value. False otherwise.\n */\n public get useDefaultValue(): boolean\n {\n return this.propertyMetadata?.useDefaultValue ?? this.typeMetadata.useDefaultValue;\n }\n\n /**\n * Gets indicator if implicit conversion should be used.\n * \n * @returns {boolean} True when type should use implicit conversion. False otherwise.\n */\n public get useImplicitConversion(): boolean\n {\n return this.propertyMetadata?.useImplicitConversion ?? this.typeMetadata.useImplicitConversion;\n }\n\n /**\n * Serializes provided value using context.\n * \n * @param {TypeLike<TType>} x Some value.\n * \n * @returns {TypeLike<any>} Value serialized by context.\n */\n public serialize(x: TypeLike<TType>): TypeLike<any>\n {\n return this.serializer.serialize(x, this);\n }\n\n /**\n * Deserializes provided value using context.\n * \n * @param {TypeLike<any>} x Some value.\n * \n * @returns {TypeLike<TType>} Value deserialized by context.\n */\n public deserialize(x: TypeLike<any>): TypeLike<TType>\n {\n return this.serializer.deserialize(x, this);\n }\n\n /**\n * Defines reference. \n * \n * May be called during serialization to define reference.\n * \n * @param {ReferenceKey} referenceKey Reference key.\n * @param {ReferenceValueGetter} referenceValueGetter Reference value getter.\n * \n * @returns {ReferenceValue} Reference value.\n */\n public defineReference(referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n return this.referenceHandler.define(this, referenceKey, referenceValueGetter);\n }\n\n /**\n * Restores reference.\n * \n * May be called during deserialization to restore reference.\n * \n * @param {ReferenceKey} referenceKey Reference key.\n * @param {ReferenceValueGetter} referenceValueGetter Reference value getter.\n * \n * @returns {ReferenceValue} Reference value.\n */\n public restoreReference(referenceKey: ReferenceKey, referenceValueGetter: ReferenceValueGetter): ReferenceValue\n {\n return this.referenceHandler.restore(this, referenceKey, referenceValueGetter);\n }\n\n /**\n * Registers callback for provided reference key.\n * \n * May be called by reference handlers to register a callback resolver for a circular reference.\n * \n * @param {ReferenceKey} referenceKey Reference key.\n * \n * @returns {void}\n */\n public registerReferenceCallback(referenceKey: ReferenceKey): void\n {\n const referenceValueSetter = this.referenceValueSetter;\n\n if (isNil(referenceValueSetter))\n {\n return;\n }\n\n this.pushReferenceCallback(referenceKey, () =>\n {\n const referenceValue = this.referenceMap.get(referenceKey);\n\n referenceValueSetter(referenceValue);\n });\n\n return;\n }\n\n /**\n * Pushes callback for provided reference key.\n * \n * Called by reference handlers during handling of circular references.\n * \n * @param {ReferenceKey} referenceKey Reference key.\n * @param {ReferenceCallback} referenceCallback Reference callback.\n * \n * @returns {void}\n */\n public pushReferenceCallback(referenceKey: ReferenceKey, referenceCallback: ReferenceCallback): void\n {\n let referenceCallbacks = this.referenceCallbackMap.get(referenceKey);\n\n if (isNil(referenceCallbacks))\n {\n referenceCallbacks = [];\n\n this.referenceCallbackMap.set(referenceKey, referenceCallbacks);\n }\n\n referenceCallbacks.push(referenceCallback);\n\n return;\n }\n\n /**\n * Resolves callbacks for provided reference key.\n * \n * May be called by reference handlers when circular references can be resolved.\n * \n * @param {ReferenceKey} referenceKey Reference key.\n * \n * @returns {void}\n */\n public resolveReferenceCallbacks(referenceKey: ReferenceKey): void\n {\n const referenceCallbacks = this.referenceCallbackMap.get(referenceKey);\n\n if (isNil(referenceCallbacks))\n {\n return;\n }\n\n for (const referenceCallback of referenceCallbacks)\n {\n referenceCallback();\n }\n\n return;\n }\n\n /**\n * Defines serializer context options based on partial.\n * \n * @param {Partial<SerializerContextOptions<any>>} serializerContextOptions Partial serializer context options.\n * \n * @returns {SerializerContextOptions<any>} Complete serializer context options.\n */\n private defineSerializerContextOptions(serializerContextOptions: Partial<SerializerContextOptions<any>>): SerializerContextOptions<any>\n {\n return {\n jsonPathKey: serializerContextOptions.jsonPathKey ?? this.serializerContextOptions.jsonPathKey,\n typeMetadata: serializerContextOptions.typeMetadata ?? this.serializerContextOptions.typeMetadata,\n genericStructures: serializerContextOptions.genericStructures ?? this.serializerContextOptions.genericStructures,\n genericMetadataResolvers: serializerContextOptions.genericMetadataResolvers ?? this.serializerContextOptions.genericMetadataResolvers,\n propertyMetadata: serializerContextOptions.propertyMetadata ?? this.serializerContextOptions.propertyMetadata,\n referenceValueSetter: serializerContextOptions.referenceValueSetter ?? this.serializerContextOptions.referenceValueSetter\n };\n }\n\n /**\n * Defines child serializer context.\n * \n * Called by serializers on drill down.\n * \n * @param {Partial<SerializerContextOptions<any>>} childSerializerContextOptions Child serializer context options.\n * \n * @returns {SerializerContext<any>} Child serializer context.\n */\n public defineChildSerializerContext(childSerializerContextOptions: Partial<SerializerContextOptions<any>>): SerializerContext<any>\n {\n const parentSerializerContext = isNil(childSerializerContextOptions.jsonPathKey) ? this.parentSerializerContext : this;\n const serializerContextOptions = this.defineSerializerContextOptions(childSerializerContextOptions);\n\n return new SerializerContext(this.$, this.referenceMap, this.referenceCallbackMap, serializerContextOptions, parentSerializerContext);\n }\n\n /**\n * Defines generic serializer context.\n * \n * Called by serializers which work with generics.\n * \n * @param {number} genericIndex Generic index.\n * \n * @returns {SerializerContext<any>} Generic serializer context.\n */\n public defineGenericSerializerContext(genericIndex: number): SerializerContext<any>\n {\n const genericStructures = this.genericStructures;\n const genericMetadataResolvers = this.genericMetadataResolvers;\n\n if (isNil(genericStructures) || isNil(genericMetadataResolvers))\n {\n throw new Error(`${this.jsonPath}: cannot define generic arguments. This is usually caused by invalid configuration.`);\n }\n\n const genericStructure = genericStructures[genericIndex];\n const genericMetadataResolver = genericMetadataResolvers[genericIndex];\n\n if (isNil(genericStructure) || isNil(genericMetadataResolver))\n {\n throw new Error(`${this.jsonPath}: cannot define generic argument for index ${genericIndex}. This is usually caused by invalid configuration.`);\n }\n\n const genericTypeArgument = genericStructure[0];\n const genericGenericStructures = genericStructure[1];\n const genericTypeMetadataResolver = genericMetadataResolver[0];\n const genericGenericMetadataResolvers = genericMetadataResolver[1];\n const typeMetadata = genericTypeMetadataResolver(genericTypeArgument);\n const serializerContextOptions = this.defineSerializerContextOptions(this.serializerContextOptions);\n\n serializerContextOptions.typeMetadata = typeMetadata;\n serializerContextOptions.genericStructures = genericGenericStructures;\n serializerContextOptions.genericMetadataResolvers = genericGenericMetadataResolvers;\n serializerContextOptions.propertyMetadata = undefined;\n\n return new SerializerContext(this.$, this.referenceMap, this.referenceCallbackMap, serializerContextOptions, this.parentSerializerContext);\n }\n\n /**\n * Defines polymorphic serializer context.\n * \n * Called by serializers which work with polymorphic types.\n * \n * @param {TypeFn<any>|Record<string, any>} x Type function or record.\n * \n * @returns {SerializerContext<any>} Polymorphic serializer context.\n */\n public definePolymorphicSerializerContext(x: TypeFn<any> | Record<string, any>): SerializerContext<any>\n {\n return isCtorFunction(x) ? this.definePolymorphicSerializerContextByTypeFn(x) : this.definePolymorphicSerializerContextByDiscriminant(x);\n }\n\n /**\n * Defines polymorphic serializer context by type function.\n * \n * @param {TypeFn<any>} typeFn Type function.\n * \n * @returns {SerializerContext<any>} Polymorphic serializer context.\n */\n private definePolymorphicSerializerContextByTypeFn(typeFn: TypeFn<any>): SerializerContext<any>\n {\n const discriminant = this.discriminantMap.get(typeFn);\n\n if (isNil(discriminant))\n {\n throw new Error(`${this.jsonPath}: cannot define discriminant of polymorphic type. This is usually caused by invalid configuration.`);\n }\n\n const typeMetadata = this.typeManager.extractTypeMetadata(typeFn);\n const serializerContextOptions = this.defineSerializerContextOptions(this.serializerContextOptions);\n\n serializerContextOptions.typeMetadata = typeMetadata;\n\n return new SerializerContext(this.$, this.referenceMap, this.referenceCallbackMap, serializerContextOptions, this.parentSerializerContext);\n }\n\n /**\n * Defines polymorphic serializer context by discriminant.\n * \n * @param {Record<string, any>} record Some record.\n * \n * @returns {SerializerContext<any>} Polymorphic serializer context.\n */\n private definePolymorphicSerializerContextByDiscriminant(record: Record<string, any>): SerializerContext<any>\n {\n for (const [typeCtor, discriminant] of this.discriminantMap)\n {\n const typeMetadata = this.typeManager.extractTypeMetadata(typeCtor);\n\n if (record[typeMetadata.discriminator] === discriminant)\n {\n const serializerContextOptions = this.defineSerializerContextOptions(this.serializerContextOptions);\n\n serializerContextOptions.typeMetadata = typeMetadata;\n\n return new SerializerContext(this.$, this.referenceMap, this.referenceCallbackMap, serializerContextOptions, this.parentSerializerContext);\n }\n }\n\n throw new Error(`${this.jsonPath}: cannot define discriminant of polymorphic type. This is usually caused by invalid configuration.`);\n }\n\n /**\n * Configures json path key.\n * \n * @param {string|number} jsonPathKey Json path key.\n * \n * @returns {SerializerContext<TType>} Current instance of serializer context.\n */\n public hasJsonPathKey(jsonPathKey: string | number): SerializerContext<TType>\n {\n this.serializerContextOptions.jsonPathKey = jsonPathKey;\n\n return this;\n }\n \n /**\n * Configures reference value setter.\n * \n * @param {ReferenceValueSetter} referenceValueSetter Reference value setter.\n * \n * @returns {SerializerContext<TType>} Current instance of serializer context.\n */\n public hasReferenceValueSetter(referenceValueSetter: ReferenceValueSetter): SerializerContext<TType>\n {\n this.serializerContextOptions.referenceValueSetter = referenceValueSetter;\n\n return this;\n }\n\n /**\n * Configures generic structures.\n * \n * @param {Array<GenericStructure<any>>|undefined} genericStructures Generic structures.\n * \n * @returns {SerializerContext<TType>} Current instance of serializer context.\n */\n public hasGenericStructures(genericStructures: Array<GenericStructure<any>> | undefined): SerializerContext<TType>\n {\n this.serializerContextOptions.genericStructures = genericStructures;\n\n return this;\n }\n\n /**\n * Configures generic metadata resolvers.\n * \n * @param {Array<GenericMetadataResolver<any>>|undefined} genericMetadataResolvers Generic metadata resolvers.\n * \n * @returns {SerializerContext<TType>} Current instance of serializer context.\n */\n public hasGenericMetadataResolvers(genericMetadataResolvers: Array<GenericMetadataResolver<any>> | undefined): SerializerContext<TType>\n {\n this.serializerContextOptions.genericMetadataResolvers = genericMetadataResolvers;\n\n return this;\n }\n\n /**\n * Configures property metadata\n * \n * @param {PropertyMetadata<any,TType>|undefined} propertyMetadata Property metadata.\n * \n * @returns {SerializerContext<TType>} Current instance of serializer context.\n */\n public hasPropertyMetadata(propertyMetadata: PropertyMetadata<any, TType> | undefined): SerializerContext<TType>\n {\n this.serializerContextOptions.propertyMetadata = propertyMetadata;\n\n return this;\n }\n\n /**\n * Configures type metadata\n * \n * @param {TypeMetadata<TType>} typeMetadata Type metadata.\n * \n * @returns {SerializerContext<TType>} Current instance of serializer context.\n */\n public hasTypeMetadata(typeMetadata: TypeMetadata<TType>): SerializerContext<TType>\n {\n this.serializerContextOptions.typeMetadata = typeMetadata;\n\n return this;\n }\n \n /**\n * Configures serializer context based on provided options.\n * \n * @param {SerializerContextOptions<TType>} serializerContextOptions Serializer context options.\n * \n * @returns {SerializerContext<TType>} Current instance of serializer context.\n */\n public configure(serializerContextOptions: SerializerContextOptions<TType>): SerializerContext<TType>\n {\n if (!isUndefined(serializerContextOptions.jsonPathKey))\n {\n this.hasJsonPathKey(serializerContextOptions.jsonPathKey);\n }\n\n if (!isUndefined(serializerContextOptions.referenceValueSetter))\n {\n this.hasReferenceValueSetter(serializerContextOptions.referenceValueSetter);\n }\n\n if (!isUndefined(serializerContextOptions.genericStructures))\n {\n this.hasGenericStructures(serializerContextOptions.genericStructures);\n }\n\n if (!isUndefined(serializerContextOptions.genericMetadataResolvers))\n {\n this.hasGenericMetadataResolvers(serializerContextOptions.genericMetadataResolvers);\n }\n\n if (!isUndefined(serializerContextOptions.propertyMetadata))\n {\n this.hasPropertyMetadata(serializerContextOptions.propertyMetadata);\n }\n\n if (!isUndefined(serializerContextOptions.typeMetadata))\n {\n this.hasTypeMetadata(serializerContextOptions.typeMetadata);\n }\n\n return this;\n }\n}\n","import { isNull, isUndefined } from 'lodash';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Any serializer.\n * \n * @type {AnySerializer}\n */\nexport class AnySerializer implements Serializer<any>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<any>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<any>, serializerContext: SerializerContext<any>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.serializedNullValue;\n }\n\n return x;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<any>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<any>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.deserializedNullValue;\n }\n\n return x;\n }\n}\n","import { isArrayBuffer, isNull, isString, isUndefined } from 'lodash';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Array buffer serializer.\n * \n * @type {ArrayBufferSerializer}\n */\nexport class ArrayBufferSerializer implements Serializer<ArrayBuffer>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<ArrayBuffer>} x Some value.\n * @param {SerializerContext<ArrayBuffer>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<ArrayBuffer>, serializerContext: SerializerContext<ArrayBuffer>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.serializedNullValue;\n }\n\n if (isArrayBuffer(x))\n {\n const arrayBufferView = new Uint16Array(x);\n const charCodeArray = Array.from(arrayBufferView);\n\n return charCodeArray.map(c => String.fromCharCode(c)).join('');\n }\n\n if (serializerContext.log.errorEnabled)\n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as array buffer.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<ArrayBuffer>} serializerContext Serializer context.\n * \n * @returns {TypeLike<ArrayBuffer>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<ArrayBuffer>): TypeLike<ArrayBuffer>\n {\n if (isUndefined(x))\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (isString(x))\n {\n const arrayBuffer = new ArrayBuffer(x.length * 2);\n const arrayBufferView = new Uint16Array(arrayBuffer);\n \n for (let i = 0; i < x.length; i++)\n {\n arrayBufferView[i] = x.charCodeAt(i);\n }\n \n return arrayBuffer;\n }\n \n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as array buffer.`, x);\n }\n\n return undefined;\n }\n}\n","import { isArray, isNull, isUndefined } from 'lodash';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Array serializer.\n * \n * @type {ArraySerializer}\n */\nexport class ArraySerializer implements Serializer<Array<any>>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Array<any>>} x Some value.\n * @param {SerializerContext<Array<any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Array<any>>, serializerContext: SerializerContext<Array<any>>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.serializedNullValue;\n }\n\n if (isArray(x))\n {\n return serializerContext.defineReference(x, () =>\n {\n const arrayInput = x;\n const arrayOutput = new Array<any>(x.length);\n const genericSerializerContext = serializerContext.defineGenericSerializerContext(0);\n \n const valueSerializerContext = genericSerializerContext.defineChildSerializerContext({ \n jsonPathKey: genericSerializerContext.jsonPathKey \n });\n\n for (let i = 0; i < arrayInput.length; i++)\n {\n valueSerializerContext.hasJsonPathKey(i);\n valueSerializerContext.hasReferenceValueSetter(v => arrayOutput[i] = v);\n\n arrayOutput[i] = valueSerializerContext.serialize(arrayInput[i]);\n }\n \n return arrayOutput;\n });\n }\n\n if (serializerContext.log.errorEnabled)\n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as array.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Array<any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Array<any>>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Array<any>>): TypeLike<Array<any>>\n {\n if (isUndefined(x))\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (isArray(x))\n {\n return serializerContext.restoreReference(x, () =>\n {\n const arrayInput = x;\n const arrayOutput = new Array<any>(x.length);\n const genericSerializerContext = serializerContext.defineGenericSerializerContext(0);\n\n const valueSerializerContext = genericSerializerContext.defineChildSerializerContext({ \n jsonPathKey: genericSerializerContext.jsonPathKey \n });\n \n for (let i = 0; i < arrayInput.length; i++)\n {\n valueSerializerContext.hasJsonPathKey(i);\n valueSerializerContext.hasReferenceValueSetter(v => arrayOutput[i] = v);\n \n arrayOutput[i] = valueSerializerContext.deserialize(arrayInput[i]);\n }\n \n return arrayOutput;\n });\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as array.`, x);\n }\n\n return undefined;\n }\n}\n","import { isBoolean, isNull, isNumber, isString, isUndefined } from 'lodash';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Boolean serializer.\n * \n * @type {BooleanSerializer}\n */\nexport class BooleanSerializer implements Serializer<boolean>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<boolean>} x Some value.\n * @param {SerializerContext<boolean>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<boolean>, serializerContext: SerializerContext<boolean>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.serializedNullValue;\n }\n\n if (isBoolean(x))\n {\n return x;\n }\n\n if (serializerContext.useImplicitConversion) \n {\n return this.convert(x, serializerContext);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as boolean.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<boolean>} serializerContext Serializer context.\n * \n * @returns {TypeLike<boolean>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<boolean>): TypeLike<boolean>\n {\n if (isUndefined(x))\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (isBoolean(x))\n {\n return x;\n }\n\n if (serializerContext.useImplicitConversion) \n {\n return this.convert(x, serializerContext);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as boolean.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Converts provided value to the target type value.\n * \n * @param {any} x Some value.\n * @param {SerializerContext<boolean>} serializerContext Type serializer context.\n * \n * @returns {boolean|undefined} Converted value or undefined.\n */\n private convert(x: any, serializerContext: SerializerContext<boolean>): boolean | undefined\n {\n if (isString(x) && (x === 'true' || x === 'false'))\n {\n return x === 'true';\n }\n\n if (isString(x) && (x === '1' || x === '0'))\n {\n return x === '1';\n }\n\n if (isNumber(x) && (x === 1 || x === 0))\n {\n return x === 1;\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot convert value to boolean.`, x);\n }\n\n return undefined;\n }\n}\n","import { isNull, isString, isUndefined } from 'lodash';\nimport { isDataView } from '../functions/is-data-view';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Data view serializer.\n * \n * @type {DataViewSerializer}\n */\nexport class DataViewSerializer implements Serializer<DataView>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<DataView>} x Some value.\n * @param {SerializerContext<DataView>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<DataView>, serializerContext: SerializerContext<DataView>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.serializedNullValue;\n }\n\n if (isDataView(x))\n {\n const arrayBufferView = new Uint16Array(x.buffer);\n const charCodeArray = Array.from(arrayBufferView);\n\n return charCodeArray.map(c => String.fromCharCode(c)).join('');\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as data view.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<DataView>} serializerContext Serializer context.\n * \n * @returns {TypeLike<DataView>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<DataView>): TypeLike<DataView>\n {\n if (isUndefined(x))\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (isString(x))\n {\n const arrayBuffer = new ArrayBuffer(x.length * 2);\n const arrayBufferView = new Uint16Array(arrayBuffer);\n \n for (let i = 0; i < x.length; i++)\n {\n arrayBufferView[i] = x.charCodeAt(i);\n }\n \n return new DataView(arrayBuffer);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as data view.`, x);\n }\n\n return undefined;\n }\n}\n","import { isDate, isNull, isString, isUndefined } from 'lodash';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Date serializer.\n * \n * @type {DateSerializer}\n */\nexport class DateSerializer implements Serializer<Date>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Date>} x Some value.\n * @param {SerializerContext<Date>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Date>, serializerContext: SerializerContext<Date>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.serializedNullValue;\n }\n\n if (isDate(x))\n {\n return x.toISOString();\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as date.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Date>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Date>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Date>): TypeLike<Date>\n {\n if (isUndefined(x))\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (isString(x))\n {\n return new Date(x);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as date.`, x);\n }\n\n return undefined;\n }\n}\n","import { isArray, isNull, isUndefined } from 'lodash';\nimport { isFloat32Array } from '../functions/is-float-32-array';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Float 32 array serializer.\n * \n * @type {Float32ArraySerializer}\n */\nexport class Float32ArraySerializer implements Serializer<Float32Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Float32Array>} x Some value.\n * @param {SerializerContext<Float32Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Float32Array>, serializerContext: SerializerContext<Float32Array>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.serializedNullValue;\n }\n\n if (isFloat32Array(x))\n {\n return Array.from(x);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as float 32 array.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Float32Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Float32Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Float32Array>): TypeLike<Float32Array>\n {\n if (isUndefined(x))\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (isArray(x))\n {\n return Float32Array.from(x);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as float 32 array.`, x);\n }\n\n return undefined;\n }\n}\n","import { isArray, isNull, isUndefined } from 'lodash';\nimport { isFloat64Array } from '../functions/is-float-64-array';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Float 64 array serializer.\n * \n * @type {Float64ArraySerializer}\n */\nexport class Float64ArraySerializer implements Serializer<Float64Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Float64Array>} x Some value.\n * @param {SerializerContext<Float64Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Float64Array>, serializerContext: SerializerContext<Float64Array>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.serializedNullValue;\n }\n\n if (isFloat64Array(x))\n {\n return Array.from(x);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as float 64 array.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Float64Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Float64Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Float64Array>): TypeLike<Float64Array>\n {\n if (isUndefined(x))\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (isArray(x))\n {\n return Float64Array.from(x);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value to a float 64 array.`, x);\n }\n\n return undefined;\n }\n}\n","export * from './any-serializer';\nexport * from './array-buffer-serializer';\nexport * from './array-serializer';\nexport * from './boolean-serializer';\nexport * from './data-view-serializer';\nexport * from './date-serializer';\nexport * from './float-32-array-serializer';\nexport * from './float-64-array-serializer';\nexport * from './int-8-array-serializer';\nexport * from './int-16-array-serializer';\nexport * from './int-32-array-serializer';\nexport * from './map-serializer';\nexport * from './number-serializer';\nexport * from './set-serializer';\nexport * from './string-serializer';\nexport * from './type-serializer';\nexport * from './uint-8-array-serializer';\nexport * from './uint-8-clamped-array-serializer';\nexport * from './uint-16-array-serializer';\nexport * from './uint-32-array-serializer';\nexport * from './unknown-serializer';\n","import { isArray, isNull, isUndefined } from 'lodash';\nimport { isInt16Array } from '../functions/is-int-16-array';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Int 16 array serializer.\n * \n * @type {Int16ArraySerializer}\n */\nexport class Int16ArraySerializer implements Serializer<Int16Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Int16Array>} x Some value.\n * @param {SerializerContext<Int16Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Int16Array>, serializerContext: SerializerContext<Int16Array>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.serializedNullValue;\n }\n\n if (isInt16Array(x))\n {\n return Array.from(x);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as int 16 array.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Int16Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Int16Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Int16Array>): TypeLike<Int16Array>\n {\n if (isUndefined(x))\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (isArray(x))\n {\n return Int16Array.from(x);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as int 16 array.`, x);\n }\n\n return undefined;\n }\n}\n","import { isArray, isNull, isUndefined } from 'lodash';\nimport { isInt32Array } from '../functions/is-int-32-array';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Int 32 array serializer.\n * \n * @type {Int32ArraySerializer}\n */\nexport class Int32ArraySerializer implements Serializer<Int32Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Int32Array>} x Some value.\n * @param {SerializerContext<Int32Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Int32Array>, serializerContext: SerializerContext<Int32Array>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.serializedNullValue;\n }\n\n if (isInt32Array(x))\n {\n return Array.from(x);\n }\n \n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as int 32 array.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Int32Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Int32Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Int32Array>): TypeLike<Int32Array>\n {\n if (isUndefined(x))\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (isArray(x))\n {\n return Int32Array.from(x);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as int 32 array.`, x);\n }\n\n return undefined;\n }\n}\n","import { isArray, isNull, isUndefined } from 'lodash';\nimport { isInt8Array } from '../functions/is-int-8-array';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Int 8 array serializer.\n * \n * @type {Int8ArraySerializer}\n */\nexport class Int8ArraySerializer implements Serializer<Int8Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Int8Array>} x Some value.\n * @param {SerializerContext<Int8Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Int8Array>, serializerContext: SerializerContext<Int8Array>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.serializedNullValue;\n }\n\n if (isInt8Array(x))\n {\n return Array.from(x);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as int 8 array.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Int8Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Int8Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Int8Array>): TypeLike<Int8Array>\n {\n if (isUndefined(x))\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (isArray(x))\n {\n return Int8Array.from(x);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as int 8 array.`, x);\n }\n\n return undefined;\n }\n}\n","import { isArray, isMap, isNull, isUndefined } from 'lodash';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Map serializer.\n * \n * @type {MapSerializer}\n */\nexport class MapSerializer implements Serializer<Map<any, any>>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Map<any, any>>} x Some value.\n * @param {SerializerContext<Map<any, any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Map<any, any>>, serializerContext: SerializerContext<Map<any, any>>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.serializedNullValue;\n }\n\n if (isMap(x))\n {\n return serializerContext.defineReference(x, () =>\n {\n const map = x;\n const array = new Array<any>(x.keys.length);\n const genericKeySerializerContext = serializerContext.defineGenericSerializerContext(0);\n const genericValueSerializerContext = serializerContext.defineGenericSerializerContext(1);\n\n const keyArraySerializerContext = genericKeySerializerContext.defineChildSerializerContext({ \n jsonPathKey: genericKeySerializerContext.jsonPathKey \n });\n\n const valueArraySerializerContext = genericValueSerializerContext.defineChildSerializerContext({ \n jsonPathKey: genericValueSerializerContext.jsonPathKey \n });\n\n const keySerializerContext = keyArraySerializerContext.defineChildSerializerContext({\n jsonPathKey: 'key',\n typeMetadata: genericKeySerializerContext.typeMetadata\n });\n\n const valueSerializerContext = valueArraySerializerContext.defineChildSerializerContext({\n jsonPathKey: 'value',\n typeMetadata: genericValueSerializerContext.typeMetadata\n });\n \n let i = -1;\n\n for (const [mk, mv] of map.entries())\n {\n i++;\n\n keyArraySerializerContext.hasJsonPathKey(i);\n valueArraySerializerContext.hasJsonPathKey(i);\n keySerializerContext.hasReferenceValueSetter(v => array[i][keySerializerContext.jsonPathKey] = v);\n valueSerializerContext.hasReferenceValueSetter(v => array[i][valueSerializerContext.jsonPathKey] = v);\n\n array[i] = {};\n array[i][keySerializerContext.jsonPathKey] = keySerializerContext.serialize(mk);\n array[i][valueSerializerContext.jsonPathKey] = valueSerializerContext.serialize(mv);\n }\n\n return array;\n });\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as map.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Map<any, any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Map<any, any>>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Map<any, any>>): TypeLike<Map<any, any>>\n {\n if (isUndefined(x))\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (isArray(x))\n {\n return serializerContext.restoreReference(x, () =>\n {\n const array = x;\n const map = new Map<any, any>();\n const genericKeySerializerContext = serializerContext.defineGenericSerializerContext(0);\n const genericValueSerializerContext = serializerContext.defineGenericSerializerContext(1);\n\n const keyArraySerializerContext = genericKeySerializerContext.defineChildSerializerContext({ \n jsonPathKey: genericKeySerializerContext.jsonPathKey \n });\n \n const valueArraySerializerContext = genericValueSerializerContext.defineChildSerializerContext({ \n jsonPathKey: genericValueSerializerContext.jsonPathKey \n });\n\n const keySerializerContext = keyArraySerializerContext.defineChildSerializerContext({\n jsonPathKey: 'key',\n typeMetadata: genericKeySerializerContext.typeMetadata\n });\n\n const valueSerializerContext = valueArraySerializerContext.defineChildSerializerContext({\n jsonPathKey: 'value',\n typeMetadata: genericValueSerializerContext.typeMetadata\n });\n\n for (let i = 0; i < array.length; i++)\n {\n const mk = array[i][keySerializerContext.jsonPathKey];\n const mv = array[i][valueSerializerContext.jsonPathKey];\n\n keyArraySerializerContext.hasJsonPathKey(i);\n valueArraySerializerContext.hasJsonPathKey(i);\n\n keySerializerContext.hasReferenceValueSetter(v => map.set(v, undefined));\n\n const key = keySerializerContext.deserialize(mk);\n\n valueSerializerContext.hasReferenceValueSetter(v => map.set(key, v));\n \n const value = valueSerializerContext.deserialize(mv);\n \n map.set(key, value);\n }\n\n return map;\n });\n }\n\n if (serializerContext.log.errorEnabled)\n {\n serializerContext.log.error(`${serializerContext.jsonPath}: Cannot deserialize value as map!`, x);\n }\n\n return undefined;\n }\n}\n","import { isBoolean, isNull, isNumber, isString, isUndefined } from 'lodash';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Number serializer.\n * \n * @type {NumberSerializer}\n */\nexport class NumberSerializer implements Serializer<number>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<number>} x Some value.\n * @param {SerializerContext<number>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<number>, serializerContext: SerializerContext<number>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.serializedNullValue;\n }\n\n if (isNumber(x))\n {\n return x;\n }\n\n if (serializerContext.useImplicitConversion) \n {\n return this.convert(x, serializerContext);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as number.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<number>} serializerContext Serializer context.\n * \n * @returns {TypeLike<number>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<number>): TypeLike<number>\n {\n if (isUndefined(x))\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (isNumber(x))\n {\n return x;\n }\n\n if (serializerContext.useImplicitConversion) \n {\n return this.convert(x, serializerContext);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as number.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Converts provided value to the target type value.\n * \n * @param {any} x Some value.\n * @param {SerializerContext<number>} serializerContext Serializer context.\n * \n * @returns {number|undefined} Converted value or undefined.\n */\n private convert(x: any, serializerContext: SerializerContext<number>): number | undefined\n {\n if (isString(x) || isBoolean(x))\n {\n return Number(x);\n }\n \n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot convert value to a number.`, x);\n }\n\n return undefined;\n }\n}\n","import { isArray, isNull, isSet, isUndefined } from 'lodash';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Set serializer.\n * \n * @type {SetSerializer}\n */\nexport class SetSerializer implements Serializer<Set<any>>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Set<any>>} x Some value.\n * @param {SerializerContext<Set<any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Set<any>>, serializerContext: SerializerContext<Set<any>>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.serializedNullValue;\n }\n\n if (isSet(x))\n {\n return serializerContext.defineReference(x, () =>\n {\n const set = x;\n const array = new Array<any>();\n const genericSerializerContext = serializerContext.defineGenericSerializerContext(0);\n\n const valueSerializerContext = genericSerializerContext.defineChildSerializerContext({ \n jsonPathKey: genericSerializerContext.jsonPathKey \n });\n\n let i = -1;\n \n for (const v of set)\n {\n i++;\n\n valueSerializerContext.hasJsonPathKey(i);\n valueSerializerContext.hasReferenceValueSetter(v => array[i] = v);\n\n array[i] = valueSerializerContext.serialize(v);\n }\n\n return array;\n });\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as set.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Set<any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Set<any>>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Set<any>>): TypeLike<Set<any>>\n {\n if (isUndefined(x))\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (isArray(x))\n {\n return serializerContext.restoreReference(x, () =>\n {\n const array = x;\n const set = new Set<any>();\n const genericSerializerContext = serializerContext.defineGenericSerializerContext(0);\n \n const valueSerializerContext = genericSerializerContext.defineChildSerializerContext({ \n jsonPathKey: genericSerializerContext.jsonPathKey \n });\n \n for (let i = 0; i < array.length; i++)\n {\n valueSerializerContext.hasJsonPathKey(i);\n valueSerializerContext.hasReferenceValueSetter(v => set.add(v));\n\n set.add(valueSerializerContext.deserialize(array[i]));\n }\n\n return set;\n });\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as set.`, x);\n }\n\n return undefined;\n }\n}\n","import { isBoolean, isDate, isNull, isNumber, isObject, isString, isUndefined } from 'lodash';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * String serializer.\n * \n * @type {StringSerializer}\n */\nexport class StringSerializer implements Serializer<string>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<string>} x Some value.\n * @param {SerializerContext<string>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<string>, serializerContext: SerializerContext<string>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.serializedNullValue;\n }\n\n if (isString(x))\n {\n return x;\n }\n \n if (serializerContext.useImplicitConversion) \n {\n return this.convert(x, serializerContext);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as string.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<string>} serializerContext Serializer context.\n * \n * @returns {TypeLike<string>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<string>): TypeLike<string>\n {\n if (isUndefined(x))\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (isString(x))\n {\n return x;\n }\n\n if (serializerContext.useImplicitConversion) \n {\n return this.convert(x, serializerContext);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as string.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Converts provided value to the target type value.\n * \n * @param {any} x Some value.\n * @param {SerializerContext<string>} serializerContext Type serializer context.\n * \n * @returns {string|undefined} Converted value or original value.\n */\n private convert(x: any, serializerContext: SerializerContext<string>): string | undefined\n {\n if (isNumber(x) || isBoolean(x)) \n {\n return String(x);\n }\n\n if (isDate(x))\n {\n return x.toISOString();\n }\n\n if (isObject(x))\n {\n return JSON.stringify(x);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot convert value to string.`, x);\n }\n \n return undefined;\n }\n}\n","import { isNil, isNull, isObject, isUndefined } from 'lodash';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeContext } from '../type-context';\nimport { TypeContextEntry } from '../type-context-entry';\nimport { TypeLike } from '../type-like';\n\n/**\n * Type serializer.\n * \n * @type {TypeSerializer}\n */\nexport class TypeSerializer implements Serializer<Record<string, any>>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Record<string, any>>} x Some value.\n * @param {SerializerContext<Record<string, any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Record<string, any>>, serializerContext: SerializerContext<Record<string, any>>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.serializedNullValue;\n }\n\n if (isObject(x))\n {\n return serializerContext.defineReference(x, () =>\n {\n const type = x as Record<string, any>;\n\n const typeSerializerContext = serializerContext.polymorphic \n ? serializerContext.definePolymorphicSerializerContext(x.constructor) \n : serializerContext;\n\n const propertySerializerContext = typeSerializerContext.defineChildSerializerContext({ \n jsonPathKey: typeSerializerContext.jsonPathKey \n });\n\n const typeMetadata = typeSerializerContext.typeMetadata;\n const object = {} as Record<string, any>;\n\n for (const propertyMetadata of typeMetadata.sortedPropertyMetadatas)\n {\n if (propertyMetadata.serializationConfigured && !propertyMetadata.serializable)\n {\n continue;\n }\n\n const serializedPropertyName = propertyMetadata.serializedPropertyName;\n const deserializedPropertyName = propertyMetadata.deserializedPropertyName;\n const propertyValue = type[deserializedPropertyName];\n\n propertySerializerContext.hasJsonPathKey(serializedPropertyName);\n propertySerializerContext.hasPropertyMetadata(propertyMetadata);\n propertySerializerContext.hasTypeMetadata(propertyMetadata.typeMetadata);\n propertySerializerContext.hasGenericStructures(propertyMetadata.genericStructures);\n propertySerializerContext.hasGenericMetadataResolvers(propertyMetadata.genericMetadataResolvers);\n \n propertySerializerContext.hasReferenceValueSetter(v => \n {\n const declaringObject = propertySerializerContext.referenceMap.get(type);\n \n if (!isNil(declaringObject))\n {\n declaringObject[serializedPropertyName] = v;\n }\n });\n\n const value = propertySerializerContext.serialize(propertyValue);\n\n object[serializedPropertyName] = value;\n }\n\n if (typeSerializerContext.preserveDiscriminator)\n {\n object[typeSerializerContext.discriminator] = typeSerializerContext.discriminant;\n } \n else if (object.hasOwnProperty(typeSerializerContext.discriminator))\n {\n delete object[typeSerializerContext.discriminator];\n }\n\n return object;\n });\n }\n\n if (serializerContext.log.errorEnabled)\n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as type.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Record<string, any>>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Record<string, any>>} Deserialized value or undefined.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Record<string, any>>): TypeLike<Record<string, any>>\n {\n if (isUndefined(x))\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (isObject(x))\n {\n return serializerContext.restoreReference(x, () =>\n {\n const object = x as Record<string, any>;\n\n const typeSerializerContext = serializerContext.polymorphic \n ? serializerContext.definePolymorphicSerializerContext(x) \n : serializerContext;\n \n const propertySerializerContext = typeSerializerContext.defineChildSerializerContext({ \n jsonPathKey: typeSerializerContext.jsonPath \n });\n\n const typeMetadata = typeSerializerContext.typeMetadata;\n const typeContext = new TypeContext(typeMetadata);\n\n for (const propertyMetadata of typeMetadata.sortedPropertyMetadatas)\n {\n if (propertyMetadata.serializationConfigured && !propertyMetadata.deserializable)\n {\n continue;\n }\n\n const serializedPropertyName = propertyMetadata.serializedPropertyName;\n const deserializedPropertyName = propertyMetadata.deserializedPropertyName;\n const propertyValue = object[serializedPropertyName];\n\n propertySerializerContext.hasJsonPathKey(deserializedPropertyName);\n propertySerializerContext.hasPropertyMetadata(propertyMetadata);\n propertySerializerContext.hasTypeMetadata(propertyMetadata.typeMetadata);\n propertySerializerContext.hasGenericStructures(propertyMetadata.genericStructures);\n propertySerializerContext.hasGenericMetadataResolvers(propertyMetadata.genericMetadataResolvers);\n\n propertySerializerContext.hasReferenceValueSetter(v => \n {\n const declaringType = propertySerializerContext.referenceMap.get(object);\n \n if (!isNil(declaringType))\n {\n declaringType[deserializedPropertyName] = v;\n }\n });\n\n const value = propertySerializerContext.deserialize(propertyValue);\n\n typeContext.set(deserializedPropertyName, new TypeContextEntry(deserializedPropertyName, value, propertyMetadata));\n typeContext.set(serializedPropertyName, new TypeContextEntry(serializedPropertyName, value, propertyMetadata));\n }\n\n for (const propertyName in object)\n {\n if (object.hasOwnProperty(propertyName))\n {\n typeContext.set(propertyName, new TypeContextEntry(propertyName, object[propertyName]));\n }\n }\n \n const factory = typeSerializerContext.factory;\n const injector = typeSerializerContext.injector;\n const type = factory.build(typeContext, injector);\n\n if (typeSerializerContext.preserveDiscriminator)\n {\n type[typeSerializerContext.discriminator] = typeSerializerContext.discriminant;\n }\n else if (type.hasOwnProperty(typeSerializerContext.discriminator))\n {\n delete type[typeSerializerContext.discriminator];\n }\n\n return type;\n });\n }\n \n if (serializerContext.log.errorEnabled)\n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as type.`, x);\n }\n\n return undefined;\n }\n}\n","import { isArray, isNull, isUndefined } from 'lodash';\nimport { isUint16Array } from '../functions/is-uint-16-array';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Uint 16 array serializer.\n * \n * @type {Uint16ArraySerializer}\n */\nexport class Uint16ArraySerializer implements Serializer<Uint16Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Uint16Array>} x Some value.\n * @param {SerializerContext<Uint16Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Uint16Array>, serializerContext: SerializerContext<Uint16Array>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.serializedNullValue;\n }\n\n if (isUint16Array(x))\n {\n return Array.from(x);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as uint 16 array.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Uint16Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Uint16Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Uint16Array>): TypeLike<Uint16Array>\n {\n if (isUndefined(x))\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (isArray(x))\n {\n return Uint16Array.from(x);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as uint 16 array.`, x);\n }\n\n return undefined;\n }\n}\n","import { isArray, isNull, isUndefined } from 'lodash';\nimport { isUint32Array } from '../functions/is-uint-32-array';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Uint 32 array serializer.\n * \n * @type {Uint32ArraySerializer}\n */\nexport class Uint32ArraySerializer implements Serializer<Uint32Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Uint32Array>} x Some value.\n * @param {SerializerContext<Uint32Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Uint32Array>, serializerContext: SerializerContext<Uint32Array>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.serializedNullValue;\n }\n\n if (isUint32Array(x))\n {\n return Array.from(x);\n }\n \n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as uint 32 array.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Uint32Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Uint32Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Uint32Array>): TypeLike<Uint32Array>\n {\n if (isUndefined(x))\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (isArray(x))\n {\n return Uint32Array.from(x);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as uint 32 array.`, x);\n }\n\n return undefined;\n }\n}\n","import { isArray, isNull, isUndefined } from 'lodash';\nimport { isUint8Array } from '../functions/is-uint-8-array';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Uint 8 array serializer.\n * \n * @type {Uint8ArraySerializer}\n */\nexport class Uint8ArraySerializer implements Serializer<Uint8Array>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Uint8Array>} x Some value.\n * @param {SerializerContext<Uint8Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Uint8Array>, serializerContext: SerializerContext<Uint8Array>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.serializedNullValue;\n }\n\n if (isUint8Array(x))\n {\n return Array.from(x);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as uint 8 array.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Uint8Array>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Uint8Array>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Uint8Array>): TypeLike<Uint8Array>\n {\n if (isUndefined(x))\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (isArray(x))\n {\n return Uint8Array.from(x);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as uint 8 array.`, x);\n }\n\n return undefined;\n }\n}\n","import { isArray, isNull, isUndefined } from 'lodash';\nimport { isUint8ClampedArray } from '../functions/is-uint-8-clamped-array';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Uint 8 clamped array serializer.\n * \n * @type {Uint8ClampedArraySerializer}\n */\nexport class Uint8ClampedArraySerializer implements Serializer<Uint8ClampedArray>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<Uint8ClampedArray>} x Some value.\n * @param {SerializerContext<Uint8ClampedArray>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<Uint8ClampedArray>, serializerContext: SerializerContext<Uint8ClampedArray>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.serializedNullValue;\n }\n\n if (isUint8ClampedArray(x))\n {\n return Array.from(x);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot serialize value as uint 8 clamped array.`, x);\n }\n\n return undefined;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<Uint8ClampedArray>} serializerContext Serializer context.\n * \n * @returns {TypeLike<Uint8ClampedArray>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<Uint8ClampedArray>): TypeLike<Uint8ClampedArray>\n {\n if (isUndefined(x))\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.deserializedNullValue;\n }\n\n if (isArray(x))\n {\n return Uint8ClampedArray.from(x);\n }\n\n if (serializerContext.log.errorEnabled) \n {\n serializerContext.log.error(`${serializerContext.jsonPath}: cannot deserialize value as uint 8 clamped array.`, x);\n }\n\n return undefined;\n }\n}\n","import { isNull, isUndefined } from 'lodash';\nimport { Serializer } from '../serializer';\nimport { SerializerContext } from '../serializer-context';\nimport { TypeLike } from '../type-like';\n\n/**\n * Unknown serializer.\n * \n * @type {UnknownSerializer}\n */\nexport class UnknownSerializer implements Serializer<unknown>\n{\n /**\n * Serializes provided value.\n * \n * @param {TypeLike<unknown>} x Some value.\n * @param {SerializerContext<unknown>} serializerContext Serializer context.\n * \n * @returns {TypeLike<any>} Serialized value or undefined.\n */\n public serialize(x: TypeLike<unknown>, serializerContext: SerializerContext<unknown>): TypeLike<any>\n {\n if (isUndefined(x))\n {\n return serializerContext.serializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.serializedNullValue;\n }\n\n return x;\n }\n\n /**\n * Deserializes provided value.\n * \n * @param {TypeLike<any>} x Some value.\n * @param {SerializerContext<unknown>} serializerContext Serializer context.\n * \n * @returns {TypeLike<unknown>} Deserialized value.\n */\n public deserialize(x: TypeLike<any>, serializerContext: SerializerContext<unknown>): TypeLike<unknown>\n {\n if (isUndefined(x))\n {\n return serializerContext.deserializedDefaultValue;\n }\n\n if (isNull(x))\n {\n return serializerContext.deserializedNullValue;\n }\n\n return x;\n }\n}\n","import { PropertyMetadata } from './property-metadata';\n\n/**\n * Represents a data entry defined within a scope of a type.\n * \n * @type {TypeContextEntry<TDeclaringType, TType>}\n */\nexport class TypeContextEntry<TDeclaringType, TType>\n{\n /**\n * Unique key.\n * \n * @type {string}\n */\n public readonly key: string;\n\n /**\n * Value behind a key. \n * \n * If property metadata is defined then this is deserialized value. Original otherwise.\n * \n * @type {any}\n */\n public readonly value: any;\n\n /**\n * Property metadata behind a key.\n * \n * @type {PropertyMetadata<TDeclaringType, TType>}\n */\n public readonly propertyMetadata?: PropertyMetadata<TDeclaringType, TType>;\n\n /**\n * Constructor.\n * \n * @param {string} key Unique key. \n * @param {any} value Value behind a key.\n * @param {PropertyMetadata<TDeclaringType, TType>} propertyMetadata Property metadata behind a key.\n */\n public constructor(key: string, value: any, propertyMetadata?: PropertyMetadata<TDeclaringType, TType>)\n {\n this.key = key;\n this.value = value;\n this.propertyMetadata = propertyMetadata;\n\n return;\n }\n}\n","import { isNil } from 'lodash';\nimport { TypeContextEntry } from './type-context-entry';\nimport { TypeMetadata } from './type-metadata';\n\n/**\n * Type context class to encapsulate type values before building an object.\n * \n * @type {TypeContext<TType>}\n */\nexport class TypeContext<TType>\n{\n /**\n * Type metadata.\n * \n * @type {TypeMetadata<TType>}\n */\n public readonly typeMetadata: TypeMetadata<TType>;\n\n /**\n * Type context entry map.\n * \n * @type {Map<string, TypeContextEntry<TType, any>>}\n */\n public readonly typeContextEntryMap: Map<string, TypeContextEntry<TType, any>> = new Map<string, TypeContextEntry<TType, any>>();\n\n /**\n * Constructor.\n * \n * @param {TypeMetadata<TType>} typeMetadata Type metadata.\n */\n public constructor(typeMetadata: TypeMetadata<TType>)\n {\n this.typeMetadata = typeMetadata;\n\n return;\n }\n\n /**\n * Sets value for key.\n * \n * @param {string} key Key.\n * @param {TypeContextEntry<TType, any>} value Value.\n * \n * @returns {TypeContext<TType>} Current type context.\n */\n public set(key: string, value: TypeContextEntry<TType, any>): TypeContext<TType>\n {\n const typeContextEntry = this.typeContextEntryMap.get(key);\n\n if (isNil(typeContextEntry))\n {\n this.typeContextEntryMap.set(key, value);\n }\n \n return this;\n }\n\n /**\n * Gets value by key.\n * \n * @param {string} key Key.\n * \n * @returns {TypeContextEntry<TType, any>} Type context entry or undefined.\n */\n public get(key: string): TypeContextEntry<TType, any> | undefined\n {\n return this.typeContextEntryMap.get(key);\n }\n\n /**\n * Checks if type context has a key.\n * \n * @param {string} key Key.\n * \n * @returns {boolean} True when type context has a key. False otherwise.\n */\n public has(key: string): boolean\n {\n return this.typeContextEntryMap.has(key);\n }\n \n /**\n * Gets iterable for keys inside the context.\n * \n * @returns {IterableIterator<string>} Iterable for keys inside the context.\n */\n public keys(): IterableIterator<string>\n {\n return this.typeContextEntryMap.keys();\n }\n\n /**\n * Gets iterable for values inside the context.\n * \n * @returns {IterableIterator<TypeContextEntry<TType, any>>} Iterable for values inside the context.\n */\n public values(): IterableIterator<TypeContextEntry<TType, any>>\n {\n return this.typeContextEntryMap.values();\n }\n\n /**\n * Gets iterable for entries inside the context.\n * \n * @returns {IterableIterator<[string, TypeContextEntry<TType, any>]>} Iterable for entries inside the context.\n */\n public entries(): IterableIterator<[string, TypeContextEntry<TType, any>]>\n {\n return this.typeContextEntryMap.entries();\n }\n}\n","import { assign, isArray, isNil, isUndefined } from 'lodash';\nimport { Alias } from './alias';\nimport { Any } from './any';\nimport { CustomContext } from './custom-context';\nimport { CustomOption } from './custom-option';\nimport { TypeFactory } from './factories/type-factory';\nimport { jsonParse } from './functions/json-parse';\nimport { jsonStringify } from './functions/json-stringify';\nimport { GenericArgument } from './generic-argument';\nimport { SingletonInjector } from './injectors/singleton-injector';\nimport { Log } from './log';\nimport { LogLevel } from './log-level';\nimport { ReferenceCallback } from './reference-callback';\nimport { CircularReferenceHandler } from './reference-handlers/circular-reference-handler';\nimport { ReferenceKey } from './reference-key';\nimport { ReferenceValue } from './reference-value';\nimport { SerializerContext } from './serializer-context';\nimport { AnySerializer } from './serializers/any-serializer';\nimport { ArrayBufferSerializer } from './serializers/array-buffer-serializer';\nimport { ArraySerializer } from './serializers/array-serializer';\nimport { BooleanSerializer } from './serializers/boolean-serializer';\nimport { DataViewSerializer } from './serializers/data-view-serializer';\nimport { DateSerializer } from './serializers/date-serializer';\nimport { Float32ArraySerializer } from './serializers/float-32-array-serializer';\nimport { Float64ArraySerializer } from './serializers/float-64-array-serializer';\nimport { Int16ArraySerializer } from './serializers/int-16-array-serializer';\nimport { Int32ArraySerializer } from './serializers/int-32-array-serializer';\nimport { Int8ArraySerializer } from './serializers/int-8-array-serializer';\nimport { MapSerializer } from './serializers/map-serializer';\nimport { NumberSerializer } from './serializers/number-serializer';\nimport { SetSerializer } from './serializers/set-serializer';\nimport { StringSerializer } from './serializers/string-serializer';\nimport { TypeSerializer } from './serializers/type-serializer';\nimport { Uint16ArraySerializer } from './serializers/uint-16-array-serializer';\nimport { Uint32ArraySerializer } from './serializers/uint-32-array-serializer';\nimport { Uint8ArraySerializer } from './serializers/uint-8-array-serializer';\nimport { Uint8ClampedArraySerializer } from './serializers/uint-8-clamped-array-serializer';\nimport { UnknownSerializer } from './serializers/unknown-serializer';\nimport { TypeConfiguration } from './type-configuration';\nimport { TypeFn } from './type-fn';\nimport { TypeLike } from './type-like';\nimport { TypeManagerOptions } from './type-manager-options';\nimport { TypeMetadata } from './type-metadata';\nimport { typeMetadataSymbol } from './type-metadata-symbol';\nimport { TypeOptions } from './type-options';\nimport { TypeOptionsBase } from './type-options-base';\nimport { Unknown } from './unknown';\n\n/**\n * Type manager class.\n * \n * @type {TypeManager}\n */\nexport class TypeManager\n{\n /**\n * Static shared options of any type which applied to any instance of type manager\n * by default.\n * \n * @type {TypeOptionsBase<any>}\n */\n public static readonly defaultTypeOptionsBase: TypeOptionsBase<any> = {\n discriminator: '$type',\n factory: new TypeFactory(),\n injector: new SingletonInjector(),\n log: new Log(LogLevel.Error),\n preserveDiscriminator: false,\n referenceHandler: new CircularReferenceHandler(),\n serializer: new TypeSerializer(),\n preserveNull: true,\n useDefaultValue: false,\n useImplicitConversion: false\n };\n\n /**\n * Static type options per type which applied to any instance of type manager\n * by default.\n * \n * @type {Map<TypeFn<any>, TypeOptions<any>>}\n */\n public static readonly defaultTypeOptionsMap: Map<TypeFn<any>, TypeOptions<any>> = new Map<TypeFn<any>, TypeOptions<any>>([\n [Any, { serializer: new AnySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [ArrayBuffer, { serializer: new ArrayBufferSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Array, { serializer: new ArraySerializer(), serializedDefaultValue: () => [], deserializedDefaultValue: () => [] }],\n [Boolean, { serializer: new BooleanSerializer(), serializedDefaultValue: false, deserializedDefaultValue: false }],\n [DataView, { serializer: new DataViewSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Date, { serializer: new DateSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Float32Array, { serializer: new Float32ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Float64Array, { serializer: new Float64ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Int8Array, { serializer: new Int8ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Int16Array, { serializer: new Int16ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Int32Array, { serializer: new Int32ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Map, { serializer: new MapSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Number, { serializer: new NumberSerializer(), serializedDefaultValue: 0, deserializedDefaultValue: 0 }],\n [Set, { serializer: new SetSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [String, { serializer: new StringSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Uint8Array, { serializer: new Uint8ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Uint8ClampedArray, { serializer: new Uint8ClampedArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Uint16Array, { serializer: new Uint16ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Uint32Array, { serializer: new Uint32ArraySerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }],\n [Unknown, { serializer: new UnknownSerializer(), serializedDefaultValue: undefined, deserializedDefaultValue: undefined }]\n ]);\n\n /**\n * Static type manager instance which is used for decorator based configurations and\n * static declarative based configurations.\n *\n * @type {TypeManager}\n */\n public static readonly staticTypeManager: TypeManager = new TypeManager();\n\n /**\n * Type function map for types with aliases.\n * \n * @type {Map<Alias, TypeFn<any>>}\n */\n public readonly typeFnMap: Map<Alias, TypeFn<any>> = new Map<Alias, TypeFn<any>>();\n\n /**\n * Symbol of current instance which is used to store type metadata within types.\n * \n * @type {symbol}\n */\n public readonly symbol: symbol;\n\n /**\n * Type manager options.\n * \n * @type {TypeManagerOptions}\n */\n public readonly typeManagerOptions: TypeManagerOptions;\n\n /**\n * Custom context.\n * \n * @type {CustomContext}\n */\n public readonly customContext: CustomContext;\n\n /**\n * Constructor.\n * \n * Creating an instance of type manager allows to have multiple configs. By default only static \n * instance of type manager is created on the background and all decorator based and declarative based\n * configurations are applied to it. Note that all options which are passed to a constructor are\n * mutated and all references are kept. This allow to have different managers with intersected data.\n * If such behaviour is not required then use configure methods after creating instance of type manager.\n * \n * @param {TypeManagerOptions} typeManagerOptions Type manager options.\n */\n public constructor(typeManagerOptions: TypeManagerOptions = {})\n {\n this.symbol = Symbol(typeMetadataSymbol.description);\n this.typeManagerOptions = this.constructTypeManagerOptions(typeManagerOptions);\n this.customContext = this.constructCustomContext();\n\n this.configure(typeManagerOptions);\n\n return;\n }\n\n /**\n * Gets type function map in static context.\n * \n * @returns {Map<Alias, TypeFn<any>>} Type function map.\n */\n public static get typeFnMap(): Map<Alias, TypeFn<any>>\n {\n return this.staticTypeManager.typeFnMap;\n }\n\n /**\n * Gets symbol in static context.\n * \n * @returns {symbol} Type manager symbol.\n */\n public static get symbol(): symbol\n {\n return this.staticTypeManager.symbol;\n }\n\n /**\n * Gets type manager options in static context.\n * \n * @returns {TypeManagerOptions} Type manager options.\n */\n public static get typeManagerOptions(): TypeManagerOptions\n {\n return this.staticTypeManager.typeManagerOptions;\n }\n\n /**\n * Gets type options base in static context.\n * \n * @returns {TypeOptionsBase<any>} Type options base.\n */\n public static get typeOptionsBase(): TypeOptionsBase<any>\n {\n return this.staticTypeManager.typeOptionsBase;\n }\n\n /**\n * Gets type options base.\n * \n * @returns {TypeOptionsBase<any>} Type options base.\n */\n public get typeOptionsBase(): TypeOptionsBase<any>\n {\n let typeOptionsBase = this.typeManagerOptions.typeOptionsBase;\n\n if (isNil(typeOptionsBase))\n {\n typeOptionsBase = {};\n\n this.typeManagerOptions.typeOptionsBase = this.constructTypeOptionsBase(typeOptionsBase);\n }\n\n return typeOptionsBase as TypeOptionsBase<any>;\n }\n\n /**\n * Gets type options map in static context.\n * \n * @returns {Map<TypeFn<any>, TypeOptions<any>>} Type options map.\n */\n public static get typeOptionsMap(): Map<TypeFn<any>, TypeOptions<any>>\n {\n return this.staticTypeManager.typeOptionsMap;\n }\n\n /**\n * Gets type options map.\n * \n * @returns {Map<TypeFn<any>, TypeOptions<any>>} Type options map.\n */\n public get typeOptionsMap(): Map<TypeFn<any>, TypeOptions<any>>\n {\n let typeOptionsMap = this.typeManagerOptions.typeOptionsMap;\n\n if (isNil(typeOptionsMap))\n {\n typeOptionsMap = new Map<TypeFn<any>, TypeOptions<any>>();\n\n this.typeManagerOptions.typeOptionsMap = this.constructTypeOptionsMap(typeOptionsMap);\n }\n\n return typeOptionsMap;\n }\n\n /**\n * Gets type configuration map in static context.\n * \n * @returns {Map<TypeFn<any>, TypeConfiguration<any>>} Type configuration map.\n */\n public static get typeConfigurationMap(): Map<TypeFn<any>, TypeConfiguration<any>>\n {\n return this.staticTypeManager.typeConfigurationMap;\n }\n\n /**\n * Gets type configuration map.\n * \n * @returns {Map<TypeFn<any>, TypeConfiguration<any>>} Type configuration map.\n */\n public get typeConfigurationMap(): Map<TypeFn<any>, TypeConfiguration<any>>\n {\n let typeConfigurationMap = this.typeManagerOptions.typeConfigurationMap;\n\n if (isNil(typeConfigurationMap))\n {\n typeConfigurationMap = new Map<TypeFn<any>, TypeConfiguration<any>>();\n\n this.typeManagerOptions.typeConfigurationMap = typeConfigurationMap;\n }\n\n return typeConfigurationMap;\n }\n\n /**\n * Constructs initial type manager options by extending passed options \n * with default values if they are not overriden. All references are kept.\n * \n * @param {TypeManagerOptions} typeManagerOptions Type manager options.\n * \n * @returns {TypeManagerOptions} Constructed type manager options.\n */\n private constructTypeManagerOptions(typeManagerOptions: TypeManagerOptions): TypeManagerOptions\n {\n let typeOptionsBase = typeManagerOptions.typeOptionsBase;\n\n if (isNil(typeOptionsBase))\n {\n typeOptionsBase = {};\n\n typeManagerOptions.typeOptionsBase = this.constructTypeOptionsBase(typeOptionsBase);\n }\n\n let typeOptionsMap = typeManagerOptions.typeOptionsMap;\n\n if (isNil(typeOptionsMap))\n {\n typeOptionsMap = new Map<TypeFn<any>, TypeOptions<any>>();\n\n typeManagerOptions.typeOptionsMap = this.constructTypeOptionsMap(typeOptionsMap);\n }\n\n return typeManagerOptions;\n }\n\n /**\n * Constructs type options base.\n * \n * @param {Partial<TypeOptionsBase<any>>} typeOptionsBase Type options base.\n * \n * @returns {Partial<TypeOptionsBase<any>>} Constructed type options base.\n */\n private constructTypeOptionsBase(typeOptionsBase: Partial<TypeOptionsBase<any>>): Partial<TypeOptionsBase<any>>\n {\n const initialTypeOptionsBase = assign({}, TypeManager.defaultTypeOptionsBase, typeOptionsBase);\n \n assign(typeOptionsBase, initialTypeOptionsBase);\n\n return typeOptionsBase;\n }\n\n /**\n * Constructs type options map.\n * \n * @param {Map<TypeFn<any>, TypeOptions<any>>} typeOptionsMap Type options map.\n * \n * @returns {Map<TypeFn<any>, TypeOptions<any>>} Constructed type options map.\n */\n private constructTypeOptionsMap(typeOptionsMap: Map<TypeFn<any>, TypeOptions<any>>): Map<TypeFn<any>, TypeOptions<any>>\n {\n const initialTypeOptionsMap = new Map<TypeFn<any>, TypeOptions<any>>();\n\n for (const [typeFn, typeOptions] of TypeManager.defaultTypeOptionsMap)\n {\n let mapTypeOptions = initialTypeOptionsMap.get(typeFn);\n\n if (isNil(mapTypeOptions))\n {\n mapTypeOptions = {};\n }\n\n initialTypeOptionsMap.set(typeFn, assign(mapTypeOptions, typeOptions));\n }\n\n for (const [typeFn, typeOptions] of typeOptionsMap)\n {\n let mapTypeOptions = initialTypeOptionsMap.get(typeFn);\n\n if (isNil(mapTypeOptions))\n {\n mapTypeOptions = {};\n }\n\n initialTypeOptionsMap.set(typeFn, assign(typeOptions, assign(mapTypeOptions, typeOptions)));\n }\n\n typeOptionsMap.clear();\n\n for (const [typeFn, typeOptions] of initialTypeOptionsMap)\n {\n typeOptionsMap.set(typeFn, typeOptions);\n }\n\n return typeOptionsMap;\n }\n \n /**\n * Constructs custom context.\n * \n * @returns {CustomContext} Constructed custom context.\n */\n private constructCustomContext(): CustomContext\n {\n const customOptions = this.typeOptionsBase.customOptions ?? new Array<CustomOption>();\n const customContext = new CustomContext(customOptions);\n\n this.typeOptionsBase.customOptions = customOptions;\n\n return customContext;\n }\n\n /**\n * Configures type metadata for provided type function in a static context.\n * \n * @param {TypeFn<TType>} typeFn Type function.\n * @param {TypeOptions<TType>} typeOptions Type options.\n * \n * @returns {TypeMetadata<TType>} Type metadata for provided type function.\n */\n public static configureTypeMetadata<TType>(typeFn: TypeFn<TType>, typeOptions?: TypeOptions<TType>): TypeMetadata<TType>\n {\n return this.staticTypeManager.configureTypeMetadata(typeFn, typeOptions);\n }\n\n /**\n * Configures type metadata for provided type function.\n * \n * @param {TypeFn<TType>} typeFn Type function.\n * @param {TypeOptions<TType>} typeOptions Type options.\n * \n * @returns {TypeMetadata<TType>} Type metadata for provided type function.\n */\n public configureTypeMetadata<TType>(typeFn: TypeFn<TType>, typeOptions?: TypeOptions<TType>): TypeMetadata<TType>\n {\n const symbol = this.symbol;\n const prototype = typeFn.prototype;\n const typeMetadataDefined = prototype.hasOwnProperty(symbol);\n const typeMetadata = typeMetadataDefined ? prototype[symbol] as TypeMetadata<TType> : this.declareTypeMetadata(typeFn, typeOptions);\n\n if (!typeMetadataDefined)\n {\n Object.defineProperty(prototype, symbol, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: typeMetadata\n });\n }\n \n if (typeMetadataDefined && !isNil(typeOptions))\n {\n typeMetadata.configure(typeOptions);\n }\n\n return typeMetadata;\n }\n\n /**\n * Declares type metadata for provided type function based on general configuration.\n * \n * @param {TypeFn<TType>} typeFn Type function.\n * @param {TypeOptions<TType>} typeOptions Type options.\n * \n * @returns {TypeMetadata<TType>} Type metadata.\n */\n private declareTypeMetadata<TType>(typeFn: TypeFn<TType>, typeOptions?: TypeOptions<TType>): TypeMetadata<TType>\n {\n let mapTypeOptions = this.typeOptionsMap.get(typeFn);\n\n if (isNil(mapTypeOptions))\n {\n mapTypeOptions = typeOptions ?? {};\n\n this.typeOptionsMap.set(typeFn, mapTypeOptions);\n }\n\n const symbol = this.symbol;\n const parentPrototype = Object.getPrototypeOf(typeFn.prototype) ?? {};\n const parentTypeMetadata = parentPrototype[symbol];\n const typeMetadata = new TypeMetadata(this, typeFn, mapTypeOptions, parentTypeMetadata);\n\n return typeMetadata;\n }\n\n /**\n * Extracts type metadata from provided type function in static context.\n * \n * @param {TypeFn<TType>} typeFn Type function.\n * \n * @returns {TypeMetadata<TType>} Type metadata for provided type function.\n */\n public static extractTypeMetadata<TType>(typeFn: TypeFn<TType>): TypeMetadata<TType>\n {\n return this.staticTypeManager.extractTypeMetadata(typeFn);\n }\n\n /**\n * Extracts type metadata from provided type function.\n * \n * @param {TypeFn<TType>} typeFn Type function.\n * \n * @returns {TypeMetadata<TType>} Type metadata for provided type function.\n */\n public extractTypeMetadata<TType>(typeFn: TypeFn<TType>): TypeMetadata<TType>\n {\n const symbol = this.symbol;\n const prototype = typeFn.prototype;\n const typeMetadataDefined = prototype.hasOwnProperty(symbol);\n const typeMetadata = typeMetadataDefined ? prototype[symbol] as TypeMetadata<TType> : this.configureTypeMetadata(typeFn);\n\n return typeMetadata;\n }\n\n /**\n * Applies shared type options in static context.\n * \n * @param {Partial<TypeOptionsBase<TType>>} typeOptionsBase Type options base.\n * \n * @returns {TypeManager} Static instance of type manager.\n */\n public static applyTypeOptionsBase<TType>(typeOptionsBase: Partial<TypeOptionsBase<TType>>): TypeManager\n {\n return this.staticTypeManager.applyTypeOptionsBase(typeOptionsBase);\n }\n \n /**\n * Applies shared type options.\n * \n * @param {Partial<TypeOptionsBase<TType>>} typeOptionsBase Type options base.\n * \n * @returns {TypeManager} Instance of type manager.\n */\n public applyTypeOptionsBase<TType>(typeOptionsBase: Partial<TypeOptionsBase<TType>>): TypeManager\n {\n const customOptions = this.typeOptionsBase.customOptions;\n\n assign(this.typeOptionsBase, typeOptionsBase, { customOptions: customOptions });\n\n if (!isNil(typeOptionsBase.customOptions))\n {\n this.customContext.configure(typeOptionsBase.customOptions);\n }\n\n return this;\n }\n\n /**\n * Applies type options map in static context.\n * \n * @param {Map<TypeFn<TType>, TypeOptions<TType>>} typeOptionsMap Type options map.\n * \n * @returns {TypeManager} Static instance of type manager.\n */\n public static applyTypeOptionsMap<TType>(typeOptionsMap: Map<TypeFn<TType>, TypeOptions<TType>>): TypeManager\n {\n return this.staticTypeManager.applyTypeOptionsMap(typeOptionsMap);\n }\n\n /**\n * Applies type options map.\n * \n * @param {Map<TypeFn<TType>, TypeOptions<TType>>} typeOptionsMap Type options map.\n * \n * @returns {TypeManager} Instance of type manager.\n */\n public applyTypeOptionsMap<TType>(typeOptionsMap: Map<TypeFn<TType>, TypeOptions<TType>>): TypeManager\n {\n for (const [typeFn, typeOptions] of typeOptionsMap)\n {\n this.applyTypeOptions(typeFn, typeOptions);\n }\n\n return this;\n }\n\n /**\n * Applies type options in static context.\n * \n * @param {TypeFn<TType>} typeFn Type function.\n * @param {TypeOptions<TType>} typeOptions Type options.\n * \n * @returns {TypeManager} Static instance of type manager.\n */\n public static applyTypeOptions<TType>(typeFn: TypeFn<TType>, typeOptions: TypeOptions<TType>): TypeManager\n {\n return this.staticTypeManager.applyTypeOptions(typeFn, typeOptions);\n }\n\n /**\n * Applies type options.\n * \n * @param {TypeFn<TType>} typeFn Type function.\n * @param {TypeOptions<TType>} typeOptions Type options.\n * \n * @returns {TypeManager} Instance of type manager.\n */\n public applyTypeOptions<TType>(typeFn: TypeFn<TType>, typeOptions: TypeOptions<TType>): TypeManager\n {\n const typeMetadata = this.extractTypeMetadata(typeFn);\n\n typeMetadata.configure(typeOptions);\n\n return this;\n }\n\n /**\n * Applies type configuration map in static context.\n * \n * @param {Map<TypeFn<TType>, TypeConfiguration<TType>>} typeConfigurationMap Type configuration map.\n * \n * @returns {TypeManager} Static instance of type manager.\n */\n public static applyTypeConfigurationMap<TType>(typeConfigurationMap: Map<TypeFn<TType>, TypeConfiguration<TType>>): TypeManager\n {\n return this.staticTypeManager.applyTypeConfigurationMap(typeConfigurationMap);\n }\n\n /**\n * Applies type configuration map.\n * \n * @param {Map<TypeFn<TType>, TypeConfiguration<TType>>} typeConfigurationMap Type configuration map.\n * \n * @returns {TypeManager} Instance of type manager.\n */\n public applyTypeConfigurationMap<TType>(typeConfigurationMap: Map<TypeFn<TType>, TypeConfiguration<TType>>): TypeManager\n {\n for (const [typeFn, typeConfiguration] of typeConfigurationMap)\n {\n this.applyTypeConfiguration(typeFn, typeConfiguration);\n }\n \n return this;\n }\n\n /**\n * Applies type configuration in static context.\n * \n * @param {TypeFn<TType>} typeFn Type function.\n * @param {TypeConfiguration<TType>} typeConfiguration Type configuration.\n * \n * @returns {TypeManager} Static instance of type manager.\n */\n public static applyTypeConfiguration<TType>(typeFn: TypeFn<TType>, typeConfiguration: TypeConfiguration<TType>): TypeManager\n {\n return this.staticTypeManager.applyTypeConfiguration(typeFn, typeConfiguration);\n }\n \n /**\n * Applies type configuration.\n * \n * @param {TypeFn<TType>} typeFn Type function.\n * @param {TypeConfiguration<TType>} typeConfiguration Type configuration.\n * \n * @returns {TypeManager} Instance of type manager.\n */\n public applyTypeConfiguration<TType>(typeFn: TypeFn<TType>, typeConfiguration: TypeConfiguration<TType>): TypeManager\n {\n const typeMetadata = this.extractTypeMetadata(typeFn);\n\n typeConfiguration.configure(typeMetadata);\n\n return this;\n }\n\n /**\n * Configures type manager in static context.\n * \n * @param {TypeManagerOptions} typeManagerOptions Type manager options.\n * \n * @returns {TypeManager} Static instance of type manager.\n */\n public static configure(typeManagerOptions: TypeManagerOptions): TypeManager\n {\n return this.staticTypeManager.configure(typeManagerOptions);\n }\n\n /**\n * Configures type manager.\n * \n * @param {TypeManagerOptions} typeManagerOptions Type manager options.\n * \n * @returns {TypeManager} Instance of type manager.\n */\n public configure(typeManagerOptions: TypeManagerOptions): TypeManager\n {\n if (!isUndefined(typeManagerOptions.typeOptionsBase)) \n {\n this.applyTypeOptionsBase(typeManagerOptions.typeOptionsBase);\n }\n\n if (!isUndefined(typeManagerOptions.typeOptionsMap)) \n {\n this.applyTypeOptionsMap(typeManagerOptions.typeOptionsMap);\n }\n\n if (!isUndefined(typeManagerOptions.typeConfigurationMap)) \n {\n this.applyTypeConfigurationMap(typeManagerOptions.typeConfigurationMap);\n }\n\n return this;\n }\n\n /**\n * Defines serializer context for x in static context.\n * \n * @param {TypeFn<TType>} typeFn Type function.\n * @param {any} x Some value.\n * @param {Array<GenericArgument<any>>} genericArguments Generic arguments.\n * \n * @returns {SerializerContext<TType>} Serializer context.\n */\n public static defineSerializerContext<TType>(typeFn: TypeFn<TType>, x: any, genericArguments?: Array<GenericArgument<any>>): SerializerContext<TType>\n {\n return this.staticTypeManager.defineSerializerContext(typeFn, x, genericArguments);\n }\n\n /**\n * Defines serializer context for x.\n * \n * @param {TypeFn<TType>} typeFn Type function.\n * @param {any} x Some value.\n * @param {Array<GenericArgument<any>>} genericArguments Generic arguments.\n * \n * @returns {SerializerContext<TType>} Serializer context.\n */\n public defineSerializerContext<TType>(typeFn: TypeFn<TType>, x: any, genericArguments?: Array<GenericArgument<any>>): SerializerContext<TType>\n {\n const typeMetadata = this.extractTypeMetadata(typeFn);\n const genericStructures = isNil(genericArguments) ? undefined : typeMetadata.defineGenericStructures(genericArguments);\n const genericMetadataResolvers = isNil(genericStructures) ? undefined : typeMetadata.defineGenericMetadataResolvers(genericStructures);\n\n return new SerializerContext(x, new Map<ReferenceKey, ReferenceValue>(), new Map<ReferenceKey, Array<ReferenceCallback>>(), \n {\n jsonPathKey: '$',\n typeMetadata: typeMetadata,\n genericStructures: genericStructures,\n genericMetadataResolvers: genericMetadataResolvers\n });\n }\n \n /**\n * Serializes provided value based on the type in static context.\n * \n * @param {TypeFn<TType>} typeFn Type function.\n * @param {TypeLike<TType>} x Input value.\n * \n * @returns {TypeLike<any>} Object created from provided input value or undefined. \n */\n public static serialize<TType>(typeFn: TypeFn<TType>, x: undefined): any;\n public static serialize<TType>(typeFn: TypeFn<TType>, x: null): null;\n public static serialize<TType>(typeFn: TypeFn<TType>, x: Array<TType>): Array<any>;\n public static serialize<TType>(typeFn: TypeFn<TType>, x: TType): any;\n public static serialize<TType>(typeFn: TypeFn<TType>, x: TypeLike<TType | Array<TType>>): TypeLike<any>\n {\n return this.staticTypeManager.serialize(typeFn, x);\n }\n\n /**\n * Serializes provided value based on the type function.\n * \n * @param {TypeFn<TType>} typeFn Type function.\n * @param {TypeLike<TType>} x Input value.\n * \n * @returns {TypeLike<any>} Object created from provided input value or undefined. \n */\n public serialize<TType>(typeFn: TypeFn<TType>, x: undefined): any;\n public serialize<TType>(typeFn: TypeFn<TType>, x: null): null;\n public serialize<TType>(typeFn: TypeFn<TType>, x: Array<TType>): Array<any>;\n public serialize<TType>(typeFn: TypeFn<TType>, x: TType): any;\n public serialize<TType>(typeFn: TypeFn<TType>, x: TypeLike<TType | Array<TType>>): TypeLike<any>\n {\n const arrayFn = Array as TypeFn<any>;\n\n if (isArray(x) && typeFn !== arrayFn)\n {\n return this.defineSerializerContext(arrayFn, x, [typeFn]).serialize(x);\n }\n\n return this.defineSerializerContext(typeFn, x).serialize(x as any);\n }\n\n /**\n * Deserializes provided value based on the type function in static context.\n * \n * @param {TypeFn<TType>} typeFn Type function.\n * @param {TypeLike<any>} x Input value.\n *\n * @returns {TypeLike<TType>} Type created from provided input value or undefined.\n */\n public static deserialize<TType>(typeFn: TypeFn<TType>, x: undefined): any;\n public static deserialize<TType>(typeFn: TypeFn<TType>, x: null): null;\n public static deserialize<TType>(typeFn: TypeFn<TType>, x: Array<any>): Array<TType>;\n public static deserialize<TType>(typeFn: TypeFn<TType>, x: any): TType;\n public static deserialize<TType>(typeFn: TypeFn<TType>, x: TypeLike<any>): TypeLike<TType | Array<TType>>\n {\n return this.staticTypeManager.deserialize(typeFn, x);\n }\n\n /**\n * Deserializes provided value based on the type function.\n * \n * @param {TypeFn<TType>} typeFn Type function.\n * @param {TypeLike<any>} x Input value.\n *\n * @returns {TypeLike<TType>} Type created from provided input value or undefined.\n */\n public deserialize<TType>(typeFn: TypeFn<TType>, x: undefined): any;\n public deserialize<TType>(typeFn: TypeFn<TType>, x: null): null;\n public deserialize<TType>(typeFn: TypeFn<TType>, x: Array<any>): Array<TType>;\n public deserialize<TType>(typeFn: TypeFn<TType>, x: any): TType;\n public deserialize<TType>(typeFn: TypeFn<TType>, x: TypeLike<any>): TypeLike<TType | Array<TType>>\n {\n const arrayFn = Array as TypeFn<any>;\n\n if (isArray(x) && typeFn !== arrayFn)\n {\n return this.defineSerializerContext(arrayFn, x, [typeFn]).deserialize(x);\n }\n\n return this.defineSerializerContext(typeFn, x).deserialize(x as any);\n }\n\n /**\n * Converts provided value to a JavaScript Object Notation (JSON) string in static context.\n * \n * @param {TypeFn<TType>} typeFn Type function.\n * @param {any} x Input value, usually an object or array, to be converted.\n * @param {Function|Array<number>|Array<string>} replacer A function that transforms the results or an array of strings and numbers that acts as an approved list.\n * @param {string|number} space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\n * \n * @returns {string} JSON string.\n */\n public static stringify<TType>(typeFn: TypeFn<TType>, x: any, replacer?: (this: any, key: string, value: any) => any | Array<number> | Array<string> | null, space?: string | number): string\n {\n return this.staticTypeManager.stringify(typeFn, x, replacer, space);\n }\n\n /**\n * Converts provided value to a JavaScript Object Notation (JSON) string.\n * \n * @param {TypeFn<TType>} typeFn Type function.\n * @param {any} x Input value, usually an object or array, to be converted.\n * @param {Function|Array<number>|Array<string>} replacer A function that transforms the results or an array of strings and numbers that acts as an approved list.\n * @param {string|number} space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.\n * \n * @returns {string} JSON string.\n */\n public stringify<TType>(typeFn: TypeFn<TType>, x: any, replacer?: (this: any, key: string, value: any) => any | Array<number> | Array<string> | null, space?: string | number): string\n {\n return jsonStringify(this.serialize(typeFn, x), replacer, space);\n }\n\n /**\n * Converts a JavaScript Object Notation (JSON) string into a type in static context.\n * \n * @param {TypeFn<TType>} typeFn Type function.\n * @param {string} x A valid JSON string.\n * @param {Function} reviver A function that transforms the results. This function is called for each member of the object.\n * \n * @returns {TypeLike<TType>} Type created from provided input value or undefined.\n */\n public static parse<TType>(typeFn: TypeFn<TType>, x: string, reviver?: (this: any, key: string, value: any) => any): TypeLike<TType>\n {\n return this.staticTypeManager.parse(typeFn, x, reviver);\n }\n \n /**\n * Converts a JavaScript Object Notation (JSON) string into a type.\n * \n * @param {TypeFn<TType>} typeFn Type function.\n * @param {string} x A valid JSON string.\n * @param {Function} reviver A function that transforms the results. This function is called for each member of the object.\n * \n * @returns {TypeLike<TType>} Type created from provided input value or undefined.\n */\n public parse<TType>(typeFn: TypeFn<TType>, x: string, reviver?: (this: any, key: string, value: any) => any): TypeLike<TType>\n {\n return this.deserialize(typeFn, jsonParse(x, reviver));\n }\n}\n","/**\n * Unique symbol used to store type metadata.\n * \n * @type {unique symbol}\n */\n export const typeMetadataSymbol: unique symbol = Symbol.for('$DSTypeMetadata');\n","import { isFunction, isNil, isUndefined } from 'lodash';\nimport { Alias } from './alias';\nimport { CustomContext } from './custom-context';\nimport { CustomOption } from './custom-option';\nimport { DefaultValue } from './default-value';\nimport { Discriminant } from './discriminant';\nimport { Discriminator } from './discriminator';\nimport { Factory } from './factory';\nimport { getOwnReflectMetadata } from './functions/get-own-reflect-metadata';\nimport { nameOf } from './functions/name-of';\nimport { InjectIndex } from './inject-index';\nimport { InjectMetadata } from './inject-metadata';\nimport { InjectOptions } from './inject-options';\nimport { InjectSorter } from './inject-sorter';\nimport { Injector } from './injector';\nimport { Log } from './log';\nimport { Metadata } from './metadata';\nimport { NamingConvention } from './naming-convention';\nimport { PropertyMetadata } from './property-metadata';\nimport { PropertyName } from './property-name';\nimport { PropertyOptions } from './property-options';\nimport { PropertySorter } from './property-sorter';\nimport { ReferenceHandler } from './reference-handler';\nimport { Serializer } from './serializer';\nimport { TypeFn } from './type-fn';\nimport { TypeInternals } from './type-internals';\nimport { TypeManager } from './type-manager';\nimport { TypeName } from './type-name';\nimport { TypeOptions } from './type-options';\nimport { TypeOptionsBase } from './type-options-base';\n\n/**\n * Main class used to describe a certain type.\n * \n * @type {TypeMetadata<TType>}\n */\nexport class TypeMetadata<TType> extends Metadata\n{\n /**\n * Type name. \n * \n * Defined at runtime based on the constructor function.\n * \n * @type {TypeName}\n */\n public readonly typeName: TypeName;\n\n /**\n * Type function.\n * \n * @type {TypeFn<TType>}\n */\n public readonly typeFn: TypeFn<TType>;\n\n /**\n * Type options used by default.\n * \n * @type {TypeOptionsBase<TType>}\n */\n public readonly typeOptionsBase: TypeOptionsBase<TType>;\n\n /**\n * Type options.\n * \n * @type {TypeOptions<TType>}\n */\n public readonly typeOptions: TypeOptions<TType>;\n\n /**\n * Type internals.\n * \n * @type {TypeInternals}\n */\n public readonly typeInternals: TypeInternals;\n\n /**\n * Children type metadata map.\n * \n * @type {Map<TypeFn<TType>, TypeMetadata<any>>}\n */\n public readonly childrenTypeMetadataMap: Map<TypeFn<any>, TypeMetadata<any>> = new Map<TypeFn<any>, TypeMetadata<any>>();\n\n /**\n * Discriminant map.\n * \n * @type {Map<TypeFn<any>, Discriminant>}\n */\n public readonly discriminantMap: Map<TypeFn<any>, Discriminant> = new Map<TypeFn<any>, Discriminant>();\n\n /**\n * Properties defined for a type.\n * \n * @type {Map<PropertyName, PropertyMetadata<TType, any>>}\n */\n public readonly propertyMetadataMap: Map<PropertyName, PropertyMetadata<TType, any>> = new Map<PropertyName, PropertyMetadata<TType, any>>();\n\n /**\n * Injections defined for a type.\n * \n * @type {Map<InjectIndex, InjectMetadata<TType, any>>}\n */\n public readonly injectMetadataMap: Map<InjectIndex, InjectMetadata<TType, any>> = new Map<InjectIndex, InjectMetadata<TType, any>>();\n\n /**\n * Parent type metadata.\n * \n * @type {TypeMetadata<any>}\n */\n public readonly parentTypeMetadata?: TypeMetadata<any>;\n\n /**\n * Constructor.\n * \n * @param {TypeManager} typeManager Type manager.\n * @param {TypeFn<any>} typeFn Type function.\n * @param {TypeOptions<TType>} typeOptions Type options.\n * @param {TypeMetadata<any>} parentTypeMetadata Parent type metadata.\n */\n public constructor(\n typeManager: TypeManager,\n typeFn: TypeFn<TType>,\n typeOptions: TypeOptions<TType>,\n parentTypeMetadata?: TypeMetadata<any>\n )\n {\n super(typeManager);\n\n this.typeName = nameOf(typeFn);\n this.typeFn = typeFn;\n this.typeOptionsBase = typeManager.typeOptionsBase;\n this.typeOptions = this.constructTypeOptions(typeOptions);\n this.typeInternals = this.constructTypeInternals();\n this.parentTypeMetadata = parentTypeMetadata;\n\n this.deriveParentTypeMetadataProperties();\n this.hasDiscriminant(this.discriminant);\n this.configure(typeOptions);\n\n return;\n }\n\n /**\n * Gets alias.\n * \n * @returns {Alias|undefined} Alias or undefined.\n */\n public get alias(): Alias | undefined\n {\n return this.typeOptions.alias;\n }\n\n /**\n * Gets custom options.\n * \n * @returns {Array<CustomOption>} Custom options.\n */\n public get customOptions(): Array<CustomOption> | undefined\n {\n return this.typeOptions.customOptions;\n }\n \n /**\n * Gets custom context.\n * \n * @returns {CustomContext} Custom context.\n */\n public get customContext(): CustomContext\n {\n let customContext = this.typeInternals.customContext;\n\n if (isNil(customContext))\n {\n this.typeOptions.customOptions = new Array<CustomOption>();\n this.typeInternals.customContext = new CustomContext(this.typeOptions.customOptions);\n\n customContext = this.typeInternals.customContext;\n }\n\n return customContext;\n }\n\n /**\n * Gets serialized null value.\n * \n * @returns {any|undefined} Resolved serialized null value or undefined.\n */\n public get serializedNullValue(): any | undefined\n {\n if (this.preserveNull)\n {\n return null;\n }\n\n return this.serializedDefaultValue;\n }\n\n /**\n * Gets serialized default value.\n * \n * @returns {any|undefined} Resolved serialized default value or undefined.\n */\n public get serializedDefaultValue(): any | undefined\n {\n if (this.useDefaultValue)\n {\n const serializedDefaultValue = this.typeOptions.defaultValue \n ?? this.typeOptions.serializedDefaultValue;\n\n const defaultValue = isFunction(serializedDefaultValue) \n ? serializedDefaultValue() \n : serializedDefaultValue;\n\n return defaultValue;\n }\n \n return undefined;\n }\n\n /**\n * Gets deserialized null value.\n * \n * @returns {any|undefined} Resolved deserialized null value or undefined.\n */\n public get deserializedNullValue(): any | undefined\n {\n if (this.preserveNull)\n {\n return null;\n }\n\n return this.deserializedDefaultValue;\n }\n \n /**\n * Gets deserialized default value.\n * \n * @returns {any|undefined} Resolved deserialized default value or undefined.\n */\n public get deserializedDefaultValue(): any | undefined\n {\n if (this.useDefaultValue)\n {\n const deserializedDefaultValue = this.typeOptions.defaultValue \n ?? this.typeOptions.deserializedDefaultValue;\n\n const defaultValue = isFunction(deserializedDefaultValue) \n ? deserializedDefaultValue() \n : deserializedDefaultValue;\n\n return defaultValue;\n }\n\n return undefined;\n }\n \n /**\n * Gets discriminant.\n * \n * @returns {Discriminant} Discriminant.\n */\n public get discriminant(): Discriminant\n {\n return this.typeOptions.discriminant ?? this.typeName;\n }\n\n /**\n * Gets discriminator.\n * \n * @returns {Discriminator} Discriminator.\n */\n public get discriminator(): Discriminator\n {\n return this.typeOptions.discriminator ?? this.typeOptionsBase.discriminator;\n }\n\n /**\n * Gets factory.\n * \n * @returns {Factory} Factory.\n */\n public get factory(): Factory\n {\n return this.typeOptions.factory ?? this.typeOptionsBase.factory;\n }\n\n /**\n * Gets injectable value.\n * \n * @returns {boolean|undefined} Injectable indicator or undefined.\n */\n public get injectable(): boolean | undefined\n {\n return this.typeOptions.injectable;\n }\n\n /**\n * Gets injector.\n * \n * @returns {Injector} Injector.\n */\n public get injector(): Injector\n {\n return this.typeOptions.injector ?? this.typeOptionsBase.injector;\n }\n\n /**\n * Gets log.\n * \n * @returns {Log} Log instance.\n */\n public get log(): Log\n {\n return this.typeOptions.log ?? this.typeOptionsBase.log;\n }\n\n /**\n * Gets naming convention.\n * \n * @returns {NamingConvention|undefined} Naming convention or undefined.\n */\n public get namingConvention(): NamingConvention | undefined\n {\n return this.typeOptions.namingConvention ?? this.typeOptionsBase.namingConvention;\n }\n\n /**\n * Gets indicator if current type metadata is polymorphic.\n * \n * @returns {boolean} True when type metadata is polymorphic. False otherwise.\n */\n public get polymorphic(): boolean\n {\n return this.discriminantMap.size > 1;\n }\n\n /**\n * Gets indicator if discriminator should be preserved.\n * \n * @returns {boolean} True when discriminator should be preserved. False otherwise.\n */\n public get preserveDiscriminator(): boolean \n {\n return this.typeOptions.preserveDiscriminator ?? this.typeOptionsBase.preserveDiscriminator;\n }\n\n /**\n * Gets reference handler.\n * \n * @returns {ReferenceHandler} Reference handler.\n */\n public get referenceHandler(): ReferenceHandler\n {\n return this.typeOptions.referenceHandler ?? this.typeOptionsBase.referenceHandler;\n }\n\n /**\n * Gets serializer.\n * \n * @returns {Serializer<TType>} Serializer.\n */\n public get serializer(): Serializer<TType>\n {\n return this.typeOptions.serializer ?? this.typeOptionsBase.serializer;\n }\n\n /**\n * Gets indicator if null value should be preserved.\n * \n * @returns {boolean} True when null value should be preserved. False otherwise.\n */\n public get preserveNull(): boolean\n {\n return this.typeOptions.preserveNull ?? this.typeOptionsBase.preserveNull;\n }\n\n /**\n * Gets indicator if default value should be used.\n * \n * @returns {boolean} True when type should use default value. False otherwise.\n */\n public get useDefaultValue(): boolean\n {\n return this.typeOptions.useDefaultValue ?? this.typeOptionsBase.useDefaultValue;\n }\n\n /**\n * Gets indicator if implicit conversion should be used.\n * \n * @returns {boolean} True when type should use implicit conversion. False otherwise.\n */\n public get useImplicitConversion(): boolean\n {\n return this.typeOptions.useImplicitConversion ?? this.typeOptionsBase.useImplicitConversion;\n }\n\n /**\n * Gets property sorter.\n * \n * @returns {PropertySorter|undefined} Property sorter or undefined.\n */\n public get propertySorter(): PropertySorter | undefined\n {\n return this.typeOptions.propertySorter ?? this.typeOptionsBase.propertySorter;\n }\n\n /**\n * Gets sorted property metadatas.\n * \n * @returns {IterableIterator<PropertyMetadata<TType, any>>} Iterable of property metadatas.\n */\n public get sortedPropertyMetadatas(): IterableIterator<PropertyMetadata<TType, any>>\n {\n const propertySorter = this.propertySorter;\n const propertyMetadatas = this.propertyMetadataMap.values();\n\n if (isNil(propertySorter))\n {\n return propertyMetadatas;\n }\n\n const sortedPropertyMetadatas = Array.from(propertyMetadatas).sort(propertySorter.sort);\n\n return sortedPropertyMetadatas[Symbol.iterator]();\n }\n\n /**\n * Gets inject sorter.\n * \n * @returns {InjectSorter|undefined} Property sorter or undefined.\n */\n public get injectSorter(): InjectSorter | undefined\n {\n return this.typeOptions.injectSorter ?? this.typeOptionsBase.injectSorter;\n }\n\n /**\n * Gets sorted inject metadatas.\n * \n * @returns {IterableIterator<InjectMetadata<TType, any>>} Iterable of inject metadatas.\n */\n public get sortedInjectMetadatas(): IterableIterator<InjectMetadata<TType, any>>\n {\n const injectSorter = this.injectSorter;\n const injectMetadatas = this.injectMetadataMap.values();\n\n if (isNil(injectSorter))\n {\n return injectMetadatas;\n }\n \n const sortedInjectMetadatas = Array.from(injectMetadatas).sort(injectSorter.sort);\n \n return sortedInjectMetadatas[Symbol.iterator]();\n }\n\n /**\n * Gets property options map.\n * \n * @returns {Map<PropertyName, PropertyOptions<any>>} Property options map.\n */\n public get propertyOptionsMap(): Map<PropertyName, PropertyOptions<any>>\n {\n let propertyOptionsMap = this.typeOptions.propertyOptionsMap;\n\n if (isNil(propertyOptionsMap))\n {\n propertyOptionsMap = new Map<PropertyName, PropertyOptions<any>>();\n\n this.typeOptions.propertyOptionsMap = propertyOptionsMap;\n }\n\n return propertyOptionsMap;\n }\n\n /**\n * Gets inject options map.\n * \n * @returns {Map<InjectIndex, InjectOptions<any>>} Inject options map.\n */\n public get injectOptionsMap(): Map<InjectIndex, InjectOptions<any>>\n {\n let injectOptionsMap = this.typeOptions.injectOptionsMap;\n\n if (isNil(injectOptionsMap))\n {\n injectOptionsMap = new Map<InjectIndex, InjectOptions<any>>();\n\n this.typeOptions.injectOptionsMap = injectOptionsMap;\n }\n\n return injectOptionsMap;\n }\n\n /**\n * Constructs initial type options by extending passed options \n * with default values if they are not overriden. All references are kept.\n * \n * @param {TypeOptions<TType>} typeOptions Type options.\n * \n * @returns {TypeOptions<TType>} Constructed type options.\n */\n private constructTypeOptions(typeOptions: TypeOptions<TType>): TypeOptions<TType>\n {\n return typeOptions;\n }\n\n /**\n * Constructs type internals.\n * \n * @returns {TypeInternals} Constructed type internals.\n */\n private constructTypeInternals(): TypeInternals\n {\n const customOptions = this.typeOptions.customOptions;\n const customContext = isNil(customOptions) ? undefined : new CustomContext(customOptions);\n const typeInternals = { customContext: customContext };\n\n return typeInternals;\n }\n\n /**\n * Derives parent type metadata properties.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n private deriveParentTypeMetadataProperties(): TypeMetadata<TType>\n {\n if (isNil(this.parentTypeMetadata)) \n {\n return this;\n }\n\n for (const [propertyName, propertyMetadata] of this.parentTypeMetadata.propertyMetadataMap)\n {\n this.propertyMetadataMap.set(propertyName, propertyMetadata);\n }\n\n this.parentTypeMetadata.childrenTypeMetadataMap.set(this.typeFn, this);\n\n return this;\n }\n\n /**\n * Reflects inject metadata.\n * \n * Used to configure inject metadata based on reflect metadata as inject decorators may be omitted.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public reflectInjectMetadata(): TypeMetadata<TType>\n {\n if (this.typeFn.length === 0)\n {\n return this;\n }\n\n const injectTypeFns = (getOwnReflectMetadata('design:paramtypes', this.typeFn) ?? new Array<TypeFn<any>>()) as Array<TypeFn<any>>;\n\n for (let injectIndex = 0; injectIndex < injectTypeFns.length; injectIndex++)\n {\n if (!this.injectMetadataMap.has(injectIndex))\n {\n this.configureInjectMetadata(injectIndex, { typeFn: injectTypeFns[injectIndex] });\n }\n }\n\n return this;\n }\n\n /**\n * Configures alias.\n * \n * @param {Alias|undefined} alias Alias.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public hasAlias(alias: Alias | undefined): TypeMetadata<TType>\n {\n this.releaseAlias();\n\n this.typeOptions.alias = alias;\n\n if (!isNil(alias)) \n {\n this.typeFnMap.set(alias, this.typeFn);\n }\n\n return this;\n }\n\n /**\n * Releases alias.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata. \n */\n private releaseAlias(): TypeMetadata<TType>\n {\n const alias = this.alias;\n\n if (!isNil(alias) && this.typeFnMap.has(alias))\n {\n this.typeFnMap.delete(alias);\n }\n\n return this;\n }\n\n /**\n * Configures custom options.\n * \n * @param {Array<CustomOption>|undefined} customOptions Custom options.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n private hasCustomOptions(customOptions: Array<CustomOption> | undefined): TypeMetadata<TType>\n {\n if (!isNil(customOptions))\n {\n this.customContext.configure(customOptions);\n }\n\n return this;\n }\n\n /**\n * Configures default value.\n * \n * @param {DefaultValue} defaultValue Default value.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public hasDefaultValue(defaultValue: DefaultValue): TypeMetadata<TType>\n {\n this.typeOptions.defaultValue = defaultValue;\n\n return this;\n }\n\n /**\n * Configures serialized default value.\n * \n * @param {DefaultValue} serializedDefaultValue Serialized default value.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public hasSerializedDefaultValue(serializedDefaultValue: DefaultValue): TypeMetadata<TType>\n {\n this.typeOptions.serializedDefaultValue = serializedDefaultValue;\n\n return this;\n }\n\n /**\n * Configures deserialized default value.\n * \n * @param {DefaultValue} deserializedDefaultValue Deserialized default value.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public hasDeserializedDefaultValue(deserializedDefaultValue: DefaultValue): TypeMetadata<TType>\n {\n this.typeOptions.deserializedDefaultValue = deserializedDefaultValue;\n\n return this;\n }\n\n /**\n * Configures discriminator.\n * \n * @param {Discriminator|undefined} discriminator Discriminator.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public hasDiscriminator(discriminator: Discriminator | undefined): TypeMetadata<TType>\n {\n this.typeOptions.discriminator = discriminator;\n\n return this;\n }\n \n /**\n * Configures discriminant.\n * \n * @param {Discriminant|undefined} discriminant Discriminant.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public hasDiscriminant(discriminant: Discriminant | undefined): TypeMetadata<TType>\n {\n this.typeOptions.discriminant = discriminant;\n\n if (!isNil(discriminant)) \n {\n this.provideDiscriminant(this.typeFn, discriminant);\n }\n\n return this;\n }\n\n /**\n * Provides discriminant.\n * \n * @param {TypeFn<any>} typeFn Type function.\n * @param {Discriminant} discriminant Discriminant.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n private provideDiscriminant(typeFn: TypeFn<any>, discriminant: Discriminant): TypeMetadata<TType>\n {\n this.discriminantMap.set(typeFn, discriminant);\n\n if (!isNil(this.parentTypeMetadata))\n {\n this.parentTypeMetadata.provideDiscriminant(typeFn, discriminant);\n }\n\n return this;\n }\n\n /**\n * Configures factory.\n * \n * @param {Factory|undefined} factory Factory.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public hasFactory(factory: Factory | undefined): TypeMetadata<TType>\n {\n this.typeOptions.factory = factory;\n\n return this;\n }\n\n /**\n * Configures injectable.\n * \n * @param {boolean} injectable Injectable.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public isInjectable(injectable: boolean = true): TypeMetadata<TType>\n {\n this.typeOptions.injectable = injectable;\n\n return this;\n }\n\n /**\n * Configures injector.\n * \n * @param {Injector|undefined} injector Injector.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public hasInjector(injector: Injector | undefined): TypeMetadata<TType>\n {\n this.typeOptions.injector = injector;\n\n return this;\n }\n\n /**\n * Configures log.\n * \n * @param {Log|undefined} log Log.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public hasLog(log: Log | undefined): TypeMetadata<TType>\n {\n this.typeOptions.log = log;\n\n return this;\n }\n\n /**\n * Configures naming convention.\n * \n * @param {NamingConvention|undefined} namingConvention Naming convention.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public hasNamingConvention(namingConvention: NamingConvention | undefined): TypeMetadata<TType>\n {\n this.typeOptions.namingConvention = namingConvention;\n\n return this;\n }\n\n /**\n * Configures preserve discriminator.\n * \n * @param {boolean} preserveDiscriminator Preserve discriminator.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public shouldPreserveDiscriminator(preserveDiscriminator: boolean = true): TypeMetadata<TType>\n {\n this.typeOptions.preserveDiscriminator = preserveDiscriminator;\n\n return this;\n }\n\n /**\n * Configures reference handler.\n * \n * @param {ReferenceHandler|undefined} referenceHandler Reference handler.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public hasReferenceHandler(referenceHandler: ReferenceHandler | undefined): TypeMetadata<TType>\n {\n this.typeOptions.referenceHandler = referenceHandler;\n\n return this;\n }\n\n /**\n * Configures serializer.\n * \n * @param {Serializer<TType>|undefined} serializer Serializer.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public hasSerializer(serializer: Serializer<TType> | undefined): TypeMetadata<TType>\n {\n this.typeOptions.serializer = serializer;\n\n return this;\n }\n\n /**\n * Configures preserve null.\n * \n * @param {boolean} preserveNull Preserve null.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public shouldPreserveNull(preserveNull: boolean = true): TypeMetadata<TType>\n {\n this.typeOptions.preserveNull = preserveNull;\n\n return this;\n }\n\n /**\n * Configures use default value.\n * \n * @param {boolean} useDefaultValue Use default value.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public shouldUseDefaultValue(useDefaultValue: boolean = true): TypeMetadata<TType>\n {\n this.typeOptions.useDefaultValue = useDefaultValue;\n\n return this;\n }\n\n /**\n * Configures use implicit convertion.\n * \n * @param {boolean} useImplicitConversion Use implicit convertion.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public shouldUseImplicitConversion(useImplicitConversion: boolean = true): TypeMetadata<TType>\n {\n this.typeOptions.useImplicitConversion = useImplicitConversion;\n\n return this;\n }\n\n /**\n * Configures property sorter.\n * \n * @param {PropertySorter|undefined} propertySorter Property sorter.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public hasPropertySorter(propertySorter: PropertySorter | undefined): TypeMetadata<TType>\n {\n this.typeOptions.propertySorter = propertySorter;\n\n return this;\n }\n\n /**\n * Configures inject sorter.\n * \n * @param {InjectSorter|undefined} injectSorter Inject sorter.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public hasInjectSorter(injectSorter: InjectSorter | undefined): TypeMetadata<TType>\n {\n this.typeOptions.injectSorter = injectSorter;\n\n return this;\n }\n\n /**\n * Configures certain property metadata.\n * \n * @param {PropertyName} propertyName Property name. \n * @param {PropertyOptions<TPropertyType>} propertyOptions Property options.\n * \n * @returns {PropertyMetadata<TType, TPropertyType>} Configured property metadata.\n */\n public configurePropertyMetadata<TPropertyType>(propertyName: PropertyName, propertyOptions?: PropertyOptions<TPropertyType>): PropertyMetadata<TType, TPropertyType>\n {\n let propertyMetadata = this.propertyMetadataMap.get(propertyName);\n\n if (isNil(propertyMetadata))\n {\n propertyMetadata = new PropertyMetadata(this, propertyName, propertyOptions ?? {});\n\n this.propertyMetadataMap.set(propertyName, propertyMetadata);\n this.propertyOptionsMap.set(propertyName, propertyMetadata.propertyOptions);\n\n return propertyMetadata;\n }\n\n if (!isNil(propertyOptions))\n {\n propertyMetadata.configure(propertyOptions);\n }\n\n return propertyMetadata;\n }\n\n /**\n * Configures certain inject metadata.\n * \n * @param {InjectIndex} injectIndex Inject index. \n * @param {InjectOptions<TInjectType>} injectOptions Inject options.\n * \n * @returns {InjectMetadata<TType, TInjectType>} Configured inject metadata.\n */\n public configureInjectMetadata<TInjectType>(injectIndex: InjectIndex, injectOptions?: InjectOptions<TInjectType>): InjectMetadata<TType, TInjectType>\n {\n let injectMetadata = this.injectMetadataMap.get(injectIndex);\n\n if (isNil(injectMetadata))\n {\n injectMetadata = new InjectMetadata(this, injectIndex, injectOptions ?? {});\n\n this.injectMetadataMap.set(injectIndex, injectMetadata);\n this.injectOptionsMap.set(injectIndex, injectMetadata.injectOptions);\n \n return injectMetadata;\n }\n \n if (!isNil(injectOptions))\n {\n injectMetadata.configure(injectOptions);\n }\n\n return injectMetadata;\n }\n\n /**\n * Configures property metadata map.\n * \n * @param {Map<PropertyName, PropertyOptions<TPropertyType>>} propertyOptionsMap Property options map.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public hasPropertyMetadataMap<TPropertyType>(propertyOptionsMap: Map<PropertyName, PropertyOptions<TPropertyType>>): TypeMetadata<TType>\n {\n for (const [propertyName, propertyOptions] of propertyOptionsMap)\n {\n this.configurePropertyMetadata(propertyName, propertyOptions);\n }\n\n return this;\n }\n\n /**\n * Configures inject metadata map.\n * \n * @param {Map<InjectIndex, InjectOptions<TInjectType>>} injectOptionsMap Inject options map.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public hasInjectMetadataMap<TInjectType>(injectOptionsMap: Map<InjectIndex, InjectOptions<TInjectType>>): TypeMetadata<TType>\n {\n for (const [injectIndex, injectOptions] of injectOptionsMap)\n {\n this.configureInjectMetadata(injectIndex, injectOptions);\n }\n\n return this;\n }\n\n /**\n * Configures type metadata based on provided options.\n * \n * @param {TypeOptions<TType>} typeOptions Type options.\n * \n * @returns {TypeMetadata<TType>} Current instance of type metadata.\n */\n public configure(typeOptions: TypeOptions<TType>): TypeMetadata<TType>\n {\n if (!isUndefined(typeOptions.alias)) \n {\n this.hasAlias(typeOptions.alias);\n }\n\n if (!isUndefined(typeOptions.customOptions))\n {\n this.hasCustomOptions(typeOptions.customOptions);\n }\n\n if (!isUndefined(typeOptions.defaultValue))\n {\n this.hasDefaultValue(typeOptions.defaultValue);\n }\n\n if (!isUndefined(typeOptions.serializedDefaultValue))\n {\n this.hasSerializedDefaultValue(typeOptions.serializedDefaultValue);\n }\n\n if (!isUndefined(typeOptions.deserializedDefaultValue)) \n {\n this.hasDeserializedDefaultValue(typeOptions.deserializedDefaultValue);\n }\n\n if (!isUndefined(typeOptions.discriminator)) \n {\n this.hasDiscriminator(typeOptions.discriminator);\n }\n\n if (!isUndefined(typeOptions.discriminant))\n {\n this.hasDiscriminant(typeOptions.discriminant);\n }\n\n if (!isUndefined(typeOptions.factory)) \n {\n this.hasFactory(typeOptions.factory);\n }\n\n if (!isUndefined(typeOptions.injectable))\n {\n this.isInjectable(typeOptions.injectable);\n }\n\n if (!isUndefined(typeOptions.injector))\n {\n this.hasInjector(typeOptions.injector);\n }\n\n if (!isUndefined(typeOptions.log))\n {\n this.hasLog(typeOptions.log);\n }\n\n if (!isUndefined(typeOptions.namingConvention))\n {\n this.hasNamingConvention(typeOptions.namingConvention);\n }\n\n if (!isUndefined(typeOptions.preserveDiscriminator))\n {\n this.shouldPreserveDiscriminator(typeOptions.preserveDiscriminator);\n }\n\n if (!isUndefined(typeOptions.referenceHandler))\n {\n this.hasReferenceHandler(typeOptions.referenceHandler);\n }\n\n if (!isUndefined(typeOptions.serializer))\n {\n this.hasSerializer(typeOptions.serializer);\n }\n\n if (!isUndefined(typeOptions.preserveNull))\n {\n this.shouldPreserveNull(typeOptions.preserveNull);\n }\n\n if (!isUndefined(typeOptions.useDefaultValue)) \n {\n this.shouldUseDefaultValue(typeOptions.useDefaultValue);\n }\n\n if (!isUndefined(typeOptions.useImplicitConversion)) \n {\n this.shouldUseImplicitConversion(typeOptions.useImplicitConversion);\n }\n\n if (!isUndefined(typeOptions.propertyOptionsMap))\n {\n this.hasPropertyMetadataMap(typeOptions.propertyOptionsMap);\n }\n\n if (!isUndefined(typeOptions.injectOptionsMap))\n {\n this.hasInjectMetadataMap(typeOptions.injectOptionsMap);\n }\n\n if (!isUndefined(typeOptions.propertySorter))\n {\n this.hasPropertySorter(typeOptions.propertySorter);\n }\n\n if (!isUndefined(typeOptions.injectSorter))\n {\n this.hasInjectSorter(typeOptions.injectSorter);\n }\n\n return this;\n }\n}\n","import { TypeManager } from './type-manager';\nimport { TypeOptions } from './type-options';\n\n/**\n * Type decorator.\n * \n * @param {TypeOptions<TType>} typeOptions Type options.\n *\n * @returns {ClassDecorator} Class decorator.\n */\nexport function Type<TType>(typeOptions?: TypeOptions<TType>): ClassDecorator\n{\n return function (target: any): any\n {\n TypeManager.configureTypeMetadata(target, typeOptions).reflectInjectMetadata();\n\n return target;\n };\n}\n","/**\n * In type script there is no explicit class for unknown type. We want to allow serialization and \n * deserialization without specify any serializers. However such behaviour should be visible in the \n * type metadata.\n * \n * @type {Unknown}\n */\nexport class Unknown\n{\n \n}\n","module.exports = __WEBPACK_EXTERNAL_MODULE__7607__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(3465);\n"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE__7607__","Any","customOptions","Array","customValueMap","Map","constructCustomOptions","configure","customKey","customValue","set","splice","length","entries","push","i","get","isUndefined","isNil","customValueResolver","has","keys","values","CustomContext","CustomKey","description","build","typeContext","injector","typeMetadata","typeCtor","isCtorFunction","typeFn","undefined","Error","typeName","injectedKeys","args","fill","sortedInjectMetadatas","injectMetadata","argKey","key","injectIndex","value","type","typeContextEntry","propertyMetadata","includes","propertyName","TypeFactory","metadataKey","target","isObject","Reflect","isFunction","getOwnMetadata","propertyKey","getMetadata","x","words","prototype","constructor","name","DataView","Float32Array","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Uint8Array","Uint8ClampedArray","reviver","JSON","parse","replacer","space","spacing","isFinite","join","separator","seen","stringify","parent","node","level","toJSON","call","indent","out","isArray","indexOf","TypeError","seenIndex","Object","sort","declaringTypeMetadata","injectOptions","typeManager","reflectTypeFn","getOwnReflectMetadata","constructInjectOptions","injectInternals","constructInjectInternals","typeMetadataResolver","unknownFn","Unknown","defineTypeMetadataResolver","hasKey","hasTypeFn","Metadata","InjectMetadata","y","a","b","AscInjectSorter","DescInjectSorter","isString","nameOf","String","isNumber","TypeManager","configureTypeMetadata","configureInjectMetadata","instanceMap","WeakMap","injectable","instance","init","injectMetadataMap","SingletonInjector","LogLevel","logLevel","infoEnabled","Info","warnEnabled","Warn","errorEnabled","supportsConsole","console","supportsConsoleLog","log","supportsConsoleInfo","info","supportsConsoleWarn","warn","supportsConsoleError","error","message","optionalParams","Log","typeFnMap","typeArgument","resolveTypeMetadataUsingUnknownTypeFn","bind","resolveTypeMetadataUsingAlias","isArrowFunction","resolveTypeMetadataUsingTypeResolver","resolveTypeMetadataUsingTypeFn","extractTypeMetadata","alias","typeResolver","defineGenericStructures","genericArguments","genericStructures","genericArgument","genericTypeArgument","genericGenericArguments","defineGenericMetadataResolvers","genericMetadataResolvers","genericStructure","genericGenericStructures","defineGenericMetadatas","genericMetadatas","genericMetadataResolver","genericGenericMetadataResolvers","convert","getWords","reduce","result","word","index","wordLowerCased","toLowerCase","toUpperCase","slice","CamelCaseNamingConvention","FlatCaseNamingConvention","FlatUpperCaseNamingConvention","KebabCaseNamingConvention","wordUpperCased","KebabUpperCaseNamingConvention","wordPascalCased","PascalCaseNamingConvention","SnakeCaseNamingConvention","SnakeUpperCaseNamingConvention","propertyOptions","getReflectMetadata","constructPropertyOptions","propertyInternals","constructPropertyInternals","customContext","preserveNull","serializedDefaultValue","useDefaultValue","defaultValue","deserializedDefaultValue","namingConvention","deserializable","referenceHandler","serializable","serializer","useImplicitConversion","hasAlias","hasCustomOptions","hasDefaultValue","hasSerializedDefaultValue","hasDeserializedDefaultValue","isDeserializable","isSerializable","hasGenericArguments","hasNamingConvention","hasReferenceHandler","hasSerializer","hasTypeArgument","shouldPreserveNull","shouldUseDefaultValue","shouldUseImplicitConversion","PropertyMetadata","AscPropertySorter","DescPropertySorter","z","merge","isSymbol","configurePropertyMetadata","serializerContext","referenceKey","referenceValueGetter","referenceMap","referenceValue","resolveReferenceCallbacks","registerReferenceCallback","restore","CircularReferenceHandler","arrayKeyRegExp","RegExp","referencePath","jsonPath","$ref","referenceTarget","defineReferenceTarget","pushReferenceCallback","$","referencePathArray","convertReferencePathToArray","shift","array","parts","split","JsonPathReferenceHandler","PlainReferenceHandler","referenceCallbackMap","serializerContextOptions","parentSerializerContext","jsonPathKey","referenceValueSetter","discriminant","discriminantMap","discriminator","polymorphic","preserveDiscriminator","serialize","deserialize","defineReference","restoreReference","referenceCallback","referenceCallbacks","defineSerializerContextOptions","defineChildSerializerContext","childSerializerContextOptions","SerializerContext","defineGenericSerializerContext","genericIndex","genericTypeMetadataResolver","definePolymorphicSerializerContext","definePolymorphicSerializerContextByTypeFn","definePolymorphicSerializerContextByDiscriminant","record","hasJsonPathKey","hasReferenceValueSetter","hasGenericStructures","hasGenericMetadataResolvers","hasPropertyMetadata","hasTypeMetadata","isNull","serializedNullValue","deserializedNullValue","AnySerializer","isArrayBuffer","arrayBufferView","from","map","c","fromCharCode","arrayBuffer","ArrayBuffer","charCodeAt","ArrayBufferSerializer","arrayInput","arrayOutput","genericSerializerContext","valueSerializerContext","v","ArraySerializer","isBoolean","BooleanSerializer","isDataView","buffer","DataViewSerializer","isDate","toISOString","Date","DateSerializer","isFloat32Array","Float32ArraySerializer","isFloat64Array","Float64ArraySerializer","isInt16Array","Int16ArraySerializer","isInt32Array","Int32ArraySerializer","isInt8Array","Int8ArraySerializer","isMap","genericKeySerializerContext","genericValueSerializerContext","keyArraySerializerContext","valueArraySerializerContext","keySerializerContext","mk","mv","MapSerializer","Number","NumberSerializer","isSet","Set","add","SetSerializer","StringSerializer","typeSerializerContext","propertySerializerContext","object","serializationConfigured","serializedPropertyName","deserializedPropertyName","propertyValue","declaringObject","sortedPropertyMetadatas","hasOwnProperty","TypeContext","declaringType","TypeContextEntry","TypeSerializer","isUint16Array","Uint16ArraySerializer","isUint32Array","Uint32ArraySerializer","isUint8Array","Uint8ArraySerializer","isUint8ClampedArray","Uint8ClampedArraySerializer","UnknownSerializer","typeContextEntryMap","typeManagerOptions","symbol","Symbol","typeMetadataSymbol","constructTypeManagerOptions","constructCustomContext","staticTypeManager","typeOptionsBase","constructTypeOptionsBase","typeOptionsMap","constructTypeOptionsMap","typeConfigurationMap","initialTypeOptionsBase","assign","defaultTypeOptionsBase","initialTypeOptionsMap","defaultTypeOptionsMap","typeOptions","mapTypeOptions","clear","typeMetadataDefined","declareTypeMetadata","defineProperty","enumerable","configurable","writable","parentTypeMetadata","getPrototypeOf","TypeMetadata","applyTypeOptionsBase","applyTypeOptionsMap","applyTypeOptions","applyTypeConfigurationMap","typeConfiguration","applyTypeConfiguration","defineSerializerContext","arrayFn","jsonStringify","jsonParse","Boolean","for","childrenTypeMetadataMap","propertyMetadataMap","constructTypeOptions","typeInternals","constructTypeInternals","deriveParentTypeMetadataProperties","hasDiscriminant","size","propertySorter","propertyMetadatas","iterator","injectSorter","injectMetadatas","propertyOptionsMap","injectOptionsMap","reflectInjectMetadata","injectTypeFns","releaseAlias","delete","hasDiscriminator","provideDiscriminant","hasFactory","isInjectable","hasInjector","hasLog","shouldPreserveDiscriminator","hasPropertySorter","hasInjectSorter","hasPropertyMetadataMap","hasInjectMetadataMap","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""}