@nestia/core 3.0.5 → 3.1.0-dev.20240429

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 (146) hide show
  1. package/lib/adaptors/WebSocketAdaptor.d.ts +21 -0
  2. package/lib/adaptors/WebSocketAdaptor.js +275 -0
  3. package/lib/adaptors/WebSocketAdaptor.js.map +1 -0
  4. package/lib/decorators/DynamicModule.js +12 -59
  5. package/lib/decorators/DynamicModule.js.map +1 -1
  6. package/lib/decorators/EncryptedBody.js +36 -73
  7. package/lib/decorators/EncryptedBody.js.map +1 -1
  8. package/lib/decorators/EncryptedController.js +2 -2
  9. package/lib/decorators/EncryptedController.js.map +1 -1
  10. package/lib/decorators/EncryptedModule.js +24 -107
  11. package/lib/decorators/EncryptedModule.js.map +1 -1
  12. package/lib/decorators/EncryptedRoute.js +43 -119
  13. package/lib/decorators/EncryptedRoute.js.map +1 -1
  14. package/lib/decorators/PlainBody.js +24 -61
  15. package/lib/decorators/PlainBody.js.map +1 -1
  16. package/lib/decorators/SwaggerCustomizer.js +2 -2
  17. package/lib/decorators/SwaggerCustomizer.js.map +1 -1
  18. package/lib/decorators/TypedBody.js +12 -14
  19. package/lib/decorators/TypedBody.js.map +1 -1
  20. package/lib/decorators/TypedException.js +5 -5
  21. package/lib/decorators/TypedException.js.map +1 -1
  22. package/lib/decorators/TypedFormData.js +88 -291
  23. package/lib/decorators/TypedFormData.js.map +1 -1
  24. package/lib/decorators/TypedHeaders.js +6 -6
  25. package/lib/decorators/TypedHeaders.js.map +1 -1
  26. package/lib/decorators/TypedParam.d.ts +5 -6
  27. package/lib/decorators/TypedParam.js +14 -15
  28. package/lib/decorators/TypedParam.js.map +1 -1
  29. package/lib/decorators/TypedQuery.d.ts +2 -2
  30. package/lib/decorators/TypedQuery.js +52 -129
  31. package/lib/decorators/TypedQuery.js.map +1 -1
  32. package/lib/decorators/TypedRoute.js +31 -107
  33. package/lib/decorators/TypedRoute.js.map +1 -1
  34. package/lib/decorators/WebSocketRoute.d.ts +120 -0
  35. package/lib/decorators/WebSocketRoute.js +202 -0
  36. package/lib/decorators/WebSocketRoute.js.map +1 -0
  37. package/lib/decorators/internal/IWebSocketRouteReflect.d.ts +25 -0
  38. package/lib/decorators/internal/IWebSocketRouteReflect.js +3 -0
  39. package/lib/decorators/internal/IWebSocketRouteReflect.js.map +1 -0
  40. package/lib/decorators/internal/NoTransformConfigureError.js +1 -1
  41. package/lib/decorators/internal/NoTransformConfigureError.js.map +1 -1
  42. package/lib/decorators/internal/get_path_and_querify.js +67 -131
  43. package/lib/decorators/internal/get_path_and_querify.js.map +1 -1
  44. package/lib/decorators/internal/get_path_and_stringify.js +57 -71
  45. package/lib/decorators/internal/get_path_and_stringify.js.map +1 -1
  46. package/lib/decorators/internal/get_text_body.js +7 -46
  47. package/lib/decorators/internal/get_text_body.js.map +1 -1
  48. package/lib/decorators/internal/headers_to_object.js +3 -42
  49. package/lib/decorators/internal/headers_to_object.js.map +1 -1
  50. package/lib/decorators/internal/load_controller.js +29 -106
  51. package/lib/decorators/internal/load_controller.js.map +1 -1
  52. package/lib/decorators/internal/route_error.js +15 -65
  53. package/lib/decorators/internal/route_error.js.map +1 -1
  54. package/lib/decorators/internal/validate_request_body.js +44 -54
  55. package/lib/decorators/internal/validate_request_body.js.map +1 -1
  56. package/lib/decorators/internal/validate_request_form_data.js +36 -44
  57. package/lib/decorators/internal/validate_request_form_data.js.map +1 -1
  58. package/lib/decorators/internal/validate_request_headers.js +36 -44
  59. package/lib/decorators/internal/validate_request_headers.js.map +1 -1
  60. package/lib/decorators/internal/validate_request_query.js +36 -44
  61. package/lib/decorators/internal/validate_request_query.js.map +1 -1
  62. package/lib/index.js +1 -1
  63. package/lib/index.js.map +1 -1
  64. package/lib/module.d.ts +10 -9
  65. package/lib/module.js +10 -9
  66. package/lib/module.js.map +1 -1
  67. package/lib/programmers/PlainBodyProgrammer.js +29 -44
  68. package/lib/programmers/PlainBodyProgrammer.js.map +1 -1
  69. package/lib/programmers/TypedBodyProgrammer.js +57 -82
  70. package/lib/programmers/TypedBodyProgrammer.js.map +1 -1
  71. package/lib/programmers/TypedExceptionProgrammer.js +51 -54
  72. package/lib/programmers/TypedExceptionProgrammer.js.map +1 -1
  73. package/lib/programmers/TypedFormDataBodyProgrammer.js +50 -73
  74. package/lib/programmers/TypedFormDataBodyProgrammer.js.map +1 -1
  75. package/lib/programmers/TypedHeadersProgrammer.js +24 -43
  76. package/lib/programmers/TypedHeadersProgrammer.js.map +1 -1
  77. package/lib/programmers/TypedParamProgrammer.js +11 -28
  78. package/lib/programmers/TypedParamProgrammer.js.map +1 -1
  79. package/lib/programmers/TypedQueryBodyProgrammer.js +24 -43
  80. package/lib/programmers/TypedQueryBodyProgrammer.js.map +1 -1
  81. package/lib/programmers/TypedQueryProgrammer.js +24 -43
  82. package/lib/programmers/TypedQueryProgrammer.js.map +1 -1
  83. package/lib/programmers/TypedQueryRouteProgrammer.js +22 -39
  84. package/lib/programmers/TypedQueryRouteProgrammer.js.map +1 -1
  85. package/lib/programmers/TypedRouteProgrammer.js +22 -39
  86. package/lib/programmers/TypedRouteProgrammer.js.map +1 -1
  87. package/lib/programmers/http/HttpAssertQuerifyProgrammer.js +12 -29
  88. package/lib/programmers/http/HttpAssertQuerifyProgrammer.js.map +1 -1
  89. package/lib/programmers/http/HttpIsQuerifyProgrammer.js +10 -27
  90. package/lib/programmers/http/HttpIsQuerifyProgrammer.js.map +1 -1
  91. package/lib/programmers/http/HttpQuerifyProgrammer.js +33 -69
  92. package/lib/programmers/http/HttpQuerifyProgrammer.js.map +1 -1
  93. package/lib/programmers/http/HttpValidateQuerifyProgrammer.js +11 -28
  94. package/lib/programmers/http/HttpValidateQuerifyProgrammer.js.map +1 -1
  95. package/lib/programmers/internal/CoreMetadataUtil.js +12 -37
  96. package/lib/programmers/internal/CoreMetadataUtil.js.map +1 -1
  97. package/lib/transform.js +8 -8
  98. package/lib/transform.js.map +1 -1
  99. package/lib/transformers/FileTransformer.js +35 -66
  100. package/lib/transformers/FileTransformer.js.map +1 -1
  101. package/lib/transformers/MethodTransformer.js +39 -50
  102. package/lib/transformers/MethodTransformer.js.map +1 -1
  103. package/lib/transformers/NodeTransformer.js +8 -12
  104. package/lib/transformers/NodeTransformer.js.map +1 -1
  105. package/lib/transformers/ParameterDecoratorTransformer.js +75 -90
  106. package/lib/transformers/ParameterDecoratorTransformer.js.map +1 -1
  107. package/lib/transformers/ParameterTransformer.js +18 -24
  108. package/lib/transformers/ParameterTransformer.js.map +1 -1
  109. package/lib/transformers/TypedExceptionTransformer.js +24 -27
  110. package/lib/transformers/TypedExceptionTransformer.js.map +1 -1
  111. package/lib/transformers/TypedRouteTransformer.js +50 -88
  112. package/lib/transformers/TypedRouteTransformer.js.map +1 -1
  113. package/lib/transformers/WebSocketRouteTransformer.d.ts +6 -0
  114. package/lib/transformers/WebSocketRouteTransformer.js +72 -0
  115. package/lib/transformers/WebSocketRouteTransformer.js.map +1 -0
  116. package/lib/utils/ArrayUtil.d.ts +3 -0
  117. package/lib/utils/ArrayUtil.js +11 -0
  118. package/lib/utils/ArrayUtil.js.map +1 -0
  119. package/lib/utils/ExceptionManager.js +9 -31
  120. package/lib/utils/ExceptionManager.js.map +1 -1
  121. package/lib/utils/Singleton.js +6 -7
  122. package/lib/utils/Singleton.js.map +1 -1
  123. package/lib/utils/SourceFinder.js +38 -215
  124. package/lib/utils/SourceFinder.js.map +1 -1
  125. package/lib/utils/VersioningStrategy.d.ts +9 -0
  126. package/lib/utils/VersioningStrategy.js +17 -0
  127. package/lib/utils/VersioningStrategy.js.map +1 -0
  128. package/package.json +10 -6
  129. package/src/adaptors/WebSocketAdaptor.ts +416 -0
  130. package/src/decorators/TypedParam.ts +5 -6
  131. package/src/decorators/TypedQuery.ts +251 -251
  132. package/src/decorators/WebSocketRoute.ts +249 -0
  133. package/src/decorators/internal/IWebSocketRouteReflect.ts +23 -0
  134. package/src/decorators/internal/validate_request_body.ts +72 -72
  135. package/src/decorators/internal/validate_request_form_data.ts +75 -75
  136. package/src/decorators/internal/validate_request_headers.ts +83 -83
  137. package/src/decorators/internal/validate_request_query.ts +71 -71
  138. package/src/module.ts +20 -16
  139. package/src/transformers/MethodTransformer.ts +7 -4
  140. package/src/transformers/ParameterDecoratorTransformer.ts +129 -120
  141. package/src/transformers/TypedExceptionTransformer.ts +9 -13
  142. package/src/transformers/TypedRouteTransformer.ts +1 -8
  143. package/src/transformers/WebSocketRouteTransformer.ts +103 -0
  144. package/src/typings/get-function-location.d.ts +7 -0
  145. package/src/utils/ArrayUtil.ts +7 -0
  146. package/src/utils/VersioningStrategy.ts +27 -0
@@ -23,11 +23,7 @@ export namespace TypedRouteTransformer {
23
23
  const location: string = path.resolve(
24
24
  signature.declaration.getSourceFile().fileName,
25
25
  );
26
- if (
27
- LIB_PATHS.every((str) => location.indexOf(str) === -1) &&
28
- SRC_PATHS.every((str) => location !== str)
29
- )
30
- return null;
26
+ if (LIB_PATHS.every((str) => location.indexOf(str) === -1)) return null;
31
27
 
32
28
  // CHECK DUPLICATE BOOSTER
33
29
  if (decorator.expression.arguments.length >= 2) return false;
@@ -82,7 +78,4 @@ export namespace TypedRouteTransformer {
82
78
  const LIB_PATHS = CLASSES.map((cla) =>
83
79
  path.join("@nestia", "core", "lib", "decorators", `${cla}.d.ts`),
84
80
  );
85
- const SRC_PATHS = CLASSES.map((cla) =>
86
- path.resolve(path.join(__dirname, "..", "decorators", `${cla}.ts`)),
87
- );
88
81
  }
@@ -0,0 +1,103 @@
1
+ import path from "path";
2
+ import ts from "typescript";
3
+
4
+ import { INestiaTransformProject } from "../options/INestiaTransformProject";
5
+
6
+ export namespace WebSocketRouteTransformer {
7
+ export const validate =
8
+ (project: INestiaTransformProject) =>
9
+ (decorator: ts.Decorator, method: ts.MethodDeclaration): ts.Decorator => {
10
+ if (!ts.isCallExpression(decorator.expression)) return decorator;
11
+
12
+ // CHECK SIGNATURE
13
+ const signature: ts.Signature | undefined =
14
+ project.checker.getResolvedSignature(decorator.expression);
15
+ if (!signature || !signature.declaration) return decorator;
16
+ else if (isLocated(signature) === false) return decorator;
17
+
18
+ const errors: ts.DiagnosticWithLocation[] = [];
19
+ let accepted: boolean = false;
20
+
21
+ const report = (node: ts.Node, message: string) => {
22
+ errors.push(
23
+ ts.createDiagnosticForNode(node, {
24
+ category: ts.DiagnosticCategory.Error,
25
+ key: "nestia.core.WebSocketRoute",
26
+ code: "(nestia.core.WebSocketRoute)" as any,
27
+ message,
28
+ }),
29
+ );
30
+ };
31
+ method.parameters.forEach((param) => {
32
+ const paramDecos: ts.Decorator[] = (param.modifiers ?? []).filter((m) =>
33
+ ts.isDecorator(m),
34
+ ) as ts.Decorator[];
35
+ const category: string | null = (() => {
36
+ if (paramDecos.length !== 1) return null;
37
+ const decorator: ts.Decorator = paramDecos[0];
38
+ const signature: ts.Signature | undefined = ts.isCallExpression(
39
+ decorator.expression,
40
+ )
41
+ ? project.checker.getResolvedSignature(decorator.expression)
42
+ : undefined;
43
+ if (signature === undefined || isLocated(signature) === false)
44
+ return null;
45
+ return (
46
+ decorator.expression.getText().split(".").at(-1)?.split("(")[0] ??
47
+ null
48
+ );
49
+ })();
50
+ if (category === null)
51
+ report(
52
+ param,
53
+ `parameter ${JSON.stringify(param.name.getText())} is not decorated with nested function of WebSocketRoute module.`,
54
+ );
55
+ else if (category === "Acceptor") {
56
+ accepted = true;
57
+ if (
58
+ param.type
59
+ ?.getText()
60
+ .split(".")
61
+ .at(-1)
62
+ ?.startsWith("WebAcceptor") !== true
63
+ )
64
+ report(
65
+ param,
66
+ `parameter ${JSON.stringify(param.name.getText())} must have WebAcceptor<Header, Provider, Listener> type.`,
67
+ );
68
+ } else if (category === "Driver") {
69
+ if (
70
+ param.type?.getText().split(".").at(-1)?.startsWith("Driver") !==
71
+ true
72
+ )
73
+ report(
74
+ param,
75
+ `parameter ${JSON.stringify(param.name.getText())} must have Driver<Listener> type.`,
76
+ );
77
+ }
78
+ });
79
+ if (accepted === false)
80
+ report(
81
+ method,
82
+ `method ${JSON.stringify(method.name.getText())} must have at least one parameter decorated by @WebSocketRoute.Acceptor().`,
83
+ );
84
+ for (const e of errors) project.extras.addDiagnostic(e);
85
+ return decorator;
86
+ };
87
+ }
88
+
89
+ const isLocated = (signature: ts.Signature) => {
90
+ if (!signature.declaration) return false;
91
+ const location: string = path.resolve(
92
+ signature.declaration.getSourceFile().fileName,
93
+ );
94
+ return location.indexOf(LIB_PATH) !== -1;
95
+ };
96
+
97
+ const LIB_PATH = path.join(
98
+ "@nestia",
99
+ "core",
100
+ "lib",
101
+ "decorators",
102
+ `WebSocketRoute.d.ts`,
103
+ );
@@ -0,0 +1,7 @@
1
+ declare module "get-function-location" {
2
+ export default function (func: any): Promise<{
3
+ source: string;
4
+ line: number;
5
+ column: number;
6
+ }>;
7
+ }
@@ -0,0 +1,7 @@
1
+ export namespace ArrayUtil {
2
+ export function has<T>(array: T[], ...items: T[]): boolean {
3
+ return items.every(
4
+ (elem) => array.find((org) => org === elem) !== undefined,
5
+ );
6
+ }
7
+ }
@@ -0,0 +1,27 @@
1
+ import { VERSION_NEUTRAL, VersionValue } from "@nestjs/common/interfaces";
2
+
3
+ export namespace VersioningStrategy {
4
+ export interface IConfig {
5
+ prefix: string;
6
+ defaultVersion?: VersionValue;
7
+ }
8
+
9
+ export const cast = (
10
+ value: VersionValue | undefined,
11
+ ): Array<string | typeof VERSION_NEUTRAL> =>
12
+ value === undefined ? [] : Array.isArray(value) ? value : [value];
13
+
14
+ export const merge =
15
+ (config: IConfig | undefined) =>
16
+ (values: Array<string | typeof VERSION_NEUTRAL>): string[] => {
17
+ if (config === undefined) return [""];
18
+ const set: Set<string | typeof VERSION_NEUTRAL> = new Set(values);
19
+ const array: Array<string | typeof VERSION_NEUTRAL> =
20
+ set.size === 0 ? cast(config.defaultVersion) : Array.from(set);
21
+ return !!array?.length
22
+ ? array.map((x) =>
23
+ typeof x === "symbol" ? "" : `${config.prefix}${x}`,
24
+ )
25
+ : [];
26
+ };
27
+ }