@fragno-dev/forms 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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/models.ts","../../../src/definition.ts","../../../src/index.ts"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1,375 @@
1
+ import { createClientBuilder } from "@fragno-dev/core/client";
2
+ import { defineFragment, defineRoutes, instantiate } from "@fragno-dev/core";
3
+ import { z } from "zod";
4
+ import { withDatabase } from "@fragno-dev/db";
5
+ import { column, idColumn, schema } from "@fragno-dev/db/schema";
6
+ import { Validator } from "@cfworker/json-schema";
7
+
8
+ //#region src/schema.ts
9
+ const formsSchema = schema((s) => {
10
+ return s.addTable("form", (t) => {
11
+ return t.addColumn("id", idColumn()).addColumn("title", column("string")).addColumn("description", column("string").nullable()).addColumn("slug", column("string")).addColumn("status", column("string").defaultTo(() => "draft")).addColumn("dataSchema", column("json")).addColumn("uiSchema", column("json")).addColumn("version", column("integer").defaultTo(() => 1)).addColumn("createdAt", column("timestamp").defaultTo((b) => b.now())).addColumn("updatedAt", column("timestamp").defaultTo((b) => b.now())).createIndex("idx_form_status", ["status"]).createIndex("idx_form_slug", ["slug"], { unique: true });
12
+ }).addTable("response", (t) => {
13
+ return t.addColumn("id", idColumn()).addColumn("formId", column("string")).addColumn("formVersion", column("integer")).addColumn("data", column("json")).addColumn("submittedAt", column("timestamp").defaultTo((b) => b.now())).addColumn("userAgent", column("string").nullable()).addColumn("ip", column("string").nullable()).createIndex("idx_response_form", ["formId"]).createIndex("idx_response_submitted_at", ["submittedAt"]);
14
+ });
15
+ });
16
+
17
+ //#endregion
18
+ //#region src/definition.ts
19
+ const asExternalForm = (form) => ({
20
+ ...form,
21
+ id: form.id.externalId,
22
+ status: form.status,
23
+ dataSchema: form.dataSchema,
24
+ uiSchema: form.uiSchema
25
+ });
26
+ const asExternalResponse = (response) => ({
27
+ ...response,
28
+ id: response.id.externalId,
29
+ data: response.data
30
+ });
31
+ const formsFragmentDef = defineFragment("forms").extend(withDatabase(formsSchema)).withDependencies(({ db }) => ({ db })).providesBaseService(({ deps }) => {
32
+ return {
33
+ createForm: async (input) => {
34
+ return (await deps.db.create("form", input)).externalId;
35
+ },
36
+ getForm: async (id) => {
37
+ const form = await deps.db.findFirst("form", (b) => b.whereIndex("primary", (eb) => eb("id", "=", id)));
38
+ return form ? asExternalForm(form) : null;
39
+ },
40
+ getFormBySlug: async (slug) => {
41
+ const form = await deps.db.findFirst("form", (b) => b.whereIndex("idx_form_slug", (eb) => eb("slug", "=", slug)));
42
+ return form ? asExternalForm(form) : null;
43
+ },
44
+ updateForm: async (id, input) => {
45
+ const uow = deps.db.createUnitOfWork().find("form", (b) => b.whereIndex("primary", (eb) => eb("id", "=", id)));
46
+ const [currentForms] = await uow.executeRetrieve();
47
+ if (currentForms.length === 0) return { success: false };
48
+ const currentForm = currentForms[0];
49
+ const newVersion = input.dataSchema ? currentForm.version + 1 : currentForm.version;
50
+ uow.update("form", currentForm.id, (b) => {
51
+ b.set({
52
+ ...input,
53
+ version: newVersion,
54
+ updatedAt: new Date()
55
+ }).check();
56
+ });
57
+ return uow.executeMutations();
58
+ },
59
+ listForms: async () => {
60
+ const forms = await deps.db.find("form", (b) => b.whereIndex("primary"));
61
+ return forms.map(asExternalForm);
62
+ },
63
+ deleteForm: async (id) => {
64
+ await deps.db.delete("form", id);
65
+ },
66
+ validateData: (schema$1, data) => {
67
+ const validator = new Validator(schema$1);
68
+ const result = validator.validate(data);
69
+ if (result.valid) return {
70
+ success: true,
71
+ data
72
+ };
73
+ console.error("ERROR", JSON.stringify(result.errors));
74
+ return {
75
+ success: false,
76
+ error: {
77
+ message: "Validation failed",
78
+ errors: result.errors.map((e) => ({
79
+ path: e.instanceLocation || "",
80
+ message: e.error ?? "Invalid value"
81
+ }))
82
+ }
83
+ };
84
+ },
85
+ createResponse: async (formId, formVersion, data, metadata) => {
86
+ return (await deps.db.create("response", {
87
+ formId,
88
+ formVersion,
89
+ data,
90
+ ip: metadata?.ip ?? null,
91
+ userAgent: metadata?.userAgent ?? null
92
+ })).externalId;
93
+ },
94
+ getResponse: async (id) => {
95
+ const response = await deps.db.findFirst("response", (b) => b.whereIndex("primary", (eb) => eb("id", "=", id)));
96
+ return response ? asExternalResponse(response) : null;
97
+ },
98
+ listResponses: async (formId, sort = {
99
+ field: "submittedAt",
100
+ order: "desc"
101
+ }) => {
102
+ const responses = await deps.db.find("response", (b) => b.whereIndex("idx_response_form", (eb) => eb("formId", "=", formId)).orderByIndex("idx_response_submitted_at", sort.order));
103
+ return responses.map(asExternalResponse);
104
+ },
105
+ deleteResponse: async (id) => {
106
+ return await deps.db.delete("response", id);
107
+ }
108
+ };
109
+ }).build();
110
+
111
+ //#endregion
112
+ //#region src/models.ts
113
+ const JSONSchemaSchema = z.record(z.string(), z.unknown());
114
+ const UISchemaElementSchema = z.record(z.string(), z.unknown());
115
+ const FormStatusSchema = z.enum([
116
+ "draft",
117
+ "open",
118
+ "closed",
119
+ "static"
120
+ ]);
121
+ const FormSchema = z.object({
122
+ id: z.string(),
123
+ title: z.string(),
124
+ description: z.string().nullable(),
125
+ slug: z.string(),
126
+ status: FormStatusSchema,
127
+ dataSchema: JSONSchemaSchema,
128
+ uiSchema: UISchemaElementSchema,
129
+ version: z.number(),
130
+ createdAt: z.date(),
131
+ updatedAt: z.date()
132
+ });
133
+ const NewFormSchema = FormSchema.omit({
134
+ id: true,
135
+ createdAt: true,
136
+ updatedAt: true,
137
+ version: true
138
+ });
139
+ const UpdateFormSchema = NewFormSchema.partial();
140
+ const ResponseMetadataSchema = z.object({
141
+ ip: z.union([z.ipv4(), z.ipv6()]).nullable(),
142
+ userAgent: z.string().max(4096).nullable()
143
+ });
144
+ const ResponseSchema = z.object({
145
+ id: z.string(),
146
+ formId: z.string().nullable().describe("Form ID (static form ID or database form external ID)"),
147
+ formVersion: z.number(),
148
+ data: z.record(z.string(), z.unknown()),
149
+ submittedAt: z.date(),
150
+ ip: z.string().max(45).nullable(),
151
+ userAgent: z.string().max(512).nullable()
152
+ });
153
+ const NewResponseSchema = ResponseSchema.omit({
154
+ id: true,
155
+ submittedAt: true,
156
+ formId: true,
157
+ formVersion: true,
158
+ ip: true,
159
+ userAgent: true
160
+ }).extend({ securityToken: z.string().optional() });
161
+
162
+ //#endregion
163
+ //#region src/routes.ts
164
+ /** Extract and validate request metadata from headers (untrusted input) */
165
+ function extractRequestMetadata(headers) {
166
+ const rawUserAgent = headers.get("User-Agent");
167
+ const rawIp = headers.get("CF-Connecting-IP") || headers.get("X-Forwarded-For")?.split(",")[0].trim() || headers.get("X-Real-IP") || null;
168
+ const result = ResponseMetadataSchema.safeParse({
169
+ ip: rawIp,
170
+ userAgent: rawUserAgent
171
+ });
172
+ return result.success ? result.data : {
173
+ ip: null,
174
+ userAgent: null
175
+ };
176
+ }
177
+ const staticAsRegularForm = (sf) => ({
178
+ id: sf.id,
179
+ title: sf.title,
180
+ description: sf.description,
181
+ slug: sf.slug,
182
+ status: "static",
183
+ dataSchema: sf.dataSchema,
184
+ uiSchema: sf.uiSchema,
185
+ version: sf.version,
186
+ createdAt: new Date(),
187
+ updatedAt: new Date()
188
+ });
189
+ const publicRoutes = defineRoutes(formsFragmentDef).create(({ services, defineRoute, config }) => {
190
+ return [defineRoute({
191
+ method: "GET",
192
+ path: "/:slug",
193
+ outputSchema: FormSchema,
194
+ errorCodes: ["NOT_FOUND"],
195
+ handler: async ({ pathParams }, { json, error }) => {
196
+ const staticForm = config.staticForms?.find((f) => f.slug === pathParams.slug);
197
+ if (staticForm) return json(staticAsRegularForm(staticForm));
198
+ const form = await services.getFormBySlug(pathParams.slug);
199
+ if (!form) return error({
200
+ message: "Form not found",
201
+ code: "NOT_FOUND"
202
+ }, 404);
203
+ return json(form);
204
+ }
205
+ }), defineRoute({
206
+ method: "POST",
207
+ path: "/:slug/submit",
208
+ inputSchema: NewResponseSchema,
209
+ outputSchema: z.string(),
210
+ errorCodes: [
211
+ "NOT_FOUND",
212
+ "VALIDATION_ERROR",
213
+ "FORM_NOT_OPEN"
214
+ ],
215
+ handler: async ({ input, pathParams, headers }, { json, error }) => {
216
+ const { data } = await input.valid();
217
+ const staticFormConfig = config.staticForms?.find((f) => f.slug === pathParams.slug);
218
+ const form = staticFormConfig ? staticAsRegularForm(staticFormConfig) : await services.getFormBySlug(pathParams.slug);
219
+ if (!form) return error({
220
+ message: "Form not found",
221
+ code: "NOT_FOUND"
222
+ }, 404);
223
+ if (form.status !== "open" && form.status !== "static") return error({
224
+ message: "Form is not open, has status " + form.status,
225
+ code: "FORM_NOT_OPEN"
226
+ }, 400);
227
+ const result = services.validateData(form.dataSchema, data);
228
+ if (!result.success) {
229
+ const message = result.error.errors.map((e) => e.message).join(" ");
230
+ return error({
231
+ message,
232
+ code: "VALIDATION_ERROR"
233
+ }, 400);
234
+ }
235
+ const metadata = extractRequestMetadata(headers);
236
+ const responseId = await services.createResponse(form.id, form.version, result.data, metadata);
237
+ if (config.onResponseSubmitted) await config.onResponseSubmitted({
238
+ id: responseId,
239
+ formId: form.id,
240
+ formVersion: form.version,
241
+ data,
242
+ submittedAt: new Date(),
243
+ ip: metadata?.ip,
244
+ userAgent: metadata?.userAgent
245
+ });
246
+ return json(responseId);
247
+ }
248
+ })];
249
+ });
250
+ const adminRoutes = defineRoutes(formsFragmentDef).create(({ services, defineRoute, config }) => {
251
+ return [
252
+ defineRoute({
253
+ method: "GET",
254
+ path: "/admin/forms",
255
+ outputSchema: z.array(FormSchema),
256
+ handler: async (_ctx, { json }) => {
257
+ const dbForms = await services.listForms();
258
+ const staticForms = (config.staticForms ?? []).map(staticAsRegularForm);
259
+ return json([...staticForms, ...dbForms]);
260
+ }
261
+ }),
262
+ defineRoute({
263
+ method: "POST",
264
+ path: "/admin/forms",
265
+ inputSchema: NewFormSchema,
266
+ outputSchema: z.string(),
267
+ errorCodes: ["CREATE_FAILED"],
268
+ handler: async ({ input }, { json }) => {
269
+ const data = await input.valid();
270
+ const formId = await services.createForm(data);
271
+ if (config.onFormCreated) await config.onFormCreated({
272
+ ...data,
273
+ id: formId
274
+ });
275
+ return json(formId);
276
+ }
277
+ }),
278
+ defineRoute({
279
+ method: "PUT",
280
+ path: "/admin/forms/:id",
281
+ inputSchema: UpdateFormSchema,
282
+ errorCodes: ["NOT_FOUND", "STATIC_FORM_READ_ONLY"],
283
+ handler: async ({ input, pathParams }, { json, error }) => {
284
+ const isStatic = config.staticForms?.some((f) => f.id === pathParams.id);
285
+ if (isStatic) return error({
286
+ message: "Static forms cannot be modified",
287
+ code: "STATIC_FORM_READ_ONLY"
288
+ }, 403);
289
+ const data = await input.valid();
290
+ const { success } = await services.updateForm(pathParams.id, data);
291
+ if (!success) return error({
292
+ message: "Form not found",
293
+ code: "NOT_FOUND"
294
+ }, 404);
295
+ return json(success);
296
+ }
297
+ }),
298
+ defineRoute({
299
+ method: "DELETE",
300
+ path: "/admin/forms/:id",
301
+ errorCodes: ["NOT_FOUND", "STATIC_FORM_READ_ONLY"],
302
+ handler: async ({ pathParams }, { json, error }) => {
303
+ const isStatic = config.staticForms?.some((f) => f.id === pathParams.id);
304
+ if (isStatic) return error({
305
+ message: "Static forms cannot be deleted",
306
+ code: "STATIC_FORM_READ_ONLY"
307
+ }, 403);
308
+ await services.deleteForm(pathParams.id);
309
+ return json(true);
310
+ }
311
+ }),
312
+ defineRoute({
313
+ method: "GET",
314
+ path: "/admin/forms/:id/submissions",
315
+ queryParameters: ["sortOrder"],
316
+ outputSchema: z.array(ResponseSchema),
317
+ handler: async ({ pathParams, query }, { json }) => {
318
+ const sortOrder = query.get("sortOrder") === "asc" ? "asc" : "desc";
319
+ const responses = await services.listResponses(pathParams.id, {
320
+ field: "submittedAt",
321
+ order: sortOrder
322
+ });
323
+ return json(responses);
324
+ }
325
+ }),
326
+ defineRoute({
327
+ method: "GET",
328
+ path: "/admin/submissions/:id",
329
+ outputSchema: ResponseSchema,
330
+ errorCodes: ["NOT_FOUND"],
331
+ handler: async ({ pathParams }, { json, error }) => {
332
+ const response = await services.getResponse(pathParams.id);
333
+ if (!response) return error({
334
+ message: "Submission not found",
335
+ code: "NOT_FOUND"
336
+ }, 404);
337
+ return json(response);
338
+ }
339
+ }),
340
+ defineRoute({
341
+ method: "DELETE",
342
+ path: "/admin/submissions/:id",
343
+ errorCodes: ["NOT_FOUND"],
344
+ handler: async ({ pathParams }, { json }) => {
345
+ await services.deleteResponse(pathParams.id);
346
+ return json(true);
347
+ }
348
+ })
349
+ ];
350
+ });
351
+
352
+ //#endregion
353
+ //#region src/index.ts
354
+ const routes = [publicRoutes, adminRoutes];
355
+ function createFormsFragment(config = {}, options) {
356
+ return instantiate(formsFragmentDef).withConfig(config).withRoutes(routes).withOptions(options).build();
357
+ }
358
+ function createFormsClients(fragnoConfig) {
359
+ const b = createClientBuilder(formsFragmentDef, fragnoConfig, routes);
360
+ return {
361
+ useForm: b.createHook("/:slug"),
362
+ useSubmitForm: b.createMutator("POST", "/:slug/submit"),
363
+ useForms: b.createHook("/admin/forms"),
364
+ useCreateForm: b.createMutator("POST", "/admin/forms"),
365
+ useUpdateForm: b.createMutator("PUT", "/admin/forms/:id"),
366
+ useDeleteForm: b.createMutator("DELETE", "/admin/forms/:id"),
367
+ useSubmissions: b.createHook("/admin/forms/:id/submissions"),
368
+ useSubmission: b.createHook("/admin/submissions/:id"),
369
+ useDeleteSubmission: b.createMutator("DELETE", "/admin/submissions/:id")
370
+ };
371
+ }
372
+
373
+ //#endregion
374
+ export { createFormsClients, createFormsFragment, formsFragmentDef, routes };
375
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["form: T","response: T","input: NewForm","id: string","slug: string","input: UpdateForm","schema: Schema","data: Record<string, unknown>","schema","formId: string","formVersion: number","data: ValidatedData","metadata?: { ip?: string | null; userAgent?: string | null }","sort: SubmissionSortOptions","headers: Headers","sf: StaticForm","config: FormsConfig","options: FragnoPublicConfigWithDatabase","fragnoConfig: FragnoPublicClientConfig"],"sources":["../../src/schema.ts","../../src/definition.ts","../../src/models.ts","../../src/routes.ts","../../src/index.ts"],"sourcesContent":["import { column, idColumn, schema } from \"@fragno-dev/db/schema\";\n\nexport const formsSchema = schema((s) => {\n return s\n .addTable(\"form\", (t) => {\n return t\n .addColumn(\"id\", idColumn())\n .addColumn(\"title\", column(\"string\"))\n .addColumn(\"description\", column(\"string\").nullable())\n .addColumn(\"slug\", column(\"string\"))\n .addColumn(\n \"status\",\n column(\"string\").defaultTo(() => \"draft\"),\n )\n .addColumn(\"dataSchema\", column(\"json\"))\n .addColumn(\"uiSchema\", column(\"json\"))\n .addColumn(\n \"version\",\n column(\"integer\").defaultTo(() => 1),\n )\n .addColumn(\n \"createdAt\",\n column(\"timestamp\").defaultTo((b) => b.now()),\n )\n .addColumn(\n \"updatedAt\",\n column(\"timestamp\").defaultTo((b) => b.now()),\n )\n .createIndex(\"idx_form_status\", [\"status\"])\n .createIndex(\"idx_form_slug\", [\"slug\"], { unique: true });\n })\n .addTable(\"response\", (t) => {\n return t\n .addColumn(\"id\", idColumn())\n .addColumn(\"formId\", column(\"string\"))\n .addColumn(\"formVersion\", column(\"integer\"))\n .addColumn(\"data\", column(\"json\"))\n .addColumn(\n \"submittedAt\",\n column(\"timestamp\").defaultTo((b) => b.now()),\n )\n .addColumn(\"userAgent\", column(\"string\").nullable())\n .addColumn(\"ip\", column(\"string\").nullable())\n .createIndex(\"idx_response_form\", [\"formId\"])\n .createIndex(\"idx_response_submitted_at\", [\"submittedAt\"]);\n });\n});\n","import { defineFragment } from \"@fragno-dev/core\";\nimport { withDatabase } from \"@fragno-dev/db\";\nimport { formsSchema } from \"./schema\";\nimport type { FormsConfig } from \".\";\nimport type { JSONSchema, NewForm, UpdateForm, FormStatus, UIElementSchema } from \"./models\";\nimport { Validator, type Schema } from \"@cfworker/json-schema\";\n\nexport type ValidatedData<T = Record<string, unknown>> = T;\nexport type ValidationResult =\n | { success: true; data: ValidatedData }\n | {\n success: false;\n error: { message: string; errors: Array<{ path: string; message: string }> };\n };\n\n// External to this fragment\nconst asExternalForm = <\n T extends { id: { externalId: string }; status: string; dataSchema: unknown; uiSchema: unknown },\n>(\n form: T,\n) => ({\n ...form,\n id: form.id.externalId,\n status: form.status as FormStatus,\n dataSchema: form.dataSchema as JSONSchema,\n uiSchema: form.uiSchema as UIElementSchema,\n});\n\nconst asExternalResponse = <\n T extends {\n id: { externalId: string };\n formId: string | null;\n data: unknown;\n ip: string | null;\n userAgent: string | null;\n },\n>(\n response: T,\n) => ({\n ...response,\n id: response.id.externalId,\n data: response.data as Record<string, unknown>,\n});\n\nexport interface SubmissionSortOptions {\n field: \"submittedAt\";\n order: \"asc\" | \"desc\";\n}\n\nexport const formsFragmentDef = defineFragment<FormsConfig>(\"forms\")\n .extend(withDatabase(formsSchema))\n .withDependencies(({ db }) => ({ db }))\n .providesBaseService(({ deps }) => {\n return {\n createForm: async (input: NewForm) => {\n return (await deps.db.create(\"form\", input)).externalId;\n },\n\n getForm: async (id: string) => {\n const form = await deps.db.findFirst(\"form\", (b) =>\n b.whereIndex(\"primary\", (eb) => eb(\"id\", \"=\", id)),\n );\n return form ? asExternalForm(form) : null;\n },\n\n getFormBySlug: async (slug: string) => {\n const form = await deps.db.findFirst(\"form\", (b) =>\n b.whereIndex(\"idx_form_slug\", (eb) => eb(\"slug\", \"=\", slug)),\n );\n return form ? asExternalForm(form) : null;\n },\n\n updateForm: async (id: string, input: UpdateForm) => {\n const uow = deps.db\n .createUnitOfWork()\n .find(\"form\", (b) => b.whereIndex(\"primary\", (eb) => eb(\"id\", \"=\", id)));\n\n const [currentForms] = await uow.executeRetrieve();\n\n if (currentForms.length === 0) {\n return { success: false };\n }\n // TODO: length > 1 ?\n\n const currentForm = currentForms[0];\n\n // Only increment version if changing data schema\n const newVersion = input.dataSchema ? currentForm.version + 1 : currentForm.version;\n\n uow.update(\"form\", currentForm.id, (b) => {\n b.set({ ...input, version: newVersion, updatedAt: new Date() }).check();\n });\n return uow.executeMutations();\n },\n\n listForms: async () => {\n const forms = await deps.db.find(\"form\", (b) => b.whereIndex(\"primary\"));\n return forms.map(asExternalForm);\n },\n\n deleteForm: async (id: string) => {\n await deps.db.delete(\"form\", id);\n },\n\n validateData: (schema: Schema, data: Record<string, unknown>): ValidationResult => {\n const validator = new Validator(schema);\n const result = validator.validate(data);\n\n if (result.valid) {\n return { success: true, data: data as ValidatedData };\n }\n console.error(\"ERROR\", JSON.stringify(result.errors));\n return {\n success: false,\n // TODO: better error type for validation errors?\n // see: https://jsonforms.io/docs/validation/#external-validation-errors\n error: {\n message: \"Validation failed\",\n errors: result.errors.map((e) => ({\n path: e.instanceLocation || \"\",\n message: e.error ?? \"Invalid value\",\n })),\n },\n };\n },\n\n createResponse: async (\n formId: string,\n formVersion: number,\n data: ValidatedData,\n metadata?: { ip?: string | null; userAgent?: string | null },\n ) => {\n return (\n await deps.db.create(\"response\", {\n formId,\n formVersion,\n data,\n ip: metadata?.ip ?? null,\n userAgent: metadata?.userAgent ?? null,\n })\n ).externalId;\n },\n\n getResponse: async (id: string) => {\n const response = await deps.db.findFirst(\"response\", (b) =>\n b.whereIndex(\"primary\", (eb) => eb(\"id\", \"=\", id)),\n );\n return response ? asExternalResponse(response) : null;\n },\n\n listResponses: async (\n formId: string,\n sort: SubmissionSortOptions = { field: \"submittedAt\", order: \"desc\" },\n ) => {\n const responses = await deps.db.find(\"response\", (b) =>\n b\n .whereIndex(\"idx_response_form\", (eb) => eb(\"formId\", \"=\", formId))\n .orderByIndex(\"idx_response_submitted_at\", sort.order),\n );\n return responses.map(asExternalResponse);\n },\n\n deleteResponse: async (id: string) => {\n return await deps.db.delete(\"response\", id);\n },\n };\n })\n .build();\n","import { z } from \"zod\";\n\nexport const JSONSchemaSchema = z.record(z.string(), z.unknown());\nexport const UISchemaElementSchema = z.record(z.string(), z.unknown());\n\nexport const FormStatusSchema = z.enum([\"draft\", \"open\", \"closed\", \"static\"]);\n\nexport const FormSchema = z.object({\n id: z.string(),\n title: z.string(),\n description: z.string().nullable(),\n slug: z.string(),\n status: FormStatusSchema,\n dataSchema: JSONSchemaSchema,\n uiSchema: UISchemaElementSchema,\n version: z.number(),\n createdAt: z.date(),\n updatedAt: z.date(),\n});\n\nexport const NewFormSchema = FormSchema.omit({\n id: true,\n createdAt: true,\n updatedAt: true,\n version: true,\n});\n\nexport const UpdateFormSchema = NewFormSchema.partial();\n\nexport const ResponseMetadataSchema = z.object({\n ip: z.union([z.ipv4(), z.ipv6()]).nullable(),\n userAgent: z.string().max(4096).nullable(),\n});\n\nexport const ResponseSchema = z.object({\n id: z.string(),\n formId: z.string().nullable().describe(\"Form ID (static form ID or database form external ID)\"),\n formVersion: z.number(),\n data: z.record(z.string(), z.unknown()),\n submittedAt: z.date(),\n ip: z.string().max(45).nullable(),\n userAgent: z.string().max(512).nullable(),\n});\n\nexport const NewResponseSchema = ResponseSchema.omit({\n id: true,\n submittedAt: true,\n formId: true,\n formVersion: true,\n ip: true,\n userAgent: true,\n}).extend({\n securityToken: z.string().optional(),\n});\n\nexport type NewForm = z.infer<typeof NewFormSchema>;\nexport type UpdateForm = z.infer<typeof UpdateFormSchema>;\nexport type Form = z.infer<typeof FormSchema>;\nexport type NewResponse = z.infer<typeof NewResponseSchema>;\nexport type Response = z.infer<typeof ResponseSchema>;\nexport type ResponseMetadata = z.infer<typeof ResponseMetadataSchema>;\nexport type FormStatus = z.infer<typeof FormStatusSchema>;\nexport type JSONSchema = z.infer<typeof JSONSchemaSchema>;\nexport type UIElementSchema = z.infer<typeof UISchemaElementSchema>;\n","import { defineRoutes } from \"@fragno-dev/core\";\nimport type { Schema } from \"@cfworker/json-schema\";\nimport { z } from \"zod\";\nimport { formsFragmentDef } from \"./definition\";\nimport {\n FormSchema,\n NewFormSchema,\n NewResponseSchema,\n ResponseMetadataSchema,\n ResponseSchema,\n UpdateFormSchema,\n} from \"./models\";\nimport type { Form } from \"./models\";\nimport type { StaticForm } from \".\";\n\n/** Extract and validate request metadata from headers (untrusted input) */\nfunction extractRequestMetadata(headers: Headers) {\n const rawUserAgent = headers.get(\"User-Agent\");\n const rawIp =\n headers.get(\"CF-Connecting-IP\") ||\n headers.get(\"X-Forwarded-For\")?.split(\",\")[0].trim() ||\n headers.get(\"X-Real-IP\") ||\n null;\n const result = ResponseMetadataSchema.safeParse({\n ip: rawIp,\n userAgent: rawUserAgent,\n });\n\n // Return validated data or null values if validation fails\n return result.success ? result.data : { ip: null, userAgent: null };\n}\n\nconst staticAsRegularForm = (sf: StaticForm): Form => ({\n id: sf.id,\n title: sf.title,\n description: sf.description,\n slug: sf.slug,\n status: \"static\",\n dataSchema: sf.dataSchema,\n uiSchema: sf.uiSchema as unknown as Form[\"uiSchema\"],\n version: sf.version,\n createdAt: new Date(),\n updatedAt: new Date(),\n});\n\n// Public routes\nexport const publicRoutes = defineRoutes(formsFragmentDef).create(\n ({ services, defineRoute, config }) => {\n return [\n defineRoute({\n method: \"GET\",\n path: \"/:slug\",\n outputSchema: FormSchema,\n errorCodes: [\"NOT_FOUND\"] as const,\n handler: async ({ pathParams }, { json, error }) => {\n // Check static forms first\n const staticForm = config.staticForms?.find((f) => f.slug === pathParams.slug);\n if (staticForm) {\n return json(staticAsRegularForm(staticForm));\n }\n\n const form = await services.getFormBySlug(pathParams.slug);\n if (!form) {\n return error({ message: \"Form not found\", code: \"NOT_FOUND\" }, 404);\n }\n\n return json(form);\n },\n }),\n\n defineRoute({\n method: \"POST\",\n path: \"/:slug/submit\",\n inputSchema: NewResponseSchema,\n outputSchema: z.string(),\n errorCodes: [\"NOT_FOUND\", \"VALIDATION_ERROR\", \"FORM_NOT_OPEN\"] as const,\n handler: async ({ input, pathParams, headers }, { json, error }) => {\n const { data } = await input.valid();\n\n // Check static forms first\n const staticFormConfig = config.staticForms?.find((f) => f.slug === pathParams.slug);\n const form = staticFormConfig\n ? staticAsRegularForm(staticFormConfig)\n : await services.getFormBySlug(pathParams.slug);\n\n if (!form) {\n return error({ message: \"Form not found\", code: \"NOT_FOUND\" }, 404);\n }\n\n // Static forms and open forms accept submissions\n if (form.status !== \"open\" && form.status !== \"static\") {\n return error(\n { message: \"Form is not open, has status \" + form.status, code: \"FORM_NOT_OPEN\" },\n 400,\n );\n }\n\n // Form validation\n const result = services.validateData(form.dataSchema as Schema, data);\n\n if (!result.success) {\n const message = result.error.errors.map((e) => e.message).join(\" \");\n return error({ message, code: \"VALIDATION_ERROR\" }, 400);\n }\n\n // Extract and validate request metadata from headers\n const metadata = extractRequestMetadata(headers);\n\n const responseId = await services.createResponse(\n form.id,\n form.version,\n result.data,\n metadata,\n );\n\n if (config.onResponseSubmitted) {\n await config.onResponseSubmitted({\n id: responseId,\n formId: form.id,\n formVersion: form.version,\n data,\n submittedAt: new Date(),\n ip: metadata?.ip,\n userAgent: metadata?.userAgent,\n });\n }\n\n return json(responseId);\n },\n }),\n ];\n },\n);\n\n// Admin routes\nexport const adminRoutes = defineRoutes(formsFragmentDef).create(\n ({ services, defineRoute, config }) => {\n return [\n defineRoute({\n method: \"GET\",\n path: \"/admin/forms\",\n outputSchema: z.array(FormSchema),\n handler: async (_ctx, { json }) => {\n const dbForms = await services.listForms();\n const staticForms = (config.staticForms ?? []).map(staticAsRegularForm);\n return json([...staticForms, ...dbForms]);\n },\n }),\n\n defineRoute({\n method: \"POST\",\n path: \"/admin/forms\",\n inputSchema: NewFormSchema,\n outputSchema: z.string(),\n errorCodes: [\"CREATE_FAILED\"] as const,\n handler: async ({ input }, { json }) => {\n const data = await input.valid();\n const formId = await services.createForm(data);\n if (config.onFormCreated) {\n await config.onFormCreated({ ...data, id: formId });\n }\n return json(formId);\n },\n }),\n\n defineRoute({\n method: \"PUT\",\n path: \"/admin/forms/:id\",\n inputSchema: UpdateFormSchema,\n errorCodes: [\"NOT_FOUND\", \"STATIC_FORM_READ_ONLY\"] as const,\n handler: async ({ input, pathParams }, { json, error }) => {\n const isStatic = config.staticForms?.some((f) => f.id === pathParams.id);\n if (isStatic) {\n return error(\n { message: \"Static forms cannot be modified\", code: \"STATIC_FORM_READ_ONLY\" },\n 403,\n );\n }\n const data = await input.valid();\n const { success } = await services.updateForm(pathParams.id, data);\n if (!success) {\n return error({ message: \"Form not found\", code: \"NOT_FOUND\" }, 404);\n }\n return json(success);\n },\n }),\n\n defineRoute({\n method: \"DELETE\",\n path: \"/admin/forms/:id\",\n errorCodes: [\"NOT_FOUND\", \"STATIC_FORM_READ_ONLY\"] as const,\n handler: async ({ pathParams }, { json, error }) => {\n const isStatic = config.staticForms?.some((f) => f.id === pathParams.id);\n if (isStatic) {\n return error(\n { message: \"Static forms cannot be deleted\", code: \"STATIC_FORM_READ_ONLY\" },\n 403,\n );\n }\n await services.deleteForm(pathParams.id);\n // TODO: 404 when form not found\n // if (!deleted) {\n // return error({ message: \"Form not found\", code: \"NOT_FOUND\" }, 404);\n // }\n return json(true);\n },\n }),\n\n defineRoute({\n method: \"GET\",\n path: \"/admin/forms/:id/submissions\",\n queryParameters: [\"sortOrder\"] as const,\n outputSchema: z.array(ResponseSchema),\n handler: async ({ pathParams, query }, { json }) => {\n const sortOrder = query.get(\"sortOrder\") === \"asc\" ? \"asc\" : \"desc\";\n const responses = await services.listResponses(pathParams.id, {\n field: \"submittedAt\",\n order: sortOrder,\n });\n return json(responses);\n },\n }),\n\n defineRoute({\n method: \"GET\",\n path: \"/admin/submissions/:id\",\n outputSchema: ResponseSchema,\n errorCodes: [\"NOT_FOUND\"] as const,\n handler: async ({ pathParams }, { json, error }) => {\n const response = await services.getResponse(pathParams.id);\n if (!response) {\n return error({ message: \"Submission not found\", code: \"NOT_FOUND\" }, 404);\n }\n return json(response);\n },\n }),\n\n defineRoute({\n method: \"DELETE\",\n path: \"/admin/submissions/:id\",\n errorCodes: [\"NOT_FOUND\"] as const,\n handler: async ({ pathParams }, { json }) => {\n await services.deleteResponse(pathParams.id);\n // TODO: 404 when response not found\n // if (!deleted) {\n // return error({ message: \"Submission not found\", code: \"NOT_FOUND\" }, 404);\n // }\n return json(true);\n },\n }),\n ];\n },\n);\n","import { createClientBuilder } from \"@fragno-dev/core/client\";\nimport type { FragnoPublicClientConfig } from \"@fragno-dev/core/client\";\nimport type { FragnoPublicConfigWithDatabase } from \"@fragno-dev/db\";\nimport { instantiate } from \"@fragno-dev/core\";\nimport { publicRoutes, adminRoutes } from \"./routes\";\nimport { formsFragmentDef } from \"./definition\";\nimport type { Form, JSONSchema, Response } from \"./models\";\nimport type { UISchemaElement } from \"@jsonforms/core\";\n\n// Forms that exist in code, but submissions are stored in the DB\n// Static forms always have status: \"static\" and accept submissions\nexport interface StaticForm {\n id: string;\n title: string;\n description: string | null;\n slug: string;\n dataSchema: JSONSchema;\n uiSchema: UISchemaElement;\n version: number;\n}\n\nexport interface FormsConfig {\n onFormCreated?: (form: Omit<Form, \"version\" | \"createdAt\" | \"updatedAt\">) => Promise<void>;\n onResponseSubmitted?: (response: Response) => Promise<void>;\n staticForms?: StaticForm[];\n}\n\nexport const routes = [publicRoutes, adminRoutes] as const;\n\nexport function createFormsFragment(\n config: FormsConfig = {},\n options: FragnoPublicConfigWithDatabase,\n) {\n return instantiate(formsFragmentDef)\n .withConfig(config)\n .withRoutes(routes)\n .withOptions(options)\n .build();\n}\n\nexport function createFormsClients(fragnoConfig: FragnoPublicClientConfig) {\n const b = createClientBuilder(formsFragmentDef, fragnoConfig, routes);\n\n return {\n // Public\n useForm: b.createHook(\"/:slug\"),\n useSubmitForm: b.createMutator(\"POST\", \"/:slug/submit\"),\n\n // Admin - Forms\n useForms: b.createHook(\"/admin/forms\"),\n useCreateForm: b.createMutator(\"POST\", \"/admin/forms\"),\n useUpdateForm: b.createMutator(\"PUT\", \"/admin/forms/:id\"),\n useDeleteForm: b.createMutator(\"DELETE\", \"/admin/forms/:id\"),\n\n // Admin - Submissions\n useSubmissions: b.createHook(\"/admin/forms/:id/submissions\"),\n useSubmission: b.createHook(\"/admin/submissions/:id\"),\n useDeleteSubmission: b.createMutator(\"DELETE\", \"/admin/submissions/:id\"),\n };\n}\n\nexport { formsFragmentDef } from \"./definition\";\nexport type { SubmissionSortOptions } from \"./definition\";\nexport type { FragnoRouteConfig } from \"@fragno-dev/core\";\n"],"mappings":"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"}