Skip to content

Commit d263078

Browse files
committed
feat(codegen): configurable package manager
Generated packages all use yarn in their package.json, which is not always available. This adds a configuration to the code generator called packageManager, which can be set to yarn or npm, or omitted for the default, which remains yarn for backwards compatibility.
1 parent cd709f7 commit d263078

File tree

4 files changed

+80
-5
lines changed

4 files changed

+80
-5
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ static void writePackageJson(
7373
template = template.replace("${package}", settings.getPackageName());
7474
template = template.replace("${packageDescription}", settings.getPackageDescription());
7575
template = template.replace("${packageVersion}", settings.getPackageVersion());
76+
template = template.replace("${packageManager}", settings.getPackageManager().getCommand());
7677
manifest.writeFile("package.json", template);
7778
}
7879
}

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

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public final class TypeScriptSettings {
5353
private static final String SERVICE = "service";
5454
private static final String PROTOCOL = "protocol";
5555
private static final String PRIVATE = "private";
56+
private static final String PACKAGE_MANAGER = "packageManager";
5657

5758
private String packageName;
5859
private String packageDescription = "";
@@ -64,6 +65,7 @@ public final class TypeScriptSettings {
6465
private boolean isPrivate;
6566
private ArtifactType artifactType = ArtifactType.CLIENT;
6667
private boolean disableDefaultValidation = false;
68+
private PackageManager packageManager = PackageManager.YARN;
6769

6870
@Deprecated
6971
public static TypeScriptSettings from(Model model, ObjectNode config) {
@@ -95,6 +97,10 @@ public static TypeScriptSettings from(Model model, ObjectNode config, ArtifactTy
9597
settings.packageJson = config.getObjectMember(PACKAGE_JSON).orElse(Node.objectNode());
9698
config.getStringMember(PROTOCOL).map(StringNode::getValue).map(ShapeId::from).ifPresent(settings::setProtocol);
9799
settings.setPrivate(config.getBooleanMember(PRIVATE).map(BooleanNode::getValue).orElse(false));
100+
settings.setPackageManager(
101+
config.getStringMember(PACKAGE_MANAGER)
102+
.map(s -> PackageManager.fromString(s.getValue()))
103+
.orElse(PackageManager.YARN));
98104

99105
if (artifactType == ArtifactType.SSDK) {
100106
settings.setDisableDefaultValidation(config.getBooleanMemberOrDefault(DISABLE_DEFAULT_VALIDATION));
@@ -275,6 +281,19 @@ public void setDisableDefaultValidation(boolean disableDefaultValidation) {
275281
this.disableDefaultValidation = disableDefaultValidation;
276282
}
277283

284+
/**
285+
* Returns the package manager used by the generated package.
286+
*
287+
* @return the configured package manager. Defaults to {@link PackageManager#YARN}
288+
*/
289+
public PackageManager getPackageManager() {
290+
return packageManager;
291+
}
292+
293+
public void setPackageManager(PackageManager packageManager) {
294+
this.packageManager = packageManager;
295+
}
296+
278297
/**
279298
* Gets the corresponding {@link ServiceShape} from a model.
280299
*
@@ -347,10 +366,10 @@ public void setProtocol(ShapeId protocol) {
347366
*/
348367
public enum ArtifactType {
349368
CLIENT(SymbolVisitor::new,
350-
Arrays.asList(PACKAGE, PACKAGE_DESCRIPTION, PACKAGE_JSON, PACKAGE_VERSION,
369+
Arrays.asList(PACKAGE, PACKAGE_DESCRIPTION, PACKAGE_JSON, PACKAGE_VERSION, PACKAGE_MANAGER,
351370
SERVICE, PROTOCOL, TARGET_NAMESPACE, PRIVATE)),
352371
SSDK((m, s) -> new ServerSymbolVisitor(m, new SymbolVisitor(m, s)),
353-
Arrays.asList(PACKAGE, PACKAGE_DESCRIPTION, PACKAGE_JSON, PACKAGE_VERSION,
372+
Arrays.asList(PACKAGE, PACKAGE_DESCRIPTION, PACKAGE_JSON, PACKAGE_VERSION, PACKAGE_MANAGER,
354373
SERVICE, PROTOCOL, TARGET_NAMESPACE, PRIVATE, DISABLE_DEFAULT_VALIDATION));
355374

356375
private final BiFunction<Model, TypeScriptSettings, SymbolProvider> symbolProviderFactory;
@@ -373,4 +392,29 @@ public SymbolProvider createSymbolProvider(Model model, TypeScriptSettings setti
373392
return symbolProviderFactory.apply(model, settings);
374393
}
375394
}
395+
396+
public enum PackageManager {
397+
YARN("yarn"),
398+
NPM("npm run-script");
399+
400+
private final String command;
401+
402+
PackageManager(String command) {
403+
this.command = command;
404+
}
405+
406+
public String getCommand() {
407+
return command;
408+
}
409+
410+
public static PackageManager fromString(String s) {
411+
if ("yarn".equals(s)) {
412+
return YARN;
413+
}
414+
if ("npm".equals(s)) {
415+
return NPM;
416+
}
417+
throw new CodegenException(String.format("Unsupported package manager: %s", s));
418+
}
419+
}
376420
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
"description": "${packageDescription}",
44
"version": "${packageVersion}",
55
"scripts": {
6-
"build": "yarn build:cjs && yarn build:es && yarn build:types",
6+
"build": "${packageManager} build:cjs && ${packageManager} build:es && ${packageManager} build:types",
77
"build:cjs": "tsc -p tsconfig.json",
8-
"build:docs": "yarn clean:docs && typedoc ./",
8+
"build:docs": "${packageManager} clean:docs && typedoc ./",
99
"build:es": "tsc -p tsconfig.es.json",
1010
"build:types": "tsc -p tsconfig.types.json",
11-
"clean": "yarn clean:dist && yarn clean:docs",
11+
"clean": "${packageManager} clean:dist && ${packageManager} clean:docs",
1212
"clean:dist": "rimraf ./dist-*",
1313
"clean:docs": "rimraf ./docs",
1414
"downlevel-dts": "downlevel-dts dist-types dist-types/ts3.4",

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static org.hamcrest.MatcherAssert.assertThat;
44
import static org.hamcrest.Matchers.equalTo;
5+
import static org.junit.jupiter.api.Assertions.assertEquals;
56

67
import org.junit.jupiter.api.Test;
78
import software.amazon.smithy.model.Model;
@@ -24,6 +25,35 @@ public void resolvesDefaultService() {
2425
assertThat(settings.getService(), equalTo(ShapeId.from("smithy.example#Example")));
2526
}
2627

28+
@Test
29+
public void defaultsToYarn() {
30+
Model model = Model.assembler()
31+
.addImport(getClass().getResource("simple-service.smithy"))
32+
.assemble()
33+
.unwrap();
34+
TypeScriptSettings settings = TypeScriptSettings.from(model, Node.objectNodeBuilder()
35+
.withMember("package", Node.from("example"))
36+
.withMember("packageVersion", Node.from("1.0.0"))
37+
.build());
38+
39+
assertEquals(TypeScriptSettings.PackageManager.YARN, settings.getPackageManager());
40+
}
41+
42+
@Test
43+
public void canBeConfiguredToNpm() {
44+
Model model = Model.assembler()
45+
.addImport(getClass().getResource("simple-service.smithy"))
46+
.assemble()
47+
.unwrap();
48+
TypeScriptSettings settings = TypeScriptSettings.from(model, Node.objectNodeBuilder()
49+
.withMember("package", Node.from("example"))
50+
.withMember("packageVersion", Node.from("1.0.0"))
51+
.withMember("packageManager", Node.from("npm"))
52+
.build());
53+
54+
assertEquals(TypeScriptSettings.PackageManager.NPM, settings.getPackageManager());
55+
}
56+
2757
@Test
2858
public void resolvesSupportProtocols() {
2959
// TODO

0 commit comments

Comments
 (0)