Skip to content

feat(codegen): configurable package manager #476

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ static void writePackageJson(
template = template.replace("${package}", settings.getPackageName());
template = template.replace("${packageDescription}", settings.getPackageDescription());
template = template.replace("${packageVersion}", settings.getPackageVersion());
template = template.replace("${packageManager}", settings.getPackageManager().getCommand());
manifest.writeFile("package.json", template);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ public final class TypeScriptSettings {
private static final String SERVICE = "service";
private static final String PROTOCOL = "protocol";
private static final String PRIVATE = "private";
private static final String PACKAGE_MANAGER = "packageManager";

private String packageName;
private String packageDescription = "";
Expand All @@ -64,6 +65,7 @@ public final class TypeScriptSettings {
private boolean isPrivate;
private ArtifactType artifactType = ArtifactType.CLIENT;
private boolean disableDefaultValidation = false;
private PackageManager packageManager = PackageManager.YARN;

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

if (artifactType == ArtifactType.SSDK) {
settings.setDisableDefaultValidation(config.getBooleanMemberOrDefault(DISABLE_DEFAULT_VALIDATION));
Expand Down Expand Up @@ -275,6 +281,19 @@ public void setDisableDefaultValidation(boolean disableDefaultValidation) {
this.disableDefaultValidation = disableDefaultValidation;
}

/**
* Returns the package manager used by the generated package.
*
* @return the configured package manager. Defaults to {@link PackageManager#YARN}
*/
public PackageManager getPackageManager() {
return packageManager;
}

public void setPackageManager(PackageManager packageManager) {
this.packageManager = packageManager;
}

/**
* Gets the corresponding {@link ServiceShape} from a model.
*
Expand Down Expand Up @@ -347,10 +366,10 @@ public void setProtocol(ShapeId protocol) {
*/
public enum ArtifactType {
CLIENT(SymbolVisitor::new,
Arrays.asList(PACKAGE, PACKAGE_DESCRIPTION, PACKAGE_JSON, PACKAGE_VERSION,
Arrays.asList(PACKAGE, PACKAGE_DESCRIPTION, PACKAGE_JSON, PACKAGE_VERSION, PACKAGE_MANAGER,
SERVICE, PROTOCOL, TARGET_NAMESPACE, PRIVATE)),
SSDK((m, s) -> new ServerSymbolVisitor(m, new SymbolVisitor(m, s)),
Arrays.asList(PACKAGE, PACKAGE_DESCRIPTION, PACKAGE_JSON, PACKAGE_VERSION,
Arrays.asList(PACKAGE, PACKAGE_DESCRIPTION, PACKAGE_JSON, PACKAGE_VERSION, PACKAGE_MANAGER,
SERVICE, PROTOCOL, TARGET_NAMESPACE, PRIVATE, DISABLE_DEFAULT_VALIDATION));

private final BiFunction<Model, TypeScriptSettings, SymbolProvider> symbolProviderFactory;
Expand All @@ -373,4 +392,29 @@ public SymbolProvider createSymbolProvider(Model model, TypeScriptSettings setti
return symbolProviderFactory.apply(model, settings);
}
}

public enum PackageManager {
YARN("yarn"),
NPM("npm run-script");

private final String command;

PackageManager(String command) {
this.command = command;
}

public String getCommand() {
return command;
}

public static PackageManager fromString(String s) {
if ("yarn".equals(s)) {
return YARN;
}
if ("npm".equals(s)) {
return NPM;
}
throw new CodegenException(String.format("Unsupported package manager: %s", s));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
"description": "${packageDescription}",
"version": "${packageVersion}",
"scripts": {
"build": "yarn build:cjs && yarn build:es && yarn build:types",
"build": "${packageManager} build:cjs && ${packageManager} build:es && ${packageManager} build:types",
"build:cjs": "tsc -p tsconfig.json",
"build:docs": "yarn clean:docs && typedoc ./",
"build:docs": "${packageManager} clean:docs && typedoc ./",
"build:es": "tsc -p tsconfig.es.json",
"build:types": "tsc -p tsconfig.types.json",
"clean": "yarn clean:dist && yarn clean:docs",
"clean": "${packageManager} clean:dist && ${packageManager} clean:docs",
"clean:dist": "rimraf ./dist-*",
"clean:docs": "rimraf ./docs",
"downlevel-dts": "downlevel-dts dist-types dist-types/ts3.4",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.jupiter.api.Assertions.assertEquals;

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

@Test
public void defaultsToYarn() {
Model model = Model.assembler()
.addImport(getClass().getResource("simple-service.smithy"))
.assemble()
.unwrap();
TypeScriptSettings settings = TypeScriptSettings.from(model, Node.objectNodeBuilder()
.withMember("package", Node.from("example"))
.withMember("packageVersion", Node.from("1.0.0"))
.build());

assertEquals(TypeScriptSettings.PackageManager.YARN, settings.getPackageManager());
}

@Test
public void canBeConfiguredToNpm() {
Model model = Model.assembler()
.addImport(getClass().getResource("simple-service.smithy"))
.assemble()
.unwrap();
TypeScriptSettings settings = TypeScriptSettings.from(model, Node.objectNodeBuilder()
.withMember("package", Node.from("example"))
.withMember("packageVersion", Node.from("1.0.0"))
.withMember("packageManager", Node.from("npm"))
.build());

assertEquals(TypeScriptSettings.PackageManager.NPM, settings.getPackageManager());
}

@Test
public void resolvesSupportProtocols() {
// TODO
Expand Down