typia 5.5.8 → 5.5.9

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