-
Notifications
You must be signed in to change notification settings - Fork 69
/
IndexGenerator.java
134 lines (112 loc) · 5.28 KB
/
IndexGenerator.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
* Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package software.amazon.smithy.typescript.codegen;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import software.amazon.smithy.build.FileManifest;
import software.amazon.smithy.codegen.core.Symbol;
import software.amazon.smithy.codegen.core.SymbolProvider;
import software.amazon.smithy.model.Model;
import software.amazon.smithy.model.knowledge.TopDownIndex;
import software.amazon.smithy.model.shapes.OperationShape;
import software.amazon.smithy.model.shapes.ServiceShape;
import software.amazon.smithy.model.traits.PaginatedTrait;
import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator;
import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration;
import software.amazon.smithy.utils.SmithyInternalApi;
import software.amazon.smithy.waiters.WaitableTrait;
/**
* Generates an index to export the service client and each command.
*/
@SmithyInternalApi
final class IndexGenerator {
private IndexGenerator() {}
static void writeIndex(
TypeScriptSettings settings,
Model model,
SymbolProvider symbolProvider,
FileManifest fileManifest,
List<TypeScriptIntegration> integrations,
ProtocolGenerator protocolGenerator
) {
TypeScriptWriter writer = new TypeScriptWriter("");
if (settings.generateClient()) {
writeClientExports(settings, model, symbolProvider, writer, fileManifest, integrations);
}
if (settings.generateServerSdk() && protocolGenerator != null) {
writeProtocolExports(protocolGenerator, writer);
writer.write("export * from \"./server/index\";");
}
// write export statement for models
writer.write("export * from \"./models\";");
fileManifest.writeFile(Paths.get(CodegenUtils.SOURCE_FOLDER, "index.ts").toString(), writer.toString());
}
private static void writeProtocolExports(ProtocolGenerator protocolGenerator, TypeScriptWriter writer) {
String protocolName = ProtocolGenerator.getSanitizedName(protocolGenerator.getName());
writer.write("export * as $L from \"./protocols/$L\";", protocolName, protocolName);
}
static void writeServerIndex(
TypeScriptSettings settings,
Model model,
SymbolProvider symbolProvider,
FileManifest fileManifest
) {
TypeScriptWriter writer = new TypeScriptWriter("");
ServiceShape service = settings.getService(model);
Symbol symbol = symbolProvider.toSymbol(service);
// Write export statement for operations.
writer.write("export * from \"./operations\";");
writer.write("export * from \"./$L\"", symbol.getName());
writer.write("export { SmithyException } from $S", TypeScriptDependency.SERVER_COMMON.packageName);
fileManifest.writeFile(
Paths.get(CodegenUtils.SOURCE_FOLDER, ServerSymbolVisitor.SERVER_FOLDER, "index.ts").toString(),
writer.toString());
}
private static void writeClientExports(
TypeScriptSettings settings,
Model model,
SymbolProvider symbolProvider,
TypeScriptWriter writer,
FileManifest fileManifest,
List<TypeScriptIntegration> integrations
) {
ServiceShape service = settings.getService(model);
Symbol symbol = symbolProvider.toSymbol(service);
// Write export statement for bare-bones client.
writer.write("export * from \"./$L\";", symbol.getName());
// Write export statement for aggregated client.
String aggregatedClientName = symbol.getName().replace("Client", "");
writer.write("export * from \"./$L\";", aggregatedClientName);
// Write export statement for commands.
writer.write("export * from \"./commands\";");
TopDownIndex topDownIndex = TopDownIndex.of(model);
List<OperationShape> operations = new ArrayList<OperationShape>();
operations.addAll(topDownIndex.getContainedOperations(service));
// Export pagination, if present.
if (operations.stream().anyMatch(operation -> operation.hasTrait(PaginatedTrait.ID))) {
writer.write("export * from \"./pagination\";");
}
// Export waiters, if present.
if (operations.stream().anyMatch(operation -> operation.hasTrait(WaitableTrait.ID))) {
writer.write("export * from \"./waiters\";");
}
// Write each custom export.
for (TypeScriptIntegration integration : integrations) {
integration.writeAdditionalExports(settings, model, symbolProvider, writer);
}
fileManifest.writeFile(Paths.get(CodegenUtils.SOURCE_FOLDER, "index.ts").toString(), writer.toString());
}
}