@nestia/sdk 7.0.0-dev.20250607 → 7.0.0

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 (111) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +92 -92
  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/executable/internal/NestiaConfigLoader.js +4 -4
  15. package/lib/executable/sdk.js +12 -12
  16. package/package.json +5 -5
  17. package/src/INestiaConfig.ts +269 -269
  18. package/src/NestiaSdkApplication.ts +307 -307
  19. package/src/NestiaSwaggerComposer.ts +138 -138
  20. package/src/analyses/AccessorAnalyzer.ts +67 -67
  21. package/src/analyses/ConfigAnalyzer.ts +155 -155
  22. package/src/analyses/ExceptionAnalyzer.ts +154 -154
  23. package/src/analyses/GenericAnalyzer.ts +49 -49
  24. package/src/analyses/ImportAnalyzer.ts +171 -171
  25. package/src/analyses/PathAnalyzer.ts +69 -69
  26. package/src/analyses/ReflectControllerAnalyzer.ts +105 -105
  27. package/src/analyses/ReflectHttpOperationAnalyzer.ts +183 -183
  28. package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +71 -71
  29. package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +348 -348
  30. package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +127 -127
  31. package/src/analyses/ReflectMetadataAnalyzer.ts +44 -44
  32. package/src/analyses/ReflectWebSocketOperationAnalyzer.ts +172 -172
  33. package/src/analyses/SecurityAnalyzer.ts +25 -25
  34. package/src/analyses/TypedHttpRouteAnalyzer.ts +204 -204
  35. package/src/analyses/TypedWebSocketRouteAnalyzer.ts +33 -33
  36. package/src/decorators/OperationMetadata.ts +15 -15
  37. package/src/executable/internal/CommandParser.ts +15 -15
  38. package/src/executable/internal/NestiaConfigLoader.ts +78 -78
  39. package/src/executable/internal/NestiaSdkCommand.ts +103 -103
  40. package/src/executable/sdk.ts +75 -75
  41. package/src/generates/CloneGenerator.ts +66 -66
  42. package/src/generates/E2eGenerator.ts +32 -32
  43. package/src/generates/SdkGenerator.ts +160 -160
  44. package/src/generates/SwaggerGenerator.ts +284 -284
  45. package/src/generates/internal/E2eFileProgrammer.ts +205 -205
  46. package/src/generates/internal/FilePrinter.ts +53 -53
  47. package/src/generates/internal/ImportDictionary.ts +163 -163
  48. package/src/generates/internal/SdkAliasCollection.ts +255 -255
  49. package/src/generates/internal/SdkDistributionComposer.ts +103 -103
  50. package/src/generates/internal/SdkFileProgrammer.ts +116 -116
  51. package/src/generates/internal/SdkHttpCloneProgrammer.ts +124 -124
  52. package/src/generates/internal/SdkHttpCloneReferencer.ts +75 -75
  53. package/src/generates/internal/SdkHttpFunctionProgrammer.ts +276 -276
  54. package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +500 -500
  55. package/src/generates/internal/SdkHttpParameterProgrammer.ts +178 -178
  56. package/src/generates/internal/SdkHttpRouteProgrammer.ts +107 -107
  57. package/src/generates/internal/SdkHttpSimulationProgrammer.ts +340 -340
  58. package/src/generates/internal/SdkImportWizard.ts +55 -55
  59. package/src/generates/internal/SdkRouteDirectory.ts +18 -18
  60. package/src/generates/internal/SdkTypeProgrammer.ts +384 -384
  61. package/src/generates/internal/SdkTypeTagProgrammer.ts +102 -102
  62. package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +366 -366
  63. package/src/generates/internal/SdkWebSocketParameterProgrammer.ts +87 -87
  64. package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +279 -279
  65. package/src/generates/internal/SwaggerDescriptionComposer.ts +64 -64
  66. package/src/generates/internal/SwaggerOperationComposer.ts +119 -119
  67. package/src/generates/internal/SwaggerOperationParameterComposer.ts +177 -177
  68. package/src/generates/internal/SwaggerOperationResponseComposer.ts +110 -110
  69. package/src/index.ts +4 -4
  70. package/src/module.ts +3 -3
  71. package/src/structures/INestiaProject.ts +13 -13
  72. package/src/structures/INestiaSdkInput.ts +20 -20
  73. package/src/structures/IReflectApplication.ts +8 -8
  74. package/src/structures/IReflectController.ts +15 -15
  75. package/src/structures/IReflectHttpOperation.ts +26 -26
  76. package/src/structures/IReflectHttpOperationException.ts +19 -19
  77. package/src/structures/IReflectHttpOperationParameter.ts +81 -81
  78. package/src/structures/IReflectHttpOperationSuccess.ts +22 -22
  79. package/src/structures/IReflectOperationError.ts +26 -26
  80. package/src/structures/IReflectType.ts +4 -4
  81. package/src/structures/IReflectTypeImport.ts +4 -4
  82. package/src/structures/IReflectWebSocketOperation.ts +17 -17
  83. package/src/structures/IReflectWebSocketOperationParameter.ts +38 -38
  84. package/src/structures/ITypedApplication.ts +11 -11
  85. package/src/structures/ITypedHttpRoute.ts +41 -41
  86. package/src/structures/ITypedHttpRouteException.ts +15 -15
  87. package/src/structures/ITypedHttpRouteParameter.ts +41 -41
  88. package/src/structures/ITypedHttpRouteSuccess.ts +22 -22
  89. package/src/structures/ITypedWebSocketRoute.ts +24 -24
  90. package/src/structures/ITypedWebSocketRouteParameter.ts +3 -3
  91. package/src/structures/MethodType.ts +5 -5
  92. package/src/structures/ParamCategory.ts +1 -1
  93. package/src/structures/TypeEntry.ts +22 -22
  94. package/src/transform.ts +9 -9
  95. package/src/transformers/IOperationMetadata.ts +44 -44
  96. package/src/transformers/ISdkOperationTransformerContext.ts +8 -8
  97. package/src/transformers/SdkOperationProgrammer.ts +209 -209
  98. package/src/transformers/SdkOperationTransformer.ts +253 -253
  99. package/src/transformers/TextPlainValidator.ts +17 -17
  100. package/src/typings/get-function-location.d.ts +7 -7
  101. package/src/utils/ArrayUtil.ts +26 -26
  102. package/src/utils/FileRetriever.ts +22 -22
  103. package/src/utils/MapUtil.ts +14 -14
  104. package/src/utils/MetadataUtil.ts +26 -26
  105. package/src/utils/PathUtil.ts +10 -10
  106. package/src/utils/SourceFinder.ts +66 -66
  107. package/src/utils/StringUtil.ts +17 -17
  108. package/src/utils/StripEnums.ts +5 -5
  109. package/src/utils/VersioningStrategy.ts +28 -28
  110. package/src/validators/HttpHeadersValidator.ts +34 -34
  111. package/src/validators/HttpQueryValidator.ts +34 -34
@@ -1,209 +1,209 @@
1
- import ts from "typescript";
2
- import { CommentFactory } from "typia/lib/factories/CommentFactory";
3
- import { MetadataCollection } from "typia/lib/factories/MetadataCollection";
4
- import { MetadataFactory } from "typia/lib/factories/MetadataFactory";
5
- import { TypeFactory } from "typia/lib/factories/TypeFactory";
6
- import { Metadata } from "typia/lib/schemas/metadata/Metadata";
7
- import { MetadataObjectType } from "typia/lib/schemas/metadata/MetadataObjectType";
8
- import { ValidationPipe } from "typia/lib/typings/ValidationPipe";
9
- import { Escaper } from "typia/lib/utils/Escaper";
10
-
11
- import { ImportAnalyzer } from "../analyses/ImportAnalyzer";
12
- import { MetadataUtil } from "../utils/MetadataUtil";
13
- import { IOperationMetadata } from "./IOperationMetadata";
14
- import { ISdkOperationTransformerContext } from "./ISdkOperationTransformerContext";
15
-
16
- export namespace SdkOperationProgrammer {
17
- export interface IProps {
18
- context: ISdkOperationTransformerContext;
19
- generics: WeakMap<ts.Type, ts.Type>;
20
- node: ts.MethodDeclaration;
21
- symbol: ts.Symbol | undefined;
22
- exceptions: ts.TypeNode[];
23
- }
24
- export const write = (p: IProps): IOperationMetadata => {
25
- return {
26
- parameters: p.node.parameters.map((parameter, index) =>
27
- writeParameter({
28
- context: p.context,
29
- generics: p.generics,
30
- parameter,
31
- index,
32
- }),
33
- ),
34
- success: writeResponse({
35
- context: p.context,
36
- generics: p.generics,
37
- type: getReturnType({
38
- checker: p.context.checker,
39
- signature: p.context.checker.getSignatureFromDeclaration(p.node),
40
- }),
41
- }),
42
- exceptions: p.exceptions.map((e) =>
43
- writeResponse({
44
- context: p.context,
45
- generics: p.generics,
46
- type: p.context.checker.getTypeFromTypeNode(e),
47
- }),
48
- ),
49
- jsDocTags: p.symbol?.getJsDocTags() ?? [],
50
- description: p.symbol
51
- ? (CommentFactory.description(p.symbol) ?? null)
52
- : null,
53
- };
54
- };
55
-
56
- const writeParameter = (props: {
57
- context: ISdkOperationTransformerContext;
58
- generics: WeakMap<ts.Type, ts.Type>;
59
- parameter: ts.ParameterDeclaration;
60
- index: number;
61
- }): IOperationMetadata.IParameter => {
62
- const symbol: ts.Symbol | undefined =
63
- props.context.checker.getSymbolAtLocation(props.parameter);
64
- const common: IOperationMetadata.IResponse = writeResponse({
65
- context: props.context,
66
- generics: props.generics,
67
- type:
68
- props.context.checker.getTypeFromTypeNode(
69
- props.parameter.type ?? TypeFactory.keyword("any"),
70
- ) ?? null,
71
- });
72
- const optional: boolean = props.parameter.questionToken !== undefined;
73
- if (common.primitive.success)
74
- common.primitive.data.metadata.optional = optional;
75
- if (common.resolved.success)
76
- common.resolved.data.metadata.optional = optional;
77
-
78
- return {
79
- ...common,
80
- name: props.parameter.name.getText(),
81
- index: props.index,
82
- description: (symbol && CommentFactory.description(symbol)) ?? null,
83
- jsDocTags: symbol?.getJsDocTags() ?? [],
84
- };
85
- };
86
-
87
- const writeResponse = (p: {
88
- context: ISdkOperationTransformerContext;
89
- generics: WeakMap<ts.Type, ts.Type>;
90
- type: ts.Type | null;
91
- }): IOperationMetadata.IResponse => {
92
- const analyzed: ImportAnalyzer.IOutput = p.type
93
- ? ImportAnalyzer.analyze(p.context.checker, p.generics, p.type)
94
- : {
95
- type: { name: "any" },
96
- imports: [],
97
- };
98
- const [primitive, resolved] = [true, false].map((escape) =>
99
- MetadataFactory.analyze({
100
- checker: p.context.checker,
101
- transformer: p.context.transformer,
102
- options: {
103
- escape,
104
- constant: true,
105
- absorb: true,
106
- },
107
- collection: p.context.collection,
108
- type: p.type,
109
- }),
110
- );
111
- return {
112
- ...analyzed,
113
- primitive: writeSchema({
114
- collection: p.context.collection,
115
- result: primitive,
116
- }),
117
- resolved: writeSchema({
118
- collection: p.context.collection,
119
- result: resolved,
120
- }),
121
- };
122
- };
123
-
124
- const writeSchema = (p: {
125
- collection: MetadataCollection;
126
- result: ValidationPipe<Metadata, MetadataFactory.IError>;
127
- }): ValidationPipe<IOperationMetadata.ISchema, IOperationMetadata.IError> => {
128
- if (p.result.success === false)
129
- return {
130
- success: false,
131
- errors: p.result.errors.map((e) => ({
132
- name: e.name,
133
- accessor:
134
- e.explore.object !== null
135
- ? join({
136
- object: e.explore.object,
137
- key: e.explore.property,
138
- })
139
- : null,
140
- messages: e.messages,
141
- })),
142
- };
143
- const visited: Set<string> = iterateVisited(p.result.data);
144
- return {
145
- success: true,
146
- data: {
147
- components: {
148
- objects: p.collection
149
- .objects()
150
- .filter((o) => visited.has(o.name))
151
- .map((o) => o.toJSON()),
152
- aliases: p.collection
153
- .aliases()
154
- .filter((a) => visited.has(a.name))
155
- .map((a) => a.toJSON()),
156
- arrays: p.collection
157
- .arrays()
158
- .filter((a) => visited.has(a.name))
159
- .map((a) => a.toJSON()),
160
- tuples: p.collection
161
- .tuples()
162
- .filter((t) => visited.has(t.name))
163
- .map((t) => t.toJSON()),
164
- },
165
- metadata: p.result.data.toJSON(),
166
- },
167
- };
168
- };
169
-
170
- const getReturnType = (p: {
171
- checker: ts.TypeChecker;
172
- signature: ts.Signature | undefined;
173
- }): ts.Type | null => {
174
- const type: ts.Type | null =
175
- (p.signature && p.checker.getReturnTypeOfSignature(p.signature)) ?? null;
176
- if (type === null) return null;
177
- else if (type.symbol?.name === "Promise") {
178
- const generic: readonly ts.Type[] = p.checker.getTypeArguments(
179
- type as ts.TypeReference,
180
- );
181
- return generic[0] ?? null;
182
- }
183
- return type;
184
- };
185
- }
186
-
187
- const iterateVisited = (metadata: Metadata): Set<string> => {
188
- const names: Set<string> = new Set();
189
- MetadataUtil.visit((m) => {
190
- for (const alias of m.aliases) names.add(alias.type.name);
191
- for (const array of m.arrays) names.add(array.type.name);
192
- for (const tuple of m.tuples) names.add(tuple.type.name);
193
- for (const object of m.objects) names.add(object.type.name);
194
- })(metadata);
195
- return names;
196
- };
197
-
198
- const join = ({
199
- object,
200
- key,
201
- }: {
202
- object: MetadataObjectType;
203
- key: string | object | null;
204
- }) => {
205
- if (key === null) return object.name;
206
- else if (typeof key === "object") return `${object.name}[key]`;
207
- else if (Escaper.variable(key)) return `${object.name}.${key}`;
208
- return `${object.name}[${JSON.stringify(key)}]`;
209
- };
1
+ import ts from "typescript";
2
+ import { CommentFactory } from "typia/lib/factories/CommentFactory";
3
+ import { MetadataCollection } from "typia/lib/factories/MetadataCollection";
4
+ import { MetadataFactory } from "typia/lib/factories/MetadataFactory";
5
+ import { TypeFactory } from "typia/lib/factories/TypeFactory";
6
+ import { Metadata } from "typia/lib/schemas/metadata/Metadata";
7
+ import { MetadataObjectType } from "typia/lib/schemas/metadata/MetadataObjectType";
8
+ import { ValidationPipe } from "typia/lib/typings/ValidationPipe";
9
+ import { Escaper } from "typia/lib/utils/Escaper";
10
+
11
+ import { ImportAnalyzer } from "../analyses/ImportAnalyzer";
12
+ import { MetadataUtil } from "../utils/MetadataUtil";
13
+ import { IOperationMetadata } from "./IOperationMetadata";
14
+ import { ISdkOperationTransformerContext } from "./ISdkOperationTransformerContext";
15
+
16
+ export namespace SdkOperationProgrammer {
17
+ export interface IProps {
18
+ context: ISdkOperationTransformerContext;
19
+ generics: WeakMap<ts.Type, ts.Type>;
20
+ node: ts.MethodDeclaration;
21
+ symbol: ts.Symbol | undefined;
22
+ exceptions: ts.TypeNode[];
23
+ }
24
+ export const write = (p: IProps): IOperationMetadata => {
25
+ return {
26
+ parameters: p.node.parameters.map((parameter, index) =>
27
+ writeParameter({
28
+ context: p.context,
29
+ generics: p.generics,
30
+ parameter,
31
+ index,
32
+ }),
33
+ ),
34
+ success: writeResponse({
35
+ context: p.context,
36
+ generics: p.generics,
37
+ type: getReturnType({
38
+ checker: p.context.checker,
39
+ signature: p.context.checker.getSignatureFromDeclaration(p.node),
40
+ }),
41
+ }),
42
+ exceptions: p.exceptions.map((e) =>
43
+ writeResponse({
44
+ context: p.context,
45
+ generics: p.generics,
46
+ type: p.context.checker.getTypeFromTypeNode(e),
47
+ }),
48
+ ),
49
+ jsDocTags: p.symbol?.getJsDocTags() ?? [],
50
+ description: p.symbol
51
+ ? (CommentFactory.description(p.symbol) ?? null)
52
+ : null,
53
+ };
54
+ };
55
+
56
+ const writeParameter = (props: {
57
+ context: ISdkOperationTransformerContext;
58
+ generics: WeakMap<ts.Type, ts.Type>;
59
+ parameter: ts.ParameterDeclaration;
60
+ index: number;
61
+ }): IOperationMetadata.IParameter => {
62
+ const symbol: ts.Symbol | undefined =
63
+ props.context.checker.getSymbolAtLocation(props.parameter);
64
+ const common: IOperationMetadata.IResponse = writeResponse({
65
+ context: props.context,
66
+ generics: props.generics,
67
+ type:
68
+ props.context.checker.getTypeFromTypeNode(
69
+ props.parameter.type ?? TypeFactory.keyword("any"),
70
+ ) ?? null,
71
+ });
72
+ const optional: boolean = props.parameter.questionToken !== undefined;
73
+ if (common.primitive.success)
74
+ common.primitive.data.metadata.optional = optional;
75
+ if (common.resolved.success)
76
+ common.resolved.data.metadata.optional = optional;
77
+
78
+ return {
79
+ ...common,
80
+ name: props.parameter.name.getText(),
81
+ index: props.index,
82
+ description: (symbol && CommentFactory.description(symbol)) ?? null,
83
+ jsDocTags: symbol?.getJsDocTags() ?? [],
84
+ };
85
+ };
86
+
87
+ const writeResponse = (p: {
88
+ context: ISdkOperationTransformerContext;
89
+ generics: WeakMap<ts.Type, ts.Type>;
90
+ type: ts.Type | null;
91
+ }): IOperationMetadata.IResponse => {
92
+ const analyzed: ImportAnalyzer.IOutput = p.type
93
+ ? ImportAnalyzer.analyze(p.context.checker, p.generics, p.type)
94
+ : {
95
+ type: { name: "any" },
96
+ imports: [],
97
+ };
98
+ const [primitive, resolved] = [true, false].map((escape) =>
99
+ MetadataFactory.analyze({
100
+ checker: p.context.checker,
101
+ transformer: p.context.transformer,
102
+ options: {
103
+ escape,
104
+ constant: true,
105
+ absorb: true,
106
+ },
107
+ collection: p.context.collection,
108
+ type: p.type,
109
+ }),
110
+ );
111
+ return {
112
+ ...analyzed,
113
+ primitive: writeSchema({
114
+ collection: p.context.collection,
115
+ result: primitive,
116
+ }),
117
+ resolved: writeSchema({
118
+ collection: p.context.collection,
119
+ result: resolved,
120
+ }),
121
+ };
122
+ };
123
+
124
+ const writeSchema = (p: {
125
+ collection: MetadataCollection;
126
+ result: ValidationPipe<Metadata, MetadataFactory.IError>;
127
+ }): ValidationPipe<IOperationMetadata.ISchema, IOperationMetadata.IError> => {
128
+ if (p.result.success === false)
129
+ return {
130
+ success: false,
131
+ errors: p.result.errors.map((e) => ({
132
+ name: e.name,
133
+ accessor:
134
+ e.explore.object !== null
135
+ ? join({
136
+ object: e.explore.object,
137
+ key: e.explore.property,
138
+ })
139
+ : null,
140
+ messages: e.messages,
141
+ })),
142
+ };
143
+ const visited: Set<string> = iterateVisited(p.result.data);
144
+ return {
145
+ success: true,
146
+ data: {
147
+ components: {
148
+ objects: p.collection
149
+ .objects()
150
+ .filter((o) => visited.has(o.name))
151
+ .map((o) => o.toJSON()),
152
+ aliases: p.collection
153
+ .aliases()
154
+ .filter((a) => visited.has(a.name))
155
+ .map((a) => a.toJSON()),
156
+ arrays: p.collection
157
+ .arrays()
158
+ .filter((a) => visited.has(a.name))
159
+ .map((a) => a.toJSON()),
160
+ tuples: p.collection
161
+ .tuples()
162
+ .filter((t) => visited.has(t.name))
163
+ .map((t) => t.toJSON()),
164
+ },
165
+ metadata: p.result.data.toJSON(),
166
+ },
167
+ };
168
+ };
169
+
170
+ const getReturnType = (p: {
171
+ checker: ts.TypeChecker;
172
+ signature: ts.Signature | undefined;
173
+ }): ts.Type | null => {
174
+ const type: ts.Type | null =
175
+ (p.signature && p.checker.getReturnTypeOfSignature(p.signature)) ?? null;
176
+ if (type === null) return null;
177
+ else if (type.symbol?.name === "Promise") {
178
+ const generic: readonly ts.Type[] = p.checker.getTypeArguments(
179
+ type as ts.TypeReference,
180
+ );
181
+ return generic[0] ?? null;
182
+ }
183
+ return type;
184
+ };
185
+ }
186
+
187
+ const iterateVisited = (metadata: Metadata): Set<string> => {
188
+ const names: Set<string> = new Set();
189
+ MetadataUtil.visit((m) => {
190
+ for (const alias of m.aliases) names.add(alias.type.name);
191
+ for (const array of m.arrays) names.add(array.type.name);
192
+ for (const tuple of m.tuples) names.add(tuple.type.name);
193
+ for (const object of m.objects) names.add(object.type.name);
194
+ })(metadata);
195
+ return names;
196
+ };
197
+
198
+ const join = ({
199
+ object,
200
+ key,
201
+ }: {
202
+ object: MetadataObjectType;
203
+ key: string | object | null;
204
+ }) => {
205
+ if (key === null) return object.name;
206
+ else if (typeof key === "object") return `${object.name}[key]`;
207
+ else if (Escaper.variable(key)) return `${object.name}.${key}`;
208
+ return `${object.name}[${JSON.stringify(key)}]`;
209
+ };