Skip to content

Commit bc4911f

Browse files
author
Steven Yuan
authored
Add generateTypeDoc setting for typedoc support (#1091)
Breaking change: typedoc support was previously generated by default, but this change makes typedoc support opt-in through the `generateTypeDoc` boolean setting.
1 parent 43d4bfb commit bc4911f

File tree

6 files changed

+112
-5
lines changed

6 files changed

+112
-5
lines changed

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ final class DirectedTypeScriptCodegen
7171
* A mapping of static resource files to copy over to a new filename.
7272
*/
7373
private static final Map<String, String> STATIC_FILE_COPIES = MapUtils.of(
74-
"typedoc.json", "typedoc.json",
7574
"tsconfig.json", "tsconfig.json",
7675
"tsconfig.cjs.json", "tsconfig.cjs.json",
7776
"tsconfig.es.json", "tsconfig.es.json",

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
final class PackageJsonGenerator {
3232

3333
public static final String PACKAGE_JSON_FILENAME = "package.json";
34+
public static final String TYPEDOC_FILE_NAME = "typedoc.json";
3435
public static final String VITEST_CONFIG_FILENAME = "vite.config.js";
3536

3637
private PackageJsonGenerator() {}
@@ -67,6 +68,24 @@ static void writePackageJson(
6768
PackageJsonGenerator.class.getResourceAsStream(VITEST_CONFIG_FILENAME)));
6869
}
6970

71+
if (settings.generateTypeDoc()) {
72+
// Add typedoc to the "devDependencies" if not present
73+
if (devDeps.getMember(TypeScriptDependency.TYPEDOC.packageName).isEmpty()) {
74+
devDeps = devDeps.withMember(
75+
TypeScriptDependency.TYPEDOC.packageName,
76+
TypeScriptDependency.TYPEDOC.version);
77+
node = node.withMember("devDependencies", devDeps);
78+
}
79+
80+
// Add build:docs script
81+
ObjectNode scripts = node.getObjectMember("scripts").orElse(Node.objectNode());
82+
scripts = scripts.withMember("build:docs", "typedoc");
83+
node = node.withMember("scripts", scripts);
84+
85+
// Write typedoc.json
86+
manifest.writeFile(TYPEDOC_FILE_NAME, PackageJsonGenerator.class, TYPEDOC_FILE_NAME);
87+
}
88+
7089
// These are currently only generated for clients, but they may be needed for ssdk as well.
7190
if (settings.generateClient()) {
7291
// Add the Node vs Browser hook.

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,9 @@ public enum TypeScriptDependency implements Dependency {
129129
// Conditionally added when specs have been generated.
130130
VITEST("devDependencies", "vitest", "^0.33.0", false),
131131

132+
// Conditionally added when `generateTypeDoc` is true.
133+
TYPEDOC("devDependencies", "typedoc", "0.23.23", false),
134+
132135
// Server dependency for SSDKs
133136
SERVER_COMMON("dependencies", "@aws-smithy/server-common", false);
134137

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

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public final class TypeScriptSettings {
5858
private static final String PACKAGE_MANAGER = "packageManager";
5959
private static final String CREATE_DEFAULT_README = "createDefaultReadme";
6060
private static final String EXPERIMENTAL_IDENTITY_AND_AUTH = "experimentalIdentityAndAuth";
61+
private static final String GENERATE_TYPEDOC = "generateTypeDoc";
6162

6263
private String packageName;
6364
private String packageDescription = "";
@@ -75,6 +76,7 @@ public final class TypeScriptSettings {
7576
private PackageManager packageManager = PackageManager.YARN;
7677
private boolean createDefaultReadme = false;
7778
private boolean experimentalIdentityAndAuth = false;
79+
private boolean generateTypeDoc = false;
7880

7981
@Deprecated
8082
public static TypeScriptSettings from(Model model, ObjectNode config) {
@@ -110,6 +112,8 @@ public static TypeScriptSettings from(Model model, ObjectNode config, ArtifactTy
110112
config.getBooleanMember(CREATE_DEFAULT_README).map(BooleanNode::getValue).orElse(false));
111113
settings.setExperimentalIdentityAndAuth(
112114
config.getBooleanMemberOrDefault(EXPERIMENTAL_IDENTITY_AND_AUTH, false));
115+
settings.setGenerateTypeDoc(
116+
config.getBooleanMember(GENERATE_TYPEDOC).map(BooleanNode::getValue).orElse(false));
113117
settings.setPackageManager(
114118
config.getStringMember(PACKAGE_MANAGER)
115119
.map(s -> PackageManager.fromString(s.getValue()))
@@ -380,6 +384,24 @@ public void setExperimentalIdentityAndAuth(boolean experimentalIdentityAndAuth)
380384
this.experimentalIdentityAndAuth = experimentalIdentityAndAuth;
381385
}
382386

387+
/**
388+
* Returns whether to generate typedoc support.
389+
*
390+
* @return whether to generate typedoc support. Default: false
391+
*/
392+
public boolean generateTypeDoc() {
393+
return generateTypeDoc;
394+
}
395+
396+
/**
397+
* Sets whether to generate typedoc support.
398+
*
399+
* @param generateTypeDoc whether to generate typedoc support
400+
*/
401+
public void setGenerateTypeDoc(boolean generateTypeDoc) {
402+
this.generateTypeDoc = generateTypeDoc;
403+
}
404+
383405
/**
384406
* Gets the corresponding {@link ServiceShape} from a model.
385407
*
@@ -468,11 +490,11 @@ public enum ArtifactType {
468490
CLIENT(SymbolVisitor::new,
469491
Arrays.asList(PACKAGE, PACKAGE_DESCRIPTION, PACKAGE_JSON, PACKAGE_VERSION, PACKAGE_MANAGER,
470492
SERVICE, PROTOCOL, PRIVATE, REQUIRED_MEMBER_MODE,
471-
CREATE_DEFAULT_README, EXPERIMENTAL_IDENTITY_AND_AUTH)),
493+
CREATE_DEFAULT_README, EXPERIMENTAL_IDENTITY_AND_AUTH, GENERATE_TYPEDOC)),
472494
SSDK((m, s) -> new ServerSymbolVisitor(m, new SymbolVisitor(m, s)),
473495
Arrays.asList(PACKAGE, PACKAGE_DESCRIPTION, PACKAGE_JSON, PACKAGE_VERSION, PACKAGE_MANAGER,
474496
SERVICE, PROTOCOL, PRIVATE, REQUIRED_MEMBER_MODE,
475-
DISABLE_DEFAULT_VALIDATION, CREATE_DEFAULT_README));
497+
DISABLE_DEFAULT_VALIDATION, CREATE_DEFAULT_README, GENERATE_TYPEDOC));
476498

477499
private final BiFunction<Model, TypeScriptSettings, SymbolProvider> symbolProviderFactory;
478500
private final List<String> configProperties;

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
"scripts": {
66
"build": "concurrently '${packageManager}:build:cjs' '${packageManager}:build:es' '${packageManager}:build:types'",
77
"build:cjs": "tsc -p tsconfig.cjs.json",
8-
"build:docs": "typedoc",
98
"build:es": "tsc -p tsconfig.es.json",
109
"build:types": "tsc -p tsconfig.types.json",
1110
"build:types:downlevel": "downlevel-dts dist-types dist-types/ts3.4",
@@ -24,7 +23,6 @@
2423
"concurrently": "7.0.0",
2524
"downlevel-dts": "0.10.1",
2625
"rimraf": "^3.0.0",
27-
"typedoc": "0.23.23",
2826
"typescript": "~4.9.5"
2927
},
3028
"engines": {

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

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import static org.hamcrest.MatcherAssert.assertThat;
1818
import static org.hamcrest.Matchers.containsString;
19+
import static org.hamcrest.Matchers.not;
1920
import static org.junit.jupiter.api.Assertions.assertTrue;
2021

2122
class PackageJsonGeneratorTest {
@@ -126,6 +127,71 @@ void expectTestScriptAndTestConfigToBeAdded() {
126127
assertThat(configString, containsString("include: ['**/*.spec.ts']"));
127128
}
128129

130+
@Test
131+
void expectTypeDocToNotBeAdded() {
132+
Model model = Model.assembler()
133+
.addImport(getClass().getResource("simple-service.smithy"))
134+
.assemble()
135+
.unwrap();
136+
137+
MockManifest manifest = new MockManifest();
138+
139+
ObjectNode settings = Node.objectNodeBuilder()
140+
.withMember("service", Node.from("smithy.example#Example"))
141+
.withMember("package", Node.from("example"))
142+
.withMember("packageVersion", Node.from("1.0.0"))
143+
.withMember("packageDescription", Node.from("example description"))
144+
.build();
145+
146+
final TypeScriptSettings typeScriptSettings = TypeScriptSettings.from(model, settings,
147+
TypeScriptSettings.ArtifactType.CLIENT);
148+
149+
Map<String, Map<String, SymbolDependency>> deps = new HashMap<>();
150+
151+
PackageJsonGenerator.writePackageJson(typeScriptSettings, manifest, deps);
152+
153+
assertTrue(manifest.getFileString(PackageJsonGenerator.PACKAGE_JSON_FILENAME).isPresent());
154+
assertTrue(manifest.getFileString(PackageJsonGenerator.TYPEDOC_FILE_NAME).isEmpty());
155+
156+
String packageJson = manifest.getFileString(PackageJsonGenerator.PACKAGE_JSON_FILENAME).get();
157+
158+
assertThat(packageJson, not(containsString("\"build:docs\": \"typedoc\"")));
159+
assertThat(packageJson, not(containsString("\"typedoc\": \"0.23.23\"")));
160+
}
161+
162+
@Test
163+
void expectTypeDocToBeAddedWithGenerateTypeDoc() {
164+
Model model = Model.assembler()
165+
.addImport(getClass().getResource("simple-service.smithy"))
166+
.assemble()
167+
.unwrap();
168+
169+
MockManifest manifest = new MockManifest();
170+
171+
ObjectNode settings = Node.objectNodeBuilder()
172+
.withMember("service", Node.from("smithy.example#Example"))
173+
.withMember("package", Node.from("example"))
174+
.withMember("packageVersion", Node.from("1.0.0"))
175+
.withMember("packageDescription", Node.from("example description"))
176+
.withMember("generateTypeDoc", true)
177+
.build();
178+
179+
final TypeScriptSettings typeScriptSettings = TypeScriptSettings.from(model, settings,
180+
TypeScriptSettings.ArtifactType.CLIENT);
181+
182+
Map<String, Map<String, SymbolDependency>> deps = new HashMap<>();
183+
184+
PackageJsonGenerator.writePackageJson(typeScriptSettings, manifest, deps);
185+
186+
assertTrue(manifest.getFileString(PackageJsonGenerator.PACKAGE_JSON_FILENAME).isPresent());
187+
assertTrue(manifest.getFileString(PackageJsonGenerator.TYPEDOC_FILE_NAME).isPresent());
188+
189+
String packageJson = manifest.getFileString(PackageJsonGenerator.PACKAGE_JSON_FILENAME).get();
190+
191+
assertThat(packageJson, containsString("\"build:docs\": \"typedoc\""));
192+
assertThat(packageJson, containsString("\"typedoc\": \"0.23.23\""));
193+
}
194+
129195
private static Stream<Arguments> providePackageDescriptionTestCases() {
130196
return Stream.of(
131197
Arguments.of(TypeScriptSettings.ArtifactType.SSDK, "example server"),

0 commit comments

Comments
 (0)