Skip to content

Commit

Permalink
Fix Generated Error Types in JSDoc (#299)
Browse files Browse the repository at this point in the history
Change documented error types in JSDoc to reference the actual generated error types by Conjure
  • Loading branch information
samialfhaily authored Dec 18, 2024
1 parent f066e46 commit 44c799d
Show file tree
Hide file tree
Showing 6 changed files with 129 additions and 9 deletions.
5 changes: 5 additions & 0 deletions changelog/@unreleased/pr-299.v2.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
type: improvement
improvement:
description: Change documented error types in JSDoc to reference the actual generated error types by Conjure
links:
- https://github.com/palantir/conjure-typescript/pull/299
6 changes: 5 additions & 1 deletion scripts/run-integration-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,8 @@ set -euo pipefail
./build/downloads/bin/conjure-verification-server ./build/resources/verification-server-test-cases.json ./build/resources/verification-server-api.conjure.json &
SERVER_PID=$!
yarn karma start --single-run --browsers ChromeHeadless karma.conf.js
kill -kill ${SERVER_PID}

if ps -p ${SERVER_PID} > /dev/null
then
kill -kill ${SERVER_PID}
fi
89 changes: 84 additions & 5 deletions src/commands/generate/__tests__/serviceGeneratorTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -588,7 +588,22 @@ export interface IMyService {
],
serviceName: { name: "MyService", package: "com.palantir.services" },
},
new Map(),
new Map([
[
createHashableTypeName({ name: "MyError1", package: "com.palantir.services" }),
{
type: "object",
object: { typeName: { name: "MyError1", package: "com.palantir.services" }, fields: [] },
},
],
[
createHashableTypeName({ name: "MyError2", package: "com.palantir.services" }),
{
type: "object",
object: { typeName: { name: "MyError2", package: "com.palantir.services" }, fields: [] },
},
],
]),
simpleAst,
DEFAULT_TYPE_GENERATION_FLAGS,
);
Expand All @@ -599,8 +614,8 @@ export interface IMyService {
export interface IMyService {
/**
* endpoint level docs
* @throws {MyError1} MyError1 documentation
* @throws {MyError2} MyError2 documentation
* @throws {IMyError1} MyError1 documentation
* @throws {IMyError2} MyError2 documentation
*/
foo(): Promise<void>;
}
Expand Down Expand Up @@ -631,7 +646,15 @@ export interface IMyService {
],
serviceName: { name: "MyService", package: "com.palantir.services" },
},
new Map(),
new Map([
[
createHashableTypeName({ name: "MyError", package: "com.palantir.services" }),
{
type: "object",
object: { typeName: { name: "MyError", package: "com.palantir.services" }, fields: [] },
},
],
]),
simpleAst,
DEFAULT_TYPE_GENERATION_FLAGS,
);
Expand All @@ -643,7 +666,7 @@ export interface IMyService {
/**
* endpoint level docs
* @incubating
* @throws {MyError} MyError documentation
* @throws {IMyError} MyError documentation
*/
foo(): Promise<void>;
}
Expand Down Expand Up @@ -734,4 +757,60 @@ export interface IMyService {
);
assertOutputAndExpectedAreEqual(outDir, expectedDir, "services/optionalService.ts");
});

it("emits service with no duplicate error imports", async () => {
await generateService(
{
endpoints: [
{
args: [],
endpointName: "foo",
httpMethod: HttpMethod.GET,
httpPath: "/foo",
markers: [],
tags: [],
errors: [
{
error: { name: "MyError", namespace: "MyNamespace", package: "com.palantir.errors" },
},
],
},
{
args: [],
endpointName: "bar",
httpMethod: HttpMethod.GET,
httpPath: "/bar",
markers: [],
tags: [],
errors: [
{
error: { name: "MyError", namespace: "MyNamespace", package: "com.palantir.errors" },
},
],
},
],
serviceName: { name: "MyService", package: "com.palantir.services" },
},
new Map([
[
createHashableTypeName({ name: "MyError", package: "com.palantir.errors" }),
{
type: "object",
object: { typeName: { name: "MyError", package: "com.palantir.errors" }, fields: [] },
},
],
]),
simpleAst,
DEFAULT_TYPE_GENERATION_FLAGS,
);
const outFile = path.join(outDir, "services/myService.ts");
const contents = fs.readFileSync(outFile, "utf8");

expect(contents).toContain(`import type { IMyError } from "../errors/myError";
import { IHttpApiBridge } from "conjure-client";
/** Constant reference to \`undefined\` that we expect to get minified and therefore reduce total code size */
const __undefined: undefined = undefined;
`);
});
});
21 changes: 19 additions & 2 deletions src/commands/generate/__tests__/simpleAstTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import { generateError } from "../errorGenerator";
import { generateService } from "../serviceGenerator";
import { SimpleAst } from "../simpleAst";
import { generateEnum } from "../typeGenerator";
import { createHashableTypeName } from "../utils";
import { DEFAULT_TYPE_GENERATION_FLAGS } from "./resources/constants";

describe("simpleAst", () => {
Expand Down Expand Up @@ -62,15 +63,31 @@ describe("simpleAst", () => {
type: "primitive",
},
tags: [],
errors: [],
errors: [
{
error: {
name: "MyError",
package: "com.palantir.package1",
namespace: "Metadata",
},
},
],
},
],
serviceName: {
name: "MyService",
package: "com.palantir.package2",
},
},
new Map(),
new Map([
[
createHashableTypeName({ name: "MyError", package: "com.palantir.package1" }),
{
type: "object",
object: { typeName: { name: "MyError", package: "com.palantir.package1" }, fields: [] },
},
],
]),
simpleAst,
DEFAULT_TYPE_GENERATION_FLAGS,
);
Expand Down
15 changes: 15 additions & 0 deletions src/commands/generate/serviceGenerator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,21 @@ export function generateService(
scope: Scope.Public,
docs: docs != null ? [docs] : undefined,
});

endpointDefinition.errors?.forEach(error => {
// TODO: Get rid of the visitor, because the type (reference) is already known
const errorImports: ImportDeclarationStructure[] = IType.visit(
{
reference: {
name: `${error.error.name}`,
package: error.error.package,
},
type: "reference",
},
importsVisitor,
).map(i => ({ ...i, isTypeOnly: true }));
imports.push(...errorImports);
});
});

if (imports.length !== 0) {
Expand Down
2 changes: 1 addition & 1 deletion src/commands/generate/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ export function isFlavorizable(type: IType, flavorizedAliases: boolean): boolean
}

function formattedEndpointError(errorDefinition: IEndpointError): string {
let formattedString = `{${errorDefinition.error.name}}`;
let formattedString = `{I${errorDefinition.error.name}}`;
if (errorDefinition.docs != null && errorDefinition.docs != null) {
formattedString += ` ${errorDefinition.docs}`;
}
Expand Down

0 comments on commit 44c799d

Please sign in to comment.