@nestia/core 11.2.1 → 12.0.0-dev.20260521.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/MIGRATION.md +169 -0
  2. package/lib/adaptors/WebSocketAdaptor.js +7 -3
  3. package/lib/adaptors/WebSocketAdaptor.js.map +1 -1
  4. package/lib/decorators/DynamicModule.js.map +1 -1
  5. package/lib/decorators/EncryptedBody.js.map +1 -1
  6. package/lib/decorators/EncryptedController.js.map +1 -1
  7. package/lib/decorators/EncryptedModule.js.map +1 -1
  8. package/lib/decorators/EncryptedRoute.js.map +1 -1
  9. package/lib/decorators/HumanRoute.js.map +1 -1
  10. package/lib/decorators/NoTransformConfigurationError.js +5 -2
  11. package/lib/decorators/NoTransformConfigurationError.js.map +1 -1
  12. package/lib/decorators/PlainBody.js.map +1 -1
  13. package/lib/decorators/SwaggerCustomizer.js.map +1 -1
  14. package/lib/decorators/SwaggerExample.js.map +1 -1
  15. package/lib/decorators/TypedBody.js.map +1 -1
  16. package/lib/decorators/TypedException.js.map +1 -1
  17. package/lib/decorators/TypedFormData.js.map +1 -1
  18. package/lib/decorators/TypedHeaders.js.map +1 -1
  19. package/lib/decorators/TypedParam.js +5 -2
  20. package/lib/decorators/TypedParam.js.map +1 -1
  21. package/lib/decorators/TypedQuery.js.map +1 -1
  22. package/lib/decorators/TypedRoute.js.map +1 -1
  23. package/lib/decorators/WebSocketRoute.js.map +1 -1
  24. package/lib/decorators/doNotThrowTransformError.js.map +1 -1
  25. package/lib/decorators/internal/get_path_and_querify.js +5 -2
  26. package/lib/decorators/internal/get_path_and_querify.js.map +1 -1
  27. package/lib/decorators/internal/get_path_and_stringify.js +5 -2
  28. package/lib/decorators/internal/get_path_and_stringify.js.map +1 -1
  29. package/lib/decorators/internal/get_text_body.js.map +1 -1
  30. package/lib/decorators/internal/headers_to_object.js.map +1 -1
  31. package/lib/decorators/internal/is_request_body_undefined.js.map +1 -1
  32. package/lib/decorators/internal/load_controller.js +48 -16
  33. package/lib/decorators/internal/load_controller.js.map +1 -1
  34. package/lib/decorators/internal/route_error.js +3 -3
  35. package/lib/decorators/internal/route_error.js.map +1 -1
  36. package/lib/decorators/internal/validate_request_body.js +5 -2
  37. package/lib/decorators/internal/validate_request_body.js.map +1 -1
  38. package/lib/decorators/internal/validate_request_form_data.js +5 -2
  39. package/lib/decorators/internal/validate_request_form_data.js.map +1 -1
  40. package/lib/decorators/internal/validate_request_headers.js +5 -2
  41. package/lib/decorators/internal/validate_request_headers.js.map +1 -1
  42. package/lib/decorators/internal/validate_request_query.js +30 -4
  43. package/lib/decorators/internal/validate_request_query.js.map +1 -1
  44. package/lib/index.js.map +1 -1
  45. package/lib/transform.d.ts +10 -5
  46. package/lib/transform.js +64 -28
  47. package/lib/transform.js.map +1 -1
  48. package/lib/utils/ArrayUtil.js.map +1 -1
  49. package/lib/utils/ExceptionManager.js.map +1 -1
  50. package/lib/utils/Singleton.js.map +1 -1
  51. package/lib/utils/SourceFinder.js.map +1 -1
  52. package/lib/utils/VersioningStrategy.js.map +1 -1
  53. package/native/cmd/ttsc-nestia/main.go +11 -0
  54. package/native/go.mod +32 -0
  55. package/native/go.sum +54 -0
  56. package/native/plugin/plan.go +102 -0
  57. package/native/transform/ast.go +32 -0
  58. package/native/transform/build.go +413 -0
  59. package/native/transform/cleanup.go +408 -0
  60. package/native/transform/cleanup_test.go +76 -0
  61. package/native/transform/commonjs_import_alias_test.go +49 -0
  62. package/native/transform/core_dispatch_test.go +127 -0
  63. package/native/transform/core_querify.go +227 -0
  64. package/native/transform/core_transform.go +1713 -0
  65. package/native/transform/core_websocket.go +115 -0
  66. package/native/transform/exports.go +13 -0
  67. package/native/transform/path_rewrite.go +285 -0
  68. package/native/transform/path_rewrite_test.go +243 -0
  69. package/native/transform/printer.go +244 -0
  70. package/native/transform/rewrite.go +662 -0
  71. package/native/transform/rewrite_test.go +118 -0
  72. package/native/transform/rewrite_unique_base_test.go +48 -0
  73. package/native/transform/run.go +72 -0
  74. package/native/transform/transform.go +376 -0
  75. package/native/transform/typia_fast.go +326 -0
  76. package/native/transform/typia_replacement.go +24 -0
  77. package/native/transform.cjs +43 -0
  78. package/package.json +28 -22
  79. package/src/decorators/NoTransformConfigurationError.ts +5 -2
  80. package/src/decorators/internal/load_controller.ts +50 -19
  81. package/src/decorators/internal/validate_request_query.ts +21 -2
  82. package/src/transform.ts +101 -35
  83. package/lib/decorators/internal/NoTransformConfigureError.d.ts +0 -1
  84. package/lib/decorators/internal/NoTransformConfigureError.js +0 -7
  85. package/lib/decorators/internal/NoTransformConfigureError.js.map +0 -1
  86. package/lib/options/INestiaTransformOptions.d.ts +0 -13
  87. package/lib/options/INestiaTransformOptions.js +0 -3
  88. package/lib/options/INestiaTransformOptions.js.map +0 -1
  89. package/lib/options/INestiaTransformProject.d.ts +0 -5
  90. package/lib/options/INestiaTransformProject.js +0 -3
  91. package/lib/options/INestiaTransformProject.js.map +0 -1
  92. package/lib/programmers/PlainBodyProgrammer.d.ts +0 -9
  93. package/lib/programmers/PlainBodyProgrammer.js +0 -58
  94. package/lib/programmers/PlainBodyProgrammer.js.map +0 -1
  95. package/lib/programmers/TypedBodyProgrammer.d.ts +0 -9
  96. package/lib/programmers/TypedBodyProgrammer.js +0 -94
  97. package/lib/programmers/TypedBodyProgrammer.js.map +0 -1
  98. package/lib/programmers/TypedFormDataBodyProgrammer.d.ts +0 -9
  99. package/lib/programmers/TypedFormDataBodyProgrammer.js +0 -65
  100. package/lib/programmers/TypedFormDataBodyProgrammer.js.map +0 -1
  101. package/lib/programmers/TypedHeadersProgrammer.d.ts +0 -9
  102. package/lib/programmers/TypedHeadersProgrammer.js +0 -38
  103. package/lib/programmers/TypedHeadersProgrammer.js.map +0 -1
  104. package/lib/programmers/TypedParamProgrammer.d.ts +0 -10
  105. package/lib/programmers/TypedParamProgrammer.js +0 -32
  106. package/lib/programmers/TypedParamProgrammer.js.map +0 -1
  107. package/lib/programmers/TypedQueryBodyProgrammer.d.ts +0 -9
  108. package/lib/programmers/TypedQueryBodyProgrammer.js +0 -74
  109. package/lib/programmers/TypedQueryBodyProgrammer.js.map +0 -1
  110. package/lib/programmers/TypedQueryProgrammer.d.ts +0 -9
  111. package/lib/programmers/TypedQueryProgrammer.js +0 -75
  112. package/lib/programmers/TypedQueryProgrammer.js.map +0 -1
  113. package/lib/programmers/TypedQueryRouteProgrammer.d.ts +0 -9
  114. package/lib/programmers/TypedQueryRouteProgrammer.js +0 -75
  115. package/lib/programmers/TypedQueryRouteProgrammer.js.map +0 -1
  116. package/lib/programmers/TypedRouteProgrammer.d.ts +0 -9
  117. package/lib/programmers/TypedRouteProgrammer.js +0 -79
  118. package/lib/programmers/TypedRouteProgrammer.js.map +0 -1
  119. package/lib/programmers/http/HttpAssertQuerifyProgrammer.d.ts +0 -9
  120. package/lib/programmers/http/HttpAssertQuerifyProgrammer.js +0 -39
  121. package/lib/programmers/http/HttpAssertQuerifyProgrammer.js.map +0 -1
  122. package/lib/programmers/http/HttpIsQuerifyProgrammer.d.ts +0 -9
  123. package/lib/programmers/http/HttpIsQuerifyProgrammer.js +0 -36
  124. package/lib/programmers/http/HttpIsQuerifyProgrammer.js.map +0 -1
  125. package/lib/programmers/http/HttpQuerifyProgrammer.d.ts +0 -9
  126. package/lib/programmers/http/HttpQuerifyProgrammer.js +0 -50
  127. package/lib/programmers/http/HttpQuerifyProgrammer.js.map +0 -1
  128. package/lib/programmers/http/HttpValidateQuerifyProgrammer.d.ts +0 -9
  129. package/lib/programmers/http/HttpValidateQuerifyProgrammer.js +0 -40
  130. package/lib/programmers/http/HttpValidateQuerifyProgrammer.js.map +0 -1
  131. package/lib/programmers/internal/CoreMetadataUtil.d.ts +0 -5
  132. package/lib/programmers/internal/CoreMetadataUtil.js +0 -19
  133. package/lib/programmers/internal/CoreMetadataUtil.js.map +0 -1
  134. package/lib/transformers/FileTransformer.d.ts +0 -5
  135. package/lib/transformers/FileTransformer.js +0 -80
  136. package/lib/transformers/FileTransformer.js.map +0 -1
  137. package/lib/transformers/MethodTransformer.d.ts +0 -8
  138. package/lib/transformers/MethodTransformer.js +0 -58
  139. package/lib/transformers/MethodTransformer.js.map +0 -1
  140. package/lib/transformers/NodeTransformer.d.ts +0 -8
  141. package/lib/transformers/NodeTransformer.js +0 -24
  142. package/lib/transformers/NodeTransformer.js.map +0 -1
  143. package/lib/transformers/ParameterDecoratorTransformer.d.ts +0 -9
  144. package/lib/transformers/ParameterDecoratorTransformer.js +0 -104
  145. package/lib/transformers/ParameterDecoratorTransformer.js.map +0 -1
  146. package/lib/transformers/ParameterTransformer.d.ts +0 -8
  147. package/lib/transformers/ParameterTransformer.js +0 -37
  148. package/lib/transformers/ParameterTransformer.js.map +0 -1
  149. package/lib/transformers/TypedRouteTransformer.d.ts +0 -9
  150. package/lib/transformers/TypedRouteTransformer.js +0 -68
  151. package/lib/transformers/TypedRouteTransformer.js.map +0 -1
  152. package/lib/transformers/WebSocketRouteTransformer.d.ts +0 -9
  153. package/lib/transformers/WebSocketRouteTransformer.js +0 -72
  154. package/lib/transformers/WebSocketRouteTransformer.js.map +0 -1
  155. package/src/decorators/internal/NoTransformConfigureError.ts +0 -2
  156. package/src/options/INestiaTransformOptions.ts +0 -34
  157. package/src/options/INestiaTransformProject.ts +0 -10
  158. package/src/programmers/PlainBodyProgrammer.ts +0 -72
  159. package/src/programmers/TypedBodyProgrammer.ts +0 -148
  160. package/src/programmers/TypedFormDataBodyProgrammer.ts +0 -118
  161. package/src/programmers/TypedHeadersProgrammer.ts +0 -65
  162. package/src/programmers/TypedParamProgrammer.ts +0 -33
  163. package/src/programmers/TypedQueryBodyProgrammer.ts +0 -113
  164. package/src/programmers/TypedQueryProgrammer.ts +0 -115
  165. package/src/programmers/TypedQueryRouteProgrammer.ts +0 -107
  166. package/src/programmers/TypedRouteProgrammer.ts +0 -103
  167. package/src/programmers/http/HttpAssertQuerifyProgrammer.ts +0 -74
  168. package/src/programmers/http/HttpIsQuerifyProgrammer.ts +0 -77
  169. package/src/programmers/http/HttpQuerifyProgrammer.ts +0 -110
  170. package/src/programmers/http/HttpValidateQuerifyProgrammer.ts +0 -78
  171. package/src/programmers/internal/CoreMetadataUtil.ts +0 -21
  172. package/src/transformers/FileTransformer.ts +0 -109
  173. package/src/transformers/MethodTransformer.ts +0 -103
  174. package/src/transformers/NodeTransformer.ts +0 -23
  175. package/src/transformers/ParameterDecoratorTransformer.ts +0 -143
  176. package/src/transformers/ParameterTransformer.ts +0 -57
  177. package/src/transformers/TypedRouteTransformer.ts +0 -85
  178. package/src/transformers/WebSocketRouteTransformer.ts +0 -120
@@ -1,107 +0,0 @@
1
- import {
2
- HttpQueryProgrammer,
3
- ITypiaContext,
4
- LlmParametersProgrammer,
5
- MetadataCollection,
6
- MetadataFactory,
7
- MetadataSchema,
8
- TransformerError,
9
- } from "@typia/core";
10
- import { ValidationPipe } from "@typia/interface";
11
- import ts from "typescript";
12
-
13
- import { INestiaTransformOptions } from "../options/INestiaTransformOptions";
14
- import { INestiaTransformContext } from "../options/INestiaTransformProject";
15
- import { HttpAssertQuerifyProgrammer } from "./http/HttpAssertQuerifyProgrammer";
16
- import { HttpIsQuerifyProgrammer } from "./http/HttpIsQuerifyProgrammer";
17
- import { HttpQuerifyProgrammer } from "./http/HttpQuerifyProgrammer";
18
- import { HttpValidateQuerifyProgrammer } from "./http/HttpValidateQuerifyProgrammer";
19
-
20
- export namespace TypedQueryRouteProgrammer {
21
- export const generate = (props: {
22
- context: INestiaTransformContext;
23
- modulo: ts.LeftHandSideExpression;
24
- type: ts.Type;
25
- }): ts.Expression => {
26
- // VALIDATE TYPE
27
- if (props.context.options.llm) {
28
- const llm: INestiaTransformOptions.ILlm | true =
29
- props.context.options.llm;
30
- const result: ValidationPipe<MetadataSchema, MetadataFactory.IError> =
31
- MetadataFactory.analyze({
32
- checker: props.context.checker,
33
- transformer: props.context.transformer,
34
- options: {
35
- escape: false,
36
- constant: true,
37
- absorb: true,
38
- validate: (next) => {
39
- const errors: string[] = HttpQueryProgrammer.validate({
40
- metadata: next.metadata,
41
- explore: next.explore,
42
- allowOptional: true,
43
- });
44
- if (next.metadata.size() !== 0)
45
- errors.push(
46
- ...LlmParametersProgrammer.validate({
47
- config: {
48
- strict: llm === true ? false : (llm.strict ?? false),
49
- },
50
- metadata: next.metadata,
51
- explore: next.explore,
52
- }),
53
- );
54
- return errors;
55
- },
56
- },
57
- components: new MetadataCollection(),
58
- type: props.type,
59
- });
60
- if (result.success === false)
61
- throw TransformerError.from({
62
- code: props.modulo.getText(),
63
- errors: result.errors,
64
- });
65
- }
66
-
67
- // GENERATE STRINGIFY PLAN
68
- const parameter = (
69
- key: string,
70
- programmer: (next: {
71
- context: ITypiaContext;
72
- modulo: ts.LeftHandSideExpression;
73
- type: ts.Type;
74
- }) => ts.ArrowFunction,
75
- ) =>
76
- ts.factory.createObjectLiteralExpression([
77
- ts.factory.createPropertyAssignment(
78
- ts.factory.createIdentifier("type"),
79
- ts.factory.createStringLiteral(key),
80
- ),
81
- ts.factory.createPropertyAssignment(
82
- ts.factory.createIdentifier(key),
83
- programmer({
84
- context: {
85
- ...props.context,
86
- options: {}, // use default option
87
- },
88
- modulo: props.modulo,
89
- type: props.type,
90
- }),
91
- ),
92
- ]);
93
-
94
- // RETURNS
95
- if (props.context.options.stringify === "is")
96
- return parameter("is", HttpIsQuerifyProgrammer.write);
97
- else if (props.context.options.stringify === "validate")
98
- return parameter("validate", HttpValidateQuerifyProgrammer.write);
99
- else if (props.context.options.stringify === "stringify")
100
- return parameter("stringify", HttpQuerifyProgrammer.write);
101
- else if (props.context.options.stringify === null)
102
- return ts.factory.createNull();
103
-
104
- // ASSERT IS DEFAULT
105
- return parameter("assert", HttpAssertQuerifyProgrammer.write);
106
- };
107
- }
@@ -1,103 +0,0 @@
1
- import {
2
- IProgrammerProps,
3
- JsonAssertStringifyProgrammer,
4
- JsonIsStringifyProgrammer,
5
- JsonMetadataFactory,
6
- JsonStringifyProgrammer,
7
- JsonValidateStringifyProgrammer,
8
- LlmParametersProgrammer,
9
- } from "@typia/core";
10
- import ts from "typescript";
11
-
12
- import { INestiaTransformOptions } from "../options/INestiaTransformOptions";
13
- import { INestiaTransformContext } from "../options/INestiaTransformProject";
14
-
15
- export namespace TypedRouteProgrammer {
16
- export const generate = (props: {
17
- context: INestiaTransformContext;
18
- modulo: ts.LeftHandSideExpression;
19
- type: ts.Type;
20
- }): ts.Expression => {
21
- // VALIDATE TYPE
22
- if (props.context.options.llm) {
23
- const llm: INestiaTransformOptions.ILlm | true =
24
- props.context.options.llm;
25
- JsonMetadataFactory.analyze({
26
- method: "@nestia.core.TypedRoute",
27
- checker: props.context.checker,
28
- transformer: props.context.transformer,
29
- type: props.type,
30
- validate: (next) => {
31
- if (next.metadata.size() === 0) return [];
32
- return LlmParametersProgrammer.validate({
33
- config: {
34
- strict: llm === true ? false : (llm.strict ?? false),
35
- },
36
- metadata: next.metadata,
37
- explore: next.explore,
38
- });
39
- },
40
- });
41
- }
42
-
43
- // GENERATE STRINGIFY PLAN
44
- const parameter = (next: {
45
- type: string;
46
- key: string;
47
- programmer: (next: IProgrammerProps) => ts.Expression;
48
- }) =>
49
- ts.factory.createObjectLiteralExpression([
50
- ts.factory.createPropertyAssignment(
51
- ts.factory.createIdentifier("type"),
52
- ts.factory.createStringLiteral(next.type),
53
- ),
54
- ts.factory.createPropertyAssignment(
55
- ts.factory.createIdentifier(next.key),
56
- next.programmer({
57
- context: {
58
- ...props.context,
59
- options: {}, // use default option
60
- },
61
- modulo: props.modulo,
62
- type: props.type,
63
- name: undefined,
64
- }),
65
- ),
66
- ]);
67
-
68
- // RETURNS
69
- if (props.context.options.stringify === "is")
70
- return parameter({
71
- type: "is",
72
- key: "is",
73
- programmer: JsonIsStringifyProgrammer.write,
74
- });
75
- else if (props.context.options.stringify === "validate")
76
- return parameter({
77
- type: "validate",
78
- key: "validate",
79
- programmer: JsonValidateStringifyProgrammer.write,
80
- });
81
- else if (props.context.options.stringify === "stringify")
82
- return parameter({
83
- type: "stringify",
84
- key: "stringify",
85
- programmer: JsonStringifyProgrammer.write,
86
- });
87
- else if (props.context.options.stringify === "validate.log")
88
- return parameter({
89
- type: "validate.log",
90
- key: "validate",
91
- programmer: JsonValidateStringifyProgrammer.write,
92
- });
93
- else if (props.context.options.stringify === null)
94
- return ts.factory.createNull();
95
-
96
- // ASSERT IS DEFAULT
97
- return parameter({
98
- type: "assert",
99
- key: "assert",
100
- programmer: JsonAssertStringifyProgrammer.write,
101
- });
102
- };
103
- }
@@ -1,74 +0,0 @@
1
- import {
2
- AssertProgrammer,
3
- ITypiaContext,
4
- IdentifierFactory,
5
- StatementFactory,
6
- } from "@typia/core";
7
- import ts from "typescript";
8
-
9
- import { HttpQuerifyProgrammer } from "./HttpQuerifyProgrammer";
10
-
11
- export namespace HttpAssertQuerifyProgrammer {
12
- export const write = (props: {
13
- context: ITypiaContext;
14
- modulo: ts.LeftHandSideExpression;
15
- type: ts.Type;
16
- }): ts.ArrowFunction =>
17
- ts.factory.createArrowFunction(
18
- undefined,
19
- undefined,
20
- [IdentifierFactory.parameter("input")],
21
- undefined,
22
- undefined,
23
- ts.factory.createBlock([
24
- StatementFactory.constant({
25
- name: "assert",
26
- value: AssertProgrammer.write({
27
- context: {
28
- ...props.context,
29
- options: {
30
- ...props.context.options,
31
- functional: false,
32
- numeric: false,
33
- },
34
- },
35
- modulo: props.modulo,
36
- config: {
37
- equals: false,
38
- guard: false,
39
- },
40
- type: props.type,
41
- name: undefined,
42
- }),
43
- }),
44
- StatementFactory.constant({
45
- name: "stringify",
46
- value: HttpQuerifyProgrammer.write({
47
- context: {
48
- ...props.context,
49
- options: {
50
- ...props.context.options,
51
- functional: false,
52
- numeric: false,
53
- },
54
- },
55
- modulo: props.modulo,
56
- type: props.type,
57
- }),
58
- }),
59
- ts.factory.createReturnStatement(
60
- ts.factory.createCallExpression(
61
- ts.factory.createIdentifier("stringify"),
62
- undefined,
63
- [
64
- ts.factory.createCallExpression(
65
- ts.factory.createIdentifier("assert"),
66
- undefined,
67
- [ts.factory.createIdentifier("input")],
68
- ),
69
- ],
70
- ),
71
- ),
72
- ]),
73
- );
74
- }
@@ -1,77 +0,0 @@
1
- import {
2
- ITypiaContext,
3
- IdentifierFactory,
4
- IsProgrammer,
5
- StatementFactory,
6
- } from "@typia/core";
7
- import ts from "typescript";
8
-
9
- import { HttpQuerifyProgrammer } from "./HttpQuerifyProgrammer";
10
-
11
- export namespace HttpIsQuerifyProgrammer {
12
- export const write = (props: {
13
- context: ITypiaContext;
14
- modulo: ts.LeftHandSideExpression;
15
- type: ts.Type;
16
- }): ts.ArrowFunction =>
17
- ts.factory.createArrowFunction(
18
- undefined,
19
- undefined,
20
- [IdentifierFactory.parameter("input")],
21
- undefined,
22
- undefined,
23
- ts.factory.createBlock([
24
- StatementFactory.constant({
25
- name: "is",
26
- value: IsProgrammer.write({
27
- config: {
28
- equals: false,
29
- },
30
- context: {
31
- ...props.context,
32
- options: {
33
- ...props.context.options,
34
- functional: false,
35
- numeric: false,
36
- },
37
- },
38
- modulo: props.modulo,
39
- type: props.type,
40
- name: undefined,
41
- }),
42
- }),
43
- StatementFactory.constant({
44
- name: "stringify",
45
- value: HttpQuerifyProgrammer.write({
46
- context: {
47
- ...props.context,
48
- options: {
49
- ...props.context.options,
50
- functional: false,
51
- numeric: false,
52
- },
53
- },
54
- modulo: props.modulo,
55
- type: props.type,
56
- }),
57
- }),
58
- ts.factory.createReturnStatement(
59
- ts.factory.createConditionalExpression(
60
- ts.factory.createCallExpression(
61
- ts.factory.createIdentifier("is"),
62
- undefined,
63
- [ts.factory.createIdentifier("input")],
64
- ),
65
- undefined,
66
- ts.factory.createCallExpression(
67
- ts.factory.createIdentifier("stringify"),
68
- undefined,
69
- [ts.factory.createIdentifier("input")],
70
- ),
71
- undefined,
72
- ts.factory.createNull(),
73
- ),
74
- ),
75
- ]),
76
- );
77
- }
@@ -1,110 +0,0 @@
1
- import {
2
- FunctionProgrammer,
3
- HttpQueryProgrammer,
4
- ITypiaContext,
5
- IdentifierFactory,
6
- MetadataCollection,
7
- MetadataFactory,
8
- MetadataObject,
9
- MetadataSchema,
10
- StatementFactory,
11
- TransformerError,
12
- } from "@typia/core";
13
- import ts from "typescript";
14
-
15
- export namespace HttpQuerifyProgrammer {
16
- export const write = (props: {
17
- context: ITypiaContext;
18
- modulo: ts.LeftHandSideExpression;
19
- type: ts.Type;
20
- }): ts.ArrowFunction => {
21
- // GET OBJECT TYPE
22
- const functor: FunctionProgrammer = new FunctionProgrammer(
23
- props.modulo.getText(),
24
- );
25
- const storage: MetadataCollection = new MetadataCollection();
26
- const result = MetadataFactory.analyze({
27
- checker: props.context.checker,
28
- transformer: props.context.transformer,
29
- options: {
30
- escape: false,
31
- constant: true,
32
- absorb: true,
33
- validate: HttpQueryProgrammer.validate,
34
- },
35
- type: props.type,
36
- components: storage,
37
- });
38
- if (result.success === false)
39
- throw TransformerError.from({
40
- code: functor.method,
41
- errors: result.errors,
42
- });
43
-
44
- const object: MetadataObject = result.data.objects[0]!;
45
- return ts.factory.createArrowFunction(
46
- undefined,
47
- undefined,
48
- [IdentifierFactory.parameter("input")],
49
- undefined,
50
- undefined,
51
- ts.factory.createBlock(
52
- [
53
- ...functor.declare(),
54
- StatementFactory.constant({
55
- name: "output",
56
- value: ts.factory.createNewExpression(
57
- ts.factory.createIdentifier("URLSearchParams"),
58
- undefined,
59
- [],
60
- ),
61
- }),
62
- ...object.type.properties.map((p) =>
63
- ts.factory.createExpressionStatement(
64
- decode(p.key.constants[0]!.values[0]!.value as string)(p.value),
65
- ),
66
- ),
67
- ts.factory.createReturnStatement(
68
- ts.factory.createIdentifier("output"),
69
- ),
70
- ],
71
- true,
72
- ),
73
- );
74
- };
75
-
76
- const decode =
77
- (key: string) =>
78
- (value: MetadataSchema): ts.CallExpression =>
79
- !!value.arrays.length
80
- ? ts.factory.createCallExpression(
81
- IdentifierFactory.access(
82
- IdentifierFactory.access(
83
- ts.factory.createIdentifier("input"),
84
- key,
85
- ),
86
- "forEach",
87
- ),
88
- undefined,
89
- [
90
- ts.factory.createArrowFunction(
91
- undefined,
92
- undefined,
93
- [IdentifierFactory.parameter("elem")],
94
- undefined,
95
- undefined,
96
- append(key)(ts.factory.createIdentifier("elem")),
97
- ),
98
- ],
99
- )
100
- : append(key)(
101
- IdentifierFactory.access(ts.factory.createIdentifier("input"), key),
102
- );
103
-
104
- const append = (key: string) => (elem: ts.Expression) =>
105
- ts.factory.createCallExpression(
106
- IdentifierFactory.access(ts.factory.createIdentifier("output"), "append"),
107
- undefined,
108
- [ts.factory.createStringLiteral(key), elem],
109
- );
110
- }
@@ -1,78 +0,0 @@
1
- import {
2
- ITypiaContext,
3
- IdentifierFactory,
4
- StatementFactory,
5
- ValidateProgrammer,
6
- } from "@typia/core";
7
- import ts from "typescript";
8
-
9
- import { HttpQuerifyProgrammer } from "./HttpQuerifyProgrammer";
10
-
11
- export namespace HttpValidateQuerifyProgrammer {
12
- export const write = (props: {
13
- context: ITypiaContext;
14
- modulo: ts.LeftHandSideExpression;
15
- type: ts.Type;
16
- }): ts.ArrowFunction =>
17
- ts.factory.createArrowFunction(
18
- undefined,
19
- undefined,
20
- [IdentifierFactory.parameter("input")],
21
- undefined,
22
- undefined,
23
- ts.factory.createBlock([
24
- StatementFactory.constant({
25
- name: "validate",
26
- value: ValidateProgrammer.write({
27
- config: {
28
- equals: false,
29
- },
30
- context: {
31
- ...props.context,
32
- options: {
33
- ...props.context.options,
34
- functional: false,
35
- numeric: true,
36
- },
37
- },
38
- modulo: props.modulo,
39
- type: props.type,
40
- name: undefined,
41
- }),
42
- }),
43
- StatementFactory.constant({
44
- name: "query",
45
- value: HttpQuerifyProgrammer.write({
46
- context: {
47
- ...props.context,
48
- options: {
49
- ...props.context.options,
50
- functional: false,
51
- numeric: false,
52
- },
53
- },
54
- modulo: props.modulo,
55
- type: props.type,
56
- }),
57
- }),
58
- StatementFactory.constant({
59
- name: "output",
60
- value: ts.factory.createCallExpression(
61
- ts.factory.createIdentifier("query"),
62
- undefined,
63
- [ts.factory.createIdentifier("input")],
64
- ),
65
- }),
66
- ts.factory.createReturnStatement(
67
- ts.factory.createAsExpression(
68
- ts.factory.createCallExpression(
69
- ts.factory.createIdentifier("validate"),
70
- undefined,
71
- [ts.factory.createIdentifier("output")],
72
- ),
73
- ts.factory.createTypeReferenceNode("any"),
74
- ),
75
- ),
76
- ]),
77
- );
78
- }
@@ -1,21 +0,0 @@
1
- import { MetadataSchema } from "@typia/core";
2
-
3
- export namespace CoreMetadataUtil {
4
- export const atomics = (
5
- meta: MetadataSchema,
6
- ): Set<"boolean" | "bigint" | "number" | "string"> =>
7
- new Set([
8
- ...meta.atomics.map((a) => a.type),
9
- ...meta.constants.map((c) => c.type),
10
- ...(meta.templates.length ? (["string"] as const) : []),
11
- ]);
12
-
13
- export const isUnion = (meta: MetadataSchema): boolean =>
14
- atomics(meta).size +
15
- meta.arrays.length +
16
- meta.tuples.length +
17
- meta.natives.length +
18
- meta.maps.length +
19
- meta.objects.length >
20
- 1;
21
- }
@@ -1,109 +0,0 @@
1
- import { ImportProgrammer, TransformerError } from "@typia/core";
2
- import ts from "typescript";
3
-
4
- import { INestiaTransformContext } from "../options/INestiaTransformProject";
5
- import { NodeTransformer } from "./NodeTransformer";
6
-
7
- export namespace FileTransformer {
8
- export const transform =
9
- (context: Omit<INestiaTransformContext, "importer" | "transformer">) =>
10
- (transformer: ts.TransformationContext) =>
11
- (file: ts.SourceFile): ts.SourceFile => {
12
- if (file.isDeclarationFile) return file;
13
- const importer = new ImportProgrammer({
14
- internalPrefix: "nestia_core_transform",
15
- });
16
- file = ts.visitEachChild(
17
- file,
18
- (node) =>
19
- iterate_node({
20
- context: {
21
- ...context,
22
- transformer,
23
- importer,
24
- },
25
- file,
26
- node,
27
- }),
28
- transformer,
29
- );
30
- const index: number = find_import_injection_index(file);
31
- return ts.factory.updateSourceFile(
32
- file,
33
- [
34
- ...file.statements.slice(0, index),
35
- ...importer.toStatements(),
36
- ...file.statements.slice(index),
37
- ],
38
- false,
39
- file.referencedFiles,
40
- file.typeReferenceDirectives,
41
- file.hasNoDefaultLib,
42
- file.libReferenceDirectives,
43
- );
44
- };
45
-
46
- const iterate_node = (props: {
47
- context: INestiaTransformContext;
48
- file: ts.SourceFile;
49
- node: ts.Node;
50
- }): ts.Node =>
51
- ts.visitEachChild(
52
- try_transform_node(props) ?? props.node,
53
- (child) =>
54
- iterate_node({
55
- context: props.context,
56
- file: props.file,
57
- node: child,
58
- }),
59
- props.context.transformer,
60
- );
61
-
62
- const try_transform_node = (props: {
63
- context: INestiaTransformContext;
64
- file: ts.SourceFile;
65
- node: ts.Node;
66
- }): ts.Node | null => {
67
- try {
68
- return NodeTransformer.transform(props);
69
- } catch (exp) {
70
- // ONLY ACCEPT TRANSFORMER-ERROR
71
- if (!isTransformerError(exp)) throw exp;
72
-
73
- // AVOID SPECIAL BUG OF TYPESCRIPT COMPILER API
74
- (props.node as any).parent ??= props.file;
75
-
76
- // REPORT DIAGNOSTIC
77
- const diagnostic = (ts as any).createDiagnosticForNode(props.node, {
78
- key: exp.code,
79
- category: ts.DiagnosticCategory.Error,
80
- message: exp.message,
81
- code: `(${exp.code})` as any,
82
- });
83
- props.context.extras.addDiagnostic(diagnostic);
84
- return null;
85
- }
86
- };
87
-
88
- const find_import_injection_index = (file: ts.SourceFile): number => {
89
- let i: number = 0;
90
- for (; i < file.statements.length; ++i) {
91
- const stmt: ts.Statement = file.statements[i]!;
92
- if (
93
- ts.isExpressionStatement(stmt) &&
94
- ts.isStringLiteralLike(stmt.expression) &&
95
- stmt.expression.text.startsWith("use ")
96
- )
97
- continue;
98
- break;
99
- }
100
- return i;
101
- };
102
- }
103
-
104
- const isTransformerError = (error: any): error is TransformerError =>
105
- typeof error === "object" &&
106
- error !== null &&
107
- error.constructor.name === "TransformerError" &&
108
- typeof error.code === "string" &&
109
- typeof error.message === "string";