typia 5.3.12-dev.20240121 → 5.3.12

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