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