typia 7.5.1 → 7.6.0-dev.20241229

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 (446) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +149 -148
  3. package/lib/executable/typia.js +0 -0
  4. package/lib/tags/Type.d.ts +1 -0
  5. package/package.json +3 -4
  6. package/src/IRandomGenerator.ts +49 -49
  7. package/src/IReadableURLSearchParams.ts +9 -9
  8. package/src/IValidation.ts +21 -21
  9. package/src/executable/TypiaGenerateWizard.ts +83 -83
  10. package/src/executable/TypiaPatchWizard.ts +45 -45
  11. package/src/executable/TypiaSetupWizard.ts +179 -179
  12. package/src/executable/setup/ArgumentParser.ts +42 -42
  13. package/src/executable/setup/FileRetriever.ts +19 -19
  14. package/src/executable/setup/PackageManager.ts +87 -87
  15. package/src/factories/ExpressionFactory.ts +216 -216
  16. package/src/factories/IdentifierFactory.ts +89 -89
  17. package/src/factories/JsonMetadataFactory.ts +83 -83
  18. package/src/factories/LiteralFactory.ts +52 -52
  19. package/src/factories/MetadataCollection.ts +278 -278
  20. package/src/factories/MetadataCommentTagFactory.ts +650 -650
  21. package/src/factories/MetadataFactory.ts +404 -404
  22. package/src/factories/MetadataTypeTagFactory.ts +411 -411
  23. package/src/factories/MetadataTypeTagSchemaFactory.ts +82 -82
  24. package/src/factories/NumericRangeFactory.ts +72 -72
  25. package/src/factories/ProtobufFactory.ts +875 -875
  26. package/src/factories/StatementFactory.ts +90 -90
  27. package/src/factories/TemplateFactory.ts +64 -64
  28. package/src/factories/TypeFactory.ts +140 -140
  29. package/src/factories/internal/metadata/IMetadataIteratorProps.ts +17 -17
  30. package/src/factories/internal/metadata/MetadataHelper.ts +21 -21
  31. package/src/factories/internal/metadata/emplace_metadata_alias.ts +33 -33
  32. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +39 -39
  33. package/src/factories/internal/metadata/emplace_metadata_object.ts +208 -208
  34. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +57 -57
  35. package/src/factories/internal/metadata/explore_metadata.ts +31 -31
  36. package/src/factories/internal/metadata/iterate_metadata.ts +54 -54
  37. package/src/factories/internal/metadata/iterate_metadata_alias.ts +33 -33
  38. package/src/factories/internal/metadata/iterate_metadata_array.ts +63 -63
  39. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +62 -62
  40. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +28 -28
  41. package/src/factories/internal/metadata/iterate_metadata_collection.ts +146 -146
  42. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +32 -32
  43. package/src/factories/internal/metadata/iterate_metadata_constant.ts +76 -76
  44. package/src/factories/internal/metadata/iterate_metadata_escape.ts +49 -49
  45. package/src/factories/internal/metadata/iterate_metadata_function.ts +91 -91
  46. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +213 -213
  47. package/src/factories/internal/metadata/iterate_metadata_map.ts +57 -57
  48. package/src/factories/internal/metadata/iterate_metadata_native.ts +255 -255
  49. package/src/factories/internal/metadata/iterate_metadata_object.ts +35 -35
  50. package/src/factories/internal/metadata/iterate_metadata_set.ts +57 -57
  51. package/src/factories/internal/metadata/iterate_metadata_sort.ts +87 -87
  52. package/src/factories/internal/metadata/iterate_metadata_template.ts +41 -41
  53. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +26 -26
  54. package/src/factories/internal/metadata/iterate_metadata_union.ts +19 -19
  55. package/src/functional.ts +750 -750
  56. package/src/http.ts +1047 -1047
  57. package/src/internal/_IProtobufWriter.ts +18 -18
  58. package/src/internal/_ProtobufReader.ts +194 -194
  59. package/src/internal/_ProtobufSizer.ts +145 -145
  60. package/src/internal/_ProtobufWriter.ts +145 -145
  61. package/src/internal/_accessExpressionAsString.ts +46 -46
  62. package/src/internal/_assertGuard.ts +13 -13
  63. package/src/internal/_functionalTypeGuardErrorFactory.ts +4 -4
  64. package/src/internal/_httpFormDataReadArray.ts +4 -4
  65. package/src/internal/_httpFormDataReadBigint.ts +18 -18
  66. package/src/internal/_httpFormDataReadBlob.ts +10 -10
  67. package/src/internal/_httpFormDataReadBoolean.ts +16 -16
  68. package/src/internal/_httpFormDataReadFile.ts +10 -10
  69. package/src/internal/_httpFormDataReadNumber.ts +15 -15
  70. package/src/internal/_httpFormDataReadString.ts +10 -10
  71. package/src/internal/_httpHeaderReadBigint.ts +10 -10
  72. package/src/internal/_httpHeaderReadBoolean.ts +8 -8
  73. package/src/internal/_httpHeaderReadNumber.ts +7 -7
  74. package/src/internal/_httpParameterReadBigint.ts +10 -10
  75. package/src/internal/_httpParameterReadBoolean.ts +8 -8
  76. package/src/internal/_httpParameterReadNumber.ts +7 -7
  77. package/src/internal/_httpParameterReadString.ts +2 -2
  78. package/src/internal/_httpQueryParseURLSearchParams.ts +12 -12
  79. package/src/internal/_httpQueryReadArray.ts +4 -4
  80. package/src/internal/_httpQueryReadBigint.ts +12 -12
  81. package/src/internal/_httpQueryReadBoolean.ts +14 -14
  82. package/src/internal/_httpQueryReadNumber.ts +9 -9
  83. package/src/internal/_httpQueryReadString.ts +4 -4
  84. package/src/internal/_isBetween.ts +2 -2
  85. package/src/internal/_isBigintString.ts +8 -8
  86. package/src/internal/_isFormatByte.ts +7 -7
  87. package/src/internal/_isFormatDate.ts +3 -3
  88. package/src/internal/_isFormatDateTime.ts +4 -4
  89. package/src/internal/_isFormatDuration.ts +4 -4
  90. package/src/internal/_isFormatEmail.ts +4 -4
  91. package/src/internal/_isFormatHostname.ts +4 -4
  92. package/src/internal/_isFormatIdnEmail.ts +4 -4
  93. package/src/internal/_isFormatIdnHostname.ts +4 -4
  94. package/src/internal/_isFormatIpv4.ts +4 -4
  95. package/src/internal/_isFormatIpv6.ts +4 -4
  96. package/src/internal/_isFormatIri.ts +3 -3
  97. package/src/internal/_isFormatIriReference.ts +4 -4
  98. package/src/internal/_isFormatJsonPointer.ts +3 -3
  99. package/src/internal/_isFormatPassword.ts +1 -1
  100. package/src/internal/_isFormatRegex.ts +8 -8
  101. package/src/internal/_isFormatRelativeJsonPointer.ts +4 -4
  102. package/src/internal/_isFormatTime.ts +4 -4
  103. package/src/internal/_isFormatUri.ts +6 -6
  104. package/src/internal/_isFormatUriReference.ts +5 -5
  105. package/src/internal/_isFormatUriTemplate.ts +4 -4
  106. package/src/internal/_isFormatUrl.ts +4 -4
  107. package/src/internal/_isFormatUuid.ts +3 -3
  108. package/src/internal/_isTypeFloat.ts +5 -5
  109. package/src/internal/_isTypeInt32.ts +5 -5
  110. package/src/internal/_isTypeInt64.ts +5 -5
  111. package/src/internal/_isTypeUint32.ts +5 -5
  112. package/src/internal/_isTypeUint64.ts +5 -5
  113. package/src/internal/_isUniqueItems.ts +159 -159
  114. package/src/internal/_jsonStringifyNumber.ts +12 -12
  115. package/src/internal/_jsonStringifyRest.ts +3 -3
  116. package/src/internal/_jsonStringifyString.ts +42 -42
  117. package/src/internal/_jsonStringifyTail.ts +2 -2
  118. package/src/internal/_llmApplicationFinalize.ts +20 -20
  119. package/src/internal/_miscCloneAny.ts +46 -46
  120. package/src/internal/_notationAny.ts +37 -37
  121. package/src/internal/_notationCamel.ts +13 -13
  122. package/src/internal/_notationPascal.ts +8 -8
  123. package/src/internal/_notationSnake.ts +43 -43
  124. package/src/internal/_randomArray.ts +21 -21
  125. package/src/internal/_randomBigint.ts +6 -6
  126. package/src/internal/_randomBoolean.ts +1 -1
  127. package/src/internal/_randomFormatByte.ts +3 -3
  128. package/src/internal/_randomFormatDate.ts +18 -18
  129. package/src/internal/_randomFormatDatetime.ts +16 -16
  130. package/src/internal/_randomFormatDuration.ts +27 -27
  131. package/src/internal/_randomFormatEmail.ts +11 -11
  132. package/src/internal/_randomFormatHostname.ts +6 -6
  133. package/src/internal/_randomFormatIdnEmail.ts +3 -3
  134. package/src/internal/_randomFormatIdnHostname.ts +3 -3
  135. package/src/internal/_randomFormatIpv4.ts +11 -11
  136. package/src/internal/_randomFormatIpv6.ts +11 -11
  137. package/src/internal/_randomFormatIri.ts +3 -3
  138. package/src/internal/_randomFormatIriReference.ts +3 -3
  139. package/src/internal/_randomFormatJsonPointer.ts +7 -7
  140. package/src/internal/_randomFormatPassword.ts +8 -8
  141. package/src/internal/_randomFormatRegex.ts +4 -4
  142. package/src/internal/_randomFormatRelativeJsonPointer.ts +8 -8
  143. package/src/internal/_randomFormatTime.ts +14 -14
  144. package/src/internal/_randomFormatUri.ts +3 -3
  145. package/src/internal/_randomFormatUriReference.ts +3 -3
  146. package/src/internal/_randomFormatUriTemplate.ts +3 -3
  147. package/src/internal/_randomFormatUrl.ts +11 -11
  148. package/src/internal/_randomFormatUuid.ts +6 -6
  149. package/src/internal/_randomInteger.ts +47 -47
  150. package/src/internal/_randomNumber.ts +74 -74
  151. package/src/internal/_randomPattern.ts +10 -10
  152. package/src/internal/_randomPick.ts +9 -9
  153. package/src/internal/_randomString.ts +24 -24
  154. package/src/internal/_throwTypeGuardError.ts +5 -5
  155. package/src/internal/_validateReport.ts +13 -13
  156. package/src/internal/private/__notationCapitalize.ts +2 -2
  157. package/src/internal/private/__notationUnsnake.ts +24 -24
  158. package/src/json.ts +752 -752
  159. package/src/llm.ts +481 -481
  160. package/src/misc.ts +658 -658
  161. package/src/module.ts +937 -937
  162. package/src/notations.ts +827 -827
  163. package/src/programmers/AssertProgrammer.ts +454 -454
  164. package/src/programmers/CheckerProgrammer.ts +1617 -1617
  165. package/src/programmers/FeatureProgrammer.ts +622 -622
  166. package/src/programmers/ImportProgrammer.ts +185 -185
  167. package/src/programmers/IsProgrammer.ts +273 -273
  168. package/src/programmers/RandomProgrammer.ts +1190 -1190
  169. package/src/programmers/TypiaProgrammer.ts +174 -174
  170. package/src/programmers/ValidateProgrammer.ts +439 -439
  171. package/src/programmers/functional/FunctionalAssertFunctionProgrammer.ts +153 -153
  172. package/src/programmers/functional/FunctionalAssertParametersProgrammer.ts +125 -125
  173. package/src/programmers/functional/FunctionalAssertReturnProgrammer.ts +115 -115
  174. package/src/programmers/functional/FunctionalIsFunctionProgrammer.ts +72 -72
  175. package/src/programmers/functional/FunctionalIsParametersProgrammer.ts +113 -113
  176. package/src/programmers/functional/FunctionalIsReturnProgrammer.ts +116 -116
  177. package/src/programmers/functional/FunctionalValidateFunctionProgrammer.ts +119 -119
  178. package/src/programmers/functional/FunctionalValidateParametersProgrammer.ts +274 -274
  179. package/src/programmers/functional/FunctionalValidateReturnProgrammer.ts +135 -135
  180. package/src/programmers/functional/internal/FunctionalGeneralProgrammer.ts +34 -34
  181. package/src/programmers/helpers/AtomicPredicator.ts +35 -35
  182. package/src/programmers/helpers/CloneJoiner.ts +143 -143
  183. package/src/programmers/helpers/FunctionProgrammer.ts +67 -67
  184. package/src/programmers/helpers/HttpMetadataUtil.ts +21 -21
  185. package/src/programmers/helpers/NotationJoiner.ts +144 -144
  186. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  187. package/src/programmers/helpers/ProtobufUtil.ts +228 -228
  188. package/src/programmers/helpers/PruneJoiner.ts +148 -148
  189. package/src/programmers/helpers/RandomJoiner.ts +168 -168
  190. package/src/programmers/helpers/StringifyJoinder.ts +115 -115
  191. package/src/programmers/helpers/StringifyPredicator.ts +13 -13
  192. package/src/programmers/helpers/UnionExplorer.ts +372 -372
  193. package/src/programmers/helpers/UnionPredicator.ts +79 -79
  194. package/src/programmers/helpers/disable_function_programmer_declare.ts +32 -32
  195. package/src/programmers/http/HttpAssertFormDataProgrammer.ts +99 -99
  196. package/src/programmers/http/HttpAssertHeadersProgrammer.ts +99 -99
  197. package/src/programmers/http/HttpAssertQueryProgrammer.ts +105 -105
  198. package/src/programmers/http/HttpFormDataProgrammer.ts +308 -308
  199. package/src/programmers/http/HttpHeadersProgrammer.ts +400 -400
  200. package/src/programmers/http/HttpIsFormDataProgrammer.ts +108 -108
  201. package/src/programmers/http/HttpIsHeadersProgrammer.ts +108 -108
  202. package/src/programmers/http/HttpIsQueryProgrammer.ts +114 -114
  203. package/src/programmers/http/HttpParameterProgrammer.ts +115 -115
  204. package/src/programmers/http/HttpQueryProgrammer.ts +336 -336
  205. package/src/programmers/http/HttpValidateFormDataProgrammer.ts +92 -92
  206. package/src/programmers/http/HttpValidateHeadersProgrammer.ts +92 -92
  207. package/src/programmers/http/HttpValidateQueryProgrammer.ts +98 -98
  208. package/src/programmers/internal/check_array_length.ts +47 -47
  209. package/src/programmers/internal/check_bigint.ts +50 -50
  210. package/src/programmers/internal/check_dynamic_key.ts +201 -201
  211. package/src/programmers/internal/check_dynamic_properties.ts +208 -208
  212. package/src/programmers/internal/check_everything.ts +23 -23
  213. package/src/programmers/internal/check_native.ts +27 -27
  214. package/src/programmers/internal/check_number.ts +112 -112
  215. package/src/programmers/internal/check_object.ts +75 -75
  216. package/src/programmers/internal/check_string.ts +50 -50
  217. package/src/programmers/internal/check_template.ts +48 -48
  218. package/src/programmers/internal/check_union_array_like.ts +335 -335
  219. package/src/programmers/internal/decode_union_object.ts +116 -116
  220. package/src/programmers/internal/feature_object_entries.ts +61 -61
  221. package/src/programmers/internal/json_schema_alias.ts +47 -47
  222. package/src/programmers/internal/json_schema_array.ts +45 -45
  223. package/src/programmers/internal/json_schema_bigint.ts +15 -15
  224. package/src/programmers/internal/json_schema_boolean.ts +15 -15
  225. package/src/programmers/internal/json_schema_constant.ts +26 -26
  226. package/src/programmers/internal/json_schema_description.ts +12 -12
  227. package/src/programmers/internal/json_schema_discriminator.ts +35 -35
  228. package/src/programmers/internal/json_schema_escaped.ts +82 -82
  229. package/src/programmers/internal/json_schema_native.ts +33 -33
  230. package/src/programmers/internal/json_schema_number.ts +15 -15
  231. package/src/programmers/internal/json_schema_object.ts +158 -158
  232. package/src/programmers/internal/json_schema_plugin.ts +18 -18
  233. package/src/programmers/internal/json_schema_station.ts +182 -182
  234. package/src/programmers/internal/json_schema_string.ts +15 -15
  235. package/src/programmers/internal/json_schema_template.ts +55 -55
  236. package/src/programmers/internal/json_schema_title.ts +20 -20
  237. package/src/programmers/internal/json_schema_tuple.ts +35 -35
  238. package/src/programmers/internal/metadata_to_pattern.ts +42 -42
  239. package/src/programmers/internal/postfix_of_tuple.ts +5 -5
  240. package/src/programmers/internal/prune_object_properties.ts +71 -71
  241. package/src/programmers/internal/stringify_dynamic_properties.ts +162 -162
  242. package/src/programmers/internal/stringify_regular_properties.ts +81 -81
  243. package/src/programmers/internal/template_to_pattern.ts +23 -23
  244. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +23 -23
  245. package/src/programmers/json/JsonApplicationProgrammer.ts +279 -279
  246. package/src/programmers/json/JsonAssertParseProgrammer.ts +113 -113
  247. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +115 -115
  248. package/src/programmers/json/JsonIsParseProgrammer.ts +114 -114
  249. package/src/programmers/json/JsonIsStringifyProgrammer.ts +108 -108
  250. package/src/programmers/json/JsonSchemasProgrammer.ts +91 -91
  251. package/src/programmers/json/JsonStringifyProgrammer.ts +1124 -1124
  252. package/src/programmers/json/JsonValidateParseProgrammer.ts +105 -105
  253. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +124 -124
  254. package/src/programmers/llm/LlmApplicationOfValidateProgrammer.ts +90 -90
  255. package/src/programmers/llm/LlmApplicationProgrammer.ts +289 -289
  256. package/src/programmers/llm/LlmModelPredicator.ts +127 -127
  257. package/src/programmers/llm/LlmParametersProgrammer.ts +93 -93
  258. package/src/programmers/llm/LlmSchemaProgrammer.ts +192 -192
  259. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +95 -95
  260. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +116 -116
  261. package/src/programmers/misc/MiscCloneProgrammer.ts +1032 -1032
  262. package/src/programmers/misc/MiscIsCloneProgrammer.ts +99 -99
  263. package/src/programmers/misc/MiscIsPruneProgrammer.ts +97 -97
  264. package/src/programmers/misc/MiscLiteralsProgrammer.ts +80 -80
  265. package/src/programmers/misc/MiscPruneProgrammer.ts +728 -728
  266. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +111 -111
  267. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +113 -113
  268. package/src/programmers/notations/NotationAssertGeneralProgrammer.ts +101 -101
  269. package/src/programmers/notations/NotationGeneralProgrammer.ts +984 -984
  270. package/src/programmers/notations/NotationIsGeneralProgrammer.ts +105 -105
  271. package/src/programmers/notations/NotationValidateGeneralProgrammer.ts +119 -119
  272. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +98 -98
  273. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +102 -102
  274. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +654 -654
  275. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +945 -945
  276. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +109 -109
  277. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +98 -98
  278. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +179 -179
  279. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +92 -92
  280. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +119 -119
  281. package/src/protobuf.ts +868 -868
  282. package/src/reflect.ts +57 -57
  283. package/src/schemas/json/IJsonApplication.ts +73 -73
  284. package/src/schemas/json/IJsonSchemaCollection.ts +29 -29
  285. package/src/schemas/json/__IJsonApplication.ts +63 -63
  286. package/src/schemas/llm/ILlmApplicationOfValidate.ts +55 -55
  287. package/src/schemas/llm/ILlmFunctionOfValidate.ts +39 -39
  288. package/src/schemas/metadata/IMetadata.ts +35 -35
  289. package/src/schemas/metadata/IMetadataAlias.ts +6 -6
  290. package/src/schemas/metadata/IMetadataAliasType.ts +12 -12
  291. package/src/schemas/metadata/IMetadataApplication.ts +7 -7
  292. package/src/schemas/metadata/IMetadataArray.ts +6 -6
  293. package/src/schemas/metadata/IMetadataComponents.ts +11 -11
  294. package/src/schemas/metadata/IMetadataConstantValue.ts +11 -11
  295. package/src/schemas/metadata/IMetadataDictionary.ts +11 -11
  296. package/src/schemas/metadata/IMetadataMap.ts +8 -8
  297. package/src/schemas/metadata/IMetadataNative.ts +6 -6
  298. package/src/schemas/metadata/IMetadataObject.ts +6 -6
  299. package/src/schemas/metadata/IMetadataObjectType.ts +13 -13
  300. package/src/schemas/metadata/IMetadataSet.ts +7 -7
  301. package/src/schemas/metadata/IMetadataTemplate.ts +7 -7
  302. package/src/schemas/metadata/IMetadataTuple.ts +6 -6
  303. package/src/schemas/metadata/IMetadataTypeTag.ts +16 -16
  304. package/src/schemas/metadata/Metadata.ts +669 -669
  305. package/src/schemas/metadata/MetadataAlias.ts +46 -46
  306. package/src/schemas/metadata/MetadataAliasType.ts +63 -63
  307. package/src/schemas/metadata/MetadataApplication.ts +44 -44
  308. package/src/schemas/metadata/MetadataArray.ts +49 -49
  309. package/src/schemas/metadata/MetadataAtomic.ts +87 -87
  310. package/src/schemas/metadata/MetadataComponents.ts +98 -98
  311. package/src/schemas/metadata/MetadataConstantValue.ts +62 -62
  312. package/src/schemas/metadata/MetadataMap.ts +48 -48
  313. package/src/schemas/metadata/MetadataNative.ts +44 -44
  314. package/src/schemas/metadata/MetadataObject.ts +48 -48
  315. package/src/schemas/metadata/MetadataObjectType.ts +149 -149
  316. package/src/schemas/metadata/MetadataParameter.ts +54 -54
  317. package/src/schemas/metadata/MetadataProperty.ts +59 -59
  318. package/src/schemas/metadata/MetadataSet.ts +45 -45
  319. package/src/schemas/metadata/MetadataTemplate.ts +80 -80
  320. package/src/schemas/metadata/MetadataTuple.ts +32 -32
  321. package/src/schemas/protobuf/IProtobufProperty.ts +6 -6
  322. package/src/schemas/protobuf/IProtobufPropertyType.ts +37 -37
  323. package/src/schemas/protobuf/IProtobufSchema.ts +50 -50
  324. package/src/tags/Example.ts +24 -24
  325. package/src/tags/Examples.ts +16 -16
  326. package/src/tags/Format.ts +50 -50
  327. package/src/tags/JsonSchemaPlugin.ts +8 -8
  328. package/src/tags/Sequence.ts +10 -10
  329. package/src/tags/TagBase.ts +82 -82
  330. package/src/tags/Type.ts +33 -32
  331. package/src/tags/UniqueItems.ts +14 -14
  332. package/src/tags/index.ts +21 -21
  333. package/src/transform.ts +35 -35
  334. package/src/transformers/CallExpressionTransformer.ts +547 -547
  335. package/src/transformers/FileTransformer.ts +136 -136
  336. package/src/transformers/IProgrammerProps.ts +11 -11
  337. package/src/transformers/ITransformOptions.ts +62 -62
  338. package/src/transformers/ITransformProps.ts +9 -9
  339. package/src/transformers/ITypiaContext.ts +18 -18
  340. package/src/transformers/ImportTransformer.ts +81 -81
  341. package/src/transformers/NodeTransformer.ts +17 -17
  342. package/src/transformers/TransformerError.ts +60 -60
  343. package/src/transformers/features/AssertTransformer.ts +24 -24
  344. package/src/transformers/features/CreateAssertTransformer.ts +24 -24
  345. package/src/transformers/features/CreateIsTransformer.ts +18 -18
  346. package/src/transformers/features/CreateRandomTransformer.ts +43 -43
  347. package/src/transformers/features/CreateValidateTransformer.ts +18 -18
  348. package/src/transformers/features/IsTransformer.ts +18 -18
  349. package/src/transformers/features/RandomTransformer.ts +41 -41
  350. package/src/transformers/features/ValidateTransformer.ts +18 -18
  351. package/src/transformers/features/functional/FunctionalGenericTransformer.ts +57 -57
  352. package/src/transformers/features/http/CreateHttpAssertFormDataTransformer.ts +13 -13
  353. package/src/transformers/features/http/CreateHttpAssertHeadersTransformer.ts +13 -13
  354. package/src/transformers/features/http/CreateHttpAssertQueryTransformer.ts +13 -13
  355. package/src/transformers/features/http/CreateHttpFormDataTransformer.ts +13 -13
  356. package/src/transformers/features/http/CreateHttpHeadersTransformer.ts +13 -13
  357. package/src/transformers/features/http/CreateHttpIsFormDataTransformer.ts +13 -13
  358. package/src/transformers/features/http/CreateHttpIsHeadersTransformer.ts +13 -13
  359. package/src/transformers/features/http/CreateHttpIsQueryTransformer.ts +13 -13
  360. package/src/transformers/features/http/CreateHttpParameterTransformer.ts +13 -13
  361. package/src/transformers/features/http/CreateHttpQueryTransformer.ts +13 -13
  362. package/src/transformers/features/http/CreateHttpValidateFormDataTransformer.ts +13 -13
  363. package/src/transformers/features/http/CreateHttpValidateHeadersTransformer.ts +13 -13
  364. package/src/transformers/features/http/CreateHttpValidateQueryTransformer.ts +13 -13
  365. package/src/transformers/features/http/HttpAssertFormDataTransformer.ts +13 -13
  366. package/src/transformers/features/http/HttpAssertHeadersTransformer.ts +13 -13
  367. package/src/transformers/features/http/HttpAssertQueryTransformer.ts +13 -13
  368. package/src/transformers/features/http/HttpFormDataTransformer.ts +13 -13
  369. package/src/transformers/features/http/HttpHeadersTransformer.ts +13 -13
  370. package/src/transformers/features/http/HttpIsFormDataTransformer.ts +13 -13
  371. package/src/transformers/features/http/HttpIsHeadersTransformer.ts +13 -13
  372. package/src/transformers/features/http/HttpIsQueryTransformer.ts +13 -13
  373. package/src/transformers/features/http/HttpParameterTransformer.ts +13 -13
  374. package/src/transformers/features/http/HttpQueryTransformer.ts +13 -13
  375. package/src/transformers/features/http/HttpValidateFormDataTransformer.ts +13 -13
  376. package/src/transformers/features/http/HttpValidateHeadersTransformer.ts +13 -13
  377. package/src/transformers/features/http/HttpValidateQueryTransformer.ts +13 -13
  378. package/src/transformers/features/json/JsonApplicationTransformer.ts +105 -105
  379. package/src/transformers/features/json/JsonAssertParseTransformer.ts +13 -13
  380. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +13 -13
  381. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +13 -13
  382. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +13 -13
  383. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +13 -13
  384. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +13 -13
  385. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +13 -13
  386. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +13 -13
  387. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +13 -13
  388. package/src/transformers/features/json/JsonIsParseTransformer.ts +13 -13
  389. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +13 -13
  390. package/src/transformers/features/json/JsonSchemasTransformer.ts +143 -143
  391. package/src/transformers/features/json/JsonStringifyTransformer.ts +13 -13
  392. package/src/transformers/features/json/JsonValidateParseTransformer.ts +13 -13
  393. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +13 -13
  394. package/src/transformers/features/llm/LlmApplicationOfValidateTransformer.ts +121 -121
  395. package/src/transformers/features/llm/LlmApplicationTransformer.ts +118 -118
  396. package/src/transformers/features/llm/LlmParametersTransformer.ts +94 -94
  397. package/src/transformers/features/llm/LlmSchemaTransformer.ts +135 -135
  398. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +13 -13
  399. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +13 -13
  400. package/src/transformers/features/misc/MiscCloneTransformer.ts +13 -13
  401. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +13 -13
  402. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +13 -13
  403. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +13 -13
  404. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +13 -13
  405. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +13 -13
  406. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +13 -13
  407. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +13 -13
  408. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +13 -13
  409. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +13 -13
  410. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +13 -13
  411. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +35 -35
  412. package/src/transformers/features/misc/MiscPruneTransformer.ts +13 -13
  413. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +13 -13
  414. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +13 -13
  415. package/src/transformers/features/notations/NotationAssertGeneralTransformer.ts +20 -20
  416. package/src/transformers/features/notations/NotationCreateAssertGeneralTransformer.ts +20 -20
  417. package/src/transformers/features/notations/NotationCreateGeneralTransformer.ts +20 -20
  418. package/src/transformers/features/notations/NotationCreateIsGeneralTransformer.ts +20 -20
  419. package/src/transformers/features/notations/NotationCreateValidateGeneralTransformer.ts +20 -20
  420. package/src/transformers/features/notations/NotationGeneralTransformer.ts +18 -18
  421. package/src/transformers/features/notations/NotationIsGeneralTransformer.ts +20 -20
  422. package/src/transformers/features/notations/NotationValidateGeneralTransformer.ts +20 -20
  423. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +13 -13
  424. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +13 -13
  425. package/src/transformers/features/protobuf/ProtobufCreateAssertDecodeTransformer.ts +13 -13
  426. package/src/transformers/features/protobuf/ProtobufCreateAssertEncodeTransformer.ts +13 -13
  427. package/src/transformers/features/protobuf/ProtobufCreateDecodeTransformer.ts +13 -13
  428. package/src/transformers/features/protobuf/ProtobufCreateEncodeTransformer.ts +13 -13
  429. package/src/transformers/features/protobuf/ProtobufCreateIsDecodeTransformer.ts +13 -13
  430. package/src/transformers/features/protobuf/ProtobufCreateIsEncodeTransformer.ts +13 -13
  431. package/src/transformers/features/protobuf/ProtobufCreateValidateDecodeTransformer.ts +13 -13
  432. package/src/transformers/features/protobuf/ProtobufCreateValidateEncodeTransformer.ts +13 -13
  433. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +13 -13
  434. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +13 -13
  435. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +13 -13
  436. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +13 -13
  437. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +35 -35
  438. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +13 -13
  439. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +13 -13
  440. package/src/transformers/features/reflect/ReflectMetadataTransformer.ts +69 -69
  441. package/src/transformers/features/reflect/ReflectNameTransformer.ts +82 -82
  442. package/src/transformers/internal/GenericTransformer.ts +101 -101
  443. package/src/utils/MapUtil.ts +14 -14
  444. package/src/utils/NamingConvention.ts +94 -94
  445. package/src/utils/ProtobufNameEncoder.ts +32 -32
  446. 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
+ }