typia 5.0.5 → 5.1.0-dev.20230923

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 (292) hide show
  1. package/lib/factories/MetadataCollection.js +25 -9
  2. package/lib/factories/MetadataCollection.js.map +1 -1
  3. package/package.json +1 -1
  4. package/src/IRandomGenerator.ts +35 -35
  5. package/src/IValidation.ts +21 -21
  6. package/src/Primitive.ts +135 -135
  7. package/src/Resolved.ts +116 -116
  8. package/src/TypeGuardError.ts +36 -36
  9. package/src/executable/TypiaGenerateWizard.ts +85 -85
  10. package/src/executable/TypiaSetupWizard.ts +153 -153
  11. package/src/executable/setup/ArgumentParser.ts +45 -45
  12. package/src/executable/setup/CommandExecutor.ts +8 -8
  13. package/src/executable/setup/FileRetriever.ts +22 -22
  14. package/src/executable/setup/PackageManager.ts +71 -71
  15. package/src/executable/setup/PluginConfigurator.ts +70 -70
  16. package/src/executable/typia.ts +52 -52
  17. package/src/factories/CommentFactory.ts +84 -84
  18. package/src/factories/ExpressionFactory.ts +159 -159
  19. package/src/factories/IdentifierFactory.ts +74 -74
  20. package/src/factories/JsonMetadataFactory.ts +43 -43
  21. package/src/factories/LiteralFactory.ts +47 -47
  22. package/src/factories/MetadataCollection.ts +274 -269
  23. package/src/factories/MetadataCommentTagFactory.ts +629 -629
  24. package/src/factories/MetadataFactory.ts +214 -214
  25. package/src/factories/MetadataTypeTagFactory.ts +313 -313
  26. package/src/factories/NumericRangeFactory.ts +33 -33
  27. package/src/factories/ProtobufFactory.ts +272 -272
  28. package/src/factories/StatementFactory.ts +72 -72
  29. package/src/factories/TemplateFactory.ts +58 -58
  30. package/src/factories/TypeFactory.ts +119 -119
  31. package/src/factories/ValueFactory.ts +12 -12
  32. package/src/factories/internal/metadata/MetadataHelper.ts +12 -12
  33. package/src/factories/internal/metadata/emend_metadata_atomics.ts +40 -40
  34. package/src/factories/internal/metadata/emplace_metadata_alias.ts +41 -41
  35. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +41 -41
  36. package/src/factories/internal/metadata/emplace_metadata_object.ts +150 -150
  37. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +60 -60
  38. package/src/factories/internal/metadata/explore_metadata.ts +32 -32
  39. package/src/factories/internal/metadata/iterate_metadata.ts +101 -101
  40. package/src/factories/internal/metadata/iterate_metadata_alias.ts +35 -35
  41. package/src/factories/internal/metadata/iterate_metadata_array.ts +37 -37
  42. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +62 -62
  43. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  44. package/src/factories/internal/metadata/iterate_metadata_collection.ts +141 -141
  45. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +26 -26
  46. package/src/factories/internal/metadata/iterate_metadata_constant.ts +58 -58
  47. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +197 -197
  48. package/src/factories/internal/metadata/iterate_metadata_map.ts +57 -57
  49. package/src/factories/internal/metadata/iterate_metadata_native.ts +210 -210
  50. package/src/factories/internal/metadata/iterate_metadata_object.ts +44 -44
  51. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +52 -52
  52. package/src/factories/internal/metadata/iterate_metadata_set.ts +42 -42
  53. package/src/factories/internal/metadata/iterate_metadata_sort.ts +69 -69
  54. package/src/factories/internal/metadata/iterate_metadata_template.ts +47 -47
  55. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +37 -37
  56. package/src/factories/internal/metadata/iterate_metadata_union.ts +27 -27
  57. package/src/functional/$ProtobufReader.ts +201 -201
  58. package/src/functional/$ProtobufSizer.ts +147 -147
  59. package/src/functional/$ProtobufWriter.ts +151 -151
  60. package/src/functional/$any.ts +4 -4
  61. package/src/functional/$clone.ts +4 -4
  62. package/src/functional/$dictionary.ts +25 -25
  63. package/src/functional/$every.ts +11 -11
  64. package/src/functional/$guard.ts +35 -35
  65. package/src/functional/$is_between.ts +2 -2
  66. package/src/functional/$join.ts +46 -46
  67. package/src/functional/$number.ts +13 -13
  68. package/src/functional/$report.ts +15 -15
  69. package/src/functional/$rest.ts +3 -3
  70. package/src/functional/$string.ts +50 -50
  71. package/src/functional/$strlen.ts +7 -7
  72. package/src/functional/$tail.ts +5 -5
  73. package/src/functional/$varint.ts +130 -130
  74. package/src/functional/$zigzag.ts +39 -39
  75. package/src/functional/IProtobufWriter.ts +18 -18
  76. package/src/functional/Namespace.ts +133 -133
  77. package/src/index.ts +4 -4
  78. package/src/json.ts +648 -648
  79. package/src/misc.ts +651 -651
  80. package/src/module.ts +656 -656
  81. package/src/programmers/AssertProgrammer.ts +317 -317
  82. package/src/programmers/CheckerProgrammer.ts +1137 -1137
  83. package/src/programmers/FeatureProgrammer.ts +478 -478
  84. package/src/programmers/IsProgrammer.ts +252 -252
  85. package/src/programmers/RandomProgrammer.ts +878 -878
  86. package/src/programmers/TypiaProgrammer.ts +169 -169
  87. package/src/programmers/ValidateProgrammer.ts +346 -346
  88. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  89. package/src/programmers/helpers/CloneJoiner.ts +144 -144
  90. package/src/programmers/helpers/FunctionImporeter.ts +91 -91
  91. package/src/programmers/helpers/ICheckEntry.ts +13 -13
  92. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  93. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  94. package/src/programmers/helpers/ProtobufUtil.ts +125 -125
  95. package/src/programmers/helpers/ProtobufWire.ts +34 -34
  96. package/src/programmers/helpers/PruneJoiner.ts +143 -143
  97. package/src/programmers/helpers/RandomJoiner.ts +151 -151
  98. package/src/programmers/helpers/RandomRanger.ts +173 -173
  99. package/src/programmers/helpers/StringifyJoinder.ts +113 -113
  100. package/src/programmers/helpers/StringifyPredicator.ts +12 -12
  101. package/src/programmers/helpers/UnionExplorer.ts +305 -305
  102. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  103. package/src/programmers/helpers/disable_function_importer_declare.ts +32 -32
  104. package/src/programmers/internal/JSON_SCHEMA_PREFIX.ts +1 -1
  105. package/src/programmers/internal/application_alias.ts +65 -65
  106. package/src/programmers/internal/application_array.ts +53 -53
  107. package/src/programmers/internal/application_boolean.ts +15 -15
  108. package/src/programmers/internal/application_constant.ts +26 -26
  109. package/src/programmers/internal/application_default.ts +17 -17
  110. package/src/programmers/internal/application_default_string.ts +37 -37
  111. package/src/programmers/internal/application_escaped.ts +55 -55
  112. package/src/programmers/internal/application_native.ts +39 -39
  113. package/src/programmers/internal/application_number.ts +88 -88
  114. package/src/programmers/internal/application_object.ts +162 -162
  115. package/src/programmers/internal/application_schema.ts +175 -175
  116. package/src/programmers/internal/application_string.ts +51 -51
  117. package/src/programmers/internal/application_templates.ts +25 -25
  118. package/src/programmers/internal/application_tuple.ts +58 -58
  119. package/src/programmers/internal/check_array_length.ts +41 -41
  120. package/src/programmers/internal/check_bigint.ts +45 -45
  121. package/src/programmers/internal/check_dynamic_properties.ts +194 -194
  122. package/src/programmers/internal/check_everything.ts +28 -28
  123. package/src/programmers/internal/check_native.ts +21 -21
  124. package/src/programmers/internal/check_number.ts +105 -105
  125. package/src/programmers/internal/check_object.ts +55 -55
  126. package/src/programmers/internal/check_string.ts +45 -45
  127. package/src/programmers/internal/check_template.ts +61 -61
  128. package/src/programmers/internal/check_union_array_like.ts +323 -323
  129. package/src/programmers/internal/decode_union_object.ts +84 -84
  130. package/src/programmers/internal/feature_object_entries.ts +58 -58
  131. package/src/programmers/internal/metadata_to_pattern.ts +34 -34
  132. package/src/programmers/internal/prune_object_properties.ts +60 -60
  133. package/src/programmers/internal/random_custom.ts +37 -37
  134. package/src/programmers/internal/stringify_dynamic_properties.ts +171 -171
  135. package/src/programmers/internal/stringify_native.ts +7 -7
  136. package/src/programmers/internal/stringify_regular_properties.ts +83 -83
  137. package/src/programmers/internal/template_to_pattern.ts +15 -15
  138. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +20 -20
  139. package/src/programmers/json/JsonApplicationProgrammer.ts +50 -50
  140. package/src/programmers/json/JsonAssertParseProgrammer.ts +71 -71
  141. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +66 -66
  142. package/src/programmers/json/JsonIsParseProgrammer.ts +77 -77
  143. package/src/programmers/json/JsonIsStringifyProgrammer.ts +76 -76
  144. package/src/programmers/json/JsonStringifyProgrammer.ts +964 -964
  145. package/src/programmers/json/JsonValidateParseProgrammer.ts +68 -68
  146. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +84 -84
  147. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +71 -71
  148. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +68 -68
  149. package/src/programmers/misc/MiscCloneProgrammer.ts +774 -774
  150. package/src/programmers/misc/MiscIsCloneProgrammer.ts +78 -78
  151. package/src/programmers/misc/MiscIsPruneProgrammer.ts +73 -73
  152. package/src/programmers/misc/MiscLiteralsProgrammer.ts +69 -69
  153. package/src/programmers/misc/MiscPruneProgrammer.ts +550 -550
  154. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +85 -85
  155. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +78 -78
  156. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +75 -75
  157. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +66 -66
  158. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +655 -655
  159. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +883 -883
  160. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +85 -85
  161. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +76 -76
  162. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +165 -165
  163. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +75 -75
  164. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +86 -86
  165. package/src/protobuf.ts +881 -881
  166. package/src/schemas/json/IJsonApplication.ts +8 -8
  167. package/src/schemas/json/IJsonComponents.ts +33 -33
  168. package/src/schemas/json/IJsonSchema.ts +110 -110
  169. package/src/schemas/metadata/IJsDocTagInfo.ts +10 -10
  170. package/src/schemas/metadata/IMetadata.ts +34 -34
  171. package/src/schemas/metadata/IMetadataAlias.ts +12 -12
  172. package/src/schemas/metadata/IMetadataApplication.ts +7 -7
  173. package/src/schemas/metadata/IMetadataArray.ts +7 -7
  174. package/src/schemas/metadata/IMetadataArrayType.ts +10 -10
  175. package/src/schemas/metadata/IMetadataAtomic.ts +6 -6
  176. package/src/schemas/metadata/IMetadataCollection.ts +11 -11
  177. package/src/schemas/metadata/IMetadataConstant.ts +16 -16
  178. package/src/schemas/metadata/IMetadataDictionary.ts +14 -14
  179. package/src/schemas/metadata/IMetadataEntry.ts +6 -6
  180. package/src/schemas/metadata/IMetadataEscaped.ts +6 -6
  181. package/src/schemas/metadata/IMetadataObject.ts +18 -18
  182. package/src/schemas/metadata/IMetadataProperty.ts +9 -9
  183. package/src/schemas/metadata/IMetadataTuple.ts +7 -7
  184. package/src/schemas/metadata/IMetadataTupleType.ts +10 -10
  185. package/src/schemas/metadata/IMetadataTypeTag.ts +8 -8
  186. package/src/schemas/metadata/Metadata.ts +685 -685
  187. package/src/schemas/metadata/MetadataAlias.ts +61 -61
  188. package/src/schemas/metadata/MetadataArray.ts +49 -49
  189. package/src/schemas/metadata/MetadataArrayType.ts +57 -57
  190. package/src/schemas/metadata/MetadataAtomic.ts +42 -42
  191. package/src/schemas/metadata/MetadataConstant.ts +3 -3
  192. package/src/schemas/metadata/MetadataEscaped.ts +51 -51
  193. package/src/schemas/metadata/MetadataObject.ts +139 -139
  194. package/src/schemas/metadata/MetadataProperty.ts +59 -59
  195. package/src/schemas/metadata/MetadataTuple.ts +32 -32
  196. package/src/schemas/metadata/MetadataTupleType.ts +67 -67
  197. package/src/tags/ExclusiveMaximum.ts +13 -13
  198. package/src/tags/ExclusiveMinimum.ts +13 -13
  199. package/src/tags/Format.ts +30 -30
  200. package/src/tags/MaxItems.ts +9 -9
  201. package/src/tags/MaxLength.ts +9 -9
  202. package/src/tags/Maximum.ts +13 -13
  203. package/src/tags/MinItems.ts +9 -9
  204. package/src/tags/MinLength.ts +9 -9
  205. package/src/tags/Minimum.ts +13 -13
  206. package/src/tags/MultipleOf.ts +15 -15
  207. package/src/tags/Pattern.ts +8 -8
  208. package/src/tags/TagBase.ts +68 -68
  209. package/src/tags/Type.ts +27 -27
  210. package/src/tags/index.ts +13 -13
  211. package/src/transform.ts +35 -35
  212. package/src/transformers/CallExpressionTransformer.ts +243 -243
  213. package/src/transformers/FileTransformer.ts +57 -57
  214. package/src/transformers/IProject.ts +15 -15
  215. package/src/transformers/ITransformOptions.ts +62 -62
  216. package/src/transformers/ImportTransformer.ts +66 -66
  217. package/src/transformers/NodeTransformer.ts +13 -13
  218. package/src/transformers/TransformerError.ts +55 -55
  219. package/src/transformers/features/AssertTransformer.ts +11 -11
  220. package/src/transformers/features/CreateAssertTransformer.ts +13 -13
  221. package/src/transformers/features/CreateIsTransformer.ts +11 -11
  222. package/src/transformers/features/CreateRandomTransformer.ts +43 -43
  223. package/src/transformers/features/CreateValidateTransformer.ts +13 -13
  224. package/src/transformers/features/IsTransformer.ts +11 -11
  225. package/src/transformers/features/RandomTransformer.ts +46 -46
  226. package/src/transformers/features/ValidateTransformer.ts +11 -11
  227. package/src/transformers/features/json/JsonApplicationTransformer.ts +118 -118
  228. package/src/transformers/features/json/JsonAssertParseTransformer.ts +10 -10
  229. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +10 -10
  230. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +10 -10
  231. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +12 -12
  232. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +9 -9
  233. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +10 -10
  234. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +9 -9
  235. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +10 -10
  236. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +12 -12
  237. package/src/transformers/features/json/JsonIsParseTransformer.ts +9 -9
  238. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +10 -10
  239. package/src/transformers/features/json/JsonStringifyTransformer.ts +9 -9
  240. package/src/transformers/features/json/JsonValidateParseTransformer.ts +10 -10
  241. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +10 -10
  242. package/src/transformers/features/misc/MetadataTransformer.ts +61 -61
  243. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +10 -10
  244. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +10 -10
  245. package/src/transformers/features/misc/MiscCloneTransformer.ts +9 -9
  246. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +10 -10
  247. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +10 -10
  248. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +9 -9
  249. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +9 -9
  250. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +9 -9
  251. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +9 -9
  252. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +10 -10
  253. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +10 -10
  254. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +9 -9
  255. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +9 -9
  256. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +32 -32
  257. package/src/transformers/features/misc/MiscPruneTransformer.ts +9 -9
  258. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +10 -10
  259. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +10 -10
  260. package/src/transformers/features/protobuf/CreateProtobufAssertDecodeTransformer.ts +12 -12
  261. package/src/transformers/features/protobuf/CreateProtobufAssertEncodeTransformer.ts +12 -12
  262. package/src/transformers/features/protobuf/CreateProtobufDecodeTransformer.ts +9 -9
  263. package/src/transformers/features/protobuf/CreateProtobufEncodeTransformer.ts +9 -9
  264. package/src/transformers/features/protobuf/CreateProtobufIsDecodeTransformer.ts +12 -12
  265. package/src/transformers/features/protobuf/CreateProtobufIsEncodeTransformer.ts +12 -12
  266. package/src/transformers/features/protobuf/CreateProtobufValidateDecodeTransformer.ts +12 -12
  267. package/src/transformers/features/protobuf/CreateProtobufValidateEncodeTransformer.ts +12 -12
  268. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +10 -10
  269. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +10 -10
  270. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +10 -10
  271. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +10 -10
  272. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +10 -10
  273. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +10 -10
  274. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +33 -33
  275. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +12 -12
  276. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +12 -12
  277. package/src/transformers/internal/GenericTransformer.ts +104 -104
  278. package/src/typings/Atomic.ts +18 -18
  279. package/src/typings/ClassProperties.ts +5 -5
  280. package/src/typings/Customizable.ts +5 -5
  281. package/src/typings/OmitNever.ts +3 -3
  282. package/src/typings/ProtobufAtomic.ts +19 -19
  283. package/src/typings/SpecialFields.ts +3 -3
  284. package/src/typings/ValidationPipe.ts +9 -9
  285. package/src/typings/Writable.ts +11 -11
  286. package/src/utils/ArrayUtil.ts +45 -45
  287. package/src/utils/Escaper.ts +46 -46
  288. package/src/utils/MapUtil.ts +12 -12
  289. package/src/utils/NameEncoder.ts +32 -32
  290. package/src/utils/PatternUtil.ts +33 -33
  291. package/src/utils/RandomGenerator.ts +83 -83
  292. package/src/utils/Singleton.ts +17 -17
@@ -1,159 +1,159 @@
1
- import ts from "typescript";
2
-
3
- import { RandomGenerator } from "../utils/RandomGenerator";
4
-
5
- export namespace ExpressionFactory {
6
- export const bigint = (value: number | bigint) =>
7
- ts.factory.createCallExpression(
8
- ts.factory.createIdentifier("BigInt"),
9
- undefined,
10
- [ts.factory.createIdentifier(value.toString())],
11
- );
12
-
13
- export const isRequired = (input: ts.Expression): ts.Expression =>
14
- ts.factory.createStrictInequality(
15
- ts.factory.createIdentifier("undefined"),
16
- input,
17
- );
18
-
19
- export const isArray = (input: ts.Expression): ts.Expression =>
20
- ts.factory.createCallExpression(
21
- ts.factory.createIdentifier("Array.isArray"),
22
- undefined,
23
- [input],
24
- );
25
-
26
- export const isObject =
27
- (options: { checkNull: boolean; checkArray: boolean }) =>
28
- (input: ts.Expression): ts.Expression => {
29
- const conditions: ts.Expression[] = [
30
- ts.factory.createStrictEquality(
31
- ts.factory.createStringLiteral("object"),
32
- ts.factory.createTypeOfExpression(input),
33
- ),
34
- ];
35
- if (options.checkNull === true)
36
- conditions.push(
37
- ts.factory.createStrictInequality(
38
- ts.factory.createNull(),
39
- input,
40
- ),
41
- );
42
- if (options.checkArray === true)
43
- conditions.push(
44
- ts.factory.createStrictEquality(
45
- ts.factory.createFalse(),
46
- ts.factory.createCallExpression(
47
- ts.factory.createIdentifier("Array.isArray"),
48
- undefined,
49
- [input],
50
- ),
51
- ),
52
- );
53
-
54
- return conditions.length === 1
55
- ? conditions[0]!
56
- : conditions.reduce((x, y) =>
57
- ts.factory.createLogicalAnd(x, y),
58
- );
59
- };
60
-
61
- export const isInstanceOf =
62
- (type: string) =>
63
- (input: ts.Expression): ts.Expression => {
64
- return ts.factory.createBinaryExpression(
65
- input,
66
- ts.factory.createToken(ts.SyntaxKind.InstanceOfKeyword),
67
- ts.factory.createIdentifier(type),
68
- );
69
- };
70
-
71
- export const coalesce =
72
- (x: ts.Expression) =>
73
- (y: ts.Expression): ts.Expression =>
74
- ts.factory.createBinaryExpression(
75
- x,
76
- ts.factory.createToken(ts.SyntaxKind.QuestionQuestionToken),
77
- y,
78
- );
79
-
80
- export const currying =
81
- (target: ts.Expression) => (parameters: ts.Expression[]) => {
82
- if (parameters.length === 0)
83
- return ts.factory.createCallExpression(
84
- target,
85
- undefined,
86
- undefined,
87
- );
88
- let prev: ts.CallExpression = ts.factory.createCallExpression(
89
- target,
90
- undefined,
91
- [parameters[0]!],
92
- );
93
- for (const param of parameters.slice(1))
94
- prev = ts.factory.createCallExpression(prev, undefined, [
95
- param,
96
- ]);
97
- return prev;
98
- };
99
-
100
- export const selfCall = (body: ts.ConciseBody) =>
101
- ts.isCallExpression(body)
102
- ? body
103
- : ts.factory.createCallExpression(
104
- ts.factory.createParenthesizedExpression(
105
- ts.factory.createArrowFunction(
106
- undefined,
107
- undefined,
108
- [],
109
- undefined,
110
- undefined,
111
- body,
112
- ),
113
- ),
114
- undefined,
115
- undefined,
116
- );
117
-
118
- export const getEscapedText =
119
- (printer: ts.Printer) =>
120
- (input: ts.Expression): string =>
121
- printer.printNode(
122
- ts.EmitHint.Expression,
123
- input,
124
- input.getSourceFile(),
125
- );
126
-
127
- export const transpile =
128
- (context: ts.TransformationContext) =>
129
- (script: string) =>
130
- (input: ts.Expression): ts.Expression => {
131
- const file: ts.SourceFile = ts.createSourceFile(
132
- `${RandomGenerator.uuid()}.ts`,
133
- script,
134
- ts.ScriptTarget.ESNext,
135
- true,
136
- ts.ScriptKind.TS,
137
- );
138
- const statement: ts.Statement | undefined = file.statements[0];
139
- if (statement === undefined)
140
- throw new ReferenceError(
141
- "Error on ExpressionFactory.transpile(): no statement exists.",
142
- );
143
- else if (!ts.isExpressionStatement(statement))
144
- throw new TypeError(
145
- "Error on ExpressionFactory.transpile(): statement is not an expression statement.",
146
- );
147
-
148
- const visitor = (node: ts.Node): ts.Node => {
149
- if (ts.isIdentifier(node) && node.text === "$input")
150
- return input;
151
- return ts.visitEachChild(
152
- (ts.factory as any).cloneNode(node),
153
- visitor,
154
- context,
155
- );
156
- };
157
- return visitor(statement.expression) as ts.Expression;
158
- };
159
- }
1
+ import ts from "typescript";
2
+
3
+ import { RandomGenerator } from "../utils/RandomGenerator";
4
+
5
+ export namespace ExpressionFactory {
6
+ export const bigint = (value: number | bigint) =>
7
+ ts.factory.createCallExpression(
8
+ ts.factory.createIdentifier("BigInt"),
9
+ undefined,
10
+ [ts.factory.createIdentifier(value.toString())],
11
+ );
12
+
13
+ export const isRequired = (input: ts.Expression): ts.Expression =>
14
+ ts.factory.createStrictInequality(
15
+ ts.factory.createIdentifier("undefined"),
16
+ input,
17
+ );
18
+
19
+ export const isArray = (input: ts.Expression): ts.Expression =>
20
+ ts.factory.createCallExpression(
21
+ ts.factory.createIdentifier("Array.isArray"),
22
+ undefined,
23
+ [input],
24
+ );
25
+
26
+ export const isObject =
27
+ (options: { checkNull: boolean; checkArray: boolean }) =>
28
+ (input: ts.Expression): ts.Expression => {
29
+ const conditions: ts.Expression[] = [
30
+ ts.factory.createStrictEquality(
31
+ ts.factory.createStringLiteral("object"),
32
+ ts.factory.createTypeOfExpression(input),
33
+ ),
34
+ ];
35
+ if (options.checkNull === true)
36
+ conditions.push(
37
+ ts.factory.createStrictInequality(
38
+ ts.factory.createNull(),
39
+ input,
40
+ ),
41
+ );
42
+ if (options.checkArray === true)
43
+ conditions.push(
44
+ ts.factory.createStrictEquality(
45
+ ts.factory.createFalse(),
46
+ ts.factory.createCallExpression(
47
+ ts.factory.createIdentifier("Array.isArray"),
48
+ undefined,
49
+ [input],
50
+ ),
51
+ ),
52
+ );
53
+
54
+ return conditions.length === 1
55
+ ? conditions[0]!
56
+ : conditions.reduce((x, y) =>
57
+ ts.factory.createLogicalAnd(x, y),
58
+ );
59
+ };
60
+
61
+ export const isInstanceOf =
62
+ (type: string) =>
63
+ (input: ts.Expression): ts.Expression => {
64
+ return ts.factory.createBinaryExpression(
65
+ input,
66
+ ts.factory.createToken(ts.SyntaxKind.InstanceOfKeyword),
67
+ ts.factory.createIdentifier(type),
68
+ );
69
+ };
70
+
71
+ export const coalesce =
72
+ (x: ts.Expression) =>
73
+ (y: ts.Expression): ts.Expression =>
74
+ ts.factory.createBinaryExpression(
75
+ x,
76
+ ts.factory.createToken(ts.SyntaxKind.QuestionQuestionToken),
77
+ y,
78
+ );
79
+
80
+ export const currying =
81
+ (target: ts.Expression) => (parameters: ts.Expression[]) => {
82
+ if (parameters.length === 0)
83
+ return ts.factory.createCallExpression(
84
+ target,
85
+ undefined,
86
+ undefined,
87
+ );
88
+ let prev: ts.CallExpression = ts.factory.createCallExpression(
89
+ target,
90
+ undefined,
91
+ [parameters[0]!],
92
+ );
93
+ for (const param of parameters.slice(1))
94
+ prev = ts.factory.createCallExpression(prev, undefined, [
95
+ param,
96
+ ]);
97
+ return prev;
98
+ };
99
+
100
+ export const selfCall = (body: ts.ConciseBody) =>
101
+ ts.isCallExpression(body)
102
+ ? body
103
+ : ts.factory.createCallExpression(
104
+ ts.factory.createParenthesizedExpression(
105
+ ts.factory.createArrowFunction(
106
+ undefined,
107
+ undefined,
108
+ [],
109
+ undefined,
110
+ undefined,
111
+ body,
112
+ ),
113
+ ),
114
+ undefined,
115
+ undefined,
116
+ );
117
+
118
+ export const getEscapedText =
119
+ (printer: ts.Printer) =>
120
+ (input: ts.Expression): string =>
121
+ printer.printNode(
122
+ ts.EmitHint.Expression,
123
+ input,
124
+ input.getSourceFile(),
125
+ );
126
+
127
+ export const transpile =
128
+ (context: ts.TransformationContext) =>
129
+ (script: string) =>
130
+ (input: ts.Expression): ts.Expression => {
131
+ const file: ts.SourceFile = ts.createSourceFile(
132
+ `${RandomGenerator.uuid()}.ts`,
133
+ script,
134
+ ts.ScriptTarget.ESNext,
135
+ true,
136
+ ts.ScriptKind.TS,
137
+ );
138
+ const statement: ts.Statement | undefined = file.statements[0];
139
+ if (statement === undefined)
140
+ throw new ReferenceError(
141
+ "Error on ExpressionFactory.transpile(): no statement exists.",
142
+ );
143
+ else if (!ts.isExpressionStatement(statement))
144
+ throw new TypeError(
145
+ "Error on ExpressionFactory.transpile(): statement is not an expression statement.",
146
+ );
147
+
148
+ const visitor = (node: ts.Node): ts.Node => {
149
+ if (ts.isIdentifier(node) && node.text === "$input")
150
+ return input;
151
+ return ts.visitEachChild(
152
+ (ts.factory as any).cloneNode(node),
153
+ visitor,
154
+ context,
155
+ );
156
+ };
157
+ return visitor(statement.expression) as ts.Expression;
158
+ };
159
+ }
@@ -1,74 +1,74 @@
1
- import ts from "typescript";
2
-
3
- import { Escaper } from "../utils/Escaper";
4
-
5
- import { TypeFactory } from "./TypeFactory";
6
-
7
- export namespace IdentifierFactory {
8
- export const identifier = (name: string) =>
9
- Escaper.variable(name)
10
- ? ts.factory.createIdentifier(name)
11
- : ts.factory.createStringLiteral(name);
12
-
13
- export const access = (target: ts.Expression) => (property: string) => {
14
- const postfix = identifier(property);
15
- return ts.isStringLiteral(postfix)
16
- ? ts.factory.createElementAccessExpression(target, postfix)
17
- : ts.factory.createPropertyAccessExpression(target, postfix);
18
- };
19
-
20
- export const getName = (input: ts.Expression): string => {
21
- const value: any = (input as any).escapedText?.toString();
22
- if (typeof value === "string") return value;
23
-
24
- if (ts.isPropertyAccessExpression(input))
25
- return `${getName(
26
- input.expression,
27
- )}.${input.name.escapedText.toString()}`;
28
- else if (ts.isElementAccessExpression(input))
29
- return `${getName(input.expression)}[${getName(
30
- input.argumentExpression,
31
- )}]`;
32
- return "uknown";
33
- };
34
-
35
- export const postfix = (str: string): string =>
36
- Escaper.variable(str)
37
- ? `".${str}"`
38
- : `"[${JSON.stringify(str).split('"').join('\\"')}]"`;
39
-
40
- export const parameter = (
41
- name: string | ts.BindingName,
42
- type?: ts.TypeNode,
43
- init?: ts.Expression | ts.PunctuationToken<ts.SyntaxKind.QuestionToken>,
44
- ) => {
45
- // instead of ts.version >= "4.8"
46
- if (ts.getDecorators !== undefined)
47
- return ts.factory.createParameterDeclaration(
48
- undefined,
49
- undefined,
50
- name,
51
- init?.kind === ts.SyntaxKind.QuestionToken
52
- ? ts.factory.createToken(ts.SyntaxKind.QuestionToken)
53
- : undefined,
54
- type ?? TypeFactory.keyword("any"),
55
- init && init.kind !== ts.SyntaxKind.QuestionToken
56
- ? init
57
- : undefined,
58
- );
59
- // eslint-disable-next-line
60
- return (ts.factory.createParameterDeclaration as any)(
61
- undefined,
62
- undefined,
63
- undefined,
64
- name,
65
- init?.kind === ts.SyntaxKind.QuestionToken
66
- ? ts.factory.createToken(ts.SyntaxKind.QuestionToken)
67
- : undefined,
68
- type,
69
- init && init.kind !== ts.SyntaxKind.QuestionToken
70
- ? init
71
- : undefined,
72
- );
73
- };
74
- }
1
+ import ts from "typescript";
2
+
3
+ import { Escaper } from "../utils/Escaper";
4
+
5
+ import { TypeFactory } from "./TypeFactory";
6
+
7
+ export namespace IdentifierFactory {
8
+ export const identifier = (name: string) =>
9
+ Escaper.variable(name)
10
+ ? ts.factory.createIdentifier(name)
11
+ : ts.factory.createStringLiteral(name);
12
+
13
+ export const access = (target: ts.Expression) => (property: string) => {
14
+ const postfix = identifier(property);
15
+ return ts.isStringLiteral(postfix)
16
+ ? ts.factory.createElementAccessExpression(target, postfix)
17
+ : ts.factory.createPropertyAccessExpression(target, postfix);
18
+ };
19
+
20
+ export const getName = (input: ts.Expression): string => {
21
+ const value: any = (input as any).escapedText?.toString();
22
+ if (typeof value === "string") return value;
23
+
24
+ if (ts.isPropertyAccessExpression(input))
25
+ return `${getName(
26
+ input.expression,
27
+ )}.${input.name.escapedText.toString()}`;
28
+ else if (ts.isElementAccessExpression(input))
29
+ return `${getName(input.expression)}[${getName(
30
+ input.argumentExpression,
31
+ )}]`;
32
+ return "uknown";
33
+ };
34
+
35
+ export const postfix = (str: string): string =>
36
+ Escaper.variable(str)
37
+ ? `".${str}"`
38
+ : `"[${JSON.stringify(str).split('"').join('\\"')}]"`;
39
+
40
+ export const parameter = (
41
+ name: string | ts.BindingName,
42
+ type?: ts.TypeNode,
43
+ init?: ts.Expression | ts.PunctuationToken<ts.SyntaxKind.QuestionToken>,
44
+ ) => {
45
+ // instead of ts.version >= "4.8"
46
+ if (ts.getDecorators !== undefined)
47
+ return ts.factory.createParameterDeclaration(
48
+ undefined,
49
+ undefined,
50
+ name,
51
+ init?.kind === ts.SyntaxKind.QuestionToken
52
+ ? ts.factory.createToken(ts.SyntaxKind.QuestionToken)
53
+ : undefined,
54
+ type ?? TypeFactory.keyword("any"),
55
+ init && init.kind !== ts.SyntaxKind.QuestionToken
56
+ ? init
57
+ : undefined,
58
+ );
59
+ // eslint-disable-next-line
60
+ return (ts.factory.createParameterDeclaration as any)(
61
+ undefined,
62
+ undefined,
63
+ undefined,
64
+ name,
65
+ init?.kind === ts.SyntaxKind.QuestionToken
66
+ ? ts.factory.createToken(ts.SyntaxKind.QuestionToken)
67
+ : undefined,
68
+ type,
69
+ init && init.kind !== ts.SyntaxKind.QuestionToken
70
+ ? init
71
+ : undefined,
72
+ );
73
+ };
74
+ }
@@ -1,43 +1,43 @@
1
- import ts from "typescript";
2
-
3
- import { Metadata } from "../schemas/metadata/Metadata";
4
-
5
- import { TransformerError } from "../transformers/TransformerError";
6
-
7
- import { MetadataCollection } from "./MetadataCollection";
8
- import { MetadataFactory } from "./MetadataFactory";
9
-
10
- export namespace JsonMetadataFactory {
11
- export const analyze =
12
- (method: string) =>
13
- (checker: ts.TypeChecker) =>
14
- (type: ts.Type): [MetadataCollection, Metadata] => {
15
- const collection = new MetadataCollection();
16
- const result = MetadataFactory.analyze(checker)({
17
- escape: true,
18
- constant: true,
19
- absorb: true,
20
- validate,
21
- })(collection)(type);
22
- if (result.success === false)
23
- throw TransformerError.from(method)(result.errors);
24
- return [collection, result.data];
25
- };
26
-
27
- export const validate = (meta: Metadata) => {
28
- const output: string[] = [];
29
- if (
30
- meta.atomics.some((a) => a.type === "bigint") ||
31
- meta.constants.some((c) => c.type === "bigint")
32
- )
33
- output.push("JSON does not support bigint type.");
34
- if (
35
- meta.tuples.some((t) =>
36
- t.type.elements.some((e) => e.isRequired() === false),
37
- ) ||
38
- meta.arrays.some((a) => a.type.value.isRequired() === false)
39
- )
40
- output.push("JSON does not support undefined type in array.");
41
- return output;
42
- };
43
- }
1
+ import ts from "typescript";
2
+
3
+ import { Metadata } from "../schemas/metadata/Metadata";
4
+
5
+ import { TransformerError } from "../transformers/TransformerError";
6
+
7
+ import { MetadataCollection } from "./MetadataCollection";
8
+ import { MetadataFactory } from "./MetadataFactory";
9
+
10
+ export namespace JsonMetadataFactory {
11
+ export const analyze =
12
+ (method: string) =>
13
+ (checker: ts.TypeChecker) =>
14
+ (type: ts.Type): [MetadataCollection, Metadata] => {
15
+ const collection = new MetadataCollection();
16
+ const result = MetadataFactory.analyze(checker)({
17
+ escape: true,
18
+ constant: true,
19
+ absorb: true,
20
+ validate,
21
+ })(collection)(type);
22
+ if (result.success === false)
23
+ throw TransformerError.from(method)(result.errors);
24
+ return [collection, result.data];
25
+ };
26
+
27
+ export const validate = (meta: Metadata) => {
28
+ const output: string[] = [];
29
+ if (
30
+ meta.atomics.some((a) => a.type === "bigint") ||
31
+ meta.constants.some((c) => c.type === "bigint")
32
+ )
33
+ output.push("JSON does not support bigint type.");
34
+ if (
35
+ meta.tuples.some((t) =>
36
+ t.type.elements.some((e) => e.isRequired() === false),
37
+ ) ||
38
+ meta.arrays.some((a) => a.type.value.isRequired() === false)
39
+ )
40
+ output.push("JSON does not support undefined type in array.");
41
+ return output;
42
+ };
43
+ }
@@ -1,47 +1,47 @@
1
- import ts from "typescript";
2
-
3
- import { ExpressionFactory } from "./ExpressionFactory";
4
- import { IdentifierFactory } from "./IdentifierFactory";
5
-
6
- export namespace LiteralFactory {
7
- export const generate = (input: any): ts.Expression => {
8
- if (input === null) return ts.factory.createNull();
9
- else if (ts.isIdentifier(input)) return input;
10
- else if (input instanceof Array) return generate_array(input);
11
- else if (typeof input === "object") return generate_object(input);
12
- else if (typeof input === "string") return generate_string(input);
13
- else if (typeof input === "boolean") return generate_value(input);
14
- else if (typeof input === "number") return generate_value(input);
15
- else if (typeof input === "bigint") return generate_bigint(input);
16
- // unreachable code
17
- else
18
- throw new TypeError(
19
- "Error on LiteralFactory.generate(): unknown type.",
20
- );
21
- };
22
-
23
- const generate_object = (obj: object): ts.ObjectLiteralExpression =>
24
- ts.factory.createObjectLiteralExpression(
25
- Object.entries(obj)
26
- .filter((tuple) => tuple[1] !== undefined)
27
- .map(([key, value]) =>
28
- ts.factory.createPropertyAssignment(
29
- IdentifierFactory.identifier(key),
30
- generate(value),
31
- ),
32
- ),
33
- true,
34
- );
35
-
36
- const generate_array = (array: any[]): ts.ArrayLiteralExpression =>
37
- ts.factory.createArrayLiteralExpression(array.map(generate), true);
38
-
39
- const generate_value = (value: number | boolean | bigint): ts.Expression =>
40
- ts.factory.createIdentifier(value.toString());
41
-
42
- const generate_bigint = (value: bigint): ts.Expression =>
43
- ExpressionFactory.bigint(value);
44
-
45
- const generate_string = (value: string): ts.StringLiteral =>
46
- ts.factory.createStringLiteral(value);
47
- }
1
+ import ts from "typescript";
2
+
3
+ import { ExpressionFactory } from "./ExpressionFactory";
4
+ import { IdentifierFactory } from "./IdentifierFactory";
5
+
6
+ export namespace LiteralFactory {
7
+ export const generate = (input: any): ts.Expression => {
8
+ if (input === null) return ts.factory.createNull();
9
+ else if (ts.isIdentifier(input)) return input;
10
+ else if (input instanceof Array) return generate_array(input);
11
+ else if (typeof input === "object") return generate_object(input);
12
+ else if (typeof input === "string") return generate_string(input);
13
+ else if (typeof input === "boolean") return generate_value(input);
14
+ else if (typeof input === "number") return generate_value(input);
15
+ else if (typeof input === "bigint") return generate_bigint(input);
16
+ // unreachable code
17
+ else
18
+ throw new TypeError(
19
+ "Error on LiteralFactory.generate(): unknown type.",
20
+ );
21
+ };
22
+
23
+ const generate_object = (obj: object): ts.ObjectLiteralExpression =>
24
+ ts.factory.createObjectLiteralExpression(
25
+ Object.entries(obj)
26
+ .filter((tuple) => tuple[1] !== undefined)
27
+ .map(([key, value]) =>
28
+ ts.factory.createPropertyAssignment(
29
+ IdentifierFactory.identifier(key),
30
+ generate(value),
31
+ ),
32
+ ),
33
+ true,
34
+ );
35
+
36
+ const generate_array = (array: any[]): ts.ArrayLiteralExpression =>
37
+ ts.factory.createArrayLiteralExpression(array.map(generate), true);
38
+
39
+ const generate_value = (value: number | boolean | bigint): ts.Expression =>
40
+ ts.factory.createIdentifier(value.toString());
41
+
42
+ const generate_bigint = (value: bigint): ts.Expression =>
43
+ ExpressionFactory.bigint(value);
44
+
45
+ const generate_string = (value: string): ts.StringLiteral =>
46
+ ts.factory.createStringLiteral(value);
47
+ }