Skip to content
← 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 · TypeScript
import {
  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>
  );
}