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,120 +1,120 @@
1
- import fs from "fs";
2
- import path from "path";
3
- import ts from "typescript";
4
-
5
- import { ImportTransformer } from "../transformers/ImportTransformer";
6
-
7
- import transform from "../transform";
8
-
9
- export namespace TypiaFileFactory {
10
- export interface IProps {
11
- input: string;
12
- output: string;
13
- project: string;
14
- }
15
-
16
- export async function generate(
17
- props: TypiaFileFactory.IProps,
18
- ): Promise<void> {
19
- props.input = path.resolve(props.input);
20
- props.output = path.resolve(props.output);
21
-
22
- if ((await is_directory(props.input)) === false)
23
- throw new Error(
24
- "Error on TypiaGenerator.generate(): input path is not a directory.",
25
- );
26
- else if (fs.existsSync(props.output) === false)
27
- await fs.promises.mkdir(props.output, { recursive: true });
28
- else if ((await is_directory(props.output)) === false) {
29
- const parent: string = path.join(props.output, "..");
30
- if ((await is_directory(parent)) === false)
31
- throw new Error(
32
- "Error on TypiaGenerator.generate(): output path is not a directory.",
33
- );
34
- await fs.promises.mkdir(props.output);
35
- }
36
-
37
- // CREATE PROGRAM
38
- const { config } = ts.readConfigFile(props.project, ts.sys.readFile);
39
-
40
- const program: ts.Program = ts.createProgram(
41
- await (async () => {
42
- const container: string[] = [];
43
- await gather(props)(container)(props.input)(props.output);
44
- return container;
45
- })(),
46
- config.compilerOptions,
47
- );
48
-
49
- // DO TRANSFORM
50
- const result: ts.TransformationResult<ts.SourceFile> = ts.transform(
51
- program
52
- .getSourceFiles()
53
- .filter(
54
- (file) =>
55
- !file.isDeclarationFile &&
56
- path.resolve(file.fileName).indexOf(props.input) !== -1,
57
- ),
58
- [
59
- ImportTransformer.transform(props.input)(props.output),
60
- transform(
61
- program,
62
- (config.compilerOptions.plugins ?? []).find(
63
- (p: any) =>
64
- p.transform === "typia/lib/transform" ||
65
- p.transform === "../src/transform.ts",
66
- ) ?? {},
67
- ),
68
- ],
69
- program.getCompilerOptions(),
70
- );
71
-
72
- // ARCHIVE TRANSFORMED FILES
73
- const printer: ts.Printer = ts.createPrinter({
74
- newLine: ts.NewLineKind.LineFeed,
75
- });
76
- for (const file of result.transformed) {
77
- const to: string = path
78
- .resolve(file.fileName)
79
- .replace(props.input, props.output);
80
-
81
- const content: string = printer.printFile(file);
82
- await fs.promises.writeFile(to, emend(content), "utf8");
83
- }
84
- }
85
-
86
- const emend = (content: string): string => {
87
- if (
88
- content.indexOf("typia.") === -1 ||
89
- content.indexOf("import typia") !== -1 ||
90
- content.indexOf("import * as typia") !== -1
91
- )
92
- return content;
93
- return `import typia from "typia";\n\n${content}`;
94
- };
95
-
96
- const is_directory = async (current: string): Promise<boolean> => {
97
- const stat: fs.Stats = await fs.promises.stat(current);
98
- return stat.isDirectory();
99
- };
100
-
101
- const gather =
102
- (props: IProps) =>
103
- (container: string[]) =>
104
- (from: string) =>
105
- async (to: string) => {
106
- if (from === props.output) return;
107
- else if (fs.existsSync(to) === false) await fs.promises.mkdir(to);
108
-
109
- for (const file of await fs.promises.readdir(from)) {
110
- const next: string = path.join(from, file);
111
- const stat: fs.Stats = await fs.promises.stat(next);
112
-
113
- if (stat.isDirectory()) {
114
- await gather(props)(container)(next)(path.join(to, file));
115
- continue;
116
- } else if (file.substring(file.length - 3) === ".ts")
117
- container.push(next);
118
- }
119
- };
120
- }
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import ts from "typescript";
4
+
5
+ import { ImportTransformer } from "../transformers/ImportTransformer";
6
+
7
+ import transform from "../transform";
8
+
9
+ export namespace TypiaFileFactory {
10
+ export interface IProps {
11
+ input: string;
12
+ output: string;
13
+ project: string;
14
+ }
15
+
16
+ export async function generate(
17
+ props: TypiaFileFactory.IProps,
18
+ ): Promise<void> {
19
+ props.input = path.resolve(props.input);
20
+ props.output = path.resolve(props.output);
21
+
22
+ if ((await is_directory(props.input)) === false)
23
+ throw new Error(
24
+ "Error on TypiaGenerator.generate(): input path is not a directory.",
25
+ );
26
+ else if (fs.existsSync(props.output) === false)
27
+ await fs.promises.mkdir(props.output, { recursive: true });
28
+ else if ((await is_directory(props.output)) === false) {
29
+ const parent: string = path.join(props.output, "..");
30
+ if ((await is_directory(parent)) === false)
31
+ throw new Error(
32
+ "Error on TypiaGenerator.generate(): output path is not a directory.",
33
+ );
34
+ await fs.promises.mkdir(props.output);
35
+ }
36
+
37
+ // CREATE PROGRAM
38
+ const { config } = ts.readConfigFile(props.project, ts.sys.readFile);
39
+
40
+ const program: ts.Program = ts.createProgram(
41
+ await (async () => {
42
+ const container: string[] = [];
43
+ await gather(props)(container)(props.input)(props.output);
44
+ return container;
45
+ })(),
46
+ config.compilerOptions,
47
+ );
48
+
49
+ // DO TRANSFORM
50
+ const result: ts.TransformationResult<ts.SourceFile> = ts.transform(
51
+ program
52
+ .getSourceFiles()
53
+ .filter(
54
+ (file) =>
55
+ !file.isDeclarationFile &&
56
+ path.resolve(file.fileName).indexOf(props.input) !== -1,
57
+ ),
58
+ [
59
+ ImportTransformer.transform(props.input)(props.output),
60
+ transform(
61
+ program,
62
+ (config.compilerOptions.plugins ?? []).find(
63
+ (p: any) =>
64
+ p.transform === "typia/lib/transform" ||
65
+ p.transform === "../src/transform.ts",
66
+ ) ?? {},
67
+ ),
68
+ ],
69
+ program.getCompilerOptions(),
70
+ );
71
+
72
+ // ARCHIVE TRANSFORMED FILES
73
+ const printer: ts.Printer = ts.createPrinter({
74
+ newLine: ts.NewLineKind.LineFeed,
75
+ });
76
+ for (const file of result.transformed) {
77
+ const to: string = path
78
+ .resolve(file.fileName)
79
+ .replace(props.input, props.output);
80
+
81
+ const content: string = printer.printFile(file);
82
+ await fs.promises.writeFile(to, emend(content), "utf8");
83
+ }
84
+ }
85
+
86
+ const emend = (content: string): string => {
87
+ if (
88
+ content.indexOf("typia.") === -1 ||
89
+ content.indexOf("import typia") !== -1 ||
90
+ content.indexOf("import * as typia") !== -1
91
+ )
92
+ return content;
93
+ return `import typia from "typia";\n\n${content}`;
94
+ };
95
+
96
+ const is_directory = async (current: string): Promise<boolean> => {
97
+ const stat: fs.Stats = await fs.promises.stat(current);
98
+ return stat.isDirectory();
99
+ };
100
+
101
+ const gather =
102
+ (props: IProps) =>
103
+ (container: string[]) =>
104
+ (from: string) =>
105
+ async (to: string) => {
106
+ if (from === props.output) return;
107
+ else if (fs.existsSync(to) === false) await fs.promises.mkdir(to);
108
+
109
+ for (const file of await fs.promises.readdir(from)) {
110
+ const next: string = path.join(from, file);
111
+ const stat: fs.Stats = await fs.promises.stat(next);
112
+
113
+ if (stat.isDirectory()) {
114
+ await gather(props)(container)(next)(path.join(to, file));
115
+ continue;
116
+ } else if (file.substring(file.length - 3) === ".ts")
117
+ container.push(next);
118
+ }
119
+ };
120
+ }
@@ -1,12 +1,12 @@
1
- import ts from "typescript";
2
-
3
- export namespace ValueFactory {
4
- export const NULL = () => ts.factory.createNull();
5
- export const UNDEFINED = () => ts.factory.createIdentifier("undefined");
6
- export const BOOLEAN = (value: boolean) =>
7
- value ? ts.factory.createTrue() : ts.factory.createFalse();
8
- export const INPUT = (str: string = "input") =>
9
- ts.factory.createIdentifier(str);
10
- export const TYPEOF = (input: ts.Expression) =>
11
- ts.factory.createTypeOfExpression(input);
12
- }
1
+ import ts from "typescript";
2
+
3
+ export namespace ValueFactory {
4
+ export const NULL = () => ts.factory.createNull();
5
+ export const UNDEFINED = () => ts.factory.createIdentifier("undefined");
6
+ export const BOOLEAN = (value: boolean) =>
7
+ value ? ts.factory.createTrue() : ts.factory.createFalse();
8
+ export const INPUT = (str: string = "input") =>
9
+ ts.factory.createIdentifier(str);
10
+ export const TYPEOF = (input: ts.Expression) =>
11
+ ts.factory.createTypeOfExpression(input);
12
+ }
@@ -1,12 +1,12 @@
1
- import { Metadata } from "../../../metadata/Metadata";
2
-
3
- export namespace MetadataHelper {
4
- export function literal_to_metadata(key: string): Metadata {
5
- const metadata: Metadata = Metadata.initialize();
6
- metadata.constants.push({
7
- type: "string",
8
- values: [key],
9
- });
10
- return metadata;
11
- }
12
- }
1
+ import { Metadata } from "../../../metadata/Metadata";
2
+
3
+ export namespace MetadataHelper {
4
+ export function literal_to_metadata(key: string): Metadata {
5
+ const metadata: Metadata = Metadata.initialize();
6
+ metadata.constants.push({
7
+ type: "string",
8
+ values: [key],
9
+ });
10
+ return metadata;
11
+ }
12
+ }
@@ -1,142 +1,142 @@
1
- import ts from "typescript";
2
-
3
- import { Metadata } from "../../../metadata/Metadata";
4
- import { MetadataObject } from "../../../metadata/MetadataObject";
5
- import { MetadataProperty } from "../../../metadata/MetadataProperty";
6
-
7
- import { Writable } from "../../../typings/Writable";
8
-
9
- import { ArrayUtil } from "../../../utils/ArrayUtil";
10
-
11
- import { CommentFactory } from "../../CommentFactory";
12
- import { MetadataCollection } from "../../MetadataCollection";
13
- import { MetadataFactory } from "../../MetadataFactory";
14
- import { MetadataTagFactory } from "../../MetadataTagFactory";
15
- import { MetadataHelper } from "./MetadataHelper";
16
- import { explore_metadata } from "./explore_metadata";
17
-
18
- export const emplace_metadata_object =
19
- (checker: ts.TypeChecker) =>
20
- (options: MetadataFactory.IOptions) =>
21
- (collection: MetadataCollection) =>
22
- (parent: ts.Type, nullable: boolean): MetadataObject => {
23
- // EMPLACE OBJECT
24
- const [obj, newbie] = collection.emplace(checker, parent);
25
- ArrayUtil.add(obj.nullables, nullable, (elem) => elem === nullable);
26
- if (newbie === false) return obj;
27
-
28
- // PREPARE ASSETS
29
- const isClass: boolean = parent.isClass();
30
- const pred: (node: ts.Declaration) => boolean = isClass
31
- ? (node) => {
32
- const kind: ts.SyntaxKind | undefined = node
33
- .getChildren()[0]
34
- ?.getChildren()[0]?.kind;
35
- return (
36
- kind !== ts.SyntaxKind.PrivateKeyword &&
37
- kind !== ts.SyntaxKind.ProtectedKeyword &&
38
- (ts.isParameter(node) || isProperty(node))
39
- );
40
- }
41
- : (node) => isProperty(node);
42
-
43
- const insert =
44
- (key: Metadata) =>
45
- (value: Metadata) =>
46
- (identifier: () => string) =>
47
- (
48
- symbol: ts.Symbol | undefined,
49
- filter?: (doc: ts.JSDocTagInfo) => boolean,
50
- ): MetadataProperty => {
51
- // COMMENTS AND TAGS
52
- const description: string | undefined =
53
- CommentFactory.generate(
54
- symbol?.getDocumentationComment(checker) || [],
55
- ) || undefined;
56
- const jsDocTags: ts.JSDocTagInfo[] = (
57
- symbol?.getJsDocTags() || []
58
- ).filter(filter || (() => true));
59
-
60
- // THE PROPERTY
61
- const property = MetadataProperty.create({
62
- key,
63
- value,
64
- description,
65
- jsDocTags,
66
- tags: MetadataTagFactory.generate(
67
- () => identifier(),
68
- value,
69
- jsDocTags,
70
- ),
71
- });
72
- obj.properties.push(property);
73
- return property;
74
- };
75
-
76
- //----
77
- // REGULAR PROPERTIES
78
- //----
79
- for (const prop of parent.getApparentProperties()) {
80
- // CHECK INTERNAL TAG
81
- if (
82
- (prop.getJsDocTags(checker) || []).find(
83
- (tag) => tag.name === "internal",
84
- ) !== undefined
85
- )
86
- continue;
87
-
88
- // CHECK NODE IS A FORMAL PROPERTY
89
- const [node, type] = (() => {
90
- const node = (prop.getDeclarations() || [])[0] as
91
- | ts.PropertyDeclaration
92
- | undefined;
93
- const type: ts.Type | undefined = node
94
- ? checker.getTypeOfSymbolAtLocation(prop, node)
95
- : "getTypeOfPropertyOfType" in checker
96
- ? (checker as any).getTypeOfPropertyOfType(
97
- parent,
98
- prop.name,
99
- )
100
- : undefined;
101
- return [node, type];
102
- })();
103
- if ((node && pred(node) === false) || type === undefined) continue;
104
-
105
- // GET EXACT TYPE
106
- const key: Metadata = MetadataHelper.literal_to_metadata(prop.name);
107
- const value: Metadata = explore_metadata(checker)(options)(
108
- collection,
109
- )(type, false);
110
-
111
- // INSERT WITH REQUIRED CONFIGURATION
112
- if (node?.questionToken) Writable(value).required = false;
113
- insert(key)(value)(() => `${obj.name}.${prop.name}`)(prop);
114
- }
115
-
116
- //----
117
- // DYNAMIC PROPERTIES
118
- //----
119
- for (const index of checker.getIndexInfosOfType(parent)) {
120
- // GET EXACT TYPE
121
- const analyzer = (type: ts.Type) =>
122
- explore_metadata(checker)(options)(collection)(type, false);
123
- const key: Metadata = analyzer(index.keyType);
124
- const value: Metadata = analyzer(index.type);
125
-
126
- // INSERT WITH REQUIRED CONFIGURATION
127
- insert(key)(value)(() => `${obj.name}[${key.getName()}]`)(
128
- index.declaration?.parent
129
- ? checker.getSymbolAtLocation(index.declaration.parent)
130
- : undefined,
131
- (doc) => doc.name !== "default",
132
- );
133
- }
134
-
135
- return obj;
136
- };
137
-
138
- const isProperty = (node: ts.Declaration) =>
139
- ts.isPropertyDeclaration(node) ||
140
- ts.isPropertyAssignment(node) ||
141
- ts.isPropertySignature(node) ||
142
- ts.isTypeLiteralNode(node);
1
+ import ts from "typescript";
2
+
3
+ import { Metadata } from "../../../metadata/Metadata";
4
+ import { MetadataObject } from "../../../metadata/MetadataObject";
5
+ import { MetadataProperty } from "../../../metadata/MetadataProperty";
6
+
7
+ import { Writable } from "../../../typings/Writable";
8
+
9
+ import { ArrayUtil } from "../../../utils/ArrayUtil";
10
+
11
+ import { CommentFactory } from "../../CommentFactory";
12
+ import { MetadataCollection } from "../../MetadataCollection";
13
+ import { MetadataFactory } from "../../MetadataFactory";
14
+ import { MetadataTagFactory } from "../../MetadataTagFactory";
15
+ import { MetadataHelper } from "./MetadataHelper";
16
+ import { explore_metadata } from "./explore_metadata";
17
+
18
+ export const emplace_metadata_object =
19
+ (checker: ts.TypeChecker) =>
20
+ (options: MetadataFactory.IOptions) =>
21
+ (collection: MetadataCollection) =>
22
+ (parent: ts.Type, nullable: boolean): MetadataObject => {
23
+ // EMPLACE OBJECT
24
+ const [obj, newbie] = collection.emplace(checker, parent);
25
+ ArrayUtil.add(obj.nullables, nullable, (elem) => elem === nullable);
26
+ if (newbie === false) return obj;
27
+
28
+ // PREPARE ASSETS
29
+ const isClass: boolean = parent.isClass();
30
+ const pred: (node: ts.Declaration) => boolean = isClass
31
+ ? (node) => {
32
+ const kind: ts.SyntaxKind | undefined = node
33
+ .getChildren()[0]
34
+ ?.getChildren()[0]?.kind;
35
+ return (
36
+ kind !== ts.SyntaxKind.PrivateKeyword &&
37
+ kind !== ts.SyntaxKind.ProtectedKeyword &&
38
+ (ts.isParameter(node) || isProperty(node))
39
+ );
40
+ }
41
+ : (node) => isProperty(node);
42
+
43
+ const insert =
44
+ (key: Metadata) =>
45
+ (value: Metadata) =>
46
+ (identifier: () => string) =>
47
+ (
48
+ symbol: ts.Symbol | undefined,
49
+ filter?: (doc: ts.JSDocTagInfo) => boolean,
50
+ ): MetadataProperty => {
51
+ // COMMENTS AND TAGS
52
+ const description: string | undefined =
53
+ CommentFactory.generate(
54
+ symbol?.getDocumentationComment(checker) || [],
55
+ ) || undefined;
56
+ const jsDocTags: ts.JSDocTagInfo[] = (
57
+ symbol?.getJsDocTags() || []
58
+ ).filter(filter || (() => true));
59
+
60
+ // THE PROPERTY
61
+ const property = MetadataProperty.create({
62
+ key,
63
+ value,
64
+ description,
65
+ jsDocTags,
66
+ tags: MetadataTagFactory.generate(
67
+ () => identifier(),
68
+ value,
69
+ jsDocTags,
70
+ ),
71
+ });
72
+ obj.properties.push(property);
73
+ return property;
74
+ };
75
+
76
+ //----
77
+ // REGULAR PROPERTIES
78
+ //----
79
+ for (const prop of parent.getApparentProperties()) {
80
+ // CHECK INTERNAL TAG
81
+ if (
82
+ (prop.getJsDocTags(checker) || []).find(
83
+ (tag) => tag.name === "internal",
84
+ ) !== undefined
85
+ )
86
+ continue;
87
+
88
+ // CHECK NODE IS A FORMAL PROPERTY
89
+ const [node, type] = (() => {
90
+ const node = (prop.getDeclarations() || [])[0] as
91
+ | ts.PropertyDeclaration
92
+ | undefined;
93
+ const type: ts.Type | undefined = node
94
+ ? checker.getTypeOfSymbolAtLocation(prop, node)
95
+ : "getTypeOfPropertyOfType" in checker
96
+ ? (checker as any).getTypeOfPropertyOfType(
97
+ parent,
98
+ prop.name,
99
+ )
100
+ : undefined;
101
+ return [node, type];
102
+ })();
103
+ if ((node && pred(node) === false) || type === undefined) continue;
104
+
105
+ // GET EXACT TYPE
106
+ const key: Metadata = MetadataHelper.literal_to_metadata(prop.name);
107
+ const value: Metadata = explore_metadata(checker)(options)(
108
+ collection,
109
+ )(type, false);
110
+
111
+ // INSERT WITH REQUIRED CONFIGURATION
112
+ if (node?.questionToken) Writable(value).required = false;
113
+ insert(key)(value)(() => `${obj.name}.${prop.name}`)(prop);
114
+ }
115
+
116
+ //----
117
+ // DYNAMIC PROPERTIES
118
+ //----
119
+ for (const index of checker.getIndexInfosOfType(parent)) {
120
+ // GET EXACT TYPE
121
+ const analyzer = (type: ts.Type) =>
122
+ explore_metadata(checker)(options)(collection)(type, false);
123
+ const key: Metadata = analyzer(index.keyType);
124
+ const value: Metadata = analyzer(index.type);
125
+
126
+ // INSERT WITH REQUIRED CONFIGURATION
127
+ insert(key)(value)(() => `${obj.name}[${key.getName()}]`)(
128
+ index.declaration?.parent
129
+ ? checker.getSymbolAtLocation(index.declaration.parent)
130
+ : undefined,
131
+ (doc) => doc.name !== "default",
132
+ );
133
+ }
134
+
135
+ return obj;
136
+ };
137
+
138
+ const isProperty = (node: ts.Declaration) =>
139
+ ts.isPropertyDeclaration(node) ||
140
+ ts.isPropertyAssignment(node) ||
141
+ ts.isPropertySignature(node) ||
142
+ ts.isTypeLiteralNode(node);