typia 4.0.0-dev.20230604 → 4.0.0

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 (290) hide show
  1. package/lib/executable/TypiaGenerateWizard.js +1 -1
  2. package/lib/executable/TypiaGenerateWizard.js.map +1 -1
  3. package/lib/executable/TypiaSetupWizard.js +1 -1
  4. package/lib/executable/TypiaSetupWizard.js.map +1 -1
  5. package/lib/executable/setup/ArgumentParser.js +1 -1
  6. package/lib/executable/setup/ArgumentParser.js.map +1 -1
  7. package/lib/executable/setup/CommandExecutor.js +1 -1
  8. package/lib/executable/setup/CommandExecutor.js.map +1 -1
  9. package/lib/executable/setup/FileRetriever.js +1 -1
  10. package/lib/executable/setup/FileRetriever.js.map +1 -1
  11. package/lib/executable/setup/PluginConfigurator.js +1 -1
  12. package/lib/executable/setup/PluginConfigurator.js.map +1 -1
  13. package/lib/factories/CommentFactory.js +1 -1
  14. package/lib/factories/CommentFactory.js.map +1 -1
  15. package/lib/factories/ExpressionFactory.js +1 -1
  16. package/lib/factories/ExpressionFactory.js.map +1 -1
  17. package/lib/factories/IdentifierFactory.js +1 -1
  18. package/lib/factories/IdentifierFactory.js.map +1 -1
  19. package/lib/factories/LiteralFactory.js +1 -1
  20. package/lib/factories/LiteralFactory.js.map +1 -1
  21. package/lib/factories/MetadataCollection.js +1 -2
  22. package/lib/factories/MetadataCollection.js.map +1 -1
  23. package/lib/factories/MetadataFactory.js +1 -1
  24. package/lib/factories/MetadataFactory.js.map +1 -1
  25. package/lib/factories/MetadataTagFactory.js +4 -2
  26. package/lib/factories/MetadataTagFactory.js.map +1 -1
  27. package/lib/factories/StatementFactory.js +1 -1
  28. package/lib/factories/StatementFactory.js.map +1 -1
  29. package/lib/factories/TemplateFactory.js +1 -1
  30. package/lib/factories/TemplateFactory.js.map +1 -1
  31. package/lib/factories/TypeFactory.js +1 -1
  32. package/lib/factories/TypeFactory.js.map +1 -1
  33. package/lib/factories/ValueFactory.js +1 -1
  34. package/lib/factories/ValueFactory.js.map +1 -1
  35. package/lib/factories/internal/metadata/MetadataHelper.js +1 -1
  36. package/lib/factories/internal/metadata/MetadataHelper.js.map +1 -1
  37. package/lib/factories/internal/metadata/iterate_metadata_array.js +1 -2
  38. package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -1
  39. package/lib/factories/internal/metadata/iterate_metadata_tuple.js.map +1 -1
  40. package/lib/functional/Namespace.js +1 -1
  41. package/lib/functional/Namespace.js.map +1 -1
  42. package/lib/metadata/Metadata.js +1 -2
  43. package/lib/metadata/Metadata.js.map +1 -1
  44. package/lib/metadata/MetadataObject.js +1 -2
  45. package/lib/metadata/MetadataObject.js.map +1 -1
  46. package/lib/programmers/ApplicationProgrammer.js +1 -1
  47. package/lib/programmers/ApplicationProgrammer.js.map +1 -1
  48. package/lib/programmers/AssertCloneProgrammer.js +1 -1
  49. package/lib/programmers/AssertCloneProgrammer.js.map +1 -1
  50. package/lib/programmers/AssertParseProgrammer.js +1 -1
  51. package/lib/programmers/AssertParseProgrammer.js.map +1 -1
  52. package/lib/programmers/AssertProgrammer.js +1 -1
  53. package/lib/programmers/AssertProgrammer.js.map +1 -1
  54. package/lib/programmers/AssertPruneProgrammer.js +1 -1
  55. package/lib/programmers/AssertPruneProgrammer.js.map +1 -1
  56. package/lib/programmers/AssertStringifyProgrammer.js +1 -1
  57. package/lib/programmers/AssertStringifyProgrammer.js.map +1 -1
  58. package/lib/programmers/CheckerProgrammer.js +1 -1
  59. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  60. package/lib/programmers/CloneProgrammer.js +1 -1
  61. package/lib/programmers/CloneProgrammer.js.map +1 -1
  62. package/lib/programmers/FeatureProgrammer.js +1 -1
  63. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  64. package/lib/programmers/IsCloneProgrammer.js +1 -1
  65. package/lib/programmers/IsCloneProgrammer.js.map +1 -1
  66. package/lib/programmers/IsParseProgrammer.js +1 -1
  67. package/lib/programmers/IsParseProgrammer.js.map +1 -1
  68. package/lib/programmers/IsProgrammer.js +1 -1
  69. package/lib/programmers/IsProgrammer.js.map +1 -1
  70. package/lib/programmers/IsPruneProgrammer.js +1 -1
  71. package/lib/programmers/IsPruneProgrammer.js.map +1 -1
  72. package/lib/programmers/IsStringifyProgrammer.js +1 -1
  73. package/lib/programmers/IsStringifyProgrammer.js.map +1 -1
  74. package/lib/programmers/LiteralsProgrammer.js +1 -1
  75. package/lib/programmers/LiteralsProgrammer.js.map +1 -1
  76. package/lib/programmers/PruneProgrammer.js +1 -1
  77. package/lib/programmers/PruneProgrammer.js.map +1 -1
  78. package/lib/programmers/RandomProgrammer.js +1 -1
  79. package/lib/programmers/RandomProgrammer.js.map +1 -1
  80. package/lib/programmers/StringifyProgrammer.js +1 -1
  81. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  82. package/lib/programmers/TypiaProgrammer.js +1 -1
  83. package/lib/programmers/TypiaProgrammer.js.map +1 -1
  84. package/lib/programmers/ValidateCloneProgrammer.js +1 -1
  85. package/lib/programmers/ValidateCloneProgrammer.js.map +1 -1
  86. package/lib/programmers/ValidateParseProgrammer.js +1 -1
  87. package/lib/programmers/ValidateParseProgrammer.js.map +1 -1
  88. package/lib/programmers/ValidateProgrammer.js +1 -1
  89. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  90. package/lib/programmers/ValidatePruneProgrammer.js +1 -1
  91. package/lib/programmers/ValidatePruneProgrammer.js.map +1 -1
  92. package/lib/programmers/ValidateStringifyProgrammer.js +1 -1
  93. package/lib/programmers/ValidateStringifyProgrammer.js.map +1 -1
  94. package/lib/programmers/helpers/AtomicPredicator.js +1 -1
  95. package/lib/programmers/helpers/AtomicPredicator.js.map +1 -1
  96. package/lib/programmers/helpers/CloneJoiner.js +1 -1
  97. package/lib/programmers/helpers/CloneJoiner.js.map +1 -1
  98. package/lib/programmers/helpers/OptionPredicator.js +1 -1
  99. package/lib/programmers/helpers/OptionPredicator.js.map +1 -1
  100. package/lib/programmers/helpers/PruneJoiner.js +1 -1
  101. package/lib/programmers/helpers/PruneJoiner.js.map +1 -1
  102. package/lib/programmers/helpers/RandomJoiner.js +1 -1
  103. package/lib/programmers/helpers/RandomJoiner.js.map +1 -1
  104. package/lib/programmers/helpers/RandomRanger.js +1 -1
  105. package/lib/programmers/helpers/RandomRanger.js.map +1 -1
  106. package/lib/programmers/helpers/StringifyJoinder.js +1 -1
  107. package/lib/programmers/helpers/StringifyJoinder.js.map +1 -1
  108. package/lib/programmers/helpers/StringifyPredicator.js +1 -1
  109. package/lib/programmers/helpers/StringifyPredicator.js.map +1 -1
  110. package/lib/programmers/helpers/UnionExplorer.js +1 -1
  111. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  112. package/lib/programmers/helpers/UnionPredicator.js +1 -1
  113. package/lib/programmers/helpers/UnionPredicator.js.map +1 -1
  114. package/lib/programmers/internal/application_number.js +4 -1
  115. package/lib/programmers/internal/application_number.js.map +1 -1
  116. package/lib/transformers/CallExpressionTransformer.js +1 -1
  117. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  118. package/lib/transformers/FileTransformer.js +1 -1
  119. package/lib/transformers/FileTransformer.js.map +1 -1
  120. package/lib/transformers/ImportTransformer.js +1 -1
  121. package/lib/transformers/ImportTransformer.js.map +1 -1
  122. package/lib/transformers/NodeTransformer.js +1 -1
  123. package/lib/transformers/NodeTransformer.js.map +1 -1
  124. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js +1 -1
  125. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js.map +1 -1
  126. package/lib/transformers/features/miscellaneous/AssertCloneTransformer.js +1 -1
  127. package/lib/transformers/features/miscellaneous/AssertCloneTransformer.js.map +1 -1
  128. package/lib/transformers/features/miscellaneous/AssertPruneTransformer.js +1 -1
  129. package/lib/transformers/features/miscellaneous/AssertPruneTransformer.js.map +1 -1
  130. package/lib/transformers/features/miscellaneous/CloneTransformer.js +1 -1
  131. package/lib/transformers/features/miscellaneous/CloneTransformer.js.map +1 -1
  132. package/lib/transformers/features/miscellaneous/CreateAssertCloneTransformer.js +1 -1
  133. package/lib/transformers/features/miscellaneous/CreateAssertCloneTransformer.js.map +1 -1
  134. package/lib/transformers/features/miscellaneous/CreateAssertPruneTransformer.js +1 -1
  135. package/lib/transformers/features/miscellaneous/CreateAssertPruneTransformer.js.map +1 -1
  136. package/lib/transformers/features/miscellaneous/CreateCloneTransformer.js +1 -1
  137. package/lib/transformers/features/miscellaneous/CreateCloneTransformer.js.map +1 -1
  138. package/lib/transformers/features/miscellaneous/CreateIsCloneTransformer.js +1 -1
  139. package/lib/transformers/features/miscellaneous/CreateIsCloneTransformer.js.map +1 -1
  140. package/lib/transformers/features/miscellaneous/CreateIsPruneTransformer.js +1 -1
  141. package/lib/transformers/features/miscellaneous/CreateIsPruneTransformer.js.map +1 -1
  142. package/lib/transformers/features/miscellaneous/CreatePruneTransformer.js +1 -1
  143. package/lib/transformers/features/miscellaneous/CreatePruneTransformer.js.map +1 -1
  144. package/lib/transformers/features/miscellaneous/CreateRandomTransformer.js +1 -1
  145. package/lib/transformers/features/miscellaneous/CreateRandomTransformer.js.map +1 -1
  146. package/lib/transformers/features/miscellaneous/CreateValidateCloneTransformer.js +1 -1
  147. package/lib/transformers/features/miscellaneous/CreateValidateCloneTransformer.js.map +1 -1
  148. package/lib/transformers/features/miscellaneous/CreateValidatePruneTransformer.js +1 -1
  149. package/lib/transformers/features/miscellaneous/CreateValidatePruneTransformer.js.map +1 -1
  150. package/lib/transformers/features/miscellaneous/IsCloneTransformer.js +1 -1
  151. package/lib/transformers/features/miscellaneous/IsCloneTransformer.js.map +1 -1
  152. package/lib/transformers/features/miscellaneous/IsPruneTransformer.js +1 -1
  153. package/lib/transformers/features/miscellaneous/IsPruneTransformer.js.map +1 -1
  154. package/lib/transformers/features/miscellaneous/LiteralsTransformer.js +1 -1
  155. package/lib/transformers/features/miscellaneous/LiteralsTransformer.js.map +1 -1
  156. package/lib/transformers/features/miscellaneous/MetadataTransformer.js +1 -1
  157. package/lib/transformers/features/miscellaneous/MetadataTransformer.js.map +1 -1
  158. package/lib/transformers/features/miscellaneous/PruneTransformer.js +1 -1
  159. package/lib/transformers/features/miscellaneous/PruneTransformer.js.map +1 -1
  160. package/lib/transformers/features/miscellaneous/RandomTransformer.js +1 -1
  161. package/lib/transformers/features/miscellaneous/RandomTransformer.js.map +1 -1
  162. package/lib/transformers/features/miscellaneous/ValidateCloneTransformer.js +1 -1
  163. package/lib/transformers/features/miscellaneous/ValidateCloneTransformer.js.map +1 -1
  164. package/lib/transformers/features/miscellaneous/ValidatePruneTransformer.js +1 -1
  165. package/lib/transformers/features/miscellaneous/ValidatePruneTransformer.js.map +1 -1
  166. package/lib/transformers/features/parsers/AssertParseTransformer.js +1 -1
  167. package/lib/transformers/features/parsers/AssertParseTransformer.js.map +1 -1
  168. package/lib/transformers/features/parsers/CreateAssertParseTransformer.js +1 -1
  169. package/lib/transformers/features/parsers/CreateAssertParseTransformer.js.map +1 -1
  170. package/lib/transformers/features/parsers/CreateIsParseTransformer.js +1 -1
  171. package/lib/transformers/features/parsers/CreateIsParseTransformer.js.map +1 -1
  172. package/lib/transformers/features/parsers/CreateValidateParseTransformer.js +1 -1
  173. package/lib/transformers/features/parsers/CreateValidateParseTransformer.js.map +1 -1
  174. package/lib/transformers/features/parsers/IsParseTransformer.js +1 -1
  175. package/lib/transformers/features/parsers/IsParseTransformer.js.map +1 -1
  176. package/lib/transformers/features/parsers/ValidateParseTransformer.js +1 -1
  177. package/lib/transformers/features/parsers/ValidateParseTransformer.js.map +1 -1
  178. package/lib/transformers/features/stringifiers/AssertStringifyTransformer.js +1 -1
  179. package/lib/transformers/features/stringifiers/AssertStringifyTransformer.js.map +1 -1
  180. package/lib/transformers/features/stringifiers/CreateAssertStringifyTransformer.js +1 -1
  181. package/lib/transformers/features/stringifiers/CreateAssertStringifyTransformer.js.map +1 -1
  182. package/lib/transformers/features/stringifiers/CreateIsStringifyTransformer.js +1 -1
  183. package/lib/transformers/features/stringifiers/CreateIsStringifyTransformer.js.map +1 -1
  184. package/lib/transformers/features/stringifiers/CreateStringifyTransformer.js +1 -1
  185. package/lib/transformers/features/stringifiers/CreateStringifyTransformer.js.map +1 -1
  186. package/lib/transformers/features/stringifiers/CreateValidateStringifyProgrammer.js +1 -1
  187. package/lib/transformers/features/stringifiers/CreateValidateStringifyProgrammer.js.map +1 -1
  188. package/lib/transformers/features/stringifiers/IsStringifyTransformer.js +1 -1
  189. package/lib/transformers/features/stringifiers/IsStringifyTransformer.js.map +1 -1
  190. package/lib/transformers/features/stringifiers/StringifyTransformer.js +1 -1
  191. package/lib/transformers/features/stringifiers/StringifyTransformer.js.map +1 -1
  192. package/lib/transformers/features/stringifiers/ValidateStringifyTransformer.js +1 -1
  193. package/lib/transformers/features/stringifiers/ValidateStringifyTransformer.js.map +1 -1
  194. package/lib/transformers/features/validators/AssertTransformer.js +1 -1
  195. package/lib/transformers/features/validators/AssertTransformer.js.map +1 -1
  196. package/lib/transformers/features/validators/CreateAssertTransformer.js +1 -1
  197. package/lib/transformers/features/validators/CreateAssertTransformer.js.map +1 -1
  198. package/lib/transformers/features/validators/CreateIsTransformer.js +1 -1
  199. package/lib/transformers/features/validators/CreateIsTransformer.js.map +1 -1
  200. package/lib/transformers/features/validators/CreateValidateTransformer.js +1 -1
  201. package/lib/transformers/features/validators/CreateValidateTransformer.js.map +1 -1
  202. package/lib/transformers/features/validators/IsTransformer.js +1 -1
  203. package/lib/transformers/features/validators/IsTransformer.js.map +1 -1
  204. package/lib/transformers/features/validators/ValidateTransformer.js +1 -1
  205. package/lib/transformers/features/validators/ValidateTransformer.js.map +1 -1
  206. package/lib/transformers/internal/GenericTransformer.js +1 -1
  207. package/lib/transformers/internal/GenericTransformer.js.map +1 -1
  208. package/lib/utils/ArrayUtil.js +1 -1
  209. package/lib/utils/ArrayUtil.js.map +1 -1
  210. package/lib/utils/Escaper.js +1 -1
  211. package/lib/utils/Escaper.js.map +1 -1
  212. package/lib/utils/MapUtil.js +1 -1
  213. package/lib/utils/MapUtil.js.map +1 -1
  214. package/lib/utils/PatternUtil.js +1 -1
  215. package/lib/utils/PatternUtil.js.map +1 -1
  216. package/lib/utils/RandomGenerator.js +1 -1
  217. package/lib/utils/RandomGenerator.js.map +1 -1
  218. package/package.json +3 -3
  219. package/src/IRandomGenerator.ts +34 -34
  220. package/src/factories/IdentifierFactory.ts +65 -65
  221. package/src/factories/MetadataCollection.ts +254 -254
  222. package/src/factories/MetadataFactory.ts +40 -40
  223. package/src/factories/MetadataTagFactory.ts +300 -298
  224. package/src/factories/internal/metadata/emplace_metadata_array.ts +34 -34
  225. package/src/factories/internal/metadata/emplace_metadata_definition.ts +35 -35
  226. package/src/factories/internal/metadata/emplace_metadata_object.ts +142 -142
  227. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +50 -50
  228. package/src/factories/internal/metadata/explore_metadata.ts +66 -66
  229. package/src/factories/internal/metadata/iterate_metadata.ts +77 -77
  230. package/src/factories/internal/metadata/iterate_metadata_array.ts +25 -29
  231. package/src/factories/internal/metadata/iterate_metadata_collection.ts +130 -130
  232. package/src/factories/internal/metadata/iterate_metadata_definition.ts +30 -30
  233. package/src/factories/internal/metadata/iterate_metadata_object.ts +49 -49
  234. package/src/factories/internal/metadata/iterate_metadata_sort.ts +68 -68
  235. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +24 -25
  236. package/src/factories/internal/metadata/iterate_metadata_union.ts +68 -68
  237. package/src/metadata/IMetadata.ts +27 -27
  238. package/src/metadata/IMetadataAlias.ts +12 -12
  239. package/src/metadata/IMetadataApplication.ts +7 -7
  240. package/src/metadata/IMetadataArray.ts +10 -10
  241. package/src/metadata/IMetadataCollection.ts +11 -11
  242. package/src/metadata/IMetadataDictionary.ts +14 -14
  243. package/src/metadata/IMetadataObject.ts +18 -18
  244. package/src/metadata/IMetadataProperty.ts +11 -11
  245. package/src/metadata/IMetadataTuple.ts +10 -10
  246. package/src/metadata/Metadata.ts +585 -585
  247. package/src/metadata/MetadataAlias.ts +61 -61
  248. package/src/metadata/MetadataArray.ts +52 -52
  249. package/src/metadata/MetadataObject.ts +114 -114
  250. package/src/metadata/MetadataProperty.ts +64 -64
  251. package/src/metadata/MetadataTuple.ts +53 -53
  252. package/src/programmers/ApplicationProgrammer.ts +55 -55
  253. package/src/programmers/AssertProgrammer.ts +291 -291
  254. package/src/programmers/CheckerProgrammer.ts +1182 -1182
  255. package/src/programmers/CloneProgrammer.ts +595 -595
  256. package/src/programmers/FeatureProgrammer.ts +495 -495
  257. package/src/programmers/IsProgrammer.ts +250 -250
  258. package/src/programmers/LiteralsProgrammer.ts +66 -66
  259. package/src/programmers/PruneProgrammer.ts +550 -550
  260. package/src/programmers/RandomProgrammer.ts +589 -589
  261. package/src/programmers/StringifyProgrammer.ts +990 -990
  262. package/src/programmers/ValidateProgrammer.ts +313 -313
  263. package/src/programmers/helpers/FunctionImporeter.ts +78 -78
  264. package/src/programmers/helpers/RandomJoiner.ts +173 -173
  265. package/src/programmers/helpers/UnionExplorer.ts +301 -301
  266. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  267. package/src/programmers/helpers/disable_function_importer_declare.ts +26 -26
  268. package/src/programmers/internal/JSON_SCHEMA_PREFIX.ts +1 -1
  269. package/src/programmers/internal/application_array.ts +64 -64
  270. package/src/programmers/internal/application_boolean.ts +15 -15
  271. package/src/programmers/internal/application_constant.ts +26 -26
  272. package/src/programmers/internal/application_default.ts +17 -17
  273. package/src/programmers/internal/application_definition.ts +45 -45
  274. package/src/programmers/internal/application_native.ts +39 -39
  275. package/src/programmers/internal/application_number.ts +74 -71
  276. package/src/programmers/internal/application_object.ts +167 -167
  277. package/src/programmers/internal/application_schema.ts +164 -164
  278. package/src/programmers/internal/application_tuple.ts +77 -77
  279. package/src/programmers/internal/check_union_array_like.ts +329 -329
  280. package/src/programmers/internal/feature_object_entries.ts +63 -63
  281. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +16 -16
  282. package/src/schemas/IJsonApplication.ts +8 -8
  283. package/src/schemas/IJsonComponents.ts +45 -45
  284. package/src/schemas/IJsonSchema.ts +134 -134
  285. package/src/transformers/CallExpressionTransformer.ts +179 -179
  286. package/src/transformers/FileTransformer.ts +47 -47
  287. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +104 -104
  288. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +53 -53
  289. package/src/utils/ArrayUtil.ts +45 -45
  290. package/src/utils/RandomGenerator.ts +81 -81
@@ -1,595 +1,595 @@
1
- import ts from "typescript";
2
-
3
- import { ExpressionFactory } from "../factories/ExpressionFactory";
4
- import { IdentifierFactory } from "../factories/IdentifierFactory";
5
- import { MetadataCollection } from "../factories/MetadataCollection";
6
- import { MetadataFactory } from "../factories/MetadataFactory";
7
- import { StatementFactory } from "../factories/StatementFactory";
8
- import { TypeFactory } from "../factories/TypeFactory";
9
-
10
- import { IJsDocTagInfo } from "../metadata/IJsDocTagInfo";
11
- import { IMetadataTag } from "../metadata/IMetadataTag";
12
- import { Metadata } from "../metadata/Metadata";
13
- import { MetadataArray } from "../metadata/MetadataArray";
14
- import { MetadataTuple } from "../metadata/MetadataTuple";
15
-
16
- import { IProject } from "../transformers/IProject";
17
-
18
- import { FeatureProgrammer } from "./FeatureProgrammer";
19
- import { IsProgrammer } from "./IsProgrammer";
20
- import { CloneJoiner } from "./helpers/CloneJoiner";
21
- import { FunctionImporter } from "./helpers/FunctionImporeter";
22
- import { UnionExplorer } from "./helpers/UnionExplorer";
23
- import { decode_union_object } from "./internal/decode_union_object";
24
- import { wrap_metadata_rest_tuple } from "./internal/wrap_metadata_rest_tuple";
25
-
26
- export namespace CloneProgrammer {
27
- /**
28
- * @deprecated Use `write()` function instead
29
- */
30
- export const generate =
31
- (project: IProject, modulo: ts.LeftHandSideExpression) =>
32
- (type: ts.Type, name?: string) =>
33
- write(project)(modulo)(type, name);
34
-
35
- export const write =
36
- (project: IProject) => (modulo: ts.LeftHandSideExpression) => {
37
- const importer: FunctionImporter = new FunctionImporter();
38
- return FeatureProgrammer.write(project)({
39
- ...configure(project)(importer),
40
- addition: (collection) => [
41
- ...IsProgrammer.write_function_statements(project)(
42
- importer,
43
- )(collection),
44
- ...importer.declare(modulo),
45
- ],
46
- })(importer);
47
- };
48
-
49
- const write_array_functions =
50
- (config: FeatureProgrammer.IConfig) =>
51
- (importer: FunctionImporter) =>
52
- (collection: MetadataCollection): ts.VariableStatement[] =>
53
- collection
54
- .arrays()
55
- .filter((a) => a.recursive)
56
- .map((array, i) =>
57
- StatementFactory.constant(
58
- `${config.prefix}a${i}`,
59
- ts.factory.createArrowFunction(
60
- undefined,
61
- undefined,
62
- FeatureProgrammer.parameterDeclarations(config)(
63
- TypeFactory.keyword("any"),
64
- )(ts.factory.createIdentifier("input")),
65
- TypeFactory.keyword("any"),
66
- undefined,
67
- decode_array_inline(config)(importer)(
68
- ts.factory.createIdentifier("input"),
69
- array,
70
- {
71
- tracable: config.trace,
72
- source: "function",
73
- from: "array",
74
- postfix: "",
75
- },
76
- ),
77
- ),
78
- ),
79
- );
80
-
81
- const write_tuple_functions =
82
- (project: IProject) =>
83
- (config: FeatureProgrammer.IConfig) =>
84
- (importer: FunctionImporter) =>
85
- (collection: MetadataCollection): ts.VariableStatement[] =>
86
- collection
87
- .tuples()
88
- .filter((t) => t.recursive)
89
- .map((tuple, i) =>
90
- StatementFactory.constant(
91
- `${config.prefix}t${i}`,
92
- ts.factory.createArrowFunction(
93
- undefined,
94
- undefined,
95
- FeatureProgrammer.parameterDeclarations(config)(
96
- TypeFactory.keyword("any"),
97
- )(ts.factory.createIdentifier("input")),
98
- TypeFactory.keyword("any"),
99
- undefined,
100
- decode_tuple_inline(project)(config)(importer)(
101
- ts.factory.createIdentifier("input"),
102
- tuple,
103
- {
104
- tracable: config.trace,
105
- source: "function",
106
- from: "array",
107
- postfix: "",
108
- },
109
- ),
110
- ),
111
- ),
112
- );
113
-
114
- /* -----------------------------------------------------------
115
- DECODERS
116
- ----------------------------------------------------------- */
117
- const decode =
118
- (project: IProject) =>
119
- (config: FeatureProgrammer.IConfig) =>
120
- (importer: FunctionImporter) =>
121
- (
122
- input: ts.Expression,
123
- meta: Metadata,
124
- explore: FeatureProgrammer.IExplore,
125
- ): ts.Expression => {
126
- // ANY TYPE
127
- if (
128
- meta.any ||
129
- meta.arrays.some((a) => a.value.any) ||
130
- meta.tuples.some((t) => t.elements.every((e) => e.any))
131
- )
132
- return ts.factory.createCallExpression(
133
- importer.use("any"),
134
- undefined,
135
- [input],
136
- );
137
-
138
- interface IUnion {
139
- type: string;
140
- is: () => ts.Expression;
141
- value: () => ts.Expression;
142
- }
143
- const unions: IUnion[] = [];
144
-
145
- //----
146
- // LIST UP UNION TYPES
147
- //----
148
- // toJSON() METHOD
149
- if (meta.resolved !== null)
150
- unions.push({
151
- type: "resolved",
152
- is: () => IsProgrammer.decode_to_json(true)(input),
153
- value: () =>
154
- decode_to_json(project)(config)(importer)(
155
- input,
156
- meta.resolved!,
157
- explore,
158
- ),
159
- });
160
-
161
- // TUPLES
162
- for (const tuple of meta.tuples)
163
- unions.push({
164
- type: "tuple",
165
- is: () =>
166
- IsProgrammer.decode(project)(importer)(
167
- input,
168
- (() => {
169
- const partial = Metadata.initialize();
170
- partial.tuples.push(tuple);
171
- return partial;
172
- })(),
173
- explore,
174
- [],
175
- [],
176
- ),
177
- value: () =>
178
- decode_tuple(project)(config)(importer)(
179
- input,
180
- tuple,
181
- explore,
182
- ),
183
- });
184
-
185
- // ARRAYS
186
- if (meta.arrays.length)
187
- unions.push({
188
- type: "array",
189
- is: () => ExpressionFactory.isArray(input),
190
- value: () =>
191
- explore_arrays(project)(config)(importer)(
192
- input,
193
- meta.arrays,
194
- {
195
- ...explore,
196
- from: "array",
197
- },
198
- ),
199
- });
200
-
201
- // NATIVE TYPES
202
- if (meta.sets.length)
203
- unions.push({
204
- type: "set",
205
- is: () => ExpressionFactory.isInstanceOf("Set")(input),
206
- value: () => ts.factory.createIdentifier("{}"),
207
- });
208
- if (meta.maps.length)
209
- unions.push({
210
- type: "map",
211
- is: () => ExpressionFactory.isInstanceOf("Map")(input),
212
- value: () => ts.factory.createIdentifier("{}"),
213
- });
214
- for (const native of meta.natives)
215
- unions.push({
216
- type: "native",
217
- is: () => ExpressionFactory.isInstanceOf(native)(input),
218
- value: () =>
219
- native === "Boolean" ||
220
- native === "Number" ||
221
- native === "String"
222
- ? ts.factory.createCallExpression(
223
- IdentifierFactory.access(input)("valueOf"),
224
- undefined,
225
- undefined,
226
- )
227
- : ts.factory.createIdentifier("{}"),
228
- });
229
-
230
- // OBJECTS
231
- if (meta.objects.length)
232
- unions.push({
233
- type: "object",
234
- is: () =>
235
- ExpressionFactory.isObject({
236
- checkNull: true,
237
- checkArray: false,
238
- })(input),
239
- value: () =>
240
- explore_objects(config)(importer)(input, meta, {
241
- ...explore,
242
- from: "object",
243
- }),
244
- });
245
-
246
- // COMPOSITION
247
- let last: ts.Expression = input;
248
- for (const u of unions.reverse())
249
- last = ts.factory.createConditionalExpression(
250
- u.is(),
251
- undefined,
252
- u.value(),
253
- undefined,
254
- last,
255
- );
256
- return ts.factory.createAsExpression(
257
- last,
258
- TypeFactory.keyword("any"),
259
- );
260
- };
261
-
262
- const decode_to_json =
263
- (project: IProject) =>
264
- (config: FeatureProgrammer.IConfig) =>
265
- (importer: FunctionImporter) =>
266
- (
267
- input: ts.Expression,
268
- resolved: Metadata,
269
- explore: FeatureProgrammer.IExplore,
270
- ): ts.Expression => {
271
- return decode(project)(config)(importer)(
272
- ts.factory.createCallExpression(
273
- IdentifierFactory.access(input)("toJSON"),
274
- undefined,
275
- [],
276
- ),
277
- resolved,
278
- explore,
279
- );
280
- };
281
-
282
- const decode_object = (importer: FunctionImporter) =>
283
- FeatureProgrammer.decode_object({
284
- trace: false,
285
- path: false,
286
- prefix: PREFIX,
287
- })(importer);
288
-
289
- const decode_array =
290
- (config: FeatureProgrammer.IConfig) =>
291
- (importer: FunctionImporter) =>
292
- (
293
- input: ts.Expression,
294
- array: MetadataArray,
295
- explore: FeatureProgrammer.IExplore,
296
- ) =>
297
- array.recursive
298
- ? ts.factory.createCallExpression(
299
- ts.factory.createIdentifier(
300
- importer.useLocal(`${config.prefix}a${array.index}`),
301
- ),
302
- undefined,
303
- FeatureProgrammer.argumentsArray(config)({
304
- ...explore,
305
- source: "function",
306
- from: "array",
307
- })(input),
308
- )
309
- : decode_array_inline(config)(importer)(input, array, explore);
310
-
311
- const decode_array_inline =
312
- (config: FeatureProgrammer.IConfig) =>
313
- (importer: FunctionImporter) =>
314
- (
315
- input: ts.Expression,
316
- array: MetadataArray,
317
- explore: FeatureProgrammer.IExplore,
318
- ) =>
319
- FeatureProgrammer.decode_array(config)(importer)(CloneJoiner.array)(
320
- input,
321
- array,
322
- explore,
323
- [],
324
- [],
325
- );
326
-
327
- const decode_tuple =
328
- (project: IProject) =>
329
- (config: FeatureProgrammer.IConfig) =>
330
- (importer: FunctionImporter) =>
331
- (
332
- input: ts.Expression,
333
- tuple: MetadataTuple,
334
- explore: FeatureProgrammer.IExplore,
335
- ): ts.Expression =>
336
- tuple.recursive
337
- ? ts.factory.createCallExpression(
338
- ts.factory.createIdentifier(
339
- importer.useLocal(`${config.prefix}t${tuple.index}`),
340
- ),
341
- undefined,
342
- FeatureProgrammer.argumentsArray(config)({
343
- ...explore,
344
- source: "function",
345
- })(input),
346
- )
347
- : decode_tuple_inline(project)(config)(importer)(
348
- input,
349
- tuple,
350
- explore,
351
- );
352
-
353
- const decode_tuple_inline =
354
- (project: IProject) =>
355
- (config: FeatureProgrammer.IConfig) =>
356
- (importer: FunctionImporter) =>
357
- (
358
- input: ts.Expression,
359
- tuple: MetadataTuple,
360
- explore: FeatureProgrammer.IExplore,
361
- ): ts.Expression => {
362
- const children: ts.Expression[] = tuple.elements
363
- .filter((m) => m.rest === null)
364
- .map((elem, index) =>
365
- decode(project)(config)(importer)(
366
- ts.factory.createElementAccessExpression(input, index),
367
- elem,
368
- {
369
- ...explore,
370
- from: "array",
371
- postfix: explore.postfix.length
372
- ? `${explore.postfix.slice(0, -1)}[${index}]"`
373
- : `"[${index}]"`,
374
- },
375
- ),
376
- );
377
- const rest = (() => {
378
- if (tuple.elements.length === 0) return null;
379
-
380
- const last: Metadata = tuple.elements.at(-1)!;
381
- const rest: Metadata | null = last.rest;
382
- if (rest === null) return null;
383
-
384
- return decode(project)(config)(importer)(
385
- ts.factory.createCallExpression(
386
- IdentifierFactory.access(input)("slice"),
387
- undefined,
388
- [
389
- ts.factory.createNumericLiteral(
390
- tuple.elements.length - 1,
391
- ),
392
- ],
393
- ),
394
- wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!),
395
- {
396
- ...explore,
397
- start: tuple.elements.length - 1,
398
- },
399
- );
400
- })();
401
- return CloneJoiner.tuple(children, rest);
402
- };
403
-
404
- /* -----------------------------------------------------------
405
- EXPLORERS FOR UNION TYPES
406
- ----------------------------------------------------------- */
407
- const explore_objects =
408
- (config: FeatureProgrammer.IConfig) =>
409
- (importer: FunctionImporter) =>
410
- (
411
- input: ts.Expression,
412
- meta: Metadata,
413
- explore: FeatureProgrammer.IExplore,
414
- ) => {
415
- if (meta.objects.length === 1)
416
- return decode_object(importer)(
417
- input,
418
- meta.objects[0]!,
419
- explore,
420
- );
421
-
422
- return ts.factory.createCallExpression(
423
- ts.factory.createIdentifier(
424
- importer.useLocal(`${PREFIX}u${meta.union_index!}`),
425
- ),
426
- undefined,
427
- FeatureProgrammer.argumentsArray(config)(explore)(input),
428
- );
429
- };
430
-
431
- const explore_arrays =
432
- (project: IProject) =>
433
- (config: FeatureProgrammer.IConfig) =>
434
- (importer: FunctionImporter) =>
435
- (
436
- input: ts.Expression,
437
- elements: MetadataArray[],
438
- explore: FeatureProgrammer.IExplore,
439
- ): ts.Expression =>
440
- explore_array_like_union_types(config)(importer)(
441
- UnionExplorer.array({
442
- checker: IsProgrammer.decode(project)(importer),
443
- decoder: decode_array(config)(importer),
444
- empty: ts.factory.createIdentifier("[]"),
445
- success: ts.factory.createTrue(),
446
- failure: (input, expected) =>
447
- create_throw_error(importer)(expected)(input),
448
- }),
449
- )(input, elements, explore);
450
-
451
- const explore_array_like_union_types =
452
- (config: FeatureProgrammer.IConfig) =>
453
- (importer: FunctionImporter) =>
454
- <T extends MetadataArray | MetadataTuple>(
455
- factory: (
456
- parameters: ts.ParameterDeclaration[],
457
- ) => (
458
- input: ts.Expression,
459
- elements: T[],
460
- explore: FeatureProgrammer.IExplore,
461
- tags: IMetadataTag[],
462
- jsDocTags: IJsDocTagInfo[],
463
- ) => ts.ArrowFunction,
464
- ) =>
465
- (
466
- input: ts.Expression,
467
- elements: T[],
468
- explore: FeatureProgrammer.IExplore,
469
- ): ts.Expression => {
470
- const arrow =
471
- (parameters: ts.ParameterDeclaration[]) =>
472
- (explore: FeatureProgrammer.IExplore) =>
473
- (input: ts.Expression): ts.ArrowFunction =>
474
- factory(parameters)(input, elements, explore, [], []);
475
- if (elements.every((e) => e.recursive === false))
476
- ts.factory.createCallExpression(
477
- arrow([])(explore)(input),
478
- undefined,
479
- [],
480
- );
481
-
482
- explore = {
483
- ...explore,
484
- source: "function",
485
- from: "array",
486
- };
487
- return ts.factory.createCallExpression(
488
- ts.factory.createIdentifier(
489
- importer.emplaceUnion(
490
- config.prefix,
491
- elements.map((e) => e.name).join(" | "),
492
- () =>
493
- arrow(
494
- FeatureProgrammer.parameterDeclarations(config)(
495
- TypeFactory.keyword("any"),
496
- )(ts.factory.createIdentifier("input")),
497
- )({
498
- ...explore,
499
- postfix: "",
500
- })(ts.factory.createIdentifier("input")),
501
- ),
502
- ),
503
- undefined,
504
- FeatureProgrammer.argumentsArray(config)(explore)(input),
505
- );
506
- };
507
-
508
- /* -----------------------------------------------------------
509
- CONFIGURATIONS
510
- ----------------------------------------------------------- */
511
- const PREFIX = "$c";
512
-
513
- const configure =
514
- (project: IProject) =>
515
- (importer: FunctionImporter): FeatureProgrammer.IConfig => {
516
- const config: FeatureProgrammer.IConfig = {
517
- types: {
518
- input: (type, name) =>
519
- ts.factory.createTypeReferenceNode(
520
- name ??
521
- TypeFactory.getFullName(project.checker)(type),
522
- ),
523
- output: (type, name) =>
524
- ts.factory.createTypeReferenceNode(
525
- `typia.Primitive<${
526
- name ??
527
- TypeFactory.getFullName(project.checker)(type)
528
- }>`,
529
- ),
530
- },
531
- prefix: PREFIX,
532
- trace: false,
533
- path: false,
534
- initializer,
535
- decoder: () => decode(project)(config)(importer),
536
- objector: {
537
- checker: () => IsProgrammer.decode(project)(importer),
538
- decoder: () => decode_object(importer),
539
- joiner: CloneJoiner.object,
540
- unionizer: decode_union_object(
541
- IsProgrammer.decode_object(importer),
542
- )(decode_object(importer))((exp) => exp)(
543
- (input, expected) =>
544
- create_throw_error(importer)(expected)(input),
545
- ),
546
- failure: (input, expected) =>
547
- create_throw_error(importer)(expected)(input),
548
- },
549
- generator: {
550
- arrays: () => write_array_functions(config)(importer),
551
- tuples: () =>
552
- write_tuple_functions(project)(config)(importer),
553
- },
554
- };
555
- return config;
556
- };
557
-
558
- const initializer: FeatureProgrammer.IConfig["initializer"] =
559
- ({ checker }) =>
560
- (type) => {
561
- const collection = new MetadataCollection();
562
- const meta = MetadataFactory.analyze(checker)({
563
- resolve: true,
564
- constant: true,
565
- absorb: true,
566
- })(collection)(type);
567
- return [collection, meta];
568
- };
569
-
570
- const create_throw_error =
571
- (importer: FunctionImporter) =>
572
- (expected: string) =>
573
- (value: ts.Expression) =>
574
- ts.factory.createExpressionStatement(
575
- ts.factory.createCallExpression(
576
- importer.use("throws"),
577
- [],
578
- [
579
- ts.factory.createObjectLiteralExpression(
580
- [
581
- ts.factory.createPropertyAssignment(
582
- "expected",
583
- ts.factory.createStringLiteral(expected),
584
- ),
585
- ts.factory.createPropertyAssignment(
586
- "value",
587
- value,
588
- ),
589
- ],
590
- true,
591
- ),
592
- ],
593
- ),
594
- );
595
- }
1
+ import ts from "typescript";
2
+
3
+ import { ExpressionFactory } from "../factories/ExpressionFactory";
4
+ import { IdentifierFactory } from "../factories/IdentifierFactory";
5
+ import { MetadataCollection } from "../factories/MetadataCollection";
6
+ import { MetadataFactory } from "../factories/MetadataFactory";
7
+ import { StatementFactory } from "../factories/StatementFactory";
8
+ import { TypeFactory } from "../factories/TypeFactory";
9
+
10
+ import { IJsDocTagInfo } from "../metadata/IJsDocTagInfo";
11
+ import { IMetadataTag } from "../metadata/IMetadataTag";
12
+ import { Metadata } from "../metadata/Metadata";
13
+ import { MetadataArray } from "../metadata/MetadataArray";
14
+ import { MetadataTuple } from "../metadata/MetadataTuple";
15
+
16
+ import { IProject } from "../transformers/IProject";
17
+
18
+ import { FeatureProgrammer } from "./FeatureProgrammer";
19
+ import { IsProgrammer } from "./IsProgrammer";
20
+ import { CloneJoiner } from "./helpers/CloneJoiner";
21
+ import { FunctionImporter } from "./helpers/FunctionImporeter";
22
+ import { UnionExplorer } from "./helpers/UnionExplorer";
23
+ import { decode_union_object } from "./internal/decode_union_object";
24
+ import { wrap_metadata_rest_tuple } from "./internal/wrap_metadata_rest_tuple";
25
+
26
+ export namespace CloneProgrammer {
27
+ /**
28
+ * @deprecated Use `write()` function instead
29
+ */
30
+ export const generate =
31
+ (project: IProject, modulo: ts.LeftHandSideExpression) =>
32
+ (type: ts.Type, name?: string) =>
33
+ write(project)(modulo)(type, name);
34
+
35
+ export const write =
36
+ (project: IProject) => (modulo: ts.LeftHandSideExpression) => {
37
+ const importer: FunctionImporter = new FunctionImporter();
38
+ return FeatureProgrammer.write(project)({
39
+ ...configure(project)(importer),
40
+ addition: (collection) => [
41
+ ...IsProgrammer.write_function_statements(project)(
42
+ importer,
43
+ )(collection),
44
+ ...importer.declare(modulo),
45
+ ],
46
+ })(importer);
47
+ };
48
+
49
+ const write_array_functions =
50
+ (config: FeatureProgrammer.IConfig) =>
51
+ (importer: FunctionImporter) =>
52
+ (collection: MetadataCollection): ts.VariableStatement[] =>
53
+ collection
54
+ .arrays()
55
+ .filter((a) => a.recursive)
56
+ .map((array, i) =>
57
+ StatementFactory.constant(
58
+ `${config.prefix}a${i}`,
59
+ ts.factory.createArrowFunction(
60
+ undefined,
61
+ undefined,
62
+ FeatureProgrammer.parameterDeclarations(config)(
63
+ TypeFactory.keyword("any"),
64
+ )(ts.factory.createIdentifier("input")),
65
+ TypeFactory.keyword("any"),
66
+ undefined,
67
+ decode_array_inline(config)(importer)(
68
+ ts.factory.createIdentifier("input"),
69
+ array,
70
+ {
71
+ tracable: config.trace,
72
+ source: "function",
73
+ from: "array",
74
+ postfix: "",
75
+ },
76
+ ),
77
+ ),
78
+ ),
79
+ );
80
+
81
+ const write_tuple_functions =
82
+ (project: IProject) =>
83
+ (config: FeatureProgrammer.IConfig) =>
84
+ (importer: FunctionImporter) =>
85
+ (collection: MetadataCollection): ts.VariableStatement[] =>
86
+ collection
87
+ .tuples()
88
+ .filter((t) => t.recursive)
89
+ .map((tuple, i) =>
90
+ StatementFactory.constant(
91
+ `${config.prefix}t${i}`,
92
+ ts.factory.createArrowFunction(
93
+ undefined,
94
+ undefined,
95
+ FeatureProgrammer.parameterDeclarations(config)(
96
+ TypeFactory.keyword("any"),
97
+ )(ts.factory.createIdentifier("input")),
98
+ TypeFactory.keyword("any"),
99
+ undefined,
100
+ decode_tuple_inline(project)(config)(importer)(
101
+ ts.factory.createIdentifier("input"),
102
+ tuple,
103
+ {
104
+ tracable: config.trace,
105
+ source: "function",
106
+ from: "array",
107
+ postfix: "",
108
+ },
109
+ ),
110
+ ),
111
+ ),
112
+ );
113
+
114
+ /* -----------------------------------------------------------
115
+ DECODERS
116
+ ----------------------------------------------------------- */
117
+ const decode =
118
+ (project: IProject) =>
119
+ (config: FeatureProgrammer.IConfig) =>
120
+ (importer: FunctionImporter) =>
121
+ (
122
+ input: ts.Expression,
123
+ meta: Metadata,
124
+ explore: FeatureProgrammer.IExplore,
125
+ ): ts.Expression => {
126
+ // ANY TYPE
127
+ if (
128
+ meta.any ||
129
+ meta.arrays.some((a) => a.value.any) ||
130
+ meta.tuples.some((t) => t.elements.every((e) => e.any))
131
+ )
132
+ return ts.factory.createCallExpression(
133
+ importer.use("any"),
134
+ undefined,
135
+ [input],
136
+ );
137
+
138
+ interface IUnion {
139
+ type: string;
140
+ is: () => ts.Expression;
141
+ value: () => ts.Expression;
142
+ }
143
+ const unions: IUnion[] = [];
144
+
145
+ //----
146
+ // LIST UP UNION TYPES
147
+ //----
148
+ // toJSON() METHOD
149
+ if (meta.resolved !== null)
150
+ unions.push({
151
+ type: "resolved",
152
+ is: () => IsProgrammer.decode_to_json(true)(input),
153
+ value: () =>
154
+ decode_to_json(project)(config)(importer)(
155
+ input,
156
+ meta.resolved!,
157
+ explore,
158
+ ),
159
+ });
160
+
161
+ // TUPLES
162
+ for (const tuple of meta.tuples)
163
+ unions.push({
164
+ type: "tuple",
165
+ is: () =>
166
+ IsProgrammer.decode(project)(importer)(
167
+ input,
168
+ (() => {
169
+ const partial = Metadata.initialize();
170
+ partial.tuples.push(tuple);
171
+ return partial;
172
+ })(),
173
+ explore,
174
+ [],
175
+ [],
176
+ ),
177
+ value: () =>
178
+ decode_tuple(project)(config)(importer)(
179
+ input,
180
+ tuple,
181
+ explore,
182
+ ),
183
+ });
184
+
185
+ // ARRAYS
186
+ if (meta.arrays.length)
187
+ unions.push({
188
+ type: "array",
189
+ is: () => ExpressionFactory.isArray(input),
190
+ value: () =>
191
+ explore_arrays(project)(config)(importer)(
192
+ input,
193
+ meta.arrays,
194
+ {
195
+ ...explore,
196
+ from: "array",
197
+ },
198
+ ),
199
+ });
200
+
201
+ // NATIVE TYPES
202
+ if (meta.sets.length)
203
+ unions.push({
204
+ type: "set",
205
+ is: () => ExpressionFactory.isInstanceOf("Set")(input),
206
+ value: () => ts.factory.createIdentifier("{}"),
207
+ });
208
+ if (meta.maps.length)
209
+ unions.push({
210
+ type: "map",
211
+ is: () => ExpressionFactory.isInstanceOf("Map")(input),
212
+ value: () => ts.factory.createIdentifier("{}"),
213
+ });
214
+ for (const native of meta.natives)
215
+ unions.push({
216
+ type: "native",
217
+ is: () => ExpressionFactory.isInstanceOf(native)(input),
218
+ value: () =>
219
+ native === "Boolean" ||
220
+ native === "Number" ||
221
+ native === "String"
222
+ ? ts.factory.createCallExpression(
223
+ IdentifierFactory.access(input)("valueOf"),
224
+ undefined,
225
+ undefined,
226
+ )
227
+ : ts.factory.createIdentifier("{}"),
228
+ });
229
+
230
+ // OBJECTS
231
+ if (meta.objects.length)
232
+ unions.push({
233
+ type: "object",
234
+ is: () =>
235
+ ExpressionFactory.isObject({
236
+ checkNull: true,
237
+ checkArray: false,
238
+ })(input),
239
+ value: () =>
240
+ explore_objects(config)(importer)(input, meta, {
241
+ ...explore,
242
+ from: "object",
243
+ }),
244
+ });
245
+
246
+ // COMPOSITION
247
+ let last: ts.Expression = input;
248
+ for (const u of unions.reverse())
249
+ last = ts.factory.createConditionalExpression(
250
+ u.is(),
251
+ undefined,
252
+ u.value(),
253
+ undefined,
254
+ last,
255
+ );
256
+ return ts.factory.createAsExpression(
257
+ last,
258
+ TypeFactory.keyword("any"),
259
+ );
260
+ };
261
+
262
+ const decode_to_json =
263
+ (project: IProject) =>
264
+ (config: FeatureProgrammer.IConfig) =>
265
+ (importer: FunctionImporter) =>
266
+ (
267
+ input: ts.Expression,
268
+ resolved: Metadata,
269
+ explore: FeatureProgrammer.IExplore,
270
+ ): ts.Expression => {
271
+ return decode(project)(config)(importer)(
272
+ ts.factory.createCallExpression(
273
+ IdentifierFactory.access(input)("toJSON"),
274
+ undefined,
275
+ [],
276
+ ),
277
+ resolved,
278
+ explore,
279
+ );
280
+ };
281
+
282
+ const decode_object = (importer: FunctionImporter) =>
283
+ FeatureProgrammer.decode_object({
284
+ trace: false,
285
+ path: false,
286
+ prefix: PREFIX,
287
+ })(importer);
288
+
289
+ const decode_array =
290
+ (config: FeatureProgrammer.IConfig) =>
291
+ (importer: FunctionImporter) =>
292
+ (
293
+ input: ts.Expression,
294
+ array: MetadataArray,
295
+ explore: FeatureProgrammer.IExplore,
296
+ ) =>
297
+ array.recursive
298
+ ? ts.factory.createCallExpression(
299
+ ts.factory.createIdentifier(
300
+ importer.useLocal(`${config.prefix}a${array.index}`),
301
+ ),
302
+ undefined,
303
+ FeatureProgrammer.argumentsArray(config)({
304
+ ...explore,
305
+ source: "function",
306
+ from: "array",
307
+ })(input),
308
+ )
309
+ : decode_array_inline(config)(importer)(input, array, explore);
310
+
311
+ const decode_array_inline =
312
+ (config: FeatureProgrammer.IConfig) =>
313
+ (importer: FunctionImporter) =>
314
+ (
315
+ input: ts.Expression,
316
+ array: MetadataArray,
317
+ explore: FeatureProgrammer.IExplore,
318
+ ) =>
319
+ FeatureProgrammer.decode_array(config)(importer)(CloneJoiner.array)(
320
+ input,
321
+ array,
322
+ explore,
323
+ [],
324
+ [],
325
+ );
326
+
327
+ const decode_tuple =
328
+ (project: IProject) =>
329
+ (config: FeatureProgrammer.IConfig) =>
330
+ (importer: FunctionImporter) =>
331
+ (
332
+ input: ts.Expression,
333
+ tuple: MetadataTuple,
334
+ explore: FeatureProgrammer.IExplore,
335
+ ): ts.Expression =>
336
+ tuple.recursive
337
+ ? ts.factory.createCallExpression(
338
+ ts.factory.createIdentifier(
339
+ importer.useLocal(`${config.prefix}t${tuple.index}`),
340
+ ),
341
+ undefined,
342
+ FeatureProgrammer.argumentsArray(config)({
343
+ ...explore,
344
+ source: "function",
345
+ })(input),
346
+ )
347
+ : decode_tuple_inline(project)(config)(importer)(
348
+ input,
349
+ tuple,
350
+ explore,
351
+ );
352
+
353
+ const decode_tuple_inline =
354
+ (project: IProject) =>
355
+ (config: FeatureProgrammer.IConfig) =>
356
+ (importer: FunctionImporter) =>
357
+ (
358
+ input: ts.Expression,
359
+ tuple: MetadataTuple,
360
+ explore: FeatureProgrammer.IExplore,
361
+ ): ts.Expression => {
362
+ const children: ts.Expression[] = tuple.elements
363
+ .filter((m) => m.rest === null)
364
+ .map((elem, index) =>
365
+ decode(project)(config)(importer)(
366
+ ts.factory.createElementAccessExpression(input, index),
367
+ elem,
368
+ {
369
+ ...explore,
370
+ from: "array",
371
+ postfix: explore.postfix.length
372
+ ? `${explore.postfix.slice(0, -1)}[${index}]"`
373
+ : `"[${index}]"`,
374
+ },
375
+ ),
376
+ );
377
+ const rest = (() => {
378
+ if (tuple.elements.length === 0) return null;
379
+
380
+ const last: Metadata = tuple.elements.at(-1)!;
381
+ const rest: Metadata | null = last.rest;
382
+ if (rest === null) return null;
383
+
384
+ return decode(project)(config)(importer)(
385
+ ts.factory.createCallExpression(
386
+ IdentifierFactory.access(input)("slice"),
387
+ undefined,
388
+ [
389
+ ts.factory.createNumericLiteral(
390
+ tuple.elements.length - 1,
391
+ ),
392
+ ],
393
+ ),
394
+ wrap_metadata_rest_tuple(tuple.elements.at(-1)!.rest!),
395
+ {
396
+ ...explore,
397
+ start: tuple.elements.length - 1,
398
+ },
399
+ );
400
+ })();
401
+ return CloneJoiner.tuple(children, rest);
402
+ };
403
+
404
+ /* -----------------------------------------------------------
405
+ EXPLORERS FOR UNION TYPES
406
+ ----------------------------------------------------------- */
407
+ const explore_objects =
408
+ (config: FeatureProgrammer.IConfig) =>
409
+ (importer: FunctionImporter) =>
410
+ (
411
+ input: ts.Expression,
412
+ meta: Metadata,
413
+ explore: FeatureProgrammer.IExplore,
414
+ ) => {
415
+ if (meta.objects.length === 1)
416
+ return decode_object(importer)(
417
+ input,
418
+ meta.objects[0]!,
419
+ explore,
420
+ );
421
+
422
+ return ts.factory.createCallExpression(
423
+ ts.factory.createIdentifier(
424
+ importer.useLocal(`${PREFIX}u${meta.union_index!}`),
425
+ ),
426
+ undefined,
427
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
428
+ );
429
+ };
430
+
431
+ const explore_arrays =
432
+ (project: IProject) =>
433
+ (config: FeatureProgrammer.IConfig) =>
434
+ (importer: FunctionImporter) =>
435
+ (
436
+ input: ts.Expression,
437
+ elements: MetadataArray[],
438
+ explore: FeatureProgrammer.IExplore,
439
+ ): ts.Expression =>
440
+ explore_array_like_union_types(config)(importer)(
441
+ UnionExplorer.array({
442
+ checker: IsProgrammer.decode(project)(importer),
443
+ decoder: decode_array(config)(importer),
444
+ empty: ts.factory.createIdentifier("[]"),
445
+ success: ts.factory.createTrue(),
446
+ failure: (input, expected) =>
447
+ create_throw_error(importer)(expected)(input),
448
+ }),
449
+ )(input, elements, explore);
450
+
451
+ const explore_array_like_union_types =
452
+ (config: FeatureProgrammer.IConfig) =>
453
+ (importer: FunctionImporter) =>
454
+ <T extends MetadataArray | MetadataTuple>(
455
+ factory: (
456
+ parameters: ts.ParameterDeclaration[],
457
+ ) => (
458
+ input: ts.Expression,
459
+ elements: T[],
460
+ explore: FeatureProgrammer.IExplore,
461
+ tags: IMetadataTag[],
462
+ jsDocTags: IJsDocTagInfo[],
463
+ ) => ts.ArrowFunction,
464
+ ) =>
465
+ (
466
+ input: ts.Expression,
467
+ elements: T[],
468
+ explore: FeatureProgrammer.IExplore,
469
+ ): ts.Expression => {
470
+ const arrow =
471
+ (parameters: ts.ParameterDeclaration[]) =>
472
+ (explore: FeatureProgrammer.IExplore) =>
473
+ (input: ts.Expression): ts.ArrowFunction =>
474
+ factory(parameters)(input, elements, explore, [], []);
475
+ if (elements.every((e) => e.recursive === false))
476
+ ts.factory.createCallExpression(
477
+ arrow([])(explore)(input),
478
+ undefined,
479
+ [],
480
+ );
481
+
482
+ explore = {
483
+ ...explore,
484
+ source: "function",
485
+ from: "array",
486
+ };
487
+ return ts.factory.createCallExpression(
488
+ ts.factory.createIdentifier(
489
+ importer.emplaceUnion(
490
+ config.prefix,
491
+ elements.map((e) => e.name).join(" | "),
492
+ () =>
493
+ arrow(
494
+ FeatureProgrammer.parameterDeclarations(config)(
495
+ TypeFactory.keyword("any"),
496
+ )(ts.factory.createIdentifier("input")),
497
+ )({
498
+ ...explore,
499
+ postfix: "",
500
+ })(ts.factory.createIdentifier("input")),
501
+ ),
502
+ ),
503
+ undefined,
504
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
505
+ );
506
+ };
507
+
508
+ /* -----------------------------------------------------------
509
+ CONFIGURATIONS
510
+ ----------------------------------------------------------- */
511
+ const PREFIX = "$c";
512
+
513
+ const configure =
514
+ (project: IProject) =>
515
+ (importer: FunctionImporter): FeatureProgrammer.IConfig => {
516
+ const config: FeatureProgrammer.IConfig = {
517
+ types: {
518
+ input: (type, name) =>
519
+ ts.factory.createTypeReferenceNode(
520
+ name ??
521
+ TypeFactory.getFullName(project.checker)(type),
522
+ ),
523
+ output: (type, name) =>
524
+ ts.factory.createTypeReferenceNode(
525
+ `typia.Primitive<${
526
+ name ??
527
+ TypeFactory.getFullName(project.checker)(type)
528
+ }>`,
529
+ ),
530
+ },
531
+ prefix: PREFIX,
532
+ trace: false,
533
+ path: false,
534
+ initializer,
535
+ decoder: () => decode(project)(config)(importer),
536
+ objector: {
537
+ checker: () => IsProgrammer.decode(project)(importer),
538
+ decoder: () => decode_object(importer),
539
+ joiner: CloneJoiner.object,
540
+ unionizer: decode_union_object(
541
+ IsProgrammer.decode_object(importer),
542
+ )(decode_object(importer))((exp) => exp)(
543
+ (input, expected) =>
544
+ create_throw_error(importer)(expected)(input),
545
+ ),
546
+ failure: (input, expected) =>
547
+ create_throw_error(importer)(expected)(input),
548
+ },
549
+ generator: {
550
+ arrays: () => write_array_functions(config)(importer),
551
+ tuples: () =>
552
+ write_tuple_functions(project)(config)(importer),
553
+ },
554
+ };
555
+ return config;
556
+ };
557
+
558
+ const initializer: FeatureProgrammer.IConfig["initializer"] =
559
+ ({ checker }) =>
560
+ (type) => {
561
+ const collection = new MetadataCollection();
562
+ const meta = MetadataFactory.analyze(checker)({
563
+ resolve: true,
564
+ constant: true,
565
+ absorb: true,
566
+ })(collection)(type);
567
+ return [collection, meta];
568
+ };
569
+
570
+ const create_throw_error =
571
+ (importer: FunctionImporter) =>
572
+ (expected: string) =>
573
+ (value: ts.Expression) =>
574
+ ts.factory.createExpressionStatement(
575
+ ts.factory.createCallExpression(
576
+ importer.use("throws"),
577
+ [],
578
+ [
579
+ ts.factory.createObjectLiteralExpression(
580
+ [
581
+ ts.factory.createPropertyAssignment(
582
+ "expected",
583
+ ts.factory.createStringLiteral(expected),
584
+ ),
585
+ ts.factory.createPropertyAssignment(
586
+ "value",
587
+ value,
588
+ ),
589
+ ],
590
+ true,
591
+ ),
592
+ ],
593
+ ),
594
+ );
595
+ }