Files
2026-07-13 13:32:57 +08:00

112 lines
3.3 KiB
TypeScript

import { BookOpenIcon } from "@heroicons/react/20/solid";
import { CodeBlock } from "~/components/code/CodeBlock";
import { LinkButton } from "~/components/primitives/Buttons";
import { Header3 } from "~/components/primitives/Headers";
import { Paragraph } from "~/components/primitives/Paragraph";
import { TextLink } from "~/components/primitives/TextLink";
import { docsPath } from "~/utils/pathBuilder";
export function SchemaTabContent({
schema,
inferredSchema,
title = "Payload schema",
description,
showDocsLink = true,
}: {
schema?: unknown;
inferredSchema?: unknown;
title?: string;
description?: string;
showDocsLink?: boolean;
}) {
if (schema) {
return (
<div className="space-y-2">
<div className="space-y-0.5">
<Header3 className="text-text-bright">{title}</Header3>
{showDocsLink ? (
<Paragraph variant="extra-small" className="text-text-dimmed">
{description ?? (
<>
JSON Schema defined by this task via{" "}
<TextLink to={docsPath("tasks/schemaTask")}>schemaTask</TextLink>.
</>
)}
</Paragraph>
) : description ? (
<Paragraph variant="extra-small" className="text-text-dimmed">
{description}
</Paragraph>
) : null}
</div>
<CodeBlock
code={JSON.stringify(schema, null, 2)}
language="json"
showLineNumbers={false}
showOpenInModal={false}
/>
</div>
);
}
if (inferredSchema) {
return (
<div className="space-y-3">
<Header3 className="text-text-bright">Inferred schema</Header3>
<Paragraph variant="extra-small" className="text-text-dimmed">
Schema inferred from recent run payloads. For an exact schema, use schemaTask.
</Paragraph>
<LinkButton
variant="docs/small"
LeadingIcon={BookOpenIcon}
to={docsPath("tasks/schemaTask")}
>
schemaTask docs
</LinkButton>
<CodeBlock
code={JSON.stringify(inferredSchema, null, 2)}
language="json"
showLineNumbers={false}
showOpenInModal={false}
/>
</div>
);
}
return (
<div className="space-y-3">
<Header3 className="text-text-bright">No schema defined</Header3>
<Paragraph variant="small" className="text-text-dimmed">
Use <code className="text-text-bright">schemaTask</code> to define a payload schema for this
task. The schema will appear here and can be used by AI to generate example payloads.
</Paragraph>
<LinkButton variant="docs/small" LeadingIcon={BookOpenIcon} to={docsPath("tasks/schemaTask")}>
schemaTask docs
</LinkButton>
<CodeBlock
code={exampleCode}
language="typescript"
showLineNumbers={false}
showCopyButton={false}
showOpenInModal={false}
/>
</div>
);
}
const exampleCode = `import { schemaTask } from "@trigger.dev/sdk";
import { z } from "zod";
export const myTask = schemaTask({
id: "my-task",
schema: z.object({
name: z.string(),
email: z.string().email(),
count: z.number().int().positive(),
}),
run: async (payload) => {
// payload is fully typed
console.log(payload.name);
},
});`;