@voyantjs/accommodations 0.55.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.
Files changed (47) hide show
  1. package/README.md +11 -0
  2. package/dist/booking-engine/handler.d.ts +103 -0
  3. package/dist/booking-engine/handler.d.ts.map +1 -0
  4. package/dist/booking-engine/handler.js +254 -0
  5. package/dist/booking-engine/index.d.ts +8 -0
  6. package/dist/booking-engine/index.d.ts.map +1 -0
  7. package/dist/booking-engine/index.js +7 -0
  8. package/dist/catalog-policy.d.ts +23 -0
  9. package/dist/catalog-policy.d.ts.map +1 -0
  10. package/dist/catalog-policy.js +422 -0
  11. package/dist/content-shape.d.ts +185 -0
  12. package/dist/content-shape.d.ts.map +1 -0
  13. package/dist/content-shape.js +122 -0
  14. package/dist/draft-shape.d.ts +35 -0
  15. package/dist/draft-shape.d.ts.map +1 -0
  16. package/dist/draft-shape.js +84 -0
  17. package/dist/index.d.ts +8 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +7 -0
  20. package/dist/routes-content.d.ts +31 -0
  21. package/dist/routes-content.d.ts.map +1 -0
  22. package/dist/routes-content.js +87 -0
  23. package/dist/schema-bookings.d.ts +582 -0
  24. package/dist/schema-bookings.d.ts.map +1 -0
  25. package/dist/schema-bookings.js +65 -0
  26. package/dist/schema-inventory.d.ts +1361 -0
  27. package/dist/schema-inventory.d.ts.map +1 -0
  28. package/dist/schema-inventory.js +132 -0
  29. package/dist/schema-shared.d.ts +5 -0
  30. package/dist/schema-shared.d.ts.map +1 -0
  31. package/dist/schema-shared.js +24 -0
  32. package/dist/schema-sourced-content.d.ts +254 -0
  33. package/dist/schema-sourced-content.d.ts.map +1 -0
  34. package/dist/schema-sourced-content.js +48 -0
  35. package/dist/schema.d.ts +5 -0
  36. package/dist/schema.d.ts.map +1 -0
  37. package/dist/schema.js +4 -0
  38. package/dist/service-catalog-plane.d.ts +55 -0
  39. package/dist/service-catalog-plane.d.ts.map +1 -0
  40. package/dist/service-catalog-plane.js +202 -0
  41. package/dist/service-content-synthesizer.d.ts +43 -0
  42. package/dist/service-content-synthesizer.d.ts.map +1 -0
  43. package/dist/service-content-synthesizer.js +149 -0
  44. package/dist/service-content.d.ts +54 -0
  45. package/dist/service-content.d.ts.map +1 -0
  46. package/dist/service-content.js +480 -0
  47. package/package.json +113 -0
@@ -0,0 +1,422 @@
1
+ /**
2
+ * Catalog plane field policy for `packages/accommodations`.
3
+ *
4
+ * The accommodation vertical's catalog entry is the **room type** — the
5
+ * sellable variant within a property. Properties themselves live in
6
+ * `packages/facilities` and are referenced via `propertyId`.
7
+ *
8
+ * Scope of this file:
9
+ * - The root `room_types` table (from `schema-inventory.ts`).
10
+ * - Provenance + identity fields the catalog plane needs to track.
11
+ *
12
+ * Out of scope for this resale package:
13
+ * - hotel-managed physical room units and their lifecycle.
14
+ * - `rate_plans` — variant pricing axis with its own lifecycle.
15
+ * - `meal_plans` — board-basis variants, structural choice axis.
16
+ * - `room_type_bed_configs` — composite list with managed structural
17
+ * fields under each row.
18
+ */
19
+ import { defineFieldPolicy } from "@voyantjs/catalog/contract";
20
+ const ACCOMMODATION_FIELD_POLICY = [
21
+ // ── Source pointer / provenance ─────────────────────────────────────────
22
+ {
23
+ path: "source.kind",
24
+ class: "managed",
25
+ merge: "source-only",
26
+ drift: "critical",
27
+ reindex: "facet-affecting",
28
+ snapshot: "on-book",
29
+ query: "indexed-column",
30
+ localized: false,
31
+ visibility: ["staff"],
32
+ editRole: "none",
33
+ overrideFriction: "none",
34
+ sourceFreshness: "sync",
35
+ },
36
+ {
37
+ path: "source.ref",
38
+ class: "managed",
39
+ merge: "source-only",
40
+ drift: "critical",
41
+ reindex: "none",
42
+ snapshot: "on-book",
43
+ query: "indexed-column",
44
+ localized: false,
45
+ visibility: ["staff"],
46
+ editRole: "none",
47
+ overrideFriction: "none",
48
+ sourceFreshness: "sync",
49
+ },
50
+ {
51
+ path: "seller.operator_id",
52
+ class: "managed",
53
+ merge: "source-only",
54
+ drift: "critical",
55
+ reindex: "none",
56
+ snapshot: "on-book",
57
+ query: "indexed-column",
58
+ localized: false,
59
+ visibility: ["staff"],
60
+ editRole: "none",
61
+ overrideFriction: "none",
62
+ sourceFreshness: "static",
63
+ },
64
+ // ── Identity / lifecycle ────────────────────────────────────────────────
65
+ {
66
+ path: "id",
67
+ class: "managed",
68
+ merge: "source-only",
69
+ drift: "critical",
70
+ reindex: "none",
71
+ snapshot: "on-book",
72
+ query: "first-class-table",
73
+ localized: false,
74
+ visibility: ["staff", "customer", "partner"],
75
+ editRole: "none",
76
+ overrideFriction: "none",
77
+ sourceFreshness: "static",
78
+ },
79
+ {
80
+ path: "code",
81
+ class: "managed",
82
+ merge: "source-only",
83
+ drift: "high",
84
+ reindex: "entry",
85
+ snapshot: "on-book",
86
+ query: "indexed-column",
87
+ localized: false,
88
+ visibility: ["staff"],
89
+ editRole: "none",
90
+ overrideFriction: "none",
91
+ sourceFreshness: "sync",
92
+ },
93
+ {
94
+ path: "createdAt",
95
+ class: "managed",
96
+ merge: "source-only",
97
+ drift: "none",
98
+ reindex: "none",
99
+ snapshot: "on-book",
100
+ query: "indexed-column",
101
+ localized: false,
102
+ visibility: ["staff"],
103
+ editRole: "none",
104
+ overrideFriction: "none",
105
+ sourceFreshness: "static",
106
+ },
107
+ {
108
+ path: "updatedAt",
109
+ class: "managed",
110
+ merge: "source-only",
111
+ drift: "none",
112
+ reindex: "none",
113
+ snapshot: "never",
114
+ query: "indexed-column",
115
+ localized: false,
116
+ visibility: ["staff"],
117
+ editRole: "none",
118
+ overrideFriction: "none",
119
+ sourceFreshness: "sync",
120
+ },
121
+ // ── Cross-module reference (the property the room belongs to) ──────────
122
+ {
123
+ path: "propertyId",
124
+ class: "structural",
125
+ merge: "source-only",
126
+ drift: "critical",
127
+ reindex: "facet-affecting",
128
+ snapshot: "on-book",
129
+ query: "indexed-column",
130
+ localized: false,
131
+ visibility: ["staff", "customer", "partner"],
132
+ editRole: "none",
133
+ overrideFriction: "none",
134
+ sourceFreshness: "sync",
135
+ },
136
+ {
137
+ path: "supplierId",
138
+ class: "structural",
139
+ merge: "source-only",
140
+ drift: "high",
141
+ reindex: "facet-affecting",
142
+ snapshot: "on-book",
143
+ query: "indexed-column",
144
+ localized: false,
145
+ visibility: ["staff"],
146
+ editRole: "none",
147
+ overrideFriction: "none",
148
+ sourceFreshness: "sync",
149
+ },
150
+ // ── Merchandisable / marketing ──────────────────────────────────────────
151
+ {
152
+ path: "name",
153
+ class: "merchandisable",
154
+ merge: "replace",
155
+ drift: "medium",
156
+ reindex: "entry-locale",
157
+ snapshot: "on-book",
158
+ query: "indexed-column",
159
+ localized: true,
160
+ visibility: ["staff", "customer", "partner"],
161
+ editRole: "marketing",
162
+ overrideFriction: "none",
163
+ sourceFreshness: "sync",
164
+ },
165
+ {
166
+ path: "description",
167
+ class: "merchandisable",
168
+ merge: "replace",
169
+ drift: "low",
170
+ reindex: "entry-locale",
171
+ snapshot: "on-book",
172
+ query: "blob-only",
173
+ localized: true,
174
+ visibility: ["staff", "customer", "partner"],
175
+ editRole: "marketing",
176
+ overrideFriction: "none",
177
+ sourceFreshness: "sync",
178
+ },
179
+ {
180
+ path: "accessibilityNotes",
181
+ class: "merchandisable",
182
+ merge: "replace",
183
+ drift: "medium",
184
+ reindex: "entry-locale",
185
+ snapshot: "on-book",
186
+ query: "blob-only",
187
+ localized: true,
188
+ visibility: ["staff", "customer", "partner"],
189
+ editRole: "marketing",
190
+ overrideFriction: "confirm",
191
+ sourceFreshness: "sync",
192
+ },
193
+ {
194
+ path: "thumbnailUrl",
195
+ class: "merchandisable",
196
+ merge: "source-only",
197
+ drift: "low",
198
+ reindex: "entry",
199
+ snapshot: "on-book",
200
+ query: "indexed-column",
201
+ localized: false,
202
+ visibility: ["staff", "customer", "partner"],
203
+ editRole: "none",
204
+ overrideFriction: "none",
205
+ sourceFreshness: "sync",
206
+ },
207
+ // ── Structural / facet-affecting ───────────────────────────────────────
208
+ {
209
+ path: "inventoryMode",
210
+ class: "structural",
211
+ merge: "source-only",
212
+ drift: "high",
213
+ reindex: "entry",
214
+ snapshot: "on-book",
215
+ query: "indexed-column",
216
+ localized: false,
217
+ visibility: ["staff"],
218
+ editRole: "none",
219
+ overrideFriction: "none",
220
+ sourceFreshness: "sync",
221
+ },
222
+ {
223
+ path: "roomClass",
224
+ class: "structural",
225
+ merge: "source-only",
226
+ drift: "medium",
227
+ reindex: "facet-affecting",
228
+ snapshot: "on-book",
229
+ query: "indexed-column",
230
+ localized: false,
231
+ visibility: ["staff", "customer", "partner"],
232
+ editRole: "ops",
233
+ overrideFriction: "confirm",
234
+ sourceFreshness: "sync",
235
+ },
236
+ {
237
+ path: "active",
238
+ class: "structural",
239
+ merge: "source-only",
240
+ drift: "high",
241
+ reindex: "facet-affecting",
242
+ snapshot: "on-book",
243
+ query: "indexed-column",
244
+ localized: false,
245
+ visibility: ["staff"],
246
+ editRole: "none",
247
+ overrideFriction: "none",
248
+ sourceFreshness: "sync",
249
+ },
250
+ {
251
+ path: "smokingAllowed",
252
+ class: "structural",
253
+ merge: "source-only",
254
+ drift: "medium",
255
+ reindex: "facet-affecting",
256
+ snapshot: "on-book",
257
+ query: "indexed-column",
258
+ localized: false,
259
+ visibility: ["staff", "customer", "partner"],
260
+ editRole: "none",
261
+ overrideFriction: "none",
262
+ sourceFreshness: "sync",
263
+ },
264
+ {
265
+ path: "sortOrder",
266
+ class: "structural",
267
+ merge: "replace",
268
+ drift: "none",
269
+ reindex: "entry",
270
+ snapshot: "never",
271
+ query: "indexed-column",
272
+ localized: false,
273
+ visibility: ["staff"],
274
+ editRole: "ops",
275
+ overrideFriction: "none",
276
+ sourceFreshness: "sync",
277
+ },
278
+ // ── Occupancy / capacity (structural — drives search-side filtering) ──
279
+ {
280
+ path: "maxAdults",
281
+ class: "structural",
282
+ merge: "source-only",
283
+ drift: "medium",
284
+ reindex: "facet-affecting",
285
+ snapshot: "on-book",
286
+ query: "indexed-column",
287
+ localized: false,
288
+ visibility: ["staff", "customer", "partner"],
289
+ editRole: "none",
290
+ overrideFriction: "none",
291
+ sourceFreshness: "sync",
292
+ },
293
+ {
294
+ path: "maxChildren",
295
+ class: "structural",
296
+ merge: "source-only",
297
+ drift: "medium",
298
+ reindex: "facet-affecting",
299
+ snapshot: "on-book",
300
+ query: "indexed-column",
301
+ localized: false,
302
+ visibility: ["staff", "customer", "partner"],
303
+ editRole: "none",
304
+ overrideFriction: "none",
305
+ sourceFreshness: "sync",
306
+ },
307
+ {
308
+ path: "maxInfants",
309
+ class: "structural",
310
+ merge: "source-only",
311
+ drift: "medium",
312
+ reindex: "entry",
313
+ snapshot: "on-book",
314
+ query: "indexed-column",
315
+ localized: false,
316
+ visibility: ["staff", "customer", "partner"],
317
+ editRole: "none",
318
+ overrideFriction: "none",
319
+ sourceFreshness: "sync",
320
+ },
321
+ {
322
+ path: "standardOccupancy",
323
+ class: "structural",
324
+ merge: "source-only",
325
+ drift: "medium",
326
+ reindex: "facet-affecting",
327
+ snapshot: "on-book",
328
+ query: "indexed-column",
329
+ localized: false,
330
+ visibility: ["staff", "customer", "partner"],
331
+ editRole: "none",
332
+ overrideFriction: "none",
333
+ sourceFreshness: "sync",
334
+ },
335
+ {
336
+ path: "maxOccupancy",
337
+ class: "structural",
338
+ merge: "source-only",
339
+ drift: "medium",
340
+ reindex: "facet-affecting",
341
+ snapshot: "on-book",
342
+ query: "indexed-column",
343
+ localized: false,
344
+ visibility: ["staff", "customer", "partner"],
345
+ editRole: "none",
346
+ overrideFriction: "none",
347
+ sourceFreshness: "sync",
348
+ },
349
+ {
350
+ path: "minOccupancy",
351
+ class: "structural",
352
+ merge: "source-only",
353
+ drift: "medium",
354
+ reindex: "entry",
355
+ snapshot: "on-book",
356
+ query: "indexed-column",
357
+ localized: false,
358
+ visibility: ["staff", "customer", "partner"],
359
+ editRole: "none",
360
+ overrideFriction: "none",
361
+ sourceFreshness: "sync",
362
+ },
363
+ // ── Physical attributes ────────────────────────────────────────────────
364
+ {
365
+ path: "bedroomCount",
366
+ class: "structural",
367
+ merge: "source-only",
368
+ drift: "medium",
369
+ reindex: "facet-affecting",
370
+ snapshot: "on-book",
371
+ query: "indexed-column",
372
+ localized: false,
373
+ visibility: ["staff", "customer", "partner"],
374
+ editRole: "none",
375
+ overrideFriction: "none",
376
+ sourceFreshness: "sync",
377
+ },
378
+ {
379
+ path: "bathroomCount",
380
+ class: "structural",
381
+ merge: "source-only",
382
+ drift: "medium",
383
+ reindex: "facet-affecting",
384
+ snapshot: "on-book",
385
+ query: "indexed-column",
386
+ localized: false,
387
+ visibility: ["staff", "customer", "partner"],
388
+ editRole: "none",
389
+ overrideFriction: "none",
390
+ sourceFreshness: "sync",
391
+ },
392
+ {
393
+ path: "areaValue",
394
+ class: "structural",
395
+ merge: "source-only",
396
+ drift: "low",
397
+ reindex: "entry",
398
+ snapshot: "on-book",
399
+ query: "indexed-column",
400
+ localized: false,
401
+ visibility: ["staff", "customer", "partner"],
402
+ editRole: "none",
403
+ overrideFriction: "none",
404
+ sourceFreshness: "sync",
405
+ },
406
+ {
407
+ path: "areaUnit",
408
+ class: "managed",
409
+ merge: "source-only",
410
+ drift: "low",
411
+ reindex: "none",
412
+ snapshot: "on-book",
413
+ query: "blob-only",
414
+ localized: false,
415
+ visibility: ["staff", "customer", "partner"],
416
+ editRole: "none",
417
+ overrideFriction: "none",
418
+ sourceFreshness: "sync",
419
+ },
420
+ ];
421
+ export const accommodationCatalogPolicy = defineFieldPolicy(ACCOMMODATION_FIELD_POLICY);
422
+ export { ACCOMMODATION_FIELD_POLICY };
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Accommodation content shape — the rich detail-page content shape
3
+ * returned by `getContent` for sourced room types (bedbanks like
4
+ * Hotelbeds / Expedia, direct-property feeds, hotel groups via Voyant
5
+ * Connect).
6
+ *
7
+ * Per sourced-content §3.6, the accommodation content aggregate is
8
+ * `{ hotel, room_types[], rate_plans[], meal_plans[], amenities[],
9
+ * policies[] }` — one payload returned by a single `getContent`.
10
+ * Pricing stays out (volatile-live, flows through `liveResolve`).
11
+ *
12
+ * The aggregate is **per property** — one row per property × locale ×
13
+ * market — even though the sellable catalog entry is a room type.
14
+ * That's because bedbanks return whole-property payloads and splitting
15
+ * by room type would multiply cache writes and refresh work without
16
+ * benefit. The vertical's read service projects the cached property
17
+ * payload to the requested room-type detail page.
18
+ *
19
+ * See `docs/architecture/catalog-sourced-content.md` §3.2, §3.5.4, §3.6.
20
+ */
21
+ import { type ContentOverlay, type MergeOverlaysOptions } from "@voyantjs/catalog";
22
+ import { z } from "zod";
23
+ export declare const ACCOMMODATION_CONTENT_SCHEMA_VERSION = "accommodations/v1";
24
+ export declare const hotelSummarySchema: z.ZodObject<{
25
+ id: z.ZodString;
26
+ name: z.ZodString;
27
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
28
+ star_rating: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
29
+ hero_image_url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
30
+ highlights: z.ZodOptional<z.ZodArray<z.ZodString>>;
31
+ brand: z.ZodOptional<z.ZodNullable<z.ZodString>>;
32
+ country: z.ZodOptional<z.ZodNullable<z.ZodString>>;
33
+ city: z.ZodOptional<z.ZodNullable<z.ZodString>>;
34
+ address: z.ZodOptional<z.ZodNullable<z.ZodString>>;
35
+ postal_code: z.ZodOptional<z.ZodNullable<z.ZodString>>;
36
+ latitude: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
37
+ longitude: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
38
+ check_in_time: z.ZodOptional<z.ZodNullable<z.ZodString>>;
39
+ check_out_time: z.ZodOptional<z.ZodNullable<z.ZodString>>;
40
+ }, z.core.$strip>;
41
+ export declare const accommodationRoomTypeSchema: z.ZodObject<{
42
+ id: z.ZodString;
43
+ code: z.ZodOptional<z.ZodNullable<z.ZodString>>;
44
+ name: z.ZodString;
45
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
46
+ room_class: z.ZodOptional<z.ZodNullable<z.ZodString>>;
47
+ view: z.ZodOptional<z.ZodNullable<z.ZodString>>;
48
+ bedrooms: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
49
+ beds: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
50
+ size_sqm: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
51
+ max_adults: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
52
+ max_children: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
53
+ max_occupancy: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
54
+ amenities: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
55
+ images: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
56
+ }, z.core.$strip>;
57
+ export declare const accommodationRatePlanSchema: z.ZodObject<{
58
+ id: z.ZodString;
59
+ code: z.ZodOptional<z.ZodNullable<z.ZodString>>;
60
+ name: z.ZodString;
61
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
62
+ charge_frequency: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
63
+ per_night: "per_night";
64
+ per_stay: "per_stay";
65
+ }>>>;
66
+ applies_to_room_type_ids: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
67
+ cancellation_policy: z.ZodOptional<z.ZodNullable<z.ZodString>>;
68
+ inclusions: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
69
+ }, z.core.$strip>;
70
+ export declare const accommodationMealPlanSchema: z.ZodObject<{
71
+ id: z.ZodString;
72
+ code: z.ZodOptional<z.ZodNullable<z.ZodString>>;
73
+ name: z.ZodString;
74
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
75
+ basis: z.ZodString;
76
+ inclusions: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
77
+ }, z.core.$strip>;
78
+ export declare const accommodationAmenitySchema: z.ZodObject<{
79
+ id: z.ZodString;
80
+ category: z.ZodOptional<z.ZodNullable<z.ZodString>>;
81
+ name: z.ZodString;
82
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
83
+ is_free: z.ZodOptional<z.ZodBoolean>;
84
+ }, z.core.$strip>;
85
+ export declare const accommodationPolicySchema: z.ZodObject<{
86
+ kind: z.ZodEnum<{
87
+ supplier_notes: "supplier_notes";
88
+ payment: "payment";
89
+ cancellation: "cancellation";
90
+ requirements: "requirements";
91
+ check_in: "check_in";
92
+ }>;
93
+ body: z.ZodString;
94
+ rules: z.ZodOptional<z.ZodUnknown>;
95
+ }, z.core.$strip>;
96
+ export declare const accommodationContentSchema: z.ZodObject<{
97
+ hotel: z.ZodObject<{
98
+ id: z.ZodString;
99
+ name: z.ZodString;
100
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
101
+ star_rating: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
102
+ hero_image_url: z.ZodOptional<z.ZodNullable<z.ZodString>>;
103
+ highlights: z.ZodOptional<z.ZodArray<z.ZodString>>;
104
+ brand: z.ZodOptional<z.ZodNullable<z.ZodString>>;
105
+ country: z.ZodOptional<z.ZodNullable<z.ZodString>>;
106
+ city: z.ZodOptional<z.ZodNullable<z.ZodString>>;
107
+ address: z.ZodOptional<z.ZodNullable<z.ZodString>>;
108
+ postal_code: z.ZodOptional<z.ZodNullable<z.ZodString>>;
109
+ latitude: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
110
+ longitude: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
111
+ check_in_time: z.ZodOptional<z.ZodNullable<z.ZodString>>;
112
+ check_out_time: z.ZodOptional<z.ZodNullable<z.ZodString>>;
113
+ }, z.core.$strip>;
114
+ room_types: z.ZodDefault<z.ZodArray<z.ZodObject<{
115
+ id: z.ZodString;
116
+ code: z.ZodOptional<z.ZodNullable<z.ZodString>>;
117
+ name: z.ZodString;
118
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
119
+ room_class: z.ZodOptional<z.ZodNullable<z.ZodString>>;
120
+ view: z.ZodOptional<z.ZodNullable<z.ZodString>>;
121
+ bedrooms: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
122
+ beds: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
123
+ size_sqm: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
124
+ max_adults: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
125
+ max_children: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
126
+ max_occupancy: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
127
+ amenities: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
128
+ images: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
129
+ }, z.core.$strip>>>;
130
+ rate_plans: z.ZodDefault<z.ZodArray<z.ZodObject<{
131
+ id: z.ZodString;
132
+ code: z.ZodOptional<z.ZodNullable<z.ZodString>>;
133
+ name: z.ZodString;
134
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
135
+ charge_frequency: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
136
+ per_night: "per_night";
137
+ per_stay: "per_stay";
138
+ }>>>;
139
+ applies_to_room_type_ids: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
140
+ cancellation_policy: z.ZodOptional<z.ZodNullable<z.ZodString>>;
141
+ inclusions: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
142
+ }, z.core.$strip>>>;
143
+ meal_plans: z.ZodDefault<z.ZodArray<z.ZodObject<{
144
+ id: z.ZodString;
145
+ code: z.ZodOptional<z.ZodNullable<z.ZodString>>;
146
+ name: z.ZodString;
147
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
148
+ basis: z.ZodString;
149
+ inclusions: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
150
+ }, z.core.$strip>>>;
151
+ amenities: z.ZodDefault<z.ZodArray<z.ZodObject<{
152
+ id: z.ZodString;
153
+ category: z.ZodOptional<z.ZodNullable<z.ZodString>>;
154
+ name: z.ZodString;
155
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
156
+ is_free: z.ZodOptional<z.ZodBoolean>;
157
+ }, z.core.$strip>>>;
158
+ policies: z.ZodDefault<z.ZodArray<z.ZodObject<{
159
+ kind: z.ZodEnum<{
160
+ supplier_notes: "supplier_notes";
161
+ payment: "payment";
162
+ cancellation: "cancellation";
163
+ requirements: "requirements";
164
+ check_in: "check_in";
165
+ }>;
166
+ body: z.ZodString;
167
+ rules: z.ZodOptional<z.ZodUnknown>;
168
+ }, z.core.$strip>>>;
169
+ }, z.core.$strip>;
170
+ export type AccommodationContent = z.infer<typeof accommodationContentSchema>;
171
+ export type HotelSummary = z.infer<typeof hotelSummarySchema>;
172
+ export type AccommodationRoomType = z.infer<typeof accommodationRoomTypeSchema>;
173
+ export type AccommodationRatePlan = z.infer<typeof accommodationRatePlanSchema>;
174
+ export type AccommodationMealPlan = z.infer<typeof accommodationMealPlanSchema>;
175
+ export type AccommodationAmenity = z.infer<typeof accommodationAmenitySchema>;
176
+ export type AccommodationPolicy = z.infer<typeof accommodationPolicySchema>;
177
+ export declare function validateAccommodationContent(payload: unknown): {
178
+ valid: true;
179
+ content: AccommodationContent;
180
+ } | {
181
+ valid: false;
182
+ reason: string;
183
+ };
184
+ export declare function mergeOverlaysIntoAccommodationContent(payload: AccommodationContent, overlays: ReadonlyArray<ContentOverlay>, options?: Pick<MergeOverlaysOptions, "onOverlayError">): AccommodationContent;
185
+ //# sourceMappingURL=content-shape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-shape.d.ts","sourceRoot":"","sources":["../src/content-shape.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,oBAAoB,EAE1B,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,oCAAoC,sBAAsB,CAAA;AAEvE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;iBAkB7B,CAAA;AAEF,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;iBAgBtC,CAAA;AAEF,eAAO,MAAM,2BAA2B;;;;;;;;;;;;iBAWtC,CAAA;AAEF,eAAO,MAAM,2BAA2B;;;;;;;iBAQtC,CAAA;AAEF,eAAO,MAAM,0BAA0B;;;;;;iBAOrC,CAAA;AAEF,eAAO,MAAM,yBAAyB;;;;;;;;;;iBAIpC,CAAA;AAEF,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAOrC,CAAA;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAA;AAC7E,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAC7D,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,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAA;AAC/E,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAA;AAC7E,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAE3E,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,OAAO,GACf;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAUnF;AAED,wBAAgB,qCAAqC,CACnD,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,EACvC,OAAO,GAAE,IAAI,CAAC,oBAAoB,EAAE,gBAAgB,CAAM,GACzD,oBAAoB,CAStB"}