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,151 +1,151 @@
1
- import ts from "typescript";
2
-
3
- import { StatementFactory } from "../../factories/StatementFactory";
4
- import { TypeFactory } from "../../factories/TypeFactory";
5
-
6
- import { Metadata } from "../../schemas/metadata/Metadata";
7
- import { MetadataObject } from "../../schemas/metadata/MetadataObject";
8
- import { MetadataProperty } from "../../schemas/metadata/MetadataProperty";
9
-
10
- import { Escaper } from "../../utils/Escaper";
11
-
12
- export namespace RandomJoiner {
13
- export type Decoder = (meta: Metadata) => ts.Expression;
14
-
15
- export const array =
16
- (coalesce: (method: string) => ts.Expression) =>
17
- (decoder: Decoder) =>
18
- (explore: IExplore) =>
19
- (length: ts.Expression | undefined) =>
20
- (item: Metadata): ts.Expression => {
21
- const generator: ts.Expression = ts.factory.createCallExpression(
22
- coalesce("array"),
23
- undefined,
24
- [
25
- ts.factory.createArrowFunction(
26
- undefined,
27
- undefined,
28
- [],
29
- undefined,
30
- undefined,
31
- decoder(item),
32
- ),
33
- ...(length ? [length] : []),
34
- ],
35
- );
36
- if (explore.recursive === false) return generator;
37
- return ts.factory.createConditionalExpression(
38
- ts.factory.createGreaterThanEquals(
39
- ts.factory.createNumericLiteral(5),
40
- ts.factory.createIdentifier("_depth"),
41
- ),
42
- undefined,
43
- generator,
44
- undefined,
45
- ts.factory.createArrayLiteralExpression([]),
46
- );
47
- };
48
-
49
- export const tuple = (decoder: Decoder) => (elements: Metadata[]) =>
50
- ts.factory.createArrayLiteralExpression(
51
- elements.map((elem) => decoder(elem.rest ?? elem)),
52
- true,
53
- );
54
-
55
- export const object =
56
- (coalesce: (method: string) => ts.Expression) =>
57
- (decoder: Decoder) =>
58
- (obj: MetadataObject): ts.ConciseBody => {
59
- if (obj.properties.length === 0)
60
- return ts.factory.createIdentifier("{}");
61
-
62
- // LIST UP PROPERTIES
63
- const regular = obj.properties.filter((p) => p.key.isSoleLiteral());
64
- const dynamic = obj.properties.filter(
65
- (p) => !p.key.isSoleLiteral(),
66
- );
67
-
68
- // REGULAR OBJECT
69
- const literal: ts.ObjectLiteralExpression =
70
- ts.factory.createObjectLiteralExpression(
71
- regular.map((p) => {
72
- const str: string = p.key.getSoleLiteral()!;
73
- return ts.factory.createPropertyAssignment(
74
- Escaper.variable(str)
75
- ? str
76
- : ts.factory.createStringLiteral(str),
77
- decoder(p.value),
78
- );
79
- }),
80
- true,
81
- );
82
- if (dynamic.length === 0) return literal;
83
-
84
- const properties: ts.Statement[] = dynamic.map((p) =>
85
- ts.factory.createExpressionStatement(
86
- dynamicProperty(coalesce)(decoder)(p),
87
- ),
88
- );
89
- return ts.factory.createBlock(
90
- [
91
- StatementFactory.constant(
92
- "output",
93
- ts.factory.createAsExpression(
94
- literal,
95
- TypeFactory.keyword("any"),
96
- ),
97
- ),
98
- ...(obj.recursive
99
- ? [
100
- ts.factory.createIfStatement(
101
- ts.factory.createGreaterThanEquals(
102
- ts.factory.createNumericLiteral(5),
103
- ts.factory.createIdentifier("_depth"),
104
- ),
105
- ts.factory.createBlock(properties, true),
106
- ),
107
- ]
108
- : properties),
109
- ts.factory.createReturnStatement(
110
- ts.factory.createIdentifier("output"),
111
- ),
112
- ],
113
- true,
114
- );
115
- };
116
-
117
- const dynamicProperty =
118
- (coalesce: (method: string) => ts.Expression) =>
119
- (decoder: Decoder) =>
120
- (p: MetadataProperty) =>
121
- ts.factory.createCallExpression(coalesce("array"), undefined, [
122
- ts.factory.createArrowFunction(
123
- undefined,
124
- undefined,
125
- [],
126
- undefined,
127
- undefined,
128
- ts.factory.createBinaryExpression(
129
- ts.factory.createElementAccessExpression(
130
- ts.factory.createIdentifier("output"),
131
- decoder(p.key),
132
- ),
133
- ts.factory.createToken(ts.SyntaxKind.EqualsToken),
134
- decoder(p.value),
135
- ),
136
- ),
137
- ts.factory.createCallExpression(
138
- coalesce("integer"),
139
- undefined,
140
- [
141
- ts.factory.createNumericLiteral(0),
142
- ts.factory.createNumericLiteral(3),
143
- ],
144
- ),
145
- ]);
146
- }
147
-
148
- interface IExplore {
149
- function: boolean;
150
- recursive: boolean;
151
- }
1
+ import ts from "typescript";
2
+
3
+ import { StatementFactory } from "../../factories/StatementFactory";
4
+ import { TypeFactory } from "../../factories/TypeFactory";
5
+
6
+ import { Metadata } from "../../schemas/metadata/Metadata";
7
+ import { MetadataObject } from "../../schemas/metadata/MetadataObject";
8
+ import { MetadataProperty } from "../../schemas/metadata/MetadataProperty";
9
+
10
+ import { Escaper } from "../../utils/Escaper";
11
+
12
+ export namespace RandomJoiner {
13
+ export type Decoder = (meta: Metadata) => ts.Expression;
14
+
15
+ export const array =
16
+ (coalesce: (method: string) => ts.Expression) =>
17
+ (decoder: Decoder) =>
18
+ (explore: IExplore) =>
19
+ (length: ts.Expression | undefined) =>
20
+ (item: Metadata): ts.Expression => {
21
+ const generator: ts.Expression = ts.factory.createCallExpression(
22
+ coalesce("array"),
23
+ undefined,
24
+ [
25
+ ts.factory.createArrowFunction(
26
+ undefined,
27
+ undefined,
28
+ [],
29
+ undefined,
30
+ undefined,
31
+ decoder(item),
32
+ ),
33
+ ...(length ? [length] : []),
34
+ ],
35
+ );
36
+ if (explore.recursive === false) return generator;
37
+ return ts.factory.createConditionalExpression(
38
+ ts.factory.createGreaterThanEquals(
39
+ ts.factory.createNumericLiteral(5),
40
+ ts.factory.createIdentifier("_depth"),
41
+ ),
42
+ undefined,
43
+ generator,
44
+ undefined,
45
+ ts.factory.createArrayLiteralExpression([]),
46
+ );
47
+ };
48
+
49
+ export const tuple = (decoder: Decoder) => (elements: Metadata[]) =>
50
+ ts.factory.createArrayLiteralExpression(
51
+ elements.map((elem) => decoder(elem.rest ?? elem)),
52
+ true,
53
+ );
54
+
55
+ export const object =
56
+ (coalesce: (method: string) => ts.Expression) =>
57
+ (decoder: Decoder) =>
58
+ (obj: MetadataObject): ts.ConciseBody => {
59
+ if (obj.properties.length === 0)
60
+ return ts.factory.createIdentifier("{}");
61
+
62
+ // LIST UP PROPERTIES
63
+ const regular = obj.properties.filter((p) => p.key.isSoleLiteral());
64
+ const dynamic = obj.properties.filter(
65
+ (p) => !p.key.isSoleLiteral(),
66
+ );
67
+
68
+ // REGULAR OBJECT
69
+ const literal: ts.ObjectLiteralExpression =
70
+ ts.factory.createObjectLiteralExpression(
71
+ regular.map((p) => {
72
+ const str: string = p.key.getSoleLiteral()!;
73
+ return ts.factory.createPropertyAssignment(
74
+ Escaper.variable(str)
75
+ ? str
76
+ : ts.factory.createStringLiteral(str),
77
+ decoder(p.value),
78
+ );
79
+ }),
80
+ true,
81
+ );
82
+ if (dynamic.length === 0) return literal;
83
+
84
+ const properties: ts.Statement[] = dynamic.map((p) =>
85
+ ts.factory.createExpressionStatement(
86
+ dynamicProperty(coalesce)(decoder)(p),
87
+ ),
88
+ );
89
+ return ts.factory.createBlock(
90
+ [
91
+ StatementFactory.constant(
92
+ "output",
93
+ ts.factory.createAsExpression(
94
+ literal,
95
+ TypeFactory.keyword("any"),
96
+ ),
97
+ ),
98
+ ...(obj.recursive
99
+ ? [
100
+ ts.factory.createIfStatement(
101
+ ts.factory.createGreaterThanEquals(
102
+ ts.factory.createNumericLiteral(5),
103
+ ts.factory.createIdentifier("_depth"),
104
+ ),
105
+ ts.factory.createBlock(properties, true),
106
+ ),
107
+ ]
108
+ : properties),
109
+ ts.factory.createReturnStatement(
110
+ ts.factory.createIdentifier("output"),
111
+ ),
112
+ ],
113
+ true,
114
+ );
115
+ };
116
+
117
+ const dynamicProperty =
118
+ (coalesce: (method: string) => ts.Expression) =>
119
+ (decoder: Decoder) =>
120
+ (p: MetadataProperty) =>
121
+ ts.factory.createCallExpression(coalesce("array"), undefined, [
122
+ ts.factory.createArrowFunction(
123
+ undefined,
124
+ undefined,
125
+ [],
126
+ undefined,
127
+ undefined,
128
+ ts.factory.createBinaryExpression(
129
+ ts.factory.createElementAccessExpression(
130
+ ts.factory.createIdentifier("output"),
131
+ decoder(p.key),
132
+ ),
133
+ ts.factory.createToken(ts.SyntaxKind.EqualsToken),
134
+ decoder(p.value),
135
+ ),
136
+ ),
137
+ ts.factory.createCallExpression(
138
+ coalesce("integer"),
139
+ undefined,
140
+ [
141
+ ts.factory.createNumericLiteral(0),
142
+ ts.factory.createNumericLiteral(3),
143
+ ],
144
+ ),
145
+ ]);
146
+ }
147
+
148
+ interface IExplore {
149
+ function: boolean;
150
+ recursive: boolean;
151
+ }
@@ -1,173 +1,173 @@
1
- import ts from "typescript";
2
-
3
- import { IMetadataTypeTag } from "../../schemas/metadata/IMetadataTypeTag";
4
-
5
- export namespace RandomRanger {
6
- export interface IDefaults {
7
- minimum: number;
8
- maximum: number;
9
- gap: number;
10
- }
11
-
12
- export const length =
13
- (coalesce: (method: string) => ts.Expression) =>
14
- (defs: IDefaults) =>
15
- (acc: length.IAccessors) =>
16
- (tags: IMetadataTypeTag[]): ts.Expression | undefined => {
17
- const props = {
18
- minimum: getter(tags)(acc.minimum),
19
- maximum: getter(tags)(acc.maximum),
20
- };
21
- if (props.minimum === undefined && props.maximum === undefined)
22
- return undefined;
23
-
24
- props.minimum ??= defs.minimum;
25
- props.maximum ??= defs.maximum;
26
- if (props.maximum < props.minimum)
27
- (props.maximum as number) += defs.gap;
28
-
29
- return ts.factory.createCallExpression(
30
- coalesce("integer"),
31
- undefined,
32
- [
33
- ts.factory.createNumericLiteral(props.minimum),
34
- ts.factory.createNumericLiteral(props.maximum),
35
- ],
36
- );
37
- };
38
- export namespace length {
39
- export interface IAccessors {
40
- minimum: string;
41
- maximum: string;
42
- }
43
- }
44
-
45
- export const number =
46
- (config: number.IConfig) =>
47
- (defs: IDefaults) =>
48
- (tags: IMetadataTypeTag[]): ts.Expression => {
49
- const range = {
50
- minimum: {
51
- value:
52
- getter(tags)("minimum") ??
53
- getter(tags)("exclusiveMinimum"),
54
- exclusive: getter(tags)("exclusiveMinimum") !== undefined,
55
- },
56
- maximum: {
57
- value:
58
- getter(tags)("maximum") ??
59
- getter(tags)("exclusiveMaximum"),
60
- exclusive: getter(tags)("exclusiveMaximum") !== undefined,
61
- },
62
- stepper: undefined,
63
- multiply: getter(tags)("multipleOf"),
64
- };
65
-
66
- //----
67
- // MULTIPLIERS
68
- //----
69
- if (range.multiply !== undefined) {
70
- const { minimum, maximum } = multiplier(defs.gap)(range)(
71
- range.multiply,
72
- );
73
- return ts.factory.createMultiply(
74
- config.transform(range.multiply),
75
- config.setter([minimum, maximum]),
76
- );
77
- }
78
-
79
- //----
80
- // RANGE
81
- //----
82
- // INT
83
- const integer = (value: number) => value === Math.floor(value);
84
- if (config.type === "int") {
85
- if (range.minimum.value !== undefined) {
86
- if (range.minimum.exclusive) {
87
- range.minimum.exclusive = false;
88
- if (integer(range.minimum.value))
89
- range.minimum.value += 1;
90
- }
91
- range.minimum.value = Math.ceil(range.minimum.value);
92
- }
93
- if (range.maximum.value !== undefined) {
94
- if (range.maximum.exclusive) {
95
- range.maximum.exclusive = false;
96
- if (integer(range.maximum.value))
97
- range.maximum.value -= 1;
98
- }
99
- range.maximum.value = Math.floor(range.maximum.value);
100
- }
101
- }
102
-
103
- // UNSIGNED INT
104
- if (config.type === "uint") {
105
- if (range.minimum.value === undefined) range.minimum.value = 0;
106
- else if (range.minimum.value <= 0) {
107
- range.minimum.value = 0;
108
- range.minimum.exclusive = false;
109
- }
110
- }
111
-
112
- const minimum =
113
- range.minimum.value ??
114
- (range.maximum.value !== undefined
115
- ? range.maximum.value - defs.gap
116
- : defs.minimum);
117
- const maximum =
118
- range.maximum.value ??
119
- (range.minimum.value !== undefined
120
- ? range.minimum.value + defs.gap
121
- : defs.maximum);
122
- return config.setter([minimum, maximum]);
123
- };
124
- export namespace number {
125
- export interface IConfig {
126
- setter: (args: number[]) => ts.Expression;
127
- transform: (value: number) => ts.Expression;
128
- type: "int" | "uint" | "double";
129
- }
130
- }
131
- }
132
-
133
- const getter =
134
- (tags: IMetadataTypeTag[]) =>
135
- (kind: string): number | undefined => {
136
- const value: bigint | number | undefined = tags.find(
137
- (t) =>
138
- t.kind === kind &&
139
- (typeof t.value === "number" || typeof t.value === "bigint"),
140
- )?.value;
141
- return value !== undefined ? Number(value) : undefined;
142
- };
143
-
144
- const multiplier = (gap: number) => (range: IRange) => (m: number) => {
145
- const minimum: number =
146
- range.minimum.value === undefined
147
- ? 0
148
- : (() => {
149
- const x: number = m * Math.ceil(range.minimum.value / m);
150
- return range.minimum.exclusive && x === range.minimum.value
151
- ? x + m
152
- : x;
153
- })() / m;
154
- const maximum: number =
155
- range.maximum.value === undefined
156
- ? gap
157
- : (() => {
158
- const y: number = m * Math.floor(range.maximum.value / m);
159
- return range.maximum.exclusive && y === range.maximum.value
160
- ? y - m
161
- : y;
162
- })() / m;
163
- return { minimum, maximum };
164
- };
165
-
166
- interface IRange {
167
- minimum: IScalar;
168
- maximum: IScalar;
169
- }
170
- interface IScalar {
171
- value?: number;
172
- exclusive: boolean;
173
- }
1
+ import ts from "typescript";
2
+
3
+ import { IMetadataTypeTag } from "../../schemas/metadata/IMetadataTypeTag";
4
+
5
+ export namespace RandomRanger {
6
+ export interface IDefaults {
7
+ minimum: number;
8
+ maximum: number;
9
+ gap: number;
10
+ }
11
+
12
+ export const length =
13
+ (coalesce: (method: string) => ts.Expression) =>
14
+ (defs: IDefaults) =>
15
+ (acc: length.IAccessors) =>
16
+ (tags: IMetadataTypeTag[]): ts.Expression | undefined => {
17
+ const props = {
18
+ minimum: getter(tags)(acc.minimum),
19
+ maximum: getter(tags)(acc.maximum),
20
+ };
21
+ if (props.minimum === undefined && props.maximum === undefined)
22
+ return undefined;
23
+
24
+ props.minimum ??= defs.minimum;
25
+ props.maximum ??= defs.maximum;
26
+ if (props.maximum < props.minimum)
27
+ (props.maximum as number) += defs.gap;
28
+
29
+ return ts.factory.createCallExpression(
30
+ coalesce("integer"),
31
+ undefined,
32
+ [
33
+ ts.factory.createNumericLiteral(props.minimum),
34
+ ts.factory.createNumericLiteral(props.maximum),
35
+ ],
36
+ );
37
+ };
38
+ export namespace length {
39
+ export interface IAccessors {
40
+ minimum: string;
41
+ maximum: string;
42
+ }
43
+ }
44
+
45
+ export const number =
46
+ (config: number.IConfig) =>
47
+ (defs: IDefaults) =>
48
+ (tags: IMetadataTypeTag[]): ts.Expression => {
49
+ const range = {
50
+ minimum: {
51
+ value:
52
+ getter(tags)("minimum") ??
53
+ getter(tags)("exclusiveMinimum"),
54
+ exclusive: getter(tags)("exclusiveMinimum") !== undefined,
55
+ },
56
+ maximum: {
57
+ value:
58
+ getter(tags)("maximum") ??
59
+ getter(tags)("exclusiveMaximum"),
60
+ exclusive: getter(tags)("exclusiveMaximum") !== undefined,
61
+ },
62
+ stepper: undefined,
63
+ multiply: getter(tags)("multipleOf"),
64
+ };
65
+
66
+ //----
67
+ // MULTIPLIERS
68
+ //----
69
+ if (range.multiply !== undefined) {
70
+ const { minimum, maximum } = multiplier(defs.gap)(range)(
71
+ range.multiply,
72
+ );
73
+ return ts.factory.createMultiply(
74
+ config.transform(range.multiply),
75
+ config.setter([minimum, maximum]),
76
+ );
77
+ }
78
+
79
+ //----
80
+ // RANGE
81
+ //----
82
+ // INT
83
+ const integer = (value: number) => value === Math.floor(value);
84
+ if (config.type === "int") {
85
+ if (range.minimum.value !== undefined) {
86
+ if (range.minimum.exclusive) {
87
+ range.minimum.exclusive = false;
88
+ if (integer(range.minimum.value))
89
+ range.minimum.value += 1;
90
+ }
91
+ range.minimum.value = Math.ceil(range.minimum.value);
92
+ }
93
+ if (range.maximum.value !== undefined) {
94
+ if (range.maximum.exclusive) {
95
+ range.maximum.exclusive = false;
96
+ if (integer(range.maximum.value))
97
+ range.maximum.value -= 1;
98
+ }
99
+ range.maximum.value = Math.floor(range.maximum.value);
100
+ }
101
+ }
102
+
103
+ // UNSIGNED INT
104
+ if (config.type === "uint") {
105
+ if (range.minimum.value === undefined) range.minimum.value = 0;
106
+ else if (range.minimum.value <= 0) {
107
+ range.minimum.value = 0;
108
+ range.minimum.exclusive = false;
109
+ }
110
+ }
111
+
112
+ const minimum =
113
+ range.minimum.value ??
114
+ (range.maximum.value !== undefined
115
+ ? range.maximum.value - defs.gap
116
+ : defs.minimum);
117
+ const maximum =
118
+ range.maximum.value ??
119
+ (range.minimum.value !== undefined
120
+ ? range.minimum.value + defs.gap
121
+ : defs.maximum);
122
+ return config.setter([minimum, maximum]);
123
+ };
124
+ export namespace number {
125
+ export interface IConfig {
126
+ setter: (args: number[]) => ts.Expression;
127
+ transform: (value: number) => ts.Expression;
128
+ type: "int" | "uint" | "double";
129
+ }
130
+ }
131
+ }
132
+
133
+ const getter =
134
+ (tags: IMetadataTypeTag[]) =>
135
+ (kind: string): number | undefined => {
136
+ const value: bigint | number | undefined = tags.find(
137
+ (t) =>
138
+ t.kind === kind &&
139
+ (typeof t.value === "number" || typeof t.value === "bigint"),
140
+ )?.value;
141
+ return value !== undefined ? Number(value) : undefined;
142
+ };
143
+
144
+ const multiplier = (gap: number) => (range: IRange) => (m: number) => {
145
+ const minimum: number =
146
+ range.minimum.value === undefined
147
+ ? 0
148
+ : (() => {
149
+ const x: number = m * Math.ceil(range.minimum.value / m);
150
+ return range.minimum.exclusive && x === range.minimum.value
151
+ ? x + m
152
+ : x;
153
+ })() / m;
154
+ const maximum: number =
155
+ range.maximum.value === undefined
156
+ ? gap
157
+ : (() => {
158
+ const y: number = m * Math.floor(range.maximum.value / m);
159
+ return range.maximum.exclusive && y === range.maximum.value
160
+ ? y - m
161
+ : y;
162
+ })() / m;
163
+ return { minimum, maximum };
164
+ };
165
+
166
+ interface IRange {
167
+ minimum: IScalar;
168
+ maximum: IScalar;
169
+ }
170
+ interface IScalar {
171
+ value?: number;
172
+ exclusive: boolean;
173
+ }