@sanity/form-toolkit 2.2.3 → 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 (63) hide show
  1. package/LICENSE +2 -1
  2. package/dist/_chunks-es/{create-handler.mjs → create-handler.js} +45 -17
  3. package/dist/_chunks-es/create-handler.js.map +1 -0
  4. package/dist/form-renderer/index.d.ts +53 -64
  5. package/dist/form-renderer/index.d.ts.map +1 -0
  6. package/dist/form-renderer/index.js +123 -108
  7. package/dist/form-renderer/index.js.map +1 -1
  8. package/dist/form-schema/index.d.ts +7 -11
  9. package/dist/form-schema/index.d.ts.map +1 -0
  10. package/dist/form-schema/index.js +181 -181
  11. package/dist/form-schema/index.js.map +1 -1
  12. package/dist/formium/index.d.ts +4 -7
  13. package/dist/formium/index.d.ts.map +1 -0
  14. package/dist/formium/index.js +35 -25
  15. package/dist/formium/index.js.map +1 -1
  16. package/dist/hubspot/index.d.ts +52 -48
  17. package/dist/hubspot/index.d.ts.map +1 -0
  18. package/dist/hubspot/index.js +52 -26
  19. package/dist/hubspot/index.js.map +1 -1
  20. package/dist/mailchimp/index.d.ts +56 -42
  21. package/dist/mailchimp/index.d.ts.map +1 -0
  22. package/dist/mailchimp/index.js +55 -37
  23. package/dist/mailchimp/index.js.map +1 -1
  24. package/package.json +36 -107
  25. package/dist/_chunks-cjs/create-handler.js +0 -68
  26. package/dist/_chunks-cjs/create-handler.js.map +0 -1
  27. package/dist/_chunks-es/create-handler.mjs.map +0 -1
  28. package/dist/form-renderer/index.d.mts +0 -66
  29. package/dist/form-renderer/index.mjs +0 -128
  30. package/dist/form-renderer/index.mjs.map +0 -1
  31. package/dist/form-schema/index.d.mts +0 -28
  32. package/dist/form-schema/index.mjs +0 -230
  33. package/dist/form-schema/index.mjs.map +0 -1
  34. package/dist/formium/index.d.mts +0 -20
  35. package/dist/formium/index.mjs +0 -30
  36. package/dist/formium/index.mjs.map +0 -1
  37. package/dist/hubspot/index.d.mts +0 -49
  38. package/dist/hubspot/index.mjs +0 -48
  39. package/dist/hubspot/index.mjs.map +0 -1
  40. package/dist/mailchimp/index.d.mts +0 -45
  41. package/dist/mailchimp/index.mjs +0 -49
  42. package/dist/mailchimp/index.mjs.map +0 -1
  43. package/sanity.json +0 -8
  44. package/src/form-renderer/components/default-field.tsx +0 -123
  45. package/src/form-renderer/components/form-renderer.tsx +0 -62
  46. package/src/form-renderer/components/types.ts +0 -51
  47. package/src/form-renderer/index.ts +0 -4
  48. package/src/form-schema/components/validation-type.tsx +0 -14
  49. package/src/form-schema/index.ts +0 -35
  50. package/src/form-schema/schema-types/form-field.ts +0 -224
  51. package/src/form-schema/schema-types/form.ts +0 -52
  52. package/src/form-schema/schema-types/index.ts +0 -9
  53. package/src/formium/index.ts +0 -52
  54. package/src/hubspot/components/option.tsx +0 -17
  55. package/src/hubspot/create-handler.ts +0 -6
  56. package/src/hubspot/fetch-hubspot-data.ts +0 -33
  57. package/src/hubspot/index.ts +0 -52
  58. package/src/index.ts +0 -19
  59. package/src/mailchimp/components/option.tsx +0 -30
  60. package/src/mailchimp/create-handler.ts +0 -39
  61. package/src/mailchimp/index.ts +0 -43
  62. package/src/shared/create-handler.ts +0 -109
  63. package/v2-incompatible.js +0 -11
package/package.json CHANGED
@@ -1,135 +1,64 @@
1
1
  {
2
2
  "name": "@sanity/form-toolkit",
3
- "version": "2.2.3",
3
+ "version": "3.0.0",
4
4
  "description": "Tool kit for integrating forms with a Sanity Studio",
5
5
  "keywords": [
6
6
  "sanity",
7
7
  "sanity-plugin"
8
8
  ],
9
- "homepage": "https://github.com/sanity-io/form-toolkit#readme",
9
+ "homepage": "https://github.com/sanity-io/plugins/tree/main/plugins/@sanity/form-toolkit#readme",
10
10
  "bugs": {
11
- "url": "https://github.com/sanity-io/form-toolkit/issues"
11
+ "url": "https://github.com/sanity-io/plugins/issues"
12
12
  },
13
+ "license": "MIT",
14
+ "author": "Sanity.io <hello@sanity.io>",
13
15
  "repository": {
14
16
  "type": "git",
15
- "url": "git+ssh://git@github.com/sanity-io/form-toolkit.git"
16
- },
17
- "license": "MIT",
18
- "author": "Chris LaRocque <chris.larocque@sanity.io>",
19
- "sideEffects": false,
20
- "type": "commonjs",
21
- "exports": {
22
- "./formium": {
23
- "source": "./src/formium/index.ts",
24
- "import": "./dist/formium/index.mjs",
25
- "default": "./dist/formium/index.js"
26
- },
27
- "./hubspot": {
28
- "source": "./src/hubspot/index.ts",
29
- "import": "./dist/hubspot/index.mjs",
30
- "default": "./dist/hubspot/index.js"
31
- },
32
- "./mailchimp": {
33
- "source": "./src/mailchimp/index.ts",
34
- "import": "./dist/mailchimp/index.mjs",
35
- "default": "./dist/mailchimp/index.js"
36
- },
37
- "./form-schema": {
38
- "source": "./src/form-schema/index.ts",
39
- "import": "./dist/form-schema/index.mjs",
40
- "default": "./dist/form-schema/index.js"
41
- },
42
- "./form-renderer": {
43
- "source": "./src/form-renderer/index.ts",
44
- "import": "./dist/form-renderer/index.mjs",
45
- "default": "./dist/form-renderer/index.js"
46
- },
47
- "./package.json": "./package.json"
48
- },
49
- "main": "./dist/index.js",
50
- "typesVersions": {
51
- "*": {
52
- "formium": [
53
- "./dist/formium/index.d.ts"
54
- ],
55
- "hubspot": [
56
- "./dist/hubspot/index.d.ts"
57
- ],
58
- "mailchimp": [
59
- "./dist/mailchimp/index.d.ts"
60
- ],
61
- "form-schema": [
62
- "./dist/form-schema/index.d.ts"
63
- ],
64
- "form-renderer": [
65
- "./dist/form-renderer/index.d.ts"
66
- ]
67
- }
17
+ "url": "git+ssh://git@github.com/sanity-io/plugins.git",
18
+ "directory": "plugins/@sanity/form-toolkit"
68
19
  },
69
20
  "files": [
70
- "dist",
71
- "sanity.json",
72
- "src",
73
- "v2-incompatible.js"
21
+ "dist"
74
22
  ],
75
- "scripts": {
76
- "build": "plugin-kit verify-package --silent && pkg-utils build --strict --check --clean",
77
- "format": "prettier --write --cache --ignore-unknown .",
78
- "link-watch": "plugin-kit link-watch",
79
- "lint": "eslint .",
80
- "prepublishOnly": "npm run build",
81
- "watch": "pkg-utils watch --strict",
82
- "prepare": "husky"
23
+ "type": "module",
24
+ "exports": {
25
+ "./formium": "./dist/formium/index.js",
26
+ "./hubspot": "./dist/hubspot/index.js",
27
+ "./mailchimp": "./dist/mailchimp/index.js",
28
+ "./form-schema": "./dist/form-schema/index.js",
29
+ "./form-renderer": "./dist/form-renderer/index.js",
30
+ "./package.json": "./package.json"
83
31
  },
84
32
  "dependencies": {
85
33
  "@formium/client": "^0.1.4",
86
34
  "@mailchimp/mailchimp_marketing": "^3.0.80",
87
- "@sanity/icons": "^3.5.0",
88
- "@sanity/incompatible-plugin": "^1.0.4",
89
- "@sanity/sanity-plugin-async-list": "^1.3.0",
90
- "@sanity/ui": "^2.10.12",
35
+ "@sanity/ui": "^3.2.0",
91
36
  "h3": "^1.13.0",
92
- "react-hook-form": "^7.54.2",
93
37
  "react-icons": "^5.4.0",
94
- "react-rx": "^4.1.11"
38
+ "@sanity/sanity-plugin-async-list": "^2.0.1"
95
39
  },
96
40
  "devDependencies": {
97
- "@commitlint/cli": "^19.6.1",
98
- "@commitlint/config-conventional": "^19.6.0",
99
- "@sanity/pkg-utils": "^6.11.14",
100
- "@sanity/plugin-kit": "^4.0.18",
101
- "@sanity/semantic-release-preset": "^5.0.0",
102
- "@types/mailchimp__mailchimp_marketing": "^3.0.20",
103
- "@types/react": "^18",
104
- "@typescript-eslint/eslint-plugin": "^7.18.0",
105
- "@typescript-eslint/parser": "^7.18.0",
106
- "eslint": "^8.57.1",
107
- "eslint-config-prettier": "^9.1.0",
108
- "eslint-config-sanity": "^7.1.3",
109
- "eslint-plugin-prettier": "^5.2.1",
110
- "eslint-plugin-react": "^7.37.2",
111
- "eslint-plugin-react-hooks": "^5.1.0",
112
- "husky": "^9.1.7",
113
- "lint-staged": "^15.4.1",
114
- "prettier": "^3.4.2",
115
- "prettier-plugin-packagejson": "^2.5.6",
116
- "react": "^18",
117
- "react-dom": "^18",
118
- "sanity": "^3.66.1",
119
- "styled-components": "^6.1.13",
120
- "typescript": "^5.7.2"
41
+ "@sanity/pkg-utils": "^10.5.7",
42
+ "@types/mailchimp__mailchimp_marketing": "^3.0.22",
43
+ "@types/node": "^24.13.2",
44
+ "@types/react": "^19.2.17",
45
+ "@types/react-dom": "^19.2.3",
46
+ "babel-plugin-react-compiler": "^1.0.0",
47
+ "react": "^19.2.7",
48
+ "react-dom": "^19.2.7",
49
+ "sanity": "^6.1.0",
50
+ "@repo/package.config": "0.0.0",
51
+ "@repo/tsconfig": "0.0.0"
121
52
  },
122
53
  "peerDependencies": {
123
- "react": "^18 || ^19",
124
- "sanity": "^3 || ^4.0.0-0 || ^5.0.0"
54
+ "react": "^19.2",
55
+ "react-dom": "^19.2",
56
+ "sanity": "^5 || ^6.0.0-0"
125
57
  },
126
58
  "engines": {
127
- "node": ">=18"
59
+ "node": ">=20.19 <22 || >=22.12"
128
60
  },
129
- "overrides": {
130
- "conventional-changelog-conventionalcommits": ">= 8.0.0"
131
- },
132
- "publishConfig": {
133
- "access": "public"
61
+ "scripts": {
62
+ "build": "pkg build --strict --check --clean"
134
63
  }
135
- }
64
+ }
@@ -1,68 +0,0 @@
1
- "use strict";
2
- var h3 = require("h3");
3
- const detectFramework = () => {
4
- if (process.env.NEXT_RUNTIME)
5
- return "nextjs";
6
- if (process.env.NUXT_ENV)
7
- return "nuxt";
8
- if (process.env.SVELTEKIT_ENV)
9
- return "sveltekit";
10
- if (process.env.REMIX_ENV)
11
- return "remix";
12
- if (process.env.ASTRO_ENV)
13
- return "astro";
14
- throw new Error("Unable to detect framework.");
15
- }, createHandler = (handlerFunc) => {
16
- const framework = detectFramework(), handlerLogic = async ({
17
- // eslint-disable-next-line
18
- req,
19
- res
20
- }) => {
21
- try {
22
- const data = await handlerFunc();
23
- return res && (res.writeHead(200, { "Content-Type": "application/json" }), res.end(JSON.stringify(data))), data;
24
- } catch (error) {
25
- 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" });
26
- }
27
- };
28
- if (framework === "nextjs")
29
- return async (req, res) => {
30
- 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 });
31
- };
32
- if (framework === "nuxt")
33
- return h3.defineEventHandler(async (event) => {
34
- const req = event.node.req, res = event.node.res;
35
- return handlerLogic({ req, res });
36
- });
37
- if (framework === "sveltekit")
38
- return {
39
- GET: async ({ request }) => {
40
- const result = await handlerLogic({ req: request });
41
- return new Response(JSON.stringify(result), {
42
- headers: { "Content-Type": "application/json" }
43
- });
44
- }
45
- };
46
- if (framework === "remix")
47
- return {
48
- loader: async ({ request }) => {
49
- const result = await handlerLogic({ req: request });
50
- return new Response(JSON.stringify(result), {
51
- headers: { "Content-Type": "application/json" }
52
- });
53
- }
54
- };
55
- if (framework === "astro")
56
- return {
57
- get: async ({ request }) => {
58
- const result = await handlerLogic({ req: request });
59
- return {
60
- body: JSON.stringify(result),
61
- headers: { "Content-Type": "application/json" }
62
- };
63
- }
64
- };
65
- throw new Error(`Unsupported framework: ${framework}`);
66
- };
67
- exports.createHandler = createHandler;
68
- //# sourceMappingURL=create-handler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-handler.js","sources":["../../src/shared/create-handler.ts"],"sourcesContent":["import {defineEventHandler, type H3Event} from 'h3' // For Nuxt.js/Nitro\nimport type {IncomingMessage, ServerResponse} from 'http'\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 // eslint-disable-next-line\n req,\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":["defineEventHandler"],"mappings":";;AAIA,MAAM,kBAAkB,MAAc;AACpC,MAAI,QAAQ,IAAI;AACP,WAAA;AACF,MAAI,QAAQ,IAAI;AACd,WAAA;AACF,MAAI,QAAQ,IAAI;AACd,WAAA;AACF,MAAI,QAAQ,IAAI;AACd,WAAA;AACF,MAAI,QAAQ,IAAI;AACd,WAAA;AAEH,QAAA,IAAI,MAAM,6BAA6B;AAC/C,GAGM,gBAAgB,CAAC,gBAAwC;AAC7D,QAAM,YAAY,mBAGZ,eAAe,OAAO;AAAA;AAAA,IAE1B;AAAA,IACA;AAAA,EAAA,MAIsB;AAClB,QAAA;AACI,YAAA,OAAO,MAAM,YAAY;AAE/B,aAAI,QAEF,IAAI,UAAU,KAAK,EAAC,gBAAgB,mBAAA,CAAmB,GACvD,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,IAIvB;AAAA,aACA,OAAO;AACV,aAAA,iBAAiB,SACf,QACF,IAAI,UAAU,KAAK,EAAC,gBAAgB,oBAAmB,GACvD,IAAI,IAAI,KAAK,UAAU,EAAC,OAAO,MAAM,QAAQ,CAAA,CAAC,IAEzC,EAAC,OAAO,MAAM,QAAO,MAG1B,QACF,IAAI,UAAU,KAAK,EAAC,gBAAgB,mBAAmB,CAAA,GACvD,IAAI,IAAI,KAAK,UAAU,EAAC,OAAO,+BAAA,CAA+B,CAAC,IAE1D,EAAC,OAAO;IAA8B;AAAA,EAEjD;AAGA,MAAI,cAAc;AACT,WAAA,OAAO,KAAsB,QAAwB;AAE1D,UAAI,UAAU,+BAA+B,GAAG,GAChD,IAAI,UAAU,gCAAgC,iCAAiC,GAC/E,IAAI,UAAU,gCAAgC,6BAA6B,GAE3E,MAAM,aAAa,EAAC,KAAK,KAAI;AAAA,IAC/B;AACK,MAAI,cAAc;AAChB,WAAAA,GAAAA,mBAAmB,OAAO,UAAmB;AAClD,YAAM,MAAM,MAAM,KAAK,KACjB,MAAM,MAAM,KAAK;AACvB,aAAO,aAAa,EAAC,KAAK,KAAI;AAAA,IAAA,CAC/B;AACI,MAAI,cAAc;AAChB,WAAA;AAAA,MACL,KAAK,OAAO,EAAC,cAAiC;AAC5C,cAAM,SAAS,MAAM,aAAa,EAAC,KAAK,SAAQ;AAChD,eAAO,IAAI,SAAS,KAAK,UAAU,MAAM,GAAG;AAAA,UAC1C,SAAS,EAAC,gBAAgB,mBAAkB;AAAA,QAAA,CAC7C;AAAA,MAAA;AAAA,IAEL;AACK,MAAI,cAAc;AAChB,WAAA;AAAA,MACL,QAAQ,OAAO,EAAC,cAAiC;AAC/C,cAAM,SAAS,MAAM,aAAa,EAAC,KAAK,SAAQ;AAChD,eAAO,IAAI,SAAS,KAAK,UAAU,MAAM,GAAG;AAAA,UAC1C,SAAS,EAAC,gBAAgB,mBAAkB;AAAA,QAAA,CAC7C;AAAA,MAAA;AAAA,IAEL;AACK,MAAI,cAAc;AAChB,WAAA;AAAA,MACL,KAAK,OAAO,EAAC,cAAiC;AAC5C,cAAM,SAAS,MAAM,aAAa,EAAC,KAAK,SAAQ;AACzC,eAAA;AAAA,UACL,MAAM,KAAK,UAAU,MAAM;AAAA,UAC3B,SAAS,EAAC,gBAAgB,mBAAkB;AAAA,QAC9C;AAAA,MAAA;AAAA,IAEJ;AAEF,QAAM,IAAI,MAAM,0BAA0B,SAAS,EAAE;AACvD;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-handler.mjs","sources":["../../src/shared/create-handler.ts"],"sourcesContent":["import {defineEventHandler, type H3Event} from 'h3' // For Nuxt.js/Nitro\nimport type {IncomingMessage, ServerResponse} from 'http'\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 // eslint-disable-next-line\n req,\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":[],"mappings":";AAIA,MAAM,kBAAkB,MAAc;AACpC,MAAI,QAAQ,IAAI;AACP,WAAA;AACF,MAAI,QAAQ,IAAI;AACd,WAAA;AACF,MAAI,QAAQ,IAAI;AACd,WAAA;AACF,MAAI,QAAQ,IAAI;AACd,WAAA;AACF,MAAI,QAAQ,IAAI;AACd,WAAA;AAEH,QAAA,IAAI,MAAM,6BAA6B;AAC/C,GAGM,gBAAgB,CAAC,gBAAwC;AAC7D,QAAM,YAAY,mBAGZ,eAAe,OAAO;AAAA;AAAA,IAE1B;AAAA,IACA;AAAA,EAAA,MAIsB;AAClB,QAAA;AACI,YAAA,OAAO,MAAM,YAAY;AAE/B,aAAI,QAEF,IAAI,UAAU,KAAK,EAAC,gBAAgB,mBAAA,CAAmB,GACvD,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,IAIvB;AAAA,aACA,OAAO;AACV,aAAA,iBAAiB,SACf,QACF,IAAI,UAAU,KAAK,EAAC,gBAAgB,oBAAmB,GACvD,IAAI,IAAI,KAAK,UAAU,EAAC,OAAO,MAAM,QAAQ,CAAA,CAAC,IAEzC,EAAC,OAAO,MAAM,QAAO,MAG1B,QACF,IAAI,UAAU,KAAK,EAAC,gBAAgB,mBAAmB,CAAA,GACvD,IAAI,IAAI,KAAK,UAAU,EAAC,OAAO,+BAAA,CAA+B,CAAC,IAE1D,EAAC,OAAO;IAA8B;AAAA,EAEjD;AAGA,MAAI,cAAc;AACT,WAAA,OAAO,KAAsB,QAAwB;AAE1D,UAAI,UAAU,+BAA+B,GAAG,GAChD,IAAI,UAAU,gCAAgC,iCAAiC,GAC/E,IAAI,UAAU,gCAAgC,6BAA6B,GAE3E,MAAM,aAAa,EAAC,KAAK,KAAI;AAAA,IAC/B;AACK,MAAI,cAAc;AAChB,WAAA,mBAAmB,OAAO,UAAmB;AAClD,YAAM,MAAM,MAAM,KAAK,KACjB,MAAM,MAAM,KAAK;AACvB,aAAO,aAAa,EAAC,KAAK,KAAI;AAAA,IAAA,CAC/B;AACI,MAAI,cAAc;AAChB,WAAA;AAAA,MACL,KAAK,OAAO,EAAC,cAAiC;AAC5C,cAAM,SAAS,MAAM,aAAa,EAAC,KAAK,SAAQ;AAChD,eAAO,IAAI,SAAS,KAAK,UAAU,MAAM,GAAG;AAAA,UAC1C,SAAS,EAAC,gBAAgB,mBAAkB;AAAA,QAAA,CAC7C;AAAA,MAAA;AAAA,IAEL;AACK,MAAI,cAAc;AAChB,WAAA;AAAA,MACL,QAAQ,OAAO,EAAC,cAAiC;AAC/C,cAAM,SAAS,MAAM,aAAa,EAAC,KAAK,SAAQ;AAChD,eAAO,IAAI,SAAS,KAAK,UAAU,MAAM,GAAG;AAAA,UAC1C,SAAS,EAAC,gBAAgB,mBAAkB;AAAA,QAAA,CAC7C;AAAA,MAAA;AAAA,IAEL;AACK,MAAI,cAAc;AAChB,WAAA;AAAA,MACL,KAAK,OAAO,EAAC,cAAiC;AAC5C,cAAM,SAAS,MAAM,aAAa,EAAC,KAAK,SAAQ;AACzC,eAAA;AAAA,UACL,MAAM,KAAK,UAAU,MAAM;AAAA,UAC3B,SAAS,EAAC,gBAAgB,mBAAkB;AAAA,QAC9C;AAAA,MAAA;AAAA,IAEJ;AAEF,QAAM,IAAI,MAAM,0BAA0B,SAAS,EAAE;AACvD;"}
@@ -1,66 +0,0 @@
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
30
- id: {
31
- current: string
32
- }
33
- fields?: FormField[]
34
- 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 {}
@@ -1,128 +0,0 @@
1
- import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
- const DefaultField = ({ field, fieldState, error }) => {
3
- const { type, label, name, options = {}, choices = [], validation = [] } = field;
4
- if (!type || !name) return null;
5
- const validationRules = validation.reduce((acc, v) => (acc[v.type] = v.value, acc), {}), { value, onChange, onBlur, ref } = fieldState, handleChange = (e) => {
6
- onChange(e.target.value);
7
- }, handleCheckboxChange = (e, choiceValue) => {
8
- if (Array.isArray(value)) {
9
- const newValue = e.target.checked ? [...value, choiceValue] : value.filter((v) => v !== choiceValue);
10
- onChange(newValue);
11
- } else
12
- onChange(e.target.checked ? choiceValue : "");
13
- }, renderInput = () => {
14
- switch (type) {
15
- case "submit":
16
- return /* @__PURE__ */ jsx("button", { type: "submit", children: label || "Submit" });
17
- case "textarea":
18
- return /* @__PURE__ */ jsx(
19
- "textarea",
20
- {
21
- ref,
22
- name,
23
- onChange: handleChange,
24
- onBlur,
25
- placeholder: options.placeholder,
26
- ...validationRules,
27
- value: value ?? ""
28
- }
29
- );
30
- case "select":
31
- return /* @__PURE__ */ jsx(
32
- "select",
33
- {
34
- ref,
35
- name,
36
- value: value ?? "",
37
- onChange: handleChange,
38
- ...validationRules,
39
- onBlur,
40
- children: choices?.map((choice, i) => /* @__PURE__ */ jsx("option", { value: choice.value, children: choice.label }, i))
41
- }
42
- );
43
- case "radio":
44
- return choices?.map((choice, i) => /* @__PURE__ */ jsxs("label", { children: [
45
- /* @__PURE__ */ jsx(
46
- "input",
47
- {
48
- type: "radio",
49
- name,
50
- ref,
51
- value: choice.value,
52
- checked: value === choice.value,
53
- onChange: handleChange,
54
- onBlur,
55
- ...validationRules
56
- }
57
- ),
58
- choice.label
59
- ] }, i));
60
- case "checkbox":
61
- return choices?.map((choice, i) => /* @__PURE__ */ jsxs("label", { children: [
62
- /* @__PURE__ */ jsx(
63
- "input",
64
- {
65
- type: "checkbox",
66
- name,
67
- ref,
68
- value: choice.value,
69
- checked: Array.isArray(value) ? value.includes(choice.value) : value === choice.value,
70
- onChange: (e) => handleCheckboxChange(e, choice.value),
71
- onBlur,
72
- ...validationRules
73
- }
74
- ),
75
- choice.label
76
- ] }, i));
77
- default:
78
- return /* @__PURE__ */ jsx(
79
- "input",
80
- {
81
- type,
82
- ref,
83
- name,
84
- value: value ?? options.defaultValue ?? "",
85
- onChange: handleChange,
86
- ...validationRules,
87
- onBlur,
88
- placeholder: options.placeholder
89
- }
90
- );
91
- }
92
- };
93
- return /* @__PURE__ */ jsxs(Fragment, { children: [
94
- label && !["hidden", "submit"].includes(type) && /* @__PURE__ */ jsx("label", { htmlFor: name, children: label }),
95
- renderInput(),
96
- error && /* @__PURE__ */ jsx("span", { className: "error", children: error })
97
- ] });
98
- }, FormRenderer = (props) => {
99
- const {
100
- formData,
101
- getFieldState = (name) => ({
102
- value: void 0,
103
- onChange: () => {
104
- },
105
- name
106
- // Pass name to field for native form handling
107
- }),
108
- getFieldError,
109
- fieldComponents = {},
110
- children
111
- } = props, renderField = (field) => {
112
- const CustomComponent = fieldComponents[field.type], fieldState = getFieldState(field.name), error = getFieldError?.(field.name);
113
- return CustomComponent ? /* @__PURE__ */ jsx(CustomComponent, { field, fieldState, error }) : /* @__PURE__ */ jsx(DefaultField, { field, fieldState, error });
114
- }, elProps = Object.assign({}, props);
115
- return delete elProps.formData, delete elProps.getFieldState, delete elProps.getFieldError, delete elProps.fieldComponents, /* @__PURE__ */ jsxs("form", { ...elProps, id: elProps.id ?? formData?.id?.current, children: [
116
- formData?.fields?.map((field) => /* @__PURE__ */ jsx("div", { className: "form-field", children: renderField(field) }, field._key)),
117
- children,
118
- renderField({
119
- type: "submit",
120
- name: "submit",
121
- label: formData?.submitButton?.text || "Submit"
122
- })
123
- ] });
124
- };
125
- export {
126
- FormRenderer
127
- };
128
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","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":[],"mappings":"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"}
@@ -1,28 +0,0 @@
1
- import {FieldDefinition} from 'sanity'
2
- import {Plugin as Plugin_2} from 'sanity'
3
-
4
- /**
5
- * Usage in `sanity.config.ts` (or .js)
6
- *
7
- * ```ts
8
- * import {defineConfig} from 'sanity'
9
- * import {formSchema} from '@sanity/form-toolkit'
10
- *
11
- * export default defineConfig({
12
- * // ...
13
- * plugins: [formSchema()],
14
- * })
15
- * ```
16
- */
17
- export declare type FieldsOption = Array<FieldDefinition>
18
-
19
- export declare const formSchema: Plugin_2<FormSchemaPluginOptions | undefined>
20
-
21
- declare interface FormSchemaPluginOptions {
22
- /**
23
- * Array of field definitions to be used in the form schema.
24
- */
25
- fields?: FieldsOption
26
- }
27
-
28
- export {}