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,648 +1,632 @@
1
- import ts from "typescript";
2
-
3
- import { IMetadataTypeTag } from "../schemas/metadata/IMetadataTypeTag";
4
- import { Metadata } from "../schemas/metadata/Metadata";
5
-
6
- import { Writable } from "../typings/Writable";
7
-
8
- import { FormatCheatSheet } from "../tags/internal/FormatCheatSheet";
9
- import { MetadataFactory } from "./MetadataFactory";
10
- import { MetadataTypeTagFactory } from "./MetadataTypeTagFactory";
11
-
12
- /**
13
- * @internal
14
- */
15
- export namespace MetadataCommentTagFactory {
16
- export const analyze = (props: {
17
- errors: MetadataFactory.IError[];
18
- metadata: Metadata;
19
- tags: ts.JSDocTagInfo[];
20
- explore: MetadataFactory.IExplore;
21
- }): void => {
22
- // PREPARE MESSAGE CONTAINER
23
- const messages: string[] = [];
24
- const report = (msg: string) => {
25
- messages.push(msg);
26
- return null;
27
- };
28
- const validateReport = (next: {
29
- property: string | null;
30
- message: string;
31
- }): false => {
32
- messages.push(
33
- `the property ${
34
- next.property === null
35
- ? `["typia.tag"]`
36
- : `["typia.tag.${next.property}"]`
37
- } ${next.message}.`,
38
- );
39
- return false;
40
- };
41
-
42
- // VALIDATE AND CONSTRUCT COMMENT TAGS
43
- for (const tag of props.tags) {
44
- const tagger: TagRecord | null = parse({
45
- report,
46
- tag,
47
- });
48
- if (tagger === null) continue;
49
- for (const [key, value] of Object.entries(tagger)) {
50
- const filtered: IMetadataTypeTag[] = value.filter(
51
- (v) => v.validate !== null,
52
- ) as IMetadataTypeTag[];
53
- if (key === "array") {
54
- if (props.metadata.arrays.length === 0) {
55
- report(`requires array type`);
56
- continue;
57
- }
58
- for (const a of props.metadata.arrays) {
59
- Writable(a).tags = a.tags.filter((x) =>
60
- MetadataTypeTagFactory.validate({
61
- report: validateReport,
62
- type: "array",
63
- tags: [...x, ...filtered],
64
- }),
65
- );
66
- if (a.tags.length === 0) a.tags.push(filtered);
67
- else for (const tags of a.tags) tags.push(...filtered);
68
- }
69
- } else {
70
- const atomic = props.metadata.atomics.find((a) => a.type == key);
71
- if (atomic === undefined)
72
- if (key === "bigint" || key === "number") {
73
- const opposite = key === "bigint" ? "number" : "bigint";
74
- if (
75
- tagger[opposite] !== undefined &&
76
- props.metadata.atomics.some((a) => a.type === opposite)
77
- )
78
- continue;
79
- } else if (
80
- key === "string" &&
81
- value[0]?.kind === "format" &&
82
- value[0]?.value === "date-time"
83
- )
84
- continue;
85
- else report(`requires ${key} type`);
86
- else {
87
- Writable(atomic).tags = atomic.tags.filter((x) =>
88
- MetadataTypeTagFactory.validate({
89
- report: validateReport,
90
- type: key as "string",
91
- tags: [...x, ...filtered],
92
- }),
93
- );
94
- if (atomic.tags.length === 0) atomic.tags.push(filtered);
95
- else for (const tags of atomic.tags) tags.push(...filtered);
96
- }
97
- }
98
- }
99
- }
100
-
101
- // DO REPORT
102
- if (messages.length !== 0)
103
- props.errors.push({
104
- name: "comment tag(s)",
105
- explore: props.explore,
106
- messages,
107
- });
108
- };
109
-
110
- const parse = (props: {
111
- report: (msg: string) => null;
112
- tag: ts.JSDocTagInfo;
113
- }): TagRecord | null => {
114
- const next = PARSER[props.tag.name];
115
- if (next === undefined) return {};
116
-
117
- const value = (props.tag.text || [])[0]?.text;
118
- if (value === undefined && props.tag.name !== "uniqueItems")
119
- return props.report(`no comment tag value`);
120
- return next({
121
- report: props.report,
122
- value: value!,
123
- });
124
- };
125
-
126
- export const get = (props: {
127
- kind: string;
128
- type: "array" | "bigint" | "number" | "string";
129
- value: string;
130
- }): IMetadataTypeTag[] => {
131
- const output: IMetadataTypeTag[] | undefined = PARSER[props.kind]?.({
132
- report: () => null,
133
- value: props.value,
134
- })?.[props.type];
135
- if (output === undefined)
136
- throw new Error(
137
- `no tag found for (kind: ${props.kind}, type: ${props.type}).`,
138
- );
139
- return output;
140
- };
141
- }
142
-
143
- /**
144
- * @internal
145
- */
146
- type TagRecord = {
147
- [P in Target]?: NotDeterminedTypeTag[];
148
- };
149
-
150
- /**
151
- * @internal
152
- */
153
- type Target = "bigint" | "number" | "string" | "array";
154
-
155
- /**
156
- * @internal
157
- */
158
- type NotDeterminedTypeTag = Omit<IMetadataTypeTag, "validate" | "schema"> & {
159
- validate: string | undefined;
160
- schema: object | undefined;
161
- };
162
-
163
- /**
164
- * @internal
165
- */
166
- const PARSER: Record<
167
- string,
168
- (props: { report: (msg: string) => null; value: string }) => {
169
- [P in Target]?: NotDeterminedTypeTag[];
170
- }
171
- > = {
172
- /* -----------------------------------------------------------
173
- ARRAY
174
- ----------------------------------------------------------- */
175
- items: ({ report, value }) => ({
176
- array: [
177
- {
178
- name: `MinItems<${value}>`,
179
- target: "array",
180
- kind: "minItems",
181
- value: parse_integer({
182
- report,
183
- value,
184
- unsigned: true,
185
- }),
186
- validate: `${value} <= $input.length`,
187
- exclusive: true,
188
- schema: {
189
- minItems: parse_integer({
190
- report,
191
- value,
192
- unsigned: true,
193
- }),
194
- },
195
- },
196
- {
197
- name: `MaxItems<${value}>`,
198
- target: "array",
199
- kind: "maxItems",
200
- value: parse_integer({
201
- report,
202
- value,
203
- unsigned: true,
204
- }),
205
- validate: `$input.length <= ${value}`,
206
- exclusive: true,
207
- schema: {
208
- maxItems: parse_integer({
209
- report,
210
- unsigned: true,
211
- value,
212
- }),
213
- },
214
- },
215
- ],
216
- }),
217
- minItems: ({ report, value }) => ({
218
- array: [
219
- {
220
- name: `MinItems<${value}>`,
221
- target: "array",
222
- kind: "minItems",
223
- value: parse_integer({
224
- report,
225
- value,
226
- unsigned: true,
227
- }),
228
- validate: `${value} <= $input.length`,
229
- exclusive: true,
230
- schema: {
231
- minItems: parse_integer({
232
- report,
233
- value,
234
- unsigned: true,
235
- }),
236
- },
237
- },
238
- ],
239
- }),
240
- maxItems: ({ report, value }) => ({
241
- array: [
242
- {
243
- name: `MaxItems<${value}>`,
244
- target: "array",
245
- kind: "maxItems",
246
- value: parse_integer({
247
- report,
248
- value,
249
- unsigned: true,
250
- }),
251
- validate: `$input.length <= ${value}`,
252
- exclusive: true,
253
- schema: {
254
- maxItems: parse_integer({
255
- report,
256
- value,
257
- unsigned: true,
258
- }),
259
- },
260
- },
261
- ],
262
- }),
263
- uniqueItems: () => ({
264
- array: [
265
- {
266
- name: `UniqueItems`,
267
- target: "array",
268
- kind: "uniqueItems",
269
- value: true,
270
- validate: `$input.length <= 1 || (new Set($input).size === $input.length)`,
271
- exclusive: true,
272
- schema: {
273
- uniqueItems: true,
274
- },
275
- },
276
- ],
277
- }),
278
-
279
- /* -----------------------------------------------------------
280
- NUMBER
281
- ----------------------------------------------------------- */
282
- type: ({ value }) => {
283
- // EMENDATIONS
284
- if (value.startsWith("{") && value.endsWith("}"))
285
- value = value.substring(1, value.length - 1);
286
- if (value === "int") value = "int32";
287
- else if (value === "uint") value = "uint32";
288
-
289
- // MUST BE ONE OF THEM
290
- if (
291
- ["int32", "uint32", "int64", "uint64", "float", "double"].includes(
292
- value,
293
- ) === false
294
- )
295
- return {};
296
- return {
297
- number: [
298
- {
299
- name: `Type<${JSON.stringify(value)}>`,
300
- target: "number",
301
- kind: "type",
302
- value: value,
303
- validate:
304
- value === "int32"
305
- ? `Math.floor($input) === $input && -2147483648 <= $input && $input <= 2147483647`
306
- : value === "uint32"
307
- ? `Math.floor($input) === $input && 0 <= $input && $input <= 4294967295`
308
- : value === "int64"
309
- ? `Math.floor($input) === $input && -9223372036854775808 <= $input && $input <= 9223372036854775807`
310
- : value === "uint64"
311
- ? `Math.floor($input) === $input && 0 <= $input && $input <= 18446744073709551615`
312
- : value === "float"
313
- ? `-1.175494351e38 <= $input && $input <= 3.4028235e38`
314
- : `true`,
315
- exclusive: true,
316
- schema: ["int32", "int64"].includes(value)
317
- ? { type: "integer" }
318
- : ["uint32", "uint64"].includes(value)
319
- ? { type: "integer", minimum: 0 }
320
- : undefined,
321
- },
322
- ],
323
- bigint:
324
- value === "int64" || "uint64"
325
- ? [
326
- {
327
- name: `Type<${JSON.stringify(value)}>`,
328
- target: "bigint",
329
- kind: "type",
330
- value: value,
331
- validate: value === "int64" ? "true" : "BigInt(0) <= $input",
332
- exclusive: true,
333
- schema: value === "uint64" ? { minimum: 0 } : undefined,
334
- },
335
- ]
336
- : [],
337
- };
338
- },
339
- minimum: (props) => ({
340
- number: [
341
- {
342
- name: `Minimum<${props.value}>`,
343
- target: "number",
344
- kind: "minimum",
345
- value: parse_number(props),
346
- validate: `${props.value} <= $input`,
347
- exclusive: ["minimum", "exclusiveMinimum"],
348
- schema: {
349
- minimum: parse_number(props),
350
- },
351
- },
352
- ],
353
- bigint: [
354
- {
355
- name: `Minimum<${props.value}n>`,
356
- target: "bigint",
357
- kind: "minimum",
358
- value: (() => {
359
- const parsed = parse_integer({
360
- report: props.report,
361
- value: props.value,
362
- unsigned: false,
363
- });
364
- return parsed === null ? null : BigInt(parsed);
365
- })(),
366
- validate: `${props.value} <= $input`,
367
- exclusive: ["minimum", "exclusiveMinimum"],
368
- schema: {
369
- minimum: parse_number(props),
370
- },
371
- },
372
- ],
373
- }),
374
- maximum: (props) => ({
375
- number: [
376
- {
377
- name: `Maximum<${props.value}>`,
378
- target: "number",
379
- kind: "maximum",
380
- value: parse_number(props),
381
- validate: `$input <= ${props.value}`,
382
- exclusive: ["maximum", "exclusiveMaximum"],
383
- schema: {
384
- maximum: parse_number(props),
385
- },
386
- },
387
- ],
388
- bigint: [
389
- {
390
- name: `Maximum<${props.value}n>`,
391
- target: "bigint",
392
- kind: "maximum",
393
- value: (() => {
394
- const parsed = parse_integer({
395
- report: props.report,
396
- value: props.value,
397
- unsigned: false,
398
- });
399
- return parsed === null ? null : BigInt(parsed);
400
- })(),
401
- validate: `$input <= ${props.value}`,
402
- exclusive: ["maximum", "exclusiveMaximum"],
403
- schema: {
404
- maximum: parse_number(props),
405
- },
406
- },
407
- ],
408
- }),
409
- exclusiveMinimum: (props) => ({
410
- number: [
411
- {
412
- name: `ExclusiveMinimum<${props.value}>`,
413
- target: "number",
414
- kind: "exclusiveMinimum",
415
- value: parse_number(props),
416
- validate: `${props.value} < $input`,
417
- exclusive: ["minimum", "exclusiveMinimum"],
418
- schema: {
419
- exclusiveMinimum: parse_number(props),
420
- },
421
- },
422
- ],
423
- bigint: [
424
- {
425
- name: `ExclusiveMinimum<${props.value}n>`,
426
- target: "bigint",
427
- kind: "exclusiveMinimum",
428
- value: (() => {
429
- const parsed = parse_integer({
430
- report: props.report,
431
- value: props.value,
432
- unsigned: false,
433
- });
434
- return parsed === null ? null : BigInt(parsed);
435
- })(),
436
- validate: `${props.value} < $input`,
437
- exclusive: ["minimum", "exclusiveMinimum"],
438
- schema: {
439
- exclusiveMinimum: parse_number(props),
440
- },
441
- },
442
- ],
443
- }),
444
- exclusiveMaximum: (props) => ({
445
- number: [
446
- {
447
- name: `ExclusiveMaximum<${props.value}>`,
448
- target: "number",
449
- kind: "exclusiveMaximum",
450
- value: parse_number(props),
451
- validate: `$input < ${props.value}`,
452
- exclusive: ["maximum", "exclusiveMaximum"],
453
- schema: {
454
- exclusiveMaximum: parse_number(props),
455
- },
456
- },
457
- ],
458
- bigint: [
459
- {
460
- name: `ExclusiveMaximum<${props.value}n>`,
461
- target: "bigint",
462
- kind: "exclusiveMaximum",
463
- value: (() => {
464
- const parsed = parse_integer({
465
- report: props.report,
466
- value: props.value,
467
- unsigned: false,
468
- });
469
- return parsed === null ? null : BigInt(parsed);
470
- })(),
471
- validate: `$input < ${props.value}`,
472
- exclusive: ["maximum", "exclusiveMaximum"],
473
- schema: {
474
- exclusiveMaximum: parse_number(props),
475
- },
476
- },
477
- ],
478
- }),
479
- multipleOf: (props) => ({
480
- number: [
481
- {
482
- name: `MultipleOf<${props.value}>`,
483
- target: "number",
484
- kind: "multipleOf",
485
- value: parse_number(props),
486
- validate: `$input % ${props.value} === 0`,
487
- exclusive: true,
488
- schema: {
489
- multipleOf: parse_number(props),
490
- },
491
- },
492
- ],
493
- bigint: [
494
- {
495
- name: `MultipleOf<${props.value}n>`,
496
- target: "bigint",
497
- kind: "multipleOf",
498
- value: (() => {
499
- const parsed = parse_integer({
500
- report: props.report,
501
- value: props.value,
502
- unsigned: false,
503
- });
504
- return parsed === null ? null : BigInt(parsed);
505
- })(),
506
- validate: `$input % ${props.value}n === 0n`,
507
- exclusive: true,
508
- schema: {
509
- multipleOf: parse_number(props),
510
- },
511
- },
512
- ],
513
- }),
514
-
515
- /* -----------------------------------------------------------
516
- STRING
517
- ----------------------------------------------------------- */
518
- format: ({ value }) => {
519
- const matched = FORMATS.get(value);
520
- if (matched === undefined) return {};
521
- return {
522
- string: [
523
- {
524
- name: `Format<${JSON.stringify(matched[0])}>`,
525
- target: "string",
526
- kind: "format",
527
- value: matched[0],
528
- validate: matched[1],
529
- exclusive: true,
530
- schema: {
531
- format: matched[0],
532
- },
533
- },
534
- ],
535
- };
536
- },
537
- pattern: ({ value }) => ({
538
- string: [
539
- {
540
- name: `Pattern<${JSON.stringify(value)}>`,
541
- target: "string",
542
- kind: "pattern",
543
- value: value,
544
- validate: `RegExp(${JSON.stringify(value)}).test($input)`,
545
- exclusive: ["format"],
546
- schema: {
547
- pattern: value,
548
- },
549
- },
550
- ],
551
- }),
552
- length: (props) => ({
553
- string: [
554
- {
555
- name: `MinLength<${props.value}>`,
556
- target: "string",
557
- kind: "minLength",
558
- value: parse_number(props),
559
- validate: `${props.value} <= $input.length`,
560
- exclusive: true,
561
- schema: {
562
- minLength: parse_number(props),
563
- },
564
- },
565
- {
566
- name: `MaxLength<${props.value}>`,
567
- target: "string",
568
- kind: "maxLength",
569
- value: parse_number(props),
570
- validate: `$input.length <= ${props.value}`,
571
- exclusive: true,
572
- schema: {
573
- maxLength: parse_number(props),
574
- },
575
- },
576
- ],
577
- }),
578
- minLength: ({ report, value }) => ({
579
- string: [
580
- {
581
- name: `MinLength<${value}>`,
582
- target: "string",
583
- kind: "minLength",
584
- value: parse_number({ report, value }),
585
- validate: `${value} <= $input.length`,
586
- exclusive: true,
587
- schema: {
588
- minLength: parse_number({ report, value }),
589
- },
590
- },
591
- ],
592
- }),
593
- maxLength: ({ report, value }) => ({
594
- string: [
595
- {
596
- name: `MaxLength<${value}>`,
597
- target: "string",
598
- kind: "maxLength",
599
- value: parse_number({ report, value }),
600
- validate: `$input.length <= ${value}`,
601
- exclusive: true,
602
- schema: {
603
- maxLength: parse_number({ report, value }),
604
- },
605
- },
606
- ],
607
- }),
608
- };
609
-
610
- /**
611
- * @internal
612
- */
613
- const parse_number = (props: {
614
- report: (msg: string) => null;
615
- value: string;
616
- }): number | null => {
617
- const parsed: number = Number(props.value);
618
- if (isNaN(parsed) === true) return props.report(`invalid number`);
619
- return parsed;
620
- };
621
-
622
- /**
623
- * @internal
624
- */
625
- const parse_integer = (props: {
626
- report: (msg: string) => null;
627
- unsigned: boolean;
628
- value: string;
629
- }): number | null => {
630
- const parsed: number | null = parse_number(props);
631
- if (parsed === null) return null;
632
- else if (Math.floor(parsed) !== parsed)
633
- return props.report(`invalid integer`);
634
- else if (props.unsigned === true && parsed < 0)
635
- return props.report(`invalid unsigned integer`);
636
- return parsed;
637
- };
638
-
639
- /**
640
- * @internal
641
- */
642
- const FORMATS: Map<string, [string, string]> = new Map([
643
- ...Object.entries(FormatCheatSheet).map(
644
- ([key, value]) => [key, [key, value]] as any,
645
- ),
646
- ["datetime", ["date-time", `!isNaN(new Date($input).getTime())`]],
647
- ["dateTime", ["date-time", `!isNaN(new Date($input).getTime())`]],
648
- ]);
1
+ import ts from "typescript";
2
+
3
+ import { IMetadataTypeTag } from "../schemas/metadata/IMetadataTypeTag";
4
+ import { Metadata } from "../schemas/metadata/Metadata";
5
+
6
+ import { Writable } from "../typings/Writable";
7
+
8
+ import { FormatCheatSheet } from "../tags/internal/FormatCheatSheet";
9
+ import { MetadataFactory } from "./MetadataFactory";
10
+ import { MetadataTypeTagFactory } from "./MetadataTypeTagFactory";
11
+
12
+ /** @internal */
13
+ export namespace MetadataCommentTagFactory {
14
+ export const analyze = (props: {
15
+ errors: MetadataFactory.IError[];
16
+ metadata: Metadata;
17
+ tags: ts.JSDocTagInfo[];
18
+ explore: MetadataFactory.IExplore;
19
+ }): void => {
20
+ // PREPARE MESSAGE CONTAINER
21
+ const messages: string[] = [];
22
+ const report = (msg: string) => {
23
+ messages.push(msg);
24
+ return null;
25
+ };
26
+ const validateReport = (next: {
27
+ property: string | null;
28
+ message: string;
29
+ }): false => {
30
+ messages.push(
31
+ `the property ${
32
+ next.property === null
33
+ ? `["typia.tag"]`
34
+ : `["typia.tag.${next.property}"]`
35
+ } ${next.message}.`,
36
+ );
37
+ return false;
38
+ };
39
+
40
+ // VALIDATE AND CONSTRUCT COMMENT TAGS
41
+ for (const tag of props.tags) {
42
+ const tagger: TagRecord | null = parse({
43
+ report,
44
+ tag,
45
+ });
46
+ if (tagger === null) continue;
47
+ for (const [key, value] of Object.entries(tagger)) {
48
+ const filtered: IMetadataTypeTag[] = value.filter(
49
+ (v) => v.validate !== null,
50
+ ) as IMetadataTypeTag[];
51
+ if (key === "array") {
52
+ if (props.metadata.arrays.length === 0) {
53
+ report(`requires array type`);
54
+ continue;
55
+ }
56
+ for (const a of props.metadata.arrays) {
57
+ Writable(a).tags = a.tags.filter((x) =>
58
+ MetadataTypeTagFactory.validate({
59
+ report: validateReport,
60
+ type: "array",
61
+ tags: [...x, ...filtered],
62
+ }),
63
+ );
64
+ if (a.tags.length === 0) a.tags.push(filtered);
65
+ else for (const tags of a.tags) tags.push(...filtered);
66
+ }
67
+ } else {
68
+ const atomic = props.metadata.atomics.find((a) => a.type == key);
69
+ if (atomic === undefined)
70
+ if (key === "bigint" || key === "number") {
71
+ const opposite = key === "bigint" ? "number" : "bigint";
72
+ if (
73
+ tagger[opposite] !== undefined &&
74
+ props.metadata.atomics.some((a) => a.type === opposite)
75
+ )
76
+ continue;
77
+ } else if (
78
+ key === "string" &&
79
+ value[0]?.kind === "format" &&
80
+ value[0]?.value === "date-time"
81
+ )
82
+ continue;
83
+ else report(`requires ${key} type`);
84
+ else {
85
+ Writable(atomic).tags = atomic.tags.filter((x) =>
86
+ MetadataTypeTagFactory.validate({
87
+ report: validateReport,
88
+ type: key as "string",
89
+ tags: [...x, ...filtered],
90
+ }),
91
+ );
92
+ if (atomic.tags.length === 0) atomic.tags.push(filtered);
93
+ else for (const tags of atomic.tags) tags.push(...filtered);
94
+ }
95
+ }
96
+ }
97
+ }
98
+
99
+ // DO REPORT
100
+ if (messages.length !== 0)
101
+ props.errors.push({
102
+ name: "comment tag(s)",
103
+ explore: props.explore,
104
+ messages,
105
+ });
106
+ };
107
+
108
+ const parse = (props: {
109
+ report: (msg: string) => null;
110
+ tag: ts.JSDocTagInfo;
111
+ }): TagRecord | null => {
112
+ const next = PARSER[props.tag.name];
113
+ if (next === undefined) return {};
114
+
115
+ const value = (props.tag.text || [])[0]?.text;
116
+ if (value === undefined && props.tag.name !== "uniqueItems")
117
+ return props.report(`no comment tag value`);
118
+ return next({
119
+ report: props.report,
120
+ value: value!,
121
+ });
122
+ };
123
+
124
+ export const get = (props: {
125
+ kind: string;
126
+ type: "array" | "bigint" | "number" | "string";
127
+ value: string;
128
+ }): IMetadataTypeTag[] => {
129
+ const output: IMetadataTypeTag[] | undefined = PARSER[props.kind]?.({
130
+ report: () => null,
131
+ value: props.value,
132
+ })?.[props.type];
133
+ if (output === undefined)
134
+ throw new Error(
135
+ `no tag found for (kind: ${props.kind}, type: ${props.type}).`,
136
+ );
137
+ return output;
138
+ };
139
+ }
140
+
141
+ /** @internal */
142
+ type TagRecord = {
143
+ [P in Target]?: NotDeterminedTypeTag[];
144
+ };
145
+
146
+ /** @internal */
147
+ type Target = "bigint" | "number" | "string" | "array";
148
+
149
+ /** @internal */
150
+ type NotDeterminedTypeTag = Omit<IMetadataTypeTag, "validate" | "schema"> & {
151
+ validate: string | undefined;
152
+ schema: object | undefined;
153
+ };
154
+
155
+ /** @internal */
156
+ const PARSER: Record<
157
+ string,
158
+ (props: { report: (msg: string) => null; value: string }) => {
159
+ [P in Target]?: NotDeterminedTypeTag[];
160
+ }
161
+ > = {
162
+ /* -----------------------------------------------------------
163
+ ARRAY
164
+ ----------------------------------------------------------- */
165
+ items: ({ report, value }) => ({
166
+ array: [
167
+ {
168
+ name: `MinItems<${value}>`,
169
+ target: "array",
170
+ kind: "minItems",
171
+ value: parse_integer({
172
+ report,
173
+ value,
174
+ unsigned: true,
175
+ }),
176
+ validate: `${value} <= $input.length`,
177
+ exclusive: true,
178
+ schema: {
179
+ minItems: parse_integer({
180
+ report,
181
+ value,
182
+ unsigned: true,
183
+ }),
184
+ },
185
+ },
186
+ {
187
+ name: `MaxItems<${value}>`,
188
+ target: "array",
189
+ kind: "maxItems",
190
+ value: parse_integer({
191
+ report,
192
+ value,
193
+ unsigned: true,
194
+ }),
195
+ validate: `$input.length <= ${value}`,
196
+ exclusive: true,
197
+ schema: {
198
+ maxItems: parse_integer({
199
+ report,
200
+ unsigned: true,
201
+ value,
202
+ }),
203
+ },
204
+ },
205
+ ],
206
+ }),
207
+ minItems: ({ report, value }) => ({
208
+ array: [
209
+ {
210
+ name: `MinItems<${value}>`,
211
+ target: "array",
212
+ kind: "minItems",
213
+ value: parse_integer({
214
+ report,
215
+ value,
216
+ unsigned: true,
217
+ }),
218
+ validate: `${value} <= $input.length`,
219
+ exclusive: true,
220
+ schema: {
221
+ minItems: parse_integer({
222
+ report,
223
+ value,
224
+ unsigned: true,
225
+ }),
226
+ },
227
+ },
228
+ ],
229
+ }),
230
+ maxItems: ({ report, value }) => ({
231
+ array: [
232
+ {
233
+ name: `MaxItems<${value}>`,
234
+ target: "array",
235
+ kind: "maxItems",
236
+ value: parse_integer({
237
+ report,
238
+ value,
239
+ unsigned: true,
240
+ }),
241
+ validate: `$input.length <= ${value}`,
242
+ exclusive: true,
243
+ schema: {
244
+ maxItems: parse_integer({
245
+ report,
246
+ value,
247
+ unsigned: true,
248
+ }),
249
+ },
250
+ },
251
+ ],
252
+ }),
253
+ uniqueItems: () => ({
254
+ array: [
255
+ {
256
+ name: `UniqueItems`,
257
+ target: "array",
258
+ kind: "uniqueItems",
259
+ value: true,
260
+ validate: `$input.length <= 1 || (new Set($input).size === $input.length)`,
261
+ exclusive: true,
262
+ schema: {
263
+ uniqueItems: true,
264
+ },
265
+ },
266
+ ],
267
+ }),
268
+
269
+ /* -----------------------------------------------------------
270
+ NUMBER
271
+ ----------------------------------------------------------- */
272
+ type: ({ value }) => {
273
+ // EMENDATIONS
274
+ if (value.startsWith("{") && value.endsWith("}"))
275
+ value = value.substring(1, value.length - 1);
276
+ if (value === "int") value = "int32";
277
+ else if (value === "uint") value = "uint32";
278
+
279
+ // MUST BE ONE OF THEM
280
+ if (
281
+ ["int32", "uint32", "int64", "uint64", "float", "double"].includes(
282
+ value,
283
+ ) === false
284
+ )
285
+ return {};
286
+ return {
287
+ number: [
288
+ {
289
+ name: `Type<${JSON.stringify(value)}>`,
290
+ target: "number",
291
+ kind: "type",
292
+ value: value,
293
+ validate:
294
+ value === "int32"
295
+ ? `Math.floor($input) === $input && -2147483648 <= $input && $input <= 2147483647`
296
+ : value === "uint32"
297
+ ? `Math.floor($input) === $input && 0 <= $input && $input <= 4294967295`
298
+ : value === "int64"
299
+ ? `Math.floor($input) === $input && -9223372036854775808 <= $input && $input <= 9223372036854775807`
300
+ : value === "uint64"
301
+ ? `Math.floor($input) === $input && 0 <= $input && $input <= 18446744073709551615`
302
+ : value === "float"
303
+ ? `-1.175494351e38 <= $input && $input <= 3.4028235e38`
304
+ : `true`,
305
+ exclusive: true,
306
+ schema: ["int32", "int64"].includes(value)
307
+ ? { type: "integer" }
308
+ : ["uint32", "uint64"].includes(value)
309
+ ? { type: "integer", minimum: 0 }
310
+ : undefined,
311
+ },
312
+ ],
313
+ bigint:
314
+ value === "int64" || "uint64"
315
+ ? [
316
+ {
317
+ name: `Type<${JSON.stringify(value)}>`,
318
+ target: "bigint",
319
+ kind: "type",
320
+ value: value,
321
+ validate: value === "int64" ? "true" : "BigInt(0) <= $input",
322
+ exclusive: true,
323
+ schema: value === "uint64" ? { minimum: 0 } : undefined,
324
+ },
325
+ ]
326
+ : [],
327
+ };
328
+ },
329
+ minimum: (props) => ({
330
+ number: [
331
+ {
332
+ name: `Minimum<${props.value}>`,
333
+ target: "number",
334
+ kind: "minimum",
335
+ value: parse_number(props),
336
+ validate: `${props.value} <= $input`,
337
+ exclusive: ["minimum", "exclusiveMinimum"],
338
+ schema: {
339
+ minimum: parse_number(props),
340
+ },
341
+ },
342
+ ],
343
+ bigint: [
344
+ {
345
+ name: `Minimum<${props.value}n>`,
346
+ target: "bigint",
347
+ kind: "minimum",
348
+ value: (() => {
349
+ const parsed = parse_integer({
350
+ report: props.report,
351
+ value: props.value,
352
+ unsigned: false,
353
+ });
354
+ return parsed === null ? null : BigInt(parsed);
355
+ })(),
356
+ validate: `${props.value} <= $input`,
357
+ exclusive: ["minimum", "exclusiveMinimum"],
358
+ schema: {
359
+ minimum: parse_number(props),
360
+ },
361
+ },
362
+ ],
363
+ }),
364
+ maximum: (props) => ({
365
+ number: [
366
+ {
367
+ name: `Maximum<${props.value}>`,
368
+ target: "number",
369
+ kind: "maximum",
370
+ value: parse_number(props),
371
+ validate: `$input <= ${props.value}`,
372
+ exclusive: ["maximum", "exclusiveMaximum"],
373
+ schema: {
374
+ maximum: parse_number(props),
375
+ },
376
+ },
377
+ ],
378
+ bigint: [
379
+ {
380
+ name: `Maximum<${props.value}n>`,
381
+ target: "bigint",
382
+ kind: "maximum",
383
+ value: (() => {
384
+ const parsed = parse_integer({
385
+ report: props.report,
386
+ value: props.value,
387
+ unsigned: false,
388
+ });
389
+ return parsed === null ? null : BigInt(parsed);
390
+ })(),
391
+ validate: `$input <= ${props.value}`,
392
+ exclusive: ["maximum", "exclusiveMaximum"],
393
+ schema: {
394
+ maximum: parse_number(props),
395
+ },
396
+ },
397
+ ],
398
+ }),
399
+ exclusiveMinimum: (props) => ({
400
+ number: [
401
+ {
402
+ name: `ExclusiveMinimum<${props.value}>`,
403
+ target: "number",
404
+ kind: "exclusiveMinimum",
405
+ value: parse_number(props),
406
+ validate: `${props.value} < $input`,
407
+ exclusive: ["minimum", "exclusiveMinimum"],
408
+ schema: {
409
+ exclusiveMinimum: parse_number(props),
410
+ },
411
+ },
412
+ ],
413
+ bigint: [
414
+ {
415
+ name: `ExclusiveMinimum<${props.value}n>`,
416
+ target: "bigint",
417
+ kind: "exclusiveMinimum",
418
+ value: (() => {
419
+ const parsed = parse_integer({
420
+ report: props.report,
421
+ value: props.value,
422
+ unsigned: false,
423
+ });
424
+ return parsed === null ? null : BigInt(parsed);
425
+ })(),
426
+ validate: `${props.value} < $input`,
427
+ exclusive: ["minimum", "exclusiveMinimum"],
428
+ schema: {
429
+ exclusiveMinimum: parse_number(props),
430
+ },
431
+ },
432
+ ],
433
+ }),
434
+ exclusiveMaximum: (props) => ({
435
+ number: [
436
+ {
437
+ name: `ExclusiveMaximum<${props.value}>`,
438
+ target: "number",
439
+ kind: "exclusiveMaximum",
440
+ value: parse_number(props),
441
+ validate: `$input < ${props.value}`,
442
+ exclusive: ["maximum", "exclusiveMaximum"],
443
+ schema: {
444
+ exclusiveMaximum: parse_number(props),
445
+ },
446
+ },
447
+ ],
448
+ bigint: [
449
+ {
450
+ name: `ExclusiveMaximum<${props.value}n>`,
451
+ target: "bigint",
452
+ kind: "exclusiveMaximum",
453
+ value: (() => {
454
+ const parsed = parse_integer({
455
+ report: props.report,
456
+ value: props.value,
457
+ unsigned: false,
458
+ });
459
+ return parsed === null ? null : BigInt(parsed);
460
+ })(),
461
+ validate: `$input < ${props.value}`,
462
+ exclusive: ["maximum", "exclusiveMaximum"],
463
+ schema: {
464
+ exclusiveMaximum: parse_number(props),
465
+ },
466
+ },
467
+ ],
468
+ }),
469
+ multipleOf: (props) => ({
470
+ number: [
471
+ {
472
+ name: `MultipleOf<${props.value}>`,
473
+ target: "number",
474
+ kind: "multipleOf",
475
+ value: parse_number(props),
476
+ validate: `$input % ${props.value} === 0`,
477
+ exclusive: true,
478
+ schema: {
479
+ multipleOf: parse_number(props),
480
+ },
481
+ },
482
+ ],
483
+ bigint: [
484
+ {
485
+ name: `MultipleOf<${props.value}n>`,
486
+ target: "bigint",
487
+ kind: "multipleOf",
488
+ value: (() => {
489
+ const parsed = parse_integer({
490
+ report: props.report,
491
+ value: props.value,
492
+ unsigned: false,
493
+ });
494
+ return parsed === null ? null : BigInt(parsed);
495
+ })(),
496
+ validate: `$input % ${props.value}n === 0n`,
497
+ exclusive: true,
498
+ schema: {
499
+ multipleOf: parse_number(props),
500
+ },
501
+ },
502
+ ],
503
+ }),
504
+
505
+ /* -----------------------------------------------------------
506
+ STRING
507
+ ----------------------------------------------------------- */
508
+ format: ({ value }) => {
509
+ const matched = FORMATS.get(value);
510
+ if (matched === undefined) return {};
511
+ return {
512
+ string: [
513
+ {
514
+ name: `Format<${JSON.stringify(matched[0])}>`,
515
+ target: "string",
516
+ kind: "format",
517
+ value: matched[0],
518
+ validate: matched[1],
519
+ exclusive: true,
520
+ schema: {
521
+ format: matched[0],
522
+ },
523
+ },
524
+ ],
525
+ };
526
+ },
527
+ pattern: ({ value }) => ({
528
+ string: [
529
+ {
530
+ name: `Pattern<${JSON.stringify(value)}>`,
531
+ target: "string",
532
+ kind: "pattern",
533
+ value: value,
534
+ validate: `RegExp(${JSON.stringify(value)}).test($input)`,
535
+ exclusive: ["format"],
536
+ schema: {
537
+ pattern: value,
538
+ },
539
+ },
540
+ ],
541
+ }),
542
+ length: (props) => ({
543
+ string: [
544
+ {
545
+ name: `MinLength<${props.value}>`,
546
+ target: "string",
547
+ kind: "minLength",
548
+ value: parse_number(props),
549
+ validate: `${props.value} <= $input.length`,
550
+ exclusive: true,
551
+ schema: {
552
+ minLength: parse_number(props),
553
+ },
554
+ },
555
+ {
556
+ name: `MaxLength<${props.value}>`,
557
+ target: "string",
558
+ kind: "maxLength",
559
+ value: parse_number(props),
560
+ validate: `$input.length <= ${props.value}`,
561
+ exclusive: true,
562
+ schema: {
563
+ maxLength: parse_number(props),
564
+ },
565
+ },
566
+ ],
567
+ }),
568
+ minLength: ({ report, value }) => ({
569
+ string: [
570
+ {
571
+ name: `MinLength<${value}>`,
572
+ target: "string",
573
+ kind: "minLength",
574
+ value: parse_number({ report, value }),
575
+ validate: `${value} <= $input.length`,
576
+ exclusive: true,
577
+ schema: {
578
+ minLength: parse_number({ report, value }),
579
+ },
580
+ },
581
+ ],
582
+ }),
583
+ maxLength: ({ report, value }) => ({
584
+ string: [
585
+ {
586
+ name: `MaxLength<${value}>`,
587
+ target: "string",
588
+ kind: "maxLength",
589
+ value: parse_number({ report, value }),
590
+ validate: `$input.length <= ${value}`,
591
+ exclusive: true,
592
+ schema: {
593
+ maxLength: parse_number({ report, value }),
594
+ },
595
+ },
596
+ ],
597
+ }),
598
+ };
599
+
600
+ /** @internal */
601
+ const parse_number = (props: {
602
+ report: (msg: string) => null;
603
+ value: string;
604
+ }): number | null => {
605
+ const parsed: number = Number(props.value);
606
+ if (isNaN(parsed) === true) return props.report(`invalid number`);
607
+ return parsed;
608
+ };
609
+
610
+ /** @internal */
611
+ const parse_integer = (props: {
612
+ report: (msg: string) => null;
613
+ unsigned: boolean;
614
+ value: string;
615
+ }): number | null => {
616
+ const parsed: number | null = parse_number(props);
617
+ if (parsed === null) return null;
618
+ else if (Math.floor(parsed) !== parsed)
619
+ return props.report(`invalid integer`);
620
+ else if (props.unsigned === true && parsed < 0)
621
+ return props.report(`invalid unsigned integer`);
622
+ return parsed;
623
+ };
624
+
625
+ /** @internal */
626
+ const FORMATS: Map<string, [string, string]> = new Map([
627
+ ...Object.entries(FormatCheatSheet).map(
628
+ ([key, value]) => [key, [key, value]] as any,
629
+ ),
630
+ ["datetime", ["date-time", `!isNaN(new Date($input).getTime())`]],
631
+ ["dateTime", ["date-time", `!isNaN(new Date($input).getTime())`]],
632
+ ]);