diff --git a/packages/vitnode/src/components/form/auto-form.test.tsx b/packages/vitnode/src/components/form/auto-form.test.tsx
index 3b899cf4a..1cd2e233f 100644
--- a/packages/vitnode/src/components/form/auto-form.test.tsx
+++ b/packages/vitnode/src/components/form/auto-form.test.tsx
@@ -7,7 +7,7 @@ import { z } from "zod";
import messages from "@/locales/en.json";
import type { FormMode } from "../ui/form";
-import type { AutoFormOnSubmit } from "./auto-form";
+import type { AutoFormOnSubmit, ItemAutoFormComponentProps } from "./auto-form";
import { setFormFieldError } from "../ui/form";
import { AutoForm } from "./auto-form";
@@ -305,3 +305,33 @@ describe("AutoFormArray", () => {
expect(amounts().map(input => input.value)).toEqual(["1", "3"]);
});
});
+
+describe("field props", () => {
+ it("omits children entirely when a field has no nested fields", async () => {
+ const received: ItemAutoFormComponentProps[] = [];
+
+ await settled(() => {
+ render(
+
+ {
+ received.push(fieldProps);
+
+ return ;
+ },
+ },
+ ]}
+ formSchema={nameSchema}
+ onSubmit={() => {}}
+ />
+ ,
+ );
+ });
+
+ expect(received.length).toBeGreaterThan(0);
+ expect(received.every(props => !("children" in props))).toBe(true);
+ });
+});
diff --git a/packages/vitnode/src/components/form/auto-form.tsx b/packages/vitnode/src/components/form/auto-form.tsx
index 550bada8b..b4155096d 100644
--- a/packages/vitnode/src/components/form/auto-form.tsx
+++ b/packages/vitnode/src/components/form/auto-form.tsx
@@ -285,9 +285,9 @@ export function AutoForm>({
>
{component({
field,
- children: nestedFields.length
- ? nestedFields.map(renderField)
- : undefined,
+ ...(nestedFields.length
+ ? { children: nestedFields.map(renderField) }
+ : {}),
description:
typeof params.description === "string"
? params.description
diff --git a/packages/vitnode/src/components/ui/dynamic-icon.test.tsx b/packages/vitnode/src/components/ui/dynamic-icon.test.tsx
new file mode 100644
index 000000000..284d8ee5e
--- /dev/null
+++ b/packages/vitnode/src/components/ui/dynamic-icon.test.tsx
@@ -0,0 +1,33 @@
+// @vitest-environment node
+import React from "react";
+import { renderToReadableStream } from "react-dom/server";
+import { expect, test } from "vitest";
+
+import { DynamicIcon } from "./dynamic-icon";
+
+const renderToHtml = async (node: React.ReactElement) => {
+ const stream = await renderToReadableStream(node);
+ await stream.allReady;
+
+ return new Response(stream).text();
+};
+
+test("renders the icon into the server-rendered shell", async () => {
+ const html = await renderToHtml(
+ }
+ name="house"
+ />,
+ );
+
+ expect(html).toContain("lucide-house");
+ expect(html).toContain("size-4");
+ expect(html).not.toContain('id="fallback"');
+});
+
+test("renders nothing for an unknown icon", async () => {
+ const html = await renderToHtml();
+
+ expect(html).not.toContain("