Skip to content
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

feat: OpenApi Parser multiple success responses, error response descriptions, better examples #1924

Merged
merged 31 commits into from
Dec 20, 2024
Merged
Show file tree
Hide file tree
Changes from 27 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
3c40232
add tag conversion
fern-support Dec 10, 2024
5913f3b
server name and tags, tests needed
RohinBhargava Dec 10, 2024
dcc756b
checkpoint
RohinBhargava Dec 12, 2024
ceac2c1
pnpm lock
RohinBhargava Dec 12, 2024
53274dc
Merge remote-tracking branch 'origin/main' into uploadcare-experiment
RohinBhargava Dec 13, 2024
a79a06a
added example parsers, need to add tests and merge examples in a mean…
RohinBhargava Dec 13, 2024
81daa61
add tests and fix compile errors
RohinBhargava Dec 17, 2024
def2f73
merge from main
RohinBhargava Dec 17, 2024
662ed6e
remove type_: from type alias
RohinBhargava Dec 17, 2024
b95ff56
feat: redoc example parsing (#1906)
RohinBhargava Dec 17, 2024
23d96f0
code compiles, testing
RohinBhargava Dec 18, 2024
cd5b548
update tests
RohinBhargava Dec 18, 2024
8fad42e
many examples working, multiple request responses, error defaults sho…
RohinBhargava Dec 19, 2024
91bff16
empty snippets & removed redundancy
RohinBhargava Dec 19, 2024
0d77cab
remove test file
RohinBhargava Dec 19, 2024
e7cee2c
update snapshot
RohinBhargava Dec 19, 2024
cec5db2
pnpm lock
RohinBhargava Dec 19, 2024
73ba050
merge from main
RohinBhargava Dec 19, 2024
d06d9c5
bump version and fix some tests
RohinBhargava Dec 19, 2024
1c6f33a
update and add tests
RohinBhargava Dec 20, 2024
223a89f
example object tests
RohinBhargava Dec 20, 2024
2c70167
Merge branch 'uploadcare-experiment' into rohin/multiple-success-resp…
RohinBhargava Dec 20, 2024
0551cae
merge from main
RohinBhargava Dec 20, 2024
e730db8
try removing cross product from converter
RohinBhargava Dec 20, 2024
ece2427
return statement
RohinBhargava Dec 20, 2024
767c824
snippet old logic for curl
RohinBhargava Dec 20, 2024
0618a87
merge from main
RohinBhargava Dec 20, 2024
c045a5f
update ui packages
RohinBhargava Dec 20, 2024
e80d2fd
linter fixes
RohinBhargava Dec 20, 2024
c41cf92
fix bundle build
RohinBhargava Dec 20, 2024
3da43f1
add eslint disablement back
RohinBhargava Dec 20, 2024
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
4 changes: 2 additions & 2 deletions fern/apis/fdr/definition/api/latest/endpoint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ types:
queryParameters: optional<list<type.ObjectProperty>>
requestHeaders: optional<list<type.ObjectProperty>>
responseHeaders: optional<list<type.ObjectProperty>> # this is not being used currently
request: optional<HttpRequest>
response: optional<HttpResponse>
requests: optional<list<HttpRequest>>
responses: optional<list<HttpResponse>>
errors: optional<list<ErrorResponse>>
examples: optional<list<ExampleEndpointCall>>
snippetTemplates: optional<EndpointSnippetTemplates>
Expand Down
8 changes: 4 additions & 4 deletions packages/fdr-sdk/src/api-definition/__test__/join.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ const endpoint1: Latest.EndpointDefinition = {
],
requestHeaders: undefined,
responseHeaders: undefined,
request: undefined,
response: undefined,
requests: undefined,
responses: undefined,
auth: undefined,
description: undefined,
availability: undefined,
Expand Down Expand Up @@ -83,8 +83,8 @@ const endpoint2: Latest.EndpointDefinition = {
},
],
responseHeaders: undefined,
request: undefined,
response: undefined,
requests: undefined,
responses: undefined,
auth: [Latest.AuthSchemeId("auth")],
description: undefined,
availability: undefined,
Expand Down
8 changes: 4 additions & 4 deletions packages/fdr-sdk/src/api-definition/__test__/prune.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ const endpoint1: Latest.EndpointDefinition = {
],
requestHeaders: undefined,
responseHeaders: undefined,
request: undefined,
response: undefined,
requests: undefined,
responses: undefined,
auth: undefined,
description: undefined,
availability: undefined,
Expand Down Expand Up @@ -83,8 +83,8 @@ const endpoint2: Latest.EndpointDefinition = {
},
],
responseHeaders: undefined,
request: undefined,
response: undefined,
requests: undefined,
responses: undefined,
auth: [Latest.AuthSchemeId("auth")],
description: undefined,
availability: undefined,
Expand Down
16 changes: 9 additions & 7 deletions packages/fdr-sdk/src/api-definition/migrators/v1ToV2.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { isNonNullish } from "@fern-api/ui-core-utils";
import titleCase from "@fern-api/ui-core-utils/titleCase";
import visitDiscriminatedUnion from "@fern-api/ui-core-utils/visitDiscriminatedUnion";
import { mapValues } from "es-toolkit/object";
Expand All @@ -22,7 +23,7 @@ interface Flags {

/**
* If true, avoid generating Typescript SDK snippets.
* In @fern-docs/ui's resolver, we generate http-snippets for JavaScript.
* In @fern-ui/ui's resolver, we generate http-snippets for JavaScript.
*/
alwaysEnableJavaScriptFetch: boolean;

Expand Down Expand Up @@ -191,8 +192,8 @@ export class ApiDefinitionV1ToLatest {
queryParameters: this.migrateParameters(v1.queryParameters),
requestHeaders: this.migrateParameters(v1.headers),
responseHeaders: undefined,
request: this.migrateHttpRequest(v1.request),
response: this.migrateHttpResponse(v1.response),
requests: [this.migrateHttpRequest(v1.request)].filter(isNonNullish),
responses: [this.migrateHttpResponse(v1.response)].filter(isNonNullish),
errors: this.migrateHttpErrors(v1.errorsV2),
examples: undefined,
snippetTemplates: v1.snippetTemplates,
Expand Down Expand Up @@ -455,6 +456,7 @@ export class ApiDefinitionV1ToLatest {
if (examples.length === 0) {
return undefined;
}

return examples.map((example): V2.ExampleEndpointCall => {
const toRet: V2.ExampleEndpointCall = {
path: example.path,
Expand All @@ -478,7 +480,7 @@ export class ApiDefinitionV1ToLatest {
type: "json",
value: sortKeysByShape(
value.value,
endpoint.request?.body,
endpoint.requests?.[0]?.body,
this.types
),
}),
Expand All @@ -489,8 +491,8 @@ export class ApiDefinitionV1ToLatest {
(formValue, key): APIV1Read.FormValue => {
if (formValue.type === "json") {
const shape =
endpoint.request?.body.type === "formData"
? endpoint.request.body.fields.find(
endpoint.requests?.[0]?.body.type === "formData"
? endpoint.requests?.[0]?.body.fields.find(
(field): field is V2.FormDataField.Property =>
field.key === key && field.type === "property"
)?.valueShape
Expand All @@ -511,7 +513,7 @@ export class ApiDefinitionV1ToLatest {
if (toRet.responseBody) {
toRet.responseBody.value = sortKeysByShape(
toRet.responseBody.value,
endpoint.response?.body,
endpoint.responses?.[0]?.body,
this.types
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,8 @@ export function toSnippetHttpRequest(

const body: Latest.ExampleEndpointRequest | undefined = example.requestBody;

if (endpoint.request?.contentType != null) {
headers["Content-Type"] = endpoint.request?.contentType;
if (endpoint.requests?.[0]?.contentType != null) {
headers["Content-Type"] = endpoint.requests?.[0]?.contentType;
}

if (body != null && headers["Content-Type"] == null) {
Expand Down
21 changes: 13 additions & 8 deletions packages/fdr-sdk/src/api-definition/transformer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -320,12 +320,17 @@ export class Transformer {
`${parentKey}/responseHeader/${param.key}`
)
) ?? [];
const request = endpoint.request
? this.visitor.HttpRequest(endpoint.request, `${parentKey}/request`)
: undefined;
const response = endpoint.response
? this.visitor.HttpResponse(endpoint.response, `${parentKey}/response`)
: undefined;
const requests = endpoint.requests?.map((request, i) =>
// this has changed
this.visitor.HttpRequest(request, `${parentKey}/request/${i}`)
);
const responses = endpoint.responses?.map((response, i) =>
// this has changed discretely
this.visitor.HttpResponse(
response,
`${parentKey}/response/${i}/${response.statusCode}`
)
);
const errors =
endpoint.errors?.map((error, i) =>
this.visitor.ErrorResponse(
Expand All @@ -344,8 +349,8 @@ export class Transformer {
queryParameters: queryParameters.length > 0 ? queryParameters : undefined,
requestHeaders: requestHeaders.length > 0 ? requestHeaders : undefined,
responseHeaders: responseHeaders.length > 0 ? responseHeaders : undefined,
request,
response,
requests,
responses,
errors: errors.length > 0 ? errors : undefined,
examples: examples.length > 0 ? examples : undefined,
};
Expand Down
20 changes: 10 additions & 10 deletions packages/fdr-sdk/src/api-definition/typeid-visitor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,16 @@ export class ApiTypeIdVisitor {
endpoint.responseHeaders?.forEach((header) => {
ApiTypeIdVisitor.visitTypeShape(header.valueShape, visit);
});
if (endpoint.request?.body != null) {
ApiTypeIdVisitor.visitHttpRequestBodyShape(endpoint.request.body, visit);
}
if (endpoint.response?.body != null) {
ApiTypeIdVisitor.visitHttpResponseBodyShape(
endpoint.response.body,
visit
);
}

endpoint.requests?.forEach((request) => {
if (request.body != null) {
ApiTypeIdVisitor.visitHttpRequestBodyShape(request.body, visit);
}
});
endpoint.responses?.forEach((response) => {
if (response.body != null) {
ApiTypeIdVisitor.visitHttpResponseBodyShape(response.body, visit);
}
});
endpoint.errors?.forEach((error) => {
if (error.shape != null) {
ApiTypeIdVisitor.visitTypeShape(error.shape, visit);
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading