Skip to content

Commit

Permalink
Initial changes
Browse files Browse the repository at this point in the history
  • Loading branch information
ppoddar-affordably committed Jun 13, 2024
1 parent 5430545 commit d41b271
Show file tree
Hide file tree
Showing 25 changed files with 264 additions and 1,344 deletions.
14 changes: 14 additions & 0 deletions fern/apis/fdr/definition/snippets.yml
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,20 @@ types:
pathParameters: optional<list<ParameterPayload>>
queryParameters: optional<list<ParameterPayload>>
requestBody: optional<unknown>
auth: optional<AuthPayload>

AuthPayload:
union:
bearer: BearerTokenAuthPayload
basic: BasicAuthPayload
# Add more auth types here as needed
BearerTokenAuthPayload:
properties:
token: string
BasicAuthPayload:
properties:
username: string
password: string

SnippetsPage:
properties:
Expand Down
4 changes: 2 additions & 2 deletions fern/apis/fdr/definition/templates.yml
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,7 @@ types:
- PATH
- HEADERS
- RELATIVE
- AUTH
PayloadInput:
properties:
location: PayloadLocation
Expand All @@ -202,8 +203,7 @@ types:

SnippetTemplate:
properties:
# TODO: Make clientInstantiation a Template
clientInstantiation: string
clientInstantiation: Template
functionInvocation: Template
VersionedSnippetTemplate:
audiences:
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.

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.

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.

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

5 changes: 3 additions & 2 deletions packages/fdr-sdk/src/client/generated/core/fetcher/Fetcher.ts

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

28 changes: 19 additions & 9 deletions packages/template-resolver/src/SnippetTemplateResolver.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { get } from "lodash-es";
import {
AuthPayload,
CustomSnippetPayload,
EndpointSnippetTemplate,
ParameterPayload,
Expand Down Expand Up @@ -40,7 +41,7 @@ export class SnippetTemplateResolver {

private accessParameterPayloadByPath(
parameterPayloads?: ParameterPayload[],
locationPath?: string,
locationPath?: string
): unknown | undefined {
const splitPath = locationPath?.split(".") ?? [];
const parameterName = splitPath.shift();
Expand All @@ -55,6 +56,13 @@ export class SnippetTemplateResolver {
return undefined;
}

private accessAuthPayloadByPath(authPayload?: AuthPayload, locationPath?: string): unknown {
if (authPayload != null) {
return this.accessByPath(authPayload, locationPath);
}
return undefined;
}

private getPayloadValue(location: PayloadInput, payloadOverride?: unknown): unknown | undefined {
if (location.location === "RELATIVE" && payloadOverride != null) {
return this.accessByPath(payloadOverride, location.path);
Expand All @@ -72,6 +80,8 @@ export class SnippetTemplateResolver {
return this.accessParameterPayloadByPath(this.payload.pathParameters, location.path);
case "HEADERS":
return this.accessParameterPayloadByPath(this.payload.headers, location.path);
case "AUTH":
return this.accessAuthPayloadByPath(this.payload.auth, location.path);
default:
throw new Error(`Unknown payload input type: ${location.location}`);
}
Expand All @@ -88,7 +98,7 @@ export class SnippetTemplateResolver {
invocation: template.templateString.replace(
// TODO: fix the typescript generator to create literals not as types
TemplateSentinel,
"",
""
),
};
}
Expand Down Expand Up @@ -118,7 +128,7 @@ export class SnippetTemplateResolver {
invocation: template.templateString.replace(
// TODO: fix the typescript generator to create literals not as types
TemplateSentinel,
evaluatedInputs.map((input) => input.invocation).join(template.inputDelimiter ?? ", "),
evaluatedInputs.map((input) => input.invocation).join(template.inputDelimiter ?? ", ")
),
}
: undefined;
Expand All @@ -143,7 +153,7 @@ export class SnippetTemplateResolver {
imports: imports.concat(evaluatedInputs.flatMap((input) => input.imports)),
invocation: template.containerTemplateString.replace(
TemplateSentinel,
evaluatedInputs.map((input) => input.invocation).join(template.delimiter ?? ", "),
evaluatedInputs.map((input) => input.invocation).join(template.delimiter ?? ", ")
),
};
}
Expand Down Expand Up @@ -173,7 +183,7 @@ export class SnippetTemplateResolver {
imports: imports.concat(evaluatedInputs.flatMap((input) => input.imports)),
invocation: template.containerTemplateString.replace(
TemplateSentinel,
evaluatedInputs.map((input) => input.invocation).join(template.delimiter ?? ", "),
evaluatedInputs.map((input) => input.invocation).join(template.delimiter ?? ", ")
),
};
}
Expand All @@ -200,7 +210,7 @@ export class SnippetTemplateResolver {
const maybeUnionValue = this.getPayloadValue(
// Defaults to relative since the python generator didn't specify this on historical templates
template.templateInput ?? { location: "RELATIVE" },
payloadOverride,
payloadOverride
);
if (maybeUnionValue == null || !isPlainObject(maybeUnionValue) || !(discriminator in maybeUnionValue)) {
return undefined;
Expand All @@ -219,7 +229,7 @@ export class SnippetTemplateResolver {

const evaluatedMember: V1Snippet | undefined = this.resolveV1Template(
selectedMemberTemplate,
payloadOverride,
payloadOverride
);
return evaluatedMember != null
? {
Expand All @@ -236,12 +246,12 @@ export class SnippetTemplateResolver {
}

private resolveSnippetV1TemplateString(template: SnippetTemplate): string {
const clientSnippet = template.clientInstantiation;
const clientSnippet = this.resolveV1Template(template.clientInstantiation);
const endpointSnippet = this.resolveV1Template(template.functionInvocation);

// TODO: We should split the Snippet data model to return these independently
// so there's more flexibility on the consumer end to decide how to use them.
return `${[...new Set(endpointSnippet?.imports ?? [])].join("\n")}\n\n${clientSnippet}\n${
return `${[...new Set(endpointSnippet?.imports ?? [])].join("\n")}\n\n${clientSnippet?.invocation}\n${
endpointSnippet?.invocation
}`;
}
Expand Down
Loading

0 comments on commit d41b271

Please sign in to comment.