Skip to content

Commit 96b2a66

Browse files
trivikrsrchase
authored andcommitted
feat: move source files to "src" folder (smithy-lang#434)
1 parent 9d402e7 commit 96b2a66

24 files changed

+93
-80
lines changed

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/CodegenUtils.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
@SmithyUnstableApi
3737
public final class CodegenUtils {
3838

39+
public static final String SOURCE_FOLDER = "src";
40+
3941
private CodegenUtils() {}
4042

4143
/**

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/CodegenVisitor.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ void execute() {
236236
String baseName = protocol.getName().toLowerCase(Locale.US)
237237
.replace("-", "_")
238238
.replace(".", "_");
239-
String protocolTestFileName = String.format("tests/functional/%s.spec.ts", baseName);
239+
String protocolTestFileName = String.format("test/functional/%s.spec.ts", baseName);
240240
context.setDeferredWriter(() -> writers.checkoutFileWriter(protocolTestFileName));
241241
protocolGenerator.generateProtocolTests(context);
242242
}
@@ -373,7 +373,8 @@ public Void serviceShape(ServiceShape shape) {
373373

374374
if (protocolGenerator != null) {
375375
LOGGER.info("Generating serde for protocol " + protocolGenerator.getName() + " on " + shape.getId());
376-
String fileName = "protocols/" + ProtocolGenerator.getSanitizedName(protocolGenerator.getName()) + ".ts";
376+
String fileName = CodegenUtils.SOURCE_FOLDER + "/protocols/"
377+
+ ProtocolGenerator.getSanitizedName(protocolGenerator.getName()) + ".ts";
377378
writers.useFileWriter(fileName, writer -> {
378379
ProtocolGenerator.GenerationContext context = new ProtocolGenerator.GenerationContext();
379380
context.setProtocolName(protocolGenerator.getName());

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/CommandGenerator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,8 @@ private void writeSerdeDispatcher(boolean isInput) {
295295
? ProtocolGenerator.getSerFunctionName(symbol, protocolGenerator.getName())
296296
: ProtocolGenerator.getDeserFunctionName(symbol, protocolGenerator.getName());
297297
writer.addImport(serdeFunctionName, serdeFunctionName,
298-
"./protocols/" + ProtocolGenerator.getSanitizedName(protocolGenerator.getName()));
298+
"./" + CodegenUtils.SOURCE_FOLDER + "/protocols/"
299+
+ ProtocolGenerator.getSanitizedName(protocolGenerator.getName()));
299300
writer.write("return $L($L, context);", serdeFunctionName, isInput ? "input" : "output");
300301
}
301302
}

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/HttpProtocolTestGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@
8989
public final class HttpProtocolTestGenerator implements Runnable {
9090

9191
private static final Logger LOGGER = Logger.getLogger(HttpProtocolTestGenerator.class.getName());
92-
private static final String TEST_CASE_FILE_TEMPLATE = "tests/functional/%s.spec.ts";
92+
private static final String TEST_CASE_FILE_TEMPLATE = "test/functional/%s.spec.ts";
9393

9494
private final TypeScriptSettings settings;
9595
private final Model model;

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/IndexGenerator.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ static void writeIndex(
5858

5959
// write export statement for models
6060
writer.write("export * from \"./models/index\";");
61-
fileManifest.writeFile("index.ts", writer.toString());
61+
fileManifest.writeFile(CodegenUtils.SOURCE_FOLDER + "/index.ts", writer.toString());
6262
}
6363

6464
private static void writeProtocolExports(ProtocolGenerator protocolGenerator, TypeScriptWriter writer) {
@@ -86,6 +86,10 @@ static void writeServerIndex(
8686
fileManifest.writeFile("server/index.ts", writer.toString());
8787
}
8888

89+
private static String getModulePath(String fileLocation) {
90+
return fileLocation.replaceFirst(CodegenUtils.SOURCE_FOLDER, "").replace(".ts", "");
91+
}
92+
8993
private static void writeClientExports(
9094
TypeScriptSettings settings,
9195
Model model,
@@ -110,20 +114,20 @@ private static void writeClientExports(
110114
writer.write("export * from \"./commands/" + symbolProvider.toSymbol(operation).getName() + "\";");
111115
if (operation.hasTrait(PaginatedTrait.ID)) {
112116
hasPaginatedOperation = true;
113-
String modulePath = PaginationGenerator.getOutputFilelocation(operation);
114-
writer.write("export * from \"./$L\";", modulePath.replace(".ts", ""));
117+
String modulePath = getModulePath(PaginationGenerator.getOutputFilelocation(operation));
118+
writer.write("export * from \".$L\";", modulePath);
115119
}
116120
if (operation.hasTrait(WaitableTrait.ID)) {
117121
WaitableTrait waitableTrait = operation.expectTrait(WaitableTrait.class);
118122
waitableTrait.getWaiters().forEach((String waiterName, Waiter waiter) -> {
119-
String modulePath = WaiterGenerator.getOutputFileLocation(waiterName);
120-
writer.write("export * from \"./$L\";", modulePath.replace(".ts", ""));
123+
String modulePath = getModulePath(WaiterGenerator.getOutputFileLocation(waiterName));
124+
writer.write("export * from \".$L\";", modulePath);
121125
});
122126
}
123127
}
124128
if (hasPaginatedOperation) {
125-
String modulePath = PaginationGenerator.PAGINATION_INTERFACE_FILE;
126-
writer.write("export * from \"./$L\";", modulePath.replace(".ts", ""));
129+
String modulePath = getModulePath(PaginationGenerator.PAGINATION_INTERFACE_FILE);
130+
writer.write("export * from \".$L\";", modulePath);
127131
}
128132
}
129133
}

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/LanguageTarget.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,6 @@ String getTemplateFileName() {
6868
abstract String getTemplateFileName();
6969

7070
String getTargetFilename() {
71-
return getTemplateFileName().replace(".template", "");
71+
return CodegenUtils.SOURCE_FOLDER + "/" + getTemplateFileName().replace(".template", "");
7272
}
7373
}

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/PackageJsonGenerator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,10 @@ static void writePackageJson(
5757
if (settings.generateClient()) {
5858
// Add the Node vs Browser hook.
5959
node = node.withMember("browser", Node.objectNode()
60-
.withMember("./runtimeConfig", "./runtimeConfig.browser"));
60+
.withMember("./dist-es/runtimeConfig", "./dist-es/runtimeConfig.browser"));
6161
// Add the ReactNative hook.
6262
node = node.withMember("react-native", Node.objectNode()
63-
.withMember("./runtimeConfig", "./runtimeConfig.native"));
63+
.withMember("./dist-es/runtimeConfig", "./dist-es/runtimeConfig.native"));
6464
}
6565

6666
// Set the package to private if required.

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/PaginationGenerator.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
@SmithyInternalApi
3131
final class PaginationGenerator implements Runnable {
3232

33-
static final String PAGINATION_INTERFACE_FILE = "pagination/Interfaces.ts";
33+
static final String PAGINATION_INTERFACE_FILE = CodegenUtils.SOURCE_FOLDER + "/pagination/Interfaces.ts";
3434

3535
private final TypeScriptWriter writer;
3636
private final PaginationInfo paginatedInfo;
@@ -89,9 +89,7 @@ public void run() {
8989
outputSymbol.getNamespace());
9090
String nonModularLocation = serviceSymbol.getNamespace()
9191
.replace(serviceSymbol.getName(), nonModularServiceName);
92-
writer.addImport(nonModularServiceName,
93-
nonModularServiceName,
94-
nonModularLocation);
92+
writer.addImport(nonModularServiceName, nonModularServiceName, nonModularLocation);
9593
writer.addImport(serviceSymbol.getName(), serviceSymbol.getName(), serviceSymbol.getNamespace());
9694

9795
// Import Pagination types
@@ -104,7 +102,7 @@ public void run() {
104102
}
105103

106104
static String getOutputFilelocation(OperationShape operation) {
107-
return "pagination/" + operation.getId().getName() + "Paginator.ts";
105+
return CodegenUtils.SOURCE_FOLDER + "/pagination/" + operation.getId().getName() + "Paginator.ts";
108106
}
109107

110108
static void generateServicePaginationInterfaces(

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/RuntimeConfigGenerator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,8 @@ final class RuntimeConfigGenerator {
179179
void generate(LanguageTarget target) {
180180
String template = TypeScriptUtils.loadResourceAsString(target.getTemplateFileName());
181181
String contents = template
182-
.replace("${clientModuleName}", symbolProvider.toSymbol(service).getNamespace())
182+
.replace("${clientModuleName}", symbolProvider.toSymbol(service).getNamespace()
183+
.replaceFirst(CodegenUtils.SOURCE_FOLDER + "/", ""))
183184
.replace("${clientConfigName}", symbolProvider.toSymbol(service).getName() + "Config")
184185
.replace("${apiVersion}", service.getVersion())
185186
.replace("$", "$$") // sanitize template place holders.

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/ServiceGenerator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ static String getResolvedConfigTypeName(Symbol symbol) {
9292
@Override
9393
public void run() {
9494
writer.addImport("Client", "__Client", "@aws-sdk/smithy-client");
95-
writer.addImport("getRuntimeConfig", "__getRuntimeConfig", "./runtimeConfig");
95+
writer.addImport("getRuntimeConfig", "__getRuntimeConfig",
96+
"./" + CodegenUtils.SOURCE_FOLDER + "/runtimeConfig");
9697

9798
// Normalize the input and output types of the command to account for
9899
// things like an operation adding input where there once wasn't any

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/SymbolVisitor.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -407,8 +407,10 @@ private Symbol.Builder createSymbolBuilder(Shape shape, String typeName, String
407407
}
408408

409409
private Symbol.Builder createGeneratedSymbolBuilder(Shape shape, String typeName, String namespace) {
410-
return createSymbolBuilder(shape, typeName, namespace)
411-
.definitionFile(toFilename(namespace));
410+
String prefixedNamespace = "./" + CodegenUtils.SOURCE_FOLDER
411+
+ (namespace.startsWith(".") ? namespace.substring(1) : namespace);
412+
return createSymbolBuilder(shape, typeName, prefixedNamespace)
413+
.definitionFile(toFilename(prefixedNamespace));
412414
}
413415

414416
private String toFilename(String namespace) {
@@ -421,7 +423,7 @@ private String toFilename(String namespace) {
421423
*/
422424
static final class ModuleNameDelegator {
423425
static final int DEFAULT_CHUNK_SIZE = 300;
424-
static final String SHAPE_NAMESPACE_PREFIX = "./models/";
426+
static final String SHAPE_NAMESPACE_PREFIX = "/models/";
425427

426428
private final Map<Shape, String> visitedModels = new HashMap<>();
427429
private int bucketCount = 0;
@@ -442,7 +444,7 @@ public String formatModuleName(Shape shape, String name) {
442444
return visitedModels.get(shape);
443445
}
444446
// Add models into buckets no bigger than chunk size.
445-
String path = SHAPE_NAMESPACE_PREFIX + "models_" + bucketCount;
447+
String path = "." + SHAPE_NAMESPACE_PREFIX + "models_" + bucketCount;
446448
visitedModels.put(shape, path);
447449
currentBucketSize++;
448450
if (currentBucketSize == chunkSize) {
@@ -454,14 +456,15 @@ public String formatModuleName(Shape shape, String name) {
454456

455457
static void writeModelIndex(Model model, SymbolProvider symbolProvider, FileManifest fileManifest) {
456458
TypeScriptWriter writer = new TypeScriptWriter("");
459+
String modelPrefix = "./" + CodegenUtils.SOURCE_FOLDER + SHAPE_NAMESPACE_PREFIX;
457460
model.shapes()
458461
.map(shape -> symbolProvider.toSymbol(shape).getNamespace())
459-
.filter(namespace -> namespace.startsWith(SHAPE_NAMESPACE_PREFIX))
462+
.filter(namespace -> namespace.startsWith(modelPrefix))
460463
.distinct()
461464
.sorted(Comparator.naturalOrder())
462465
.forEach(namespace -> writer.write(
463-
"export * from $S;", namespace.replaceFirst(SHAPE_NAMESPACE_PREFIX, "./")));
464-
fileManifest.writeFile("models/index.ts", writer.toString());
466+
"export * from $S;", namespace.replaceFirst(modelPrefix, "./")));
467+
fileManifest.writeFile(CodegenUtils.SOURCE_FOLDER + "/models/index.ts", writer.toString());
465468
}
466469
}
467470
}

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/TypeScriptDelegator.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,11 @@ List<SymbolDependency> getDependencies() {
8989
void useShapeWriter(Shape shape, SymbolProvider provider, Consumer<TypeScriptWriter> writerConsumer) {
9090
// Checkout/create the appropriate writer for the shape.
9191
Symbol symbol = provider.toSymbol(shape);
92-
TypeScriptWriter writer = checkoutWriter(symbol.getDefinitionFile());
92+
String fileName = symbol.getDefinitionFile();
93+
if (!fileName.startsWith("./" + CodegenUtils.SOURCE_FOLDER)) {
94+
fileName = "./" + CodegenUtils.SOURCE_FOLDER + "/" + fileName;
95+
}
96+
TypeScriptWriter writer = checkoutWriter(fileName);
9397

9498
// Add any needed DECLARE symbols.
9599
writer.addImportReferences(symbol, SymbolReference.ContextOption.DECLARE);

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/WaiterGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public void run() {
6464
}
6565

6666
public static String getOutputFileLocation(String waiterName) {
67-
return "waiters/waitFor" + waiterName + ".ts";
67+
return CodegenUtils.SOURCE_FOLDER + "/waiters/waitFor" + waiterName + ".ts";
6868
}
6969

7070
private void generateWaiter() {

smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/base-package.json

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,14 @@
99
"build:es": "tsc -p tsconfig.es.json",
1010
"build:types": "tsc -p tsconfig.types.json",
1111
"clean": "yarn clean:dist && yarn clean:docs",
12-
"clean:dist": "rimraf ./dist",
12+
"clean:dist": "rimraf ./dist-*",
1313
"clean:docs": "rimraf ./docs",
14-
"downlevel-dts": "downlevel-dts dist/types dist/types/ts3.4",
14+
"downlevel-dts": "downlevel-dts dist-types dist-types/ts3.4",
1515
"test": "jest --coverage --passWithNoTests"
1616
},
17-
"main": "./dist/cjs/index.js",
18-
"types": "./dist/types/index.d.ts",
19-
"module": "./dist/es/index.js",
20-
"browser": {
21-
"./runtimeConfig": "./runtimeConfig.browser"
22-
},
23-
"react-native": {
24-
"./runtimeConfig": "./runtimeConfig.native"
25-
},
17+
"main": "./dist-cjs/index.js",
18+
"types": "./dist-types/index.d.ts",
19+
"module": "./dist-es/index.js",
2620
"sideEffects": false,
2721
"dependencies": {
2822
"tslib": "^2.3.0"
@@ -40,7 +34,7 @@
4034
},
4135
"typesVersions": {
4236
"<4.0": {
43-
"dist/types/*": ["dist/types/ts3.4/*"]
37+
"dist-types/*": ["dist-types/ts3.4/*"]
4438
}
4539
}
4640
}

smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/tsconfig.es.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@
1212
"es2015.iterable",
1313
"es2015.symbol.wellknown"
1414
],
15-
"outDir": "dist/es"
15+
"outDir": "dist-es"
1616
}
1717
}

smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/tsconfig.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"compilerOptions": {
3+
"rootDir": "./src",
34
"alwaysStrict": true,
45
"target": "ES2018",
56
"module": "commonjs",
@@ -11,7 +12,7 @@
1112
"incremental": true,
1213
"resolveJsonModule": true,
1314
"esModuleInterop": true,
14-
"outDir": "dist/cjs",
15+
"outDir": "dist-cjs",
1516
"removeComments": true
1617
},
1718
"typedocOptions": {
@@ -33,5 +34,6 @@
3334
"out": "docs",
3435
"theme": "minimal",
3536
"plugin": ["@aws-sdk/client-documentation-generator"]
36-
}
37+
},
38+
"exclude": ["test/**/*"]
3739
}

smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/tsconfig.types.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"compilerOptions": {
44
"removeComments": false,
55
"declaration": true,
6-
"declarationDir": "dist/types"
7-
}
6+
"declarationDir": "dist-types"
7+
},
8+
"exclude": ["test/**/*", "dist-types/**/*"]
89
}

smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/CodegenVisitorTest.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,15 @@ public void generatesRuntimeConfigFiles() {
3737
// Did we generate the runtime config files?
3838
// note that asserting the contents of runtime config files is handled in its own unit tests.
3939
Assertions.assertTrue(manifest.hasFile("package.json"));
40-
Assertions.assertTrue(manifest.hasFile("runtimeConfig.browser.ts"));
41-
Assertions.assertTrue(manifest.hasFile("runtimeConfig.ts"));
42-
Assertions.assertTrue(manifest.hasFile("index.ts"));
40+
Assertions.assertTrue(manifest.hasFile(CodegenUtils.SOURCE_FOLDER + "/runtimeConfig.browser.ts"));
41+
Assertions.assertTrue(manifest.hasFile(CodegenUtils.SOURCE_FOLDER + "/runtimeConfig.ts"));
42+
Assertions.assertTrue(manifest.hasFile(CodegenUtils.SOURCE_FOLDER + "/index.ts"));
4343

4444
// Does the package.json file point to the runtime config?
4545
String packageJsonContents = manifest.getFileString("package.json").get();
4646
ObjectNode packageJson = Node.parse(packageJsonContents).expectObjectNode();
47-
assertThat(packageJson.expectObjectMember("browser").getStringMember("./runtimeConfig"),
48-
equalTo(Optional.of(Node.from("./runtimeConfig.browser"))));
47+
assertThat(packageJson.expectObjectMember("browser").getStringMember("./dist-es/runtimeConfig"),
48+
equalTo(Optional.of(Node.from("./dist-es/runtimeConfig.browser"))));
4949
}
5050

5151
@Test
@@ -69,8 +69,8 @@ public void decoratesSymbolProvider() {
6969

7070
new TypeScriptCodegenPlugin().execute(context);
7171

72-
Assertions.assertTrue(manifest.hasFile("Foo.ts"));
73-
assertThat(manifest.getFileString("Foo.ts").get(), containsString("export class Foo"));
72+
Assertions.assertTrue(manifest.hasFile(CodegenUtils.SOURCE_FOLDER + "/Foo.ts"));
73+
assertThat(manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/Foo.ts").get(), containsString("export class Foo"));
7474
}
7575

7676
@Test
@@ -91,12 +91,12 @@ public void generatesServiceClients() {
9191
.build();
9292
new TypeScriptCodegenPlugin().execute(context);
9393

94-
Assertions.assertTrue(manifest.hasFile("Example.ts"));
95-
assertThat(manifest.getFileString("Example.ts").get(),
94+
Assertions.assertTrue(manifest.hasFile(CodegenUtils.SOURCE_FOLDER + "/Example.ts"));
95+
assertThat(manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/Example.ts").get(),
9696
containsString("export class Example extends ExampleClient"));
9797

98-
Assertions.assertTrue(manifest.hasFile("ExampleClient.ts"));
99-
assertThat(manifest.getFileString("ExampleClient.ts").get(), containsString("export class ExampleClient"));
98+
Assertions.assertTrue(manifest.hasFile(CodegenUtils.SOURCE_FOLDER + "/ExampleClient.ts"));
99+
assertThat(manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/ExampleClient.ts").get(), containsString("export class ExampleClient"));
100100
}
101101

102102
@Test

smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/CommandGeneratorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ private void testCommmandCodegen(String file, String expectedType) {
5858
.build();
5959

6060
new TypeScriptCodegenPlugin().execute(context);
61-
String contents = manifest.getFileString("/commands/GetFooCommand.ts").get();
61+
String contents = manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "//commands/GetFooCommand.ts").get();
6262

6363
assertThat(contents, containsString("as __MetadataBearer"));
6464
assertThat(contents, containsString(expectedType));

smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/IndexGeneratorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public void writeAdditionalExports(
3939

4040
IndexGenerator.writeIndex(settings, model, symbolProvider, manifest, null);
4141

42-
String contents = manifest.getFileString("index.ts").get();
42+
String contents = manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/index.ts").get();
4343
assertThat(contents, containsString("export * from \"./Example\";"));
4444
assertThat(contents, containsString("export * from \"./ExampleClient\";"));
4545
assertThat(contents, containsString("export * from \"./commands/GetFooCommand\";"));

0 commit comments

Comments
 (0)