typia 3.3.12 → 3.4.0-dev.20221212

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 (422) hide show
  1. package/README.md +169 -403
  2. package/lib/IValidation.d.ts +10 -4
  3. package/lib/Primitive.d.ts +45 -0
  4. package/lib/Primitive.js +3 -0
  5. package/lib/Primitive.js.map +1 -0
  6. package/lib/executable/internal/TypiaSetupWizard.d.ts +4 -0
  7. package/lib/executable/internal/TypiaSetupWizard.js +200 -0
  8. package/lib/executable/internal/TypiaSetupWizard.js.map +1 -0
  9. package/lib/executable/typia.d.ts +1 -0
  10. package/lib/executable/typia.js +98 -0
  11. package/lib/executable/typia.js.map +1 -0
  12. package/lib/factories/CommentFactory.js +1 -1
  13. package/lib/factories/CommentFactory.js.map +1 -1
  14. package/lib/factories/ExpressionFactory.d.ts +1 -0
  15. package/lib/factories/ExpressionFactory.js +4 -0
  16. package/lib/factories/ExpressionFactory.js.map +1 -1
  17. package/lib/factories/IdentifierFactory.d.ts +1 -1
  18. package/lib/factories/IdentifierFactory.js +4 -2
  19. package/lib/factories/IdentifierFactory.js.map +1 -1
  20. package/lib/factories/MetadataCollection.d.ts +2 -1
  21. package/lib/factories/MetadataCollection.js +24 -5
  22. package/lib/factories/MetadataCollection.js.map +1 -1
  23. package/lib/factories/MetadataTagFactory.js +1 -1
  24. package/lib/factories/MetadataTagFactory.js.map +1 -1
  25. package/lib/factories/StatementFactory.d.ts +1 -3
  26. package/lib/factories/StatementFactory.js +3 -13
  27. package/lib/factories/StatementFactory.js.map +1 -1
  28. package/lib/factories/TemplateFactory.js +4 -0
  29. package/lib/factories/TemplateFactory.js.map +1 -1
  30. package/lib/factories/TypeFactory.d.ts +2 -1
  31. package/lib/factories/TypeFactory.js +14 -7
  32. package/lib/factories/TypeFactory.js.map +1 -1
  33. package/lib/factories/internal/explore_metadata.js +1 -1
  34. package/lib/factories/internal/explore_metadata.js.map +1 -1
  35. package/lib/factories/internal/iterate_metadata.js +12 -3
  36. package/lib/factories/internal/iterate_metadata.js.map +1 -1
  37. package/lib/factories/internal/iterate_metadata_array.js +2 -3
  38. package/lib/factories/internal/iterate_metadata_array.js.map +1 -1
  39. package/lib/factories/internal/iterate_metadata_atomic.js +30 -55
  40. package/lib/factories/internal/iterate_metadata_atomic.js.map +1 -1
  41. package/lib/factories/internal/iterate_metadata_coalesce.js +2 -3
  42. package/lib/factories/internal/iterate_metadata_coalesce.js.map +1 -1
  43. package/lib/factories/internal/iterate_metadata_map.d.ts +5 -0
  44. package/lib/factories/internal/iterate_metadata_map.js +30 -0
  45. package/lib/factories/internal/iterate_metadata_map.js.map +1 -0
  46. package/lib/factories/internal/iterate_metadata_native.d.ts +3 -0
  47. package/lib/factories/internal/iterate_metadata_native.js +230 -0
  48. package/lib/factories/internal/iterate_metadata_native.js.map +1 -0
  49. package/lib/factories/internal/iterate_metadata_set.d.ts +5 -0
  50. package/lib/factories/internal/iterate_metadata_set.js +26 -0
  51. package/lib/factories/internal/iterate_metadata_set.js.map +1 -0
  52. package/lib/factories/internal/iterate_metadata_tuple.d.ts +1 -1
  53. package/lib/factories/internal/iterate_metadata_tuple.js +25 -3
  54. package/lib/factories/internal/iterate_metadata_tuple.js.map +1 -1
  55. package/lib/functional/$every.d.ts +2 -0
  56. package/lib/functional/$every.js +12 -0
  57. package/lib/functional/$every.js.map +1 -0
  58. package/lib/functional/$guard.d.ts +1 -0
  59. package/lib/functional/$guard.js +18 -0
  60. package/lib/functional/$guard.js.map +1 -0
  61. package/lib/functional/$number.js +4 -4
  62. package/lib/functional/$number.js.map +1 -1
  63. package/lib/functional/$report.d.ts +2 -0
  64. package/lib/functional/$report.js +18 -0
  65. package/lib/functional/$report.js.map +1 -0
  66. package/lib/functional/$rest.d.ts +1 -0
  67. package/lib/functional/$rest.js +8 -0
  68. package/lib/functional/$rest.js.map +1 -0
  69. package/lib/index.d.ts +2 -2
  70. package/lib/index.js +2 -2
  71. package/lib/index.js.map +1 -1
  72. package/lib/metadata/IMetadata.d.ts +5 -0
  73. package/lib/metadata/IMetadataApplication.d.ts +6 -0
  74. package/lib/metadata/IMetadataApplication.js +3 -0
  75. package/lib/metadata/IMetadataApplication.js.map +1 -0
  76. package/lib/metadata/IMetadataConstant.d.ts +1 -1
  77. package/lib/metadata/IMetadataEntry.d.ts +5 -0
  78. package/lib/metadata/IMetadataEntry.js +3 -0
  79. package/lib/metadata/IMetadataEntry.js.map +1 -0
  80. package/lib/metadata/IMetadataTag.d.ts +1 -1
  81. package/lib/metadata/Metadata.d.ts +10 -0
  82. package/lib/metadata/Metadata.js +156 -59
  83. package/lib/metadata/Metadata.js.map +1 -1
  84. package/lib/metadata/MetadataObject.d.ts +0 -1
  85. package/lib/metadata/MetadataObject.js +10 -0
  86. package/lib/metadata/MetadataObject.js.map +1 -1
  87. package/lib/module.d.ts +603 -72
  88. package/lib/module.js +185 -23
  89. package/lib/module.js.map +1 -1
  90. package/lib/programmers/ApplicationProgrammer.js +2 -2
  91. package/lib/programmers/ApplicationProgrammer.js.map +1 -1
  92. package/lib/programmers/AssertParseProgrammer.d.ts +5 -0
  93. package/lib/programmers/AssertParseProgrammer.js +23 -0
  94. package/lib/programmers/AssertParseProgrammer.js.map +1 -0
  95. package/lib/programmers/AssertProgrammer.d.ts +1 -1
  96. package/lib/programmers/AssertProgrammer.js +133 -58
  97. package/lib/programmers/AssertProgrammer.js.map +1 -1
  98. package/lib/programmers/AssertStringifyProgrammer.d.ts +5 -0
  99. package/lib/programmers/AssertStringifyProgrammer.js +26 -0
  100. package/lib/programmers/AssertStringifyProgrammer.js.map +1 -0
  101. package/lib/programmers/CheckerProgrammer.d.ts +17 -7
  102. package/lib/programmers/CheckerProgrammer.js +284 -79
  103. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  104. package/lib/programmers/FeatureProgrammer.d.ts +14 -9
  105. package/lib/programmers/FeatureProgrammer.js +76 -116
  106. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  107. package/lib/programmers/IsParseProgrammer.d.ts +5 -0
  108. package/lib/programmers/IsParseProgrammer.js +23 -0
  109. package/lib/programmers/IsParseProgrammer.js.map +1 -0
  110. package/lib/programmers/IsProgrammer.d.ts +5 -4
  111. package/lib/programmers/IsProgrammer.js +69 -44
  112. package/lib/programmers/IsProgrammer.js.map +1 -1
  113. package/lib/programmers/IsStringifyProgrammer.d.ts +5 -0
  114. package/lib/programmers/IsStringifyProgrammer.js +24 -0
  115. package/lib/programmers/IsStringifyProgrammer.js.map +1 -0
  116. package/lib/programmers/StringifyProgrammer.js +118 -47
  117. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  118. package/lib/programmers/ValidateParseProgrammer.d.ts +5 -0
  119. package/lib/programmers/ValidateParseProgrammer.js +24 -0
  120. package/lib/programmers/ValidateParseProgrammer.js.map +1 -0
  121. package/lib/programmers/ValidateProgrammer.d.ts +1 -1
  122. package/lib/programmers/ValidateProgrammer.js +124 -68
  123. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  124. package/lib/programmers/ValidateStringifyProgrammer.d.ts +5 -0
  125. package/lib/programmers/ValidateStringifyProgrammer.js +26 -0
  126. package/lib/programmers/ValidateStringifyProgrammer.js.map +1 -0
  127. package/lib/programmers/helpers/AtomicPredicator.d.ts +6 -0
  128. package/lib/programmers/helpers/AtomicPredicator.js +16 -0
  129. package/lib/programmers/helpers/AtomicPredicator.js.map +1 -0
  130. package/lib/programmers/helpers/FunctionImporeter.js +1 -1
  131. package/lib/programmers/helpers/FunctionImporeter.js.map +1 -1
  132. package/lib/programmers/helpers/OptionPredicator.d.ts +1 -1
  133. package/lib/programmers/helpers/OptionPredicator.js +7 -7
  134. package/lib/programmers/helpers/OptionPredicator.js.map +1 -1
  135. package/lib/programmers/helpers/StringifyJoinder.d.ts +2 -2
  136. package/lib/programmers/helpers/StringifyJoinder.js +5 -2
  137. package/lib/programmers/helpers/StringifyJoinder.js.map +1 -1
  138. package/lib/programmers/helpers/UnionExplorer.d.ts +33 -4
  139. package/lib/programmers/helpers/UnionExplorer.js +85 -47
  140. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  141. package/lib/programmers/internal/application_array.js +1 -1
  142. package/lib/programmers/internal/application_array.js.map +1 -1
  143. package/lib/programmers/internal/application_default.js +1 -1
  144. package/lib/programmers/internal/application_default.js.map +1 -1
  145. package/lib/programmers/internal/application_native.d.ts +4 -0
  146. package/lib/programmers/internal/application_native.js +35 -0
  147. package/lib/programmers/internal/application_native.js.map +1 -0
  148. package/lib/programmers/internal/application_number.js +6 -2
  149. package/lib/programmers/internal/application_number.js.map +1 -1
  150. package/lib/programmers/internal/application_object.js +44 -31
  151. package/lib/programmers/internal/application_object.js.map +1 -1
  152. package/lib/programmers/internal/application_schema.js +70 -36
  153. package/lib/programmers/internal/application_schema.js.map +1 -1
  154. package/lib/programmers/internal/application_string.js +2 -2
  155. package/lib/programmers/internal/application_string.js.map +1 -1
  156. package/lib/programmers/internal/check_array.js +4 -10
  157. package/lib/programmers/internal/check_array.js.map +1 -1
  158. package/lib/programmers/internal/check_dynamic_properties.js +40 -50
  159. package/lib/programmers/internal/check_dynamic_properties.js.map +1 -1
  160. package/lib/programmers/internal/check_everything.js +1 -3
  161. package/lib/programmers/internal/check_everything.js.map +1 -1
  162. package/lib/programmers/internal/check_length.js +2 -2
  163. package/lib/programmers/internal/check_length.js.map +1 -1
  164. package/lib/programmers/internal/check_native.d.ts +1 -0
  165. package/lib/programmers/internal/check_native.js +9 -0
  166. package/lib/programmers/internal/check_native.js.map +1 -0
  167. package/lib/programmers/internal/check_number.js +1 -1
  168. package/lib/programmers/internal/check_number.js.map +1 -1
  169. package/lib/programmers/internal/check_object.d.ts +12 -1
  170. package/lib/programmers/internal/check_object.js +12 -22
  171. package/lib/programmers/internal/check_object.js.map +1 -1
  172. package/lib/programmers/internal/decode_union_object.js +9 -7
  173. package/lib/programmers/internal/decode_union_object.js.map +1 -1
  174. package/lib/programmers/internal/feature_object_entries.d.ts +9 -0
  175. package/lib/programmers/internal/feature_object_entries.js +38 -0
  176. package/lib/programmers/internal/feature_object_entries.js.map +1 -0
  177. package/lib/programmers/internal/stringify_dynamic_properties.js +4 -2
  178. package/lib/programmers/internal/stringify_dynamic_properties.js.map +1 -1
  179. package/lib/programmers/internal/stringify_native.d.ts +1 -0
  180. package/lib/programmers/internal/stringify_native.js +12 -0
  181. package/lib/programmers/internal/stringify_native.js.map +1 -0
  182. package/lib/schemas/IJsonComponents.d.ts +1 -1
  183. package/lib/schemas/IJsonSchema.d.ts +10 -8
  184. package/lib/transformers/CallExpressionTransformer.js +47 -10
  185. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  186. package/lib/transformers/FileTransformer.js +1 -1
  187. package/lib/transformers/features/{ApplicationTransformer.d.ts → miscellaneous/ApplicationTransformer.d.ts} +1 -1
  188. package/lib/transformers/features/{ApplicationTransformer.js → miscellaneous/ApplicationTransformer.js} +8 -8
  189. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js.map +1 -0
  190. package/lib/transformers/features/{CreateTransformer.d.ts → miscellaneous/CreateInstanceTransformer.d.ts} +2 -2
  191. package/lib/transformers/features/{CreateTransformer.js → miscellaneous/CreateInstanceTransformer.js} +8 -8
  192. package/lib/transformers/features/miscellaneous/CreateInstanceTransformer.js.map +1 -0
  193. package/lib/transformers/features/miscellaneous/MetadataTransformer.d.ts +5 -0
  194. package/lib/transformers/features/miscellaneous/MetadataTransformer.js +43 -0
  195. package/lib/transformers/features/miscellaneous/MetadataTransformer.js.map +1 -0
  196. package/lib/transformers/features/parsers/AssertParseTransformer.d.ts +5 -0
  197. package/lib/transformers/features/parsers/AssertParseTransformer.js +21 -0
  198. package/lib/transformers/features/parsers/AssertParseTransformer.js.map +1 -0
  199. package/lib/transformers/features/parsers/CreateAssertParseTransformer.d.ts +5 -0
  200. package/lib/transformers/features/parsers/CreateAssertParseTransformer.js +17 -0
  201. package/lib/transformers/features/parsers/CreateAssertParseTransformer.js.map +1 -0
  202. package/lib/transformers/features/parsers/CreateIsParseTransformer.d.ts +5 -0
  203. package/lib/transformers/features/parsers/CreateIsParseTransformer.js +17 -0
  204. package/lib/transformers/features/parsers/CreateIsParseTransformer.js.map +1 -0
  205. package/lib/transformers/features/parsers/CreateValidateParseTransformer.d.ts +5 -0
  206. package/lib/transformers/features/parsers/CreateValidateParseTransformer.js +17 -0
  207. package/lib/transformers/features/parsers/CreateValidateParseTransformer.js.map +1 -0
  208. package/lib/transformers/features/parsers/IsParseTransformer.d.ts +5 -0
  209. package/lib/transformers/features/parsers/IsParseTransformer.js +21 -0
  210. package/lib/transformers/features/parsers/IsParseTransformer.js.map +1 -0
  211. package/lib/transformers/features/parsers/ValidateParseTransformer.d.ts +5 -0
  212. package/lib/transformers/features/parsers/ValidateParseTransformer.js +21 -0
  213. package/lib/transformers/features/parsers/ValidateParseTransformer.js.map +1 -0
  214. package/lib/transformers/features/stringifiers/AssertStringifyTransformer.d.ts +5 -0
  215. package/lib/transformers/features/stringifiers/AssertStringifyTransformer.js +23 -0
  216. package/lib/transformers/features/stringifiers/AssertStringifyTransformer.js.map +1 -0
  217. package/lib/transformers/features/stringifiers/CreateAssertStringifyTransformer.d.ts +5 -0
  218. package/lib/transformers/features/stringifiers/CreateAssertStringifyTransformer.js +17 -0
  219. package/lib/transformers/features/stringifiers/CreateAssertStringifyTransformer.js.map +1 -0
  220. package/lib/transformers/features/stringifiers/CreateIsStringifyTransformer.d.ts +5 -0
  221. package/lib/transformers/features/stringifiers/CreateIsStringifyTransformer.js +17 -0
  222. package/lib/transformers/features/stringifiers/CreateIsStringifyTransformer.js.map +1 -0
  223. package/lib/transformers/features/stringifiers/CreateStringifyTransformer.d.ts +5 -0
  224. package/lib/transformers/features/stringifiers/CreateStringifyTransformer.js +17 -0
  225. package/lib/transformers/features/stringifiers/CreateStringifyTransformer.js.map +1 -0
  226. package/lib/transformers/features/stringifiers/CreateValidateStringifyProgrammer.d.ts +5 -0
  227. package/lib/transformers/features/stringifiers/CreateValidateStringifyProgrammer.js +17 -0
  228. package/lib/transformers/features/stringifiers/CreateValidateStringifyProgrammer.js.map +1 -0
  229. package/lib/transformers/features/stringifiers/IsStringifyTransformer.d.ts +5 -0
  230. package/lib/transformers/features/stringifiers/IsStringifyTransformer.js +23 -0
  231. package/lib/transformers/features/stringifiers/IsStringifyTransformer.js.map +1 -0
  232. package/lib/transformers/features/{StringifyTransformer.d.ts → stringifiers/StringifyTransformer.d.ts} +1 -1
  233. package/lib/transformers/features/{StringifyTransformer.js → stringifiers/StringifyTransformer.js} +3 -3
  234. package/lib/transformers/features/stringifiers/StringifyTransformer.js.map +1 -0
  235. package/lib/transformers/features/stringifiers/ValidateStringifyTransformer.d.ts +5 -0
  236. package/lib/transformers/features/stringifiers/ValidateStringifyTransformer.js +23 -0
  237. package/lib/transformers/features/stringifiers/ValidateStringifyTransformer.js.map +1 -0
  238. package/lib/transformers/features/{AssertTransformer.d.ts → validators/AssertTransformer.d.ts} +1 -1
  239. package/lib/transformers/features/{AssertTransformer.js → validators/AssertTransformer.js} +4 -4
  240. package/lib/transformers/features/validators/AssertTransformer.js.map +1 -0
  241. package/lib/transformers/features/validators/CreateAssertTransformer.d.ts +5 -0
  242. package/lib/transformers/features/validators/CreateAssertTransformer.js +24 -0
  243. package/lib/transformers/features/validators/CreateAssertTransformer.js.map +1 -0
  244. package/lib/transformers/features/validators/CreateIsTransformer.d.ts +5 -0
  245. package/lib/transformers/features/validators/CreateIsTransformer.js +24 -0
  246. package/lib/transformers/features/validators/CreateIsTransformer.js.map +1 -0
  247. package/lib/transformers/features/validators/CreateValidateTransformer.d.ts +5 -0
  248. package/lib/transformers/features/validators/CreateValidateTransformer.js +24 -0
  249. package/lib/transformers/features/validators/CreateValidateTransformer.js.map +1 -0
  250. package/lib/transformers/features/{IsTransformer.d.ts → validators/IsTransformer.d.ts} +1 -1
  251. package/lib/transformers/features/{IsTransformer.js → validators/IsTransformer.js} +3 -3
  252. package/lib/transformers/features/validators/IsTransformer.js.map +1 -0
  253. package/lib/transformers/features/{ValidateTransformer.d.ts → validators/ValidateTransformer.d.ts} +1 -1
  254. package/lib/transformers/features/{ValidateTransformer.js → validators/ValidateTransformer.js} +3 -3
  255. package/lib/transformers/features/validators/ValidateTransformer.js.map +1 -0
  256. package/lib/typings/ClassProperties.d.ts +1 -1
  257. package/lib/typings/OmitNever.d.ts +1 -1
  258. package/lib/typings/SpecialFields.d.ts +1 -1
  259. package/lib/typings/Writable.d.ts +1 -1
  260. package/lib/utils/PatternUtil.js +1 -1
  261. package/lib/utils/PatternUtil.js.map +1 -1
  262. package/package.json +114 -78
  263. package/src/IValidation.ts +21 -0
  264. package/src/Primitive.ts +82 -0
  265. package/src/TypeGuardError.ts +36 -0
  266. package/src/executable/internal/TypiaSetupWizard.ts +130 -0
  267. package/src/executable/typia.ts +34 -0
  268. package/src/factories/CommentFactory.ts +10 -0
  269. package/src/factories/ExpressionFactory.ts +52 -0
  270. package/src/factories/IdentifierFactory.ts +72 -0
  271. package/src/factories/LiteralFactory.ts +44 -0
  272. package/src/factories/MetadataCollection.ts +122 -0
  273. package/src/factories/MetadataFactory.ts +46 -0
  274. package/src/factories/MetadataTagFactory.ts +347 -0
  275. package/src/factories/StatementFactory.ts +60 -0
  276. package/src/factories/TemplateFactory.ts +56 -0
  277. package/src/factories/TypeFactory.ts +101 -0
  278. package/src/factories/ValueFactory.ts +12 -0
  279. package/src/factories/internal/MetadataHelper.ts +12 -0
  280. package/src/factories/internal/emplace_metadata_object.ts +140 -0
  281. package/src/factories/internal/explore_metadata.ts +91 -0
  282. package/src/factories/internal/iterate_metadata.ts +81 -0
  283. package/src/factories/internal/iterate_metadata_array.ts +29 -0
  284. package/src/factories/internal/iterate_metadata_atomic.ts +59 -0
  285. package/src/factories/internal/iterate_metadata_coalesce.ts +33 -0
  286. package/src/factories/internal/iterate_metadata_constant.ts +58 -0
  287. package/src/factories/internal/iterate_metadata_map.ts +41 -0
  288. package/src/factories/internal/iterate_metadata_native.ts +227 -0
  289. package/src/factories/internal/iterate_metadata_object.ts +45 -0
  290. package/src/factories/internal/iterate_metadata_resolve.ts +27 -0
  291. package/src/factories/internal/iterate_metadata_set.ts +33 -0
  292. package/src/factories/internal/iterate_metadata_template.ts +38 -0
  293. package/src/factories/internal/iterate_metadata_tuple.ts +51 -0
  294. package/src/factories/internal/iterate_metadata_union.ts +59 -0
  295. package/src/functional/$every.ts +11 -0
  296. package/src/functional/$guard.ts +35 -0
  297. package/src/functional/$is_email.ts +5 -0
  298. package/src/functional/$is_ipv4.ts +5 -0
  299. package/src/functional/$is_ipv6.ts +5 -0
  300. package/src/functional/$is_url.ts +5 -0
  301. package/src/functional/$is_uuid.ts +5 -0
  302. package/src/functional/$join.ts +50 -0
  303. package/src/functional/$number.ts +19 -0
  304. package/src/functional/$report.ts +15 -0
  305. package/src/functional/$rest.ts +3 -0
  306. package/src/functional/$string.ts +37 -0
  307. package/src/functional/$tail.ts +6 -0
  308. package/src/index.ts +4 -0
  309. package/src/metadata/IJsDocTagInfo.ts +10 -0
  310. package/src/metadata/IMetadata.ts +25 -0
  311. package/src/metadata/IMetadataApplication.ts +7 -0
  312. package/src/metadata/IMetadataConstant.ts +16 -0
  313. package/src/metadata/IMetadataEntry.ts +6 -0
  314. package/src/metadata/IMetadataObject.ts +29 -0
  315. package/src/metadata/IMetadataProperty.ts +11 -0
  316. package/src/metadata/IMetadataTag.ts +122 -0
  317. package/src/metadata/Metadata.ts +477 -0
  318. package/src/metadata/MetadataConstant.ts +3 -0
  319. package/src/metadata/MetadataObject.ts +131 -0
  320. package/src/metadata/MetadataProperty.ts +64 -0
  321. package/src/module.ts +1535 -0
  322. package/src/programmers/ApplicationProgrammer.ts +55 -0
  323. package/src/programmers/AssertParseProgrammer.ts +45 -0
  324. package/src/programmers/AssertProgrammer.ts +444 -0
  325. package/src/programmers/AssertStringifyProgrammer.ts +45 -0
  326. package/src/programmers/CheckerProgrammer.ts +798 -0
  327. package/src/programmers/FeatureProgrammer.ts +327 -0
  328. package/src/programmers/IsParseProgrammer.ts +51 -0
  329. package/src/programmers/IsProgrammer.ts +169 -0
  330. package/src/programmers/IsStringifyProgrammer.ts +49 -0
  331. package/src/programmers/StringifyProgrammer.ts +746 -0
  332. package/src/programmers/ValidateParseProgrammer.ts +49 -0
  333. package/src/programmers/ValidateProgrammer.ts +236 -0
  334. package/src/programmers/ValidateStringifyProgrammer.ts +60 -0
  335. package/src/programmers/helpers/AtomicPredicator.ts +15 -0
  336. package/src/programmers/helpers/FunctionImporeter.ts +31 -0
  337. package/src/programmers/helpers/IExpressionEntry.ts +10 -0
  338. package/src/programmers/helpers/OptionPredicator.ts +18 -0
  339. package/src/programmers/helpers/StringifyJoinder.ts +111 -0
  340. package/src/programmers/helpers/StringifyPredicator.ts +18 -0
  341. package/src/programmers/helpers/UnionExplorer.ts +437 -0
  342. package/src/programmers/helpers/UnionPredicator.ts +81 -0
  343. package/src/programmers/internal/application_array.ts +45 -0
  344. package/src/programmers/internal/application_boolean.ts +17 -0
  345. package/src/programmers/internal/application_constant.ts +29 -0
  346. package/src/programmers/internal/application_default.ts +17 -0
  347. package/src/programmers/internal/application_default_string.ts +32 -0
  348. package/src/programmers/internal/application_native.ts +29 -0
  349. package/src/programmers/internal/application_number.ts +76 -0
  350. package/src/programmers/internal/application_object.ts +103 -0
  351. package/src/programmers/internal/application_schema.ts +221 -0
  352. package/src/programmers/internal/application_string.ts +49 -0
  353. package/src/programmers/internal/application_templates.ts +27 -0
  354. package/src/programmers/internal/application_tuple.ts +25 -0
  355. package/src/programmers/internal/check_array.ts +44 -0
  356. package/src/programmers/internal/check_dynamic_properties.ts +146 -0
  357. package/src/programmers/internal/check_everything.ts +25 -0
  358. package/src/programmers/internal/check_length.ts +46 -0
  359. package/src/programmers/internal/check_native.ts +9 -0
  360. package/src/programmers/internal/check_number.ts +181 -0
  361. package/src/programmers/internal/check_object.ts +42 -0
  362. package/src/programmers/internal/check_string.ts +24 -0
  363. package/src/programmers/internal/check_string_tags.ts +63 -0
  364. package/src/programmers/internal/check_template.ts +50 -0
  365. package/src/programmers/internal/decode_union_object.ts +73 -0
  366. package/src/programmers/internal/feature_object_entries.ts +49 -0
  367. package/src/programmers/internal/metadata_to_pattern.ts +31 -0
  368. package/src/programmers/internal/stringify_dynamic_properties.ts +164 -0
  369. package/src/programmers/internal/stringify_native.ts +8 -0
  370. package/src/programmers/internal/stringify_regular_properties.ts +81 -0
  371. package/src/programmers/internal/template_to_pattern.ts +15 -0
  372. package/src/schemas/IJsonApplication.ts +9 -0
  373. package/src/schemas/IJsonComponents.ts +24 -0
  374. package/src/schemas/IJsonSchema.ts +92 -0
  375. package/src/transform.ts +20 -0
  376. package/src/transformers/CallExpressionTransformer.ts +124 -0
  377. package/src/transformers/ExpressionWithArgumentTransformer.ts +66 -0
  378. package/src/transformers/FileTransformer.ts +49 -0
  379. package/src/transformers/IProject.ts +11 -0
  380. package/src/transformers/ITransformOptions.ts +4 -0
  381. package/src/transformers/NodeTransformer.ts +19 -0
  382. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +114 -0
  383. package/src/transformers/features/miscellaneous/CreateInstanceTransformer.ts +41 -0
  384. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +55 -0
  385. package/src/transformers/features/parsers/AssertParseTransformer.ts +36 -0
  386. package/src/transformers/features/parsers/CreateAssertParseTransformer.ts +32 -0
  387. package/src/transformers/features/parsers/CreateIsParseTransformer.ts +32 -0
  388. package/src/transformers/features/parsers/CreateValidateParseTransformer.ts +32 -0
  389. package/src/transformers/features/parsers/IsParseTransformer.ts +36 -0
  390. package/src/transformers/features/parsers/ValidateParseTransformer.ts +36 -0
  391. package/src/transformers/features/stringifiers/AssertStringifyTransformer.ts +38 -0
  392. package/src/transformers/features/stringifiers/CreateAssertStringifyTransformer.ts +32 -0
  393. package/src/transformers/features/stringifiers/CreateIsStringifyTransformer.ts +32 -0
  394. package/src/transformers/features/stringifiers/CreateStringifyTransformer.ts +31 -0
  395. package/src/transformers/features/stringifiers/CreateValidateStringifyProgrammer.ts +32 -0
  396. package/src/transformers/features/stringifiers/IsStringifyTransformer.ts +38 -0
  397. package/src/transformers/features/stringifiers/StringifyTransformer.ts +36 -0
  398. package/src/transformers/features/stringifiers/ValidateStringifyTransformer.ts +38 -0
  399. package/src/transformers/features/validators/AssertTransformer.ts +43 -0
  400. package/src/transformers/features/validators/CreateAssertTransformer.ts +35 -0
  401. package/src/transformers/features/validators/CreateIsTransformer.ts +35 -0
  402. package/src/transformers/features/validators/CreateValidateTransformer.ts +35 -0
  403. package/src/transformers/features/validators/IsTransformer.ts +43 -0
  404. package/src/transformers/features/validators/ValidateTransformer.ts +43 -0
  405. package/src/typings/Atomic.ts +17 -0
  406. package/src/typings/ClassProperties.ts +5 -0
  407. package/src/typings/OmitNever.ts +3 -0
  408. package/src/typings/SpecialFields.ts +3 -0
  409. package/src/typings/Writable.ts +11 -0
  410. package/src/utils/ArrayUtil.ts +49 -0
  411. package/src/utils/Escaper.ts +50 -0
  412. package/src/utils/MapUtil.ts +14 -0
  413. package/src/utils/PatternUtil.ts +30 -0
  414. package/src/utils/Singleton.ts +17 -0
  415. package/CODE_OF_CONDUCT.md +0 -133
  416. package/CONTRIBUTING.md +0 -104
  417. package/lib/transformers/features/ApplicationTransformer.js.map +0 -1
  418. package/lib/transformers/features/AssertTransformer.js.map +0 -1
  419. package/lib/transformers/features/CreateTransformer.js.map +0 -1
  420. package/lib/transformers/features/IsTransformer.js.map +0 -1
  421. package/lib/transformers/features/StringifyTransformer.js.map +0 -1
  422. package/lib/transformers/features/ValidateTransformer.js.map +0 -1
@@ -0,0 +1,76 @@
1
+ import { IJsonSchema } from "../../module";
2
+ import { application_default } from "./application_default";
3
+
4
+ /**
5
+ * @internal
6
+ */
7
+ export const application_number = (
8
+ nullable: boolean,
9
+ attribute: IJsonSchema.IAttribute,
10
+ ): IJsonSchema.INumber => {
11
+ const output: IJsonSchema.INumber = {
12
+ type: "number",
13
+ nullable,
14
+ ...attribute,
15
+ };
16
+ for (const tag of attribute["x-typia-metaTags"] || []) {
17
+ // CHECK TYPE
18
+ if (
19
+ tag.kind === "type" &&
20
+ (tag.value === "int" || tag.value === "uint")
21
+ )
22
+ output.type = "integer";
23
+ // RANGE TAG
24
+ else if (tag.kind === "minimum") output.minimum = tag.value;
25
+ else if (tag.kind === "maximum") output.maximum = tag.value;
26
+ else if (tag.kind === "range") {
27
+ if (tag.minimum !== undefined)
28
+ if (tag.minimum.include === true)
29
+ output.minimum = tag.minimum.value;
30
+ else output.exclusiveMinimum = tag.minimum.value;
31
+ if (tag.maximum !== undefined)
32
+ if (tag.maximum.include === true)
33
+ output.maximum = tag.maximum.value;
34
+ else output.exclusiveMaximum = tag.maximum.value;
35
+ }
36
+ // MULTIPLE-OF
37
+ else if (tag.kind === "multipleOf") output.multipleOf = tag.value;
38
+ }
39
+
40
+ // WHEN UNSIGNED INT
41
+ if (
42
+ output.type === "integer" &&
43
+ (attribute["x-typia-metaTags"] || []).find(
44
+ (tag) => tag.kind === "type" && tag.value === "uint",
45
+ )
46
+ )
47
+ if (output.minimum === undefined || output.minimum < 0)
48
+ output.minimum = 0;
49
+ else if (
50
+ output.exclusiveMinimum === undefined ||
51
+ output.exclusiveMinimum < 0
52
+ ) {
53
+ delete output.exclusiveMinimum;
54
+ output.maximum = 0;
55
+ }
56
+
57
+ // DEFAULT CONFIGURATION
58
+ output.default = application_default(attribute)((str) => {
59
+ const value: number = Number(str);
60
+ const conditions: boolean[] = [!Number.isNaN(value)];
61
+ if (output.minimum !== undefined)
62
+ conditions.push(value >= output.minimum);
63
+ if (output.maximum !== undefined)
64
+ conditions.push(value <= output.maximum);
65
+ if (output.exclusiveMinimum !== undefined)
66
+ conditions.push(value > output.exclusiveMinimum);
67
+ if (output.exclusiveMaximum !== undefined)
68
+ conditions.push(value < output.exclusiveMaximum);
69
+ if (output.multipleOf !== undefined)
70
+ conditions.push(value % output.multipleOf === 0);
71
+ return conditions.every((cond) => cond);
72
+ })((str) => Number(str));
73
+
74
+ // RETURNS
75
+ return output;
76
+ };
@@ -0,0 +1,103 @@
1
+ import { CommentFactory } from "../../factories/CommentFactory";
2
+
3
+ import { IJsDocTagInfo } from "../../metadata/IJsDocTagInfo";
4
+ import { MetadataObject } from "../../metadata/MetadataObject";
5
+ import { IJsonComponents } from "../../schemas/IJsonComponents";
6
+
7
+ import { PatternUtil } from "../../utils/PatternUtil";
8
+
9
+ import { IJsonSchema } from "../../module";
10
+ import { ApplicationProgrammer } from "../ApplicationProgrammer";
11
+ import { application_schema } from "./application_schema";
12
+ import { metadata_to_pattern } from "./metadata_to_pattern";
13
+
14
+ /**
15
+ * @internal
16
+ */
17
+ export const application_object =
18
+ (options: ApplicationProgrammer.IOptions) =>
19
+ (components: IJsonComponents) =>
20
+ (key: string, obj: MetadataObject, nullable: boolean): void => {
21
+ // TEMPORARY ASSIGNMENT
22
+ if (components.schemas[key] !== undefined) return;
23
+ components.schemas[key] = {} as any;
24
+
25
+ // ITERATE PROPERTIES
26
+ const properties: Record<string, any> = {};
27
+ const patternProperties: Record<string, any> = {};
28
+ const additionalProperties: IJsonSchema[] = [];
29
+ const required: string[] = [];
30
+
31
+ for (const property of obj.properties) {
32
+ if (
33
+ property.value.functional === true &&
34
+ property.value.nullable === false &&
35
+ property.value.required === true &&
36
+ property.value.size() === 0
37
+ )
38
+ continue;
39
+
40
+ const key: string | null = property.key.getSoleLiteral();
41
+ const value: IJsonSchema | null = application_schema(options)(
42
+ components,
43
+ )(true)(property.value, {
44
+ deprecated:
45
+ !!property.jsDocTags.find(
46
+ (tag) => tag.name === "deprecated",
47
+ ) || undefined,
48
+ title: (() => {
49
+ const info: IJsDocTagInfo | undefined =
50
+ property.jsDocTags.find((tag) => tag.name === "title");
51
+ return info?.text?.length
52
+ ? CommentFactory.generate(info.text)
53
+ : undefined;
54
+ })(),
55
+ description: property.description,
56
+ "x-typia-metaTags": property.tags.length
57
+ ? property.tags
58
+ : undefined,
59
+ "x-typia-jsDocTags": property.jsDocTags.length
60
+ ? property.jsDocTags
61
+ : undefined,
62
+ "x-typia-required": property.value.required,
63
+ });
64
+
65
+ if (value === null) continue;
66
+ else if (key !== null) {
67
+ properties[key] = value;
68
+ if (property.value.required === true) required.push(key);
69
+ } else {
70
+ const pattern: string = metadata_to_pattern(true)(property.key);
71
+ if (
72
+ options.purpose === "swagger" ||
73
+ pattern === PatternUtil.STRING
74
+ )
75
+ additionalProperties.push(value);
76
+ else patternProperties[pattern] = value;
77
+ }
78
+ }
79
+
80
+ const schema: IJsonComponents.IObject = {
81
+ $id:
82
+ options.purpose === "ajv"
83
+ ? options.prefix + "/" + key
84
+ : undefined,
85
+ $recursiveAnchor:
86
+ (options.purpose === "ajv" && obj.recursive) || undefined,
87
+ type: "object",
88
+ properties,
89
+ patternProperties: Object.keys(patternProperties).length
90
+ ? patternProperties
91
+ : undefined,
92
+ additionalProperties: additionalProperties.length
93
+ ? additionalProperties.length === 1
94
+ ? additionalProperties[0]
95
+ : { oneOf: additionalProperties }
96
+ : undefined,
97
+ nullable,
98
+ required: required.length ? required : undefined,
99
+ description: obj.description,
100
+ "x-typia_jsDocTags": obj.jsDocTags,
101
+ };
102
+ components.schemas[key] = schema;
103
+ };
@@ -0,0 +1,221 @@
1
+ import { Metadata } from "../../metadata/Metadata";
2
+ import { MetadataConstant } from "../../metadata/MetadataConstant";
3
+ import { IJsonComponents } from "../../schemas/IJsonComponents";
4
+ import { IJsonSchema } from "../../schemas/IJsonSchema";
5
+
6
+ import { ArrayUtil } from "../../utils/ArrayUtil";
7
+
8
+ import { ApplicationProgrammer } from "../ApplicationProgrammer";
9
+ import { AtomicPredicator } from "../helpers/AtomicPredicator";
10
+ import { application_array } from "./application_array";
11
+ import { application_boolean } from "./application_boolean";
12
+ import { application_constant } from "./application_constant";
13
+ import { application_native } from "./application_native";
14
+ import { application_number } from "./application_number";
15
+ import { application_object } from "./application_object";
16
+ import { application_string } from "./application_string";
17
+ import { application_templates } from "./application_templates";
18
+ import { application_tuple } from "./application_tuple";
19
+
20
+ /**
21
+ * @internal
22
+ */
23
+ export const application_schema =
24
+ (options: ApplicationProgrammer.IOptions) =>
25
+ (components: IJsonComponents) =>
26
+ <BlockNever extends boolean>(blockNever: BlockNever) =>
27
+ (
28
+ meta: Metadata,
29
+ attribute: IJsonSchema.IAttribute,
30
+ ): BlockNever extends true ? IJsonSchema | null : IJsonSchema => {
31
+ // VULNERABLE CASE
32
+ if (meta.any === true) return {};
33
+ else if (meta.nullable && meta.empty())
34
+ return { type: "null", ...attribute };
35
+
36
+ //----
37
+ // GATHER UNION SCHEMAS
38
+ //----
39
+ const union: IJsonSchema[] = [];
40
+
41
+ // toJSON() METHOD
42
+ if (meta.resolved !== null) {
43
+ const resolved = application_schema(options)(components)(
44
+ blockNever,
45
+ )(meta.resolved, attribute);
46
+ if (resolved !== null) union.push(resolved);
47
+ }
48
+
49
+ // ATOMIC TYPES
50
+ if (meta.templates.length && AtomicPredicator.template(meta))
51
+ union.push(application_templates(meta, attribute));
52
+ for (const constant of meta.constants) {
53
+ if (constant.type === "string" && meta.templates.length) continue;
54
+ else if (!AtomicPredicator.constant(meta)(constant.type)) continue;
55
+ union.push(
56
+ application_constant(constant, meta.nullable, attribute),
57
+ );
58
+ }
59
+ for (const type of meta.atomics) {
60
+ union.push(
61
+ type === "string"
62
+ ? application_string(meta, attribute)
63
+ : type === "boolean"
64
+ ? application_boolean(meta.nullable, attribute)
65
+ : application_number(meta.nullable, attribute),
66
+ );
67
+ }
68
+
69
+ // ARRAY
70
+ for (const schema of meta.arrays.values())
71
+ union.push(
72
+ application_array(options)(components)(
73
+ schema,
74
+ meta.nullable,
75
+ attribute,
76
+ ),
77
+ );
78
+
79
+ // TUPLE
80
+ for (const items of meta.tuples)
81
+ if (
82
+ options.purpose === "ajv" &&
83
+ items.every((i) => i.rest === null)
84
+ )
85
+ union.push(
86
+ application_tuple(options)(components)(
87
+ items,
88
+ meta.nullable,
89
+ attribute,
90
+ ),
91
+ );
92
+ else {
93
+ // SWAGGER DOES NOT SUPPORT TUPLE TYPE YET
94
+ const merged: Metadata = items.reduce((x, y) =>
95
+ merge_metadata(x, y),
96
+ );
97
+ union.push(
98
+ application_array(options)(components)(
99
+ merged,
100
+ merged?.nullable || false,
101
+ attribute,
102
+ ),
103
+ );
104
+ }
105
+
106
+ // NATIVES
107
+ for (const native of meta.natives)
108
+ union.push(
109
+ application_native(options)(components)(native)(
110
+ meta.nullable,
111
+ attribute,
112
+ ),
113
+ );
114
+ if (meta.sets.length)
115
+ union.push(
116
+ application_native(options)(components)(`Set`)(
117
+ meta.nullable,
118
+ attribute,
119
+ ),
120
+ );
121
+ if (meta.maps.length)
122
+ union.push(
123
+ application_native(options)(components)(`Map`)(
124
+ meta.nullable,
125
+ attribute,
126
+ ),
127
+ );
128
+
129
+ // OBJECT
130
+ for (const obj of meta.objects) {
131
+ const key: string = obj.name + (meta.nullable ? ".Nullable" : "");
132
+ application_object(options)(components)(key, obj, meta.nullable);
133
+ union.push(
134
+ (options.purpose === "ajv" && obj.recursive
135
+ ? recursive
136
+ : reference)(`${options.prefix}/${key}`, attribute),
137
+ );
138
+ }
139
+
140
+ //----
141
+ // RETURNS
142
+ //----
143
+ if (union.length === 0) return blockNever === true ? null! : {};
144
+ else if (union.length === 1) return union[0]!;
145
+ return { oneOf: union, ...attribute };
146
+ };
147
+
148
+ /**
149
+ * @internal
150
+ */
151
+ const reference = (
152
+ $ref: string,
153
+ attribute: IJsonSchema.IAttribute,
154
+ ): IJsonSchema.IReference => ({
155
+ $ref,
156
+ ...attribute,
157
+ });
158
+
159
+ /**
160
+ * @internal
161
+ */
162
+ const recursive = (
163
+ $recursiveRef: string,
164
+ attribute: IJsonSchema.IAttribute,
165
+ ): IJsonSchema.IRecursiveReference => ({
166
+ $recursiveRef,
167
+ ...attribute,
168
+ });
169
+
170
+ /**
171
+ * @internal
172
+ * @todo: not perfect
173
+ */
174
+ function merge_metadata(x: Metadata, y: Metadata): Metadata {
175
+ const output: Metadata = Metadata.create({
176
+ any: x.any || y.any,
177
+ nullable: x.nullable || y.nullable,
178
+ required: x.required && y.required,
179
+ functional: x.functional || y.functional,
180
+
181
+ resolved:
182
+ x.resolved !== null && y.resolved !== null
183
+ ? merge_metadata(x.resolved, y.resolved)
184
+ : x.resolved || y.resolved,
185
+ atomics: [...new Set([...x.atomics, ...y.atomics])],
186
+ constants: [...x.constants],
187
+ templates: x.templates.slice(),
188
+
189
+ rest: null,
190
+ arrays: x.arrays.slice(),
191
+ tuples: x.tuples.slice(),
192
+ objects: x.objects.slice(),
193
+
194
+ natives: [...new Set([...x.natives, ...y.natives])],
195
+ sets: x.sets.slice(),
196
+ maps: x.maps.slice(),
197
+ });
198
+ for (const constant of y.constants) {
199
+ const target: MetadataConstant = ArrayUtil.take(
200
+ output.constants,
201
+ (elem) => elem.type === constant.type,
202
+ () => ({
203
+ type: constant.type,
204
+ values: [],
205
+ }),
206
+ );
207
+ for (const value of constant.values)
208
+ ArrayUtil.add(target.values, value);
209
+ }
210
+ for (const array of y.arrays)
211
+ ArrayUtil.set(output.arrays, array, (elem) => elem.getName());
212
+ for (const obj of y.objects)
213
+ ArrayUtil.set(output.objects, obj, (elem) => elem.name);
214
+
215
+ if (x.rest !== null)
216
+ ArrayUtil.set(output.arrays, x.rest, (elem) => elem.getName());
217
+ if (y.rest !== null)
218
+ ArrayUtil.set(output.arrays, y.rest, (elem) => elem.getName());
219
+
220
+ return output;
221
+ }
@@ -0,0 +1,49 @@
1
+ import { Metadata } from "../../metadata/Metadata";
2
+ import { IJsonSchema } from "../../schemas/IJsonSchema";
3
+
4
+ import { application_default_string } from "./application_default_string";
5
+
6
+ /**
7
+ * @internal
8
+ */
9
+ export const application_string = (
10
+ meta: Metadata,
11
+ attribute: IJsonSchema.IAttribute,
12
+ ): IJsonSchema.IString => {
13
+ const output: IJsonSchema.IString = {
14
+ type: "string",
15
+ nullable: meta.nullable,
16
+ ...attribute,
17
+ };
18
+
19
+ // FORMAT TAG OF METADATA
20
+ const formatJsdocTag = attribute["x-typia-jsDocTags"]?.find(
21
+ (tag) => tag.name === "format",
22
+ );
23
+ if (formatJsdocTag?.text?.length)
24
+ output.format = formatJsdocTag?.text.map((t) => t.text).join(" ");
25
+
26
+ // REGULAR TAGS COMPATIBLE WITH JSON-SCHEMA
27
+ for (const tag of attribute["x-typia-metaTags"] || []) {
28
+ // RANGE
29
+ if (tag.kind === "minLength") output.minLength = tag.value;
30
+ else if (tag.kind === "maxLength") output.maxLength = tag.value;
31
+ else if (tag.kind === "length") {
32
+ if (tag.minimum !== undefined)
33
+ output.minLength =
34
+ tag.minimum.value + (tag.minimum.include ? 0 : 1);
35
+ if (tag.maximum !== undefined)
36
+ output.maxLength =
37
+ tag.maximum.value - (tag.maximum.include ? 0 : 1);
38
+ }
39
+ // FORMAT AND PATTERN
40
+ else if (tag.kind === "format") output.format = tag.value;
41
+ else if (tag.kind === "pattern") output.pattern = tag.value;
42
+ }
43
+
44
+ // DEFAULT CONFIGURATION
45
+ output.default = application_default_string(meta, attribute)(output);
46
+
47
+ // RETURNS
48
+ return output;
49
+ };
@@ -0,0 +1,27 @@
1
+ import { Metadata } from "../../metadata/Metadata";
2
+ import { IJsonSchema } from "../../schemas/IJsonSchema";
3
+
4
+ import { application_default_string } from "./application_default_string";
5
+ import { metadata_to_pattern } from "./metadata_to_pattern";
6
+
7
+ /**
8
+ * @internal
9
+ */
10
+ export const application_templates = (
11
+ meta: Metadata,
12
+ attribute: IJsonSchema.IAttribute,
13
+ ): IJsonSchema.IString => {
14
+ // CONSTRUCT PATTERN
15
+ const output: IJsonSchema.IString = {
16
+ type: "string",
17
+ nullable: meta.nullable,
18
+ ...attribute,
19
+ };
20
+ output.pattern = metadata_to_pattern(true)(meta);
21
+
22
+ // DEFAULT VALUE
23
+ output.default = application_default_string(meta, attribute)(output);
24
+
25
+ // RETURNS
26
+ return output;
27
+ };
@@ -0,0 +1,25 @@
1
+ import { Metadata } from "../../metadata/Metadata";
2
+ import { IJsonComponents } from "../../schemas/IJsonComponents";
3
+ import { IJsonSchema } from "../../schemas/IJsonSchema";
4
+
5
+ import { ApplicationProgrammer } from "../ApplicationProgrammer";
6
+ import { application_schema } from "./application_schema";
7
+
8
+ /**
9
+ * @internal
10
+ */
11
+ export const application_tuple =
12
+ (options: ApplicationProgrammer.IOptions) =>
13
+ (components: IJsonComponents) =>
14
+ (
15
+ items: Array<Metadata>,
16
+ nullable: boolean,
17
+ attribute: IJsonSchema.IAttribute,
18
+ ): IJsonSchema.ITuple => ({
19
+ type: "array",
20
+ items: items.map((meta) =>
21
+ application_schema(options)(components)(false)(meta, attribute),
22
+ ),
23
+ nullable,
24
+ ...attribute,
25
+ });
@@ -0,0 +1,44 @@
1
+ import ts from "typescript";
2
+
3
+ import { ExpressionFactory } from "../../factories/ExpressionFactory";
4
+ import { IdentifierFactory } from "../../factories/IdentifierFactory";
5
+
6
+ import { IMetadataTag } from "../../metadata/IMetadataTag";
7
+
8
+ import { check_length } from "./check_length";
9
+
10
+ /**
11
+ * @internal
12
+ */
13
+ export function check_array(
14
+ input: ts.Expression,
15
+ tagList: IMetadataTag[],
16
+ ): ts.Expression {
17
+ const conditions: ts.Expression[] = [ExpressionFactory.isArray(input)];
18
+
19
+ // CHECK TAGS
20
+ for (const tag of tagList)
21
+ if (tag.kind === "minItems")
22
+ conditions.push(
23
+ ts.factory.createLessThanEquals(
24
+ ts.factory.createNumericLiteral(tag.value),
25
+ IdentifierFactory.join(input, "length"),
26
+ ),
27
+ );
28
+ else if (tag.kind === "maxItems")
29
+ conditions.push(
30
+ ts.factory.createGreaterThanEquals(
31
+ ts.factory.createNumericLiteral(tag.value),
32
+ IdentifierFactory.join(input, "length"),
33
+ ),
34
+ );
35
+ else if (tag.kind === "items")
36
+ check_length(
37
+ conditions,
38
+ IdentifierFactory.join(input, "length"),
39
+ tag,
40
+ );
41
+
42
+ // COMBINATION
43
+ return conditions.reduce((x, y) => ts.factory.createLogicalAnd(x, y));
44
+ }
@@ -0,0 +1,146 @@
1
+ import ts from "typescript";
2
+
3
+ import { IdentifierFactory } from "../../factories/IdentifierFactory";
4
+ import { StatementFactory } from "../../factories/StatementFactory";
5
+
6
+ import { IExpressionEntry } from "../helpers/IExpressionEntry";
7
+ import { check_everything } from "./check_everything";
8
+ import { check_object } from "./check_object";
9
+ import { metadata_to_pattern } from "./metadata_to_pattern";
10
+
11
+ /**
12
+ * @internal
13
+ */
14
+ export const check_dynamic_properties =
15
+ (props: check_object.IProps) =>
16
+ (
17
+ regular: IExpressionEntry[],
18
+ dynamic: IExpressionEntry[],
19
+ ): ts.Expression => {
20
+ const criteria = props.entries
21
+ ? ts.factory.createCallExpression(props.entries, undefined, [
22
+ ts.factory.createCallExpression(
23
+ ts.factory.createIdentifier("Object.keys"),
24
+ undefined,
25
+ [ts.factory.createIdentifier("input")],
26
+ ),
27
+ check_dynamic_property(props)(regular, dynamic),
28
+ ])
29
+ : ts.factory.createCallExpression(
30
+ IdentifierFactory.join(
31
+ ts.factory.createCallExpression(
32
+ ts.factory.createIdentifier("Object.keys"),
33
+ undefined,
34
+ [ts.factory.createIdentifier("input")],
35
+ ),
36
+ props.assert ? "every" : "map",
37
+ ),
38
+ undefined,
39
+ [check_dynamic_property(props)(regular, dynamic)],
40
+ );
41
+ return (props.halt || ((elem) => elem))(
42
+ props.assert ? criteria : check_everything(criteria),
43
+ );
44
+ };
45
+
46
+ const check_dynamic_property =
47
+ (props: check_object.IProps) =>
48
+ (regular: IExpressionEntry[], dynamic: IExpressionEntry[]) => {
49
+ //----
50
+ // IF CONDITIONS
51
+ //----
52
+ // PREPARE ASSETS
53
+ const key = ts.factory.createIdentifier("key");
54
+ const value = ts.factory.createIdentifier("value");
55
+
56
+ const statements: ts.Statement[] = [];
57
+ const add = (exp: ts.Expression, output: ts.Expression) =>
58
+ statements.push(
59
+ ts.factory.createIfStatement(
60
+ exp,
61
+ ts.factory.createReturnStatement(output),
62
+ ),
63
+ );
64
+
65
+ // GATHER CONDITIONS
66
+ if (props.equals === true && regular.length)
67
+ add(is_regular_property(regular), props.positive);
68
+ statements.push(
69
+ StatementFactory.constant(
70
+ "value",
71
+ ts.factory.createIdentifier("input[key]"),
72
+ ),
73
+ );
74
+ add(
75
+ ts.factory.createStrictEquality(
76
+ ts.factory.createIdentifier("undefined"),
77
+ value,
78
+ ),
79
+ props.positive,
80
+ );
81
+ for (const entry of dynamic)
82
+ add(
83
+ ts.factory.createCallExpression(
84
+ ts.factory.createIdentifier(
85
+ `RegExp(/${metadata_to_pattern(true)(
86
+ entry.key,
87
+ )}/).test`,
88
+ ),
89
+ undefined,
90
+ [key],
91
+ ),
92
+ entry.expression,
93
+ );
94
+
95
+ //----
96
+ // FUNCTION BODY
97
+ //----
98
+ // CLOSURE BLOCK
99
+ const block: ts.Block = ts.factory.createBlock(
100
+ [
101
+ ...statements,
102
+ ts.factory.createReturnStatement(
103
+ props.equals === true
104
+ ? props.superfluous(value)
105
+ : props.positive,
106
+ ),
107
+ ],
108
+ true,
109
+ );
110
+
111
+ // RETURNS
112
+ return ts.factory.createArrowFunction(
113
+ undefined,
114
+ undefined,
115
+ [IdentifierFactory.parameter("key")],
116
+ undefined,
117
+ undefined,
118
+ block,
119
+ );
120
+ };
121
+
122
+ const is_regular_property = (regular: IExpressionEntry[]) =>
123
+ ts.factory.createCallExpression(
124
+ IdentifierFactory.join(
125
+ ts.factory.createArrayLiteralExpression(
126
+ regular.map((entry) =>
127
+ ts.factory.createStringLiteral(entry.key.getSoleLiteral()!),
128
+ ),
129
+ ),
130
+ "some",
131
+ ),
132
+ undefined,
133
+ [
134
+ ts.factory.createArrowFunction(
135
+ undefined,
136
+ undefined,
137
+ [IdentifierFactory.parameter("prop")],
138
+ undefined,
139
+ undefined,
140
+ ts.factory.createStrictEquality(
141
+ ts.factory.createIdentifier("key"),
142
+ ts.factory.createIdentifier("prop"),
143
+ ),
144
+ ),
145
+ ],
146
+ );