typia 5.0.4 → 5.0.5-dev.20230921-2

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 (293) hide show
  1. package/README.md +1 -1
  2. package/lib/programmers/TypiaProgrammer.js +6 -1
  3. package/lib/programmers/TypiaProgrammer.js.map +1 -1
  4. package/package.json +1 -1
  5. package/src/IRandomGenerator.ts +35 -35
  6. package/src/IValidation.ts +21 -21
  7. package/src/Primitive.ts +135 -135
  8. package/src/Resolved.ts +116 -116
  9. package/src/TypeGuardError.ts +36 -36
  10. package/src/executable/TypiaGenerateWizard.ts +85 -85
  11. package/src/executable/TypiaSetupWizard.ts +153 -153
  12. package/src/executable/setup/ArgumentParser.ts +45 -45
  13. package/src/executable/setup/CommandExecutor.ts +8 -8
  14. package/src/executable/setup/FileRetriever.ts +22 -22
  15. package/src/executable/setup/PackageManager.ts +71 -71
  16. package/src/executable/setup/PluginConfigurator.ts +70 -70
  17. package/src/executable/typia.ts +52 -52
  18. package/src/factories/CommentFactory.ts +84 -84
  19. package/src/factories/ExpressionFactory.ts +159 -159
  20. package/src/factories/IdentifierFactory.ts +74 -74
  21. package/src/factories/JsonMetadataFactory.ts +43 -43
  22. package/src/factories/LiteralFactory.ts +47 -47
  23. package/src/factories/MetadataCollection.ts +269 -269
  24. package/src/factories/MetadataCommentTagFactory.ts +629 -629
  25. package/src/factories/MetadataFactory.ts +214 -214
  26. package/src/factories/MetadataTypeTagFactory.ts +313 -313
  27. package/src/factories/NumericRangeFactory.ts +33 -33
  28. package/src/factories/ProtobufFactory.ts +272 -272
  29. package/src/factories/StatementFactory.ts +72 -72
  30. package/src/factories/TemplateFactory.ts +58 -58
  31. package/src/factories/TypeFactory.ts +119 -119
  32. package/src/factories/ValueFactory.ts +12 -12
  33. package/src/factories/internal/metadata/MetadataHelper.ts +12 -12
  34. package/src/factories/internal/metadata/emend_metadata_atomics.ts +40 -40
  35. package/src/factories/internal/metadata/emplace_metadata_alias.ts +41 -41
  36. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +41 -41
  37. package/src/factories/internal/metadata/emplace_metadata_object.ts +150 -150
  38. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +60 -60
  39. package/src/factories/internal/metadata/explore_metadata.ts +32 -32
  40. package/src/factories/internal/metadata/iterate_metadata.ts +101 -101
  41. package/src/factories/internal/metadata/iterate_metadata_alias.ts +35 -35
  42. package/src/factories/internal/metadata/iterate_metadata_array.ts +37 -37
  43. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +62 -62
  44. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  45. package/src/factories/internal/metadata/iterate_metadata_collection.ts +141 -141
  46. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +26 -26
  47. package/src/factories/internal/metadata/iterate_metadata_constant.ts +58 -58
  48. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +197 -197
  49. package/src/factories/internal/metadata/iterate_metadata_map.ts +57 -57
  50. package/src/factories/internal/metadata/iterate_metadata_native.ts +210 -210
  51. package/src/factories/internal/metadata/iterate_metadata_object.ts +44 -44
  52. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +52 -52
  53. package/src/factories/internal/metadata/iterate_metadata_set.ts +42 -42
  54. package/src/factories/internal/metadata/iterate_metadata_sort.ts +69 -69
  55. package/src/factories/internal/metadata/iterate_metadata_template.ts +47 -47
  56. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +37 -37
  57. package/src/factories/internal/metadata/iterate_metadata_union.ts +27 -27
  58. package/src/functional/$ProtobufReader.ts +201 -201
  59. package/src/functional/$ProtobufSizer.ts +147 -147
  60. package/src/functional/$ProtobufWriter.ts +151 -151
  61. package/src/functional/$any.ts +4 -4
  62. package/src/functional/$clone.ts +4 -4
  63. package/src/functional/$dictionary.ts +25 -25
  64. package/src/functional/$every.ts +11 -11
  65. package/src/functional/$guard.ts +35 -35
  66. package/src/functional/$is_between.ts +2 -2
  67. package/src/functional/$join.ts +46 -46
  68. package/src/functional/$number.ts +13 -13
  69. package/src/functional/$report.ts +15 -15
  70. package/src/functional/$rest.ts +3 -3
  71. package/src/functional/$string.ts +50 -50
  72. package/src/functional/$strlen.ts +7 -7
  73. package/src/functional/$tail.ts +5 -5
  74. package/src/functional/$varint.ts +130 -130
  75. package/src/functional/$zigzag.ts +39 -39
  76. package/src/functional/IProtobufWriter.ts +18 -18
  77. package/src/functional/Namespace.ts +133 -133
  78. package/src/index.ts +4 -4
  79. package/src/json.ts +648 -648
  80. package/src/misc.ts +651 -651
  81. package/src/module.ts +656 -656
  82. package/src/programmers/AssertProgrammer.ts +317 -317
  83. package/src/programmers/CheckerProgrammer.ts +1137 -1137
  84. package/src/programmers/FeatureProgrammer.ts +478 -478
  85. package/src/programmers/IsProgrammer.ts +252 -252
  86. package/src/programmers/RandomProgrammer.ts +878 -878
  87. package/src/programmers/TypiaProgrammer.ts +170 -163
  88. package/src/programmers/ValidateProgrammer.ts +346 -346
  89. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  90. package/src/programmers/helpers/CloneJoiner.ts +144 -144
  91. package/src/programmers/helpers/FunctionImporeter.ts +91 -91
  92. package/src/programmers/helpers/ICheckEntry.ts +13 -13
  93. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  94. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  95. package/src/programmers/helpers/ProtobufUtil.ts +125 -125
  96. package/src/programmers/helpers/ProtobufWire.ts +34 -34
  97. package/src/programmers/helpers/PruneJoiner.ts +143 -143
  98. package/src/programmers/helpers/RandomJoiner.ts +151 -151
  99. package/src/programmers/helpers/RandomRanger.ts +173 -173
  100. package/src/programmers/helpers/StringifyJoinder.ts +113 -113
  101. package/src/programmers/helpers/StringifyPredicator.ts +12 -12
  102. package/src/programmers/helpers/UnionExplorer.ts +305 -305
  103. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  104. package/src/programmers/helpers/disable_function_importer_declare.ts +32 -32
  105. package/src/programmers/internal/JSON_SCHEMA_PREFIX.ts +1 -1
  106. package/src/programmers/internal/application_alias.ts +65 -65
  107. package/src/programmers/internal/application_array.ts +53 -53
  108. package/src/programmers/internal/application_boolean.ts +15 -15
  109. package/src/programmers/internal/application_constant.ts +26 -26
  110. package/src/programmers/internal/application_default.ts +17 -17
  111. package/src/programmers/internal/application_default_string.ts +37 -37
  112. package/src/programmers/internal/application_escaped.ts +55 -55
  113. package/src/programmers/internal/application_native.ts +39 -39
  114. package/src/programmers/internal/application_number.ts +88 -88
  115. package/src/programmers/internal/application_object.ts +162 -162
  116. package/src/programmers/internal/application_schema.ts +175 -175
  117. package/src/programmers/internal/application_string.ts +51 -51
  118. package/src/programmers/internal/application_templates.ts +25 -25
  119. package/src/programmers/internal/application_tuple.ts +58 -58
  120. package/src/programmers/internal/check_array_length.ts +41 -41
  121. package/src/programmers/internal/check_bigint.ts +45 -45
  122. package/src/programmers/internal/check_dynamic_properties.ts +194 -194
  123. package/src/programmers/internal/check_everything.ts +28 -28
  124. package/src/programmers/internal/check_native.ts +21 -21
  125. package/src/programmers/internal/check_number.ts +105 -105
  126. package/src/programmers/internal/check_object.ts +55 -55
  127. package/src/programmers/internal/check_string.ts +45 -45
  128. package/src/programmers/internal/check_template.ts +61 -61
  129. package/src/programmers/internal/check_union_array_like.ts +323 -323
  130. package/src/programmers/internal/decode_union_object.ts +84 -84
  131. package/src/programmers/internal/feature_object_entries.ts +58 -58
  132. package/src/programmers/internal/metadata_to_pattern.ts +34 -34
  133. package/src/programmers/internal/prune_object_properties.ts +60 -60
  134. package/src/programmers/internal/random_custom.ts +37 -37
  135. package/src/programmers/internal/stringify_dynamic_properties.ts +171 -171
  136. package/src/programmers/internal/stringify_native.ts +7 -7
  137. package/src/programmers/internal/stringify_regular_properties.ts +83 -83
  138. package/src/programmers/internal/template_to_pattern.ts +15 -15
  139. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +20 -20
  140. package/src/programmers/json/JsonApplicationProgrammer.ts +50 -50
  141. package/src/programmers/json/JsonAssertParseProgrammer.ts +71 -71
  142. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +66 -66
  143. package/src/programmers/json/JsonIsParseProgrammer.ts +77 -77
  144. package/src/programmers/json/JsonIsStringifyProgrammer.ts +76 -76
  145. package/src/programmers/json/JsonStringifyProgrammer.ts +964 -964
  146. package/src/programmers/json/JsonValidateParseProgrammer.ts +68 -68
  147. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +84 -84
  148. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +71 -71
  149. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +68 -68
  150. package/src/programmers/misc/MiscCloneProgrammer.ts +774 -774
  151. package/src/programmers/misc/MiscIsCloneProgrammer.ts +78 -78
  152. package/src/programmers/misc/MiscIsPruneProgrammer.ts +73 -73
  153. package/src/programmers/misc/MiscLiteralsProgrammer.ts +69 -69
  154. package/src/programmers/misc/MiscPruneProgrammer.ts +550 -550
  155. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +85 -85
  156. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +78 -78
  157. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +75 -75
  158. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +66 -66
  159. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +655 -655
  160. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +883 -883
  161. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +85 -85
  162. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +76 -76
  163. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +165 -165
  164. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +75 -75
  165. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +86 -86
  166. package/src/protobuf.ts +881 -881
  167. package/src/schemas/json/IJsonApplication.ts +8 -8
  168. package/src/schemas/json/IJsonComponents.ts +33 -33
  169. package/src/schemas/json/IJsonSchema.ts +110 -110
  170. package/src/schemas/metadata/IJsDocTagInfo.ts +10 -10
  171. package/src/schemas/metadata/IMetadata.ts +34 -34
  172. package/src/schemas/metadata/IMetadataAlias.ts +12 -12
  173. package/src/schemas/metadata/IMetadataApplication.ts +7 -7
  174. package/src/schemas/metadata/IMetadataArray.ts +7 -7
  175. package/src/schemas/metadata/IMetadataArrayType.ts +10 -10
  176. package/src/schemas/metadata/IMetadataAtomic.ts +6 -6
  177. package/src/schemas/metadata/IMetadataCollection.ts +11 -11
  178. package/src/schemas/metadata/IMetadataConstant.ts +16 -16
  179. package/src/schemas/metadata/IMetadataDictionary.ts +14 -14
  180. package/src/schemas/metadata/IMetadataEntry.ts +6 -6
  181. package/src/schemas/metadata/IMetadataEscaped.ts +6 -6
  182. package/src/schemas/metadata/IMetadataObject.ts +18 -18
  183. package/src/schemas/metadata/IMetadataProperty.ts +9 -9
  184. package/src/schemas/metadata/IMetadataTuple.ts +7 -7
  185. package/src/schemas/metadata/IMetadataTupleType.ts +10 -10
  186. package/src/schemas/metadata/IMetadataTypeTag.ts +8 -8
  187. package/src/schemas/metadata/Metadata.ts +685 -685
  188. package/src/schemas/metadata/MetadataAlias.ts +61 -61
  189. package/src/schemas/metadata/MetadataArray.ts +49 -49
  190. package/src/schemas/metadata/MetadataArrayType.ts +57 -57
  191. package/src/schemas/metadata/MetadataAtomic.ts +42 -42
  192. package/src/schemas/metadata/MetadataConstant.ts +3 -3
  193. package/src/schemas/metadata/MetadataEscaped.ts +51 -51
  194. package/src/schemas/metadata/MetadataObject.ts +139 -139
  195. package/src/schemas/metadata/MetadataProperty.ts +59 -59
  196. package/src/schemas/metadata/MetadataTuple.ts +32 -32
  197. package/src/schemas/metadata/MetadataTupleType.ts +67 -67
  198. package/src/tags/ExclusiveMaximum.ts +13 -13
  199. package/src/tags/ExclusiveMinimum.ts +13 -13
  200. package/src/tags/Format.ts +30 -30
  201. package/src/tags/MaxItems.ts +9 -9
  202. package/src/tags/MaxLength.ts +9 -9
  203. package/src/tags/Maximum.ts +13 -13
  204. package/src/tags/MinItems.ts +9 -9
  205. package/src/tags/MinLength.ts +9 -9
  206. package/src/tags/Minimum.ts +13 -13
  207. package/src/tags/MultipleOf.ts +15 -15
  208. package/src/tags/Pattern.ts +8 -8
  209. package/src/tags/TagBase.ts +68 -68
  210. package/src/tags/Type.ts +27 -27
  211. package/src/tags/index.ts +13 -13
  212. package/src/transform.ts +35 -35
  213. package/src/transformers/CallExpressionTransformer.ts +243 -243
  214. package/src/transformers/FileTransformer.ts +57 -57
  215. package/src/transformers/IProject.ts +15 -15
  216. package/src/transformers/ITransformOptions.ts +62 -62
  217. package/src/transformers/ImportTransformer.ts +66 -66
  218. package/src/transformers/NodeTransformer.ts +13 -13
  219. package/src/transformers/TransformerError.ts +55 -55
  220. package/src/transformers/features/AssertTransformer.ts +11 -11
  221. package/src/transformers/features/CreateAssertTransformer.ts +13 -13
  222. package/src/transformers/features/CreateIsTransformer.ts +11 -11
  223. package/src/transformers/features/CreateRandomTransformer.ts +43 -43
  224. package/src/transformers/features/CreateValidateTransformer.ts +13 -13
  225. package/src/transformers/features/IsTransformer.ts +11 -11
  226. package/src/transformers/features/RandomTransformer.ts +46 -46
  227. package/src/transformers/features/ValidateTransformer.ts +11 -11
  228. package/src/transformers/features/json/JsonApplicationTransformer.ts +118 -118
  229. package/src/transformers/features/json/JsonAssertParseTransformer.ts +10 -10
  230. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +10 -10
  231. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +10 -10
  232. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +12 -12
  233. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +9 -9
  234. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +10 -10
  235. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +9 -9
  236. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +10 -10
  237. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +12 -12
  238. package/src/transformers/features/json/JsonIsParseTransformer.ts +9 -9
  239. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +10 -10
  240. package/src/transformers/features/json/JsonStringifyTransformer.ts +9 -9
  241. package/src/transformers/features/json/JsonValidateParseTransformer.ts +10 -10
  242. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +10 -10
  243. package/src/transformers/features/misc/MetadataTransformer.ts +61 -61
  244. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +10 -10
  245. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +10 -10
  246. package/src/transformers/features/misc/MiscCloneTransformer.ts +9 -9
  247. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +10 -10
  248. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +10 -10
  249. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +9 -9
  250. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +9 -9
  251. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +9 -9
  252. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +9 -9
  253. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +10 -10
  254. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +10 -10
  255. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +9 -9
  256. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +9 -9
  257. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +32 -32
  258. package/src/transformers/features/misc/MiscPruneTransformer.ts +9 -9
  259. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +10 -10
  260. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +10 -10
  261. package/src/transformers/features/protobuf/CreateProtobufAssertDecodeTransformer.ts +12 -12
  262. package/src/transformers/features/protobuf/CreateProtobufAssertEncodeTransformer.ts +12 -12
  263. package/src/transformers/features/protobuf/CreateProtobufDecodeTransformer.ts +9 -9
  264. package/src/transformers/features/protobuf/CreateProtobufEncodeTransformer.ts +9 -9
  265. package/src/transformers/features/protobuf/CreateProtobufIsDecodeTransformer.ts +12 -12
  266. package/src/transformers/features/protobuf/CreateProtobufIsEncodeTransformer.ts +12 -12
  267. package/src/transformers/features/protobuf/CreateProtobufValidateDecodeTransformer.ts +12 -12
  268. package/src/transformers/features/protobuf/CreateProtobufValidateEncodeTransformer.ts +12 -12
  269. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +10 -10
  270. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +10 -10
  271. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +10 -10
  272. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +10 -10
  273. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +10 -10
  274. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +10 -10
  275. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +33 -33
  276. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +12 -12
  277. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +12 -12
  278. package/src/transformers/internal/GenericTransformer.ts +104 -104
  279. package/src/typings/Atomic.ts +18 -18
  280. package/src/typings/ClassProperties.ts +5 -5
  281. package/src/typings/Customizable.ts +5 -5
  282. package/src/typings/OmitNever.ts +3 -3
  283. package/src/typings/ProtobufAtomic.ts +19 -19
  284. package/src/typings/SpecialFields.ts +3 -3
  285. package/src/typings/ValidationPipe.ts +9 -9
  286. package/src/typings/Writable.ts +11 -11
  287. package/src/utils/ArrayUtil.ts +45 -45
  288. package/src/utils/Escaper.ts +46 -46
  289. package/src/utils/MapUtil.ts +12 -12
  290. package/src/utils/NameEncoder.ts +32 -32
  291. package/src/utils/PatternUtil.ts +33 -33
  292. package/src/utils/RandomGenerator.ts +83 -83
  293. 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
+ }