@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.
- package/LICENSE +2 -1
- package/README.md +0 -2
- package/dist/_chunks-es/{create-handler.mjs → create-handler.js} +45 -17
- package/dist/_chunks-es/create-handler.js.map +1 -0
- package/dist/form-renderer/index.d.ts +53 -64
- package/dist/form-renderer/index.d.ts.map +1 -0
- package/dist/form-renderer/index.js +123 -108
- package/dist/form-renderer/index.js.map +1 -1
- package/dist/form-schema/index.d.ts +7 -11
- package/dist/form-schema/index.d.ts.map +1 -0
- package/dist/form-schema/index.js +181 -181
- package/dist/form-schema/index.js.map +1 -1
- package/dist/formium/index.d.ts +4 -7
- package/dist/formium/index.d.ts.map +1 -0
- package/dist/formium/index.js +35 -25
- package/dist/formium/index.js.map +1 -1
- package/dist/hubspot/index.d.ts +52 -48
- package/dist/hubspot/index.d.ts.map +1 -0
- package/dist/hubspot/index.js +52 -26
- package/dist/hubspot/index.js.map +1 -1
- package/dist/mailchimp/index.d.ts +56 -42
- package/dist/mailchimp/index.d.ts.map +1 -0
- package/dist/mailchimp/index.js +55 -37
- package/dist/mailchimp/index.js.map +1 -1
- package/package.json +36 -107
- package/dist/_chunks-cjs/create-handler.js +0 -68
- package/dist/_chunks-cjs/create-handler.js.map +0 -1
- package/dist/_chunks-es/create-handler.mjs.map +0 -1
- package/dist/form-renderer/index.d.mts +0 -66
- package/dist/form-renderer/index.mjs +0 -128
- package/dist/form-renderer/index.mjs.map +0 -1
- package/dist/form-schema/index.d.mts +0 -28
- package/dist/form-schema/index.mjs +0 -230
- package/dist/form-schema/index.mjs.map +0 -1
- package/dist/formium/index.d.mts +0 -20
- package/dist/formium/index.mjs +0 -30
- package/dist/formium/index.mjs.map +0 -1
- package/dist/hubspot/index.d.mts +0 -49
- package/dist/hubspot/index.mjs +0 -48
- package/dist/hubspot/index.mjs.map +0 -1
- package/dist/mailchimp/index.d.mts +0 -45
- package/dist/mailchimp/index.mjs +0 -49
- package/dist/mailchimp/index.mjs.map +0 -1
- package/sanity.json +0 -8
- package/src/form-renderer/components/default-field.tsx +0 -123
- package/src/form-renderer/components/form-renderer.tsx +0 -62
- package/src/form-renderer/components/types.ts +0 -51
- package/src/form-renderer/index.ts +0 -4
- package/src/form-schema/components/validation-type.tsx +0 -14
- package/src/form-schema/index.ts +0 -35
- package/src/form-schema/schema-types/form-field.ts +0 -224
- package/src/form-schema/schema-types/form.ts +0 -52
- package/src/form-schema/schema-types/index.ts +0 -9
- package/src/formium/index.ts +0 -52
- package/src/hubspot/components/option.tsx +0 -17
- package/src/hubspot/create-handler.ts +0 -6
- package/src/hubspot/fetch-hubspot-data.ts +0 -33
- package/src/hubspot/index.ts +0 -52
- package/src/index.ts +0 -19
- package/src/mailchimp/components/option.tsx +0 -30
- package/src/mailchimp/create-handler.ts +0 -39
- package/src/mailchimp/index.ts +0 -43
- package/src/shared/create-handler.ts +0 -109
- package/v2-incompatible.js +0 -11
package/LICENSE
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c)
|
|
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
|
@@ -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, {
|
|
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, {
|
|
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({
|
|
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
|
|
34
|
-
return handlerLogic({
|
|
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 ({
|
|
39
|
-
|
|
54
|
+
GET: async ({
|
|
55
|
+
request
|
|
56
|
+
}) => {
|
|
57
|
+
const result = await handlerLogic({});
|
|
40
58
|
return new Response(JSON.stringify(result), {
|
|
41
|
-
headers: {
|
|
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 ({
|
|
48
|
-
|
|
67
|
+
loader: async ({
|
|
68
|
+
request
|
|
69
|
+
}) => {
|
|
70
|
+
const result = await handlerLogic({});
|
|
49
71
|
return new Response(JSON.stringify(result), {
|
|
50
|
-
headers: {
|
|
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 ({
|
|
57
|
-
|
|
80
|
+
get: async ({
|
|
81
|
+
request
|
|
82
|
+
}) => {
|
|
83
|
+
const result = await handlerLogic({});
|
|
58
84
|
return {
|
|
59
85
|
body: JSON.stringify(result),
|
|
60
|
-
headers: {
|
|
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.
|
|
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
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
},
|
|
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 =
|
|
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(
|
|
15
|
-
},
|
|
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__ */
|
|
62
|
+
return /* @__PURE__ */ jsx("button", { type: "submit", children: label || "Submit" });
|
|
19
63
|
case "textarea":
|
|
20
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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((
|
|
47
|
-
/* @__PURE__ */
|
|
48
|
-
|
|
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
|
|
64
|
-
/* @__PURE__ */
|
|
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
|
-
] },
|
|
76
|
+
] }, choice.value));
|
|
79
77
|
default:
|
|
80
|
-
return /* @__PURE__ */
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
]
|
|
100
|
-
|
|
101
|
-
|
|
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
|
|
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,
|
|
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__ */
|
|
116
|
-
},
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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
|
|
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
|
-
|
|
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"}
|