typia 3.6.0-dev.20230219 → 3.6.0-dev.20230225

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 (291) hide show
  1. package/README.md +2 -2
  2. package/lib/IRandomGenerator.d.ts +8 -8
  3. package/lib/Primitive.d.ts +2 -1
  4. package/lib/executable/TypiaGenerateWizard.js +4 -4
  5. package/lib/executable/TypiaGenerateWizard.js.map +1 -1
  6. package/lib/executable/setup/ArgumentParser.js +3 -26
  7. package/lib/executable/setup/ArgumentParser.js.map +1 -1
  8. package/lib/executable/setup/FileRetriever.d.ts +5 -0
  9. package/lib/executable/setup/FileRetriever.js +109 -0
  10. package/lib/executable/setup/FileRetriever.js.map +1 -0
  11. package/lib/executable/setup/PackageManager.js +3 -17
  12. package/lib/executable/setup/PackageManager.js.map +1 -1
  13. package/lib/executable/setup/PluginConfigurator.js +2 -25
  14. package/lib/executable/setup/PluginConfigurator.js.map +1 -1
  15. package/lib/executable/typia.js +1 -1
  16. package/lib/executable/typia.js.map +1 -1
  17. package/lib/factories/TypeFactory.js +2 -1
  18. package/lib/factories/TypeFactory.js.map +1 -1
  19. package/lib/factories/TypiaFileFactory.d.ts +8 -0
  20. package/lib/{generate/TypiaGenerator.js → factories/TypiaFileFactory.js} +96 -71
  21. package/lib/factories/TypiaFileFactory.js.map +1 -0
  22. package/lib/module.d.ts +7 -7
  23. package/lib/programmers/AssertCloneProgrammer.js +2 -5
  24. package/lib/programmers/AssertCloneProgrammer.js.map +1 -1
  25. package/lib/programmers/AssertParseProgrammer.js +1 -4
  26. package/lib/programmers/AssertParseProgrammer.js.map +1 -1
  27. package/lib/programmers/AssertProgrammer.js +13 -12
  28. package/lib/programmers/AssertProgrammer.js.map +1 -1
  29. package/lib/programmers/AssertPruneProgrammer.js +1 -2
  30. package/lib/programmers/AssertPruneProgrammer.js.map +1 -1
  31. package/lib/programmers/AssertStringifyProgrammer.js +1 -2
  32. package/lib/programmers/AssertStringifyProgrammer.js.map +1 -1
  33. package/lib/programmers/CheckerProgrammer.d.ts +2 -2
  34. package/lib/programmers/CheckerProgrammer.js +16 -16
  35. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  36. package/lib/programmers/CloneProgrammer.d.ts +1 -1
  37. package/lib/programmers/CloneProgrammer.js +26 -18
  38. package/lib/programmers/CloneProgrammer.js.map +1 -1
  39. package/lib/programmers/FeatureProgrammer.d.ts +9 -5
  40. package/lib/programmers/FeatureProgrammer.js +39 -32
  41. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  42. package/lib/programmers/IsCloneProgrammer.js +1 -4
  43. package/lib/programmers/IsCloneProgrammer.js.map +1 -1
  44. package/lib/programmers/IsParseProgrammer.js +1 -4
  45. package/lib/programmers/IsParseProgrammer.js.map +1 -1
  46. package/lib/programmers/IsProgrammer.d.ts +1 -1
  47. package/lib/programmers/IsProgrammer.js +1 -1
  48. package/lib/programmers/IsProgrammer.js.map +1 -1
  49. package/lib/programmers/IsPruneProgrammer.js +1 -2
  50. package/lib/programmers/IsPruneProgrammer.js.map +1 -1
  51. package/lib/programmers/IsStringifyProgrammer.js +1 -2
  52. package/lib/programmers/IsStringifyProgrammer.js.map +1 -1
  53. package/lib/programmers/PruneProgrammer.d.ts +1 -1
  54. package/lib/programmers/PruneProgrammer.js +17 -12
  55. package/lib/programmers/PruneProgrammer.js.map +1 -1
  56. package/lib/programmers/RandomProgrammer.js +64 -58
  57. package/lib/programmers/RandomProgrammer.js.map +1 -1
  58. package/lib/programmers/StringifyProgrammer.d.ts +1 -1
  59. package/lib/programmers/StringifyProgrammer.js +17 -12
  60. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  61. package/lib/programmers/ValidateCloneProgrammer.js +1 -6
  62. package/lib/programmers/ValidateCloneProgrammer.js.map +1 -1
  63. package/lib/programmers/ValidateParseProgrammer.js +1 -6
  64. package/lib/programmers/ValidateParseProgrammer.js.map +1 -1
  65. package/lib/programmers/ValidateProgrammer.js +10 -15
  66. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  67. package/lib/programmers/ValidatePruneProgrammer.js +1 -4
  68. package/lib/programmers/ValidatePruneProgrammer.js.map +1 -1
  69. package/lib/programmers/ValidateStringifyProgrammer.js +2 -5
  70. package/lib/programmers/ValidateStringifyProgrammer.js.map +1 -1
  71. package/lib/programmers/helpers/CloneJoiner.js +5 -4
  72. package/lib/programmers/helpers/CloneJoiner.js.map +1 -1
  73. package/lib/programmers/helpers/FunctionImporeter.d.ts +4 -0
  74. package/lib/programmers/helpers/FunctionImporeter.js +12 -0
  75. package/lib/programmers/helpers/FunctionImporeter.js.map +1 -1
  76. package/lib/programmers/helpers/RandomJoiner.d.ts +2 -2
  77. package/lib/programmers/helpers/RandomJoiner.js +60 -49
  78. package/lib/programmers/helpers/RandomJoiner.js.map +1 -1
  79. package/lib/programmers/helpers/RandomRanger.d.ts +1 -1
  80. package/lib/programmers/helpers/RandomRanger.js +22 -20
  81. package/lib/programmers/helpers/RandomRanger.js.map +1 -1
  82. package/lib/programmers/internal/check_union_array_like.js +6 -2
  83. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  84. package/lib/programmers/internal/stringify_dynamic_properties.js +1 -1
  85. package/lib/programmers/internal/stringify_dynamic_properties.js.map +1 -1
  86. package/lib/transformers/ImportTransformer.d.ts +4 -0
  87. package/lib/transformers/ImportTransformer.js +51 -0
  88. package/lib/transformers/ImportTransformer.js.map +1 -0
  89. package/package.json +2 -2
  90. package/src/IRandomGenerator.ts +16 -16
  91. package/src/IValidation.ts +21 -21
  92. package/src/Primitive.ts +104 -82
  93. package/src/TypeGuardError.ts +36 -36
  94. package/src/executable/TypiaGenerateWizard.ts +87 -86
  95. package/src/executable/TypiaSetupWizard.ts +142 -142
  96. package/src/executable/setup/ArgumentParser.ts +91 -89
  97. package/src/executable/setup/CommandExecutor.ts +8 -8
  98. package/src/executable/setup/FileRetriever.ts +33 -0
  99. package/src/executable/setup/PackageManager.ts +92 -99
  100. package/src/executable/setup/PluginConfigurator.ts +99 -97
  101. package/src/executable/typia.ts +38 -38
  102. package/src/factories/CommentFactory.ts +10 -10
  103. package/src/factories/ExpressionFactory.ts +77 -77
  104. package/src/factories/IdentifierFactory.ts +73 -73
  105. package/src/factories/LiteralFactory.ts +44 -44
  106. package/src/factories/MetadataCollection.ts +122 -122
  107. package/src/factories/MetadataFactory.ts +51 -51
  108. package/src/factories/MetadataTagFactory.ts +265 -265
  109. package/src/factories/StatementFactory.ts +60 -60
  110. package/src/factories/TemplateFactory.ts +56 -56
  111. package/src/factories/TypeFactory.ts +129 -129
  112. package/src/factories/TypiaFileFactory.ts +117 -0
  113. package/src/factories/ValueFactory.ts +12 -12
  114. package/src/factories/internal/metadata/MetadataHelper.ts +12 -12
  115. package/src/factories/internal/metadata/emplace_metadata_object.ts +140 -140
  116. package/src/factories/internal/metadata/explore_metadata.ts +92 -92
  117. package/src/factories/internal/metadata/iterate_metadata.ts +80 -80
  118. package/src/factories/internal/metadata/iterate_metadata_array.ts +29 -29
  119. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +59 -59
  120. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  121. package/src/factories/internal/metadata/iterate_metadata_constant.ts +58 -58
  122. package/src/factories/internal/metadata/iterate_metadata_map.ts +41 -41
  123. package/src/factories/internal/metadata/iterate_metadata_native.ts +222 -222
  124. package/src/factories/internal/metadata/iterate_metadata_object.ts +48 -48
  125. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +27 -27
  126. package/src/factories/internal/metadata/iterate_metadata_set.ts +33 -33
  127. package/src/factories/internal/metadata/iterate_metadata_template.ts +38 -38
  128. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +45 -45
  129. package/src/factories/internal/metadata/iterate_metadata_union.ts +59 -59
  130. package/src/functional/$any.ts +3 -3
  131. package/src/functional/$every.ts +11 -11
  132. package/src/functional/$guard.ts +35 -35
  133. package/src/functional/$is_between.ts +7 -7
  134. package/src/functional/$is_email.ts +5 -5
  135. package/src/functional/$is_ipv4.ts +5 -5
  136. package/src/functional/$is_ipv6.ts +5 -5
  137. package/src/functional/$is_url.ts +5 -5
  138. package/src/functional/$is_uuid.ts +5 -5
  139. package/src/functional/$join.ts +50 -50
  140. package/src/functional/$number.ts +12 -12
  141. package/src/functional/$report.ts +15 -15
  142. package/src/functional/$rest.ts +3 -3
  143. package/src/functional/$string.ts +37 -37
  144. package/src/functional/$tail.ts +6 -6
  145. package/src/functional/Namespace.ts +121 -121
  146. package/src/index.ts +4 -4
  147. package/src/metadata/IJsDocTagInfo.ts +10 -10
  148. package/src/metadata/IMetadata.ts +25 -25
  149. package/src/metadata/IMetadataApplication.ts +7 -7
  150. package/src/metadata/IMetadataConstant.ts +16 -16
  151. package/src/metadata/IMetadataEntry.ts +6 -6
  152. package/src/metadata/IMetadataObject.ts +29 -29
  153. package/src/metadata/IMetadataProperty.ts +11 -11
  154. package/src/metadata/IMetadataTag.ts +113 -113
  155. package/src/metadata/Metadata.ts +534 -534
  156. package/src/metadata/MetadataConstant.ts +3 -3
  157. package/src/metadata/MetadataObject.ts +131 -131
  158. package/src/metadata/MetadataProperty.ts +64 -64
  159. package/src/module.ts +1946 -1946
  160. package/src/programmers/ApplicationProgrammer.ts +55 -55
  161. package/src/programmers/AssertCloneProgrammer.ts +71 -79
  162. package/src/programmers/AssertParseProgrammer.ts +66 -67
  163. package/src/programmers/AssertProgrammer.ts +232 -248
  164. package/src/programmers/AssertPruneProgrammer.ts +67 -66
  165. package/src/programmers/AssertStringifyProgrammer.ts +71 -75
  166. package/src/programmers/CheckerProgrammer.ts +892 -883
  167. package/src/programmers/CloneProgrammer.ts +387 -365
  168. package/src/programmers/FeatureProgrammer.ts +505 -490
  169. package/src/programmers/IsCloneProgrammer.ts +80 -81
  170. package/src/programmers/IsParseProgrammer.ts +75 -76
  171. package/src/programmers/IsProgrammer.ts +200 -200
  172. package/src/programmers/IsPruneProgrammer.ts +75 -77
  173. package/src/programmers/IsStringifyProgrammer.ts +80 -82
  174. package/src/programmers/PruneProgrammer.ts +341 -330
  175. package/src/programmers/RandomProgrammer.ts +392 -381
  176. package/src/programmers/StringifyProgrammer.ts +795 -784
  177. package/src/programmers/ValidateCloneProgrammer.ts +91 -94
  178. package/src/programmers/ValidateParseProgrammer.ts +70 -73
  179. package/src/programmers/ValidateProgrammer.ts +267 -277
  180. package/src/programmers/ValidatePruneProgrammer.ts +84 -85
  181. package/src/programmers/ValidateStringifyProgrammer.ts +88 -92
  182. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  183. package/src/programmers/helpers/CloneJoiner.ts +134 -124
  184. package/src/programmers/helpers/FunctionImporeter.ts +55 -40
  185. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  186. package/src/programmers/helpers/OptionPredicator.ts +19 -19
  187. package/src/programmers/helpers/PruneJoiner.ts +52 -52
  188. package/src/programmers/helpers/RandomJoiner.ts +149 -140
  189. package/src/programmers/helpers/RandomRanger.ts +216 -215
  190. package/src/programmers/helpers/StringifyJoinder.ts +114 -114
  191. package/src/programmers/helpers/StringifyPredicator.ts +18 -18
  192. package/src/programmers/helpers/UnionExplorer.ts +274 -274
  193. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  194. package/src/programmers/internal/application_array.ts +37 -37
  195. package/src/programmers/internal/application_boolean.ts +17 -17
  196. package/src/programmers/internal/application_constant.ts +29 -29
  197. package/src/programmers/internal/application_default.ts +17 -17
  198. package/src/programmers/internal/application_default_string.ts +32 -32
  199. package/src/programmers/internal/application_native.ts +29 -29
  200. package/src/programmers/internal/application_number.ts +70 -70
  201. package/src/programmers/internal/application_object.ts +153 -153
  202. package/src/programmers/internal/application_schema.ts +184 -184
  203. package/src/programmers/internal/application_string.ts +41 -41
  204. package/src/programmers/internal/application_templates.ts +27 -27
  205. package/src/programmers/internal/application_tuple.ts +29 -29
  206. package/src/programmers/internal/check_array.ts +22 -22
  207. package/src/programmers/internal/check_array_length.ts +44 -44
  208. package/src/programmers/internal/check_bigint.ts +64 -64
  209. package/src/programmers/internal/check_dynamic_properties.ts +197 -197
  210. package/src/programmers/internal/check_everything.ts +28 -28
  211. package/src/programmers/internal/check_native.ts +21 -21
  212. package/src/programmers/internal/check_number.ts +145 -145
  213. package/src/programmers/internal/check_object.ts +48 -48
  214. package/src/programmers/internal/check_string.ts +24 -24
  215. package/src/programmers/internal/check_string_tags.ts +63 -63
  216. package/src/programmers/internal/check_template.ts +50 -50
  217. package/src/programmers/internal/check_union_array_like.ts +260 -250
  218. package/src/programmers/internal/check_union_tuple.ts +33 -33
  219. package/src/programmers/internal/decode_union_object.ts +73 -73
  220. package/src/programmers/internal/feature_object_entries.ts +59 -59
  221. package/src/programmers/internal/metadata_to_pattern.ts +31 -31
  222. package/src/programmers/internal/prune_object_properties.ts +60 -60
  223. package/src/programmers/internal/stringify_dynamic_properties.ts +165 -164
  224. package/src/programmers/internal/stringify_native.ts +8 -8
  225. package/src/programmers/internal/stringify_regular_properties.ts +81 -81
  226. package/src/programmers/internal/template_to_pattern.ts +15 -15
  227. package/src/schemas/IJsonApplication.ts +9 -9
  228. package/src/schemas/IJsonComponents.ts +26 -26
  229. package/src/schemas/IJsonSchema.ts +127 -127
  230. package/src/transform.ts +21 -21
  231. package/src/transformers/CallExpressionTransformer.ts +172 -172
  232. package/src/transformers/ExpressionWithArgumentTransformer.ts +66 -66
  233. package/src/transformers/FileTransformer.ts +49 -49
  234. package/src/transformers/IProject.ts +11 -11
  235. package/src/transformers/ITransformOptions.ts +62 -62
  236. package/src/transformers/ImportTransformer.ts +60 -0
  237. package/src/transformers/NodeTransformer.ts +19 -19
  238. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +120 -120
  239. package/src/transformers/features/miscellaneous/AssertCloneTransformer.ts +38 -38
  240. package/src/transformers/features/miscellaneous/AssertPruneTransformer.ts +38 -38
  241. package/src/transformers/features/miscellaneous/CloneTransformer.ts +46 -46
  242. package/src/transformers/features/miscellaneous/CreateAssertCloneTransformer.ts +32 -32
  243. package/src/transformers/features/miscellaneous/CreateAssertPruneTransformer.ts +32 -32
  244. package/src/transformers/features/miscellaneous/CreateCloneTransformer.ts +31 -31
  245. package/src/transformers/features/miscellaneous/CreateIsCloneTransformer.ts +32 -32
  246. package/src/transformers/features/miscellaneous/CreateIsPruneTransformer.ts +32 -32
  247. package/src/transformers/features/miscellaneous/CreatePruneTransformer.ts +31 -31
  248. package/src/transformers/features/miscellaneous/CreateRandomGenerator.ts +39 -39
  249. package/src/transformers/features/miscellaneous/CreateValidateCloneTransformer.ts +32 -32
  250. package/src/transformers/features/miscellaneous/CreateValidatePruneTransformer.ts +32 -32
  251. package/src/transformers/features/miscellaneous/IsCloneTransformer.ts +38 -38
  252. package/src/transformers/features/miscellaneous/IsPruneTransformer.ts +38 -38
  253. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +55 -55
  254. package/src/transformers/features/miscellaneous/PruneTransformer.ts +46 -46
  255. package/src/transformers/features/miscellaneous/RandomTransformer.ts +45 -45
  256. package/src/transformers/features/miscellaneous/ValidateCloneTransformer.ts +38 -38
  257. package/src/transformers/features/miscellaneous/ValidatePruneTransformer.ts +38 -38
  258. package/src/transformers/features/parsers/AssertParseTransformer.ts +36 -36
  259. package/src/transformers/features/parsers/CreateAssertParseTransformer.ts +32 -32
  260. package/src/transformers/features/parsers/CreateIsParseTransformer.ts +32 -32
  261. package/src/transformers/features/parsers/CreateValidateParseTransformer.ts +32 -32
  262. package/src/transformers/features/parsers/IsParseTransformer.ts +36 -36
  263. package/src/transformers/features/parsers/ValidateParseTransformer.ts +36 -36
  264. package/src/transformers/features/stringifiers/AssertStringifyTransformer.ts +38 -38
  265. package/src/transformers/features/stringifiers/CreateAssertStringifyTransformer.ts +32 -32
  266. package/src/transformers/features/stringifiers/CreateIsStringifyTransformer.ts +32 -32
  267. package/src/transformers/features/stringifiers/CreateStringifyTransformer.ts +31 -31
  268. package/src/transformers/features/stringifiers/CreateValidateStringifyProgrammer.ts +32 -32
  269. package/src/transformers/features/stringifiers/IsStringifyTransformer.ts +38 -38
  270. package/src/transformers/features/stringifiers/StringifyTransformer.ts +46 -46
  271. package/src/transformers/features/stringifiers/ValidateStringifyTransformer.ts +38 -38
  272. package/src/transformers/features/validators/AssertTransformer.ts +43 -43
  273. package/src/transformers/features/validators/CreateAssertTransformer.ts +35 -35
  274. package/src/transformers/features/validators/CreateIsTransformer.ts +35 -35
  275. package/src/transformers/features/validators/CreateValidateTransformer.ts +35 -35
  276. package/src/transformers/features/validators/IsTransformer.ts +43 -43
  277. package/src/transformers/features/validators/ValidateTransformer.ts +43 -43
  278. package/src/typings/Atomic.ts +17 -17
  279. package/src/typings/ClassProperties.ts +5 -5
  280. package/src/typings/OmitNever.ts +3 -3
  281. package/src/typings/SpecialFields.ts +3 -3
  282. package/src/typings/Writable.ts +11 -11
  283. package/src/utils/ArrayUtil.ts +49 -49
  284. package/src/utils/Escaper.ts +50 -50
  285. package/src/utils/MapUtil.ts +14 -14
  286. package/src/utils/PatternUtil.ts +30 -30
  287. package/src/utils/RandomGenerator.ts +90 -90
  288. package/src/utils/Singleton.ts +17 -17
  289. package/lib/generate/TypiaGenerator.d.ts +0 -8
  290. package/lib/generate/TypiaGenerator.js.map +0 -1
  291. package/src/generate/TypiaGenerator.ts +0 -126
@@ -1,490 +1,505 @@
1
- import ts from "typescript";
2
-
3
- import { IdentifierFactory } from "../factories/IdentifierFactory";
4
- import { MetadataCollection } from "../factories/MetadataCollection";
5
- import { StatementFactory } from "../factories/StatementFactory";
6
- import { TypeFactory } from "../factories/TypeFactory";
7
- import { ValueFactory } from "../factories/ValueFactory";
8
-
9
- import { IMetadataTag } from "../metadata/IMetadataTag";
10
- import { Metadata } from "../metadata/Metadata";
11
- import { MetadataObject } from "../metadata/MetadataObject";
12
-
13
- import { IProject } from "../transformers/IProject";
14
-
15
- import { CheckerProgrammer } from "./CheckerProgrammer";
16
- import { FunctionImporter } from "./helpers/FunctionImporeter";
17
- import { IExpressionEntry } from "./helpers/IExpressionEntry";
18
- import { UnionExplorer } from "./helpers/UnionExplorer";
19
- import { feature_object_entries } from "./internal/feature_object_entries";
20
-
21
- export namespace FeatureProgrammer {
22
- /* -----------------------------------------------------------
23
- PARAMETERS
24
- ----------------------------------------------------------- */
25
- export interface IConfig<Output extends ts.ConciseBody = ts.ConciseBody> {
26
- types: IConfig.ITypes;
27
-
28
- /**
29
- * Prefix name of functions for specific object types.
30
- */
31
- functors: string;
32
-
33
- /**
34
- * Prefix name of functions for union object types.
35
- */
36
- unioners: string;
37
-
38
- /**
39
- * Whether to archive access path or not.
40
- */
41
- path: boolean;
42
-
43
- /**
44
- * Whether to trace exception or not.
45
- */
46
- trace: boolean;
47
-
48
- /**
49
- * Initializer of metadata.
50
- */
51
- initializer(
52
- project: IProject,
53
- type: ts.Type,
54
- ): [MetadataCollection, Metadata];
55
-
56
- /**
57
- * Decoder, station of every types.
58
- */
59
- decoder: Decoder<Metadata, Output>;
60
-
61
- /**
62
- * Object configurator.
63
- */
64
- objector: IConfig.IObjector;
65
-
66
- /**
67
- * Generator of functions for object types.
68
- */
69
- generator?: Partial<IConfig.IGenerator>;
70
- }
71
- export namespace IConfig {
72
- export interface ITypes {
73
- input: (type: ts.Type) => ts.TypeNode;
74
- output: (type: ts.Type) => ts.TypeNode;
75
- }
76
-
77
- export interface IObjector {
78
- /**
79
- * Type checker when union object type comes.
80
- */
81
- checker: Decoder<Metadata, ts.Expression>;
82
-
83
- /**
84
- * Decoder, function call expression generator of specific typed objects.
85
- */
86
- decoder: Decoder<MetadataObject, ts.Expression>;
87
-
88
- /**
89
- * Joiner of expressions from properties.
90
- */
91
- joiner(
92
- input: ts.Expression,
93
- entries: IExpressionEntry[],
94
- parent: MetadataObject,
95
- ): ts.ConciseBody;
96
-
97
- /**
98
- * Union type specificator.
99
- *
100
- * Expression of an algorithm specifying object type and calling
101
- * the `decoder` function of the specified object type.
102
- */
103
- unionizer: Decoder<MetadataObject[], ts.Expression>;
104
-
105
- /**
106
- * Handler of union type specification failure.
107
- *
108
- * @param value Expression of input parameter
109
- * @param expected Expected type name
110
- * @param explore Exploration info
111
- * @returns Statement of failure
112
- */
113
- failure(
114
- value: ts.Expression,
115
- expected: string,
116
- explore?: IExplore,
117
- ): ts.Statement;
118
-
119
- /**
120
- * Transformer of type checking expression by discrimination.
121
- *
122
- * When an object type has been specified by a discrimination without full
123
- * iteration, the `unionizer` will decode the object instance after
124
- * the last type checking.
125
- *
126
- * In such circumtance, you can transform the last type checking function.
127
- *
128
- * @param exp Current expression about type checking
129
- * @returns Transformed expression
130
- * @deprecated
131
- */
132
- is?(exp: ts.Expression): ts.Expression;
133
-
134
- /**
135
- * Transformer of non-undefined type checking by discrimination.
136
- *
137
- * When specifying an union type of objects, `typia` tries to find
138
- * descrimination way just by checking only one property type.
139
- * If succeeded to find the discrimination way, `typia` will check the target
140
- * property type and in the checking, non-undefined type checking would be
141
- * done.
142
- *
143
- * In such process, you can transform the non-undefined type checking.
144
- *
145
- * @param exp
146
- * @returns Transformed expression
147
- * @deprecated
148
- */
149
- required?(exp: ts.Expression): ts.Expression;
150
-
151
- /**
152
- * Conditon wrapper when unable to specify any object type.
153
- *
154
- * When failed to specify an object type through discrimination, full
155
- * iteration type checking would be happend. In such circumstance, you
156
- * can wrap the condition with additional function.
157
- *
158
- * @param condition Current condition
159
- * @returns A function wrapped current condition
160
- */
161
- full?: (
162
- condition: ts.Expression,
163
- ) => (
164
- input: ts.Expression,
165
- expected: string,
166
- explore: IExplore,
167
- ) => ts.Expression;
168
- }
169
- export interface IGenerator {
170
- /**
171
- *
172
- * @param col
173
- */
174
- functors(col: MetadataCollection): ts.VariableStatement[];
175
-
176
- /**
177
- *
178
- * @param col
179
- */
180
- unioners(col: MetadataCollection): ts.VariableStatement[];
181
- }
182
- }
183
-
184
- export interface IExplore {
185
- tracable: boolean;
186
- source: "top" | "object";
187
- from: "top" | "array" | "object";
188
- postfix: string;
189
- start?: number;
190
- }
191
-
192
- export interface Decoder<
193
- T,
194
- Output extends ts.ConciseBody = ts.ConciseBody,
195
- > {
196
- (
197
- input: ts.Expression,
198
- target: T,
199
- explore: IExplore,
200
- tags: IMetadataTag[],
201
- ): Output;
202
- }
203
-
204
- /* -----------------------------------------------------------
205
- GENERATORS
206
- ----------------------------------------------------------- */
207
- /**
208
- * Generates a decoder function for a specific type.
209
- *
210
- * @param project Project configuration
211
- * @param config Detailed configuration for programming
212
- * @param importer Function importer
213
- * @param addition Generator of additinal statements in the top of function
214
- * @returns Currying function generating type decoder function
215
- */
216
- export const generate =
217
- (
218
- project: IProject,
219
- config: IConfig,
220
- importer: FunctionImporter,
221
- addition: (
222
- collection: MetadataCollection,
223
- ) => ts.Statement[] | undefined,
224
- ) =>
225
- (type: ts.Type) => {
226
- const [collection, meta] = config.initializer(project, type);
227
-
228
- // ITERATE OVER ALL METADATA
229
- const output: ts.ConciseBody = config.decoder(
230
- ValueFactory.INPUT(),
231
- meta,
232
- {
233
- tracable: config.path || config.trace,
234
- source: "top",
235
- from: "top",
236
- postfix: '""',
237
- },
238
- [],
239
- );
240
-
241
- // RETURNS THE OPTIMAL ARROW FUNCTION
242
- const functors: ts.VariableStatement[] =
243
- config.generator?.functors !== undefined
244
- ? config.generator.functors(collection)
245
- : generate_functors(config)(importer)(collection);
246
- const unioners: ts.VariableStatement[] =
247
- config.generator?.unioners !== undefined
248
- ? config.generator.unioners(collection)
249
- : generate_unioners(config)(collection);
250
- const added: ts.Statement[] | undefined = addition(collection);
251
-
252
- return ts.factory.createArrowFunction(
253
- undefined,
254
- undefined,
255
- PARAMETERS(config)(config.types.input(type))(
256
- ValueFactory.INPUT(),
257
- ),
258
- config.types.output(type),
259
- undefined,
260
- ts.factory.createBlock(
261
- [
262
- ...(added || []),
263
- ...functors,
264
- ...unioners,
265
- ...(ts.isBlock(output)
266
- ? output.statements
267
- : [ts.factory.createReturnStatement(output)]),
268
- ],
269
- true,
270
- ),
271
- );
272
- };
273
-
274
- export const generate_functors =
275
- (config: IConfig) =>
276
- (importer: FunctionImporter) =>
277
- (collection: MetadataCollection) =>
278
- collection
279
- .objects()
280
- .map((obj, i) =>
281
- StatementFactory.constant(
282
- `${config.functors}${i}`,
283
- generate_object(config)(importer)(obj),
284
- ),
285
- );
286
-
287
- export const generate_unioners =
288
- (config: IConfig) => (collection: MetadataCollection) =>
289
- collection
290
- .unions()
291
- .map((union, i) =>
292
- StatementFactory.constant(
293
- `${config.unioners}${i}`,
294
- generate_union(config)(union),
295
- ),
296
- );
297
-
298
- const generate_object =
299
- (config: IConfig) =>
300
- (importer: FunctionImporter) =>
301
- (obj: MetadataObject) =>
302
- ts.factory.createArrowFunction(
303
- undefined,
304
- undefined,
305
- PARAMETERS(config)(TypeFactory.keyword("any"))(
306
- ValueFactory.INPUT(),
307
- ),
308
- undefined,
309
- undefined,
310
- config.objector.joiner(
311
- ts.factory.createIdentifier("input"),
312
- feature_object_entries(config)(importer)(obj)(
313
- ts.factory.createIdentifier("input"),
314
- ),
315
- obj,
316
- ),
317
- );
318
-
319
- function generate_union(config: IConfig) {
320
- const explorer = UnionExplorer.object(config);
321
- const input = ValueFactory.INPUT();
322
-
323
- return (meta: MetadataObject[]) =>
324
- ts.factory.createArrowFunction(
325
- undefined,
326
- undefined,
327
- PARAMETERS(config)(TypeFactory.keyword("any"))(
328
- ValueFactory.INPUT(),
329
- ),
330
- undefined,
331
- undefined,
332
- explorer(
333
- input,
334
- meta,
335
- {
336
- tracable: config.path || config.trace,
337
- source: "object",
338
- from: "object",
339
- postfix: "",
340
- },
341
- [],
342
- ),
343
- );
344
- }
345
-
346
- /* -----------------------------------------------------------
347
- DECODERS
348
- ----------------------------------------------------------- */
349
- export function decode_array(
350
- config: Pick<IConfig, "trace" | "path" | "decoder">,
351
- importer: FunctionImporter,
352
- combiner: (
353
- input: ts.Expression,
354
- arrow: ts.ArrowFunction,
355
- tags: IMetadataTag[],
356
- ) => ts.Expression,
357
- ) {
358
- const rand: string = importer.increment().toString();
359
- const tail =
360
- config.path || config.trace
361
- ? [
362
- IdentifierFactory.parameter(
363
- "index" + rand,
364
- TypeFactory.keyword("number"),
365
- ),
366
- ]
367
- : [];
368
-
369
- return (
370
- input: ts.Expression,
371
- meta: Metadata,
372
- explore: IExplore,
373
- tags: IMetadataTag[],
374
- ) => {
375
- const arrow: ts.ArrowFunction = ts.factory.createArrowFunction(
376
- undefined,
377
- undefined,
378
- [
379
- IdentifierFactory.parameter(
380
- "elem",
381
- TypeFactory.keyword("any"),
382
- ),
383
- ...tail,
384
- ],
385
- undefined,
386
- undefined,
387
- config.decoder(
388
- ValueFactory.INPUT("elem"),
389
- meta,
390
- {
391
- tracable: explore.tracable,
392
- source: explore.source,
393
- from: "array",
394
- postfix: INDEX_SYMBOL(explore.start ?? null)(
395
- explore.postfix,
396
- )(rand),
397
- },
398
- tags,
399
- ),
400
- );
401
- return combiner(input, arrow, tags);
402
- };
403
- }
404
-
405
- export const decode_object =
406
- (config: Pick<IConfig, "trace" | "path" | "functors">) =>
407
- (input: ts.Expression, obj: MetadataObject, explore: IExplore) =>
408
- ts.factory.createCallExpression(
409
- ts.factory.createIdentifier(`${config.functors}${obj.index}`),
410
- undefined,
411
- get_object_arguments(config)(explore)(input),
412
- );
413
-
414
- export const get_object_arguments =
415
- (config: Pick<IConfig, "path" | "trace">) =>
416
- (explore: FeatureProgrammer.IExplore) => {
417
- const tail: ts.Expression[] =
418
- config.path === false && config.trace === false
419
- ? []
420
- : config.path === true && config.trace === true
421
- ? [
422
- ts.factory.createIdentifier(
423
- explore.postfix
424
- ? `path + ${explore.postfix}`
425
- : "path",
426
- ),
427
- explore.source === "object"
428
- ? ts.factory.createIdentifier(
429
- `${explore.tracable} && exceptionable`,
430
- )
431
- : explore.tracable
432
- ? ts.factory.createTrue()
433
- : ts.factory.createFalse(),
434
- ]
435
- : config.path === true
436
- ? [
437
- ts.factory.createIdentifier(
438
- explore.postfix
439
- ? `path + ${explore.postfix}`
440
- : "path",
441
- ),
442
- ]
443
- : [
444
- explore.source === "object"
445
- ? ts.factory.createIdentifier(
446
- `${explore.tracable} && exceptionable`,
447
- )
448
- : explore.tracable
449
- ? ts.factory.createTrue()
450
- : ts.factory.createFalse(),
451
- ];
452
- return (input: ts.Expression) => [input, ...tail];
453
- };
454
- }
455
-
456
- const INDEX_SYMBOL =
457
- (start: number | null) => (prev: string) => (rand: string) => {
458
- const tail: string =
459
- start !== null
460
- ? `"[" + (${start} + index${rand}) + "]"`
461
- : `"[" + index${rand} + "]"`;
462
- if (prev === "") return tail;
463
- else if (prev[prev.length - 1] === `"`)
464
- return prev.substring(0, prev.length - 1) + tail.substring(1);
465
- return prev + ` + ${tail}`;
466
- };
467
- const PARAMETERS =
468
- (props: Pick<CheckerProgrammer.IConfig, "path" | "trace">) =>
469
- (type: ts.TypeNode) => {
470
- const tail: ts.ParameterDeclaration[] = [];
471
- if (props.path)
472
- tail.push(
473
- IdentifierFactory.parameter(
474
- "path",
475
- TypeFactory.keyword("string"),
476
- ),
477
- );
478
- if (props.trace)
479
- tail.push(
480
- IdentifierFactory.parameter(
481
- "exceptionable",
482
- TypeFactory.keyword("boolean"),
483
- ),
484
- );
485
-
486
- return (input: ts.Identifier) => [
487
- IdentifierFactory.parameter(input, type),
488
- ...tail,
489
- ];
490
- };
1
+ import ts from "typescript";
2
+
3
+ import { IdentifierFactory } from "../factories/IdentifierFactory";
4
+ import { MetadataCollection } from "../factories/MetadataCollection";
5
+ import { StatementFactory } from "../factories/StatementFactory";
6
+ import { TypeFactory } from "../factories/TypeFactory";
7
+ import { ValueFactory } from "../factories/ValueFactory";
8
+
9
+ import { IMetadataTag } from "../metadata/IMetadataTag";
10
+ import { Metadata } from "../metadata/Metadata";
11
+ import { MetadataObject } from "../metadata/MetadataObject";
12
+
13
+ import { IProject } from "../transformers/IProject";
14
+
15
+ import { CheckerProgrammer } from "./CheckerProgrammer";
16
+ import { FunctionImporter } from "./helpers/FunctionImporeter";
17
+ import { IExpressionEntry } from "./helpers/IExpressionEntry";
18
+ import { UnionExplorer } from "./helpers/UnionExplorer";
19
+ import { feature_object_entries } from "./internal/feature_object_entries";
20
+
21
+ export namespace FeatureProgrammer {
22
+ /* -----------------------------------------------------------
23
+ PARAMETERS
24
+ ----------------------------------------------------------- */
25
+ export interface IConfig<Output extends ts.ConciseBody = ts.ConciseBody> {
26
+ types: IConfig.ITypes;
27
+
28
+ /**
29
+ * Prefix name of functions for specific object types.
30
+ */
31
+ functors: string;
32
+
33
+ /**
34
+ * Prefix name of functions for union object types.
35
+ */
36
+ unioners: string;
37
+
38
+ /**
39
+ * Whether to archive access path or not.
40
+ */
41
+ path: boolean;
42
+
43
+ /**
44
+ * Whether to trace exception or not.
45
+ */
46
+ trace: boolean;
47
+
48
+ /**
49
+ * Initializer of metadata.
50
+ */
51
+ initializer(
52
+ project: IProject,
53
+ type: ts.Type,
54
+ ): [MetadataCollection, Metadata];
55
+
56
+ /**
57
+ * Decoder, station of every types.
58
+ */
59
+ decoder: Decoder<Metadata, Output>;
60
+
61
+ /**
62
+ * Object configurator.
63
+ */
64
+ objector: IConfig.IObjector;
65
+
66
+ /**
67
+ * Generator of functions for object types.
68
+ */
69
+ generator?: Partial<IConfig.IGenerator>;
70
+ }
71
+ export namespace IConfig {
72
+ export interface ITypes {
73
+ input: (type: ts.Type, node?: ts.TypeNode) => ts.TypeNode;
74
+ output: (type: ts.Type, node?: ts.TypeNode) => ts.TypeNode;
75
+ }
76
+
77
+ export interface IObjector {
78
+ /**
79
+ * Type checker when union object type comes.
80
+ */
81
+ checker: Decoder<Metadata, ts.Expression>;
82
+
83
+ /**
84
+ * Decoder, function call expression generator of specific typed objects.
85
+ */
86
+ decoder: Decoder<MetadataObject, ts.Expression>;
87
+
88
+ /**
89
+ * Joiner of expressions from properties.
90
+ */
91
+ joiner(
92
+ input: ts.Expression,
93
+ entries: IExpressionEntry[],
94
+ parent: MetadataObject,
95
+ ): ts.ConciseBody;
96
+
97
+ /**
98
+ * Union type specificator.
99
+ *
100
+ * Expression of an algorithm specifying object type and calling
101
+ * the `decoder` function of the specified object type.
102
+ */
103
+ unionizer: Decoder<MetadataObject[], ts.Expression>;
104
+
105
+ /**
106
+ * Handler of union type specification failure.
107
+ *
108
+ * @param value Expression of input parameter
109
+ * @param expected Expected type name
110
+ * @param explore Exploration info
111
+ * @returns Statement of failure
112
+ */
113
+ failure(
114
+ value: ts.Expression,
115
+ expected: string,
116
+ explore?: IExplore,
117
+ ): ts.Statement;
118
+
119
+ /**
120
+ * Transformer of type checking expression by discrimination.
121
+ *
122
+ * When an object type has been specified by a discrimination without full
123
+ * iteration, the `unionizer` will decode the object instance after
124
+ * the last type checking.
125
+ *
126
+ * In such circumtance, you can transform the last type checking function.
127
+ *
128
+ * @param exp Current expression about type checking
129
+ * @returns Transformed expression
130
+ * @deprecated
131
+ */
132
+ is?(exp: ts.Expression): ts.Expression;
133
+
134
+ /**
135
+ * Transformer of non-undefined type checking by discrimination.
136
+ *
137
+ * When specifying an union type of objects, `typia` tries to find
138
+ * descrimination way just by checking only one property type.
139
+ * If succeeded to find the discrimination way, `typia` will check the target
140
+ * property type and in the checking, non-undefined type checking would be
141
+ * done.
142
+ *
143
+ * In such process, you can transform the non-undefined type checking.
144
+ *
145
+ * @param exp
146
+ * @returns Transformed expression
147
+ * @deprecated
148
+ */
149
+ required?(exp: ts.Expression): ts.Expression;
150
+
151
+ /**
152
+ * Conditon wrapper when unable to specify any object type.
153
+ *
154
+ * When failed to specify an object type through discrimination, full
155
+ * iteration type checking would be happend. In such circumstance, you
156
+ * can wrap the condition with additional function.
157
+ *
158
+ * @param condition Current condition
159
+ * @returns A function wrapped current condition
160
+ */
161
+ full?: (
162
+ condition: ts.Expression,
163
+ ) => (
164
+ input: ts.Expression,
165
+ expected: string,
166
+ explore: IExplore,
167
+ ) => ts.Expression;
168
+
169
+ /**
170
+ * Return type.
171
+ */
172
+ type?: ts.TypeNode;
173
+ }
174
+ export interface IGenerator {
175
+ /**
176
+ *
177
+ * @param col
178
+ */
179
+ functors(col: MetadataCollection): ts.VariableStatement[];
180
+
181
+ /**
182
+ *
183
+ * @param col
184
+ */
185
+ unioners(col: MetadataCollection): ts.VariableStatement[];
186
+ }
187
+ }
188
+
189
+ export interface IExplore {
190
+ tracable: boolean;
191
+ source: "top" | "object";
192
+ from: "top" | "array" | "object";
193
+ postfix: string;
194
+ start?: number;
195
+ }
196
+
197
+ export interface Decoder<
198
+ T,
199
+ Output extends ts.ConciseBody = ts.ConciseBody,
200
+ > {
201
+ (
202
+ input: ts.Expression,
203
+ target: T,
204
+ explore: IExplore,
205
+ tags: IMetadataTag[],
206
+ ): Output;
207
+ }
208
+
209
+ /* -----------------------------------------------------------
210
+ GENERATORS
211
+ ----------------------------------------------------------- */
212
+ /**
213
+ * Generates a decoder function for a specific type.
214
+ *
215
+ * @param project Project configuration
216
+ * @param config Detailed configuration for programming
217
+ * @param importer Function importer
218
+ * @param addition Generator of additinal statements in the top of function
219
+ * @returns Currying function generating type decoder function
220
+ */
221
+ export const generate =
222
+ (
223
+ project: IProject,
224
+ config: IConfig,
225
+ importer: FunctionImporter,
226
+ addition: (
227
+ collection: MetadataCollection,
228
+ ) => ts.Statement[] | undefined,
229
+ ) =>
230
+ (type: ts.Type, typeNode?: ts.TypeNode) => {
231
+ const [collection, meta] = config.initializer(project, type);
232
+
233
+ // ITERATE OVER ALL METADATA
234
+ const output: ts.ConciseBody = config.decoder(
235
+ ValueFactory.INPUT(),
236
+ meta,
237
+ {
238
+ tracable: config.path || config.trace,
239
+ source: "top",
240
+ from: "top",
241
+ postfix: '""',
242
+ },
243
+ [],
244
+ );
245
+
246
+ // RETURNS THE OPTIMAL ARROW FUNCTION
247
+ const functors: ts.VariableStatement[] = (
248
+ config.generator?.functors ??
249
+ generate_functors(config)(importer)
250
+ )(collection);
251
+ const unioners: ts.VariableStatement[] = (
252
+ config.generator?.unioners ??
253
+ generate_unioners(config)(importer)
254
+ )(collection);
255
+ const added: ts.Statement[] | undefined = addition(collection);
256
+
257
+ return ts.factory.createArrowFunction(
258
+ undefined,
259
+ undefined,
260
+ PARAMETERS(config)(config.types.input(type, typeNode))(
261
+ ValueFactory.INPUT(),
262
+ ),
263
+ config.types.output(type, typeNode),
264
+ undefined,
265
+ ts.factory.createBlock(
266
+ [
267
+ ...(added || []),
268
+ ...functors.filter((_, i) =>
269
+ importer.hasLocal(`${config.functors}${i}`),
270
+ ),
271
+ ...unioners.filter((_, i) =>
272
+ importer.hasLocal(`${config.unioners}${i}`),
273
+ ),
274
+ ...(ts.isBlock(output)
275
+ ? output.statements
276
+ : [ts.factory.createReturnStatement(output)]),
277
+ ],
278
+ true,
279
+ ),
280
+ );
281
+ };
282
+
283
+ export const generate_functors =
284
+ (config: IConfig) =>
285
+ (importer: FunctionImporter) =>
286
+ (collection: MetadataCollection) =>
287
+ collection
288
+ .objects()
289
+ .map((obj, i) =>
290
+ StatementFactory.constant(
291
+ `${config.functors}${i}`,
292
+ generate_object(config)(importer)(obj),
293
+ ),
294
+ );
295
+
296
+ export const generate_unioners =
297
+ (config: IConfig) =>
298
+ (importer: FunctionImporter) =>
299
+ (collection: MetadataCollection) =>
300
+ collection
301
+ .unions()
302
+ .map((union, i) =>
303
+ StatementFactory.constant(
304
+ importer.useLocal(`${config.unioners}${i}`),
305
+ generate_union(config)(union),
306
+ ),
307
+ );
308
+
309
+ const generate_object =
310
+ (config: IConfig) =>
311
+ (importer: FunctionImporter) =>
312
+ (obj: MetadataObject) =>
313
+ ts.factory.createArrowFunction(
314
+ undefined,
315
+ undefined,
316
+ PARAMETERS(config)(TypeFactory.keyword("any"))(
317
+ ValueFactory.INPUT(),
318
+ ),
319
+ config.objector.type ?? TypeFactory.keyword("any"),
320
+ undefined,
321
+ config.objector.joiner(
322
+ ts.factory.createIdentifier("input"),
323
+ feature_object_entries(config)(importer)(obj)(
324
+ ts.factory.createIdentifier("input"),
325
+ ),
326
+ obj,
327
+ ),
328
+ );
329
+
330
+ function generate_union(config: IConfig) {
331
+ const explorer = UnionExplorer.object(config);
332
+ const input = ValueFactory.INPUT();
333
+
334
+ return (meta: MetadataObject[]) =>
335
+ ts.factory.createArrowFunction(
336
+ undefined,
337
+ undefined,
338
+ PARAMETERS(config)(TypeFactory.keyword("any"))(
339
+ ValueFactory.INPUT(),
340
+ ),
341
+ TypeFactory.keyword("any"),
342
+ undefined,
343
+ explorer(
344
+ input,
345
+ meta,
346
+ {
347
+ tracable: config.path || config.trace,
348
+ source: "object",
349
+ from: "object",
350
+ postfix: "",
351
+ },
352
+ [],
353
+ ),
354
+ );
355
+ }
356
+
357
+ /* -----------------------------------------------------------
358
+ DECODERS
359
+ ----------------------------------------------------------- */
360
+ export function decode_array(
361
+ config: Pick<IConfig, "trace" | "path" | "decoder">,
362
+ importer: FunctionImporter,
363
+ combiner: (
364
+ input: ts.Expression,
365
+ arrow: ts.ArrowFunction,
366
+ tags: IMetadataTag[],
367
+ ) => ts.Expression,
368
+ ) {
369
+ const rand: string = importer.increment().toString();
370
+ const tail =
371
+ config.path || config.trace
372
+ ? [
373
+ IdentifierFactory.parameter(
374
+ "_index" + rand,
375
+ TypeFactory.keyword("number"),
376
+ ),
377
+ ]
378
+ : [];
379
+
380
+ return (
381
+ input: ts.Expression,
382
+ meta: Metadata,
383
+ explore: IExplore,
384
+ tags: IMetadataTag[],
385
+ ) => {
386
+ const arrow: ts.ArrowFunction = ts.factory.createArrowFunction(
387
+ undefined,
388
+ undefined,
389
+ [
390
+ IdentifierFactory.parameter(
391
+ "elem",
392
+ TypeFactory.keyword("any"),
393
+ ),
394
+ ...tail,
395
+ ],
396
+ undefined,
397
+ undefined,
398
+ config.decoder(
399
+ ValueFactory.INPUT("elem"),
400
+ meta,
401
+ {
402
+ tracable: explore.tracable,
403
+ source: explore.source,
404
+ from: "array",
405
+ postfix: INDEX_SYMBOL(explore.start ?? null)(
406
+ explore.postfix,
407
+ )(rand),
408
+ },
409
+ tags,
410
+ ),
411
+ );
412
+ return combiner(input, arrow, tags);
413
+ };
414
+ }
415
+
416
+ export const decode_object =
417
+ (config: Pick<IConfig, "trace" | "path" | "functors">) =>
418
+ (importer: FunctionImporter) =>
419
+ (input: ts.Expression, obj: MetadataObject, explore: IExplore) =>
420
+ ts.factory.createCallExpression(
421
+ ts.factory.createIdentifier(
422
+ importer.useLocal(`${config.functors}${obj.index}`),
423
+ ),
424
+ undefined,
425
+ get_object_arguments(config)(explore)(input),
426
+ );
427
+
428
+ export const get_object_arguments =
429
+ (config: Pick<IConfig, "path" | "trace">) =>
430
+ (explore: FeatureProgrammer.IExplore) => {
431
+ const tail: ts.Expression[] =
432
+ config.path === false && config.trace === false
433
+ ? []
434
+ : config.path === true && config.trace === true
435
+ ? [
436
+ ts.factory.createIdentifier(
437
+ explore.postfix
438
+ ? `_path + ${explore.postfix}`
439
+ : "_path",
440
+ ),
441
+ explore.source === "object"
442
+ ? ts.factory.createIdentifier(
443
+ `${explore.tracable} && _exceptionable`,
444
+ )
445
+ : explore.tracable
446
+ ? ts.factory.createTrue()
447
+ : ts.factory.createFalse(),
448
+ ]
449
+ : config.path === true
450
+ ? [
451
+ ts.factory.createIdentifier(
452
+ explore.postfix
453
+ ? `_path + ${explore.postfix}`
454
+ : "_path",
455
+ ),
456
+ ]
457
+ : [
458
+ explore.source === "object"
459
+ ? ts.factory.createIdentifier(
460
+ `${explore.tracable} && _exceptionable`,
461
+ )
462
+ : explore.tracable
463
+ ? ts.factory.createTrue()
464
+ : ts.factory.createFalse(),
465
+ ];
466
+ return (input: ts.Expression) => [input, ...tail];
467
+ };
468
+ }
469
+
470
+ const INDEX_SYMBOL =
471
+ (start: number | null) => (prev: string) => (rand: string) => {
472
+ const tail: string =
473
+ start !== null
474
+ ? `"[" + (${start} + _index${rand}) + "]"`
475
+ : `"[" + _index${rand} + "]"`;
476
+ if (prev === "") return tail;
477
+ else if (prev[prev.length - 1] === `"`)
478
+ return prev.substring(0, prev.length - 1) + tail.substring(1);
479
+ return prev + ` + ${tail}`;
480
+ };
481
+
482
+ const PARAMETERS =
483
+ (props: Pick<CheckerProgrammer.IConfig, "path" | "trace">) =>
484
+ (type: ts.TypeNode) => {
485
+ const tail: ts.ParameterDeclaration[] = [];
486
+ if (props.path)
487
+ tail.push(
488
+ IdentifierFactory.parameter(
489
+ "_path",
490
+ TypeFactory.keyword("string"),
491
+ ),
492
+ );
493
+ if (props.trace)
494
+ tail.push(
495
+ IdentifierFactory.parameter(
496
+ "_exceptionable",
497
+ TypeFactory.keyword("boolean"),
498
+ ts.factory.createTrue(),
499
+ ),
500
+ );
501
+ return (input: ts.Identifier) => [
502
+ IdentifierFactory.parameter(input, type),
503
+ ...tail,
504
+ ];
505
+ };