typia 5.3.0-dev.20231119 → 5.3.0-dev.20231120

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 (348) hide show
  1. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +7 -2
  2. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  3. package/package.json +1 -1
  4. package/src/AssertionGuard.ts +1 -1
  5. package/src/CamelCase.ts +114 -114
  6. package/src/IRandomGenerator.ts +35 -35
  7. package/src/IValidation.ts +21 -21
  8. package/src/PascalCase.ts +114 -114
  9. package/src/Primitive.ts +135 -135
  10. package/src/Resolved.ts +116 -116
  11. package/src/SnakeCase.ts +156 -156
  12. package/src/TypeGuardError.ts +36 -36
  13. package/src/executable/TypiaGenerateWizard.ts +83 -83
  14. package/src/executable/TypiaSetupWizard.ts +140 -140
  15. package/src/executable/setup/ArgumentParser.ts +43 -43
  16. package/src/executable/setup/CommandExecutor.ts +8 -8
  17. package/src/executable/setup/FileRetriever.ts +22 -22
  18. package/src/executable/setup/PackageManager.ts +71 -71
  19. package/src/executable/setup/PluginConfigurator.ts +69 -69
  20. package/src/executable/typia.ts +52 -52
  21. package/src/factories/CommentFactory.ts +79 -79
  22. package/src/factories/ExpressionFactory.ts +150 -150
  23. package/src/factories/IdentifierFactory.ts +70 -70
  24. package/src/factories/JsonMetadataFactory.ts +53 -53
  25. package/src/factories/LiteralFactory.ts +47 -47
  26. package/src/factories/MetadataCollection.ts +269 -269
  27. package/src/factories/MetadataCommentTagFactory.ts +601 -601
  28. package/src/factories/MetadataFactory.ts +267 -267
  29. package/src/factories/MetadataTypeTagFactory.ts +313 -313
  30. package/src/factories/NumericRangeFactory.ts +72 -72
  31. package/src/factories/ProtobufFactory.ts +259 -259
  32. package/src/factories/StatementFactory.ts +72 -72
  33. package/src/factories/TemplateFactory.ts +56 -56
  34. package/src/factories/TypeFactory.ts +118 -118
  35. package/src/factories/ValueFactory.ts +12 -12
  36. package/src/factories/internal/metadata/MetadataHelper.ts +15 -15
  37. package/src/factories/internal/metadata/emend_metadata_atomics.ts +37 -37
  38. package/src/factories/internal/metadata/emplace_metadata_alias.ts +41 -41
  39. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +38 -38
  40. package/src/factories/internal/metadata/emplace_metadata_object.ts +175 -175
  41. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +57 -57
  42. package/src/factories/internal/metadata/explore_metadata.ts +28 -28
  43. package/src/factories/internal/metadata/iterate_metadata.ts +94 -94
  44. package/src/factories/internal/metadata/iterate_metadata_alias.ts +34 -34
  45. package/src/factories/internal/metadata/iterate_metadata_array.ts +37 -37
  46. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +62 -62
  47. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  48. package/src/factories/internal/metadata/iterate_metadata_collection.ts +131 -131
  49. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +26 -26
  50. package/src/factories/internal/metadata/iterate_metadata_constant.ts +48 -48
  51. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +233 -233
  52. package/src/factories/internal/metadata/iterate_metadata_map.ts +50 -50
  53. package/src/factories/internal/metadata/iterate_metadata_native.ts +208 -208
  54. package/src/factories/internal/metadata/iterate_metadata_object.ts +43 -43
  55. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +52 -52
  56. package/src/factories/internal/metadata/iterate_metadata_set.ts +41 -41
  57. package/src/factories/internal/metadata/iterate_metadata_sort.ts +61 -61
  58. package/src/factories/internal/metadata/iterate_metadata_template.ts +44 -44
  59. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +37 -37
  60. package/src/factories/internal/metadata/iterate_metadata_union.ts +27 -27
  61. package/src/functional/$HeadersReader.ts +28 -28
  62. package/src/functional/$ParameterReader.ts +31 -31
  63. package/src/functional/$ProtobufReader.ts +195 -195
  64. package/src/functional/$ProtobufSizer.ts +147 -147
  65. package/src/functional/$ProtobufWriter.ts +150 -150
  66. package/src/functional/$QueryReader.ts +56 -56
  67. package/src/functional/$any.ts +4 -4
  68. package/src/functional/$clone.ts +4 -4
  69. package/src/functional/$convention.ts +37 -37
  70. package/src/functional/$dictionary.ts +22 -22
  71. package/src/functional/$every.ts +11 -11
  72. package/src/functional/$from.ts +5 -5
  73. package/src/functional/$guard.ts +35 -35
  74. package/src/functional/$is_between.ts +2 -2
  75. package/src/functional/$join.ts +46 -46
  76. package/src/functional/$number.ts +12 -12
  77. package/src/functional/$report.ts +13 -13
  78. package/src/functional/$rest.ts +3 -3
  79. package/src/functional/$stoll.ts +8 -8
  80. package/src/functional/$string.ts +50 -50
  81. package/src/functional/$strlen.ts +7 -7
  82. package/src/functional/$tail.ts +5 -5
  83. package/src/functional/$varint.ts +130 -130
  84. package/src/functional/$zigzag.ts +39 -39
  85. package/src/functional/IProtobufWriter.ts +18 -18
  86. package/src/functional/Namespace.ts +174 -174
  87. package/src/http.ts +1149 -1149
  88. package/src/json.ts +648 -648
  89. package/src/misc.ts +651 -651
  90. package/src/module.ts +896 -896
  91. package/src/notations.ts +855 -855
  92. package/src/programmers/AssertProgrammer.ts +293 -293
  93. package/src/programmers/CheckerProgrammer.ts +1025 -1025
  94. package/src/programmers/FeatureProgrammer.ts +460 -460
  95. package/src/programmers/IsProgrammer.ts +232 -232
  96. package/src/programmers/RandomProgrammer.ts +825 -825
  97. package/src/programmers/TypiaProgrammer.ts +167 -167
  98. package/src/programmers/ValidateProgrammer.ts +307 -307
  99. package/src/programmers/helpers/AtomicPredicator.ts +25 -25
  100. package/src/programmers/helpers/CloneJoiner.ts +130 -130
  101. package/src/programmers/helpers/FunctionImporeter.ts +87 -87
  102. package/src/programmers/helpers/HttpMetadataUtil.ts +21 -21
  103. package/src/programmers/helpers/ICheckEntry.ts +13 -13
  104. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  105. package/src/programmers/helpers/NotationJoiner.ts +132 -132
  106. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  107. package/src/programmers/helpers/ProtobufUtil.ts +125 -125
  108. package/src/programmers/helpers/ProtobufWire.ts +34 -34
  109. package/src/programmers/helpers/PruneJoiner.ts +141 -141
  110. package/src/programmers/helpers/RandomJoiner.ts +140 -140
  111. package/src/programmers/helpers/RandomRanger.ts +164 -164
  112. package/src/programmers/helpers/StringifyJoinder.ts +105 -105
  113. package/src/programmers/helpers/StringifyPredicator.ts +12 -12
  114. package/src/programmers/helpers/UnionExplorer.ts +269 -269
  115. package/src/programmers/helpers/UnionPredicator.ts +77 -77
  116. package/src/programmers/helpers/disable_function_importer_declare.ts +32 -32
  117. package/src/programmers/http/HttpAssertHeadersProgrammer.ts +77 -77
  118. package/src/programmers/http/HttpAssertQueryProgrammer.ts +75 -75
  119. package/src/programmers/http/HttpHeadersProgrammer.ts +314 -314
  120. package/src/programmers/http/HttpIsHeadersProgrammer.ts +84 -84
  121. package/src/programmers/http/HttpIsQueryProgrammer.ts +82 -82
  122. package/src/programmers/http/HttpParameterProgrammer.ts +97 -97
  123. package/src/programmers/http/HttpQueryProgrammer.ts +252 -252
  124. package/src/programmers/http/HttpValidateHeadersProgrammer.ts +77 -77
  125. package/src/programmers/http/HttpValidateQueryProgrammer.ts +75 -75
  126. package/src/programmers/internal/application_alias.ts +65 -65
  127. package/src/programmers/internal/application_array.ts +59 -59
  128. package/src/programmers/internal/application_boolean.ts +30 -30
  129. package/src/programmers/internal/application_constant.ts +26 -26
  130. package/src/programmers/internal/application_default.ts +17 -17
  131. package/src/programmers/internal/application_default_string.ts +33 -33
  132. package/src/programmers/internal/application_escaped.ts +53 -53
  133. package/src/programmers/internal/application_native.ts +38 -38
  134. package/src/programmers/internal/application_number.ts +94 -94
  135. package/src/programmers/internal/application_object.ts +153 -153
  136. package/src/programmers/internal/application_schema.ts +180 -180
  137. package/src/programmers/internal/application_string.ts +58 -58
  138. package/src/programmers/internal/application_templates.ts +25 -25
  139. package/src/programmers/internal/application_tuple.ts +55 -55
  140. package/src/programmers/internal/check_array_length.ts +45 -45
  141. package/src/programmers/internal/check_bigint.ts +49 -49
  142. package/src/programmers/internal/check_dynamic_key.ts +175 -175
  143. package/src/programmers/internal/check_dynamic_properties.ts +198 -198
  144. package/src/programmers/internal/check_everything.ts +23 -23
  145. package/src/programmers/internal/check_native.ts +21 -21
  146. package/src/programmers/internal/check_number.ts +106 -106
  147. package/src/programmers/internal/check_object.ts +60 -60
  148. package/src/programmers/internal/check_string.ts +48 -48
  149. package/src/programmers/internal/check_template.ts +61 -61
  150. package/src/programmers/internal/check_union_array_like.ts +307 -307
  151. package/src/programmers/internal/decode_union_object.ts +78 -78
  152. package/src/programmers/internal/feature_object_entries.ts +58 -58
  153. package/src/programmers/internal/metadata_to_pattern.ts +33 -33
  154. package/src/programmers/internal/prune_object_properties.ts +60 -60
  155. package/src/programmers/internal/random_custom.ts +37 -37
  156. package/src/programmers/internal/stringify_dynamic_properties.ts +157 -157
  157. package/src/programmers/internal/stringify_native.ts +7 -7
  158. package/src/programmers/internal/stringify_regular_properties.ts +81 -81
  159. package/src/programmers/internal/template_to_pattern.ts +15 -15
  160. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +20 -20
  161. package/src/programmers/json/JsonApplicationProgrammer.ts +50 -50
  162. package/src/programmers/json/JsonAssertParseProgrammer.ts +67 -67
  163. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +61 -61
  164. package/src/programmers/json/JsonIsParseProgrammer.ts +73 -73
  165. package/src/programmers/json/JsonIsStringifyProgrammer.ts +75 -75
  166. package/src/programmers/json/JsonStringifyProgrammer.ts +893 -893
  167. package/src/programmers/json/JsonValidateParseProgrammer.ts +64 -64
  168. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +83 -83
  169. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +63 -63
  170. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +60 -60
  171. package/src/programmers/misc/MiscCloneProgrammer.ts +713 -713
  172. package/src/programmers/misc/MiscIsCloneProgrammer.ts +70 -70
  173. package/src/programmers/misc/MiscIsPruneProgrammer.ts +66 -66
  174. package/src/programmers/misc/MiscLiteralsProgrammer.ts +72 -72
  175. package/src/programmers/misc/MiscPruneProgrammer.ts +523 -523
  176. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +80 -80
  177. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +73 -73
  178. package/src/programmers/notations/NotationAssertGeneralProgrammer.ts +64 -64
  179. package/src/programmers/notations/NotationGeneralProgrammer.ts +647 -647
  180. package/src/programmers/notations/NotationIsGeneralProgrammer.ts +71 -71
  181. package/src/programmers/notations/NotationValidateGeneralProgrammer.ts +81 -81
  182. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +75 -75
  183. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +61 -61
  184. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +607 -596
  185. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +819 -819
  186. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +82 -82
  187. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +75 -75
  188. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +160 -160
  189. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +75 -75
  190. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +83 -83
  191. package/src/protobuf.ts +887 -887
  192. package/src/reflect.ts +24 -24
  193. package/src/schemas/json/IJsonApplication.ts +8 -8
  194. package/src/schemas/json/IJsonComponents.ts +36 -36
  195. package/src/schemas/json/IJsonSchema.ts +113 -113
  196. package/src/schemas/metadata/IJsDocTagInfo.ts +10 -10
  197. package/src/schemas/metadata/IMetadata.ts +34 -34
  198. package/src/schemas/metadata/IMetadataAlias.ts +12 -12
  199. package/src/schemas/metadata/IMetadataApplication.ts +7 -7
  200. package/src/schemas/metadata/IMetadataArray.ts +7 -7
  201. package/src/schemas/metadata/IMetadataArrayType.ts +10 -10
  202. package/src/schemas/metadata/IMetadataAtomic.ts +6 -6
  203. package/src/schemas/metadata/IMetadataComponents.ts +11 -11
  204. package/src/schemas/metadata/IMetadataConstant.ts +23 -23
  205. package/src/schemas/metadata/IMetadataDictionary.ts +14 -14
  206. package/src/schemas/metadata/IMetadataEntry.ts +6 -6
  207. package/src/schemas/metadata/IMetadataEscaped.ts +6 -6
  208. package/src/schemas/metadata/IMetadataObject.ts +18 -18
  209. package/src/schemas/metadata/IMetadataProperty.ts +9 -9
  210. package/src/schemas/metadata/IMetadataTuple.ts +7 -7
  211. package/src/schemas/metadata/IMetadataTupleType.ts +10 -10
  212. package/src/schemas/metadata/IMetadataTypeTag.ts +15 -15
  213. package/src/schemas/metadata/Metadata.ts +596 -596
  214. package/src/schemas/metadata/MetadataAlias.ts +61 -61
  215. package/src/schemas/metadata/MetadataApplication.ts +44 -44
  216. package/src/schemas/metadata/MetadataArray.ts +49 -49
  217. package/src/schemas/metadata/MetadataArrayType.ts +57 -57
  218. package/src/schemas/metadata/MetadataAtomic.ts +84 -84
  219. package/src/schemas/metadata/MetadataComponents.ts +98 -98
  220. package/src/schemas/metadata/MetadataConstant.ts +46 -46
  221. package/src/schemas/metadata/MetadataEscaped.ts +51 -51
  222. package/src/schemas/metadata/MetadataObject.ts +135 -135
  223. package/src/schemas/metadata/MetadataProperty.ts +56 -56
  224. package/src/schemas/metadata/MetadataTuple.ts +32 -32
  225. package/src/schemas/metadata/MetadataTupleType.ts +67 -67
  226. package/src/tags/Default.ts +15 -15
  227. package/src/tags/ExclusiveMaximum.ts +13 -13
  228. package/src/tags/ExclusiveMinimum.ts +13 -13
  229. package/src/tags/Format.ts +30 -30
  230. package/src/tags/MaxItems.ts +9 -9
  231. package/src/tags/MaxLength.ts +9 -9
  232. package/src/tags/Maximum.ts +13 -13
  233. package/src/tags/MinItems.ts +9 -9
  234. package/src/tags/MinLength.ts +9 -9
  235. package/src/tags/Minimum.ts +13 -13
  236. package/src/tags/MultipleOf.ts +15 -15
  237. package/src/tags/Pattern.ts +9 -9
  238. package/src/tags/TagBase.ts +68 -68
  239. package/src/tags/Type.ts +27 -27
  240. package/src/transform.ts +35 -35
  241. package/src/transformers/CallExpressionTransformer.ts +359 -359
  242. package/src/transformers/FileTransformer.ts +57 -57
  243. package/src/transformers/IProject.ts +15 -15
  244. package/src/transformers/ITransformOptions.ts +62 -62
  245. package/src/transformers/ImportTransformer.ts +66 -66
  246. package/src/transformers/NodeTransformer.ts +13 -13
  247. package/src/transformers/TransformerError.ts +55 -55
  248. package/src/transformers/features/AssertTransformer.ts +16 -16
  249. package/src/transformers/features/CreateAssertTransformer.ts +16 -16
  250. package/src/transformers/features/CreateIsTransformer.ts +10 -10
  251. package/src/transformers/features/CreateRandomTransformer.ts +40 -40
  252. package/src/transformers/features/CreateValidateTransformer.ts +13 -13
  253. package/src/transformers/features/IsTransformer.ts +10 -10
  254. package/src/transformers/features/RandomTransformer.ts +44 -44
  255. package/src/transformers/features/ValidateTransformer.ts +11 -11
  256. package/src/transformers/features/http/CreateHttpAssertHeadersTransformer.ts +11 -11
  257. package/src/transformers/features/http/CreateHttpAssertQueryTransformer.ts +9 -9
  258. package/src/transformers/features/http/CreateHttpHeadersTransformer.ts +9 -9
  259. package/src/transformers/features/http/CreateHttpIsHeadersTransformer.ts +9 -9
  260. package/src/transformers/features/http/CreateHttpIsQueryTransformer.ts +9 -9
  261. package/src/transformers/features/http/CreateHttpParameterTransformer.ts +9 -9
  262. package/src/transformers/features/http/CreateHttpQueryTransformer.ts +9 -9
  263. package/src/transformers/features/http/CreateHttpValidateHeadersTransformer.ts +12 -12
  264. package/src/transformers/features/http/CreateHttpValidateQueryTransformer.ts +11 -11
  265. package/src/transformers/features/http/HttpAssertHeadersTransformer.ts +9 -9
  266. package/src/transformers/features/http/HttpAssertQueryTransformer.ts +9 -9
  267. package/src/transformers/features/http/HttpHeadersTransformer.ts +9 -9
  268. package/src/transformers/features/http/HttpIsHeadersTransformer.ts +9 -9
  269. package/src/transformers/features/http/HttpIsQueryTransformer.ts +9 -9
  270. package/src/transformers/features/http/HttpParameterTransformer.ts +9 -9
  271. package/src/transformers/features/http/HttpQueryTransformer.ts +9 -9
  272. package/src/transformers/features/http/HttpValidateHeadersTransformer.ts +10 -10
  273. package/src/transformers/features/http/HttpValidateQueryTransformer.ts +9 -9
  274. package/src/transformers/features/json/JsonApplicationTransformer.ts +121 -121
  275. package/src/transformers/features/json/JsonAssertParseTransformer.ts +9 -9
  276. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +10 -10
  277. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +9 -9
  278. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +12 -12
  279. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +9 -9
  280. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +9 -9
  281. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +9 -9
  282. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +11 -11
  283. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +12 -12
  284. package/src/transformers/features/json/JsonIsParseTransformer.ts +9 -9
  285. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +9 -9
  286. package/src/transformers/features/json/JsonStringifyTransformer.ts +9 -9
  287. package/src/transformers/features/json/JsonValidateParseTransformer.ts +9 -9
  288. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +10 -10
  289. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +9 -9
  290. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +9 -9
  291. package/src/transformers/features/misc/MiscCloneTransformer.ts +9 -9
  292. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +9 -9
  293. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +9 -9
  294. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +9 -9
  295. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +9 -9
  296. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +9 -9
  297. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +9 -9
  298. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +11 -11
  299. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +11 -11
  300. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +9 -9
  301. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +9 -9
  302. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +32 -32
  303. package/src/transformers/features/misc/MiscPruneTransformer.ts +9 -9
  304. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +9 -9
  305. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +9 -9
  306. package/src/transformers/features/notations/NotationAssertGeneralTransformer.ts +15 -15
  307. package/src/transformers/features/notations/NotationCreateAssertGeneralTransformer.ts +15 -15
  308. package/src/transformers/features/notations/NotationCreateGeneralTransformer.ts +15 -15
  309. package/src/transformers/features/notations/NotationCreateIsGeneralTransformer.ts +15 -15
  310. package/src/transformers/features/notations/NotationCreateValidateGeneralTransformer.ts +15 -15
  311. package/src/transformers/features/notations/NotationGeneralTransformer.ts +11 -11
  312. package/src/transformers/features/notations/NotationIsGeneralTransformer.ts +15 -15
  313. package/src/transformers/features/notations/NotationValidateGeneralTransformer.ts +15 -15
  314. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +10 -10
  315. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +10 -10
  316. package/src/transformers/features/protobuf/ProtobufCreateAssertDecodeTransformer.ts +12 -12
  317. package/src/transformers/features/protobuf/ProtobufCreateAssertEncodeTransformer.ts +12 -12
  318. package/src/transformers/features/protobuf/ProtobufCreateDecodeTransformer.ts +9 -9
  319. package/src/transformers/features/protobuf/ProtobufCreateEncodeTransformer.ts +9 -9
  320. package/src/transformers/features/protobuf/ProtobufCreateIsDecodeTransformer.ts +9 -9
  321. package/src/transformers/features/protobuf/ProtobufCreateIsEncodeTransformer.ts +9 -9
  322. package/src/transformers/features/protobuf/ProtobufCreateValidateDecodeTransformer.ts +12 -12
  323. package/src/transformers/features/protobuf/ProtobufCreateValidateEncodeTransformer.ts +12 -12
  324. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +9 -9
  325. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +9 -9
  326. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +9 -9
  327. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +9 -9
  328. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +33 -33
  329. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +10 -10
  330. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +10 -10
  331. package/src/transformers/features/reflect/ReflectMetadataTransformer.ts +73 -73
  332. package/src/transformers/internal/GenericTransformer.ts +96 -96
  333. package/src/typings/Atomic.ts +13 -13
  334. package/src/typings/ClassProperties.ts +5 -5
  335. package/src/typings/Customizable.ts +5 -5
  336. package/src/typings/ProtobufAtomic.ts +19 -19
  337. package/src/typings/SpecialFields.ts +3 -3
  338. package/src/typings/ValidationPipe.ts +9 -9
  339. package/src/typings/Writable.ts +11 -11
  340. package/src/utils/ArrayUtil.ts +43 -43
  341. package/src/utils/Escaper.ts +46 -46
  342. package/src/utils/MapUtil.ts +12 -12
  343. package/src/utils/NameEncoder.ts +32 -32
  344. package/src/utils/NamingConvention.ts +87 -87
  345. package/src/utils/PatternUtil.ts +29 -29
  346. package/src/utils/RandomGenerator.ts +83 -83
  347. package/src/utils/Singleton.ts +16 -16
  348. package/src/utils/StringUtil.ts +4 -4
@@ -1,596 +1,596 @@
1
- import { ClassProperties } from "../../typings/ClassProperties";
2
-
3
- import { ArrayUtil } from "../../utils/ArrayUtil";
4
-
5
- import { IMetadata } from "./IMetadata";
6
- import { IMetadataDictionary } from "./IMetadataDictionary";
7
- import { IMetadataTypeTag } from "./IMetadataTypeTag";
8
- import { MetadataAlias } from "./MetadataAlias";
9
- import { MetadataArray } from "./MetadataArray";
10
- import { MetadataAtomic } from "./MetadataAtomic";
11
- import { MetadataConstant } from "./MetadataConstant";
12
- import { MetadataEscaped } from "./MetadataEscaped";
13
- import { MetadataObject } from "./MetadataObject";
14
- import { MetadataTuple } from "./MetadataTuple";
15
-
16
- export class Metadata {
17
- public any: boolean;
18
- public required: boolean;
19
- public optional: boolean;
20
- public nullable: boolean;
21
- public functional: boolean;
22
-
23
- public escaped: MetadataEscaped | null;
24
- public atomics: MetadataAtomic[];
25
- public constants: MetadataConstant[];
26
- public templates: Metadata[][];
27
-
28
- public rest: Metadata | null;
29
- public aliases: MetadataAlias[];
30
- public arrays: MetadataArray[];
31
- public tuples: MetadataTuple[];
32
- public objects: MetadataObject[];
33
-
34
- public natives: string[];
35
- public sets: Metadata[];
36
- public maps: Metadata.Entry[];
37
-
38
- /** @internal */ private name_?: string;
39
- /** @internal */ private parent_resolved_: boolean = false;
40
- /** @internal */ public union_index?: number;
41
- /** @internal */ public fixed_?: number | null;
42
- /** @internal */ public boolean_literal_intersected_?: boolean;
43
-
44
- /* -----------------------------------------------------------
45
- CONSTRUCTORS
46
- ----------------------------------------------------------- */
47
- /**
48
- * @hidden
49
- */
50
- private constructor(props: ClassProperties<Metadata>) {
51
- this.any = props.any;
52
- this.required = props.required;
53
- this.optional = props.optional;
54
- this.nullable = props.nullable;
55
- this.functional = props.functional;
56
-
57
- this.escaped = props.escaped;
58
- this.atomics = props.atomics;
59
- this.constants = props.constants;
60
- this.templates = props.templates;
61
-
62
- this.rest = props.rest;
63
- this.arrays = props.arrays;
64
- this.tuples = props.tuples;
65
- this.objects = props.objects;
66
- this.aliases = props.aliases;
67
-
68
- this.natives = props.natives;
69
- this.sets = props.sets;
70
- this.maps = props.maps;
71
- }
72
-
73
- /**
74
- * @internal
75
- */
76
- public static create(props: ClassProperties<Metadata>): Metadata {
77
- return new Metadata(props);
78
- }
79
-
80
- /**
81
- * @internal
82
- */
83
- public static initialize(parentResolved: boolean = false): Metadata {
84
- const meta: Metadata = Metadata.create({
85
- any: false,
86
- nullable: false,
87
- required: true,
88
- optional: false,
89
- functional: false,
90
-
91
- escaped: null,
92
- constants: [],
93
- atomics: [],
94
- templates: [],
95
- arrays: [],
96
- tuples: [],
97
- objects: [],
98
- aliases: [],
99
-
100
- rest: null,
101
- natives: [],
102
- sets: [],
103
- maps: [],
104
- });
105
- meta.parent_resolved_ = parentResolved;
106
- return meta;
107
- }
108
-
109
- public toJSON(): IMetadata {
110
- return {
111
- any: this.any,
112
- required: this.required,
113
- optional: this.optional,
114
- nullable: this.nullable,
115
- functional: this.functional,
116
-
117
- atomics: this.atomics.map((a) => a.toJSON()),
118
- constants: this.constants.map((c) => c.toJSON()),
119
- templates: this.templates.map((tpl) => tpl.map((meta) => meta.toJSON())),
120
- escaped: this.escaped ? this.escaped.toJSON() : null,
121
-
122
- rest: this.rest ? this.rest.toJSON() : null,
123
- arrays: this.arrays.map((array) => ({
124
- name: array.type.name,
125
- tags: array.tags.map((r) => r.slice()),
126
- })),
127
- tuples: this.tuples.map((tuple) => ({
128
- name: tuple.type.name,
129
- tags: tuple.tags.map((r) => r.slice()),
130
- })),
131
- objects: this.objects.map((obj) => obj.name),
132
- aliases: this.aliases.map((alias) => alias.name),
133
-
134
- natives: this.natives.slice(),
135
- sets: this.sets.map((meta) => meta.toJSON()),
136
- maps: this.maps.map((entry) => ({
137
- key: entry.key.toJSON(),
138
- value: entry.value.toJSON(),
139
- })),
140
- };
141
- }
142
-
143
- public static from(meta: IMetadata, dict: IMetadataDictionary): Metadata {
144
- return Metadata.create({
145
- any: meta.any,
146
- required: meta.required,
147
- optional: meta.optional,
148
- nullable: meta.nullable,
149
- functional: meta.functional,
150
-
151
- constants: meta.constants.map(MetadataConstant.from),
152
- atomics: meta.atomics.map(MetadataAtomic.from),
153
- templates: meta.templates.map((tpl) =>
154
- tpl.map((meta) => this.from(meta, dict)),
155
- ),
156
- escaped: meta.escaped ? MetadataEscaped.from(meta.escaped, dict) : null,
157
-
158
- rest: meta.rest ? this.from(meta.rest, dict) : null,
159
- arrays: meta.arrays.map((ref) => {
160
- const type = dict.arrays.get(ref.name);
161
- if (type === undefined)
162
- throw new RangeError(
163
- `Error on Metadata.from(): failed to find array "${ref.name}".`,
164
- );
165
- return MetadataArray.create({
166
- type,
167
- tags: ref.tags.map((row) => row.slice()),
168
- });
169
- }),
170
- tuples: meta.tuples.map((t) => {
171
- const type = dict.tuples.get(t.name);
172
- if (type === undefined)
173
- throw new RangeError(
174
- `Error on Metadata.from(): failed to find tuple "${t.name}".`,
175
- );
176
- return MetadataTuple.create({
177
- type,
178
- tags: t.tags.map((r) => r.slice()),
179
- });
180
- }),
181
- objects: meta.objects.map((name) => {
182
- const found = dict.objects.get(name);
183
- if (found === undefined)
184
- throw new RangeError(
185
- `Error on Metadata.from(): failed to find object "${name}".`,
186
- );
187
- return found;
188
- }),
189
- aliases: meta.aliases.map((alias) => {
190
- const found = dict.aliases.get(alias);
191
- if (found === undefined)
192
- throw new RangeError(
193
- `Error on Metadata.from(): failed to find alias "${alias}".`,
194
- );
195
- return found;
196
- }),
197
-
198
- natives: meta.natives.slice(),
199
- sets: meta.sets.map((meta) => this.from(meta, dict)),
200
- maps: meta.maps.map((entry) => ({
201
- key: this.from(entry.key, dict),
202
- value: this.from(entry.value, dict),
203
- })),
204
- });
205
- }
206
-
207
- /* -----------------------------------------------------------
208
- ACCESSORS
209
- ----------------------------------------------------------- */
210
- public getName(): string {
211
- return (this.name_ ??= getName(this));
212
- }
213
-
214
- public empty(): boolean {
215
- return this.bucket() === 0 || this.size() === 0;
216
- }
217
-
218
- public size(): number {
219
- return (
220
- (this.any ? 1 : 0) +
221
- (this.escaped ? 1 : 0) +
222
- (this.functional ? 1 : 0) +
223
- (this.rest ? this.rest.size() : 0) +
224
- this.templates.length +
225
- this.atomics.length +
226
- this.constants.map((c) => c.values.length).reduce((x, y) => x + y, 0) +
227
- this.arrays.length +
228
- this.tuples.length +
229
- this.natives.length +
230
- this.maps.length +
231
- this.sets.length +
232
- this.objects.length +
233
- this.aliases.length
234
- );
235
- }
236
-
237
- public bucket(): number {
238
- return (
239
- (this.any ? 1 : 0) +
240
- (this.escaped ? 1 : 0) +
241
- (this.functional ? 1 : 0) +
242
- (this.templates.length ? 1 : 0) +
243
- (this.atomics.length ? 1 : 0) +
244
- (this.constants.length ? 1 : 0) +
245
- (this.rest ? this.rest.size() : 0) +
246
- (this.arrays.length ? 1 : 0) +
247
- (this.tuples.length ? 1 : 0) +
248
- (this.natives.length ? 1 : 0) +
249
- (this.sets.length ? 1 : 0) +
250
- (this.maps.length ? 1 : 0) +
251
- (this.objects.length ? 1 : 0) +
252
- (this.aliases.length ? 1 : 0)
253
- );
254
- }
255
-
256
- public isConstant(): boolean {
257
- return this.bucket() === (this.constants.length ? 1 : 0);
258
- }
259
-
260
- public isRequired(): boolean {
261
- return this.required === true && this.optional === false;
262
- }
263
-
264
- /**
265
- * @internal
266
- */
267
- public isUnionBucket(): boolean {
268
- const size: number = this.bucket();
269
- const emended: number =
270
- !!this.atomics.length && !!this.constants.length ? size - 1 : size;
271
- return emended > 1;
272
- }
273
-
274
- /**
275
- * @internal
276
- */
277
- public getSoleLiteral(): string | null {
278
- if (
279
- this.size() === 1 &&
280
- this.constants.length === 1 &&
281
- this.constants[0]!.type === "string" &&
282
- this.constants[0]!.values.length === 1
283
- )
284
- return this.constants[0]!.values[0] as string;
285
- else return null;
286
- }
287
-
288
- public isSoleLiteral(): boolean {
289
- return this.getSoleLiteral() !== null;
290
- }
291
-
292
- /**
293
- * @internal
294
- */
295
- public isParentResolved(): boolean {
296
- return this.parent_resolved_;
297
- }
298
- }
299
- export namespace Metadata {
300
- export const intersects = (x: Metadata, y: Metadata): boolean => {
301
- // CHECK ANY & OPTIONAL
302
- if (x.any || y.any) return true;
303
- if (x.isRequired() === false && false === y.isRequired()) return true;
304
- if (x.nullable === true && true === y.nullable) return true;
305
- if (x.functional === true && y.functional === true) return true;
306
-
307
- //----
308
- // INSTANCES
309
- //----
310
- // ARRAYS
311
- if (x.arrays.length && y.arrays.length) return true;
312
- if (x.tuples.length && y.tuples.length) return true;
313
- if (x.objects.length && y.objects.length) return true;
314
- if (x.aliases.length && y.aliases.length) return true;
315
-
316
- // NATIVES
317
- if (x.natives.length && y.natives.length)
318
- if (x.natives.some((xn) => y.natives.some((yn) => xn === yn)))
319
- return true;
320
-
321
- //----
322
- // VALUES
323
- //----
324
- // ATOMICS
325
- for (const atomic of x.atomics)
326
- if (y.atomics.some((ya) => atomic.type === ya.type)) return true;
327
-
328
- // CONSTANTS
329
- for (const constant of x.constants) {
330
- const opposite: MetadataConstant | undefined = y.constants.find(
331
- (elem) => elem.type === constant.type,
332
- );
333
- if (opposite === undefined) continue;
334
-
335
- const values: Set<any> = new Set([
336
- ...constant.values,
337
- ...opposite.values,
338
- ]);
339
- if (values.size !== constant.values.length + opposite.values.length)
340
- return true;
341
- }
342
- return false;
343
- };
344
-
345
- export const covers = (
346
- x: Metadata,
347
- y: Metadata,
348
- level: number = 0,
349
- ): boolean => {
350
- // CHECK ANY
351
- if (x === y) return false;
352
- else if (x.any) return true;
353
- else if (y.any) return false;
354
-
355
- //----
356
- // INSTANCES
357
- //----
358
- if (level === 0) {
359
- // ARRAYS
360
- for (const ya of y.arrays)
361
- if (
362
- !x.arrays.some((xa) =>
363
- covers(xa.type.value, ya.type.value, level + 1),
364
- )
365
- ) {
366
- return false;
367
- }
368
-
369
- // TUPLES
370
- for (const yt of y.tuples)
371
- if (
372
- yt.type.elements.length !== 0 &&
373
- x.tuples.some(
374
- (xt) =>
375
- xt.type.elements.length >= yt.type.elements.length &&
376
- xt.type.elements
377
- .slice(yt.type.elements.length)
378
- .every((xv, i) => covers(xv, yt.type.elements[i]!, level + 1)),
379
- ) === false
380
- )
381
- return false;
382
- }
383
-
384
- // OBJECTS
385
- for (const yo of y.objects)
386
- if (x.objects.some((xo) => MetadataObject.covers(xo, yo)) === false)
387
- return false;
388
-
389
- // ALIASES
390
- for (const yd of y.aliases)
391
- if (x.aliases.some((xd) => xd.name === yd.name) === false) return false;
392
-
393
- // NATIVES
394
- for (const yn of y.natives)
395
- if (x.natives.some((xn) => xn === yn) === false) return false;
396
-
397
- // SETS
398
- for (const ys of y.sets)
399
- if (x.sets.some((xs) => covers(xs, ys)) === false) return false;
400
-
401
- //----
402
- // VALUES
403
- //----
404
- // ATOMICS
405
- if (
406
- y.atomics.some(
407
- (ya) => x.atomics.some((xa) => xa.type === ya.type) === false,
408
- )
409
- )
410
- return false;
411
-
412
- // CONSTANTS
413
- for (const yc of y.constants) {
414
- if (x.atomics.some((atom) => yc.type === atom.type)) continue;
415
- const xc: MetadataConstant | undefined = x.constants.find(
416
- (elem) => elem.type === yc.type,
417
- );
418
- if (xc === undefined) return false;
419
- else if (
420
- (yc.values as number[]).some(
421
- (yv) => xc.values.includes(yv as never) === false,
422
- )
423
- )
424
- return false;
425
- }
426
-
427
- // FUNCTIONAL
428
- if (x.functional === false && y.functional) return false;
429
-
430
- // SUCCESS
431
- return true;
432
- };
433
-
434
- /**
435
- * @internal
436
- */
437
- export const merge = (x: Metadata, y: Metadata): Metadata => {
438
- const output: Metadata = Metadata.create({
439
- any: x.any || y.any,
440
- nullable: x.nullable || y.nullable,
441
- required: x.required && y.required,
442
- optional: x.optional || y.optional,
443
- functional: x.functional || y.functional,
444
-
445
- escaped:
446
- x.escaped !== null && y.escaped !== null
447
- ? MetadataEscaped.create({
448
- original: merge(x.escaped.original, y.escaped.original),
449
- returns: merge(x.escaped.returns, y.escaped.returns),
450
- })
451
- : x.escaped ?? y.escaped,
452
- atomics: mergeTaggedTypes({
453
- container: x.atomics,
454
- equals: (x, y) => x.type === y.type,
455
- getter: (x) => x.tags,
456
- })(y.atomics),
457
- constants: [...x.constants],
458
- templates: x.templates.slice(),
459
-
460
- rest:
461
- x.rest !== null && y.rest !== null
462
- ? merge(x.rest, y.rest)
463
- : x.rest ?? y.rest,
464
- // arrays: x.arrays.slice(),
465
- arrays: mergeTaggedTypes({
466
- container: x.arrays,
467
- equals: (x, y) => x.type.name === y.type.name,
468
- getter: (x) => x.tags,
469
- })(y.arrays),
470
- tuples: mergeTaggedTypes({
471
- container: x.tuples,
472
- equals: (x, y) => x.type.name === y.type.name,
473
- getter: (x) => x.tags,
474
- })(y.tuples),
475
- objects: x.objects.slice(),
476
- aliases: x.aliases.slice(),
477
-
478
- natives: [...new Set([...x.natives, ...y.natives])],
479
- sets: x.sets.slice(),
480
- maps: x.maps.slice(),
481
- });
482
- for (const constant of y.constants) {
483
- const target: MetadataConstant = ArrayUtil.take(
484
- output.constants,
485
- (elem) => elem.type === constant.type,
486
- () =>
487
- MetadataConstant.create({
488
- type: constant.type,
489
- values: [],
490
- }),
491
- );
492
- for (const value of constant.values) ArrayUtil.add(target.values, value);
493
- }
494
- for (const obj of y.objects)
495
- ArrayUtil.set(output.objects, obj, (elem) => elem.name);
496
- for (const alias of y.aliases)
497
- ArrayUtil.set(output.aliases, alias, (elem) => elem.name);
498
-
499
- return output;
500
- };
501
- }
502
-
503
- const getName = (metadata: Metadata): string => {
504
- if (metadata.any === true) return "any";
505
-
506
- const elements: string[] = [];
507
-
508
- // OPTIONAL
509
- if (metadata.nullable === true) elements.push("null");
510
- if (metadata.isRequired() === false) elements.push("undefined");
511
-
512
- // ATOMIC
513
- for (const atom of metadata.atomics) {
514
- elements.push(atom.getName());
515
- }
516
- for (const constant of metadata.constants)
517
- for (const value of constant.values)
518
- elements.push(
519
- constant.type === "string" ? JSON.stringify(value) : value.toString(),
520
- );
521
- for (const template of metadata.templates)
522
- elements.push(
523
- "`" +
524
- template
525
- .map((child) =>
526
- child.isConstant() && child.size() === 1
527
- ? child.constants[0]!.values[0]!
528
- : `$\{${child.getName()}\}`,
529
- )
530
- .join("")
531
- .split("`")
532
- .join("\\`") +
533
- "`",
534
- );
535
-
536
- // NATIVES
537
- for (const native of metadata.natives) elements.push(native);
538
- for (const set of metadata.sets) elements.push(`Set<${set.getName()}>`);
539
- for (const map of metadata.maps)
540
- elements.push(`Map<${map.key.getName()}, ${map.value.getName()}>`);
541
-
542
- // INSTANCES
543
- if (metadata.rest !== null) elements.push(`...${metadata.rest.getName()}`);
544
- for (const tuple of metadata.tuples) elements.push(tuple.type.name);
545
- for (const array of metadata.arrays) elements.push(array.getName());
546
- for (const object of metadata.objects) elements.push(object.name);
547
- for (const alias of metadata.aliases) elements.push(alias.name);
548
- if (metadata.escaped !== null) elements.push(metadata.escaped.getName());
549
-
550
- // RETURNS
551
- if (elements.length === 0) return "unknown";
552
- else if (elements.length === 1) return elements[0]!;
553
-
554
- elements.sort();
555
- return `(${elements.join(" | ")})`;
556
- };
557
- export namespace Metadata {
558
- export interface Entry {
559
- key: Metadata;
560
- value: Metadata;
561
- }
562
- }
563
-
564
- const mergeTaggedTypes =
565
- <T>(props: {
566
- container: T[];
567
- equals: (x: T, y: T) => boolean;
568
- getter: (x: T) => IMetadataTypeTag[][];
569
- }) =>
570
- (opposite: T[]) => {
571
- const output: T[] = [...props.container];
572
- for (const elem of opposite) {
573
- const equal = props.container.find((x) => props.equals(x, elem));
574
- if (equal === undefined) {
575
- output.push(elem);
576
- continue;
577
- }
578
-
579
- const matrix: string[][] = props
580
- .getter(equal)
581
- .map((tags) => tags.map((t) => t.name))
582
- .sort();
583
- for (const tags of props.getter(elem)) {
584
- const names: string[] = tags.map((t) => t.name).sort();
585
- if (
586
- matrix.some(
587
- (m) =>
588
- m.length === names.length && m.every((s, i) => s === names[i]),
589
- )
590
- )
591
- continue;
592
- props.getter(equal).push(tags);
593
- }
594
- }
595
- return output;
596
- };
1
+ import { ClassProperties } from "../../typings/ClassProperties";
2
+
3
+ import { ArrayUtil } from "../../utils/ArrayUtil";
4
+
5
+ import { IMetadata } from "./IMetadata";
6
+ import { IMetadataDictionary } from "./IMetadataDictionary";
7
+ import { IMetadataTypeTag } from "./IMetadataTypeTag";
8
+ import { MetadataAlias } from "./MetadataAlias";
9
+ import { MetadataArray } from "./MetadataArray";
10
+ import { MetadataAtomic } from "./MetadataAtomic";
11
+ import { MetadataConstant } from "./MetadataConstant";
12
+ import { MetadataEscaped } from "./MetadataEscaped";
13
+ import { MetadataObject } from "./MetadataObject";
14
+ import { MetadataTuple } from "./MetadataTuple";
15
+
16
+ export class Metadata {
17
+ public any: boolean;
18
+ public required: boolean;
19
+ public optional: boolean;
20
+ public nullable: boolean;
21
+ public functional: boolean;
22
+
23
+ public escaped: MetadataEscaped | null;
24
+ public atomics: MetadataAtomic[];
25
+ public constants: MetadataConstant[];
26
+ public templates: Metadata[][];
27
+
28
+ public rest: Metadata | null;
29
+ public aliases: MetadataAlias[];
30
+ public arrays: MetadataArray[];
31
+ public tuples: MetadataTuple[];
32
+ public objects: MetadataObject[];
33
+
34
+ public natives: string[];
35
+ public sets: Metadata[];
36
+ public maps: Metadata.Entry[];
37
+
38
+ /** @internal */ private name_?: string;
39
+ /** @internal */ private parent_resolved_: boolean = false;
40
+ /** @internal */ public union_index?: number;
41
+ /** @internal */ public fixed_?: number | null;
42
+ /** @internal */ public boolean_literal_intersected_?: boolean;
43
+
44
+ /* -----------------------------------------------------------
45
+ CONSTRUCTORS
46
+ ----------------------------------------------------------- */
47
+ /**
48
+ * @hidden
49
+ */
50
+ private constructor(props: ClassProperties<Metadata>) {
51
+ this.any = props.any;
52
+ this.required = props.required;
53
+ this.optional = props.optional;
54
+ this.nullable = props.nullable;
55
+ this.functional = props.functional;
56
+
57
+ this.escaped = props.escaped;
58
+ this.atomics = props.atomics;
59
+ this.constants = props.constants;
60
+ this.templates = props.templates;
61
+
62
+ this.rest = props.rest;
63
+ this.arrays = props.arrays;
64
+ this.tuples = props.tuples;
65
+ this.objects = props.objects;
66
+ this.aliases = props.aliases;
67
+
68
+ this.natives = props.natives;
69
+ this.sets = props.sets;
70
+ this.maps = props.maps;
71
+ }
72
+
73
+ /**
74
+ * @internal
75
+ */
76
+ public static create(props: ClassProperties<Metadata>): Metadata {
77
+ return new Metadata(props);
78
+ }
79
+
80
+ /**
81
+ * @internal
82
+ */
83
+ public static initialize(parentResolved: boolean = false): Metadata {
84
+ const meta: Metadata = Metadata.create({
85
+ any: false,
86
+ nullable: false,
87
+ required: true,
88
+ optional: false,
89
+ functional: false,
90
+
91
+ escaped: null,
92
+ constants: [],
93
+ atomics: [],
94
+ templates: [],
95
+ arrays: [],
96
+ tuples: [],
97
+ objects: [],
98
+ aliases: [],
99
+
100
+ rest: null,
101
+ natives: [],
102
+ sets: [],
103
+ maps: [],
104
+ });
105
+ meta.parent_resolved_ = parentResolved;
106
+ return meta;
107
+ }
108
+
109
+ public toJSON(): IMetadata {
110
+ return {
111
+ any: this.any,
112
+ required: this.required,
113
+ optional: this.optional,
114
+ nullable: this.nullable,
115
+ functional: this.functional,
116
+
117
+ atomics: this.atomics.map((a) => a.toJSON()),
118
+ constants: this.constants.map((c) => c.toJSON()),
119
+ templates: this.templates.map((tpl) => tpl.map((meta) => meta.toJSON())),
120
+ escaped: this.escaped ? this.escaped.toJSON() : null,
121
+
122
+ rest: this.rest ? this.rest.toJSON() : null,
123
+ arrays: this.arrays.map((array) => ({
124
+ name: array.type.name,
125
+ tags: array.tags.map((r) => r.slice()),
126
+ })),
127
+ tuples: this.tuples.map((tuple) => ({
128
+ name: tuple.type.name,
129
+ tags: tuple.tags.map((r) => r.slice()),
130
+ })),
131
+ objects: this.objects.map((obj) => obj.name),
132
+ aliases: this.aliases.map((alias) => alias.name),
133
+
134
+ natives: this.natives.slice(),
135
+ sets: this.sets.map((meta) => meta.toJSON()),
136
+ maps: this.maps.map((entry) => ({
137
+ key: entry.key.toJSON(),
138
+ value: entry.value.toJSON(),
139
+ })),
140
+ };
141
+ }
142
+
143
+ public static from(meta: IMetadata, dict: IMetadataDictionary): Metadata {
144
+ return Metadata.create({
145
+ any: meta.any,
146
+ required: meta.required,
147
+ optional: meta.optional,
148
+ nullable: meta.nullable,
149
+ functional: meta.functional,
150
+
151
+ constants: meta.constants.map(MetadataConstant.from),
152
+ atomics: meta.atomics.map(MetadataAtomic.from),
153
+ templates: meta.templates.map((tpl) =>
154
+ tpl.map((meta) => this.from(meta, dict)),
155
+ ),
156
+ escaped: meta.escaped ? MetadataEscaped.from(meta.escaped, dict) : null,
157
+
158
+ rest: meta.rest ? this.from(meta.rest, dict) : null,
159
+ arrays: meta.arrays.map((ref) => {
160
+ const type = dict.arrays.get(ref.name);
161
+ if (type === undefined)
162
+ throw new RangeError(
163
+ `Error on Metadata.from(): failed to find array "${ref.name}".`,
164
+ );
165
+ return MetadataArray.create({
166
+ type,
167
+ tags: ref.tags.map((row) => row.slice()),
168
+ });
169
+ }),
170
+ tuples: meta.tuples.map((t) => {
171
+ const type = dict.tuples.get(t.name);
172
+ if (type === undefined)
173
+ throw new RangeError(
174
+ `Error on Metadata.from(): failed to find tuple "${t.name}".`,
175
+ );
176
+ return MetadataTuple.create({
177
+ type,
178
+ tags: t.tags.map((r) => r.slice()),
179
+ });
180
+ }),
181
+ objects: meta.objects.map((name) => {
182
+ const found = dict.objects.get(name);
183
+ if (found === undefined)
184
+ throw new RangeError(
185
+ `Error on Metadata.from(): failed to find object "${name}".`,
186
+ );
187
+ return found;
188
+ }),
189
+ aliases: meta.aliases.map((alias) => {
190
+ const found = dict.aliases.get(alias);
191
+ if (found === undefined)
192
+ throw new RangeError(
193
+ `Error on Metadata.from(): failed to find alias "${alias}".`,
194
+ );
195
+ return found;
196
+ }),
197
+
198
+ natives: meta.natives.slice(),
199
+ sets: meta.sets.map((meta) => this.from(meta, dict)),
200
+ maps: meta.maps.map((entry) => ({
201
+ key: this.from(entry.key, dict),
202
+ value: this.from(entry.value, dict),
203
+ })),
204
+ });
205
+ }
206
+
207
+ /* -----------------------------------------------------------
208
+ ACCESSORS
209
+ ----------------------------------------------------------- */
210
+ public getName(): string {
211
+ return (this.name_ ??= getName(this));
212
+ }
213
+
214
+ public empty(): boolean {
215
+ return this.bucket() === 0 || this.size() === 0;
216
+ }
217
+
218
+ public size(): number {
219
+ return (
220
+ (this.any ? 1 : 0) +
221
+ (this.escaped ? 1 : 0) +
222
+ (this.functional ? 1 : 0) +
223
+ (this.rest ? this.rest.size() : 0) +
224
+ this.templates.length +
225
+ this.atomics.length +
226
+ this.constants.map((c) => c.values.length).reduce((x, y) => x + y, 0) +
227
+ this.arrays.length +
228
+ this.tuples.length +
229
+ this.natives.length +
230
+ this.maps.length +
231
+ this.sets.length +
232
+ this.objects.length +
233
+ this.aliases.length
234
+ );
235
+ }
236
+
237
+ public bucket(): number {
238
+ return (
239
+ (this.any ? 1 : 0) +
240
+ (this.escaped ? 1 : 0) +
241
+ (this.functional ? 1 : 0) +
242
+ (this.templates.length ? 1 : 0) +
243
+ (this.atomics.length ? 1 : 0) +
244
+ (this.constants.length ? 1 : 0) +
245
+ (this.rest ? this.rest.size() : 0) +
246
+ (this.arrays.length ? 1 : 0) +
247
+ (this.tuples.length ? 1 : 0) +
248
+ (this.natives.length ? 1 : 0) +
249
+ (this.sets.length ? 1 : 0) +
250
+ (this.maps.length ? 1 : 0) +
251
+ (this.objects.length ? 1 : 0) +
252
+ (this.aliases.length ? 1 : 0)
253
+ );
254
+ }
255
+
256
+ public isConstant(): boolean {
257
+ return this.bucket() === (this.constants.length ? 1 : 0);
258
+ }
259
+
260
+ public isRequired(): boolean {
261
+ return this.required === true && this.optional === false;
262
+ }
263
+
264
+ /**
265
+ * @internal
266
+ */
267
+ public isUnionBucket(): boolean {
268
+ const size: number = this.bucket();
269
+ const emended: number =
270
+ !!this.atomics.length && !!this.constants.length ? size - 1 : size;
271
+ return emended > 1;
272
+ }
273
+
274
+ /**
275
+ * @internal
276
+ */
277
+ public getSoleLiteral(): string | null {
278
+ if (
279
+ this.size() === 1 &&
280
+ this.constants.length === 1 &&
281
+ this.constants[0]!.type === "string" &&
282
+ this.constants[0]!.values.length === 1
283
+ )
284
+ return this.constants[0]!.values[0] as string;
285
+ else return null;
286
+ }
287
+
288
+ public isSoleLiteral(): boolean {
289
+ return this.getSoleLiteral() !== null;
290
+ }
291
+
292
+ /**
293
+ * @internal
294
+ */
295
+ public isParentResolved(): boolean {
296
+ return this.parent_resolved_;
297
+ }
298
+ }
299
+ export namespace Metadata {
300
+ export const intersects = (x: Metadata, y: Metadata): boolean => {
301
+ // CHECK ANY & OPTIONAL
302
+ if (x.any || y.any) return true;
303
+ if (x.isRequired() === false && false === y.isRequired()) return true;
304
+ if (x.nullable === true && true === y.nullable) return true;
305
+ if (x.functional === true && y.functional === true) return true;
306
+
307
+ //----
308
+ // INSTANCES
309
+ //----
310
+ // ARRAYS
311
+ if (x.arrays.length && y.arrays.length) return true;
312
+ if (x.tuples.length && y.tuples.length) return true;
313
+ if (x.objects.length && y.objects.length) return true;
314
+ if (x.aliases.length && y.aliases.length) return true;
315
+
316
+ // NATIVES
317
+ if (x.natives.length && y.natives.length)
318
+ if (x.natives.some((xn) => y.natives.some((yn) => xn === yn)))
319
+ return true;
320
+
321
+ //----
322
+ // VALUES
323
+ //----
324
+ // ATOMICS
325
+ for (const atomic of x.atomics)
326
+ if (y.atomics.some((ya) => atomic.type === ya.type)) return true;
327
+
328
+ // CONSTANTS
329
+ for (const constant of x.constants) {
330
+ const opposite: MetadataConstant | undefined = y.constants.find(
331
+ (elem) => elem.type === constant.type,
332
+ );
333
+ if (opposite === undefined) continue;
334
+
335
+ const values: Set<any> = new Set([
336
+ ...constant.values,
337
+ ...opposite.values,
338
+ ]);
339
+ if (values.size !== constant.values.length + opposite.values.length)
340
+ return true;
341
+ }
342
+ return false;
343
+ };
344
+
345
+ export const covers = (
346
+ x: Metadata,
347
+ y: Metadata,
348
+ level: number = 0,
349
+ ): boolean => {
350
+ // CHECK ANY
351
+ if (x === y) return false;
352
+ else if (x.any) return true;
353
+ else if (y.any) return false;
354
+
355
+ //----
356
+ // INSTANCES
357
+ //----
358
+ if (level === 0) {
359
+ // ARRAYS
360
+ for (const ya of y.arrays)
361
+ if (
362
+ !x.arrays.some((xa) =>
363
+ covers(xa.type.value, ya.type.value, level + 1),
364
+ )
365
+ ) {
366
+ return false;
367
+ }
368
+
369
+ // TUPLES
370
+ for (const yt of y.tuples)
371
+ if (
372
+ yt.type.elements.length !== 0 &&
373
+ x.tuples.some(
374
+ (xt) =>
375
+ xt.type.elements.length >= yt.type.elements.length &&
376
+ xt.type.elements
377
+ .slice(yt.type.elements.length)
378
+ .every((xv, i) => covers(xv, yt.type.elements[i]!, level + 1)),
379
+ ) === false
380
+ )
381
+ return false;
382
+ }
383
+
384
+ // OBJECTS
385
+ for (const yo of y.objects)
386
+ if (x.objects.some((xo) => MetadataObject.covers(xo, yo)) === false)
387
+ return false;
388
+
389
+ // ALIASES
390
+ for (const yd of y.aliases)
391
+ if (x.aliases.some((xd) => xd.name === yd.name) === false) return false;
392
+
393
+ // NATIVES
394
+ for (const yn of y.natives)
395
+ if (x.natives.some((xn) => xn === yn) === false) return false;
396
+
397
+ // SETS
398
+ for (const ys of y.sets)
399
+ if (x.sets.some((xs) => covers(xs, ys)) === false) return false;
400
+
401
+ //----
402
+ // VALUES
403
+ //----
404
+ // ATOMICS
405
+ if (
406
+ y.atomics.some(
407
+ (ya) => x.atomics.some((xa) => xa.type === ya.type) === false,
408
+ )
409
+ )
410
+ return false;
411
+
412
+ // CONSTANTS
413
+ for (const yc of y.constants) {
414
+ if (x.atomics.some((atom) => yc.type === atom.type)) continue;
415
+ const xc: MetadataConstant | undefined = x.constants.find(
416
+ (elem) => elem.type === yc.type,
417
+ );
418
+ if (xc === undefined) return false;
419
+ else if (
420
+ (yc.values as number[]).some(
421
+ (yv) => xc.values.includes(yv as never) === false,
422
+ )
423
+ )
424
+ return false;
425
+ }
426
+
427
+ // FUNCTIONAL
428
+ if (x.functional === false && y.functional) return false;
429
+
430
+ // SUCCESS
431
+ return true;
432
+ };
433
+
434
+ /**
435
+ * @internal
436
+ */
437
+ export const merge = (x: Metadata, y: Metadata): Metadata => {
438
+ const output: Metadata = Metadata.create({
439
+ any: x.any || y.any,
440
+ nullable: x.nullable || y.nullable,
441
+ required: x.required && y.required,
442
+ optional: x.optional || y.optional,
443
+ functional: x.functional || y.functional,
444
+
445
+ escaped:
446
+ x.escaped !== null && y.escaped !== null
447
+ ? MetadataEscaped.create({
448
+ original: merge(x.escaped.original, y.escaped.original),
449
+ returns: merge(x.escaped.returns, y.escaped.returns),
450
+ })
451
+ : x.escaped ?? y.escaped,
452
+ atomics: mergeTaggedTypes({
453
+ container: x.atomics,
454
+ equals: (x, y) => x.type === y.type,
455
+ getter: (x) => x.tags,
456
+ })(y.atomics),
457
+ constants: [...x.constants],
458
+ templates: x.templates.slice(),
459
+
460
+ rest:
461
+ x.rest !== null && y.rest !== null
462
+ ? merge(x.rest, y.rest)
463
+ : x.rest ?? y.rest,
464
+ // arrays: x.arrays.slice(),
465
+ arrays: mergeTaggedTypes({
466
+ container: x.arrays,
467
+ equals: (x, y) => x.type.name === y.type.name,
468
+ getter: (x) => x.tags,
469
+ })(y.arrays),
470
+ tuples: mergeTaggedTypes({
471
+ container: x.tuples,
472
+ equals: (x, y) => x.type.name === y.type.name,
473
+ getter: (x) => x.tags,
474
+ })(y.tuples),
475
+ objects: x.objects.slice(),
476
+ aliases: x.aliases.slice(),
477
+
478
+ natives: [...new Set([...x.natives, ...y.natives])],
479
+ sets: x.sets.slice(),
480
+ maps: x.maps.slice(),
481
+ });
482
+ for (const constant of y.constants) {
483
+ const target: MetadataConstant = ArrayUtil.take(
484
+ output.constants,
485
+ (elem) => elem.type === constant.type,
486
+ () =>
487
+ MetadataConstant.create({
488
+ type: constant.type,
489
+ values: [],
490
+ }),
491
+ );
492
+ for (const value of constant.values) ArrayUtil.add(target.values, value);
493
+ }
494
+ for (const obj of y.objects)
495
+ ArrayUtil.set(output.objects, obj, (elem) => elem.name);
496
+ for (const alias of y.aliases)
497
+ ArrayUtil.set(output.aliases, alias, (elem) => elem.name);
498
+
499
+ return output;
500
+ };
501
+ }
502
+
503
+ const getName = (metadata: Metadata): string => {
504
+ if (metadata.any === true) return "any";
505
+
506
+ const elements: string[] = [];
507
+
508
+ // OPTIONAL
509
+ if (metadata.nullable === true) elements.push("null");
510
+ if (metadata.isRequired() === false) elements.push("undefined");
511
+
512
+ // ATOMIC
513
+ for (const atom of metadata.atomics) {
514
+ elements.push(atom.getName());
515
+ }
516
+ for (const constant of metadata.constants)
517
+ for (const value of constant.values)
518
+ elements.push(
519
+ constant.type === "string" ? JSON.stringify(value) : value.toString(),
520
+ );
521
+ for (const template of metadata.templates)
522
+ elements.push(
523
+ "`" +
524
+ template
525
+ .map((child) =>
526
+ child.isConstant() && child.size() === 1
527
+ ? child.constants[0]!.values[0]!
528
+ : `$\{${child.getName()}\}`,
529
+ )
530
+ .join("")
531
+ .split("`")
532
+ .join("\\`") +
533
+ "`",
534
+ );
535
+
536
+ // NATIVES
537
+ for (const native of metadata.natives) elements.push(native);
538
+ for (const set of metadata.sets) elements.push(`Set<${set.getName()}>`);
539
+ for (const map of metadata.maps)
540
+ elements.push(`Map<${map.key.getName()}, ${map.value.getName()}>`);
541
+
542
+ // INSTANCES
543
+ if (metadata.rest !== null) elements.push(`...${metadata.rest.getName()}`);
544
+ for (const tuple of metadata.tuples) elements.push(tuple.type.name);
545
+ for (const array of metadata.arrays) elements.push(array.getName());
546
+ for (const object of metadata.objects) elements.push(object.name);
547
+ for (const alias of metadata.aliases) elements.push(alias.name);
548
+ if (metadata.escaped !== null) elements.push(metadata.escaped.getName());
549
+
550
+ // RETURNS
551
+ if (elements.length === 0) return "unknown";
552
+ else if (elements.length === 1) return elements[0]!;
553
+
554
+ elements.sort();
555
+ return `(${elements.join(" | ")})`;
556
+ };
557
+ export namespace Metadata {
558
+ export interface Entry {
559
+ key: Metadata;
560
+ value: Metadata;
561
+ }
562
+ }
563
+
564
+ const mergeTaggedTypes =
565
+ <T>(props: {
566
+ container: T[];
567
+ equals: (x: T, y: T) => boolean;
568
+ getter: (x: T) => IMetadataTypeTag[][];
569
+ }) =>
570
+ (opposite: T[]) => {
571
+ const output: T[] = [...props.container];
572
+ for (const elem of opposite) {
573
+ const equal = props.container.find((x) => props.equals(x, elem));
574
+ if (equal === undefined) {
575
+ output.push(elem);
576
+ continue;
577
+ }
578
+
579
+ const matrix: string[][] = props
580
+ .getter(equal)
581
+ .map((tags) => tags.map((t) => t.name))
582
+ .sort();
583
+ for (const tags of props.getter(elem)) {
584
+ const names: string[] = tags.map((t) => t.name).sort();
585
+ if (
586
+ matrix.some(
587
+ (m) =>
588
+ m.length === names.length && m.every((s, i) => s === names[i]),
589
+ )
590
+ )
591
+ continue;
592
+ props.getter(equal).push(tags);
593
+ }
594
+ }
595
+ return output;
596
+ };