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,648 +1,685 @@
1
- import ts from "typescript";
2
-
3
- import { ExpressionFactory } from "../../factories/ExpressionFactory";
4
- import { IdentifierFactory } from "../../factories/IdentifierFactory";
5
- import { MetadataCollection } from "../../factories/MetadataCollection";
6
- import { MetadataFactory } from "../../factories/MetadataFactory";
7
- import { StatementFactory } from "../../factories/StatementFactory";
8
- import { TypeFactory } from "../../factories/TypeFactory";
9
-
10
- import { Metadata } from "../../schemas/metadata/Metadata";
11
- import { MetadataArray } from "../../schemas/metadata/MetadataArray";
12
- import { MetadataTuple } from "../../schemas/metadata/MetadataTuple";
13
- import { MetadataTupleType } from "../../schemas/metadata/MetadataTupleType";
14
-
15
- import { IProject } from "../../transformers/IProject";
16
- import { TransformerError } from "../../transformers/TransformerError";
17
-
18
- import { StringUtil } from "../../utils/StringUtil";
19
-
20
- import { FeatureProgrammer } from "../FeatureProgrammer";
21
- import { IsProgrammer } from "../IsProgrammer";
22
- import { FunctionImporter } from "../helpers/FunctionImporter";
23
- import { NotationJoiner } from "../helpers/NotationJoiner";
24
- import { UnionExplorer } from "../helpers/UnionExplorer";
25
- import { decode_union_object } from "../internal/decode_union_object";
26
- import { postfix_of_tuple } from "../internal/postfix_of_tuple";
27
- import { wrap_metadata_rest_tuple } from "../internal/wrap_metadata_rest_tuple";
28
-
29
- export namespace NotationGeneralProgrammer {
30
- export const returnType =
31
- (rename: (str: string) => string) => (type: string) =>
32
- `typia.${StringUtil.capitalize(rename.name)}Case<${type}>`;
33
-
34
- export const write =
35
- (rename: (str: string) => string) =>
36
- (project: IProject) =>
37
- (modulo: ts.LeftHandSideExpression) => {
38
- const importer: FunctionImporter = new FunctionImporter(modulo.getText());
39
- return FeatureProgrammer.write(project)({
40
- ...configure(rename)(project)(importer),
41
- addition: (collection) => [
42
- ...IsProgrammer.write_function_statements(project)(importer)(
43
- collection,
44
- ),
45
- ...importer.declare(modulo),
46
- ],
47
- })(importer);
48
- };
49
-
50
- const write_array_functions =
51
- (config: FeatureProgrammer.IConfig) =>
52
- (importer: FunctionImporter) =>
53
- (collection: MetadataCollection): ts.VariableStatement[] =>
54
- collection
55
- .arrays()
56
- .filter((a) => a.recursive)
57
- .map((type, i) =>
58
- StatementFactory.constant(
59
- `${config.prefix}a${i}`,
60
- ts.factory.createArrowFunction(
61
- undefined,
62
- undefined,
63
- FeatureProgrammer.parameterDeclarations(config)(
64
- TypeFactory.keyword("any"),
65
- )(ts.factory.createIdentifier("input")),
66
- TypeFactory.keyword("any"),
67
- undefined,
68
- decode_array_inline(config)(importer)(
69
- ts.factory.createIdentifier("input"),
70
- MetadataArray.create({
71
- type,
72
- tags: [],
73
- }),
74
- {
75
- tracable: config.trace,
76
- source: "function",
77
- from: "array",
78
- postfix: "",
79
- },
80
- ),
81
- ),
82
- ),
83
- );
84
-
85
- const write_tuple_functions =
86
- (project: IProject) =>
87
- (config: FeatureProgrammer.IConfig) =>
88
- (importer: FunctionImporter) =>
89
- (collection: MetadataCollection): ts.VariableStatement[] =>
90
- collection
91
- .tuples()
92
- .filter((t) => t.recursive)
93
- .map((tuple, i) =>
94
- StatementFactory.constant(
95
- `${config.prefix}t${i}`,
96
- ts.factory.createArrowFunction(
97
- undefined,
98
- undefined,
99
- FeatureProgrammer.parameterDeclarations(config)(
100
- TypeFactory.keyword("any"),
101
- )(ts.factory.createIdentifier("input")),
102
- TypeFactory.keyword("any"),
103
- undefined,
104
- decode_tuple_inline(project)(config)(importer)(
105
- ts.factory.createIdentifier("input"),
106
- tuple,
107
- {
108
- tracable: config.trace,
109
- source: "function",
110
- from: "array",
111
- postfix: "",
112
- },
113
- ),
114
- ),
115
- ),
116
- );
117
-
118
- /* -----------------------------------------------------------
119
- DECODERS
120
- ----------------------------------------------------------- */
121
- const decode =
122
- (project: IProject) =>
123
- (config: FeatureProgrammer.IConfig) =>
124
- (importer: FunctionImporter) =>
125
- (
126
- input: ts.Expression,
127
- meta: Metadata,
128
- explore: FeatureProgrammer.IExplore,
129
- ): ts.Expression => {
130
- // ANY TYPE
131
- if (
132
- meta.any ||
133
- meta.arrays.some((a) => a.type.value.any) ||
134
- meta.tuples.some(
135
- (t) =>
136
- !!t.type.elements.length && t.type.elements.every((e) => e.any),
137
- )
138
- )
139
- return ts.factory.createCallExpression(importer.use("any"), undefined, [
140
- input,
141
- ]);
142
-
143
- interface IUnion {
144
- type: string;
145
- is: () => ts.Expression;
146
- value: () => ts.Expression;
147
- }
148
- const unions: IUnion[] = [];
149
-
150
- //----
151
- // LIST UP UNION TYPES
152
- //----
153
- // FUNCTIONAL
154
- if (meta.functional)
155
- unions.push({
156
- type: "functional",
157
- is: () =>
158
- ts.factory.createStrictEquality(
159
- ts.factory.createStringLiteral("function"),
160
- ts.factory.createTypeOfExpression(input),
161
- ),
162
- value: () => ts.factory.createIdentifier("undefined"),
163
- });
164
-
165
- // TUPLES
166
- for (const tuple of meta.tuples)
167
- unions.push({
168
- type: "tuple",
169
- is: () =>
170
- IsProgrammer.decode(project)(importer)(
171
- input,
172
- (() => {
173
- const partial = Metadata.initialize();
174
- partial.tuples.push(tuple);
175
- return partial;
176
- })(),
177
- explore,
178
- ),
179
- value: () =>
180
- decode_tuple(project)(config)(importer)(input, tuple, explore),
181
- });
182
-
183
- // ARRAYS
184
- if (meta.arrays.length)
185
- unions.push({
186
- type: "array",
187
- is: () => ExpressionFactory.isArray(input),
188
- value: () =>
189
- explore_arrays(project)(config)(importer)(input, meta.arrays, {
190
- ...explore,
191
- from: "array",
192
- }),
193
- });
194
-
195
- // NATIVE TYPES
196
- if (meta.sets.length)
197
- unions.push({
198
- type: "set",
199
- is: () => ExpressionFactory.isInstanceOf("Set")(input),
200
- value: () =>
201
- explore_sets(project)(config)(importer)(input, meta.sets, {
202
- ...explore,
203
- from: "array",
204
- }),
205
- });
206
- if (meta.maps.length)
207
- unions.push({
208
- type: "map",
209
- is: () => ExpressionFactory.isInstanceOf("Map")(input),
210
- value: () =>
211
- explore_maps(project)(config)(importer)(input, meta.maps, {
212
- ...explore,
213
- from: "array",
214
- }),
215
- });
216
- for (const native of meta.natives) {
217
- if (native === "WeakSet" || native === "WeakMap") continue;
218
- unions.push({
219
- type: "native",
220
- is: () => ExpressionFactory.isInstanceOf(native)(input),
221
- value: () =>
222
- native === "Boolean" || native === "Number" || native === "String"
223
- ? ts.factory.createCallExpression(
224
- IdentifierFactory.access(input)("valueOf"),
225
- undefined,
226
- undefined,
227
- )
228
- : decode_native(native)(input),
229
- });
230
- }
231
-
232
- // OBJECTS
233
- if (meta.objects.length)
234
- unions.push({
235
- type: "object",
236
- is: () =>
237
- ExpressionFactory.isObject({
238
- checkNull: true,
239
- checkArray: false,
240
- })(input),
241
- value: () =>
242
- explore_objects(config)(importer)(input, meta, {
243
- ...explore,
244
- from: "object",
245
- }),
246
- });
247
-
248
- // COMPOSITION
249
- let last: ts.Expression = input;
250
- for (const u of unions.reverse())
251
- last = ts.factory.createConditionalExpression(
252
- u.is(),
253
- undefined,
254
- u.value(),
255
- undefined,
256
- last,
257
- );
258
- return ts.factory.createAsExpression(last, TypeFactory.keyword("any"));
259
- };
260
-
261
- const decode_object = (importer: FunctionImporter) =>
262
- FeatureProgrammer.decode_object({
263
- trace: false,
264
- path: false,
265
- prefix: PREFIX,
266
- })(importer);
267
-
268
- const decode_array =
269
- (config: FeatureProgrammer.IConfig) =>
270
- (importer: FunctionImporter) =>
271
- (
272
- input: ts.Expression,
273
- array: MetadataArray,
274
- explore: FeatureProgrammer.IExplore,
275
- ) =>
276
- array.type.recursive
277
- ? ts.factory.createCallExpression(
278
- ts.factory.createIdentifier(
279
- importer.useLocal(`${config.prefix}a${array.type.index}`),
280
- ),
281
- undefined,
282
- FeatureProgrammer.argumentsArray(config)({
283
- ...explore,
284
- source: "function",
285
- from: "array",
286
- })(input),
287
- )
288
- : decode_array_inline(config)(importer)(input, array, explore);
289
-
290
- const decode_array_inline =
291
- (config: FeatureProgrammer.IConfig) =>
292
- (importer: FunctionImporter) =>
293
- (
294
- input: ts.Expression,
295
- array: MetadataArray,
296
- explore: FeatureProgrammer.IExplore,
297
- ) =>
298
- FeatureProgrammer.decode_array(config)(importer)(NotationJoiner.array)(
299
- input,
300
- array,
301
- explore,
302
- );
303
-
304
- const decode_tuple =
305
- (project: IProject) =>
306
- (config: FeatureProgrammer.IConfig) =>
307
- (importer: FunctionImporter) =>
308
- (
309
- input: ts.Expression,
310
- tuple: MetadataTuple,
311
- explore: FeatureProgrammer.IExplore,
312
- ): ts.Expression =>
313
- tuple.type.recursive
314
- ? ts.factory.createCallExpression(
315
- ts.factory.createIdentifier(
316
- importer.useLocal(`${config.prefix}t${tuple.type.index}`),
317
- ),
318
- undefined,
319
- FeatureProgrammer.argumentsArray(config)({
320
- ...explore,
321
- source: "function",
322
- })(input),
323
- )
324
- : decode_tuple_inline(project)(config)(importer)(
325
- input,
326
- tuple.type,
327
- explore,
328
- );
329
-
330
- const decode_tuple_inline =
331
- (project: IProject) =>
332
- (config: FeatureProgrammer.IConfig) =>
333
- (importer: FunctionImporter) =>
334
- (
335
- input: ts.Expression,
336
- tuple: MetadataTupleType,
337
- explore: FeatureProgrammer.IExplore,
338
- ): ts.Expression => {
339
- const children: ts.Expression[] = tuple.elements
340
- .filter((m) => m.rest === null)
341
- .map((elem, index) =>
342
- decode(project)(config)(importer)(
343
- ts.factory.createElementAccessExpression(input, index),
344
- elem,
345
- {
346
- ...explore,
347
- from: "array",
348
- postfix: explore.postfix.length
349
- ? `${postfix_of_tuple(explore.postfix)}[${index}]"`
350
- : `"[${index}]"`,
351
- },
352
- ),
353
- );
354
- const rest = (() => {
355
- if (tuple.elements.length === 0) return null;
356
-
357
- const last: Metadata = tuple.elements.at(-1)!;
358
- const rest: Metadata | null = last.rest;
359
- if (rest === null) return null;
360
-
361
- return decode(project)(config)(importer)(
362
- ts.factory.createCallExpression(
363
- IdentifierFactory.access(input)("slice"),
364
- undefined,
365
- [ExpressionFactory.number(tuple.elements.length - 1)],
366
- ),
367
- wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!),
368
- {
369
- ...explore,
370
- start: tuple.elements.length - 1,
371
- },
372
- );
373
- })();
374
- return NotationJoiner.tuple(children, rest);
375
- };
376
-
377
- /* -----------------------------------------------------------
378
- NATIVE CLASSES
379
- ----------------------------------------------------------- */
380
- const decode_native = (type: string) => (input: ts.Expression) =>
381
- type === "Date"
382
- ? ts.factory.createNewExpression(
383
- ts.factory.createIdentifier(type),
384
- undefined,
385
- [input],
386
- )
387
- : input;
388
-
389
- /* -----------------------------------------------------------
390
- EXPLORERS FOR UNION TYPES
391
- ----------------------------------------------------------- */
392
- const explore_sets =
393
- (project: IProject) =>
394
- (config: FeatureProgrammer.IConfig) =>
395
- (importer: FunctionImporter) =>
396
- (
397
- input: ts.Expression,
398
- sets: Metadata[],
399
- explore: FeatureProgrammer.IExplore,
400
- ): ts.Expression =>
401
- ts.factory.createCallExpression(
402
- UnionExplorer.set({
403
- checker: IsProgrammer.decode(project)(importer),
404
- decoder: (input, array, explore) =>
405
- ts.factory.createNewExpression(
406
- ts.factory.createIdentifier("Set"),
407
- [TypeFactory.keyword("any")],
408
- [decode_array(config)(importer)(input, array, explore)],
409
- ),
410
- empty: ts.factory.createNewExpression(
411
- ts.factory.createIdentifier("Set"),
412
- [TypeFactory.keyword("any")],
413
- [],
414
- ),
415
- success: ts.factory.createTrue(),
416
- failure: (input, expected) =>
417
- create_throw_error(importer)(expected)(input),
418
- })([])(input, sets, explore),
419
- undefined,
420
- undefined,
421
- );
422
-
423
- const explore_maps =
424
- (project: IProject) =>
425
- (config: FeatureProgrammer.IConfig) =>
426
- (importer: FunctionImporter) =>
427
- (
428
- input: ts.Expression,
429
- maps: Metadata.Entry[],
430
- explore: FeatureProgrammer.IExplore,
431
- ): ts.Expression =>
432
- ts.factory.createCallExpression(
433
- UnionExplorer.map({
434
- checker: (top, entry, explore) => {
435
- const func = IsProgrammer.decode(project)(importer);
436
- return ts.factory.createLogicalAnd(
437
- func(ts.factory.createElementAccessExpression(top, 0), entry[0], {
438
- ...explore,
439
- postfix: `${explore.postfix}[0]`,
440
- }),
441
- func(ts.factory.createElementAccessExpression(top, 1), entry[1], {
442
- ...explore,
443
- postfix: `${explore.postfix}[1]`,
444
- }),
445
- );
446
- },
447
- decoder: (input, array, explore) =>
448
- ts.factory.createNewExpression(
449
- ts.factory.createIdentifier("Map"),
450
- [TypeFactory.keyword("any"), TypeFactory.keyword("any")],
451
- [decode_array(config)(importer)(input, array, explore)],
452
- ),
453
- empty: ts.factory.createNewExpression(
454
- ts.factory.createIdentifier("Map"),
455
- [TypeFactory.keyword("any"), TypeFactory.keyword("any")],
456
- [],
457
- ),
458
- success: ts.factory.createTrue(),
459
- failure: (input, expected) =>
460
- create_throw_error(importer)(expected)(input),
461
- })([])(input, maps, explore),
462
- undefined,
463
- undefined,
464
- );
465
-
466
- const explore_objects =
467
- (config: FeatureProgrammer.IConfig) =>
468
- (importer: FunctionImporter) =>
469
- (
470
- input: ts.Expression,
471
- meta: Metadata,
472
- explore: FeatureProgrammer.IExplore,
473
- ) => {
474
- if (meta.objects.length === 1)
475
- return decode_object(importer)(input, meta.objects[0]!, explore);
476
-
477
- return ts.factory.createCallExpression(
478
- ts.factory.createIdentifier(
479
- importer.useLocal(`${PREFIX}u${meta.union_index!}`),
480
- ),
481
- undefined,
482
- FeatureProgrammer.argumentsArray(config)(explore)(input),
483
- );
484
- };
485
-
486
- const explore_arrays =
487
- (project: IProject) =>
488
- (config: FeatureProgrammer.IConfig) =>
489
- (importer: FunctionImporter) =>
490
- (
491
- input: ts.Expression,
492
- elements: MetadataArray[],
493
- explore: FeatureProgrammer.IExplore,
494
- ): ts.Expression =>
495
- explore_array_like_union_types(config)(importer)(
496
- UnionExplorer.array({
497
- checker: IsProgrammer.decode(project)(importer),
498
- decoder: decode_array(config)(importer),
499
- empty: ts.factory.createIdentifier("[]"),
500
- success: ts.factory.createTrue(),
501
- failure: (input, expected) =>
502
- create_throw_error(importer)(expected)(input),
503
- }),
504
- )(input, elements, explore);
505
-
506
- const explore_array_like_union_types =
507
- (config: FeatureProgrammer.IConfig) =>
508
- (importer: FunctionImporter) =>
509
- <T extends MetadataArray | MetadataTuple>(
510
- factory: (
511
- parameters: ts.ParameterDeclaration[],
512
- ) => (
513
- input: ts.Expression,
514
- elements: T[],
515
- explore: FeatureProgrammer.IExplore,
516
- ) => ts.ArrowFunction,
517
- ) =>
518
- (
519
- input: ts.Expression,
520
- elements: T[],
521
- explore: FeatureProgrammer.IExplore,
522
- ): ts.Expression => {
523
- const arrow =
524
- (parameters: ts.ParameterDeclaration[]) =>
525
- (explore: FeatureProgrammer.IExplore) =>
526
- (input: ts.Expression): ts.ArrowFunction =>
527
- factory(parameters)(input, elements, explore);
528
- if (elements.every((e) => e.type.recursive === false))
529
- ts.factory.createCallExpression(
530
- arrow([])(explore)(input),
531
- undefined,
532
- [],
533
- );
534
-
535
- explore = {
536
- ...explore,
537
- source: "function",
538
- from: "array",
539
- };
540
- return ts.factory.createCallExpression(
541
- ts.factory.createIdentifier(
542
- importer.emplaceUnion(
543
- config.prefix,
544
- elements.map((e) => e.type.name).join(" | "),
545
- () =>
546
- arrow(
547
- FeatureProgrammer.parameterDeclarations(config)(
548
- TypeFactory.keyword("any"),
549
- )(ts.factory.createIdentifier("input")),
550
- )({
551
- ...explore,
552
- postfix: "",
553
- })(ts.factory.createIdentifier("input")),
554
- ),
555
- ),
556
- undefined,
557
- FeatureProgrammer.argumentsArray(config)(explore)(input),
558
- );
559
- };
560
-
561
- /* -----------------------------------------------------------
562
- CONFIGURATIONS
563
- ----------------------------------------------------------- */
564
- const PREFIX = "$c";
565
-
566
- const configure =
567
- (rename: (str: string) => string) =>
568
- (project: IProject) =>
569
- (importer: FunctionImporter): FeatureProgrammer.IConfig => {
570
- const config: FeatureProgrammer.IConfig = {
571
- types: {
572
- input: (type, name) =>
573
- ts.factory.createTypeReferenceNode(
574
- name ?? TypeFactory.getFullName(project.checker)(type),
575
- ),
576
- output: (type, name) =>
577
- ts.factory.createTypeReferenceNode(
578
- returnType(rename)(
579
- name ?? TypeFactory.getFullName(project.checker)(type),
580
- ),
581
- ),
582
- },
583
- prefix: PREFIX,
584
- trace: false,
585
- path: false,
586
- initializer,
587
- decoder: () => decode(project)(config)(importer),
588
- objector: {
589
- checker: () => IsProgrammer.decode(project)(importer),
590
- decoder: () => decode_object(importer),
591
- joiner: NotationJoiner.object(rename),
592
- unionizer: decode_union_object(
593
- IsProgrammer.decode_object(project)(importer),
594
- )(decode_object(importer))((exp) => exp)((input, expected) =>
595
- create_throw_error(importer)(expected)(input),
596
- ),
597
- failure: (input, expected) =>
598
- create_throw_error(importer)(expected)(input),
599
- },
600
- generator: {
601
- arrays: () => write_array_functions(config)(importer),
602
- tuples: () => write_tuple_functions(project)(config)(importer),
603
- },
604
- };
605
- return config;
606
- };
607
-
608
- const initializer: FeatureProgrammer.IConfig["initializer"] =
609
- (project) => (importer) => (type) => {
610
- const collection = new MetadataCollection();
611
- const result = MetadataFactory.analyze(
612
- project.checker,
613
- project.context,
614
- )({
615
- escape: false,
616
- constant: true,
617
- absorb: true,
618
- })(collection)(type);
619
- if (result.success === false)
620
- throw TransformerError.from(`typia.misc.${importer.method}`)(
621
- result.errors,
622
- );
623
- return [collection, result.data];
624
- };
625
-
626
- const create_throw_error =
627
- (importer: FunctionImporter) =>
628
- (expected: string) =>
629
- (value: ts.Expression) =>
630
- ts.factory.createExpressionStatement(
631
- ts.factory.createCallExpression(
632
- importer.use("throws"),
633
- [],
634
- [
635
- ts.factory.createObjectLiteralExpression(
636
- [
637
- ts.factory.createPropertyAssignment(
638
- "expected",
639
- ts.factory.createStringLiteral(expected),
640
- ),
641
- ts.factory.createPropertyAssignment("value", value),
642
- ],
643
- true,
644
- ),
645
- ],
646
- ),
647
- );
648
- }
1
+ import ts from "typescript";
2
+
3
+ import { ExpressionFactory } from "../../factories/ExpressionFactory";
4
+ import { IdentifierFactory } from "../../factories/IdentifierFactory";
5
+ import { MetadataCollection } from "../../factories/MetadataCollection";
6
+ import { MetadataFactory } from "../../factories/MetadataFactory";
7
+ import { StatementFactory } from "../../factories/StatementFactory";
8
+ import { TypeFactory } from "../../factories/TypeFactory";
9
+
10
+ import { Metadata } from "../../schemas/metadata/Metadata";
11
+ import { MetadataArray } from "../../schemas/metadata/MetadataArray";
12
+ import { MetadataTuple } from "../../schemas/metadata/MetadataTuple";
13
+ import { MetadataTupleType } from "../../schemas/metadata/MetadataTupleType";
14
+
15
+ import { IProject } from "../../transformers/IProject";
16
+ import { TransformerError } from "../../transformers/TransformerError";
17
+
18
+ import { StringUtil } from "../../utils/StringUtil";
19
+
20
+ import { FeatureProgrammer } from "../FeatureProgrammer";
21
+ import { IsProgrammer } from "../IsProgrammer";
22
+ import { FunctionImporter } from "../helpers/FunctionImporter";
23
+ import { NotationJoiner } from "../helpers/NotationJoiner";
24
+ import { UnionExplorer } from "../helpers/UnionExplorer";
25
+ import { decode_union_object } from "../internal/decode_union_object";
26
+ import { postfix_of_tuple } from "../internal/postfix_of_tuple";
27
+ import { wrap_metadata_rest_tuple } from "../internal/wrap_metadata_rest_tuple";
28
+
29
+ export namespace NotationGeneralProgrammer {
30
+ export const returnType =
31
+ (rename: (str: string) => string) => (type: string) =>
32
+ `typia.${StringUtil.capitalize(rename.name)}Case<${type}>`;
33
+
34
+ export const decompose = (props: {
35
+ rename: (str: string) => string;
36
+ validated: boolean;
37
+ project: IProject;
38
+ importer: FunctionImporter;
39
+ type: ts.Type;
40
+ name?: string;
41
+ }): FeatureProgrammer.IDecomposed => {
42
+ const config = configure(props.rename)(props.project)(props.importer);
43
+ if (props.validated === false)
44
+ config.addition = (collection) =>
45
+ IsProgrammer.write_function_statements(props.project)(props.importer)(
46
+ collection,
47
+ );
48
+ const composed: FeatureProgrammer.IComposed = FeatureProgrammer.compose({
49
+ ...props,
50
+ config,
51
+ });
52
+ return {
53
+ functions: composed.functions,
54
+ statements: composed.statements,
55
+ arrow: ts.factory.createArrowFunction(
56
+ undefined,
57
+ undefined,
58
+ composed.parameters,
59
+ TypeFactory.keyword("void"),
60
+ undefined,
61
+ composed.body,
62
+ ),
63
+ };
64
+ };
65
+
66
+ export const write =
67
+ (rename: (str: string) => string) =>
68
+ (project: IProject) =>
69
+ (modulo: ts.LeftHandSideExpression) =>
70
+ (type: ts.Type, name?: string) => {
71
+ const importer: FunctionImporter = new FunctionImporter(modulo.getText());
72
+ const result: FeatureProgrammer.IDecomposed = decompose({
73
+ rename,
74
+ validated: true,
75
+ project,
76
+ importer,
77
+ type,
78
+ name,
79
+ });
80
+ return FeatureProgrammer.writeDecomposed({
81
+ importer,
82
+ modulo,
83
+ result,
84
+ });
85
+ };
86
+
87
+ const write_array_functions =
88
+ (config: FeatureProgrammer.IConfig) =>
89
+ (importer: FunctionImporter) =>
90
+ (collection: MetadataCollection): ts.VariableStatement[] =>
91
+ collection
92
+ .arrays()
93
+ .filter((a) => a.recursive)
94
+ .map((type, i) =>
95
+ StatementFactory.constant(
96
+ `${config.prefix}a${i}`,
97
+ ts.factory.createArrowFunction(
98
+ undefined,
99
+ undefined,
100
+ FeatureProgrammer.parameterDeclarations(config)(
101
+ TypeFactory.keyword("any"),
102
+ )(ts.factory.createIdentifier("input")),
103
+ TypeFactory.keyword("any"),
104
+ undefined,
105
+ decode_array_inline(config)(importer)(
106
+ ts.factory.createIdentifier("input"),
107
+ MetadataArray.create({
108
+ type,
109
+ tags: [],
110
+ }),
111
+ {
112
+ tracable: config.trace,
113
+ source: "function",
114
+ from: "array",
115
+ postfix: "",
116
+ },
117
+ ),
118
+ ),
119
+ ),
120
+ );
121
+
122
+ const write_tuple_functions =
123
+ (project: IProject) =>
124
+ (config: FeatureProgrammer.IConfig) =>
125
+ (importer: FunctionImporter) =>
126
+ (collection: MetadataCollection): ts.VariableStatement[] =>
127
+ collection
128
+ .tuples()
129
+ .filter((t) => t.recursive)
130
+ .map((tuple, i) =>
131
+ StatementFactory.constant(
132
+ `${config.prefix}t${i}`,
133
+ ts.factory.createArrowFunction(
134
+ undefined,
135
+ undefined,
136
+ FeatureProgrammer.parameterDeclarations(config)(
137
+ TypeFactory.keyword("any"),
138
+ )(ts.factory.createIdentifier("input")),
139
+ TypeFactory.keyword("any"),
140
+ undefined,
141
+ decode_tuple_inline(project)(config)(importer)(
142
+ ts.factory.createIdentifier("input"),
143
+ tuple,
144
+ {
145
+ tracable: config.trace,
146
+ source: "function",
147
+ from: "array",
148
+ postfix: "",
149
+ },
150
+ ),
151
+ ),
152
+ ),
153
+ );
154
+
155
+ /* -----------------------------------------------------------
156
+ DECODERS
157
+ ----------------------------------------------------------- */
158
+ const decode =
159
+ (project: IProject) =>
160
+ (config: FeatureProgrammer.IConfig) =>
161
+ (importer: FunctionImporter) =>
162
+ (
163
+ input: ts.Expression,
164
+ meta: Metadata,
165
+ explore: FeatureProgrammer.IExplore,
166
+ ): ts.Expression => {
167
+ // ANY TYPE
168
+ if (
169
+ meta.any ||
170
+ meta.arrays.some((a) => a.type.value.any) ||
171
+ meta.tuples.some(
172
+ (t) =>
173
+ !!t.type.elements.length && t.type.elements.every((e) => e.any),
174
+ )
175
+ )
176
+ return ts.factory.createCallExpression(importer.use("any"), undefined, [
177
+ input,
178
+ ]);
179
+
180
+ interface IUnion {
181
+ type: string;
182
+ is: () => ts.Expression;
183
+ value: () => ts.Expression;
184
+ }
185
+ const unions: IUnion[] = [];
186
+
187
+ //----
188
+ // LIST UP UNION TYPES
189
+ //----
190
+ // FUNCTIONAL
191
+ if (meta.functional)
192
+ unions.push({
193
+ type: "functional",
194
+ is: () =>
195
+ ts.factory.createStrictEquality(
196
+ ts.factory.createStringLiteral("function"),
197
+ ts.factory.createTypeOfExpression(input),
198
+ ),
199
+ value: () => ts.factory.createIdentifier("undefined"),
200
+ });
201
+
202
+ // TUPLES
203
+ for (const tuple of meta.tuples)
204
+ unions.push({
205
+ type: "tuple",
206
+ is: () =>
207
+ IsProgrammer.decode(project)(importer)(
208
+ input,
209
+ (() => {
210
+ const partial = Metadata.initialize();
211
+ partial.tuples.push(tuple);
212
+ return partial;
213
+ })(),
214
+ explore,
215
+ ),
216
+ value: () =>
217
+ decode_tuple(project)(config)(importer)(input, tuple, explore),
218
+ });
219
+
220
+ // ARRAYS
221
+ if (meta.arrays.length)
222
+ unions.push({
223
+ type: "array",
224
+ is: () => ExpressionFactory.isArray(input),
225
+ value: () =>
226
+ explore_arrays(project)(config)(importer)(input, meta.arrays, {
227
+ ...explore,
228
+ from: "array",
229
+ }),
230
+ });
231
+
232
+ // NATIVE TYPES
233
+ if (meta.sets.length)
234
+ unions.push({
235
+ type: "set",
236
+ is: () => ExpressionFactory.isInstanceOf("Set")(input),
237
+ value: () =>
238
+ explore_sets(project)(config)(importer)(input, meta.sets, {
239
+ ...explore,
240
+ from: "array",
241
+ }),
242
+ });
243
+ if (meta.maps.length)
244
+ unions.push({
245
+ type: "map",
246
+ is: () => ExpressionFactory.isInstanceOf("Map")(input),
247
+ value: () =>
248
+ explore_maps(project)(config)(importer)(input, meta.maps, {
249
+ ...explore,
250
+ from: "array",
251
+ }),
252
+ });
253
+ for (const native of meta.natives) {
254
+ if (native === "WeakSet" || native === "WeakMap") continue;
255
+ unions.push({
256
+ type: "native",
257
+ is: () => ExpressionFactory.isInstanceOf(native)(input),
258
+ value: () =>
259
+ native === "Boolean" || native === "Number" || native === "String"
260
+ ? ts.factory.createCallExpression(
261
+ IdentifierFactory.access(input)("valueOf"),
262
+ undefined,
263
+ undefined,
264
+ )
265
+ : decode_native(native)(input),
266
+ });
267
+ }
268
+
269
+ // OBJECTS
270
+ if (meta.objects.length)
271
+ unions.push({
272
+ type: "object",
273
+ is: () =>
274
+ ExpressionFactory.isObject({
275
+ checkNull: true,
276
+ checkArray: false,
277
+ })(input),
278
+ value: () =>
279
+ explore_objects(config)(importer)(input, meta, {
280
+ ...explore,
281
+ from: "object",
282
+ }),
283
+ });
284
+
285
+ // COMPOSITION
286
+ let last: ts.Expression = input;
287
+ for (const u of unions.reverse())
288
+ last = ts.factory.createConditionalExpression(
289
+ u.is(),
290
+ undefined,
291
+ u.value(),
292
+ undefined,
293
+ last,
294
+ );
295
+ return ts.factory.createAsExpression(last, TypeFactory.keyword("any"));
296
+ };
297
+
298
+ const decode_object = (importer: FunctionImporter) =>
299
+ FeatureProgrammer.decode_object({
300
+ trace: false,
301
+ path: false,
302
+ prefix: PREFIX,
303
+ })(importer);
304
+
305
+ const decode_array =
306
+ (config: FeatureProgrammer.IConfig) =>
307
+ (importer: FunctionImporter) =>
308
+ (
309
+ input: ts.Expression,
310
+ array: MetadataArray,
311
+ explore: FeatureProgrammer.IExplore,
312
+ ) =>
313
+ array.type.recursive
314
+ ? ts.factory.createCallExpression(
315
+ ts.factory.createIdentifier(
316
+ importer.useLocal(`${config.prefix}a${array.type.index}`),
317
+ ),
318
+ undefined,
319
+ FeatureProgrammer.argumentsArray(config)({
320
+ ...explore,
321
+ source: "function",
322
+ from: "array",
323
+ })(input),
324
+ )
325
+ : decode_array_inline(config)(importer)(input, array, explore);
326
+
327
+ const decode_array_inline =
328
+ (config: FeatureProgrammer.IConfig) =>
329
+ (importer: FunctionImporter) =>
330
+ (
331
+ input: ts.Expression,
332
+ array: MetadataArray,
333
+ explore: FeatureProgrammer.IExplore,
334
+ ) =>
335
+ FeatureProgrammer.decode_array(config)(importer)(NotationJoiner.array)(
336
+ input,
337
+ array,
338
+ explore,
339
+ );
340
+
341
+ const decode_tuple =
342
+ (project: IProject) =>
343
+ (config: FeatureProgrammer.IConfig) =>
344
+ (importer: FunctionImporter) =>
345
+ (
346
+ input: ts.Expression,
347
+ tuple: MetadataTuple,
348
+ explore: FeatureProgrammer.IExplore,
349
+ ): ts.Expression =>
350
+ tuple.type.recursive
351
+ ? ts.factory.createCallExpression(
352
+ ts.factory.createIdentifier(
353
+ importer.useLocal(`${config.prefix}t${tuple.type.index}`),
354
+ ),
355
+ undefined,
356
+ FeatureProgrammer.argumentsArray(config)({
357
+ ...explore,
358
+ source: "function",
359
+ })(input),
360
+ )
361
+ : decode_tuple_inline(project)(config)(importer)(
362
+ input,
363
+ tuple.type,
364
+ explore,
365
+ );
366
+
367
+ const decode_tuple_inline =
368
+ (project: IProject) =>
369
+ (config: FeatureProgrammer.IConfig) =>
370
+ (importer: FunctionImporter) =>
371
+ (
372
+ input: ts.Expression,
373
+ tuple: MetadataTupleType,
374
+ explore: FeatureProgrammer.IExplore,
375
+ ): ts.Expression => {
376
+ const children: ts.Expression[] = tuple.elements
377
+ .filter((m) => m.rest === null)
378
+ .map((elem, index) =>
379
+ decode(project)(config)(importer)(
380
+ ts.factory.createElementAccessExpression(input, index),
381
+ elem,
382
+ {
383
+ ...explore,
384
+ from: "array",
385
+ postfix: explore.postfix.length
386
+ ? `${postfix_of_tuple(explore.postfix)}[${index}]"`
387
+ : `"[${index}]"`,
388
+ },
389
+ ),
390
+ );
391
+ const rest = (() => {
392
+ if (tuple.elements.length === 0) return null;
393
+
394
+ const last: Metadata = tuple.elements.at(-1)!;
395
+ const rest: Metadata | null = last.rest;
396
+ if (rest === null) return null;
397
+
398
+ return decode(project)(config)(importer)(
399
+ ts.factory.createCallExpression(
400
+ IdentifierFactory.access(input)("slice"),
401
+ undefined,
402
+ [ExpressionFactory.number(tuple.elements.length - 1)],
403
+ ),
404
+ wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!),
405
+ {
406
+ ...explore,
407
+ start: tuple.elements.length - 1,
408
+ },
409
+ );
410
+ })();
411
+ return NotationJoiner.tuple(children, rest);
412
+ };
413
+
414
+ /* -----------------------------------------------------------
415
+ NATIVE CLASSES
416
+ ----------------------------------------------------------- */
417
+ const decode_native = (type: string) => (input: ts.Expression) =>
418
+ type === "Date"
419
+ ? ts.factory.createNewExpression(
420
+ ts.factory.createIdentifier(type),
421
+ undefined,
422
+ [input],
423
+ )
424
+ : input;
425
+
426
+ /* -----------------------------------------------------------
427
+ EXPLORERS FOR UNION TYPES
428
+ ----------------------------------------------------------- */
429
+ const explore_sets =
430
+ (project: IProject) =>
431
+ (config: FeatureProgrammer.IConfig) =>
432
+ (importer: FunctionImporter) =>
433
+ (
434
+ input: ts.Expression,
435
+ sets: Metadata[],
436
+ explore: FeatureProgrammer.IExplore,
437
+ ): ts.Expression =>
438
+ ts.factory.createCallExpression(
439
+ UnionExplorer.set({
440
+ checker: IsProgrammer.decode(project)(importer),
441
+ decoder: (input, array, explore) =>
442
+ ts.factory.createNewExpression(
443
+ ts.factory.createIdentifier("Set"),
444
+ [TypeFactory.keyword("any")],
445
+ [decode_array(config)(importer)(input, array, explore)],
446
+ ),
447
+ empty: ts.factory.createNewExpression(
448
+ ts.factory.createIdentifier("Set"),
449
+ [TypeFactory.keyword("any")],
450
+ [],
451
+ ),
452
+ success: ts.factory.createTrue(),
453
+ failure: (input, expected) =>
454
+ create_throw_error(importer)(expected)(input),
455
+ })([])(input, sets, explore),
456
+ undefined,
457
+ undefined,
458
+ );
459
+
460
+ const explore_maps =
461
+ (project: IProject) =>
462
+ (config: FeatureProgrammer.IConfig) =>
463
+ (importer: FunctionImporter) =>
464
+ (
465
+ input: ts.Expression,
466
+ maps: Metadata.Entry[],
467
+ explore: FeatureProgrammer.IExplore,
468
+ ): ts.Expression =>
469
+ ts.factory.createCallExpression(
470
+ UnionExplorer.map({
471
+ checker: (top, entry, explore) => {
472
+ const func = IsProgrammer.decode(project)(importer);
473
+ return ts.factory.createLogicalAnd(
474
+ func(ts.factory.createElementAccessExpression(top, 0), entry[0], {
475
+ ...explore,
476
+ postfix: `${explore.postfix}[0]`,
477
+ }),
478
+ func(ts.factory.createElementAccessExpression(top, 1), entry[1], {
479
+ ...explore,
480
+ postfix: `${explore.postfix}[1]`,
481
+ }),
482
+ );
483
+ },
484
+ decoder: (input, array, explore) =>
485
+ ts.factory.createNewExpression(
486
+ ts.factory.createIdentifier("Map"),
487
+ [TypeFactory.keyword("any"), TypeFactory.keyword("any")],
488
+ [decode_array(config)(importer)(input, array, explore)],
489
+ ),
490
+ empty: ts.factory.createNewExpression(
491
+ ts.factory.createIdentifier("Map"),
492
+ [TypeFactory.keyword("any"), TypeFactory.keyword("any")],
493
+ [],
494
+ ),
495
+ success: ts.factory.createTrue(),
496
+ failure: (input, expected) =>
497
+ create_throw_error(importer)(expected)(input),
498
+ })([])(input, maps, explore),
499
+ undefined,
500
+ undefined,
501
+ );
502
+
503
+ const explore_objects =
504
+ (config: FeatureProgrammer.IConfig) =>
505
+ (importer: FunctionImporter) =>
506
+ (
507
+ input: ts.Expression,
508
+ meta: Metadata,
509
+ explore: FeatureProgrammer.IExplore,
510
+ ) => {
511
+ if (meta.objects.length === 1)
512
+ return decode_object(importer)(input, meta.objects[0]!, explore);
513
+
514
+ return ts.factory.createCallExpression(
515
+ ts.factory.createIdentifier(
516
+ importer.useLocal(`${PREFIX}u${meta.union_index!}`),
517
+ ),
518
+ undefined,
519
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
520
+ );
521
+ };
522
+
523
+ const explore_arrays =
524
+ (project: IProject) =>
525
+ (config: FeatureProgrammer.IConfig) =>
526
+ (importer: FunctionImporter) =>
527
+ (
528
+ input: ts.Expression,
529
+ elements: MetadataArray[],
530
+ explore: FeatureProgrammer.IExplore,
531
+ ): ts.Expression =>
532
+ explore_array_like_union_types(config)(importer)(
533
+ UnionExplorer.array({
534
+ checker: IsProgrammer.decode(project)(importer),
535
+ decoder: decode_array(config)(importer),
536
+ empty: ts.factory.createIdentifier("[]"),
537
+ success: ts.factory.createTrue(),
538
+ failure: (input, expected) =>
539
+ create_throw_error(importer)(expected)(input),
540
+ }),
541
+ )(input, elements, explore);
542
+
543
+ const explore_array_like_union_types =
544
+ (config: FeatureProgrammer.IConfig) =>
545
+ (importer: FunctionImporter) =>
546
+ <T extends MetadataArray | MetadataTuple>(
547
+ factory: (
548
+ parameters: ts.ParameterDeclaration[],
549
+ ) => (
550
+ input: ts.Expression,
551
+ elements: T[],
552
+ explore: FeatureProgrammer.IExplore,
553
+ ) => ts.ArrowFunction,
554
+ ) =>
555
+ (
556
+ input: ts.Expression,
557
+ elements: T[],
558
+ explore: FeatureProgrammer.IExplore,
559
+ ): ts.Expression => {
560
+ const arrow =
561
+ (parameters: ts.ParameterDeclaration[]) =>
562
+ (explore: FeatureProgrammer.IExplore) =>
563
+ (input: ts.Expression): ts.ArrowFunction =>
564
+ factory(parameters)(input, elements, explore);
565
+ if (elements.every((e) => e.type.recursive === false))
566
+ ts.factory.createCallExpression(
567
+ arrow([])(explore)(input),
568
+ undefined,
569
+ [],
570
+ );
571
+
572
+ explore = {
573
+ ...explore,
574
+ source: "function",
575
+ from: "array",
576
+ };
577
+ return ts.factory.createCallExpression(
578
+ ts.factory.createIdentifier(
579
+ importer.emplaceUnion(
580
+ config.prefix,
581
+ elements.map((e) => e.type.name).join(" | "),
582
+ () =>
583
+ arrow(
584
+ FeatureProgrammer.parameterDeclarations(config)(
585
+ TypeFactory.keyword("any"),
586
+ )(ts.factory.createIdentifier("input")),
587
+ )({
588
+ ...explore,
589
+ postfix: "",
590
+ })(ts.factory.createIdentifier("input")),
591
+ ),
592
+ ),
593
+ undefined,
594
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
595
+ );
596
+ };
597
+
598
+ /* -----------------------------------------------------------
599
+ CONFIGURATIONS
600
+ ----------------------------------------------------------- */
601
+ const PREFIX = "$c";
602
+
603
+ const configure =
604
+ (rename: (str: string) => string) =>
605
+ (project: IProject) =>
606
+ (importer: FunctionImporter): FeatureProgrammer.IConfig => {
607
+ const config: FeatureProgrammer.IConfig = {
608
+ types: {
609
+ input: (type, name) =>
610
+ ts.factory.createTypeReferenceNode(
611
+ name ?? TypeFactory.getFullName(project.checker)(type),
612
+ ),
613
+ output: (type, name) =>
614
+ ts.factory.createTypeReferenceNode(
615
+ returnType(rename)(
616
+ name ?? TypeFactory.getFullName(project.checker)(type),
617
+ ),
618
+ ),
619
+ },
620
+ prefix: PREFIX,
621
+ trace: false,
622
+ path: false,
623
+ initializer,
624
+ decoder: () => decode(project)(config)(importer),
625
+ objector: {
626
+ checker: () => IsProgrammer.decode(project)(importer),
627
+ decoder: () => decode_object(importer),
628
+ joiner: NotationJoiner.object(rename),
629
+ unionizer: decode_union_object(
630
+ IsProgrammer.decode_object(project)(importer),
631
+ )(decode_object(importer))((exp) => exp)((input, expected) =>
632
+ create_throw_error(importer)(expected)(input),
633
+ ),
634
+ failure: (input, expected) =>
635
+ create_throw_error(importer)(expected)(input),
636
+ },
637
+ generator: {
638
+ arrays: () => write_array_functions(config)(importer),
639
+ tuples: () => write_tuple_functions(project)(config)(importer),
640
+ },
641
+ };
642
+ return config;
643
+ };
644
+
645
+ const initializer: FeatureProgrammer.IConfig["initializer"] =
646
+ (project) => (importer) => (type) => {
647
+ const collection = new MetadataCollection();
648
+ const result = MetadataFactory.analyze(
649
+ project.checker,
650
+ project.context,
651
+ )({
652
+ escape: false,
653
+ constant: true,
654
+ absorb: true,
655
+ })(collection)(type);
656
+ if (result.success === false)
657
+ throw TransformerError.from(`typia.misc.${importer.method}`)(
658
+ result.errors,
659
+ );
660
+ return [collection, result.data];
661
+ };
662
+
663
+ const create_throw_error =
664
+ (importer: FunctionImporter) =>
665
+ (expected: string) =>
666
+ (value: ts.Expression) =>
667
+ ts.factory.createExpressionStatement(
668
+ ts.factory.createCallExpression(
669
+ importer.use("throws"),
670
+ [],
671
+ [
672
+ ts.factory.createObjectLiteralExpression(
673
+ [
674
+ ts.factory.createPropertyAssignment(
675
+ "expected",
676
+ ts.factory.createStringLiteral(expected),
677
+ ),
678
+ ts.factory.createPropertyAssignment("value", value),
679
+ ],
680
+ true,
681
+ ),
682
+ ],
683
+ ),
684
+ );
685
+ }