@onabl/contracts 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # `contracts`
@@ -0,0 +1,13 @@
1
+ import { z } from "zod";
2
+ export declare const PaginationQuerySchema: z.ZodObject<{
3
+ limit: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
4
+ offset: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
5
+ }, z.core.$strip>;
6
+ export declare const SearchPaginationQuerySchema: z.ZodObject<{
7
+ limit: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
8
+ offset: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
9
+ search: z.ZodOptional<z.ZodString>;
10
+ }, z.core.$strip>;
11
+ export type PaginationQuery = z.infer<typeof PaginationQuerySchema>;
12
+ export type SearchPaginationQuery = z.infer<typeof SearchPaginationQuerySchema>;
13
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,eAAO,MAAM,qBAAqB;;;iBAGhC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;iBAEtC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC"}
package/dist/common.js ADDED
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SearchPaginationQuerySchema = exports.PaginationQuerySchema = void 0;
4
+ const zod_1 = require("zod");
5
+ exports.PaginationQuerySchema = zod_1.z.object({
6
+ limit: zod_1.z.coerce.number().int().min(1).max(100).optional().default(50),
7
+ offset: zod_1.z.coerce.number().int().min(0).optional().default(0),
8
+ });
9
+ exports.SearchPaginationQuerySchema = exports.PaginationQuerySchema.extend({
10
+ search: zod_1.z.string().optional(),
11
+ });
@@ -0,0 +1,12 @@
1
+ import { z } from "zod";
2
+ export declare const UpdateContactNotesSchema: z.ZodObject<{
3
+ notes: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
4
+ }, z.core.$strip>;
5
+ export declare const ContactFilterQuerySchema: z.ZodObject<{
6
+ search: z.ZodOptional<z.ZodString>;
7
+ limit: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
8
+ offset: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
9
+ }, z.core.$strip>;
10
+ export type UpdateContactNotes = z.infer<typeof UpdateContactNotesSchema>;
11
+ export type ContactFilterQuery = z.infer<typeof ContactFilterQuerySchema>;
12
+ //# sourceMappingURL=contacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../src/contacts.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAGtB,eAAO,MAAM,wBAAwB;;iBAEnC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;iBAInC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContactFilterQuerySchema = exports.UpdateContactNotesSchema = void 0;
4
+ // packages/contracts/src/contacts.ts
5
+ const zod_1 = require("zod");
6
+ const sanitize_js_1 = require("./sanitize.js");
7
+ exports.UpdateContactNotesSchema = zod_1.z.object({
8
+ notes: (0, sanitize_js_1.safeText)(zod_1.z.string().max(2000)),
9
+ });
10
+ exports.ContactFilterQuerySchema = zod_1.z.object({
11
+ search: zod_1.z.string().optional(),
12
+ limit: zod_1.z.coerce.number().int().min(1).max(100).optional().default(50),
13
+ offset: zod_1.z.coerce.number().int().min(0).optional().default(0),
14
+ });
@@ -0,0 +1,27 @@
1
+ import { z } from "zod";
2
+ export declare const CreateDiscountCodeSchema: z.ZodObject<{
3
+ code: z.ZodString;
4
+ type: z.ZodEnum<{
5
+ PERCENT: "PERCENT";
6
+ FIXED: "FIXED";
7
+ }>;
8
+ value: z.ZodNumber;
9
+ usageLimit: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
10
+ expiresAt: z.ZodOptional<z.ZodNullable<z.ZodISODateTime>>;
11
+ active: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
12
+ formId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
13
+ }, z.core.$strip>;
14
+ export declare const UpdateDiscountCodeSchema: z.ZodObject<{
15
+ type: z.ZodOptional<z.ZodEnum<{
16
+ PERCENT: "PERCENT";
17
+ FIXED: "FIXED";
18
+ }>>;
19
+ value: z.ZodOptional<z.ZodNumber>;
20
+ usageLimit: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodNumber>>>;
21
+ expiresAt: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodISODateTime>>>;
22
+ active: z.ZodOptional<z.ZodDefault<z.ZodOptional<z.ZodBoolean>>>;
23
+ formId: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
24
+ }, z.core.$strip>;
25
+ export type CreateDiscountCode = z.infer<typeof CreateDiscountCodeSchema>;
26
+ export type UpdateDiscountCode = z.infer<typeof UpdateDiscountCodeSchema>;
27
+ //# sourceMappingURL=discount-codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discount-codes.d.ts","sourceRoot":"","sources":["../src/discount-codes.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAmBtB,eAAO,MAAM,wBAAwB;;;;;;;;;;;iBAA6D,CAAC;AAEnG,eAAO,MAAM,wBAAwB;;;;;;;;;;iBAA0F,CAAC;AAEhI,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UpdateDiscountCodeSchema = exports.CreateDiscountCodeSchema = void 0;
4
+ // packages/contracts/src/discount-codes.ts
5
+ const zod_1 = require("zod");
6
+ const DiscountCodeShape = zod_1.z.object({
7
+ code: zod_1.z
8
+ .string()
9
+ .min(3)
10
+ .max(50)
11
+ .regex(/^[A-Z0-9_-]+$/, "Code must be uppercase letters, numbers, hyphens and underscores only"),
12
+ type: zod_1.z.enum(["PERCENT", "FIXED"]),
13
+ value: zod_1.z.number().positive(),
14
+ usageLimit: zod_1.z.number().int().positive().nullable().optional(),
15
+ expiresAt: zod_1.z.iso.datetime().nullable().optional(),
16
+ active: zod_1.z.boolean().optional().default(true),
17
+ formId: zod_1.z.string().uuid().nullable().optional(),
18
+ });
19
+ const percentWithinRange = (d) => d.type !== "PERCENT" || d.value === undefined || d.value <= 100;
20
+ const percentError = { message: "A percentage discount cannot exceed 100%", path: ["value"] };
21
+ exports.CreateDiscountCodeSchema = DiscountCodeShape.refine(percentWithinRange, percentError);
22
+ exports.UpdateDiscountCodeSchema = DiscountCodeShape.partial().omit({ code: true }).refine(percentWithinRange, percentError);
@@ -0,0 +1,21 @@
1
+ import { z } from "zod";
2
+ export declare const EmailTemplateTypeSchema: z.ZodEnum<{
3
+ QUOTE_READY: "QUOTE_READY";
4
+ QUOTE_REVISED: "QUOTE_REVISED";
5
+ QUOTE_WITHDRAWN: "QUOTE_WITHDRAWN";
6
+ QUOTE_RECOVERY: "QUOTE_RECOVERY";
7
+ INVOICE_READY: "INVOICE_READY";
8
+ }>;
9
+ export type EmailTemplateType = z.infer<typeof EmailTemplateTypeSchema>;
10
+ export declare const UpsertEmailTemplateSchema: z.ZodObject<{
11
+ subject: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
12
+ body: z.ZodString;
13
+ active: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
14
+ }, z.core.$strip>;
15
+ export type UpsertEmailTemplateDto = z.infer<typeof UpsertEmailTemplateSchema>;
16
+ export declare const PreviewEmailTemplateSchema: z.ZodObject<{
17
+ subject: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
18
+ body: z.ZodString;
19
+ }, z.core.$strip>;
20
+ export type PreviewEmailTemplateDto = z.infer<typeof PreviewEmailTemplateSchema>;
21
+ //# sourceMappingURL=email-templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-templates.d.ts","sourceRoot":"","sources":["../src/email-templates.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAGtB,eAAO,MAAM,uBAAuB;;;;;;EAAiG,CAAC;AAEtI,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAQxE,eAAO,MAAM,yBAAyB;;;;iBAA0B,CAAC;AACjE,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE/E,eAAO,MAAM,0BAA0B;;;iBAA+C,CAAC;AACvF,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PreviewEmailTemplateSchema = exports.UpsertEmailTemplateSchema = exports.EmailTemplateTypeSchema = void 0;
4
+ // packages/contracts/src/email-templates.ts
5
+ const zod_1 = require("zod");
6
+ const sanitize_js_1 = require("./sanitize.js");
7
+ exports.EmailTemplateTypeSchema = zod_1.z.enum(["QUOTE_READY", "QUOTE_REVISED", "QUOTE_WITHDRAWN", "QUOTE_RECOVERY", "INVOICE_READY"]);
8
+ const EmailTemplateBaseSchema = zod_1.z.object({
9
+ subject: (0, sanitize_js_1.safeText)(zod_1.z.string().min(1).max(200)),
10
+ body: zod_1.z.string().min(1).max(10000), // sanitized server-side, not in the schema
11
+ active: zod_1.z.boolean().optional().default(true),
12
+ });
13
+ exports.UpsertEmailTemplateSchema = EmailTemplateBaseSchema;
14
+ exports.PreviewEmailTemplateSchema = EmailTemplateBaseSchema.omit({ active: true });
@@ -0,0 +1,25 @@
1
+ import { z } from "zod";
2
+ export declare const CreateFollowUpRuleSchema: z.ZodObject<{
3
+ daysAfterSubmittedNoView: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
4
+ daysAfterViewedNoDecision: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
5
+ daysBeforeExpiry: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
6
+ templateSubject: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
7
+ templateBody: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
8
+ active: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
9
+ }, z.core.$strip>;
10
+ export declare const UpdateFollowUpRuleSchema: z.ZodObject<{
11
+ daysAfterSubmittedNoView: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodNumber>>>;
12
+ daysAfterViewedNoDecision: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodNumber>>>;
13
+ daysBeforeExpiry: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodNumber>>>;
14
+ templateSubject: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
15
+ templateBody: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
16
+ active: z.ZodOptional<z.ZodDefault<z.ZodOptional<z.ZodBoolean>>>;
17
+ }, z.core.$strip>;
18
+ export declare const PreviewFollowUpRuleSchema: z.ZodObject<{
19
+ templateSubject: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
20
+ templateBody: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
21
+ }, z.core.$strip>;
22
+ export type CreateFollowUpRuleDto = z.infer<typeof CreateFollowUpRuleSchema>;
23
+ export type UpdateFollowUpRuleDto = z.infer<typeof UpdateFollowUpRuleSchema>;
24
+ export type PreviewFollowUpRuleDto = z.infer<typeof PreviewFollowUpRuleSchema>;
25
+ //# sourceMappingURL=follow-up.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow-up.d.ts","sourceRoot":"","sources":["../src/follow-up.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAYtB,eAAO,MAAM,wBAAwB;;;;;;;iBAEnC,CAAC;AAGH,eAAO,MAAM,wBAAwB;;;;;;;iBAAmC,CAAC;AAEzE,eAAO,MAAM,yBAAyB;;;iBAA2E,CAAC;AAElH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC7E,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC7E,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PreviewFollowUpRuleSchema = exports.UpdateFollowUpRuleSchema = exports.CreateFollowUpRuleSchema = void 0;
4
+ // packages/contracts/src/follow-up.ts
5
+ const zod_1 = require("zod");
6
+ const sanitize_js_1 = require("./sanitize.js");
7
+ const FollowUpRuleBaseSchema = zod_1.z.object({
8
+ daysAfterSubmittedNoView: zod_1.z.number().int().positive().nullable().optional(),
9
+ daysAfterViewedNoDecision: zod_1.z.number().int().positive().nullable().optional(),
10
+ daysBeforeExpiry: zod_1.z.number().int().positive().nullable().optional(),
11
+ templateSubject: (0, sanitize_js_1.safeText)(zod_1.z.string().min(1).max(200)),
12
+ templateBody: (0, sanitize_js_1.safeText)(zod_1.z.string().min(1).max(5000)),
13
+ active: zod_1.z.boolean().optional().default(true),
14
+ });
15
+ exports.CreateFollowUpRuleSchema = FollowUpRuleBaseSchema.refine((data) => data.daysAfterSubmittedNoView !== undefined || data.daysAfterViewedNoDecision !== undefined || data.daysBeforeExpiry !== undefined, {
16
+ message: "At least one trigger type must be set",
17
+ });
18
+ // Partial is applied to the base schema before refinement
19
+ exports.UpdateFollowUpRuleSchema = FollowUpRuleBaseSchema.partial();
20
+ exports.PreviewFollowUpRuleSchema = FollowUpRuleBaseSchema.pick({ templateSubject: true, templateBody: true });
@@ -0,0 +1,75 @@
1
+ import { z } from "zod";
2
+ import type { FormConfig } from "@onabl/types/config";
3
+ export declare const FormConfigMetaSchema: z.ZodObject<{
4
+ name: z.ZodString;
5
+ slug: z.ZodString;
6
+ currency: z.ZodString;
7
+ currencySymbol: z.ZodString;
8
+ footerNote: z.ZodString;
9
+ quoteValidDays: z.ZodNumber;
10
+ declineReasons: z.ZodArray<z.ZodString>;
11
+ }, z.core.$loose>;
12
+ export declare const FormConfigSchema: z.ZodObject<{
13
+ version: z.ZodLiteral<"1.0">;
14
+ meta: z.ZodObject<{
15
+ name: z.ZodString;
16
+ slug: z.ZodString;
17
+ currency: z.ZodString;
18
+ currencySymbol: z.ZodString;
19
+ footerNote: z.ZodString;
20
+ quoteValidDays: z.ZodNumber;
21
+ declineReasons: z.ZodArray<z.ZodString>;
22
+ }, z.core.$loose>;
23
+ steps: z.ZodArray<z.ZodObject<{
24
+ id: z.ZodString;
25
+ label: z.ZodString;
26
+ title: z.ZodOptional<z.ZodString>;
27
+ }, z.core.$strip>>;
28
+ fields: z.ZodArray<z.ZodObject<{
29
+ id: z.ZodString;
30
+ key: z.ZodString;
31
+ type: z.ZodString;
32
+ label: z.ZodString;
33
+ }, z.core.$loose>>;
34
+ rules: z.ZodObject<{
35
+ phase1: z.ZodArray<z.ZodObject<{
36
+ id: z.ZodString;
37
+ type: z.ZodString;
38
+ label: z.ZodString;
39
+ showOnQuote: z.ZodBoolean;
40
+ }, z.core.$loose>>;
41
+ phase2: z.ZodArray<z.ZodObject<{
42
+ id: z.ZodString;
43
+ type: z.ZodString;
44
+ label: z.ZodString;
45
+ showOnQuote: z.ZodBoolean;
46
+ }, z.core.$loose>>;
47
+ phase3: z.ZodArray<z.ZodObject<{
48
+ id: z.ZodString;
49
+ type: z.ZodString;
50
+ label: z.ZodString;
51
+ showOnQuote: z.ZodBoolean;
52
+ }, z.core.$loose>>;
53
+ }, z.core.$strip>;
54
+ tokens: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>;
55
+ }, z.core.$loose>;
56
+ export declare const CreateFormSchema: z.ZodObject<{
57
+ name: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
58
+ slug: z.ZodOptional<z.ZodString>;
59
+ }, z.core.$strip>;
60
+ export declare const UpdateFormConfigSchema: z.ZodObject<{
61
+ config: z.ZodOptional<z.ZodCustom<FormConfig, FormConfig>>;
62
+ status: z.ZodOptional<z.ZodEnum<{
63
+ DRAFT: "DRAFT";
64
+ ACTIVE: "ACTIVE";
65
+ ARCHIVED: "ARCHIVED";
66
+ }>>;
67
+ autoInvoice: z.ZodOptional<z.ZodBoolean>;
68
+ depositPercent: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
69
+ depositDueDays: z.ZodOptional<z.ZodNumber>;
70
+ balanceDueDays: z.ZodOptional<z.ZodNumber>;
71
+ websiteBaseUrl: z.ZodOptional<z.ZodNullable<z.ZodString>>;
72
+ }, z.core.$strip>;
73
+ export type CreateForm = z.infer<typeof CreateFormSchema>;
74
+ export type UpdateFormConfig = z.infer<typeof UpdateFormConfigSchema>;
75
+ //# sourceMappingURL=forms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../src/forms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,qBAAqB,CAAC;AA4BpD,eAAO,MAAM,oBAAoB;;;;;;;;iBAUjB,CAAC;AAEjB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAab,CAAC;AAEjB,eAAO,MAAM,gBAAgB;;;iBAG3B,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;iBAWjC,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
package/dist/forms.js ADDED
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UpdateFormConfigSchema = exports.CreateFormSchema = exports.FormConfigSchema = exports.FormConfigMetaSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ const sanitize_js_1 = require("./sanitize.js");
6
+ const slugRegex = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
7
+ // Shape-level validation only — enough to catch a malformed field/rule (not an
8
+ // object, missing the identifiers the engine and editor key off of) without
9
+ // hand-duplicating every rule variant from @onabl/types as a strict Zod union,
10
+ // which would risk rejecting legitimately stored configs this schema hasn't
11
+ // been proven against.
12
+ const FormFieldSchema = zod_1.z
13
+ .object({
14
+ id: zod_1.z.string(),
15
+ key: zod_1.z.string(),
16
+ type: zod_1.z.string(),
17
+ label: zod_1.z.string(),
18
+ })
19
+ .passthrough();
20
+ const PricingRuleSchema = zod_1.z
21
+ .object({
22
+ id: zod_1.z.string(),
23
+ type: zod_1.z.string(),
24
+ label: zod_1.z.string(),
25
+ showOnQuote: zod_1.z.boolean(),
26
+ })
27
+ .passthrough();
28
+ exports.FormConfigMetaSchema = zod_1.z
29
+ .object({
30
+ name: zod_1.z.string(),
31
+ slug: zod_1.z.string(),
32
+ currency: zod_1.z.string(),
33
+ currencySymbol: zod_1.z.string(),
34
+ footerNote: zod_1.z.string(),
35
+ quoteValidDays: zod_1.z.number(),
36
+ declineReasons: zod_1.z.array(zod_1.z.string()),
37
+ })
38
+ .passthrough();
39
+ exports.FormConfigSchema = zod_1.z
40
+ .object({
41
+ version: zod_1.z.literal("1.0"),
42
+ meta: exports.FormConfigMetaSchema,
43
+ steps: zod_1.z.array(zod_1.z.object({ id: zod_1.z.string(), label: zod_1.z.string(), title: zod_1.z.string().optional() })),
44
+ fields: zod_1.z.array(FormFieldSchema),
45
+ rules: zod_1.z.object({
46
+ phase1: zod_1.z.array(PricingRuleSchema),
47
+ phase2: zod_1.z.array(PricingRuleSchema),
48
+ phase3: zod_1.z.array(PricingRuleSchema),
49
+ }),
50
+ tokens: zod_1.z.record(zod_1.z.string(), zod_1.z.union([zod_1.z.number(), zod_1.z.string()])),
51
+ })
52
+ .passthrough();
53
+ exports.CreateFormSchema = zod_1.z.object({
54
+ name: (0, sanitize_js_1.safeText)(zod_1.z.string().min(1).max(100)),
55
+ slug: zod_1.z.string().min(3).max(60).regex(slugRegex, "Slug must be lowercase letters, numbers and hyphens only").optional(),
56
+ });
57
+ exports.UpdateFormConfigSchema = zod_1.z.object({
58
+ config: zod_1.z.custom().optional(),
59
+ status: zod_1.z.enum(["DRAFT", "ACTIVE", "ARCHIVED"]).optional(),
60
+ autoInvoice: zod_1.z.boolean().optional(),
61
+ depositPercent: zod_1.z.number().int().min(1).max(99).nullable().optional(),
62
+ depositDueDays: zod_1.z.number().int().min(1).max(365).optional(),
63
+ balanceDueDays: zod_1.z.number().int().min(1).max(365).optional(),
64
+ // When set, customer quote/invoice emails link to this domain (client.com/quote/:uuid,
65
+ // client.com/invoice/:uuid) instead of Onabl's hosted pages. Pass null to clear back to
66
+ // Onabl-hosted, matching the depositPercent nullable-clear pattern above.
67
+ websiteBaseUrl: zod_1.z.string().url().nullable().optional(),
68
+ });
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+ export declare const CreateTeamInviteSchema: z.ZodObject<{
3
+ email: z.ZodString;
4
+ role: z.ZodDefault<z.ZodEnum<{
5
+ OWNER: "OWNER";
6
+ ADMIN: "ADMIN";
7
+ MEMBER: "MEMBER";
8
+ }>>;
9
+ }, z.core.$strip>;
10
+ export declare const AcceptTeamInviteSchema: z.ZodObject<{
11
+ token: z.ZodString;
12
+ name: z.ZodString;
13
+ }, z.core.$strip>;
14
+ export declare const ChangeMemberRoleSchema: z.ZodObject<{
15
+ role: z.ZodEnum<{
16
+ OWNER: "OWNER";
17
+ ADMIN: "ADMIN";
18
+ MEMBER: "MEMBER";
19
+ }>;
20
+ }, z.core.$strip>;
21
+ export type CreateTeamInvite = z.infer<typeof CreateTeamInviteSchema>;
22
+ export type AcceptTeamInvite = z.infer<typeof AcceptTeamInviteSchema>;
23
+ export type ChangeMemberRole = z.infer<typeof ChangeMemberRoleSchema>;
24
+ //# sourceMappingURL=invites.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invites.d.ts","sourceRoot":"","sources":["../src/invites.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,eAAO,MAAM,sBAAsB;;;;;;;iBAGjC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;iBAGjC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;iBAEjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ChangeMemberRoleSchema = exports.AcceptTeamInviteSchema = exports.CreateTeamInviteSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ exports.CreateTeamInviteSchema = zod_1.z.object({
6
+ email: zod_1.z.string().email(),
7
+ role: zod_1.z.enum(["OWNER", "ADMIN", "MEMBER"]).default("MEMBER"),
8
+ });
9
+ exports.AcceptTeamInviteSchema = zod_1.z.object({
10
+ token: zod_1.z.string().min(1),
11
+ name: zod_1.z.string().min(1).max(120),
12
+ });
13
+ exports.ChangeMemberRoleSchema = zod_1.z.object({
14
+ role: zod_1.z.enum(["OWNER", "ADMIN", "MEMBER"]),
15
+ });
@@ -0,0 +1,296 @@
1
+ import { z } from "zod";
2
+ import type { Condition } from "@onabl/types/config";
3
+ export declare const PublicFormFieldSchema: z.ZodObject<{
4
+ id: z.ZodString;
5
+ key: z.ZodString;
6
+ type: z.ZodEnum<{
7
+ number: "number";
8
+ date: "date";
9
+ text: "text";
10
+ radio: "radio";
11
+ select: "select";
12
+ toggle: "toggle";
13
+ multicheck: "multicheck";
14
+ hidden: "hidden";
15
+ }>;
16
+ label: z.ZodString;
17
+ stepId: z.ZodNullable<z.ZodString>;
18
+ required: z.ZodBoolean;
19
+ defaultValue: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>;
20
+ placeholder: z.ZodOptional<z.ZodString>;
21
+ description: z.ZodOptional<z.ZodString>;
22
+ min: z.ZodOptional<z.ZodNumber>;
23
+ max: z.ZodOptional<z.ZodNumber>;
24
+ options: z.ZodOptional<z.ZodArray<z.ZodObject<{
25
+ value: z.ZodString;
26
+ label: z.ZodString;
27
+ description: z.ZodOptional<z.ZodString>;
28
+ }, z.core.$loose>>>;
29
+ condition: z.ZodOptional<z.ZodCustom<Condition, Condition>>;
30
+ scopeCondition: z.ZodOptional<z.ZodCustom<Condition, Condition>>;
31
+ }, z.core.$loose>;
32
+ export declare const PublicFormConfigSchema: z.ZodObject<{
33
+ version: z.ZodLiteral<"1.0">;
34
+ meta: z.ZodObject<{
35
+ name: z.ZodString;
36
+ slug: z.ZodString;
37
+ currency: z.ZodString;
38
+ currencySymbol: z.ZodString;
39
+ footerNote: z.ZodString;
40
+ quoteValidDays: z.ZodNumber;
41
+ declineReasons: z.ZodArray<z.ZodString>;
42
+ intro: z.ZodOptional<z.ZodObject<{
43
+ headline: z.ZodString;
44
+ body: z.ZodOptional<z.ZodString>;
45
+ ctaLabel: z.ZodOptional<z.ZodString>;
46
+ backgroundImageUrl: z.ZodOptional<z.ZodString>;
47
+ }, z.core.$loose>>;
48
+ }, z.core.$loose>;
49
+ steps: z.ZodArray<z.ZodObject<{
50
+ id: z.ZodString;
51
+ label: z.ZodString;
52
+ title: z.ZodOptional<z.ZodString>;
53
+ }, z.core.$loose>>;
54
+ fields: z.ZodArray<z.ZodObject<{
55
+ id: z.ZodString;
56
+ key: z.ZodString;
57
+ type: z.ZodEnum<{
58
+ number: "number";
59
+ date: "date";
60
+ text: "text";
61
+ radio: "radio";
62
+ select: "select";
63
+ toggle: "toggle";
64
+ multicheck: "multicheck";
65
+ hidden: "hidden";
66
+ }>;
67
+ label: z.ZodString;
68
+ stepId: z.ZodNullable<z.ZodString>;
69
+ required: z.ZodBoolean;
70
+ defaultValue: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>;
71
+ placeholder: z.ZodOptional<z.ZodString>;
72
+ description: z.ZodOptional<z.ZodString>;
73
+ min: z.ZodOptional<z.ZodNumber>;
74
+ max: z.ZodOptional<z.ZodNumber>;
75
+ options: z.ZodOptional<z.ZodArray<z.ZodObject<{
76
+ value: z.ZodString;
77
+ label: z.ZodString;
78
+ description: z.ZodOptional<z.ZodString>;
79
+ }, z.core.$loose>>>;
80
+ condition: z.ZodOptional<z.ZodCustom<Condition, Condition>>;
81
+ scopeCondition: z.ZodOptional<z.ZodCustom<Condition, Condition>>;
82
+ }, z.core.$loose>>;
83
+ }, z.core.$loose>;
84
+ export declare const PublicFormSchema: z.ZodObject<{
85
+ name: z.ZodString;
86
+ slug: z.ZodString;
87
+ currency: z.ZodString;
88
+ currencySymbol: z.ZodString;
89
+ footerNote: z.ZodString;
90
+ quoteValidDays: z.ZodNumber;
91
+ declineReasons: z.ZodArray<z.ZodString>;
92
+ hasActiveDiscountCodes: z.ZodBoolean;
93
+ brandPrimaryColor: z.ZodNullable<z.ZodString>;
94
+ brandSecondaryColor: z.ZodNullable<z.ZodString>;
95
+ brandAccentColor: z.ZodNullable<z.ZodString>;
96
+ brandBackgroundColor: z.ZodNullable<z.ZodString>;
97
+ brandTextColor: z.ZodNullable<z.ZodString>;
98
+ logoUrl: z.ZodNullable<z.ZodString>;
99
+ introBgUrl: z.ZodNullable<z.ZodString>;
100
+ businessName: z.ZodString;
101
+ customerConsentText: z.ZodNullable<z.ZodString>;
102
+ privacyPolicyUrl: z.ZodNullable<z.ZodString>;
103
+ config: z.ZodObject<{
104
+ version: z.ZodLiteral<"1.0">;
105
+ meta: z.ZodObject<{
106
+ name: z.ZodString;
107
+ slug: z.ZodString;
108
+ currency: z.ZodString;
109
+ currencySymbol: z.ZodString;
110
+ footerNote: z.ZodString;
111
+ quoteValidDays: z.ZodNumber;
112
+ declineReasons: z.ZodArray<z.ZodString>;
113
+ intro: z.ZodOptional<z.ZodObject<{
114
+ headline: z.ZodString;
115
+ body: z.ZodOptional<z.ZodString>;
116
+ ctaLabel: z.ZodOptional<z.ZodString>;
117
+ backgroundImageUrl: z.ZodOptional<z.ZodString>;
118
+ }, z.core.$loose>>;
119
+ }, z.core.$loose>;
120
+ steps: z.ZodArray<z.ZodObject<{
121
+ id: z.ZodString;
122
+ label: z.ZodString;
123
+ title: z.ZodOptional<z.ZodString>;
124
+ }, z.core.$loose>>;
125
+ fields: z.ZodArray<z.ZodObject<{
126
+ id: z.ZodString;
127
+ key: z.ZodString;
128
+ type: z.ZodEnum<{
129
+ number: "number";
130
+ date: "date";
131
+ text: "text";
132
+ radio: "radio";
133
+ select: "select";
134
+ toggle: "toggle";
135
+ multicheck: "multicheck";
136
+ hidden: "hidden";
137
+ }>;
138
+ label: z.ZodString;
139
+ stepId: z.ZodNullable<z.ZodString>;
140
+ required: z.ZodBoolean;
141
+ defaultValue: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>;
142
+ placeholder: z.ZodOptional<z.ZodString>;
143
+ description: z.ZodOptional<z.ZodString>;
144
+ min: z.ZodOptional<z.ZodNumber>;
145
+ max: z.ZodOptional<z.ZodNumber>;
146
+ options: z.ZodOptional<z.ZodArray<z.ZodObject<{
147
+ value: z.ZodString;
148
+ label: z.ZodString;
149
+ description: z.ZodOptional<z.ZodString>;
150
+ }, z.core.$loose>>>;
151
+ condition: z.ZodOptional<z.ZodCustom<Condition, Condition>>;
152
+ scopeCondition: z.ZodOptional<z.ZodCustom<Condition, Condition>>;
153
+ }, z.core.$loose>>;
154
+ }, z.core.$loose>;
155
+ }, z.core.$loose>;
156
+ export declare const ValidateCodeResponseSchema: z.ZodUnion<readonly [z.ZodObject<{
157
+ valid: z.ZodLiteral<false>;
158
+ error: z.ZodString;
159
+ }, z.core.$strip>, z.ZodObject<{
160
+ valid: z.ZodLiteral<true>;
161
+ label: z.ZodString;
162
+ }, z.core.$strip>]>;
163
+ export declare const SubmissionCreateResponseSchema: z.ZodObject<{
164
+ uuid: z.ZodString;
165
+ reference: z.ZodString;
166
+ token: z.ZodString;
167
+ }, z.core.$strip>;
168
+ export declare const QuoteSchema: z.ZodObject<{
169
+ uuid: z.ZodString;
170
+ reference: z.ZodString;
171
+ status: z.ZodString;
172
+ lineItems: z.ZodArray<z.ZodObject<{}, z.core.$loose>>;
173
+ phase1Total: z.ZodString;
174
+ phase2Total: z.ZodString;
175
+ finalTotal: z.ZodString;
176
+ codeDiscountLabel: z.ZodNullable<z.ZodString>;
177
+ codeDiscountType: z.ZodNullable<z.ZodEnum<{
178
+ PERCENT: "PERCENT";
179
+ FIXED: "FIXED";
180
+ }>>;
181
+ codeDiscountValue: z.ZodNullable<z.ZodString>;
182
+ manualDiscountType: z.ZodNullable<z.ZodEnum<{
183
+ PERCENT: "PERCENT";
184
+ FIXED: "FIXED";
185
+ }>>;
186
+ manualDiscountValue: z.ZodNullable<z.ZodString>;
187
+ totalAfterDiscount: z.ZodString;
188
+ validUntil: z.ZodString;
189
+ viewedAt: z.ZodNullable<z.ZodString>;
190
+ acceptedAt: z.ZodNullable<z.ZodString>;
191
+ declinedAt: z.ZodNullable<z.ZodString>;
192
+ declineReason: z.ZodNullable<z.ZodString>;
193
+ declineNote: z.ZodNullable<z.ZodString>;
194
+ withdrawnAt: z.ZodNullable<z.ZodString>;
195
+ withdrawNote: z.ZodNullable<z.ZodString>;
196
+ overrideTotal: z.ZodNullable<z.ZodString>;
197
+ revisedLineItems: z.ZodNullable<z.ZodArray<z.ZodObject<{}, z.core.$loose>>>;
198
+ revisedTotal: z.ZodNullable<z.ZodString>;
199
+ tenantNote: z.ZodNullable<z.ZodString>;
200
+ revisionSentAt: z.ZodNullable<z.ZodString>;
201
+ formName: z.ZodString;
202
+ tenantName: z.ZodString;
203
+ logoUrl: z.ZodNullable<z.ZodString>;
204
+ currency: z.ZodString;
205
+ currencySymbol: z.ZodString;
206
+ footerNote: z.ZodOptional<z.ZodString>;
207
+ declineReasons: z.ZodArray<z.ZodString>;
208
+ displayGroups: z.ZodArray<z.ZodObject<{}, z.core.$loose>>;
209
+ scopeLabel: z.ZodNullable<z.ZodString>;
210
+ projectDescription: z.ZodNullable<z.ZodString>;
211
+ contact: z.ZodNullable<z.ZodObject<{
212
+ name: z.ZodNullable<z.ZodString>;
213
+ email: z.ZodString;
214
+ }, z.core.$strip>>;
215
+ isPreview: z.ZodBoolean;
216
+ }, z.core.$loose>;
217
+ export declare const QuoteAcceptResponseSchema: z.ZodObject<{
218
+ accepted: z.ZodLiteral<true>;
219
+ }, z.core.$strip>;
220
+ export declare const QuoteDeclineResponseSchema: z.ZodObject<{
221
+ declined: z.ZodLiteral<true>;
222
+ }, z.core.$strip>;
223
+ export declare const InvoiceSchema: z.ZodObject<{
224
+ uuid: z.ZodString;
225
+ invoiceNumber: z.ZodString;
226
+ totalAmount: z.ZodString;
227
+ dueDate: z.ZodString;
228
+ issueDate: z.ZodString;
229
+ paidAt: z.ZodNullable<z.ZodString>;
230
+ status: z.ZodEnum<{
231
+ UNPAID: "UNPAID";
232
+ POP_UPLOADED: "POP_UPLOADED";
233
+ PAID: "PAID";
234
+ }>;
235
+ depositPercent: z.ZodNullable<z.ZodNumber>;
236
+ depositAmount: z.ZodNullable<z.ZodString>;
237
+ balanceAmount: z.ZodNullable<z.ZodString>;
238
+ depositDueDate: z.ZodNullable<z.ZodString>;
239
+ depositPaidAt: z.ZodNullable<z.ZodString>;
240
+ depositPopUploadedAt: z.ZodNullable<z.ZodString>;
241
+ balanceDueDate: z.ZodNullable<z.ZodString>;
242
+ popUploadedAt: z.ZodNullable<z.ZodString>;
243
+ lineItems: z.ZodArray<z.ZodObject<{}, z.core.$loose>>;
244
+ codeDiscountLabel: z.ZodNullable<z.ZodString>;
245
+ codeDiscountType: z.ZodNullable<z.ZodEnum<{
246
+ PERCENT: "PERCENT";
247
+ FIXED: "FIXED";
248
+ }>>;
249
+ codeDiscountValue: z.ZodNullable<z.ZodString>;
250
+ codeDiscountAmount: z.ZodOptional<z.ZodString>;
251
+ manualDiscountType: z.ZodNullable<z.ZodEnum<{
252
+ PERCENT: "PERCENT";
253
+ FIXED: "FIXED";
254
+ }>>;
255
+ manualDiscountValue: z.ZodNullable<z.ZodString>;
256
+ manualDiscountAmount: z.ZodOptional<z.ZodString>;
257
+ finalTotal: z.ZodString;
258
+ tenantName: z.ZodString;
259
+ registrationNumber: z.ZodNullable<z.ZodString>;
260
+ vatNumber: z.ZodNullable<z.ZodString>;
261
+ bankingDetails: z.ZodNullable<z.ZodString>;
262
+ logoUrl: z.ZodNullable<z.ZodString>;
263
+ invoicePaymentTermDays: z.ZodNumber;
264
+ formName: z.ZodString;
265
+ quoteReference: z.ZodString;
266
+ quoteUuid: z.ZodString;
267
+ currencySymbol: z.ZodString;
268
+ currency: z.ZodString;
269
+ displayGroups: z.ZodArray<z.ZodObject<{}, z.core.$loose>>;
270
+ customerName: z.ZodNullable<z.ZodString>;
271
+ customerEmail: z.ZodNullable<z.ZodString>;
272
+ scopeLabel: z.ZodNullable<z.ZodString>;
273
+ projectDescription: z.ZodNullable<z.ZodString>;
274
+ isPreview: z.ZodBoolean;
275
+ }, z.core.$loose>;
276
+ export declare const PopUrlUpdateResponseSchema: z.ZodObject<{
277
+ saved: z.ZodLiteral<true>;
278
+ }, z.core.$strip>;
279
+ export declare const PresignResponseSchema: z.ZodObject<{
280
+ presignedUrl: z.ZodString;
281
+ key: z.ZodString;
282
+ publicUrl: z.ZodString;
283
+ expiresIn: z.ZodNumber;
284
+ }, z.core.$strip>;
285
+ export type PublicFormField = z.infer<typeof PublicFormFieldSchema>;
286
+ export type PublicFormConfig = z.infer<typeof PublicFormConfigSchema>;
287
+ export type PublicForm = z.infer<typeof PublicFormSchema>;
288
+ export type ValidateCodeResponse = z.infer<typeof ValidateCodeResponseSchema>;
289
+ export type SubmissionCreateResponse = z.infer<typeof SubmissionCreateResponseSchema>;
290
+ export type Quote = z.infer<typeof QuoteSchema>;
291
+ export type QuoteAcceptResponse = z.infer<typeof QuoteAcceptResponseSchema>;
292
+ export type QuoteDeclineResponse = z.infer<typeof QuoteDeclineResponseSchema>;
293
+ export type Invoice = z.infer<typeof InvoiceSchema>;
294
+ export type PopUrlUpdateResponse = z.infer<typeof PopUrlUpdateResponseSchema>;
295
+ export type PresignResponse = z.infer<typeof PresignResponseSchema>;
296
+ //# sourceMappingURL=public-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,EAAC,SAAS,EAAY,MAAM,qBAAqB,CAAC;AAkC9D,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiBlB,CAAC;AAEjB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0BnB,CAAC;AAEjB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsBb,CAAC;AAIjB,eAAO,MAAM,0BAA0B;;;;;;mBAA2H,CAAC;AAInK,eAAO,MAAM,8BAA8B;;;;iBAIzC,CAAC;AAIH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8CR,CAAC;AAEjB,eAAO,MAAM,yBAAyB;;iBAAwC,CAAC;AAC/E,eAAO,MAAM,0BAA0B;;iBAAwC,CAAC;AAIhF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8CV,CAAC;AAEjB,eAAO,MAAM,0BAA0B;;iBAAqC,CAAC;AAI7E,eAAO,MAAM,qBAAqB;;;;;iBAKhC,CAAC;AAIH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AACtF,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAChD,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AACpD,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PresignResponseSchema = exports.PopUrlUpdateResponseSchema = exports.InvoiceSchema = exports.QuoteDeclineResponseSchema = exports.QuoteAcceptResponseSchema = exports.QuoteSchema = exports.SubmissionCreateResponseSchema = exports.ValidateCodeResponseSchema = exports.PublicFormSchema = exports.PublicFormConfigSchema = exports.PublicFormFieldSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ const FieldTypeSchema = zod_1.z.enum(["number", "text", "radio", "select", "toggle", "multicheck", "hidden", "date"]);
6
+ /**
7
+ * Response schemas for onabl's public-facing API — the routes reachable via
8
+ * ApiKeyGuard or RequireCustomerToken, i.e. what an external integrator (the
9
+ * SDK, a hand-built client, visualcreme) actually calls.
10
+ *
11
+ * These are the "2026-09-01" baseline shapes, hand-verified against the live
12
+ * service code — see docs/API-BASELINE-2026-09-01.md, which is the source of
13
+ * truth this file mirrors. A future response-version delta (§14.2.3) adds a
14
+ * new schema here rather than editing these in place.
15
+ *
16
+ * Loosely typed with `.passthrough()` where the underlying shape is already
17
+ * validated elsewhere (line items, display groups, form field conditions) —
18
+ * matching this package's existing convention in forms.ts, not a new one.
19
+ */
20
+ // ─── Shared sub-shapes ──────────────────────────────────────────────────────
21
+ // Typed as the real @onabl/types Condition (not derived from the shape below)
22
+ // so downstream code — @onabl/js's form-state.ts in particular — can pass a
23
+ // parsed field.condition straight into @onabl/engine's evaluateCondition()
24
+ // without a cast. Validated loosely at runtime (any object shape passes);
25
+ // this only needs to be right by construction, since the API already built
26
+ // it from a real Condition server-side.
27
+ const ConditionSchema = zod_1.z.custom((val) => typeof val === "object" && val !== null);
28
+ const LineItemSchema = zod_1.z.object({}).passthrough();
29
+ const DisplayGroupSchema = zod_1.z.object({}).passthrough();
30
+ // ─── GET /forms/q/:handle(/:slug) ───────────────────────────────────────────
31
+ exports.PublicFormFieldSchema = zod_1.z
32
+ .object({
33
+ id: zod_1.z.string(),
34
+ key: zod_1.z.string(),
35
+ type: FieldTypeSchema,
36
+ label: zod_1.z.string(),
37
+ stepId: zod_1.z.string().nullable(),
38
+ required: zod_1.z.boolean(),
39
+ defaultValue: zod_1.z.union([zod_1.z.string(), zod_1.z.number(), zod_1.z.boolean(), zod_1.z.null()]),
40
+ placeholder: zod_1.z.string().optional(),
41
+ description: zod_1.z.string().optional(),
42
+ min: zod_1.z.number().optional(),
43
+ max: zod_1.z.number().optional(),
44
+ options: zod_1.z.array(zod_1.z.object({ value: zod_1.z.string(), label: zod_1.z.string(), description: zod_1.z.string().optional() }).passthrough()).optional(),
45
+ condition: ConditionSchema.optional(),
46
+ scopeCondition: ConditionSchema.optional(),
47
+ })
48
+ .passthrough();
49
+ exports.PublicFormConfigSchema = zod_1.z
50
+ .object({
51
+ version: zod_1.z.literal("1.0"),
52
+ meta: zod_1.z
53
+ .object({
54
+ name: zod_1.z.string(),
55
+ slug: zod_1.z.string(),
56
+ currency: zod_1.z.string(),
57
+ currencySymbol: zod_1.z.string(),
58
+ footerNote: zod_1.z.string(),
59
+ quoteValidDays: zod_1.z.number(),
60
+ declineReasons: zod_1.z.array(zod_1.z.string()),
61
+ intro: zod_1.z
62
+ .object({
63
+ headline: zod_1.z.string(),
64
+ body: zod_1.z.string().optional(),
65
+ ctaLabel: zod_1.z.string().optional(),
66
+ backgroundImageUrl: zod_1.z.string().optional(),
67
+ })
68
+ .passthrough()
69
+ .optional(),
70
+ })
71
+ .passthrough(),
72
+ steps: zod_1.z.array(zod_1.z.object({ id: zod_1.z.string(), label: zod_1.z.string(), title: zod_1.z.string().optional() }).passthrough()),
73
+ fields: zod_1.z.array(exports.PublicFormFieldSchema),
74
+ })
75
+ .passthrough();
76
+ exports.PublicFormSchema = zod_1.z
77
+ .object({
78
+ name: zod_1.z.string(),
79
+ slug: zod_1.z.string(),
80
+ currency: zod_1.z.string(),
81
+ currencySymbol: zod_1.z.string(),
82
+ footerNote: zod_1.z.string(),
83
+ quoteValidDays: zod_1.z.number(),
84
+ declineReasons: zod_1.z.array(zod_1.z.string()),
85
+ hasActiveDiscountCodes: zod_1.z.boolean(),
86
+ brandPrimaryColor: zod_1.z.string().nullable(),
87
+ brandSecondaryColor: zod_1.z.string().nullable(),
88
+ brandAccentColor: zod_1.z.string().nullable(),
89
+ brandBackgroundColor: zod_1.z.string().nullable(),
90
+ brandTextColor: zod_1.z.string().nullable(),
91
+ logoUrl: zod_1.z.string().nullable(),
92
+ introBgUrl: zod_1.z.string().nullable(),
93
+ businessName: zod_1.z.string(),
94
+ customerConsentText: zod_1.z.string().nullable(),
95
+ privacyPolicyUrl: zod_1.z.string().nullable(),
96
+ config: exports.PublicFormConfigSchema,
97
+ })
98
+ .passthrough();
99
+ // ─── GET /forms/q/:handle/:slug/validate-code ───────────────────────────────
100
+ exports.ValidateCodeResponseSchema = zod_1.z.union([zod_1.z.object({ valid: zod_1.z.literal(false), error: zod_1.z.string() }), zod_1.z.object({ valid: zod_1.z.literal(true), label: zod_1.z.string() })]);
101
+ // ─── POST /submissions/q/:handle(/:slug) ────────────────────────────────────
102
+ exports.SubmissionCreateResponseSchema = zod_1.z.object({
103
+ uuid: zod_1.z.string(),
104
+ reference: zod_1.z.string(),
105
+ token: zod_1.z.string(),
106
+ });
107
+ // ─── GET /quotes/:uuid ───────────────────────────────────────────────────────
108
+ exports.QuoteSchema = zod_1.z
109
+ .object({
110
+ uuid: zod_1.z.string(),
111
+ reference: zod_1.z.string(),
112
+ status: zod_1.z.string(),
113
+ lineItems: zod_1.z.array(LineItemSchema),
114
+ phase1Total: zod_1.z.string(),
115
+ phase2Total: zod_1.z.string(),
116
+ finalTotal: zod_1.z.string(),
117
+ codeDiscountLabel: zod_1.z.string().nullable(),
118
+ codeDiscountType: zod_1.z.enum(["PERCENT", "FIXED"]).nullable(),
119
+ codeDiscountValue: zod_1.z.string().nullable(),
120
+ manualDiscountType: zod_1.z.enum(["PERCENT", "FIXED"]).nullable(),
121
+ manualDiscountValue: zod_1.z.string().nullable(),
122
+ totalAfterDiscount: zod_1.z.string(),
123
+ validUntil: zod_1.z.string(),
124
+ viewedAt: zod_1.z.string().nullable(),
125
+ acceptedAt: zod_1.z.string().nullable(),
126
+ declinedAt: zod_1.z.string().nullable(),
127
+ declineReason: zod_1.z.string().nullable(),
128
+ declineNote: zod_1.z.string().nullable(),
129
+ withdrawnAt: zod_1.z.string().nullable(),
130
+ withdrawNote: zod_1.z.string().nullable(),
131
+ overrideTotal: zod_1.z.string().nullable(),
132
+ // Read via `(quote as any)` server-side as of the 2026-09-01 baseline —
133
+ // the Prisma client is ahead of/behind a migration. First candidates for
134
+ // a version delta if that gets fixed. See docs/API-BASELINE-2026-09-01.md.
135
+ revisedLineItems: zod_1.z.array(LineItemSchema).nullable(),
136
+ revisedTotal: zod_1.z.string().nullable(),
137
+ tenantNote: zod_1.z.string().nullable(),
138
+ revisionSentAt: zod_1.z.string().nullable(),
139
+ formName: zod_1.z.string(),
140
+ tenantName: zod_1.z.string(),
141
+ logoUrl: zod_1.z.string().nullable(),
142
+ currency: zod_1.z.string(),
143
+ currencySymbol: zod_1.z.string(),
144
+ footerNote: zod_1.z.string().optional(),
145
+ declineReasons: zod_1.z.array(zod_1.z.string()),
146
+ displayGroups: zod_1.z.array(DisplayGroupSchema),
147
+ scopeLabel: zod_1.z.string().nullable(),
148
+ projectDescription: zod_1.z.string().nullable(),
149
+ contact: zod_1.z.object({ name: zod_1.z.string().nullable(), email: zod_1.z.string() }).nullable(),
150
+ // Appended by the controller, not the service — easy to miss if types are
151
+ // extracted from the service layer alone. See baseline doc.
152
+ isPreview: zod_1.z.boolean(),
153
+ })
154
+ .passthrough();
155
+ exports.QuoteAcceptResponseSchema = zod_1.z.object({ accepted: zod_1.z.literal(true) });
156
+ exports.QuoteDeclineResponseSchema = zod_1.z.object({ declined: zod_1.z.literal(true) });
157
+ // ─── GET /invoices/:uuid ─────────────────────────────────────────────────────
158
+ exports.InvoiceSchema = zod_1.z
159
+ .object({
160
+ uuid: zod_1.z.string(),
161
+ invoiceNumber: zod_1.z.string(),
162
+ totalAmount: zod_1.z.string(),
163
+ dueDate: zod_1.z.string(),
164
+ issueDate: zod_1.z.string(),
165
+ paidAt: zod_1.z.string().nullable(),
166
+ status: zod_1.z.enum(["UNPAID", "POP_UPLOADED", "PAID"]),
167
+ depositPercent: zod_1.z.number().nullable(),
168
+ depositAmount: zod_1.z.string().nullable(),
169
+ balanceAmount: zod_1.z.string().nullable(),
170
+ depositDueDate: zod_1.z.string().nullable(),
171
+ depositPaidAt: zod_1.z.string().nullable(),
172
+ depositPopUploadedAt: zod_1.z.string().nullable(),
173
+ balanceDueDate: zod_1.z.string().nullable(),
174
+ popUploadedAt: zod_1.z.string().nullable(),
175
+ lineItems: zod_1.z.array(LineItemSchema),
176
+ codeDiscountLabel: zod_1.z.string().nullable(),
177
+ codeDiscountType: zod_1.z.enum(["PERCENT", "FIXED"]).nullable(),
178
+ codeDiscountValue: zod_1.z.string().nullable(),
179
+ // Computed server-side, not stored — undefined (not null) when the
180
+ // corresponding discount type isn't set. See baseline doc.
181
+ codeDiscountAmount: zod_1.z.string().optional(),
182
+ manualDiscountType: zod_1.z.enum(["PERCENT", "FIXED"]).nullable(),
183
+ manualDiscountValue: zod_1.z.string().nullable(),
184
+ manualDiscountAmount: zod_1.z.string().optional(),
185
+ finalTotal: zod_1.z.string(),
186
+ tenantName: zod_1.z.string(),
187
+ registrationNumber: zod_1.z.string().nullable(),
188
+ vatNumber: zod_1.z.string().nullable(),
189
+ bankingDetails: zod_1.z.string().nullable(),
190
+ logoUrl: zod_1.z.string().nullable(),
191
+ invoicePaymentTermDays: zod_1.z.number(),
192
+ formName: zod_1.z.string(),
193
+ quoteReference: zod_1.z.string(),
194
+ quoteUuid: zod_1.z.string(),
195
+ currencySymbol: zod_1.z.string(),
196
+ currency: zod_1.z.string(),
197
+ displayGroups: zod_1.z.array(DisplayGroupSchema),
198
+ customerName: zod_1.z.string().nullable(),
199
+ customerEmail: zod_1.z.string().nullable(),
200
+ scopeLabel: zod_1.z.string().nullable(),
201
+ projectDescription: zod_1.z.string().nullable(),
202
+ isPreview: zod_1.z.boolean(),
203
+ })
204
+ .passthrough();
205
+ exports.PopUrlUpdateResponseSchema = zod_1.z.object({ saved: zod_1.z.literal(true) });
206
+ // ─── POST /storage/presign/public ───────────────────────────────────────────
207
+ exports.PresignResponseSchema = zod_1.z.object({
208
+ presignedUrl: zod_1.z.string(),
209
+ key: zod_1.z.string(),
210
+ publicUrl: zod_1.z.string(),
211
+ expiresIn: zod_1.z.number(),
212
+ });
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+ export declare const safeText: (base: z.ZodString) => z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
3
+ //# sourceMappingURL=sanitize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAItB,eAAO,MAAM,QAAQ,GAAI,MAAM,CAAC,CAAC,SAAS,2DAC6E,CAAC"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.safeText = void 0;
4
+ // Strips HTML/XML tags from user-supplied text before it is stored.
5
+ // Applied to fields that are rendered in emails or PDFs.
6
+ const safeText = (base) => base.trim().transform((s) => s.replace(/<[^>]*>/g, "").replace(/&(?:lt|gt|amp|quot|apos|#\d+|#x[\da-fA-F]+);/gi, ""));
7
+ exports.safeText = safeText;
@@ -0,0 +1,77 @@
1
+ import { z } from "zod";
2
+ export declare const SubmissionPayloadSchema: z.ZodObject<{
3
+ answers: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodArray<z.ZodString>]>>;
4
+ discountCode: z.ZodOptional<z.ZodString>;
5
+ consentGiven: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
6
+ }, z.core.$strip>;
7
+ export declare const ManualDiscountSchema: z.ZodObject<{
8
+ type: z.ZodNullable<z.ZodEnum<{
9
+ PERCENT: "PERCENT";
10
+ FIXED: "FIXED";
11
+ }>>;
12
+ value: z.ZodNullable<z.ZodNumber>;
13
+ note: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
14
+ }, z.core.$strip>;
15
+ export declare const OverrideSchema: z.ZodObject<{
16
+ total: z.ZodNumber;
17
+ note: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
18
+ }, z.core.$strip>;
19
+ export declare const WithdrawSchema: z.ZodObject<{
20
+ note: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
21
+ }, z.core.$strip>;
22
+ export declare const DeclineQuoteSchema: z.ZodObject<{
23
+ declineReason: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
24
+ declineNote: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
25
+ }, z.core.$strip>;
26
+ export declare const AnalyticsPeriodQuerySchema: z.ZodObject<{
27
+ period: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
28
+ "7d": "7d";
29
+ "30d": "30d";
30
+ "90d": "90d";
31
+ all: "all";
32
+ }>>>;
33
+ }, z.core.$strip>;
34
+ export declare const SendRevisionSchema: z.ZodObject<{
35
+ revisedLineItems: z.ZodArray<z.ZodObject<{
36
+ label: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
37
+ amount: z.ZodNumber;
38
+ showOnQuote: z.ZodBoolean;
39
+ }, z.core.$strip>>;
40
+ tenantNote: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
41
+ }, z.core.$strip>;
42
+ export declare const SendMessageSchema: z.ZodObject<{
43
+ body: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
44
+ }, z.core.$strip>;
45
+ export declare const SubmissionFilterQuerySchema: z.ZodObject<{
46
+ formId: z.ZodOptional<z.ZodString>;
47
+ status: z.ZodOptional<z.ZodEnum<{
48
+ SUBMITTED: "SUBMITTED";
49
+ VIEWED: "VIEWED";
50
+ ACCEPTED: "ACCEPTED";
51
+ DECLINED: "DECLINED";
52
+ IN_RECOVERY: "IN_RECOVERY";
53
+ REVIVED: "REVIVED";
54
+ EXPIRED: "EXPIRED";
55
+ WITHDRAWN: "WITHDRAWN";
56
+ }>>;
57
+ source: z.ZodOptional<z.ZodEnum<{
58
+ CLIENT: "CLIENT";
59
+ TENANT: "TENANT";
60
+ }>>;
61
+ search: z.ZodOptional<z.ZodString>;
62
+ from: z.ZodOptional<z.ZodString>;
63
+ to: z.ZodOptional<z.ZodString>;
64
+ attention: z.ZodOptional<z.ZodCoercedBoolean<unknown>>;
65
+ limit: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
66
+ offset: z.ZodDefault<z.ZodOptional<z.ZodCoercedNumber<unknown>>>;
67
+ }, z.core.$strip>;
68
+ export type DeclineQuote = z.infer<typeof DeclineQuoteSchema>;
69
+ export type SubmissionPayload = z.infer<typeof SubmissionPayloadSchema>;
70
+ export type ManualDiscount = z.infer<typeof ManualDiscountSchema>;
71
+ export type Override = z.infer<typeof OverrideSchema>;
72
+ export type Withdraw = z.infer<typeof WithdrawSchema>;
73
+ export type AnalyticsPeriodQuery = z.infer<typeof AnalyticsPeriodQuerySchema>;
74
+ export type SubmissionFilterQuery = z.infer<typeof SubmissionFilterQuerySchema>;
75
+ export type SendRevision = z.infer<typeof SendRevisionSchema>;
76
+ export type SendMessage = z.infer<typeof SendMessageSchema>;
77
+ //# sourceMappingURL=submissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submissions.d.ts","sourceRoot":"","sources":["../src/submissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAGtB,eAAO,MAAM,uBAAuB;;;;iBAIlC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;iBAS7B,CAAC;AAEL,eAAO,MAAM,cAAc;;;iBAGzB,CAAC;AAEH,eAAO,MAAM,cAAc;;iBAEzB,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;iBAG7B,CAAC;AAEH,eAAO,MAAM,0BAA0B;;;;;;;iBAErC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;iBAS7B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;iBAE5B,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;iBAUtC,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACxE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAChF,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SubmissionFilterQuerySchema = exports.SendMessageSchema = exports.SendRevisionSchema = exports.AnalyticsPeriodQuerySchema = exports.DeclineQuoteSchema = exports.WithdrawSchema = exports.OverrideSchema = exports.ManualDiscountSchema = exports.SubmissionPayloadSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ const sanitize_js_1 = require("./sanitize.js");
6
+ exports.SubmissionPayloadSchema = zod_1.z.object({
7
+ answers: zod_1.z.record(zod_1.z.string(), zod_1.z.union([zod_1.z.string(), zod_1.z.number(), zod_1.z.boolean(), zod_1.z.array(zod_1.z.string())])),
8
+ discountCode: zod_1.z.string().optional(),
9
+ consentGiven: zod_1.z.boolean().optional().default(false),
10
+ });
11
+ exports.ManualDiscountSchema = zod_1.z
12
+ .object({
13
+ type: zod_1.z.enum(["PERCENT", "FIXED"]).nullable(),
14
+ value: zod_1.z.number().positive().nullable(),
15
+ note: (0, sanitize_js_1.safeText)(zod_1.z.string().max(500)).optional(),
16
+ })
17
+ .refine((d) => d.type !== "PERCENT" || d.value === null || d.value <= 100, {
18
+ message: "A percentage discount cannot exceed 100%",
19
+ path: ["value"],
20
+ });
21
+ exports.OverrideSchema = zod_1.z.object({
22
+ total: zod_1.z.number().positive(),
23
+ note: (0, sanitize_js_1.safeText)(zod_1.z.string().min(1).max(500)),
24
+ });
25
+ exports.WithdrawSchema = zod_1.z.object({
26
+ note: (0, sanitize_js_1.safeText)(zod_1.z.string().min(1).max(500)),
27
+ });
28
+ exports.DeclineQuoteSchema = zod_1.z.object({
29
+ declineReason: (0, sanitize_js_1.safeText)(zod_1.z.string().min(1)),
30
+ declineNote: (0, sanitize_js_1.safeText)(zod_1.z.string().max(500)).optional(),
31
+ });
32
+ exports.AnalyticsPeriodQuerySchema = zod_1.z.object({
33
+ period: zod_1.z.enum(["7d", "30d", "90d", "all"]).optional().default("30d"),
34
+ });
35
+ exports.SendRevisionSchema = zod_1.z.object({
36
+ revisedLineItems: zod_1.z.array(zod_1.z.object({
37
+ label: (0, sanitize_js_1.safeText)(zod_1.z.string().min(1)),
38
+ amount: zod_1.z.number().nonnegative(),
39
+ showOnQuote: zod_1.z.boolean(),
40
+ })),
41
+ tenantNote: (0, sanitize_js_1.safeText)(zod_1.z.string().max(1000)).optional(),
42
+ });
43
+ exports.SendMessageSchema = zod_1.z.object({
44
+ body: (0, sanitize_js_1.safeText)(zod_1.z.string().min(1).max(2000)),
45
+ });
46
+ exports.SubmissionFilterQuerySchema = zod_1.z.object({
47
+ formId: zod_1.z.string().optional(),
48
+ status: zod_1.z.enum(["SUBMITTED", "VIEWED", "ACCEPTED", "DECLINED", "IN_RECOVERY", "REVIVED", "EXPIRED", "WITHDRAWN"]).optional(),
49
+ source: zod_1.z.enum(["CLIENT", "TENANT"]).optional(),
50
+ search: zod_1.z.string().optional(),
51
+ from: zod_1.z.string().optional(),
52
+ to: zod_1.z.string().optional(),
53
+ attention: zod_1.z.coerce.boolean().optional(),
54
+ limit: zod_1.z.coerce.number().int().min(1).max(100).optional().default(50),
55
+ offset: zod_1.z.coerce.number().int().min(0).optional().default(0),
56
+ });
@@ -0,0 +1,33 @@
1
+ import { z } from "zod";
2
+ export declare const UpdateSettingsSchema: z.ZodObject<{
3
+ name: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
4
+ businessName: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
5
+ registrationNumber: z.ZodOptional<z.ZodString>;
6
+ vatNumber: z.ZodOptional<z.ZodString>;
7
+ invoicePaymentTermDays: z.ZodOptional<z.ZodNumber>;
8
+ bankingDetails: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
9
+ invoiceFooterNote: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
10
+ quoteValidDays: z.ZodOptional<z.ZodNumber>;
11
+ quoteFooterNote: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
12
+ quoteDisclaimer: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
13
+ invoiceDisclaimer: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
14
+ customerConsentText: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
15
+ privacyPolicyUrl: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
16
+ quoteViewUrl: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
17
+ logoUrl: z.ZodOptional<z.ZodString>;
18
+ brandPrimaryColor: z.ZodOptional<z.ZodString>;
19
+ brandSecondaryColor: z.ZodOptional<z.ZodString>;
20
+ brandAccentColor: z.ZodOptional<z.ZodString>;
21
+ brandBackgroundColor: z.ZodOptional<z.ZodString>;
22
+ brandTextColor: z.ZodOptional<z.ZodString>;
23
+ industry: z.ZodOptional<z.ZodString>;
24
+ currency: z.ZodOptional<z.ZodString>;
25
+ currencySymbol: z.ZodOptional<z.ZodString>;
26
+ numberingPrefix: z.ZodOptional<z.ZodString>;
27
+ }, z.core.$strip>;
28
+ export type UpdateSettings = z.infer<typeof UpdateSettingsSchema>;
29
+ export declare const UpdateDefaultFormSchema: z.ZodObject<{
30
+ formId: z.ZodNullable<z.ZodString>;
31
+ }, z.core.$strip>;
32
+ export type UpdateDefaultForm = z.infer<typeof UpdateDefaultFormSchema>;
33
+ //# sourceMappingURL=tenants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenants.d.ts","sourceRoot":"","sources":["../src/tenants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAGtB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;iBAyB/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,uBAAuB;;iBAElC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UpdateDefaultFormSchema = exports.UpdateSettingsSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ const sanitize_js_1 = require("./sanitize.js");
6
+ exports.UpdateSettingsSchema = zod_1.z.object({
7
+ name: (0, sanitize_js_1.safeText)(zod_1.z.string().min(1).max(100)).optional(),
8
+ businessName: (0, sanitize_js_1.safeText)(zod_1.z.string().min(1).max(100)).optional(),
9
+ registrationNumber: zod_1.z.string().trim().max(50).optional(),
10
+ vatNumber: zod_1.z.string().trim().max(50).optional(),
11
+ invoicePaymentTermDays: zod_1.z.number().int().positive().optional(),
12
+ bankingDetails: (0, sanitize_js_1.safeText)(zod_1.z.string().max(500)).optional(),
13
+ invoiceFooterNote: (0, sanitize_js_1.safeText)(zod_1.z.string().max(1000)).optional(),
14
+ quoteValidDays: zod_1.z.number().int().min(1).max(365).optional(),
15
+ quoteFooterNote: (0, sanitize_js_1.safeText)(zod_1.z.string().max(1000)).optional(),
16
+ quoteDisclaimer: (0, sanitize_js_1.safeText)(zod_1.z.string().max(3000)).optional(),
17
+ invoiceDisclaimer: (0, sanitize_js_1.safeText)(zod_1.z.string().max(3000)).optional(),
18
+ customerConsentText: (0, sanitize_js_1.safeText)(zod_1.z.string().max(500)).optional(),
19
+ privacyPolicyUrl: zod_1.z.string().url().max(500).optional().or(zod_1.z.literal("")),
20
+ quoteViewUrl: zod_1.z.string().url().max(500).optional().or(zod_1.z.literal("")),
21
+ logoUrl: zod_1.z.string().optional(),
22
+ brandPrimaryColor: zod_1.z.string().optional(),
23
+ brandSecondaryColor: zod_1.z.string().optional(),
24
+ brandAccentColor: zod_1.z.string().optional(),
25
+ brandBackgroundColor: zod_1.z.string().optional(),
26
+ brandTextColor: zod_1.z.string().optional(),
27
+ industry: zod_1.z.string().trim().max(100).optional(),
28
+ currency: zod_1.z.string().length(3).optional(),
29
+ currencySymbol: zod_1.z.string().trim().min(1).max(4).optional(),
30
+ numberingPrefix: zod_1.z.string().trim().min(2).max(5).optional(),
31
+ });
32
+ exports.UpdateDefaultFormSchema = zod_1.z.object({
33
+ formId: zod_1.z.string().uuid().nullable(),
34
+ });
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@onabl/contracts",
3
+ "version": "0.1.0",
4
+ "description": "Zod request/response validation schemas for onabl's public API — the SDK's typed contract with the API.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://gitlab.com/visualcreme-studios/onabl.git",
9
+ "directory": "packages/contracts"
10
+ },
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "exports": {
18
+ "./*": {
19
+ "import": "./dist/*.js",
20
+ "require": "./dist/*.js",
21
+ "types": "./dist/*.d.ts"
22
+ }
23
+ },
24
+ "devDependencies": {
25
+ "eslint": "latest",
26
+ "@onabl/eslint-config": "0.0.1",
27
+ "@onabl/typescript-config": "0.0.1"
28
+ },
29
+ "dependencies": {
30
+ "@onabl/types": "0.1.0"
31
+ },
32
+ "peerDependencies": {
33
+ "zod": "^4"
34
+ },
35
+ "scripts": {
36
+ "build": "tsc",
37
+ "dev": "tsc --watch",
38
+ "lint": "eslint src"
39
+ }
40
+ }