← Public packages
@kentcdodds/raycast
Raycast launcher: stored execute commands via webhooks (canonical; do not use raycast-shortcuts).
extension/src/run-code.tsx
71 lines · 1.8 KB · TypeScriptimport {
Action,
ActionPanel,
Detail,
Form,
Icon,
showToast,
Toast,
useNavigation,
} from "@raycast/api";
import { getErrorMessage, runCommand, stringifyResult } from "./kody-client";
const DEFAULT_CODE = `import { kody } from 'kody:runtime'
export default async function main() {
return { ok: true, at: new Date().toISOString() }
}
`;
export default function Command() {
const { push } = useNavigation();
async function onSubmit(values: { code: string; paramsJson: string }) {
try {
let params: Record<string, unknown> = {};
const raw = values.paramsJson?.trim() || "{}";
const parsed = JSON.parse(raw) as unknown;
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
throw new Error("Params must be a JSON object.");
}
params = parsed as Record<string, unknown>;
const result = await runCommand({ code: values.code, params });
await showToast({
style: Toast.Style.Success,
title: "Kody execute finished",
});
push(
<Detail
markdown={["# Ad-hoc execute", "```json", stringifyResult(result), "```"].join(
"\n\n",
)}
/>,
);
} catch (error) {
await showToast({
style: Toast.Style.Failure,
title: "Execute failed",
message: getErrorMessage(error),
});
}
}
return (
<Form
actions={
<ActionPanel>
<Action.SubmitForm title="Run" icon={Icon.Play} onSubmit={onSubmit} />
</ActionPanel>
}
>
<Form.TextArea
id="code"
title="ESM code"
defaultValue={DEFAULT_CODE}
info="Must export default async function main(params)"
/>
<Form.TextArea id="paramsJson" title="Params JSON" defaultValue="{}" />
</Form>
);
}