typia 5.0.0-dev.20230821 → 5.0.0-dev.20230823

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 (237) hide show
  1. package/README.md +1 -1
  2. package/lib/factories/MetadataFactory.js +9 -0
  3. package/lib/factories/MetadataFactory.js.map +1 -1
  4. package/lib/factories/ProtobufFactory.js +8 -0
  5. package/lib/factories/ProtobufFactory.js.map +1 -1
  6. package/lib/functional/$ProtobufReader.d.ts +2 -0
  7. package/lib/functional/$ProtobufReader.js +14 -3
  8. package/lib/functional/$ProtobufReader.js.map +1 -1
  9. package/lib/functional/$ProtobufSizer.js +1 -1
  10. package/lib/functional/$ProtobufSizer.js.map +1 -1
  11. package/lib/functional/$ProtobufWriter.js +0 -1
  12. package/lib/functional/$ProtobufWriter.js.map +1 -1
  13. package/lib/programmers/helpers/ProtobufUtil.d.ts +3 -1
  14. package/lib/programmers/helpers/ProtobufUtil.js +5 -1
  15. package/lib/programmers/helpers/ProtobufUtil.js.map +1 -1
  16. package/lib/programmers/json/JsonValidateParseProgrammer.js +2 -3
  17. package/lib/programmers/json/JsonValidateParseProgrammer.js.map +1 -1
  18. package/lib/programmers/protobuf/ProtobufAssertDecodeProgrammer.js +2 -3
  19. package/lib/programmers/protobuf/ProtobufAssertDecodeProgrammer.js.map +1 -1
  20. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +362 -6
  21. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  22. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +21 -64
  23. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  24. package/lib/programmers/protobuf/ProtobufIsDecodeProgrammer.js +1 -1
  25. package/lib/programmers/protobuf/ProtobufIsDecodeProgrammer.js.map +1 -1
  26. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +1 -1
  27. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  28. package/lib/programmers/protobuf/ProtobufValidateDecodeProgrammer.js +3 -4
  29. package/lib/programmers/protobuf/ProtobufValidateDecodeProgrammer.js.map +1 -1
  30. package/lib/protobuf.d.ts +8 -9
  31. package/lib/protobuf.js +7 -0
  32. package/lib/protobuf.js.map +1 -1
  33. package/package.json +1 -1
  34. package/src/factories/ExpressionFactory.ts +115 -115
  35. package/src/factories/MetadataCollection.ts +269 -269
  36. package/src/factories/MetadataFactory.ts +46 -34
  37. package/src/factories/MetadataTagFactory.ts +364 -364
  38. package/src/factories/ProtobufFactory.ts +266 -251
  39. package/src/factories/StatementFactory.ts +72 -72
  40. package/src/factories/internal/metadata/MetadataHelper.ts +12 -12
  41. package/src/factories/internal/metadata/emend_metadata_atomics.ts +33 -33
  42. package/src/factories/internal/metadata/emplace_metadata_alias.ts +40 -40
  43. package/src/factories/internal/metadata/emplace_metadata_array.ts +34 -34
  44. package/src/factories/internal/metadata/emplace_metadata_object.ts +136 -136
  45. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +50 -50
  46. package/src/factories/internal/metadata/explore_metadata.ts +38 -38
  47. package/src/factories/internal/metadata/iterate_metadata.ts +81 -81
  48. package/src/factories/internal/metadata/iterate_metadata_alias.ts +30 -30
  49. package/src/factories/internal/metadata/iterate_metadata_array.ts +24 -24
  50. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +59 -59
  51. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  52. package/src/factories/internal/metadata/iterate_metadata_collection.ts +133 -133
  53. package/src/factories/internal/metadata/iterate_metadata_constant.ts +58 -58
  54. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +84 -84
  55. package/src/factories/internal/metadata/iterate_metadata_map.ts +41 -41
  56. package/src/factories/internal/metadata/iterate_metadata_native.ts +219 -219
  57. package/src/factories/internal/metadata/iterate_metadata_object.ts +43 -43
  58. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +49 -49
  59. package/src/factories/internal/metadata/iterate_metadata_set.ts +33 -33
  60. package/src/factories/internal/metadata/iterate_metadata_sort.ts +69 -69
  61. package/src/factories/internal/metadata/iterate_metadata_tag.ts +31 -31
  62. package/src/factories/internal/metadata/iterate_metadata_template.ts +38 -38
  63. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +24 -24
  64. package/src/factories/internal/metadata/iterate_metadata_union.ts +24 -24
  65. package/src/functional/$ProtobufReader.ts +201 -188
  66. package/src/functional/$ProtobufSizer.ts +147 -144
  67. package/src/functional/$ProtobufWriter.ts +151 -152
  68. package/src/functional/$number.ts +13 -13
  69. package/src/functional/$strlen.ts +7 -7
  70. package/src/functional/$varint.ts +130 -130
  71. package/src/functional/$zigzag.ts +39 -39
  72. package/src/functional/IProtobufWriter.ts +18 -18
  73. package/src/functional/Namespace.ts +149 -149
  74. package/src/json.ts +648 -648
  75. package/src/misc.ts +651 -651
  76. package/src/module.ts +708 -708
  77. package/src/programmers/CheckerProgrammer.ts +1173 -1173
  78. package/src/programmers/FeatureProgrammer.ts +497 -497
  79. package/src/programmers/IsProgrammer.ts +239 -239
  80. package/src/programmers/IsPruneProgrammer.ts +73 -73
  81. package/src/programmers/RandomProgrammer.ts +578 -578
  82. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  83. package/src/programmers/helpers/CloneJoiner.ts +107 -107
  84. package/src/programmers/helpers/FunctionImporeter.ts +89 -89
  85. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  86. package/src/programmers/helpers/ProtobufUtil.ts +29 -24
  87. package/src/programmers/helpers/ProtobufWire.ts +34 -34
  88. package/src/programmers/helpers/PruneJoiner.ts +143 -143
  89. package/src/programmers/helpers/RandomJoiner.ts +173 -173
  90. package/src/programmers/helpers/RandomRanger.ts +208 -208
  91. package/src/programmers/helpers/StringifyPredicator.ts +13 -13
  92. package/src/programmers/helpers/UnionExplorer.ts +310 -310
  93. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  94. package/src/programmers/helpers/disable_function_importer_declare.ts +27 -27
  95. package/src/programmers/internal/application_alias.ts +66 -66
  96. package/src/programmers/internal/application_array.ts +30 -30
  97. package/src/programmers/internal/application_constant.ts +26 -26
  98. package/src/programmers/internal/application_default.ts +17 -17
  99. package/src/programmers/internal/application_default_string.ts +33 -33
  100. package/src/programmers/internal/application_native.ts +39 -39
  101. package/src/programmers/internal/application_number.ts +81 -81
  102. package/src/programmers/internal/application_object.ts +165 -165
  103. package/src/programmers/internal/application_resolved.ts +55 -55
  104. package/src/programmers/internal/application_schema.ts +157 -157
  105. package/src/programmers/internal/application_string.ts +44 -44
  106. package/src/programmers/internal/application_templates.ts +25 -25
  107. package/src/programmers/internal/application_tuple.ts +57 -57
  108. package/src/programmers/internal/check_array.ts +30 -30
  109. package/src/programmers/internal/check_array_length.ts +35 -35
  110. package/src/programmers/internal/check_bigint.ts +110 -110
  111. package/src/programmers/internal/check_custom.ts +31 -31
  112. package/src/programmers/internal/check_number.ts +258 -258
  113. package/src/programmers/internal/check_string.ts +25 -25
  114. package/src/programmers/internal/check_string_tags.ts +67 -67
  115. package/src/programmers/internal/check_template.ts +56 -56
  116. package/src/programmers/internal/check_union_array_like.ts +329 -329
  117. package/src/programmers/internal/decode_union_object.ts +84 -84
  118. package/src/programmers/internal/feature_object_entries.ts +63 -63
  119. package/src/programmers/internal/get_comment_tags.ts +23 -23
  120. package/src/programmers/internal/metadata_to_pattern.ts +34 -34
  121. package/src/programmers/internal/prune_object_properties.ts +60 -60
  122. package/src/programmers/internal/random_custom.ts +29 -29
  123. package/src/programmers/internal/stringify_regular_properties.ts +83 -83
  124. package/src/programmers/internal/template_to_pattern.ts +15 -15
  125. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +16 -16
  126. package/src/programmers/json/JsonApplicationProgrammer.ts +47 -47
  127. package/src/programmers/json/JsonAssertParseProgrammer.ts +66 -66
  128. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +66 -66
  129. package/src/programmers/json/JsonIsParseProgrammer.ts +72 -72
  130. package/src/programmers/json/JsonIsStringifyProgrammer.ts +76 -76
  131. package/src/programmers/json/JsonStringifyProgrammer.ts +987 -987
  132. package/src/programmers/json/JsonValidateParseProgrammer.ts +63 -70
  133. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +84 -84
  134. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +71 -71
  135. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +68 -68
  136. package/src/programmers/misc/MiscCloneProgrammer.ts +587 -587
  137. package/src/programmers/misc/MiscIsCloneProgrammer.ts +78 -78
  138. package/src/programmers/misc/MiscLiteralsProgrammer.ts +64 -64
  139. package/src/programmers/misc/MiscPruneProgrammer.ts +542 -542
  140. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +85 -85
  141. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +78 -78
  142. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +66 -69
  143. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +66 -66
  144. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +669 -38
  145. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +814 -920
  146. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +75 -75
  147. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +76 -76
  148. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +178 -178
  149. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +75 -83
  150. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +86 -86
  151. package/src/protobuf.ts +249 -239
  152. package/src/schemas/json/IJsonApplication.ts +8 -8
  153. package/src/schemas/json/IJsonComponents.ts +33 -33
  154. package/src/schemas/json/IJsonSchema.ts +133 -133
  155. package/src/schemas/metadata/ICommentTag.ts +4 -4
  156. package/src/schemas/metadata/IJsDocTagInfo.ts +10 -10
  157. package/src/schemas/metadata/IMetadata.ts +28 -28
  158. package/src/schemas/metadata/IMetadataAlias.ts +14 -14
  159. package/src/schemas/metadata/IMetadataApplication.ts +7 -7
  160. package/src/schemas/metadata/IMetadataArray.ts +10 -10
  161. package/src/schemas/metadata/IMetadataCollection.ts +11 -11
  162. package/src/schemas/metadata/IMetadataConstant.ts +16 -16
  163. package/src/schemas/metadata/IMetadataDictionary.ts +14 -14
  164. package/src/schemas/metadata/IMetadataEntry.ts +6 -6
  165. package/src/schemas/metadata/IMetadataObject.ts +18 -18
  166. package/src/schemas/metadata/IMetadataProperty.ts +11 -11
  167. package/src/schemas/metadata/IMetadataResolved.ts +6 -6
  168. package/src/schemas/metadata/IMetadataTag.ts +112 -112
  169. package/src/schemas/metadata/IMetadataTuple.ts +10 -10
  170. package/src/schemas/metadata/Metadata.ts +637 -637
  171. package/src/schemas/metadata/MetadataAlias.ts +66 -66
  172. package/src/schemas/metadata/MetadataArray.ts +55 -55
  173. package/src/schemas/metadata/MetadataConstant.ts +3 -3
  174. package/src/schemas/metadata/MetadataObject.ts +139 -139
  175. package/src/schemas/metadata/MetadataProperty.ts +64 -64
  176. package/src/schemas/metadata/MetadataResolved.ts +51 -51
  177. package/src/schemas/metadata/MetadataTuple.ts +58 -58
  178. package/src/transformers/CallExpressionTransformer.ts +240 -240
  179. package/src/transformers/features/AssertTransformer.ts +11 -11
  180. package/src/transformers/features/CreateAssertTransformer.ts +13 -13
  181. package/src/transformers/features/CreateIsTransformer.ts +11 -11
  182. package/src/transformers/features/CreateRandomTransformer.ts +39 -39
  183. package/src/transformers/features/CreateValidateTransformer.ts +13 -13
  184. package/src/transformers/features/IsTransformer.ts +11 -11
  185. package/src/transformers/features/RandomTransformer.ts +42 -42
  186. package/src/transformers/features/ValidateTransformer.ts +11 -11
  187. package/src/transformers/features/json/JsonApplicationTransformer.ts +111 -111
  188. package/src/transformers/features/json/JsonAssertParseTransformer.ts +10 -10
  189. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +10 -10
  190. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +10 -10
  191. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +12 -12
  192. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +9 -9
  193. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +10 -10
  194. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +9 -9
  195. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +10 -10
  196. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +12 -12
  197. package/src/transformers/features/json/JsonIsParseTransformer.ts +9 -9
  198. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +10 -10
  199. package/src/transformers/features/json/JsonStringifyTransformer.ts +9 -9
  200. package/src/transformers/features/json/JsonValidateParseTransformer.ts +10 -10
  201. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +10 -10
  202. package/src/transformers/features/misc/MetadataTransformer.ts +53 -53
  203. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +10 -10
  204. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +10 -10
  205. package/src/transformers/features/misc/MiscCloneTransformer.ts +9 -9
  206. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +10 -10
  207. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +10 -10
  208. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +9 -9
  209. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +9 -9
  210. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +9 -9
  211. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +9 -9
  212. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +10 -10
  213. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +10 -10
  214. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +9 -9
  215. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +9 -9
  216. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +28 -28
  217. package/src/transformers/features/misc/MiscPruneTransformer.ts +9 -9
  218. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +10 -10
  219. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +10 -10
  220. package/src/transformers/features/protobuf/CreateProtobufAssertDecodeTransformer.ts +12 -12
  221. package/src/transformers/features/protobuf/CreateProtobufAssertEncodeTransformer.ts +12 -12
  222. package/src/transformers/features/protobuf/CreateProtobufDecodeTransformer.ts +9 -9
  223. package/src/transformers/features/protobuf/CreateProtobufEncodeTransformer.ts +9 -9
  224. package/src/transformers/features/protobuf/CreateProtobufIsDecodeTransformer.ts +12 -12
  225. package/src/transformers/features/protobuf/CreateProtobufIsEncodeTransformer.ts +12 -12
  226. package/src/transformers/features/protobuf/CreateProtobufValidateDecodeTransformer.ts +12 -12
  227. package/src/transformers/features/protobuf/CreateProtobufValidateEncodeTransformer.ts +12 -12
  228. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +10 -10
  229. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +10 -10
  230. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +10 -10
  231. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +10 -10
  232. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +10 -10
  233. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +10 -10
  234. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +31 -31
  235. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +12 -12
  236. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +12 -12
  237. package/src/utils/NameEncoder.ts +32 -32
@@ -1,497 +1,497 @@
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 "../schemas/metadata/IJsDocTagInfo";
10
- import { IMetadataTag } from "../schemas/metadata/IMetadataTag";
11
- import { Metadata } from "../schemas/metadata/Metadata";
12
- import { MetadataArray } from "../schemas/metadata/MetadataArray";
13
- import { MetadataObject } from "../schemas/metadata/MetadataObject";
14
-
15
- import { IProject } from "../transformers/IProject";
16
-
17
- import { CheckerProgrammer } from "./CheckerProgrammer";
18
- import { FunctionImporter } from "./helpers/FunctionImporeter";
19
- import { IExpressionEntry } from "./helpers/IExpressionEntry";
20
- import { UnionExplorer } from "./helpers/UnionExplorer";
21
- import { feature_object_entries } from "./internal/feature_object_entries";
22
-
23
- export namespace FeatureProgrammer {
24
- /* -----------------------------------------------------------
25
- PARAMETERS
26
- ----------------------------------------------------------- */
27
- export interface IConfig<Output extends ts.ConciseBody = ts.ConciseBody> {
28
- types: IConfig.ITypes;
29
-
30
- /**
31
- * Prefix name of internal functions for specific types.
32
- */
33
- prefix: string;
34
-
35
- /**
36
- * Whether to archive access path or not.
37
- */
38
- path: boolean;
39
-
40
- /**
41
- * Whether to trace exception or not.
42
- */
43
- trace: boolean;
44
-
45
- addition?(collection: MetadataCollection): ts.Statement[];
46
-
47
- /**
48
- * Initializer of metadata.
49
- */
50
- initializer: (
51
- project: IProject,
52
- ) => (type: ts.Type) => [MetadataCollection, Metadata];
53
-
54
- /**
55
- * Decoder, station of every types.
56
- */
57
- decoder: () => Decoder<Metadata, Output>;
58
-
59
- /**
60
- * Object configurator.
61
- */
62
- objector: IConfig.IObjector<Output>;
63
-
64
- /**
65
- * Generator of functions for object types.
66
- */
67
- generator: IConfig.IGenerator;
68
- }
69
- export namespace IConfig {
70
- export interface ITypes {
71
- input: (type: ts.Type, name?: string) => ts.TypeNode;
72
- output: (type: ts.Type, name?: string) => ts.TypeNode;
73
- }
74
-
75
- export interface IObjector<
76
- Output extends ts.ConciseBody = ts.ConciseBody,
77
- > {
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<Output>[],
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
- objects?(): (col: MetadataCollection) => ts.VariableStatement[];
176
- unions?(): (col: MetadataCollection) => ts.VariableStatement[];
177
- arrays(): (col: MetadataCollection) => ts.VariableStatement[];
178
- tuples(): (col: MetadataCollection) => ts.VariableStatement[];
179
- }
180
- }
181
-
182
- export interface IExplore {
183
- tracable: boolean;
184
- source: "top" | "function";
185
- from: "top" | "array" | "object";
186
- postfix: string;
187
- start?: number;
188
- }
189
-
190
- export interface Decoder<
191
- T,
192
- Output extends ts.ConciseBody = ts.ConciseBody,
193
- > {
194
- (
195
- input: ts.Expression,
196
- target: T,
197
- explore: IExplore,
198
- metaTags: IMetadataTag[],
199
- jsDocTags: ts.JSDocTagInfo[],
200
- ): Output;
201
- }
202
-
203
- /* -----------------------------------------------------------
204
- GENERATORS
205
- ----------------------------------------------------------- */
206
- export const write =
207
- (project: IProject) =>
208
- (config: IConfig) =>
209
- (importer: FunctionImporter) =>
210
- (type: ts.Type, name?: string) => {
211
- const [collection, meta] = config.initializer(project)(type);
212
-
213
- // ITERATE OVER ALL METADATA
214
- const output: ts.ConciseBody = config.decoder()(
215
- ValueFactory.INPUT(),
216
- meta,
217
- {
218
- tracable: config.path || config.trace,
219
- source: "top",
220
- from: "top",
221
- postfix: '""',
222
- },
223
- [],
224
- [],
225
- );
226
-
227
- // RETURNS THE OPTIMAL ARROW FUNCTION
228
- const functions = {
229
- objects: (
230
- config.generator.objects?.() ??
231
- write_object_functions(config)(importer)
232
- )(collection),
233
- unions: (
234
- config.generator.unions?.() ?? write_union_functions(config)
235
- )(collection),
236
- arrays: config.generator.arrays()(collection),
237
- tuples: config.generator.tuples()(collection),
238
- };
239
- const added: ts.Statement[] = (config.addition ?? (() => []))(
240
- collection,
241
- );
242
-
243
- return ts.factory.createArrowFunction(
244
- undefined,
245
- undefined,
246
- parameterDeclarations(config)(config.types.input(type, name))(
247
- ValueFactory.INPUT(),
248
- ),
249
- config.types.output(type, name),
250
- undefined,
251
- ts.factory.createBlock(
252
- [
253
- ...added,
254
- ...functions.objects.filter((_, i) =>
255
- importer.hasLocal(`${config.prefix}o${i}`),
256
- ),
257
- ...functions.unions.filter((_, i) =>
258
- importer.hasLocal(`${config.prefix}u${i}`),
259
- ),
260
- ...functions.arrays.filter((_, i) =>
261
- importer.hasLocal(`${config.prefix}a${i}`),
262
- ),
263
- ...functions.tuples.filter((_, i) =>
264
- importer.hasLocal(`${config.prefix}t${i}`),
265
- ),
266
- ...(ts.isBlock(output)
267
- ? output.statements
268
- : [ts.factory.createReturnStatement(output)]),
269
- ],
270
- true,
271
- ),
272
- );
273
- };
274
-
275
- export const write_object_functions =
276
- (config: IConfig) =>
277
- (importer: FunctionImporter) =>
278
- (collection: MetadataCollection) =>
279
- collection
280
- .objects()
281
- .map((obj) =>
282
- StatementFactory.constant(
283
- `${config.prefix}o${obj.index}`,
284
- ts.factory.createArrowFunction(
285
- undefined,
286
- undefined,
287
- parameterDeclarations(config)(
288
- TypeFactory.keyword("any"),
289
- )(ValueFactory.INPUT()),
290
- config.objector.type ?? TypeFactory.keyword("any"),
291
- undefined,
292
- config.objector.joiner(
293
- ts.factory.createIdentifier("input"),
294
- feature_object_entries(config)(importer)(obj)(
295
- ts.factory.createIdentifier("input"),
296
- ),
297
- obj,
298
- ),
299
- ),
300
- ),
301
- );
302
-
303
- export const write_union_functions =
304
- (config: IConfig) => (collection: MetadataCollection) =>
305
- collection
306
- .unions()
307
- .map((union, i) =>
308
- StatementFactory.constant(
309
- `${config.prefix}u${i}`,
310
- write_union(config)(union),
311
- ),
312
- );
313
-
314
- const write_union = (config: IConfig) => {
315
- const explorer = UnionExplorer.object(config);
316
- const input = ValueFactory.INPUT();
317
-
318
- return (meta: MetadataObject[]) =>
319
- ts.factory.createArrowFunction(
320
- undefined,
321
- undefined,
322
- parameterDeclarations(config)(TypeFactory.keyword("any"))(
323
- ValueFactory.INPUT(),
324
- ),
325
- TypeFactory.keyword("any"),
326
- undefined,
327
- explorer(
328
- input,
329
- meta,
330
- {
331
- tracable: config.path || config.trace,
332
- source: "function",
333
- from: "object",
334
- postfix: "",
335
- },
336
- [],
337
- [],
338
- ),
339
- );
340
- };
341
-
342
- /* -----------------------------------------------------------
343
- DECODERS
344
- ----------------------------------------------------------- */
345
- export const decode_array =
346
- (config: Pick<IConfig, "trace" | "path" | "decoder" | "prefix">) =>
347
- (importer: FunctionImporter) =>
348
- (
349
- combiner: (
350
- input: ts.Expression,
351
- arrow: ts.ArrowFunction,
352
- metaTags: IMetadataTag[],
353
- jsDocTags: ts.JSDocTagInfo[],
354
- ) => ts.Expression,
355
- ) => {
356
- const rand: string = importer.increment().toString();
357
- const tail =
358
- config.path || config.trace
359
- ? [
360
- IdentifierFactory.parameter(
361
- "_index" + rand,
362
- TypeFactory.keyword("number"),
363
- ),
364
- ]
365
- : [];
366
-
367
- return (
368
- input: ts.Expression,
369
- array: MetadataArray,
370
- explore: IExplore,
371
- metaTags: IMetadataTag[],
372
- jsDocTags: IJsDocTagInfo[],
373
- ) => {
374
- const arrow: ts.ArrowFunction = ts.factory.createArrowFunction(
375
- undefined,
376
- undefined,
377
- [
378
- IdentifierFactory.parameter(
379
- "elem",
380
- TypeFactory.keyword("any"),
381
- ),
382
- ...tail,
383
- ],
384
- undefined,
385
- undefined,
386
- config.decoder()(
387
- ValueFactory.INPUT("elem"),
388
- array.value,
389
- {
390
- tracable: explore.tracable,
391
- source: explore.source,
392
- from: "array",
393
- postfix: index(explore.start ?? null)(
394
- explore.postfix,
395
- )(rand),
396
- },
397
- metaTags,
398
- jsDocTags,
399
- ),
400
- );
401
- return combiner(input, arrow, metaTags, jsDocTags);
402
- };
403
- };
404
-
405
- export const decode_object =
406
- (config: Pick<IConfig, "trace" | "path" | "prefix">) =>
407
- (importer: FunctionImporter) =>
408
- (input: ts.Expression, obj: MetadataObject, explore: IExplore) =>
409
- ts.factory.createCallExpression(
410
- ts.factory.createIdentifier(
411
- importer.useLocal(`${config.prefix}o${obj.index}`),
412
- ),
413
- undefined,
414
- argumentsArray(config)(explore)(input),
415
- );
416
-
417
- /* -----------------------------------------------------------
418
- UTILITIES FOR INTERNAL FUNCTIONS
419
- ----------------------------------------------------------- */
420
- export const index =
421
- (start: number | null) => (prev: string) => (rand: string) => {
422
- const tail: string =
423
- start !== null
424
- ? `"[" + (${start} + _index${rand}) + "]"`
425
- : `"[" + _index${rand} + "]"`;
426
- if (prev === "") return tail;
427
- else if (prev[prev.length - 1] === `"`)
428
- return prev.substring(0, prev.length - 1) + tail.substring(1);
429
- return prev + ` + ${tail}`;
430
- };
431
-
432
- export const argumentsArray =
433
- (config: Pick<IConfig, "path" | "trace">) =>
434
- (explore: FeatureProgrammer.IExplore) => {
435
- const tail: ts.Expression[] =
436
- config.path === false && config.trace === false
437
- ? []
438
- : config.path === true && config.trace === true
439
- ? [
440
- ts.factory.createIdentifier(
441
- explore.postfix
442
- ? `_path + ${explore.postfix}`
443
- : "_path",
444
- ),
445
- explore.source === "function"
446
- ? ts.factory.createIdentifier(
447
- `${explore.tracable} && _exceptionable`,
448
- )
449
- : explore.tracable
450
- ? ts.factory.createTrue()
451
- : ts.factory.createFalse(),
452
- ]
453
- : config.path === true
454
- ? [
455
- ts.factory.createIdentifier(
456
- explore.postfix
457
- ? `_path + ${explore.postfix}`
458
- : "_path",
459
- ),
460
- ]
461
- : [
462
- explore.source === "function"
463
- ? ts.factory.createIdentifier(
464
- `${explore.tracable} && _exceptionable`,
465
- )
466
- : explore.tracable
467
- ? ts.factory.createTrue()
468
- : ts.factory.createFalse(),
469
- ];
470
- return (input: ts.Expression) => [input, ...tail];
471
- };
472
-
473
- export const parameterDeclarations =
474
- (props: Pick<CheckerProgrammer.IConfig, "path" | "trace">) =>
475
- (type: ts.TypeNode) => {
476
- const tail: ts.ParameterDeclaration[] = [];
477
- if (props.path)
478
- tail.push(
479
- IdentifierFactory.parameter(
480
- "_path",
481
- TypeFactory.keyword("string"),
482
- ),
483
- );
484
- if (props.trace)
485
- tail.push(
486
- IdentifierFactory.parameter(
487
- "_exceptionable",
488
- TypeFactory.keyword("boolean"),
489
- ts.factory.createTrue(),
490
- ),
491
- );
492
- return (input: ts.Identifier): ts.ParameterDeclaration[] => [
493
- IdentifierFactory.parameter(input, type),
494
- ...tail,
495
- ];
496
- };
497
- }
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 "../schemas/metadata/IJsDocTagInfo";
10
+ import { IMetadataTag } from "../schemas/metadata/IMetadataTag";
11
+ import { Metadata } from "../schemas/metadata/Metadata";
12
+ import { MetadataArray } from "../schemas/metadata/MetadataArray";
13
+ import { MetadataObject } from "../schemas/metadata/MetadataObject";
14
+
15
+ import { IProject } from "../transformers/IProject";
16
+
17
+ import { CheckerProgrammer } from "./CheckerProgrammer";
18
+ import { FunctionImporter } from "./helpers/FunctionImporeter";
19
+ import { IExpressionEntry } from "./helpers/IExpressionEntry";
20
+ import { UnionExplorer } from "./helpers/UnionExplorer";
21
+ import { feature_object_entries } from "./internal/feature_object_entries";
22
+
23
+ export namespace FeatureProgrammer {
24
+ /* -----------------------------------------------------------
25
+ PARAMETERS
26
+ ----------------------------------------------------------- */
27
+ export interface IConfig<Output extends ts.ConciseBody = ts.ConciseBody> {
28
+ types: IConfig.ITypes;
29
+
30
+ /**
31
+ * Prefix name of internal functions for specific types.
32
+ */
33
+ prefix: string;
34
+
35
+ /**
36
+ * Whether to archive access path or not.
37
+ */
38
+ path: boolean;
39
+
40
+ /**
41
+ * Whether to trace exception or not.
42
+ */
43
+ trace: boolean;
44
+
45
+ addition?(collection: MetadataCollection): ts.Statement[];
46
+
47
+ /**
48
+ * Initializer of metadata.
49
+ */
50
+ initializer: (
51
+ project: IProject,
52
+ ) => (type: ts.Type) => [MetadataCollection, Metadata];
53
+
54
+ /**
55
+ * Decoder, station of every types.
56
+ */
57
+ decoder: () => Decoder<Metadata, Output>;
58
+
59
+ /**
60
+ * Object configurator.
61
+ */
62
+ objector: IConfig.IObjector<Output>;
63
+
64
+ /**
65
+ * Generator of functions for object types.
66
+ */
67
+ generator: IConfig.IGenerator;
68
+ }
69
+ export namespace IConfig {
70
+ export interface ITypes {
71
+ input: (type: ts.Type, name?: string) => ts.TypeNode;
72
+ output: (type: ts.Type, name?: string) => ts.TypeNode;
73
+ }
74
+
75
+ export interface IObjector<
76
+ Output extends ts.ConciseBody = ts.ConciseBody,
77
+ > {
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<Output>[],
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
+ objects?(): (col: MetadataCollection) => ts.VariableStatement[];
176
+ unions?(): (col: MetadataCollection) => ts.VariableStatement[];
177
+ arrays(): (col: MetadataCollection) => ts.VariableStatement[];
178
+ tuples(): (col: MetadataCollection) => ts.VariableStatement[];
179
+ }
180
+ }
181
+
182
+ export interface IExplore {
183
+ tracable: boolean;
184
+ source: "top" | "function";
185
+ from: "top" | "array" | "object";
186
+ postfix: string;
187
+ start?: number;
188
+ }
189
+
190
+ export interface Decoder<
191
+ T,
192
+ Output extends ts.ConciseBody = ts.ConciseBody,
193
+ > {
194
+ (
195
+ input: ts.Expression,
196
+ target: T,
197
+ explore: IExplore,
198
+ metaTags: IMetadataTag[],
199
+ jsDocTags: ts.JSDocTagInfo[],
200
+ ): Output;
201
+ }
202
+
203
+ /* -----------------------------------------------------------
204
+ GENERATORS
205
+ ----------------------------------------------------------- */
206
+ export const write =
207
+ (project: IProject) =>
208
+ (config: IConfig) =>
209
+ (importer: FunctionImporter) =>
210
+ (type: ts.Type, name?: string) => {
211
+ const [collection, meta] = config.initializer(project)(type);
212
+
213
+ // ITERATE OVER ALL METADATA
214
+ const output: ts.ConciseBody = config.decoder()(
215
+ ValueFactory.INPUT(),
216
+ meta,
217
+ {
218
+ tracable: config.path || config.trace,
219
+ source: "top",
220
+ from: "top",
221
+ postfix: '""',
222
+ },
223
+ [],
224
+ [],
225
+ );
226
+
227
+ // RETURNS THE OPTIMAL ARROW FUNCTION
228
+ const functions = {
229
+ objects: (
230
+ config.generator.objects?.() ??
231
+ write_object_functions(config)(importer)
232
+ )(collection),
233
+ unions: (
234
+ config.generator.unions?.() ?? write_union_functions(config)
235
+ )(collection),
236
+ arrays: config.generator.arrays()(collection),
237
+ tuples: config.generator.tuples()(collection),
238
+ };
239
+ const added: ts.Statement[] = (config.addition ?? (() => []))(
240
+ collection,
241
+ );
242
+
243
+ return ts.factory.createArrowFunction(
244
+ undefined,
245
+ undefined,
246
+ parameterDeclarations(config)(config.types.input(type, name))(
247
+ ValueFactory.INPUT(),
248
+ ),
249
+ config.types.output(type, name),
250
+ undefined,
251
+ ts.factory.createBlock(
252
+ [
253
+ ...added,
254
+ ...functions.objects.filter((_, i) =>
255
+ importer.hasLocal(`${config.prefix}o${i}`),
256
+ ),
257
+ ...functions.unions.filter((_, i) =>
258
+ importer.hasLocal(`${config.prefix}u${i}`),
259
+ ),
260
+ ...functions.arrays.filter((_, i) =>
261
+ importer.hasLocal(`${config.prefix}a${i}`),
262
+ ),
263
+ ...functions.tuples.filter((_, i) =>
264
+ importer.hasLocal(`${config.prefix}t${i}`),
265
+ ),
266
+ ...(ts.isBlock(output)
267
+ ? output.statements
268
+ : [ts.factory.createReturnStatement(output)]),
269
+ ],
270
+ true,
271
+ ),
272
+ );
273
+ };
274
+
275
+ export const write_object_functions =
276
+ (config: IConfig) =>
277
+ (importer: FunctionImporter) =>
278
+ (collection: MetadataCollection) =>
279
+ collection
280
+ .objects()
281
+ .map((obj) =>
282
+ StatementFactory.constant(
283
+ `${config.prefix}o${obj.index}`,
284
+ ts.factory.createArrowFunction(
285
+ undefined,
286
+ undefined,
287
+ parameterDeclarations(config)(
288
+ TypeFactory.keyword("any"),
289
+ )(ValueFactory.INPUT()),
290
+ config.objector.type ?? TypeFactory.keyword("any"),
291
+ undefined,
292
+ config.objector.joiner(
293
+ ts.factory.createIdentifier("input"),
294
+ feature_object_entries(config)(importer)(obj)(
295
+ ts.factory.createIdentifier("input"),
296
+ ),
297
+ obj,
298
+ ),
299
+ ),
300
+ ),
301
+ );
302
+
303
+ export const write_union_functions =
304
+ (config: IConfig) => (collection: MetadataCollection) =>
305
+ collection
306
+ .unions()
307
+ .map((union, i) =>
308
+ StatementFactory.constant(
309
+ `${config.prefix}u${i}`,
310
+ write_union(config)(union),
311
+ ),
312
+ );
313
+
314
+ const write_union = (config: IConfig) => {
315
+ const explorer = UnionExplorer.object(config);
316
+ const input = ValueFactory.INPUT();
317
+
318
+ return (meta: MetadataObject[]) =>
319
+ ts.factory.createArrowFunction(
320
+ undefined,
321
+ undefined,
322
+ parameterDeclarations(config)(TypeFactory.keyword("any"))(
323
+ ValueFactory.INPUT(),
324
+ ),
325
+ TypeFactory.keyword("any"),
326
+ undefined,
327
+ explorer(
328
+ input,
329
+ meta,
330
+ {
331
+ tracable: config.path || config.trace,
332
+ source: "function",
333
+ from: "object",
334
+ postfix: "",
335
+ },
336
+ [],
337
+ [],
338
+ ),
339
+ );
340
+ };
341
+
342
+ /* -----------------------------------------------------------
343
+ DECODERS
344
+ ----------------------------------------------------------- */
345
+ export const decode_array =
346
+ (config: Pick<IConfig, "trace" | "path" | "decoder" | "prefix">) =>
347
+ (importer: FunctionImporter) =>
348
+ (
349
+ combiner: (
350
+ input: ts.Expression,
351
+ arrow: ts.ArrowFunction,
352
+ metaTags: IMetadataTag[],
353
+ jsDocTags: ts.JSDocTagInfo[],
354
+ ) => ts.Expression,
355
+ ) => {
356
+ const rand: string = importer.increment().toString();
357
+ const tail =
358
+ config.path || config.trace
359
+ ? [
360
+ IdentifierFactory.parameter(
361
+ "_index" + rand,
362
+ TypeFactory.keyword("number"),
363
+ ),
364
+ ]
365
+ : [];
366
+
367
+ return (
368
+ input: ts.Expression,
369
+ array: MetadataArray,
370
+ explore: IExplore,
371
+ metaTags: IMetadataTag[],
372
+ jsDocTags: IJsDocTagInfo[],
373
+ ) => {
374
+ const arrow: ts.ArrowFunction = ts.factory.createArrowFunction(
375
+ undefined,
376
+ undefined,
377
+ [
378
+ IdentifierFactory.parameter(
379
+ "elem",
380
+ TypeFactory.keyword("any"),
381
+ ),
382
+ ...tail,
383
+ ],
384
+ undefined,
385
+ undefined,
386
+ config.decoder()(
387
+ ValueFactory.INPUT("elem"),
388
+ array.value,
389
+ {
390
+ tracable: explore.tracable,
391
+ source: explore.source,
392
+ from: "array",
393
+ postfix: index(explore.start ?? null)(
394
+ explore.postfix,
395
+ )(rand),
396
+ },
397
+ metaTags,
398
+ jsDocTags,
399
+ ),
400
+ );
401
+ return combiner(input, arrow, metaTags, jsDocTags);
402
+ };
403
+ };
404
+
405
+ export const decode_object =
406
+ (config: Pick<IConfig, "trace" | "path" | "prefix">) =>
407
+ (importer: FunctionImporter) =>
408
+ (input: ts.Expression, obj: MetadataObject, explore: IExplore) =>
409
+ ts.factory.createCallExpression(
410
+ ts.factory.createIdentifier(
411
+ importer.useLocal(`${config.prefix}o${obj.index}`),
412
+ ),
413
+ undefined,
414
+ argumentsArray(config)(explore)(input),
415
+ );
416
+
417
+ /* -----------------------------------------------------------
418
+ UTILITIES FOR INTERNAL FUNCTIONS
419
+ ----------------------------------------------------------- */
420
+ export const index =
421
+ (start: number | null) => (prev: string) => (rand: string) => {
422
+ const tail: string =
423
+ start !== null
424
+ ? `"[" + (${start} + _index${rand}) + "]"`
425
+ : `"[" + _index${rand} + "]"`;
426
+ if (prev === "") return tail;
427
+ else if (prev[prev.length - 1] === `"`)
428
+ return prev.substring(0, prev.length - 1) + tail.substring(1);
429
+ return prev + ` + ${tail}`;
430
+ };
431
+
432
+ export const argumentsArray =
433
+ (config: Pick<IConfig, "path" | "trace">) =>
434
+ (explore: FeatureProgrammer.IExplore) => {
435
+ const tail: ts.Expression[] =
436
+ config.path === false && config.trace === false
437
+ ? []
438
+ : config.path === true && config.trace === true
439
+ ? [
440
+ ts.factory.createIdentifier(
441
+ explore.postfix
442
+ ? `_path + ${explore.postfix}`
443
+ : "_path",
444
+ ),
445
+ explore.source === "function"
446
+ ? ts.factory.createIdentifier(
447
+ `${explore.tracable} && _exceptionable`,
448
+ )
449
+ : explore.tracable
450
+ ? ts.factory.createTrue()
451
+ : ts.factory.createFalse(),
452
+ ]
453
+ : config.path === true
454
+ ? [
455
+ ts.factory.createIdentifier(
456
+ explore.postfix
457
+ ? `_path + ${explore.postfix}`
458
+ : "_path",
459
+ ),
460
+ ]
461
+ : [
462
+ explore.source === "function"
463
+ ? ts.factory.createIdentifier(
464
+ `${explore.tracable} && _exceptionable`,
465
+ )
466
+ : explore.tracable
467
+ ? ts.factory.createTrue()
468
+ : ts.factory.createFalse(),
469
+ ];
470
+ return (input: ts.Expression) => [input, ...tail];
471
+ };
472
+
473
+ export const parameterDeclarations =
474
+ (props: Pick<CheckerProgrammer.IConfig, "path" | "trace">) =>
475
+ (type: ts.TypeNode) => {
476
+ const tail: ts.ParameterDeclaration[] = [];
477
+ if (props.path)
478
+ tail.push(
479
+ IdentifierFactory.parameter(
480
+ "_path",
481
+ TypeFactory.keyword("string"),
482
+ ),
483
+ );
484
+ if (props.trace)
485
+ tail.push(
486
+ IdentifierFactory.parameter(
487
+ "_exceptionable",
488
+ TypeFactory.keyword("boolean"),
489
+ ts.factory.createTrue(),
490
+ ),
491
+ );
492
+ return (input: ts.Identifier): ts.ParameterDeclaration[] => [
493
+ IdentifierFactory.parameter(input, type),
494
+ ...tail,
495
+ ];
496
+ };
497
+ }