# TypeScript (Deno) Deno runtime with npm support via `npm:` prefix and native Deno libraries. ## Structure Export a single **async** function called `main`: ```typescript export async function main(param1: string, param2: number) { // Your code here return { result: param1, count: param2 }; } ``` Do not call the main function. Libraries are installed automatically. ## Resource Types On Windmill, credentials and configuration are stored in resources and passed as parameters to main. Use the `RT` namespace for resource types: ```typescript export async function main(stripe: RT.Stripe) { // stripe contains API key and config from the resource } ``` Only use resource types if you need them to satisfy the instructions. Always use the RT namespace. Before using a resource type, check the `rt.d.ts` file in the project root to see all available resource types and their fields. This file is generated by `wmill resource-type generate-namespace`. ## Imports ```typescript // npm packages use npm: prefix import Stripe from "npm:stripe"; import { someFunction } from "npm:some-package"; // Deno standard library import { serve } from "https://deno.land/std/http/server.ts"; ``` ## Windmill Client Import the windmill client for platform interactions: ```typescript import * as wmill from "windmill-client"; ``` **Prefer `windmill-client` over raw `fetch` for anything that talks to Windmill** — reading resources/variables/states, running scripts and flows, S3 object operations, etc. It handles auth, the workspace, and the base URL for you. Reserve `fetch` for calling *external* HTTP APIs that aren't Windmill. The full `windmill-client` API reference (every exported function and its signature) is included in this skill below — consult it for the exact method instead of guessing or falling back to `fetch`. ## Preprocessor Scripts For preprocessor scripts, the function should be named `preprocessor` and receives an `event` parameter: ```typescript type Event = { kind: | "webhook" | "http" | "websocket" | "kafka" | "email" | "nats" | "postgres" | "sqs" | "mqtt" | "gcp"; body: any; headers: Record; query: Record; }; export async function preprocessor(event: Event) { return { param1: event.body.field1, param2: event.query.id, }; } ``` ## S3 Object Operations Windmill provides built-in support for S3-compatible storage operations. The `wmill.S3Object` type covers both the `s3://storage/key` URI form (`s3:///key` for the workspace default storage) and the `{ s3, storage? }` record form — always use it instead of redefining your own. ### Receiving an S3Object as a script parameter ```typescript import * as wmill from "windmill-client"; export async function main(file: wmill.S3Object) { const content = await wmill.loadS3File(file); // ... } ``` ### S3 operations ```typescript import * as wmill from "windmill-client"; // Load file content from S3 const content: Uint8Array = await wmill.loadS3File(s3object); // Load file as stream const blob: Blob = await wmill.loadS3FileStream(s3object); // Write file to S3 const result: wmill.S3Object = await wmill.writeS3File( s3object, // Target path (or undefined to auto-generate) fileContent, // string or Blob s3ResourcePath // Optional: specific S3 resource to use ); ```