@typia/transform 12.0.0-dev.20260309 → 12.0.0-dev.20260311
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/package.json +4 -4
- package/src/CallExpressionTransformer.ts +579 -579
- package/src/FileTransformer.ts +143 -143
- package/src/ITransformProps.ts +20 -20
- package/src/ImportTransformer.ts +262 -262
- package/src/NodeTransformer.ts +25 -25
- package/src/TransformerError.ts +85 -85
- package/src/TypiaGenerator.ts +172 -172
- package/src/features/AssertTransformer.ts +24 -24
- package/src/features/CreateAssertTransformer.ts +24 -24
- package/src/features/CreateIsTransformer.ts +18 -18
- package/src/features/CreateRandomTransformer.ts +42 -42
- package/src/features/CreateValidateTransformer.ts +18 -18
- package/src/features/IsTransformer.ts +18 -18
- package/src/features/RandomTransformer.ts +40 -40
- package/src/features/ValidateTransformer.ts +18 -18
- package/src/features/functional/FunctionalGenericTransformer.ts +55 -55
- package/src/features/http/CreateHttpAssertFormDataTransformer.ts +13 -13
- package/src/features/http/CreateHttpAssertHeadersTransformer.ts +13 -13
- package/src/features/http/CreateHttpAssertQueryTransformer.ts +13 -13
- package/src/features/http/CreateHttpFormDataTransformer.ts +13 -13
- package/src/features/http/CreateHttpHeadersTransformer.ts +13 -13
- package/src/features/http/CreateHttpIsFormDataTransformer.ts +13 -13
- package/src/features/http/CreateHttpIsHeadersTransformer.ts +13 -13
- package/src/features/http/CreateHttpIsQueryTransformer.ts +13 -13
- package/src/features/http/CreateHttpParameterTransformer.ts +13 -13
- package/src/features/http/CreateHttpQueryTransformer.ts +13 -13
- package/src/features/http/CreateHttpValidateFormDataTransformer.ts +13 -13
- package/src/features/http/CreateHttpValidateHeadersTransformer.ts +13 -13
- package/src/features/http/CreateHttpValidateQueryTransformer.ts +13 -13
- package/src/features/http/HttpAssertFormDataTransformer.ts +13 -13
- package/src/features/http/HttpAssertHeadersTransformer.ts +13 -13
- package/src/features/http/HttpAssertQueryTransformer.ts +13 -13
- package/src/features/http/HttpFormDataTransformer.ts +13 -13
- package/src/features/http/HttpHeadersTransformer.ts +13 -13
- package/src/features/http/HttpIsFormDataTransformer.ts +13 -13
- package/src/features/http/HttpIsHeadersTransformer.ts +13 -13
- package/src/features/http/HttpIsQueryTransformer.ts +13 -13
- package/src/features/http/HttpParameterTransformer.ts +13 -13
- package/src/features/http/HttpQueryTransformer.ts +13 -13
- package/src/features/http/HttpValidateFormDataTransformer.ts +13 -13
- package/src/features/http/HttpValidateHeadersTransformer.ts +13 -13
- package/src/features/http/HttpValidateQueryTransformer.ts +13 -13
- package/src/features/json/JsonApplicationTransformer.ts +99 -99
- package/src/features/json/JsonAssertParseTransformer.ts +13 -13
- package/src/features/json/JsonAssertStringifyTransformer.ts +13 -13
- package/src/features/json/JsonCreateAssertParseTransformer.ts +13 -13
- package/src/features/json/JsonCreateAssertStringifyTransformer.ts +13 -13
- package/src/features/json/JsonCreateIsParseTransformer.ts +13 -13
- package/src/features/json/JsonCreateIsStringifyTransformer.ts +13 -13
- package/src/features/json/JsonCreateStringifyTransformer.ts +13 -13
- package/src/features/json/JsonCreateValidateParseTransformer.ts +13 -13
- package/src/features/json/JsonCreateValidateStringifyProgrammer.ts +13 -13
- package/src/features/json/JsonIsParseTransformer.ts +13 -13
- package/src/features/json/JsonIsStringifyTransformer.ts +13 -13
- package/src/features/json/JsonSchemaTransformer.ts +120 -120
- package/src/features/json/JsonSchemasTransformer.ts +130 -130
- package/src/features/json/JsonStringifyTransformer.ts +13 -13
- package/src/features/json/JsonValidateParseTransformer.ts +13 -13
- package/src/features/json/JsonValidateStringifyTransformer.ts +13 -13
- package/src/features/llm/LlmApplicationTransformer.ts +224 -224
- package/src/features/llm/LlmCoerceTransformer.ts +95 -95
- package/src/features/llm/LlmControllerTransformer.ts +81 -81
- package/src/features/llm/LlmCreateCoerceTransformer.ts +84 -84
- package/src/features/llm/LlmCreateParseTransformer.ts +84 -84
- package/src/features/llm/LlmParametersTransformer.ts +76 -76
- package/src/features/llm/LlmParseTransformer.ts +95 -95
- package/src/features/llm/LlmSchemaTransformer.ts +87 -87
- package/src/features/misc/MiscAssertCloneTransformer.ts +13 -13
- package/src/features/misc/MiscAssertPruneTransformer.ts +13 -13
- package/src/features/misc/MiscCloneTransformer.ts +13 -13
- package/src/features/misc/MiscCreateAssertCloneTransformer.ts +13 -13
- package/src/features/misc/MiscCreateAssertPruneTransformer.ts +13 -13
- package/src/features/misc/MiscCreateCloneTransformer.ts +13 -13
- package/src/features/misc/MiscCreateIsCloneTransformer.ts +13 -13
- package/src/features/misc/MiscCreateIsPruneTransformer.ts +13 -13
- package/src/features/misc/MiscCreatePruneTransformer.ts +13 -13
- package/src/features/misc/MiscCreateValidateCloneTransformer.ts +13 -13
- package/src/features/misc/MiscCreateValidatePruneTransformer.ts +13 -13
- package/src/features/misc/MiscIsCloneTransformer.ts +13 -13
- package/src/features/misc/MiscIsPruneTransformer.ts +13 -13
- package/src/features/misc/MiscLiteralsTransformer.ts +34 -34
- package/src/features/misc/MiscPruneTransformer.ts +13 -13
- package/src/features/misc/MiscValidateCloneTransformer.ts +13 -13
- package/src/features/misc/MiscValidatePruneTransformer.ts +13 -13
- package/src/features/notations/NotationAssertGeneralTransformer.ts +19 -19
- package/src/features/notations/NotationCreateAssertGeneralTransformer.ts +19 -19
- package/src/features/notations/NotationCreateGeneralTransformer.ts +19 -19
- package/src/features/notations/NotationCreateIsGeneralTransformer.ts +19 -19
- package/src/features/notations/NotationCreateValidateGeneralTransformer.ts +19 -19
- package/src/features/notations/NotationGeneralTransformer.ts +18 -18
- package/src/features/notations/NotationIsGeneralTransformer.ts +19 -19
- package/src/features/notations/NotationValidateGeneralTransformer.ts +19 -19
- package/src/features/protobuf/ProtobufAssertDecodeTransformer.ts +13 -13
- package/src/features/protobuf/ProtobufAssertEncodeTransformer.ts +13 -13
- package/src/features/protobuf/ProtobufCreateAssertDecodeTransformer.ts +13 -13
- package/src/features/protobuf/ProtobufCreateAssertEncodeTransformer.ts +13 -13
- package/src/features/protobuf/ProtobufCreateDecodeTransformer.ts +13 -13
- package/src/features/protobuf/ProtobufCreateEncodeTransformer.ts +13 -13
- package/src/features/protobuf/ProtobufCreateIsDecodeTransformer.ts +13 -13
- package/src/features/protobuf/ProtobufCreateIsEncodeTransformer.ts +13 -13
- package/src/features/protobuf/ProtobufCreateValidateDecodeTransformer.ts +13 -13
- package/src/features/protobuf/ProtobufCreateValidateEncodeTransformer.ts +13 -13
- package/src/features/protobuf/ProtobufDecodeTransformer.ts +13 -13
- package/src/features/protobuf/ProtobufEncodeTransformer.ts +13 -13
- package/src/features/protobuf/ProtobufIsDecodeTransformer.ts +13 -13
- package/src/features/protobuf/ProtobufIsEncodeTransformer.ts +13 -13
- package/src/features/protobuf/ProtobufMessageTransformer.ts +34 -34
- package/src/features/protobuf/ProtobufValidateDecodeTransformer.ts +13 -13
- package/src/features/protobuf/ProtobufValidateEncodeTransformer.ts +13 -13
- package/src/features/reflect/ReflectMetadataTransformer.ts +69 -69
- package/src/features/reflect/ReflectNameTransformer.ts +81 -81
- package/src/features/reflect/ReflectSchemaTransformer.ts +65 -65
- package/src/features/reflect/ReflectSchemasTransformer.ts +69 -69
- package/src/index.ts +7 -7
- package/src/internal/GenericTransformer.ts +101 -101
- package/src/transform.ts +68 -68
|
@@ -1,120 +1,120 @@
|
|
|
1
|
-
import {
|
|
2
|
-
JsonSchemaProgrammer,
|
|
3
|
-
JsonSchemasProgrammer,
|
|
4
|
-
MetadataCollection,
|
|
5
|
-
MetadataFactory,
|
|
6
|
-
MetadataSchema,
|
|
7
|
-
} from "@typia/core";
|
|
8
|
-
import { ValidationPipe } from "@typia/interface";
|
|
9
|
-
import ts from "typescript";
|
|
10
|
-
|
|
11
|
-
import { ITransformProps } from "../../ITransformProps";
|
|
12
|
-
import { TransformerError } from "../../TransformerError";
|
|
13
|
-
|
|
14
|
-
export namespace JsonSchemaTransformer {
|
|
15
|
-
export const transform = (
|
|
16
|
-
props: Pick<ITransformProps, "context" | "expression">,
|
|
17
|
-
): ts.Expression => {
|
|
18
|
-
if (!props.expression.typeArguments?.length)
|
|
19
|
-
throw new TransformerError({
|
|
20
|
-
code: "typia.json.schema",
|
|
21
|
-
message: "no generic argument.",
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
//----
|
|
25
|
-
// GET ARGUMENTS
|
|
26
|
-
//----
|
|
27
|
-
// VALIDATE TUPLE ARGUMENTS
|
|
28
|
-
const top: ts.Node | undefined = props.expression.typeArguments[0];
|
|
29
|
-
if (top === undefined || ts.isTypeNode(top) === false)
|
|
30
|
-
return props.expression;
|
|
31
|
-
|
|
32
|
-
// GET TYPES
|
|
33
|
-
const type: ts.Type = props.context.checker.getTypeFromTypeNode(top);
|
|
34
|
-
if (type.isTypeParameter())
|
|
35
|
-
throw new TransformerError({
|
|
36
|
-
code: "typia.json.schema",
|
|
37
|
-
message: "non-specified generic argument.",
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
// ADDITIONAL PARAMETERS
|
|
41
|
-
const version: "3.0" | "3.1" = getParameter<"3.0" | "3.1">({
|
|
42
|
-
checker: props.context.checker,
|
|
43
|
-
name: "Version",
|
|
44
|
-
is: (str) => str === "3.0" || str === "3.1",
|
|
45
|
-
cast: (str) => str as "3.0" | "3.1",
|
|
46
|
-
default: () => "3.1",
|
|
47
|
-
})(props.expression.typeArguments[1]);
|
|
48
|
-
|
|
49
|
-
//----
|
|
50
|
-
// GENERATORS
|
|
51
|
-
//----
|
|
52
|
-
// METADATA
|
|
53
|
-
const analyze = (validate: boolean): MetadataSchema => {
|
|
54
|
-
const results: ValidationPipe<MetadataSchema, MetadataFactory.IError> =
|
|
55
|
-
MetadataFactory.analyze({
|
|
56
|
-
checker: props.context.checker,
|
|
57
|
-
transformer: props.context.transformer,
|
|
58
|
-
options: {
|
|
59
|
-
absorb: validate,
|
|
60
|
-
constant: true,
|
|
61
|
-
escape: true,
|
|
62
|
-
validate:
|
|
63
|
-
validate === true ? JsonSchemasProgrammer.validate : undefined,
|
|
64
|
-
},
|
|
65
|
-
components: new MetadataCollection({
|
|
66
|
-
replace: MetadataCollection.replace,
|
|
67
|
-
}),
|
|
68
|
-
type,
|
|
69
|
-
});
|
|
70
|
-
if (results.success === false)
|
|
71
|
-
throw TransformerError.from({
|
|
72
|
-
code: "typia.json.schema",
|
|
73
|
-
errors: results.errors,
|
|
74
|
-
});
|
|
75
|
-
return results.data;
|
|
76
|
-
};
|
|
77
|
-
analyze(true);
|
|
78
|
-
|
|
79
|
-
// APPLICATION
|
|
80
|
-
return JsonSchemaProgrammer.write({
|
|
81
|
-
context: props.context,
|
|
82
|
-
version,
|
|
83
|
-
metadata: analyze(false),
|
|
84
|
-
});
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
const getParameter =
|
|
88
|
-
<Value>(props: {
|
|
89
|
-
checker: ts.TypeChecker;
|
|
90
|
-
name: string;
|
|
91
|
-
is: (value: string) => boolean;
|
|
92
|
-
cast: (value: string) => Value;
|
|
93
|
-
default: () => Value;
|
|
94
|
-
}) =>
|
|
95
|
-
(node: ts.TypeNode | undefined): Value => {
|
|
96
|
-
if (!node) return props.default();
|
|
97
|
-
|
|
98
|
-
// CHECK LITERAL TYPE
|
|
99
|
-
const type: ts.Type = props.checker.getTypeFromTypeNode(node);
|
|
100
|
-
if (
|
|
101
|
-
!type.isLiteral() &&
|
|
102
|
-
(type.getFlags() & ts.TypeFlags.BooleanLiteral) === 0
|
|
103
|
-
)
|
|
104
|
-
throw new TransformerError({
|
|
105
|
-
code: "typia.json.schema",
|
|
106
|
-
message: `generic argument "${props.name}" must be constant.`,
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
// GET VALUE AND VALIDATE IT
|
|
110
|
-
const value = type.isLiteral()
|
|
111
|
-
? type.value
|
|
112
|
-
: props.checker.typeToString(type);
|
|
113
|
-
if (typeof value !== "string" || props.is(value) === false)
|
|
114
|
-
throw new TransformerError({
|
|
115
|
-
code: "typia.json.schema",
|
|
116
|
-
message: `invalid value on generic argument "${props.name}".`,
|
|
117
|
-
});
|
|
118
|
-
return props.cast(value);
|
|
119
|
-
};
|
|
120
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
JsonSchemaProgrammer,
|
|
3
|
+
JsonSchemasProgrammer,
|
|
4
|
+
MetadataCollection,
|
|
5
|
+
MetadataFactory,
|
|
6
|
+
MetadataSchema,
|
|
7
|
+
} from "@typia/core";
|
|
8
|
+
import { ValidationPipe } from "@typia/interface";
|
|
9
|
+
import ts from "typescript";
|
|
10
|
+
|
|
11
|
+
import { ITransformProps } from "../../ITransformProps";
|
|
12
|
+
import { TransformerError } from "../../TransformerError";
|
|
13
|
+
|
|
14
|
+
export namespace JsonSchemaTransformer {
|
|
15
|
+
export const transform = (
|
|
16
|
+
props: Pick<ITransformProps, "context" | "expression">,
|
|
17
|
+
): ts.Expression => {
|
|
18
|
+
if (!props.expression.typeArguments?.length)
|
|
19
|
+
throw new TransformerError({
|
|
20
|
+
code: "typia.json.schema",
|
|
21
|
+
message: "no generic argument.",
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
//----
|
|
25
|
+
// GET ARGUMENTS
|
|
26
|
+
//----
|
|
27
|
+
// VALIDATE TUPLE ARGUMENTS
|
|
28
|
+
const top: ts.Node | undefined = props.expression.typeArguments[0];
|
|
29
|
+
if (top === undefined || ts.isTypeNode(top) === false)
|
|
30
|
+
return props.expression;
|
|
31
|
+
|
|
32
|
+
// GET TYPES
|
|
33
|
+
const type: ts.Type = props.context.checker.getTypeFromTypeNode(top);
|
|
34
|
+
if (type.isTypeParameter())
|
|
35
|
+
throw new TransformerError({
|
|
36
|
+
code: "typia.json.schema",
|
|
37
|
+
message: "non-specified generic argument.",
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// ADDITIONAL PARAMETERS
|
|
41
|
+
const version: "3.0" | "3.1" = getParameter<"3.0" | "3.1">({
|
|
42
|
+
checker: props.context.checker,
|
|
43
|
+
name: "Version",
|
|
44
|
+
is: (str) => str === "3.0" || str === "3.1",
|
|
45
|
+
cast: (str) => str as "3.0" | "3.1",
|
|
46
|
+
default: () => "3.1",
|
|
47
|
+
})(props.expression.typeArguments[1]);
|
|
48
|
+
|
|
49
|
+
//----
|
|
50
|
+
// GENERATORS
|
|
51
|
+
//----
|
|
52
|
+
// METADATA
|
|
53
|
+
const analyze = (validate: boolean): MetadataSchema => {
|
|
54
|
+
const results: ValidationPipe<MetadataSchema, MetadataFactory.IError> =
|
|
55
|
+
MetadataFactory.analyze({
|
|
56
|
+
checker: props.context.checker,
|
|
57
|
+
transformer: props.context.transformer,
|
|
58
|
+
options: {
|
|
59
|
+
absorb: validate,
|
|
60
|
+
constant: true,
|
|
61
|
+
escape: true,
|
|
62
|
+
validate:
|
|
63
|
+
validate === true ? JsonSchemasProgrammer.validate : undefined,
|
|
64
|
+
},
|
|
65
|
+
components: new MetadataCollection({
|
|
66
|
+
replace: MetadataCollection.replace,
|
|
67
|
+
}),
|
|
68
|
+
type,
|
|
69
|
+
});
|
|
70
|
+
if (results.success === false)
|
|
71
|
+
throw TransformerError.from({
|
|
72
|
+
code: "typia.json.schema",
|
|
73
|
+
errors: results.errors,
|
|
74
|
+
});
|
|
75
|
+
return results.data;
|
|
76
|
+
};
|
|
77
|
+
analyze(true);
|
|
78
|
+
|
|
79
|
+
// APPLICATION
|
|
80
|
+
return JsonSchemaProgrammer.write({
|
|
81
|
+
context: props.context,
|
|
82
|
+
version,
|
|
83
|
+
metadata: analyze(false),
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const getParameter =
|
|
88
|
+
<Value>(props: {
|
|
89
|
+
checker: ts.TypeChecker;
|
|
90
|
+
name: string;
|
|
91
|
+
is: (value: string) => boolean;
|
|
92
|
+
cast: (value: string) => Value;
|
|
93
|
+
default: () => Value;
|
|
94
|
+
}) =>
|
|
95
|
+
(node: ts.TypeNode | undefined): Value => {
|
|
96
|
+
if (!node) return props.default();
|
|
97
|
+
|
|
98
|
+
// CHECK LITERAL TYPE
|
|
99
|
+
const type: ts.Type = props.checker.getTypeFromTypeNode(node);
|
|
100
|
+
if (
|
|
101
|
+
!type.isLiteral() &&
|
|
102
|
+
(type.getFlags() & ts.TypeFlags.BooleanLiteral) === 0
|
|
103
|
+
)
|
|
104
|
+
throw new TransformerError({
|
|
105
|
+
code: "typia.json.schema",
|
|
106
|
+
message: `generic argument "${props.name}" must be constant.`,
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
// GET VALUE AND VALIDATE IT
|
|
110
|
+
const value = type.isLiteral()
|
|
111
|
+
? type.value
|
|
112
|
+
: props.checker.typeToString(type);
|
|
113
|
+
if (typeof value !== "string" || props.is(value) === false)
|
|
114
|
+
throw new TransformerError({
|
|
115
|
+
code: "typia.json.schema",
|
|
116
|
+
message: `invalid value on generic argument "${props.name}".`,
|
|
117
|
+
});
|
|
118
|
+
return props.cast(value);
|
|
119
|
+
};
|
|
120
|
+
}
|
|
@@ -1,130 +1,130 @@
|
|
|
1
|
-
import {
|
|
2
|
-
JsonSchemasProgrammer,
|
|
3
|
-
MetadataCollection,
|
|
4
|
-
MetadataFactory,
|
|
5
|
-
MetadataSchema,
|
|
6
|
-
} from "@typia/core";
|
|
7
|
-
import { ValidationPipe } from "@typia/interface";
|
|
8
|
-
import ts from "typescript";
|
|
9
|
-
|
|
10
|
-
import { ITransformProps } from "../../ITransformProps";
|
|
11
|
-
import { TransformerError } from "../../TransformerError";
|
|
12
|
-
|
|
13
|
-
export namespace JsonSchemasTransformer {
|
|
14
|
-
export const transform = (
|
|
15
|
-
props: Pick<ITransformProps, "context" | "expression">,
|
|
16
|
-
): ts.Expression => {
|
|
17
|
-
if (!props.expression.typeArguments?.length)
|
|
18
|
-
throw new TransformerError({
|
|
19
|
-
code: "typia.json.schemas",
|
|
20
|
-
message: "no generic argument.",
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
//----
|
|
24
|
-
// GET ARGUMENTS
|
|
25
|
-
//----
|
|
26
|
-
// VALIDATE TUPLE ARGUMENTS
|
|
27
|
-
const top: ts.Node = props.expression.typeArguments[0]!;
|
|
28
|
-
if (!ts.isTupleTypeNode(top)) return props.expression;
|
|
29
|
-
else if (top.elements.some((child) => !ts.isTypeNode(child)))
|
|
30
|
-
return props.expression;
|
|
31
|
-
|
|
32
|
-
// GET TYPES
|
|
33
|
-
const types: ts.Type[] = top.elements.map((child) =>
|
|
34
|
-
props.context.checker.getTypeFromTypeNode(child as ts.TypeNode),
|
|
35
|
-
);
|
|
36
|
-
if (types.some((t) => t.isTypeParameter()))
|
|
37
|
-
throw new TransformerError({
|
|
38
|
-
code: "typia.json.schemas",
|
|
39
|
-
message: "non-specified generic argument(s).",
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
// ADDITIONAL PARAMETERS
|
|
43
|
-
const version: "3.0" | "3.1" = getParameter<"3.0" | "3.1">({
|
|
44
|
-
checker: props.context.checker,
|
|
45
|
-
name: "Version",
|
|
46
|
-
is: (str) => str === "3.0" || str === "3.1",
|
|
47
|
-
cast: (str) => str as "3.0" | "3.1",
|
|
48
|
-
default: () => "3.1",
|
|
49
|
-
})(props.expression.typeArguments[1]);
|
|
50
|
-
|
|
51
|
-
//----
|
|
52
|
-
// GENERATORS
|
|
53
|
-
//----
|
|
54
|
-
// METADATA
|
|
55
|
-
const analyze = (validate: boolean): MetadataSchema[] => {
|
|
56
|
-
const results: ValidationPipe<MetadataSchema, MetadataFactory.IError>[] =
|
|
57
|
-
types.map((type) =>
|
|
58
|
-
MetadataFactory.analyze({
|
|
59
|
-
checker: props.context.checker,
|
|
60
|
-
transformer: props.context.transformer,
|
|
61
|
-
options: {
|
|
62
|
-
absorb: validate,
|
|
63
|
-
constant: true,
|
|
64
|
-
escape: true,
|
|
65
|
-
validate:
|
|
66
|
-
validate === true ? JsonSchemasProgrammer.validate : undefined,
|
|
67
|
-
},
|
|
68
|
-
components: new MetadataCollection({
|
|
69
|
-
replace: MetadataCollection.replace,
|
|
70
|
-
}),
|
|
71
|
-
type,
|
|
72
|
-
}),
|
|
73
|
-
);
|
|
74
|
-
const metadatas: MetadataSchema[] = [];
|
|
75
|
-
const errors: MetadataFactory.IError[] = [];
|
|
76
|
-
for (const r of results) {
|
|
77
|
-
if (r.success === false) errors.push(...r.errors);
|
|
78
|
-
else metadatas.push(r.data);
|
|
79
|
-
}
|
|
80
|
-
if (errors.length)
|
|
81
|
-
throw TransformerError.from({
|
|
82
|
-
code: "typia.json.schemas",
|
|
83
|
-
errors,
|
|
84
|
-
});
|
|
85
|
-
return metadatas;
|
|
86
|
-
};
|
|
87
|
-
analyze(true);
|
|
88
|
-
|
|
89
|
-
// APPLICATION
|
|
90
|
-
return JsonSchemasProgrammer.write({
|
|
91
|
-
context: props.context,
|
|
92
|
-
version,
|
|
93
|
-
metadatas: analyze(false),
|
|
94
|
-
});
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
const getParameter =
|
|
98
|
-
<Value>(props: {
|
|
99
|
-
checker: ts.TypeChecker;
|
|
100
|
-
name: string;
|
|
101
|
-
is: (value: string) => boolean;
|
|
102
|
-
cast: (value: string) => Value;
|
|
103
|
-
default: () => Value;
|
|
104
|
-
}) =>
|
|
105
|
-
(node: ts.TypeNode | undefined): Value => {
|
|
106
|
-
if (!node) return props.default();
|
|
107
|
-
|
|
108
|
-
// CHECK LITERAL TYPE
|
|
109
|
-
const type: ts.Type = props.checker.getTypeFromTypeNode(node);
|
|
110
|
-
if (
|
|
111
|
-
!type.isLiteral() &&
|
|
112
|
-
(type.getFlags() & ts.TypeFlags.BooleanLiteral) === 0
|
|
113
|
-
)
|
|
114
|
-
throw new TransformerError({
|
|
115
|
-
code: "typia.json.schemas",
|
|
116
|
-
message: `generic argument "${props.name}" must be constant.`,
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
// GET VALUE AND VALIDATE IT
|
|
120
|
-
const value = type.isLiteral()
|
|
121
|
-
? type.value
|
|
122
|
-
: props.checker.typeToString(type);
|
|
123
|
-
if (typeof value !== "string" || props.is(value) === false)
|
|
124
|
-
throw new TransformerError({
|
|
125
|
-
code: "typia.json.schemas",
|
|
126
|
-
message: `invalid value on generic argument "${props.name}".`,
|
|
127
|
-
});
|
|
128
|
-
return props.cast(value);
|
|
129
|
-
};
|
|
130
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
JsonSchemasProgrammer,
|
|
3
|
+
MetadataCollection,
|
|
4
|
+
MetadataFactory,
|
|
5
|
+
MetadataSchema,
|
|
6
|
+
} from "@typia/core";
|
|
7
|
+
import { ValidationPipe } from "@typia/interface";
|
|
8
|
+
import ts from "typescript";
|
|
9
|
+
|
|
10
|
+
import { ITransformProps } from "../../ITransformProps";
|
|
11
|
+
import { TransformerError } from "../../TransformerError";
|
|
12
|
+
|
|
13
|
+
export namespace JsonSchemasTransformer {
|
|
14
|
+
export const transform = (
|
|
15
|
+
props: Pick<ITransformProps, "context" | "expression">,
|
|
16
|
+
): ts.Expression => {
|
|
17
|
+
if (!props.expression.typeArguments?.length)
|
|
18
|
+
throw new TransformerError({
|
|
19
|
+
code: "typia.json.schemas",
|
|
20
|
+
message: "no generic argument.",
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
//----
|
|
24
|
+
// GET ARGUMENTS
|
|
25
|
+
//----
|
|
26
|
+
// VALIDATE TUPLE ARGUMENTS
|
|
27
|
+
const top: ts.Node = props.expression.typeArguments[0]!;
|
|
28
|
+
if (!ts.isTupleTypeNode(top)) return props.expression;
|
|
29
|
+
else if (top.elements.some((child) => !ts.isTypeNode(child)))
|
|
30
|
+
return props.expression;
|
|
31
|
+
|
|
32
|
+
// GET TYPES
|
|
33
|
+
const types: ts.Type[] = top.elements.map((child) =>
|
|
34
|
+
props.context.checker.getTypeFromTypeNode(child as ts.TypeNode),
|
|
35
|
+
);
|
|
36
|
+
if (types.some((t) => t.isTypeParameter()))
|
|
37
|
+
throw new TransformerError({
|
|
38
|
+
code: "typia.json.schemas",
|
|
39
|
+
message: "non-specified generic argument(s).",
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// ADDITIONAL PARAMETERS
|
|
43
|
+
const version: "3.0" | "3.1" = getParameter<"3.0" | "3.1">({
|
|
44
|
+
checker: props.context.checker,
|
|
45
|
+
name: "Version",
|
|
46
|
+
is: (str) => str === "3.0" || str === "3.1",
|
|
47
|
+
cast: (str) => str as "3.0" | "3.1",
|
|
48
|
+
default: () => "3.1",
|
|
49
|
+
})(props.expression.typeArguments[1]);
|
|
50
|
+
|
|
51
|
+
//----
|
|
52
|
+
// GENERATORS
|
|
53
|
+
//----
|
|
54
|
+
// METADATA
|
|
55
|
+
const analyze = (validate: boolean): MetadataSchema[] => {
|
|
56
|
+
const results: ValidationPipe<MetadataSchema, MetadataFactory.IError>[] =
|
|
57
|
+
types.map((type) =>
|
|
58
|
+
MetadataFactory.analyze({
|
|
59
|
+
checker: props.context.checker,
|
|
60
|
+
transformer: props.context.transformer,
|
|
61
|
+
options: {
|
|
62
|
+
absorb: validate,
|
|
63
|
+
constant: true,
|
|
64
|
+
escape: true,
|
|
65
|
+
validate:
|
|
66
|
+
validate === true ? JsonSchemasProgrammer.validate : undefined,
|
|
67
|
+
},
|
|
68
|
+
components: new MetadataCollection({
|
|
69
|
+
replace: MetadataCollection.replace,
|
|
70
|
+
}),
|
|
71
|
+
type,
|
|
72
|
+
}),
|
|
73
|
+
);
|
|
74
|
+
const metadatas: MetadataSchema[] = [];
|
|
75
|
+
const errors: MetadataFactory.IError[] = [];
|
|
76
|
+
for (const r of results) {
|
|
77
|
+
if (r.success === false) errors.push(...r.errors);
|
|
78
|
+
else metadatas.push(r.data);
|
|
79
|
+
}
|
|
80
|
+
if (errors.length)
|
|
81
|
+
throw TransformerError.from({
|
|
82
|
+
code: "typia.json.schemas",
|
|
83
|
+
errors,
|
|
84
|
+
});
|
|
85
|
+
return metadatas;
|
|
86
|
+
};
|
|
87
|
+
analyze(true);
|
|
88
|
+
|
|
89
|
+
// APPLICATION
|
|
90
|
+
return JsonSchemasProgrammer.write({
|
|
91
|
+
context: props.context,
|
|
92
|
+
version,
|
|
93
|
+
metadatas: analyze(false),
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const getParameter =
|
|
98
|
+
<Value>(props: {
|
|
99
|
+
checker: ts.TypeChecker;
|
|
100
|
+
name: string;
|
|
101
|
+
is: (value: string) => boolean;
|
|
102
|
+
cast: (value: string) => Value;
|
|
103
|
+
default: () => Value;
|
|
104
|
+
}) =>
|
|
105
|
+
(node: ts.TypeNode | undefined): Value => {
|
|
106
|
+
if (!node) return props.default();
|
|
107
|
+
|
|
108
|
+
// CHECK LITERAL TYPE
|
|
109
|
+
const type: ts.Type = props.checker.getTypeFromTypeNode(node);
|
|
110
|
+
if (
|
|
111
|
+
!type.isLiteral() &&
|
|
112
|
+
(type.getFlags() & ts.TypeFlags.BooleanLiteral) === 0
|
|
113
|
+
)
|
|
114
|
+
throw new TransformerError({
|
|
115
|
+
code: "typia.json.schemas",
|
|
116
|
+
message: `generic argument "${props.name}" must be constant.`,
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
// GET VALUE AND VALIDATE IT
|
|
120
|
+
const value = type.isLiteral()
|
|
121
|
+
? type.value
|
|
122
|
+
: props.checker.typeToString(type);
|
|
123
|
+
if (typeof value !== "string" || props.is(value) === false)
|
|
124
|
+
throw new TransformerError({
|
|
125
|
+
code: "typia.json.schemas",
|
|
126
|
+
message: `invalid value on generic argument "${props.name}".`,
|
|
127
|
+
});
|
|
128
|
+
return props.cast(value);
|
|
129
|
+
};
|
|
130
|
+
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { JsonStringifyProgrammer } from "@typia/core";
|
|
2
|
-
|
|
3
|
-
import { ITransformProps } from "../../ITransformProps";
|
|
4
|
-
import { GenericTransformer } from "../../internal/GenericTransformer";
|
|
5
|
-
|
|
6
|
-
export namespace JsonStringifyTransformer {
|
|
7
|
-
export const transform = (props: ITransformProps) =>
|
|
8
|
-
GenericTransformer.scalar({
|
|
9
|
-
...props,
|
|
10
|
-
method: "json.stringify",
|
|
11
|
-
write: JsonStringifyProgrammer.write,
|
|
12
|
-
});
|
|
13
|
-
}
|
|
1
|
+
import { JsonStringifyProgrammer } from "@typia/core";
|
|
2
|
+
|
|
3
|
+
import { ITransformProps } from "../../ITransformProps";
|
|
4
|
+
import { GenericTransformer } from "../../internal/GenericTransformer";
|
|
5
|
+
|
|
6
|
+
export namespace JsonStringifyTransformer {
|
|
7
|
+
export const transform = (props: ITransformProps) =>
|
|
8
|
+
GenericTransformer.scalar({
|
|
9
|
+
...props,
|
|
10
|
+
method: "json.stringify",
|
|
11
|
+
write: JsonStringifyProgrammer.write,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { JsonValidateParseProgrammer } from "@typia/core";
|
|
2
|
-
|
|
3
|
-
import { ITransformProps } from "../../ITransformProps";
|
|
4
|
-
import { GenericTransformer } from "../../internal/GenericTransformer";
|
|
5
|
-
|
|
6
|
-
export namespace JsonValidateParseTransformer {
|
|
7
|
-
export const transform = (props: ITransformProps) =>
|
|
8
|
-
GenericTransformer.scalar({
|
|
9
|
-
...props,
|
|
10
|
-
method: "json.validateParse",
|
|
11
|
-
write: JsonValidateParseProgrammer.write,
|
|
12
|
-
});
|
|
13
|
-
}
|
|
1
|
+
import { JsonValidateParseProgrammer } from "@typia/core";
|
|
2
|
+
|
|
3
|
+
import { ITransformProps } from "../../ITransformProps";
|
|
4
|
+
import { GenericTransformer } from "../../internal/GenericTransformer";
|
|
5
|
+
|
|
6
|
+
export namespace JsonValidateParseTransformer {
|
|
7
|
+
export const transform = (props: ITransformProps) =>
|
|
8
|
+
GenericTransformer.scalar({
|
|
9
|
+
...props,
|
|
10
|
+
method: "json.validateParse",
|
|
11
|
+
write: JsonValidateParseProgrammer.write,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { JsonValidateStringifyProgrammer } from "@typia/core";
|
|
2
|
-
|
|
3
|
-
import { ITransformProps } from "../../ITransformProps";
|
|
4
|
-
import { GenericTransformer } from "../../internal/GenericTransformer";
|
|
5
|
-
|
|
6
|
-
export namespace JsonValidateStringifyTransformer {
|
|
7
|
-
export const transform = (props: ITransformProps) =>
|
|
8
|
-
GenericTransformer.scalar({
|
|
9
|
-
...props,
|
|
10
|
-
method: "json.validateStringify",
|
|
11
|
-
write: JsonValidateStringifyProgrammer.write,
|
|
12
|
-
});
|
|
13
|
-
}
|
|
1
|
+
import { JsonValidateStringifyProgrammer } from "@typia/core";
|
|
2
|
+
|
|
3
|
+
import { ITransformProps } from "../../ITransformProps";
|
|
4
|
+
import { GenericTransformer } from "../../internal/GenericTransformer";
|
|
5
|
+
|
|
6
|
+
export namespace JsonValidateStringifyTransformer {
|
|
7
|
+
export const transform = (props: ITransformProps) =>
|
|
8
|
+
GenericTransformer.scalar({
|
|
9
|
+
...props,
|
|
10
|
+
method: "json.validateStringify",
|
|
11
|
+
write: JsonValidateStringifyProgrammer.write,
|
|
12
|
+
});
|
|
13
|
+
}
|