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