@voyantjs/products 0.28.1 → 0.29.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/booking-engine/handler.d.ts +8 -0
- package/dist/booking-engine/handler.d.ts.map +1 -1
- package/dist/booking-engine/handler.js +38 -0
- package/dist/catalog-policy-departures.d.ts +52 -0
- package/dist/catalog-policy-departures.d.ts.map +1 -0
- package/dist/catalog-policy-departures.js +169 -0
- package/dist/catalog-policy-destinations.d.ts +41 -0
- package/dist/catalog-policy-destinations.d.ts.map +1 -0
- package/dist/catalog-policy-destinations.js +121 -0
- package/dist/catalog-policy-pricing.d.ts +55 -0
- package/dist/catalog-policy-pricing.d.ts.map +1 -0
- package/dist/catalog-policy-pricing.js +109 -0
- package/dist/catalog-policy-promotions.d.ts +52 -0
- package/dist/catalog-policy-promotions.d.ts.map +1 -0
- package/dist/catalog-policy-promotions.js +270 -0
- package/dist/catalog-policy-taxonomy.d.ts +51 -0
- package/dist/catalog-policy-taxonomy.d.ts.map +1 -0
- package/dist/catalog-policy-taxonomy.js +191 -0
- package/dist/events.d.ts +1 -1
- package/dist/events.d.ts.map +1 -1
- package/dist/routes.d.ts +254 -19
- package/dist/routes.d.ts.map +1 -1
- package/dist/routes.js +73 -5
- package/dist/schema-taxonomy.d.ts +287 -0
- package/dist/schema-taxonomy.d.ts.map +1 -1
- package/dist/schema-taxonomy.js +47 -0
- package/dist/service-aggregates.js +2 -2
- package/dist/service-catalog-plane-destinations.d.ts +30 -0
- package/dist/service-catalog-plane-destinations.d.ts.map +1 -0
- package/dist/service-catalog-plane-destinations.js +119 -0
- package/dist/service-catalog-plane-taxonomy.d.ts +73 -0
- package/dist/service-catalog-plane-taxonomy.d.ts.map +1 -0
- package/dist/service-catalog-plane-taxonomy.js +242 -0
- package/dist/service-catalog-plane.d.ts +46 -1
- package/dist/service-catalog-plane.d.ts.map +1 -1
- package/dist/service-catalog-plane.js +42 -6
- package/dist/service.d.ts +98 -19
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +207 -3
- package/dist/tasks/brochures.d.ts +1 -1
- package/dist/validation-content.d.ts +38 -0
- package/dist/validation-content.d.ts.map +1 -1
- package/dist/validation-content.js +29 -0
- package/dist/validation-core.d.ts +56 -0
- package/dist/validation-core.d.ts.map +1 -1
- package/dist/validation-core.js +75 -2
- package/package.json +77 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-content.d.ts","sourceRoot":"","sources":["../src/validation-content.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,CAAC,EACF,MAAM,wBAAwB,CAAA;AA+C/B,eAAO,MAAM,0BAA0B;;;;;;;;;;;iBAA2B,CAAA;AAClE,eAAO,MAAM,0BAA0B;;;;;;;;;;;iBAAqC,CAAA;AAC5E,eAAO,MAAM,6BAA6B;;;;;;;;;;;iBAKxC,CAAA;AACF,eAAO,MAAM,sBAAsB;;;;iBAAuB,CAAA;AAC1D,eAAO,MAAM,sBAAsB;;;;iBAAiC,CAAA;AACpE,eAAO,MAAM,yBAAyB;;;;iBAIpC,CAAA;AACF,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;iBAA4B,CAAA;AACpE,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;iBAAsC,CAAA;AAC9E,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;iBAKzC,CAAA;AACF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;iBAAwB,CAAA;AAC5D,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;iBAAkC,CAAA;AACtE,eAAO,MAAM,0BAA0B;;;;;;;;;;;;iBAOrC,CAAA;AACF,eAAO,MAAM,kCAAkC;;;;;;iBAAmC,CAAA;AAClF,eAAO,MAAM,kCAAkC;;;;;;iBAA6C,CAAA;AAC5F,eAAO,MAAM,qCAAqC;;;;;iBAKhD,CAAA;AACF,eAAO,MAAM,8BAA8B;;;iBAA+B,CAAA;AAC1E,eAAO,MAAM,8BAA8B;;;iBAAyC,CAAA;AACpF,eAAO,MAAM,iCAAiC;;;;;iBAK5C,CAAA;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAA;AAC7E,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAA;AAC7E,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AACrE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AACrE,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAA;AAC/E,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAA;AAC/E,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AACvE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AACvE,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kCAAkC,CAAC,CAAA;AAC7F,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kCAAkC,CAAC,CAAA;AAC7F,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAA;AACrF,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"validation-content.d.ts","sourceRoot":"","sources":["../src/validation-content.ts"],"names":[],"mappings":"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"}
|
|
@@ -84,6 +84,35 @@ export const destinationTranslationListQuerySchema = z.object({
|
|
|
84
84
|
limit: z.coerce.number().int().min(1).max(100).default(50),
|
|
85
85
|
offset: z.coerce.number().int().min(0).default(0),
|
|
86
86
|
});
|
|
87
|
+
const productCategoryTranslationCoreSchema = z.object({
|
|
88
|
+
languageTag: languageTagSchema,
|
|
89
|
+
name: z.string().min(1).max(255),
|
|
90
|
+
description: z.string().optional().nullable(),
|
|
91
|
+
seoTitle: z.string().max(255).optional().nullable(),
|
|
92
|
+
seoDescription: z.string().optional().nullable(),
|
|
93
|
+
});
|
|
94
|
+
export const insertProductCategoryTranslationSchema = productCategoryTranslationCoreSchema;
|
|
95
|
+
export const updateProductCategoryTranslationSchema = productCategoryTranslationCoreSchema.partial();
|
|
96
|
+
export const productCategoryTranslationListQuerySchema = z.object({
|
|
97
|
+
categoryId: z.string().optional(),
|
|
98
|
+
languageTag: languageTagSchema.optional(),
|
|
99
|
+
limit: z.coerce.number().int().min(1).max(100).default(50),
|
|
100
|
+
offset: z.coerce.number().int().min(0).default(0),
|
|
101
|
+
});
|
|
102
|
+
// Tag translations are minimal: just `name`. Tags are short labels;
|
|
103
|
+
// description / SEO blurbs aren't needed (per #502 non-goals).
|
|
104
|
+
const productTagTranslationCoreSchema = z.object({
|
|
105
|
+
languageTag: languageTagSchema,
|
|
106
|
+
name: z.string().min(1).max(255),
|
|
107
|
+
});
|
|
108
|
+
export const insertProductTagTranslationSchema = productTagTranslationCoreSchema;
|
|
109
|
+
export const updateProductTagTranslationSchema = productTagTranslationCoreSchema.partial();
|
|
110
|
+
export const productTagTranslationListQuerySchema = z.object({
|
|
111
|
+
tagId: z.string().optional(),
|
|
112
|
+
languageTag: languageTagSchema.optional(),
|
|
113
|
+
limit: z.coerce.number().int().min(1).max(100).default(50),
|
|
114
|
+
offset: z.coerce.number().int().min(0).default(0),
|
|
115
|
+
});
|
|
87
116
|
export const insertProductDestinationSchema = productDestinationCoreSchema;
|
|
88
117
|
export const updateProductDestinationSchema = productDestinationCoreSchema.partial();
|
|
89
118
|
export const productDestinationListQuerySchema = z.object({
|
|
@@ -173,6 +173,19 @@ export declare const selectProductSchema: z.ZodObject<{
|
|
|
173
173
|
createdAt: z.ZodCoercedDate<unknown>;
|
|
174
174
|
updatedAt: z.ZodCoercedDate<unknown>;
|
|
175
175
|
}, z.core.$strip>;
|
|
176
|
+
export declare const productListSortFieldSchema: z.ZodEnum<{
|
|
177
|
+
name: "name";
|
|
178
|
+
createdAt: "createdAt";
|
|
179
|
+
status: "status";
|
|
180
|
+
startDate: "startDate";
|
|
181
|
+
endDate: "endDate";
|
|
182
|
+
pax: "pax";
|
|
183
|
+
sellAmount: "sellAmount";
|
|
184
|
+
}>;
|
|
185
|
+
export declare const productListSortDirSchema: z.ZodEnum<{
|
|
186
|
+
asc: "asc";
|
|
187
|
+
desc: "desc";
|
|
188
|
+
}>;
|
|
176
189
|
export declare const productListQuerySchema: z.ZodObject<{
|
|
177
190
|
status: z.ZodOptional<z.ZodEnum<{
|
|
178
191
|
active: "active";
|
|
@@ -206,6 +219,25 @@ export declare const productListQuerySchema: z.ZodObject<{
|
|
|
206
219
|
categoryId: z.ZodOptional<z.ZodString>;
|
|
207
220
|
tag: z.ZodOptional<z.ZodString>;
|
|
208
221
|
search: z.ZodOptional<z.ZodString>;
|
|
222
|
+
dateFrom: z.ZodOptional<z.ZodString>;
|
|
223
|
+
dateTo: z.ZodOptional<z.ZodString>;
|
|
224
|
+
paxMin: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
225
|
+
paxMax: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
226
|
+
sellAmountMin: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
227
|
+
sellAmountMax: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
|
|
228
|
+
sortBy: z.ZodDefault<z.ZodEnum<{
|
|
229
|
+
name: "name";
|
|
230
|
+
createdAt: "createdAt";
|
|
231
|
+
status: "status";
|
|
232
|
+
startDate: "startDate";
|
|
233
|
+
endDate: "endDate";
|
|
234
|
+
pax: "pax";
|
|
235
|
+
sellAmount: "sellAmount";
|
|
236
|
+
}>>;
|
|
237
|
+
sortDir: z.ZodDefault<z.ZodEnum<{
|
|
238
|
+
asc: "asc";
|
|
239
|
+
desc: "desc";
|
|
240
|
+
}>>;
|
|
209
241
|
limit: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
210
242
|
offset: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
211
243
|
}, z.core.$strip>;
|
|
@@ -256,6 +288,15 @@ export declare const productOptionListQuerySchema: z.ZodObject<{
|
|
|
256
288
|
}, z.core.$strip>;
|
|
257
289
|
export type InsertProductOption = z.infer<typeof insertProductOptionSchema>;
|
|
258
290
|
export type UpdateProductOption = z.infer<typeof updateProductOptionSchema>;
|
|
291
|
+
type OccupancyShape = {
|
|
292
|
+
unitType?: string | null | undefined;
|
|
293
|
+
occupancyMin?: number | null | undefined;
|
|
294
|
+
occupancyMax?: number | null | undefined;
|
|
295
|
+
};
|
|
296
|
+
type OccupancyIssue = {
|
|
297
|
+
path: string[];
|
|
298
|
+
message: string;
|
|
299
|
+
};
|
|
259
300
|
export declare const insertOptionUnitSchema: z.ZodObject<{
|
|
260
301
|
name: z.ZodString;
|
|
261
302
|
code: z.ZodNullable<z.ZodOptional<z.ZodString>>;
|
|
@@ -300,6 +341,20 @@ export declare const updateOptionUnitSchema: z.ZodObject<{
|
|
|
300
341
|
isHidden: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
|
|
301
342
|
sortOrder: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
302
343
|
}, z.core.$strip>;
|
|
344
|
+
/**
|
|
345
|
+
* Validate the merged state of an option unit — the persisted record with a
|
|
346
|
+
* patch applied. The partial-update schema only sees the patch payload, so
|
|
347
|
+
* it can't catch e.g. PATCH `{ occupancyMin: null }` clearing occupancy on a
|
|
348
|
+
* unit whose persisted unitType is already "room". The service layer fetches
|
|
349
|
+
* the existing row, applies the patch, and runs this against the merged
|
|
350
|
+
* shape before writing.
|
|
351
|
+
*/
|
|
352
|
+
export declare function validateMergedOptionUnit(merged: OccupancyShape): {
|
|
353
|
+
ok: true;
|
|
354
|
+
} | {
|
|
355
|
+
ok: false;
|
|
356
|
+
issues: OccupancyIssue[];
|
|
357
|
+
};
|
|
303
358
|
export declare const optionUnitListQuerySchema: z.ZodObject<{
|
|
304
359
|
optionId: z.ZodOptional<z.ZodString>;
|
|
305
360
|
unitType: z.ZodOptional<z.ZodEnum<{
|
|
@@ -322,4 +377,5 @@ export type InsertVersion = z.infer<typeof insertVersionSchema>;
|
|
|
322
377
|
export declare const insertProductNoteSchema: z.ZodObject<{
|
|
323
378
|
content: z.ZodString;
|
|
324
379
|
}, z.core.$strip>;
|
|
380
|
+
export {};
|
|
325
381
|
//# sourceMappingURL=validation-core.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-core.d.ts","sourceRoot":"","sources":["../src/validation-core.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,CAAC,EACF,MAAM,wBAAwB,CAAA;AA2C/B,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAiD,CAAA;AACjF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAA2D,CAAA;AAC3F,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAO9B,CAAA;AACF,eAAO,MAAM,sBAAsB
|
|
1
|
+
{"version":3,"file":"validation-core.d.ts","sourceRoot":"","sources":["../src/validation-core.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,CAAC,EACF,MAAM,wBAAwB,CAAA;AA2C/B,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAiD,CAAA;AACjF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAA2D,CAAA;AAC3F,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAO9B,CAAA;AACF,eAAO,MAAM,0BAA0B;;;;;;;;EAQrC,CAAA;AAEF,eAAO,MAAM,wBAAwB;;;EAA0B,CAAA;AAE/D,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsBjC,CAAA;AAEF,eAAO,MAAM,4BAA4B;;;iBAGvC,CAAA;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAC/D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAC/D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAY/D,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;iBAA0B,CAAA;AAChE,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;iBAAoC,CAAA;AAC1E,eAAO,MAAM,4BAA4B;;;;;;;;;iBAKvC,CAAA;AACF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAC3E,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAwB3E,KAAK,cAAc,GAAG;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACpC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACxC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CACzC,CAAA;AAED,KAAK,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AA2BzD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;iBAIjC,CAAA;AAMF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;iBAYjC,CAAA;AAEF;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,cAAc,GACrB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,cAAc,EAAE,CAAA;CAAE,CAGxD;AACD,eAAO,MAAM,yBAAyB;;;;;;;;;;;;iBAKpC,CAAA;AACF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AACrE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAErE,eAAO,MAAM,mBAAmB;;iBAE9B,CAAA;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAE/D,eAAO,MAAM,uBAAuB;;iBAElC,CAAA"}
|
package/dist/validation-core.js
CHANGED
|
@@ -46,6 +46,16 @@ export const selectProductSchema = productCoreSchema.extend({
|
|
|
46
46
|
createdAt: z.coerce.date(),
|
|
47
47
|
updatedAt: z.coerce.date(),
|
|
48
48
|
});
|
|
49
|
+
export const productListSortFieldSchema = z.enum([
|
|
50
|
+
"name",
|
|
51
|
+
"status",
|
|
52
|
+
"sellAmount",
|
|
53
|
+
"pax",
|
|
54
|
+
"startDate",
|
|
55
|
+
"endDate",
|
|
56
|
+
"createdAt",
|
|
57
|
+
]);
|
|
58
|
+
export const productListSortDirSchema = z.enum(["asc", "desc"]);
|
|
49
59
|
export const productListQuerySchema = z.object({
|
|
50
60
|
status: productStatusSchema.optional(),
|
|
51
61
|
bookingMode: productBookingModeSchema.optional(),
|
|
@@ -58,6 +68,14 @@ export const productListQuerySchema = z.object({
|
|
|
58
68
|
categoryId: z.string().optional(),
|
|
59
69
|
tag: z.string().optional(),
|
|
60
70
|
search: z.string().optional(),
|
|
71
|
+
dateFrom: z.string().optional(),
|
|
72
|
+
dateTo: z.string().optional(),
|
|
73
|
+
paxMin: z.coerce.number().int().min(0).optional(),
|
|
74
|
+
paxMax: z.coerce.number().int().min(0).optional(),
|
|
75
|
+
sellAmountMin: z.coerce.number().int().min(0).optional(),
|
|
76
|
+
sellAmountMax: z.coerce.number().int().min(0).optional(),
|
|
77
|
+
sortBy: productListSortFieldSchema.default("createdAt"),
|
|
78
|
+
sortDir: productListSortDirSchema.default("desc"),
|
|
61
79
|
limit: z.coerce.number().int().min(1).max(100).default(50),
|
|
62
80
|
offset: z.coerce.number().int().min(0).default(0),
|
|
63
81
|
});
|
|
@@ -98,8 +116,63 @@ const optionUnitCoreSchema = z.object({
|
|
|
98
116
|
isHidden: z.boolean().default(false),
|
|
99
117
|
sortOrder: z.number().int().default(0),
|
|
100
118
|
});
|
|
101
|
-
|
|
102
|
-
|
|
119
|
+
// Room and vehicle units carry capacity that the storefront pricing math
|
|
120
|
+
// multiplies by (e.g. `room.occupancy * room.quantity` for per_person
|
|
121
|
+
// totals in service-departures). Without occupancyMin set, the multiplier
|
|
122
|
+
// silently falls back to 1 and the booking under-charges — see #481.
|
|
123
|
+
const OCCUPANCY_REQUIRED_TYPES = new Set(["room", "vehicle"]);
|
|
124
|
+
function collectOccupancyIssues(data) {
|
|
125
|
+
const issues = [];
|
|
126
|
+
if (data.unitType &&
|
|
127
|
+
OCCUPANCY_REQUIRED_TYPES.has(data.unitType) &&
|
|
128
|
+
(data.occupancyMin == null || data.occupancyMin < 1)) {
|
|
129
|
+
issues.push({
|
|
130
|
+
path: ["occupancyMin"],
|
|
131
|
+
message: `${data.unitType} units must declare occupancyMin (≥ 1)`,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
if (data.occupancyMin != null &&
|
|
135
|
+
data.occupancyMax != null &&
|
|
136
|
+
data.occupancyMax < data.occupancyMin) {
|
|
137
|
+
issues.push({
|
|
138
|
+
path: ["occupancyMax"],
|
|
139
|
+
message: "occupancyMax must be ≥ occupancyMin",
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return issues;
|
|
143
|
+
}
|
|
144
|
+
export const insertOptionUnitSchema = optionUnitCoreSchema.superRefine((data, ctx) => {
|
|
145
|
+
for (const issue of collectOccupancyIssues(data)) {
|
|
146
|
+
ctx.addIssue({ code: "custom", ...issue });
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
// Partial-update schema only enforces what's statically decidable from the
|
|
150
|
+
// patch alone. The "unitType room/vehicle requires occupancyMin" rule needs
|
|
151
|
+
// the merged record state, so it lives in the service layer below
|
|
152
|
+
// (validateMergedOptionUnit).
|
|
153
|
+
export const updateOptionUnitSchema = optionUnitCoreSchema.partial().superRefine((data, ctx) => {
|
|
154
|
+
if (data.occupancyMin != null &&
|
|
155
|
+
data.occupancyMax != null &&
|
|
156
|
+
data.occupancyMax < data.occupancyMin) {
|
|
157
|
+
ctx.addIssue({
|
|
158
|
+
code: "custom",
|
|
159
|
+
path: ["occupancyMax"],
|
|
160
|
+
message: "occupancyMax must be ≥ occupancyMin",
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
/**
|
|
165
|
+
* Validate the merged state of an option unit — the persisted record with a
|
|
166
|
+
* patch applied. The partial-update schema only sees the patch payload, so
|
|
167
|
+
* it can't catch e.g. PATCH `{ occupancyMin: null }` clearing occupancy on a
|
|
168
|
+
* unit whose persisted unitType is already "room". The service layer fetches
|
|
169
|
+
* the existing row, applies the patch, and runs this against the merged
|
|
170
|
+
* shape before writing.
|
|
171
|
+
*/
|
|
172
|
+
export function validateMergedOptionUnit(merged) {
|
|
173
|
+
const issues = collectOccupancyIssues(merged);
|
|
174
|
+
return issues.length === 0 ? { ok: true } : { ok: false, issues };
|
|
175
|
+
}
|
|
103
176
|
export const optionUnitListQuerySchema = z.object({
|
|
104
177
|
optionId: z.string().optional(),
|
|
105
178
|
unitType: optionUnitTypeSchema.optional(),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voyantjs/products",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.29.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -44,6 +44,76 @@
|
|
|
44
44
|
"import": "./dist/booking-extension.js",
|
|
45
45
|
"default": "./dist/booking-extension.js"
|
|
46
46
|
},
|
|
47
|
+
"./catalog-policy": {
|
|
48
|
+
"types": "./dist/catalog-policy.d.ts",
|
|
49
|
+
"import": "./dist/catalog-policy.js",
|
|
50
|
+
"default": "./dist/catalog-policy.js"
|
|
51
|
+
},
|
|
52
|
+
"./catalog-policy-destinations": {
|
|
53
|
+
"types": "./dist/catalog-policy-destinations.d.ts",
|
|
54
|
+
"import": "./dist/catalog-policy-destinations.js",
|
|
55
|
+
"default": "./dist/catalog-policy-destinations.js"
|
|
56
|
+
},
|
|
57
|
+
"./catalog-policy-taxonomy": {
|
|
58
|
+
"types": "./dist/catalog-policy-taxonomy.d.ts",
|
|
59
|
+
"import": "./dist/catalog-policy-taxonomy.js",
|
|
60
|
+
"default": "./dist/catalog-policy-taxonomy.js"
|
|
61
|
+
},
|
|
62
|
+
"./catalog-policy-departures": {
|
|
63
|
+
"types": "./dist/catalog-policy-departures.d.ts",
|
|
64
|
+
"import": "./dist/catalog-policy-departures.js",
|
|
65
|
+
"default": "./dist/catalog-policy-departures.js"
|
|
66
|
+
},
|
|
67
|
+
"./catalog-policy-pricing": {
|
|
68
|
+
"types": "./dist/catalog-policy-pricing.d.ts",
|
|
69
|
+
"import": "./dist/catalog-policy-pricing.js",
|
|
70
|
+
"default": "./dist/catalog-policy-pricing.js"
|
|
71
|
+
},
|
|
72
|
+
"./catalog-policy-promotions": {
|
|
73
|
+
"types": "./dist/catalog-policy-promotions.d.ts",
|
|
74
|
+
"import": "./dist/catalog-policy-promotions.js",
|
|
75
|
+
"default": "./dist/catalog-policy-promotions.js"
|
|
76
|
+
},
|
|
77
|
+
"./service-catalog-plane": {
|
|
78
|
+
"types": "./dist/service-catalog-plane.d.ts",
|
|
79
|
+
"import": "./dist/service-catalog-plane.js",
|
|
80
|
+
"default": "./dist/service-catalog-plane.js"
|
|
81
|
+
},
|
|
82
|
+
"./service-catalog-plane-destinations": {
|
|
83
|
+
"types": "./dist/service-catalog-plane-destinations.d.ts",
|
|
84
|
+
"import": "./dist/service-catalog-plane-destinations.js",
|
|
85
|
+
"default": "./dist/service-catalog-plane-destinations.js"
|
|
86
|
+
},
|
|
87
|
+
"./service-catalog-plane-taxonomy": {
|
|
88
|
+
"types": "./dist/service-catalog-plane-taxonomy.d.ts",
|
|
89
|
+
"import": "./dist/service-catalog-plane-taxonomy.js",
|
|
90
|
+
"default": "./dist/service-catalog-plane-taxonomy.js"
|
|
91
|
+
},
|
|
92
|
+
"./content-shape": {
|
|
93
|
+
"types": "./dist/content-shape.d.ts",
|
|
94
|
+
"import": "./dist/content-shape.js",
|
|
95
|
+
"default": "./dist/content-shape.js"
|
|
96
|
+
},
|
|
97
|
+
"./service-content": {
|
|
98
|
+
"types": "./dist/service-content.d.ts",
|
|
99
|
+
"import": "./dist/service-content.js",
|
|
100
|
+
"default": "./dist/service-content.js"
|
|
101
|
+
},
|
|
102
|
+
"./service-content-synthesizer": {
|
|
103
|
+
"types": "./dist/service-content-synthesizer.d.ts",
|
|
104
|
+
"import": "./dist/service-content-synthesizer.js",
|
|
105
|
+
"default": "./dist/service-content-synthesizer.js"
|
|
106
|
+
},
|
|
107
|
+
"./routes-content": {
|
|
108
|
+
"types": "./dist/routes-content.d.ts",
|
|
109
|
+
"import": "./dist/routes-content.js",
|
|
110
|
+
"default": "./dist/routes-content.js"
|
|
111
|
+
},
|
|
112
|
+
"./draft-shape": {
|
|
113
|
+
"types": "./dist/draft-shape.d.ts",
|
|
114
|
+
"import": "./dist/draft-shape.js",
|
|
115
|
+
"default": "./dist/draft-shape.js"
|
|
116
|
+
},
|
|
47
117
|
"./booking-engine": {
|
|
48
118
|
"types": "./dist/booking-engine/index.d.ts",
|
|
49
119
|
"import": "./dist/booking-engine/index.js",
|
|
@@ -55,12 +125,12 @@
|
|
|
55
125
|
"hono": "^4.12.10",
|
|
56
126
|
"pdf-lib": "^1.17.1",
|
|
57
127
|
"zod": "^4.3.6",
|
|
58
|
-
"@voyantjs/core": "0.
|
|
59
|
-
"@voyantjs/db": "0.
|
|
60
|
-
"@voyantjs/hono": "0.
|
|
61
|
-
"@voyantjs/utils": "0.
|
|
62
|
-
"@voyantjs/catalog": "0.
|
|
63
|
-
"@voyantjs/storage": "0.
|
|
128
|
+
"@voyantjs/core": "0.29.0",
|
|
129
|
+
"@voyantjs/db": "0.29.0",
|
|
130
|
+
"@voyantjs/hono": "0.29.0",
|
|
131
|
+
"@voyantjs/utils": "0.29.0",
|
|
132
|
+
"@voyantjs/catalog": "0.29.0",
|
|
133
|
+
"@voyantjs/storage": "0.29.0"
|
|
64
134
|
},
|
|
65
135
|
"devDependencies": {
|
|
66
136
|
"typescript": "^6.0.2",
|