@voyantjs/booking-requirements 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.
@@ -0,0 +1,188 @@
1
+ import { booleanQueryParam } from "@voyantjs/db/helpers";
2
+ import { z } from "zod";
3
+ const paginationSchema = z.object({
4
+ limit: z.coerce.number().int().min(1).max(200).default(50),
5
+ offset: z.coerce.number().int().min(0).default(0),
6
+ });
7
+ export const contactRequirementFieldSchema = z.enum([
8
+ "first_name",
9
+ "last_name",
10
+ "email",
11
+ "phone",
12
+ "date_of_birth",
13
+ "nationality",
14
+ "passport_number",
15
+ "passport_expiry",
16
+ "dietary_requirements",
17
+ "accessibility_needs",
18
+ "special_requests",
19
+ "address",
20
+ "other",
21
+ ]);
22
+ export const contactRequirementScopeSchema = z.enum([
23
+ "booking",
24
+ "lead_traveler",
25
+ "participant",
26
+ "booker",
27
+ ]);
28
+ export const bookingQuestionTargetSchema = z.enum([
29
+ "booking",
30
+ "participant",
31
+ "lead_traveler",
32
+ "booker",
33
+ "extra",
34
+ "service",
35
+ ]);
36
+ export const bookingQuestionFieldTypeSchema = z.enum([
37
+ "text",
38
+ "textarea",
39
+ "number",
40
+ "email",
41
+ "phone",
42
+ "date",
43
+ "datetime",
44
+ "boolean",
45
+ "single_select",
46
+ "multi_select",
47
+ "file",
48
+ "country",
49
+ "other",
50
+ ]);
51
+ export const bookingQuestionTriggerModeSchema = z.enum(["required", "optional", "hidden"]);
52
+ export const bookingAnswerTargetSchema = z.enum(["booking", "participant", "extra"]);
53
+ export const productContactRequirementCoreSchema = z.object({
54
+ productId: z.string(),
55
+ optionId: z.string().nullable().optional(),
56
+ fieldKey: contactRequirementFieldSchema,
57
+ scope: contactRequirementScopeSchema.default("participant"),
58
+ isRequired: z.boolean().default(false),
59
+ perParticipant: z.boolean().default(false),
60
+ active: z.boolean().default(true),
61
+ sortOrder: z.number().int().default(0),
62
+ notes: z.string().nullable().optional(),
63
+ });
64
+ export const insertProductContactRequirementSchema = productContactRequirementCoreSchema;
65
+ export const updateProductContactRequirementSchema = productContactRequirementCoreSchema.partial();
66
+ export const productContactRequirementListQuerySchema = paginationSchema.extend({
67
+ productId: z.string().optional(),
68
+ optionId: z.string().optional(),
69
+ active: booleanQueryParam.optional(),
70
+ });
71
+ export const productBookingQuestionCoreSchema = z.object({
72
+ productId: z.string(),
73
+ code: z.string().max(100).nullable().optional(),
74
+ label: z.string().min(1).max(255),
75
+ description: z.string().nullable().optional(),
76
+ target: bookingQuestionTargetSchema.default("booking"),
77
+ fieldType: bookingQuestionFieldTypeSchema.default("text"),
78
+ placeholder: z.string().nullable().optional(),
79
+ helpText: z.string().nullable().optional(),
80
+ isRequired: z.boolean().default(false),
81
+ active: z.boolean().default(true),
82
+ sortOrder: z.number().int().default(0),
83
+ metadata: z.record(z.string(), z.unknown()).nullable().optional(),
84
+ });
85
+ export const insertProductBookingQuestionSchema = productBookingQuestionCoreSchema;
86
+ export const updateProductBookingQuestionSchema = productBookingQuestionCoreSchema.partial();
87
+ export const productBookingQuestionListQuerySchema = paginationSchema.extend({
88
+ productId: z.string().optional(),
89
+ target: bookingQuestionTargetSchema.optional(),
90
+ fieldType: bookingQuestionFieldTypeSchema.optional(),
91
+ active: booleanQueryParam.optional(),
92
+ });
93
+ export const optionBookingQuestionCoreSchema = z.object({
94
+ optionId: z.string(),
95
+ productBookingQuestionId: z.string(),
96
+ isRequiredOverride: z.boolean().nullable().optional(),
97
+ active: z.boolean().default(true),
98
+ sortOrder: z.number().int().default(0),
99
+ notes: z.string().nullable().optional(),
100
+ });
101
+ export const insertOptionBookingQuestionSchema = optionBookingQuestionCoreSchema;
102
+ export const updateOptionBookingQuestionSchema = optionBookingQuestionCoreSchema.partial();
103
+ export const optionBookingQuestionListQuerySchema = paginationSchema.extend({
104
+ optionId: z.string().optional(),
105
+ productBookingQuestionId: z.string().optional(),
106
+ active: booleanQueryParam.optional(),
107
+ });
108
+ export const bookingQuestionOptionCoreSchema = z.object({
109
+ productBookingQuestionId: z.string(),
110
+ value: z.string().min(1).max(255),
111
+ label: z.string().min(1).max(255),
112
+ sortOrder: z.number().int().default(0),
113
+ isDefault: z.boolean().default(false),
114
+ active: z.boolean().default(true),
115
+ });
116
+ export const insertBookingQuestionOptionSchema = bookingQuestionOptionCoreSchema;
117
+ export const updateBookingQuestionOptionSchema = bookingQuestionOptionCoreSchema.partial();
118
+ export const bookingQuestionOptionListQuerySchema = paginationSchema.extend({
119
+ productBookingQuestionId: z.string().optional(),
120
+ active: booleanQueryParam.optional(),
121
+ });
122
+ export const bookingQuestionUnitTriggerCoreSchema = z.object({
123
+ productBookingQuestionId: z.string(),
124
+ unitId: z.string(),
125
+ triggerMode: bookingQuestionTriggerModeSchema.default("required"),
126
+ minQuantity: z.number().int().min(0).nullable().optional(),
127
+ active: z.boolean().default(true),
128
+ });
129
+ export const insertBookingQuestionUnitTriggerSchema = bookingQuestionUnitTriggerCoreSchema;
130
+ export const updateBookingQuestionUnitTriggerSchema = bookingQuestionUnitTriggerCoreSchema.partial();
131
+ export const bookingQuestionUnitTriggerListQuerySchema = paginationSchema.extend({
132
+ productBookingQuestionId: z.string().optional(),
133
+ unitId: z.string().optional(),
134
+ active: booleanQueryParam.optional(),
135
+ });
136
+ export const bookingQuestionOptionTriggerCoreSchema = z.object({
137
+ productBookingQuestionId: z.string(),
138
+ optionId: z.string(),
139
+ triggerMode: bookingQuestionTriggerModeSchema.default("required"),
140
+ active: z.boolean().default(true),
141
+ });
142
+ export const insertBookingQuestionOptionTriggerSchema = bookingQuestionOptionTriggerCoreSchema;
143
+ export const updateBookingQuestionOptionTriggerSchema = bookingQuestionOptionTriggerCoreSchema.partial();
144
+ export const bookingQuestionOptionTriggerListQuerySchema = paginationSchema.extend({
145
+ productBookingQuestionId: z.string().optional(),
146
+ optionId: z.string().optional(),
147
+ active: booleanQueryParam.optional(),
148
+ });
149
+ export const bookingQuestionExtraTriggerCoreSchema = z.object({
150
+ productBookingQuestionId: z.string(),
151
+ productExtraId: z.string().nullable().optional(),
152
+ optionExtraConfigId: z.string().nullable().optional(),
153
+ triggerMode: bookingQuestionTriggerModeSchema.default("required"),
154
+ minQuantity: z.number().int().min(0).nullable().optional(),
155
+ active: z.boolean().default(true),
156
+ });
157
+ export const insertBookingQuestionExtraTriggerSchema = bookingQuestionExtraTriggerCoreSchema;
158
+ export const updateBookingQuestionExtraTriggerSchema = bookingQuestionExtraTriggerCoreSchema.partial();
159
+ export const bookingQuestionExtraTriggerListQuerySchema = paginationSchema.extend({
160
+ productBookingQuestionId: z.string().optional(),
161
+ productExtraId: z.string().optional(),
162
+ optionExtraConfigId: z.string().optional(),
163
+ active: booleanQueryParam.optional(),
164
+ });
165
+ export const bookingAnswerCoreSchema = z.object({
166
+ bookingId: z.string(),
167
+ productBookingQuestionId: z.string(),
168
+ bookingParticipantId: z.string().nullable().optional(),
169
+ bookingExtraId: z.string().nullable().optional(),
170
+ target: bookingAnswerTargetSchema.default("booking"),
171
+ valueText: z.string().nullable().optional(),
172
+ valueNumber: z.number().int().nullable().optional(),
173
+ valueBoolean: z.boolean().nullable().optional(),
174
+ valueJson: z
175
+ .union([z.record(z.string(), z.unknown()), z.array(z.string())])
176
+ .nullable()
177
+ .optional(),
178
+ notes: z.string().nullable().optional(),
179
+ });
180
+ export const insertBookingAnswerSchema = bookingAnswerCoreSchema;
181
+ export const updateBookingAnswerSchema = bookingAnswerCoreSchema.partial();
182
+ export const bookingAnswerListQuerySchema = paginationSchema.extend({
183
+ bookingId: z.string().optional(),
184
+ productBookingQuestionId: z.string().optional(),
185
+ bookingParticipantId: z.string().optional(),
186
+ bookingExtraId: z.string().optional(),
187
+ target: bookingAnswerTargetSchema.optional(),
188
+ });
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@voyantjs/booking-requirements",
3
+ "version": "0.1.0",
4
+ "license": "FSL-1.1-Apache-2.0",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "import": "./dist/index.js"
10
+ },
11
+ "./schema": {
12
+ "types": "./dist/schema.d.ts",
13
+ "import": "./dist/schema.js"
14
+ },
15
+ "./validation": {
16
+ "types": "./dist/validation.d.ts",
17
+ "import": "./dist/validation.js"
18
+ },
19
+ "./routes": {
20
+ "types": "./dist/routes.d.ts",
21
+ "import": "./dist/routes.js"
22
+ }
23
+ },
24
+ "dependencies": {
25
+ "drizzle-orm": "^0.45.2",
26
+ "hono": "^4.12.10",
27
+ "zod": "^4.3.6",
28
+ "@voyantjs/hono": "0.1.0",
29
+ "@voyantjs/core": "0.1.0",
30
+ "@voyantjs/db": "0.1.0"
31
+ },
32
+ "devDependencies": {
33
+ "typescript": "^6.0.2",
34
+ "@voyantjs/bookings": "0.1.0",
35
+ "@voyantjs/products": "0.1.0",
36
+ "@voyantjs/voyant-typescript-config": "0.1.0"
37
+ },
38
+ "files": [
39
+ "dist"
40
+ ],
41
+ "publishConfig": {
42
+ "access": "public"
43
+ },
44
+ "scripts": {
45
+ "typecheck": "tsc --noEmit",
46
+ "lint": "biome check src/",
47
+ "test": "vitest run",
48
+ "build": "tsc -p tsconfig.json",
49
+ "clean": "rm -rf dist"
50
+ },
51
+ "main": "./dist/index.js",
52
+ "types": "./dist/index.d.ts"
53
+ }