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,901 +1,910 @@
1
- import ts from "typescript";
2
-
3
- import { ExpressionFactory } from "../../factories/ExpressionFactory";
4
- import { IdentifierFactory } from "../../factories/IdentifierFactory";
5
- import { JsonMetadataFactory } from "../../factories/JsonMetadataFactory";
6
- import { MetadataCollection } from "../../factories/MetadataCollection";
7
- import { StatementFactory } from "../../factories/StatementFactory";
8
- import { TypeFactory } from "../../factories/TypeFactory";
9
- import { ValueFactory } from "../../factories/ValueFactory";
10
-
11
- import { Metadata } from "../../schemas/metadata/Metadata";
12
- import { MetadataArray } from "../../schemas/metadata/MetadataArray";
13
- import { MetadataAtomic } from "../../schemas/metadata/MetadataAtomic";
14
- import { MetadataObject } from "../../schemas/metadata/MetadataObject";
15
- import { MetadataTuple } from "../../schemas/metadata/MetadataTuple";
16
- import { MetadataTupleType } from "../../schemas/metadata/MetadataTupleType";
17
-
18
- import { IProject } from "../../transformers/IProject";
19
-
20
- import { Atomic } from "../../typings/Atomic";
21
-
22
- import { ArrayUtil } from "../../utils/ArrayUtil";
23
-
24
- import { FeatureProgrammer } from "../FeatureProgrammer";
25
- import { IsProgrammer } from "../IsProgrammer";
26
- import { AtomicPredicator } from "../helpers/AtomicPredicator";
27
- import { FunctionImporter } from "../helpers/FunctionImporter";
28
- import { IExpressionEntry } from "../helpers/IExpressionEntry";
29
- import { OptionPredicator } from "../helpers/OptionPredicator";
30
- import { StringifyJoiner } from "../helpers/StringifyJoinder";
31
- import { StringifyPredicator } from "../helpers/StringifyPredicator";
32
- import { UnionExplorer } from "../helpers/UnionExplorer";
33
- import { check_native } from "../internal/check_native";
34
- import { decode_union_object } from "../internal/decode_union_object";
35
- import { feature_object_entries } from "../internal/feature_object_entries";
36
- import { postfix_of_tuple } from "../internal/postfix_of_tuple";
37
- import { wrap_metadata_rest_tuple } from "../internal/wrap_metadata_rest_tuple";
38
-
39
- export namespace JsonStringifyProgrammer {
40
- /* -----------------------------------------------------------
41
- WRITER
42
- ----------------------------------------------------------- */
43
- export const write =
44
- (project: IProject) => (modulo: ts.LeftHandSideExpression) => {
45
- const importer: FunctionImporter = new FunctionImporter(modulo.getText());
46
- const config: FeatureProgrammer.IConfig = configure(project)(importer);
47
-
48
- return FeatureProgrammer.write(project)({
49
- ...config,
50
- addition: (collection) => [
51
- ...IsProgrammer.write_function_statements(project)(importer)(
52
- collection,
53
- ),
54
- ...importer.declare(modulo),
55
- ],
56
- })(importer);
57
- };
58
-
59
- const write_array_functions =
60
- (config: FeatureProgrammer.IConfig) =>
61
- (importer: FunctionImporter) =>
62
- (collection: MetadataCollection): ts.VariableStatement[] =>
63
- collection
64
- .arrays()
65
- .filter((a) => a.recursive)
66
- .map((type, i) =>
67
- StatementFactory.constant(
68
- `${config.prefix}a${i}`,
69
- ts.factory.createArrowFunction(
70
- undefined,
71
- undefined,
72
- FeatureProgrammer.parameterDeclarations(config)(
73
- TypeFactory.keyword("any"),
74
- )(ts.factory.createIdentifier("input")),
75
- TypeFactory.keyword("any"),
76
- undefined,
77
- decode_array_inline(config)(importer)(
78
- ts.factory.createIdentifier("input"),
79
- MetadataArray.create({
80
- type,
81
- tags: [],
82
- }),
83
- {
84
- tracable: config.trace,
85
- source: "function",
86
- from: "array",
87
- postfix: "",
88
- },
89
- ),
90
- ),
91
- ),
92
- );
93
-
94
- const write_tuple_functions =
95
- (project: IProject) =>
96
- (config: FeatureProgrammer.IConfig) =>
97
- (importer: FunctionImporter) =>
98
- (collection: MetadataCollection): ts.VariableStatement[] =>
99
- collection
100
- .tuples()
101
- .filter((t) => t.recursive)
102
- .map((tuple, i) =>
103
- StatementFactory.constant(
104
- `${config.prefix}t${i}`,
105
- ts.factory.createArrowFunction(
106
- undefined,
107
- undefined,
108
- FeatureProgrammer.parameterDeclarations(config)(
109
- TypeFactory.keyword("any"),
110
- )(ts.factory.createIdentifier("input")),
111
- TypeFactory.keyword("any"),
112
- undefined,
113
- decode_tuple_inline(project)(config)(importer)(
114
- ts.factory.createIdentifier("input"),
115
- tuple,
116
- {
117
- tracable: config.trace,
118
- source: "function",
119
- from: "array",
120
- postfix: "",
121
- },
122
- ),
123
- ),
124
- ),
125
- );
126
-
127
- /* -----------------------------------------------------------
128
- DECODERS
129
- ----------------------------------------------------------- */
130
- const decode =
131
- (project: IProject) =>
132
- (config: FeatureProgrammer.IConfig) =>
133
- (importer: FunctionImporter) =>
134
- (
135
- input: ts.Expression,
136
- meta: Metadata,
137
- explore: FeatureProgrammer.IExplore,
138
- ): ts.Expression => {
139
- // ANY TYPE
140
- if (meta.any === true)
141
- return wrap_required(
142
- input,
143
- meta,
144
- explore,
145
- )(
146
- wrap_functional(
147
- input,
148
- meta,
149
- explore,
150
- )(
151
- ts.factory.createCallExpression(
152
- ts.factory.createIdentifier("JSON.stringify"),
153
- undefined,
154
- [input],
155
- ),
156
- ),
157
- );
158
-
159
- // ONLY NULL OR UNDEFINED
160
- const size: number = meta.size();
161
- if (
162
- size === 0 &&
163
- (meta.isRequired() === false || meta.nullable === true)
164
- ) {
165
- if (meta.isRequired() === false && meta.nullable === true)
166
- return explore.from === "array"
167
- ? ts.factory.createStringLiteral("null")
168
- : ts.factory.createConditionalExpression(
169
- ts.factory.createStrictEquality(ts.factory.createNull(), input),
170
- undefined,
171
- ts.factory.createStringLiteral("null"),
172
- undefined,
173
- ts.factory.createIdentifier("undefined"),
174
- );
175
- else if (meta.isRequired() === false)
176
- return explore.from === "array"
177
- ? ts.factory.createStringLiteral("null")
178
- : ts.factory.createIdentifier("undefined");
179
- else return ts.factory.createStringLiteral("null");
180
- }
181
-
182
- //----
183
- // LIST UP UNION TYPES
184
- //----
185
- const unions: IUnion[] = [];
186
-
187
- // toJSON() METHOD
188
- if (meta.escaped !== null)
189
- unions.push({
190
- type: "resolved",
191
- is:
192
- meta.escaped.original.size() === 1 &&
193
- meta.escaped.original.natives[0] === "Date"
194
- ? () => check_native("Date")(input)
195
- : () => IsProgrammer.decode_to_json(false)(input),
196
- value: () =>
197
- decode_to_json(project)(config)(importer)(
198
- input,
199
- meta.escaped!.returns,
200
- explore,
201
- ),
202
- });
203
- else if (meta.functional === true)
204
- unions.push({
205
- type: "functional",
206
- is: () => IsProgrammer.decode_functional(input),
207
- value: () => decode_functional(explore),
208
- });
209
-
210
- // TEMPLATES
211
- if (
212
- meta.templates.length ||
213
- ArrayUtil.has(meta.constants, (c) => c.type === "string")
214
- )
215
- if (AtomicPredicator.template(meta)) {
216
- const partial = Metadata.initialize();
217
- partial.atomics.push(
218
- MetadataAtomic.create({ type: "string", tags: [] }),
219
- ),
220
- unions.push({
221
- type: "template literal",
222
- is: () =>
223
- IsProgrammer.decode(project)(importer)(input, partial, explore),
224
- value: () =>
225
- decode_atomic(project)(importer)(input, "string", explore),
226
- });
227
- }
228
-
229
- // CONSTANTS
230
- for (const constant of meta.constants)
231
- if (AtomicPredicator.constant(meta)(constant.type) === false) continue;
232
- else if (constant.type !== "string")
233
- unions.push({
234
- type: "atomic",
235
- is: () =>
236
- IsProgrammer.decode(project)(importer)(
237
- input,
238
- (() => {
239
- const partial = Metadata.initialize();
240
- partial.atomics.push(
241
- MetadataAtomic.create({
242
- type: constant.type,
243
- tags: [],
244
- }),
245
- );
246
- return partial;
247
- })(),
248
- explore,
249
- ),
250
- value: () =>
251
- decode_atomic(project)(importer)(input, constant.type, explore),
252
- });
253
- else if (meta.templates.length === 0)
254
- unions.push({
255
- type: "const string",
256
- is: () =>
257
- IsProgrammer.decode(project)(importer)(
258
- input,
259
- (() => {
260
- const partial = Metadata.initialize();
261
- partial.atomics.push(
262
- MetadataAtomic.create({
263
- type: "string",
264
- tags: [],
265
- }),
266
- );
267
- return partial;
268
- })(),
269
- explore,
270
- ),
271
- value: () =>
272
- decode_constant_string(project)(importer)(
273
- input,
274
- [...constant.values.map((v) => v.value)] as string[],
275
- explore,
276
- ),
277
- });
278
-
279
- /// ATOMICS
280
- for (const a of meta.atomics)
281
- if (AtomicPredicator.atomic(meta)(a.type))
282
- unions.push({
283
- type: "atomic",
284
- is: () =>
285
- IsProgrammer.decode(project)(importer)(
286
- input,
287
- (() => {
288
- const partial = Metadata.initialize();
289
- partial.atomics.push(a);
290
- return partial;
291
- })(),
292
- explore,
293
- ),
294
- value: () =>
295
- decode_atomic(project)(importer)(input, a.type, explore),
296
- });
297
-
298
- // TUPLES
299
- for (const tuple of meta.tuples)
300
- unions.push({
301
- type: "tuple",
302
- is: () =>
303
- IsProgrammer.decode(project)(importer)(
304
- input,
305
- (() => {
306
- const partial = Metadata.initialize();
307
- partial.tuples.push(tuple);
308
- return partial;
309
- })(),
310
- explore,
311
- ),
312
- value: () =>
313
- decode_tuple(project)(config)(importer)(input, tuple, explore),
314
- });
315
-
316
- // ARRAYS
317
- if (meta.arrays.length) {
318
- const value: () => ts.Expression =
319
- meta.arrays.length === 1
320
- ? () =>
321
- decode_array(config)(importer)(input, meta.arrays[0]!, {
322
- ...explore,
323
- from: "array",
324
- })
325
- : meta.arrays.some((elem) => elem.type.value.any)
326
- ? () =>
327
- ts.factory.createCallExpression(
328
- ts.factory.createIdentifier("JSON.stringify"),
329
- undefined,
330
- [input],
331
- )
332
- : () =>
333
- explore_arrays(project)(config)(importer)(
334
- input,
335
- meta.arrays,
336
- {
337
- ...explore,
338
- from: "array",
339
- },
340
- );
341
-
342
- unions.push({
343
- type: "array",
344
- is: () => ExpressionFactory.isArray(input),
345
- value,
346
- });
347
- }
348
-
349
- // BUILT-IN CLASSES
350
- if (meta.natives.length)
351
- for (const native of meta.natives)
352
- unions.push({
353
- type: "object",
354
- is: () => check_native(native)(input),
355
- value: () =>
356
- AtomicPredicator.native(native)
357
- ? decode_atomic(project)(importer)(
358
- input,
359
- native.toLowerCase() as Atomic.Literal,
360
- explore,
361
- )
362
- : ts.factory.createStringLiteral("{}"),
363
- });
364
-
365
- // SETS
366
- if (meta.sets.length)
367
- unions.push({
368
- type: "object",
369
- is: () => ExpressionFactory.isInstanceOf("Set")(input),
370
- value: () => ts.factory.createStringLiteral("{}"),
371
- });
372
-
373
- // MAPS
374
- if (meta.maps.length)
375
- unions.push({
376
- type: "object",
377
- is: () => ExpressionFactory.isInstanceOf("Map")(input),
378
- value: () => ts.factory.createStringLiteral("{}"),
379
- });
380
-
381
- // OBJECTS
382
- if (meta.objects.length)
383
- unions.push({
384
- type: "object",
385
- is: () =>
386
- ExpressionFactory.isObject({
387
- checkNull: true,
388
- checkArray: meta.objects.some((obj) =>
389
- obj.properties.every(
390
- (prop) =>
391
- !prop.key.isSoleLiteral() || !prop.value.isRequired(),
392
- ),
393
- ),
394
- })(input),
395
- value: () =>
396
- meta.isParentResolved() === false &&
397
- meta.objects.length === 1 &&
398
- meta.objects[0]!.isPlain(explore.from === "top" ? 0 : 1)
399
- ? (() => {
400
- const obj: MetadataObject = meta.objects[0]!;
401
- const entries: IExpressionEntry<ts.Expression>[] =
402
- feature_object_entries({
403
- decoder: () => decode(project)(config)(importer),
404
- trace: false,
405
- path: false,
406
- })(importer)(obj)(
407
- ts.factory.createAsExpression(
408
- input,
409
- TypeFactory.keyword("any"),
410
- ),
411
- );
412
- return StringifyJoiner.object(importer)(
413
- ts.factory.createAsExpression(
414
- input,
415
- TypeFactory.keyword("any"),
416
- ),
417
- entries,
418
- );
419
- })()
420
- : explore_objects(config)(importer)(input, meta, {
421
- ...explore,
422
- from: "object",
423
- }),
424
- });
425
-
426
- //----
427
- // RETURNS
428
- //----
429
- // CHECK NULL AND UNDEFINED
430
- const wrapper = (output: ts.Expression) =>
431
- wrap_required(input, meta, explore)(wrap_nullable(input, meta)(output));
432
-
433
- // DIRECT RETURN
434
- if (unions.length === 0)
435
- return ts.factory.createCallExpression(
436
- ts.factory.createIdentifier("JSON.stringify"),
437
- undefined,
438
- [input],
439
- );
440
- else if (unions.length === 1) return wrapper(unions[0]!.value());
441
-
442
- // RETURN WITH TYPE CHECKING
443
- return wrapper(
444
- ts.factory.createCallExpression(
445
- ts.factory.createArrowFunction(
446
- undefined,
447
- undefined,
448
- [],
449
- undefined,
450
- undefined,
451
- iterate(importer, input, unions, meta.getName()),
452
- ),
453
- undefined,
454
- undefined,
455
- ),
456
- );
457
- };
458
-
459
- const decode_object = (importer: FunctionImporter) =>
460
- FeatureProgrammer.decode_object({
461
- trace: false,
462
- path: false,
463
- prefix: PREFIX,
464
- })(importer);
465
-
466
- const decode_array =
467
- (config: FeatureProgrammer.IConfig) =>
468
- (importer: FunctionImporter) =>
469
- (
470
- input: ts.Expression,
471
- array: MetadataArray,
472
- explore: FeatureProgrammer.IExplore,
473
- ) =>
474
- array.type.recursive
475
- ? ts.factory.createCallExpression(
476
- ts.factory.createIdentifier(
477
- importer.useLocal(`${config.prefix}a${array.type.index}`),
478
- ),
479
- undefined,
480
- FeatureProgrammer.argumentsArray(config)({
481
- ...explore,
482
- source: "function",
483
- from: "array",
484
- })(input),
485
- )
486
- : decode_array_inline(config)(importer)(input, array, explore);
487
-
488
- const decode_array_inline =
489
- (config: FeatureProgrammer.IConfig) =>
490
- (importer: FunctionImporter) =>
491
- (
492
- input: ts.Expression,
493
- array: MetadataArray,
494
- explore: FeatureProgrammer.IExplore,
495
- ) =>
496
- FeatureProgrammer.decode_array(config)(importer)(StringifyJoiner.array)(
497
- input,
498
- array,
499
- explore,
500
- );
501
-
502
- const decode_tuple =
503
- (project: IProject) =>
504
- (config: FeatureProgrammer.IConfig) =>
505
- (importer: FunctionImporter) =>
506
- (
507
- input: ts.Expression,
508
- tuple: MetadataTuple,
509
- explore: FeatureProgrammer.IExplore,
510
- ): ts.Expression =>
511
- tuple.type.recursive
512
- ? ts.factory.createCallExpression(
513
- ts.factory.createIdentifier(
514
- importer.useLocal(`${config.prefix}t${tuple.type.index}`),
515
- ),
516
- undefined,
517
- FeatureProgrammer.argumentsArray(config)({
518
- ...explore,
519
- source: "function",
520
- })(input),
521
- )
522
- : decode_tuple_inline(project)(config)(importer)(
523
- input,
524
- tuple.type,
525
- explore,
526
- );
527
-
528
- const decode_tuple_inline =
529
- (project: IProject) =>
530
- (config: FeatureProgrammer.IConfig) =>
531
- (importer: FunctionImporter) =>
532
- (
533
- input: ts.Expression,
534
- tuple: MetadataTupleType,
535
- explore: FeatureProgrammer.IExplore,
536
- ): ts.Expression => {
537
- const children: ts.Expression[] = tuple.elements
538
- .filter((elem) => elem.rest === null)
539
- .map((elem, index) =>
540
- decode(project)(config)(importer)(
541
- ts.factory.createElementAccessExpression(input, index),
542
- elem,
543
- {
544
- ...explore,
545
- from: "array",
546
- postfix: explore.postfix.length
547
- ? `${postfix_of_tuple(explore.postfix)}[${index}]"`
548
- : `"[${index}]"`,
549
- },
550
- ),
551
- );
552
- const rest = (() => {
553
- if (tuple.elements.length === 0) return null;
554
- const last = tuple.elements.at(-1)!;
555
- if (last.rest === null) return null;
556
-
557
- const code = decode(project)(config)(importer)(
558
- ts.factory.createCallExpression(
559
- IdentifierFactory.access(input)("slice"),
560
- undefined,
561
- [ExpressionFactory.number(tuple.elements.length - 1)],
562
- ),
563
- wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!),
564
- {
565
- ...explore,
566
- start: tuple.elements.length - 1,
567
- },
568
- );
569
- return ts.factory.createCallExpression(
570
- importer.use("rest"),
571
- undefined,
572
- [code],
573
- );
574
- })();
575
- return StringifyJoiner.tuple(children, rest);
576
- };
577
-
578
- const decode_atomic =
579
- (project: IProject) =>
580
- (importer: FunctionImporter) =>
581
- (
582
- input: ts.Expression,
583
- type: string,
584
- explore: FeatureProgrammer.IExplore,
585
- ) => {
586
- if (type === "string")
587
- return ts.factory.createCallExpression(
588
- importer.use("string"),
589
- undefined,
590
- [input],
591
- );
592
- else if (type === "number" && OptionPredicator.numeric(project.options))
593
- input = ts.factory.createCallExpression(
594
- importer.use("number"),
595
- undefined,
596
- [input],
597
- );
598
-
599
- return explore.from !== "top"
600
- ? input
601
- : ts.factory.createCallExpression(
602
- IdentifierFactory.access(input)("toString"),
603
- undefined,
604
- undefined,
605
- );
606
- };
607
-
608
- const decode_constant_string =
609
- (project: IProject) =>
610
- (importer: FunctionImporter) =>
611
- (
612
- input: ts.Expression,
613
- values: string[],
614
- explore: FeatureProgrammer.IExplore,
615
- ): ts.Expression => {
616
- if (values.every((v) => !StringifyPredicator.require_escape(v)))
617
- return [
618
- ts.factory.createStringLiteral('"'),
619
- input,
620
- ts.factory.createStringLiteral('"'),
621
- ].reduce((x, y) => ts.factory.createAdd(x, y));
622
- else return decode_atomic(project)(importer)(input, "string", explore);
623
- };
624
-
625
- const decode_to_json =
626
- (project: IProject) =>
627
- (config: FeatureProgrammer.IConfig) =>
628
- (importer: FunctionImporter) =>
629
- (
630
- input: ts.Expression,
631
- resolved: Metadata,
632
- explore: FeatureProgrammer.IExplore,
633
- ): ts.Expression => {
634
- return decode(project)(config)(importer)(
635
- ts.factory.createCallExpression(
636
- IdentifierFactory.access(input)("toJSON"),
637
- undefined,
638
- [],
639
- ),
640
- resolved,
641
- explore,
642
- );
643
- };
644
-
645
- const decode_functional = (explore: FeatureProgrammer.IExplore) =>
646
- explore.from === "array"
647
- ? ts.factory.createStringLiteral("null")
648
- : ts.factory.createIdentifier("undefined");
649
-
650
- /* -----------------------------------------------------------
651
- EXPLORERS
652
- ----------------------------------------------------------- */
653
- const explore_objects =
654
- (config: FeatureProgrammer.IConfig) =>
655
- (importer: FunctionImporter) =>
656
- (
657
- input: ts.Expression,
658
- meta: Metadata,
659
- explore: FeatureProgrammer.IExplore,
660
- ) =>
661
- meta.objects.length === 1
662
- ? decode_object(importer)(input, meta.objects[0]!, explore)
663
- : ts.factory.createCallExpression(
664
- ts.factory.createIdentifier(
665
- importer.useLocal(`${PREFIX}u${meta.union_index!}`),
666
- ),
667
- undefined,
668
- FeatureProgrammer.argumentsArray(config)(explore)(input),
669
- );
670
-
671
- const explore_arrays =
672
- (project: IProject) =>
673
- (config: FeatureProgrammer.IConfig) =>
674
- (importer: FunctionImporter) =>
675
- (
676
- input: ts.Expression,
677
- elements: MetadataArray[],
678
- explore: FeatureProgrammer.IExplore,
679
- ): ts.Expression =>
680
- explore_array_like_union_types(config)(importer)(
681
- UnionExplorer.array({
682
- checker: IsProgrammer.decode(project)(importer),
683
- decoder: decode_array(config)(importer),
684
- empty: ts.factory.createStringLiteral("[]"),
685
- success: ts.factory.createTrue(),
686
- failure: (input, expected) =>
687
- create_throw_error(importer)(expected)(input),
688
- }),
689
- )(input, elements, explore);
690
-
691
- const explore_array_like_union_types =
692
- (config: FeatureProgrammer.IConfig) =>
693
- (importer: FunctionImporter) =>
694
- <T extends MetadataArray | MetadataTuple>(
695
- factory: (
696
- parameters: ts.ParameterDeclaration[],
697
- ) => (
698
- input: ts.Expression,
699
- elements: T[],
700
- explore: FeatureProgrammer.IExplore,
701
- ) => ts.ArrowFunction,
702
- ) =>
703
- (
704
- input: ts.Expression,
705
- elements: T[],
706
- explore: FeatureProgrammer.IExplore,
707
- ): ts.Expression => {
708
- const arrow =
709
- (parameters: ts.ParameterDeclaration[]) =>
710
- (explore: FeatureProgrammer.IExplore) =>
711
- (input: ts.Expression): ts.ArrowFunction =>
712
- factory(parameters)(input, elements, explore);
713
- if (elements.every((e) => e.type.recursive === false))
714
- ts.factory.createCallExpression(
715
- arrow([])(explore)(input),
716
- undefined,
717
- [],
718
- );
719
-
720
- explore = {
721
- ...explore,
722
- source: "function",
723
- from: "array",
724
- };
725
- return ts.factory.createCallExpression(
726
- ts.factory.createIdentifier(
727
- importer.emplaceUnion(
728
- config.prefix,
729
- elements.map((e) => e.type.name).join(" | "),
730
- () =>
731
- arrow(
732
- FeatureProgrammer.parameterDeclarations(config)(
733
- TypeFactory.keyword("any"),
734
- )(ts.factory.createIdentifier("input")),
735
- )({
736
- ...explore,
737
- postfix: "",
738
- })(ts.factory.createIdentifier("input")),
739
- ),
740
- ),
741
- undefined,
742
- FeatureProgrammer.argumentsArray(config)(explore)(input),
743
- );
744
- };
745
-
746
- /* -----------------------------------------------------------
747
- RETURN SCRIPTS
748
- ----------------------------------------------------------- */
749
- const wrap_required = (
750
- input: ts.Expression,
751
- meta: Metadata,
752
- explore: FeatureProgrammer.IExplore,
753
- ): ((expression: ts.Expression) => ts.Expression) => {
754
- if (meta.isRequired() === true && meta.any === false)
755
- return (expression) => expression;
756
- return (expression) =>
757
- ts.factory.createConditionalExpression(
758
- ts.factory.createStrictInequality(
759
- ts.factory.createIdentifier("undefined"),
760
- input,
761
- ),
762
- undefined,
763
- expression,
764
- undefined,
765
- explore.from === "array"
766
- ? ts.factory.createStringLiteral("null")
767
- : ts.factory.createIdentifier("undefined"),
768
- );
769
- };
770
-
771
- const wrap_nullable = (
772
- input: ts.Expression,
773
- meta: Metadata,
774
- ): ((expression: ts.Expression) => ts.Expression) => {
775
- if (meta.nullable === false) return (expression) => expression;
776
- return (expression) =>
777
- ts.factory.createConditionalExpression(
778
- ts.factory.createStrictInequality(ts.factory.createNull(), input),
779
- undefined,
780
- expression,
781
- undefined,
782
- ts.factory.createStringLiteral("null"),
783
- );
784
- };
785
-
786
- const wrap_functional = (
787
- input: ts.Expression,
788
- meta: Metadata,
789
- explore: FeatureProgrammer.IExplore,
790
- ): ((expression: ts.Expression) => ts.Expression) => {
791
- if (meta.functional === false) return (expression) => expression;
792
- return (expression) =>
793
- ts.factory.createConditionalExpression(
794
- ts.factory.createStrictInequality(
795
- ts.factory.createStringLiteral("function"),
796
- ValueFactory.TYPEOF(input),
797
- ),
798
- undefined,
799
- expression,
800
- undefined,
801
- decode_functional(explore),
802
- );
803
- };
804
-
805
- const iterate = (
806
- importer: FunctionImporter,
807
- input: ts.Expression,
808
- unions: IUnion[],
809
- expected: string,
810
- ) =>
811
- ts.factory.createBlock(
812
- [
813
- ...unions.map((u) =>
814
- ts.factory.createIfStatement(
815
- u.is(),
816
- ts.factory.createReturnStatement(u.value()),
817
- ),
818
- ),
819
- create_throw_error(importer)(expected)(input),
820
- ],
821
- true,
822
- );
823
-
824
- /* -----------------------------------------------------------
825
- CONFIGURATIONS
826
- ----------------------------------------------------------- */
827
- const PREFIX = "$s";
828
-
829
- const configure =
830
- (project: IProject) =>
831
- (importer: FunctionImporter): FeatureProgrammer.IConfig => {
832
- const config: FeatureProgrammer.IConfig = {
833
- types: {
834
- input: (type, name) =>
835
- ts.factory.createTypeReferenceNode(
836
- name ?? TypeFactory.getFullName(project.checker)(type),
837
- ),
838
- output: () => TypeFactory.keyword("string"),
839
- },
840
- prefix: PREFIX,
841
- trace: false,
842
- path: false,
843
- initializer,
844
- decoder: () => decode(project)(config)(importer),
845
- objector: {
846
- checker: () => (input, meta, explore) =>
847
- IsProgrammer.decode(project)(importer)(input, meta, explore),
848
- decoder: () => decode_object(importer),
849
- joiner: StringifyJoiner.object(importer),
850
- unionizer: decode_union_object(
851
- IsProgrammer.decode_object(project)(importer),
852
- )(decode_object(importer))((exp) => exp)((value, expected) =>
853
- create_throw_error(importer)(expected)(value),
854
- ),
855
- failure: (input, expected) =>
856
- create_throw_error(importer)(expected)(input),
857
- },
858
- generator: {
859
- arrays: () => write_array_functions(config)(importer),
860
- tuples: () => write_tuple_functions(project)(config)(importer),
861
- },
862
- };
863
- return config;
864
- };
865
-
866
- const initializer: FeatureProgrammer.IConfig["initializer"] =
867
- (project) => (importer) => (type) =>
868
- JsonMetadataFactory.analyze(`typia.json.${importer.method}`)(
869
- project.checker,
870
- project.context,
871
- )(type);
872
-
873
- const create_throw_error =
874
- (importer: FunctionImporter) =>
875
- (expected: string) =>
876
- (value: ts.Expression) =>
877
- ts.factory.createExpressionStatement(
878
- ts.factory.createCallExpression(
879
- importer.use("throws"),
880
- [],
881
- [
882
- ts.factory.createObjectLiteralExpression(
883
- [
884
- ts.factory.createPropertyAssignment(
885
- "expected",
886
- ts.factory.createStringLiteral(expected),
887
- ),
888
- ts.factory.createPropertyAssignment("value", value),
889
- ],
890
- true,
891
- ),
892
- ],
893
- ),
894
- );
895
- }
896
-
897
- interface IUnion {
898
- type: string;
899
- is: () => ts.Expression;
900
- value: () => ts.Expression;
901
- }
1
+ import ts from "typescript";
2
+
3
+ import { ExpressionFactory } from "../../factories/ExpressionFactory";
4
+ import { IdentifierFactory } from "../../factories/IdentifierFactory";
5
+ import { JsonMetadataFactory } from "../../factories/JsonMetadataFactory";
6
+ import { MetadataCollection } from "../../factories/MetadataCollection";
7
+ import { StatementFactory } from "../../factories/StatementFactory";
8
+ import { TypeFactory } from "../../factories/TypeFactory";
9
+ import { ValueFactory } from "../../factories/ValueFactory";
10
+
11
+ import { Metadata } from "../../schemas/metadata/Metadata";
12
+ import { MetadataArray } from "../../schemas/metadata/MetadataArray";
13
+ import { MetadataAtomic } from "../../schemas/metadata/MetadataAtomic";
14
+ import { MetadataTuple } from "../../schemas/metadata/MetadataTuple";
15
+ import { MetadataTupleType } from "../../schemas/metadata/MetadataTupleType";
16
+
17
+ import { IProject } from "../../transformers/IProject";
18
+
19
+ import { Atomic } from "../../typings/Atomic";
20
+
21
+ import { ArrayUtil } from "../../utils/ArrayUtil";
22
+
23
+ import { FeatureProgrammer } from "../FeatureProgrammer";
24
+ import { IsProgrammer } from "../IsProgrammer";
25
+ import { AtomicPredicator } from "../helpers/AtomicPredicator";
26
+ import { FunctionImporter } from "../helpers/FunctionImporter";
27
+ import { OptionPredicator } from "../helpers/OptionPredicator";
28
+ import { StringifyJoiner } from "../helpers/StringifyJoinder";
29
+ import { StringifyPredicator } from "../helpers/StringifyPredicator";
30
+ import { UnionExplorer } from "../helpers/UnionExplorer";
31
+ import { check_native } from "../internal/check_native";
32
+ import { decode_union_object } from "../internal/decode_union_object";
33
+ import { postfix_of_tuple } from "../internal/postfix_of_tuple";
34
+ import { wrap_metadata_rest_tuple } from "../internal/wrap_metadata_rest_tuple";
35
+
36
+ export namespace JsonStringifyProgrammer {
37
+ /* -----------------------------------------------------------
38
+ WRITER
39
+ ----------------------------------------------------------- */
40
+ export const decompose = (props: {
41
+ validated: boolean;
42
+ project: IProject;
43
+ importer: FunctionImporter;
44
+ type: ts.Type;
45
+ name?: string;
46
+ }): FeatureProgrammer.IDecomposed => {
47
+ const config: FeatureProgrammer.IConfig = configure(props.project)(
48
+ props.importer,
49
+ );
50
+ if (props.validated === false)
51
+ config.addition = (collection) =>
52
+ IsProgrammer.write_function_statements(props.project)(props.importer)(
53
+ collection,
54
+ );
55
+ const composed: FeatureProgrammer.IComposed = FeatureProgrammer.compose({
56
+ ...props,
57
+ config,
58
+ });
59
+ return {
60
+ functions: composed.functions,
61
+ statements: composed.statements,
62
+ arrow: ts.factory.createArrowFunction(
63
+ undefined,
64
+ undefined,
65
+ composed.parameters,
66
+ composed.response,
67
+ undefined,
68
+ composed.body,
69
+ ),
70
+ };
71
+ };
72
+
73
+ export const write =
74
+ (project: IProject) =>
75
+ (modulo: ts.LeftHandSideExpression) =>
76
+ (type: ts.Type, name?: string): ts.CallExpression => {
77
+ const importer: FunctionImporter = new FunctionImporter(modulo.getText());
78
+ const result: FeatureProgrammer.IDecomposed = decompose({
79
+ validated: false,
80
+ project,
81
+ importer,
82
+ type,
83
+ name,
84
+ });
85
+ return FeatureProgrammer.writeDecomposed({
86
+ modulo,
87
+ importer,
88
+ result,
89
+ });
90
+ };
91
+
92
+ const write_array_functions =
93
+ (config: FeatureProgrammer.IConfig) =>
94
+ (importer: FunctionImporter) =>
95
+ (collection: MetadataCollection): ts.VariableStatement[] =>
96
+ collection
97
+ .arrays()
98
+ .filter((a) => a.recursive)
99
+ .map((type, i) =>
100
+ StatementFactory.constant(
101
+ `${config.prefix}a${i}`,
102
+ ts.factory.createArrowFunction(
103
+ undefined,
104
+ undefined,
105
+ FeatureProgrammer.parameterDeclarations(config)(
106
+ TypeFactory.keyword("any"),
107
+ )(ts.factory.createIdentifier("input")),
108
+ TypeFactory.keyword("any"),
109
+ undefined,
110
+ decode_array_inline(config)(importer)(
111
+ ts.factory.createIdentifier("input"),
112
+ MetadataArray.create({
113
+ type,
114
+ tags: [],
115
+ }),
116
+ {
117
+ tracable: config.trace,
118
+ source: "function",
119
+ from: "array",
120
+ postfix: "",
121
+ },
122
+ ),
123
+ ),
124
+ ),
125
+ );
126
+
127
+ const write_tuple_functions =
128
+ (project: IProject) =>
129
+ (config: FeatureProgrammer.IConfig) =>
130
+ (importer: FunctionImporter) =>
131
+ (collection: MetadataCollection): ts.VariableStatement[] =>
132
+ collection
133
+ .tuples()
134
+ .filter((t) => t.recursive)
135
+ .map((tuple, i) =>
136
+ StatementFactory.constant(
137
+ `${config.prefix}t${i}`,
138
+ ts.factory.createArrowFunction(
139
+ undefined,
140
+ undefined,
141
+ FeatureProgrammer.parameterDeclarations(config)(
142
+ TypeFactory.keyword("any"),
143
+ )(ts.factory.createIdentifier("input")),
144
+ TypeFactory.keyword("any"),
145
+ undefined,
146
+ decode_tuple_inline(project)(config)(importer)(
147
+ ts.factory.createIdentifier("input"),
148
+ tuple,
149
+ {
150
+ tracable: config.trace,
151
+ source: "function",
152
+ from: "array",
153
+ postfix: "",
154
+ },
155
+ ),
156
+ ),
157
+ ),
158
+ );
159
+
160
+ /* -----------------------------------------------------------
161
+ DECODERS
162
+ ----------------------------------------------------------- */
163
+ const decode =
164
+ (project: IProject) =>
165
+ (config: FeatureProgrammer.IConfig) =>
166
+ (importer: FunctionImporter) =>
167
+ (
168
+ input: ts.Expression,
169
+ meta: Metadata,
170
+ explore: FeatureProgrammer.IExplore,
171
+ ): ts.Expression => {
172
+ // ANY TYPE
173
+ if (meta.any === true)
174
+ return wrap_required(
175
+ input,
176
+ meta,
177
+ explore,
178
+ )(
179
+ wrap_functional(
180
+ input,
181
+ meta,
182
+ explore,
183
+ )(
184
+ ts.factory.createCallExpression(
185
+ ts.factory.createIdentifier("JSON.stringify"),
186
+ undefined,
187
+ [input],
188
+ ),
189
+ ),
190
+ );
191
+
192
+ // ONLY NULL OR UNDEFINED
193
+ const size: number = meta.size();
194
+ if (
195
+ size === 0 &&
196
+ (meta.isRequired() === false || meta.nullable === true)
197
+ ) {
198
+ if (meta.isRequired() === false && meta.nullable === true)
199
+ return explore.from === "array"
200
+ ? ts.factory.createStringLiteral("null")
201
+ : ts.factory.createConditionalExpression(
202
+ ts.factory.createStrictEquality(ts.factory.createNull(), input),
203
+ undefined,
204
+ ts.factory.createStringLiteral("null"),
205
+ undefined,
206
+ ts.factory.createIdentifier("undefined"),
207
+ );
208
+ else if (meta.isRequired() === false)
209
+ return explore.from === "array"
210
+ ? ts.factory.createStringLiteral("null")
211
+ : ts.factory.createIdentifier("undefined");
212
+ else return ts.factory.createStringLiteral("null");
213
+ }
214
+
215
+ //----
216
+ // LIST UP UNION TYPES
217
+ //----
218
+ const unions: IUnion[] = [];
219
+
220
+ // toJSON() METHOD
221
+ if (meta.escaped !== null)
222
+ unions.push({
223
+ type: "resolved",
224
+ is:
225
+ meta.escaped.original.size() === 1 &&
226
+ meta.escaped.original.natives[0] === "Date"
227
+ ? () => check_native("Date")(input)
228
+ : () => IsProgrammer.decode_to_json(false)(input),
229
+ value: () =>
230
+ decode_to_json(project)(config)(importer)(
231
+ input,
232
+ meta.escaped!.returns,
233
+ explore,
234
+ ),
235
+ });
236
+ else if (meta.functional === true)
237
+ unions.push({
238
+ type: "functional",
239
+ is: () => IsProgrammer.decode_functional(input),
240
+ value: () => decode_functional(explore),
241
+ });
242
+
243
+ // TEMPLATES
244
+ if (
245
+ meta.templates.length ||
246
+ ArrayUtil.has(meta.constants, (c) => c.type === "string")
247
+ )
248
+ if (AtomicPredicator.template(meta)) {
249
+ const partial = Metadata.initialize();
250
+ partial.atomics.push(
251
+ MetadataAtomic.create({ type: "string", tags: [] }),
252
+ ),
253
+ unions.push({
254
+ type: "template literal",
255
+ is: () =>
256
+ IsProgrammer.decode(project)(importer)(input, partial, explore),
257
+ value: () =>
258
+ decode_atomic(project)(importer)(input, "string", explore),
259
+ });
260
+ }
261
+
262
+ // CONSTANTS
263
+ for (const constant of meta.constants)
264
+ if (AtomicPredicator.constant(meta)(constant.type) === false) continue;
265
+ else if (constant.type !== "string")
266
+ unions.push({
267
+ type: "atomic",
268
+ is: () =>
269
+ IsProgrammer.decode(project)(importer)(
270
+ input,
271
+ (() => {
272
+ const partial = Metadata.initialize();
273
+ partial.atomics.push(
274
+ MetadataAtomic.create({
275
+ type: constant.type,
276
+ tags: [],
277
+ }),
278
+ );
279
+ return partial;
280
+ })(),
281
+ explore,
282
+ ),
283
+ value: () =>
284
+ decode_atomic(project)(importer)(input, constant.type, explore),
285
+ });
286
+ else if (meta.templates.length === 0)
287
+ unions.push({
288
+ type: "const string",
289
+ is: () =>
290
+ IsProgrammer.decode(project)(importer)(
291
+ input,
292
+ (() => {
293
+ const partial = Metadata.initialize();
294
+ partial.atomics.push(
295
+ MetadataAtomic.create({
296
+ type: "string",
297
+ tags: [],
298
+ }),
299
+ );
300
+ return partial;
301
+ })(),
302
+ explore,
303
+ ),
304
+ value: () =>
305
+ decode_constant_string(project)(importer)(
306
+ input,
307
+ [...constant.values.map((v) => v.value)] as string[],
308
+ explore,
309
+ ),
310
+ });
311
+
312
+ /// ATOMICS
313
+ for (const a of meta.atomics)
314
+ if (AtomicPredicator.atomic(meta)(a.type))
315
+ unions.push({
316
+ type: "atomic",
317
+ is: () =>
318
+ IsProgrammer.decode(project)(importer)(
319
+ input,
320
+ (() => {
321
+ const partial = Metadata.initialize();
322
+ partial.atomics.push(a);
323
+ return partial;
324
+ })(),
325
+ explore,
326
+ ),
327
+ value: () =>
328
+ decode_atomic(project)(importer)(input, a.type, explore),
329
+ });
330
+
331
+ // TUPLES
332
+ for (const tuple of meta.tuples)
333
+ unions.push({
334
+ type: "tuple",
335
+ is: () =>
336
+ IsProgrammer.decode(project)(importer)(
337
+ input,
338
+ (() => {
339
+ const partial = Metadata.initialize();
340
+ partial.tuples.push(tuple);
341
+ return partial;
342
+ })(),
343
+ explore,
344
+ ),
345
+ value: () =>
346
+ decode_tuple(project)(config)(importer)(input, tuple, explore),
347
+ });
348
+
349
+ // ARRAYS
350
+ if (meta.arrays.length) {
351
+ const value: () => ts.Expression =
352
+ meta.arrays.length === 1
353
+ ? () =>
354
+ decode_array(config)(importer)(input, meta.arrays[0]!, {
355
+ ...explore,
356
+ from: "array",
357
+ })
358
+ : meta.arrays.some((elem) => elem.type.value.any)
359
+ ? () =>
360
+ ts.factory.createCallExpression(
361
+ ts.factory.createIdentifier("JSON.stringify"),
362
+ undefined,
363
+ [input],
364
+ )
365
+ : () =>
366
+ explore_arrays(project)(config)(importer)(
367
+ input,
368
+ meta.arrays,
369
+ {
370
+ ...explore,
371
+ from: "array",
372
+ },
373
+ );
374
+
375
+ unions.push({
376
+ type: "array",
377
+ is: () => ExpressionFactory.isArray(input),
378
+ value,
379
+ });
380
+ }
381
+
382
+ // BUILT-IN CLASSES
383
+ if (meta.natives.length)
384
+ for (const native of meta.natives)
385
+ unions.push({
386
+ type: "object",
387
+ is: () => check_native(native)(input),
388
+ value: () =>
389
+ AtomicPredicator.native(native)
390
+ ? decode_atomic(project)(importer)(
391
+ input,
392
+ native.toLowerCase() as Atomic.Literal,
393
+ explore,
394
+ )
395
+ : ts.factory.createStringLiteral("{}"),
396
+ });
397
+
398
+ // SETS
399
+ if (meta.sets.length)
400
+ unions.push({
401
+ type: "object",
402
+ is: () => ExpressionFactory.isInstanceOf("Set")(input),
403
+ value: () => ts.factory.createStringLiteral("{}"),
404
+ });
405
+
406
+ // MAPS
407
+ if (meta.maps.length)
408
+ unions.push({
409
+ type: "object",
410
+ is: () => ExpressionFactory.isInstanceOf("Map")(input),
411
+ value: () => ts.factory.createStringLiteral("{}"),
412
+ });
413
+
414
+ // OBJECTS
415
+ if (meta.objects.length)
416
+ unions.push({
417
+ type: "object",
418
+ is: () =>
419
+ ExpressionFactory.isObject({
420
+ checkNull: true,
421
+ checkArray: meta.objects.some((obj) =>
422
+ obj.properties.every(
423
+ (prop) =>
424
+ !prop.key.isSoleLiteral() || !prop.value.isRequired(),
425
+ ),
426
+ ),
427
+ })(input),
428
+ value: () =>
429
+ explore_objects(config)(importer)(input, meta, {
430
+ ...explore,
431
+ from: "object",
432
+ }),
433
+ });
434
+
435
+ //----
436
+ // RETURNS
437
+ //----
438
+ // CHECK NULL AND UNDEFINED
439
+ const wrapper = (output: ts.Expression) =>
440
+ wrap_required(input, meta, explore)(wrap_nullable(input, meta)(output));
441
+
442
+ // DIRECT RETURN
443
+ if (unions.length === 0)
444
+ return ts.factory.createCallExpression(
445
+ ts.factory.createIdentifier("JSON.stringify"),
446
+ undefined,
447
+ [input],
448
+ );
449
+ else if (unions.length === 1) return wrapper(unions[0]!.value());
450
+
451
+ // RETURN WITH TYPE CHECKING
452
+ return wrapper(
453
+ ts.factory.createCallExpression(
454
+ ts.factory.createArrowFunction(
455
+ undefined,
456
+ undefined,
457
+ [],
458
+ undefined,
459
+ undefined,
460
+ iterate(importer, input, unions, meta.getName()),
461
+ ),
462
+ undefined,
463
+ undefined,
464
+ ),
465
+ );
466
+ };
467
+
468
+ const decode_object = (importer: FunctionImporter) =>
469
+ FeatureProgrammer.decode_object({
470
+ trace: false,
471
+ path: false,
472
+ prefix: PREFIX,
473
+ })(importer);
474
+
475
+ const decode_array =
476
+ (config: FeatureProgrammer.IConfig) =>
477
+ (importer: FunctionImporter) =>
478
+ (
479
+ input: ts.Expression,
480
+ array: MetadataArray,
481
+ explore: FeatureProgrammer.IExplore,
482
+ ) =>
483
+ array.type.recursive
484
+ ? ts.factory.createCallExpression(
485
+ ts.factory.createIdentifier(
486
+ importer.useLocal(`${config.prefix}a${array.type.index}`),
487
+ ),
488
+ undefined,
489
+ FeatureProgrammer.argumentsArray(config)({
490
+ ...explore,
491
+ source: "function",
492
+ from: "array",
493
+ })(input),
494
+ )
495
+ : decode_array_inline(config)(importer)(input, array, explore);
496
+
497
+ const decode_array_inline =
498
+ (config: FeatureProgrammer.IConfig) =>
499
+ (importer: FunctionImporter) =>
500
+ (
501
+ input: ts.Expression,
502
+ array: MetadataArray,
503
+ explore: FeatureProgrammer.IExplore,
504
+ ) =>
505
+ FeatureProgrammer.decode_array(config)(importer)(StringifyJoiner.array)(
506
+ input,
507
+ array,
508
+ explore,
509
+ );
510
+
511
+ const decode_tuple =
512
+ (project: IProject) =>
513
+ (config: FeatureProgrammer.IConfig) =>
514
+ (importer: FunctionImporter) =>
515
+ (
516
+ input: ts.Expression,
517
+ tuple: MetadataTuple,
518
+ explore: FeatureProgrammer.IExplore,
519
+ ): ts.Expression =>
520
+ tuple.type.recursive
521
+ ? ts.factory.createCallExpression(
522
+ ts.factory.createIdentifier(
523
+ importer.useLocal(`${config.prefix}t${tuple.type.index}`),
524
+ ),
525
+ undefined,
526
+ FeatureProgrammer.argumentsArray(config)({
527
+ ...explore,
528
+ source: "function",
529
+ })(input),
530
+ )
531
+ : decode_tuple_inline(project)(config)(importer)(
532
+ input,
533
+ tuple.type,
534
+ explore,
535
+ );
536
+
537
+ const decode_tuple_inline =
538
+ (project: IProject) =>
539
+ (config: FeatureProgrammer.IConfig) =>
540
+ (importer: FunctionImporter) =>
541
+ (
542
+ input: ts.Expression,
543
+ tuple: MetadataTupleType,
544
+ explore: FeatureProgrammer.IExplore,
545
+ ): ts.Expression => {
546
+ const children: ts.Expression[] = tuple.elements
547
+ .filter((elem) => elem.rest === null)
548
+ .map((elem, index) =>
549
+ decode(project)(config)(importer)(
550
+ ts.factory.createElementAccessExpression(input, index),
551
+ elem,
552
+ {
553
+ ...explore,
554
+ from: "array",
555
+ postfix: explore.postfix.length
556
+ ? `${postfix_of_tuple(explore.postfix)}[${index}]"`
557
+ : `"[${index}]"`,
558
+ },
559
+ ),
560
+ );
561
+ const rest = (() => {
562
+ if (tuple.elements.length === 0) return null;
563
+ const last = tuple.elements.at(-1)!;
564
+ if (last.rest === null) return null;
565
+
566
+ const code = decode(project)(config)(importer)(
567
+ ts.factory.createCallExpression(
568
+ IdentifierFactory.access(input)("slice"),
569
+ undefined,
570
+ [ExpressionFactory.number(tuple.elements.length - 1)],
571
+ ),
572
+ wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!),
573
+ {
574
+ ...explore,
575
+ start: tuple.elements.length - 1,
576
+ },
577
+ );
578
+ return ts.factory.createCallExpression(
579
+ importer.use("rest"),
580
+ undefined,
581
+ [code],
582
+ );
583
+ })();
584
+ return StringifyJoiner.tuple(children, rest);
585
+ };
586
+
587
+ const decode_atomic =
588
+ (project: IProject) =>
589
+ (importer: FunctionImporter) =>
590
+ (
591
+ input: ts.Expression,
592
+ type: string,
593
+ explore: FeatureProgrammer.IExplore,
594
+ ) => {
595
+ if (type === "string")
596
+ return ts.factory.createCallExpression(
597
+ importer.use("string"),
598
+ undefined,
599
+ [input],
600
+ );
601
+ else if (type === "number" && OptionPredicator.numeric(project.options))
602
+ input = ts.factory.createCallExpression(
603
+ importer.use("number"),
604
+ undefined,
605
+ [input],
606
+ );
607
+
608
+ return explore.from !== "top"
609
+ ? input
610
+ : ts.factory.createCallExpression(
611
+ IdentifierFactory.access(input)("toString"),
612
+ undefined,
613
+ undefined,
614
+ );
615
+ };
616
+
617
+ const decode_constant_string =
618
+ (project: IProject) =>
619
+ (importer: FunctionImporter) =>
620
+ (
621
+ input: ts.Expression,
622
+ values: string[],
623
+ explore: FeatureProgrammer.IExplore,
624
+ ): ts.Expression => {
625
+ if (values.every((v) => !StringifyPredicator.require_escape(v)))
626
+ return [
627
+ ts.factory.createStringLiteral('"'),
628
+ input,
629
+ ts.factory.createStringLiteral('"'),
630
+ ].reduce((x, y) => ts.factory.createAdd(x, y));
631
+ else return decode_atomic(project)(importer)(input, "string", explore);
632
+ };
633
+
634
+ const decode_to_json =
635
+ (project: IProject) =>
636
+ (config: FeatureProgrammer.IConfig) =>
637
+ (importer: FunctionImporter) =>
638
+ (
639
+ input: ts.Expression,
640
+ resolved: Metadata,
641
+ explore: FeatureProgrammer.IExplore,
642
+ ): ts.Expression => {
643
+ return decode(project)(config)(importer)(
644
+ ts.factory.createCallExpression(
645
+ IdentifierFactory.access(input)("toJSON"),
646
+ undefined,
647
+ [],
648
+ ),
649
+ resolved,
650
+ explore,
651
+ );
652
+ };
653
+
654
+ const decode_functional = (explore: FeatureProgrammer.IExplore) =>
655
+ explore.from === "array"
656
+ ? ts.factory.createStringLiteral("null")
657
+ : ts.factory.createIdentifier("undefined");
658
+
659
+ /* -----------------------------------------------------------
660
+ EXPLORERS
661
+ ----------------------------------------------------------- */
662
+ const explore_objects =
663
+ (config: FeatureProgrammer.IConfig) =>
664
+ (importer: FunctionImporter) =>
665
+ (
666
+ input: ts.Expression,
667
+ meta: Metadata,
668
+ explore: FeatureProgrammer.IExplore,
669
+ ) =>
670
+ meta.objects.length === 1
671
+ ? decode_object(importer)(input, meta.objects[0]!, explore)
672
+ : ts.factory.createCallExpression(
673
+ ts.factory.createIdentifier(
674
+ importer.useLocal(`${PREFIX}u${meta.union_index!}`),
675
+ ),
676
+ undefined,
677
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
678
+ );
679
+
680
+ const explore_arrays =
681
+ (project: IProject) =>
682
+ (config: FeatureProgrammer.IConfig) =>
683
+ (importer: FunctionImporter) =>
684
+ (
685
+ input: ts.Expression,
686
+ elements: MetadataArray[],
687
+ explore: FeatureProgrammer.IExplore,
688
+ ): ts.Expression =>
689
+ explore_array_like_union_types(config)(importer)(
690
+ UnionExplorer.array({
691
+ checker: IsProgrammer.decode(project)(importer),
692
+ decoder: decode_array(config)(importer),
693
+ empty: ts.factory.createStringLiteral("[]"),
694
+ success: ts.factory.createTrue(),
695
+ failure: (input, expected) =>
696
+ create_throw_error(importer)(expected)(input),
697
+ }),
698
+ )(input, elements, explore);
699
+
700
+ const explore_array_like_union_types =
701
+ (config: FeatureProgrammer.IConfig) =>
702
+ (importer: FunctionImporter) =>
703
+ <T extends MetadataArray | MetadataTuple>(
704
+ factory: (
705
+ parameters: ts.ParameterDeclaration[],
706
+ ) => (
707
+ input: ts.Expression,
708
+ elements: T[],
709
+ explore: FeatureProgrammer.IExplore,
710
+ ) => ts.ArrowFunction,
711
+ ) =>
712
+ (
713
+ input: ts.Expression,
714
+ elements: T[],
715
+ explore: FeatureProgrammer.IExplore,
716
+ ): ts.Expression => {
717
+ const arrow =
718
+ (parameters: ts.ParameterDeclaration[]) =>
719
+ (explore: FeatureProgrammer.IExplore) =>
720
+ (input: ts.Expression): ts.ArrowFunction =>
721
+ factory(parameters)(input, elements, explore);
722
+ if (elements.every((e) => e.type.recursive === false))
723
+ ts.factory.createCallExpression(
724
+ arrow([])(explore)(input),
725
+ undefined,
726
+ [],
727
+ );
728
+
729
+ explore = {
730
+ ...explore,
731
+ source: "function",
732
+ from: "array",
733
+ };
734
+ return ts.factory.createCallExpression(
735
+ ts.factory.createIdentifier(
736
+ importer.emplaceUnion(
737
+ config.prefix,
738
+ elements.map((e) => e.type.name).join(" | "),
739
+ () =>
740
+ arrow(
741
+ FeatureProgrammer.parameterDeclarations(config)(
742
+ TypeFactory.keyword("any"),
743
+ )(ts.factory.createIdentifier("input")),
744
+ )({
745
+ ...explore,
746
+ postfix: "",
747
+ })(ts.factory.createIdentifier("input")),
748
+ ),
749
+ ),
750
+ undefined,
751
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
752
+ );
753
+ };
754
+
755
+ /* -----------------------------------------------------------
756
+ RETURN SCRIPTS
757
+ ----------------------------------------------------------- */
758
+ const wrap_required = (
759
+ input: ts.Expression,
760
+ meta: Metadata,
761
+ explore: FeatureProgrammer.IExplore,
762
+ ): ((expression: ts.Expression) => ts.Expression) => {
763
+ if (meta.isRequired() === true && meta.any === false)
764
+ return (expression) => expression;
765
+ return (expression) =>
766
+ ts.factory.createConditionalExpression(
767
+ ts.factory.createStrictInequality(
768
+ ts.factory.createIdentifier("undefined"),
769
+ input,
770
+ ),
771
+ undefined,
772
+ expression,
773
+ undefined,
774
+ explore.from === "array"
775
+ ? ts.factory.createStringLiteral("null")
776
+ : ts.factory.createIdentifier("undefined"),
777
+ );
778
+ };
779
+
780
+ const wrap_nullable = (
781
+ input: ts.Expression,
782
+ meta: Metadata,
783
+ ): ((expression: ts.Expression) => ts.Expression) => {
784
+ if (meta.nullable === false) return (expression) => expression;
785
+ return (expression) =>
786
+ ts.factory.createConditionalExpression(
787
+ ts.factory.createStrictInequality(ts.factory.createNull(), input),
788
+ undefined,
789
+ expression,
790
+ undefined,
791
+ ts.factory.createStringLiteral("null"),
792
+ );
793
+ };
794
+
795
+ const wrap_functional = (
796
+ input: ts.Expression,
797
+ meta: Metadata,
798
+ explore: FeatureProgrammer.IExplore,
799
+ ): ((expression: ts.Expression) => ts.Expression) => {
800
+ if (meta.functional === false) return (expression) => expression;
801
+ return (expression) =>
802
+ ts.factory.createConditionalExpression(
803
+ ts.factory.createStrictInequality(
804
+ ts.factory.createStringLiteral("function"),
805
+ ValueFactory.TYPEOF(input),
806
+ ),
807
+ undefined,
808
+ expression,
809
+ undefined,
810
+ decode_functional(explore),
811
+ );
812
+ };
813
+
814
+ const iterate = (
815
+ importer: FunctionImporter,
816
+ input: ts.Expression,
817
+ unions: IUnion[],
818
+ expected: string,
819
+ ) =>
820
+ ts.factory.createBlock(
821
+ [
822
+ ...unions.map((u) =>
823
+ ts.factory.createIfStatement(
824
+ u.is(),
825
+ ts.factory.createReturnStatement(u.value()),
826
+ ),
827
+ ),
828
+ create_throw_error(importer)(expected)(input),
829
+ ],
830
+ true,
831
+ );
832
+
833
+ /* -----------------------------------------------------------
834
+ CONFIGURATIONS
835
+ ----------------------------------------------------------- */
836
+ const PREFIX = "$s";
837
+
838
+ const configure =
839
+ (project: IProject) =>
840
+ (importer: FunctionImporter): FeatureProgrammer.IConfig => {
841
+ const config: FeatureProgrammer.IConfig = {
842
+ types: {
843
+ input: (type, name) =>
844
+ ts.factory.createTypeReferenceNode(
845
+ name ?? TypeFactory.getFullName(project.checker)(type),
846
+ ),
847
+ output: () => TypeFactory.keyword("string"),
848
+ },
849
+ prefix: PREFIX,
850
+ trace: false,
851
+ path: false,
852
+ initializer,
853
+ decoder: () => decode(project)(config)(importer),
854
+ objector: {
855
+ checker: () => (input, meta, explore) =>
856
+ IsProgrammer.decode(project)(importer)(input, meta, explore),
857
+ decoder: () => decode_object(importer),
858
+ joiner: StringifyJoiner.object(importer),
859
+ unionizer: decode_union_object(
860
+ IsProgrammer.decode_object(project)(importer),
861
+ )(decode_object(importer))((exp) => exp)((value, expected) =>
862
+ create_throw_error(importer)(expected)(value),
863
+ ),
864
+ failure: (input, expected) =>
865
+ create_throw_error(importer)(expected)(input),
866
+ },
867
+ generator: {
868
+ arrays: () => write_array_functions(config)(importer),
869
+ tuples: () => write_tuple_functions(project)(config)(importer),
870
+ },
871
+ };
872
+ return config;
873
+ };
874
+
875
+ const initializer: FeatureProgrammer.IConfig["initializer"] =
876
+ (project) => (importer) => (type) =>
877
+ JsonMetadataFactory.analyze(`typia.json.${importer.method}`)(
878
+ project.checker,
879
+ project.context,
880
+ )(type);
881
+
882
+ const create_throw_error =
883
+ (importer: FunctionImporter) =>
884
+ (expected: string) =>
885
+ (value: ts.Expression) =>
886
+ ts.factory.createExpressionStatement(
887
+ ts.factory.createCallExpression(
888
+ importer.use("throws"),
889
+ [],
890
+ [
891
+ ts.factory.createObjectLiteralExpression(
892
+ [
893
+ ts.factory.createPropertyAssignment(
894
+ "expected",
895
+ ts.factory.createStringLiteral(expected),
896
+ ),
897
+ ts.factory.createPropertyAssignment("value", value),
898
+ ],
899
+ true,
900
+ ),
901
+ ],
902
+ ),
903
+ );
904
+ }
905
+
906
+ interface IUnion {
907
+ type: string;
908
+ is: () => ts.Expression;
909
+ value: () => ts.Expression;
910
+ }