@voyantjs/products-contracts 0.100.0 → 0.101.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/dist/validation-catalog.d.ts +408 -0
- package/dist/validation-catalog.d.ts.map +1 -0
- package/dist/validation-catalog.js +54 -0
- package/dist/validation-config.d.ts +233 -0
- package/dist/validation-config.d.ts.map +1 -0
- package/dist/validation-config.js +73 -0
- package/dist/validation-content.d.ts +588 -0
- package/dist/validation-content.d.ts.map +1 -0
- package/dist/validation-content.js +299 -0
- package/dist/validation-core.d.ts +397 -0
- package/dist/validation-core.d.ts.map +1 -0
- package/dist/validation-core.js +210 -0
- package/dist/validation-public.d.ts +698 -0
- package/dist/validation-public.d.ts.map +1 -0
- package/dist/validation-public.js +172 -0
- package/dist/validation-shared.d.ts +120 -0
- package/dist/validation-shared.d.ts.map +1 -0
- package/dist/validation-shared.js +99 -0
- package/dist/validation.d.ts +6 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +5 -0
- package/package.json +38 -2
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { booleanQueryParam, destinationTypeSchema, languageTagSchema, productFeatureTypeSchema, productLocationTypeSchema, serviceTypeSchema, z, } from "./validation-shared.js";
|
|
2
|
+
const productFeatureCoreSchema = z.object({
|
|
3
|
+
featureType: productFeatureTypeSchema.default("highlight"),
|
|
4
|
+
title: z.string().min(1).max(255),
|
|
5
|
+
description: z.string().optional().nullable(),
|
|
6
|
+
sortOrder: z.number().int().default(0),
|
|
7
|
+
});
|
|
8
|
+
const productFaqCoreSchema = z.object({
|
|
9
|
+
question: z.string().min(1).max(1000),
|
|
10
|
+
answer: z.string().min(1).max(10000),
|
|
11
|
+
sortOrder: z.number().int().default(0),
|
|
12
|
+
});
|
|
13
|
+
const productLocationCoreSchema = z.object({
|
|
14
|
+
locationType: productLocationTypeSchema.default("point_of_interest"),
|
|
15
|
+
title: z.string().min(1).max(255),
|
|
16
|
+
address: z.string().max(1000).optional().nullable(),
|
|
17
|
+
city: z.string().max(255).optional().nullable(),
|
|
18
|
+
countryCode: z.string().min(2).max(2).optional().nullable(),
|
|
19
|
+
latitude: z.number().min(-90).max(90).optional().nullable(),
|
|
20
|
+
longitude: z.number().min(-180).max(180).optional().nullable(),
|
|
21
|
+
googlePlaceId: z.string().max(255).optional().nullable(),
|
|
22
|
+
applePlaceId: z.string().max(255).optional().nullable(),
|
|
23
|
+
tripadvisorLocationId: z.string().max(255).optional().nullable(),
|
|
24
|
+
sortOrder: z.number().int().default(0),
|
|
25
|
+
});
|
|
26
|
+
const destinationCoreSchema = z.object({
|
|
27
|
+
parentId: z.string().optional().nullable(),
|
|
28
|
+
slug: z.string().min(1).max(255),
|
|
29
|
+
code: z.string().max(100).optional().nullable(),
|
|
30
|
+
canonicalPlaceId: z.string().min(1).max(255).optional().nullable(),
|
|
31
|
+
destinationType: destinationTypeSchema.default("destination"),
|
|
32
|
+
latitude: z.number().min(-90).max(90).optional().nullable(),
|
|
33
|
+
longitude: z.number().min(-180).max(180).optional().nullable(),
|
|
34
|
+
sortOrder: z.number().int().default(0),
|
|
35
|
+
active: z.boolean().default(true),
|
|
36
|
+
metadata: z.record(z.string(), z.unknown()).optional().nullable(),
|
|
37
|
+
});
|
|
38
|
+
const destinationTranslationCoreSchema = z.object({
|
|
39
|
+
languageTag: languageTagSchema,
|
|
40
|
+
name: z.string().min(1).max(255),
|
|
41
|
+
description: z.string().optional().nullable(),
|
|
42
|
+
seoTitle: z.string().max(255).optional().nullable(),
|
|
43
|
+
seoDescription: z.string().optional().nullable(),
|
|
44
|
+
});
|
|
45
|
+
const productDestinationCoreSchema = z.object({
|
|
46
|
+
destinationId: z.string(),
|
|
47
|
+
sortOrder: z.number().int().default(0),
|
|
48
|
+
});
|
|
49
|
+
export const insertProductFeatureSchema = productFeatureCoreSchema;
|
|
50
|
+
export const updateProductFeatureSchema = productFeatureCoreSchema.partial();
|
|
51
|
+
export const productFeatureListQuerySchema = z.object({
|
|
52
|
+
productId: z.string().optional(),
|
|
53
|
+
featureType: productFeatureTypeSchema.optional(),
|
|
54
|
+
limit: z.coerce.number().int().min(1).max(100).default(50),
|
|
55
|
+
offset: z.coerce.number().int().min(0).default(0),
|
|
56
|
+
});
|
|
57
|
+
export const insertProductFaqSchema = productFaqCoreSchema;
|
|
58
|
+
export const updateProductFaqSchema = productFaqCoreSchema.partial();
|
|
59
|
+
export const productFaqListQuerySchema = z.object({
|
|
60
|
+
productId: z.string().optional(),
|
|
61
|
+
limit: z.coerce.number().int().min(1).max(100).default(50),
|
|
62
|
+
offset: z.coerce.number().int().min(0).default(0),
|
|
63
|
+
});
|
|
64
|
+
export const insertProductLocationSchema = productLocationCoreSchema;
|
|
65
|
+
export const updateProductLocationSchema = productLocationCoreSchema.partial();
|
|
66
|
+
export const productLocationListQuerySchema = z.object({
|
|
67
|
+
productId: z.string().optional(),
|
|
68
|
+
locationType: productLocationTypeSchema.optional(),
|
|
69
|
+
limit: z.coerce.number().int().min(1).max(100).default(50),
|
|
70
|
+
offset: z.coerce.number().int().min(0).default(0),
|
|
71
|
+
});
|
|
72
|
+
export const insertDestinationSchema = destinationCoreSchema;
|
|
73
|
+
export const updateDestinationSchema = destinationCoreSchema.partial();
|
|
74
|
+
export const destinationListQuerySchema = z.object({
|
|
75
|
+
parentId: z.string().optional(),
|
|
76
|
+
active: booleanQueryParam.optional(),
|
|
77
|
+
search: z.string().optional(),
|
|
78
|
+
languageTag: languageTagSchema.optional(),
|
|
79
|
+
destinationType: destinationTypeSchema.optional(),
|
|
80
|
+
canonicalPlaceId: z.string().trim().min(1).max(255).optional(),
|
|
81
|
+
limit: z.coerce.number().int().min(1).max(100).default(50),
|
|
82
|
+
offset: z.coerce.number().int().min(0).default(0),
|
|
83
|
+
});
|
|
84
|
+
export const insertDestinationTranslationSchema = destinationTranslationCoreSchema;
|
|
85
|
+
export const updateDestinationTranslationSchema = destinationTranslationCoreSchema.partial();
|
|
86
|
+
export const destinationTranslationListQuerySchema = z.object({
|
|
87
|
+
destinationId: z.string().optional(),
|
|
88
|
+
languageTag: languageTagSchema.optional(),
|
|
89
|
+
limit: z.coerce.number().int().min(1).max(100).default(50),
|
|
90
|
+
offset: z.coerce.number().int().min(0).default(0),
|
|
91
|
+
});
|
|
92
|
+
const productCategoryTranslationCoreSchema = z.object({
|
|
93
|
+
languageTag: languageTagSchema,
|
|
94
|
+
name: z.string().min(1).max(255),
|
|
95
|
+
description: z.string().optional().nullable(),
|
|
96
|
+
seoTitle: z.string().max(255).optional().nullable(),
|
|
97
|
+
seoDescription: z.string().optional().nullable(),
|
|
98
|
+
});
|
|
99
|
+
export const insertProductCategoryTranslationSchema = productCategoryTranslationCoreSchema;
|
|
100
|
+
export const updateProductCategoryTranslationSchema = productCategoryTranslationCoreSchema.partial();
|
|
101
|
+
export const productCategoryTranslationListQuerySchema = z.object({
|
|
102
|
+
categoryId: z.string().optional(),
|
|
103
|
+
languageTag: languageTagSchema.optional(),
|
|
104
|
+
limit: z.coerce.number().int().min(1).max(100).default(50),
|
|
105
|
+
offset: z.coerce.number().int().min(0).default(0),
|
|
106
|
+
});
|
|
107
|
+
// Tag translations are minimal: just `name`. Tags are short labels;
|
|
108
|
+
// description / SEO blurbs aren't needed (per #502 non-goals).
|
|
109
|
+
const productTagTranslationCoreSchema = z.object({
|
|
110
|
+
languageTag: languageTagSchema,
|
|
111
|
+
name: z.string().min(1).max(255),
|
|
112
|
+
});
|
|
113
|
+
export const insertProductTagTranslationSchema = productTagTranslationCoreSchema;
|
|
114
|
+
export const updateProductTagTranslationSchema = productTagTranslationCoreSchema.partial();
|
|
115
|
+
export const productTagTranslationListQuerySchema = z.object({
|
|
116
|
+
tagId: z.string().optional(),
|
|
117
|
+
languageTag: languageTagSchema.optional(),
|
|
118
|
+
limit: z.coerce.number().int().min(1).max(100).default(50),
|
|
119
|
+
offset: z.coerce.number().int().min(0).default(0),
|
|
120
|
+
});
|
|
121
|
+
export const insertProductDestinationSchema = productDestinationCoreSchema;
|
|
122
|
+
export const updateProductDestinationSchema = productDestinationCoreSchema.partial();
|
|
123
|
+
export const productDestinationListQuerySchema = z.object({
|
|
124
|
+
productId: z.string().optional(),
|
|
125
|
+
destinationId: z.string().optional(),
|
|
126
|
+
limit: z.coerce.number().int().min(1).max(100).default(50),
|
|
127
|
+
offset: z.coerce.number().int().min(0).default(0),
|
|
128
|
+
});
|
|
129
|
+
const productTranslationCoreSchema = z.object({
|
|
130
|
+
languageTag: languageTagSchema,
|
|
131
|
+
slug: z.string().max(255).optional().nullable(),
|
|
132
|
+
name: z.string().min(1).max(255),
|
|
133
|
+
shortDescription: z.string().optional().nullable(),
|
|
134
|
+
description: z.string().optional().nullable(),
|
|
135
|
+
inclusionsHtml: z.string().optional().nullable(),
|
|
136
|
+
exclusionsHtml: z.string().optional().nullable(),
|
|
137
|
+
termsHtml: z.string().optional().nullable(),
|
|
138
|
+
seoTitle: z.string().max(255).optional().nullable(),
|
|
139
|
+
seoDescription: z.string().optional().nullable(),
|
|
140
|
+
});
|
|
141
|
+
const optionTranslationCoreSchema = z.object({
|
|
142
|
+
languageTag: languageTagSchema,
|
|
143
|
+
name: z.string().min(1).max(255),
|
|
144
|
+
shortDescription: z.string().optional().nullable(),
|
|
145
|
+
description: z.string().optional().nullable(),
|
|
146
|
+
});
|
|
147
|
+
export const insertProductTranslationSchema = productTranslationCoreSchema;
|
|
148
|
+
export const updateProductTranslationSchema = productTranslationCoreSchema.partial();
|
|
149
|
+
export const productTranslationListQuerySchema = z.object({
|
|
150
|
+
productId: z.string().optional(),
|
|
151
|
+
languageTag: languageTagSchema.optional(),
|
|
152
|
+
limit: z.coerce.number().int().min(1).max(100).default(50),
|
|
153
|
+
offset: z.coerce.number().int().min(0).default(0),
|
|
154
|
+
});
|
|
155
|
+
export const insertProductOptionTranslationSchema = optionTranslationCoreSchema;
|
|
156
|
+
export const updateProductOptionTranslationSchema = optionTranslationCoreSchema.partial();
|
|
157
|
+
export const productOptionTranslationListQuerySchema = z.object({
|
|
158
|
+
optionId: z.string().optional(),
|
|
159
|
+
languageTag: languageTagSchema.optional(),
|
|
160
|
+
limit: z.coerce.number().int().min(1).max(100).default(50),
|
|
161
|
+
offset: z.coerce.number().int().min(0).default(0),
|
|
162
|
+
});
|
|
163
|
+
export const insertOptionUnitTranslationSchema = optionTranslationCoreSchema;
|
|
164
|
+
export const updateOptionUnitTranslationSchema = optionTranslationCoreSchema.partial();
|
|
165
|
+
export const optionUnitTranslationListQuerySchema = z.object({
|
|
166
|
+
unitId: z.string().optional(),
|
|
167
|
+
languageTag: languageTagSchema.optional(),
|
|
168
|
+
limit: z.coerce.number().int().min(1).max(100).default(50),
|
|
169
|
+
offset: z.coerce.number().int().min(0).default(0),
|
|
170
|
+
});
|
|
171
|
+
const itineraryCoreSchema = z.object({
|
|
172
|
+
name: z.string().min(1).max(255),
|
|
173
|
+
isDefault: z.boolean().default(false),
|
|
174
|
+
sortOrder: z.number().int().default(0),
|
|
175
|
+
});
|
|
176
|
+
export const insertItinerarySchema = itineraryCoreSchema;
|
|
177
|
+
export const updateItinerarySchema = itineraryCoreSchema.partial();
|
|
178
|
+
export const duplicateItinerarySchema = z.object({
|
|
179
|
+
name: z.string().min(1).max(255).optional(),
|
|
180
|
+
});
|
|
181
|
+
const dayCoreSchema = z.object({
|
|
182
|
+
dayNumber: z.number().int().positive(),
|
|
183
|
+
title: z.string().max(255).optional().nullable(),
|
|
184
|
+
description: z.string().optional().nullable(),
|
|
185
|
+
location: z.string().max(255).optional().nullable(),
|
|
186
|
+
});
|
|
187
|
+
export const insertDaySchema = dayCoreSchema;
|
|
188
|
+
export const updateDaySchema = dayCoreSchema.partial();
|
|
189
|
+
const dayServiceCoreSchema = z.object({
|
|
190
|
+
serviceType: serviceTypeSchema,
|
|
191
|
+
name: z.string().min(1).max(255),
|
|
192
|
+
description: z.string().optional().nullable(),
|
|
193
|
+
countryCode: z.string().min(2).max(2).optional().nullable(),
|
|
194
|
+
supplierServiceId: z.string().optional().nullable(),
|
|
195
|
+
costCurrency: z.string().min(3).max(3),
|
|
196
|
+
costAmountCents: z.number().int().min(0),
|
|
197
|
+
quantity: z.number().int().positive().default(1),
|
|
198
|
+
sortOrder: z.number().int().optional().nullable(),
|
|
199
|
+
notes: z.string().optional().nullable(),
|
|
200
|
+
});
|
|
201
|
+
export const insertDayServiceSchema = dayServiceCoreSchema;
|
|
202
|
+
export const updateDayServiceSchema = dayServiceCoreSchema.partial();
|
|
203
|
+
const productMediaTypeSchema = z.enum(["image", "video", "document"]);
|
|
204
|
+
const productMediaCoreSchema = z.object({
|
|
205
|
+
mediaType: productMediaTypeSchema,
|
|
206
|
+
name: z.string().min(1).max(500),
|
|
207
|
+
url: z.string().min(1).max(2048),
|
|
208
|
+
storageKey: z.string().max(1024).optional().nullable(),
|
|
209
|
+
mimeType: z.string().max(255).optional().nullable(),
|
|
210
|
+
fileSize: z.number().int().min(0).optional().nullable(),
|
|
211
|
+
altText: z.string().max(1000).optional().nullable(),
|
|
212
|
+
sortOrder: z.number().int().default(0),
|
|
213
|
+
isCover: z.boolean().default(false),
|
|
214
|
+
isBrochure: z.boolean().default(false),
|
|
215
|
+
isBrochureCurrent: z.boolean().default(false),
|
|
216
|
+
brochureVersion: z.number().int().min(1).optional().nullable(),
|
|
217
|
+
});
|
|
218
|
+
export const insertProductMediaSchema = productMediaCoreSchema.extend({
|
|
219
|
+
dayId: z.string().optional().nullable(),
|
|
220
|
+
});
|
|
221
|
+
export const updateProductMediaSchema = productMediaCoreSchema.partial();
|
|
222
|
+
export const upsertProductBrochureSchema = productMediaCoreSchema
|
|
223
|
+
.omit({
|
|
224
|
+
mediaType: true,
|
|
225
|
+
isCover: true,
|
|
226
|
+
isBrochure: true,
|
|
227
|
+
isBrochureCurrent: true,
|
|
228
|
+
brochureVersion: true,
|
|
229
|
+
})
|
|
230
|
+
.extend({
|
|
231
|
+
mimeType: z.string().max(255).optional().nullable().default("application/pdf"),
|
|
232
|
+
});
|
|
233
|
+
export const productMediaListQuerySchema = z.object({
|
|
234
|
+
dayId: z.string().optional(),
|
|
235
|
+
mediaType: productMediaTypeSchema.optional(),
|
|
236
|
+
isBrochure: booleanQueryParam.optional(),
|
|
237
|
+
isBrochureCurrent: booleanQueryParam.optional(),
|
|
238
|
+
limit: z.coerce.number().int().min(1).max(200).default(50),
|
|
239
|
+
offset: z.coerce.number().int().min(0).default(0),
|
|
240
|
+
});
|
|
241
|
+
export const reorderProductMediaSchema = z.object({
|
|
242
|
+
items: z.array(z.object({ id: z.string(), sortOrder: z.number().int() })),
|
|
243
|
+
});
|
|
244
|
+
const productTypeCoreSchema = z.object({
|
|
245
|
+
name: z.string().min(1).max(255),
|
|
246
|
+
code: z.string().min(1).max(100),
|
|
247
|
+
description: z.string().optional().nullable(),
|
|
248
|
+
sortOrder: z.number().int().default(0),
|
|
249
|
+
active: z.boolean().default(true),
|
|
250
|
+
metadata: z.record(z.string(), z.unknown()).optional().nullable(),
|
|
251
|
+
});
|
|
252
|
+
export const insertProductTypeSchema = productTypeCoreSchema;
|
|
253
|
+
export const updateProductTypeSchema = productTypeCoreSchema.partial();
|
|
254
|
+
export const productTypeListQuerySchema = z.object({
|
|
255
|
+
active: booleanQueryParam.optional(),
|
|
256
|
+
search: z.string().optional(),
|
|
257
|
+
limit: z.coerce.number().int().min(1).max(200).default(50),
|
|
258
|
+
offset: z.coerce.number().int().min(0).default(0),
|
|
259
|
+
});
|
|
260
|
+
const productCategoryDepositRuleSchema = z.object({
|
|
261
|
+
kind: z.enum(["none", "percent", "fixed_cents"]),
|
|
262
|
+
percent: z.number().min(0).max(100).optional(),
|
|
263
|
+
amountCents: z.number().int().min(0).optional(),
|
|
264
|
+
});
|
|
265
|
+
const productCategoryPaymentPolicySchema = z.object({
|
|
266
|
+
deposit: productCategoryDepositRuleSchema,
|
|
267
|
+
minDaysBeforeDepartureForDeposit: z.number().int().min(0),
|
|
268
|
+
balanceDueDaysBeforeDeparture: z.number().int().min(0),
|
|
269
|
+
balanceDueMinDaysFromNow: z.number().int().min(0),
|
|
270
|
+
});
|
|
271
|
+
const productCategoryCoreSchema = z.object({
|
|
272
|
+
name: z.string().min(1).max(255),
|
|
273
|
+
slug: z.string().min(1).max(255),
|
|
274
|
+
parentId: z.string().optional().nullable(),
|
|
275
|
+
description: z.string().optional().nullable(),
|
|
276
|
+
sortOrder: z.number().int().default(0),
|
|
277
|
+
active: z.boolean().default(true),
|
|
278
|
+
customerPaymentPolicy: productCategoryPaymentPolicySchema.optional().nullable(),
|
|
279
|
+
metadata: z.record(z.string(), z.unknown()).optional().nullable(),
|
|
280
|
+
});
|
|
281
|
+
export const insertProductCategorySchema = productCategoryCoreSchema;
|
|
282
|
+
export const updateProductCategorySchema = productCategoryCoreSchema.partial();
|
|
283
|
+
export const productCategoryListQuerySchema = z.object({
|
|
284
|
+
parentId: z.string().optional(),
|
|
285
|
+
active: booleanQueryParam.optional(),
|
|
286
|
+
search: z.string().optional(),
|
|
287
|
+
limit: z.coerce.number().int().min(1).max(200).default(50),
|
|
288
|
+
offset: z.coerce.number().int().min(0).default(0),
|
|
289
|
+
});
|
|
290
|
+
const productTagCoreSchema = z.object({
|
|
291
|
+
name: z.string().min(1).max(255),
|
|
292
|
+
});
|
|
293
|
+
export const insertProductTagSchema = productTagCoreSchema;
|
|
294
|
+
export const updateProductTagSchema = productTagCoreSchema.partial();
|
|
295
|
+
export const productTagListQuerySchema = z.object({
|
|
296
|
+
search: z.string().optional(),
|
|
297
|
+
limit: z.coerce.number().int().min(1).max(200).default(50),
|
|
298
|
+
offset: z.coerce.number().int().min(0).default(0),
|
|
299
|
+
});
|