typia 9.4.0 → 9.5.0-dev.20250710

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