typia 3.6.10 → 3.7.0-dev.20230331

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 (260) hide show
  1. package/lib/factories/MetadataTagFactory.js +140 -132
  2. package/lib/factories/MetadataTagFactory.js.map +1 -1
  3. package/lib/functional/$dictionary.d.ts +1 -0
  4. package/lib/functional/$dictionary.js +14 -0
  5. package/lib/functional/$dictionary.js.map +1 -0
  6. package/lib/functional/$is_custom.d.ts +2 -0
  7. package/lib/functional/$is_custom.js +12 -0
  8. package/lib/functional/$is_custom.js.map +1 -0
  9. package/lib/functional/Namespace.js +2 -0
  10. package/lib/functional/Namespace.js.map +1 -1
  11. package/lib/module.d.ts +25 -0
  12. package/lib/module.js +12 -1
  13. package/lib/module.js.map +1 -1
  14. package/lib/programmers/CheckerProgrammer.d.ts +2 -2
  15. package/lib/programmers/CheckerProgrammer.js +22 -22
  16. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  17. package/lib/programmers/CloneProgrammer.js +2 -2
  18. package/lib/programmers/CloneProgrammer.js.map +1 -1
  19. package/lib/programmers/FeatureProgrammer.d.ts +3 -2
  20. package/lib/programmers/FeatureProgrammer.js +5 -5
  21. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  22. package/lib/programmers/IsProgrammer.d.ts +1 -1
  23. package/lib/programmers/IsProgrammer.js +2 -2
  24. package/lib/programmers/IsProgrammer.js.map +1 -1
  25. package/lib/programmers/PruneProgrammer.js +2 -2
  26. package/lib/programmers/PruneProgrammer.js.map +1 -1
  27. package/lib/programmers/StringifyProgrammer.js +6 -6
  28. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  29. package/lib/programmers/helpers/UnionExplorer.d.ts +7 -7
  30. package/lib/programmers/helpers/UnionExplorer.js +6 -6
  31. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  32. package/lib/programmers/internal/check_array.js +36 -7
  33. package/lib/programmers/internal/check_array.js.map +1 -1
  34. package/lib/programmers/internal/check_bigint.d.ts +3 -1
  35. package/lib/programmers/internal/check_bigint.js +90 -61
  36. package/lib/programmers/internal/check_bigint.js.map +1 -1
  37. package/lib/programmers/internal/check_custom.d.ts +4 -0
  38. package/lib/programmers/internal/check_custom.js +30 -0
  39. package/lib/programmers/internal/check_custom.js.map +1 -0
  40. package/lib/programmers/internal/check_number.js +104 -75
  41. package/lib/programmers/internal/check_number.js.map +1 -1
  42. package/lib/programmers/internal/check_string.js +4 -3
  43. package/lib/programmers/internal/check_string.js.map +1 -1
  44. package/lib/programmers/internal/check_union_array_like.d.ts +2 -2
  45. package/lib/programmers/internal/check_union_array_like.js +4 -4
  46. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  47. package/lib/programmers/internal/check_union_tuple.js +2 -2
  48. package/lib/programmers/internal/check_union_tuple.js.map +1 -1
  49. package/lib/programmers/internal/feature_object_entries.js +1 -1
  50. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  51. package/lib/typings/Customizable.d.ts +7 -0
  52. package/lib/typings/Customizable.js +3 -0
  53. package/lib/typings/Customizable.js.map +1 -0
  54. package/package.json +1 -1
  55. package/src/IRandomGenerator.ts +17 -17
  56. package/src/IValidation.ts +21 -21
  57. package/src/Primitive.ts +104 -104
  58. package/src/TypeGuardError.ts +36 -36
  59. package/src/executable/TypiaGenerateWizard.ts +87 -87
  60. package/src/executable/TypiaSetupWizard.ts +152 -152
  61. package/src/executable/setup/ArgumentParser.ts +91 -91
  62. package/src/executable/setup/CommandExecutor.ts +8 -8
  63. package/src/executable/setup/FileRetriever.ts +33 -33
  64. package/src/executable/setup/PackageManager.ts +92 -92
  65. package/src/executable/setup/PluginConfigurator.ts +99 -99
  66. package/src/executable/typia.ts +38 -38
  67. package/src/factories/CommentFactory.ts +10 -10
  68. package/src/factories/ExpressionFactory.ts +77 -77
  69. package/src/factories/IdentifierFactory.ts +73 -73
  70. package/src/factories/LiteralFactory.ts +44 -44
  71. package/src/factories/MetadataCollection.ts +122 -122
  72. package/src/factories/MetadataFactory.ts +51 -51
  73. package/src/factories/MetadataTagFactory.ts +302 -276
  74. package/src/factories/StatementFactory.ts +60 -60
  75. package/src/factories/TemplateFactory.ts +56 -56
  76. package/src/factories/TypeFactory.ts +129 -129
  77. package/src/factories/TypiaFileFactory.ts +120 -120
  78. package/src/factories/ValueFactory.ts +12 -12
  79. package/src/factories/internal/metadata/MetadataHelper.ts +12 -12
  80. package/src/factories/internal/metadata/emplace_metadata_object.ts +142 -142
  81. package/src/factories/internal/metadata/explore_metadata.ts +92 -92
  82. package/src/factories/internal/metadata/iterate_metadata.ts +80 -80
  83. package/src/factories/internal/metadata/iterate_metadata_array.ts +29 -29
  84. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +59 -59
  85. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  86. package/src/factories/internal/metadata/iterate_metadata_constant.ts +58 -58
  87. package/src/factories/internal/metadata/iterate_metadata_map.ts +41 -41
  88. package/src/factories/internal/metadata/iterate_metadata_native.ts +222 -222
  89. package/src/factories/internal/metadata/iterate_metadata_object.ts +48 -48
  90. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +27 -27
  91. package/src/factories/internal/metadata/iterate_metadata_set.ts +33 -33
  92. package/src/factories/internal/metadata/iterate_metadata_template.ts +38 -38
  93. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +45 -45
  94. package/src/factories/internal/metadata/iterate_metadata_union.ts +59 -59
  95. package/src/functional/$any.ts +3 -3
  96. package/src/functional/$dictionary.ts +17 -0
  97. package/src/functional/$every.ts +11 -11
  98. package/src/functional/$guard.ts +35 -35
  99. package/src/functional/$is_between.ts +7 -7
  100. package/src/functional/$is_custom.ts +14 -0
  101. package/src/functional/$is_date.ts +4 -4
  102. package/src/functional/$is_datetime.ts +3 -3
  103. package/src/functional/$is_email.ts +5 -5
  104. package/src/functional/$is_ipv4.ts +5 -5
  105. package/src/functional/$is_ipv6.ts +5 -5
  106. package/src/functional/$is_url.ts +5 -5
  107. package/src/functional/$is_uuid.ts +5 -5
  108. package/src/functional/$join.ts +50 -50
  109. package/src/functional/$number.ts +12 -12
  110. package/src/functional/$report.ts +15 -15
  111. package/src/functional/$rest.ts +3 -3
  112. package/src/functional/$string.ts +37 -37
  113. package/src/functional/$tail.ts +6 -6
  114. package/src/functional/Namespace.ts +127 -125
  115. package/src/index.ts +4 -4
  116. package/src/metadata/IJsDocTagInfo.ts +10 -10
  117. package/src/metadata/IMetadata.ts +25 -25
  118. package/src/metadata/IMetadataApplication.ts +7 -7
  119. package/src/metadata/IMetadataConstant.ts +16 -16
  120. package/src/metadata/IMetadataEntry.ts +6 -6
  121. package/src/metadata/IMetadataObject.ts +29 -29
  122. package/src/metadata/IMetadataProperty.ts +11 -11
  123. package/src/metadata/IMetadataTag.ts +105 -105
  124. package/src/metadata/Metadata.ts +534 -534
  125. package/src/metadata/MetadataConstant.ts +3 -3
  126. package/src/metadata/MetadataObject.ts +131 -131
  127. package/src/metadata/MetadataProperty.ts +64 -64
  128. package/src/module.ts +1986 -1946
  129. package/src/programmers/ApplicationProgrammer.ts +55 -55
  130. package/src/programmers/AssertCloneProgrammer.ts +70 -70
  131. package/src/programmers/AssertParseProgrammer.ts +65 -65
  132. package/src/programmers/AssertProgrammer.ts +232 -232
  133. package/src/programmers/AssertPruneProgrammer.ts +67 -67
  134. package/src/programmers/AssertStringifyProgrammer.ts +71 -71
  135. package/src/programmers/CheckerProgrammer.ts +923 -893
  136. package/src/programmers/CloneProgrammer.ts +388 -386
  137. package/src/programmers/FeatureProgrammer.ts +512 -505
  138. package/src/programmers/IsCloneProgrammer.ts +80 -80
  139. package/src/programmers/IsParseProgrammer.ts +74 -74
  140. package/src/programmers/IsProgrammer.ts +201 -200
  141. package/src/programmers/IsPruneProgrammer.ts +75 -75
  142. package/src/programmers/IsStringifyProgrammer.ts +81 -81
  143. package/src/programmers/PruneProgrammer.ts +343 -341
  144. package/src/programmers/RandomProgrammer.ts +388 -388
  145. package/src/programmers/StringifyProgrammer.ts +801 -795
  146. package/src/programmers/ValidateCloneProgrammer.ts +90 -90
  147. package/src/programmers/ValidateParseProgrammer.ts +69 -69
  148. package/src/programmers/ValidateProgrammer.ts +266 -266
  149. package/src/programmers/ValidatePruneProgrammer.ts +83 -83
  150. package/src/programmers/ValidateStringifyProgrammer.ts +89 -89
  151. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  152. package/src/programmers/helpers/CloneJoiner.ts +134 -134
  153. package/src/programmers/helpers/FunctionImporeter.ts +55 -55
  154. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  155. package/src/programmers/helpers/OptionPredicator.ts +19 -19
  156. package/src/programmers/helpers/PruneJoiner.ts +52 -52
  157. package/src/programmers/helpers/RandomJoiner.ts +149 -149
  158. package/src/programmers/helpers/RandomRanger.ts +216 -216
  159. package/src/programmers/helpers/StringifyJoinder.ts +114 -114
  160. package/src/programmers/helpers/StringifyPredicator.ts +18 -18
  161. package/src/programmers/helpers/UnionExplorer.ts +281 -274
  162. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  163. package/src/programmers/internal/application_array.ts +37 -37
  164. package/src/programmers/internal/application_boolean.ts +17 -17
  165. package/src/programmers/internal/application_constant.ts +29 -29
  166. package/src/programmers/internal/application_default.ts +17 -17
  167. package/src/programmers/internal/application_default_string.ts +32 -32
  168. package/src/programmers/internal/application_native.ts +29 -29
  169. package/src/programmers/internal/application_number.ts +73 -73
  170. package/src/programmers/internal/application_object.ts +153 -153
  171. package/src/programmers/internal/application_schema.ts +184 -184
  172. package/src/programmers/internal/application_string.ts +45 -45
  173. package/src/programmers/internal/application_templates.ts +27 -27
  174. package/src/programmers/internal/application_tuple.ts +29 -29
  175. package/src/programmers/internal/check_array.ts +31 -22
  176. package/src/programmers/internal/check_array_length.ts +44 -44
  177. package/src/programmers/internal/check_bigint.ts +84 -64
  178. package/src/programmers/internal/check_custom.ts +32 -0
  179. package/src/programmers/internal/check_dynamic_properties.ts +197 -197
  180. package/src/programmers/internal/check_everything.ts +28 -28
  181. package/src/programmers/internal/check_native.ts +21 -21
  182. package/src/programmers/internal/check_number.ts +155 -145
  183. package/src/programmers/internal/check_object.ts +48 -48
  184. package/src/programmers/internal/check_string.ts +30 -24
  185. package/src/programmers/internal/check_string_tags.ts +63 -63
  186. package/src/programmers/internal/check_template.ts +50 -50
  187. package/src/programmers/internal/check_union_array_like.ts +265 -260
  188. package/src/programmers/internal/check_union_tuple.ts +35 -33
  189. package/src/programmers/internal/decode_union_object.ts +73 -73
  190. package/src/programmers/internal/feature_object_entries.ts +60 -59
  191. package/src/programmers/internal/metadata_to_pattern.ts +31 -31
  192. package/src/programmers/internal/prune_object_properties.ts +60 -60
  193. package/src/programmers/internal/stringify_dynamic_properties.ts +165 -165
  194. package/src/programmers/internal/stringify_native.ts +8 -8
  195. package/src/programmers/internal/stringify_regular_properties.ts +81 -81
  196. package/src/programmers/internal/template_to_pattern.ts +15 -15
  197. package/src/schemas/IJsonApplication.ts +9 -9
  198. package/src/schemas/IJsonComponents.ts +26 -26
  199. package/src/schemas/IJsonSchema.ts +121 -121
  200. package/src/transform.ts +21 -21
  201. package/src/transformers/CallExpressionTransformer.ts +172 -172
  202. package/src/transformers/ExpressionWithArgumentTransformer.ts +66 -66
  203. package/src/transformers/FileTransformer.ts +49 -49
  204. package/src/transformers/IProject.ts +11 -11
  205. package/src/transformers/ITransformOptions.ts +62 -62
  206. package/src/transformers/ImportTransformer.ts +60 -60
  207. package/src/transformers/NodeTransformer.ts +19 -19
  208. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +120 -120
  209. package/src/transformers/features/miscellaneous/AssertCloneTransformer.ts +9 -9
  210. package/src/transformers/features/miscellaneous/AssertPruneTransformer.ts +9 -9
  211. package/src/transformers/features/miscellaneous/CloneTransformer.ts +9 -9
  212. package/src/transformers/features/miscellaneous/CreateAssertCloneTransformer.ts +9 -9
  213. package/src/transformers/features/miscellaneous/CreateAssertPruneTransformer.ts +9 -9
  214. package/src/transformers/features/miscellaneous/CreateCloneTransformer.ts +9 -9
  215. package/src/transformers/features/miscellaneous/CreateIsCloneTransformer.ts +9 -9
  216. package/src/transformers/features/miscellaneous/CreateIsPruneTransformer.ts +9 -9
  217. package/src/transformers/features/miscellaneous/CreatePruneTransformer.ts +9 -9
  218. package/src/transformers/features/miscellaneous/CreateRandomGenerator.ts +42 -42
  219. package/src/transformers/features/miscellaneous/CreateValidateCloneTransformer.ts +9 -9
  220. package/src/transformers/features/miscellaneous/CreateValidatePruneTransformer.ts +9 -9
  221. package/src/transformers/features/miscellaneous/IsCloneTransformer.ts +9 -9
  222. package/src/transformers/features/miscellaneous/IsPruneTransformer.ts +9 -9
  223. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +55 -55
  224. package/src/transformers/features/miscellaneous/PruneTransformer.ts +9 -9
  225. package/src/transformers/features/miscellaneous/RandomTransformer.ts +48 -48
  226. package/src/transformers/features/miscellaneous/ValidateCloneTransformer.ts +9 -9
  227. package/src/transformers/features/miscellaneous/ValidatePruneTransformer.ts +9 -9
  228. package/src/transformers/features/parsers/AssertParseTransformer.ts +9 -9
  229. package/src/transformers/features/parsers/CreateAssertParseTransformer.ts +9 -9
  230. package/src/transformers/features/parsers/CreateIsParseTransformer.ts +9 -9
  231. package/src/transformers/features/parsers/CreateValidateParseTransformer.ts +9 -9
  232. package/src/transformers/features/parsers/IsParseTransformer.ts +9 -9
  233. package/src/transformers/features/parsers/ValidateParseTransformer.ts +9 -9
  234. package/src/transformers/features/stringifiers/AssertStringifyTransformer.ts +10 -10
  235. package/src/transformers/features/stringifiers/CreateAssertStringifyTransformer.ts +9 -9
  236. package/src/transformers/features/stringifiers/CreateIsStringifyTransformer.ts +9 -9
  237. package/src/transformers/features/stringifiers/CreateStringifyTransformer.ts +9 -9
  238. package/src/transformers/features/stringifiers/CreateValidateStringifyProgrammer.ts +11 -11
  239. package/src/transformers/features/stringifiers/IsStringifyTransformer.ts +9 -9
  240. package/src/transformers/features/stringifiers/StringifyTransformer.ts +9 -9
  241. package/src/transformers/features/stringifiers/ValidateStringifyTransformer.ts +10 -10
  242. package/src/transformers/features/validators/AssertTransformer.ts +11 -11
  243. package/src/transformers/features/validators/CreateAssertTransformer.ts +12 -12
  244. package/src/transformers/features/validators/CreateIsTransformer.ts +10 -10
  245. package/src/transformers/features/validators/CreateValidateTransformer.ts +12 -12
  246. package/src/transformers/features/validators/IsTransformer.ts +10 -10
  247. package/src/transformers/features/validators/ValidateTransformer.ts +11 -11
  248. package/src/transformers/internal/GenericTransformer.ts +99 -99
  249. package/src/typings/Atomic.ts +17 -17
  250. package/src/typings/ClassProperties.ts +5 -5
  251. package/src/typings/Customizable.ts +7 -0
  252. package/src/typings/OmitNever.ts +3 -3
  253. package/src/typings/SpecialFields.ts +3 -3
  254. package/src/typings/Writable.ts +11 -11
  255. package/src/utils/ArrayUtil.ts +49 -49
  256. package/src/utils/Escaper.ts +50 -50
  257. package/src/utils/MapUtil.ts +14 -14
  258. package/src/utils/PatternUtil.ts +30 -30
  259. package/src/utils/RandomGenerator.ts +96 -96
  260. package/src/utils/Singleton.ts +17 -17
@@ -1,388 +1,388 @@
1
- import ts from "typescript";
2
-
3
- import { ExpressionFactory } from "../factories/ExpressionFactory";
4
- import { IdentifierFactory } from "../factories/IdentifierFactory";
5
- import { MetadataCollection } from "../factories/MetadataCollection";
6
- import { MetadataFactory } from "../factories/MetadataFactory";
7
- import { StatementFactory } from "../factories/StatementFactory";
8
- import { TemplateFactory } from "../factories/TemplateFactory";
9
- import { TypeFactory } from "../factories/TypeFactory";
10
-
11
- import { IMetadataTag } from "../metadata/IMetadataTag";
12
- import { Metadata } from "../metadata/Metadata";
13
-
14
- import { IProject } from "../transformers/IProject";
15
-
16
- import { FunctionImporter } from "./helpers/FunctionImporeter";
17
- import { RandomJoiner } from "./helpers/RandomJoiner";
18
- import { RandomRanger } from "./helpers/RandomRanger";
19
-
20
- export namespace RandomProgrammer {
21
- export function generate(
22
- project: IProject,
23
- modulo: ts.LeftHandSideExpression,
24
- ) {
25
- const importer: FunctionImporter = new FunctionImporter();
26
- return (type: ts.Type, name?: string) => {
27
- // INITIALIZE METADATA
28
- const collection: MetadataCollection = new MetadataCollection();
29
- const meta: Metadata = MetadataFactory.generate(
30
- project.checker,
31
- collection,
32
- type,
33
- {
34
- resolve: true,
35
- constant: true,
36
- },
37
- );
38
-
39
- // GENERATE FUNCTION
40
- const functors: ts.VariableStatement[] =
41
- generate_functors(importer)(collection);
42
- const output: ts.Expression = decode(importer)({
43
- object: false,
44
- recursive: false,
45
- })(meta, []);
46
-
47
- return ts.factory.createArrowFunction(
48
- undefined,
49
- undefined,
50
- [
51
- IdentifierFactory.parameter(
52
- "generator",
53
- ts.factory.createTypeReferenceNode(
54
- "Partial<typia.IRandomGenerator>",
55
- ),
56
- IdentifierFactory.join(
57
- ts.factory.createParenthesizedExpression(
58
- ts.factory.createAsExpression(
59
- modulo,
60
- TypeFactory.keyword("any"),
61
- ),
62
- ),
63
- "generator",
64
- ),
65
- ),
66
- ],
67
- ts.factory.createTypeReferenceNode(
68
- `typia.Primitive<${
69
- name ?? TypeFactory.getFullName(project.checker, type)
70
- }>`,
71
- ),
72
- undefined,
73
- ts.factory.createBlock(
74
- [
75
- ...importer.declare(modulo),
76
- ...functors,
77
- ts.factory.createReturnStatement(output),
78
- ],
79
- true,
80
- ),
81
- );
82
- };
83
- }
84
-
85
- const generate_functors =
86
- (importer: FunctionImporter) => (collection: MetadataCollection) =>
87
- collection.objects().map((obj, i) =>
88
- StatementFactory.constant(
89
- FUNCTOR(i),
90
- ts.factory.createArrowFunction(
91
- undefined,
92
- undefined,
93
- [
94
- IdentifierFactory.parameter(
95
- "_recursive",
96
- TypeFactory.keyword("boolean"),
97
- ts.factory.createIdentifier(
98
- String(obj.recursive),
99
- ),
100
- ),
101
- IdentifierFactory.parameter(
102
- "_depth",
103
- TypeFactory.keyword("number"),
104
- ts.factory.createNumericLiteral(0),
105
- ),
106
- ],
107
- TypeFactory.keyword("any"),
108
- undefined,
109
- RandomJoiner.object(COALESCE(importer))(
110
- decode(importer)({
111
- recursive: obj.recursive,
112
- object: true,
113
- }),
114
- )(obj),
115
- ),
116
- ),
117
- );
118
-
119
- /* -----------------------------------------------------------
120
- DECODERS
121
- ----------------------------------------------------------- */
122
- const decode =
123
- (importer: FunctionImporter) =>
124
- (explore: IExplore) =>
125
- (meta: Metadata, tags: IMetadataTag[]): ts.Expression => {
126
- const expressions: ts.Expression[] = [];
127
- if (meta.any)
128
- expressions.push(
129
- ts.factory.createStringLiteral(
130
- "fucking any type exists...",
131
- ),
132
- );
133
-
134
- // NULL COALESCING
135
- if (meta.required === false)
136
- expressions.push(ts.factory.createIdentifier("undefined"));
137
- if (meta.nullable === true)
138
- expressions.push(ts.factory.createNull());
139
-
140
- // ATOMIC TYPES
141
- for (const constant of meta.constants)
142
- for (const value of constant.values)
143
- expressions.push(decode_atomic(value));
144
- for (const template of meta.templates)
145
- expressions.push(decode_template(importer)(explore)(template));
146
- for (const atomic of meta.atomics)
147
- if (atomic === "boolean")
148
- expressions.push(decode_boolean(importer));
149
- else if (atomic === "number")
150
- expressions.push(decode_number(importer)(tags));
151
- else if (atomic === "string")
152
- expressions.push(decode_string(importer)(tags));
153
- else if (atomic === "bigint")
154
- expressions.push(decode_bigint(importer)(tags));
155
-
156
- // INSTANCE TYPES
157
- if (meta.resolved)
158
- expressions.push(
159
- decode(importer)(explore)(meta.resolved, tags),
160
- );
161
- for (const t of meta.tuples)
162
- expressions.push(
163
- RandomJoiner.tuple(decode(importer)(explore))(t, tags),
164
- );
165
- for (const a of meta.arrays) {
166
- const array = RandomJoiner.array(COALESCE(importer))(
167
- decode(importer)(explore),
168
- )(a, tags);
169
- expressions.push(
170
- explore.recursive && a.objects.length
171
- ? ts.factory.createConditionalExpression(
172
- ts.factory.createLogicalAnd(
173
- ts.factory.createIdentifier("_recursive"),
174
- ts.factory.createLessThan(
175
- ts.factory.createNumericLiteral(5),
176
- ts.factory.createIdentifier("_depth"),
177
- ),
178
- ),
179
- undefined,
180
- ts.factory.createIdentifier("[]"),
181
- undefined,
182
- array,
183
- )
184
- : array,
185
- );
186
- }
187
- for (const o of meta.objects)
188
- expressions.push(
189
- ts.factory.createCallExpression(
190
- ts.factory.createIdentifier(FUNCTOR(o.index)),
191
- undefined,
192
- explore.object
193
- ? [
194
- explore.recursive
195
- ? ts.factory.createTrue()
196
- : ts.factory.createIdentifier(
197
- "_recursive",
198
- ),
199
- ts.factory.createConditionalExpression(
200
- ts.factory.createIdentifier("_recursive"),
201
- undefined,
202
- ts.factory.createAdd(
203
- ts.factory.createNumericLiteral(1),
204
- ts.factory.createIdentifier("_depth"),
205
- ),
206
- undefined,
207
- ts.factory.createIdentifier("_depth"),
208
- ),
209
- ]
210
- : undefined,
211
- ),
212
- );
213
- for (const native of meta.natives)
214
- if (native === "Boolean")
215
- expressions.push(decode_boolean(importer));
216
- else if (native === "Number")
217
- expressions.push(decode_number(importer)(tags));
218
- else if (native === "String")
219
- expressions.push(decode_string(importer)(tags));
220
- else expressions.push(ts.factory.createIdentifier("{}"));
221
- if (meta.sets.length || meta.maps.length)
222
- expressions.push(ts.factory.createIdentifier("{}"));
223
-
224
- // PRIMITIVE TYPES
225
- if (expressions.length === 1) return expressions[0]!;
226
- return ts.factory.createCallExpression(
227
- ts.factory.createCallExpression(
228
- importer.use("pick"),
229
- undefined,
230
- [
231
- ts.factory.createArrayLiteralExpression(
232
- expressions.map((expr) =>
233
- ts.factory.createArrowFunction(
234
- undefined,
235
- undefined,
236
- [],
237
- undefined,
238
- undefined,
239
- expr,
240
- ),
241
- ),
242
- true,
243
- ),
244
- ],
245
- ),
246
- undefined,
247
- undefined,
248
- );
249
- };
250
-
251
- const decode_boolean = (importer: FunctionImporter) =>
252
- ts.factory.createCallExpression(
253
- COALESCE(importer)("boolean"),
254
- undefined,
255
- undefined,
256
- );
257
-
258
- const decode_atomic = (value: Atomic) =>
259
- typeof value === "boolean"
260
- ? ts.factory.createIdentifier(value.toString())
261
- : typeof value === "number"
262
- ? ts.factory.createNumericLiteral(value)
263
- : typeof value === "string"
264
- ? ts.factory.createStringLiteral(value)
265
- : ts.factory.createBigIntLiteral(value.toString());
266
-
267
- const decode_template =
268
- (importer: FunctionImporter) =>
269
- (explore: IExplore) =>
270
- (template: Metadata[]) =>
271
- TemplateFactory.generate(
272
- template.map((meta) => decode(importer)(explore)(meta, [])),
273
- );
274
-
275
- const decode_number =
276
- (importer: FunctionImporter) =>
277
- (tags: IMetadataTag[]): ts.Expression => {
278
- const type = tags.find(
279
- (t) => t.kind === "type" && t.value === "uint",
280
- )
281
- ? "int"
282
- : tags.find((t) => t.kind === "type" && t.value === "int")
283
- ? "uint"
284
- : "double";
285
- return RandomRanger.number({
286
- type,
287
- transform: (value) => ts.factory.createNumericLiteral(value),
288
- setter: (args) =>
289
- ts.factory.createCallExpression(
290
- type === "double" &&
291
- tags.every(
292
- (t) =>
293
- t.kind !== "multipleOf" &&
294
- t.kind !== "step",
295
- )
296
- ? COALESCE(importer)("number")
297
- : COALESCE(importer)("integer"),
298
- undefined,
299
- args.map((val) => ts.factory.createNumericLiteral(val)),
300
- ),
301
- })({
302
- minimum: 0,
303
- maximum: 100,
304
- gap: 10,
305
- })(tags);
306
- };
307
-
308
- const decode_bigint =
309
- (importer: FunctionImporter) =>
310
- (tags: IMetadataTag[]): ts.Expression =>
311
- RandomRanger.number({
312
- type: tags.find((t) => t.kind === "type" && t.value === "uint")
313
- ? "uint"
314
- : "int",
315
- transform: (value) =>
316
- ts.factory.createCallExpression(
317
- ts.factory.createIdentifier("BigInt"),
318
- undefined,
319
- [ts.factory.createStringLiteral(value.toString())],
320
- ),
321
- setter: (args) =>
322
- ts.factory.createCallExpression(
323
- COALESCE(importer)("bigint"),
324
- undefined,
325
- args.map((value) =>
326
- ts.factory.createCallExpression(
327
- ts.factory.createIdentifier("BigInt"),
328
- undefined,
329
- [
330
- ts.factory.createStringLiteral(
331
- value.toString(),
332
- ),
333
- ],
334
- ),
335
- ),
336
- ),
337
- })({
338
- minimum: 0,
339
- maximum: 100,
340
- gap: 10,
341
- })(tags);
342
-
343
- const decode_string =
344
- (importer: FunctionImporter) =>
345
- (tags: IMetadataTag[]): ts.Expression => {
346
- for (const t of tags)
347
- if (t.kind === "format")
348
- return ts.factory.createCallExpression(
349
- COALESCE(importer)(t.value),
350
- undefined,
351
- undefined,
352
- );
353
- else if (t.kind === "pattern")
354
- return ts.factory.createCallExpression(
355
- COALESCE(importer)("pattern"),
356
- undefined,
357
- [ts.factory.createIdentifier(`/${t.value}/`)],
358
- );
359
-
360
- const tail = RandomRanger.length(COALESCE(importer))({
361
- minimum: 5,
362
- maximum: 25,
363
- gap: 5,
364
- })({
365
- fixed: "length",
366
- minimum: "minLength",
367
- maximum: "maxLength",
368
- })(tags);
369
- return ts.factory.createCallExpression(
370
- COALESCE(importer)("string"),
371
- undefined,
372
- tail ? [tail] : undefined,
373
- );
374
- };
375
- }
376
-
377
- type Atomic = boolean | number | string | bigint;
378
- interface IExplore {
379
- object: boolean;
380
- recursive: boolean;
381
- }
382
-
383
- const FUNCTOR = (i: number) => `$ro${i}`;
384
- const COALESCE = (importer: FunctionImporter) => (name: string) =>
385
- ExpressionFactory.coalesce(
386
- ts.factory.createIdentifier(`generator.${name}`),
387
- IdentifierFactory.join(importer.use("generator"), name),
388
- );
1
+ import ts from "typescript";
2
+
3
+ import { ExpressionFactory } from "../factories/ExpressionFactory";
4
+ import { IdentifierFactory } from "../factories/IdentifierFactory";
5
+ import { MetadataCollection } from "../factories/MetadataCollection";
6
+ import { MetadataFactory } from "../factories/MetadataFactory";
7
+ import { StatementFactory } from "../factories/StatementFactory";
8
+ import { TemplateFactory } from "../factories/TemplateFactory";
9
+ import { TypeFactory } from "../factories/TypeFactory";
10
+
11
+ import { IMetadataTag } from "../metadata/IMetadataTag";
12
+ import { Metadata } from "../metadata/Metadata";
13
+
14
+ import { IProject } from "../transformers/IProject";
15
+
16
+ import { FunctionImporter } from "./helpers/FunctionImporeter";
17
+ import { RandomJoiner } from "./helpers/RandomJoiner";
18
+ import { RandomRanger } from "./helpers/RandomRanger";
19
+
20
+ export namespace RandomProgrammer {
21
+ export function generate(
22
+ project: IProject,
23
+ modulo: ts.LeftHandSideExpression,
24
+ ) {
25
+ const importer: FunctionImporter = new FunctionImporter();
26
+ return (type: ts.Type, name?: string) => {
27
+ // INITIALIZE METADATA
28
+ const collection: MetadataCollection = new MetadataCollection();
29
+ const meta: Metadata = MetadataFactory.generate(
30
+ project.checker,
31
+ collection,
32
+ type,
33
+ {
34
+ resolve: true,
35
+ constant: true,
36
+ },
37
+ );
38
+
39
+ // GENERATE FUNCTION
40
+ const functors: ts.VariableStatement[] =
41
+ generate_functors(importer)(collection);
42
+ const output: ts.Expression = decode(importer)({
43
+ object: false,
44
+ recursive: false,
45
+ })(meta, []);
46
+
47
+ return ts.factory.createArrowFunction(
48
+ undefined,
49
+ undefined,
50
+ [
51
+ IdentifierFactory.parameter(
52
+ "generator",
53
+ ts.factory.createTypeReferenceNode(
54
+ "Partial<typia.IRandomGenerator>",
55
+ ),
56
+ IdentifierFactory.join(
57
+ ts.factory.createParenthesizedExpression(
58
+ ts.factory.createAsExpression(
59
+ modulo,
60
+ TypeFactory.keyword("any"),
61
+ ),
62
+ ),
63
+ "generator",
64
+ ),
65
+ ),
66
+ ],
67
+ ts.factory.createTypeReferenceNode(
68
+ `typia.Primitive<${
69
+ name ?? TypeFactory.getFullName(project.checker, type)
70
+ }>`,
71
+ ),
72
+ undefined,
73
+ ts.factory.createBlock(
74
+ [
75
+ ...importer.declare(modulo),
76
+ ...functors,
77
+ ts.factory.createReturnStatement(output),
78
+ ],
79
+ true,
80
+ ),
81
+ );
82
+ };
83
+ }
84
+
85
+ const generate_functors =
86
+ (importer: FunctionImporter) => (collection: MetadataCollection) =>
87
+ collection.objects().map((obj, i) =>
88
+ StatementFactory.constant(
89
+ FUNCTOR(i),
90
+ ts.factory.createArrowFunction(
91
+ undefined,
92
+ undefined,
93
+ [
94
+ IdentifierFactory.parameter(
95
+ "_recursive",
96
+ TypeFactory.keyword("boolean"),
97
+ ts.factory.createIdentifier(
98
+ String(obj.recursive),
99
+ ),
100
+ ),
101
+ IdentifierFactory.parameter(
102
+ "_depth",
103
+ TypeFactory.keyword("number"),
104
+ ts.factory.createNumericLiteral(0),
105
+ ),
106
+ ],
107
+ TypeFactory.keyword("any"),
108
+ undefined,
109
+ RandomJoiner.object(COALESCE(importer))(
110
+ decode(importer)({
111
+ recursive: obj.recursive,
112
+ object: true,
113
+ }),
114
+ )(obj),
115
+ ),
116
+ ),
117
+ );
118
+
119
+ /* -----------------------------------------------------------
120
+ DECODERS
121
+ ----------------------------------------------------------- */
122
+ const decode =
123
+ (importer: FunctionImporter) =>
124
+ (explore: IExplore) =>
125
+ (meta: Metadata, tags: IMetadataTag[]): ts.Expression => {
126
+ const expressions: ts.Expression[] = [];
127
+ if (meta.any)
128
+ expressions.push(
129
+ ts.factory.createStringLiteral(
130
+ "fucking any type exists...",
131
+ ),
132
+ );
133
+
134
+ // NULL COALESCING
135
+ if (meta.required === false)
136
+ expressions.push(ts.factory.createIdentifier("undefined"));
137
+ if (meta.nullable === true)
138
+ expressions.push(ts.factory.createNull());
139
+
140
+ // ATOMIC TYPES
141
+ for (const constant of meta.constants)
142
+ for (const value of constant.values)
143
+ expressions.push(decode_atomic(value));
144
+ for (const template of meta.templates)
145
+ expressions.push(decode_template(importer)(explore)(template));
146
+ for (const atomic of meta.atomics)
147
+ if (atomic === "boolean")
148
+ expressions.push(decode_boolean(importer));
149
+ else if (atomic === "number")
150
+ expressions.push(decode_number(importer)(tags));
151
+ else if (atomic === "string")
152
+ expressions.push(decode_string(importer)(tags));
153
+ else if (atomic === "bigint")
154
+ expressions.push(decode_bigint(importer)(tags));
155
+
156
+ // INSTANCE TYPES
157
+ if (meta.resolved)
158
+ expressions.push(
159
+ decode(importer)(explore)(meta.resolved, tags),
160
+ );
161
+ for (const t of meta.tuples)
162
+ expressions.push(
163
+ RandomJoiner.tuple(decode(importer)(explore))(t, tags),
164
+ );
165
+ for (const a of meta.arrays) {
166
+ const array = RandomJoiner.array(COALESCE(importer))(
167
+ decode(importer)(explore),
168
+ )(a, tags);
169
+ expressions.push(
170
+ explore.recursive && a.objects.length
171
+ ? ts.factory.createConditionalExpression(
172
+ ts.factory.createLogicalAnd(
173
+ ts.factory.createIdentifier("_recursive"),
174
+ ts.factory.createLessThan(
175
+ ts.factory.createNumericLiteral(5),
176
+ ts.factory.createIdentifier("_depth"),
177
+ ),
178
+ ),
179
+ undefined,
180
+ ts.factory.createIdentifier("[]"),
181
+ undefined,
182
+ array,
183
+ )
184
+ : array,
185
+ );
186
+ }
187
+ for (const o of meta.objects)
188
+ expressions.push(
189
+ ts.factory.createCallExpression(
190
+ ts.factory.createIdentifier(FUNCTOR(o.index)),
191
+ undefined,
192
+ explore.object
193
+ ? [
194
+ explore.recursive
195
+ ? ts.factory.createTrue()
196
+ : ts.factory.createIdentifier(
197
+ "_recursive",
198
+ ),
199
+ ts.factory.createConditionalExpression(
200
+ ts.factory.createIdentifier("_recursive"),
201
+ undefined,
202
+ ts.factory.createAdd(
203
+ ts.factory.createNumericLiteral(1),
204
+ ts.factory.createIdentifier("_depth"),
205
+ ),
206
+ undefined,
207
+ ts.factory.createIdentifier("_depth"),
208
+ ),
209
+ ]
210
+ : undefined,
211
+ ),
212
+ );
213
+ for (const native of meta.natives)
214
+ if (native === "Boolean")
215
+ expressions.push(decode_boolean(importer));
216
+ else if (native === "Number")
217
+ expressions.push(decode_number(importer)(tags));
218
+ else if (native === "String")
219
+ expressions.push(decode_string(importer)(tags));
220
+ else expressions.push(ts.factory.createIdentifier("{}"));
221
+ if (meta.sets.length || meta.maps.length)
222
+ expressions.push(ts.factory.createIdentifier("{}"));
223
+
224
+ // PRIMITIVE TYPES
225
+ if (expressions.length === 1) return expressions[0]!;
226
+ return ts.factory.createCallExpression(
227
+ ts.factory.createCallExpression(
228
+ importer.use("pick"),
229
+ undefined,
230
+ [
231
+ ts.factory.createArrayLiteralExpression(
232
+ expressions.map((expr) =>
233
+ ts.factory.createArrowFunction(
234
+ undefined,
235
+ undefined,
236
+ [],
237
+ undefined,
238
+ undefined,
239
+ expr,
240
+ ),
241
+ ),
242
+ true,
243
+ ),
244
+ ],
245
+ ),
246
+ undefined,
247
+ undefined,
248
+ );
249
+ };
250
+
251
+ const decode_boolean = (importer: FunctionImporter) =>
252
+ ts.factory.createCallExpression(
253
+ COALESCE(importer)("boolean"),
254
+ undefined,
255
+ undefined,
256
+ );
257
+
258
+ const decode_atomic = (value: Atomic) =>
259
+ typeof value === "boolean"
260
+ ? ts.factory.createIdentifier(value.toString())
261
+ : typeof value === "number"
262
+ ? ts.factory.createNumericLiteral(value)
263
+ : typeof value === "string"
264
+ ? ts.factory.createStringLiteral(value)
265
+ : ts.factory.createBigIntLiteral(value.toString());
266
+
267
+ const decode_template =
268
+ (importer: FunctionImporter) =>
269
+ (explore: IExplore) =>
270
+ (template: Metadata[]) =>
271
+ TemplateFactory.generate(
272
+ template.map((meta) => decode(importer)(explore)(meta, [])),
273
+ );
274
+
275
+ const decode_number =
276
+ (importer: FunctionImporter) =>
277
+ (tags: IMetadataTag[]): ts.Expression => {
278
+ const type = tags.find(
279
+ (t) => t.kind === "type" && t.value === "uint",
280
+ )
281
+ ? "int"
282
+ : tags.find((t) => t.kind === "type" && t.value === "int")
283
+ ? "uint"
284
+ : "double";
285
+ return RandomRanger.number({
286
+ type,
287
+ transform: (value) => ts.factory.createNumericLiteral(value),
288
+ setter: (args) =>
289
+ ts.factory.createCallExpression(
290
+ type === "double" &&
291
+ tags.every(
292
+ (t) =>
293
+ t.kind !== "multipleOf" &&
294
+ t.kind !== "step",
295
+ )
296
+ ? COALESCE(importer)("number")
297
+ : COALESCE(importer)("integer"),
298
+ undefined,
299
+ args.map((val) => ts.factory.createNumericLiteral(val)),
300
+ ),
301
+ })({
302
+ minimum: 0,
303
+ maximum: 100,
304
+ gap: 10,
305
+ })(tags);
306
+ };
307
+
308
+ const decode_bigint =
309
+ (importer: FunctionImporter) =>
310
+ (tags: IMetadataTag[]): ts.Expression =>
311
+ RandomRanger.number({
312
+ type: tags.find((t) => t.kind === "type" && t.value === "uint")
313
+ ? "uint"
314
+ : "int",
315
+ transform: (value) =>
316
+ ts.factory.createCallExpression(
317
+ ts.factory.createIdentifier("BigInt"),
318
+ undefined,
319
+ [ts.factory.createStringLiteral(value.toString())],
320
+ ),
321
+ setter: (args) =>
322
+ ts.factory.createCallExpression(
323
+ COALESCE(importer)("bigint"),
324
+ undefined,
325
+ args.map((value) =>
326
+ ts.factory.createCallExpression(
327
+ ts.factory.createIdentifier("BigInt"),
328
+ undefined,
329
+ [
330
+ ts.factory.createStringLiteral(
331
+ value.toString(),
332
+ ),
333
+ ],
334
+ ),
335
+ ),
336
+ ),
337
+ })({
338
+ minimum: 0,
339
+ maximum: 100,
340
+ gap: 10,
341
+ })(tags);
342
+
343
+ const decode_string =
344
+ (importer: FunctionImporter) =>
345
+ (tags: IMetadataTag[]): ts.Expression => {
346
+ for (const t of tags)
347
+ if (t.kind === "format")
348
+ return ts.factory.createCallExpression(
349
+ COALESCE(importer)(t.value),
350
+ undefined,
351
+ undefined,
352
+ );
353
+ else if (t.kind === "pattern")
354
+ return ts.factory.createCallExpression(
355
+ COALESCE(importer)("pattern"),
356
+ undefined,
357
+ [ts.factory.createIdentifier(`/${t.value}/`)],
358
+ );
359
+
360
+ const tail = RandomRanger.length(COALESCE(importer))({
361
+ minimum: 5,
362
+ maximum: 25,
363
+ gap: 5,
364
+ })({
365
+ fixed: "length",
366
+ minimum: "minLength",
367
+ maximum: "maxLength",
368
+ })(tags);
369
+ return ts.factory.createCallExpression(
370
+ COALESCE(importer)("string"),
371
+ undefined,
372
+ tail ? [tail] : undefined,
373
+ );
374
+ };
375
+ }
376
+
377
+ type Atomic = boolean | number | string | bigint;
378
+ interface IExplore {
379
+ object: boolean;
380
+ recursive: boolean;
381
+ }
382
+
383
+ const FUNCTOR = (i: number) => `$ro${i}`;
384
+ const COALESCE = (importer: FunctionImporter) => (name: string) =>
385
+ ExpressionFactory.coalesce(
386
+ ts.factory.createIdentifier(`generator.${name}`),
387
+ IdentifierFactory.join(importer.use("generator"), name),
388
+ );