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