@nestia/sdk 10.0.2 → 11.0.0-dev.20260305

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 (198) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +93 -93
  3. package/assets/bundle/api/HttpError.ts +1 -1
  4. package/assets/bundle/api/IConnection.ts +1 -1
  5. package/assets/bundle/api/Primitive.ts +1 -1
  6. package/assets/bundle/api/Resolved.ts +1 -1
  7. package/assets/bundle/api/index.ts +4 -4
  8. package/assets/bundle/api/module.ts +6 -6
  9. package/assets/bundle/distribute/README.md +37 -37
  10. package/assets/bundle/distribute/package.json +28 -28
  11. package/assets/bundle/distribute/tsconfig.json +109 -109
  12. package/assets/bundle/e2e/index.ts +42 -42
  13. package/assets/config/nestia.config.ts +97 -97
  14. package/lib/INestiaConfig.d.ts +1 -1
  15. package/lib/NestiaSdkApplication.js.map +1 -1
  16. package/lib/NestiaSwaggerComposer.d.ts +2 -1
  17. package/lib/NestiaSwaggerComposer.js +3 -3
  18. package/lib/NestiaSwaggerComposer.js.map +1 -1
  19. package/lib/analyses/AccessorAnalyzer.js +2 -2
  20. package/lib/analyses/AccessorAnalyzer.js.map +1 -1
  21. package/lib/analyses/DtoAnalyzer.js.map +1 -1
  22. package/lib/analyses/ImportAnalyzer.js.map +1 -1
  23. package/lib/analyses/ReflectHttpOperationAnalyzer.js +3 -3
  24. package/lib/analyses/ReflectHttpOperationAnalyzer.js.map +1 -1
  25. package/lib/analyses/ReflectHttpOperationExceptionAnalyzer.js +2 -2
  26. package/lib/analyses/ReflectHttpOperationExceptionAnalyzer.js.map +1 -1
  27. package/lib/analyses/ReflectHttpOperationParameterAnalyzer.js +7 -11
  28. package/lib/analyses/ReflectHttpOperationParameterAnalyzer.js.map +1 -1
  29. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js +6 -6
  30. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js.map +1 -1
  31. package/lib/analyses/TypedHttpRouteAnalyzer.d.ts +1 -1
  32. package/lib/analyses/TypedHttpRouteAnalyzer.js +6 -8
  33. package/lib/analyses/TypedHttpRouteAnalyzer.js.map +1 -1
  34. package/lib/executable/internal/NestiaConfigLoader.js +47 -43
  35. package/lib/executable/internal/NestiaConfigLoader.js.map +1 -1
  36. package/lib/executable/internal/NestiaSdkCommand.js.map +1 -1
  37. package/lib/executable/sdk.js +12 -12
  38. package/lib/generates/SwaggerGenerator.d.ts +1 -1
  39. package/lib/generates/SwaggerGenerator.js +6 -6
  40. package/lib/generates/SwaggerGenerator.js.map +1 -1
  41. package/lib/generates/internal/E2eFileProgrammer.js +8 -9
  42. package/lib/generates/internal/E2eFileProgrammer.js.map +1 -1
  43. package/lib/generates/internal/SdkAliasCollection.d.ts +2 -2
  44. package/lib/generates/internal/SdkAliasCollection.js +2 -2
  45. package/lib/generates/internal/SdkAliasCollection.js.map +1 -1
  46. package/lib/generates/internal/SdkDistributionComposer.js +1 -1
  47. package/lib/generates/internal/SdkHttpCloneProgrammer.js.map +1 -1
  48. package/lib/generates/internal/SdkHttpCloneReferencer.js.map +1 -1
  49. package/lib/generates/internal/SdkHttpFunctionProgrammer.js +11 -12
  50. package/lib/generates/internal/SdkHttpFunctionProgrammer.js.map +1 -1
  51. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js +13 -16
  52. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js.map +1 -1
  53. package/lib/generates/internal/SdkHttpRouteProgrammer.js +4 -4
  54. package/lib/generates/internal/SdkHttpRouteProgrammer.js.map +1 -1
  55. package/lib/generates/internal/SdkHttpSimulationProgrammer.js +12 -16
  56. package/lib/generates/internal/SdkHttpSimulationProgrammer.js.map +1 -1
  57. package/lib/generates/internal/SdkImportWizard.js +2 -2
  58. package/lib/generates/internal/SdkImportWizard.js.map +1 -1
  59. package/lib/generates/internal/SdkTypeProgrammer.d.ts +2 -3
  60. package/lib/generates/internal/SdkTypeProgrammer.js +6 -7
  61. package/lib/generates/internal/SdkTypeProgrammer.js.map +1 -1
  62. package/lib/generates/internal/SdkTypeTagProgrammer.d.ts +1 -1
  63. package/lib/generates/internal/SdkTypeTagProgrammer.js +11 -11
  64. package/lib/generates/internal/SdkTypeTagProgrammer.js.map +1 -1
  65. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js +6 -8
  66. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js.map +1 -1
  67. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js +2 -2
  68. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js.map +1 -1
  69. package/lib/generates/internal/SwaggerOperationComposer.d.ts +3 -3
  70. package/lib/generates/internal/SwaggerOperationComposer.js.map +1 -1
  71. package/lib/generates/internal/SwaggerOperationParameterComposer.d.ts +1 -1
  72. package/lib/generates/internal/SwaggerOperationParameterComposer.js +10 -8
  73. package/lib/generates/internal/SwaggerOperationParameterComposer.js.map +1 -1
  74. package/lib/generates/internal/SwaggerOperationResponseComposer.d.ts +3 -3
  75. package/lib/generates/internal/SwaggerOperationResponseComposer.js.map +1 -1
  76. package/lib/module.d.ts +1 -0
  77. package/lib/module.js +1 -0
  78. package/lib/module.js.map +1 -1
  79. package/lib/structures/IReflectHttpOperationException.d.ts +3 -4
  80. package/lib/structures/IReflectHttpOperationParameter.d.ts +3 -5
  81. package/lib/structures/IReflectHttpOperationSuccess.d.ts +3 -4
  82. package/lib/structures/ITypedApplication.d.ts +1 -1
  83. package/lib/structures/ITypedHttpRouteException.d.ts +2 -2
  84. package/lib/structures/ITypedHttpRouteParameter.d.ts +2 -2
  85. package/lib/structures/ITypedHttpRouteSuccess.d.ts +2 -2
  86. package/lib/transformers/IOperationMetadata.d.ts +2 -4
  87. package/lib/transformers/ISdkOperationTransformerContext.d.ts +1 -1
  88. package/lib/transformers/SdkOperationProgrammer.js +8 -10
  89. package/lib/transformers/SdkOperationProgrammer.js.map +1 -1
  90. package/lib/transformers/SdkOperationTransformer.js +5 -7
  91. package/lib/transformers/SdkOperationTransformer.js.map +1 -1
  92. package/lib/transformers/TextPlainValidator.d.ts +2 -2
  93. package/lib/transformers/TextPlainValidator.js.map +1 -1
  94. package/lib/utils/MetadataUtil.d.ts +2 -2
  95. package/lib/utils/MetadataUtil.js.map +1 -1
  96. package/lib/validators/HttpHeadersValidator.d.ts +2 -3
  97. package/lib/validators/HttpHeadersValidator.js +2 -2
  98. package/lib/validators/HttpHeadersValidator.js.map +1 -1
  99. package/lib/validators/HttpQueryValidator.d.ts +2 -3
  100. package/lib/validators/HttpQueryValidator.js +2 -2
  101. package/lib/validators/HttpQueryValidator.js.map +1 -1
  102. package/package.json +44 -30
  103. package/src/INestiaConfig.ts +267 -267
  104. package/src/NestiaSdkApplication.ts +307 -307
  105. package/src/NestiaSwaggerComposer.ts +140 -138
  106. package/src/analyses/AccessorAnalyzer.ts +67 -67
  107. package/src/analyses/ConfigAnalyzer.ts +155 -155
  108. package/src/analyses/DtoAnalyzer.ts +260 -260
  109. package/src/analyses/ExceptionAnalyzer.ts +154 -154
  110. package/src/analyses/GenericAnalyzer.ts +49 -49
  111. package/src/analyses/ImportAnalyzer.ts +126 -126
  112. package/src/analyses/PathAnalyzer.ts +69 -69
  113. package/src/analyses/ReflectControllerAnalyzer.ts +105 -105
  114. package/src/analyses/ReflectHttpOperationAnalyzer.ts +183 -183
  115. package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +72 -71
  116. package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +350 -348
  117. package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +126 -127
  118. package/src/analyses/ReflectMetadataAnalyzer.ts +44 -44
  119. package/src/analyses/ReflectWebSocketOperationAnalyzer.ts +172 -172
  120. package/src/analyses/SecurityAnalyzer.ts +25 -25
  121. package/src/analyses/TypedHttpRouteAnalyzer.ts +208 -204
  122. package/src/analyses/TypedWebSocketRouteAnalyzer.ts +33 -33
  123. package/src/decorators/OperationMetadata.ts +15 -15
  124. package/src/executable/internal/CommandParser.ts +15 -15
  125. package/src/executable/internal/NestiaConfigLoader.ts +85 -78
  126. package/src/executable/internal/NestiaSdkCommand.ts +107 -103
  127. package/src/executable/sdk.ts +75 -75
  128. package/src/generates/CloneGenerator.ts +66 -66
  129. package/src/generates/E2eGenerator.ts +32 -32
  130. package/src/generates/SdkGenerator.ts +160 -160
  131. package/src/generates/SwaggerGenerator.ts +285 -284
  132. package/src/generates/internal/E2eFileProgrammer.ts +196 -197
  133. package/src/generates/internal/FilePrinter.ts +64 -64
  134. package/src/generates/internal/ImportDictionary.ts +192 -192
  135. package/src/generates/internal/SdkAliasCollection.ts +260 -261
  136. package/src/generates/internal/SdkDistributionComposer.ts +103 -103
  137. package/src/generates/internal/SdkFileProgrammer.ts +110 -110
  138. package/src/generates/internal/SdkHttpCloneProgrammer.ts +126 -124
  139. package/src/generates/internal/SdkHttpCloneReferencer.ts +77 -77
  140. package/src/generates/internal/SdkHttpFunctionProgrammer.ts +278 -279
  141. package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +502 -500
  142. package/src/generates/internal/SdkHttpParameterProgrammer.ts +178 -178
  143. package/src/generates/internal/SdkHttpRouteProgrammer.ts +109 -108
  144. package/src/generates/internal/SdkHttpSimulationProgrammer.ts +312 -310
  145. package/src/generates/internal/SdkImportWizard.ts +62 -62
  146. package/src/generates/internal/SdkRouteDirectory.ts +18 -18
  147. package/src/generates/internal/SdkTypeProgrammer.ts +388 -385
  148. package/src/generates/internal/SdkTypeTagProgrammer.ts +114 -104
  149. package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +379 -381
  150. package/src/generates/internal/SdkWebSocketParameterProgrammer.ts +87 -87
  151. package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +302 -302
  152. package/src/generates/internal/SwaggerDescriptionComposer.ts +64 -64
  153. package/src/generates/internal/SwaggerOperationComposer.ts +119 -119
  154. package/src/generates/internal/SwaggerOperationParameterComposer.ts +161 -162
  155. package/src/generates/internal/SwaggerOperationResponseComposer.ts +110 -110
  156. package/src/index.ts +4 -4
  157. package/src/module.ts +4 -3
  158. package/src/structures/INestiaProject.ts +13 -13
  159. package/src/structures/INestiaSdkInput.ts +20 -20
  160. package/src/structures/IReflectApplication.ts +8 -8
  161. package/src/structures/IReflectController.ts +15 -15
  162. package/src/structures/IReflectHttpOperation.ts +26 -26
  163. package/src/structures/IReflectHttpOperationException.ts +18 -19
  164. package/src/structures/IReflectHttpOperationParameter.ts +79 -77
  165. package/src/structures/IReflectHttpOperationSuccess.ts +21 -22
  166. package/src/structures/IReflectImport.ts +6 -6
  167. package/src/structures/IReflectOperationError.ts +26 -26
  168. package/src/structures/IReflectType.ts +4 -4
  169. package/src/structures/IReflectWebSocketOperation.ts +17 -17
  170. package/src/structures/IReflectWebSocketOperationParameter.ts +36 -36
  171. package/src/structures/ITypedApplication.ts +11 -11
  172. package/src/structures/ITypedHttpRoute.ts +41 -41
  173. package/src/structures/ITypedHttpRouteException.ts +15 -15
  174. package/src/structures/ITypedHttpRouteParameter.ts +41 -41
  175. package/src/structures/ITypedHttpRouteSuccess.ts +22 -22
  176. package/src/structures/ITypedWebSocketRoute.ts +24 -24
  177. package/src/structures/ITypedWebSocketRouteParameter.ts +3 -3
  178. package/src/structures/MethodType.ts +5 -5
  179. package/src/structures/ParamCategory.ts +1 -1
  180. package/src/structures/TypeEntry.ts +22 -22
  181. package/src/transform.ts +9 -9
  182. package/src/transformers/IOperationMetadata.ts +46 -44
  183. package/src/transformers/ISdkOperationTransformerContext.ts +8 -8
  184. package/src/transformers/SdkOperationProgrammer.ts +240 -238
  185. package/src/transformers/SdkOperationTransformer.ts +248 -252
  186. package/src/transformers/TextPlainValidator.ts +17 -17
  187. package/src/typings/get-function-location.d.ts +7 -7
  188. package/src/utils/ArrayUtil.ts +26 -26
  189. package/src/utils/FileRetriever.ts +22 -22
  190. package/src/utils/MapUtil.ts +14 -14
  191. package/src/utils/MetadataUtil.ts +26 -26
  192. package/src/utils/PathUtil.ts +10 -10
  193. package/src/utils/SourceFinder.ts +63 -63
  194. package/src/utils/StringUtil.ts +17 -17
  195. package/src/utils/StripEnums.ts +5 -5
  196. package/src/utils/VersioningStrategy.ts +28 -28
  197. package/src/validators/HttpHeadersValidator.ts +36 -34
  198. package/src/validators/HttpQueryValidator.ts +36 -34
@@ -1,154 +1,154 @@
1
- // import path from "path";
2
- // import ts from "typescript";
3
- // import { MetadataCollection } from "typia/lib/factories/MetadataCollection";
4
- // import { MetadataFactory } from "typia/lib/factories/MetadataFactory";
5
- // import { Metadata } from "typia/lib/schemas/metadata/Metadata";
6
-
7
- // import { INestiaProject } from "../structures/INestiaProject";
8
- // import { IReflectController } from "../structures/IReflectController";
9
- // import { IReflectHttpOperation } from "../structures/IReflectHttpOperation";
10
- // import { ITypeTuple } from "../structures/ITypeTuple";
11
- // import { ITypedHttpRoute } from "../structures/ITypedHttpRoute";
12
- // import { GenericAnalyzer } from "./GenericAnalyzer";
13
- // import { ImportAnalyzer } from "./ImportAnalyzer";
14
-
15
- // export namespace ExceptionAnalyzer {
16
- // export const analyze =
17
- // (project: INestiaProject) =>
18
- // (props: {
19
- // generics: GenericAnalyzer.Dictionary;
20
- // imports: ImportAnalyzer.Dictionary;
21
- // controller: IReflectController;
22
- // operation: IReflectHttpOperation;
23
- // declaration: ts.MethodDeclaration;
24
- // }): Record<
25
- // number | "2XX" | "3XX" | "4XX" | "5XX",
26
- // ITypedHttpRoute.IOutput
27
- // > => {
28
- // const output: Record<
29
- // number | "2XX" | "3XX" | "4XX" | "5XX",
30
- // ITypedHttpRoute.IOutput
31
- // > = {} as any;
32
- // for (const decorator of props.declaration.modifiers ?? [])
33
- // if (ts.isDecorator(decorator))
34
- // analyzeTyped(project)({
35
- // ...props,
36
- // output,
37
- // decorator,
38
- // });
39
- // return output;
40
- // };
41
-
42
- // const analyzeTyped =
43
- // (project: INestiaProject) =>
44
- // (props: {
45
- // generics: GenericAnalyzer.Dictionary;
46
- // imports: ImportAnalyzer.Dictionary;
47
- // controller: IReflectController;
48
- // operation: IReflectHttpOperation;
49
- // output: Record<
50
- // number | "2XX" | "3XX" | "4XX" | "5XX",
51
- // ITypedHttpRoute.IOutput
52
- // >;
53
- // decorator: ts.Decorator;
54
- // }): boolean => {
55
- // // CHECK DECORATOR
56
- // if (!ts.isCallExpression(props.decorator.expression)) return false;
57
- // else if ((props.decorator.expression.typeArguments ?? []).length !== 1)
58
- // return false;
59
-
60
- // // CHECK SIGNATURE
61
- // const signature: ts.Signature | undefined =
62
- // project.checker.getResolvedSignature(props.decorator.expression);
63
- // if (!signature || !signature.declaration) return false;
64
- // else if (
65
- // path
66
- // .resolve(signature.declaration.getSourceFile().fileName)
67
- // .indexOf(TYPED_EXCEPTION_PATH) === -1
68
- // )
69
- // return false;
70
-
71
- // // GET TYPE INFO
72
- // const status: string | null = getStatus(project.checker)(
73
- // props.decorator.expression.arguments[0] ?? null,
74
- // );
75
- // if (status === null) return false;
76
-
77
- // const node: ts.TypeNode = props.decorator.expression.typeArguments![0];
78
- // const type: ts.Type = project.checker.getTypeFromTypeNode(node);
79
- // if (type.isTypeParameter()) {
80
- // project.errors.push({
81
- // file: props.controller.file,
82
- // controller: props.controller.name,
83
- // function: props.operation.name,
84
- // message: "TypedException() without generic argument specification.",
85
- // });
86
- // return false;
87
- // }
88
-
89
- // const tuple: ITypeTuple | null = ImportAnalyzer.analyze(project.checker)({
90
- // generics: props.generics,
91
- // imports: props.imports,
92
- // type,
93
- // });
94
- // if (tuple === null) {
95
- // project.errors.push({
96
- // file: props.controller.file,
97
- // controller: props.controller.name,
98
- // function: props.operation.name,
99
- // message: `TypeException() with unknown type on ${status} status.`,
100
- // });
101
- // return false;
102
- // }
103
-
104
- // // DO ASSIGN
105
- // const matched: IReflectHttpOperation.IException[] = Object.entries(
106
- // props.operation.exceptions,
107
- // )
108
- // .filter(([key]) => status === key)
109
- // .map(([_key, value]) => value);
110
- // for (const m of matched)
111
- // props.output[m.status] = {
112
- // type: tuple.type,
113
- // typeName: tuple.typeName,
114
- // contentType: "application/json",
115
- // description: m.description,
116
- // };
117
- // return true;
118
- // };
119
-
120
- // const getStatus =
121
- // (checker: ts.TypeChecker) =>
122
- // (expression: ts.Expression | null): string | null => {
123
- // if (expression === null) return null;
124
-
125
- // const type: ts.Type = checker.getTypeAtLocation(expression);
126
- // const result = MetadataFactory.analyze(checker)({
127
- // escape: true,
128
- // constant: true,
129
- // absorb: true,
130
- // })(new MetadataCollection())(type);
131
- // if (false === result.success) return null;
132
-
133
- // const meta: Metadata = result.data;
134
- // if (meta.constants.length === 1)
135
- // return meta.constants[0].values[0].value.toString();
136
- // else if (meta.escaped && meta.escaped.returns.constants.length === 1)
137
- // return meta.escaped.returns.constants[0].values[0].value.toString();
138
- // else if (ts.isStringLiteral(expression)) return expression.text;
139
- // else if (ts.isNumericLiteral(expression)) {
140
- // const value: number = Number(expression.text.split("_").join(""));
141
- // if (false === isNaN(value)) return value.toString();
142
- // }
143
- // return null;
144
- // };
145
- // }
146
-
147
- // const TYPED_EXCEPTION_PATH = path.join(
148
- // "node_modules",
149
- // "@nestia",
150
- // "core",
151
- // "lib",
152
- // "decorators",
153
- // "TypedException.d.ts",
154
- // );
1
+ // import path from "path";
2
+ // import ts from "typescript";
3
+ // import { MetadataCollection } from "typia/lib/factories/MetadataCollection";
4
+ // import { MetadataFactory } from "typia/lib/factories/MetadataFactory";
5
+ // import { Metadata } from "typia/lib/schemas/metadata/Metadata";
6
+
7
+ // import { INestiaProject } from "../structures/INestiaProject";
8
+ // import { IReflectController } from "../structures/IReflectController";
9
+ // import { IReflectHttpOperation } from "../structures/IReflectHttpOperation";
10
+ // import { ITypeTuple } from "../structures/ITypeTuple";
11
+ // import { ITypedHttpRoute } from "../structures/ITypedHttpRoute";
12
+ // import { GenericAnalyzer } from "./GenericAnalyzer";
13
+ // import { ImportAnalyzer } from "./ImportAnalyzer";
14
+
15
+ // export namespace ExceptionAnalyzer {
16
+ // export const analyze =
17
+ // (project: INestiaProject) =>
18
+ // (props: {
19
+ // generics: GenericAnalyzer.Dictionary;
20
+ // imports: ImportAnalyzer.Dictionary;
21
+ // controller: IReflectController;
22
+ // operation: IReflectHttpOperation;
23
+ // declaration: ts.MethodDeclaration;
24
+ // }): Record<
25
+ // number | "2XX" | "3XX" | "4XX" | "5XX",
26
+ // ITypedHttpRoute.IOutput
27
+ // > => {
28
+ // const output: Record<
29
+ // number | "2XX" | "3XX" | "4XX" | "5XX",
30
+ // ITypedHttpRoute.IOutput
31
+ // > = {} as any;
32
+ // for (const decorator of props.declaration.modifiers ?? [])
33
+ // if (ts.isDecorator(decorator))
34
+ // analyzeTyped(project)({
35
+ // ...props,
36
+ // output,
37
+ // decorator,
38
+ // });
39
+ // return output;
40
+ // };
41
+
42
+ // const analyzeTyped =
43
+ // (project: INestiaProject) =>
44
+ // (props: {
45
+ // generics: GenericAnalyzer.Dictionary;
46
+ // imports: ImportAnalyzer.Dictionary;
47
+ // controller: IReflectController;
48
+ // operation: IReflectHttpOperation;
49
+ // output: Record<
50
+ // number | "2XX" | "3XX" | "4XX" | "5XX",
51
+ // ITypedHttpRoute.IOutput
52
+ // >;
53
+ // decorator: ts.Decorator;
54
+ // }): boolean => {
55
+ // // CHECK DECORATOR
56
+ // if (!ts.isCallExpression(props.decorator.expression)) return false;
57
+ // else if ((props.decorator.expression.typeArguments ?? []).length !== 1)
58
+ // return false;
59
+
60
+ // // CHECK SIGNATURE
61
+ // const signature: ts.Signature | undefined =
62
+ // project.checker.getResolvedSignature(props.decorator.expression);
63
+ // if (!signature || !signature.declaration) return false;
64
+ // else if (
65
+ // path
66
+ // .resolve(signature.declaration.getSourceFile().fileName)
67
+ // .indexOf(TYPED_EXCEPTION_PATH) === -1
68
+ // )
69
+ // return false;
70
+
71
+ // // GET TYPE INFO
72
+ // const status: string | null = getStatus(project.checker)(
73
+ // props.decorator.expression.arguments[0] ?? null,
74
+ // );
75
+ // if (status === null) return false;
76
+
77
+ // const node: ts.TypeNode = props.decorator.expression.typeArguments![0];
78
+ // const type: ts.Type = project.checker.getTypeFromTypeNode(node);
79
+ // if (type.isTypeParameter()) {
80
+ // project.errors.push({
81
+ // file: props.controller.file,
82
+ // controller: props.controller.name,
83
+ // function: props.operation.name,
84
+ // message: "TypedException() without generic argument specification.",
85
+ // });
86
+ // return false;
87
+ // }
88
+
89
+ // const tuple: ITypeTuple | null = ImportAnalyzer.analyze(project.checker)({
90
+ // generics: props.generics,
91
+ // imports: props.imports,
92
+ // type,
93
+ // });
94
+ // if (tuple === null) {
95
+ // project.errors.push({
96
+ // file: props.controller.file,
97
+ // controller: props.controller.name,
98
+ // function: props.operation.name,
99
+ // message: `TypeException() with unknown type on ${status} status.`,
100
+ // });
101
+ // return false;
102
+ // }
103
+
104
+ // // DO ASSIGN
105
+ // const matched: IReflectHttpOperation.IException[] = Object.entries(
106
+ // props.operation.exceptions,
107
+ // )
108
+ // .filter(([key]) => status === key)
109
+ // .map(([_key, value]) => value);
110
+ // for (const m of matched)
111
+ // props.output[m.status] = {
112
+ // type: tuple.type,
113
+ // typeName: tuple.typeName,
114
+ // contentType: "application/json",
115
+ // description: m.description,
116
+ // };
117
+ // return true;
118
+ // };
119
+
120
+ // const getStatus =
121
+ // (checker: ts.TypeChecker) =>
122
+ // (expression: ts.Expression | null): string | null => {
123
+ // if (expression === null) return null;
124
+
125
+ // const type: ts.Type = checker.getTypeAtLocation(expression);
126
+ // const result = MetadataFactory.analyze(checker)({
127
+ // escape: true,
128
+ // constant: true,
129
+ // absorb: true,
130
+ // })(new MetadataCollection())(type);
131
+ // if (false === result.success) return null;
132
+
133
+ // const meta: Metadata = result.data;
134
+ // if (meta.constants.length === 1)
135
+ // return meta.constants[0].values[0].value.toString();
136
+ // else if (meta.escaped && meta.escaped.returns.constants.length === 1)
137
+ // return meta.escaped.returns.constants[0].values[0].value.toString();
138
+ // else if (ts.isStringLiteral(expression)) return expression.text;
139
+ // else if (ts.isNumericLiteral(expression)) {
140
+ // const value: number = Number(expression.text.split("_").join(""));
141
+ // if (false === isNaN(value)) return value.toString();
142
+ // }
143
+ // return null;
144
+ // };
145
+ // }
146
+
147
+ // const TYPED_EXCEPTION_PATH = path.join(
148
+ // "node_modules",
149
+ // "@nestia",
150
+ // "core",
151
+ // "lib",
152
+ // "decorators",
153
+ // "TypedException.d.ts",
154
+ // );
@@ -1,49 +1,49 @@
1
- import ts from "typescript";
2
-
3
- export namespace GenericAnalyzer {
4
- export function analyze(
5
- checker: ts.TypeChecker,
6
- classNode: ts.ClassDeclaration,
7
- ): WeakMap<ts.Type, ts.Type> {
8
- const dict: WeakMap<ts.Type, ts.Type> = new WeakMap();
9
- explore(checker, dict, classNode);
10
- return dict;
11
- }
12
-
13
- function explore(
14
- checker: ts.TypeChecker,
15
- dict: WeakMap<ts.Type, ts.Type>,
16
- classNode: ts.ClassDeclaration,
17
- ): void {
18
- if (classNode.heritageClauses === undefined) return;
19
-
20
- for (const heritage of classNode.heritageClauses)
21
- for (const hType of heritage.types) {
22
- // MUST BE CLASS
23
- const expression: ts.Type = checker.getTypeAtLocation(hType.expression);
24
- const superNode: ts.Declaration | undefined =
25
- expression.symbol?.getDeclarations?.()?.[0];
26
-
27
- if (superNode === undefined || !ts.isClassDeclaration(superNode))
28
- continue;
29
-
30
- // SPECIFY GENERICS
31
- const usages: ReadonlyArray<ts.TypeNode> = hType.typeArguments || [];
32
- const parameters: ReadonlyArray<ts.TypeParameterDeclaration> =
33
- superNode.typeParameters || [];
34
-
35
- parameters.forEach((param, index) => {
36
- const paramType: ts.Type = checker.getTypeAtLocation(param);
37
- const usageType: ts.Type =
38
- usages[index] !== undefined
39
- ? checker.getTypeAtLocation(usages[index])
40
- : checker.getTypeAtLocation(param.default!);
41
-
42
- dict.set(paramType, usageType);
43
- });
44
-
45
- // RECURSIVE EXPLORATION
46
- explore(checker, dict, superNode);
47
- }
48
- }
49
- }
1
+ import ts from "typescript";
2
+
3
+ export namespace GenericAnalyzer {
4
+ export function analyze(
5
+ checker: ts.TypeChecker,
6
+ classNode: ts.ClassDeclaration,
7
+ ): WeakMap<ts.Type, ts.Type> {
8
+ const dict: WeakMap<ts.Type, ts.Type> = new WeakMap();
9
+ explore(checker, dict, classNode);
10
+ return dict;
11
+ }
12
+
13
+ function explore(
14
+ checker: ts.TypeChecker,
15
+ dict: WeakMap<ts.Type, ts.Type>,
16
+ classNode: ts.ClassDeclaration,
17
+ ): void {
18
+ if (classNode.heritageClauses === undefined) return;
19
+
20
+ for (const heritage of classNode.heritageClauses)
21
+ for (const hType of heritage.types) {
22
+ // MUST BE CLASS
23
+ const expression: ts.Type = checker.getTypeAtLocation(hType.expression);
24
+ const superNode: ts.Declaration | undefined =
25
+ expression.symbol?.getDeclarations?.()?.[0];
26
+
27
+ if (superNode === undefined || !ts.isClassDeclaration(superNode))
28
+ continue;
29
+
30
+ // SPECIFY GENERICS
31
+ const usages: ReadonlyArray<ts.TypeNode> = hType.typeArguments || [];
32
+ const parameters: ReadonlyArray<ts.TypeParameterDeclaration> =
33
+ superNode.typeParameters || [];
34
+
35
+ parameters.forEach((param, index) => {
36
+ const paramType: ts.Type = checker.getTypeAtLocation(param);
37
+ const usageType: ts.Type =
38
+ usages[index] !== undefined
39
+ ? checker.getTypeAtLocation(usages[index])
40
+ : checker.getTypeAtLocation(param.default!);
41
+
42
+ dict.set(paramType, usageType);
43
+ });
44
+
45
+ // RECURSIVE EXPLORATION
46
+ explore(checker, dict, superNode);
47
+ }
48
+ }
49
+ }
@@ -1,126 +1,126 @@
1
- import path from "path";
2
- import ts from "typescript";
3
-
4
- import { IReflectImport } from "../structures/IReflectImport";
5
- import { MapUtil } from "../utils/MapUtil";
6
-
7
- export namespace ImportAnalyzer {
8
- export const analyze = (file: ts.SourceFile): IReflectImport[] =>
9
- file.statements
10
- .filter(ts.isImportDeclaration)
11
- .map((imp) => {
12
- const clause: ts.ImportClause | undefined = imp.importClause;
13
- if (clause === undefined) return null;
14
- try {
15
- // no real position
16
- // import statement generated by transformer like typia
17
- imp.moduleSpecifier.getText();
18
- } catch {
19
- return null;
20
- }
21
-
22
- const reflect: IReflectImport = {
23
- file: normalizePath(
24
- path.dirname(file.fileName),
25
- ts.isStringLiteral(imp.moduleSpecifier)
26
- ? imp.moduleSpecifier.text
27
- : escapeQuotes(imp.moduleSpecifier.getText()),
28
- ),
29
- elements: [],
30
- default: null,
31
- asterisk: null,
32
- };
33
- if (clause.name) reflect.default = clause.name.getText();
34
- if (clause.namedBindings === undefined) return reflect;
35
- else if (ts.isNamedImports(clause.namedBindings))
36
- reflect.elements = clause.namedBindings.elements.map((e) =>
37
- e.name.getText(),
38
- );
39
- else if (ts.isNamespaceImport(clause.namedBindings))
40
- reflect.asterisk = clause.namedBindings.name.getText();
41
- return reflect;
42
- })
43
- .filter((r) => r !== null);
44
-
45
- export const merge = (imports: IReflectImport[]): IReflectImport[] => {
46
- // group by files
47
- const fileGroups: Map<string, IReflectImport[]> = new Map();
48
- for (const imp of imports) {
49
- const array: IReflectImport[] = MapUtil.take(
50
- fileGroups,
51
- imp.file,
52
- () => [],
53
- );
54
- array.push(imp);
55
- }
56
- return Array.from(fileGroups.entries())
57
- .map(([key, value]) => mergeGroup(key, value))
58
- .flat();
59
- };
60
-
61
- function mergeGroup(
62
- file: string,
63
- imports: IReflectImport[],
64
- ): IReflectImport[] {
65
- const allStarImports: IReflectImport[] = Array.from(
66
- new Set(
67
- imports
68
- .filter((imp) => imp.asterisk !== null)
69
- .map((imp) => imp.asterisk!),
70
- ),
71
- )
72
- .sort()
73
- .map(
74
- (allStarImport) =>
75
- ({
76
- file,
77
- elements: [],
78
- default: null,
79
- asterisk: allStarImport,
80
- }) satisfies IReflectImport,
81
- );
82
- const defaultImports: IReflectImport[] = Array.from(
83
- new Set(
84
- imports
85
- .filter((imp) => imp.default !== null)
86
- .map((imp) => imp.default!),
87
- ),
88
- )
89
- .sort()
90
- .map(
91
- (defaultImport) =>
92
- ({
93
- file,
94
- elements: [],
95
- default: defaultImport,
96
- asterisk: null,
97
- }) satisfies IReflectImport,
98
- );
99
- const instances: Set<string> = new Set(
100
- imports.map((imp) => imp.elements).flat(),
101
- );
102
- if (instances.size !== 0) {
103
- if (defaultImports.length !== 0)
104
- defaultImports[0].elements = Array.from(instances).sort();
105
- else
106
- defaultImports.push({
107
- file,
108
- elements: Array.from(instances).sort(),
109
- default: null,
110
- asterisk: null,
111
- });
112
- }
113
- return [...allStarImports, ...defaultImports];
114
- }
115
-
116
- function escapeQuotes(str: string): string {
117
- if (str.startsWith("'") && str.endsWith("'")) return str.slice(1, -1);
118
- else if (str.startsWith('"') && str.endsWith('"')) return str.slice(1, -1);
119
- return str;
120
- }
121
-
122
- function normalizePath(root: string, str: string): string {
123
- if (str.startsWith(".")) return path.resolve(root, str);
124
- return `node_modules/${str}`;
125
- }
126
- }
1
+ import path from "path";
2
+ import ts from "typescript";
3
+
4
+ import { IReflectImport } from "../structures/IReflectImport";
5
+ import { MapUtil } from "../utils/MapUtil";
6
+
7
+ export namespace ImportAnalyzer {
8
+ export const analyze = (file: ts.SourceFile): IReflectImport[] =>
9
+ file.statements
10
+ .filter(ts.isImportDeclaration)
11
+ .map((imp) => {
12
+ const clause: ts.ImportClause | undefined = imp.importClause;
13
+ if (clause === undefined) return null;
14
+ try {
15
+ // no real position
16
+ // import statement generated by transformer like typia
17
+ imp.moduleSpecifier.getText();
18
+ } catch {
19
+ return null;
20
+ }
21
+
22
+ const reflect: IReflectImport = {
23
+ file: normalizePath(
24
+ path.dirname(file.fileName),
25
+ ts.isStringLiteral(imp.moduleSpecifier)
26
+ ? imp.moduleSpecifier.text
27
+ : escapeQuotes(imp.moduleSpecifier.getText()),
28
+ ),
29
+ elements: [],
30
+ default: null,
31
+ asterisk: null,
32
+ };
33
+ if (clause.name) reflect.default = clause.name.getText();
34
+ if (clause.namedBindings === undefined) return reflect;
35
+ else if (ts.isNamedImports(clause.namedBindings))
36
+ reflect.elements = clause.namedBindings.elements.map((e) =>
37
+ e.name.getText(),
38
+ );
39
+ else if (ts.isNamespaceImport(clause.namedBindings))
40
+ reflect.asterisk = clause.namedBindings.name.getText();
41
+ return reflect;
42
+ })
43
+ .filter((r) => r !== null);
44
+
45
+ export const merge = (imports: IReflectImport[]): IReflectImport[] => {
46
+ // group by files
47
+ const fileGroups: Map<string, IReflectImport[]> = new Map();
48
+ for (const imp of imports) {
49
+ const array: IReflectImport[] = MapUtil.take(
50
+ fileGroups,
51
+ imp.file,
52
+ () => [],
53
+ );
54
+ array.push(imp);
55
+ }
56
+ return Array.from(fileGroups.entries())
57
+ .map(([key, value]) => mergeGroup(key, value))
58
+ .flat();
59
+ };
60
+
61
+ function mergeGroup(
62
+ file: string,
63
+ imports: IReflectImport[],
64
+ ): IReflectImport[] {
65
+ const allStarImports: IReflectImport[] = Array.from(
66
+ new Set(
67
+ imports
68
+ .filter((imp) => imp.asterisk !== null)
69
+ .map((imp) => imp.asterisk!),
70
+ ),
71
+ )
72
+ .sort()
73
+ .map(
74
+ (allStarImport) =>
75
+ ({
76
+ file,
77
+ elements: [],
78
+ default: null,
79
+ asterisk: allStarImport,
80
+ }) satisfies IReflectImport,
81
+ );
82
+ const defaultImports: IReflectImport[] = Array.from(
83
+ new Set(
84
+ imports
85
+ .filter((imp) => imp.default !== null)
86
+ .map((imp) => imp.default!),
87
+ ),
88
+ )
89
+ .sort()
90
+ .map(
91
+ (defaultImport) =>
92
+ ({
93
+ file,
94
+ elements: [],
95
+ default: defaultImport,
96
+ asterisk: null,
97
+ }) satisfies IReflectImport,
98
+ );
99
+ const instances: Set<string> = new Set(
100
+ imports.map((imp) => imp.elements).flat(),
101
+ );
102
+ if (instances.size !== 0) {
103
+ if (defaultImports.length !== 0)
104
+ defaultImports[0]!.elements = Array.from(instances).sort();
105
+ else
106
+ defaultImports.push({
107
+ file,
108
+ elements: Array.from(instances).sort(),
109
+ default: null,
110
+ asterisk: null,
111
+ });
112
+ }
113
+ return [...allStarImports, ...defaultImports];
114
+ }
115
+
116
+ function escapeQuotes(str: string): string {
117
+ if (str.startsWith("'") && str.endsWith("'")) return str.slice(1, -1);
118
+ else if (str.startsWith('"') && str.endsWith('"')) return str.slice(1, -1);
119
+ return str;
120
+ }
121
+
122
+ function normalizePath(root: string, str: string): string {
123
+ if (str.startsWith(".")) return path.resolve(root, str);
124
+ return `node_modules/${str}`;
125
+ }
126
+ }