@seamapi/blueprint
Version:
Build tools for the Seam API using this blueprint.
82 lines (74 loc) • 2.25 kB
text/typescript
import type { Code, CodeSampleContext } from './code-sample.js'
import type { Resource, ResourceSampleContext } from './resource-sample.js'
type CodeEntries = Entries<Code>
type CodeEntry = NonNullable<CodeEntries[number]>
export const formatCodeRecords = async (
code: Code,
context: CodeSampleContext,
): Promise<Code> => {
const entries = Object.entries(code) as unknown as CodeEntries
const formattedEntries = await Promise.all(
entries.map(async (entry): Promise<CodeEntry> => {
if (entry == null) throw new Error('Unexpected null code entry')
return await formatCodeEntry(entry, context)
}),
)
return Object.fromEntries(formattedEntries)
}
const formatCodeEntry = async (
[key, code]: CodeEntry,
{ formatCode }: CodeSampleContext,
): Promise<CodeEntry> => {
if (code == null) throw new Error(`Unexpected null in code object for ${key}`)
const [request, response] = await Promise.all([
await formatCode(code.request, code.request_syntax),
await formatCode(code.response, code.response_syntax),
])
return [
key,
{
...code,
request,
response,
},
]
}
type ResourceEntries = Entries<Resource>
type ResourceEntry = NonNullable<ResourceEntries[number]>
export const formatResourceRecords = async (
resource: Resource,
context: ResourceSampleContext,
): Promise<Resource> => {
const entries = Object.entries(resource) as unknown as ResourceEntries
const formattedEntries = await Promise.all(
entries.map(async (entry): Promise<ResourceEntry> => {
if (entry == null) throw new Error('Unexpected null resource entry')
return await formatResourceEntry(entry, context)
}),
)
return Object.fromEntries(formattedEntries)
}
const formatResourceEntry = async (
[key, resource]: ResourceEntry,
{ formatCode }: ResourceSampleContext,
): Promise<ResourceEntry> => {
if (resource == null) {
throw new Error(`Unexpected null in resource object for ${key}`)
}
const resourceData = await formatCode(
resource.resource_data,
resource.resource_data_syntax,
)
return [
key,
{
...resource,
resource_data: resourceData,
},
]
}
type Entries<T> = Array<
{
[K in keyof T]: [K, T[K]]
}[keyof T]
>