typia 3.8.4-dev.20230502 → 4.0.0-dev.20230502

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