typia 5.0.0-dev.20230827 → 5.0.0-dev.20230828
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/executable/TypiaGenerateWizard.js +1 -1
- package/lib/executable/TypiaGenerateWizard.js.map +1 -1
- package/lib/executable/TypiaSetupWizard.js +1 -1
- package/lib/executable/TypiaSetupWizard.js.map +1 -1
- package/lib/executable/setup/PackageManager.js +1 -1
- package/lib/executable/setup/PackageManager.js.map +1 -1
- package/lib/executable/setup/PluginConfigurator.js +2 -2
- package/lib/executable/setup/PluginConfigurator.js.map +1 -1
- package/lib/factories/ExpressionFactory.js +2 -2
- package/lib/factories/ExpressionFactory.js.map +1 -1
- package/lib/factories/JsonMetadataFactory.d.ts +7 -0
- package/lib/factories/JsonMetadataFactory.js +38 -0
- package/lib/factories/JsonMetadataFactory.js.map +1 -0
- package/lib/factories/LiteralFactory.js +1 -1
- package/lib/factories/LiteralFactory.js.map +1 -1
- package/lib/factories/MetadataCollection.js +0 -1
- package/lib/factories/MetadataCollection.js.map +1 -1
- package/lib/factories/MetadataCommentTagFactory.js +129 -118
- package/lib/factories/MetadataCommentTagFactory.js.map +1 -1
- package/lib/factories/MetadataFactory.d.ts +22 -2
- package/lib/factories/MetadataFactory.js +221 -17
- package/lib/factories/MetadataFactory.js.map +1 -1
- package/lib/factories/MetadataTypeTagFactory.d.ts +3 -2
- package/lib/factories/MetadataTypeTagFactory.js +246 -173
- package/lib/factories/MetadataTypeTagFactory.js.map +1 -1
- package/lib/factories/ProtobufFactory.js +73 -68
- package/lib/factories/ProtobufFactory.js.map +1 -1
- package/lib/factories/TypeFactory.d.ts +0 -1
- package/lib/factories/TypeFactory.js +0 -5
- package/lib/factories/TypeFactory.js.map +1 -1
- package/lib/factories/internal/metadata/emplace_metadata_alias.d.ts +1 -1
- package/lib/factories/internal/metadata/emplace_metadata_alias.js +20 -7
- package/lib/factories/internal/metadata/emplace_metadata_alias.js.map +1 -1
- package/lib/factories/internal/metadata/emplace_metadata_array_type.d.ts +1 -1
- package/lib/factories/internal/metadata/emplace_metadata_array_type.js +20 -7
- package/lib/factories/internal/metadata/emplace_metadata_array_type.js.map +1 -1
- package/lib/factories/internal/metadata/emplace_metadata_object.d.ts +1 -1
- package/lib/factories/internal/metadata/emplace_metadata_object.js +100 -84
- package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -1
- package/lib/factories/internal/metadata/emplace_metadata_tuple.d.ts +1 -1
- package/lib/factories/internal/metadata/emplace_metadata_tuple.js +34 -21
- package/lib/factories/internal/metadata/emplace_metadata_tuple.js.map +1 -1
- package/lib/factories/internal/metadata/explore_metadata.d.ts +1 -1
- package/lib/factories/internal/metadata/explore_metadata.js +12 -12
- package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
- package/lib/factories/internal/metadata/iterate_metadata.d.ts +1 -1
- package/lib/factories/internal/metadata/iterate_metadata.js +39 -19
- package/lib/factories/internal/metadata/iterate_metadata.js.map +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_alias.d.ts +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_alias.js +12 -10
- package/lib/factories/internal/metadata/iterate_metadata_alias.js.map +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_array.d.ts +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_array.js +11 -9
- package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_collection.d.ts +2 -1
- package/lib/factories/internal/metadata/iterate_metadata_collection.js +47 -45
- package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_comment_tags.d.ts +2 -1
- package/lib/factories/internal/metadata/iterate_metadata_comment_tags.js +16 -20
- package/lib/factories/internal/metadata/iterate_metadata_comment_tags.js.map +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_intersection.d.ts +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_intersection.js +145 -135
- package/lib/factories/internal/metadata/iterate_metadata_intersection.js.map +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_map.d.ts +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_map.js +28 -15
- package/lib/factories/internal/metadata/iterate_metadata_map.js.map +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_object.d.ts +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_object.js +16 -14
- package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_resolve.d.ts +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_resolve.js +28 -15
- package/lib/factories/internal/metadata/iterate_metadata_resolve.js.map +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_set.d.ts +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_set.js +24 -11
- package/lib/factories/internal/metadata/iterate_metadata_set.js.map +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_template.d.ts +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_template.js +28 -15
- package/lib/factories/internal/metadata/iterate_metadata_template.js.map +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_tuple.d.ts +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_tuple.js +11 -9
- package/lib/factories/internal/metadata/iterate_metadata_tuple.js.map +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_union.d.ts +1 -1
- package/lib/factories/internal/metadata/iterate_metadata_union.js +20 -7
- package/lib/factories/internal/metadata/iterate_metadata_union.js.map +1 -1
- package/lib/programmers/CheckerProgrammer.js +13 -8
- package/lib/programmers/CheckerProgrammer.js.map +1 -1
- package/lib/programmers/FeatureProgrammer.d.ts +1 -1
- package/lib/programmers/FeatureProgrammer.js +1 -1
- package/lib/programmers/FeatureProgrammer.js.map +1 -1
- package/lib/programmers/IsProgrammer.js +1 -1
- package/lib/programmers/IsProgrammer.js.map +1 -1
- package/lib/programmers/RandomProgrammer.js +9 -4
- package/lib/programmers/RandomProgrammer.js.map +1 -1
- package/lib/programmers/TypiaProgrammer.js +58 -28
- package/lib/programmers/TypiaProgrammer.js.map +1 -1
- package/lib/programmers/internal/application_escaped.d.ts +4 -0
- package/lib/programmers/internal/{application_resolved.js → application_escaped.js} +4 -4
- package/lib/programmers/internal/application_escaped.js.map +1 -0
- package/lib/programmers/internal/application_schema.js +5 -5
- package/lib/programmers/internal/application_schema.js.map +1 -1
- package/lib/programmers/json/JsonApplicationProgrammer.js +5 -1
- package/lib/programmers/json/JsonApplicationProgrammer.js.map +1 -1
- package/lib/programmers/json/JsonAssertParseProgrammer.js +2 -0
- package/lib/programmers/json/JsonAssertParseProgrammer.js.map +1 -1
- package/lib/programmers/json/JsonIsParseProgrammer.js +2 -0
- package/lib/programmers/json/JsonIsParseProgrammer.js.map +1 -1
- package/lib/programmers/json/JsonStringifyProgrammer.js +20 -62
- package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
- package/lib/programmers/json/JsonValidateParseProgrammer.js +2 -0
- package/lib/programmers/json/JsonValidateParseProgrammer.js.map +1 -1
- package/lib/programmers/misc/MiscCloneProgrammer.js +13 -8
- package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
- package/lib/programmers/misc/MiscLiteralsProgrammer.js +10 -5
- package/lib/programmers/misc/MiscLiteralsProgrammer.js.map +1 -1
- package/lib/programmers/misc/MiscPruneProgrammer.js +13 -8
- package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
- package/lib/schemas/metadata/Metadata.js +4 -4
- package/lib/schemas/metadata/Metadata.js.map +1 -1
- package/lib/transform.d.ts +2 -1
- package/lib/transform.js +11 -3
- package/lib/transform.js.map +1 -1
- package/lib/transformers/CallExpressionTransformer.d.ts +1 -1
- package/lib/transformers/CallExpressionTransformer.js +2 -1
- package/lib/transformers/CallExpressionTransformer.js.map +1 -1
- package/lib/transformers/FileTransformer.js +18 -8
- package/lib/transformers/FileTransformer.js.map +1 -1
- package/lib/transformers/IProject.d.ts +3 -0
- package/lib/transformers/NodeTransformer.d.ts +1 -1
- package/lib/transformers/TransformerError.d.ts +12 -0
- package/lib/transformers/TransformerError.js +66 -0
- package/lib/transformers/TransformerError.js.map +1 -0
- package/lib/transformers/features/AssertTransformer.d.ts +1 -0
- package/lib/transformers/features/CreateAssertTransformer.d.ts +1 -0
- package/lib/transformers/features/CreateIsTransformer.d.ts +1 -0
- package/lib/transformers/features/CreateRandomTransformer.js +9 -4
- package/lib/transformers/features/CreateRandomTransformer.js.map +1 -1
- package/lib/transformers/features/CreateValidateTransformer.d.ts +1 -0
- package/lib/transformers/features/IsTransformer.d.ts +1 -0
- package/lib/transformers/features/RandomTransformer.js +9 -4
- package/lib/transformers/features/RandomTransformer.js.map +1 -1
- package/lib/transformers/features/ValidateTransformer.d.ts +1 -0
- package/lib/transformers/features/json/JsonApplicationTransformer.js +79 -19
- package/lib/transformers/features/json/JsonApplicationTransformer.js.map +1 -1
- package/lib/transformers/features/json/JsonAssertParseTransformer.d.ts +1 -0
- package/lib/transformers/features/json/JsonAssertStringifyTransformer.d.ts +1 -0
- package/lib/transformers/features/json/JsonCreateAssertParseTransformer.d.ts +1 -0
- package/lib/transformers/features/json/JsonCreateAssertStringifyTransformer.d.ts +1 -0
- package/lib/transformers/features/json/JsonCreateIsParseTransformer.d.ts +1 -0
- package/lib/transformers/features/json/JsonCreateIsStringifyTransformer.d.ts +1 -0
- package/lib/transformers/features/json/JsonCreateStringifyTransformer.d.ts +1 -0
- package/lib/transformers/features/json/JsonCreateValidateParseTransformer.d.ts +1 -0
- package/lib/transformers/features/json/JsonCreateValidateStringifyProgrammer.d.ts +1 -0
- package/lib/transformers/features/json/JsonIsParseTransformer.d.ts +1 -0
- package/lib/transformers/features/json/JsonIsStringifyTransformer.d.ts +1 -0
- package/lib/transformers/features/json/JsonStringifyTransformer.d.ts +1 -0
- package/lib/transformers/features/json/JsonValidateParseTransformer.d.ts +1 -0
- package/lib/transformers/features/json/JsonValidateStringifyTransformer.d.ts +1 -0
- package/lib/transformers/features/misc/MetadataTransformer.js +13 -5
- package/lib/transformers/features/misc/MetadataTransformer.js.map +1 -1
- package/lib/transformers/features/misc/MiscAssertCloneTransformer.d.ts +1 -0
- package/lib/transformers/features/misc/MiscAssertPruneTransformer.d.ts +1 -0
- package/lib/transformers/features/misc/MiscCloneTransformer.d.ts +1 -0
- package/lib/transformers/features/misc/MiscCreateAssertCloneTransformer.d.ts +1 -0
- package/lib/transformers/features/misc/MiscCreateAssertPruneTransformer.d.ts +1 -0
- package/lib/transformers/features/misc/MiscCreateCloneTransformer.d.ts +1 -0
- package/lib/transformers/features/misc/MiscCreateIsCloneTransformer.d.ts +1 -0
- package/lib/transformers/features/misc/MiscCreateIsPruneTransformer.d.ts +1 -0
- package/lib/transformers/features/misc/MiscCreatePruneTransformer.d.ts +1 -0
- package/lib/transformers/features/misc/MiscCreateValidateCloneTransformer.d.ts +1 -0
- package/lib/transformers/features/misc/MiscCreateValidatePruneTransformer.d.ts +1 -0
- package/lib/transformers/features/misc/MiscIsCloneTransformer.d.ts +1 -0
- package/lib/transformers/features/misc/MiscIsPruneTransformer.d.ts +1 -0
- package/lib/transformers/features/misc/MiscLiteralsTransformer.js +9 -4
- package/lib/transformers/features/misc/MiscLiteralsTransformer.js.map +1 -1
- package/lib/transformers/features/misc/MiscPruneTransformer.d.ts +1 -0
- package/lib/transformers/features/misc/MiscValidateCloneTransformer.d.ts +1 -0
- package/lib/transformers/features/misc/MiscValidatePruneTransformer.d.ts +1 -0
- package/lib/transformers/features/protobuf/CreateProtobufAssertDecodeTransformer.d.ts +1 -0
- package/lib/transformers/features/protobuf/CreateProtobufAssertEncodeTransformer.d.ts +1 -0
- package/lib/transformers/features/protobuf/CreateProtobufDecodeTransformer.d.ts +1 -0
- package/lib/transformers/features/protobuf/CreateProtobufEncodeTransformer.d.ts +1 -0
- package/lib/transformers/features/protobuf/CreateProtobufIsDecodeTransformer.d.ts +1 -0
- package/lib/transformers/features/protobuf/CreateProtobufIsEncodeTransformer.d.ts +1 -0
- package/lib/transformers/features/protobuf/CreateProtobufValidateDecodeTransformer.d.ts +1 -0
- package/lib/transformers/features/protobuf/CreateProtobufValidateEncodeTransformer.d.ts +1 -0
- package/lib/transformers/features/protobuf/ProtobufAssertDecodeTransformer.d.ts +1 -0
- package/lib/transformers/features/protobuf/ProtobufAssertEncodeTransformer.d.ts +1 -0
- package/lib/transformers/features/protobuf/ProtobufDecodeTransformer.d.ts +1 -0
- package/lib/transformers/features/protobuf/ProtobufEncodeTransformer.d.ts +1 -0
- package/lib/transformers/features/protobuf/ProtobufIsDecodeTransformer.d.ts +1 -0
- package/lib/transformers/features/protobuf/ProtobufIsEncodeTransformer.d.ts +1 -0
- package/lib/transformers/features/protobuf/ProtobufMessageTransformer.js +9 -2
- package/lib/transformers/features/protobuf/ProtobufMessageTransformer.js.map +1 -1
- package/lib/transformers/features/protobuf/ProtobufValidateDecodeTransformer.d.ts +1 -0
- package/lib/transformers/features/protobuf/ProtobufValidateEncodeTransformer.d.ts +1 -0
- package/lib/transformers/internal/GenericTransformer.js +17 -4
- package/lib/transformers/internal/GenericTransformer.js.map +1 -1
- package/lib/typings/ValidationPipe.d.ts +7 -0
- package/lib/typings/ValidationPipe.js +3 -0
- package/lib/typings/ValidationPipe.js.map +1 -0
- package/package.json +3 -1
- package/src/executable/TypiaGenerateWizard.ts +1 -1
- package/src/executable/TypiaSetupWizard.ts +1 -1
- package/src/executable/setup/PackageManager.ts +1 -1
- package/src/executable/setup/PluginConfigurator.ts +2 -2
- package/src/factories/ExpressionFactory.ts +2 -2
- package/src/factories/JsonMetadataFactory.ts +43 -0
- package/src/factories/LiteralFactory.ts +2 -1
- package/src/factories/MetadataCollection.ts +0 -5
- package/src/factories/MetadataCommentTagFactory.ts +130 -84
- package/src/factories/MetadataFactory.ts +169 -7
- package/src/factories/MetadataTypeTagFactory.ts +191 -141
- package/src/factories/ProtobufFactory.ts +86 -93
- package/src/factories/TypeFactory.ts +0 -5
- package/src/factories/internal/metadata/emplace_metadata_alias.ts +12 -5
- package/src/factories/internal/metadata/emplace_metadata_array_type.ts +12 -5
- package/src/factories/internal/metadata/emplace_metadata_object.ts +20 -5
- package/src/factories/internal/metadata/emplace_metadata_tuple.ts +12 -2
- package/src/factories/internal/metadata/explore_metadata.ts +5 -11
- package/src/factories/internal/metadata/iterate_metadata.ts +44 -24
- package/src/factories/internal/metadata/iterate_metadata_alias.ts +7 -2
- package/src/factories/internal/metadata/iterate_metadata_array.ts +7 -2
- package/src/factories/internal/metadata/iterate_metadata_collection.ts +30 -29
- package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +21 -22
- package/src/factories/internal/metadata/iterate_metadata_intersection.ts +33 -17
- package/src/factories/internal/metadata/iterate_metadata_map.ts +20 -4
- package/src/factories/internal/metadata/iterate_metadata_object.ts +2 -1
- package/src/factories/internal/metadata/iterate_metadata_resolve.ts +15 -12
- package/src/factories/internal/metadata/iterate_metadata_set.ts +11 -2
- package/src/factories/internal/metadata/iterate_metadata_template.ts +12 -3
- package/src/factories/internal/metadata/iterate_metadata_tuple.ts +7 -2
- package/src/factories/internal/metadata/iterate_metadata_union.ts +10 -7
- package/src/programmers/CheckerProgrammer.ts +8 -2
- package/src/programmers/FeatureProgrammer.ts +4 -1
- package/src/programmers/IsProgrammer.ts +1 -1
- package/src/programmers/RandomProgrammer.ts +18 -17
- package/src/programmers/TypiaProgrammer.ts +27 -2
- package/src/programmers/internal/{application_resolved.ts → application_escaped.ts} +1 -1
- package/src/programmers/internal/application_schema.ts +5 -5
- package/src/programmers/json/JsonApplicationProgrammer.ts +6 -3
- package/src/programmers/json/JsonAssertParseProgrammer.ts +7 -2
- package/src/programmers/json/JsonIsParseProgrammer.ts +7 -2
- package/src/programmers/json/JsonStringifyProgrammer.ts +7 -37
- package/src/programmers/json/JsonValidateParseProgrammer.ts +7 -2
- package/src/programmers/json/JsonValidateStringifyProgrammer.ts +1 -1
- package/src/programmers/misc/MiscCloneProgrammer.ts +14 -11
- package/src/programmers/misc/MiscLiteralsProgrammer.ts +11 -6
- package/src/programmers/misc/MiscPruneProgrammer.ts +8 -2
- package/src/schemas/metadata/Metadata.ts +4 -4
- package/src/transform.ts +13 -5
- package/src/transformers/CallExpressionTransformer.ts +6 -3
- package/src/transformers/FileTransformer.ts +25 -13
- package/src/transformers/IProject.ts +3 -0
- package/src/transformers/NodeTransformer.ts +1 -1
- package/src/transformers/TransformerError.ts +55 -0
- package/src/transformers/features/CreateRandomTransformer.ts +11 -7
- package/src/transformers/features/RandomTransformer.ts +11 -7
- package/src/transformers/features/json/JsonApplicationTransformer.ts +39 -35
- package/src/transformers/features/misc/MetadataTransformer.ts +18 -10
- package/src/transformers/features/misc/MiscLiteralsTransformer.ts +11 -7
- package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +9 -7
- package/src/transformers/internal/GenericTransformer.ts +17 -10
- package/src/typings/ValidationPipe.ts +9 -0
- package/lib/programmers/internal/application_resolved.d.ts +0 -4
- package/lib/programmers/internal/application_resolved.js.map +0 -1
|
@@ -9,10 +9,10 @@ import { application_alias } from "./application_alias";
|
|
|
9
9
|
import { application_array } from "./application_array";
|
|
10
10
|
import { application_boolean } from "./application_boolean";
|
|
11
11
|
import { application_constant } from "./application_constant";
|
|
12
|
+
import { application_escaped } from "./application_escaped";
|
|
12
13
|
import { application_native } from "./application_native";
|
|
13
14
|
import { application_number } from "./application_number";
|
|
14
15
|
import { application_object } from "./application_object";
|
|
15
|
-
import { application_resolved } from "./application_resolved";
|
|
16
16
|
import { application_string } from "./application_string";
|
|
17
17
|
import { application_templates } from "./application_templates";
|
|
18
18
|
import { application_tuple } from "./application_tuple";
|
|
@@ -61,7 +61,7 @@ export const application_schema =
|
|
|
61
61
|
// toJSON() METHOD
|
|
62
62
|
if (meta.escaped !== null)
|
|
63
63
|
union.push(
|
|
64
|
-
...
|
|
64
|
+
...application_escaped(options)(blockNever)(components)(
|
|
65
65
|
meta.escaped,
|
|
66
66
|
)(attribute),
|
|
67
67
|
);
|
|
@@ -70,7 +70,7 @@ export const application_schema =
|
|
|
70
70
|
if (meta.templates.length && AtomicPredicator.template(meta))
|
|
71
71
|
insert(application_templates(meta)(attribute));
|
|
72
72
|
for (const constant of meta.constants)
|
|
73
|
-
if (constant.type === "bigint") throw new
|
|
73
|
+
if (constant.type === "bigint") throw new TypeError(NO_BIGINT);
|
|
74
74
|
else if (
|
|
75
75
|
(constant.type === "string" && meta.templates.length) ||
|
|
76
76
|
AtomicPredicator.constant(meta)(constant.type) === false
|
|
@@ -78,7 +78,7 @@ export const application_schema =
|
|
|
78
78
|
continue;
|
|
79
79
|
else insert(application_constant(constant)(attribute));
|
|
80
80
|
for (const a of meta.atomics)
|
|
81
|
-
if (a.type === "bigint") throw new
|
|
81
|
+
if (a.type === "bigint") throw new TypeError(NO_BIGINT);
|
|
82
82
|
else if (a.type === "boolean")
|
|
83
83
|
insert(application_boolean(attribute));
|
|
84
84
|
else if (a.type === "number")
|
|
@@ -103,7 +103,7 @@ export const application_schema =
|
|
|
103
103
|
if (AtomicPredicator.native(native)) {
|
|
104
104
|
const type: string = native.toLowerCase();
|
|
105
105
|
if (meta.atomics.some((a) => a.type === type)) continue;
|
|
106
|
-
else if (type === "bigint") throw new
|
|
106
|
+
else if (type === "bigint") throw new TypeError(NO_BIGINT);
|
|
107
107
|
else if (type === "boolean")
|
|
108
108
|
insert(application_boolean(attribute));
|
|
109
109
|
else if (type === "number")
|
|
@@ -3,6 +3,8 @@ import { IJsonComponents } from "../../schemas/json/IJsonComponents";
|
|
|
3
3
|
import { IJsonSchema } from "../../schemas/json/IJsonSchema";
|
|
4
4
|
import { Metadata } from "../../schemas/metadata/Metadata";
|
|
5
5
|
|
|
6
|
+
import { TransformerError } from "../../transformers/TransformerError";
|
|
7
|
+
|
|
6
8
|
import { application_schema } from "../internal/application_schema";
|
|
7
9
|
|
|
8
10
|
export namespace JsonApplicationProgrammer {
|
|
@@ -35,9 +37,10 @@ export namespace JsonApplicationProgrammer {
|
|
|
35
37
|
schemas: metadatas.map((meta, i) => {
|
|
36
38
|
const schema: IJsonSchema | null = generator(meta)({});
|
|
37
39
|
if (schema === null)
|
|
38
|
-
throw new
|
|
39
|
-
|
|
40
|
-
|
|
40
|
+
throw new TransformerError({
|
|
41
|
+
code: "typia.json.application",
|
|
42
|
+
message: `invalid type on argument - (${meta.getName()}, ${i})`,
|
|
43
|
+
});
|
|
41
44
|
return schema;
|
|
42
45
|
}),
|
|
43
46
|
components,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import ts from "typescript";
|
|
2
2
|
|
|
3
3
|
import { IdentifierFactory } from "../../factories/IdentifierFactory";
|
|
4
|
+
import { JsonMetadataFactory } from "../../factories/JsonMetadataFactory";
|
|
4
5
|
import { StatementFactory } from "../../factories/StatementFactory";
|
|
5
6
|
import { TypeFactory } from "../../factories/TypeFactory";
|
|
6
7
|
|
|
@@ -12,8 +13,11 @@ export namespace JsonAssertParseProgrammer {
|
|
|
12
13
|
export const write =
|
|
13
14
|
(project: IProject) =>
|
|
14
15
|
(modulo: ts.LeftHandSideExpression) =>
|
|
15
|
-
(type: ts.Type, name?: string) =>
|
|
16
|
-
|
|
16
|
+
(type: ts.Type, name?: string): ts.ArrowFunction => {
|
|
17
|
+
JsonMetadataFactory.analyze(`typia.json.${modulo.getText()}`)(
|
|
18
|
+
project.checker,
|
|
19
|
+
)(type);
|
|
20
|
+
return ts.factory.createArrowFunction(
|
|
17
21
|
undefined,
|
|
18
22
|
undefined,
|
|
19
23
|
[
|
|
@@ -63,4 +67,5 @@ export namespace JsonAssertParseProgrammer {
|
|
|
63
67
|
),
|
|
64
68
|
]),
|
|
65
69
|
);
|
|
70
|
+
};
|
|
66
71
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import ts from "typescript";
|
|
2
2
|
|
|
3
3
|
import { IdentifierFactory } from "../../factories/IdentifierFactory";
|
|
4
|
+
import { JsonMetadataFactory } from "../../factories/JsonMetadataFactory";
|
|
4
5
|
import { StatementFactory } from "../../factories/StatementFactory";
|
|
5
6
|
import { TypeFactory } from "../../factories/TypeFactory";
|
|
6
7
|
|
|
@@ -12,8 +13,11 @@ export namespace JsonIsParseProgrammer {
|
|
|
12
13
|
export const write =
|
|
13
14
|
(project: IProject) =>
|
|
14
15
|
(modulo: ts.LeftHandSideExpression) =>
|
|
15
|
-
(type: ts.Type, name?: string) =>
|
|
16
|
-
|
|
16
|
+
(type: ts.Type, name?: string): ts.ArrowFunction => {
|
|
17
|
+
JsonMetadataFactory.analyze(`typia.json.${modulo.getText()}`)(
|
|
18
|
+
project.checker,
|
|
19
|
+
)(type);
|
|
20
|
+
return ts.factory.createArrowFunction(
|
|
17
21
|
undefined,
|
|
18
22
|
undefined,
|
|
19
23
|
[
|
|
@@ -69,4 +73,5 @@ export namespace JsonIsParseProgrammer {
|
|
|
69
73
|
),
|
|
70
74
|
]),
|
|
71
75
|
);
|
|
76
|
+
};
|
|
72
77
|
}
|
|
@@ -2,8 +2,8 @@ import ts from "typescript";
|
|
|
2
2
|
|
|
3
3
|
import { ExpressionFactory } from "../../factories/ExpressionFactory";
|
|
4
4
|
import { IdentifierFactory } from "../../factories/IdentifierFactory";
|
|
5
|
+
import { JsonMetadataFactory } from "../../factories/JsonMetadataFactory";
|
|
5
6
|
import { MetadataCollection } from "../../factories/MetadataCollection";
|
|
6
|
-
import { MetadataFactory } from "../../factories/MetadataFactory";
|
|
7
7
|
import { StatementFactory } from "../../factories/StatementFactory";
|
|
8
8
|
import { TypeFactory } from "../../factories/TypeFactory";
|
|
9
9
|
import { ValueFactory } from "../../factories/ValueFactory";
|
|
@@ -315,12 +315,7 @@ export namespace JsonStringifyProgrammer {
|
|
|
315
315
|
});
|
|
316
316
|
|
|
317
317
|
// TUPLES
|
|
318
|
-
for (const tuple of meta.tuples)
|
|
319
|
-
for (const child of tuple.type.elements)
|
|
320
|
-
if (StringifyPredicator.undefindable(meta))
|
|
321
|
-
throw new Error(
|
|
322
|
-
`Error on typia.json.stringify(): tuple cannot contain undefined value - (${child.getName()}).`,
|
|
323
|
-
);
|
|
318
|
+
for (const tuple of meta.tuples)
|
|
324
319
|
unions.push({
|
|
325
320
|
type: "tuple",
|
|
326
321
|
is: () =>
|
|
@@ -340,15 +335,9 @@ export namespace JsonStringifyProgrammer {
|
|
|
340
335
|
explore,
|
|
341
336
|
),
|
|
342
337
|
});
|
|
343
|
-
}
|
|
344
338
|
|
|
345
339
|
// ARRAYS
|
|
346
340
|
if (meta.arrays.length) {
|
|
347
|
-
for (const child of meta.arrays)
|
|
348
|
-
if (StringifyPredicator.undefindable(child.type.value))
|
|
349
|
-
throw new Error(
|
|
350
|
-
`Error on typia.json.stringify(): array cannot contain undefined value (${child.type.value.getName()}).`,
|
|
351
|
-
);
|
|
352
341
|
const value: () => ts.Expression =
|
|
353
342
|
meta.arrays.length === 1
|
|
354
343
|
? () =>
|
|
@@ -935,25 +924,11 @@ export namespace JsonStringifyProgrammer {
|
|
|
935
924
|
|
|
936
925
|
const initializer: FeatureProgrammer.IConfig["initializer"] =
|
|
937
926
|
({ checker }) =>
|
|
938
|
-
(
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
absorb: true,
|
|
944
|
-
validate: (meta) => {
|
|
945
|
-
if (meta.atomics.find((a) => a.type === "bigint"))
|
|
946
|
-
throw new Error(NO_BIGINT);
|
|
947
|
-
else if (
|
|
948
|
-
meta.arrays.some(
|
|
949
|
-
(array) => array.type.value.isRequired() === false,
|
|
950
|
-
)
|
|
951
|
-
)
|
|
952
|
-
throw new Error(NO_UNDEFINED_IN_ARRAY);
|
|
953
|
-
},
|
|
954
|
-
})(collection)(type);
|
|
955
|
-
return [collection, meta];
|
|
956
|
-
};
|
|
927
|
+
(importer) =>
|
|
928
|
+
(type) =>
|
|
929
|
+
JsonMetadataFactory.analyze(`typia.json.${importer.method}`)(
|
|
930
|
+
checker,
|
|
931
|
+
)(type);
|
|
957
932
|
|
|
958
933
|
const create_throw_error =
|
|
959
934
|
(importer: FunctionImporter) =>
|
|
@@ -987,8 +962,3 @@ interface IUnion {
|
|
|
987
962
|
is: () => ts.Expression;
|
|
988
963
|
value: () => ts.Expression;
|
|
989
964
|
}
|
|
990
|
-
|
|
991
|
-
const NO_BIGINT =
|
|
992
|
-
"Error on typia.json.stringify(): does not allow bigint type.";
|
|
993
|
-
const NO_UNDEFINED_IN_ARRAY =
|
|
994
|
-
"Error on typia.json.stringify(): does not allow undefined type in array.";
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import ts from "typescript";
|
|
2
2
|
|
|
3
3
|
import { IdentifierFactory } from "../../factories/IdentifierFactory";
|
|
4
|
+
import { JsonMetadataFactory } from "../../factories/JsonMetadataFactory";
|
|
4
5
|
import { StatementFactory } from "../../factories/StatementFactory";
|
|
5
6
|
import { TypeFactory } from "../../factories/TypeFactory";
|
|
6
7
|
|
|
@@ -12,8 +13,11 @@ export namespace JsonValidateParseProgrammer {
|
|
|
12
13
|
export const write =
|
|
13
14
|
(project: IProject) =>
|
|
14
15
|
(modulo: ts.LeftHandSideExpression) =>
|
|
15
|
-
(type: ts.Type, name?: string) =>
|
|
16
|
-
|
|
16
|
+
(type: ts.Type, name?: string): ts.ArrowFunction => {
|
|
17
|
+
JsonMetadataFactory.analyze(`typia.json.${modulo.getText()}`)(
|
|
18
|
+
project.checker,
|
|
19
|
+
)(type);
|
|
20
|
+
return ts.factory.createArrowFunction(
|
|
17
21
|
undefined,
|
|
18
22
|
undefined,
|
|
19
23
|
[
|
|
@@ -60,4 +64,5 @@ export namespace JsonValidateParseProgrammer {
|
|
|
60
64
|
),
|
|
61
65
|
]),
|
|
62
66
|
);
|
|
67
|
+
};
|
|
63
68
|
}
|
|
@@ -13,7 +13,7 @@ export namespace JsonValidateStringifyProgrammer {
|
|
|
13
13
|
export const write =
|
|
14
14
|
(project: IProject) =>
|
|
15
15
|
(modulo: ts.LeftHandSideExpression) =>
|
|
16
|
-
(type: ts.Type, name?: string) =>
|
|
16
|
+
(type: ts.Type, name?: string): ts.ArrowFunction =>
|
|
17
17
|
ts.factory.createArrowFunction(
|
|
18
18
|
undefined,
|
|
19
19
|
undefined,
|
|
@@ -13,6 +13,7 @@ import { MetadataTuple } from "../../schemas/metadata/MetadataTuple";
|
|
|
13
13
|
import { MetadataTupleType } from "../../schemas/metadata/MetadataTupleType";
|
|
14
14
|
|
|
15
15
|
import { IProject } from "../../transformers/IProject";
|
|
16
|
+
import { TransformerError } from "../../transformers/TransformerError";
|
|
16
17
|
|
|
17
18
|
import { FeatureProgrammer } from "../FeatureProgrammer";
|
|
18
19
|
import { IsProgrammer } from "../IsProgrammer";
|
|
@@ -696,7 +697,7 @@ export namespace MiscCloneProgrammer {
|
|
|
696
697
|
prefix: PREFIX,
|
|
697
698
|
trace: false,
|
|
698
699
|
path: false,
|
|
699
|
-
initializer
|
|
700
|
+
initializer,
|
|
700
701
|
decoder: () => decode(project)(config)(importer),
|
|
701
702
|
objector: {
|
|
702
703
|
checker: () => IsProgrammer.decode(project)(importer),
|
|
@@ -720,27 +721,29 @@ export namespace MiscCloneProgrammer {
|
|
|
720
721
|
return config;
|
|
721
722
|
};
|
|
722
723
|
|
|
723
|
-
const initializer =
|
|
724
|
-
(method: string): FeatureProgrammer.IConfig["initializer"] =>
|
|
724
|
+
const initializer: FeatureProgrammer.IConfig["initializer"] =
|
|
725
725
|
({ checker }) =>
|
|
726
|
+
(importer) =>
|
|
726
727
|
(type) => {
|
|
727
728
|
const collection = new MetadataCollection();
|
|
728
|
-
const
|
|
729
|
+
const result = MetadataFactory.analyze(checker)({
|
|
729
730
|
escape: false,
|
|
730
731
|
constant: true,
|
|
731
732
|
absorb: true,
|
|
732
733
|
validate: (meta) => {
|
|
734
|
+
const output: string[] = [];
|
|
733
735
|
if (meta.natives.some((n) => n === "WeakSet"))
|
|
734
|
-
|
|
735
|
-
`Error on ${method}(): WeakSet is not supported.`,
|
|
736
|
-
);
|
|
736
|
+
output.push("unable to clone WeakSet");
|
|
737
737
|
else if (meta.natives.some((n) => n === "WeakMap"))
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
);
|
|
738
|
+
output.push("unable to clone WeakMap");
|
|
739
|
+
return output;
|
|
741
740
|
},
|
|
742
741
|
})(collection)(type);
|
|
743
|
-
|
|
742
|
+
if (result.success === false)
|
|
743
|
+
throw TransformerError.from(`typia.misc.${importer.method}`)(
|
|
744
|
+
result.errors,
|
|
745
|
+
);
|
|
746
|
+
return [collection, result.data];
|
|
744
747
|
};
|
|
745
748
|
|
|
746
749
|
const create_throw_error =
|
|
@@ -7,6 +7,7 @@ import { MetadataFactory } from "../../factories/MetadataFactory";
|
|
|
7
7
|
import { Metadata } from "../../schemas/metadata/Metadata";
|
|
8
8
|
|
|
9
9
|
import { IProject } from "../../transformers/IProject";
|
|
10
|
+
import { TransformerError } from "../../transformers/TransformerError";
|
|
10
11
|
|
|
11
12
|
import { Atomic } from "../../typings/Atomic";
|
|
12
13
|
|
|
@@ -14,7 +15,7 @@ import { ArrayUtil } from "../../utils/ArrayUtil";
|
|
|
14
15
|
|
|
15
16
|
export namespace MiscLiteralsProgrammer {
|
|
16
17
|
export const write = (project: IProject) => (type: ts.Type) => {
|
|
17
|
-
const
|
|
18
|
+
const result = MetadataFactory.analyze(project.checker)({
|
|
18
19
|
escape: true,
|
|
19
20
|
constant: true,
|
|
20
21
|
absorb: true,
|
|
@@ -24,11 +25,15 @@ export namespace MiscLiteralsProgrammer {
|
|
|
24
25
|
.map((c) => c.values.length)
|
|
25
26
|
.reduce((a, b) => a + b, 0) +
|
|
26
27
|
meta.atomics.filter((a) => a.type === "boolean").length;
|
|
27
|
-
if (0 === length)
|
|
28
|
-
else if (meta.size() !== length)
|
|
29
|
-
|
|
28
|
+
if (0 === length) return [ErrorMessages.NO];
|
|
29
|
+
else if (meta.size() !== length) return [ErrorMessages.ONLY];
|
|
30
|
+
return [];
|
|
30
31
|
},
|
|
31
32
|
})(new MetadataCollection())(type);
|
|
33
|
+
if (result.success === false)
|
|
34
|
+
throw TransformerError.from(`typia.misc.literals`)(result.errors);
|
|
35
|
+
|
|
36
|
+
const meta: Metadata = result.data;
|
|
32
37
|
const values: Set<Atomic.Type | null> = new Set([
|
|
33
38
|
...ArrayUtil.flat<Atomic.Type>(meta.constants.map((c) => c.values)),
|
|
34
39
|
...(meta.atomics.filter((a) => a.type === "boolean").length
|
|
@@ -59,6 +64,6 @@ export namespace MiscLiteralsProgrammer {
|
|
|
59
64
|
}
|
|
60
65
|
|
|
61
66
|
enum ErrorMessages {
|
|
62
|
-
NO = "
|
|
63
|
-
ONLY = "
|
|
67
|
+
NO = "no constant literal type found.",
|
|
68
|
+
ONLY = "only constant literal types are allowed.",
|
|
64
69
|
}
|
|
@@ -13,6 +13,7 @@ import { MetadataTuple } from "../../schemas/metadata/MetadataTuple";
|
|
|
13
13
|
import { MetadataTupleType } from "../../schemas/metadata/MetadataTupleType";
|
|
14
14
|
|
|
15
15
|
import { IProject } from "../../transformers/IProject";
|
|
16
|
+
import { TransformerError } from "../../transformers/TransformerError";
|
|
16
17
|
|
|
17
18
|
import { FeatureProgrammer } from "../FeatureProgrammer";
|
|
18
19
|
import { IsProgrammer } from "../IsProgrammer";
|
|
@@ -506,14 +507,19 @@ export namespace MiscPruneProgrammer {
|
|
|
506
507
|
|
|
507
508
|
const initializer: FeatureProgrammer.IConfig["initializer"] =
|
|
508
509
|
({ checker }) =>
|
|
510
|
+
(importer) =>
|
|
509
511
|
(type) => {
|
|
510
512
|
const collection = new MetadataCollection();
|
|
511
|
-
const
|
|
513
|
+
const result = MetadataFactory.analyze(checker)({
|
|
512
514
|
escape: false,
|
|
513
515
|
constant: true,
|
|
514
516
|
absorb: true,
|
|
515
517
|
})(collection)(type);
|
|
516
|
-
|
|
518
|
+
if (result.success === false)
|
|
519
|
+
throw TransformerError.from(`typia.misc.${importer.method}`)(
|
|
520
|
+
result.errors,
|
|
521
|
+
);
|
|
522
|
+
return [collection, result.data];
|
|
517
523
|
};
|
|
518
524
|
|
|
519
525
|
const create_throw_error =
|
|
@@ -236,7 +236,7 @@ export class Metadata {
|
|
|
236
236
|
arrays: meta.arrays.map((ref) => {
|
|
237
237
|
const type = dict.arrays.get(ref.name);
|
|
238
238
|
if (type === undefined)
|
|
239
|
-
throw new
|
|
239
|
+
throw new RangeError(
|
|
240
240
|
`Error on Metadata.from(): failed to find array "${ref.name}".`,
|
|
241
241
|
);
|
|
242
242
|
return MetadataArray.create({
|
|
@@ -247,7 +247,7 @@ export class Metadata {
|
|
|
247
247
|
tuples: meta.tuples.map((t) => {
|
|
248
248
|
const type = dict.tuples.get(t.name);
|
|
249
249
|
if (type === undefined)
|
|
250
|
-
throw new
|
|
250
|
+
throw new RangeError(
|
|
251
251
|
`Error on Metadata.from(): failed to find tuple "${t.name}".`,
|
|
252
252
|
);
|
|
253
253
|
return MetadataTuple.create({
|
|
@@ -258,7 +258,7 @@ export class Metadata {
|
|
|
258
258
|
objects: meta.objects.map((name) => {
|
|
259
259
|
const found = dict.objects.get(name);
|
|
260
260
|
if (found === undefined)
|
|
261
|
-
throw new
|
|
261
|
+
throw new RangeError(
|
|
262
262
|
`Error on Metadata.from(): failed to find object "${name}".`,
|
|
263
263
|
);
|
|
264
264
|
return found;
|
|
@@ -266,7 +266,7 @@ export class Metadata {
|
|
|
266
266
|
aliases: meta.aliases.map((alias) => {
|
|
267
267
|
const found = dict.aliases.get(alias);
|
|
268
268
|
if (found === undefined)
|
|
269
|
-
throw new
|
|
269
|
+
throw new RangeError(
|
|
270
270
|
`Error on Metadata.from(): failed to find alias "${alias}".`,
|
|
271
271
|
);
|
|
272
272
|
return found;
|
package/src/transform.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import ts from "typescript";
|
|
2
2
|
|
|
3
3
|
import { FileTransformer } from "./transformers/FileTransformer";
|
|
4
|
+
import { IProject } from "./transformers/IProject";
|
|
4
5
|
import { ITransformOptions } from "./transformers/ITransformOptions";
|
|
5
6
|
|
|
6
7
|
export const transform = (
|
|
7
8
|
program: ts.Program,
|
|
8
|
-
options
|
|
9
|
+
options: ITransformOptions | undefined,
|
|
10
|
+
extras: IProject["extras"],
|
|
9
11
|
): ts.TransformerFactory<ts.SourceFile> => {
|
|
10
12
|
const compilerOptions: ts.CompilerOptions = program.getCompilerOptions();
|
|
11
13
|
const strict: boolean =
|
|
@@ -13,15 +15,21 @@ export const transform = (
|
|
|
13
15
|
? !!compilerOptions.strictNullChecks
|
|
14
16
|
: !!compilerOptions.strict;
|
|
15
17
|
if (strict === false)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
extras.addDiagnostic({
|
|
19
|
+
category: ts.DiagnosticCategory.Error,
|
|
20
|
+
code: "(typia)" as any,
|
|
21
|
+
file: undefined,
|
|
22
|
+
start: undefined,
|
|
23
|
+
length: undefined,
|
|
24
|
+
messageText: "strict mode is required.",
|
|
25
|
+
});
|
|
19
26
|
return FileTransformer.transform({
|
|
20
27
|
program,
|
|
21
28
|
compilerOptions,
|
|
22
29
|
checker: program.getTypeChecker(),
|
|
23
30
|
printer: ts.createPrinter(),
|
|
24
|
-
options: options
|
|
31
|
+
options: options ?? {},
|
|
32
|
+
extras,
|
|
25
33
|
});
|
|
26
34
|
};
|
|
27
35
|
export default transform;
|
|
@@ -64,7 +64,7 @@ import { ProtobufValidateEncodeTransformer } from "./features/protobuf/ProtobufV
|
|
|
64
64
|
export namespace CallExpressionTransformer {
|
|
65
65
|
export const transform =
|
|
66
66
|
(project: IProject) =>
|
|
67
|
-
(expression: ts.CallExpression): ts.Expression => {
|
|
67
|
+
(expression: ts.CallExpression): ts.Expression | null => {
|
|
68
68
|
//----
|
|
69
69
|
// VALIDATIONS
|
|
70
70
|
//----
|
|
@@ -95,7 +95,10 @@ export namespace CallExpressionTransformer {
|
|
|
95
95
|
if (functor === undefined) return expression;
|
|
96
96
|
|
|
97
97
|
// RETURNS WITH TRANSFORMATION
|
|
98
|
-
|
|
98
|
+
const result: ts.Expression | null = functor()(project)(
|
|
99
|
+
expression.expression,
|
|
100
|
+
)(expression);
|
|
101
|
+
return result ?? expression;
|
|
99
102
|
};
|
|
100
103
|
|
|
101
104
|
const isTarget = (location: string): boolean => {
|
|
@@ -126,7 +129,7 @@ type Task = (
|
|
|
126
129
|
project: IProject,
|
|
127
130
|
) => (
|
|
128
131
|
modulo: ts.LeftHandSideExpression,
|
|
129
|
-
) => (expression: ts.CallExpression) => ts.Expression;
|
|
132
|
+
) => (expression: ts.CallExpression) => ts.Expression | null;
|
|
130
133
|
|
|
131
134
|
const FUNCTORS: Record<string, Record<string, () => Task>> = {
|
|
132
135
|
module: {
|
|
@@ -2,6 +2,7 @@ import ts from "typescript";
|
|
|
2
2
|
|
|
3
3
|
import { IProject } from "./IProject";
|
|
4
4
|
import { NodeTransformer } from "./NodeTransformer";
|
|
5
|
+
import { TransformerError } from "./TransformerError";
|
|
5
6
|
|
|
6
7
|
export namespace FileTransformer {
|
|
7
8
|
export const transform =
|
|
@@ -19,29 +20,40 @@ export namespace FileTransformer {
|
|
|
19
20
|
const iterate_node =
|
|
20
21
|
(project: IProject) =>
|
|
21
22
|
(context: ts.TransformationContext) =>
|
|
22
|
-
(node: ts.Node): ts.Node =>
|
|
23
|
-
ts.
|
|
24
|
-
|
|
23
|
+
(node: ts.Node): ts.Node => {
|
|
24
|
+
const changed: ts.Node | null = try_transform_node(project)(node);
|
|
25
|
+
return ts.visitEachChild(
|
|
26
|
+
changed ?? node,
|
|
25
27
|
(child) => iterate_node(project)(context)(child),
|
|
26
28
|
context,
|
|
27
29
|
);
|
|
30
|
+
};
|
|
28
31
|
|
|
29
32
|
const try_transform_node =
|
|
30
33
|
(project: IProject) =>
|
|
31
|
-
(node: ts.Node): ts.Node => {
|
|
34
|
+
(node: ts.Node): ts.Node | null => {
|
|
32
35
|
try {
|
|
33
36
|
return NodeTransformer.transform(project)(node);
|
|
34
37
|
} catch (exp) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const file: ts.SourceFile | undefined = node.getSourceFile();
|
|
38
|
-
if (file === undefined) throw exp;
|
|
38
|
+
// ONLY ACCEPT TRANSFORMER-ERROR
|
|
39
|
+
if (!isTransformerError(exp)) throw exp;
|
|
39
40
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
// REPORT DIAGNOSTIC
|
|
42
|
+
const diagnostic = ts.createDiagnosticForNode(node, {
|
|
43
|
+
key: exp.code,
|
|
44
|
+
category: ts.DiagnosticCategory.Error,
|
|
45
|
+
message: exp.message,
|
|
46
|
+
code: `(${exp.code})` as any,
|
|
47
|
+
});
|
|
48
|
+
project.extras.addDiagnostic(diagnostic);
|
|
49
|
+
return null;
|
|
45
50
|
}
|
|
46
51
|
};
|
|
47
52
|
}
|
|
53
|
+
|
|
54
|
+
const isTransformerError = (error: any): error is TransformerError =>
|
|
55
|
+
typeof error === "object" &&
|
|
56
|
+
error !== null &&
|
|
57
|
+
error.constructor.name === "TransformerError" &&
|
|
58
|
+
typeof error.code === "string" &&
|
|
59
|
+
typeof error.message === "string";
|
|
@@ -6,7 +6,7 @@ import { IProject } from "./IProject";
|
|
|
6
6
|
export namespace NodeTransformer {
|
|
7
7
|
export const transform =
|
|
8
8
|
(project: IProject) =>
|
|
9
|
-
(expression: ts.Node): ts.Node =>
|
|
9
|
+
(expression: ts.Node): ts.Node | null =>
|
|
10
10
|
ts.isCallExpression(expression)
|
|
11
11
|
? CallExpressionTransformer.transform(project)(expression)
|
|
12
12
|
: expression;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { MetadataFactory } from "../factories/MetadataFactory";
|
|
2
|
+
|
|
3
|
+
import { MetadataObject } from "../schemas/metadata/MetadataObject";
|
|
4
|
+
|
|
5
|
+
import { Escaper } from "../utils/Escaper";
|
|
6
|
+
|
|
7
|
+
export class TransformerError extends Error {
|
|
8
|
+
public readonly code: string;
|
|
9
|
+
|
|
10
|
+
public constructor(props: TransformerError.IProps) {
|
|
11
|
+
super(props.message);
|
|
12
|
+
this.code = props.code;
|
|
13
|
+
|
|
14
|
+
// INHERITANCE POLYFILL
|
|
15
|
+
const proto = new.target.prototype;
|
|
16
|
+
if (Object.setPrototypeOf) Object.setPrototypeOf(this, proto);
|
|
17
|
+
else (this as any).__proto__ = proto;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export namespace TransformerError {
|
|
21
|
+
export interface IProps {
|
|
22
|
+
code: string;
|
|
23
|
+
message: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const from =
|
|
27
|
+
(method: string) =>
|
|
28
|
+
(errors: MetadataFactory.IError[]): TransformerError => {
|
|
29
|
+
const body: string = errors
|
|
30
|
+
.map((e) => {
|
|
31
|
+
const subject: string =
|
|
32
|
+
e.explore.object === null
|
|
33
|
+
? ""
|
|
34
|
+
: join(e.explore.object)(e.explore.property);
|
|
35
|
+
const type: string = `${
|
|
36
|
+
subject.length ? `${subject}: ` : ""
|
|
37
|
+
}${e.name}`;
|
|
38
|
+
return `- ${type}\n${e.messages
|
|
39
|
+
.map((msg) => ` - ${msg}`)
|
|
40
|
+
.join("\n")}`;
|
|
41
|
+
})
|
|
42
|
+
.join("\n\n");
|
|
43
|
+
return new TransformerError({
|
|
44
|
+
code: method,
|
|
45
|
+
message: `unsupported type detected\n\n${body}`,
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const join = (object: MetadataObject) => (key: string | object | null) => {
|
|
50
|
+
if (key === null) return object.name;
|
|
51
|
+
else if (typeof key === "object") return `${object.name}[key]`;
|
|
52
|
+
else if (Escaper.variable(key)) return `${object.name}.${key}`;
|
|
53
|
+
return `${object.name}[${JSON.stringify(key)}]`;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
@@ -3,6 +3,7 @@ import ts from "typescript";
|
|
|
3
3
|
import { RandomProgrammer } from "../../programmers/RandomProgrammer";
|
|
4
4
|
|
|
5
5
|
import { IProject } from "../IProject";
|
|
6
|
+
import { TransformerError } from "../TransformerError";
|
|
6
7
|
|
|
7
8
|
export namespace CreateRandomTransformer {
|
|
8
9
|
export const transform =
|
|
@@ -10,13 +11,21 @@ export namespace CreateRandomTransformer {
|
|
|
10
11
|
(modulo: ts.LeftHandSideExpression) =>
|
|
11
12
|
(expression: ts.CallExpression): ts.Expression => {
|
|
12
13
|
// CHECK GENERIC ARGUMENT EXISTENCE
|
|
13
|
-
if (!expression.typeArguments?.[0])
|
|
14
|
+
if (!expression.typeArguments?.[0])
|
|
15
|
+
throw new TransformerError({
|
|
16
|
+
code: "typia.createRandom",
|
|
17
|
+
message: "generic argument is not specified.",
|
|
18
|
+
});
|
|
14
19
|
|
|
15
20
|
// GET TYPE INFO
|
|
16
21
|
const node: ts.TypeNode = expression.typeArguments[0];
|
|
17
22
|
const type: ts.Type = project.checker.getTypeFromTypeNode(node);
|
|
18
23
|
|
|
19
|
-
if (type.isTypeParameter())
|
|
24
|
+
if (type.isTypeParameter())
|
|
25
|
+
throw new TransformerError({
|
|
26
|
+
code: "typia.createRandom",
|
|
27
|
+
message: "non-specified generic argument.",
|
|
28
|
+
});
|
|
20
29
|
|
|
21
30
|
// DO TRANSFORM
|
|
22
31
|
return RandomProgrammer.write({
|
|
@@ -32,8 +41,3 @@ export namespace CreateRandomTransformer {
|
|
|
32
41
|
);
|
|
33
42
|
};
|
|
34
43
|
}
|
|
35
|
-
|
|
36
|
-
const NOT_SPECIFIED =
|
|
37
|
-
"Error on typia.createRandom(): generic argument is not specified.";
|
|
38
|
-
const NO_GENERIC_ARGUMENT =
|
|
39
|
-
"Error on typia.createRandom(): non-specified generic argument.";
|