@btst/stack 2.1.0 → 2.3.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 (229) hide show
  1. package/dist/api/index.cjs +9 -1
  2. package/dist/api/index.d.cts +4 -4
  3. package/dist/api/index.d.mts +4 -4
  4. package/dist/api/index.d.ts +4 -4
  5. package/dist/api/index.mjs +9 -1
  6. package/dist/client/index.d.cts +2 -2
  7. package/dist/client/index.d.mts +2 -2
  8. package/dist/client/index.d.ts +2 -2
  9. package/dist/index.d.cts +1 -1
  10. package/dist/index.d.mts +1 -1
  11. package/dist/index.d.ts +1 -1
  12. package/dist/packages/stack/src/plugins/ai-chat/api/getters.cjs +42 -0
  13. package/dist/packages/stack/src/plugins/ai-chat/api/getters.mjs +39 -0
  14. package/dist/packages/stack/src/plugins/ai-chat/api/plugin.cjs +5 -0
  15. package/dist/packages/stack/src/plugins/ai-chat/api/plugin.mjs +5 -0
  16. package/dist/packages/stack/src/plugins/blog/api/getters.cjs +131 -0
  17. package/dist/packages/stack/src/plugins/blog/api/getters.mjs +127 -0
  18. package/dist/packages/stack/src/plugins/blog/api/plugin.cjs +60 -107
  19. package/dist/packages/stack/src/plugins/blog/api/plugin.mjs +60 -107
  20. package/dist/packages/stack/src/plugins/blog/api/query-key-defs.cjs +18 -0
  21. package/dist/packages/stack/src/plugins/blog/api/query-key-defs.mjs +15 -0
  22. package/dist/packages/stack/src/plugins/blog/api/serializers.cjs +21 -0
  23. package/dist/packages/stack/src/plugins/blog/api/serializers.mjs +18 -0
  24. package/dist/packages/stack/src/plugins/blog/client/plugin.cjs +16 -1
  25. package/dist/packages/stack/src/plugins/blog/client/plugin.mjs +17 -2
  26. package/dist/packages/stack/src/plugins/cms/api/getters.cjs +156 -0
  27. package/dist/packages/stack/src/plugins/cms/api/getters.mjs +147 -0
  28. package/dist/packages/stack/src/plugins/cms/api/plugin.cjs +624 -617
  29. package/dist/packages/stack/src/plugins/cms/api/plugin.mjs +623 -616
  30. package/dist/packages/stack/src/plugins/cms/api/query-key-defs.cjs +29 -0
  31. package/dist/packages/stack/src/plugins/cms/api/query-key-defs.mjs +26 -0
  32. package/dist/packages/stack/src/plugins/cms/client/components/pages/content-editor-page.internal.cjs +1 -1
  33. package/dist/packages/stack/src/plugins/cms/client/components/pages/content-editor-page.internal.mjs +1 -1
  34. package/dist/packages/stack/src/plugins/cms/client/hooks/cms-hooks.cjs +6 -3
  35. package/dist/packages/stack/src/plugins/cms/client/hooks/cms-hooks.mjs +6 -3
  36. package/dist/packages/stack/src/plugins/cms/client/plugin.cjs +15 -0
  37. package/dist/packages/stack/src/plugins/cms/client/plugin.mjs +16 -1
  38. package/dist/packages/stack/src/plugins/form-builder/api/getters.cjs +120 -0
  39. package/dist/packages/stack/src/plugins/form-builder/api/getters.mjs +112 -0
  40. package/dist/packages/stack/src/plugins/form-builder/api/plugin.cjs +75 -86
  41. package/dist/packages/stack/src/plugins/form-builder/api/plugin.mjs +71 -82
  42. package/dist/packages/stack/src/plugins/form-builder/api/query-key-defs.cjs +37 -0
  43. package/dist/packages/stack/src/plugins/form-builder/api/query-key-defs.mjs +33 -0
  44. package/dist/packages/stack/src/plugins/form-builder/client/components/pages/submissions-page.internal.cjs +1 -1
  45. package/dist/packages/stack/src/plugins/form-builder/client/components/pages/submissions-page.internal.mjs +1 -1
  46. package/dist/packages/stack/src/plugins/form-builder/client/plugin.cjs +15 -0
  47. package/dist/packages/stack/src/plugins/form-builder/client/plugin.mjs +16 -1
  48. package/dist/packages/stack/src/plugins/kanban/api/getters.cjs +84 -0
  49. package/dist/packages/stack/src/plugins/kanban/api/getters.mjs +81 -0
  50. package/dist/packages/stack/src/plugins/kanban/api/plugin.cjs +37 -123
  51. package/dist/packages/stack/src/plugins/kanban/api/plugin.mjs +37 -123
  52. package/dist/packages/stack/src/plugins/kanban/api/query-key-defs.cjs +26 -0
  53. package/dist/packages/stack/src/plugins/kanban/api/query-key-defs.mjs +23 -0
  54. package/dist/packages/stack/src/plugins/kanban/api/serializers.cjs +30 -0
  55. package/dist/packages/stack/src/plugins/kanban/api/serializers.mjs +26 -0
  56. package/dist/packages/stack/src/plugins/kanban/client/plugin.cjs +11 -1
  57. package/dist/packages/stack/src/plugins/kanban/client/plugin.mjs +12 -2
  58. package/dist/packages/stack/src/plugins/utils.cjs +6 -0
  59. package/dist/packages/stack/src/plugins/utils.mjs +6 -1
  60. package/dist/plugins/ai-chat/api/index.cjs +3 -0
  61. package/dist/plugins/ai-chat/api/index.d.cts +27 -4
  62. package/dist/plugins/ai-chat/api/index.d.mts +27 -4
  63. package/dist/plugins/ai-chat/api/index.d.ts +27 -4
  64. package/dist/plugins/ai-chat/api/index.mjs +1 -0
  65. package/dist/plugins/ai-chat/client/hooks/index.d.cts +2 -2
  66. package/dist/plugins/ai-chat/client/hooks/index.d.mts +2 -2
  67. package/dist/plugins/ai-chat/client/hooks/index.d.ts +2 -2
  68. package/dist/plugins/ai-chat/query-keys.d.cts +9 -284
  69. package/dist/plugins/ai-chat/query-keys.d.mts +9 -284
  70. package/dist/plugins/ai-chat/query-keys.d.ts +9 -284
  71. package/dist/plugins/api/index.d.cts +4 -3
  72. package/dist/plugins/api/index.d.mts +4 -3
  73. package/dist/plugins/api/index.d.ts +4 -3
  74. package/dist/plugins/blog/api/index.cjs +9 -0
  75. package/dist/plugins/blog/api/index.d.cts +20 -4
  76. package/dist/plugins/blog/api/index.d.mts +20 -4
  77. package/dist/plugins/blog/api/index.d.ts +20 -4
  78. package/dist/plugins/blog/api/index.mjs +3 -0
  79. package/dist/plugins/blog/client/hooks/index.d.cts +5 -5
  80. package/dist/plugins/blog/client/hooks/index.d.mts +5 -5
  81. package/dist/plugins/blog/client/hooks/index.d.ts +5 -5
  82. package/dist/plugins/blog/client/index.d.cts +1 -1
  83. package/dist/plugins/blog/client/index.d.mts +1 -1
  84. package/dist/plugins/blog/client/index.d.ts +1 -1
  85. package/dist/plugins/blog/query-keys.cjs +13 -9
  86. package/dist/plugins/blog/query-keys.d.cts +8 -333
  87. package/dist/plugins/blog/query-keys.d.mts +8 -333
  88. package/dist/plugins/blog/query-keys.d.ts +8 -333
  89. package/dist/plugins/blog/query-keys.mjs +13 -9
  90. package/dist/plugins/client/index.cjs +1 -0
  91. package/dist/plugins/client/index.d.cts +10 -3
  92. package/dist/plugins/client/index.d.mts +10 -3
  93. package/dist/plugins/client/index.d.ts +10 -3
  94. package/dist/plugins/client/index.mjs +1 -1
  95. package/dist/plugins/cms/api/index.cjs +10 -0
  96. package/dist/plugins/cms/api/index.d.cts +7 -163
  97. package/dist/plugins/cms/api/index.d.mts +7 -163
  98. package/dist/plugins/cms/api/index.d.ts +7 -163
  99. package/dist/plugins/cms/api/index.mjs +2 -0
  100. package/dist/plugins/cms/client/hooks/index.d.cts +1 -1
  101. package/dist/plugins/cms/client/hooks/index.d.mts +1 -1
  102. package/dist/plugins/cms/client/hooks/index.d.ts +1 -1
  103. package/dist/plugins/cms/query-keys.cjs +2 -1
  104. package/dist/plugins/cms/query-keys.d.cts +6 -9
  105. package/dist/plugins/cms/query-keys.d.mts +6 -9
  106. package/dist/plugins/cms/query-keys.d.ts +6 -9
  107. package/dist/plugins/cms/query-keys.mjs +2 -1
  108. package/dist/plugins/form-builder/api/index.cjs +10 -0
  109. package/dist/plugins/form-builder/api/index.d.cts +7 -141
  110. package/dist/plugins/form-builder/api/index.d.mts +7 -141
  111. package/dist/plugins/form-builder/api/index.d.ts +7 -141
  112. package/dist/plugins/form-builder/api/index.mjs +2 -0
  113. package/dist/plugins/form-builder/client/components/index.d.cts +1 -1
  114. package/dist/plugins/form-builder/client/components/index.d.mts +1 -1
  115. package/dist/plugins/form-builder/client/components/index.d.ts +1 -1
  116. package/dist/plugins/form-builder/client/hooks/index.d.cts +1 -1
  117. package/dist/plugins/form-builder/client/hooks/index.d.mts +1 -1
  118. package/dist/plugins/form-builder/client/hooks/index.d.ts +1 -1
  119. package/dist/plugins/form-builder/query-keys.cjs +3 -2
  120. package/dist/plugins/form-builder/query-keys.d.cts +7 -6
  121. package/dist/plugins/form-builder/query-keys.d.mts +7 -6
  122. package/dist/plugins/form-builder/query-keys.d.ts +7 -6
  123. package/dist/plugins/form-builder/query-keys.mjs +3 -2
  124. package/dist/plugins/kanban/api/index.cjs +9 -0
  125. package/dist/plugins/kanban/api/index.d.cts +17 -395
  126. package/dist/plugins/kanban/api/index.d.mts +17 -395
  127. package/dist/plugins/kanban/api/index.d.ts +17 -395
  128. package/dist/plugins/kanban/api/index.mjs +3 -0
  129. package/dist/plugins/kanban/client/components/index.d.cts +1 -1
  130. package/dist/plugins/kanban/client/components/index.d.mts +1 -1
  131. package/dist/plugins/kanban/client/components/index.d.ts +1 -1
  132. package/dist/plugins/kanban/client/hooks/index.d.cts +1 -1
  133. package/dist/plugins/kanban/client/hooks/index.d.mts +1 -1
  134. package/dist/plugins/kanban/client/hooks/index.d.ts +1 -1
  135. package/dist/plugins/kanban/client/index.d.cts +1 -1
  136. package/dist/plugins/kanban/client/index.d.mts +1 -1
  137. package/dist/plugins/kanban/client/index.d.ts +1 -1
  138. package/dist/plugins/kanban/query-keys.cjs +6 -12
  139. package/dist/plugins/kanban/query-keys.d.cts +5 -16
  140. package/dist/plugins/kanban/query-keys.d.mts +5 -16
  141. package/dist/plugins/kanban/query-keys.d.ts +5 -16
  142. package/dist/plugins/kanban/query-keys.mjs +6 -12
  143. package/dist/plugins/open-api/api/index.d.cts +2 -2
  144. package/dist/plugins/open-api/api/index.d.mts +2 -2
  145. package/dist/plugins/open-api/api/index.d.ts +2 -2
  146. package/dist/plugins/route-docs/client/index.d.cts +1 -1
  147. package/dist/plugins/route-docs/client/index.d.mts +1 -1
  148. package/dist/plugins/route-docs/client/index.d.ts +1 -1
  149. package/dist/plugins/ui-builder/index.d.cts +1 -1
  150. package/dist/plugins/ui-builder/index.d.mts +1 -1
  151. package/dist/plugins/ui-builder/index.d.ts +1 -1
  152. package/dist/shared/{stack.BoA0xkJv.d.cts → stack.7n9Y_u7N.d.cts} +33 -7
  153. package/dist/shared/{stack.BoA0xkJv.d.mts → stack.7n9Y_u7N.d.mts} +33 -7
  154. package/dist/shared/{stack.BoA0xkJv.d.ts → stack.7n9Y_u7N.d.ts} +33 -7
  155. package/dist/shared/stack.B1EeBt1b.d.ts +297 -0
  156. package/dist/shared/stack.BIXEI6v_.d.mts +419 -0
  157. package/dist/shared/stack.BKfolAyK.d.ts +419 -0
  158. package/dist/shared/stack.BeSm90va.d.ts +289 -0
  159. package/dist/shared/stack.BpolpQpf.d.cts +445 -0
  160. package/dist/shared/stack.C5dtIncc.d.mts +293 -0
  161. package/dist/shared/stack.CIP6QS9l.d.ts +293 -0
  162. package/dist/shared/stack.CMh_EdxW.d.cts +289 -0
  163. package/dist/shared/stack.CP68pFEH.d.mts +297 -0
  164. package/dist/shared/{stack.BsXokfNh.d.mts → stack.CVDTkMoO.d.cts} +8 -2
  165. package/dist/shared/{stack.BsXokfNh.d.ts → stack.CVDTkMoO.d.mts} +8 -2
  166. package/dist/shared/{stack.BsXokfNh.d.cts → stack.CVDTkMoO.d.ts} +8 -2
  167. package/dist/shared/{stack.DKDMI-QO.d.mts → stack.DJaKVY7v.d.cts} +7 -1
  168. package/dist/shared/{stack.DKDMI-QO.d.ts → stack.DJaKVY7v.d.mts} +7 -1
  169. package/dist/shared/{stack.DKDMI-QO.d.cts → stack.DJaKVY7v.d.ts} +7 -1
  170. package/dist/shared/{stack.DzH_wcvr.d.mts → stack.DdI5W6MB.d.cts} +9 -3
  171. package/dist/shared/{stack.DzH_wcvr.d.ts → stack.DdI5W6MB.d.mts} +9 -3
  172. package/dist/shared/{stack.DzH_wcvr.d.cts → stack.DdI5W6MB.d.ts} +9 -3
  173. package/dist/shared/stack.Dg09R0oB.d.mts +289 -0
  174. package/dist/shared/stack.Dw0Ly2TM.d.cts +293 -0
  175. package/dist/shared/stack.IdtKDRka.d.cts +297 -0
  176. package/dist/shared/stack.TIBF2AOx.d.ts +445 -0
  177. package/dist/shared/stack.rTy7-wQU.d.mts +445 -0
  178. package/dist/shared/stack.snB1EDP7.d.cts +419 -0
  179. package/package.json +3 -3
  180. package/src/__tests__/stack-api.test.ts +118 -0
  181. package/src/api/index.ts +15 -1
  182. package/src/plugins/ai-chat/__tests__/getters.test.ts +109 -0
  183. package/src/plugins/ai-chat/api/getters.ts +71 -0
  184. package/src/plugins/ai-chat/api/index.ts +1 -0
  185. package/src/plugins/ai-chat/api/plugin.ts +8 -0
  186. package/src/plugins/api/index.ts +3 -1
  187. package/src/plugins/blog/__tests__/getters.test.ts +540 -0
  188. package/src/plugins/blog/api/getters.ts +243 -0
  189. package/src/plugins/blog/api/index.ts +9 -0
  190. package/src/plugins/blog/api/plugin.ts +98 -141
  191. package/src/plugins/blog/api/query-key-defs.ts +46 -0
  192. package/src/plugins/blog/api/serializers.ts +27 -0
  193. package/src/plugins/blog/client/plugin.tsx +21 -1
  194. package/src/plugins/blog/query-keys.ts +21 -20
  195. package/src/plugins/client/index.ts +1 -1
  196. package/src/plugins/cms/__tests__/getters.test.ts +206 -0
  197. package/src/plugins/cms/api/getters.ts +268 -0
  198. package/src/plugins/cms/api/index.ts +15 -1
  199. package/src/plugins/cms/api/plugin.ts +151 -150
  200. package/src/plugins/cms/api/query-key-defs.ts +53 -0
  201. package/src/plugins/cms/api/serializers.ts +12 -0
  202. package/src/plugins/cms/client/components/pages/content-editor-page.internal.tsx +1 -1
  203. package/src/plugins/cms/client/hooks/cms-hooks.tsx +3 -0
  204. package/src/plugins/cms/client/plugin.tsx +19 -0
  205. package/src/plugins/cms/query-keys.ts +2 -1
  206. package/src/plugins/cms/types.ts +1 -1
  207. package/src/plugins/form-builder/__tests__/getters.test.ts +159 -0
  208. package/src/plugins/form-builder/api/getters.ts +226 -0
  209. package/src/plugins/form-builder/api/index.ts +15 -1
  210. package/src/plugins/form-builder/api/plugin.ts +107 -109
  211. package/src/plugins/form-builder/api/query-key-defs.ts +79 -0
  212. package/src/plugins/form-builder/api/serializers.ts +12 -0
  213. package/src/plugins/form-builder/client/components/pages/submissions-page.internal.tsx +1 -1
  214. package/src/plugins/form-builder/client/plugin.tsx +19 -0
  215. package/src/plugins/form-builder/query-keys.ts +6 -2
  216. package/src/plugins/form-builder/types.ts +2 -2
  217. package/src/plugins/kanban/__tests__/getters.test.ts +172 -0
  218. package/src/plugins/kanban/api/getters.ts +149 -0
  219. package/src/plugins/kanban/api/index.ts +4 -0
  220. package/src/plugins/kanban/api/plugin.ts +65 -146
  221. package/src/plugins/kanban/api/query-key-defs.ts +54 -0
  222. package/src/plugins/kanban/api/serializers.ts +49 -0
  223. package/src/plugins/kanban/client/plugin.tsx +15 -1
  224. package/src/plugins/kanban/query-keys.ts +10 -14
  225. package/src/plugins/utils.ts +19 -0
  226. package/src/types.ts +44 -5
  227. package/dist/shared/{stack.CbuN2zVV.d.cts → stack.CBON0dWL.d.cts} +7 -7
  228. package/dist/shared/{stack.CbuN2zVV.d.mts → stack.CBON0dWL.d.mts} +7 -7
  229. package/dist/shared/{stack.CbuN2zVV.d.ts → stack.CBON0dWL.d.ts} +7 -7
@@ -0,0 +1,293 @@
1
+ import * as _btst_stack_plugins_api from '@btst/stack/plugins/api';
2
+ import * as better_call from 'better-call';
3
+ import { S as SerializedForm, b as SerializedFormSubmissionWithData, F as Form, d as FormSubmission, a as SerializedFormSubmission, e as FormSubmissionWithForm, f as FormBuilderBackendConfig } from './stack.DdI5W6MB.mjs';
4
+ import { z } from 'zod';
5
+ import { Adapter } from '@btst/db';
6
+ import { QueryClient } from '@tanstack/react-query';
7
+
8
+ /**
9
+ * Serialize a Form for SSR/SSG use (convert dates to strings).
10
+ */
11
+ declare function serializeForm(form: Form): SerializedForm;
12
+ /**
13
+ * Serialize a FormSubmission for SSR/SSG use (convert dates to strings).
14
+ */
15
+ declare function serializeFormSubmission(submission: FormSubmission): SerializedFormSubmission;
16
+ /**
17
+ * Serialize a FormSubmission with parsed data and joined Form.
18
+ * If `submission.data` is corrupted JSON, `parsedData` is set to `null` rather
19
+ * than throwing, so one bad row cannot crash the entire list or SSG build.
20
+ */
21
+ declare function serializeFormSubmissionWithData(submission: FormSubmissionWithForm): SerializedFormSubmissionWithData;
22
+ /**
23
+ * Retrieve all forms with optional status filter and pagination.
24
+ * Pure DB function — no hooks, no HTTP context. Safe for SSG and server-side use.
25
+ *
26
+ * @remarks **Security:** Authorization hooks (e.g. `onBeforeListForms`) are NOT
27
+ * called. The caller is responsible for any access-control checks before
28
+ * invoking this function.
29
+ *
30
+ * @param adapter - The database adapter
31
+ * @param params - Optional filter/pagination parameters
32
+ */
33
+ declare function getAllForms(adapter: Adapter, params?: {
34
+ status?: string;
35
+ limit?: number;
36
+ offset?: number;
37
+ }): Promise<{
38
+ items: SerializedForm[];
39
+ total: number;
40
+ limit?: number;
41
+ offset?: number;
42
+ }>;
43
+ /**
44
+ * Retrieve a single form by its ID (UUID).
45
+ * Returns null if the form is not found.
46
+ * Pure DB function — no hooks, no HTTP context. Safe for SSG and server-side use.
47
+ *
48
+ * @remarks **Security:** Authorization hooks are NOT called. The caller is
49
+ * responsible for any access-control checks before invoking this function.
50
+ *
51
+ * @param adapter - The database adapter
52
+ * @param id - The form UUID
53
+ */
54
+ declare function getFormById(adapter: Adapter, id: string): Promise<SerializedForm | null>;
55
+ /**
56
+ * Retrieve a single form by its slug.
57
+ * Returns null if the form is not found.
58
+ * Pure DB function — no hooks, no HTTP context. Safe for SSG and server-side use.
59
+ *
60
+ * @remarks **Security:** Authorization hooks are NOT called. The caller is
61
+ * responsible for any access-control checks before invoking this function.
62
+ *
63
+ * @param adapter - The database adapter
64
+ * @param slug - The form slug
65
+ */
66
+ declare function getFormBySlug(adapter: Adapter, slug: string): Promise<SerializedForm | null>;
67
+ /**
68
+ * Retrieve submissions for a form by form ID, with optional pagination.
69
+ * Returns an empty result if the form does not exist.
70
+ * Pure DB function — no hooks, no HTTP context. Safe for server-side use.
71
+ *
72
+ * @remarks **Security:** Authorization hooks are NOT called. The caller is
73
+ * responsible for any access-control checks before invoking this function.
74
+ *
75
+ * @param adapter - The database adapter
76
+ * @param formId - The form ID
77
+ * @param params - Optional pagination parameters
78
+ */
79
+ declare function getFormSubmissions(adapter: Adapter, formId: string, params?: {
80
+ limit?: number;
81
+ offset?: number;
82
+ }): Promise<{
83
+ items: SerializedFormSubmissionWithData[];
84
+ total: number;
85
+ limit?: number;
86
+ offset?: number;
87
+ }>;
88
+
89
+ /**
90
+ * Route keys for the Form Builder plugin — matches the keys returned by
91
+ * `stackClient.router.getRoute(path).routeKey`.
92
+ */
93
+ type FormBuilderRouteKey = "formList" | "newForm" | "editForm" | "submissions";
94
+ interface FormBuilderPrefetchForRoute {
95
+ (key: "formList" | "newForm", qc: QueryClient): Promise<void>;
96
+ (key: "editForm" | "submissions", qc: QueryClient, params: {
97
+ id: string;
98
+ }): Promise<void>;
99
+ }
100
+ /**
101
+ * Form Builder backend plugin
102
+ * Provides API endpoints for managing forms and form submissions
103
+ *
104
+ * @param config - Configuration with optional hooks
105
+ */
106
+ declare const formBuilderBackendPlugin: (config?: FormBuilderBackendConfig) => _btst_stack_plugins_api.BackendPlugin<{
107
+ listForms: better_call.StrictEndpoint<"/forms", {
108
+ method: "GET";
109
+ query: z.ZodObject<{
110
+ status: z.ZodOptional<z.ZodEnum<{
111
+ active: "active";
112
+ inactive: "inactive";
113
+ archived: "archived";
114
+ }>>;
115
+ limit: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
116
+ offset: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
117
+ }, z.core.$strip>;
118
+ }, {
119
+ items: SerializedForm[];
120
+ total: number;
121
+ limit?: number;
122
+ offset?: number;
123
+ }>;
124
+ getFormBySlug: better_call.StrictEndpoint<"/forms/:slug", {
125
+ method: "GET";
126
+ params: z.ZodObject<{
127
+ slug: z.ZodString;
128
+ }, z.core.$strip>;
129
+ }, SerializedForm>;
130
+ getFormById: better_call.StrictEndpoint<"/forms/id/:id", {
131
+ method: "GET";
132
+ params: z.ZodObject<{
133
+ id: z.ZodString;
134
+ }, z.core.$strip>;
135
+ }, SerializedForm>;
136
+ createForm: better_call.StrictEndpoint<"/forms", {
137
+ method: "POST";
138
+ body: z.ZodObject<{
139
+ name: z.ZodString;
140
+ slug: z.ZodString;
141
+ description: z.ZodOptional<z.ZodString>;
142
+ schema: z.ZodString;
143
+ successMessage: z.ZodOptional<z.ZodString>;
144
+ redirectUrl: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
145
+ status: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
146
+ active: "active";
147
+ inactive: "inactive";
148
+ archived: "archived";
149
+ }>>>;
150
+ }, z.core.$strip>;
151
+ }, SerializedForm>;
152
+ updateForm: better_call.StrictEndpoint<"/forms/:id", {
153
+ method: "PUT";
154
+ params: z.ZodObject<{
155
+ id: z.ZodString;
156
+ }, z.core.$strip>;
157
+ body: z.ZodObject<{
158
+ name: z.ZodOptional<z.ZodString>;
159
+ slug: z.ZodOptional<z.ZodString>;
160
+ description: z.ZodOptional<z.ZodString>;
161
+ schema: z.ZodOptional<z.ZodString>;
162
+ successMessage: z.ZodOptional<z.ZodString>;
163
+ redirectUrl: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
164
+ status: z.ZodOptional<z.ZodEnum<{
165
+ active: "active";
166
+ inactive: "inactive";
167
+ archived: "archived";
168
+ }>>;
169
+ }, z.core.$strip>;
170
+ }, SerializedForm>;
171
+ deleteForm: better_call.StrictEndpoint<"/forms/:id", {
172
+ method: "DELETE";
173
+ params: z.ZodObject<{
174
+ id: z.ZodString;
175
+ }, z.core.$strip>;
176
+ }, {
177
+ success: boolean;
178
+ }>;
179
+ submitForm: better_call.StrictEndpoint<"/forms/:slug/submit", {
180
+ method: "POST";
181
+ params: z.ZodObject<{
182
+ slug: z.ZodString;
183
+ }, z.core.$strip>;
184
+ body: z.ZodObject<{
185
+ data: z.ZodObject<{}, z.core.$loose>;
186
+ }, z.core.$strip>;
187
+ }, {
188
+ form: {
189
+ successMessage: string | undefined;
190
+ redirectUrl: string | undefined;
191
+ };
192
+ submittedAt: string;
193
+ id: string;
194
+ formId: string;
195
+ data: string;
196
+ submittedBy?: string | undefined;
197
+ ipAddress?: string | undefined;
198
+ userAgent?: string | undefined;
199
+ }>;
200
+ listSubmissions: better_call.StrictEndpoint<"/forms/:formId/submissions", {
201
+ method: "GET";
202
+ params: z.ZodObject<{
203
+ formId: z.ZodString;
204
+ }, z.core.$strip>;
205
+ query: z.ZodObject<{
206
+ limit: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
207
+ offset: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
208
+ }, z.core.$strip>;
209
+ }, {
210
+ items: SerializedFormSubmissionWithData[];
211
+ total: number;
212
+ limit?: number;
213
+ offset?: number;
214
+ }>;
215
+ getSubmission: better_call.StrictEndpoint<"/forms/:formId/submissions/:subId", {
216
+ method: "GET";
217
+ params: z.ZodObject<{
218
+ formId: z.ZodString;
219
+ subId: z.ZodString;
220
+ }, z.core.$strip>;
221
+ }, SerializedFormSubmissionWithData<Record<string, unknown>>>;
222
+ deleteSubmission: better_call.StrictEndpoint<"/forms/:formId/submissions/:subId", {
223
+ method: "DELETE";
224
+ params: z.ZodObject<{
225
+ formId: z.ZodString;
226
+ subId: z.ZodString;
227
+ }, z.core.$strip>;
228
+ }, {
229
+ success: boolean;
230
+ }>;
231
+ }, {
232
+ getAllForms: (params?: Parameters<typeof getAllForms>[1]) => Promise<{
233
+ items: SerializedForm[];
234
+ total: number;
235
+ limit?: number;
236
+ offset?: number;
237
+ }>;
238
+ getFormById: (id: string) => Promise<SerializedForm | null>;
239
+ getFormBySlug: (slug: string) => Promise<SerializedForm | null>;
240
+ getFormSubmissions: (formId: string, params?: Parameters<typeof getFormSubmissions>[2]) => Promise<{
241
+ items: SerializedFormSubmissionWithData[];
242
+ total: number;
243
+ limit?: number;
244
+ offset?: number;
245
+ }>;
246
+ prefetchForRoute: FormBuilderPrefetchForRoute;
247
+ }>;
248
+ type FormBuilderApiRouter = ReturnType<ReturnType<typeof formBuilderBackendPlugin>["routes"]>;
249
+
250
+ /**
251
+ * Internal query key constants for the Form Builder plugin.
252
+ * Shared between query-keys.ts (HTTP path) and prefetchForRoute (DB path)
253
+ * to prevent key drift between SSR loaders and SSG prefetching.
254
+ */
255
+ interface FormsListDiscriminator {
256
+ status?: "active" | "inactive" | "archived";
257
+ limit: number;
258
+ offset: number;
259
+ }
260
+ interface SubmissionsListDiscriminator {
261
+ formId: string;
262
+ limit: number;
263
+ offset: number;
264
+ }
265
+ /** Full query key builders — use these with queryClient.setQueryData() */
266
+ declare const FORM_QUERY_KEYS: {
267
+ /**
268
+ * Key for forms.list(params) query.
269
+ * Full key: ["forms", "list", "list", { status, limit, offset }]
270
+ */
271
+ formsList: (params?: {
272
+ status?: "active" | "inactive" | "archived";
273
+ limit?: number;
274
+ offset?: number;
275
+ }) => readonly ["forms", "list", "list", FormsListDiscriminator];
276
+ /**
277
+ * Key for forms.byId(id) query.
278
+ * Full key: ["forms", "byId", "byId", id]
279
+ */
280
+ formById: (id: string) => readonly ["forms", "byId", "byId", string];
281
+ /**
282
+ * Key for formSubmissions.list(params) query.
283
+ * Full key: ["formSubmissions", "list", { formId, limit, offset }]
284
+ */
285
+ submissionsList: (params: {
286
+ formId: string;
287
+ limit?: number;
288
+ offset?: number;
289
+ }) => readonly ["formSubmissions", "list", SubmissionsListDiscriminator];
290
+ };
291
+
292
+ export { getFormById as c, getFormBySlug as d, getFormSubmissions as e, formBuilderBackendPlugin as f, getAllForms as g, serializeFormSubmission as h, serializeFormSubmissionWithData as i, FORM_QUERY_KEYS as j, serializeForm as s };
293
+ export type { FormBuilderApiRouter as F, SubmissionsListDiscriminator as S, FormsListDiscriminator as a, FormBuilderRouteKey as b };
@@ -0,0 +1,293 @@
1
+ import * as _btst_stack_plugins_api from '@btst/stack/plugins/api';
2
+ import * as better_call from 'better-call';
3
+ import { S as SerializedForm, b as SerializedFormSubmissionWithData, F as Form, d as FormSubmission, a as SerializedFormSubmission, e as FormSubmissionWithForm, f as FormBuilderBackendConfig } from './stack.DdI5W6MB.js';
4
+ import { z } from 'zod';
5
+ import { Adapter } from '@btst/db';
6
+ import { QueryClient } from '@tanstack/react-query';
7
+
8
+ /**
9
+ * Serialize a Form for SSR/SSG use (convert dates to strings).
10
+ */
11
+ declare function serializeForm(form: Form): SerializedForm;
12
+ /**
13
+ * Serialize a FormSubmission for SSR/SSG use (convert dates to strings).
14
+ */
15
+ declare function serializeFormSubmission(submission: FormSubmission): SerializedFormSubmission;
16
+ /**
17
+ * Serialize a FormSubmission with parsed data and joined Form.
18
+ * If `submission.data` is corrupted JSON, `parsedData` is set to `null` rather
19
+ * than throwing, so one bad row cannot crash the entire list or SSG build.
20
+ */
21
+ declare function serializeFormSubmissionWithData(submission: FormSubmissionWithForm): SerializedFormSubmissionWithData;
22
+ /**
23
+ * Retrieve all forms with optional status filter and pagination.
24
+ * Pure DB function — no hooks, no HTTP context. Safe for SSG and server-side use.
25
+ *
26
+ * @remarks **Security:** Authorization hooks (e.g. `onBeforeListForms`) are NOT
27
+ * called. The caller is responsible for any access-control checks before
28
+ * invoking this function.
29
+ *
30
+ * @param adapter - The database adapter
31
+ * @param params - Optional filter/pagination parameters
32
+ */
33
+ declare function getAllForms(adapter: Adapter, params?: {
34
+ status?: string;
35
+ limit?: number;
36
+ offset?: number;
37
+ }): Promise<{
38
+ items: SerializedForm[];
39
+ total: number;
40
+ limit?: number;
41
+ offset?: number;
42
+ }>;
43
+ /**
44
+ * Retrieve a single form by its ID (UUID).
45
+ * Returns null if the form is not found.
46
+ * Pure DB function — no hooks, no HTTP context. Safe for SSG and server-side use.
47
+ *
48
+ * @remarks **Security:** Authorization hooks are NOT called. The caller is
49
+ * responsible for any access-control checks before invoking this function.
50
+ *
51
+ * @param adapter - The database adapter
52
+ * @param id - The form UUID
53
+ */
54
+ declare function getFormById(adapter: Adapter, id: string): Promise<SerializedForm | null>;
55
+ /**
56
+ * Retrieve a single form by its slug.
57
+ * Returns null if the form is not found.
58
+ * Pure DB function — no hooks, no HTTP context. Safe for SSG and server-side use.
59
+ *
60
+ * @remarks **Security:** Authorization hooks are NOT called. The caller is
61
+ * responsible for any access-control checks before invoking this function.
62
+ *
63
+ * @param adapter - The database adapter
64
+ * @param slug - The form slug
65
+ */
66
+ declare function getFormBySlug(adapter: Adapter, slug: string): Promise<SerializedForm | null>;
67
+ /**
68
+ * Retrieve submissions for a form by form ID, with optional pagination.
69
+ * Returns an empty result if the form does not exist.
70
+ * Pure DB function — no hooks, no HTTP context. Safe for server-side use.
71
+ *
72
+ * @remarks **Security:** Authorization hooks are NOT called. The caller is
73
+ * responsible for any access-control checks before invoking this function.
74
+ *
75
+ * @param adapter - The database adapter
76
+ * @param formId - The form ID
77
+ * @param params - Optional pagination parameters
78
+ */
79
+ declare function getFormSubmissions(adapter: Adapter, formId: string, params?: {
80
+ limit?: number;
81
+ offset?: number;
82
+ }): Promise<{
83
+ items: SerializedFormSubmissionWithData[];
84
+ total: number;
85
+ limit?: number;
86
+ offset?: number;
87
+ }>;
88
+
89
+ /**
90
+ * Route keys for the Form Builder plugin — matches the keys returned by
91
+ * `stackClient.router.getRoute(path).routeKey`.
92
+ */
93
+ type FormBuilderRouteKey = "formList" | "newForm" | "editForm" | "submissions";
94
+ interface FormBuilderPrefetchForRoute {
95
+ (key: "formList" | "newForm", qc: QueryClient): Promise<void>;
96
+ (key: "editForm" | "submissions", qc: QueryClient, params: {
97
+ id: string;
98
+ }): Promise<void>;
99
+ }
100
+ /**
101
+ * Form Builder backend plugin
102
+ * Provides API endpoints for managing forms and form submissions
103
+ *
104
+ * @param config - Configuration with optional hooks
105
+ */
106
+ declare const formBuilderBackendPlugin: (config?: FormBuilderBackendConfig) => _btst_stack_plugins_api.BackendPlugin<{
107
+ listForms: better_call.StrictEndpoint<"/forms", {
108
+ method: "GET";
109
+ query: z.ZodObject<{
110
+ status: z.ZodOptional<z.ZodEnum<{
111
+ active: "active";
112
+ inactive: "inactive";
113
+ archived: "archived";
114
+ }>>;
115
+ limit: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
116
+ offset: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
117
+ }, z.core.$strip>;
118
+ }, {
119
+ items: SerializedForm[];
120
+ total: number;
121
+ limit?: number;
122
+ offset?: number;
123
+ }>;
124
+ getFormBySlug: better_call.StrictEndpoint<"/forms/:slug", {
125
+ method: "GET";
126
+ params: z.ZodObject<{
127
+ slug: z.ZodString;
128
+ }, z.core.$strip>;
129
+ }, SerializedForm>;
130
+ getFormById: better_call.StrictEndpoint<"/forms/id/:id", {
131
+ method: "GET";
132
+ params: z.ZodObject<{
133
+ id: z.ZodString;
134
+ }, z.core.$strip>;
135
+ }, SerializedForm>;
136
+ createForm: better_call.StrictEndpoint<"/forms", {
137
+ method: "POST";
138
+ body: z.ZodObject<{
139
+ name: z.ZodString;
140
+ slug: z.ZodString;
141
+ description: z.ZodOptional<z.ZodString>;
142
+ schema: z.ZodString;
143
+ successMessage: z.ZodOptional<z.ZodString>;
144
+ redirectUrl: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
145
+ status: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
146
+ active: "active";
147
+ inactive: "inactive";
148
+ archived: "archived";
149
+ }>>>;
150
+ }, z.core.$strip>;
151
+ }, SerializedForm>;
152
+ updateForm: better_call.StrictEndpoint<"/forms/:id", {
153
+ method: "PUT";
154
+ params: z.ZodObject<{
155
+ id: z.ZodString;
156
+ }, z.core.$strip>;
157
+ body: z.ZodObject<{
158
+ name: z.ZodOptional<z.ZodString>;
159
+ slug: z.ZodOptional<z.ZodString>;
160
+ description: z.ZodOptional<z.ZodString>;
161
+ schema: z.ZodOptional<z.ZodString>;
162
+ successMessage: z.ZodOptional<z.ZodString>;
163
+ redirectUrl: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
164
+ status: z.ZodOptional<z.ZodEnum<{
165
+ active: "active";
166
+ inactive: "inactive";
167
+ archived: "archived";
168
+ }>>;
169
+ }, z.core.$strip>;
170
+ }, SerializedForm>;
171
+ deleteForm: better_call.StrictEndpoint<"/forms/:id", {
172
+ method: "DELETE";
173
+ params: z.ZodObject<{
174
+ id: z.ZodString;
175
+ }, z.core.$strip>;
176
+ }, {
177
+ success: boolean;
178
+ }>;
179
+ submitForm: better_call.StrictEndpoint<"/forms/:slug/submit", {
180
+ method: "POST";
181
+ params: z.ZodObject<{
182
+ slug: z.ZodString;
183
+ }, z.core.$strip>;
184
+ body: z.ZodObject<{
185
+ data: z.ZodObject<{}, z.core.$loose>;
186
+ }, z.core.$strip>;
187
+ }, {
188
+ form: {
189
+ successMessage: string | undefined;
190
+ redirectUrl: string | undefined;
191
+ };
192
+ submittedAt: string;
193
+ id: string;
194
+ formId: string;
195
+ data: string;
196
+ submittedBy?: string | undefined;
197
+ ipAddress?: string | undefined;
198
+ userAgent?: string | undefined;
199
+ }>;
200
+ listSubmissions: better_call.StrictEndpoint<"/forms/:formId/submissions", {
201
+ method: "GET";
202
+ params: z.ZodObject<{
203
+ formId: z.ZodString;
204
+ }, z.core.$strip>;
205
+ query: z.ZodObject<{
206
+ limit: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
207
+ offset: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
208
+ }, z.core.$strip>;
209
+ }, {
210
+ items: SerializedFormSubmissionWithData[];
211
+ total: number;
212
+ limit?: number;
213
+ offset?: number;
214
+ }>;
215
+ getSubmission: better_call.StrictEndpoint<"/forms/:formId/submissions/:subId", {
216
+ method: "GET";
217
+ params: z.ZodObject<{
218
+ formId: z.ZodString;
219
+ subId: z.ZodString;
220
+ }, z.core.$strip>;
221
+ }, SerializedFormSubmissionWithData<Record<string, unknown>>>;
222
+ deleteSubmission: better_call.StrictEndpoint<"/forms/:formId/submissions/:subId", {
223
+ method: "DELETE";
224
+ params: z.ZodObject<{
225
+ formId: z.ZodString;
226
+ subId: z.ZodString;
227
+ }, z.core.$strip>;
228
+ }, {
229
+ success: boolean;
230
+ }>;
231
+ }, {
232
+ getAllForms: (params?: Parameters<typeof getAllForms>[1]) => Promise<{
233
+ items: SerializedForm[];
234
+ total: number;
235
+ limit?: number;
236
+ offset?: number;
237
+ }>;
238
+ getFormById: (id: string) => Promise<SerializedForm | null>;
239
+ getFormBySlug: (slug: string) => Promise<SerializedForm | null>;
240
+ getFormSubmissions: (formId: string, params?: Parameters<typeof getFormSubmissions>[2]) => Promise<{
241
+ items: SerializedFormSubmissionWithData[];
242
+ total: number;
243
+ limit?: number;
244
+ offset?: number;
245
+ }>;
246
+ prefetchForRoute: FormBuilderPrefetchForRoute;
247
+ }>;
248
+ type FormBuilderApiRouter = ReturnType<ReturnType<typeof formBuilderBackendPlugin>["routes"]>;
249
+
250
+ /**
251
+ * Internal query key constants for the Form Builder plugin.
252
+ * Shared between query-keys.ts (HTTP path) and prefetchForRoute (DB path)
253
+ * to prevent key drift between SSR loaders and SSG prefetching.
254
+ */
255
+ interface FormsListDiscriminator {
256
+ status?: "active" | "inactive" | "archived";
257
+ limit: number;
258
+ offset: number;
259
+ }
260
+ interface SubmissionsListDiscriminator {
261
+ formId: string;
262
+ limit: number;
263
+ offset: number;
264
+ }
265
+ /** Full query key builders — use these with queryClient.setQueryData() */
266
+ declare const FORM_QUERY_KEYS: {
267
+ /**
268
+ * Key for forms.list(params) query.
269
+ * Full key: ["forms", "list", "list", { status, limit, offset }]
270
+ */
271
+ formsList: (params?: {
272
+ status?: "active" | "inactive" | "archived";
273
+ limit?: number;
274
+ offset?: number;
275
+ }) => readonly ["forms", "list", "list", FormsListDiscriminator];
276
+ /**
277
+ * Key for forms.byId(id) query.
278
+ * Full key: ["forms", "byId", "byId", id]
279
+ */
280
+ formById: (id: string) => readonly ["forms", "byId", "byId", string];
281
+ /**
282
+ * Key for formSubmissions.list(params) query.
283
+ * Full key: ["formSubmissions", "list", { formId, limit, offset }]
284
+ */
285
+ submissionsList: (params: {
286
+ formId: string;
287
+ limit?: number;
288
+ offset?: number;
289
+ }) => readonly ["formSubmissions", "list", SubmissionsListDiscriminator];
290
+ };
291
+
292
+ export { getFormById as c, getFormBySlug as d, getFormSubmissions as e, formBuilderBackendPlugin as f, getAllForms as g, serializeFormSubmission as h, serializeFormSubmissionWithData as i, FORM_QUERY_KEYS as j, serializeForm as s };
293
+ export type { FormBuilderApiRouter as F, SubmissionsListDiscriminator as S, FormsListDiscriminator as a, FormBuilderRouteKey as b };