typia 6.6.2 → 6.7.0-dev.20240802

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