@sanity/form-toolkit 2.2.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/LICENSE +2 -1
  2. package/README.md +0 -2
  3. package/dist/_chunks-es/{create-handler.mjs → create-handler.js} +45 -17
  4. package/dist/_chunks-es/create-handler.js.map +1 -0
  5. package/dist/form-renderer/index.d.ts +53 -64
  6. package/dist/form-renderer/index.d.ts.map +1 -0
  7. package/dist/form-renderer/index.js +123 -108
  8. package/dist/form-renderer/index.js.map +1 -1
  9. package/dist/form-schema/index.d.ts +7 -11
  10. package/dist/form-schema/index.d.ts.map +1 -0
  11. package/dist/form-schema/index.js +181 -181
  12. package/dist/form-schema/index.js.map +1 -1
  13. package/dist/formium/index.d.ts +4 -7
  14. package/dist/formium/index.d.ts.map +1 -0
  15. package/dist/formium/index.js +35 -25
  16. package/dist/formium/index.js.map +1 -1
  17. package/dist/hubspot/index.d.ts +52 -48
  18. package/dist/hubspot/index.d.ts.map +1 -0
  19. package/dist/hubspot/index.js +52 -26
  20. package/dist/hubspot/index.js.map +1 -1
  21. package/dist/mailchimp/index.d.ts +56 -42
  22. package/dist/mailchimp/index.d.ts.map +1 -0
  23. package/dist/mailchimp/index.js +55 -37
  24. package/dist/mailchimp/index.js.map +1 -1
  25. package/package.json +36 -107
  26. package/dist/_chunks-cjs/create-handler.js +0 -68
  27. package/dist/_chunks-cjs/create-handler.js.map +0 -1
  28. package/dist/_chunks-es/create-handler.mjs.map +0 -1
  29. package/dist/form-renderer/index.d.mts +0 -66
  30. package/dist/form-renderer/index.mjs +0 -128
  31. package/dist/form-renderer/index.mjs.map +0 -1
  32. package/dist/form-schema/index.d.mts +0 -28
  33. package/dist/form-schema/index.mjs +0 -230
  34. package/dist/form-schema/index.mjs.map +0 -1
  35. package/dist/formium/index.d.mts +0 -20
  36. package/dist/formium/index.mjs +0 -30
  37. package/dist/formium/index.mjs.map +0 -1
  38. package/dist/hubspot/index.d.mts +0 -49
  39. package/dist/hubspot/index.mjs +0 -48
  40. package/dist/hubspot/index.mjs.map +0 -1
  41. package/dist/mailchimp/index.d.mts +0 -45
  42. package/dist/mailchimp/index.mjs +0 -49
  43. package/dist/mailchimp/index.mjs.map +0 -1
  44. package/sanity.json +0 -8
  45. package/src/form-renderer/components/default-field.tsx +0 -123
  46. package/src/form-renderer/components/form-renderer.tsx +0 -62
  47. package/src/form-renderer/components/types.ts +0 -51
  48. package/src/form-renderer/index.ts +0 -4
  49. package/src/form-schema/components/validation-type.tsx +0 -14
  50. package/src/form-schema/index.ts +0 -35
  51. package/src/form-schema/schema-types/form-field.ts +0 -224
  52. package/src/form-schema/schema-types/form.ts +0 -52
  53. package/src/form-schema/schema-types/index.ts +0 -9
  54. package/src/formium/index.ts +0 -52
  55. package/src/hubspot/components/option.tsx +0 -17
  56. package/src/hubspot/create-handler.ts +0 -6
  57. package/src/hubspot/fetch-hubspot-data.ts +0 -33
  58. package/src/hubspot/index.ts +0 -52
  59. package/src/index.ts +0 -19
  60. package/src/mailchimp/components/option.tsx +0 -30
  61. package/src/mailchimp/create-handler.ts +0 -39
  62. package/src/mailchimp/index.ts +0 -43
  63. package/src/shared/create-handler.ts +0 -109
  64. package/v2-incompatible.js +0 -11
package/LICENSE CHANGED
@@ -1,6 +1,7 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 Chris LaRocque
3
+ Copyright (c) 2026 Chris LaRocque
4
+ Copyright (c) 2026 Sanity.io
4
5
 
5
6
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
7
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -4,8 +4,6 @@
4
4
 
5
5
  Plugin for integrating 3rd party form services or building your own forms with Sanity.
6
6
 
7
- > This is a **Sanity Studio v3** plugin.
8
-
9
7
  ## Installation
10
8
 
11
9
  ```sh
@@ -13,51 +13,79 @@ const detectFramework = () => {
13
13
  throw new Error("Unable to detect framework.");
14
14
  }, createHandler = (handlerFunc) => {
15
15
  const framework = detectFramework(), handlerLogic = async ({
16
- // eslint-disable-next-line
17
- req,
18
16
  res
19
17
  }) => {
20
18
  try {
21
19
  const data = await handlerFunc();
22
- return res && (res.writeHead(200, { "Content-Type": "application/json" }), res.end(JSON.stringify(data))), data;
20
+ return res && (res.writeHead(200, {
21
+ "Content-Type": "application/json"
22
+ }), res.end(JSON.stringify(data))), data;
23
23
  } catch (error) {
24
- return error instanceof Error ? (res && (res.writeHead(500, { "Content-Type": "application/json" }), res.end(JSON.stringify({ error: error.message }))), { error: error.message }) : (res && (res.writeHead(500, { "Content-Type": "application/json" }), res.end(JSON.stringify({ error: "An unexpected error occurred" }))), { error: "An unexpected error occurred" });
24
+ return error instanceof Error ? (res && (res.writeHead(500, {
25
+ "Content-Type": "application/json"
26
+ }), res.end(JSON.stringify({
27
+ error: error.message
28
+ }))), {
29
+ error: error.message
30
+ }) : (res && (res.writeHead(500, {
31
+ "Content-Type": "application/json"
32
+ }), res.end(JSON.stringify({
33
+ error: "An unexpected error occurred"
34
+ }))), {
35
+ error: "An unexpected error occurred"
36
+ });
25
37
  }
26
38
  };
27
39
  if (framework === "nextjs")
28
40
  return async (req, res) => {
29
- res.setHeader("Access-Control-Allow-Origin", "*"), res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"), res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"), await handlerLogic({ req, res });
41
+ res.setHeader("Access-Control-Allow-Origin", "*"), res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"), res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"), await handlerLogic({
42
+ res
43
+ });
30
44
  };
31
45
  if (framework === "nuxt")
32
46
  return defineEventHandler(async (event) => {
33
- const req = event.node.req, res = event.node.res;
34
- return handlerLogic({ req, res });
47
+ const res = event.node.res;
48
+ return handlerLogic({
49
+ res
50
+ });
35
51
  });
36
52
  if (framework === "sveltekit")
37
53
  return {
38
- GET: async ({ request }) => {
39
- const result = await handlerLogic({ req: request });
54
+ GET: async ({
55
+ request
56
+ }) => {
57
+ const result = await handlerLogic({});
40
58
  return new Response(JSON.stringify(result), {
41
- headers: { "Content-Type": "application/json" }
59
+ headers: {
60
+ "Content-Type": "application/json"
61
+ }
42
62
  });
43
63
  }
44
64
  };
45
65
  if (framework === "remix")
46
66
  return {
47
- loader: async ({ request }) => {
48
- const result = await handlerLogic({ req: request });
67
+ loader: async ({
68
+ request
69
+ }) => {
70
+ const result = await handlerLogic({});
49
71
  return new Response(JSON.stringify(result), {
50
- headers: { "Content-Type": "application/json" }
72
+ headers: {
73
+ "Content-Type": "application/json"
74
+ }
51
75
  });
52
76
  }
53
77
  };
54
78
  if (framework === "astro")
55
79
  return {
56
- get: async ({ request }) => {
57
- const result = await handlerLogic({ req: request });
80
+ get: async ({
81
+ request
82
+ }) => {
83
+ const result = await handlerLogic({});
58
84
  return {
59
85
  body: JSON.stringify(result),
60
- headers: { "Content-Type": "application/json" }
86
+ headers: {
87
+ "Content-Type": "application/json"
88
+ }
61
89
  };
62
90
  }
63
91
  };
@@ -66,4 +94,4 @@ const detectFramework = () => {
66
94
  export {
67
95
  createHandler
68
96
  };
69
- //# sourceMappingURL=create-handler.mjs.map
97
+ //# sourceMappingURL=create-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-handler.js","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 throw new Error('Unable to detect framework.')\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 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"],"names":["detectFramework","process","env","Error","createHandler","handlerFunc","framework","handlerLogic","res","data","writeHead","end","JSON","stringify","error","message","req","setHeader","defineEventHandler","event","node","GET","request","result","Response","headers","loader","get","body"],"mappings":";AAKA,MAAMA,kBAAkBA,MAAc;AACpC,MAAIC,QAAQC,IAAI;AACd,WAAO;AACF,MAAID,QAAQC,IAAI;AACrB,WAAO;AACF,MAAID,QAAQC,IAAI;AACrB,WAAO;AACF,MAAID,QAAQC,IAAI;AACrB,WAAO;AACF,MAAID,QAAQC,IAAI;AACrB,WAAO;AAET,QAAM,IAAIC,MAAM,6BAA6B;AAC/C,GAGMC,gBAAiBC,CAAAA,gBAAwC;AAC7D,QAAMC,YAAYN,mBAGZO,eAAe,OAAO;AAAA,IAC1BC;AAAAA,EAAAA,MAIsB;AACtB,QAAI;AACF,YAAMC,OAAO,MAAMJ,YAAAA;AAEnB,aAAIG,QAEFA,IAAIE,UAAU,KAAK;AAAA,QAAC,gBAAgB;AAAA,MAAA,CAAmB,GACvDF,IAAIG,IAAIC,KAAKC,UAAUJ,IAAI,CAAC,IAIvBA;AAAAA,IACT,SAASK,OAAO;AACd,aAAIA,iBAAiBX,SACfK,QACFA,IAAIE,UAAU,KAAK;AAAA,QAAC,gBAAgB;AAAA,MAAA,CAAmB,GACvDF,IAAIG,IAAIC,KAAKC,UAAU;AAAA,QAACC,OAAOA,MAAMC;AAAAA,MAAAA,CAAQ,CAAC,IAEzC;AAAA,QAACD,OAAOA,MAAMC;AAAAA,MAAAA,MAGnBP,QACFA,IAAIE,UAAU,KAAK;AAAA,QAAC,gBAAgB;AAAA,MAAA,CAAmB,GACvDF,IAAIG,IAAIC,KAAKC,UAAU;AAAA,QAACC,OAAO;AAAA,MAAA,CAA+B,CAAC,IAE1D;AAAA,QAACA,OAAO;AAAA,MAAA;AAAA,IACjB;AAAA,EACF;AAGA,MAAIR,cAAc;AAChB,WAAO,OAAOU,KAAsBR,QAAwB;AAE1DA,UAAIS,UAAU,+BAA+B,GAAG,GAChDT,IAAIS,UAAU,gCAAgC,iCAAiC,GAC/ET,IAAIS,UAAU,gCAAgC,6BAA6B,GAE3E,MAAMV,aAAa;AAAA,QAAMC;AAAAA,MAAAA,CAAI;AAAA,IAC/B;AACK,MAAIF,cAAc;AACvB,WAAOY,mBAAmB,OAAOC,UAAmB;AAClD,YACMX,MAAMW,MAAMC,KAAKZ;AACvB,aAAOD,aAAa;AAAA,QAAMC;AAAAA,MAAAA,CAAI;AAAA,IAChC,CAAC;AACI,MAAIF,cAAc;AACvB,WAAO;AAAA,MACLe,KAAK,OAAO;AAAA,QAACC;AAAAA,MAAAA,MAAiC;AAC5C,cAAMC,SAAS,MAAMhB,aAAa,CAAa,CAAC;AAChD,eAAO,IAAIiB,SAASZ,KAAKC,UAAUU,MAAM,GAAG;AAAA,UAC1CE,SAAS;AAAA,YAAC,gBAAgB;AAAA,UAAA;AAAA,QAAkB,CAC7C;AAAA,MACH;AAAA,IAAA;AAEG,MAAInB,cAAc;AACvB,WAAO;AAAA,MACLoB,QAAQ,OAAO;AAAA,QAACJ;AAAAA,MAAAA,MAAiC;AAC/C,cAAMC,SAAS,MAAMhB,aAAa,CAAa,CAAC;AAChD,eAAO,IAAIiB,SAASZ,KAAKC,UAAUU,MAAM,GAAG;AAAA,UAC1CE,SAAS;AAAA,YAAC,gBAAgB;AAAA,UAAA;AAAA,QAAkB,CAC7C;AAAA,MACH;AAAA,IAAA;AAEG,MAAInB,cAAc;AACvB,WAAO;AAAA,MACLqB,KAAK,OAAO;AAAA,QAACL;AAAAA,MAAAA,MAAiC;AAC5C,cAAMC,SAAS,MAAMhB,aAAa,CAAa,CAAC;AAChD,eAAO;AAAA,UACLqB,MAAMhB,KAAKC,UAAUU,MAAM;AAAA,UAC3BE,SAAS;AAAA,YAAC,gBAAgB;AAAA,UAAA;AAAA,QAAkB;AAAA,MAEhD;AAAA,IAAA;AAGJ,QAAM,IAAItB,MAAM,0BAA0BG,SAAS,EAAE;AACvD;"}
@@ -1,66 +1,55 @@
1
- import type {ComponentType} from 'react'
2
- import type {FC} from 'react'
3
- import type {HTMLProps} from 'react'
4
-
5
- declare type FieldChoice = {
6
- label: string
7
- value: string
8
- }
9
-
10
- declare interface FieldComponentProps {
11
- field: FormField
12
- fieldState: FieldState
13
- error?: string
14
- }
15
-
16
- declare type FieldOptions = {
17
- placeholder?: string
18
- defaultValue?: string
19
- }
20
-
21
- declare interface FieldState {
22
- value?: string | number | readonly string[]
23
- onChange: (value: unknown) => void
24
- onBlur?: () => void
25
- ref?: unknown
26
- }
27
-
28
- export declare type FormDataProps = {
29
- title: string
1
+ import { ComponentType, FC, HTMLProps } from "react";
2
+ type ValidationRule = {
3
+ type: string;
4
+ value: string;
5
+ message: string;
6
+ };
7
+ type FieldChoice = {
8
+ label: string;
9
+ value: string;
10
+ };
11
+ type FieldOptions = {
12
+ placeholder?: string;
13
+ defaultValue?: string;
14
+ };
15
+ type FormField = {
16
+ type: string;
17
+ label?: string;
18
+ name: string;
19
+ required?: boolean;
20
+ validation?: ValidationRule[];
21
+ options?: FieldOptions;
22
+ choices?: FieldChoice[];
23
+ _key?: string;
24
+ };
25
+ type FormDataProps = {
26
+ title: string;
30
27
  id: {
31
- current: string
32
- }
33
- fields?: FormField[]
28
+ current: string;
29
+ };
30
+ fields?: FormField[];
34
31
  submitButton?: {
35
- text: string
36
- position: 'left' | 'center' | 'right'
37
- }
38
- }
39
-
40
- declare type FormField = {
41
- type: string
42
- label?: string
43
- name: string
44
- required?: boolean
45
- validation?: ValidationRule[]
46
- options?: FieldOptions
47
- choices?: FieldChoice[]
48
- _key?: string
49
- }
50
-
51
- export declare const FormRenderer: FC<FormRendererProps>
52
-
53
- declare interface FormRendererProps extends HTMLProps<HTMLFormElement> {
54
- formData?: FormDataProps
55
- getFieldState?: (fieldName: string) => FieldState
56
- getFieldError?: (fieldName: string) => string | undefined
57
- fieldComponents?: Record<string, ComponentType<FieldComponentProps>>
58
- }
59
-
60
- declare type ValidationRule = {
61
- type: string
62
- value: string
63
- message: string
64
- }
65
-
66
- export {}
32
+ text: string;
33
+ position: 'left' | 'center' | 'right';
34
+ };
35
+ };
36
+ interface FieldState {
37
+ value?: string | number | readonly string[];
38
+ onChange: (value: unknown) => void;
39
+ onBlur?: () => void;
40
+ ref?: unknown;
41
+ }
42
+ interface FieldComponentProps {
43
+ field: FormField;
44
+ fieldState: FieldState;
45
+ error?: string;
46
+ }
47
+ interface FormRendererProps extends HTMLProps<HTMLFormElement> {
48
+ formData?: FormDataProps;
49
+ getFieldState?: (fieldName: string) => FieldState;
50
+ getFieldError?: (fieldName: string) => string | undefined;
51
+ fieldComponents?: Record<string, ComponentType<FieldComponentProps>>;
52
+ }
53
+ declare const FormRenderer: FC<FormRendererProps>;
54
+ export { type FormDataProps, FormRenderer };
55
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/form-renderer/components/types.ts","../../src/form-renderer/components/form-renderer.tsx"],"mappings":";KAAY,cAAA;EACV,IAAA;EACA,KAAA;EACA,OAAA;AAAA;AAAA,KAGU,WAAA;EACV,KAAA;EACA,KAAK;AAAA;AAAA,KAGK,YAAA;EACV,WAAA;EACA,YAAY;AAAA;AAAA,KAGF,SAAA;EACV,IAAA;EACA,KAAA;EACA,IAAA;EACA,QAAA;EACA,UAAA,GAAa,cAAA;EACb,OAAA,GAAU,YAAA;EACV,OAAA,GAAU,WAAA;EACV,IAAA;AAAA;AAAA,KAGU,aAAA;EACV,KAAA;EACA,EAAA;IACE,OAAA;EAAA;EAEF,MAAA,GAAS,SAAS;EAClB,YAAA;IACE,IAAA;IACA,QAAA;EAAA;AAAA;AAAA,UAIa,UAAA;EACf,KAAA;EACA,QAAA,GAAW,KAAA;EACX,MAAA;EACA,GAAA;AAAA;AAAA,UAGe,mBAAA;EACf,KAAA,EAAO,SAAA;EACP,UAAA,EAAY,UAAU;EACtB,KAAA;AAAA;AAAA,UC5CQ,iBAAA,SAA0B,SAAA,CAAU,eAAA;EAC5C,QAAA,GAAW,aAAA;EAEX,aAAA,IAAiB,SAAA,aAAsB,UAAA;EAEvC,aAAA,IAAiB,SAAA;EAEjB,eAAA,GAAkB,MAAA,SAAe,aAAA,CAAc,mBAAA;AAAA;AAAA,cAWpC,YAAA,EAAc,EAAE,CAAC,iBAAA"}
@@ -1,128 +1,143 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: !0 });
3
- var jsxRuntime = require("react/jsx-runtime");
4
- const DefaultField = ({ field, fieldState, error }) => {
5
- const { type, label, name, options = {}, choices = [], validation = [] } = field;
6
- if (!type || !name) return null;
7
- const validationRules = validation.reduce((acc, v) => (acc[v.type] = v.value, acc), {}), { value, onChange, onBlur, ref } = fieldState, handleChange = (e) => {
1
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
+ import { c } from "react/compiler-runtime";
3
+ const toRef = (ref) => ref, DefaultField = (t0) => {
4
+ const $ = c(38), {
5
+ field,
6
+ fieldState,
7
+ error
8
+ } = t0, {
9
+ type,
10
+ label,
11
+ name,
12
+ options: t1,
13
+ choices: t2,
14
+ validation: t3
15
+ } = field;
16
+ let t4;
17
+ $[0] !== t1 ? (t4 = t1 === void 0 ? {} : t1, $[0] = t1, $[1] = t4) : t4 = $[1];
18
+ const options = t4;
19
+ let t5;
20
+ $[2] !== t2 ? (t5 = t2 === void 0 ? [] : t2, $[2] = t2, $[3] = t5) : t5 = $[3];
21
+ const choices = t5;
22
+ let t6, t7;
23
+ if ($[4] !== name || $[5] !== t3 || $[6] !== type) {
24
+ t7 = /* @__PURE__ */ Symbol.for("react.early_return_sentinel");
25
+ bb0: {
26
+ const validation = t3 === void 0 ? [] : t3;
27
+ if (!type || !name) {
28
+ t7 = null;
29
+ break bb0;
30
+ }
31
+ t6 = validation.reduce(_temp, {});
32
+ }
33
+ $[4] = name, $[5] = t3, $[6] = type, $[7] = t6, $[8] = t7;
34
+ } else
35
+ t6 = $[7], t7 = $[8];
36
+ if (t7 !== /* @__PURE__ */ Symbol.for("react.early_return_sentinel"))
37
+ return t7;
38
+ const validationRules = t6, {
39
+ value,
40
+ onChange,
41
+ onBlur,
42
+ ref
43
+ } = fieldState;
44
+ let t8;
45
+ $[9] !== onChange ? (t8 = (e) => {
8
46
  onChange(e.target.value);
9
- }, handleCheckboxChange = (e, choiceValue) => {
47
+ }, $[9] = onChange, $[10] = t8) : t8 = $[10];
48
+ const handleChange = t8;
49
+ let t9;
50
+ $[11] !== onChange || $[12] !== value ? (t9 = (e_0, choiceValue) => {
10
51
  if (Array.isArray(value)) {
11
- const newValue = e.target.checked ? [...value, choiceValue] : value.filter((v) => v !== choiceValue);
52
+ const newValue = e_0.target.checked ? [...value, choiceValue] : value.filter((v_0) => v_0 !== choiceValue);
12
53
  onChange(newValue);
13
54
  } else
14
- onChange(e.target.checked ? choiceValue : "");
15
- }, renderInput = () => {
55
+ onChange(e_0.target.checked ? choiceValue : "");
56
+ }, $[11] = onChange, $[12] = value, $[13] = t9) : t9 = $[13];
57
+ const handleCheckboxChange = t9;
58
+ let t10;
59
+ $[14] !== choices || $[15] !== handleChange || $[16] !== handleCheckboxChange || $[17] !== label || $[18] !== name || $[19] !== onBlur || $[20] !== options || $[21] !== ref || $[22] !== type || $[23] !== validationRules || $[24] !== value ? (t10 = () => {
16
60
  switch (type) {
17
61
  case "submit":
18
- return /* @__PURE__ */ jsxRuntime.jsx("button", { type: "submit", children: label || "Submit" });
62
+ return /* @__PURE__ */ jsx("button", { type: "submit", children: label || "Submit" });
19
63
  case "textarea":
20
- return /* @__PURE__ */ jsxRuntime.jsx(
21
- "textarea",
22
- {
23
- ref,
24
- name,
25
- onChange: handleChange,
26
- onBlur,
27
- placeholder: options.placeholder,
28
- ...validationRules,
29
- value: value ?? ""
30
- }
31
- );
64
+ return /* @__PURE__ */ jsx("textarea", { ref: toRef(ref), name, onChange: handleChange, onBlur, placeholder: options.placeholder, ...validationRules, value: value ?? "" });
32
65
  case "select":
33
- return /* @__PURE__ */ jsxRuntime.jsx(
34
- "select",
35
- {
36
- ref,
37
- name,
38
- value: value ?? "",
39
- onChange: handleChange,
40
- ...validationRules,
41
- onBlur,
42
- children: choices?.map((choice, i) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: choice.value, children: choice.label }, i))
43
- }
44
- );
66
+ return /* @__PURE__ */ jsx("select", { ref: toRef(ref), name, value: value ?? "", onChange: handleChange, ...validationRules, onBlur, children: choices?.map(_temp2) });
45
67
  case "radio":
46
- return choices?.map((choice, i) => /* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
47
- /* @__PURE__ */ jsxRuntime.jsx(
48
- "input",
49
- {
50
- type: "radio",
51
- name,
52
- ref,
53
- value: choice.value,
54
- checked: value === choice.value,
55
- onChange: handleChange,
56
- onBlur,
57
- ...validationRules
58
- }
59
- ),
60
- choice.label
61
- ] }, i));
68
+ return choices?.map((choice_0) => /* @__PURE__ */ jsxs("label", { children: [
69
+ /* @__PURE__ */ jsx("input", { type: "radio", name, ref: toRef(ref), value: choice_0.value, checked: value === choice_0.value, onChange: handleChange, onBlur, ...validationRules }),
70
+ choice_0.label
71
+ ] }, choice_0.value));
62
72
  case "checkbox":
63
- return choices?.map((choice, i) => /* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
64
- /* @__PURE__ */ jsxRuntime.jsx(
65
- "input",
66
- {
67
- type: "checkbox",
68
- name,
69
- ref,
70
- value: choice.value,
71
- checked: Array.isArray(value) ? value.includes(choice.value) : value === choice.value,
72
- onChange: (e) => handleCheckboxChange(e, choice.value),
73
- onBlur,
74
- ...validationRules
75
- }
76
- ),
73
+ return choices?.map((choice) => /* @__PURE__ */ jsxs("label", { children: [
74
+ /* @__PURE__ */ jsx("input", { type: "checkbox", name, ref: toRef(ref), value: choice.value, checked: Array.isArray(value) ? value.includes(choice.value) : value === choice.value, onChange: (e_1) => handleCheckboxChange(e_1, choice.value), onBlur, ...validationRules }),
77
75
  choice.label
78
- ] }, i));
76
+ ] }, choice.value));
79
77
  default:
80
- return /* @__PURE__ */ jsxRuntime.jsx(
81
- "input",
82
- {
83
- type,
84
- ref,
85
- name,
86
- value: value ?? options.defaultValue ?? "",
87
- onChange: handleChange,
88
- ...validationRules,
89
- onBlur,
90
- placeholder: options.placeholder
91
- }
92
- );
78
+ return /* @__PURE__ */ jsx("input", { type, ref: toRef(ref), name, value: value ?? options.defaultValue ?? "", onChange: handleChange, ...validationRules, onBlur, placeholder: options.placeholder });
93
79
  }
94
- };
95
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
96
- label && !["hidden", "submit"].includes(type) && /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: name, children: label }),
97
- renderInput(),
98
- error && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "error", children: error })
99
- ] });
100
- }, FormRenderer = (props) => {
101
- const {
80
+ }, $[14] = choices, $[15] = handleChange, $[16] = handleCheckboxChange, $[17] = label, $[18] = name, $[19] = onBlur, $[20] = options, $[21] = ref, $[22] = type, $[23] = validationRules, $[24] = value, $[25] = t10) : t10 = $[25];
81
+ const renderInput = t10;
82
+ let t11;
83
+ $[26] !== label || $[27] !== name || $[28] !== type ? (t11 = label && !["hidden", "submit"].includes(type) && /* @__PURE__ */ jsx("label", { htmlFor: name, children: label }), $[26] = label, $[27] = name, $[28] = type, $[29] = t11) : t11 = $[29];
84
+ let t12;
85
+ $[30] !== renderInput ? (t12 = renderInput(), $[30] = renderInput, $[31] = t12) : t12 = $[31];
86
+ let t13;
87
+ $[32] !== error ? (t13 = error && /* @__PURE__ */ jsx("span", { className: "error", children: error }), $[32] = error, $[33] = t13) : t13 = $[33];
88
+ let t14;
89
+ return $[34] !== t11 || $[35] !== t12 || $[36] !== t13 ? (t14 = /* @__PURE__ */ jsxs(Fragment, { children: [
90
+ t11,
91
+ t12,
92
+ t13
93
+ ] }), $[34] = t11, $[35] = t12, $[36] = t13, $[37] = t14) : t14 = $[37], t14;
94
+ };
95
+ function _temp(acc, v) {
96
+ return acc[v.type] = v.value, acc;
97
+ }
98
+ function _temp2(choice_1) {
99
+ return /* @__PURE__ */ jsx("option", { value: choice_1.value, children: choice_1.label }, choice_1.value);
100
+ }
101
+ const defaultGetFieldState = (name) => ({
102
+ value: void 0,
103
+ onChange: () => {
104
+ },
105
+ name
106
+ // Pass name to field for native form handling
107
+ }), defaultFieldComponents = {}, FormRenderer = (props) => {
108
+ const $ = c(18), {
102
109
  formData,
103
- getFieldState = (name) => ({
104
- value: void 0,
105
- onChange: () => {
106
- },
107
- name
108
- // Pass name to field for native form handling
109
- }),
110
+ getFieldState: t0,
110
111
  getFieldError,
111
- fieldComponents = {},
112
+ fieldComponents: t1,
112
113
  children
113
- } = props, renderField = (field) => {
114
+ } = props, getFieldState = t0 === void 0 ? defaultGetFieldState : t0, fieldComponents = t1 === void 0 ? defaultFieldComponents : t1;
115
+ let t2;
116
+ $[0] !== fieldComponents || $[1] !== getFieldError || $[2] !== getFieldState ? (t2 = (field) => {
114
117
  const CustomComponent = fieldComponents[field.type], fieldState = getFieldState(field.name), error = getFieldError?.(field.name);
115
- return CustomComponent ? /* @__PURE__ */ jsxRuntime.jsx(CustomComponent, { field, fieldState, error }) : /* @__PURE__ */ jsxRuntime.jsx(DefaultField, { field, fieldState, error });
116
- }, elProps = Object.assign({}, props);
117
- return delete elProps.formData, delete elProps.getFieldState, delete elProps.getFieldError, delete elProps.fieldComponents, /* @__PURE__ */ jsxRuntime.jsxs("form", { ...elProps, id: elProps.id ?? formData?.id?.current, children: [
118
- formData?.fields?.map((field) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "form-field", children: renderField(field) }, field._key)),
118
+ return CustomComponent ? /* @__PURE__ */ jsx(CustomComponent, { field, fieldState, error }) : /* @__PURE__ */ jsx(DefaultField, { field, fieldState, error });
119
+ }, $[0] = fieldComponents, $[1] = getFieldError, $[2] = getFieldState, $[3] = t2) : t2 = $[3];
120
+ const renderField = t2;
121
+ let elProps;
122
+ $[4] !== props ? (elProps = Object.assign({}, props), delete elProps.formData, delete elProps.getFieldState, delete elProps.getFieldError, delete elProps.fieldComponents, $[4] = props, $[5] = elProps) : elProps = $[5];
123
+ const t3 = elProps.id ?? formData?.id?.current;
124
+ let t4;
125
+ $[6] !== formData?.fields || $[7] !== renderField ? (t4 = formData?.fields?.map((field_0) => /* @__PURE__ */ jsx("div", { className: "form-field", children: renderField(field_0) }, field_0._key)), $[6] = formData?.fields, $[7] = renderField, $[8] = t4) : t4 = $[8];
126
+ const t5 = formData?.submitButton?.text || "Submit";
127
+ let t6;
128
+ $[9] !== renderField || $[10] !== t5 ? (t6 = renderField({
129
+ type: "submit",
130
+ name: "submit",
131
+ label: t5
132
+ }), $[9] = renderField, $[10] = t5, $[11] = t6) : t6 = $[11];
133
+ let t7;
134
+ return $[12] !== children || $[13] !== elProps || $[14] !== t3 || $[15] !== t4 || $[16] !== t6 ? (t7 = /* @__PURE__ */ jsxs("form", { ...elProps, id: t3, children: [
135
+ t4,
119
136
  children,
120
- renderField({
121
- type: "submit",
122
- name: "submit",
123
- label: formData?.submitButton?.text || "Submit"
124
- })
125
- ] });
137
+ t6
138
+ ] }), $[12] = children, $[13] = elProps, $[14] = t3, $[15] = t4, $[16] = t6, $[17] = t7) : t7 = $[17], t7;
139
+ };
140
+ export {
141
+ FormRenderer
126
142
  };
127
- exports.FormRenderer = FormRenderer;
128
143
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/form-renderer/components/default-field.tsx","../../src/form-renderer/components/form-renderer.tsx"],"sourcesContent":["import type {ChangeEvent, FC, LegacyRef} from 'react'\n\nimport type {FieldComponentProps} from './types'\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\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 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={ref as LegacyRef<HTMLTextAreaElement>}\n name={name}\n onChange={handleChange}\n onBlur={onBlur}\n placeholder={options.placeholder}\n {...validationRules}\n value={value ?? ''}\n />\n )\n\n case 'select':\n return (\n <select\n ref={ref as LegacyRef<HTMLSelectElement>}\n name={name}\n value={value ?? ''}\n onChange={handleChange}\n {...validationRules}\n onBlur={onBlur}\n >\n {choices?.map((choice, i) => (\n <option key={i} value={choice.value}>\n {choice.label}\n </option>\n ))}\n </select>\n )\n\n case 'radio':\n return choices?.map((choice, i) => (\n <label key={i}>\n <input\n type=\"radio\"\n name={name}\n ref={ref as LegacyRef<HTMLInputElement>}\n value={choice.value}\n checked={value === choice.value}\n onChange={handleChange}\n onBlur={onBlur}\n {...validationRules}\n />\n {choice.label}\n </label>\n ))\n\n case 'checkbox':\n return choices?.map((choice, i) => (\n <label key={i}>\n <input\n type=\"checkbox\"\n name={name}\n ref={ref as LegacyRef<HTMLInputElement>}\n value={choice.value}\n checked={Array.isArray(value) ? value.includes(choice.value) : value === choice.value}\n onChange={(e) => handleCheckboxChange(e, choice.value)}\n onBlur={onBlur}\n {...validationRules}\n />\n {choice.label}\n </label>\n ))\n\n default:\n return (\n <input\n type={type}\n ref={ref as LegacyRef<HTMLInputElement>}\n name={name}\n value={value ?? options.defaultValue ?? ''}\n onChange={handleChange}\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\nexport const FormRenderer: FC<FormRendererProps> = (props) => {\n const {\n formData,\n getFieldState = (name) => ({\n value: undefined,\n onChange: () => {},\n name, // Pass name to field for native form handling\n }),\n getFieldError,\n fieldComponents = {},\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} 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"],"names":["jsx","jsxs","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","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\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 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 onChange={handleChange}\n onBlur={onBlur}\n placeholder={options.placeholder}\n {...validationRules}\n value={value ?? ''}\n />\n )\n\n case 'select':\n return (\n <select\n ref={toRef<HTMLSelectElement>(ref)}\n name={name}\n value={value ?? ''}\n onChange={handleChange}\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 checked={value === choice.value}\n onChange={handleChange}\n onBlur={onBlur}\n {...validationRules}\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 checked={Array.isArray(value) ? value.includes(choice.value) : value === choice.value}\n onChange={(e) => handleCheckboxChange(e, choice.value)}\n onBlur={onBlur}\n {...validationRules}\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 value={value ?? options.defaultValue ?? ''}\n onChange={handleChange}\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\nconst defaultGetFieldState = (name: string) => ({\n value: undefined,\n onChange: () => {},\n name, // Pass name to field for native form handling\n})\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} 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"],"names":["toRef","ref","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","t8","e","target","handleChange","t9","e_0","choiceValue","Array","isArray","newValue","checked","filter","v_0","v","handleCheckboxChange","t10","placeholder","map","_temp2","choice_0","choice","includes","e_1","defaultValue","renderInput","t11","t12","t13","t14","acc","choice_1","defaultGetFieldState","defaultFieldComponents","FormRenderer","props","formData","getFieldState","getFieldError","fieldComponents","children","CustomComponent","renderField","elProps","Object","assign","id","current","fields","field_0","_key","submitButton","text"],"mappings":"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"}
@@ -1,6 +1,4 @@
1
- import {FieldDefinition} from 'sanity'
2
- import {Plugin as Plugin_2} from 'sanity'
3
-
1
+ import { FieldDefinition } from "sanity";
4
2
  /**
5
3
  * Usage in `sanity.config.ts` (or .js)
6
4
  *
@@ -14,15 +12,13 @@ import {Plugin as Plugin_2} from 'sanity'
14
12
  * })
15
13
  * ```
16
14
  */
17
- export declare type FieldsOption = Array<FieldDefinition>
18
-
19
- export declare const formSchema: Plugin_2<FormSchemaPluginOptions | undefined>
20
-
21
- declare interface FormSchemaPluginOptions {
15
+ type FieldsOption = Array<FieldDefinition>;
16
+ interface FormSchemaPluginOptions {
22
17
  /**
23
18
  * Array of field definitions to be used in the form schema.
24
19
  */
25
- fields?: FieldsOption
20
+ fields?: FieldsOption;
26
21
  }
27
-
28
- export {}
22
+ declare const formSchema: import("sanity").Plugin<void | FormSchemaPluginOptions>;
23
+ export { FieldsOption, formSchema };
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/form-schema/index.ts"],"mappings":";;AAoBA;;;;AAAgD;AAAC;;;;AAK1B;AAGvB;;KARY,YAAA,GAAe,KAAK,CAAC,eAAA;AAAA,UACvB,uBAAA;EAOa;;;EAHrB,MAAA,GAAS,YAAY;AAAA;AAAA,cAGV,UAAA,mBAAU,MAAA,QAAA,uBAAA"}