From b874ba466d969af703447da6f9c9777d114c41cc Mon Sep 17 00:00:00 2001 From: Mike Wu Date: Tue, 13 Aug 2024 00:54:51 +0900 Subject: [PATCH] feat: add seam cli code samples --- src/lib/code-sample/bash.ts | 18 ++++++++++++++++++ src/lib/code-sample/schema.ts | 8 +++++++- test/snapshots/blueprint.test.ts.md | 20 ++++++++++++++++++++ test/snapshots/blueprint.test.ts.snap | Bin 2844 -> 2990 bytes 4 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 src/lib/code-sample/bash.ts diff --git a/src/lib/code-sample/bash.ts b/src/lib/code-sample/bash.ts new file mode 100644 index 0000000..e6640f2 --- /dev/null +++ b/src/lib/code-sample/bash.ts @@ -0,0 +1,18 @@ +import { kebabCase } from 'change-case' + +import { createJsonResponse } from './create-json-response.js' +import type { CodeSampleDefinition, Context } from './schema.js' + +export const createBashRequest = ( + { request }: CodeSampleDefinition, + _context: Context, +): string => { + const parts = request.path.split('/') + const requestParams = Object.entries(request.parameters) + .map(([key, value]) => `--${key} "${JSON.stringify(value)}"`) + .join(' ') + + return `seam${parts.map((p) => kebabCase(p)).join(' ')} ${requestParams}` +} + +export const createBashResponse = createJsonResponse diff --git a/src/lib/code-sample/schema.ts b/src/lib/code-sample/schema.ts index a3965a3..c298ee6 100644 --- a/src/lib/code-sample/schema.ts +++ b/src/lib/code-sample/schema.ts @@ -1,6 +1,7 @@ import { z } from 'zod' import type { Endpoint } from 'lib/blueprint.js' +import { createBashRequest, createBashResponse } from 'lib/code-sample/bash.js' import { JsonSchema } from 'lib/json.js' import { @@ -37,7 +38,7 @@ export type CodeSampleDefinition = z.output const CodeSampleSchema = CodeSampleDefinitionSchema.extend({ code: z.record( - z.enum(['javascript', 'python', 'php', 'ruby']), + z.enum(['javascript', 'python', 'php', 'ruby', 'bash']), z.object({ title: z.string().min(1), request: z.string(), @@ -79,6 +80,11 @@ export const createCodeSample = ( request: createPhpRequest(codeSampleDefinition, context), response: createPhpResponse(codeSampleDefinition, context), }, + bash: { + title: 'Bash', + request: createBashRequest(codeSampleDefinition, context), + response: createBashResponse(codeSampleDefinition, context), + }, }, } } diff --git a/test/snapshots/blueprint.test.ts.md b/test/snapshots/blueprint.test.ts.md index 0a3d950..acb6c61 100644 --- a/test/snapshots/blueprint.test.ts.md +++ b/test/snapshots/blueprint.test.ts.md @@ -68,6 +68,11 @@ Generated by [AVA](https://avajs.dev). codeSamples: [ { code: { + bash: { + request: 'seam foos get --foo_id ""8d7e0b3a-b889-49a7-9164-4b71a0506a33""', + response: '{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}', + title: 'Bash', + }, javascript: { request: 'await seam.foos.get({"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33"})', response: '{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}', @@ -137,6 +142,11 @@ Generated by [AVA](https://avajs.dev). codeSamples: [ { code: { + bash: { + request: 'seam foos get --foo_id ""8d7e0b3a-b889-49a7-9164-4b71a0506a33""', + response: '{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}', + title: 'Bash', + }, javascript: { request: 'await seam.foos.get({"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33"})', response: '{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}', @@ -206,6 +216,11 @@ Generated by [AVA](https://avajs.dev). codeSamples: [ { code: { + bash: { + request: 'seam foos list ', + response: '[{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]', + title: 'Bash', + }, javascript: { request: 'await seam.foos.list()', response: '[{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]', @@ -275,6 +290,11 @@ Generated by [AVA](https://avajs.dev). codeSamples: [ { code: { + bash: { + request: 'seam foos list ', + response: '[{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]', + title: 'Bash', + }, javascript: { request: 'await seam.foos.list()', response: '[{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]', diff --git a/test/snapshots/blueprint.test.ts.snap b/test/snapshots/blueprint.test.ts.snap index 14cc07a3dff56ad63442ef26c643b562f52fedeb..a30bf92f9e4ba05857c3745748faeacd71dab039 100644 GIT binary patch literal 2990 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 literal 2844 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