typia 7.0.1 → 7.0.2-dev.20241204

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 (447) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +123 -122
  3. package/lib/executable/TypiaPatchWizard.js +10 -6
  4. package/lib/executable/TypiaPatchWizard.js.map +1 -1
  5. package/lib/executable/typia.js +17 -7
  6. package/lib/executable/typia.js.map +1 -1
  7. package/lib/index.js +17 -7
  8. package/lib/index.js.map +1 -1
  9. package/lib/module.js +17 -7
  10. package/lib/module.js.map +1 -1
  11. package/package.json +3 -3
  12. package/src/IRandomGenerator.ts +49 -49
  13. package/src/IReadableURLSearchParams.ts +9 -9
  14. package/src/IValidation.ts +20 -20
  15. package/src/executable/TypiaGenerateWizard.ts +83 -83
  16. package/src/executable/TypiaPatchWizard.ts +17 -15
  17. package/src/executable/TypiaSetupWizard.ts +179 -179
  18. package/src/executable/setup/ArgumentParser.ts +42 -42
  19. package/src/executable/setup/FileRetriever.ts +19 -19
  20. package/src/executable/setup/PackageManager.ts +87 -87
  21. package/src/factories/ExpressionFactory.ts +216 -216
  22. package/src/factories/IdentifierFactory.ts +89 -89
  23. package/src/factories/JsonMetadataFactory.ts +76 -76
  24. package/src/factories/LiteralFactory.ts +50 -50
  25. package/src/factories/MetadataCollection.ts +278 -278
  26. package/src/factories/MetadataCommentTagFactory.ts +650 -650
  27. package/src/factories/MetadataFactory.ts +404 -404
  28. package/src/factories/MetadataTypeTagFactory.ts +411 -411
  29. package/src/factories/MetadataTypeTagSchemaFactory.ts +82 -82
  30. package/src/factories/NumericRangeFactory.ts +72 -72
  31. package/src/factories/ProtobufFactory.ts +875 -875
  32. package/src/factories/StatementFactory.ts +90 -90
  33. package/src/factories/TemplateFactory.ts +64 -64
  34. package/src/factories/TypeFactory.ts +140 -140
  35. package/src/factories/internal/metadata/IMetadataIteratorProps.ts +17 -17
  36. package/src/factories/internal/metadata/MetadataHelper.ts +21 -21
  37. package/src/factories/internal/metadata/emplace_metadata_alias.ts +33 -33
  38. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +39 -39
  39. package/src/factories/internal/metadata/emplace_metadata_object.ts +208 -208
  40. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +57 -57
  41. package/src/factories/internal/metadata/explore_metadata.ts +31 -31
  42. package/src/factories/internal/metadata/iterate_metadata.ts +54 -54
  43. package/src/factories/internal/metadata/iterate_metadata_alias.ts +33 -33
  44. package/src/factories/internal/metadata/iterate_metadata_array.ts +63 -63
  45. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +62 -62
  46. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +28 -28
  47. package/src/factories/internal/metadata/iterate_metadata_collection.ts +146 -146
  48. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +32 -32
  49. package/src/factories/internal/metadata/iterate_metadata_constant.ts +76 -76
  50. package/src/factories/internal/metadata/iterate_metadata_escape.ts +49 -49
  51. package/src/factories/internal/metadata/iterate_metadata_function.ts +90 -90
  52. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +213 -213
  53. package/src/factories/internal/metadata/iterate_metadata_map.ts +57 -57
  54. package/src/factories/internal/metadata/iterate_metadata_native.ts +254 -254
  55. package/src/factories/internal/metadata/iterate_metadata_object.ts +35 -35
  56. package/src/factories/internal/metadata/iterate_metadata_set.ts +57 -57
  57. package/src/factories/internal/metadata/iterate_metadata_sort.ts +87 -87
  58. package/src/factories/internal/metadata/iterate_metadata_template.ts +41 -41
  59. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +26 -26
  60. package/src/factories/internal/metadata/iterate_metadata_union.ts +19 -19
  61. package/src/functional.ts +750 -750
  62. package/src/http.ts +1047 -1047
  63. package/src/internal/_IProtobufWriter.ts +18 -18
  64. package/src/internal/_ProtobufReader.ts +194 -194
  65. package/src/internal/_ProtobufSizer.ts +145 -145
  66. package/src/internal/_ProtobufWriter.ts +145 -145
  67. package/src/internal/_accessExpressionAsString.ts +46 -46
  68. package/src/internal/_assertGuard.ts +13 -13
  69. package/src/internal/_functionalTypeGuardErrorFactory.ts +4 -4
  70. package/src/internal/_httpFormDataReadArray.ts +4 -4
  71. package/src/internal/_httpFormDataReadBigint.ts +18 -18
  72. package/src/internal/_httpFormDataReadBlob.ts +10 -10
  73. package/src/internal/_httpFormDataReadBoolean.ts +16 -16
  74. package/src/internal/_httpFormDataReadFile.ts +10 -10
  75. package/src/internal/_httpFormDataReadNumber.ts +15 -15
  76. package/src/internal/_httpFormDataReadString.ts +10 -10
  77. package/src/internal/_httpHeaderReadBigint.ts +10 -10
  78. package/src/internal/_httpHeaderReadBoolean.ts +8 -8
  79. package/src/internal/_httpHeaderReadNumber.ts +7 -7
  80. package/src/internal/_httpParameterReadBigint.ts +10 -10
  81. package/src/internal/_httpParameterReadBoolean.ts +8 -8
  82. package/src/internal/_httpParameterReadNumber.ts +7 -7
  83. package/src/internal/_httpParameterReadString.ts +2 -2
  84. package/src/internal/_httpQueryParseURLSearchParams.ts +12 -12
  85. package/src/internal/_httpQueryReadArray.ts +4 -4
  86. package/src/internal/_httpQueryReadBigint.ts +12 -12
  87. package/src/internal/_httpQueryReadBoolean.ts +14 -14
  88. package/src/internal/_httpQueryReadNumber.ts +9 -9
  89. package/src/internal/_httpQueryReadString.ts +4 -4
  90. package/src/internal/_isBetween.ts +2 -2
  91. package/src/internal/_isBigintString.ts +8 -8
  92. package/src/internal/_isFormatByte.ts +7 -7
  93. package/src/internal/_isFormatDate.ts +3 -3
  94. package/src/internal/_isFormatDateTime.ts +4 -4
  95. package/src/internal/_isFormatDuration.ts +4 -4
  96. package/src/internal/_isFormatEmail.ts +4 -4
  97. package/src/internal/_isFormatHostname.ts +4 -4
  98. package/src/internal/_isFormatIdnEmail.ts +4 -4
  99. package/src/internal/_isFormatIdnHostname.ts +4 -4
  100. package/src/internal/_isFormatIpv4.ts +4 -4
  101. package/src/internal/_isFormatIpv6.ts +4 -4
  102. package/src/internal/_isFormatIri.ts +3 -3
  103. package/src/internal/_isFormatIriReference.ts +4 -4
  104. package/src/internal/_isFormatJsonPointer.ts +3 -3
  105. package/src/internal/_isFormatPassword.ts +1 -1
  106. package/src/internal/_isFormatRegex.ts +8 -8
  107. package/src/internal/_isFormatRelativeJsonPointer.ts +4 -4
  108. package/src/internal/_isFormatTime.ts +4 -4
  109. package/src/internal/_isFormatUri.ts +6 -6
  110. package/src/internal/_isFormatUriReference.ts +5 -5
  111. package/src/internal/_isFormatUriTemplate.ts +4 -4
  112. package/src/internal/_isFormatUrl.ts +4 -4
  113. package/src/internal/_isFormatUuid.ts +3 -3
  114. package/src/internal/_isTypeFloat.ts +5 -5
  115. package/src/internal/_isTypeInt32.ts +5 -5
  116. package/src/internal/_isTypeInt64.ts +5 -5
  117. package/src/internal/_isTypeUint32.ts +5 -5
  118. package/src/internal/_isTypeUint64.ts +5 -5
  119. package/src/internal/_isUniqueItems.ts +159 -159
  120. package/src/internal/_jsonStringifyNumber.ts +12 -12
  121. package/src/internal/_jsonStringifyRest.ts +3 -3
  122. package/src/internal/_jsonStringifyString.ts +42 -42
  123. package/src/internal/_jsonStringifyTail.ts +2 -2
  124. package/src/internal/_llmApplicationFinalize.ts +20 -20
  125. package/src/internal/_miscCloneAny.ts +46 -46
  126. package/src/internal/_notationAny.ts +37 -37
  127. package/src/internal/_notationCamel.ts +13 -13
  128. package/src/internal/_notationPascal.ts +8 -8
  129. package/src/internal/_notationSnake.ts +43 -43
  130. package/src/internal/_randomArray.ts +21 -21
  131. package/src/internal/_randomBigint.ts +6 -6
  132. package/src/internal/_randomBoolean.ts +1 -1
  133. package/src/internal/_randomFormatByte.ts +3 -3
  134. package/src/internal/_randomFormatDate.ts +18 -18
  135. package/src/internal/_randomFormatDatetime.ts +16 -16
  136. package/src/internal/_randomFormatDuration.ts +27 -27
  137. package/src/internal/_randomFormatEmail.ts +11 -11
  138. package/src/internal/_randomFormatHostname.ts +6 -6
  139. package/src/internal/_randomFormatIdnEmail.ts +3 -3
  140. package/src/internal/_randomFormatIdnHostname.ts +3 -3
  141. package/src/internal/_randomFormatIpv4.ts +11 -11
  142. package/src/internal/_randomFormatIpv6.ts +11 -11
  143. package/src/internal/_randomFormatIri.ts +3 -3
  144. package/src/internal/_randomFormatIriReference.ts +3 -3
  145. package/src/internal/_randomFormatJsonPointer.ts +7 -7
  146. package/src/internal/_randomFormatPassword.ts +8 -8
  147. package/src/internal/_randomFormatRegex.ts +4 -4
  148. package/src/internal/_randomFormatRelativeJsonPointer.ts +8 -8
  149. package/src/internal/_randomFormatTime.ts +14 -14
  150. package/src/internal/_randomFormatUri.ts +3 -3
  151. package/src/internal/_randomFormatUriReference.ts +3 -3
  152. package/src/internal/_randomFormatUriTemplate.ts +3 -3
  153. package/src/internal/_randomFormatUrl.ts +11 -11
  154. package/src/internal/_randomFormatUuid.ts +6 -6
  155. package/src/internal/_randomInteger.ts +47 -47
  156. package/src/internal/_randomNumber.ts +74 -74
  157. package/src/internal/_randomPattern.ts +10 -10
  158. package/src/internal/_randomPick.ts +9 -9
  159. package/src/internal/_randomString.ts +24 -24
  160. package/src/internal/_throwTypeGuardError.ts +5 -5
  161. package/src/internal/_validateReport.ts +13 -13
  162. package/src/internal/private/__notationCapitalize.ts +2 -2
  163. package/src/internal/private/__notationUnsnake.ts +24 -24
  164. package/src/json.ts +752 -752
  165. package/src/llm.ts +342 -342
  166. package/src/misc.ts +658 -658
  167. package/src/module.ts +935 -935
  168. package/src/notations.ts +827 -827
  169. package/src/programmers/AssertProgrammer.ts +454 -454
  170. package/src/programmers/CheckerProgrammer.ts +1617 -1617
  171. package/src/programmers/FeatureProgrammer.ts +622 -622
  172. package/src/programmers/ImportProgrammer.ts +185 -185
  173. package/src/programmers/IsProgrammer.ts +273 -273
  174. package/src/programmers/RandomProgrammer.ts +1190 -1190
  175. package/src/programmers/TypiaProgrammer.ts +174 -174
  176. package/src/programmers/ValidateProgrammer.ts +434 -434
  177. package/src/programmers/functional/FunctionalAssertFunctionProgrammer.ts +153 -153
  178. package/src/programmers/functional/FunctionalAssertParametersProgrammer.ts +125 -125
  179. package/src/programmers/functional/FunctionalAssertReturnProgrammer.ts +115 -115
  180. package/src/programmers/functional/FunctionalIsFunctionProgrammer.ts +72 -72
  181. package/src/programmers/functional/FunctionalIsParametersProgrammer.ts +113 -113
  182. package/src/programmers/functional/FunctionalIsReturnProgrammer.ts +116 -116
  183. package/src/programmers/functional/FunctionalValidateFunctionProgrammer.ts +119 -119
  184. package/src/programmers/functional/FunctionalValidateParametersProgrammer.ts +274 -274
  185. package/src/programmers/functional/FunctionalValidateReturnProgrammer.ts +135 -135
  186. package/src/programmers/functional/internal/FunctionalGeneralProgrammer.ts +34 -34
  187. package/src/programmers/helpers/AtomicPredicator.ts +35 -35
  188. package/src/programmers/helpers/CloneJoiner.ts +143 -143
  189. package/src/programmers/helpers/FunctionProgrammer.ts +67 -67
  190. package/src/programmers/helpers/HttpMetadataUtil.ts +21 -21
  191. package/src/programmers/helpers/NotationJoiner.ts +144 -144
  192. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  193. package/src/programmers/helpers/ProtobufUtil.ts +228 -228
  194. package/src/programmers/helpers/PruneJoiner.ts +148 -148
  195. package/src/programmers/helpers/RandomJoiner.ts +168 -168
  196. package/src/programmers/helpers/StringifyJoinder.ts +115 -115
  197. package/src/programmers/helpers/StringifyPredicator.ts +13 -13
  198. package/src/programmers/helpers/UnionExplorer.ts +372 -372
  199. package/src/programmers/helpers/UnionPredicator.ts +79 -79
  200. package/src/programmers/helpers/disable_function_programmer_declare.ts +32 -32
  201. package/src/programmers/http/HttpAssertFormDataProgrammer.ts +99 -99
  202. package/src/programmers/http/HttpAssertHeadersProgrammer.ts +99 -99
  203. package/src/programmers/http/HttpAssertQueryProgrammer.ts +105 -105
  204. package/src/programmers/http/HttpFormDataProgrammer.ts +308 -308
  205. package/src/programmers/http/HttpHeadersProgrammer.ts +400 -400
  206. package/src/programmers/http/HttpIsFormDataProgrammer.ts +108 -108
  207. package/src/programmers/http/HttpIsHeadersProgrammer.ts +108 -108
  208. package/src/programmers/http/HttpIsQueryProgrammer.ts +114 -114
  209. package/src/programmers/http/HttpParameterProgrammer.ts +115 -115
  210. package/src/programmers/http/HttpQueryProgrammer.ts +336 -336
  211. package/src/programmers/http/HttpValidateFormDataProgrammer.ts +92 -92
  212. package/src/programmers/http/HttpValidateHeadersProgrammer.ts +92 -92
  213. package/src/programmers/http/HttpValidateQueryProgrammer.ts +98 -98
  214. package/src/programmers/internal/check_array_length.ts +47 -47
  215. package/src/programmers/internal/check_bigint.ts +50 -50
  216. package/src/programmers/internal/check_dynamic_key.ts +201 -201
  217. package/src/programmers/internal/check_dynamic_properties.ts +208 -208
  218. package/src/programmers/internal/check_everything.ts +23 -23
  219. package/src/programmers/internal/check_native.ts +27 -27
  220. package/src/programmers/internal/check_number.ts +112 -112
  221. package/src/programmers/internal/check_object.ts +75 -75
  222. package/src/programmers/internal/check_string.ts +50 -50
  223. package/src/programmers/internal/check_template.ts +48 -48
  224. package/src/programmers/internal/check_union_array_like.ts +335 -335
  225. package/src/programmers/internal/decode_union_object.ts +116 -116
  226. package/src/programmers/internal/feature_object_entries.ts +61 -61
  227. package/src/programmers/internal/json_schema_alias.ts +47 -47
  228. package/src/programmers/internal/json_schema_array.ts +45 -45
  229. package/src/programmers/internal/json_schema_bigint.ts +15 -15
  230. package/src/programmers/internal/json_schema_boolean.ts +15 -15
  231. package/src/programmers/internal/json_schema_constant.ts +26 -26
  232. package/src/programmers/internal/json_schema_description.ts +12 -12
  233. package/src/programmers/internal/json_schema_discriminator.ts +35 -35
  234. package/src/programmers/internal/json_schema_escaped.ts +82 -82
  235. package/src/programmers/internal/json_schema_native.ts +33 -33
  236. package/src/programmers/internal/json_schema_number.ts +15 -15
  237. package/src/programmers/internal/json_schema_object.ts +158 -158
  238. package/src/programmers/internal/json_schema_plugin.ts +18 -18
  239. package/src/programmers/internal/json_schema_station.ts +182 -182
  240. package/src/programmers/internal/json_schema_string.ts +15 -15
  241. package/src/programmers/internal/json_schema_template.ts +55 -55
  242. package/src/programmers/internal/json_schema_title.ts +20 -20
  243. package/src/programmers/internal/json_schema_tuple.ts +35 -35
  244. package/src/programmers/internal/metadata_to_pattern.ts +42 -42
  245. package/src/programmers/internal/postfix_of_tuple.ts +5 -5
  246. package/src/programmers/internal/prune_object_properties.ts +71 -71
  247. package/src/programmers/internal/stringify_dynamic_properties.ts +162 -162
  248. package/src/programmers/internal/stringify_regular_properties.ts +81 -81
  249. package/src/programmers/internal/template_to_pattern.ts +23 -23
  250. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +23 -23
  251. package/src/programmers/json/JsonApplicationProgrammer.ts +276 -276
  252. package/src/programmers/json/JsonAssertParseProgrammer.ts +106 -106
  253. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +115 -115
  254. package/src/programmers/json/JsonIsParseProgrammer.ts +114 -114
  255. package/src/programmers/json/JsonIsStringifyProgrammer.ts +108 -108
  256. package/src/programmers/json/JsonSchemasProgrammer.ts +91 -91
  257. package/src/programmers/json/JsonStringifyProgrammer.ts +1124 -1124
  258. package/src/programmers/json/JsonValidateParseProgrammer.ts +105 -105
  259. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +124 -124
  260. package/src/programmers/llm/LlmApplicationProgrammer.ts +276 -276
  261. package/src/programmers/llm/LlmModelPredicator.ts +127 -127
  262. package/src/programmers/llm/LlmParametersProgrammer.ts +90 -90
  263. package/src/programmers/llm/LlmSchemaProgrammer.ts +143 -143
  264. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +95 -95
  265. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +116 -116
  266. package/src/programmers/misc/MiscCloneProgrammer.ts +1032 -1032
  267. package/src/programmers/misc/MiscIsCloneProgrammer.ts +99 -99
  268. package/src/programmers/misc/MiscIsPruneProgrammer.ts +97 -97
  269. package/src/programmers/misc/MiscLiteralsProgrammer.ts +80 -80
  270. package/src/programmers/misc/MiscPruneProgrammer.ts +728 -728
  271. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +111 -111
  272. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +113 -113
  273. package/src/programmers/notations/NotationAssertGeneralProgrammer.ts +101 -101
  274. package/src/programmers/notations/NotationGeneralProgrammer.ts +984 -984
  275. package/src/programmers/notations/NotationIsGeneralProgrammer.ts +105 -105
  276. package/src/programmers/notations/NotationValidateGeneralProgrammer.ts +119 -119
  277. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +98 -98
  278. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +102 -102
  279. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +654 -654
  280. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +945 -945
  281. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +109 -109
  282. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +98 -98
  283. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +179 -179
  284. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +92 -92
  285. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +119 -119
  286. package/src/protobuf.ts +868 -868
  287. package/src/reflect.ts +57 -57
  288. package/src/schemas/json/IJsonApplication.ts +73 -73
  289. package/src/schemas/json/IJsonSchemaCollection.ts +29 -29
  290. package/src/schemas/json/__IJsonApplication.ts +63 -63
  291. package/src/schemas/metadata/IMetadata.ts +35 -35
  292. package/src/schemas/metadata/IMetadataAlias.ts +6 -6
  293. package/src/schemas/metadata/IMetadataAliasType.ts +12 -12
  294. package/src/schemas/metadata/IMetadataApplication.ts +7 -7
  295. package/src/schemas/metadata/IMetadataArray.ts +6 -6
  296. package/src/schemas/metadata/IMetadataComponents.ts +11 -11
  297. package/src/schemas/metadata/IMetadataConstantValue.ts +11 -11
  298. package/src/schemas/metadata/IMetadataDictionary.ts +11 -11
  299. package/src/schemas/metadata/IMetadataMap.ts +8 -8
  300. package/src/schemas/metadata/IMetadataNative.ts +6 -6
  301. package/src/schemas/metadata/IMetadataObject.ts +6 -6
  302. package/src/schemas/metadata/IMetadataObjectType.ts +13 -13
  303. package/src/schemas/metadata/IMetadataSet.ts +7 -7
  304. package/src/schemas/metadata/IMetadataTemplate.ts +7 -7
  305. package/src/schemas/metadata/IMetadataTuple.ts +6 -6
  306. package/src/schemas/metadata/IMetadataTypeTag.ts +16 -16
  307. package/src/schemas/metadata/Metadata.ts +669 -669
  308. package/src/schemas/metadata/MetadataAlias.ts +46 -46
  309. package/src/schemas/metadata/MetadataAliasType.ts +63 -63
  310. package/src/schemas/metadata/MetadataApplication.ts +44 -44
  311. package/src/schemas/metadata/MetadataArray.ts +49 -49
  312. package/src/schemas/metadata/MetadataAtomic.ts +87 -87
  313. package/src/schemas/metadata/MetadataComponents.ts +98 -98
  314. package/src/schemas/metadata/MetadataConstantValue.ts +62 -62
  315. package/src/schemas/metadata/MetadataMap.ts +48 -48
  316. package/src/schemas/metadata/MetadataNative.ts +44 -44
  317. package/src/schemas/metadata/MetadataObject.ts +48 -48
  318. package/src/schemas/metadata/MetadataObjectType.ts +149 -149
  319. package/src/schemas/metadata/MetadataProperty.ts +59 -59
  320. package/src/schemas/metadata/MetadataSet.ts +45 -45
  321. package/src/schemas/metadata/MetadataTemplate.ts +80 -80
  322. package/src/schemas/metadata/MetadataTuple.ts +32 -32
  323. package/src/schemas/protobuf/IProtobufProperty.ts +6 -6
  324. package/src/schemas/protobuf/IProtobufPropertyType.ts +37 -37
  325. package/src/schemas/protobuf/IProtobufSchema.ts +50 -50
  326. package/src/tags/Example.ts +24 -24
  327. package/src/tags/Examples.ts +16 -16
  328. package/src/tags/Format.ts +50 -50
  329. package/src/tags/JsonSchemaPlugin.ts +8 -8
  330. package/src/tags/Sequence.ts +10 -10
  331. package/src/tags/TagBase.ts +82 -82
  332. package/src/tags/Type.ts +32 -32
  333. package/src/tags/UniqueItems.ts +14 -14
  334. package/src/tags/index.ts +21 -21
  335. package/src/transform.ts +35 -35
  336. package/src/transformers/CallExpressionTransformer.ts +545 -545
  337. package/src/transformers/FileTransformer.ts +136 -136
  338. package/src/transformers/IProgrammerProps.ts +11 -11
  339. package/src/transformers/ITransformOptions.ts +62 -62
  340. package/src/transformers/ITransformProps.ts +9 -9
  341. package/src/transformers/ITypiaContext.ts +18 -18
  342. package/src/transformers/ImportTransformer.ts +81 -81
  343. package/src/transformers/NodeTransformer.ts +17 -17
  344. package/src/transformers/TransformerError.ts +60 -60
  345. package/src/transformers/features/AssertTransformer.ts +24 -24
  346. package/src/transformers/features/CreateAssertTransformer.ts +24 -24
  347. package/src/transformers/features/CreateIsTransformer.ts +18 -18
  348. package/src/transformers/features/CreateRandomTransformer.ts +43 -43
  349. package/src/transformers/features/CreateValidateTransformer.ts +18 -18
  350. package/src/transformers/features/IsTransformer.ts +18 -18
  351. package/src/transformers/features/RandomTransformer.ts +41 -41
  352. package/src/transformers/features/ValidateTransformer.ts +18 -18
  353. package/src/transformers/features/functional/FunctionalGenericTransformer.ts +57 -57
  354. package/src/transformers/features/http/CreateHttpAssertFormDataTransformer.ts +13 -13
  355. package/src/transformers/features/http/CreateHttpAssertHeadersTransformer.ts +13 -13
  356. package/src/transformers/features/http/CreateHttpAssertQueryTransformer.ts +13 -13
  357. package/src/transformers/features/http/CreateHttpFormDataTransformer.ts +13 -13
  358. package/src/transformers/features/http/CreateHttpHeadersTransformer.ts +13 -13
  359. package/src/transformers/features/http/CreateHttpIsFormDataTransformer.ts +13 -13
  360. package/src/transformers/features/http/CreateHttpIsHeadersTransformer.ts +13 -13
  361. package/src/transformers/features/http/CreateHttpIsQueryTransformer.ts +13 -13
  362. package/src/transformers/features/http/CreateHttpParameterTransformer.ts +13 -13
  363. package/src/transformers/features/http/CreateHttpQueryTransformer.ts +13 -13
  364. package/src/transformers/features/http/CreateHttpValidateFormDataTransformer.ts +13 -13
  365. package/src/transformers/features/http/CreateHttpValidateHeadersTransformer.ts +13 -13
  366. package/src/transformers/features/http/CreateHttpValidateQueryTransformer.ts +13 -13
  367. package/src/transformers/features/http/HttpAssertFormDataTransformer.ts +13 -13
  368. package/src/transformers/features/http/HttpAssertHeadersTransformer.ts +13 -13
  369. package/src/transformers/features/http/HttpAssertQueryTransformer.ts +13 -13
  370. package/src/transformers/features/http/HttpFormDataTransformer.ts +13 -13
  371. package/src/transformers/features/http/HttpHeadersTransformer.ts +13 -13
  372. package/src/transformers/features/http/HttpIsFormDataTransformer.ts +13 -13
  373. package/src/transformers/features/http/HttpIsHeadersTransformer.ts +13 -13
  374. package/src/transformers/features/http/HttpIsQueryTransformer.ts +13 -13
  375. package/src/transformers/features/http/HttpParameterTransformer.ts +13 -13
  376. package/src/transformers/features/http/HttpQueryTransformer.ts +13 -13
  377. package/src/transformers/features/http/HttpValidateFormDataTransformer.ts +13 -13
  378. package/src/transformers/features/http/HttpValidateHeadersTransformer.ts +13 -13
  379. package/src/transformers/features/http/HttpValidateQueryTransformer.ts +13 -13
  380. package/src/transformers/features/json/JsonApplicationTransformer.ts +105 -105
  381. package/src/transformers/features/json/JsonAssertParseTransformer.ts +13 -13
  382. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +13 -13
  383. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +13 -13
  384. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +13 -13
  385. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +13 -13
  386. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +13 -13
  387. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +13 -13
  388. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +13 -13
  389. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +13 -13
  390. package/src/transformers/features/json/JsonIsParseTransformer.ts +13 -13
  391. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +13 -13
  392. package/src/transformers/features/json/JsonSchemasTransformer.ts +143 -143
  393. package/src/transformers/features/json/JsonStringifyTransformer.ts +13 -13
  394. package/src/transformers/features/json/JsonValidateParseTransformer.ts +13 -13
  395. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +13 -13
  396. package/src/transformers/features/llm/LlmApplicationTransformer.ts +113 -113
  397. package/src/transformers/features/llm/LlmParametersTransformer.ts +89 -89
  398. package/src/transformers/features/llm/LlmSchemaTransformer.ts +130 -130
  399. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +13 -13
  400. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +13 -13
  401. package/src/transformers/features/misc/MiscCloneTransformer.ts +13 -13
  402. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +13 -13
  403. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +13 -13
  404. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +13 -13
  405. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +13 -13
  406. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +13 -13
  407. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +13 -13
  408. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +13 -13
  409. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +13 -13
  410. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +13 -13
  411. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +13 -13
  412. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +35 -35
  413. package/src/transformers/features/misc/MiscPruneTransformer.ts +13 -13
  414. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +13 -13
  415. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +13 -13
  416. package/src/transformers/features/notations/NotationAssertGeneralTransformer.ts +20 -20
  417. package/src/transformers/features/notations/NotationCreateAssertGeneralTransformer.ts +20 -20
  418. package/src/transformers/features/notations/NotationCreateGeneralTransformer.ts +20 -20
  419. package/src/transformers/features/notations/NotationCreateIsGeneralTransformer.ts +20 -20
  420. package/src/transformers/features/notations/NotationCreateValidateGeneralTransformer.ts +20 -20
  421. package/src/transformers/features/notations/NotationGeneralTransformer.ts +18 -18
  422. package/src/transformers/features/notations/NotationIsGeneralTransformer.ts +20 -20
  423. package/src/transformers/features/notations/NotationValidateGeneralTransformer.ts +20 -20
  424. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +13 -13
  425. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +13 -13
  426. package/src/transformers/features/protobuf/ProtobufCreateAssertDecodeTransformer.ts +13 -13
  427. package/src/transformers/features/protobuf/ProtobufCreateAssertEncodeTransformer.ts +13 -13
  428. package/src/transformers/features/protobuf/ProtobufCreateDecodeTransformer.ts +13 -13
  429. package/src/transformers/features/protobuf/ProtobufCreateEncodeTransformer.ts +13 -13
  430. package/src/transformers/features/protobuf/ProtobufCreateIsDecodeTransformer.ts +13 -13
  431. package/src/transformers/features/protobuf/ProtobufCreateIsEncodeTransformer.ts +13 -13
  432. package/src/transformers/features/protobuf/ProtobufCreateValidateDecodeTransformer.ts +13 -13
  433. package/src/transformers/features/protobuf/ProtobufCreateValidateEncodeTransformer.ts +13 -13
  434. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +13 -13
  435. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +13 -13
  436. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +13 -13
  437. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +13 -13
  438. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +35 -35
  439. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +13 -13
  440. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +13 -13
  441. package/src/transformers/features/reflect/ReflectMetadataTransformer.ts +69 -69
  442. package/src/transformers/features/reflect/ReflectNameTransformer.ts +82 -82
  443. package/src/transformers/internal/GenericTransformer.ts +101 -101
  444. package/src/utils/MapUtil.ts +14 -14
  445. package/src/utils/NamingConvention.ts +94 -94
  446. package/src/utils/ProtobufNameEncoder.ts +32 -32
  447. package/src/utils/StringUtil.ts +16 -16
@@ -1,622 +1,622 @@
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 { Metadata } from "../schemas/metadata/Metadata";
10
- import { MetadataArray } from "../schemas/metadata/MetadataArray";
11
- import { MetadataObjectType } from "../schemas/metadata/MetadataObjectType";
12
-
13
- import { ITypiaContext } from "../transformers/ITypiaContext";
14
-
15
- import { CheckerProgrammer } from "./CheckerProgrammer";
16
- import { FunctionProgrammer } from "./helpers/FunctionProgrammer";
17
- import { IExpressionEntry } from "./helpers/IExpressionEntry";
18
- import { UnionExplorer } from "./helpers/UnionExplorer";
19
- import { feature_object_entries } from "./internal/feature_object_entries";
20
-
21
- export namespace FeatureProgrammer {
22
- /* -----------------------------------------------------------
23
- PARAMETERS
24
- ----------------------------------------------------------- */
25
- export interface IConfig<Output extends ts.ConciseBody = ts.ConciseBody> {
26
- types: IConfig.ITypes;
27
-
28
- /**
29
- * Prefix name of internal functions for specific types.
30
- */
31
- prefix: string;
32
-
33
- /**
34
- * Whether to archive access path or not.
35
- */
36
- path: boolean;
37
-
38
- /**
39
- * Whether to trace exception or not.
40
- */
41
- trace: boolean;
42
-
43
- addition?: undefined | ((collection: MetadataCollection) => ts.Statement[]);
44
-
45
- /**
46
- * Initializer of metadata.
47
- */
48
- initializer: (props: {
49
- context: ITypiaContext;
50
- functor: FunctionProgrammer;
51
- type: ts.Type;
52
- }) => {
53
- collection: MetadataCollection;
54
- metadata: Metadata;
55
- };
56
-
57
- /**
58
- * Decoder, station of every types.
59
- */
60
- decoder: (props: {
61
- metadata: Metadata;
62
- input: ts.Expression;
63
- explore: IExplore;
64
- }) => Output;
65
-
66
- /**
67
- * Object configurator.
68
- */
69
- objector: IConfig.IObjector<Output>;
70
-
71
- /**
72
- * Generator of functions for object types.
73
- */
74
- generator: IConfig.IGenerator;
75
- }
76
- export namespace IConfig {
77
- export interface ITypes {
78
- input: (type: ts.Type, name?: undefined | string) => ts.TypeNode;
79
- output: (type: ts.Type, name?: undefined | string) => ts.TypeNode;
80
- }
81
-
82
- export interface IObjector<Output extends ts.ConciseBody = ts.ConciseBody> {
83
- /**
84
- * Type checker when union object type comes.
85
- */
86
- checker: (props: {
87
- metadata: Metadata;
88
- input: ts.Expression;
89
- explore: IExplore;
90
- }) => ts.Expression;
91
-
92
- /**
93
- * Decoder, function call expression generator of specific typed objects.
94
- */
95
- decoder: (props: {
96
- input: ts.Expression;
97
- object: MetadataObjectType;
98
- explore: IExplore;
99
- }) => ts.Expression;
100
-
101
- /**
102
- * Joiner of expressions from properties.
103
- */
104
- joiner(props: {
105
- entries: IExpressionEntry<Output>[];
106
- input?: ts.Expression;
107
- object?: MetadataObjectType;
108
- }): ts.ConciseBody;
109
-
110
- /**
111
- * Union type specificator.
112
- *
113
- * Expression of an algorithm specifying object type and calling
114
- * the `decoder` function of the specified object type.
115
- */
116
- unionizer: (props: {
117
- objects: MetadataObjectType[];
118
- input: ts.Expression;
119
- explore: IExplore;
120
- }) => ts.Expression;
121
-
122
- /**
123
- * Handler of union type specification failure.
124
- *
125
- * @param props Properties of failure
126
- * @returns Statement of failure
127
- */
128
- failure(props: {
129
- input: ts.Expression;
130
- expected: string;
131
- explore?: undefined | IExplore;
132
- }): ts.Statement;
133
-
134
- /**
135
- * Transformer of type checking expression by discrimination.
136
- *
137
- * When an object type has been specified by a discrimination without full
138
- * iteration, the `unionizer` will decode the object instance after
139
- * the last type checking.
140
- *
141
- * In such circumtance, you can transform the last type checking function.
142
- *
143
- * @param exp Current expression about type checking
144
- * @returns Transformed expression
145
- * @deprecated
146
- */
147
- is?: undefined | ((exp: ts.Expression) => ts.Expression);
148
-
149
- /**
150
- * Transformer of non-undefined type checking by discrimination.
151
- *
152
- * When specifying an union type of objects, `typia` tries to find
153
- * descrimination way just by checking only one property type.
154
- * If succeeded to find the discrimination way, `typia` will check the target
155
- * property type and in the checking, non-undefined type checking would be
156
- * done.
157
- *
158
- * In such process, you can transform the non-undefined type checking.
159
- *
160
- * @param exp
161
- * @returns Transformed expression
162
- * @deprecated
163
- */
164
- required?: undefined | ((exp: ts.Expression) => ts.Expression);
165
-
166
- /**
167
- * Conditon wrapper when unable to specify any object type.
168
- *
169
- * When failed to specify an object type through discrimination, full
170
- * iteration type checking would be happend. In such circumstance, you
171
- * can wrap the condition with additional function.
172
- *
173
- * @param props Properties of condition
174
- * @returns The wrapper expression
175
- */
176
- full?:
177
- | undefined
178
- | ((props: {
179
- condition: ts.Expression;
180
- input: ts.Expression;
181
- expected: string;
182
- explore: IExplore;
183
- }) => ts.Expression);
184
-
185
- /**
186
- * Return type.
187
- */
188
- type?: undefined | ts.TypeNode;
189
- }
190
- export interface IGenerator {
191
- objects?:
192
- | undefined
193
- | ((collection: MetadataCollection) => ts.VariableStatement[]);
194
- unions?:
195
- | undefined
196
- | ((collection: MetadataCollection) => ts.VariableStatement[]);
197
- arrays: (collection: MetadataCollection) => ts.VariableStatement[];
198
- tuples: (collection: MetadataCollection) => ts.VariableStatement[];
199
- }
200
- }
201
-
202
- export interface IExplore {
203
- tracable: boolean;
204
- source: "top" | "function";
205
- from: "top" | "array" | "object";
206
- postfix: string;
207
- start?: undefined | number;
208
- }
209
-
210
- export type Decoder<
211
- T,
212
- Output extends ts.ConciseBody = ts.ConciseBody,
213
- > = (props: {
214
- input: ts.Expression;
215
- definition: T;
216
- explore: IExplore;
217
- }) => Output;
218
-
219
- /* -----------------------------------------------------------
220
- GENERATORS
221
- ----------------------------------------------------------- */
222
- export interface IComposed {
223
- body: ts.ConciseBody;
224
- parameters: ts.ParameterDeclaration[];
225
- functions: Record<string, ts.VariableStatement>;
226
- statements: ts.Statement[];
227
- response: ts.TypeNode;
228
- }
229
- export interface IDecomposed {
230
- functions: Record<string, ts.VariableStatement>;
231
- statements: ts.Statement[];
232
- arrow: ts.ArrowFunction;
233
- }
234
-
235
- export const compose = (props: {
236
- context: ITypiaContext;
237
- config: IConfig;
238
- functor: FunctionProgrammer;
239
- type: ts.Type;
240
- name: string | undefined;
241
- }): IComposed => {
242
- const { collection, metadata } = props.config.initializer(props);
243
- return {
244
- body: props.config.decoder({
245
- input: ValueFactory.INPUT(),
246
- metadata,
247
- explore: {
248
- tracable: props.config.path || props.config.trace,
249
- source: "top",
250
- from: "top",
251
- postfix: '""',
252
- },
253
- }),
254
- statements: props.config.addition
255
- ? props.config.addition(collection)
256
- : [],
257
- functions: {
258
- ...Object.fromEntries(
259
- (
260
- props.config.generator.objects?.(collection) ??
261
- write_object_functions({
262
- ...props,
263
- collection,
264
- })
265
- ).map((v, i) => [`${props.config.prefix}o${i}`, v]),
266
- ),
267
- ...Object.fromEntries(
268
- (
269
- props.config.generator.unions?.(collection) ??
270
- write_union_functions({
271
- config: props.config,
272
- collection,
273
- })
274
- ).map((v, i) => [`${props.config.prefix}u${i}`, v]),
275
- ),
276
- ...Object.fromEntries(
277
- props.config.generator
278
- .arrays(collection)
279
- .map((v, i) => [`${props.config.prefix}a${i}`, v]),
280
- ),
281
- ...Object.fromEntries(
282
- props.config.generator
283
- .tuples(collection)
284
- .map((v, i) => [`${props.config.prefix}t${i}`, v]),
285
- ),
286
- },
287
- parameters: parameterDeclarations({
288
- config: props.config,
289
- type: props.config.types.input(props.type, props.name),
290
- input: ValueFactory.INPUT(),
291
- }),
292
- response: props.config.types.output(props.type, props.name),
293
- };
294
- };
295
-
296
- export const writeDecomposed = (props: {
297
- modulo: ts.LeftHandSideExpression;
298
- functor: FunctionProgrammer;
299
- result: IDecomposed;
300
- }): ts.CallExpression =>
301
- ts.factory.createCallExpression(
302
- ts.factory.createArrowFunction(
303
- undefined,
304
- undefined,
305
- [],
306
- undefined,
307
- undefined,
308
- ts.factory.createBlock([
309
- ...props.functor.declare(),
310
- ...Object.entries(props.result.functions)
311
- .filter(([k]) => props.functor.hasLocal(k))
312
- .map(([_k, v]) => v),
313
- ...props.result.statements,
314
- ts.factory.createReturnStatement(props.result.arrow),
315
- ]),
316
- ),
317
- undefined,
318
- undefined,
319
- );
320
-
321
- export const write = (props: {
322
- context: ITypiaContext;
323
- config: IConfig;
324
- functor: FunctionProgrammer;
325
- type: ts.Type;
326
- name?: string | undefined;
327
- }): ts.ArrowFunction => {
328
- // ITERATE OVER ALL METADATA
329
- const { collection, metadata } = props.config.initializer(props);
330
- const output: ts.ConciseBody = props.config.decoder({
331
- metadata,
332
- input: ValueFactory.INPUT(),
333
- explore: {
334
- tracable: props.config.path || props.config.trace,
335
- source: "top",
336
- from: "top",
337
- postfix: '""',
338
- },
339
- });
340
-
341
- // RETURNS THE OPTIMAL ARROW FUNCTION
342
- const functions = {
343
- objects:
344
- props.config.generator.objects?.(collection) ??
345
- write_object_functions({
346
- config: props.config,
347
- context: props.context,
348
- collection,
349
- }),
350
- unions:
351
- props.config.generator.unions?.(collection) ??
352
- write_union_functions({
353
- config: props.config,
354
- collection,
355
- }),
356
- arrays: props.config.generator.arrays(collection),
357
- tuples: props.config.generator.tuples(collection),
358
- };
359
- const added: ts.Statement[] = (props.config.addition ?? (() => []))(
360
- collection,
361
- );
362
-
363
- return ts.factory.createArrowFunction(
364
- undefined,
365
- undefined,
366
- parameterDeclarations({
367
- config: props.config,
368
- type: props.config.types.input(props.type, props.name),
369
- input: ValueFactory.INPUT(),
370
- }),
371
- props.config.types.output(props.type, props.name),
372
- undefined,
373
- ts.factory.createBlock(
374
- [
375
- ...added,
376
- ...functions.objects.filter((_, i) =>
377
- props.functor.hasLocal(`${props.config.prefix}o${i}`),
378
- ),
379
- ...functions.unions.filter((_, i) =>
380
- props.functor.hasLocal(`${props.config.prefix}u${i}`),
381
- ),
382
- ...functions.arrays.filter((_, i) =>
383
- props.functor.hasLocal(`${props.config.prefix}a${i}`),
384
- ),
385
- ...functions.tuples.filter((_, i) =>
386
- props.functor.hasLocal(`${props.config.prefix}t${i}`),
387
- ),
388
- ...(ts.isBlock(output)
389
- ? output.statements
390
- : [ts.factory.createReturnStatement(output)]),
391
- ],
392
- true,
393
- ),
394
- );
395
- };
396
-
397
- export const write_object_functions = (props: {
398
- config: IConfig;
399
- context: ITypiaContext;
400
- collection: MetadataCollection;
401
- }) =>
402
- props.collection.objects().map((object) =>
403
- StatementFactory.constant({
404
- name: `${props.config.prefix}o${object.index}`,
405
- value: ts.factory.createArrowFunction(
406
- undefined,
407
- undefined,
408
- parameterDeclarations({
409
- config: props.config,
410
- type: TypeFactory.keyword("any"),
411
- input: ValueFactory.INPUT(),
412
- }),
413
- props.config.objector.type ?? TypeFactory.keyword("any"),
414
- undefined,
415
- props.config.objector.joiner({
416
- input: ts.factory.createIdentifier("input"),
417
- entries: feature_object_entries({
418
- config: props.config,
419
- context: props.context,
420
- input: ts.factory.createIdentifier("input"),
421
- object,
422
- }),
423
- object,
424
- }),
425
- ),
426
- }),
427
- );
428
-
429
- export const write_union_functions = (props: {
430
- config: IConfig;
431
- collection: MetadataCollection;
432
- }) =>
433
- props.collection.unions().map((union, i) =>
434
- StatementFactory.constant({
435
- name: `${props.config.prefix}u${i}`,
436
- value: write_union({
437
- config: props.config,
438
- objects: union,
439
- }),
440
- }),
441
- );
442
-
443
- const write_union = (props: {
444
- config: IConfig;
445
- objects: MetadataObjectType[];
446
- }) =>
447
- ts.factory.createArrowFunction(
448
- undefined,
449
- undefined,
450
- parameterDeclarations({
451
- config: props.config,
452
- type: TypeFactory.keyword("any"),
453
- input: ValueFactory.INPUT(),
454
- }),
455
- TypeFactory.keyword("any"),
456
- undefined,
457
- UnionExplorer.object({
458
- config: props.config,
459
- objects: props.objects,
460
- input: ValueFactory.INPUT(),
461
- explore: {
462
- tracable: props.config.path || props.config.trace,
463
- source: "function",
464
- from: "object",
465
- postfix: "",
466
- },
467
- }),
468
- );
469
-
470
- /* -----------------------------------------------------------
471
- DECODERS
472
- ----------------------------------------------------------- */
473
- export const decode_array = (props: {
474
- config: Pick<IConfig, "trace" | "path" | "decoder" | "prefix">;
475
- functor: FunctionProgrammer;
476
- combiner: (next: {
477
- input: ts.Expression;
478
- arrow: ts.ArrowFunction;
479
- }) => ts.Expression;
480
- array: MetadataArray;
481
- input: ts.Expression;
482
- explore: IExplore;
483
- }) => {
484
- const rand: string = props.functor.increment().toString();
485
- const tail =
486
- props.config.path || props.config.trace
487
- ? [
488
- IdentifierFactory.parameter(
489
- "_index" + rand,
490
- TypeFactory.keyword("number"),
491
- ),
492
- ]
493
- : [];
494
- const arrow: ts.ArrowFunction = ts.factory.createArrowFunction(
495
- undefined,
496
- undefined,
497
- [
498
- IdentifierFactory.parameter("elem", TypeFactory.keyword("any")),
499
- ...tail,
500
- ],
501
- undefined,
502
- undefined,
503
- props.config.decoder({
504
- input: ValueFactory.INPUT("elem"),
505
- metadata: props.array.type.value,
506
- explore: {
507
- tracable: props.explore.tracable,
508
- source: props.explore.source,
509
- from: "array",
510
- postfix: index({
511
- start: props.explore.start ?? null,
512
- postfix: props.explore.postfix,
513
- rand,
514
- }),
515
- },
516
- }),
517
- );
518
- return props.combiner({
519
- input: props.input,
520
- arrow,
521
- });
522
- };
523
-
524
- export const decode_object = (props: {
525
- config: Pick<IConfig, "trace" | "path" | "prefix">;
526
- functor: FunctionProgrammer;
527
- object: MetadataObjectType;
528
- input: ts.Expression;
529
- explore: IExplore;
530
- }) =>
531
- ts.factory.createCallExpression(
532
- ts.factory.createIdentifier(
533
- props.functor.useLocal(`${props.config.prefix}o${props.object.index}`),
534
- ),
535
- undefined,
536
- argumentsArray(props),
537
- );
538
-
539
- /* -----------------------------------------------------------
540
- UTILITIES FOR INTERNAL FUNCTIONS
541
- ----------------------------------------------------------- */
542
- export const index = (props: {
543
- start: number | null;
544
- postfix: string;
545
- rand: string;
546
- }) => {
547
- const tail: string =
548
- props.start !== null
549
- ? `"[" + (${props.start} + _index${props.rand}) + "]"`
550
- : `"[" + _index${props.rand} + "]"`;
551
- if (props.postfix === "") return tail;
552
- else if (props.postfix[props.postfix.length - 1] === `"`)
553
- return (
554
- props.postfix.substring(0, props.postfix.length - 1) + tail.substring(1)
555
- );
556
- return props.postfix + ` + ${tail}`;
557
- };
558
-
559
- export const argumentsArray = (props: {
560
- config: Pick<IConfig, "path" | "trace">;
561
- input: ts.Expression;
562
- explore: FeatureProgrammer.IExplore;
563
- }) => {
564
- const tail: ts.Expression[] =
565
- props.config.path === false && props.config.trace === false
566
- ? []
567
- : props.config.path === true && props.config.trace === true
568
- ? [
569
- ts.factory.createIdentifier(
570
- props.explore.postfix
571
- ? `_path + ${props.explore.postfix}`
572
- : "_path",
573
- ),
574
- props.explore.source === "function"
575
- ? ts.factory.createIdentifier(
576
- `${props.explore.tracable} && _exceptionable`,
577
- )
578
- : props.explore.tracable
579
- ? ts.factory.createTrue()
580
- : ts.factory.createFalse(),
581
- ]
582
- : props.config.path === true
583
- ? [
584
- ts.factory.createIdentifier(
585
- props.explore.postfix
586
- ? `_path + ${props.explore.postfix}`
587
- : "_path",
588
- ),
589
- ]
590
- : [
591
- props.explore.source === "function"
592
- ? ts.factory.createIdentifier(
593
- `${props.explore.tracable} && _exceptionable`,
594
- )
595
- : props.explore.tracable
596
- ? ts.factory.createTrue()
597
- : ts.factory.createFalse(),
598
- ];
599
- return [props.input, ...tail];
600
- };
601
-
602
- export const parameterDeclarations = (props: {
603
- config: Pick<CheckerProgrammer.IConfig, "path" | "trace">;
604
- type: ts.TypeNode;
605
- input: ts.Identifier;
606
- }) => {
607
- const tail: ts.ParameterDeclaration[] = [];
608
- if (props.config.path)
609
- tail.push(
610
- IdentifierFactory.parameter("_path", TypeFactory.keyword("string")),
611
- );
612
- if (props.config.trace)
613
- tail.push(
614
- IdentifierFactory.parameter(
615
- "_exceptionable",
616
- TypeFactory.keyword("boolean"),
617
- ts.factory.createTrue(),
618
- ),
619
- );
620
- return [IdentifierFactory.parameter(props.input, props.type), ...tail];
621
- };
622
- }
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 { Metadata } from "../schemas/metadata/Metadata";
10
+ import { MetadataArray } from "../schemas/metadata/MetadataArray";
11
+ import { MetadataObjectType } from "../schemas/metadata/MetadataObjectType";
12
+
13
+ import { ITypiaContext } from "../transformers/ITypiaContext";
14
+
15
+ import { CheckerProgrammer } from "./CheckerProgrammer";
16
+ import { FunctionProgrammer } from "./helpers/FunctionProgrammer";
17
+ import { IExpressionEntry } from "./helpers/IExpressionEntry";
18
+ import { UnionExplorer } from "./helpers/UnionExplorer";
19
+ import { feature_object_entries } from "./internal/feature_object_entries";
20
+
21
+ export namespace FeatureProgrammer {
22
+ /* -----------------------------------------------------------
23
+ PARAMETERS
24
+ ----------------------------------------------------------- */
25
+ export interface IConfig<Output extends ts.ConciseBody = ts.ConciseBody> {
26
+ types: IConfig.ITypes;
27
+
28
+ /**
29
+ * Prefix name of internal functions for specific types.
30
+ */
31
+ prefix: string;
32
+
33
+ /**
34
+ * Whether to archive access path or not.
35
+ */
36
+ path: boolean;
37
+
38
+ /**
39
+ * Whether to trace exception or not.
40
+ */
41
+ trace: boolean;
42
+
43
+ addition?: undefined | ((collection: MetadataCollection) => ts.Statement[]);
44
+
45
+ /**
46
+ * Initializer of metadata.
47
+ */
48
+ initializer: (props: {
49
+ context: ITypiaContext;
50
+ functor: FunctionProgrammer;
51
+ type: ts.Type;
52
+ }) => {
53
+ collection: MetadataCollection;
54
+ metadata: Metadata;
55
+ };
56
+
57
+ /**
58
+ * Decoder, station of every types.
59
+ */
60
+ decoder: (props: {
61
+ metadata: Metadata;
62
+ input: ts.Expression;
63
+ explore: IExplore;
64
+ }) => Output;
65
+
66
+ /**
67
+ * Object configurator.
68
+ */
69
+ objector: IConfig.IObjector<Output>;
70
+
71
+ /**
72
+ * Generator of functions for object types.
73
+ */
74
+ generator: IConfig.IGenerator;
75
+ }
76
+ export namespace IConfig {
77
+ export interface ITypes {
78
+ input: (type: ts.Type, name?: undefined | string) => ts.TypeNode;
79
+ output: (type: ts.Type, name?: undefined | string) => ts.TypeNode;
80
+ }
81
+
82
+ export interface IObjector<Output extends ts.ConciseBody = ts.ConciseBody> {
83
+ /**
84
+ * Type checker when union object type comes.
85
+ */
86
+ checker: (props: {
87
+ metadata: Metadata;
88
+ input: ts.Expression;
89
+ explore: IExplore;
90
+ }) => ts.Expression;
91
+
92
+ /**
93
+ * Decoder, function call expression generator of specific typed objects.
94
+ */
95
+ decoder: (props: {
96
+ input: ts.Expression;
97
+ object: MetadataObjectType;
98
+ explore: IExplore;
99
+ }) => ts.Expression;
100
+
101
+ /**
102
+ * Joiner of expressions from properties.
103
+ */
104
+ joiner(props: {
105
+ entries: IExpressionEntry<Output>[];
106
+ input?: ts.Expression;
107
+ object?: MetadataObjectType;
108
+ }): ts.ConciseBody;
109
+
110
+ /**
111
+ * Union type specificator.
112
+ *
113
+ * Expression of an algorithm specifying object type and calling
114
+ * the `decoder` function of the specified object type.
115
+ */
116
+ unionizer: (props: {
117
+ objects: MetadataObjectType[];
118
+ input: ts.Expression;
119
+ explore: IExplore;
120
+ }) => ts.Expression;
121
+
122
+ /**
123
+ * Handler of union type specification failure.
124
+ *
125
+ * @param props Properties of failure
126
+ * @returns Statement of failure
127
+ */
128
+ failure(props: {
129
+ input: ts.Expression;
130
+ expected: string;
131
+ explore?: undefined | IExplore;
132
+ }): ts.Statement;
133
+
134
+ /**
135
+ * Transformer of type checking expression by discrimination.
136
+ *
137
+ * When an object type has been specified by a discrimination without full
138
+ * iteration, the `unionizer` will decode the object instance after
139
+ * the last type checking.
140
+ *
141
+ * In such circumtance, you can transform the last type checking function.
142
+ *
143
+ * @param exp Current expression about type checking
144
+ * @returns Transformed expression
145
+ * @deprecated
146
+ */
147
+ is?: undefined | ((exp: ts.Expression) => ts.Expression);
148
+
149
+ /**
150
+ * Transformer of non-undefined type checking by discrimination.
151
+ *
152
+ * When specifying an union type of objects, `typia` tries to find
153
+ * descrimination way just by checking only one property type.
154
+ * If succeeded to find the discrimination way, `typia` will check the target
155
+ * property type and in the checking, non-undefined type checking would be
156
+ * done.
157
+ *
158
+ * In such process, you can transform the non-undefined type checking.
159
+ *
160
+ * @param exp
161
+ * @returns Transformed expression
162
+ * @deprecated
163
+ */
164
+ required?: undefined | ((exp: ts.Expression) => ts.Expression);
165
+
166
+ /**
167
+ * Conditon wrapper when unable to specify any object type.
168
+ *
169
+ * When failed to specify an object type through discrimination, full
170
+ * iteration type checking would be happend. In such circumstance, you
171
+ * can wrap the condition with additional function.
172
+ *
173
+ * @param props Properties of condition
174
+ * @returns The wrapper expression
175
+ */
176
+ full?:
177
+ | undefined
178
+ | ((props: {
179
+ condition: ts.Expression;
180
+ input: ts.Expression;
181
+ expected: string;
182
+ explore: IExplore;
183
+ }) => ts.Expression);
184
+
185
+ /**
186
+ * Return type.
187
+ */
188
+ type?: undefined | ts.TypeNode;
189
+ }
190
+ export interface IGenerator {
191
+ objects?:
192
+ | undefined
193
+ | ((collection: MetadataCollection) => ts.VariableStatement[]);
194
+ unions?:
195
+ | undefined
196
+ | ((collection: MetadataCollection) => ts.VariableStatement[]);
197
+ arrays: (collection: MetadataCollection) => ts.VariableStatement[];
198
+ tuples: (collection: MetadataCollection) => ts.VariableStatement[];
199
+ }
200
+ }
201
+
202
+ export interface IExplore {
203
+ tracable: boolean;
204
+ source: "top" | "function";
205
+ from: "top" | "array" | "object";
206
+ postfix: string;
207
+ start?: undefined | number;
208
+ }
209
+
210
+ export type Decoder<
211
+ T,
212
+ Output extends ts.ConciseBody = ts.ConciseBody,
213
+ > = (props: {
214
+ input: ts.Expression;
215
+ definition: T;
216
+ explore: IExplore;
217
+ }) => Output;
218
+
219
+ /* -----------------------------------------------------------
220
+ GENERATORS
221
+ ----------------------------------------------------------- */
222
+ export interface IComposed {
223
+ body: ts.ConciseBody;
224
+ parameters: ts.ParameterDeclaration[];
225
+ functions: Record<string, ts.VariableStatement>;
226
+ statements: ts.Statement[];
227
+ response: ts.TypeNode;
228
+ }
229
+ export interface IDecomposed {
230
+ functions: Record<string, ts.VariableStatement>;
231
+ statements: ts.Statement[];
232
+ arrow: ts.ArrowFunction;
233
+ }
234
+
235
+ export const compose = (props: {
236
+ context: ITypiaContext;
237
+ config: IConfig;
238
+ functor: FunctionProgrammer;
239
+ type: ts.Type;
240
+ name: string | undefined;
241
+ }): IComposed => {
242
+ const { collection, metadata } = props.config.initializer(props);
243
+ return {
244
+ body: props.config.decoder({
245
+ input: ValueFactory.INPUT(),
246
+ metadata,
247
+ explore: {
248
+ tracable: props.config.path || props.config.trace,
249
+ source: "top",
250
+ from: "top",
251
+ postfix: '""',
252
+ },
253
+ }),
254
+ statements: props.config.addition
255
+ ? props.config.addition(collection)
256
+ : [],
257
+ functions: {
258
+ ...Object.fromEntries(
259
+ (
260
+ props.config.generator.objects?.(collection) ??
261
+ write_object_functions({
262
+ ...props,
263
+ collection,
264
+ })
265
+ ).map((v, i) => [`${props.config.prefix}o${i}`, v]),
266
+ ),
267
+ ...Object.fromEntries(
268
+ (
269
+ props.config.generator.unions?.(collection) ??
270
+ write_union_functions({
271
+ config: props.config,
272
+ collection,
273
+ })
274
+ ).map((v, i) => [`${props.config.prefix}u${i}`, v]),
275
+ ),
276
+ ...Object.fromEntries(
277
+ props.config.generator
278
+ .arrays(collection)
279
+ .map((v, i) => [`${props.config.prefix}a${i}`, v]),
280
+ ),
281
+ ...Object.fromEntries(
282
+ props.config.generator
283
+ .tuples(collection)
284
+ .map((v, i) => [`${props.config.prefix}t${i}`, v]),
285
+ ),
286
+ },
287
+ parameters: parameterDeclarations({
288
+ config: props.config,
289
+ type: props.config.types.input(props.type, props.name),
290
+ input: ValueFactory.INPUT(),
291
+ }),
292
+ response: props.config.types.output(props.type, props.name),
293
+ };
294
+ };
295
+
296
+ export const writeDecomposed = (props: {
297
+ modulo: ts.LeftHandSideExpression;
298
+ functor: FunctionProgrammer;
299
+ result: IDecomposed;
300
+ }): ts.CallExpression =>
301
+ ts.factory.createCallExpression(
302
+ ts.factory.createArrowFunction(
303
+ undefined,
304
+ undefined,
305
+ [],
306
+ undefined,
307
+ undefined,
308
+ ts.factory.createBlock([
309
+ ...props.functor.declare(),
310
+ ...Object.entries(props.result.functions)
311
+ .filter(([k]) => props.functor.hasLocal(k))
312
+ .map(([_k, v]) => v),
313
+ ...props.result.statements,
314
+ ts.factory.createReturnStatement(props.result.arrow),
315
+ ]),
316
+ ),
317
+ undefined,
318
+ undefined,
319
+ );
320
+
321
+ export const write = (props: {
322
+ context: ITypiaContext;
323
+ config: IConfig;
324
+ functor: FunctionProgrammer;
325
+ type: ts.Type;
326
+ name?: string | undefined;
327
+ }): ts.ArrowFunction => {
328
+ // ITERATE OVER ALL METADATA
329
+ const { collection, metadata } = props.config.initializer(props);
330
+ const output: ts.ConciseBody = props.config.decoder({
331
+ metadata,
332
+ input: ValueFactory.INPUT(),
333
+ explore: {
334
+ tracable: props.config.path || props.config.trace,
335
+ source: "top",
336
+ from: "top",
337
+ postfix: '""',
338
+ },
339
+ });
340
+
341
+ // RETURNS THE OPTIMAL ARROW FUNCTION
342
+ const functions = {
343
+ objects:
344
+ props.config.generator.objects?.(collection) ??
345
+ write_object_functions({
346
+ config: props.config,
347
+ context: props.context,
348
+ collection,
349
+ }),
350
+ unions:
351
+ props.config.generator.unions?.(collection) ??
352
+ write_union_functions({
353
+ config: props.config,
354
+ collection,
355
+ }),
356
+ arrays: props.config.generator.arrays(collection),
357
+ tuples: props.config.generator.tuples(collection),
358
+ };
359
+ const added: ts.Statement[] = (props.config.addition ?? (() => []))(
360
+ collection,
361
+ );
362
+
363
+ return ts.factory.createArrowFunction(
364
+ undefined,
365
+ undefined,
366
+ parameterDeclarations({
367
+ config: props.config,
368
+ type: props.config.types.input(props.type, props.name),
369
+ input: ValueFactory.INPUT(),
370
+ }),
371
+ props.config.types.output(props.type, props.name),
372
+ undefined,
373
+ ts.factory.createBlock(
374
+ [
375
+ ...added,
376
+ ...functions.objects.filter((_, i) =>
377
+ props.functor.hasLocal(`${props.config.prefix}o${i}`),
378
+ ),
379
+ ...functions.unions.filter((_, i) =>
380
+ props.functor.hasLocal(`${props.config.prefix}u${i}`),
381
+ ),
382
+ ...functions.arrays.filter((_, i) =>
383
+ props.functor.hasLocal(`${props.config.prefix}a${i}`),
384
+ ),
385
+ ...functions.tuples.filter((_, i) =>
386
+ props.functor.hasLocal(`${props.config.prefix}t${i}`),
387
+ ),
388
+ ...(ts.isBlock(output)
389
+ ? output.statements
390
+ : [ts.factory.createReturnStatement(output)]),
391
+ ],
392
+ true,
393
+ ),
394
+ );
395
+ };
396
+
397
+ export const write_object_functions = (props: {
398
+ config: IConfig;
399
+ context: ITypiaContext;
400
+ collection: MetadataCollection;
401
+ }) =>
402
+ props.collection.objects().map((object) =>
403
+ StatementFactory.constant({
404
+ name: `${props.config.prefix}o${object.index}`,
405
+ value: ts.factory.createArrowFunction(
406
+ undefined,
407
+ undefined,
408
+ parameterDeclarations({
409
+ config: props.config,
410
+ type: TypeFactory.keyword("any"),
411
+ input: ValueFactory.INPUT(),
412
+ }),
413
+ props.config.objector.type ?? TypeFactory.keyword("any"),
414
+ undefined,
415
+ props.config.objector.joiner({
416
+ input: ts.factory.createIdentifier("input"),
417
+ entries: feature_object_entries({
418
+ config: props.config,
419
+ context: props.context,
420
+ input: ts.factory.createIdentifier("input"),
421
+ object,
422
+ }),
423
+ object,
424
+ }),
425
+ ),
426
+ }),
427
+ );
428
+
429
+ export const write_union_functions = (props: {
430
+ config: IConfig;
431
+ collection: MetadataCollection;
432
+ }) =>
433
+ props.collection.unions().map((union, i) =>
434
+ StatementFactory.constant({
435
+ name: `${props.config.prefix}u${i}`,
436
+ value: write_union({
437
+ config: props.config,
438
+ objects: union,
439
+ }),
440
+ }),
441
+ );
442
+
443
+ const write_union = (props: {
444
+ config: IConfig;
445
+ objects: MetadataObjectType[];
446
+ }) =>
447
+ ts.factory.createArrowFunction(
448
+ undefined,
449
+ undefined,
450
+ parameterDeclarations({
451
+ config: props.config,
452
+ type: TypeFactory.keyword("any"),
453
+ input: ValueFactory.INPUT(),
454
+ }),
455
+ TypeFactory.keyword("any"),
456
+ undefined,
457
+ UnionExplorer.object({
458
+ config: props.config,
459
+ objects: props.objects,
460
+ input: ValueFactory.INPUT(),
461
+ explore: {
462
+ tracable: props.config.path || props.config.trace,
463
+ source: "function",
464
+ from: "object",
465
+ postfix: "",
466
+ },
467
+ }),
468
+ );
469
+
470
+ /* -----------------------------------------------------------
471
+ DECODERS
472
+ ----------------------------------------------------------- */
473
+ export const decode_array = (props: {
474
+ config: Pick<IConfig, "trace" | "path" | "decoder" | "prefix">;
475
+ functor: FunctionProgrammer;
476
+ combiner: (next: {
477
+ input: ts.Expression;
478
+ arrow: ts.ArrowFunction;
479
+ }) => ts.Expression;
480
+ array: MetadataArray;
481
+ input: ts.Expression;
482
+ explore: IExplore;
483
+ }) => {
484
+ const rand: string = props.functor.increment().toString();
485
+ const tail =
486
+ props.config.path || props.config.trace
487
+ ? [
488
+ IdentifierFactory.parameter(
489
+ "_index" + rand,
490
+ TypeFactory.keyword("number"),
491
+ ),
492
+ ]
493
+ : [];
494
+ const arrow: ts.ArrowFunction = ts.factory.createArrowFunction(
495
+ undefined,
496
+ undefined,
497
+ [
498
+ IdentifierFactory.parameter("elem", TypeFactory.keyword("any")),
499
+ ...tail,
500
+ ],
501
+ undefined,
502
+ undefined,
503
+ props.config.decoder({
504
+ input: ValueFactory.INPUT("elem"),
505
+ metadata: props.array.type.value,
506
+ explore: {
507
+ tracable: props.explore.tracable,
508
+ source: props.explore.source,
509
+ from: "array",
510
+ postfix: index({
511
+ start: props.explore.start ?? null,
512
+ postfix: props.explore.postfix,
513
+ rand,
514
+ }),
515
+ },
516
+ }),
517
+ );
518
+ return props.combiner({
519
+ input: props.input,
520
+ arrow,
521
+ });
522
+ };
523
+
524
+ export const decode_object = (props: {
525
+ config: Pick<IConfig, "trace" | "path" | "prefix">;
526
+ functor: FunctionProgrammer;
527
+ object: MetadataObjectType;
528
+ input: ts.Expression;
529
+ explore: IExplore;
530
+ }) =>
531
+ ts.factory.createCallExpression(
532
+ ts.factory.createIdentifier(
533
+ props.functor.useLocal(`${props.config.prefix}o${props.object.index}`),
534
+ ),
535
+ undefined,
536
+ argumentsArray(props),
537
+ );
538
+
539
+ /* -----------------------------------------------------------
540
+ UTILITIES FOR INTERNAL FUNCTIONS
541
+ ----------------------------------------------------------- */
542
+ export const index = (props: {
543
+ start: number | null;
544
+ postfix: string;
545
+ rand: string;
546
+ }) => {
547
+ const tail: string =
548
+ props.start !== null
549
+ ? `"[" + (${props.start} + _index${props.rand}) + "]"`
550
+ : `"[" + _index${props.rand} + "]"`;
551
+ if (props.postfix === "") return tail;
552
+ else if (props.postfix[props.postfix.length - 1] === `"`)
553
+ return (
554
+ props.postfix.substring(0, props.postfix.length - 1) + tail.substring(1)
555
+ );
556
+ return props.postfix + ` + ${tail}`;
557
+ };
558
+
559
+ export const argumentsArray = (props: {
560
+ config: Pick<IConfig, "path" | "trace">;
561
+ input: ts.Expression;
562
+ explore: FeatureProgrammer.IExplore;
563
+ }) => {
564
+ const tail: ts.Expression[] =
565
+ props.config.path === false && props.config.trace === false
566
+ ? []
567
+ : props.config.path === true && props.config.trace === true
568
+ ? [
569
+ ts.factory.createIdentifier(
570
+ props.explore.postfix
571
+ ? `_path + ${props.explore.postfix}`
572
+ : "_path",
573
+ ),
574
+ props.explore.source === "function"
575
+ ? ts.factory.createIdentifier(
576
+ `${props.explore.tracable} && _exceptionable`,
577
+ )
578
+ : props.explore.tracable
579
+ ? ts.factory.createTrue()
580
+ : ts.factory.createFalse(),
581
+ ]
582
+ : props.config.path === true
583
+ ? [
584
+ ts.factory.createIdentifier(
585
+ props.explore.postfix
586
+ ? `_path + ${props.explore.postfix}`
587
+ : "_path",
588
+ ),
589
+ ]
590
+ : [
591
+ props.explore.source === "function"
592
+ ? ts.factory.createIdentifier(
593
+ `${props.explore.tracable} && _exceptionable`,
594
+ )
595
+ : props.explore.tracable
596
+ ? ts.factory.createTrue()
597
+ : ts.factory.createFalse(),
598
+ ];
599
+ return [props.input, ...tail];
600
+ };
601
+
602
+ export const parameterDeclarations = (props: {
603
+ config: Pick<CheckerProgrammer.IConfig, "path" | "trace">;
604
+ type: ts.TypeNode;
605
+ input: ts.Identifier;
606
+ }) => {
607
+ const tail: ts.ParameterDeclaration[] = [];
608
+ if (props.config.path)
609
+ tail.push(
610
+ IdentifierFactory.parameter("_path", TypeFactory.keyword("string")),
611
+ );
612
+ if (props.config.trace)
613
+ tail.push(
614
+ IdentifierFactory.parameter(
615
+ "_exceptionable",
616
+ TypeFactory.keyword("boolean"),
617
+ ts.factory.createTrue(),
618
+ ),
619
+ );
620
+ return [IdentifierFactory.parameter(props.input, props.type), ...tail];
621
+ };
622
+ }