@frigear-nu/forms 0.0.0-stage → 0.0.1

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 (96) hide show
  1. package/README.md +22 -2
  2. package/dist/module.d.mts +281 -0
  3. package/dist/module.json +9 -0
  4. package/dist/module.mjs +102 -0
  5. package/dist/runtime/app/components/FormField.d.vue.ts +16 -0
  6. package/dist/runtime/app/components/FormField.vue +80 -0
  7. package/dist/runtime/app/components/FormField.vue.d.ts +16 -0
  8. package/dist/runtime/app/components/FormRenderer.d.vue.ts +19 -0
  9. package/dist/runtime/app/components/FormRenderer.vue +145 -0
  10. package/dist/runtime/app/components/FormRenderer.vue.d.ts +19 -0
  11. package/dist/runtime/app/components/FormSubmissionView.d.vue.ts +7 -0
  12. package/dist/runtime/app/components/FormSubmissionView.vue +77 -0
  13. package/dist/runtime/app/components/FormSubmissionView.vue.d.ts +7 -0
  14. package/dist/runtime/app/composables/index.d.ts +2 -0
  15. package/dist/runtime/app/composables/index.js +2 -0
  16. package/dist/runtime/app/composables/useFormStepper.d.ts +21 -0
  17. package/dist/runtime/app/composables/useFormStepper.js +33 -0
  18. package/dist/runtime/app/composables/useForms.d.ts +21 -0
  19. package/dist/runtime/app/composables/useForms.js +52 -0
  20. package/dist/runtime/app/pages/admin-form.d.vue.ts +3 -0
  21. package/dist/runtime/app/pages/admin-form.vue +150 -0
  22. package/dist/runtime/app/pages/admin-form.vue.d.ts +3 -0
  23. package/dist/runtime/app/pages/admin-submission.d.vue.ts +3 -0
  24. package/dist/runtime/app/pages/admin-submission.vue +59 -0
  25. package/dist/runtime/app/pages/admin-submission.vue.d.ts +3 -0
  26. package/dist/runtime/app/pages/admin-submissions.d.vue.ts +3 -0
  27. package/dist/runtime/app/pages/admin-submissions.vue +71 -0
  28. package/dist/runtime/app/pages/admin-submissions.vue.d.ts +3 -0
  29. package/dist/runtime/app/pages/admin.d.vue.ts +3 -0
  30. package/dist/runtime/app/pages/admin.vue +194 -0
  31. package/dist/runtime/app/pages/admin.vue.d.ts +3 -0
  32. package/dist/runtime/app/pages/form.d.vue.ts +3 -0
  33. package/dist/runtime/app/pages/form.vue +18 -0
  34. package/dist/runtime/app/pages/form.vue.d.ts +3 -0
  35. package/dist/runtime/i18n/lang/da.json +84 -0
  36. package/dist/runtime/i18n/lang/en.json +84 -0
  37. package/dist/runtime/menus.d.ts +2 -0
  38. package/dist/runtime/menus.js +15 -0
  39. package/dist/runtime/server/db/schema.sqlite.d.ts +504 -0
  40. package/dist/runtime/server/db/schema.sqlite.js +46 -0
  41. package/dist/runtime/server/plugins/email-delivery.d.ts +2 -0
  42. package/dist/runtime/server/plugins/email-delivery.js +21 -0
  43. package/dist/runtime/server/plugins/seed.d.ts +2 -0
  44. package/dist/runtime/server/plugins/seed.js +11 -0
  45. package/dist/runtime/server/routes/admin/form.delete.d.ts +2 -0
  46. package/dist/runtime/server/routes/admin/form.delete.js +8 -0
  47. package/dist/runtime/server/routes/admin/form.get.d.ts +2 -0
  48. package/dist/runtime/server/routes/admin/form.get.js +4 -0
  49. package/dist/runtime/server/routes/admin/form.patch.d.ts +2 -0
  50. package/dist/runtime/server/routes/admin/form.patch.js +17 -0
  51. package/dist/runtime/server/routes/admin/forms.get.d.ts +2 -0
  52. package/dist/runtime/server/routes/admin/forms.get.js +19 -0
  53. package/dist/runtime/server/routes/admin/forms.post.d.ts +2 -0
  54. package/dist/runtime/server/routes/admin/forms.post.js +13 -0
  55. package/dist/runtime/server/routes/admin/import.post.d.ts +2 -0
  56. package/dist/runtime/server/routes/admin/import.post.js +6 -0
  57. package/dist/runtime/server/routes/admin/submission-file.get.d.ts +2 -0
  58. package/dist/runtime/server/routes/admin/submission-file.get.js +17 -0
  59. package/dist/runtime/server/routes/admin/submission-redeliver.post.d.ts +2 -0
  60. package/dist/runtime/server/routes/admin/submission-redeliver.post.js +29 -0
  61. package/dist/runtime/server/routes/admin/submission.get.d.ts +2 -0
  62. package/dist/runtime/server/routes/admin/submission.get.js +22 -0
  63. package/dist/runtime/server/routes/admin/submissions.get.d.ts +2 -0
  64. package/dist/runtime/server/routes/admin/submissions.get.js +16 -0
  65. package/dist/runtime/server/routes/public/form.get.d.ts +2 -0
  66. package/dist/runtime/server/routes/public/form.get.js +3 -0
  67. package/dist/runtime/server/routes/public/submit.post.d.ts +2 -0
  68. package/dist/runtime/server/routes/public/submit.post.js +7 -0
  69. package/dist/runtime/server/utils/admin-schemas.d.ts +291 -0
  70. package/dist/runtime/server/utils/admin-schemas.js +14 -0
  71. package/dist/runtime/server/utils/auth.d.ts +11 -0
  72. package/dist/runtime/server/utils/auth.js +7 -0
  73. package/dist/runtime/server/utils/forms.d.ts +9 -0
  74. package/dist/runtime/server/utils/forms.js +30 -0
  75. package/dist/runtime/server/utils/rate-limit.d.ts +6 -0
  76. package/dist/runtime/server/utils/rate-limit.js +14 -0
  77. package/dist/runtime/server/utils/render.d.ts +11 -0
  78. package/dist/runtime/server/utils/render.js +26 -0
  79. package/dist/runtime/server/utils/seed.d.ts +9 -0
  80. package/dist/runtime/server/utils/seed.js +22 -0
  81. package/dist/runtime/server/utils/submit.d.ts +9 -0
  82. package/dist/runtime/server/utils/submit.js +120 -0
  83. package/dist/runtime/utils/conditions.d.ts +19 -0
  84. package/dist/runtime/utils/conditions.js +36 -0
  85. package/dist/runtime/utils/definition.d.ts +91 -0
  86. package/dist/runtime/utils/definition.js +103 -0
  87. package/dist/runtime/utils/index.d.ts +13 -0
  88. package/dist/runtime/utils/index.js +8 -0
  89. package/dist/runtime/utils/markdown.d.ts +5 -0
  90. package/dist/runtime/utils/markdown.js +5 -0
  91. package/dist/runtime/utils/schema.d.ts +27 -0
  92. package/dist/runtime/utils/schema.js +95 -0
  93. package/dist/runtime/utils/text.d.ts +12 -0
  94. package/dist/runtime/utils/text.js +12 -0
  95. package/dist/types.d.mts +3 -0
  96. package/package.json +86 -3
@@ -0,0 +1,504 @@
1
+ import type { DeliveryStatus, FormDefinition, FormStatus } from '../../../types.js';
2
+ export declare const forms: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
3
+ name: "forms";
4
+ schema: undefined;
5
+ columns: {
6
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
7
+ name: "id";
8
+ tableName: "forms";
9
+ dataType: "string";
10
+ columnType: "SQLiteText";
11
+ data: string;
12
+ driverParam: string;
13
+ notNull: true;
14
+ hasDefault: false;
15
+ isPrimaryKey: true;
16
+ isAutoincrement: false;
17
+ hasRuntimeDefault: false;
18
+ enumValues: [string, ...string[]];
19
+ baseColumn: never;
20
+ identity: undefined;
21
+ generated: undefined;
22
+ }, {}, {
23
+ length: undefined;
24
+ }>;
25
+ slug: import("drizzle-orm/sqlite-core").SQLiteColumn<{
26
+ name: "slug";
27
+ tableName: "forms";
28
+ dataType: "string";
29
+ columnType: "SQLiteText";
30
+ data: string;
31
+ driverParam: string;
32
+ notNull: true;
33
+ hasDefault: false;
34
+ isPrimaryKey: false;
35
+ isAutoincrement: false;
36
+ hasRuntimeDefault: false;
37
+ enumValues: [string, ...string[]];
38
+ baseColumn: never;
39
+ identity: undefined;
40
+ generated: undefined;
41
+ }, {}, {
42
+ length: undefined;
43
+ }>;
44
+ name: import("drizzle-orm/sqlite-core").SQLiteColumn<{
45
+ name: "name";
46
+ tableName: "forms";
47
+ dataType: "string";
48
+ columnType: "SQLiteText";
49
+ data: string;
50
+ driverParam: string;
51
+ notNull: true;
52
+ hasDefault: false;
53
+ isPrimaryKey: false;
54
+ isAutoincrement: false;
55
+ hasRuntimeDefault: false;
56
+ enumValues: [string, ...string[]];
57
+ baseColumn: never;
58
+ identity: undefined;
59
+ generated: undefined;
60
+ }, {}, {
61
+ length: undefined;
62
+ }>;
63
+ status: import("drizzle-orm/sqlite-core").SQLiteColumn<{
64
+ name: "status";
65
+ tableName: "forms";
66
+ dataType: "string";
67
+ columnType: "SQLiteText";
68
+ data: FormStatus;
69
+ driverParam: string;
70
+ notNull: true;
71
+ hasDefault: true;
72
+ isPrimaryKey: false;
73
+ isAutoincrement: false;
74
+ hasRuntimeDefault: false;
75
+ enumValues: [string, ...string[]];
76
+ baseColumn: never;
77
+ identity: undefined;
78
+ generated: undefined;
79
+ }, {}, {
80
+ length: undefined;
81
+ $type: FormStatus;
82
+ }>;
83
+ definition: import("drizzle-orm/sqlite-core").SQLiteColumn<{
84
+ name: "definition";
85
+ tableName: "forms";
86
+ dataType: "json";
87
+ columnType: "SQLiteTextJson";
88
+ data: FormDefinition;
89
+ driverParam: string;
90
+ notNull: true;
91
+ hasDefault: false;
92
+ isPrimaryKey: false;
93
+ isAutoincrement: false;
94
+ hasRuntimeDefault: false;
95
+ enumValues: undefined;
96
+ baseColumn: never;
97
+ identity: undefined;
98
+ generated: undefined;
99
+ }, {}, {
100
+ $type: FormDefinition;
101
+ }>;
102
+ version: import("drizzle-orm/sqlite-core").SQLiteColumn<{
103
+ name: "version";
104
+ tableName: "forms";
105
+ dataType: "number";
106
+ columnType: "SQLiteInteger";
107
+ data: number;
108
+ driverParam: number;
109
+ notNull: true;
110
+ hasDefault: true;
111
+ isPrimaryKey: false;
112
+ isAutoincrement: false;
113
+ hasRuntimeDefault: false;
114
+ enumValues: undefined;
115
+ baseColumn: never;
116
+ identity: undefined;
117
+ generated: undefined;
118
+ }, {}, {}>;
119
+ createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
120
+ name: "createdAt";
121
+ tableName: "forms";
122
+ dataType: "date";
123
+ columnType: "SQLiteTimestamp";
124
+ data: Date;
125
+ driverParam: number;
126
+ notNull: true;
127
+ hasDefault: true;
128
+ isPrimaryKey: false;
129
+ isAutoincrement: false;
130
+ hasRuntimeDefault: true;
131
+ enumValues: undefined;
132
+ baseColumn: never;
133
+ identity: undefined;
134
+ generated: undefined;
135
+ }, {}, {}>;
136
+ updatedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
137
+ name: "updatedAt";
138
+ tableName: "forms";
139
+ dataType: "date";
140
+ columnType: "SQLiteTimestamp";
141
+ data: Date;
142
+ driverParam: number;
143
+ notNull: true;
144
+ hasDefault: true;
145
+ isPrimaryKey: false;
146
+ isAutoincrement: false;
147
+ hasRuntimeDefault: true;
148
+ enumValues: undefined;
149
+ baseColumn: never;
150
+ identity: undefined;
151
+ generated: undefined;
152
+ }, {}, {}>;
153
+ };
154
+ dialect: "sqlite";
155
+ }>;
156
+ export declare const formSubmissions: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
157
+ name: "form_submissions";
158
+ schema: undefined;
159
+ columns: {
160
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
161
+ name: "id";
162
+ tableName: "form_submissions";
163
+ dataType: "string";
164
+ columnType: "SQLiteText";
165
+ data: string;
166
+ driverParam: string;
167
+ notNull: true;
168
+ hasDefault: false;
169
+ isPrimaryKey: true;
170
+ isAutoincrement: false;
171
+ hasRuntimeDefault: false;
172
+ enumValues: [string, ...string[]];
173
+ baseColumn: never;
174
+ identity: undefined;
175
+ generated: undefined;
176
+ }, {}, {
177
+ length: undefined;
178
+ }>;
179
+ formId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
180
+ name: "formId";
181
+ tableName: "form_submissions";
182
+ dataType: "string";
183
+ columnType: "SQLiteText";
184
+ data: string;
185
+ driverParam: string;
186
+ notNull: true;
187
+ hasDefault: false;
188
+ isPrimaryKey: false;
189
+ isAutoincrement: false;
190
+ hasRuntimeDefault: false;
191
+ enumValues: [string, ...string[]];
192
+ baseColumn: never;
193
+ identity: undefined;
194
+ generated: undefined;
195
+ }, {}, {
196
+ length: undefined;
197
+ }>;
198
+ formSlug: import("drizzle-orm/sqlite-core").SQLiteColumn<{
199
+ name: "formSlug";
200
+ tableName: "form_submissions";
201
+ dataType: "string";
202
+ columnType: "SQLiteText";
203
+ data: string;
204
+ driverParam: string;
205
+ notNull: true;
206
+ hasDefault: false;
207
+ isPrimaryKey: false;
208
+ isAutoincrement: false;
209
+ hasRuntimeDefault: false;
210
+ enumValues: [string, ...string[]];
211
+ baseColumn: never;
212
+ identity: undefined;
213
+ generated: undefined;
214
+ }, {}, {
215
+ length: undefined;
216
+ }>;
217
+ formVersion: import("drizzle-orm/sqlite-core").SQLiteColumn<{
218
+ name: "formVersion";
219
+ tableName: "form_submissions";
220
+ dataType: "number";
221
+ columnType: "SQLiteInteger";
222
+ data: number;
223
+ driverParam: number;
224
+ notNull: true;
225
+ hasDefault: false;
226
+ isPrimaryKey: false;
227
+ isAutoincrement: false;
228
+ hasRuntimeDefault: false;
229
+ enumValues: undefined;
230
+ baseColumn: never;
231
+ identity: undefined;
232
+ generated: undefined;
233
+ }, {}, {}>;
234
+ definitionSnapshot: import("drizzle-orm/sqlite-core").SQLiteColumn<{
235
+ name: "definitionSnapshot";
236
+ tableName: "form_submissions";
237
+ dataType: "json";
238
+ columnType: "SQLiteTextJson";
239
+ data: FormDefinition;
240
+ driverParam: string;
241
+ notNull: true;
242
+ hasDefault: false;
243
+ isPrimaryKey: false;
244
+ isAutoincrement: false;
245
+ hasRuntimeDefault: false;
246
+ enumValues: undefined;
247
+ baseColumn: never;
248
+ identity: undefined;
249
+ generated: undefined;
250
+ }, {}, {
251
+ $type: FormDefinition;
252
+ }>;
253
+ answers: import("drizzle-orm/sqlite-core").SQLiteColumn<{
254
+ name: "answers";
255
+ tableName: "form_submissions";
256
+ dataType: "json";
257
+ columnType: "SQLiteTextJson";
258
+ data: Record<string, unknown>;
259
+ driverParam: string;
260
+ notNull: true;
261
+ hasDefault: false;
262
+ isPrimaryKey: false;
263
+ isAutoincrement: false;
264
+ hasRuntimeDefault: false;
265
+ enumValues: undefined;
266
+ baseColumn: never;
267
+ identity: undefined;
268
+ generated: undefined;
269
+ }, {}, {
270
+ $type: Record<string, unknown>;
271
+ }>;
272
+ userId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
273
+ name: "userId";
274
+ tableName: "form_submissions";
275
+ dataType: "number";
276
+ columnType: "SQLiteInteger";
277
+ data: number;
278
+ driverParam: number;
279
+ notNull: false;
280
+ hasDefault: false;
281
+ isPrimaryKey: false;
282
+ isAutoincrement: false;
283
+ hasRuntimeDefault: false;
284
+ enumValues: undefined;
285
+ baseColumn: never;
286
+ identity: undefined;
287
+ generated: undefined;
288
+ }, {}, {}>;
289
+ locale: import("drizzle-orm/sqlite-core").SQLiteColumn<{
290
+ name: "locale";
291
+ tableName: "form_submissions";
292
+ dataType: "string";
293
+ columnType: "SQLiteText";
294
+ data: string;
295
+ driverParam: string;
296
+ notNull: true;
297
+ hasDefault: true;
298
+ isPrimaryKey: false;
299
+ isAutoincrement: false;
300
+ hasRuntimeDefault: false;
301
+ enumValues: [string, ...string[]];
302
+ baseColumn: never;
303
+ identity: undefined;
304
+ generated: undefined;
305
+ }, {}, {
306
+ length: undefined;
307
+ }>;
308
+ deliveryStatus: import("drizzle-orm/sqlite-core").SQLiteColumn<{
309
+ name: "deliveryStatus";
310
+ tableName: "form_submissions";
311
+ dataType: "string";
312
+ columnType: "SQLiteText";
313
+ data: DeliveryStatus;
314
+ driverParam: string;
315
+ notNull: true;
316
+ hasDefault: true;
317
+ isPrimaryKey: false;
318
+ isAutoincrement: false;
319
+ hasRuntimeDefault: false;
320
+ enumValues: [string, ...string[]];
321
+ baseColumn: never;
322
+ identity: undefined;
323
+ generated: undefined;
324
+ }, {}, {
325
+ length: undefined;
326
+ $type: DeliveryStatus;
327
+ }>;
328
+ deliveryError: import("drizzle-orm/sqlite-core").SQLiteColumn<{
329
+ name: "deliveryError";
330
+ tableName: "form_submissions";
331
+ dataType: "string";
332
+ columnType: "SQLiteText";
333
+ data: string;
334
+ driverParam: string;
335
+ notNull: false;
336
+ hasDefault: false;
337
+ isPrimaryKey: false;
338
+ isAutoincrement: false;
339
+ hasRuntimeDefault: false;
340
+ enumValues: [string, ...string[]];
341
+ baseColumn: never;
342
+ identity: undefined;
343
+ generated: undefined;
344
+ }, {}, {
345
+ length: undefined;
346
+ }>;
347
+ createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
348
+ name: "createdAt";
349
+ tableName: "form_submissions";
350
+ dataType: "date";
351
+ columnType: "SQLiteTimestamp";
352
+ data: Date;
353
+ driverParam: number;
354
+ notNull: true;
355
+ hasDefault: true;
356
+ isPrimaryKey: false;
357
+ isAutoincrement: false;
358
+ hasRuntimeDefault: true;
359
+ enumValues: undefined;
360
+ baseColumn: never;
361
+ identity: undefined;
362
+ generated: undefined;
363
+ }, {}, {}>;
364
+ };
365
+ dialect: "sqlite";
366
+ }>;
367
+ export declare const formSubmissionFiles: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
368
+ name: "form_submission_files";
369
+ schema: undefined;
370
+ columns: {
371
+ id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
372
+ name: "id";
373
+ tableName: "form_submission_files";
374
+ dataType: "string";
375
+ columnType: "SQLiteText";
376
+ data: string;
377
+ driverParam: string;
378
+ notNull: true;
379
+ hasDefault: false;
380
+ isPrimaryKey: true;
381
+ isAutoincrement: false;
382
+ hasRuntimeDefault: false;
383
+ enumValues: [string, ...string[]];
384
+ baseColumn: never;
385
+ identity: undefined;
386
+ generated: undefined;
387
+ }, {}, {
388
+ length: undefined;
389
+ }>;
390
+ submissionId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
391
+ name: "submissionId";
392
+ tableName: "form_submission_files";
393
+ dataType: "string";
394
+ columnType: "SQLiteText";
395
+ data: string;
396
+ driverParam: string;
397
+ notNull: true;
398
+ hasDefault: false;
399
+ isPrimaryKey: false;
400
+ isAutoincrement: false;
401
+ hasRuntimeDefault: false;
402
+ enumValues: [string, ...string[]];
403
+ baseColumn: never;
404
+ identity: undefined;
405
+ generated: undefined;
406
+ }, {}, {
407
+ length: undefined;
408
+ }>;
409
+ fieldKey: import("drizzle-orm/sqlite-core").SQLiteColumn<{
410
+ name: "fieldKey";
411
+ tableName: "form_submission_files";
412
+ dataType: "string";
413
+ columnType: "SQLiteText";
414
+ data: string;
415
+ driverParam: string;
416
+ notNull: true;
417
+ hasDefault: false;
418
+ isPrimaryKey: false;
419
+ isAutoincrement: false;
420
+ hasRuntimeDefault: false;
421
+ enumValues: [string, ...string[]];
422
+ baseColumn: never;
423
+ identity: undefined;
424
+ generated: undefined;
425
+ }, {}, {
426
+ length: undefined;
427
+ }>;
428
+ pathname: import("drizzle-orm/sqlite-core").SQLiteColumn<{
429
+ name: "pathname";
430
+ tableName: "form_submission_files";
431
+ dataType: "string";
432
+ columnType: "SQLiteText";
433
+ data: string;
434
+ driverParam: string;
435
+ notNull: true;
436
+ hasDefault: false;
437
+ isPrimaryKey: false;
438
+ isAutoincrement: false;
439
+ hasRuntimeDefault: false;
440
+ enumValues: [string, ...string[]];
441
+ baseColumn: never;
442
+ identity: undefined;
443
+ generated: undefined;
444
+ }, {}, {
445
+ length: undefined;
446
+ }>;
447
+ filename: import("drizzle-orm/sqlite-core").SQLiteColumn<{
448
+ name: "filename";
449
+ tableName: "form_submission_files";
450
+ dataType: "string";
451
+ columnType: "SQLiteText";
452
+ data: string;
453
+ driverParam: string;
454
+ notNull: true;
455
+ hasDefault: false;
456
+ isPrimaryKey: false;
457
+ isAutoincrement: false;
458
+ hasRuntimeDefault: false;
459
+ enumValues: [string, ...string[]];
460
+ baseColumn: never;
461
+ identity: undefined;
462
+ generated: undefined;
463
+ }, {}, {
464
+ length: undefined;
465
+ }>;
466
+ contentType: import("drizzle-orm/sqlite-core").SQLiteColumn<{
467
+ name: "contentType";
468
+ tableName: "form_submission_files";
469
+ dataType: "string";
470
+ columnType: "SQLiteText";
471
+ data: string;
472
+ driverParam: string;
473
+ notNull: true;
474
+ hasDefault: false;
475
+ isPrimaryKey: false;
476
+ isAutoincrement: false;
477
+ hasRuntimeDefault: false;
478
+ enumValues: [string, ...string[]];
479
+ baseColumn: never;
480
+ identity: undefined;
481
+ generated: undefined;
482
+ }, {}, {
483
+ length: undefined;
484
+ }>;
485
+ size: import("drizzle-orm/sqlite-core").SQLiteColumn<{
486
+ name: "size";
487
+ tableName: "form_submission_files";
488
+ dataType: "number";
489
+ columnType: "SQLiteInteger";
490
+ data: number;
491
+ driverParam: number;
492
+ notNull: true;
493
+ hasDefault: false;
494
+ isPrimaryKey: false;
495
+ isAutoincrement: false;
496
+ hasRuntimeDefault: false;
497
+ enumValues: undefined;
498
+ baseColumn: never;
499
+ identity: undefined;
500
+ generated: undefined;
501
+ }, {}, {}>;
502
+ };
503
+ dialect: "sqlite";
504
+ }>;
@@ -0,0 +1,46 @@
1
+ import { sqliteTable, text, integer, index } from "drizzle-orm/sqlite-core";
2
+ export const forms = sqliteTable("forms", {
3
+ /** `frm_` + random id. */
4
+ id: text().primaryKey(),
5
+ slug: text().notNull().unique(),
6
+ name: text().notNull(),
7
+ /** `draft | published | archived`. Only published forms are public. */
8
+ status: text().$type().notNull().default("draft"),
9
+ definition: text({ mode: "json" }).$type().notNull(),
10
+ /** Bumped whenever the definition changes. */
11
+ version: integer().notNull().default(1),
12
+ createdAt: integer({ mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date()),
13
+ updatedAt: integer({ mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date()).$onUpdateFn(() => /* @__PURE__ */ new Date())
14
+ });
15
+ export const formSubmissions = sqliteTable("form_submissions", {
16
+ /** `fsb_` + random id. */
17
+ id: text().primaryKey(),
18
+ /** Forms are archived, never deleted, so submissions always keep their form. */
19
+ formId: text().notNull().references(() => forms.id),
20
+ formSlug: text().notNull(),
21
+ formVersion: integer().notNull(),
22
+ /** The definition as it was when the answers were given; renders old submissions correctly after edits. */
23
+ definitionSnapshot: text({ mode: "json" }).$type().notNull(),
24
+ answers: text({ mode: "json" }).$type().notNull(),
25
+ /** Signed-in submitter, if any. */
26
+ userId: integer(),
27
+ locale: text().notNull().default("en"),
28
+ deliveryStatus: text().$type().notNull().default("none"),
29
+ deliveryError: text(),
30
+ createdAt: integer({ mode: "timestamp" }).notNull().$defaultFn(() => /* @__PURE__ */ new Date())
31
+ }, (t) => [
32
+ index("form_submission_form_idx").on(t.formId, t.createdAt)
33
+ ]);
34
+ export const formSubmissionFiles = sqliteTable("form_submission_files", {
35
+ /** `fsf_` + random id. */
36
+ id: text().primaryKey(),
37
+ submissionId: text().notNull().references(() => formSubmissions.id, { onDelete: "cascade" }),
38
+ fieldKey: text().notNull(),
39
+ /** Pathname in the blob store. */
40
+ pathname: text().notNull(),
41
+ filename: text().notNull(),
42
+ contentType: text().notNull(),
43
+ size: integer().notNull()
44
+ }, (t) => [
45
+ index("form_submission_file_submission_idx").on(t.submissionId)
46
+ ]);
@@ -0,0 +1,2 @@
1
+ declare const _default: any;
2
+ export default _default;
@@ -0,0 +1,21 @@
1
+ import { answersToHtml, answersToText, escapeHtml, renderAnswers } from "../utils/render.js";
2
+ import { translate } from "../../utils/index.js";
3
+ export default defineNitroPlugin((nitro) => {
4
+ nitro.hooks.hook("forms:submitted", async (ctx) => {
5
+ const email = ctx.form.definition.delivery?.email;
6
+ if (!email?.to.length) return;
7
+ const rows = renderAnswers(ctx.form.definition, ctx.answers, ctx.locale);
8
+ const subject = translate(email.subject, ctx.locale) || `New submission: ${ctx.form.name}`;
9
+ const fileNames = ctx.files.map((file) => `${file.filename} (${file.fieldKey})`);
10
+ await dispatchEmailNotification({
11
+ to: email.to,
12
+ subject,
13
+ body: `<p><strong>${escapeHtml(ctx.form.name)}</strong></p>${answersToHtml(rows)}` + (fileNames.length ? `<p>Files stored with the submission: ${escapeHtml(fileNames.join(", "))}</p>` : ""),
14
+ text: answersToText(rows) + (fileNames.length ? `
15
+
16
+ Files stored with the submission: ${fileNames.join(", ")}` : ""),
17
+ meta: { formSlug: ctx.form.slug, submissionId: ctx.submissionId }
18
+ });
19
+ ctx.delivered = true;
20
+ });
21
+ });
@@ -0,0 +1,2 @@
1
+ declare const _default: any;
2
+ export default _default;
@@ -0,0 +1,11 @@
1
+ import { seedForms } from "../utils/seed.js";
2
+ export default defineNitroPlugin(async () => {
3
+ const { seed } = useRuntimeConfig().forms;
4
+ if (!seed.enabled || !seed.forms.length) return;
5
+ try {
6
+ const { inserted, skipped } = await seedForms(seed.forms);
7
+ console.info(`[forms] seed: inserted ${inserted.length}, skipped ${skipped.length} existing`);
8
+ } catch (error) {
9
+ console.error("[forms] seed failed:", error);
10
+ }
11
+ });
@@ -0,0 +1,2 @@
1
+ declare const _default: any;
2
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import { eq } from "drizzle-orm";
2
+ import { db, schema } from "@nuxthub/db";
3
+ export default defineEventHandler(async (event) => {
4
+ await requireFormsManager(event);
5
+ const current = await findFormById(getRouterParam(event, "id"));
6
+ const [row] = await db.update(schema.forms).set({ status: "archived" }).where(eq(schema.forms.id, current.id)).returning();
7
+ return toAdminForm(row);
8
+ });
@@ -0,0 +1,2 @@
1
+ declare const _default: any;
2
+ export default _default;
@@ -0,0 +1,4 @@
1
+ export default defineEventHandler(async (event) => {
2
+ await requireFormsManager(event);
3
+ return toAdminForm(await findFormById(getRouterParam(event, "id")));
4
+ });
@@ -0,0 +1,2 @@
1
+ declare const _default: any;
2
+ export default _default;
@@ -0,0 +1,17 @@
1
+ import { eq } from "drizzle-orm";
2
+ import { db, schema } from "@nuxthub/db";
3
+ import { formPatch } from "../../utils/admin-schemas.js";
4
+ export default defineEventHandler(async (event) => {
5
+ await requireFormsManager(event);
6
+ const current = await findFormById(getRouterParam(event, "id"));
7
+ const input = await readValidatedBody(event, formPatch.parse);
8
+ if (input.slug && input.slug !== current.slug && await findFormBySlug(input.slug)) {
9
+ throw createError({ statusCode: 409, statusMessage: "A form with this slug already exists." });
10
+ }
11
+ const definitionChanged = input.definition !== void 0 && JSON.stringify(input.definition) !== JSON.stringify(current.definition);
12
+ const [row] = await db.update(schema.forms).set({
13
+ ...input,
14
+ version: definitionChanged ? current.version + 1 : current.version
15
+ }).where(eq(schema.forms.id, current.id)).returning();
16
+ return toAdminForm(row);
17
+ });
@@ -0,0 +1,2 @@
1
+ declare const _default: any;
2
+ export default _default;
@@ -0,0 +1,19 @@
1
+ import { count, desc } from "drizzle-orm";
2
+ import { db, schema } from "@nuxthub/db";
3
+ export default defineEventHandler(async (event) => {
4
+ await requireFormsManager(event);
5
+ const rows = await db.select().from(schema.forms).orderBy(desc(schema.forms.updatedAt));
6
+ const counts = await db.select({ formId: schema.formSubmissions.formId, total: count() }).from(schema.formSubmissions).groupBy(schema.formSubmissions.formId);
7
+ const totals = new Map(counts.map((row) => [row.formId, row.total]));
8
+ return rows.map((row) => ({
9
+ id: row.id,
10
+ slug: row.slug,
11
+ name: row.name,
12
+ status: row.status,
13
+ version: row.version,
14
+ storage: row.definition.storage,
15
+ mode: row.definition.mode,
16
+ submissionCount: totals.get(row.id) ?? 0,
17
+ updatedAt: row.updatedAt.toISOString()
18
+ }));
19
+ });
@@ -0,0 +1,2 @@
1
+ declare const _default: any;
2
+ export default _default;
@@ -0,0 +1,13 @@
1
+ import { db, schema } from "@nuxthub/db";
2
+ import { newId } from "../../../utils/index.js";
3
+ import { formInput } from "../../utils/admin-schemas.js";
4
+ export default defineEventHandler(async (event) => {
5
+ await requireFormsManager(event);
6
+ const input = await readValidatedBody(event, formInput.parse);
7
+ if (await findFormBySlug(input.slug)) {
8
+ throw createError({ statusCode: 409, statusMessage: "A form with this slug already exists." });
9
+ }
10
+ const [row] = await db.insert(schema.forms).values({ id: newId("frm"), ...input }).returning();
11
+ setResponseStatus(event, 201);
12
+ return toAdminForm(row);
13
+ });
@@ -0,0 +1,2 @@
1
+ declare const _default: any;
2
+ export default _default;