@btst/stack 1.5.2 → 1.7.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/dist/api/index.cjs +7 -1
- package/dist/api/index.d.cts +2 -2
- package/dist/api/index.d.mts +2 -2
- package/dist/api/index.d.ts +2 -2
- package/dist/api/index.mjs +7 -1
- package/dist/client/index.d.cts +1 -1
- package/dist/client/index.d.mts +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.2.0/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.cjs +68 -0
- package/dist/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.2.0/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.mjs +60 -0
- package/dist/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.2.0_react@19.2.0__react@19.2.0/node_modules/@dnd-kit/core/dist/core.esm.cjs +3937 -0
- package/dist/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.2.0_react@19.2.0__react@19.2.0/node_modules/@dnd-kit/core/dist/core.esm.mjs +3907 -0
- package/dist/node_modules/.pnpm/@dnd-kit_modifiers@9.0.0_@dnd-kit_core@6.3.1_react-dom@19.2.0_react@19.2.0__react@19.2.0__react@19.2.0/node_modules/@dnd-kit/modifiers/dist/modifiers.esm.cjs +30 -0
- package/dist/node_modules/.pnpm/@dnd-kit_modifiers@9.0.0_@dnd-kit_core@6.3.1_react-dom@19.2.0_react@19.2.0__react@19.2.0__react@19.2.0/node_modules/@dnd-kit/modifiers/dist/modifiers.esm.mjs +28 -0
- package/dist/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.2.0_react@19.2.0__react@19.2.0__react@19.2.0/node_modules/@dnd-kit/sortable/dist/sortable.esm.cjs +675 -0
- package/dist/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.2.0_react@19.2.0__react@19.2.0__react@19.2.0/node_modules/@dnd-kit/sortable/dist/sortable.esm.mjs +661 -0
- package/dist/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.2.0/node_modules/@dnd-kit/utilities/dist/utilities.esm.cjs +358 -0
- package/dist/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.2.0/node_modules/@dnd-kit/utilities/dist/utilities.esm.mjs +332 -0
- package/dist/node_modules/.pnpm/@radix-ui_react-tabs@1.1.13_@types_react-dom@19.2.3_@types_react@19.2.6__@types_react@1_865f042350eb43f3338b0fffb33f6246/node_modules/@radix-ui/react-tabs/dist/index.cjs +211 -0
- package/dist/node_modules/.pnpm/@radix-ui_react-tabs@1.1.13_@types_react-dom@19.2.3_@types_react@19.2.6__@types_react@1_865f042350eb43f3338b0fffb33f6246/node_modules/@radix-ui/react-tabs/dist/index.mjs +188 -0
- package/dist/packages/better-stack/src/plugins/cms/api/plugin.cjs +3 -2
- package/dist/packages/better-stack/src/plugins/cms/api/plugin.mjs +3 -2
- package/dist/packages/better-stack/src/plugins/cms/client/components/forms/content-form.cjs +15 -15
- package/dist/packages/better-stack/src/plugins/cms/client/components/forms/content-form.mjs +16 -16
- package/dist/packages/better-stack/src/plugins/form-builder/api/plugin.cjs +588 -0
- package/dist/packages/better-stack/src/plugins/form-builder/api/plugin.mjs +586 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/forms/form-renderer.cjs +131 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/forms/form-renderer.mjs +129 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/loading/form-builder-skeleton.cjs +32 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/loading/form-builder-skeleton.mjs +30 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/loading/form-list-skeleton.cjs +21 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/loading/form-list-skeleton.mjs +19 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/loading/submissions-skeleton.cjs +34 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/loading/submissions-skeleton.mjs +32 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/pages/404-page.cjs +20 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/pages/404-page.mjs +18 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/pages/form-builder-page.cjs +19 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/pages/form-builder-page.internal.cjs +186 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/pages/form-builder-page.internal.mjs +184 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/pages/form-builder-page.mjs +17 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/pages/form-list-page.cjs +19 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/pages/form-list-page.internal.cjs +165 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/pages/form-list-page.internal.mjs +163 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/pages/form-list-page.mjs +17 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/pages/submissions-page.cjs +19 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/pages/submissions-page.internal.cjs +177 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/pages/submissions-page.internal.mjs +175 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/pages/submissions-page.mjs +17 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/shared/default-error.cjs +17 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/shared/default-error.mjs +15 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/shared/empty-state.cjs +16 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/shared/empty-state.mjs +14 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/shared/page-wrapper.cjs +27 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/shared/page-wrapper.mjs +25 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/shared/pagination.cjs +39 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/components/shared/pagination.mjs +37 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/hooks/form-builder-hooks.cjs +551 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/hooks/form-builder-hooks.mjs +537 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/localization/form-builder-common.cjs +36 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/localization/form-builder-common.mjs +34 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/localization/form-builder-editor.cjs +19 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/localization/form-builder-editor.mjs +17 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/localization/form-builder-list.cjs +21 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/localization/form-builder-list.mjs +19 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/localization/form-builder-submissions.cjs +19 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/localization/form-builder-submissions.mjs +17 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/localization/form-builder-toasts.cjs +14 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/localization/form-builder-toasts.mjs +12 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/localization/index.cjs +17 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/localization/index.mjs +15 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/plugin.cjs +278 -0
- package/dist/packages/better-stack/src/plugins/form-builder/client/plugin.mjs +276 -0
- package/dist/packages/better-stack/src/plugins/form-builder/db.cjs +99 -0
- package/dist/packages/better-stack/src/plugins/form-builder/db.mjs +97 -0
- package/dist/packages/better-stack/src/plugins/form-builder/schemas.cjs +82 -0
- package/dist/packages/better-stack/src/plugins/form-builder/schemas.mjs +74 -0
- package/dist/packages/better-stack/src/plugins/form-builder/utils.cjs +37 -0
- package/dist/packages/better-stack/src/plugins/form-builder/utils.mjs +29 -0
- package/dist/packages/better-stack/src/plugins/open-api/api/generator.cjs +300 -0
- package/dist/packages/better-stack/src/plugins/open-api/api/generator.mjs +284 -0
- package/dist/packages/better-stack/src/plugins/open-api/api/plugin.cjs +115 -0
- package/dist/packages/better-stack/src/plugins/open-api/api/plugin.mjs +113 -0
- package/dist/packages/better-stack/src/plugins/open-api/db.cjs +7 -0
- package/dist/packages/better-stack/src/plugins/open-api/db.mjs +5 -0
- package/dist/packages/better-stack/src/plugins/open-api/logo.cjs +8 -0
- package/dist/packages/better-stack/src/plugins/open-api/logo.mjs +6 -0
- package/dist/packages/ui/src/components/auto-form/index.cjs +2 -12
- package/dist/packages/ui/src/components/auto-form/index.mjs +2 -9
- package/dist/packages/ui/src/components/auto-form/stepped-auto-form.cjs +377 -0
- package/dist/packages/ui/src/components/auto-form/stepped-auto-form.mjs +368 -0
- package/dist/packages/ui/src/components/auto-form/utils.cjs +1 -56
- package/dist/packages/ui/src/components/auto-form/utils.mjs +2 -56
- package/dist/packages/ui/src/components/form-builder/canvas.cjs +111 -0
- package/dist/packages/ui/src/components/form-builder/canvas.mjs +109 -0
- package/dist/packages/ui/src/components/form-builder/components/index.cjs +570 -0
- package/dist/packages/ui/src/components/form-builder/components/index.mjs +553 -0
- package/dist/packages/ui/src/components/form-builder/edit-field-dialog.cjs +131 -0
- package/dist/packages/ui/src/components/form-builder/edit-field-dialog.mjs +129 -0
- package/dist/packages/ui/src/components/form-builder/form-preview.cjs +73 -0
- package/dist/packages/ui/src/components/form-builder/form-preview.mjs +71 -0
- package/dist/packages/ui/src/components/form-builder/index.cjs +353 -0
- package/dist/packages/ui/src/components/form-builder/index.mjs +344 -0
- package/dist/packages/ui/src/components/form-builder/nested-field-editor-dialog.cjs +263 -0
- package/dist/packages/ui/src/components/form-builder/nested-field-editor-dialog.mjs +261 -0
- package/dist/packages/ui/src/components/form-builder/palette.cjs +52 -0
- package/dist/packages/ui/src/components/form-builder/palette.mjs +49 -0
- package/dist/packages/ui/src/components/form-builder/schema-utils.cjs +120 -0
- package/dist/packages/ui/src/components/form-builder/schema-utils.mjs +114 -0
- package/dist/packages/ui/src/components/form-builder/sortable-field.cjs +151 -0
- package/dist/packages/ui/src/components/form-builder/sortable-field.mjs +148 -0
- package/dist/packages/ui/src/components/form-builder/step-tabs.cjs +180 -0
- package/dist/packages/ui/src/components/form-builder/step-tabs.mjs +178 -0
- package/dist/packages/ui/src/components/form-builder/types.cjs +7 -0
- package/dist/packages/ui/src/components/form-builder/types.mjs +5 -0
- package/dist/packages/ui/src/components/form-builder/validation-schemas.cjs +67 -0
- package/dist/packages/ui/src/components/form-builder/validation-schemas.mjs +56 -0
- package/dist/packages/ui/src/components/tabs.cjs +70 -0
- package/dist/packages/ui/src/components/tabs.mjs +65 -0
- package/dist/packages/ui/src/lib/schema-converter.cjs +130 -0
- package/dist/packages/ui/src/lib/schema-converter.mjs +124 -0
- package/dist/plugins/api/index.d.cts +2 -2
- package/dist/plugins/api/index.d.mts +2 -2
- package/dist/plugins/api/index.d.ts +2 -2
- package/dist/plugins/blog/api/index.d.cts +1 -1
- package/dist/plugins/blog/api/index.d.mts +1 -1
- package/dist/plugins/blog/api/index.d.ts +1 -1
- package/dist/plugins/blog/client/hooks/index.d.cts +2 -2
- package/dist/plugins/blog/client/hooks/index.d.mts +2 -2
- package/dist/plugins/blog/client/hooks/index.d.ts +2 -2
- package/dist/plugins/blog/client/index.d.cts +1 -1
- package/dist/plugins/blog/client/index.d.mts +1 -1
- package/dist/plugins/blog/client/index.d.ts +1 -1
- package/dist/plugins/blog/query-keys.d.cts +2 -2
- package/dist/plugins/blog/query-keys.d.mts +2 -2
- package/dist/plugins/blog/query-keys.d.ts +2 -2
- package/dist/plugins/client/index.d.cts +2 -2
- package/dist/plugins/client/index.d.mts +2 -2
- package/dist/plugins/client/index.d.ts +2 -2
- package/dist/plugins/cms/client/index.cjs +6 -0
- package/dist/plugins/cms/client/index.d.cts +6 -113
- package/dist/plugins/cms/client/index.d.mts +6 -113
- package/dist/plugins/cms/client/index.d.ts +6 -113
- package/dist/plugins/cms/client/index.mjs +1 -0
- package/dist/plugins/form-builder/api/index.cjs +7 -0
- package/dist/plugins/form-builder/api/index.d.cts +141 -0
- package/dist/plugins/form-builder/api/index.d.mts +141 -0
- package/dist/plugins/form-builder/api/index.d.ts +141 -0
- package/dist/plugins/form-builder/api/index.mjs +1 -0
- package/dist/plugins/form-builder/client/components/index.cjs +29 -0
- package/dist/plugins/form-builder/client/components/index.d.cts +93 -0
- package/dist/plugins/form-builder/client/components/index.d.mts +93 -0
- package/dist/plugins/form-builder/client/components/index.d.ts +93 -0
- package/dist/plugins/form-builder/client/components/index.mjs +18 -0
- package/dist/plugins/form-builder/client/hooks/index.cjs +19 -0
- package/dist/plugins/form-builder/client/hooks/index.d.cts +154 -0
- package/dist/plugins/form-builder/client/hooks/index.d.mts +154 -0
- package/dist/plugins/form-builder/client/hooks/index.d.ts +154 -0
- package/dist/plugins/form-builder/client/hooks/index.mjs +1 -0
- package/dist/plugins/form-builder/client/index.cjs +13 -0
- package/dist/plugins/form-builder/client/index.d.cts +381 -0
- package/dist/plugins/form-builder/client/index.d.mts +381 -0
- package/dist/plugins/form-builder/client/index.d.ts +381 -0
- package/dist/plugins/form-builder/client/index.mjs +2 -0
- package/dist/plugins/form-builder/client.css +3 -0
- package/dist/plugins/form-builder/query-keys.cjs +143 -0
- package/dist/plugins/form-builder/query-keys.d.cts +74 -0
- package/dist/plugins/form-builder/query-keys.d.mts +74 -0
- package/dist/plugins/form-builder/query-keys.d.ts +74 -0
- package/dist/plugins/form-builder/query-keys.mjs +141 -0
- package/dist/plugins/form-builder/style.css +19 -0
- package/dist/plugins/open-api/api/index.cjs +9 -0
- package/dist/plugins/open-api/api/index.d.cts +95 -0
- package/dist/plugins/open-api/api/index.d.mts +95 -0
- package/dist/plugins/open-api/api/index.d.ts +95 -0
- package/dist/plugins/open-api/api/index.mjs +2 -0
- package/dist/shared/stack.AX5nZ6A3.d.cts +86 -0
- package/dist/shared/stack.AX5nZ6A3.d.mts +86 -0
- package/dist/shared/stack.AX5nZ6A3.d.ts +86 -0
- package/dist/shared/stack.BIh2AXaW.d.cts +123 -0
- package/dist/shared/stack.BIh2AXaW.d.mts +123 -0
- package/dist/shared/stack.BIh2AXaW.d.ts +123 -0
- package/dist/shared/{stack.ByOugz9d.d.cts → stack.CSce37mX.d.cts} +15 -2
- package/dist/shared/{stack.ByOugz9d.d.mts → stack.CSce37mX.d.mts} +15 -2
- package/dist/shared/{stack.ByOugz9d.d.ts → stack.CSce37mX.d.ts} +15 -2
- package/dist/shared/stack.DzH_wcvr.d.cts +195 -0
- package/dist/shared/stack.DzH_wcvr.d.mts +195 -0
- package/dist/shared/stack.DzH_wcvr.d.ts +195 -0
- package/package.json +67 -1
- package/src/api/index.ts +14 -2
- package/src/plugins/cms/api/plugin.ts +9 -4
- package/src/plugins/cms/client/components/forms/content-form.tsx +23 -25
- package/src/plugins/cms/client/index.ts +11 -0
- package/src/plugins/form-builder/api/index.ts +1 -0
- package/src/plugins/form-builder/api/plugin.ts +776 -0
- package/src/plugins/form-builder/client/components/forms/form-renderer.tsx +253 -0
- package/src/plugins/form-builder/client/components/index.tsx +24 -0
- package/src/plugins/form-builder/client/components/loading/form-builder-skeleton.tsx +42 -0
- package/src/plugins/form-builder/client/components/loading/form-list-skeleton.tsx +25 -0
- package/src/plugins/form-builder/client/components/loading/index.tsx +3 -0
- package/src/plugins/form-builder/client/components/loading/submissions-skeleton.tsx +40 -0
- package/src/plugins/form-builder/client/components/pages/404-page.tsx +28 -0
- package/src/plugins/form-builder/client/components/pages/form-builder-page.internal.tsx +253 -0
- package/src/plugins/form-builder/client/components/pages/form-builder-page.tsx +26 -0
- package/src/plugins/form-builder/client/components/pages/form-list-page.internal.tsx +231 -0
- package/src/plugins/form-builder/client/components/pages/form-list-page.tsx +22 -0
- package/src/plugins/form-builder/client/components/pages/submissions-page.internal.tsx +268 -0
- package/src/plugins/form-builder/client/components/pages/submissions-page.tsx +26 -0
- package/src/plugins/form-builder/client/components/shared/default-error.tsx +30 -0
- package/src/plugins/form-builder/client/components/shared/empty-state.tsx +26 -0
- package/src/plugins/form-builder/client/components/shared/page-wrapper.tsx +32 -0
- package/src/plugins/form-builder/client/components/shared/pagination.tsx +52 -0
- package/src/plugins/form-builder/client/hooks/form-builder-hooks.tsx +799 -0
- package/src/plugins/form-builder/client/hooks/index.tsx +1 -0
- package/src/plugins/form-builder/client/index.ts +22 -0
- package/src/plugins/form-builder/client/localization/form-builder-common.ts +36 -0
- package/src/plugins/form-builder/client/localization/form-builder-editor.ts +18 -0
- package/src/plugins/form-builder/client/localization/form-builder-list.ts +17 -0
- package/src/plugins/form-builder/client/localization/form-builder-submissions.ts +17 -0
- package/src/plugins/form-builder/client/localization/form-builder-toasts.ts +10 -0
- package/src/plugins/form-builder/client/localization/index.ts +15 -0
- package/src/plugins/form-builder/client/overrides.ts +146 -0
- package/src/plugins/form-builder/client/plugin.tsx +488 -0
- package/src/plugins/form-builder/client.css +3 -0
- package/src/plugins/form-builder/db.ts +99 -0
- package/src/plugins/form-builder/query-keys.ts +198 -0
- package/src/plugins/form-builder/schemas.ts +122 -0
- package/src/plugins/form-builder/style.css +19 -0
- package/src/plugins/form-builder/types.ts +317 -0
- package/src/plugins/form-builder/utils.ts +63 -0
- package/src/plugins/open-api/api/generator.ts +433 -0
- package/src/plugins/open-api/api/index.ts +8 -0
- package/src/plugins/open-api/api/plugin.ts +243 -0
- package/src/plugins/open-api/db.ts +7 -0
- package/src/plugins/open-api/logo.ts +7 -0
- package/src/types.ts +15 -1
- package/dist/shared/{stack.DLhzx1-D.d.mts → stack.CcI4sYJP.d.cts} +1 -1
- package/dist/shared/{stack.DLhzx1-D.d.ts → stack.CcI4sYJP.d.mts} +1 -1
- package/dist/shared/{stack.DLhzx1-D.d.cts → stack.CcI4sYJP.d.ts} +1 -1
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const db = require('@btst/db');
|
|
4
|
+
|
|
5
|
+
const formBuilderSchema = db.createDbPlugin("form-builder", {
|
|
6
|
+
form: {
|
|
7
|
+
modelName: "form",
|
|
8
|
+
fields: {
|
|
9
|
+
name: {
|
|
10
|
+
type: "string",
|
|
11
|
+
required: true
|
|
12
|
+
},
|
|
13
|
+
slug: {
|
|
14
|
+
type: "string",
|
|
15
|
+
required: true,
|
|
16
|
+
unique: true
|
|
17
|
+
},
|
|
18
|
+
description: {
|
|
19
|
+
type: "string",
|
|
20
|
+
required: false
|
|
21
|
+
},
|
|
22
|
+
// JSON Schema stored as string (includes steps, fieldType, stepGroup, etc.)
|
|
23
|
+
schema: {
|
|
24
|
+
type: "string",
|
|
25
|
+
required: true
|
|
26
|
+
},
|
|
27
|
+
// Optional custom success message after submission
|
|
28
|
+
successMessage: {
|
|
29
|
+
type: "string",
|
|
30
|
+
required: false
|
|
31
|
+
},
|
|
32
|
+
// Optional redirect URL after submission
|
|
33
|
+
redirectUrl: {
|
|
34
|
+
type: "string",
|
|
35
|
+
required: false
|
|
36
|
+
},
|
|
37
|
+
// Form status: active, inactive, archived
|
|
38
|
+
status: {
|
|
39
|
+
type: "string",
|
|
40
|
+
defaultValue: "active"
|
|
41
|
+
},
|
|
42
|
+
// User who created the form
|
|
43
|
+
createdBy: {
|
|
44
|
+
type: "string",
|
|
45
|
+
required: false
|
|
46
|
+
},
|
|
47
|
+
createdAt: {
|
|
48
|
+
type: "date",
|
|
49
|
+
defaultValue: () => /* @__PURE__ */ new Date()
|
|
50
|
+
},
|
|
51
|
+
updatedAt: {
|
|
52
|
+
type: "date",
|
|
53
|
+
defaultValue: () => /* @__PURE__ */ new Date()
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
formSubmission: {
|
|
58
|
+
modelName: "formSubmission",
|
|
59
|
+
fields: {
|
|
60
|
+
formId: {
|
|
61
|
+
type: "string",
|
|
62
|
+
required: true,
|
|
63
|
+
// Database reference for efficient joins
|
|
64
|
+
references: {
|
|
65
|
+
model: "form",
|
|
66
|
+
field: "id",
|
|
67
|
+
onDelete: "cascade"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
// Submitted data as JSON string
|
|
71
|
+
data: {
|
|
72
|
+
type: "string",
|
|
73
|
+
required: true
|
|
74
|
+
},
|
|
75
|
+
// Submission timestamp
|
|
76
|
+
submittedAt: {
|
|
77
|
+
type: "date",
|
|
78
|
+
defaultValue: () => /* @__PURE__ */ new Date()
|
|
79
|
+
},
|
|
80
|
+
// Optional user ID if authenticated
|
|
81
|
+
submittedBy: {
|
|
82
|
+
type: "string",
|
|
83
|
+
required: false
|
|
84
|
+
},
|
|
85
|
+
// IP address for rate limiting and spam protection
|
|
86
|
+
ipAddress: {
|
|
87
|
+
type: "string",
|
|
88
|
+
required: false
|
|
89
|
+
},
|
|
90
|
+
// User agent for analytics
|
|
91
|
+
userAgent: {
|
|
92
|
+
type: "string",
|
|
93
|
+
required: false
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
exports.formBuilderSchema = formBuilderSchema;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { createDbPlugin } from '@btst/db';
|
|
2
|
+
|
|
3
|
+
const formBuilderSchema = createDbPlugin("form-builder", {
|
|
4
|
+
form: {
|
|
5
|
+
modelName: "form",
|
|
6
|
+
fields: {
|
|
7
|
+
name: {
|
|
8
|
+
type: "string",
|
|
9
|
+
required: true
|
|
10
|
+
},
|
|
11
|
+
slug: {
|
|
12
|
+
type: "string",
|
|
13
|
+
required: true,
|
|
14
|
+
unique: true
|
|
15
|
+
},
|
|
16
|
+
description: {
|
|
17
|
+
type: "string",
|
|
18
|
+
required: false
|
|
19
|
+
},
|
|
20
|
+
// JSON Schema stored as string (includes steps, fieldType, stepGroup, etc.)
|
|
21
|
+
schema: {
|
|
22
|
+
type: "string",
|
|
23
|
+
required: true
|
|
24
|
+
},
|
|
25
|
+
// Optional custom success message after submission
|
|
26
|
+
successMessage: {
|
|
27
|
+
type: "string",
|
|
28
|
+
required: false
|
|
29
|
+
},
|
|
30
|
+
// Optional redirect URL after submission
|
|
31
|
+
redirectUrl: {
|
|
32
|
+
type: "string",
|
|
33
|
+
required: false
|
|
34
|
+
},
|
|
35
|
+
// Form status: active, inactive, archived
|
|
36
|
+
status: {
|
|
37
|
+
type: "string",
|
|
38
|
+
defaultValue: "active"
|
|
39
|
+
},
|
|
40
|
+
// User who created the form
|
|
41
|
+
createdBy: {
|
|
42
|
+
type: "string",
|
|
43
|
+
required: false
|
|
44
|
+
},
|
|
45
|
+
createdAt: {
|
|
46
|
+
type: "date",
|
|
47
|
+
defaultValue: () => /* @__PURE__ */ new Date()
|
|
48
|
+
},
|
|
49
|
+
updatedAt: {
|
|
50
|
+
type: "date",
|
|
51
|
+
defaultValue: () => /* @__PURE__ */ new Date()
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
formSubmission: {
|
|
56
|
+
modelName: "formSubmission",
|
|
57
|
+
fields: {
|
|
58
|
+
formId: {
|
|
59
|
+
type: "string",
|
|
60
|
+
required: true,
|
|
61
|
+
// Database reference for efficient joins
|
|
62
|
+
references: {
|
|
63
|
+
model: "form",
|
|
64
|
+
field: "id",
|
|
65
|
+
onDelete: "cascade"
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
// Submitted data as JSON string
|
|
69
|
+
data: {
|
|
70
|
+
type: "string",
|
|
71
|
+
required: true
|
|
72
|
+
},
|
|
73
|
+
// Submission timestamp
|
|
74
|
+
submittedAt: {
|
|
75
|
+
type: "date",
|
|
76
|
+
defaultValue: () => /* @__PURE__ */ new Date()
|
|
77
|
+
},
|
|
78
|
+
// Optional user ID if authenticated
|
|
79
|
+
submittedBy: {
|
|
80
|
+
type: "string",
|
|
81
|
+
required: false
|
|
82
|
+
},
|
|
83
|
+
// IP address for rate limiting and spam protection
|
|
84
|
+
ipAddress: {
|
|
85
|
+
type: "string",
|
|
86
|
+
required: false
|
|
87
|
+
},
|
|
88
|
+
// User agent for analytics
|
|
89
|
+
userAgent: {
|
|
90
|
+
type: "string",
|
|
91
|
+
required: false
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
export { formBuilderSchema };
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const z = require('zod');
|
|
4
|
+
|
|
5
|
+
const listFormsQuerySchema = z.z.object({
|
|
6
|
+
status: z.z.enum(["active", "inactive", "archived"]).optional(),
|
|
7
|
+
limit: z.z.coerce.number().min(1).max(100).optional().default(20),
|
|
8
|
+
offset: z.z.coerce.number().min(0).optional().default(0)
|
|
9
|
+
});
|
|
10
|
+
const createFormSchema = z.z.object({
|
|
11
|
+
name: z.z.string().min(1, "Name is required"),
|
|
12
|
+
slug: z.z.string().min(1, "Slug is required"),
|
|
13
|
+
description: z.z.string().optional(),
|
|
14
|
+
schema: z.z.string().min(1, "Schema is required"),
|
|
15
|
+
successMessage: z.z.string().optional(),
|
|
16
|
+
redirectUrl: z.z.string().url().optional().or(z.z.literal("")),
|
|
17
|
+
status: z.z.enum(["active", "inactive", "archived"]).optional().default("active")
|
|
18
|
+
});
|
|
19
|
+
const updateFormSchema = z.z.object({
|
|
20
|
+
name: z.z.string().min(1, "Name is required").optional(),
|
|
21
|
+
slug: z.z.string().min(1, "Slug is required").optional(),
|
|
22
|
+
description: z.z.string().optional(),
|
|
23
|
+
schema: z.z.string().min(1, "Schema is required").optional(),
|
|
24
|
+
successMessage: z.z.string().optional(),
|
|
25
|
+
redirectUrl: z.z.string().url().optional().or(z.z.literal("")),
|
|
26
|
+
status: z.z.enum(["active", "inactive", "archived"]).optional()
|
|
27
|
+
});
|
|
28
|
+
const formResponseSchema = z.z.object({
|
|
29
|
+
id: z.z.string(),
|
|
30
|
+
name: z.z.string(),
|
|
31
|
+
slug: z.z.string(),
|
|
32
|
+
description: z.z.string().nullable().optional(),
|
|
33
|
+
schema: z.z.string(),
|
|
34
|
+
successMessage: z.z.string().nullable().optional(),
|
|
35
|
+
redirectUrl: z.z.string().nullable().optional(),
|
|
36
|
+
status: z.z.string(),
|
|
37
|
+
createdBy: z.z.string().nullable().optional(),
|
|
38
|
+
createdAt: z.z.string(),
|
|
39
|
+
updatedAt: z.z.string()
|
|
40
|
+
});
|
|
41
|
+
z.z.object({
|
|
42
|
+
items: z.z.array(formResponseSchema),
|
|
43
|
+
total: z.z.number(),
|
|
44
|
+
limit: z.z.number(),
|
|
45
|
+
offset: z.z.number()
|
|
46
|
+
});
|
|
47
|
+
const listSubmissionsQuerySchema = z.z.object({
|
|
48
|
+
limit: z.z.coerce.number().min(1).max(100).optional().default(20),
|
|
49
|
+
offset: z.z.coerce.number().min(0).optional().default(0)
|
|
50
|
+
});
|
|
51
|
+
z.z.object({
|
|
52
|
+
// Use passthrough object for dynamic form data validation
|
|
53
|
+
data: z.z.object({}).passthrough()
|
|
54
|
+
});
|
|
55
|
+
const formSubmissionResponseSchema = z.z.object({
|
|
56
|
+
id: z.z.string(),
|
|
57
|
+
formId: z.z.string(),
|
|
58
|
+
data: z.z.string(),
|
|
59
|
+
submittedAt: z.z.string(),
|
|
60
|
+
submittedBy: z.z.string().nullable().optional(),
|
|
61
|
+
ipAddress: z.z.string().nullable().optional(),
|
|
62
|
+
userAgent: z.z.string().nullable().optional()
|
|
63
|
+
});
|
|
64
|
+
const formSubmissionWithDataResponseSchema = formSubmissionResponseSchema.extend({
|
|
65
|
+
// Use passthrough object for dynamic parsed data
|
|
66
|
+
parsedData: z.z.object({}).passthrough(),
|
|
67
|
+
form: formResponseSchema.optional()
|
|
68
|
+
});
|
|
69
|
+
z.z.object({
|
|
70
|
+
items: z.z.array(formSubmissionWithDataResponseSchema),
|
|
71
|
+
total: z.z.number(),
|
|
72
|
+
limit: z.z.number(),
|
|
73
|
+
offset: z.z.number()
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
exports.createFormSchema = createFormSchema;
|
|
77
|
+
exports.formResponseSchema = formResponseSchema;
|
|
78
|
+
exports.formSubmissionResponseSchema = formSubmissionResponseSchema;
|
|
79
|
+
exports.formSubmissionWithDataResponseSchema = formSubmissionWithDataResponseSchema;
|
|
80
|
+
exports.listFormsQuerySchema = listFormsQuerySchema;
|
|
81
|
+
exports.listSubmissionsQuerySchema = listSubmissionsQuerySchema;
|
|
82
|
+
exports.updateFormSchema = updateFormSchema;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
const listFormsQuerySchema = z.object({
|
|
4
|
+
status: z.enum(["active", "inactive", "archived"]).optional(),
|
|
5
|
+
limit: z.coerce.number().min(1).max(100).optional().default(20),
|
|
6
|
+
offset: z.coerce.number().min(0).optional().default(0)
|
|
7
|
+
});
|
|
8
|
+
const createFormSchema = z.object({
|
|
9
|
+
name: z.string().min(1, "Name is required"),
|
|
10
|
+
slug: z.string().min(1, "Slug is required"),
|
|
11
|
+
description: z.string().optional(),
|
|
12
|
+
schema: z.string().min(1, "Schema is required"),
|
|
13
|
+
successMessage: z.string().optional(),
|
|
14
|
+
redirectUrl: z.string().url().optional().or(z.literal("")),
|
|
15
|
+
status: z.enum(["active", "inactive", "archived"]).optional().default("active")
|
|
16
|
+
});
|
|
17
|
+
const updateFormSchema = z.object({
|
|
18
|
+
name: z.string().min(1, "Name is required").optional(),
|
|
19
|
+
slug: z.string().min(1, "Slug is required").optional(),
|
|
20
|
+
description: z.string().optional(),
|
|
21
|
+
schema: z.string().min(1, "Schema is required").optional(),
|
|
22
|
+
successMessage: z.string().optional(),
|
|
23
|
+
redirectUrl: z.string().url().optional().or(z.literal("")),
|
|
24
|
+
status: z.enum(["active", "inactive", "archived"]).optional()
|
|
25
|
+
});
|
|
26
|
+
const formResponseSchema = z.object({
|
|
27
|
+
id: z.string(),
|
|
28
|
+
name: z.string(),
|
|
29
|
+
slug: z.string(),
|
|
30
|
+
description: z.string().nullable().optional(),
|
|
31
|
+
schema: z.string(),
|
|
32
|
+
successMessage: z.string().nullable().optional(),
|
|
33
|
+
redirectUrl: z.string().nullable().optional(),
|
|
34
|
+
status: z.string(),
|
|
35
|
+
createdBy: z.string().nullable().optional(),
|
|
36
|
+
createdAt: z.string(),
|
|
37
|
+
updatedAt: z.string()
|
|
38
|
+
});
|
|
39
|
+
z.object({
|
|
40
|
+
items: z.array(formResponseSchema),
|
|
41
|
+
total: z.number(),
|
|
42
|
+
limit: z.number(),
|
|
43
|
+
offset: z.number()
|
|
44
|
+
});
|
|
45
|
+
const listSubmissionsQuerySchema = z.object({
|
|
46
|
+
limit: z.coerce.number().min(1).max(100).optional().default(20),
|
|
47
|
+
offset: z.coerce.number().min(0).optional().default(0)
|
|
48
|
+
});
|
|
49
|
+
z.object({
|
|
50
|
+
// Use passthrough object for dynamic form data validation
|
|
51
|
+
data: z.object({}).passthrough()
|
|
52
|
+
});
|
|
53
|
+
const formSubmissionResponseSchema = z.object({
|
|
54
|
+
id: z.string(),
|
|
55
|
+
formId: z.string(),
|
|
56
|
+
data: z.string(),
|
|
57
|
+
submittedAt: z.string(),
|
|
58
|
+
submittedBy: z.string().nullable().optional(),
|
|
59
|
+
ipAddress: z.string().nullable().optional(),
|
|
60
|
+
userAgent: z.string().nullable().optional()
|
|
61
|
+
});
|
|
62
|
+
const formSubmissionWithDataResponseSchema = formSubmissionResponseSchema.extend({
|
|
63
|
+
// Use passthrough object for dynamic parsed data
|
|
64
|
+
parsedData: z.object({}).passthrough(),
|
|
65
|
+
form: formResponseSchema.optional()
|
|
66
|
+
});
|
|
67
|
+
z.object({
|
|
68
|
+
items: z.array(formSubmissionWithDataResponseSchema),
|
|
69
|
+
total: z.number(),
|
|
70
|
+
limit: z.number(),
|
|
71
|
+
offset: z.number()
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
export { createFormSchema, formResponseSchema, formSubmissionResponseSchema, formSubmissionWithDataResponseSchema, listFormsQuerySchema, listSubmissionsQuerySchema, updateFormSchema };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
require('clsx');
|
|
4
|
+
require('tailwind-merge');
|
|
5
|
+
const slug = require('slug');
|
|
6
|
+
|
|
7
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
|
|
8
|
+
|
|
9
|
+
const slug__default = /*#__PURE__*/_interopDefaultCompat(slug);
|
|
10
|
+
|
|
11
|
+
function slugify(text, locale = "en") {
|
|
12
|
+
return slug__default(text, { lower: true, locale });
|
|
13
|
+
}
|
|
14
|
+
function extractIpAddress(headers) {
|
|
15
|
+
if (!headers) return void 0;
|
|
16
|
+
const forwardedFor = headers.get("x-forwarded-for");
|
|
17
|
+
if (forwardedFor) {
|
|
18
|
+
return forwardedFor.split(",")[0]?.trim();
|
|
19
|
+
}
|
|
20
|
+
const realIp = headers.get("x-real-ip");
|
|
21
|
+
if (realIp) {
|
|
22
|
+
return realIp.trim();
|
|
23
|
+
}
|
|
24
|
+
const cfConnectingIp = headers.get("cf-connecting-ip");
|
|
25
|
+
if (cfConnectingIp) {
|
|
26
|
+
return cfConnectingIp.trim();
|
|
27
|
+
}
|
|
28
|
+
return void 0;
|
|
29
|
+
}
|
|
30
|
+
function extractUserAgent(headers) {
|
|
31
|
+
if (!headers) return void 0;
|
|
32
|
+
return headers.get("user-agent") || void 0;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
exports.extractIpAddress = extractIpAddress;
|
|
36
|
+
exports.extractUserAgent = extractUserAgent;
|
|
37
|
+
exports.slugify = slugify;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import 'clsx';
|
|
2
|
+
import 'tailwind-merge';
|
|
3
|
+
import slug from 'slug';
|
|
4
|
+
|
|
5
|
+
function slugify(text, locale = "en") {
|
|
6
|
+
return slug(text, { lower: true, locale });
|
|
7
|
+
}
|
|
8
|
+
function extractIpAddress(headers) {
|
|
9
|
+
if (!headers) return void 0;
|
|
10
|
+
const forwardedFor = headers.get("x-forwarded-for");
|
|
11
|
+
if (forwardedFor) {
|
|
12
|
+
return forwardedFor.split(",")[0]?.trim();
|
|
13
|
+
}
|
|
14
|
+
const realIp = headers.get("x-real-ip");
|
|
15
|
+
if (realIp) {
|
|
16
|
+
return realIp.trim();
|
|
17
|
+
}
|
|
18
|
+
const cfConnectingIp = headers.get("cf-connecting-ip");
|
|
19
|
+
if (cfConnectingIp) {
|
|
20
|
+
return cfConnectingIp.trim();
|
|
21
|
+
}
|
|
22
|
+
return void 0;
|
|
23
|
+
}
|
|
24
|
+
function extractUserAgent(headers) {
|
|
25
|
+
if (!headers) return void 0;
|
|
26
|
+
return headers.get("user-agent") || void 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export { extractIpAddress, extractUserAgent, slugify };
|