@btst/plugin-form-builder 0.0.0-stage → 1.0.0-beta.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 (213) hide show
  1. package/LICENSE.md +17 -0
  2. package/dist/api/getters.cjs +154 -0
  3. package/dist/api/getters.mjs +145 -0
  4. package/dist/api/index.cjs +25 -0
  5. package/dist/api/index.d.cts +119 -0
  6. package/dist/api/index.d.mts +119 -0
  7. package/dist/api/index.d.ts +119 -0
  8. package/dist/api/index.mjs +6 -0
  9. package/dist/api/lifecycle-migrations.cjs +15 -0
  10. package/dist/api/lifecycle-migrations.mjs +13 -0
  11. package/dist/api/operations.cjs +1093 -0
  12. package/dist/api/operations.mjs +1082 -0
  13. package/dist/api/plugin.cjs +201 -0
  14. package/dist/api/plugin.mjs +192 -0
  15. package/dist/api/query-key-defs.cjs +43 -0
  16. package/dist/api/query-key-defs.mjs +39 -0
  17. package/dist/client/components/forms/form-renderer.cjs +193 -0
  18. package/dist/client/components/forms/form-renderer.mjs +191 -0
  19. package/dist/client/components/index.cjs +29 -0
  20. package/dist/client/components/index.d.cts +97 -0
  21. package/dist/client/components/index.d.mts +97 -0
  22. package/dist/client/components/index.d.ts +97 -0
  23. package/dist/client/components/index.mjs +18 -0
  24. package/dist/client/components/loading/form-builder-skeleton.cjs +32 -0
  25. package/dist/client/components/loading/form-builder-skeleton.mjs +30 -0
  26. package/dist/client/components/loading/form-list-skeleton.cjs +21 -0
  27. package/dist/client/components/loading/form-list-skeleton.mjs +19 -0
  28. package/dist/client/components/loading/submissions-skeleton.cjs +34 -0
  29. package/dist/client/components/loading/submissions-skeleton.mjs +32 -0
  30. package/dist/client/components/pages/404-page.cjs +28 -0
  31. package/dist/client/components/pages/404-page.mjs +26 -0
  32. package/dist/client/components/pages/form-builder-page.cjs +77 -0
  33. package/dist/client/components/pages/form-builder-page.internal.cjs +217 -0
  34. package/dist/client/components/pages/form-builder-page.internal.mjs +215 -0
  35. package/dist/client/components/pages/form-builder-page.mjs +75 -0
  36. package/dist/client/components/pages/form-list-page.cjs +44 -0
  37. package/dist/client/components/pages/form-list-page.internal.cjs +282 -0
  38. package/dist/client/components/pages/form-list-page.internal.mjs +280 -0
  39. package/dist/client/components/pages/form-list-page.mjs +42 -0
  40. package/dist/client/components/pages/submissions-page.cjs +64 -0
  41. package/dist/client/components/pages/submissions-page.internal.cjs +255 -0
  42. package/dist/client/components/pages/submissions-page.internal.mjs +253 -0
  43. package/dist/client/components/pages/submissions-page.mjs +62 -0
  44. package/dist/client/components/shared/default-error.cjs +17 -0
  45. package/dist/client/components/shared/default-error.mjs +15 -0
  46. package/dist/client/components/shared/empty-state.cjs +16 -0
  47. package/dist/client/components/shared/empty-state.mjs +14 -0
  48. package/dist/client/components/shared/page-wrapper.cjs +29 -0
  49. package/dist/client/components/shared/page-wrapper.mjs +27 -0
  50. package/dist/client/components/shared/pagination.cjs +49 -0
  51. package/dist/client/components/shared/pagination.mjs +47 -0
  52. package/dist/client/constants.cjs +5 -0
  53. package/dist/client/constants.mjs +3 -0
  54. package/dist/client/hooks/form-builder-hooks.cjs +203 -0
  55. package/dist/client/hooks/form-builder-hooks.mjs +186 -0
  56. package/dist/client/hooks/form-builder-resource.cjs +13 -0
  57. package/dist/client/hooks/form-builder-resource.mjs +11 -0
  58. package/dist/client/hooks/index.cjs +22 -0
  59. package/dist/client/hooks/index.d.cts +378 -0
  60. package/dist/client/hooks/index.d.mts +378 -0
  61. package/dist/client/hooks/index.d.ts +378 -0
  62. package/dist/client/hooks/index.mjs +1 -0
  63. package/dist/client/index.cjs +13 -0
  64. package/dist/client/index.d.cts +410 -0
  65. package/dist/client/index.d.mts +410 -0
  66. package/dist/client/index.d.ts +410 -0
  67. package/dist/client/index.mjs +2 -0
  68. package/dist/client/plugin.cjs +311 -0
  69. package/dist/client/plugin.mjs +309 -0
  70. package/dist/client.css +3 -0
  71. package/dist/db.cjs +99 -0
  72. package/dist/db.mjs +97 -0
  73. package/dist/permissions.cjs +95 -0
  74. package/dist/permissions.d.cts +94 -0
  75. package/dist/permissions.d.mts +94 -0
  76. package/dist/permissions.d.ts +94 -0
  77. package/dist/permissions.mjs +93 -0
  78. package/dist/query-keys.cjs +140 -0
  79. package/dist/query-keys.d.cts +392 -0
  80. package/dist/query-keys.d.mts +392 -0
  81. package/dist/query-keys.d.ts +392 -0
  82. package/dist/query-keys.mjs +137 -0
  83. package/dist/schemas.cjs +91 -0
  84. package/dist/schemas.mjs +82 -0
  85. package/dist/shared/plugin-form-builder.BZYGyFgT.d.mts +351 -0
  86. package/dist/shared/plugin-form-builder.Bbl9NufB.d.cts +408 -0
  87. package/dist/shared/plugin-form-builder.CSP5HR2O.d.ts +408 -0
  88. package/dist/shared/plugin-form-builder.Cmk083dA.d.cts +351 -0
  89. package/dist/shared/plugin-form-builder.D258Qpb8.d.ts +351 -0
  90. package/dist/shared/plugin-form-builder.DWrQ3lRX.d.cts +118 -0
  91. package/dist/shared/plugin-form-builder.DWrQ3lRX.d.mts +118 -0
  92. package/dist/shared/plugin-form-builder.DWrQ3lRX.d.ts +118 -0
  93. package/dist/shared/plugin-form-builder.lp98rFNl.d.mts +408 -0
  94. package/dist/style.css +6 -0
  95. package/dist/types.cjs +2 -0
  96. package/dist/types.d.cts +6 -0
  97. package/dist/types.d.mts +6 -0
  98. package/dist/types.d.ts +6 -0
  99. package/dist/types.mjs +1 -0
  100. package/dist/ui/src/components/accordion.cjs +81 -0
  101. package/dist/ui/src/components/accordion.mjs +62 -0
  102. package/dist/ui/src/components/alert-dialog.cjs +157 -0
  103. package/dist/ui/src/components/alert-dialog.mjs +132 -0
  104. package/dist/ui/src/components/auto-form/common/label.cjs +18 -0
  105. package/dist/ui/src/components/auto-form/common/label.mjs +16 -0
  106. package/dist/ui/src/components/auto-form/common/tooltip.cjs +9 -0
  107. package/dist/ui/src/components/auto-form/common/tooltip.mjs +7 -0
  108. package/dist/ui/src/components/auto-form/config.cjs +40 -0
  109. package/dist/ui/src/components/auto-form/config.mjs +37 -0
  110. package/dist/ui/src/components/auto-form/dependencies.cjs +48 -0
  111. package/dist/ui/src/components/auto-form/dependencies.mjs +46 -0
  112. package/dist/ui/src/components/auto-form/fields/array.cjs +266 -0
  113. package/dist/ui/src/components/auto-form/fields/array.mjs +264 -0
  114. package/dist/ui/src/components/auto-form/fields/checkbox.cjs +38 -0
  115. package/dist/ui/src/components/auto-form/fields/checkbox.mjs +36 -0
  116. package/dist/ui/src/components/auto-form/fields/date.cjs +67 -0
  117. package/dist/ui/src/components/auto-form/fields/date.mjs +65 -0
  118. package/dist/ui/src/components/auto-form/fields/enum.cjs +73 -0
  119. package/dist/ui/src/components/auto-form/fields/enum.mjs +71 -0
  120. package/dist/ui/src/components/auto-form/fields/input.cjs +32 -0
  121. package/dist/ui/src/components/auto-form/fields/input.mjs +30 -0
  122. package/dist/ui/src/components/auto-form/fields/number.cjs +31 -0
  123. package/dist/ui/src/components/auto-form/fields/number.mjs +29 -0
  124. package/dist/ui/src/components/auto-form/fields/object.cjs +233 -0
  125. package/dist/ui/src/components/auto-form/fields/object.mjs +217 -0
  126. package/dist/ui/src/components/auto-form/fields/radio-group.cjs +67 -0
  127. package/dist/ui/src/components/auto-form/fields/radio-group.mjs +65 -0
  128. package/dist/ui/src/components/auto-form/fields/switch.cjs +38 -0
  129. package/dist/ui/src/components/auto-form/fields/switch.mjs +36 -0
  130. package/dist/ui/src/components/auto-form/fields/textarea.cjs +31 -0
  131. package/dist/ui/src/components/auto-form/fields/textarea.mjs +29 -0
  132. package/dist/ui/src/components/auto-form/helpers.cjs +270 -0
  133. package/dist/ui/src/components/auto-form/helpers.mjs +259 -0
  134. package/dist/ui/src/components/auto-form/index.cjs +92 -0
  135. package/dist/ui/src/components/auto-form/index.mjs +86 -0
  136. package/dist/ui/src/components/auto-form/stepped-auto-form.cjs +374 -0
  137. package/dist/ui/src/components/auto-form/stepped-auto-form.mjs +368 -0
  138. package/dist/ui/src/components/auto-form/types.cjs +11 -0
  139. package/dist/ui/src/components/auto-form/types.mjs +9 -0
  140. package/dist/ui/src/components/button.cjs +56 -0
  141. package/dist/ui/src/components/button.mjs +53 -0
  142. package/dist/ui/src/components/calendar.cjs +207 -0
  143. package/dist/ui/src/components/calendar.mjs +190 -0
  144. package/dist/ui/src/components/checkbox.cjs +48 -0
  145. package/dist/ui/src/components/checkbox.mjs +32 -0
  146. package/dist/ui/src/components/date-picker.cjs +41 -0
  147. package/dist/ui/src/components/date-picker.mjs +39 -0
  148. package/dist/ui/src/components/dialog.cjs +141 -0
  149. package/dist/ui/src/components/dialog.mjs +118 -0
  150. package/dist/ui/src/components/dropdown-menu.cjs +81 -0
  151. package/dist/ui/src/components/dropdown-menu.mjs +62 -0
  152. package/dist/ui/src/components/form-builder/canvas.cjs +111 -0
  153. package/dist/ui/src/components/form-builder/canvas.mjs +109 -0
  154. package/dist/ui/src/components/form-builder/components/index.cjs +571 -0
  155. package/dist/ui/src/components/form-builder/components/index.mjs +554 -0
  156. package/dist/ui/src/components/form-builder/edit-field-dialog.cjs +131 -0
  157. package/dist/ui/src/components/form-builder/edit-field-dialog.mjs +129 -0
  158. package/dist/ui/src/components/form-builder/form-preview.cjs +73 -0
  159. package/dist/ui/src/components/form-builder/form-preview.mjs +71 -0
  160. package/dist/ui/src/components/form-builder/index.cjs +350 -0
  161. package/dist/ui/src/components/form-builder/index.mjs +344 -0
  162. package/dist/ui/src/components/form-builder/nested-field-editor-dialog.cjs +263 -0
  163. package/dist/ui/src/components/form-builder/nested-field-editor-dialog.mjs +261 -0
  164. package/dist/ui/src/components/form-builder/palette.cjs +52 -0
  165. package/dist/ui/src/components/form-builder/palette.mjs +49 -0
  166. package/dist/ui/src/components/form-builder/schema-utils.cjs +128 -0
  167. package/dist/ui/src/components/form-builder/schema-utils.mjs +122 -0
  168. package/dist/ui/src/components/form-builder/sortable-field.cjs +151 -0
  169. package/dist/ui/src/components/form-builder/sortable-field.mjs +148 -0
  170. package/dist/ui/src/components/form-builder/step-tabs.cjs +180 -0
  171. package/dist/ui/src/components/form-builder/step-tabs.mjs +178 -0
  172. package/dist/ui/src/components/form-builder/types.cjs +7 -0
  173. package/dist/ui/src/components/form-builder/types.mjs +5 -0
  174. package/dist/ui/src/components/form-builder/validation-schemas.cjs +67 -0
  175. package/dist/ui/src/components/form-builder/validation-schemas.mjs +56 -0
  176. package/dist/ui/src/components/form.cjs +120 -0
  177. package/dist/ui/src/components/form.mjs +98 -0
  178. package/dist/ui/src/components/input.cjs +23 -0
  179. package/dist/ui/src/components/input.mjs +21 -0
  180. package/dist/ui/src/components/label.cjs +39 -0
  181. package/dist/ui/src/components/label.mjs +23 -0
  182. package/dist/ui/src/components/page-layout.cjs +25 -0
  183. package/dist/ui/src/components/page-layout.mjs +23 -0
  184. package/dist/ui/src/components/page-wrapper.cjs +20 -0
  185. package/dist/ui/src/components/page-wrapper.mjs +18 -0
  186. package/dist/ui/src/components/popover.cjs +60 -0
  187. package/dist/ui/src/components/popover.mjs +42 -0
  188. package/dist/ui/src/components/radio-group.cjs +62 -0
  189. package/dist/ui/src/components/radio-group.mjs +45 -0
  190. package/dist/ui/src/components/select.cjs +161 -0
  191. package/dist/ui/src/components/select.mjs +139 -0
  192. package/dist/ui/src/components/separator.cjs +43 -0
  193. package/dist/ui/src/components/separator.mjs +27 -0
  194. package/dist/ui/src/components/skeleton.cjs +17 -0
  195. package/dist/ui/src/components/skeleton.mjs +15 -0
  196. package/dist/ui/src/components/stack-attribution.cjs +24 -0
  197. package/dist/ui/src/components/stack-attribution.mjs +22 -0
  198. package/dist/ui/src/components/switch.cjs +48 -0
  199. package/dist/ui/src/components/switch.mjs +32 -0
  200. package/dist/ui/src/components/table.cjs +89 -0
  201. package/dist/ui/src/components/table.mjs +82 -0
  202. package/dist/ui/src/components/tabs.cjs +84 -0
  203. package/dist/ui/src/components/tabs.mjs +65 -0
  204. package/dist/ui/src/components/textarea.cjs +20 -0
  205. package/dist/ui/src/components/textarea.mjs +18 -0
  206. package/dist/ui/src/lib/schema-converter.cjs +133 -0
  207. package/dist/ui/src/lib/schema-converter.mjs +127 -0
  208. package/dist/ui/src/lib/utils.cjs +10 -0
  209. package/dist/ui/src/lib/utils.mjs +8 -0
  210. package/dist/utils.cjs +41 -0
  211. package/dist/utils.mjs +32 -0
  212. package/package.json +175 -3
  213. package/README.md +0 -3
@@ -0,0 +1,140 @@
1
+ 'use strict';
2
+
3
+ const client = require('@btst/stack/plugins/client');
4
+ const queryKeyDefs = require('./api/query-key-defs.cjs');
5
+
6
+ function normalizeSearch(search) {
7
+ return search !== void 0 && search.trim() === "" ? void 0 : search;
8
+ }
9
+ function paginatedNextPageParam(lastPage, allPages, limit) {
10
+ const items = Array.isArray(lastPage?.items) ? lastPage.items : [];
11
+ if (items.length < limit) return void 0;
12
+ const loadedCount = allPages.reduce(
13
+ (sum, page) => sum + (Array.isArray(page?.items) ? page.items.length : 0),
14
+ 0
15
+ );
16
+ const total = lastPage?.total ?? 0;
17
+ if (loadedCount >= total) return void 0;
18
+ return loadedCount;
19
+ }
20
+ const formBuilderResources = {
21
+ forms: {
22
+ queries: {
23
+ list: {
24
+ path: "/forms",
25
+ query: (p) => ({
26
+ status: p.status,
27
+ limit: p.limit ?? 20,
28
+ search: normalizeSearch(p.search)
29
+ }),
30
+ key: (p) => ["list", queryKeyDefs.formsListDiscriminator(p)],
31
+ select: (data, _p) => data,
32
+ infinite: true,
33
+ pageSize: (p) => p.limit ?? 20,
34
+ nextPageParam: (lastPage, allPages, p) => paginatedNextPageParam(lastPage, allPages, p.limit ?? 20)
35
+ },
36
+ bySlug: {
37
+ path: "/forms/:slug",
38
+ params: (slug) => ({ slug }),
39
+ key: (slug) => ["bySlug", slug],
40
+ select: (data, _slug) => data ?? null,
41
+ skip: (slug) => !slug
42
+ },
43
+ byId: {
44
+ path: "/forms/id/:id",
45
+ params: (id) => ({ id }),
46
+ key: (id) => ["byId", id],
47
+ select: (data, _id) => data ?? null,
48
+ skip: (id) => !id
49
+ },
50
+ forUpdate: {
51
+ path: "/forms/id/:id/edit",
52
+ params: (id) => ({ id }),
53
+ key: (id) => ["forUpdate", id],
54
+ select: (data, _id) => data ?? null,
55
+ skip: (id) => !id
56
+ }
57
+ },
58
+ mutations: {
59
+ create: {
60
+ path: "@post/forms",
61
+ method: "POST",
62
+ input: (vars) => ({ body: vars }),
63
+ select: (data) => data,
64
+ invalidates: ["forms"]
65
+ },
66
+ update: {
67
+ path: "@put/forms/:id",
68
+ method: "PUT",
69
+ input: (vars) => ({
70
+ params: { id: vars.id },
71
+ body: vars.data
72
+ }),
73
+ select: (data) => data,
74
+ invalidates: ["forms"],
75
+ setData: {
76
+ query: "byId",
77
+ args: (updated) => updated ? [updated.id] : null
78
+ }
79
+ },
80
+ delete: {
81
+ path: "@delete/forms/:id",
82
+ method: "DELETE",
83
+ input: (id) => ({ params: { id } }),
84
+ select: (data) => data,
85
+ invalidates: ["forms"]
86
+ },
87
+ // Public form submission — no cache invalidation, and no router
88
+ // refresh: the success screen is client state in FormRenderer and a
89
+ // refresh (full reload on public pages) would wipe it.
90
+ submit: {
91
+ path: "@post/forms/:slug/submit",
92
+ method: "POST",
93
+ input: (vars) => ({
94
+ params: { slug: vars.slug },
95
+ body: { data: vars.data }
96
+ }),
97
+ select: (data) => data,
98
+ refresh: false
99
+ }
100
+ }
101
+ },
102
+ formSubmissions: {
103
+ queries: {
104
+ list: {
105
+ path: "/forms/:formId/submissions",
106
+ params: (p) => ({ formId: p.formId }),
107
+ query: (p) => ({ limit: p.limit ?? 20 }),
108
+ key: (p) => [queryKeyDefs.submissionsListDiscriminator(p)],
109
+ select: (data, _p) => data,
110
+ infinite: true,
111
+ pageSize: (p) => p.limit ?? 20,
112
+ nextPageParam: (lastPage, allPages, p) => paginatedNextPageParam(lastPage, allPages, p.limit ?? 20)
113
+ },
114
+ detail: {
115
+ path: "/forms/:formId/submissions/:subId",
116
+ params: (formId, subId, _identityPartition) => ({ formId, subId }),
117
+ key: (formId, subId, identityPartition) => identityPartition === void 0 ? [formId, subId] : [formId, subId, { identity: identityPartition }],
118
+ select: (data, _formId, _subId, _identityPartition) => data ?? null,
119
+ skip: (formId, subId, _identityPartition) => !formId || !subId
120
+ }
121
+ },
122
+ mutations: {
123
+ delete: {
124
+ path: "@delete/forms/:formId/submissions/:subId",
125
+ method: "DELETE",
126
+ input: (vars) => ({
127
+ params: { formId: vars.formId, subId: vars.subId }
128
+ }),
129
+ select: (data) => data,
130
+ invalidates: ["formSubmissions"]
131
+ }
132
+ }
133
+ }
134
+ };
135
+ function createFormBuilderQueryKeys(client$1, headers) {
136
+ return client.createResourceQueryKeys(client$1, formBuilderResources, headers);
137
+ }
138
+
139
+ exports.createFormBuilderQueryKeys = createFormBuilderQueryKeys;
140
+ exports.formBuilderResources = formBuilderResources;
@@ -0,0 +1,392 @@
1
+ import * as _btst_stack_plugins_client from '@btst/stack/plugins/client';
2
+ import { createApiClient } from '@btst/stack/plugins/client';
3
+ import { j as FormsListDiscriminator, k as SubmissionsListDiscriminator } from './shared/plugin-form-builder.Bbl9NufB.cjs';
4
+ import { FormBuilderApiRouter } from './api/index.cjs';
5
+ import { PaginatedForms, SerializedForm, SerializedFormSubmission, PaginatedFormSubmissions, SerializedFormSubmissionWithData } from './types.cjs';
6
+ import { StackIdentity } from '@btst/stack/context';
7
+ import '@btst/stack/plugins/api';
8
+ import '@btst/db';
9
+ import 'zod';
10
+ import './permissions.cjs';
11
+ import '@btst/stack/authorization';
12
+ import 'zod/v4/core';
13
+ import 'better-call';
14
+ import '@tanstack/react-query';
15
+
16
+ /** Params for the paginated forms list (one page per `limit`). */
17
+ interface FormListParams {
18
+ status?: "active" | "inactive" | "archived";
19
+ limit?: number;
20
+ /**
21
+ * Included in the query key discriminator for compatibility with
22
+ * callers that pass it explicitly; the infinite query itself injects
23
+ * the page offset per page (always starting at 0).
24
+ */
25
+ offset?: number;
26
+ /** Free-text search across form names and slugs */
27
+ search?: string;
28
+ }
29
+ /** Params for the paginated submissions list of one form. */
30
+ interface SubmissionListParams {
31
+ formId: string;
32
+ limit?: number;
33
+ /** See {@link FormListParams.offset} */
34
+ offset?: number;
35
+ }
36
+ /** Input for the create-form mutation. */
37
+ interface CreateFormInput {
38
+ name: string;
39
+ slug: string;
40
+ description?: string;
41
+ schema: string;
42
+ successMessage?: string;
43
+ redirectUrl?: string;
44
+ status?: "active" | "inactive" | "archived";
45
+ }
46
+ /** Input for the update-form mutation. */
47
+ interface UpdateFormInput {
48
+ name?: string;
49
+ slug?: string;
50
+ description?: string;
51
+ schema?: string;
52
+ successMessage?: string;
53
+ redirectUrl?: string;
54
+ status?: "active" | "inactive" | "archived";
55
+ }
56
+ /**
57
+ * Form Builder resource declaration — the single source of truth for query
58
+ * keys, HTTP mappings and mutations. Feeds both `createFormBuilderQueryKeys`
59
+ * (SSR loaders) and `createResource` (client hooks, see `client/hooks`).
60
+ *
61
+ * Key shapes intentionally match `FORM_QUERY_KEYS` in
62
+ * `api/query-key-defs.ts` so SSG `prefetchForRoute` hydration keeps working.
63
+ * List pages stay as `{ items, total, limit, offset }` envelopes (via
64
+ * `nextPageParam`) so `total` survives SSG dehydration.
65
+ */
66
+ declare const formBuilderResources: {
67
+ forms: {
68
+ queries: {
69
+ list: {
70
+ path: string;
71
+ query: (p: FormListParams) => {
72
+ status: "active" | "inactive" | "archived" | undefined;
73
+ limit: number;
74
+ search: string | undefined;
75
+ };
76
+ key: (p: FormListParams) => (string | FormsListDiscriminator)[];
77
+ select: (data: any, _p: FormListParams) => PaginatedForms;
78
+ infinite: true;
79
+ pageSize: (p: FormListParams) => number;
80
+ nextPageParam: (lastPage: PaginatedForms, allPages: PaginatedForms[], p: FormListParams) => number | undefined;
81
+ };
82
+ bySlug: {
83
+ path: string;
84
+ params: (slug: string) => {
85
+ slug: string;
86
+ };
87
+ key: (slug: string) => string[];
88
+ select: (data: any, _slug: string) => SerializedForm | null;
89
+ skip: (slug: string) => boolean;
90
+ };
91
+ byId: {
92
+ path: string;
93
+ params: (id: string) => {
94
+ id: string;
95
+ };
96
+ key: (id: string) => string[];
97
+ select: (data: any, _id: string) => SerializedForm | null;
98
+ skip: (id: string) => boolean;
99
+ };
100
+ forUpdate: {
101
+ path: string;
102
+ params: (id: string) => {
103
+ id: string;
104
+ };
105
+ key: (id: string) => string[];
106
+ select: (data: any, _id: string) => SerializedForm | null;
107
+ skip: (id: string) => boolean;
108
+ };
109
+ };
110
+ mutations: {
111
+ create: {
112
+ path: string;
113
+ method: "POST";
114
+ input: (vars: CreateFormInput) => {
115
+ body: CreateFormInput;
116
+ };
117
+ select: (data: any) => SerializedForm;
118
+ invalidates: string[];
119
+ };
120
+ update: {
121
+ path: string;
122
+ method: "PUT";
123
+ input: (vars: {
124
+ id: string;
125
+ data: UpdateFormInput;
126
+ }) => {
127
+ params: {
128
+ id: string;
129
+ };
130
+ body: UpdateFormInput;
131
+ };
132
+ select: (data: any) => SerializedForm;
133
+ invalidates: string[];
134
+ setData: {
135
+ query: string;
136
+ args: (updated: SerializedForm) => string[] | null;
137
+ };
138
+ };
139
+ delete: {
140
+ path: string;
141
+ method: "DELETE";
142
+ input: (id: string) => {
143
+ params: {
144
+ id: string;
145
+ };
146
+ };
147
+ select: (data: any) => {
148
+ success: boolean;
149
+ };
150
+ invalidates: string[];
151
+ };
152
+ submit: {
153
+ path: string;
154
+ method: "POST";
155
+ input: (vars: {
156
+ slug: string;
157
+ data: Record<string, unknown>;
158
+ }) => {
159
+ params: {
160
+ slug: string;
161
+ };
162
+ body: {
163
+ data: Record<string, unknown>;
164
+ };
165
+ };
166
+ select: (data: any) => SerializedFormSubmission & {
167
+ form: {
168
+ successMessage?: string;
169
+ redirectUrl?: string;
170
+ };
171
+ };
172
+ refresh: false;
173
+ };
174
+ };
175
+ };
176
+ formSubmissions: {
177
+ queries: {
178
+ list: {
179
+ path: string;
180
+ params: (p: SubmissionListParams) => {
181
+ formId: string;
182
+ };
183
+ query: (p: SubmissionListParams) => {
184
+ limit: number;
185
+ };
186
+ key: (p: SubmissionListParams) => SubmissionsListDiscriminator[];
187
+ select: (data: any, _p: SubmissionListParams) => PaginatedFormSubmissions;
188
+ infinite: true;
189
+ pageSize: (p: SubmissionListParams) => number;
190
+ nextPageParam: (lastPage: PaginatedFormSubmissions, allPages: PaginatedFormSubmissions[], p: SubmissionListParams) => number | undefined;
191
+ };
192
+ detail: {
193
+ path: string;
194
+ params: (formId: string, subId: string, _identityPartition?: StackIdentity | null) => {
195
+ formId: string;
196
+ subId: string;
197
+ };
198
+ key: (formId: string, subId: string, identityPartition?: StackIdentity | null) => (string | {
199
+ identity: StackIdentity | null;
200
+ })[];
201
+ select: (data: any, _formId: string, _subId: string, _identityPartition?: StackIdentity | null) => SerializedFormSubmissionWithData | null;
202
+ skip: (formId: string, subId: string, _identityPartition?: StackIdentity | null) => boolean;
203
+ };
204
+ };
205
+ mutations: {
206
+ delete: {
207
+ path: string;
208
+ method: "DELETE";
209
+ input: (vars: {
210
+ formId: string;
211
+ subId: string;
212
+ }) => {
213
+ params: {
214
+ formId: string;
215
+ subId: string;
216
+ };
217
+ };
218
+ select: (data: any) => {
219
+ success: boolean;
220
+ };
221
+ invalidates: string[];
222
+ };
223
+ };
224
+ };
225
+ };
226
+ /**
227
+ * Create Form Builder query keys for React Query
228
+ * Used by consumers and SSR loaders to fetch forms and submissions
229
+ */
230
+ declare function createFormBuilderQueryKeys(client: ReturnType<typeof createApiClient<FormBuilderApiRouter>>, headers?: HeadersInit): _btst_stack_plugins_client.ResourceQueryKeys<{
231
+ forms: {
232
+ queries: {
233
+ list: {
234
+ path: string;
235
+ query: (p: FormListParams) => {
236
+ status: "active" | "inactive" | "archived" | undefined;
237
+ limit: number;
238
+ search: string | undefined;
239
+ };
240
+ key: (p: FormListParams) => (string | FormsListDiscriminator)[];
241
+ select: (data: any, _p: FormListParams) => PaginatedForms;
242
+ infinite: true;
243
+ pageSize: (p: FormListParams) => number;
244
+ nextPageParam: (lastPage: PaginatedForms, allPages: PaginatedForms[], p: FormListParams) => number | undefined;
245
+ };
246
+ bySlug: {
247
+ path: string;
248
+ params: (slug: string) => {
249
+ slug: string;
250
+ };
251
+ key: (slug: string) => string[];
252
+ select: (data: any, _slug: string) => SerializedForm | null;
253
+ skip: (slug: string) => boolean;
254
+ };
255
+ byId: {
256
+ path: string;
257
+ params: (id: string) => {
258
+ id: string;
259
+ };
260
+ key: (id: string) => string[];
261
+ select: (data: any, _id: string) => SerializedForm | null;
262
+ skip: (id: string) => boolean;
263
+ };
264
+ forUpdate: {
265
+ path: string;
266
+ params: (id: string) => {
267
+ id: string;
268
+ };
269
+ key: (id: string) => string[];
270
+ select: (data: any, _id: string) => SerializedForm | null;
271
+ skip: (id: string) => boolean;
272
+ };
273
+ };
274
+ mutations: {
275
+ create: {
276
+ path: string;
277
+ method: "POST";
278
+ input: (vars: CreateFormInput) => {
279
+ body: CreateFormInput;
280
+ };
281
+ select: (data: any) => SerializedForm;
282
+ invalidates: string[];
283
+ };
284
+ update: {
285
+ path: string;
286
+ method: "PUT";
287
+ input: (vars: {
288
+ id: string;
289
+ data: UpdateFormInput;
290
+ }) => {
291
+ params: {
292
+ id: string;
293
+ };
294
+ body: UpdateFormInput;
295
+ };
296
+ select: (data: any) => SerializedForm;
297
+ invalidates: string[];
298
+ setData: {
299
+ query: string;
300
+ args: (updated: SerializedForm) => string[] | null;
301
+ };
302
+ };
303
+ delete: {
304
+ path: string;
305
+ method: "DELETE";
306
+ input: (id: string) => {
307
+ params: {
308
+ id: string;
309
+ };
310
+ };
311
+ select: (data: any) => {
312
+ success: boolean;
313
+ };
314
+ invalidates: string[];
315
+ };
316
+ submit: {
317
+ path: string;
318
+ method: "POST";
319
+ input: (vars: {
320
+ slug: string;
321
+ data: Record<string, unknown>;
322
+ }) => {
323
+ params: {
324
+ slug: string;
325
+ };
326
+ body: {
327
+ data: Record<string, unknown>;
328
+ };
329
+ };
330
+ select: (data: any) => SerializedFormSubmission & {
331
+ form: {
332
+ successMessage?: string;
333
+ redirectUrl?: string;
334
+ };
335
+ };
336
+ refresh: false;
337
+ };
338
+ };
339
+ };
340
+ formSubmissions: {
341
+ queries: {
342
+ list: {
343
+ path: string;
344
+ params: (p: SubmissionListParams) => {
345
+ formId: string;
346
+ };
347
+ query: (p: SubmissionListParams) => {
348
+ limit: number;
349
+ };
350
+ key: (p: SubmissionListParams) => SubmissionsListDiscriminator[];
351
+ select: (data: any, _p: SubmissionListParams) => PaginatedFormSubmissions;
352
+ infinite: true;
353
+ pageSize: (p: SubmissionListParams) => number;
354
+ nextPageParam: (lastPage: PaginatedFormSubmissions, allPages: PaginatedFormSubmissions[], p: SubmissionListParams) => number | undefined;
355
+ };
356
+ detail: {
357
+ path: string;
358
+ params: (formId: string, subId: string, _identityPartition?: StackIdentity | null) => {
359
+ formId: string;
360
+ subId: string;
361
+ };
362
+ key: (formId: string, subId: string, identityPartition?: StackIdentity | null) => (string | {
363
+ identity: StackIdentity | null;
364
+ })[];
365
+ select: (data: any, _formId: string, _subId: string, _identityPartition?: StackIdentity | null) => SerializedFormSubmissionWithData | null;
366
+ skip: (formId: string, subId: string, _identityPartition?: StackIdentity | null) => boolean;
367
+ };
368
+ };
369
+ mutations: {
370
+ delete: {
371
+ path: string;
372
+ method: "DELETE";
373
+ input: (vars: {
374
+ formId: string;
375
+ subId: string;
376
+ }) => {
377
+ params: {
378
+ formId: string;
379
+ subId: string;
380
+ };
381
+ };
382
+ select: (data: any) => {
383
+ success: boolean;
384
+ };
385
+ invalidates: string[];
386
+ };
387
+ };
388
+ };
389
+ }>;
390
+
391
+ export { createFormBuilderQueryKeys, formBuilderResources };
392
+ export type { CreateFormInput, FormListParams, SubmissionListParams, UpdateFormInput };