Skip to content

Commit 9d07a43

Browse files
committed
Fleshed out settings so that try-it-now is optional
1 parent 67ef515 commit 9d07a43

File tree

5 files changed

+55
-50
lines changed

5 files changed

+55
-50
lines changed

packages/docs-md/src/generator/codeSnippets.ts

Lines changed: 25 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -10,42 +10,17 @@ import { getSettings } from "./settings.ts";
1010

1111
const CODE_SNIPPETS_API_URL = "http://api.speakeasy.com";
1212

13-
async function fetchCodeSnippets(
14-
language: string,
15-
schemeFile: {
16-
fileName: string;
17-
content: string;
18-
},
19-
packageName: string
20-
): Promise<CodeSnippet[]> {
21-
const formData = new FormData();
22-
23-
const blob = new Blob([schemeFile.content]);
24-
formData.append("language", language);
25-
formData.append("schema_file", blob, schemeFile.fileName);
26-
formData.append("package_name", packageName);
27-
28-
const res = await fetch(`${CODE_SNIPPETS_API_URL}/v1/code_sample/preview`, {
29-
method: "POST",
30-
body: formData,
31-
});
32-
33-
const json = (await res.json()) as unknown;
34-
35-
if (!res.ok) {
36-
const error = json as ErrorResponse;
37-
throw new Error(`Failed to generate code sample: ${error.message}`);
38-
}
39-
return (json as CodeSamplesResponse).snippets;
40-
}
41-
4213
export type DocsCodeSnippets = Record<OperationChunk["id"], CodeSnippet>;
4314

4415
export const generateDocsCodeSnippets = async (
4516
docsData: Map<string, Chunk>,
4617
specContents: string
4718
): Promise<DocsCodeSnippets> => {
48-
const { spec, npmPackageName } = getSettings();
19+
const { spec, tryItNow } = getSettings();
20+
if (!tryItNow) {
21+
return {};
22+
}
23+
4924
const docsCodeSnippets: DocsCodeSnippets = {};
5025

5126
const specFilename = basename(spec);
@@ -57,14 +32,26 @@ export const generateDocsCodeSnippets = async (
5732
}
5833
}
5934
try {
60-
const codeSnippets = await fetchCodeSnippets(
61-
"typescript",
62-
{
63-
fileName: specFilename,
64-
content: specContents,
65-
},
66-
npmPackageName
67-
);
35+
const formData = new FormData();
36+
37+
const blob = new Blob([specContents]);
38+
formData.append("language", "typescript");
39+
formData.append("schema_file", blob, specFilename);
40+
formData.append("package_name", tryItNow.npmPackageName);
41+
formData.append("sdk_class_name", tryItNow.sdkClassName);
42+
43+
const res = await fetch(`${CODE_SNIPPETS_API_URL}/v1/code_sample/preview`, {
44+
method: "POST",
45+
body: formData,
46+
});
47+
48+
const json = (await res.json()) as unknown;
49+
50+
if (!res.ok) {
51+
const error = json as ErrorResponse;
52+
throw new Error(`Failed to generate code sample: ${error.message}`);
53+
}
54+
const codeSnippets = (json as CodeSamplesResponse).snippets;
6855

6956
for (const snippet of codeSnippets) {
7057
const chunk = operationChunksByOperationId.get(snippet.operationId);

packages/docs-md/src/generator/generatePages.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { Settings } from "../types/settings.ts";
2+
import { generateDocsCodeSnippets } from "./codeSnippets.ts";
23
import { getDocsData } from "./docsData/getDocsData.ts";
34
import { generateContent } from "./mdx/generateContent.ts";
45
import { setSettings } from "./settings.ts";
@@ -18,9 +19,14 @@ export async function generatePages({
1819
setSettings(settings);
1920

2021
// Get the docs data from the spec
22+
console.log("Getting docs data");
2123
const data = await getDocsData(specContents);
2224

25+
// Get code snippets
26+
console.log("Generating code snippets");
27+
const docsCodeSnippets = await generateDocsCodeSnippets(data, specContents);
28+
2329
// Generate the content
2430
console.log("Generating Markdown pages");
25-
return generateContent(data);
31+
return generateContent(data, docsCodeSnippets);
2632
}

packages/docs-md/src/generator/mdx/chunks/operation.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ type RenderOperationOptions = {
1212
docsData: Map<string, Chunk>;
1313
baseHeadingLevel: number;
1414
docsCodeSnippets: DocsCodeSnippets;
15-
}
15+
};
1616

1717
export function renderOperation({
1818
renderer,
@@ -94,14 +94,17 @@ export function renderOperation({
9494
}
9595
}
9696

97+
const { tryItNow } = getSettings();
98+
9799
const usageSnippet = docsCodeSnippets[chunk.id];
98-
if (usageSnippet) {
100+
if (usageSnippet && tryItNow) {
101+
renderer.appendHeading(baseHeadingLevel + 1, "Try it Now");
99102
// TODO: Zod is actually hard coded for now since its always a dependency
100103
// in our SDKs. Ideally this will come from the SDK package.
101104
renderer.appendTryItNow({
102105
externalDependencies: {
103106
zod: "^3.25.64",
104-
[getSettings().npmPackageName]: "latest",
107+
[tryItNow.npmPackageName]: "latest",
105108
},
106109
defaultValue: usageSnippet.code,
107110
});

packages/docs-md/src/generator/mdx/generateContent.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ import { join, resolve } from "node:path";
22

33
import type { Chunk, SchemaChunk, TagChunk } from "../../types/chunk.ts";
44
import { assertNever } from "../../util/assertNever.ts";
5-
import type { DocsCodeSnippets} from "../codeSnippets.ts";
6-
import { generateDocsCodeSnippets } from "../codeSnippets.ts";
5+
import type { DocsCodeSnippets } from "../codeSnippets.ts";
76
import { getSettings } from "../settings.ts";
87
import { renderAbout } from "./chunks/about.ts";
98
import { renderOperation } from "./chunks/operation.ts";
@@ -146,8 +145,12 @@ function getPageMap(data: Data) {
146145
return pageMap;
147146
}
148147

149-
function renderPages(site: Site, pageMap: PageMap, data: Map<string, Chunk>, docsCodeSnippets: DocsCodeSnippets) {
150-
148+
function renderPages(
149+
site: Site,
150+
pageMap: PageMap,
151+
data: Map<string, Chunk>,
152+
docsCodeSnippets: DocsCodeSnippets
153+
) {
151154
for (const [currentPagePath, pageMapEntry] of pageMap) {
152155
if (pageMapEntry.type === "renderer") {
153156
const renderer = site.createPage(currentPagePath);
@@ -284,11 +287,12 @@ function renderScaffoldSupport(site: Site) {
284287
}
285288
}
286289

287-
export async function generateContent(data: Data): Promise<Record<string, string>> {
290+
export function generateContent(
291+
data: Data,
292+
docsCodeSnippets: DocsCodeSnippets
293+
): Record<string, string> {
288294
// First, get a mapping of pages to chunks
289295
const pageMap = getPageMap(data);
290-
const { spec } = getSettings();
291-
const docsCodeSnippets = await generateDocsCodeSnippets(data, spec);
292296
// Then, render each page
293297
const site = new Site();
294298
renderPages(site, pageMap, data, docsCodeSnippets);

packages/docs-md/src/types/settings.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { z } from "zod";
22

33
export const settingsSchema = z.strictObject({
44
spec: z.string(),
5-
npmPackageName: z.string(),
65
output: z.strictObject({
76
pageOutDir: z.string(),
87
componentOutDir: z.string(),
@@ -27,6 +26,12 @@ export const settingsSchema = z.strictObject({
2726
suggestions: z.array(z.string()).optional(),
2827
})
2928
.optional(),
29+
tryItNow: z
30+
.strictObject({
31+
npmPackageName: z.string(),
32+
sdkClassName: z.string(),
33+
})
34+
.optional(),
3035
});
3136

3237
export type Settings = z.infer<typeof settingsSchema>;

0 commit comments

Comments
 (0)