@nestia/core 2.4.2 → 2.4.3

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 (112) hide show
  1. package/lib/decorators/DynamicModule.js.map +1 -1
  2. package/lib/decorators/EncryptedBody.js.map +1 -1
  3. package/lib/decorators/EncryptedController.js.map +1 -1
  4. package/lib/decorators/EncryptedModule.js.map +1 -1
  5. package/lib/decorators/EncryptedRoute.js +0 -2
  6. package/lib/decorators/EncryptedRoute.js.map +1 -1
  7. package/lib/decorators/PlainBody.js.map +1 -1
  8. package/lib/decorators/TypedBody.js.map +1 -1
  9. package/lib/decorators/TypedException.js.map +1 -1
  10. package/lib/decorators/TypedHeaders.js.map +1 -1
  11. package/lib/decorators/TypedParam.js.map +1 -1
  12. package/lib/decorators/TypedQuery.js +1 -5
  13. package/lib/decorators/TypedQuery.js.map +1 -1
  14. package/lib/decorators/TypedRoute.js.map +1 -1
  15. package/lib/decorators/internal/NoTransformConfigureError.js.map +1 -1
  16. package/lib/decorators/internal/get_path_and_querify.js.map +1 -1
  17. package/lib/decorators/internal/get_path_and_stringify.js.map +1 -1
  18. package/lib/decorators/internal/get_text_body.js.map +1 -1
  19. package/lib/decorators/internal/headers_to_object.js.map +1 -1
  20. package/lib/decorators/internal/load_controller.js.map +1 -1
  21. package/lib/decorators/internal/route_error.js.map +1 -1
  22. package/lib/decorators/internal/validate_request_body.js.map +1 -1
  23. package/lib/decorators/internal/validate_request_headers.js.map +1 -1
  24. package/lib/decorators/internal/validate_request_query.js.map +1 -1
  25. package/lib/programmers/PlainBodyProgrammer.js.map +1 -1
  26. package/lib/programmers/TypedBodyProgrammer.js.map +1 -1
  27. package/lib/programmers/TypedExceptionProgrammer.js.map +1 -1
  28. package/lib/programmers/TypedHeadersProgrammer.js.map +1 -1
  29. package/lib/programmers/TypedParamProgrammer.js.map +1 -1
  30. package/lib/programmers/TypedQueryBodyProgrammer.js.map +1 -1
  31. package/lib/programmers/TypedQueryProgrammer.js.map +1 -1
  32. package/lib/programmers/TypedQueryRouteProgrammer.js.map +1 -1
  33. package/lib/programmers/TypedRouteProgrammer.js.map +1 -1
  34. package/lib/programmers/http/HttpAssertQuerifyProgrammer.js.map +1 -1
  35. package/lib/programmers/http/HttpIsQuerifyProgrammer.js.map +1 -1
  36. package/lib/programmers/http/HttpQuerifyProgrammer.js.map +1 -1
  37. package/lib/programmers/http/HttpValidateQuerifyProgrammer.js.map +1 -1
  38. package/lib/programmers/internal/CoreMetadataUtil.js.map +1 -1
  39. package/lib/transform.js.map +1 -1
  40. package/lib/transformers/FileTransformer.js.map +1 -1
  41. package/lib/transformers/MethodTransformer.js +1 -2
  42. package/lib/transformers/MethodTransformer.js.map +1 -1
  43. package/lib/transformers/NodeTransformer.js.map +1 -1
  44. package/lib/transformers/ParameterDecoratorTransformer.js +1 -3
  45. package/lib/transformers/ParameterDecoratorTransformer.js.map +1 -1
  46. package/lib/transformers/ParameterTransformer.js.map +1 -1
  47. package/lib/transformers/TypedExceptionTransformer.js.map +1 -1
  48. package/lib/transformers/TypedRouteTransformer.js +1 -2
  49. package/lib/transformers/TypedRouteTransformer.js.map +1 -1
  50. package/lib/utils/ExceptionManager.js.map +1 -1
  51. package/lib/utils/Singleton.js.map +1 -1
  52. package/lib/utils/SourceFinder.js +1 -3
  53. package/lib/utils/SourceFinder.js.map +1 -1
  54. package/package.json +3 -6
  55. package/src/decorators/DynamicModule.ts +39 -39
  56. package/src/decorators/EncryptedBody.ts +49 -57
  57. package/src/decorators/EncryptedController.ts +38 -38
  58. package/src/decorators/EncryptedModule.ts +79 -79
  59. package/src/decorators/EncryptedRoute.ts +126 -135
  60. package/src/decorators/PlainBody.ts +72 -75
  61. package/src/decorators/TypedBody.ts +59 -60
  62. package/src/decorators/TypedException.ts +89 -89
  63. package/src/decorators/TypedHeaders.ts +69 -70
  64. package/src/decorators/TypedParam.ts +65 -66
  65. package/src/decorators/TypedQuery.ts +246 -253
  66. package/src/decorators/TypedRoute.ts +144 -147
  67. package/src/decorators/internal/EncryptedConstant.ts +4 -4
  68. package/src/decorators/internal/NoTransformConfigureError.ts +8 -8
  69. package/src/decorators/internal/get_path_and_querify.ts +103 -104
  70. package/src/decorators/internal/get_path_and_stringify.ts +91 -94
  71. package/src/decorators/internal/get_text_body.ts +20 -20
  72. package/src/decorators/internal/headers_to_object.ts +13 -13
  73. package/src/decorators/internal/load_controller.ts +51 -51
  74. package/src/decorators/internal/route_error.ts +45 -45
  75. package/src/decorators/internal/validate_request_body.ts +57 -61
  76. package/src/decorators/internal/validate_request_headers.ts +68 -73
  77. package/src/decorators/internal/validate_request_query.ts +56 -59
  78. package/src/index.ts +5 -5
  79. package/src/module.ts +14 -14
  80. package/src/options/INestiaTransformOptions.ts +17 -17
  81. package/src/options/INestiaTransformProject.ts +7 -7
  82. package/src/options/IRequestBodyValidator.ts +20 -20
  83. package/src/options/IRequestHeadersValidator.ts +22 -22
  84. package/src/options/IRequestQueryValidator.ts +20 -20
  85. package/src/options/IResponseBodyQuerifier.ts +25 -25
  86. package/src/options/IResponseBodyStringifier.ts +25 -25
  87. package/src/programmers/PlainBodyProgrammer.ts +52 -56
  88. package/src/programmers/TypedBodyProgrammer.ts +108 -112
  89. package/src/programmers/TypedExceptionProgrammer.ts +72 -76
  90. package/src/programmers/TypedHeadersProgrammer.ts +56 -59
  91. package/src/programmers/TypedParamProgrammer.ts +24 -25
  92. package/src/programmers/TypedQueryBodyProgrammer.ts +56 -57
  93. package/src/programmers/TypedQueryProgrammer.ts +56 -57
  94. package/src/programmers/TypedQueryRouteProgrammer.ts +51 -55
  95. package/src/programmers/TypedRouteProgrammer.ts +51 -55
  96. package/src/programmers/http/HttpAssertQuerifyProgrammer.ts +58 -59
  97. package/src/programmers/http/HttpIsQuerifyProgrammer.ts +62 -63
  98. package/src/programmers/http/HttpQuerifyProgrammer.ts +96 -105
  99. package/src/programmers/http/HttpValidateQuerifyProgrammer.ts +63 -64
  100. package/src/programmers/internal/CoreMetadataUtil.ts +21 -21
  101. package/src/transform.ts +35 -36
  102. package/src/transformers/FileTransformer.ts +66 -67
  103. package/src/transformers/MethodTransformer.ts +94 -97
  104. package/src/transformers/NodeTransformer.ts +16 -16
  105. package/src/transformers/ParameterDecoratorTransformer.ts +121 -126
  106. package/src/transformers/ParameterTransformer.ts +48 -53
  107. package/src/transformers/TypedExceptionTransformer.ts +49 -51
  108. package/src/transformers/TypedRouteTransformer.ts +95 -96
  109. package/src/typings/Creator.ts +3 -3
  110. package/src/utils/ExceptionManager.ts +112 -112
  111. package/src/utils/Singleton.ts +20 -20
  112. package/src/utils/SourceFinder.ts +57 -60
@@ -1,67 +1,66 @@
1
- import ts from "typescript";
2
-
3
- import { TransformerError } from "typia/lib/transformers/TransformerError";
4
-
5
- import { INestiaTransformProject } from "../options/INestiaTransformProject";
6
- import { NodeTransformer } from "./NodeTransformer";
7
-
8
- export namespace FileTransformer {
9
- export const transform =
10
- (project: Omit<INestiaTransformProject, "context">) =>
11
- (context: ts.TransformationContext) =>
12
- (file: ts.SourceFile): ts.SourceFile =>
13
- file.isDeclarationFile
14
- ? file
15
- : ts.visitEachChild(
16
- file,
17
- (node) =>
18
- iterate_node({
19
- ...project,
20
- context,
21
- })(context)(file)(node),
22
- context,
23
- );
24
-
25
- const iterate_node =
26
- (project: INestiaTransformProject) =>
27
- (context: ts.TransformationContext) =>
28
- (file: ts.SourceFile) =>
29
- (node: ts.Node): ts.Node =>
30
- ts.visitEachChild(
31
- try_transform_node(project)(file)(node) ?? node,
32
- (child) => iterate_node(project)(context)(file)(child),
33
- context,
34
- );
35
-
36
- const try_transform_node =
37
- (project: INestiaTransformProject) =>
38
- (file: ts.SourceFile) =>
39
- (node: ts.Node): ts.Node | null => {
40
- try {
41
- return NodeTransformer.transform(project)(node);
42
- } catch (exp) {
43
- // ONLY ACCEPT TRANSFORMER-ERROR
44
- if (!isTransformerError(exp)) throw exp;
45
-
46
- // AVOID SPECIAL BUG OF TYPESCRIPT COMPILER API
47
- (node as any).parent ??= file;
48
-
49
- // REPORT DIAGNOSTIC
50
- const diagnostic = ts.createDiagnosticForNode(node, {
51
- key: exp.code,
52
- category: ts.DiagnosticCategory.Error,
53
- message: exp.message,
54
- code: `(${exp.code})` as any,
55
- });
56
- project.extras.addDiagnostic(diagnostic);
57
- return null;
58
- }
59
- };
60
- }
61
-
62
- const isTransformerError = (error: any): error is TransformerError =>
63
- typeof error === "object" &&
64
- error !== null &&
65
- error.constructor.name === "TransformerError" &&
66
- typeof error.code === "string" &&
67
- typeof error.message === "string";
1
+ import ts from "typescript";
2
+ import { TransformerError } from "typia/lib/transformers/TransformerError";
3
+
4
+ import { INestiaTransformProject } from "../options/INestiaTransformProject";
5
+ import { NodeTransformer } from "./NodeTransformer";
6
+
7
+ export namespace FileTransformer {
8
+ export const transform =
9
+ (project: Omit<INestiaTransformProject, "context">) =>
10
+ (context: ts.TransformationContext) =>
11
+ (file: ts.SourceFile): ts.SourceFile =>
12
+ file.isDeclarationFile
13
+ ? file
14
+ : ts.visitEachChild(
15
+ file,
16
+ (node) =>
17
+ iterate_node({
18
+ ...project,
19
+ context,
20
+ })(context)(file)(node),
21
+ context,
22
+ );
23
+
24
+ const iterate_node =
25
+ (project: INestiaTransformProject) =>
26
+ (context: ts.TransformationContext) =>
27
+ (file: ts.SourceFile) =>
28
+ (node: ts.Node): ts.Node =>
29
+ ts.visitEachChild(
30
+ try_transform_node(project)(file)(node) ?? node,
31
+ (child) => iterate_node(project)(context)(file)(child),
32
+ context,
33
+ );
34
+
35
+ const try_transform_node =
36
+ (project: INestiaTransformProject) =>
37
+ (file: ts.SourceFile) =>
38
+ (node: ts.Node): ts.Node | null => {
39
+ try {
40
+ return NodeTransformer.transform(project)(node);
41
+ } catch (exp) {
42
+ // ONLY ACCEPT TRANSFORMER-ERROR
43
+ if (!isTransformerError(exp)) throw exp;
44
+
45
+ // AVOID SPECIAL BUG OF TYPESCRIPT COMPILER API
46
+ (node as any).parent ??= file;
47
+
48
+ // REPORT DIAGNOSTIC
49
+ const diagnostic = ts.createDiagnosticForNode(node, {
50
+ key: exp.code,
51
+ category: ts.DiagnosticCategory.Error,
52
+ message: exp.message,
53
+ code: `(${exp.code})` as any,
54
+ });
55
+ project.extras.addDiagnostic(diagnostic);
56
+ return null;
57
+ }
58
+ };
59
+ }
60
+
61
+ const isTransformerError = (error: any): error is TransformerError =>
62
+ typeof error === "object" &&
63
+ error !== null &&
64
+ error.constructor.name === "TransformerError" &&
65
+ typeof error.code === "string" &&
66
+ typeof error.message === "string";
@@ -1,97 +1,94 @@
1
- import ts from "typescript";
2
-
3
- import { INestiaTransformProject } from "../options/INestiaTransformProject";
4
- import { TypedExceptionTransformer } from "./TypedExceptionTransformer";
5
- import { TypedRouteTransformer } from "./TypedRouteTransformer";
6
-
7
- export namespace MethodTransformer {
8
- export const transform =
9
- (project: INestiaTransformProject) =>
10
- (method: ts.MethodDeclaration): ts.MethodDeclaration => {
11
- const decorators: readonly ts.Decorator[] | undefined =
12
- ts.getDecorators
13
- ? ts.getDecorators(method)
14
- : (method as any).decorators;
15
- if (!decorators?.length) return method;
16
-
17
- const signature: ts.Signature | undefined =
18
- project.checker.getSignatureFromDeclaration(method);
19
- const original: ts.Type | undefined =
20
- signature &&
21
- project.checker.getReturnTypeOfSignature(signature);
22
- const escaped: ts.Type | undefined =
23
- original && get_escaped_type(project.checker)(original);
24
-
25
- if (escaped === undefined) return method;
26
-
27
- const operator = (deco: ts.Decorator): ts.Decorator => {
28
- deco = TypedExceptionTransformer.transform(project)(deco);
29
- deco = TypedRouteTransformer.transform(project)(escaped)(deco);
30
- return deco;
31
- };
32
- if (ts.getDecorators !== undefined)
33
- return ts.factory.updateMethodDeclaration(
34
- method,
35
- (method.modifiers || []).map((mod) =>
36
- ts.isDecorator(mod) ? operator(mod) : mod,
37
- ),
38
- method.asteriskToken,
39
- method.name,
40
- method.questionToken,
41
- method.typeParameters,
42
- method.parameters,
43
- method.type,
44
- method.body,
45
- );
46
- // eslint-disable-next-line
47
- return (ts.factory.updateMethodDeclaration as any)(
48
- method,
49
- decorators.map(operator),
50
- (method as any).modifiers,
51
- method.asteriskToken,
52
- method.name,
53
- method.questionToken,
54
- method.typeParameters,
55
- method.parameters,
56
- method.type,
57
- method.body,
58
- );
59
- };
60
- }
61
-
62
- const get_escaped_type =
63
- (checker: ts.TypeChecker) =>
64
- (type: ts.Type): ts.Type => {
65
- const symbol: ts.Symbol | undefined =
66
- type.getSymbol() || type.aliasSymbol;
67
- return symbol && get_name(symbol) === "Promise"
68
- ? escape_promise(checker)(type)
69
- : type;
70
- };
71
-
72
- const escape_promise =
73
- (checker: ts.TypeChecker) =>
74
- (type: ts.Type): ts.Type => {
75
- const generic: readonly ts.Type[] = checker.getTypeArguments(
76
- type as ts.TypeReference,
77
- );
78
- if (generic.length !== 1)
79
- throw new Error(
80
- "Error on ImportAnalyzer.analyze(): invalid promise type.",
81
- );
82
- return generic[0];
83
- };
84
-
85
- const get_name = (symbol: ts.Symbol): string =>
86
- explore_name(symbol.getDeclarations()![0].parent)(
87
- symbol.escapedName.toString(),
88
- );
89
-
90
- const explore_name =
91
- (decl: ts.Node) =>
92
- (name: string): string =>
93
- ts.isModuleBlock(decl)
94
- ? explore_name(decl.parent.parent)(
95
- `${decl.parent.name.getFullText().trim()}.${name}`,
96
- )
97
- : name;
1
+ import ts from "typescript";
2
+
3
+ import { INestiaTransformProject } from "../options/INestiaTransformProject";
4
+ import { TypedExceptionTransformer } from "./TypedExceptionTransformer";
5
+ import { TypedRouteTransformer } from "./TypedRouteTransformer";
6
+
7
+ export namespace MethodTransformer {
8
+ export const transform =
9
+ (project: INestiaTransformProject) =>
10
+ (method: ts.MethodDeclaration): ts.MethodDeclaration => {
11
+ const decorators: readonly ts.Decorator[] | undefined = ts.getDecorators
12
+ ? ts.getDecorators(method)
13
+ : (method as any).decorators;
14
+ if (!decorators?.length) return method;
15
+
16
+ const signature: ts.Signature | undefined =
17
+ project.checker.getSignatureFromDeclaration(method);
18
+ const original: ts.Type | undefined =
19
+ signature && project.checker.getReturnTypeOfSignature(signature);
20
+ const escaped: ts.Type | undefined =
21
+ original && get_escaped_type(project.checker)(original);
22
+
23
+ if (escaped === undefined) return method;
24
+
25
+ const operator = (deco: ts.Decorator): ts.Decorator => {
26
+ deco = TypedExceptionTransformer.transform(project)(deco);
27
+ deco = TypedRouteTransformer.transform(project)(escaped)(deco);
28
+ return deco;
29
+ };
30
+ if (ts.getDecorators !== undefined)
31
+ return ts.factory.updateMethodDeclaration(
32
+ method,
33
+ (method.modifiers || []).map((mod) =>
34
+ ts.isDecorator(mod) ? operator(mod) : mod,
35
+ ),
36
+ method.asteriskToken,
37
+ method.name,
38
+ method.questionToken,
39
+ method.typeParameters,
40
+ method.parameters,
41
+ method.type,
42
+ method.body,
43
+ );
44
+ // eslint-disable-next-line
45
+ return (ts.factory.updateMethodDeclaration as any)(
46
+ method,
47
+ decorators.map(operator),
48
+ (method as any).modifiers,
49
+ method.asteriskToken,
50
+ method.name,
51
+ method.questionToken,
52
+ method.typeParameters,
53
+ method.parameters,
54
+ method.type,
55
+ method.body,
56
+ );
57
+ };
58
+ }
59
+
60
+ const get_escaped_type =
61
+ (checker: ts.TypeChecker) =>
62
+ (type: ts.Type): ts.Type => {
63
+ const symbol: ts.Symbol | undefined = type.getSymbol() || type.aliasSymbol;
64
+ return symbol && get_name(symbol) === "Promise"
65
+ ? escape_promise(checker)(type)
66
+ : type;
67
+ };
68
+
69
+ const escape_promise =
70
+ (checker: ts.TypeChecker) =>
71
+ (type: ts.Type): ts.Type => {
72
+ const generic: readonly ts.Type[] = checker.getTypeArguments(
73
+ type as ts.TypeReference,
74
+ );
75
+ if (generic.length !== 1)
76
+ throw new Error(
77
+ "Error on ImportAnalyzer.analyze(): invalid promise type.",
78
+ );
79
+ return generic[0];
80
+ };
81
+
82
+ const get_name = (symbol: ts.Symbol): string =>
83
+ explore_name(symbol.getDeclarations()![0].parent)(
84
+ symbol.escapedName.toString(),
85
+ );
86
+
87
+ const explore_name =
88
+ (decl: ts.Node) =>
89
+ (name: string): string =>
90
+ ts.isModuleBlock(decl)
91
+ ? explore_name(decl.parent.parent)(
92
+ `${decl.parent.name.getFullText().trim()}.${name}`,
93
+ )
94
+ : name;
@@ -1,16 +1,16 @@
1
- import ts from "typescript";
2
-
3
- import { INestiaTransformProject } from "../options/INestiaTransformProject";
4
- import { MethodTransformer } from "./MethodTransformer";
5
- import { ParameterTransformer } from "./ParameterTransformer";
6
-
7
- export namespace NodeTransformer {
8
- export const transform =
9
- (project: INestiaTransformProject) =>
10
- (node: ts.Node): ts.Node =>
11
- ts.isMethodDeclaration(node)
12
- ? MethodTransformer.transform(project)(node)
13
- : ts.isParameter(node)
14
- ? ParameterTransformer.transform(project)(node)
15
- : node;
16
- }
1
+ import ts from "typescript";
2
+
3
+ import { INestiaTransformProject } from "../options/INestiaTransformProject";
4
+ import { MethodTransformer } from "./MethodTransformer";
5
+ import { ParameterTransformer } from "./ParameterTransformer";
6
+
7
+ export namespace NodeTransformer {
8
+ export const transform =
9
+ (project: INestiaTransformProject) =>
10
+ (node: ts.Node): ts.Node =>
11
+ ts.isMethodDeclaration(node)
12
+ ? MethodTransformer.transform(project)(node)
13
+ : ts.isParameter(node)
14
+ ? ParameterTransformer.transform(project)(node)
15
+ : node;
16
+ }
@@ -1,126 +1,121 @@
1
- import path from "path";
2
- import ts from "typescript";
3
-
4
- import { INestiaTransformProject } from "../options/INestiaTransformProject";
5
- import { PlainBodyProgrammer } from "../programmers/PlainBodyProgrammer";
6
- import { TypedBodyProgrammer } from "../programmers/TypedBodyProgrammer";
7
- import { TypedHeadersProgrammer } from "../programmers/TypedHeadersProgrammer";
8
- import { TypedParamProgrammer } from "../programmers/TypedParamProgrammer";
9
- import { TypedQueryBodyProgrammer } from "../programmers/TypedQueryBodyProgrammer";
10
- import { TypedQueryProgrammer } from "../programmers/TypedQueryProgrammer";
11
-
12
- export namespace ParameterDecoratorTransformer {
13
- export const transform =
14
- (project: INestiaTransformProject) =>
15
- (type: ts.Type) =>
16
- (decorator: ts.Decorator): ts.Decorator => {
17
- //----
18
- // VALIDATIONS
19
- //----
20
- // CHECK DECORATOR
21
- if (!ts.isCallExpression(decorator.expression)) return decorator;
22
-
23
- // SIGNATURE DECLARATION
24
- const declaration: ts.Declaration | undefined =
25
- project.checker.getResolvedSignature(
26
- decorator.expression,
27
- )?.declaration;
28
- if (declaration === undefined) return decorator;
29
-
30
- // FILE PATH
31
- const file: string = path.resolve(
32
- declaration.getSourceFile().fileName,
33
- );
34
- if (file.indexOf(LIB_PATH) === -1 && file.indexOf(SRC_PATH) === -1)
35
- return decorator;
36
-
37
- //----
38
- // TRANSFORMATION
39
- //----
40
- // FIND PROGRAMMER
41
- const programmer: Programmer | undefined =
42
- FUNCTORS[
43
- getName(
44
- project.checker.getTypeAtLocation(declaration).symbol,
45
- )
46
- ];
47
- if (programmer === undefined) return decorator;
48
-
49
- // GET TYPE INFO
50
- const typeNode: ts.TypeNode | undefined =
51
- project.checker.typeToTypeNode(type, undefined, undefined);
52
- if (typeNode === undefined) return decorator;
53
-
54
- // DO TRANSFORM
55
- return ts.factory.createDecorator(
56
- ts.factory.updateCallExpression(
57
- decorator.expression,
58
- decorator.expression.expression,
59
- decorator.expression.typeArguments,
60
- programmer(project)(decorator.expression.expression)(
61
- decorator.expression.arguments,
62
- )(type),
63
- ),
64
- );
65
- };
66
- }
67
-
68
- type Programmer = (
69
- project: INestiaTransformProject,
70
- ) => (
71
- modulo: ts.LeftHandSideExpression,
72
- ) => (
73
- parameters: readonly ts.Expression[],
74
- ) => (type: ts.Type) => readonly ts.Expression[];
75
-
76
- const FUNCTORS: Record<string, Programmer> = {
77
- EncryptedBody: (project) => (modulo) => (parameters) => (type) =>
78
- parameters.length
79
- ? parameters
80
- : [TypedBodyProgrammer.generate(project)(modulo)(type)],
81
- TypedBody: (project) => (modulo) => (parameters) => (type) =>
82
- parameters.length
83
- ? parameters
84
- : [TypedBodyProgrammer.generate(project)(modulo)(type)],
85
- TypedHeaders: (project) => (modulo) => (parameters) => (type) =>
86
- parameters.length
87
- ? parameters
88
- : [TypedHeadersProgrammer.generate(project)(modulo)(type)],
89
- TypedParam: (project) => TypedParamProgrammer.generate(project),
90
- TypedQuery: (project) => (modulo) => (parameters) => (type) =>
91
- parameters.length
92
- ? parameters
93
- : [TypedQueryProgrammer.generate(project)(modulo)(type)],
94
- "TypedQuery.Body": (project) => (modulo) => (parameters) => (type) =>
95
- parameters.length
96
- ? parameters
97
- : [TypedQueryBodyProgrammer.generate(project)(modulo)(type)],
98
- PlainBody: (project) => (modulo) => (parameters) => (type) =>
99
- parameters.length
100
- ? parameters
101
- : [PlainBodyProgrammer.generate(project)(modulo)(type)],
102
- };
103
-
104
- const LIB_PATH = path.join(
105
- "node_modules",
106
- "@nestia",
107
- "core",
108
- "lib",
109
- "decorators",
110
- );
111
- const SRC_PATH = path.resolve(path.join(__dirname, "..", "decorators"));
112
-
113
- const getName = (symbol: ts.Symbol): string => {
114
- const parent = symbol.getDeclarations()?.[0]?.parent;
115
- return parent
116
- ? exploreName(parent)(symbol.escapedName.toString())
117
- : "__type";
118
- };
119
- const exploreName =
120
- (decl: ts.Node) =>
121
- (name: string): string =>
122
- ts.isModuleBlock(decl)
123
- ? exploreName(decl.parent.parent)(
124
- `${decl.parent.name.getFullText().trim()}.${name}`,
125
- )
126
- : name;
1
+ import path from "path";
2
+ import ts from "typescript";
3
+
4
+ import { INestiaTransformProject } from "../options/INestiaTransformProject";
5
+ import { PlainBodyProgrammer } from "../programmers/PlainBodyProgrammer";
6
+ import { TypedBodyProgrammer } from "../programmers/TypedBodyProgrammer";
7
+ import { TypedHeadersProgrammer } from "../programmers/TypedHeadersProgrammer";
8
+ import { TypedParamProgrammer } from "../programmers/TypedParamProgrammer";
9
+ import { TypedQueryBodyProgrammer } from "../programmers/TypedQueryBodyProgrammer";
10
+ import { TypedQueryProgrammer } from "../programmers/TypedQueryProgrammer";
11
+
12
+ export namespace ParameterDecoratorTransformer {
13
+ export const transform =
14
+ (project: INestiaTransformProject) =>
15
+ (type: ts.Type) =>
16
+ (decorator: ts.Decorator): ts.Decorator => {
17
+ //----
18
+ // VALIDATIONS
19
+ //----
20
+ // CHECK DECORATOR
21
+ if (!ts.isCallExpression(decorator.expression)) return decorator;
22
+
23
+ // SIGNATURE DECLARATION
24
+ const declaration: ts.Declaration | undefined =
25
+ project.checker.getResolvedSignature(decorator.expression)?.declaration;
26
+ if (declaration === undefined) return decorator;
27
+
28
+ // FILE PATH
29
+ const file: string = path.resolve(declaration.getSourceFile().fileName);
30
+ if (file.indexOf(LIB_PATH) === -1 && file.indexOf(SRC_PATH) === -1)
31
+ return decorator;
32
+
33
+ //----
34
+ // TRANSFORMATION
35
+ //----
36
+ // FIND PROGRAMMER
37
+ const programmer: Programmer | undefined =
38
+ FUNCTORS[
39
+ getName(project.checker.getTypeAtLocation(declaration).symbol)
40
+ ];
41
+ if (programmer === undefined) return decorator;
42
+
43
+ // GET TYPE INFO
44
+ const typeNode: ts.TypeNode | undefined = project.checker.typeToTypeNode(
45
+ type,
46
+ undefined,
47
+ undefined,
48
+ );
49
+ if (typeNode === undefined) return decorator;
50
+
51
+ // DO TRANSFORM
52
+ return ts.factory.createDecorator(
53
+ ts.factory.updateCallExpression(
54
+ decorator.expression,
55
+ decorator.expression.expression,
56
+ decorator.expression.typeArguments,
57
+ programmer(project)(decorator.expression.expression)(
58
+ decorator.expression.arguments,
59
+ )(type),
60
+ ),
61
+ );
62
+ };
63
+ }
64
+
65
+ type Programmer = (
66
+ project: INestiaTransformProject,
67
+ ) => (
68
+ modulo: ts.LeftHandSideExpression,
69
+ ) => (
70
+ parameters: readonly ts.Expression[],
71
+ ) => (type: ts.Type) => readonly ts.Expression[];
72
+
73
+ const FUNCTORS: Record<string, Programmer> = {
74
+ EncryptedBody: (project) => (modulo) => (parameters) => (type) =>
75
+ parameters.length
76
+ ? parameters
77
+ : [TypedBodyProgrammer.generate(project)(modulo)(type)],
78
+ TypedBody: (project) => (modulo) => (parameters) => (type) =>
79
+ parameters.length
80
+ ? parameters
81
+ : [TypedBodyProgrammer.generate(project)(modulo)(type)],
82
+ TypedHeaders: (project) => (modulo) => (parameters) => (type) =>
83
+ parameters.length
84
+ ? parameters
85
+ : [TypedHeadersProgrammer.generate(project)(modulo)(type)],
86
+ TypedParam: (project) => TypedParamProgrammer.generate(project),
87
+ TypedQuery: (project) => (modulo) => (parameters) => (type) =>
88
+ parameters.length
89
+ ? parameters
90
+ : [TypedQueryProgrammer.generate(project)(modulo)(type)],
91
+ "TypedQuery.Body": (project) => (modulo) => (parameters) => (type) =>
92
+ parameters.length
93
+ ? parameters
94
+ : [TypedQueryBodyProgrammer.generate(project)(modulo)(type)],
95
+ PlainBody: (project) => (modulo) => (parameters) => (type) =>
96
+ parameters.length
97
+ ? parameters
98
+ : [PlainBodyProgrammer.generate(project)(modulo)(type)],
99
+ };
100
+
101
+ const LIB_PATH = path.join(
102
+ "node_modules",
103
+ "@nestia",
104
+ "core",
105
+ "lib",
106
+ "decorators",
107
+ );
108
+ const SRC_PATH = path.resolve(path.join(__dirname, "..", "decorators"));
109
+
110
+ const getName = (symbol: ts.Symbol): string => {
111
+ const parent = symbol.getDeclarations()?.[0]?.parent;
112
+ return parent ? exploreName(parent)(symbol.escapedName.toString()) : "__type";
113
+ };
114
+ const exploreName =
115
+ (decl: ts.Node) =>
116
+ (name: string): string =>
117
+ ts.isModuleBlock(decl)
118
+ ? exploreName(decl.parent.parent)(
119
+ `${decl.parent.name.getFullText().trim()}.${name}`,
120
+ )
121
+ : name;