typia 5.0.4 → 5.0.5-dev.20230921

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