From c7a058edface2eb0ffba7c8295d11b128d3d88e1 Mon Sep 17 00:00:00 2001 From: Jordan Santell Date: Mon, 3 Nov 2025 10:43:03 -0800 Subject: [PATCH] chore: Typecheck remaining recipes/*. Skip typechecking on underscore-prefixed recipes that still need to be updated to latest API. Update more component types. --- packages/html/src/jsx.d.ts | 78 ++++++++++++++++--- recipes/{agentic.tsx => _agentic.tsx} | 0 ...howcase.tsx => _common-ui-v2-showcase.tsx} | 0 ...xtractor.tsx => _email-date-extractor.tsx} | 2 +- recipes/{gpeople.tsx => _gpeople.tsx} | 8 +- recipes/{link-list.tsx => _link-list.tsx} | 0 recipes/{plaid.tsx => _plaid.tsx} | 0 recipes/{recipe.tsx => _recipe.tsx} | 0 recipes/{todo-list.tsx => _todo-list.tsx} | 0 recipes/compiler.tsx | 4 +- recipes/email-summarizer.tsx | 6 +- recipes/gcal.tsx | 12 +-- tasks/check.sh | 1 + 13 files changed, 85 insertions(+), 26 deletions(-) rename recipes/{agentic.tsx => _agentic.tsx} (100%) rename recipes/{common-ui-v2-showcase.tsx => _common-ui-v2-showcase.tsx} (100%) rename recipes/{email-date-extractor.tsx => _email-date-extractor.tsx} (99%) rename recipes/{gpeople.tsx => _gpeople.tsx} (99%) rename recipes/{link-list.tsx => _link-list.tsx} (100%) rename recipes/{plaid.tsx => _plaid.tsx} (100%) rename recipes/{recipe.tsx => _recipe.tsx} (100%) rename recipes/{todo-list.tsx => _todo-list.tsx} (100%) diff --git a/packages/html/src/jsx.d.ts b/packages/html/src/jsx.d.ts index 419d490f9..ab9908e0e 100644 --- a/packages/html/src/jsx.d.ts +++ b/packages/html/src/jsx.d.ts @@ -3,18 +3,18 @@ // deno-lint-ignore-file ban-types import type { Cell, CellLike, Props, RenderNode, VNode } from "commontools"; +/** + * Used to represent DOM API's where users can either pass + * true or false as a boolean or as its equivalent strings. + */ +type Booleanish = boolean | "true" | "false"; + // DOM-ish types for the CT runtime. // The DOM is not directly available within the runtime, but the JSX // produced must be typed. This defines DOM types like React or Preact, // with a subset of supported features, and cannot rely on globals // existing like `HTMLElement` from TypeScript's `dom` lib. declare namespace CTDOM { - /** - * Used to represent DOM API's where users can either pass - * true or false as a boolean or as its equivalent strings. - */ - type Booleanish = boolean | "true" | "false"; - /** * @see {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/crossorigin MDN} */ @@ -1764,6 +1764,7 @@ declare namespace CTDOM { export interface HTMLAttributes extends AriaAttributes, DOMAttributes { // CT extensions "onClick"?: CellLike>; + "onChange"?: CellLike>; "children"?: RenderNode | undefined; // Allow React-isms "key"?: number; @@ -1794,7 +1795,7 @@ declare namespace CTDOM { | "search" | "send" | undefined; - hidden?: boolean | undefined; + hidden?: Booleanish; // CT addition to be compatible with our component usage of `hidden` id?: string | undefined; lang?: string | undefined; nonce?: string | undefined; @@ -2854,6 +2855,7 @@ interface CTHeadingElement extends CTHTMLElement {} interface CTCollapsibleElement extends CTHTMLElement {} interface CTThemeElement extends CTHTMLElement {} interface CTCodeEditorElement extends CTHTMLElement {} +interface CTCodeEditorLegacyElement extends CTHTMLElement {} interface CTScreenElement extends CTHTMLElement {} interface CTAutoLayoutElement extends CTHTMLElement {} interface CTButtonElement extends CTHTMLElement {} @@ -2881,6 +2883,28 @@ interface CTCTCollapsibleElement extends CTHTMLElement {} interface CTFragmentElement extends CTHTMLElement {} interface CTUpdaterElement extends CTHTMLElement {} interface CTGoogleOAuthElement extends CTHTMLElement {} +interface CTCanvasElement extends CTHTMLElement {} +interface CTDraggableElement extends CTHTMLElement {} +interface CTPlaidLinkElement extends CTHTMLElement {} + +interface CTDraggableAttributes extends CTHTMLAttributes { + "key"?: number; + "x"?: CellLike>; + "y"?: CellLike>; + "hidden"?: Booleanish; + "onpositionchange"?: CellLike>; +} + +interface CTCanvasAttributes extends CTHTMLAttributes { + "width"?: string | number; + "height"?: string | number; + "onct-canvas-click"?: CellLike>; +} + +interface CTPlaidLinkAttributes extends CTHTMLAttributes { + "$auth"?: any; + "products"?: string[]; +} interface CTGoogleOAuthAttributes extends CTHTMLAttributes { "$auth"?: any; @@ -2990,9 +3014,11 @@ interface CTMessageInputAttributes extends CTHTMLAttributes { interface CTSendMessageAttributes extends CTHTMLAttributes { "name"?: string; + "value"?: any; "placeholder"?: string; "appearance"?: "rounded"; "onmessagesend"?: CellLike>; + "inline"?: Booleanish; } interface CTScrollAttributes extends CTHTMLAttributes { @@ -3025,9 +3051,11 @@ interface CTButtonAttributes extends CTHTMLAttributes { | "secondary" | "ghost" | "link" + | "danger" | "pill"; "size"?: "default" | "sm" | "lg" | "icon"; "disabled"?: boolean; + "outline"?: boolean; "type"?: "button" | "submit" | "reset"; } @@ -3099,7 +3127,7 @@ interface CTInputAttributes extends CTHTMLAttributes { "validationPattern"?: string; "showValidation"?: boolean; "timingStrategy"?: string; - "timingDelay"?: number; + "timingDelay"?: number | string; "onct-change"?: any; "onct-focus"?: any; "onct-blur"?: any; @@ -3122,7 +3150,7 @@ interface CTCheckboxAttributes extends CTHTMLAttributes { "indeterminate"?: boolean; "name"?: string; "value"?: string; - "onct-change"?: any; + "onct-change"?: CellLike>; } interface CTSelectAttributes extends CTHTMLAttributes { @@ -3166,11 +3194,17 @@ interface CTCollapsibleAttributes extends CTHTMLAttributes { interface CTThemeAttributes extends CTHTMLAttributes { theme?: CTThemeInput; } +interface CTCodeEditorLegacyAttributes extends CTHTMLAttributes { + "source"?: string; + "language"?: `text/${string}`; + "onChange"?: any; + "errors"?: any[]; +} interface CTCodeEditorAttributes extends CTHTMLAttributes { "$value"?: CellLike; "value"?: string; - "language"?: string; + "language"?: `text/${string}`; "disabled"?: boolean; "readonly"?: boolean; "placeholder"?: string; @@ -3777,6 +3811,30 @@ declare global { CTGoogleOAuthAttributes, CTGoogleOAuthElement >; + "ct-canvas": CTDOM.DetailedHTMLProps< + CTCanvasAttributes, + CTCanvasElement + >; + "ct-draggable": CTDOM.DetailedHTMLProps< + CTDraggableAttributes, + CTDraggableElement + >; + "ct-alert": CTDOM.DetailedHTMLProps< + CTHTMLAttributes, + CTHTMLElement + >; + "os-container": CTDOM.DetailedHTMLProps< + CTHTMLAttributes, + CTHTMLElement + >; + "common-code-editor": CTDOM.DetailedHTMLProps< + CTCodeEditorLegacyAttributes, + CTCodeEditorLegacyElement + >; + "common-plaid-link": CTDOM.DetailedHTMLProps< + CTPlaidLinkAttributes, + CTPlaidLinkElement + >; // Define both `ct-` and `common-` variants "ct-hstack": CTDOM.DetailedHTMLProps< CTStackAttributes, diff --git a/recipes/agentic.tsx b/recipes/_agentic.tsx similarity index 100% rename from recipes/agentic.tsx rename to recipes/_agentic.tsx diff --git a/recipes/common-ui-v2-showcase.tsx b/recipes/_common-ui-v2-showcase.tsx similarity index 100% rename from recipes/common-ui-v2-showcase.tsx rename to recipes/_common-ui-v2-showcase.tsx diff --git a/recipes/email-date-extractor.tsx b/recipes/_email-date-extractor.tsx similarity index 99% rename from recipes/email-date-extractor.tsx rename to recipes/_email-date-extractor.tsx index d457dd389..d3b61a71b 100644 --- a/recipes/email-date-extractor.tsx +++ b/recipes/_email-date-extractor.tsx @@ -396,7 +396,7 @@ export default recipe( // The framework will handle empty content cases reactively const extractionResult = llm({ system: systemPrompt, - messages: [userPrompt], + messages: [{ role: "user", content: userPrompt }], model: "google:gemini-2.5-flash", mode: "json", }); diff --git a/recipes/gpeople.tsx b/recipes/_gpeople.tsx similarity index 99% rename from recipes/gpeople.tsx rename to recipes/_gpeople.tsx index 3992d3acb..4564ae20c 100644 --- a/recipes/gpeople.tsx +++ b/recipes/_gpeople.tsx @@ -1290,16 +1290,16 @@ export default recipe( })} /> - Fetch Contacts - - + Clear Contacts - + ( {ifElse( error, fix the errors, - Navigate To Charm - , + , )} ), diff --git a/recipes/email-summarizer.tsx b/recipes/email-summarizer.tsx index f1a2e6320..04f96ef4a 100644 --- a/recipes/email-summarizer.tsx +++ b/recipes/email-summarizer.tsx @@ -292,7 +292,7 @@ export default recipe( // Call LLM to generate summary const summaryResult = llm({ system: systemPrompt, - messages: [userPrompt], + messages: [{ role: "user", content: userPrompt }], }); // Return a simple object that references the original email @@ -348,9 +348,9 @@ export default recipe(
-
diff --git a/recipes/gcal.tsx b/recipes/gcal.tsx index 47149fdca..d834d1cb6 100644 --- a/recipes/gcal.tsx +++ b/recipes/gcal.tsx @@ -620,11 +620,11 @@ export default recipe(
@@ -659,7 +659,7 @@ export default recipe( })} /> - Fetch Events - - + Clear Events - +