typia 3.6.9 → 3.6.10
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.
- package/lib/factories/TypiaFileFactory.js +61 -54
- package/lib/factories/TypiaFileFactory.js.map +1 -1
- package/package.json +10 -8
- package/src/IRandomGenerator.ts +17 -17
- package/src/IValidation.ts +21 -21
- package/src/Primitive.ts +104 -104
- package/src/TypeGuardError.ts +36 -36
- package/src/executable/TypiaGenerateWizard.ts +87 -87
- package/src/executable/TypiaSetupWizard.ts +152 -152
- package/src/executable/setup/ArgumentParser.ts +91 -91
- package/src/executable/setup/CommandExecutor.ts +8 -8
- package/src/executable/setup/FileRetriever.ts +33 -33
- package/src/executable/setup/PackageManager.ts +92 -92
- package/src/executable/setup/PluginConfigurator.ts +99 -99
- package/src/executable/typia.ts +38 -38
- package/src/factories/CommentFactory.ts +10 -10
- package/src/factories/ExpressionFactory.ts +77 -77
- package/src/factories/IdentifierFactory.ts +73 -73
- package/src/factories/LiteralFactory.ts +44 -44
- package/src/factories/MetadataCollection.ts +122 -122
- package/src/factories/MetadataFactory.ts +51 -51
- package/src/factories/MetadataTagFactory.ts +276 -276
- package/src/factories/StatementFactory.ts +60 -60
- package/src/factories/TemplateFactory.ts +56 -56
- package/src/factories/TypeFactory.ts +129 -129
- package/src/factories/TypiaFileFactory.ts +120 -117
- package/src/factories/ValueFactory.ts +12 -12
- package/src/factories/internal/metadata/MetadataHelper.ts +12 -12
- package/src/factories/internal/metadata/emplace_metadata_object.ts +142 -142
- package/src/factories/internal/metadata/explore_metadata.ts +92 -92
- package/src/factories/internal/metadata/iterate_metadata.ts +80 -80
- package/src/factories/internal/metadata/iterate_metadata_array.ts +29 -29
- package/src/factories/internal/metadata/iterate_metadata_atomic.ts +59 -59
- package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
- package/src/factories/internal/metadata/iterate_metadata_constant.ts +58 -58
- package/src/factories/internal/metadata/iterate_metadata_map.ts +41 -41
- package/src/factories/internal/metadata/iterate_metadata_native.ts +222 -222
- package/src/factories/internal/metadata/iterate_metadata_object.ts +48 -48
- package/src/factories/internal/metadata/iterate_metadata_resolve.ts +27 -27
- package/src/factories/internal/metadata/iterate_metadata_set.ts +33 -33
- package/src/factories/internal/metadata/iterate_metadata_template.ts +38 -38
- package/src/factories/internal/metadata/iterate_metadata_tuple.ts +45 -45
- package/src/factories/internal/metadata/iterate_metadata_union.ts +59 -59
- package/src/functional/$any.ts +3 -3
- package/src/functional/$every.ts +11 -11
- package/src/functional/$guard.ts +35 -35
- package/src/functional/$is_between.ts +7 -7
- package/src/functional/$is_date.ts +4 -4
- package/src/functional/$is_datetime.ts +3 -3
- package/src/functional/$is_email.ts +5 -5
- package/src/functional/$is_ipv4.ts +5 -5
- package/src/functional/$is_ipv6.ts +5 -5
- package/src/functional/$is_url.ts +5 -5
- package/src/functional/$is_uuid.ts +5 -5
- package/src/functional/$join.ts +50 -50
- package/src/functional/$number.ts +12 -12
- package/src/functional/$report.ts +15 -15
- package/src/functional/$rest.ts +3 -3
- package/src/functional/$string.ts +37 -37
- package/src/functional/$tail.ts +6 -6
- package/src/functional/Namespace.ts +125 -125
- package/src/index.ts +4 -4
- package/src/metadata/IJsDocTagInfo.ts +10 -10
- package/src/metadata/IMetadata.ts +25 -25
- package/src/metadata/IMetadataApplication.ts +7 -7
- package/src/metadata/IMetadataConstant.ts +16 -16
- package/src/metadata/IMetadataEntry.ts +6 -6
- package/src/metadata/IMetadataObject.ts +29 -29
- package/src/metadata/IMetadataProperty.ts +11 -11
- package/src/metadata/IMetadataTag.ts +105 -105
- package/src/metadata/Metadata.ts +534 -534
- package/src/metadata/MetadataConstant.ts +3 -3
- package/src/metadata/MetadataObject.ts +131 -131
- package/src/metadata/MetadataProperty.ts +64 -64
- package/src/module.ts +1946 -1946
- package/src/programmers/ApplicationProgrammer.ts +55 -55
- package/src/programmers/AssertCloneProgrammer.ts +70 -70
- package/src/programmers/AssertParseProgrammer.ts +65 -65
- package/src/programmers/AssertProgrammer.ts +232 -232
- package/src/programmers/AssertPruneProgrammer.ts +67 -67
- package/src/programmers/AssertStringifyProgrammer.ts +71 -71
- package/src/programmers/CheckerProgrammer.ts +893 -893
- package/src/programmers/CloneProgrammer.ts +386 -386
- package/src/programmers/FeatureProgrammer.ts +505 -505
- package/src/programmers/IsCloneProgrammer.ts +80 -80
- package/src/programmers/IsParseProgrammer.ts +74 -74
- package/src/programmers/IsProgrammer.ts +200 -200
- package/src/programmers/IsPruneProgrammer.ts +75 -75
- package/src/programmers/IsStringifyProgrammer.ts +81 -81
- package/src/programmers/PruneProgrammer.ts +341 -341
- package/src/programmers/RandomProgrammer.ts +388 -388
- package/src/programmers/StringifyProgrammer.ts +795 -795
- package/src/programmers/ValidateCloneProgrammer.ts +90 -90
- package/src/programmers/ValidateParseProgrammer.ts +69 -69
- package/src/programmers/ValidateProgrammer.ts +266 -266
- package/src/programmers/ValidatePruneProgrammer.ts +83 -83
- package/src/programmers/ValidateStringifyProgrammer.ts +89 -89
- package/src/programmers/helpers/AtomicPredicator.ts +31 -31
- package/src/programmers/helpers/CloneJoiner.ts +134 -134
- package/src/programmers/helpers/FunctionImporeter.ts +55 -55
- package/src/programmers/helpers/IExpressionEntry.ts +12 -12
- package/src/programmers/helpers/OptionPredicator.ts +19 -19
- package/src/programmers/helpers/PruneJoiner.ts +52 -52
- package/src/programmers/helpers/RandomJoiner.ts +149 -149
- package/src/programmers/helpers/RandomRanger.ts +216 -216
- package/src/programmers/helpers/StringifyJoinder.ts +114 -114
- package/src/programmers/helpers/StringifyPredicator.ts +18 -18
- package/src/programmers/helpers/UnionExplorer.ts +274 -274
- package/src/programmers/helpers/UnionPredicator.ts +81 -81
- package/src/programmers/internal/application_array.ts +37 -37
- package/src/programmers/internal/application_boolean.ts +17 -17
- package/src/programmers/internal/application_constant.ts +29 -29
- package/src/programmers/internal/application_default.ts +17 -17
- package/src/programmers/internal/application_default_string.ts +32 -32
- package/src/programmers/internal/application_native.ts +29 -29
- package/src/programmers/internal/application_number.ts +73 -73
- package/src/programmers/internal/application_object.ts +153 -153
- package/src/programmers/internal/application_schema.ts +184 -184
- package/src/programmers/internal/application_string.ts +45 -45
- package/src/programmers/internal/application_templates.ts +27 -27
- package/src/programmers/internal/application_tuple.ts +29 -29
- package/src/programmers/internal/check_array.ts +22 -22
- package/src/programmers/internal/check_array_length.ts +44 -44
- package/src/programmers/internal/check_bigint.ts +64 -64
- package/src/programmers/internal/check_dynamic_properties.ts +197 -197
- package/src/programmers/internal/check_everything.ts +28 -28
- package/src/programmers/internal/check_native.ts +21 -21
- package/src/programmers/internal/check_number.ts +145 -145
- package/src/programmers/internal/check_object.ts +48 -48
- package/src/programmers/internal/check_string.ts +24 -24
- package/src/programmers/internal/check_string_tags.ts +63 -63
- package/src/programmers/internal/check_template.ts +50 -50
- package/src/programmers/internal/check_union_array_like.ts +260 -260
- package/src/programmers/internal/check_union_tuple.ts +33 -33
- package/src/programmers/internal/decode_union_object.ts +73 -73
- package/src/programmers/internal/feature_object_entries.ts +59 -59
- package/src/programmers/internal/metadata_to_pattern.ts +31 -31
- package/src/programmers/internal/prune_object_properties.ts +60 -60
- package/src/programmers/internal/stringify_dynamic_properties.ts +165 -165
- package/src/programmers/internal/stringify_native.ts +8 -8
- package/src/programmers/internal/stringify_regular_properties.ts +81 -81
- package/src/programmers/internal/template_to_pattern.ts +15 -15
- package/src/schemas/IJsonApplication.ts +9 -9
- package/src/schemas/IJsonComponents.ts +26 -26
- package/src/schemas/IJsonSchema.ts +121 -121
- package/src/transform.ts +21 -21
- package/src/transformers/CallExpressionTransformer.ts +172 -172
- package/src/transformers/ExpressionWithArgumentTransformer.ts +66 -66
- package/src/transformers/FileTransformer.ts +49 -49
- package/src/transformers/IProject.ts +11 -11
- package/src/transformers/ITransformOptions.ts +62 -62
- package/src/transformers/ImportTransformer.ts +60 -60
- package/src/transformers/NodeTransformer.ts +19 -19
- package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +120 -120
- package/src/transformers/features/miscellaneous/AssertCloneTransformer.ts +9 -9
- package/src/transformers/features/miscellaneous/AssertPruneTransformer.ts +9 -9
- package/src/transformers/features/miscellaneous/CloneTransformer.ts +9 -9
- package/src/transformers/features/miscellaneous/CreateAssertCloneTransformer.ts +9 -9
- package/src/transformers/features/miscellaneous/CreateAssertPruneTransformer.ts +9 -9
- package/src/transformers/features/miscellaneous/CreateCloneTransformer.ts +9 -9
- package/src/transformers/features/miscellaneous/CreateIsCloneTransformer.ts +9 -9
- package/src/transformers/features/miscellaneous/CreateIsPruneTransformer.ts +9 -9
- package/src/transformers/features/miscellaneous/CreatePruneTransformer.ts +9 -9
- package/src/transformers/features/miscellaneous/CreateRandomGenerator.ts +42 -42
- package/src/transformers/features/miscellaneous/CreateValidateCloneTransformer.ts +9 -9
- package/src/transformers/features/miscellaneous/CreateValidatePruneTransformer.ts +9 -9
- package/src/transformers/features/miscellaneous/IsCloneTransformer.ts +9 -9
- package/src/transformers/features/miscellaneous/IsPruneTransformer.ts +9 -9
- package/src/transformers/features/miscellaneous/MetadataTransformer.ts +55 -55
- package/src/transformers/features/miscellaneous/PruneTransformer.ts +9 -9
- package/src/transformers/features/miscellaneous/RandomTransformer.ts +48 -48
- package/src/transformers/features/miscellaneous/ValidateCloneTransformer.ts +9 -9
- package/src/transformers/features/miscellaneous/ValidatePruneTransformer.ts +9 -9
- package/src/transformers/features/parsers/AssertParseTransformer.ts +9 -9
- package/src/transformers/features/parsers/CreateAssertParseTransformer.ts +9 -9
- package/src/transformers/features/parsers/CreateIsParseTransformer.ts +9 -9
- package/src/transformers/features/parsers/CreateValidateParseTransformer.ts +9 -9
- package/src/transformers/features/parsers/IsParseTransformer.ts +9 -9
- package/src/transformers/features/parsers/ValidateParseTransformer.ts +9 -9
- package/src/transformers/features/stringifiers/AssertStringifyTransformer.ts +10 -10
- package/src/transformers/features/stringifiers/CreateAssertStringifyTransformer.ts +9 -9
- package/src/transformers/features/stringifiers/CreateIsStringifyTransformer.ts +9 -9
- package/src/transformers/features/stringifiers/CreateStringifyTransformer.ts +9 -9
- package/src/transformers/features/stringifiers/CreateValidateStringifyProgrammer.ts +11 -11
- package/src/transformers/features/stringifiers/IsStringifyTransformer.ts +9 -9
- package/src/transformers/features/stringifiers/StringifyTransformer.ts +9 -9
- package/src/transformers/features/stringifiers/ValidateStringifyTransformer.ts +10 -10
- package/src/transformers/features/validators/AssertTransformer.ts +11 -11
- package/src/transformers/features/validators/CreateAssertTransformer.ts +12 -12
- package/src/transformers/features/validators/CreateIsTransformer.ts +10 -10
- package/src/transformers/features/validators/CreateValidateTransformer.ts +12 -12
- package/src/transformers/features/validators/IsTransformer.ts +10 -10
- package/src/transformers/features/validators/ValidateTransformer.ts +11 -11
- package/src/transformers/internal/GenericTransformer.ts +99 -99
- package/src/typings/Atomic.ts +17 -17
- package/src/typings/ClassProperties.ts +5 -5
- package/src/typings/OmitNever.ts +3 -3
- package/src/typings/SpecialFields.ts +3 -3
- package/src/typings/Writable.ts +11 -11
- package/src/utils/ArrayUtil.ts +49 -49
- package/src/utils/Escaper.ts +50 -50
- package/src/utils/MapUtil.ts +14 -14
- package/src/utils/PatternUtil.ts +30 -30
- package/src/utils/RandomGenerator.ts +96 -96
- package/src/utils/Singleton.ts +17 -17
|
@@ -1,117 +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(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
|
-
(
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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);
|