typia 9.7.1 → 10.0.0-dev.20251107

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 (424) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +153 -153
  3. package/lib/AssertionGuard.d.mts +27 -25
  4. package/lib/AssertionGuard.d.ts +27 -25
  5. package/lib/CamelCase.d.mts +1 -1
  6. package/lib/CamelCase.d.ts +1 -1
  7. package/lib/IRandomGenerator.d.mts +44 -42
  8. package/lib/IRandomGenerator.d.ts +44 -42
  9. package/lib/IReadableURLSearchParams.d.mts +2 -2
  10. package/lib/IReadableURLSearchParams.d.ts +2 -2
  11. package/lib/PascalCase.d.mts +1 -1
  12. package/lib/PascalCase.d.ts +1 -1
  13. package/lib/Primitive.d.mts +20 -22
  14. package/lib/Primitive.d.ts +20 -22
  15. package/lib/Resolved.d.mts +16 -18
  16. package/lib/Resolved.d.ts +16 -18
  17. package/lib/SnakeCase.d.mts +3 -2
  18. package/lib/SnakeCase.d.ts +3 -2
  19. package/lib/TypeGuardError.d.mts +88 -61
  20. package/lib/TypeGuardError.d.ts +88 -61
  21. package/lib/TypeGuardError.js +40 -29
  22. package/lib/TypeGuardError.js.map +1 -1
  23. package/lib/TypeGuardError.mjs +70 -48
  24. package/lib/factories/MetadataCollection.js +4 -12
  25. package/lib/factories/MetadataCollection.js.map +1 -1
  26. package/lib/factories/MetadataCollection.mjs +4 -12
  27. package/lib/factories/MetadataCommentTagFactory.js +5 -15
  28. package/lib/factories/MetadataCommentTagFactory.js.map +1 -1
  29. package/lib/factories/MetadataCommentTagFactory.mjs +5 -15
  30. package/lib/factories/MetadataFactory.js +1 -3
  31. package/lib/factories/MetadataFactory.js.map +1 -1
  32. package/lib/factories/MetadataFactory.mjs +1 -3
  33. package/lib/factories/ProtobufFactory.js +2 -4
  34. package/lib/factories/ProtobufFactory.js.map +1 -1
  35. package/lib/factories/ProtobufFactory.mjs +2 -4
  36. package/lib/functional.d.mts +196 -195
  37. package/lib/functional.d.ts +196 -195
  38. package/lib/functional.js +18 -54
  39. package/lib/functional.js.map +1 -1
  40. package/lib/functional.mjs +18 -54
  41. package/lib/http.d.mts +303 -319
  42. package/lib/http.d.ts +303 -319
  43. package/lib/http.js +26 -78
  44. package/lib/http.js.map +1 -1
  45. package/lib/http.mjs +26 -78
  46. package/lib/internal/_ProtobufReader.d.mts +3 -9
  47. package/lib/internal/_ProtobufReader.d.ts +3 -9
  48. package/lib/internal/_ProtobufReader.js.map +1 -1
  49. package/lib/internal/_ProtobufReader.mjs +3 -9
  50. package/lib/internal/_ProtobufSizer.d.mts +4 -12
  51. package/lib/internal/_ProtobufSizer.d.ts +4 -12
  52. package/lib/internal/_ProtobufSizer.js.map +1 -1
  53. package/lib/internal/_ProtobufSizer.mjs +4 -12
  54. package/lib/internal/_ProtobufWriter.d.mts +5 -15
  55. package/lib/internal/_ProtobufWriter.d.ts +5 -15
  56. package/lib/internal/_ProtobufWriter.js.map +1 -1
  57. package/lib/internal/_ProtobufWriter.mjs +5 -15
  58. package/lib/internal/_jsonStringifyString.d.mts +4 -4
  59. package/lib/internal/_jsonStringifyString.d.ts +4 -4
  60. package/lib/internal/_jsonStringifyString.js +4 -4
  61. package/lib/internal/_jsonStringifyString.mjs +4 -4
  62. package/lib/json.d.mts +174 -195
  63. package/lib/json.d.ts +174 -195
  64. package/lib/json.js +16 -48
  65. package/lib/json.js.map +1 -1
  66. package/lib/json.mjs +16 -48
  67. package/lib/llm.d.mts +275 -192
  68. package/lib/llm.d.ts +275 -192
  69. package/lib/llm.js +4 -12
  70. package/lib/llm.js.map +1 -1
  71. package/lib/llm.mjs +4 -12
  72. package/lib/misc.d.mts +149 -172
  73. package/lib/misc.d.ts +149 -172
  74. package/lib/misc.js +17 -51
  75. package/lib/misc.js.map +1 -1
  76. package/lib/misc.mjs +17 -51
  77. package/lib/module.d.mts +263 -275
  78. package/lib/module.d.ts +263 -275
  79. package/lib/module.js +18 -54
  80. package/lib/module.js.map +1 -1
  81. package/lib/module.mjs +18 -54
  82. package/lib/notations.d.mts +153 -174
  83. package/lib/notations.d.ts +153 -174
  84. package/lib/notations.js +24 -72
  85. package/lib/notations.js.map +1 -1
  86. package/lib/notations.mjs +24 -72
  87. package/lib/programmers/FeatureProgrammer.d.mts +19 -41
  88. package/lib/programmers/FeatureProgrammer.d.ts +19 -41
  89. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  90. package/lib/programmers/ImportProgrammer.js +3 -9
  91. package/lib/programmers/ImportProgrammer.js.map +1 -1
  92. package/lib/programmers/ImportProgrammer.mjs +3 -9
  93. package/lib/programmers/RandomProgrammer.js +6 -0
  94. package/lib/programmers/RandomProgrammer.js.map +1 -1
  95. package/lib/programmers/RandomProgrammer.mjs +6 -0
  96. package/lib/programmers/helpers/ProtobufWire.d.mts +13 -13
  97. package/lib/programmers/helpers/ProtobufWire.d.ts +13 -13
  98. package/lib/programmers/internal/check_array_length.js +2 -6
  99. package/lib/programmers/internal/check_array_length.js.map +1 -1
  100. package/lib/programmers/internal/check_array_length.mjs +2 -6
  101. package/lib/programmers/internal/check_bigint.js +2 -6
  102. package/lib/programmers/internal/check_bigint.js.map +1 -1
  103. package/lib/programmers/internal/check_bigint.mjs +2 -6
  104. package/lib/programmers/internal/check_dynamic_key.js +2 -6
  105. package/lib/programmers/internal/check_dynamic_key.js.map +1 -1
  106. package/lib/programmers/internal/check_dynamic_key.mjs +2 -6
  107. package/lib/programmers/internal/check_dynamic_properties.js +3 -9
  108. package/lib/programmers/internal/check_dynamic_properties.js.map +1 -1
  109. package/lib/programmers/internal/check_dynamic_properties.mjs +3 -9
  110. package/lib/programmers/internal/check_everything.js +1 -3
  111. package/lib/programmers/internal/check_everything.js.map +1 -1
  112. package/lib/programmers/internal/check_everything.mjs +1 -3
  113. package/lib/programmers/internal/check_native.js +2 -6
  114. package/lib/programmers/internal/check_native.js.map +1 -1
  115. package/lib/programmers/internal/check_native.mjs +2 -6
  116. package/lib/programmers/internal/check_number.js +2 -6
  117. package/lib/programmers/internal/check_number.js.map +1 -1
  118. package/lib/programmers/internal/check_number.mjs +2 -6
  119. package/lib/programmers/internal/check_object.js +2 -6
  120. package/lib/programmers/internal/check_object.js.map +1 -1
  121. package/lib/programmers/internal/check_object.mjs +2 -6
  122. package/lib/programmers/internal/check_string.js +2 -6
  123. package/lib/programmers/internal/check_string.js.map +1 -1
  124. package/lib/programmers/internal/check_string.mjs +2 -6
  125. package/lib/programmers/internal/check_template.js +1 -3
  126. package/lib/programmers/internal/check_template.js.map +1 -1
  127. package/lib/programmers/internal/check_template.mjs +1 -3
  128. package/lib/programmers/internal/check_union_array_like.js +1 -3
  129. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  130. package/lib/programmers/internal/check_union_array_like.mjs +1 -3
  131. package/lib/programmers/internal/decode_union_object.js +2 -6
  132. package/lib/programmers/internal/decode_union_object.js.map +1 -1
  133. package/lib/programmers/internal/decode_union_object.mjs +2 -6
  134. package/lib/programmers/internal/feature_object_entries.js +1 -3
  135. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  136. package/lib/programmers/internal/feature_object_entries.mjs +1 -3
  137. package/lib/programmers/internal/json_schema_escaped.js +2 -6
  138. package/lib/programmers/internal/json_schema_escaped.js.map +1 -1
  139. package/lib/programmers/internal/json_schema_escaped.mjs +2 -6
  140. package/lib/programmers/internal/json_schema_object.js +3 -9
  141. package/lib/programmers/internal/json_schema_object.js.map +1 -1
  142. package/lib/programmers/internal/json_schema_object.mjs +3 -9
  143. package/lib/programmers/internal/json_schema_station.d.mts +2 -2
  144. package/lib/programmers/internal/json_schema_station.d.ts +2 -2
  145. package/lib/programmers/internal/metadata_to_pattern.js +1 -3
  146. package/lib/programmers/internal/metadata_to_pattern.js.map +1 -1
  147. package/lib/programmers/internal/metadata_to_pattern.mjs +1 -3
  148. package/lib/programmers/internal/postfix_of_tuple.js +1 -3
  149. package/lib/programmers/internal/postfix_of_tuple.js.map +1 -1
  150. package/lib/programmers/internal/postfix_of_tuple.mjs +1 -3
  151. package/lib/programmers/internal/prune_object_properties.js +1 -3
  152. package/lib/programmers/internal/prune_object_properties.js.map +1 -1
  153. package/lib/programmers/internal/prune_object_properties.mjs +1 -3
  154. package/lib/programmers/internal/stringify_dynamic_properties.js +2 -6
  155. package/lib/programmers/internal/stringify_dynamic_properties.js.map +1 -1
  156. package/lib/programmers/internal/stringify_dynamic_properties.mjs +2 -6
  157. package/lib/programmers/internal/stringify_native.js +1 -3
  158. package/lib/programmers/internal/stringify_native.js.map +1 -1
  159. package/lib/programmers/internal/stringify_native.mjs +1 -3
  160. package/lib/programmers/internal/stringify_regular_properties.js +2 -6
  161. package/lib/programmers/internal/stringify_regular_properties.js.map +1 -1
  162. package/lib/programmers/internal/stringify_regular_properties.mjs +2 -6
  163. package/lib/programmers/internal/template_to_pattern.js +1 -3
  164. package/lib/programmers/internal/template_to_pattern.js.map +1 -1
  165. package/lib/programmers/internal/template_to_pattern.mjs +1 -3
  166. package/lib/programmers/internal/wrap_metadata_rest_tuple.js +1 -3
  167. package/lib/programmers/internal/wrap_metadata_rest_tuple.js.map +1 -1
  168. package/lib/programmers/internal/wrap_metadata_rest_tuple.mjs +1 -3
  169. package/lib/programmers/json/JsonStringifyProgrammer.js +2 -2
  170. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  171. package/lib/programmers/json/JsonStringifyProgrammer.mjs +2 -2
  172. package/lib/programmers/llm/LlmApplicationProgrammer.js +5 -1
  173. package/lib/programmers/llm/LlmApplicationProgrammer.js.map +1 -1
  174. package/lib/programmers/llm/LlmApplicationProgrammer.mjs +5 -1
  175. package/lib/programmers/llm/LlmSchemaProgrammer.js +1 -4
  176. package/lib/programmers/llm/LlmSchemaProgrammer.js.map +1 -1
  177. package/lib/programmers/llm/LlmSchemaProgrammer.mjs +1 -35
  178. package/lib/protobuf.d.mts +290 -297
  179. package/lib/protobuf.d.ts +290 -297
  180. package/lib/protobuf.js +17 -51
  181. package/lib/protobuf.js.map +1 -1
  182. package/lib/protobuf.mjs +17 -51
  183. package/lib/reflect.d.mts +2 -4
  184. package/lib/reflect.d.ts +2 -4
  185. package/lib/reflect.js +1 -3
  186. package/lib/reflect.js.map +1 -1
  187. package/lib/reflect.mjs +1 -3
  188. package/lib/schemas/json/IJsonApplication.d.mts +4 -4
  189. package/lib/schemas/json/IJsonApplication.d.ts +4 -4
  190. package/lib/schemas/json/IJsonSchemaCollection.d.mts +73 -56
  191. package/lib/schemas/json/IJsonSchemaCollection.d.ts +73 -56
  192. package/lib/schemas/json/IJsonSchemaUnit.d.mts +83 -70
  193. package/lib/schemas/json/IJsonSchemaUnit.d.ts +83 -70
  194. package/lib/schemas/metadata/Metadata.d.mts +1 -3
  195. package/lib/schemas/metadata/Metadata.d.ts +1 -3
  196. package/lib/schemas/metadata/Metadata.js +9 -27
  197. package/lib/schemas/metadata/Metadata.js.map +1 -1
  198. package/lib/schemas/metadata/Metadata.mjs +9 -27
  199. package/lib/schemas/metadata/MetadataAliasType.d.mts +1 -3
  200. package/lib/schemas/metadata/MetadataAliasType.d.ts +1 -3
  201. package/lib/schemas/metadata/MetadataAliasType.js +3 -9
  202. package/lib/schemas/metadata/MetadataAliasType.js.map +1 -1
  203. package/lib/schemas/metadata/MetadataAliasType.mjs +3 -9
  204. package/lib/schemas/metadata/MetadataApplication.d.mts +1 -3
  205. package/lib/schemas/metadata/MetadataApplication.d.ts +1 -3
  206. package/lib/schemas/metadata/MetadataApplication.js +2 -6
  207. package/lib/schemas/metadata/MetadataApplication.js.map +1 -1
  208. package/lib/schemas/metadata/MetadataApplication.mjs +2 -6
  209. package/lib/schemas/metadata/MetadataArray.d.mts +1 -3
  210. package/lib/schemas/metadata/MetadataArray.d.ts +1 -3
  211. package/lib/schemas/metadata/MetadataArray.js +1 -3
  212. package/lib/schemas/metadata/MetadataArray.js.map +1 -1
  213. package/lib/schemas/metadata/MetadataArray.mjs +1 -3
  214. package/lib/schemas/metadata/MetadataArrayType.d.mts +1 -3
  215. package/lib/schemas/metadata/MetadataArrayType.d.ts +1 -3
  216. package/lib/schemas/metadata/MetadataArrayType.js +3 -9
  217. package/lib/schemas/metadata/MetadataArrayType.js.map +1 -1
  218. package/lib/schemas/metadata/MetadataArrayType.mjs +3 -9
  219. package/lib/schemas/metadata/MetadataAtomic.js +1 -3
  220. package/lib/schemas/metadata/MetadataAtomic.js.map +1 -1
  221. package/lib/schemas/metadata/MetadataAtomic.mjs +1 -3
  222. package/lib/schemas/metadata/MetadataEscaped.d.mts +1 -3
  223. package/lib/schemas/metadata/MetadataEscaped.d.ts +1 -3
  224. package/lib/schemas/metadata/MetadataEscaped.js +3 -9
  225. package/lib/schemas/metadata/MetadataEscaped.js.map +1 -1
  226. package/lib/schemas/metadata/MetadataEscaped.mjs +3 -9
  227. package/lib/schemas/metadata/MetadataFunction.d.mts +1 -3
  228. package/lib/schemas/metadata/MetadataFunction.d.ts +1 -3
  229. package/lib/schemas/metadata/MetadataFunction.js +2 -6
  230. package/lib/schemas/metadata/MetadataFunction.js.map +1 -1
  231. package/lib/schemas/metadata/MetadataFunction.mjs +2 -6
  232. package/lib/schemas/metadata/MetadataObject.d.mts +1 -3
  233. package/lib/schemas/metadata/MetadataObject.d.ts +1 -3
  234. package/lib/schemas/metadata/MetadataObject.js +1 -3
  235. package/lib/schemas/metadata/MetadataObject.js.map +1 -1
  236. package/lib/schemas/metadata/MetadataObject.mjs +1 -3
  237. package/lib/schemas/metadata/MetadataObjectType.d.mts +1 -3
  238. package/lib/schemas/metadata/MetadataObjectType.d.ts +1 -3
  239. package/lib/schemas/metadata/MetadataObjectType.js +5 -15
  240. package/lib/schemas/metadata/MetadataObjectType.js.map +1 -1
  241. package/lib/schemas/metadata/MetadataObjectType.mjs +6 -18
  242. package/lib/schemas/metadata/MetadataParameter.js +1 -3
  243. package/lib/schemas/metadata/MetadataParameter.js.map +1 -1
  244. package/lib/schemas/metadata/MetadataParameter.mjs +1 -3
  245. package/lib/schemas/metadata/MetadataProperty.d.mts +1 -3
  246. package/lib/schemas/metadata/MetadataProperty.d.ts +1 -3
  247. package/lib/schemas/metadata/MetadataProperty.js +3 -9
  248. package/lib/schemas/metadata/MetadataProperty.js.map +1 -1
  249. package/lib/schemas/metadata/MetadataProperty.mjs +3 -9
  250. package/lib/schemas/metadata/MetadataTemplate.js +1 -3
  251. package/lib/schemas/metadata/MetadataTemplate.js.map +1 -1
  252. package/lib/schemas/metadata/MetadataTemplate.mjs +1 -3
  253. package/lib/schemas/metadata/MetadataTuple.d.mts +1 -3
  254. package/lib/schemas/metadata/MetadataTuple.d.ts +1 -3
  255. package/lib/schemas/metadata/MetadataTuple.js +2 -6
  256. package/lib/schemas/metadata/MetadataTuple.js.map +1 -1
  257. package/lib/schemas/metadata/MetadataTuple.mjs +2 -6
  258. package/lib/schemas/metadata/MetadataTupleType.js +2 -6
  259. package/lib/schemas/metadata/MetadataTupleType.js.map +1 -1
  260. package/lib/schemas/metadata/MetadataTupleType.mjs +3 -9
  261. package/lib/tags/Constant.d.mts +16 -16
  262. package/lib/tags/Constant.d.ts +16 -16
  263. package/lib/tags/ContentMediaType.d.mts +7 -7
  264. package/lib/tags/ContentMediaType.d.ts +7 -7
  265. package/lib/tags/Default.d.mts +19 -19
  266. package/lib/tags/Default.d.ts +19 -19
  267. package/lib/tags/Example.d.mts +18 -18
  268. package/lib/tags/Example.d.ts +18 -18
  269. package/lib/tags/Examples.d.mts +23 -23
  270. package/lib/tags/Examples.d.ts +23 -23
  271. package/lib/tags/ExclusiveMaximum.d.mts +8 -5
  272. package/lib/tags/ExclusiveMaximum.d.ts +8 -5
  273. package/lib/tags/ExclusiveMinimum.d.mts +8 -5
  274. package/lib/tags/ExclusiveMinimum.d.ts +8 -5
  275. package/lib/tags/Format.d.mts +12 -8
  276. package/lib/tags/Format.d.ts +12 -8
  277. package/lib/tags/JsonSchemaPlugin.d.mts +20 -18
  278. package/lib/tags/JsonSchemaPlugin.d.ts +20 -18
  279. package/lib/tags/MaxItems.d.mts +9 -9
  280. package/lib/tags/MaxItems.d.ts +9 -9
  281. package/lib/tags/MaxLength.d.mts +6 -5
  282. package/lib/tags/MaxLength.d.ts +6 -5
  283. package/lib/tags/Maximum.d.mts +9 -7
  284. package/lib/tags/Maximum.d.ts +9 -7
  285. package/lib/tags/MinItems.d.mts +9 -9
  286. package/lib/tags/MinItems.d.ts +9 -9
  287. package/lib/tags/MinLength.d.mts +6 -5
  288. package/lib/tags/MinLength.d.ts +6 -5
  289. package/lib/tags/Minimum.d.mts +9 -7
  290. package/lib/tags/Minimum.d.ts +9 -7
  291. package/lib/tags/MultipleOf.d.mts +10 -7
  292. package/lib/tags/MultipleOf.d.ts +10 -7
  293. package/lib/tags/Pattern.d.mts +7 -4
  294. package/lib/tags/Pattern.d.ts +7 -4
  295. package/lib/tags/Sequence.d.mts +19 -17
  296. package/lib/tags/Sequence.d.ts +19 -17
  297. package/lib/tags/TagBase.d.mts +21 -28
  298. package/lib/tags/TagBase.d.ts +21 -28
  299. package/lib/tags/Type.d.mts +12 -11
  300. package/lib/tags/Type.d.ts +12 -11
  301. package/lib/tags/UniqueItems.d.mts +10 -9
  302. package/lib/tags/UniqueItems.d.ts +10 -9
  303. package/lib/tags/internal/FormatCheatSheet.d.mts +1 -3
  304. package/lib/tags/internal/FormatCheatSheet.d.ts +1 -3
  305. package/lib/tags/internal/FormatCheatSheet.js +1 -3
  306. package/lib/tags/internal/FormatCheatSheet.js.map +1 -1
  307. package/lib/tags/internal/FormatCheatSheet.mjs +1 -3
  308. package/lib/transformers/ITransformOptions.d.mts +27 -19
  309. package/lib/transformers/ITransformOptions.d.ts +27 -19
  310. package/lib/transformers/ImportTransformer.js +5 -10
  311. package/lib/transformers/ImportTransformer.js.map +1 -1
  312. package/lib/transformers/ImportTransformer.mjs +5 -10
  313. package/lib/transformers/NoTransformConfigurationError.js +1 -3
  314. package/lib/transformers/NoTransformConfigurationError.js.map +1 -1
  315. package/lib/transformers/NoTransformConfigurationError.mjs +1 -3
  316. package/lib/transformers/features/llm/LlmApplicationTransformer.js +1 -3
  317. package/lib/transformers/features/llm/LlmApplicationTransformer.js.map +1 -1
  318. package/lib/transformers/features/llm/LlmApplicationTransformer.mjs +1 -3
  319. package/lib/typings/Equal.d.mts +6 -6
  320. package/lib/typings/Equal.d.ts +6 -6
  321. package/package.json +121 -120
  322. package/src/AssertionGuard.ts +41 -39
  323. package/src/CamelCase.ts +75 -75
  324. package/src/IRandomGenerator.ts +337 -335
  325. package/src/IReadableURLSearchParams.ts +9 -9
  326. package/src/PascalCase.ts +71 -71
  327. package/src/Primitive.ts +90 -92
  328. package/src/Resolved.ts +72 -74
  329. package/src/SnakeCase.ts +127 -126
  330. package/src/TypeGuardError.ts +216 -179
  331. package/src/factories/MetadataCollection.ts +270 -278
  332. package/src/factories/MetadataCommentTagFactory.ts +632 -648
  333. package/src/factories/MetadataFactory.ts +402 -404
  334. package/src/factories/ProtobufFactory.ts +873 -875
  335. package/src/functional.ts +705 -740
  336. package/src/http.ts +972 -1040
  337. package/src/internal/_ProtobufReader.ts +188 -194
  338. package/src/internal/_ProtobufSizer.ts +137 -145
  339. package/src/internal/_ProtobufWriter.ts +135 -145
  340. package/src/internal/_jsonStringifyString.ts +42 -42
  341. package/src/json.ts +643 -696
  342. package/src/llm.ts +615 -540
  343. package/src/misc.ts +594 -651
  344. package/src/module.ts +889 -937
  345. package/src/notations.ts +751 -820
  346. package/src/programmers/FeatureProgrammer.ts +605 -627
  347. package/src/programmers/ImportProgrammer.ts +179 -185
  348. package/src/programmers/RandomProgrammer.ts +1195 -1190
  349. package/src/programmers/helpers/ProtobufWire.ts +34 -34
  350. package/src/programmers/internal/check_array_length.ts +43 -47
  351. package/src/programmers/internal/check_bigint.ts +46 -50
  352. package/src/programmers/internal/check_dynamic_key.ts +197 -201
  353. package/src/programmers/internal/check_dynamic_properties.ts +231 -237
  354. package/src/programmers/internal/check_everything.ts +21 -23
  355. package/src/programmers/internal/check_native.ts +23 -27
  356. package/src/programmers/internal/check_number.ts +108 -112
  357. package/src/programmers/internal/check_object.ts +72 -78
  358. package/src/programmers/internal/check_string.ts +46 -50
  359. package/src/programmers/internal/check_template.ts +46 -48
  360. package/src/programmers/internal/check_union_array_like.ts +331 -335
  361. package/src/programmers/internal/decode_union_object.ts +110 -116
  362. package/src/programmers/internal/feature_object_entries.ts +59 -61
  363. package/src/programmers/internal/json_schema_escaped.ts +78 -82
  364. package/src/programmers/internal/json_schema_object.ts +150 -158
  365. package/src/programmers/internal/json_schema_station.ts +2 -2
  366. package/src/programmers/internal/metadata_to_pattern.ts +40 -42
  367. package/src/programmers/internal/postfix_of_tuple.ts +3 -5
  368. package/src/programmers/internal/prune_object_properties.ts +69 -71
  369. package/src/programmers/internal/stringify_dynamic_properties.ts +158 -162
  370. package/src/programmers/internal/stringify_native.ts +5 -7
  371. package/src/programmers/internal/stringify_regular_properties.ts +77 -81
  372. package/src/programmers/internal/template_to_pattern.ts +21 -23
  373. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +21 -23
  374. package/src/programmers/json/JsonStringifyProgrammer.ts +1124 -1124
  375. package/src/programmers/llm/LlmApplicationProgrammer.ts +10 -1
  376. package/src/programmers/llm/LlmSchemaProgrammer.ts +2 -7
  377. package/src/protobuf.ts +820 -861
  378. package/src/reflect.ts +46 -50
  379. package/src/schemas/json/IJsonApplication.ts +77 -77
  380. package/src/schemas/json/IJsonSchemaCollection.ts +212 -195
  381. package/src/schemas/json/IJsonSchemaUnit.ts +263 -250
  382. package/src/schemas/metadata/IMetadataTypeTag.ts +14 -16
  383. package/src/schemas/metadata/Metadata.ts +669 -687
  384. package/src/schemas/metadata/MetadataAliasType.ts +57 -63
  385. package/src/schemas/metadata/MetadataApplication.ts +40 -44
  386. package/src/schemas/metadata/MetadataArray.ts +47 -49
  387. package/src/schemas/metadata/MetadataArrayType.ts +51 -57
  388. package/src/schemas/metadata/MetadataAtomic.ts +85 -87
  389. package/src/schemas/metadata/MetadataEscaped.ts +45 -51
  390. package/src/schemas/metadata/MetadataFunction.ts +45 -49
  391. package/src/schemas/metadata/MetadataObject.ts +46 -48
  392. package/src/schemas/metadata/MetadataObjectType.ts +137 -149
  393. package/src/schemas/metadata/MetadataParameter.ts +52 -54
  394. package/src/schemas/metadata/MetadataProperty.ts +53 -59
  395. package/src/schemas/metadata/MetadataTemplate.ts +78 -80
  396. package/src/schemas/metadata/MetadataTuple.ts +28 -32
  397. package/src/schemas/metadata/MetadataTupleType.ts +61 -67
  398. package/src/tags/Constant.ts +47 -47
  399. package/src/tags/ContentMediaType.ts +27 -27
  400. package/src/tags/Default.ts +52 -52
  401. package/src/tags/Example.ts +56 -56
  402. package/src/tags/Examples.ts +56 -56
  403. package/src/tags/ExclusiveMaximum.ts +44 -41
  404. package/src/tags/ExclusiveMinimum.ts +44 -41
  405. package/src/tags/Format.ts +78 -74
  406. package/src/tags/JsonSchemaPlugin.ts +36 -34
  407. package/src/tags/MaxItems.ts +31 -31
  408. package/src/tags/MaxLength.ts +25 -24
  409. package/src/tags/Maximum.ts +39 -37
  410. package/src/tags/MinItems.ts +31 -31
  411. package/src/tags/MinLength.ts +25 -24
  412. package/src/tags/Minimum.ts +39 -37
  413. package/src/tags/MultipleOf.ts +42 -39
  414. package/src/tags/Pattern.ts +49 -46
  415. package/src/tags/Sequence.ts +37 -35
  416. package/src/tags/TagBase.ts +102 -109
  417. package/src/tags/Type.ts +64 -63
  418. package/src/tags/UniqueItems.ts +34 -33
  419. package/src/tags/internal/FormatCheatSheet.ts +71 -73
  420. package/src/transformers/ITransformOptions.ts +70 -62
  421. package/src/transformers/ImportTransformer.ts +253 -258
  422. package/src/transformers/NoTransformConfigurationError.ts +16 -18
  423. package/src/transformers/features/llm/LlmApplicationTransformer.ts +224 -226
  424. package/src/typings/Equal.ts +18 -18
@@ -1,627 +1,605 @@
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
+ /** Prefix name of internal functions for specific types. */
29
+ prefix: string;
30
+
31
+ /** Whether to archive access path or not. */
32
+ path: boolean;
33
+
34
+ /** Whether to trace exception or not. */
35
+ trace: boolean;
36
+
37
+ addition?: undefined | ((collection: MetadataCollection) => ts.Statement[]);
38
+
39
+ /** Initializer of metadata. */
40
+ initializer: (props: {
41
+ context: ITypiaContext;
42
+ functor: FunctionProgrammer;
43
+ type: ts.Type;
44
+ }) => {
45
+ collection: MetadataCollection;
46
+ metadata: Metadata;
47
+ };
48
+
49
+ /** Decoder, station of every types. */
50
+ decoder: (props: {
51
+ metadata: Metadata;
52
+ input: ts.Expression;
53
+ explore: IExplore;
54
+ }) => Output;
55
+
56
+ /** Object configurator. */
57
+ objector: IConfig.IObjector<Output>;
58
+
59
+ /** Generator of functions for object types. */
60
+ generator: IConfig.IGenerator;
61
+ }
62
+ export namespace IConfig {
63
+ export interface ITypes {
64
+ input: (type: ts.Type, name?: undefined | string) => ts.TypeNode;
65
+ output: (type: ts.Type, name?: undefined | string) => ts.TypeNode;
66
+ }
67
+
68
+ export interface IObjector<Output extends ts.ConciseBody = ts.ConciseBody> {
69
+ /** Type checker when union object type comes. */
70
+ checker: (props: {
71
+ metadata: Metadata;
72
+ input: ts.Expression;
73
+ explore: IExplore;
74
+ }) => ts.Expression;
75
+
76
+ /** Decoder, function call expression generator of specific typed objects. */
77
+ decoder: (props: {
78
+ input: ts.Expression;
79
+ object: MetadataObjectType;
80
+ explore: IExplore;
81
+ }) => ts.Expression;
82
+
83
+ /** Joiner of expressions from properties. */
84
+ joiner(props: {
85
+ entries: IExpressionEntry<Output>[];
86
+ input?: ts.Expression;
87
+ object?: MetadataObjectType;
88
+ }): ts.ConciseBody;
89
+
90
+ /**
91
+ * Union type specificator.
92
+ *
93
+ * Expression of an algorithm specifying object type and calling the
94
+ * `decoder` function of the specified object type.
95
+ */
96
+ unionizer: (props: {
97
+ objects: MetadataObjectType[];
98
+ input: ts.Expression;
99
+ explore: IExplore;
100
+ }) => ts.Expression;
101
+
102
+ /**
103
+ * Handler of union type specification failure.
104
+ *
105
+ * @param props Properties of failure
106
+ * @returns Statement of failure
107
+ */
108
+ failure(props: {
109
+ input: ts.Expression;
110
+ expected: string;
111
+ explore?: undefined | IExplore;
112
+ }): ts.Statement;
113
+
114
+ /**
115
+ * Transformer of type checking expression by discrimination.
116
+ *
117
+ * When an object type has been specified by a discrimination without full
118
+ * iteration, the `unionizer` will decode the object instance after the
119
+ * last type checking.
120
+ *
121
+ * In such circumtance, you can transform the last type checking function.
122
+ *
123
+ * @deprecated
124
+ * @param exp Current expression about type checking
125
+ * @returns Transformed expression
126
+ */
127
+ is?: undefined | ((exp: ts.Expression) => ts.Expression);
128
+
129
+ /**
130
+ * Transformer of non-undefined type checking by discrimination.
131
+ *
132
+ * When specifying an union type of objects, `typia` tries to find
133
+ * discrimination way just by checking only one property type. If
134
+ * succeeded to find the discrimination way, `typia` will check the target
135
+ * property type and in the checking, non-undefined type checking would be
136
+ * done.
137
+ *
138
+ * In such process, you can transform the non-undefined type checking.
139
+ *
140
+ * @deprecated
141
+ * @param exp
142
+ * @returns Transformed expression
143
+ */
144
+ required?: undefined | ((exp: ts.Expression) => ts.Expression);
145
+
146
+ /**
147
+ * Condition wrapper when unable to specify any object type.
148
+ *
149
+ * When failed to specify an object type through discrimination, full
150
+ * iteration type checking would be happened. In such circumstance, you
151
+ * can wrap the condition with additional function.
152
+ *
153
+ * @param props Properties of condition
154
+ * @returns The wrapper expression
155
+ */
156
+ full?:
157
+ | undefined
158
+ | ((props: {
159
+ condition: ts.Expression;
160
+ input: ts.Expression;
161
+ expected: string;
162
+ explore: IExplore;
163
+ }) => ts.Expression);
164
+
165
+ /** Return type. */
166
+ type?: undefined | ts.TypeNode;
167
+ }
168
+ export interface IGenerator {
169
+ objects?:
170
+ | undefined
171
+ | ((collection: MetadataCollection) => ts.VariableStatement[]);
172
+ unions?:
173
+ | undefined
174
+ | ((collection: MetadataCollection) => ts.VariableStatement[]);
175
+ arrays: (collection: MetadataCollection) => ts.VariableStatement[];
176
+ tuples: (collection: MetadataCollection) => ts.VariableStatement[];
177
+ }
178
+ }
179
+
180
+ export interface IExplore {
181
+ tracable: boolean;
182
+ source: "top" | "function";
183
+ from: "top" | "array" | "object";
184
+ postfix: string;
185
+ start?: undefined | number;
186
+ }
187
+
188
+ export type Decoder<
189
+ T,
190
+ Output extends ts.ConciseBody = ts.ConciseBody,
191
+ > = (props: {
192
+ input: ts.Expression;
193
+ definition: T;
194
+ explore: IExplore;
195
+ }) => Output;
196
+
197
+ /* -----------------------------------------------------------
198
+ GENERATORS
199
+ ----------------------------------------------------------- */
200
+ export interface IComposed {
201
+ body: ts.ConciseBody;
202
+ parameters: ts.ParameterDeclaration[];
203
+ functions: Record<string, ts.VariableStatement>;
204
+ statements: ts.Statement[];
205
+ response: ts.TypeNode;
206
+ }
207
+ export interface IDecomposed {
208
+ functions: Record<string, ts.VariableStatement>;
209
+ statements: ts.Statement[];
210
+ arrow: ts.ArrowFunction;
211
+ }
212
+
213
+ export const compose = (props: {
214
+ context: ITypiaContext;
215
+ config: IConfig;
216
+ functor: FunctionProgrammer;
217
+ type: ts.Type;
218
+ name: string | undefined;
219
+ }): IComposed => {
220
+ const { collection, metadata } = props.config.initializer(props);
221
+ return {
222
+ body: props.config.decoder({
223
+ input: ValueFactory.INPUT(),
224
+ metadata,
225
+ explore: {
226
+ tracable: props.config.path || props.config.trace,
227
+ source: "top",
228
+ from: "top",
229
+ postfix: '""',
230
+ },
231
+ }),
232
+ statements: props.config.addition
233
+ ? props.config.addition(collection)
234
+ : [],
235
+ functions: {
236
+ ...Object.fromEntries(
237
+ (
238
+ props.config.generator.objects?.(collection) ??
239
+ write_object_functions({
240
+ ...props,
241
+ collection,
242
+ })
243
+ ).map((v, i) => [`${props.config.prefix}o${i}`, v]),
244
+ ),
245
+ ...Object.fromEntries(
246
+ (
247
+ props.config.generator.unions?.(collection) ??
248
+ write_union_functions({
249
+ config: props.config,
250
+ collection,
251
+ })
252
+ ).map((v, i) => [`${props.config.prefix}u${i}`, v]),
253
+ ),
254
+ ...Object.fromEntries(
255
+ props.config.generator
256
+ .arrays(collection)
257
+ .map((v, i) => [`${props.config.prefix}a${i}`, v]),
258
+ ),
259
+ ...Object.fromEntries(
260
+ props.config.generator
261
+ .tuples(collection)
262
+ .map((v, i) => [`${props.config.prefix}t${i}`, v]),
263
+ ),
264
+ },
265
+ parameters: parameterDeclarations({
266
+ config: props.config,
267
+ type: props.config.types.input(props.type, props.name),
268
+ input: ValueFactory.INPUT(),
269
+ }),
270
+ response: props.config.types.output(props.type, props.name),
271
+ };
272
+ };
273
+
274
+ export const writeDecomposed = (props: {
275
+ modulo: ts.LeftHandSideExpression;
276
+ functor: FunctionProgrammer;
277
+ result: IDecomposed;
278
+ returnWrapper?: (arrow: ts.ArrowFunction) => ts.Expression;
279
+ }): ts.CallExpression =>
280
+ ts.factory.createCallExpression(
281
+ ts.factory.createArrowFunction(
282
+ undefined,
283
+ undefined,
284
+ [],
285
+ undefined,
286
+ undefined,
287
+ ts.factory.createBlock([
288
+ ...props.functor.declare(),
289
+ ...Object.entries(props.result.functions)
290
+ .filter(([k]) => props.functor.hasLocal(k))
291
+ .map(([_k, v]) => v),
292
+ ...props.result.statements,
293
+ ts.factory.createReturnStatement(
294
+ props.returnWrapper
295
+ ? props.returnWrapper(props.result.arrow)
296
+ : props.result.arrow,
297
+ ),
298
+ ]),
299
+ ),
300
+ undefined,
301
+ undefined,
302
+ );
303
+
304
+ export const write = (props: {
305
+ context: ITypiaContext;
306
+ config: IConfig;
307
+ functor: FunctionProgrammer;
308
+ type: ts.Type;
309
+ name?: string | undefined;
310
+ }): ts.ArrowFunction => {
311
+ // ITERATE OVER ALL METADATA
312
+ const { collection, metadata } = props.config.initializer(props);
313
+ const output: ts.ConciseBody = props.config.decoder({
314
+ metadata,
315
+ input: ValueFactory.INPUT(),
316
+ explore: {
317
+ tracable: props.config.path || props.config.trace,
318
+ source: "top",
319
+ from: "top",
320
+ postfix: '""',
321
+ },
322
+ });
323
+
324
+ // RETURNS THE OPTIMAL ARROW FUNCTION
325
+ const functions = {
326
+ objects:
327
+ props.config.generator.objects?.(collection) ??
328
+ write_object_functions({
329
+ config: props.config,
330
+ context: props.context,
331
+ collection,
332
+ }),
333
+ unions:
334
+ props.config.generator.unions?.(collection) ??
335
+ write_union_functions({
336
+ config: props.config,
337
+ collection,
338
+ }),
339
+ arrays: props.config.generator.arrays(collection),
340
+ tuples: props.config.generator.tuples(collection),
341
+ };
342
+ const added: ts.Statement[] = (props.config.addition ?? (() => []))(
343
+ collection,
344
+ );
345
+
346
+ return ts.factory.createArrowFunction(
347
+ undefined,
348
+ undefined,
349
+ parameterDeclarations({
350
+ config: props.config,
351
+ type: props.config.types.input(props.type, props.name),
352
+ input: ValueFactory.INPUT(),
353
+ }),
354
+ props.config.types.output(props.type, props.name),
355
+ undefined,
356
+ ts.factory.createBlock(
357
+ [
358
+ ...added,
359
+ ...functions.objects.filter((_, i) =>
360
+ props.functor.hasLocal(`${props.config.prefix}o${i}`),
361
+ ),
362
+ ...functions.unions.filter((_, i) =>
363
+ props.functor.hasLocal(`${props.config.prefix}u${i}`),
364
+ ),
365
+ ...functions.arrays.filter((_, i) =>
366
+ props.functor.hasLocal(`${props.config.prefix}a${i}`),
367
+ ),
368
+ ...functions.tuples.filter((_, i) =>
369
+ props.functor.hasLocal(`${props.config.prefix}t${i}`),
370
+ ),
371
+ ...(ts.isBlock(output)
372
+ ? output.statements
373
+ : [ts.factory.createReturnStatement(output)]),
374
+ ],
375
+ true,
376
+ ),
377
+ );
378
+ };
379
+
380
+ export const write_object_functions = (props: {
381
+ config: IConfig;
382
+ context: ITypiaContext;
383
+ collection: MetadataCollection;
384
+ }) =>
385
+ props.collection.objects().map((object) =>
386
+ StatementFactory.constant({
387
+ name: `${props.config.prefix}o${object.index}`,
388
+ value: ts.factory.createArrowFunction(
389
+ undefined,
390
+ undefined,
391
+ parameterDeclarations({
392
+ config: props.config,
393
+ type: TypeFactory.keyword("any"),
394
+ input: ValueFactory.INPUT(),
395
+ }),
396
+ props.config.objector.type ?? TypeFactory.keyword("any"),
397
+ undefined,
398
+ props.config.objector.joiner({
399
+ input: ts.factory.createIdentifier("input"),
400
+ entries: feature_object_entries({
401
+ config: props.config,
402
+ context: props.context,
403
+ input: ts.factory.createIdentifier("input"),
404
+ object,
405
+ }),
406
+ object,
407
+ }),
408
+ ),
409
+ }),
410
+ );
411
+
412
+ export const write_union_functions = (props: {
413
+ config: IConfig;
414
+ collection: MetadataCollection;
415
+ }) =>
416
+ props.collection.unions().map((union, i) =>
417
+ StatementFactory.constant({
418
+ name: `${props.config.prefix}u${i}`,
419
+ value: write_union({
420
+ config: props.config,
421
+ objects: union,
422
+ }),
423
+ }),
424
+ );
425
+
426
+ const write_union = (props: {
427
+ config: IConfig;
428
+ objects: MetadataObjectType[];
429
+ }) =>
430
+ ts.factory.createArrowFunction(
431
+ undefined,
432
+ undefined,
433
+ parameterDeclarations({
434
+ config: props.config,
435
+ type: TypeFactory.keyword("any"),
436
+ input: ValueFactory.INPUT(),
437
+ }),
438
+ TypeFactory.keyword("any"),
439
+ undefined,
440
+ UnionExplorer.object({
441
+ config: props.config,
442
+ objects: props.objects,
443
+ input: ValueFactory.INPUT(),
444
+ explore: {
445
+ tracable: props.config.path || props.config.trace,
446
+ source: "function",
447
+ from: "object",
448
+ postfix: "",
449
+ },
450
+ }),
451
+ );
452
+
453
+ /* -----------------------------------------------------------
454
+ DECODERS
455
+ ----------------------------------------------------------- */
456
+ export const decode_array = (props: {
457
+ config: Pick<IConfig, "trace" | "path" | "decoder" | "prefix">;
458
+ functor: FunctionProgrammer;
459
+ combiner: (next: {
460
+ input: ts.Expression;
461
+ arrow: ts.ArrowFunction;
462
+ }) => ts.Expression;
463
+ array: MetadataArray;
464
+ input: ts.Expression;
465
+ explore: IExplore;
466
+ }) => {
467
+ const rand: string = props.functor.increment().toString();
468
+ const tail =
469
+ props.config.path || props.config.trace
470
+ ? [
471
+ IdentifierFactory.parameter(
472
+ "_index" + rand,
473
+ TypeFactory.keyword("number"),
474
+ ),
475
+ ]
476
+ : [];
477
+ const arrow: ts.ArrowFunction = ts.factory.createArrowFunction(
478
+ undefined,
479
+ undefined,
480
+ [
481
+ IdentifierFactory.parameter("elem", TypeFactory.keyword("any")),
482
+ ...tail,
483
+ ],
484
+ undefined,
485
+ undefined,
486
+ props.config.decoder({
487
+ input: ValueFactory.INPUT("elem"),
488
+ metadata: props.array.type.value,
489
+ explore: {
490
+ tracable: props.explore.tracable,
491
+ source: props.explore.source,
492
+ from: "array",
493
+ postfix: index({
494
+ start: props.explore.start ?? null,
495
+ postfix: props.explore.postfix,
496
+ rand,
497
+ }),
498
+ },
499
+ }),
500
+ );
501
+ return props.combiner({
502
+ input: props.input,
503
+ arrow,
504
+ });
505
+ };
506
+
507
+ export const decode_object = (props: {
508
+ config: Pick<IConfig, "trace" | "path" | "prefix">;
509
+ functor: FunctionProgrammer;
510
+ object: MetadataObjectType;
511
+ input: ts.Expression;
512
+ explore: IExplore;
513
+ }) =>
514
+ ts.factory.createCallExpression(
515
+ ts.factory.createIdentifier(
516
+ props.functor.useLocal(`${props.config.prefix}o${props.object.index}`),
517
+ ),
518
+ undefined,
519
+ argumentsArray(props),
520
+ );
521
+
522
+ /* -----------------------------------------------------------
523
+ UTILITIES FOR INTERNAL FUNCTIONS
524
+ ----------------------------------------------------------- */
525
+ export const index = (props: {
526
+ start: number | null;
527
+ postfix: string;
528
+ rand: string;
529
+ }) => {
530
+ const tail: string =
531
+ props.start !== null
532
+ ? `"[" + (${props.start} + _index${props.rand}) + "]"`
533
+ : `"[" + _index${props.rand} + "]"`;
534
+ if (props.postfix === "") return tail;
535
+ else if (props.postfix[props.postfix.length - 1] === `"`)
536
+ return (
537
+ props.postfix.substring(0, props.postfix.length - 1) + tail.substring(1)
538
+ );
539
+ return props.postfix + ` + ${tail}`;
540
+ };
541
+
542
+ export const argumentsArray = (props: {
543
+ config: Pick<IConfig, "path" | "trace">;
544
+ input: ts.Expression;
545
+ explore: FeatureProgrammer.IExplore;
546
+ }) => {
547
+ const tail: ts.Expression[] =
548
+ props.config.path === false && props.config.trace === false
549
+ ? []
550
+ : props.config.path === true && props.config.trace === true
551
+ ? [
552
+ ts.factory.createIdentifier(
553
+ props.explore.postfix
554
+ ? `_path + ${props.explore.postfix}`
555
+ : "_path",
556
+ ),
557
+ props.explore.source === "function"
558
+ ? ts.factory.createIdentifier(
559
+ `${props.explore.tracable} && _exceptionable`,
560
+ )
561
+ : props.explore.tracable
562
+ ? ts.factory.createTrue()
563
+ : ts.factory.createFalse(),
564
+ ]
565
+ : props.config.path === true
566
+ ? [
567
+ ts.factory.createIdentifier(
568
+ props.explore.postfix
569
+ ? `_path + ${props.explore.postfix}`
570
+ : "_path",
571
+ ),
572
+ ]
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
+ return [props.input, ...tail];
583
+ };
584
+
585
+ export const parameterDeclarations = (props: {
586
+ config: Pick<CheckerProgrammer.IConfig, "path" | "trace">;
587
+ type: ts.TypeNode;
588
+ input: ts.Identifier;
589
+ }) => {
590
+ const tail: ts.ParameterDeclaration[] = [];
591
+ if (props.config.path)
592
+ tail.push(
593
+ IdentifierFactory.parameter("_path", TypeFactory.keyword("string")),
594
+ );
595
+ if (props.config.trace)
596
+ tail.push(
597
+ IdentifierFactory.parameter(
598
+ "_exceptionable",
599
+ TypeFactory.keyword("boolean"),
600
+ ts.factory.createTrue(),
601
+ ),
602
+ );
603
+ return [IdentifierFactory.parameter(props.input, props.type), ...tail];
604
+ };
605
+ }