@sanity/form-toolkit

3.0.163.0.17
~

Modified (8 files)

Index: package/dist/form-renderer/index.js
===================================================================
--- package/dist/form-renderer/index.js
+++ package/dist/form-renderer/index.js
@@ -1,43 +1,35 @@
 import { c } from "react/compiler-runtime";
 import { Fragment, jsx, jsxs } from "react/jsx-runtime";
 const toRef = (ref) => ref, DefaultField = (t0) => {
-	let $ = c(44), { field, fieldState, error } = t0, { type, label, name, options: t1, choices: t2, validation: t3 } = field, t4;
+	let $ = c(43), { field, fieldState, error } = t0, { type, label, name, options: t1, choices: t2, validation: t3 } = field, t4;
 	$[0] === t1 ? t4 = $[1] : (t4 = t1 === void 0 ? {} : t1, $[0] = t1, $[1] = t4);
 	let options = t4, t5;
 	$[2] === t2 ? t5 = $[3] : (t5 = t2 === void 0 ? [] : t2, $[2] = t2, $[3] = t5);
-	let choices = t5, t6, t7;
-	if ($[4] !== name || $[5] !== t3 || $[6] !== type) {
-		t7 = Symbol.for("react.early_return_sentinel");
-		bb0: {
-			let validation = t3 === void 0 ? [] : t3;
-			if (!type || !name) {
-				t7 = null;
-				break bb0;
-			}
-			t6 = validation.reduce(_temp, {});
-		}
-		$[4] = name, $[5] = t3, $[6] = type, $[7] = t6, $[8] = t7;
-	} else t6 = $[7], t7 = $[8];
-	if (t7 !== Symbol.for("react.early_return_sentinel")) return t7;
-	let validationRules = t6, { value, onChange, onBlur, ref } = fieldState, isControlled = typeof onChange == "function", t8;
-	$[9] === onChange ? t8 = $[10] : (t8 = (e) => {
+	let choices = t5, t6;
+	$[4] === t3 ? t6 = $[5] : (t6 = t3 === void 0 ? [] : t3, $[4] = t3, $[5] = t6);
+	let validation = t6;
+	if (!type || !name) return null;
+	let t7;
+	$[6] === validation ? t7 = $[7] : (t7 = validation.reduce(_temp, {}), $[6] = validation, $[7] = t7);
+	let validationRules = t7, { value, onChange, onBlur, ref } = fieldState, isControlled = typeof onChange == "function", t8;
+	$[8] === onChange ? t8 = $[9] : (t8 = (e) => {
 		onChange?.(e.target.value);
-	}, $[9] = onChange, $[10] = t8);
+	}, $[8] = onChange, $[9] = t8);
 	let handleChange = t8, t9;
-	$[11] !== onChange || $[12] !== value ? (t9 = (e_0, choiceValue) => {
+	$[10] !== onChange || $[11] !== value ? (t9 = (e_0, choiceValue) => {
 		if (Array.isArray(value)) {
 			let newValue = e_0.target.checked ? [...value, choiceValue] : value.filter((v_0) => v_0 !== choiceValue);
 			onChange?.(newValue);
 		} else onChange?.(e_0.target.checked ? choiceValue : "");
-	}, $[11] = onChange, $[12] = value, $[13] = t9) : t9 = $[13];
+	}, $[10] = onChange, $[11] = value, $[12] = t9) : t9 = $[12];
 	let handleCheckboxChange = t9, t10;
-	$[14] !== handleChange || $[15] !== isControlled || $[16] !== value ? (t10 = (fallback) => isControlled ? {
+	$[13] !== handleChange || $[14] !== isControlled || $[15] !== value ? (t10 = (fallback) => isControlled ? {
 		value: value ?? "",
 		onChange: handleChange
-	} : { defaultValue: fallback }, $[14] = handleChange, $[15] = isControlled, $[16] = value, $[17] = t10) : t10 = $[17];
+	} : { defaultValue: fallback }, $[13] = handleChange, $[14] = isControlled, $[15] = value, $[16] = t10) : t10 = $[16];
 	let textValueProps = t10, t11;
-	$[18] !== choices || $[19] !== handleChange || $[20] !== handleCheckboxChange || $[21] !== isControlled || $[22] !== label || $[23] !== name || $[24] !== onBlur || $[25] !== options || $[26] !== ref || $[27] !== textValueProps || $[28] !== type || $[29] !== validationRules || $[30] !== value ? (t11 = () => {
+	$[17] !== choices || $[18] !== handleChange || $[19] !== handleCheckboxChange || $[20] !== isControlled || $[21] !== label || $[22] !== name || $[23] !== onBlur || $[24] !== options || $[25] !== ref || $[26] !== textValueProps || $[27] !== type || $[28] !== validationRules || $[29] !== value ? (t11 = () => {
 		switch (type) {
 			case "submit": return /* @__PURE__ */ jsx("button", {
 				type: "submit",
 				children: label || "Submit"
@@ -91,27 +83,27 @@
 				onBlur,
 				placeholder: options.placeholder
 			});
 		}
-	}, $[18] = choices, $[19] = handleChange, $[20] = handleCheckboxChange, $[21] = isControlled, $[22] = label, $[23] = name, $[24] = onBlur, $[25] = options, $[26] = ref, $[27] = textValueProps, $[28] = type, $[29] = validationRules, $[30] = value, $[31] = t11) : t11 = $[31];
+	}, $[17] = choices, $[18] = handleChange, $[19] = handleCheckboxChange, $[20] = isControlled, $[21] = label, $[22] = name, $[23] = onBlur, $[24] = options, $[25] = ref, $[26] = textValueProps, $[27] = type, $[28] = validationRules, $[29] = value, $[30] = t11) : t11 = $[30];
 	let renderInput = t11, t12;
-	$[32] !== label || $[33] !== name || $[34] !== type ? (t12 = label && !["hidden", "submit"].includes(type) && /* @__PURE__ */ jsx("label", {
+	$[31] !== label || $[32] !== name || $[33] !== type ? (t12 = label && !["hidden", "submit"].includes(type) && /* @__PURE__ */ jsx("label", {
 		htmlFor: name,
 		children: label
-	}), $[32] = label, $[33] = name, $[34] = type, $[35] = t12) : t12 = $[35];
+	}), $[31] = label, $[32] = name, $[33] = type, $[34] = t12) : t12 = $[34];
 	let t13;
-	$[36] === renderInput ? t13 = $[37] : (t13 = renderInput(), $[36] = renderInput, $[37] = t13);
+	$[35] === renderInput ? t13 = $[36] : (t13 = renderInput(), $[35] = renderInput, $[36] = t13);
 	let t14;
-	$[38] === error ? t14 = $[39] : (t14 = error && /* @__PURE__ */ jsx("span", {
+	$[37] === error ? t14 = $[38] : (t14 = error && /* @__PURE__ */ jsx("span", {
 		className: "error",
 		children: error
-	}), $[38] = error, $[39] = t14);
+	}), $[37] = error, $[38] = t14);
 	let t15;
-	return $[40] !== t12 || $[41] !== t13 || $[42] !== t14 ? (t15 = /* @__PURE__ */ jsxs(Fragment, { children: [
+	return $[39] !== t12 || $[40] !== t13 || $[41] !== t14 ? (t15 = /* @__PURE__ */ jsxs(Fragment, { children: [
 		t12,
 		t13,
 		t14
-	] }), $[40] = t12, $[41] = t13, $[42] = t14, $[43] = t15) : t15 = $[43], t15;
+	] }), $[39] = t12, $[40] = t13, $[41] = t14, $[42] = t15) : t15 = $[42], t15;
 };
 function _temp(acc, v) {
 	return acc[v.type] = v.value, acc;
 }
Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@sanity/form-toolkit",
-  "version": "3.0.16",
+  "version": "3.0.17",
   "description": "Tool kit for integrating forms with a Sanity Studio",
   "keywords": [
     "sanity",
     "sanity-plugin"
@@ -34,9 +34,9 @@
     "@mailchimp/mailchimp_marketing": "^3.0.80",
     "@sanity/ui": "^4.0.4",
     "h3": "^1.15.11",
     "react-icons": "^5.7.0",
-    "@sanity/sanity-plugin-async-list": "^3.0.3"
+    "@sanity/sanity-plugin-async-list": "^3.0.4"
   },
   "devDependencies": {
     "@sanity/tsconfig": "^2.2.1",
     "@sanity/tsdown-config": "^0.26.0",
@@ -44,10 +44,10 @@
     "@types/mailchimp__mailchimp_marketing": "^3.0.22",
     "@types/node": "^24.13.3",
     "@types/react": "^19.2.18",
     "@types/react-dom": "^19.2.4",
-    "babel-plugin-react-compiler": "^1.0.0",
     "jsdom": "^29.1.1",
+    "oxc-transform-react": "^0.145.0",
     "react": "^19.2.8",
     "react-dom": "^19.2.8",
     "sanity": "^6.10.1",
     "tsdown": "^0.22.14"
Index: package/dist/create-handler-2pX-bzeN.js.map
===================================================================
--- package/dist/create-handler-2pX-bzeN.js.map
+++ package/dist/create-handler-2pX-bzeN.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"create-handler-2pX-bzeN.js","names":["IncomingMessage","ServerResponse","defineEventHandler","H3Event","detectFramework","process","env","createHandler","handlerFunc","Promise","framework","handlerLogic","res","req","Request","data","writeHead","end","JSON","stringify","error","Error","message","setHeader","method","event","node","GET","request","result","Response","headers","loader","get","body"],"sources":["../src/shared/create-handler.ts"],"sourcesContent":["import type {IncomingMessage, ServerResponse} from 'node:http'\n\nimport {defineEventHandler, type H3Event} from 'h3' // For Nuxt.js/Nitro\n\n// Utility function to detect the framework at runtime\nconst detectFramework = (): string => {\n  if (process.env['NEXT_RUNTIME']) {\n    return 'nextjs'\n  } else if (process.env['NUXT_ENV']) {\n    return 'nuxt'\n  } else if (process.env['SVELTEKIT_ENV']) {\n    return 'sveltekit'\n  } else if (process.env['REMIX_ENV']) {\n    return 'remix'\n  } else if (process.env['ASTRO_ENV']) {\n    return 'astro'\n  }\n  // Default to the Next.js-compatible handler. The framework env vars above\n  // aren't always set (e.g. Next.js API routes where NEXT_RUNTIME is absent),\n  // and throwing here would break the most common setup.\n  return 'nextjs'\n}\n\n// Create a generic handler with predefined logic\nconst createHandler = (handlerFunc: () => Promise<unknown>) => {\n  const framework = detectFramework()\n\n  // Handler logic to fetch Mailchimp data\n  const handlerLogic = async ({\n    res,\n  }: {\n    req: IncomingMessage | Request\n    res?: ServerResponse\n  }): Promise<unknown> => {\n    try {\n      const data = await handlerFunc()\n\n      if (res) {\n        // Send response directly for frameworks like Next.js and Nuxt.js\n        res.writeHead(200, {'Content-Type': 'application/json'})\n        res.end(JSON.stringify(data))\n      }\n\n      // Return the response for frameworks like SvelteKit, Remix, and Astro\n      return data\n    } catch (error) {\n      if (error instanceof Error) {\n        if (res) {\n          res.writeHead(500, {'Content-Type': 'application/json'})\n          res.end(JSON.stringify({error: error.message}))\n        }\n        return {error: error.message}\n      }\n      // Handle non-Error types (e.g., strings, objects)\n      if (res) {\n        res.writeHead(500, {'Content-Type': 'application/json'})\n        res.end(JSON.stringify({error: 'An unexpected error occurred'}))\n      }\n      return {error: 'An unexpected error occurred'}\n    }\n  }\n\n  // Framework-specific implementations\n  if (framework === 'nextjs') {\n    return async (req: IncomingMessage, res: ServerResponse) => {\n      // Set CORS headers\n      res.setHeader('Access-Control-Allow-Origin', '*') // Allow all origins\n      res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS') // Allowed HTTP methods\n      res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization') // Allowed headers\n\n      // Short-circuit CORS preflight requests so we don't hit the upstream API\n      if (req.method === 'OPTIONS') {\n        res.writeHead(204)\n        res.end()\n        return\n      }\n\n      await handlerLogic({req, res})\n    }\n  } else if (framework === 'nuxt') {\n    return defineEventHandler(async (event: H3Event) => {\n      const req = event.node.req\n      const res = event.node.res\n      return handlerLogic({req, res})\n    })\n  } else if (framework === 'sveltekit') {\n    return {\n      GET: async ({request}: {request: Request}) => {\n        const result = await handlerLogic({req: request})\n        return new Response(JSON.stringify(result), {\n          headers: {'Content-Type': 'application/json'},\n        })\n      },\n    }\n  } else if (framework === 'remix') {\n    return {\n      loader: async ({request}: {request: Request}) => {\n        const result = await handlerLogic({req: request})\n        return new Response(JSON.stringify(result), {\n          headers: {'Content-Type': 'application/json'},\n        })\n      },\n    }\n  } else if (framework === 'astro') {\n    return {\n      get: async ({request}: {request: Request}) => {\n        const result = await handlerLogic({req: request})\n        return {\n          body: JSON.stringify(result),\n          headers: {'Content-Type': 'application/json'},\n        }\n      },\n    }\n  }\n  throw new Error(`Unsupported framework: ${framework}`)\n}\n\nexport default createHandler\n"],"mappings":";AAKA,MAAMI,wBACAC,QAAQC,IAAI,eACP,WACED,QAAQC,IAAI,WACd,SACED,QAAQC,IAAI,gBACd,cACED,QAAQC,IAAI,YACd,UACED,QAAQC,IAAI,YACd,UAKF,UAIHC,iBAAiBC,gBAAwC;CAC7D,IAAME,YAAYN,gBAAgB,GAG5BO,eAAe,OAAO,EAC1BC,UAIsB;EACtB,IAAI;GACF,IAAMG,OAAO,MAAMP,YAAY;GAS/B,OAPII,QAEFA,IAAII,UAAU,KAAK,EAAC,gBAAgB,mBAAkB,CAAC,GACvDJ,IAAIK,IAAIC,KAAKC,UAAUJ,IAAI,CAAC,IAIvBA;EACT,SAASK,OAAO;GAad,OAZIA,iBAAiBC,SACfT,QACFA,IAAII,UAAU,KAAK,EAAC,gBAAgB,mBAAkB,CAAC,GACvDJ,IAAIK,IAAIC,KAAKC,UAAU,EAACC,OAAOA,MAAME,QAAO,CAAC,CAAC,IAEzC,EAACF,OAAOA,MAAME,QAAO,MAG1BV,QACFA,IAAII,UAAU,KAAK,EAAC,gBAAgB,mBAAkB,CAAC,GACvDJ,IAAIK,IAAIC,KAAKC,UAAU,EAACC,OAAO,+BAA8B,CAAC,CAAC,IAE1D,EAACA,OAAO,+BAA8B;EAC/C;CACF;CAGA,IAAIV,cAAc,UAChB,OAAO,OAAOG,KAAsBD,QAAwB;EAO1D,IALAA,IAAIW,UAAU,+BAA+B,GAAG,GAChDX,IAAIW,UAAU,gCAAgC,iCAAiC,GAC/EX,IAAIW,UAAU,gCAAgC,6BAA6B,GAGvEV,IAAIW,WAAW,WAAW;GAE5BZ,AADAA,IAAII,UAAU,GAAG,GACjBJ,IAAIK,IAAI;GACR;EACF;EAEA,MAAMN,aAAa;GAACE;GAAKD;EAAG,CAAC;CAC/B;CACK,IAAIF,cAAc,QACvB,OAAOR,mBAAmB,OAAOuB,UAAmB;EAClD,IAAMZ,MAAMY,MAAMC,KAAKb,KACjBD,MAAMa,MAAMC,KAAKd;EACvB,OAAOD,aAAa;GAACE;GAAKD;EAAG,CAAC;CAChC,CAAC;CACI,IAAIF,cAAc,aACvB,OAAO,EACLiB,KAAK,OAAO,EAACC,cAAiC;EAC5C,IAAMC,SAAS,MAAMlB,aAAa,EAACE,KAAKe,QAAO,CAAC;EAChD,OAAO,IAAIE,SAASZ,KAAKC,UAAUU,MAAM,GAAG,EAC1CE,SAAS,EAAC,gBAAgB,mBAAkB,EAC9C,CAAC;CACH,EACF;CACK,IAAIrB,cAAc,SACvB,OAAO,EACLsB,QAAQ,OAAO,EAACJ,cAAiC;EAC/C,IAAMC,SAAS,MAAMlB,aAAa,EAACE,KAAKe,QAAO,CAAC;EAChD,OAAO,IAAIE,SAASZ,KAAKC,UAAUU,MAAM,GAAG,EAC1CE,SAAS,EAAC,gBAAgB,mBAAkB,EAC9C,CAAC;CACH,EACF;CACK,IAAIrB,cAAc,SACvB,OAAO,EACLuB,KAAK,OAAO,EAACL,cAAiC;EAC5C,IAAMC,SAAS,MAAMlB,aAAa,EAACE,KAAKe,QAAO,CAAC;EAChD,OAAO;GACLM,MAAMhB,KAAKC,UAAUU,MAAM;GAC3BE,SAAS,EAAC,gBAAgB,mBAAkB;EAC9C;CACF,EACF;CAEF,MAAUV,MAAM,0BAA0BX,WAAW;AACvD"}
\ No newline at end of file
+{"version":3,"file":"create-handler-2pX-bzeN.js","names":[],"sources":["../src/shared/create-handler.ts"],"sourcesContent":["import type {IncomingMessage, ServerResponse} from 'node:http'\n\nimport {defineEventHandler, type H3Event} from 'h3' // For Nuxt.js/Nitro\n\n// Utility function to detect the framework at runtime\nconst detectFramework = (): string => {\n  if (process.env['NEXT_RUNTIME']) {\n    return 'nextjs'\n  } else if (process.env['NUXT_ENV']) {\n    return 'nuxt'\n  } else if (process.env['SVELTEKIT_ENV']) {\n    return 'sveltekit'\n  } else if (process.env['REMIX_ENV']) {\n    return 'remix'\n  } else if (process.env['ASTRO_ENV']) {\n    return 'astro'\n  }\n  // Default to the Next.js-compatible handler. The framework env vars above\n  // aren't always set (e.g. Next.js API routes where NEXT_RUNTIME is absent),\n  // and throwing here would break the most common setup.\n  return 'nextjs'\n}\n\n// Create a generic handler with predefined logic\nconst createHandler = (handlerFunc: () => Promise<unknown>) => {\n  const framework = detectFramework()\n\n  // Handler logic to fetch Mailchimp data\n  const handlerLogic = async ({\n    res,\n  }: {\n    req: IncomingMessage | Request\n    res?: ServerResponse\n  }): Promise<unknown> => {\n    try {\n      const data = await handlerFunc()\n\n      if (res) {\n        // Send response directly for frameworks like Next.js and Nuxt.js\n        res.writeHead(200, {'Content-Type': 'application/json'})\n        res.end(JSON.stringify(data))\n      }\n\n      // Return the response for frameworks like SvelteKit, Remix, and Astro\n      return data\n    } catch (error) {\n      if (error instanceof Error) {\n        if (res) {\n          res.writeHead(500, {'Content-Type': 'application/json'})\n          res.end(JSON.stringify({error: error.message}))\n        }\n        return {error: error.message}\n      }\n      // Handle non-Error types (e.g., strings, objects)\n      if (res) {\n        res.writeHead(500, {'Content-Type': 'application/json'})\n        res.end(JSON.stringify({error: 'An unexpected error occurred'}))\n      }\n      return {error: 'An unexpected error occurred'}\n    }\n  }\n\n  // Framework-specific implementations\n  if (framework === 'nextjs') {\n    return async (req: IncomingMessage, res: ServerResponse) => {\n      // Set CORS headers\n      res.setHeader('Access-Control-Allow-Origin', '*') // Allow all origins\n      res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS') // Allowed HTTP methods\n      res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization') // Allowed headers\n\n      // Short-circuit CORS preflight requests so we don't hit the upstream API\n      if (req.method === 'OPTIONS') {\n        res.writeHead(204)\n        res.end()\n        return\n      }\n\n      await handlerLogic({req, res})\n    }\n  } else if (framework === 'nuxt') {\n    return defineEventHandler(async (event: H3Event) => {\n      const req = event.node.req\n      const res = event.node.res\n      return handlerLogic({req, res})\n    })\n  } else if (framework === 'sveltekit') {\n    return {\n      GET: async ({request}: {request: Request}) => {\n        const result = await handlerLogic({req: request})\n        return new Response(JSON.stringify(result), {\n          headers: {'Content-Type': 'application/json'},\n        })\n      },\n    }\n  } else if (framework === 'remix') {\n    return {\n      loader: async ({request}: {request: Request}) => {\n        const result = await handlerLogic({req: request})\n        return new Response(JSON.stringify(result), {\n          headers: {'Content-Type': 'application/json'},\n        })\n      },\n    }\n  } else if (framework === 'astro') {\n    return {\n      get: async ({request}: {request: Request}) => {\n        const result = await handlerLogic({req: request})\n        return {\n          body: JSON.stringify(result),\n          headers: {'Content-Type': 'application/json'},\n        }\n      },\n    }\n  }\n  throw new Error(`Unsupported framework: ${framework}`)\n}\n\nexport default createHandler\n"],"mappings":";AAKA,MAAM,wBACA,QAAQ,IAAI,eACP,WACE,QAAQ,IAAI,WACd,SACE,QAAQ,IAAI,gBACd,cACE,QAAQ,IAAI,YACd,UACE,QAAQ,IAAI,YACd,UAKF,UAIH,iBAAiB,gBAAwC;CAC7D,IAAM,YAAY,gBAAgB,GAG5B,eAAe,OAAO,EAC1B,UAIsB;EACtB,IAAI;GACF,IAAM,OAAO,MAAM,YAAY;GAS/B,OAPI,QAEF,IAAI,UAAU,KAAK,EAAC,gBAAgB,mBAAkB,CAAC,GACvD,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,IAIvB;EACT,SAAS,OAAO;GAad,OAZI,iBAAiB,SACf,QACF,IAAI,UAAU,KAAK,EAAC,gBAAgB,mBAAkB,CAAC,GACvD,IAAI,IAAI,KAAK,UAAU,EAAC,OAAO,MAAM,QAAO,CAAC,CAAC,IAEzC,EAAC,OAAO,MAAM,QAAO,MAG1B,QACF,IAAI,UAAU,KAAK,EAAC,gBAAgB,mBAAkB,CAAC,GACvD,IAAI,IAAI,KAAK,UAAU,EAAC,OAAO,+BAA8B,CAAC,CAAC,IAE1D,EAAC,OAAO,+BAA8B;EAC/C;CACF;CAGA,IAAI,cAAc,UAChB,OAAO,OAAO,KAAsB,QAAwB;EAO1D,IALA,IAAI,UAAU,+BAA+B,GAAG,GAChD,IAAI,UAAU,gCAAgC,iCAAiC,GAC/E,IAAI,UAAU,gCAAgC,6BAA6B,GAGvE,IAAI,WAAW,WAAW;GAE5B,AADA,IAAI,UAAU,GAAG,GACjB,IAAI,IAAI;GACR;EACF;EAEA,MAAM,aAAa;GAAC;GAAK;EAAG,CAAC;CAC/B;CACK,IAAI,cAAc,QACvB,OAAO,mBAAmB,OAAO,UAAmB;EAClD,IAAM,MAAM,MAAM,KAAK,KACjB,MAAM,MAAM,KAAK;EACvB,OAAO,aAAa;GAAC;GAAK;EAAG,CAAC;CAChC,CAAC;CACI,IAAI,cAAc,aACvB,OAAO,EACL,KAAK,OAAO,EAAC,cAAiC;EAC5C,IAAM,SAAS,MAAM,aAAa,EAAC,KAAK,QAAO,CAAC;EAChD,OAAO,IAAI,SAAS,KAAK,UAAU,MAAM,GAAG,EAC1C,SAAS,EAAC,gBAAgB,mBAAkB,EAC9C,CAAC;CACH,EACF;CACK,IAAI,cAAc,SACvB,OAAO,EACL,QAAQ,OAAO,EAAC,cAAiC;EAC/C,IAAM,SAAS,MAAM,aAAa,EAAC,KAAK,QAAO,CAAC;EAChD,OAAO,IAAI,SAAS,KAAK,UAAU,MAAM,GAAG,EAC1C,SAAS,EAAC,gBAAgB,mBAAkB,EAC9C,CAAC;CACH,EACF;CACK,IAAI,cAAc,SACvB,OAAO,EACL,KAAK,OAAO,EAAC,cAAiC;EAC5C,IAAM,SAAS,MAAM,aAAa,EAAC,KAAK,QAAO,CAAC;EAChD,OAAO;GACL,MAAM,KAAK,UAAU,MAAM;GAC3B,SAAS,EAAC,gBAAgB,mBAAkB;EAC9C;CACF,EACF;CAEF,MAAU,MAAM,0BAA0B,WAAW;AACvD"}
\ No newline at end of file
Index: package/dist/form-renderer/index.js.map
===================================================================
--- package/dist/form-renderer/index.js.map
+++ package/dist/form-renderer/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["ChangeEvent","FC","Ref","FieldComponentProps","toRef","HTMLElement","ref","T","DefaultField","t0","$","_c","field","fieldState","error","type","label","name","options","t1","choices","t2","validation","t3","t4","undefined","t5","t6","t7","Symbol","for","bb0","reduce","_temp","validationRules","value","onChange","onBlur","isControlled","t8","e","target","handleChange","t9","e_0","choiceValue","Array","isArray","newValue","checked","filter","v_0","v","handleCheckboxChange","t10","fallback","defaultValue","textValueProps","t11","placeholder","map","_temp2","choice_0","choice","includes","e_1","renderInput","t12","t13","t14","t15","acc","choice_1","ComponentType","FC","HTMLProps","DefaultField","FieldComponentProps","FieldState","FormDataProps","FormField","FormRendererProps","HTMLFormElement","formData","getFieldState","fieldName","getFieldError","fieldComponents","Record","EMPTY_FIELD_STATE","defaultGetFieldState","defaultFieldComponents","FormRenderer","props","$","_c","t0","t1","children","undefined","t2","field","CustomComponent","type","fieldState","name","error","renderField","elProps","Object","assign","t3","id","current","t4","fields","map","field_0","_key","t5","submitButton","text","t6","label","t7"],"sources":["../../src/form-renderer/components/default-field.tsx","../../src/form-renderer/components/form-renderer.tsx"],"sourcesContent":["import type {ChangeEvent, FC, Ref} from 'react'\n\nimport type {FieldComponentProps} from './types'\n\n// oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- FieldState.ref is loosely typed so refs from any form library can be passed through\nconst toRef = <T extends HTMLElement>(ref: unknown) => ref as Ref<T> | undefined\n\nexport const DefaultField: FC<FieldComponentProps> = ({field, fieldState, error}) => {\n  const {type, label, name, options = {}, choices = [], validation = []} = field\n  if (!type || !name) return null\n  const validationRules = validation.reduce((acc: Record<string, string>, v) => {\n    acc[v.type] = v.value\n    return acc\n  }, {})\n  const {value, onChange, onBlur, ref} = fieldState\n  // Without an onChange handler the fields render as uncontrolled inputs, so the\n  // browser keeps them interactive (e.g. the default native-form usage). When a\n  // handler is provided (react-hook-form, TanStack Form, etc.) they're controlled.\n  const isControlled = typeof onChange === 'function'\n\n  const handleChange = (\n    e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>,\n  ) => {\n    onChange?.(e.target.value)\n  }\n\n  const handleCheckboxChange = (e: ChangeEvent<HTMLInputElement>, choiceValue: string) => {\n    if (Array.isArray(value)) {\n      const newValue = e.target.checked\n        ? [...value, choiceValue]\n        : value.filter((v: string) => v !== choiceValue)\n      onChange?.(newValue)\n    } else {\n      onChange?.(e.target.checked ? choiceValue : '')\n    }\n  }\n\n  // Controlled inputs bind `value`/`onChange` from form state only — never the\n  // schema default, which would desync the UI from what the form library submits.\n  // Uncontrolled (native) inputs use `defaultValue` so the browser owns state.\n  const textValueProps = (fallback?: string) =>\n    isControlled ? {value: value ?? '', onChange: handleChange} : {defaultValue: fallback}\n\n  const renderInput = () => {\n    switch (type) {\n      case 'submit':\n        return <button type=\"submit\">{label || 'Submit'}</button>\n      case 'textarea':\n        return (\n          <textarea\n            ref={toRef<HTMLTextAreaElement>(ref)}\n            name={name}\n            onBlur={onBlur}\n            placeholder={options.placeholder}\n            {...validationRules}\n            {...textValueProps(options.defaultValue)}\n          />\n        )\n\n      case 'select':\n        return (\n          <select\n            ref={toRef<HTMLSelectElement>(ref)}\n            name={name}\n            {...textValueProps()}\n            {...validationRules}\n            onBlur={onBlur}\n          >\n            {choices?.map((choice) => (\n              <option key={choice.value} value={choice.value}>\n                {choice.label}\n              </option>\n            ))}\n          </select>\n        )\n\n      case 'radio':\n        return choices?.map((choice) => (\n          <label key={choice.value}>\n            <input\n              type=\"radio\"\n              name={name}\n              ref={toRef<HTMLInputElement>(ref)}\n              value={choice.value}\n              onBlur={onBlur}\n              {...validationRules}\n              {...(isControlled ? {checked: value === choice.value, onChange: handleChange} : {})}\n            />\n            {choice.label}\n          </label>\n        ))\n\n      case 'checkbox':\n        return choices?.map((choice) => (\n          <label key={choice.value}>\n            <input\n              type=\"checkbox\"\n              name={name}\n              ref={toRef<HTMLInputElement>(ref)}\n              value={choice.value}\n              onBlur={onBlur}\n              {...validationRules}\n              {...(isControlled\n                ? {\n                    checked: Array.isArray(value)\n                      ? value.includes(choice.value)\n                      : value === choice.value,\n                    onChange: (e: ChangeEvent<HTMLInputElement>) =>\n                      handleCheckboxChange(e, choice.value),\n                  }\n                : {})}\n            />\n            {choice.label}\n          </label>\n        ))\n\n      default:\n        return (\n          <input\n            type={type}\n            ref={toRef<HTMLInputElement>(ref)}\n            name={name}\n            {...textValueProps(options.defaultValue)}\n            {...validationRules}\n            onBlur={onBlur}\n            placeholder={options.placeholder}\n          />\n        )\n    }\n  }\n\n  return (\n    <>\n      {label && !['hidden', 'submit'].includes(type) && <label htmlFor={name}>{label}</label>}\n      {renderInput()}\n      {error && <span className=\"error\">{error}</span>}\n    </>\n  )\n}\n","import type {ComponentType, FC, HTMLProps} from 'react'\n\nimport {DefaultField} from './default-field'\nimport type {FieldComponentProps, FieldState, FormDataProps, FormField} from './types'\n\ninterface FormRendererProps extends HTMLProps<HTMLFormElement> {\n  formData?: FormDataProps\n  // Function to get field state for a given field name\n  getFieldState?: (fieldName: string) => FieldState\n  // Function to get field error for a given field name\n  getFieldError?: (fieldName: string) => string | undefined\n  // Override default field components\n  fieldComponents?: Record<string, ComponentType<FieldComponentProps>>\n}\n\n// No field state by default: fields render as uncontrolled, interactive inputs\n// so the form works out of the box (e.g. as a native HTML form). Consumers can\n// pass `getFieldState` to make the fields controlled.\nconst EMPTY_FIELD_STATE: FieldState = {}\nconst defaultGetFieldState = (): FieldState => EMPTY_FIELD_STATE\n\nconst defaultFieldComponents: Record<string, ComponentType<FieldComponentProps>> = {}\n\nexport const FormRenderer: FC<FormRendererProps> = (props) => {\n  const {\n    formData,\n    getFieldState = defaultGetFieldState,\n    getFieldError,\n    fieldComponents = defaultFieldComponents,\n    children,\n  } = props\n  const renderField = (field: FormField) => {\n    const CustomComponent = fieldComponents[field.type]\n    const fieldState = getFieldState(field.name)\n    const error = getFieldError?.(field.name)\n\n    if (CustomComponent) {\n      return <CustomComponent field={field} fieldState={fieldState} error={error} />\n    }\n\n    return <DefaultField field={field} fieldState={fieldState} error={error} />\n  }\n  const elProps = Object.assign({}, props)\n  delete elProps.formData\n  delete elProps.getFieldState\n  delete elProps.getFieldError\n  delete elProps.fieldComponents\n\n  return (\n    <form {...elProps} id={elProps.id ?? formData?.id?.current}>\n      {formData?.fields?.map((field) => (\n        <div key={field._key ?? field.name} className=\"form-field\">\n          {renderField(field)}\n        </div>\n      ))}\n\n      {children}\n\n      {renderField({\n        type: 'submit',\n        name: 'submit',\n        label: formData?.submitButton?.text || 'Submit',\n      })}\n    </form>\n  )\n}\n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["{field, fieldState, error}","options = {}","choices = []","validation = []","validation.reduce((acc: Record<string, string>, v) => {\n    acc[v.type] = v.value\n    return acc\n  }, {})","(acc: Record<string, string>, v) => {\n    acc[v.type] = v.value\n    return acc\n  }","(\n    e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>,\n  ) => {\n    onChange?.(e.target.value)\n  }","(e: ChangeEvent<HTMLInputElement>, choiceValue: string) => {\n    if (Array.isArray(value)) {\n      const newValue = e.target.checked\n        ? [...value, choiceValue]\n        : value.filter((v: string) => v !== choiceValue)\n      onChange?.(newValue)\n    } else {\n      onChange?.(e.target.checked ? choiceValue : '')\n    }\n  }","e","v","(fallback?: string) =>\n    isControlled ? {value: value ?? '', onChange: handleChange} : {defaultValue: fallback}","() => {\n    switch (type) {\n      case 'submit':\n        return <button type=\"submit\">{label || 'Submit'}</button>\n      case 'textarea':\n        return (\n          <textarea\n            ref={toRef<HTMLTextAreaElement>(ref)}\n            name={name}\n            onBlur={onBlur}\n            placeholder={options.placeholder}\n            {...validationRules}\n            {...textValueProps(options.defaultValue)}\n          />\n        )\n\n      case 'select':\n        return (\n          <select\n            ref={toRef<HTMLSelectElement>(ref)}\n            name={name}\n            {...textValueProps()}\n            {...validationRules}\n            onBlur={onBlur}\n          >\n            {choices?.map((choice) => (\n              <option key={choice.value} value={choice.value}>\n                {choice.label}\n              </option>\n            ))}\n          </select>\n        )\n\n      case 'radio':\n        return choices?.map((choice) => (\n          <label key={choice.value}>\n            <input\n              type=\"radio\"\n              name={name}\n              ref={toRef<HTMLInputElement>(ref)}\n              value={choice.value}\n              onBlur={onBlur}\n              {...validationRules}\n              {...(isControlled ? {checked: value === choice.value, onChange: handleChange} : {})}\n            />\n            {choice.label}\n          </label>\n        ))\n\n      case 'checkbox':\n        return choices?.map((choice) => (\n          <label key={choice.value}>\n            <input\n              type=\"checkbox\"\n              name={name}\n              ref={toRef<HTMLInputElement>(ref)}\n              value={choice.value}\n              onBlur={onBlur}\n              {...validationRules}\n              {...(isControlled\n                ? {\n                    checked: Array.isArray(value)\n                      ? value.includes(choice.value)\n                      : value === choice.value,\n                    onChange: (e: ChangeEvent<HTMLInputElement>) =>\n                      handleCheckboxChange(e, choice.value),\n                  }\n                : {})}\n            />\n            {choice.label}\n          </label>\n        ))\n\n      default:\n        return (\n          <input\n            type={type}\n            ref={toRef<HTMLInputElement>(ref)}\n            name={name}\n            {...textValueProps(options.defaultValue)}\n            {...validationRules}\n            onBlur={onBlur}\n            placeholder={options.placeholder}\n          />\n        )\n    }\n  }","choices?.map","options.defaultValue","(choice) => (\n              <option key={choice.value} value={choice.value}>\n                {choice.label}\n              </option>\n            )","choice","label && !['hidden', 'submit'].includes(type) && <label htmlFor={name}>{label}</label>","renderInput()","error && <span className=\"error\">{error}</span>","<>\n      {label && !['hidden', 'submit'].includes(type) && <label htmlFor={name}>{label}</label>}\n      {renderInput()}\n      {error && <span className=\"error\">{error}</span>}\n    </>","getFieldState = defaultGetFieldState","fieldComponents = defaultFieldComponents","(field: FormField) => {\n    const CustomComponent = fieldComponents[field.type]\n    const fieldState = getFieldState(field.name)\n    const error = getFieldError?.(field.name)\n\n    if (CustomComponent) {\n      return <CustomComponent field={field} fieldState={fieldState} error={error} />\n    }\n\n    return <DefaultField field={field} fieldState={fieldState} error={error} />\n  }","formData?.fields?.map((field) => (\n        <div key={field._key ?? field.name} className=\"form-field\">\n          {renderField(field)}\n        </div>\n      ))","fields","field","renderField({\n        type: 'submit',\n        name: 'submit',\n        label: formData?.submitButton?.text || 'Submit',\n      })","formData?.submitButton?.text || 'Submit'","<form {...elProps} id={elProps.id ?? formData?.id?.current}>\n      {formData?.fields?.map((field) => (\n        <div key={field._key ?? field.name} className=\"form-field\">\n          {renderField(field)}\n        </div>\n      ))}\n\n      {children}\n\n      {renderField({\n        type: 'submit',\n        name: 'submit',\n        label: formData?.submitButton?.text || 'Submit',\n      })}\n    </form>","elProps.id ?? formData?.id?.current"],"sources":["../../src/form-renderer/components/default-field.tsx","../../src/form-renderer/components/form-renderer.tsx"],"sourcesContent":["import type {ChangeEvent, FC, Ref} from 'react'\n\nimport type {FieldComponentProps} from './types'\n\n// oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- FieldState.ref is loosely typed so refs from any form library can be passed through\nconst toRef = <T extends HTMLElement>(ref: unknown) => ref as Ref<T> | undefined\n\nexport const DefaultField: FC<FieldComponentProps> = ({field, fieldState, error}) => {\n  const {type, label, name, options = {}, choices = [], validation = []} = field\n  if (!type || !name) return null\n  const validationRules = validation.reduce((acc: Record<string, string>, v) => {\n    acc[v.type] = v.value\n    return acc\n  }, {})\n  const {value, onChange, onBlur, ref} = fieldState\n  // Without an onChange handler the fields render as uncontrolled inputs, so the\n  // browser keeps them interactive (e.g. the default native-form usage). When a\n  // handler is provided (react-hook-form, TanStack Form, etc.) they're controlled.\n  const isControlled = typeof onChange === 'function'\n\n  const handleChange = (\n    e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>,\n  ) => {\n    onChange?.(e.target.value)\n  }\n\n  const handleCheckboxChange = (e: ChangeEvent<HTMLInputElement>, choiceValue: string) => {\n    if (Array.isArray(value)) {\n      const newValue = e.target.checked\n        ? [...value, choiceValue]\n        : value.filter((v: string) => v !== choiceValue)\n      onChange?.(newValue)\n    } else {\n      onChange?.(e.target.checked ? choiceValue : '')\n    }\n  }\n\n  // Controlled inputs bind `value`/`onChange` from form state only — never the\n  // schema default, which would desync the UI from what the form library submits.\n  // Uncontrolled (native) inputs use `defaultValue` so the browser owns state.\n  const textValueProps = (fallback?: string) =>\n    isControlled ? {value: value ?? '', onChange: handleChange} : {defaultValue: fallback}\n\n  const renderInput = () => {\n    switch (type) {\n      case 'submit':\n        return <button type=\"submit\">{label || 'Submit'}</button>\n      case 'textarea':\n        return (\n          <textarea\n            ref={toRef<HTMLTextAreaElement>(ref)}\n            name={name}\n            onBlur={onBlur}\n            placeholder={options.placeholder}\n            {...validationRules}\n            {...textValueProps(options.defaultValue)}\n          />\n        )\n\n      case 'select':\n        return (\n          <select\n            ref={toRef<HTMLSelectElement>(ref)}\n            name={name}\n            {...textValueProps()}\n            {...validationRules}\n            onBlur={onBlur}\n          >\n            {choices?.map((choice) => (\n              <option key={choice.value} value={choice.value}>\n                {choice.label}\n              </option>\n            ))}\n          </select>\n        )\n\n      case 'radio':\n        return choices?.map((choice) => (\n          <label key={choice.value}>\n            <input\n              type=\"radio\"\n              name={name}\n              ref={toRef<HTMLInputElement>(ref)}\n              value={choice.value}\n              onBlur={onBlur}\n              {...validationRules}\n              {...(isControlled ? {checked: value === choice.value, onChange: handleChange} : {})}\n            />\n            {choice.label}\n          </label>\n        ))\n\n      case 'checkbox':\n        return choices?.map((choice) => (\n          <label key={choice.value}>\n            <input\n              type=\"checkbox\"\n              name={name}\n              ref={toRef<HTMLInputElement>(ref)}\n              value={choice.value}\n              onBlur={onBlur}\n              {...validationRules}\n              {...(isControlled\n                ? {\n                    checked: Array.isArray(value)\n                      ? value.includes(choice.value)\n                      : value === choice.value,\n                    onChange: (e: ChangeEvent<HTMLInputElement>) =>\n                      handleCheckboxChange(e, choice.value),\n                  }\n                : {})}\n            />\n            {choice.label}\n          </label>\n        ))\n\n      default:\n        return (\n          <input\n            type={type}\n            ref={toRef<HTMLInputElement>(ref)}\n            name={name}\n            {...textValueProps(options.defaultValue)}\n            {...validationRules}\n            onBlur={onBlur}\n            placeholder={options.placeholder}\n          />\n        )\n    }\n  }\n\n  return (\n    <>\n      {label && !['hidden', 'submit'].includes(type) && <label htmlFor={name}>{label}</label>}\n      {renderInput()}\n      {error && <span className=\"error\">{error}</span>}\n    </>\n  )\n}\n","import type {ComponentType, FC, HTMLProps} from 'react'\n\nimport {DefaultField} from './default-field'\nimport type {FieldComponentProps, FieldState, FormDataProps, FormField} from './types'\n\ninterface FormRendererProps extends HTMLProps<HTMLFormElement> {\n  formData?: FormDataProps\n  // Function to get field state for a given field name\n  getFieldState?: (fieldName: string) => FieldState\n  // Function to get field error for a given field name\n  getFieldError?: (fieldName: string) => string | undefined\n  // Override default field components\n  fieldComponents?: Record<string, ComponentType<FieldComponentProps>>\n}\n\n// No field state by default: fields render as uncontrolled, interactive inputs\n// so the form works out of the box (e.g. as a native HTML form). Consumers can\n// pass `getFieldState` to make the fields controlled.\nconst EMPTY_FIELD_STATE: FieldState = {}\nconst defaultGetFieldState = (): FieldState => EMPTY_FIELD_STATE\n\nconst defaultFieldComponents: Record<string, ComponentType<FieldComponentProps>> = {}\n\nexport const FormRenderer: FC<FormRendererProps> = (props) => {\n  const {\n    formData,\n    getFieldState = defaultGetFieldState,\n    getFieldError,\n    fieldComponents = defaultFieldComponents,\n    children,\n  } = props\n  const renderField = (field: FormField) => {\n    const CustomComponent = fieldComponents[field.type]\n    const fieldState = getFieldState(field.name)\n    const error = getFieldError?.(field.name)\n\n    if (CustomComponent) {\n      return <CustomComponent field={field} fieldState={fieldState} error={error} />\n    }\n\n    return <DefaultField field={field} fieldState={fieldState} error={error} />\n  }\n  const elProps = Object.assign({}, props)\n  delete elProps.formData\n  delete elProps.getFieldState\n  delete elProps.getFieldError\n  delete elProps.fieldComponents\n\n  return (\n    <form {...elProps} id={elProps.id ?? formData?.id?.current}>\n      {formData?.fields?.map((field) => (\n        <div key={field._key ?? field.name} className=\"form-field\">\n          {renderField(field)}\n        </div>\n      ))}\n\n      {children}\n\n      {renderField({\n        type: 'submit',\n        name: 'submit',\n        label: formData?.submitButton?.text || 'Submit',\n      })}\n    </form>\n  )\n}\n"],"mappings":"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"}
\ No newline at end of file
Index: package/dist/form-schema/index.js.map
===================================================================
--- package/dist/form-schema/index.js.map
+++ package/dist/form-schema/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["FaWpforms","defineField","defineType","SchemaTypeDefinition","FieldsOption","formType","fields","name","title","type","icon","description","validation","Rule","required","options","source","of","initialValue","StringInputProps","useFormValue","FormField","validationTypesByFieldType","ValidationType","props","$","_c","t0","path","slice","type","schemaType","options","t1","renderDefault","t2","list","LuTextCursorInput","defineField","defineType","ValidationType","ValidationContextDocument","fields","Array","name","type","validationTypesByFieldType","Record","fieldTypeTitle","fieldType","charAt","toUpperCase","slice","formFieldType","title","icon","options","list","Object","keys","map","value","description","validation","Rule","required","custom","context","test","doc","document","allFieldNames","field","nameCount","filter","n","length","reservedNames","includes","toLowerCase","initialValue","hidden","parent","validationTypes","of","components","input","preview","select","subtitle","label","prepare","SchemaTypeDefinition","FieldsOption","formType","formFieldType","schema","fields","types","definePlugin","FieldDefinition","schema","FieldsOption","Array","FormSchemaPluginOptions","fields","formSchema","options","name"],"sources":["../../src/form-schema/schema-types/form.ts","../../src/form-schema/components/validation-type.tsx","../../src/form-schema/schema-types/form-field.ts","../../src/form-schema/schema-types/index.ts","../../src/form-schema/index.ts"],"sourcesContent":["import {FaWpforms} from 'react-icons/fa'\nimport {defineField, defineType, type SchemaTypeDefinition} from 'sanity'\n\nimport type {FieldsOption} from '..'\n\nexport const formType = (fields: FieldsOption): SchemaTypeDefinition => {\n  // const fieldsOf =\n  //   fields && fields.length ? [{type: 'formField'}, ...fields] : [{type: 'formField'}]\n  return defineType({\n    name: 'form',\n    title: 'Form',\n    type: 'document',\n    icon: FaWpforms,\n    fields: [\n      defineField({\n        name: 'title',\n        title: 'Form Title',\n        type: 'string',\n        description: 'Internal title for the form',\n        validation: (Rule) => Rule.required(),\n      }),\n      defineField({\n        name: 'id',\n        title: 'Form ID',\n        type: 'slug',\n        options: {\n          source: 'title',\n        },\n        // validation: (Rule) => Rule.required(),\n      }),\n      defineField({\n        name: 'fields',\n        title: 'Form Fields',\n        type: 'array',\n        of: [{type: 'formField'}, ...fields],\n      }),\n      defineField({\n        name: 'submitButton',\n        title: 'Submit Button',\n        type: 'object',\n        fields: [\n          defineField({\n            name: 'text',\n            title: 'Button Text',\n            type: 'string',\n            initialValue: 'Submit',\n          }),\n        ],\n      }),\n    ],\n  })\n}\n","import type {StringInputProps} from 'sanity'\nimport {useFormValue} from 'sanity'\n\nimport type {FormField} from '../../form-renderer/components/types'\nimport {validationTypesByFieldType} from '../schema-types/form-field'\n\nexport const ValidationType = (props: StringInputProps) => {\n  // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- parent value shape is defined by the formField schema type\n  const {type} = useFormValue(props.path.slice(0, 2)) as FormField\n  if (!type || !props.schemaType?.options) return props.renderDefault(props)\n  return props.renderDefault({\n    ...props,\n    schemaType: {\n      ...props.schemaType,\n      options: {...props.schemaType.options, list: validationTypesByFieldType[type]},\n    },\n  })\n}\n","import {LuTextCursorInput} from 'react-icons/lu'\nimport {defineField, defineType} from 'sanity'\n\nimport {ValidationType} from '../components/validation-type'\ninterface ValidationContextDocument {\n  fields?: Array<{\n    name: string\n    type?: string\n  }>\n}\n\n// Validation options by field type\nexport const validationTypesByFieldType: Record<string, string[]> = {\n  'checkbox': ['minSelectedCount', 'maxSelectedCount'],\n  'color': [],\n  'date': ['minDate', 'maxDate'],\n  'datetime-local': ['minDate', 'maxDate'],\n  'email': ['pattern'],\n  'file': ['maxSize', 'fileType'],\n  'hidden': [],\n  'number': ['min', 'max'],\n  // password: ['minLength', 'pattern'],\n  'radio': [],\n  'range': ['min', 'max', 'step'],\n  'select': [],\n  'tel': ['pattern'],\n  'text': ['minLength', 'maxLength', 'pattern'],\n  'textarea': ['minLength', 'maxLength'],\n  'time': [],\n  'url': ['pattern'],\n}\nconst fieldTypeTitle = (fieldType: string): string => {\n  switch (fieldType) {\n    case 'datetime-local':\n      return 'Date & Time'\n    case 'textarea':\n      return 'Text Area'\n    case 'tel':\n      return 'Phone Number'\n    default:\n      return fieldType.charAt(0).toUpperCase() + fieldType.slice(1)\n  }\n}\n\nexport const formFieldType = defineType({\n  name: 'formField',\n  title: 'Form Field',\n  type: 'object',\n  icon: LuTextCursorInput,\n  fields: [\n    defineField({\n      name: 'type',\n      title: 'Field Type',\n      type: 'string',\n      options: {\n        list: Object.keys(validationTypesByFieldType).map((type) => {\n          return {title: fieldTypeTitle(type), value: type}\n        }),\n      },\n    }),\n    defineField({\n      name: 'label',\n      title: 'Field Label',\n      type: 'string',\n    }),\n    defineField({\n      name: 'name',\n      title: 'Field Name',\n      type: 'string',\n      description:\n        'Must start with a letter and contain only letters, numbers, underscores, or hyphens. Must be unique within the form.',\n      validation: (Rule) =>\n        Rule.required().custom((name, context) => {\n          if (!name) {\n            return 'Required'\n          }\n          // Check format (HTML ID/name rules)\n          if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(name)) {\n            return 'Field name must start with a letter and contain only letters, numbers, underscores, or hyphens'\n          }\n\n          // Check uniqueness across all fields\n          // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- document shape is defined by the form schema type\n          const doc = context.document as ValidationContextDocument\n          const allFieldNames = doc?.fields?.map((field) => field.name) || []\n\n          // Count occurrences of this name\n          const nameCount = allFieldNames.filter((n) => n === name).length\n\n          // If we find more than one occurrence (including current field), it's not unique\n          if (nameCount > 1) {\n            return 'Field name must be unique across all form fields'\n          }\n\n          // Check for reserved HTML form attributes\n          const reservedNames = [\n            'action',\n            'method',\n            'target',\n            'enctype',\n            'accept-charset',\n            'autocomplete',\n            'novalidate',\n            'rel',\n            'submit',\n            'reset',\n          ]\n          if (reservedNames.includes(name.toLowerCase())) {\n            return 'This name is reserved for HTML form attributes. Please choose a different name.'\n          }\n\n          return true\n        }),\n    }),\n    defineField({\n      name: 'required',\n      title: 'Required',\n      type: 'boolean',\n      initialValue: false,\n    }),\n    defineField({\n      name: 'validation',\n      title: 'Validation Rules',\n      type: 'array',\n      hidden: ({parent}) => {\n        if (!parent?.type) return true\n        const validationTypes = validationTypesByFieldType[parent.type]\n        return !validationTypes || validationTypes.length === 0\n      },\n      of: [\n        {\n          type: 'object',\n          fields: [\n            defineField({\n              name: 'type',\n              title: 'Validation Type',\n              type: 'string',\n              options: {\n                // TODO: I think this needs to be a custom input component?\n                // list: ({parent}) => (parent?.type ? validationTypesByFieldType[parent.type] : []),\n                list: [],\n              },\n              components: {\n                input: ValidationType,\n              },\n            }),\n            defineField({\n              name: 'value',\n              title: 'Value',\n              type: 'string',\n            }),\n            defineField({\n              name: 'message',\n              title: 'Error Message',\n              type: 'string',\n            }),\n          ],\n          preview: {\n            select: {\n              title: 'type',\n              subtitle: 'value',\n            },\n          },\n        },\n      ],\n    }),\n    defineField({\n      name: 'choices',\n      title: 'Choices',\n      type: 'array',\n      hidden: ({parent}) => {\n        return !['select', 'radio', 'checkbox'].includes(parent?.type)\n      },\n      of: [\n        {\n          type: 'object',\n          fields: [\n            defineField({\n              name: 'label',\n              title: 'Label',\n              type: 'string',\n            }),\n            defineField({\n              name: 'value',\n              title: 'Value',\n              type: 'string',\n            }),\n          ],\n        },\n      ],\n    }),\n    defineField({\n      name: 'options',\n      title: 'Field Options',\n      type: 'object',\n      hidden: ({parent}) => {\n        return ['select', 'radio', 'checkbox', 'file'].includes(parent?.type)\n      },\n      fields: [\n        defineField({\n          name: 'placeholder',\n          title: 'Placeholder',\n          type: 'string',\n        }),\n        defineField({\n          name: 'defaultValue',\n          title: 'Default Value',\n          type: 'string',\n        }),\n      ],\n    }),\n  ],\n  preview: {\n    select: {\n      label: 'label',\n      name: 'name',\n      type: 'type',\n    },\n    prepare({label, name, type}) {\n      return {\n        title: label || name,\n        subtitle: type,\n      }\n    },\n  },\n})\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport type {FieldsOption} from '..'\nimport {formType} from './form'\nimport {formFieldType} from './form-field'\n\nexport const schema = (fields: FieldsOption): {types: SchemaTypeDefinition[]} => {\n  return {types: [formType(fields), formFieldType]}\n}\n","import {definePlugin, type FieldDefinition} from 'sanity'\n\n// import {structureTool} from 'sanity/structure'\n// import {FormRenderer} from './components/form-renderer'\nimport {schema} from './schema-types'\n// import {defaultDocumentNode} from './structure'\n\n/**\n * Usage in `sanity.config.ts` (or .js)\n *\n * ```ts\n * import {defineConfig} from 'sanity'\n * import {formSchema} from '@sanity/form-toolkit/form-schema'\n *\n * export default defineConfig({\n *   // ...\n *   plugins: [formSchema()],\n * })\n * ```\n */\nexport type FieldsOption = Array<FieldDefinition>\ninterface FormSchemaPluginOptions {\n  /**\n   * Array of field definitions to be used in the form schema.\n   */\n  fields?: FieldsOption\n}\n\nexport const formSchema = definePlugin<FormSchemaPluginOptions | void>((options) => {\n  return {\n    name: 'form-toolkit_form-schema',\n    schema: schema(options?.fields ?? []),\n    // plugins: [structureTool({defaultDocumentNode})],\n  }\n})\n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["props.path.slice(0, 2)","path","props.renderDefault(props)","props.renderDefault","props.renderDefault({\n    ...props,\n    schemaType: {\n      ...props.schemaType,\n      options: {...props.schemaType.options, list: validationTypesByFieldType[type]},\n    },\n  })","props.schemaType.options","validationTypesByFieldType[type]"],"sources":["../../src/form-schema/schema-types/form.ts","../../src/form-schema/components/validation-type.tsx","../../src/form-schema/schema-types/form-field.ts","../../src/form-schema/schema-types/index.ts","../../src/form-schema/index.ts"],"sourcesContent":["import {FaWpforms} from 'react-icons/fa'\nimport {defineField, defineType, type SchemaTypeDefinition} from 'sanity'\n\nimport type {FieldsOption} from '..'\n\nexport const formType = (fields: FieldsOption): SchemaTypeDefinition => {\n  // const fieldsOf =\n  //   fields && fields.length ? [{type: 'formField'}, ...fields] : [{type: 'formField'}]\n  return defineType({\n    name: 'form',\n    title: 'Form',\n    type: 'document',\n    icon: FaWpforms,\n    fields: [\n      defineField({\n        name: 'title',\n        title: 'Form Title',\n        type: 'string',\n        description: 'Internal title for the form',\n        validation: (Rule) => Rule.required(),\n      }),\n      defineField({\n        name: 'id',\n        title: 'Form ID',\n        type: 'slug',\n        options: {\n          source: 'title',\n        },\n        // validation: (Rule) => Rule.required(),\n      }),\n      defineField({\n        name: 'fields',\n        title: 'Form Fields',\n        type: 'array',\n        of: [{type: 'formField'}, ...fields],\n      }),\n      defineField({\n        name: 'submitButton',\n        title: 'Submit Button',\n        type: 'object',\n        fields: [\n          defineField({\n            name: 'text',\n            title: 'Button Text',\n            type: 'string',\n            initialValue: 'Submit',\n          }),\n        ],\n      }),\n    ],\n  })\n}\n","import type {StringInputProps} from 'sanity'\nimport {useFormValue} from 'sanity'\n\nimport type {FormField} from '../../form-renderer/components/types'\nimport {validationTypesByFieldType} from '../schema-types/form-field'\n\nexport const ValidationType = (props: StringInputProps) => {\n  // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- parent value shape is defined by the formField schema type\n  const {type} = useFormValue(props.path.slice(0, 2)) as FormField\n  if (!type || !props.schemaType?.options) return props.renderDefault(props)\n  return props.renderDefault({\n    ...props,\n    schemaType: {\n      ...props.schemaType,\n      options: {...props.schemaType.options, list: validationTypesByFieldType[type]},\n    },\n  })\n}\n","import {LuTextCursorInput} from 'react-icons/lu'\nimport {defineField, defineType} from 'sanity'\n\nimport {ValidationType} from '../components/validation-type'\ninterface ValidationContextDocument {\n  fields?: Array<{\n    name: string\n    type?: string\n  }>\n}\n\n// Validation options by field type\nexport const validationTypesByFieldType: Record<string, string[]> = {\n  'checkbox': ['minSelectedCount', 'maxSelectedCount'],\n  'color': [],\n  'date': ['minDate', 'maxDate'],\n  'datetime-local': ['minDate', 'maxDate'],\n  'email': ['pattern'],\n  'file': ['maxSize', 'fileType'],\n  'hidden': [],\n  'number': ['min', 'max'],\n  // password: ['minLength', 'pattern'],\n  'radio': [],\n  'range': ['min', 'max', 'step'],\n  'select': [],\n  'tel': ['pattern'],\n  'text': ['minLength', 'maxLength', 'pattern'],\n  'textarea': ['minLength', 'maxLength'],\n  'time': [],\n  'url': ['pattern'],\n}\nconst fieldTypeTitle = (fieldType: string): string => {\n  switch (fieldType) {\n    case 'datetime-local':\n      return 'Date & Time'\n    case 'textarea':\n      return 'Text Area'\n    case 'tel':\n      return 'Phone Number'\n    default:\n      return fieldType.charAt(0).toUpperCase() + fieldType.slice(1)\n  }\n}\n\nexport const formFieldType = defineType({\n  name: 'formField',\n  title: 'Form Field',\n  type: 'object',\n  icon: LuTextCursorInput,\n  fields: [\n    defineField({\n      name: 'type',\n      title: 'Field Type',\n      type: 'string',\n      options: {\n        list: Object.keys(validationTypesByFieldType).map((type) => {\n          return {title: fieldTypeTitle(type), value: type}\n        }),\n      },\n    }),\n    defineField({\n      name: 'label',\n      title: 'Field Label',\n      type: 'string',\n    }),\n    defineField({\n      name: 'name',\n      title: 'Field Name',\n      type: 'string',\n      description:\n        'Must start with a letter and contain only letters, numbers, underscores, or hyphens. Must be unique within the form.',\n      validation: (Rule) =>\n        Rule.required().custom((name, context) => {\n          if (!name) {\n            return 'Required'\n          }\n          // Check format (HTML ID/name rules)\n          if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(name)) {\n            return 'Field name must start with a letter and contain only letters, numbers, underscores, or hyphens'\n          }\n\n          // Check uniqueness across all fields\n          // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- document shape is defined by the form schema type\n          const doc = context.document as ValidationContextDocument\n          const allFieldNames = doc?.fields?.map((field) => field.name) || []\n\n          // Count occurrences of this name\n          const nameCount = allFieldNames.filter((n) => n === name).length\n\n          // If we find more than one occurrence (including current field), it's not unique\n          if (nameCount > 1) {\n            return 'Field name must be unique across all form fields'\n          }\n\n          // Check for reserved HTML form attributes\n          const reservedNames = [\n            'action',\n            'method',\n            'target',\n            'enctype',\n            'accept-charset',\n            'autocomplete',\n            'novalidate',\n            'rel',\n            'submit',\n            'reset',\n          ]\n          if (reservedNames.includes(name.toLowerCase())) {\n            return 'This name is reserved for HTML form attributes. Please choose a different name.'\n          }\n\n          return true\n        }),\n    }),\n    defineField({\n      name: 'required',\n      title: 'Required',\n      type: 'boolean',\n      initialValue: false,\n    }),\n    defineField({\n      name: 'validation',\n      title: 'Validation Rules',\n      type: 'array',\n      hidden: ({parent}) => {\n        if (!parent?.type) return true\n        const validationTypes = validationTypesByFieldType[parent.type]\n        return !validationTypes || validationTypes.length === 0\n      },\n      of: [\n        {\n          type: 'object',\n          fields: [\n            defineField({\n              name: 'type',\n              title: 'Validation Type',\n              type: 'string',\n              options: {\n                // TODO: I think this needs to be a custom input component?\n                // list: ({parent}) => (parent?.type ? validationTypesByFieldType[parent.type] : []),\n                list: [],\n              },\n              components: {\n                input: ValidationType,\n              },\n            }),\n            defineField({\n              name: 'value',\n              title: 'Value',\n              type: 'string',\n            }),\n            defineField({\n              name: 'message',\n              title: 'Error Message',\n              type: 'string',\n            }),\n          ],\n          preview: {\n            select: {\n              title: 'type',\n              subtitle: 'value',\n            },\n          },\n        },\n      ],\n    }),\n    defineField({\n      name: 'choices',\n      title: 'Choices',\n      type: 'array',\n      hidden: ({parent}) => {\n        return !['select', 'radio', 'checkbox'].includes(parent?.type)\n      },\n      of: [\n        {\n          type: 'object',\n          fields: [\n            defineField({\n              name: 'label',\n              title: 'Label',\n              type: 'string',\n            }),\n            defineField({\n              name: 'value',\n              title: 'Value',\n              type: 'string',\n            }),\n          ],\n        },\n      ],\n    }),\n    defineField({\n      name: 'options',\n      title: 'Field Options',\n      type: 'object',\n      hidden: ({parent}) => {\n        return ['select', 'radio', 'checkbox', 'file'].includes(parent?.type)\n      },\n      fields: [\n        defineField({\n          name: 'placeholder',\n          title: 'Placeholder',\n          type: 'string',\n        }),\n        defineField({\n          name: 'defaultValue',\n          title: 'Default Value',\n          type: 'string',\n        }),\n      ],\n    }),\n  ],\n  preview: {\n    select: {\n      label: 'label',\n      name: 'name',\n      type: 'type',\n    },\n    prepare({label, name, type}) {\n      return {\n        title: label || name,\n        subtitle: type,\n      }\n    },\n  },\n})\n","import type {SchemaTypeDefinition} from 'sanity'\n\nimport type {FieldsOption} from '..'\nimport {formType} from './form'\nimport {formFieldType} from './form-field'\n\nexport const schema = (fields: FieldsOption): {types: SchemaTypeDefinition[]} => {\n  return {types: [formType(fields), formFieldType]}\n}\n","import {definePlugin, type FieldDefinition} from 'sanity'\n\n// import {structureTool} from 'sanity/structure'\n// import {FormRenderer} from './components/form-renderer'\nimport {schema} from './schema-types'\n// import {defaultDocumentNode} from './structure'\n\n/**\n * Usage in `sanity.config.ts` (or .js)\n *\n * ```ts\n * import {defineConfig} from 'sanity'\n * import {formSchema} from '@sanity/form-toolkit/form-schema'\n *\n * export default defineConfig({\n *   // ...\n *   plugins: [formSchema()],\n * })\n * ```\n */\nexport type FieldsOption = Array<FieldDefinition>\ninterface FormSchemaPluginOptions {\n  /**\n   * Array of field definitions to be used in the form schema.\n   */\n  fields?: FieldsOption\n}\n\nexport const formSchema = definePlugin<FormSchemaPluginOptions | void>((options) => {\n  return {\n    name: 'form-toolkit_form-schema',\n    schema: schema(options?.fields ?? []),\n    // plugins: [structureTool({defaultDocumentNode})],\n  }\n})\n"],"mappings":"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"}
\ No newline at end of file
Index: package/dist/formium/index.js.map
===================================================================
--- package/dist/formium/index.js.map
+++ package/dist/formium/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["createClient","Form","asyncList","definePlugin","FormiumInputConfig","formiumInput","name","plugins","schemaType","secrets","keys","key","title","loader","formium","apiToken","data","findForms","length","map","id","value"],"sources":["../../src/formium/index.ts"],"sourcesContent":["import {createClient, type Form} from '@formium/client'\nimport {asyncList} from '@sanity/sanity-plugin-async-list'\nimport {definePlugin} from 'sanity'\n\ninterface FormiumInputConfig {\n  /* nothing here yet */\n}\n\n/**\n * Usage in `sanity.config.ts` (or .js)\n *\n * ```ts\n * import {defineConfig} from 'sanity'\n * import {formiumInput} from '@sanity/form-toolkit/formium'\n *\n * export default defineConfig({\n *   // ...\n *   plugins: [formiumInput()],\n * })\n * ```\n */\n// Is Formium dead? All attempts to use the API come back with an expired cert https://github.com/formium/formium/issues/77\nexport const formiumInput = definePlugin<FormiumInputConfig | void>(() => {\n  return {\n    name: 'sanity-plugin-form-toolkit_formium-input',\n    plugins: [\n      asyncList({\n        schemaType: 'formiumInput',\n        secrets: {\n          keys: [\n            {key: 'projectId', title: 'Project ID'},\n            {key: 'token', title: 'Token'},\n          ],\n        },\n        loader: async ({secrets}) => {\n          const formium = createClient(secrets?.['projectId'] || '', {\n            apiToken: secrets?.['token'],\n          })\n          const {data}: {data: Form[]} = await formium.findForms()\n          return data && data.length\n            ? data.map(({name, id}) => {\n                return {\n                  title: name,\n                  value: id,\n                }\n              })\n            : []\n        },\n      }),\n    ],\n  }\n})\n"],"mappings":";;;;;;;;;;;;;;;;AAsBA,MAAaK,eAAeF,oBACnB;CACLG,MAAM;CACNC,SAAS,CACPL,UAAU;EACRM,YAAY;EACZC,SAAS,EACPC,MAAM,CACJ;GAACC,KAAK;GAAaC,OAAO;EAAY,GACtC;GAACD,KAAK;GAASC,OAAO;EAAO,CAAC,EAElC;EACAC,QAAQ,OAAO,EAACJ,cAAa;GAI3B,IAAM,EAACO,SAAwB,MAHfhB,aAAaS,SAAU,aAAgB,IAAI,EACzDM,UAAUN,SAAU,MACtB,CACqCK,CAAO,CAACG,UAAU;GACvD,OAAOD,QAAQA,KAAKE,SAChBF,KAAKG,KAAK,EAACb,MAAMc,UACR;IACLR,OAAON;IACPe,OAAOD;GACT,EACD,IACD,CAAA;EACN;CACF,CAAC,CAAC;AAEN,EACD"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":[],"sources":["../../src/formium/index.ts"],"sourcesContent":["import {createClient, type Form} from '@formium/client'\nimport {asyncList} from '@sanity/sanity-plugin-async-list'\nimport {definePlugin} from 'sanity'\n\ninterface FormiumInputConfig {\n  /* nothing here yet */\n}\n\n/**\n * Usage in `sanity.config.ts` (or .js)\n *\n * ```ts\n * import {defineConfig} from 'sanity'\n * import {formiumInput} from '@sanity/form-toolkit/formium'\n *\n * export default defineConfig({\n *   // ...\n *   plugins: [formiumInput()],\n * })\n * ```\n */\n// Is Formium dead? All attempts to use the API come back with an expired cert https://github.com/formium/formium/issues/77\nexport const formiumInput = definePlugin<FormiumInputConfig | void>(() => {\n  return {\n    name: 'sanity-plugin-form-toolkit_formium-input',\n    plugins: [\n      asyncList({\n        schemaType: 'formiumInput',\n        secrets: {\n          keys: [\n            {key: 'projectId', title: 'Project ID'},\n            {key: 'token', title: 'Token'},\n          ],\n        },\n        loader: async ({secrets}) => {\n          const formium = createClient(secrets?.['projectId'] || '', {\n            apiToken: secrets?.['token'],\n          })\n          const {data}: {data: Form[]} = await formium.findForms()\n          return data && data.length\n            ? data.map(({name, id}) => {\n                return {\n                  title: name,\n                  value: id,\n                }\n              })\n            : []\n        },\n      }),\n    ],\n  }\n})\n"],"mappings":";;;;;;;;;;;;;;;;AAsBA,MAAa,eAAe,oBACnB;CACL,MAAM;CACN,SAAS,CACP,UAAU;EACR,YAAY;EACZ,SAAS,EACP,MAAM,CACJ;GAAC,KAAK;GAAa,OAAO;EAAY,GACtC;GAAC,KAAK;GAAS,OAAO;EAAO,CAC/B,EACF;EACA,QAAQ,OAAO,EAAC,cAAa;GAI3B,IAAM,EAAC,SAAwB,MAHf,aAAa,SAAU,aAAgB,IAAI,EACzD,UAAU,SAAU,MACtB,CACqC,CAAA,CAAQ,UAAU;GACvD,OAAO,QAAQ,KAAK,SAChB,KAAK,KAAK,EAAC,MAAM,UACR;IACL,OAAO;IACP,OAAO;GACT,EACD,IACD,CAAC;EACP;CACF,CAAC,CACH;AACF,EACD"}
\ No newline at end of file
Index: package/dist/hubspot/index.js.map
===================================================================
--- package/dist/hubspot/index.js.map
+++ package/dist/hubspot/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["Card","Text","ReactElement","Option","option","$","_c","t0","name","t1","Symbol","for","background","t2","value","t3","t4","HubSpotForm","id","name","key","MappedResult","value","fetchHubSpotData","token","Promise","apiResponse","fetch","headers","Authorization","ok","console","error","statusText","results","json","map","result","Object","assign","e","asyncList","definePlugin","Option","hubSpotHandler","fetchHubSpotData","HubSpotInputConfig","url","URL","ExtendedOption","value","name","hubSpotInput","options","plugins","schemaType","loader","data","fetch","body","json","autocompleteProps","renderOption","option","renderValue"],"sources":["../../src/hubspot/components/option.tsx","../../src/hubspot/fetch-hubspot-data.ts","../../src/hubspot/create-handler.ts","../../src/hubspot/index.ts"],"sourcesContent":["import {Card, Text} from '@sanity/ui'\nimport type {ReactElement} from 'react'\n\nexport const Option = (option: {value: string; name: string}): ReactElement => {\n  return (\n    <Card data-as=\"button\" padding={3} radius={2} tone=\"inherit\">\n      <Text size={2} textOverflow=\"ellipsis\">\n        {option.name}\n      </Text>\n      <Card paddingTop={2} tone=\"inherit\" style={{background: 'inherit'}}>\n        <Text size={1} textOverflow=\"ellipsis\">\n          {`ID: ${option.value}`}\n        </Text>\n      </Card>\n    </Card>\n  )\n}\n","type HubSpotForm = {\n  id: string\n  name: string\n  [key: string]: unknown // Additional properties from the API response\n}\n\ntype MappedResult = HubSpotForm & {\n  value: string\n}\nexport async function fetchHubSpotData({token}: {token: string}): Promise<MappedResult[] | null> {\n  try {\n    const apiResponse = await fetch('https://api.hubapi.com/marketing/v3/forms/?limit=9999', {\n      headers: {\n        Authorization: `Bearer ${token}`,\n      },\n    })\n\n    if (!apiResponse.ok) {\n      console.error(`Failed to fetch data: ${apiResponse.statusText}`)\n      return null\n    }\n\n    const {results}: {results: HubSpotForm[]} = await apiResponse.json()\n\n    return results.map((result) => Object.assign(result, {value: result.id}))\n  } catch (e: unknown) {\n    console.error(e)\n    return null // Explicitly return null on error\n  }\n}\n","import createHandler from '../shared/create-handler'\nimport {fetchHubSpotData} from './fetch-hubspot-data'\n\nexport const hubSpotHandler = ({token}: {token: string}) => {\n  return createHandler(() => fetchHubSpotData({token}))\n}\n","import '@sanity/ui/styles.css'\nimport {asyncList} from '@sanity/sanity-plugin-async-list'\nimport {definePlugin} from 'sanity'\n\nimport {Option} from './components/option'\nimport {hubSpotHandler} from './create-handler'\nimport {fetchHubSpotData} from './fetch-hubspot-data'\ninterface HubSpotInputConfig {\n  url: string | URL\n}\n\n/**\n * Usage in `sanity.config.ts` (or .js)\n *\n * ```ts\n * import {defineConfig} from 'sanity'\n * import {hubSpotInput} from '@sanity/form-toolkit/hubspot'\n *\n * export default defineConfig({\n *   // ...\n *   plugins: [\n *    hubSpotInput({\n *      url: 'http://localhost:3000/api/hubspot'\n *    })\n *   ],\n * })\n * ```\n */\n\ntype ExtendedOption = {value: string; name: string}\nexport {fetchHubSpotData, hubSpotHandler}\nexport const hubSpotInput = definePlugin<HubSpotInputConfig>((options) => {\n  return {\n    name: 'sanity-plugin-form-toolkit_hubspot-input',\n    plugins: [\n      asyncList({\n        schemaType: 'hubSpotForm',\n        loader: async () => {\n          const data = await fetch(options.url)\n          const body = await data.json()\n          return body\n        },\n        autocompleteProps: {\n          renderOption: (option) =>\n            // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- HubSpot loader returns options with a name property\n            Option(option as ExtendedOption),\n          renderValue(value, option) {\n            // @ts-expect-error can't extend default type?\n            return option?.name ?? value\n          },\n        },\n      }),\n    ],\n  }\n})\n"],"mappings":";;;;;;;AAGA,MAAaG,UAASC,WAAA;CAAA,IAAAC,IAAAC,EAAA,CAAA,GAAAC;CAAA,AAAAF,EAAA,OAAAD,OAAAI,OAKTD,KAAAF,EAAA,MAFPE,KAAA,oBAAC,MAAD;EAAY,MAAA;EAAgB,cAAA;EACzBH,UAAAA,OAAMI;CADJ,CAAA,GAEEH,EAAA,KAAAD,OAAAI,MAAAH,EAAA,KAAAE;CAAA,IAAAE;CAAA,AAAAJ,EAAA,OAAAK,OAAAC,IAAA,2BAAA,KACoCF,KAAA,EAAAG,YAAa,UAAS,GAACP,EAAA,KAAAI,MAAAA,KAAAJ,EAAA;CAE7D,IAAAQ,KAAA,OAAOT,OAAMU,SAAQC;CAAA,AAAAV,EAAA,OAAAQ,KAEnBE,KAAAV,EAAA,MAJPU,KAAA,oBAAC,MAAD;EAAkB,YAAA;EAAQ,MAAA;EAAiB,OAAAN;EACzC,UAAA,oBAAC,MAAD;GAAY,MAAA;GAAgB,cAAA;GACzBI,UAAAA;EADE,CAAA;CADF,CAAA,GAIER,EAAA,KAAAQ,IAAAR,EAAA,KAAAU;CAAA,IAAAC;CACF,OADEX,EAAA,OAAAE,MAAAF,EAAA,OAAAU,MARTC,KAAA,qBAAC,MAAD;EAAc,WAAA;EAAkB,SAAA;EAAW,QAAA;EAAQ,MAAA;EAAnD,UAAA,CACET,IAGAQ,EAJG;KASEV,EAAA,KAAAE,IAAAF,EAAA,KAAAU,IAAAV,EAAA,KAAAW,MAAAA,KAAAX,EAAA,IATPW;AASO;ACLX,eAAsBO,iBAAiB,EAACC,SAAyD;CAC/F,IAAI;EACF,IAAME,cAAc,MAAMC,MAAM,yDAAyD,EACvFC,SAAS,EACPC,eAAe,UAAUL,QAC3B,EACF,CAAC;EAED,IAAI,CAACE,YAAYI,IAEf,OADAC,QAAQC,MAAM,yBAAyBN,YAAYO,YAAY,GACxD;EAGT,IAAM,EAACC,YAAqC,MAAMR,YAAYS,KAAK;EAEnE,OAAOD,QAAQE,KAAKC,WAAWC,OAAOC,OAAOF,QAAQ,EAACf,OAAOe,OAAOnB,GAAE,CAAC,CAAC;CAC1E,SAASsB,GAAY;EAEnB,OADAT,QAAQC,MAAMQ,CAAC,GACR;CACT;AACF;AC1BA,MAAa,kBAAkB,EAAC,YACvB,oBAAoB,iBAAiB,EAAC,MAAK,CAAC,CAAC,GC2BzCY,eAAeV,cAAkCW,aACrD;CACLF,MAAM;CACNG,SAAS,CACPb,UAAU;EACRc,YAAY;EACZC,QAAQ,YAGCG,OADYF,MADAC,MAAML,QAAQN,GAAG,EAAA,CACZa,KAAK;EAG/BC,mBAAmB;GACjBC,eAAeC,WAEbpB,OAAOoB,MAAwB;GACjCC,YAAYd,OAAOa,QAAQ;IAEzB,OAAOA,QAAQZ,QAAQD;GACzB;EACF;CACF,CAAC,CAAC;AAEN,EACD"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["<Text size={2} textOverflow=\"ellipsis\">\n        {option.name}\n      </Text>","name","{background: 'inherit'}","<Card paddingTop={2} tone=\"inherit\" style={{background: 'inherit'}}>\n        <Text size={1} textOverflow=\"ellipsis\">\n          {`ID: ${option.value}`}\n        </Text>\n      </Card>","`ID: ${option.value}`","<Card data-as=\"button\" padding={3} radius={2} tone=\"inherit\">\n      <Text size={2} textOverflow=\"ellipsis\">\n        {option.name}\n      </Text>\n      <Card paddingTop={2} tone=\"inherit\" style={{background: 'inherit'}}>\n        <Text size={1} textOverflow=\"ellipsis\">\n          {`ID: ${option.value}`}\n        </Text>\n      </Card>\n    </Card>"],"sources":["../../src/hubspot/components/option.tsx","../../src/hubspot/fetch-hubspot-data.ts","../../src/hubspot/create-handler.ts","../../src/hubspot/index.ts"],"sourcesContent":["import {Card, Text} from '@sanity/ui'\nimport type {ReactElement} from 'react'\n\nexport const Option = (option: {value: string; name: string}): ReactElement => {\n  return (\n    <Card data-as=\"button\" padding={3} radius={2} tone=\"inherit\">\n      <Text size={2} textOverflow=\"ellipsis\">\n        {option.name}\n      </Text>\n      <Card paddingTop={2} tone=\"inherit\" style={{background: 'inherit'}}>\n        <Text size={1} textOverflow=\"ellipsis\">\n          {`ID: ${option.value}`}\n        </Text>\n      </Card>\n    </Card>\n  )\n}\n","type HubSpotForm = {\n  id: string\n  name: string\n  [key: string]: unknown // Additional properties from the API response\n}\n\ntype MappedResult = HubSpotForm & {\n  value: string\n}\nexport async function fetchHubSpotData({token}: {token: string}): Promise<MappedResult[] | null> {\n  try {\n    const apiResponse = await fetch('https://api.hubapi.com/marketing/v3/forms/?limit=9999', {\n      headers: {\n        Authorization: `Bearer ${token}`,\n      },\n    })\n\n    if (!apiResponse.ok) {\n      console.error(`Failed to fetch data: ${apiResponse.statusText}`)\n      return null\n    }\n\n    const {results}: {results: HubSpotForm[]} = await apiResponse.json()\n\n    return results.map((result) => Object.assign(result, {value: result.id}))\n  } catch (e: unknown) {\n    console.error(e)\n    return null // Explicitly return null on error\n  }\n}\n","import createHandler from '../shared/create-handler'\nimport {fetchHubSpotData} from './fetch-hubspot-data'\n\nexport const hubSpotHandler = ({token}: {token: string}) => {\n  return createHandler(() => fetchHubSpotData({token}))\n}\n","import '@sanity/ui/styles.css'\nimport {asyncList} from '@sanity/sanity-plugin-async-list'\nimport {definePlugin} from 'sanity'\n\nimport {Option} from './components/option'\nimport {hubSpotHandler} from './create-handler'\nimport {fetchHubSpotData} from './fetch-hubspot-data'\ninterface HubSpotInputConfig {\n  url: string | URL\n}\n\n/**\n * Usage in `sanity.config.ts` (or .js)\n *\n * ```ts\n * import {defineConfig} from 'sanity'\n * import {hubSpotInput} from '@sanity/form-toolkit/hubspot'\n *\n * export default defineConfig({\n *   // ...\n *   plugins: [\n *    hubSpotInput({\n *      url: 'http://localhost:3000/api/hubspot'\n *    })\n *   ],\n * })\n * ```\n */\n\ntype ExtendedOption = {value: string; name: string}\nexport {fetchHubSpotData, hubSpotHandler}\nexport const hubSpotInput = definePlugin<HubSpotInputConfig>((options) => {\n  return {\n    name: 'sanity-plugin-form-toolkit_hubspot-input',\n    plugins: [\n      asyncList({\n        schemaType: 'hubSpotForm',\n        loader: async () => {\n          const data = await fetch(options.url)\n          const body = await data.json()\n          return body\n        },\n        autocompleteProps: {\n          renderOption: (option) =>\n            // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- HubSpot loader returns options with a name property\n            Option(option as ExtendedOption),\n          renderValue(value, option) {\n            // @ts-expect-error can't extend default type?\n            return option?.name ?? value\n          },\n        },\n      }),\n    ],\n  }\n})\n"],"mappings":";;;;;;;AAGA,MAAa,UAAU,WAAwD;eAGzEA;CACUC,AAAAA,EAAAA,OAAAA,OAAAA,oBADV,KAAA,oBAAC,MAAD;EAAM,MAAM;EAAG,cAAa;EACzB,UAAA,OAAO;CACJ,CAAA,GADIA,EAAAA,KAAAA,OAAAA;CAEiCC,IAAAA;qDAAC,KAAA,EAAA,YAAY,UAAS;CAE5D,IAAA,KAAA,OAAO,OAAO,SAFnBC;CAEKC,AAAAA,EAAAA,OAAAA,kBAFL,KAAA,oBAAC,MAAD;EAAM,YAAY;EAAG,MAAK;EAAU,OAAOF;EACzC,UAAA,oBAAC,MAAD;GAAM,MAAM;GAAG,cAAa;GACzBE,UAAAA;EACG,CAAA;CACF,CAAA,GAFDA,EAAAA,KAAAA;CANPC,IAAAA;CADF,OAEIL,EAAAA,OAAAA,MAAAA,EAAAA,OAGAG,MAJF,KAAA,qBAAC,MAAD;EAAM,WAAQ;EAAS,SAAS;EAAG,QAAQ;EAAG,MAAK;EAAnD,UAAA,CACEH,IAGAG,EAKI;KARJH,EAAAA,KAAAA,IAGAG,EAAAA,KAAAA,4BAJFE;AAWJ;ACPA,eAAsB,iBAAiB,EAAC,SAAyD;CAC/F,IAAI;EACF,IAAM,cAAc,MAAM,MAAM,yDAAyD,EACvF,SAAS,EACP,eAAe,UAAU,QAC3B,EACF,CAAC;EAED,IAAI,CAAC,YAAY,IAEf,OADA,QAAQ,MAAM,yBAAyB,YAAY,YAAY,GACxD;EAGT,IAAM,EAAC,YAAqC,MAAM,YAAY,KAAK;EAEnE,OAAO,QAAQ,KAAK,WAAW,OAAO,OAAO,QAAQ,EAAC,OAAO,OAAO,GAAE,CAAC,CAAC;CAC1E,SAAS,GAAY;EAEnB,OADA,QAAQ,MAAM,CAAC,GACR;CACT;AACF;AC1BA,MAAa,kBAAkB,EAAC,YACvB,oBAAoB,iBAAiB,EAAC,MAAK,CAAC,CAAC,GC2BzC,eAAe,cAAkC,aACrD;CACL,MAAM;CACN,SAAS,CACP,UAAU;EACR,YAAY;EACZ,QAAQ,YAGC,OADY,MADA,MAAM,QAAQ,GAAG,EAAA,CACZ,KAAK;EAG/B,mBAAmB;GACjB,eAAe,WAEb,OAAO,MAAwB;GACjC,YAAY,OAAO,QAAQ;IAEzB,OAAO,QAAQ,QAAQ;GACzB;EACF;CACF,CAAC,CACH;AACF,EACD"}
\ No newline at end of file
Index: package/dist/mailchimp/index.js.map
===================================================================
--- package/dist/mailchimp/index.js.map
+++ package/dist/mailchimp/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["Card","Text","ReactElement","Option","option","$","_c","t0","form","header","text","value","t1","t2","Symbol","for","background","t3","list","name","stats","member_count","t4","t5","mailchimp","createHandler","MailchimpSignupForm","signup_form_url","key","fetchMailchimpData","server","Promise","setConfig","apiKey","response","lists","getAllLists","Error","signupFormsPerList","all","map","list","signup_forms","signupForms","getListSignupForms","id","form","value","flat","mailchimpHandler","keys","asyncList","definePlugin","Option","mailchimpHandler","fetchMailchimpData","MailchimpInputConfig","url","URL","mailchimpInput","options","name","plugins","schemaType","loader","data","fetch","body","json","autocompleteProps","renderOption","option"],"sources":["../../src/mailchimp/components/option.tsx","../../src/mailchimp/create-handler.ts","../../src/mailchimp/index.ts"],"sourcesContent":["import {Card, Text} from '@sanity/ui'\nimport type {ReactElement} from 'react'\n\nexport const Option = (option: {\n  value: string\n  form: {\n    header: {\n      text?: string\n    }\n  }\n  list: {\n    name: string\n    stats: {\n      member_count: number\n    }\n  }\n}): ReactElement => {\n  return (\n    <Card data-as=\"button\" padding={3} radius={2} tone=\"inherit\">\n      <Text size={2} textOverflow=\"ellipsis\">\n        {`${option.form.header.text ? `${option.form.header.text} - ` : ``}${option.value}`}\n      </Text>\n      <Card paddingTop={2} tone=\"inherit\" style={{background: 'inherit'}}>\n        <Text size={1} textOverflow=\"ellipsis\">\n          {`${option.list.name} - ${option.list.stats.member_count} member${option.list.stats.member_count == 1 ? '' : 's'}`}\n        </Text>\n      </Card>\n    </Card>\n  )\n}\n","import mailchimp from '@mailchimp/mailchimp_marketing'\n\nimport createHandler from '../shared/create-handler'\n\ninterface MailchimpSignupForm {\n  signup_form_url: string\n  [key: string]: unknown\n}\n\n// Fetch from Mailchimp's API\nexport async function fetchMailchimpData({\n  key,\n  server,\n}: {\n  key: string\n  server: string\n}): Promise<unknown> {\n  mailchimp.setConfig({\n    apiKey: key,\n    server: server,\n  })\n  const response = await mailchimp.lists.getAllLists()\n  if (!('lists' in response)) {\n    throw new Error('Failed to fetch Mailchimp lists')\n  }\n  const signupFormsPerList = await Promise.all(\n    response.lists.map(async (list) => {\n      const {signup_forms: signupForms}: {signup_forms: MailchimpSignupForm[]} =\n        // @ts-expect-error getListSignupForms is missing from the mailchimp typings\n        await mailchimp.lists.getListSignupForms(list.id)\n      return signupForms.map((form) => ({\n        list,\n        form,\n        value: form.signup_form_url,\n      }))\n    }),\n  )\n  return signupFormsPerList.flat()\n}\n\n// Create the Mailchimp handler for a specific key and server\nexport const mailchimpHandler = (keys: {key: string; server: string}) => {\n  return createHandler(() => fetchMailchimpData(keys))\n}\n","import '@sanity/ui/styles.css'\nimport {asyncList} from '@sanity/sanity-plugin-async-list'\nimport {definePlugin} from 'sanity'\n\nimport {Option} from './components/option'\nimport {mailchimpHandler} from './create-handler'\nimport {fetchMailchimpData} from './create-handler'\ninterface MailchimpInputConfig {\n  url: string | URL\n}\n\n/**\n * Usage in `sanity.config.ts` (or .js)\n *\n * ```ts\n * import {defineConfig} from 'sanity'\n * import {mailchimpInput} from '@sanity/form-toolkit/mailchimp'\n *\n * export default defineConfig({\n *   // ...\n *   plugins: [\n *    mailchimpInput({\n *      url: 'http://localhost:3000/api/mailchimp'\n *    })\n *   ],\n * })\n * ```\n */\nexport {fetchMailchimpData, mailchimpHandler}\nexport const mailchimpInput = definePlugin<MailchimpInputConfig>((options) => {\n  return {\n    name: 'sanity-plugin-form-toolkit_mailchimp-input',\n    plugins: [\n      asyncList({\n        schemaType: 'mailchimpForm',\n        loader: async () => {\n          const data = await fetch(options.url)\n          const body = await data.json()\n          return body\n        },\n        autocompleteProps: {\n          //@ts-expect-error incorrect typing on props?\n          renderOption: (option) => Option(option),\n        },\n      }),\n    ],\n  }\n})\n"],"mappings":";;;;;;;;AAGA,MAAaG,UAASC,WAAA;CAAA,IAAAC,IAAAC,EAAA,CAAA,GAiBbC,KAAA,GAAGH,OAAMI,KAAKC,OAAOC,OAAlB,GAA6BN,OAAMI,KAAKC,OAAOC,KAAK,OAApD,KAAiEN,OAAMO,SAAQC;CAAA,AAAAP,EAAA,OAAAE,KAC9EK,KAAAP,EAAA,MAFPO,KAAA,oBAAC,MAAD;EAAY,MAAA;EAAgB,cAAA;EACzBL,UAAAA;CADE,CAAA,GAEEF,EAAA,KAAAE,IAAAF,EAAA,KAAAO;CAAA,IAAAC;CAAA,AAAAR,EAAA,OAAAS,OAAAC,IAAA,2BAAA,KACoCF,KAAA,EAAAG,YAAa,UAAS,GAACX,EAAA,KAAAQ,MAAAA,KAAAR,EAAA;CAE7D,IAAAY,KAAA,GAAGb,OAAMc,KAAKC,KAAK,KAAMf,OAAMc,KAAKE,MAAMC,aAAa,SAAUjB,OAAMc,KAAKE,MAAMC,gBAAiB,IAAlC,KAAA,OAAgDC;CAAA,AAAAjB,EAAA,OAAAY,KAE/GK,KAAAjB,EAAA,MAJPiB,KAAA,oBAAC,MAAD;EAAkB,YAAA;EAAQ,MAAA;EAAiB,OAAAT;EACzC,UAAA,oBAAC,MAAD;GAAY,MAAA;GAAgB,cAAA;GACzBI,UAAAA;EADE,CAAA;CADF,CAAA,GAIEZ,EAAA,KAAAY,IAAAZ,EAAA,KAAAiB;CAAA,IAAAC;CACF,OADElB,EAAA,OAAAO,MAAAP,EAAA,OAAAiB,MARTC,KAAA,qBAAC,MAAD;EAAc,WAAA;EAAkB,SAAA;EAAW,QAAA;EAAQ,MAAA;EAAnD,UAAA,CACEX,IAGAU,EAJG;KASEjB,EAAA,KAAAO,IAAAP,EAAA,KAAAiB,IAAAjB,EAAA,KAAAkB,MAAAA,KAAAlB,EAAA,IATPkB;AASO;ACjBX,eAAsBM,mBAAmB,EACvCD,KACAE,UAImB;CACnBN,UAAUQ,UAAU;EAClBC,QAAQL;EACAE;CACV,CAAC;CACD,IAAMI,WAAW,MAAMV,UAAUW,MAAMC,YAAY;CACnD,IAAI,EAAE,WAAWF,WACf,MAAUG,MAAM,iCAAiC;CAcnD,QAAOC,MAZ0BP,QAAQQ,IACvCL,SAASC,MAAMK,IAAI,OAAOC,SAAS;EACjC,IAAM,EAACC,cAAcC,gBAEnB,MAAMnB,UAAUW,MAAMS,mBAAmBH,KAAKI,EAAE;EAClD,OAAOF,YAAYH,KAAKM,UAAU;GAChCL;GACAK;GACAC,OAAOD,KAAKnB;EACd,EAAE;CACJ,CAAC,CACH,EAAA,CAC0BqB,KAAK;AACjC;AAGA,MAAaC,oBAAoBC,SACxBzB,oBAAoBI,mBAAmBqB,IAAI,CAAC,GCbxCS,iBAAiBP,cAAoCQ,aACzD;CACLC,MAAM;CACNC,SAAS,CACPX,UAAU;EACRY,YAAY;EACZC,QAAQ,YAGCG,OADYF,MADAC,MAAMN,QAAQH,GAAG,EAAA,CACZW,KAAK;EAG/BC,mBAAmB,EAEjBC,eAAeC,WAAWlB,OAAOkB,MAAM,EACzC;CACF,CAAC,CAAC;AAEN,EACD"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["<Text size={2} textOverflow=\"ellipsis\">\n        {`${option.form.header.text ? `${option.form.header.text} - ` : ``}${option.value}`}\n      </Text>","`${option.form.header.text ? `${option.form.header.text} - ` : ``}${option.value}`","{background: 'inherit'}","<Card paddingTop={2} tone=\"inherit\" style={{background: 'inherit'}}>\n        <Text size={1} textOverflow=\"ellipsis\">\n          {`${option.list.name} - ${option.list.stats.member_count} member${option.list.stats.member_count == 1 ? '' : 's'}`}\n        </Text>\n      </Card>","`${option.list.name} - ${option.list.stats.member_count} member${option.list.stats.member_count == 1 ? '' : 's'}`","<Card data-as=\"button\" padding={3} radius={2} tone=\"inherit\">\n      <Text size={2} textOverflow=\"ellipsis\">\n        {`${option.form.header.text ? `${option.form.header.text} - ` : ``}${option.value}`}\n      </Text>\n      <Card paddingTop={2} tone=\"inherit\" style={{background: 'inherit'}}>\n        <Text size={1} textOverflow=\"ellipsis\">\n          {`${option.list.name} - ${option.list.stats.member_count} member${option.list.stats.member_count == 1 ? '' : 's'}`}\n        </Text>\n      </Card>\n    </Card>"],"sources":["../../src/mailchimp/components/option.tsx","../../src/mailchimp/create-handler.ts","../../src/mailchimp/index.ts"],"sourcesContent":["import {Card, Text} from '@sanity/ui'\nimport type {ReactElement} from 'react'\n\nexport const Option = (option: {\n  value: string\n  form: {\n    header: {\n      text?: string\n    }\n  }\n  list: {\n    name: string\n    stats: {\n      member_count: number\n    }\n  }\n}): ReactElement => {\n  return (\n    <Card data-as=\"button\" padding={3} radius={2} tone=\"inherit\">\n      <Text size={2} textOverflow=\"ellipsis\">\n        {`${option.form.header.text ? `${option.form.header.text} - ` : ``}${option.value}`}\n      </Text>\n      <Card paddingTop={2} tone=\"inherit\" style={{background: 'inherit'}}>\n        <Text size={1} textOverflow=\"ellipsis\">\n          {`${option.list.name} - ${option.list.stats.member_count} member${option.list.stats.member_count == 1 ? '' : 's'}`}\n        </Text>\n      </Card>\n    </Card>\n  )\n}\n","import mailchimp from '@mailchimp/mailchimp_marketing'\n\nimport createHandler from '../shared/create-handler'\n\ninterface MailchimpSignupForm {\n  signup_form_url: string\n  [key: string]: unknown\n}\n\n// Fetch from Mailchimp's API\nexport async function fetchMailchimpData({\n  key,\n  server,\n}: {\n  key: string\n  server: string\n}): Promise<unknown> {\n  mailchimp.setConfig({\n    apiKey: key,\n    server: server,\n  })\n  const response = await mailchimp.lists.getAllLists()\n  if (!('lists' in response)) {\n    throw new Error('Failed to fetch Mailchimp lists')\n  }\n  const signupFormsPerList = await Promise.all(\n    response.lists.map(async (list) => {\n      const {signup_forms: signupForms}: {signup_forms: MailchimpSignupForm[]} =\n        // @ts-expect-error getListSignupForms is missing from the mailchimp typings\n        await mailchimp.lists.getListSignupForms(list.id)\n      return signupForms.map((form) => ({\n        list,\n        form,\n        value: form.signup_form_url,\n      }))\n    }),\n  )\n  return signupFormsPerList.flat()\n}\n\n// Create the Mailchimp handler for a specific key and server\nexport const mailchimpHandler = (keys: {key: string; server: string}) => {\n  return createHandler(() => fetchMailchimpData(keys))\n}\n","import '@sanity/ui/styles.css'\nimport {asyncList} from '@sanity/sanity-plugin-async-list'\nimport {definePlugin} from 'sanity'\n\nimport {Option} from './components/option'\nimport {mailchimpHandler} from './create-handler'\nimport {fetchMailchimpData} from './create-handler'\ninterface MailchimpInputConfig {\n  url: string | URL\n}\n\n/**\n * Usage in `sanity.config.ts` (or .js)\n *\n * ```ts\n * import {defineConfig} from 'sanity'\n * import {mailchimpInput} from '@sanity/form-toolkit/mailchimp'\n *\n * export default defineConfig({\n *   // ...\n *   plugins: [\n *    mailchimpInput({\n *      url: 'http://localhost:3000/api/mailchimp'\n *    })\n *   ],\n * })\n * ```\n */\nexport {fetchMailchimpData, mailchimpHandler}\nexport const mailchimpInput = definePlugin<MailchimpInputConfig>((options) => {\n  return {\n    name: 'sanity-plugin-form-toolkit_mailchimp-input',\n    plugins: [\n      asyncList({\n        schemaType: 'mailchimpForm',\n        loader: async () => {\n          const data = await fetch(options.url)\n          const body = await data.json()\n          return body\n        },\n        autocompleteProps: {\n          //@ts-expect-error incorrect typing on props?\n          renderOption: (option) => Option(option),\n        },\n      }),\n    ],\n  }\n})\n"],"mappings":";;;;;;;;AAGA,MAAa,UAAU,WAaH;eAIX,KAAA,GAAG,OAAO,KAAK,OAAO,OAAO,GAAG,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,SAD9EA;CACGC,AAAAA,EAAAA,OAAAA,kBADH,KAAA,oBAAC,MAAD;EAAM,MAAM;EAAG,cAAa;EACzBA,UAAAA;CACG,CAAA,GADHA,EAAAA,KAAAA;CAEwCC,IAAAA;qDAAC,KAAA,EAAA,YAAY,UAAS;CAE5D,IAAA,KAAA,GAAG,OAAO,KAAK,KAAK,KAAK,OAAO,KAAK,MAAM,aAAa,SAAS,OAAO,KAAK,MAAM,gBAAgB,IAAI,KAAK,OAFjHC;CAEKC,AAAAA,EAAAA,OAAAA,kBAFL,KAAA,oBAAC,MAAD;EAAM,YAAY;EAAG,MAAK;EAAU,OAAOF;EACzC,UAAA,oBAAC,MAAD;GAAM,MAAM;GAAG,cAAa;GACzBE,UAAAA;EACG,CAAA;CACF,CAAA,GAFDA,EAAAA,KAAAA;CANPC,IAAAA;CADF,OAEIL,EAAAA,OAAAA,MAAAA,EAAAA,OAGAG,MAJF,KAAA,qBAAC,MAAD;EAAM,WAAQ;EAAS,SAAS;EAAG,QAAQ;EAAG,MAAK;EAAnD,UAAA,CACEH,IAGAG,EAKI;KARJH,EAAAA,KAAAA,IAGAG,EAAAA,KAAAA,4BAJFE;AAWJ;ACnBA,eAAsB,mBAAmB,EACvC,KACA,UAImB;CACnB,UAAU,UAAU;EAClB,QAAQ;EACA;CACV,CAAC;CACD,IAAM,WAAW,MAAM,UAAU,MAAM,YAAY;CACnD,IAAI,EAAE,WAAW,WACf,MAAU,MAAM,iCAAiC;CAcnD,QAAO,MAZ0B,QAAQ,IACvC,SAAS,MAAM,IAAI,OAAO,SAAS;EACjC,IAAM,EAAC,cAAc,gBAEnB,MAAM,UAAU,MAAM,mBAAmB,KAAK,EAAE;EAClD,OAAO,YAAY,KAAK,UAAU;GAChC;GACA;GACA,OAAO,KAAK;EACd,EAAE;CACJ,CAAC,CACH,EAAA,CAC0B,KAAK;AACjC;AAGA,MAAa,oBAAoB,SACxB,oBAAoB,mBAAmB,IAAI,CAAC,GCbxC,iBAAiB,cAAoC,aACzD;CACL,MAAM;CACN,SAAS,CACP,UAAU;EACR,YAAY;EACZ,QAAQ,YAGC,OADY,MADA,MAAM,QAAQ,GAAG,EAAA,CACZ,KAAK;EAG/B,mBAAmB,EAEjB,eAAe,WAAW,OAAO,MAAM,EACzC;CACF,CAAC,CACH;AACF,EACD"}
\ No newline at end of file