@voyant-travel/cruises 0.118.2

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 (210) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +50 -0
  3. package/dist/adapters/connect-compat.d.ts +20 -0
  4. package/dist/adapters/connect-compat.d.ts.map +1 -0
  5. package/dist/adapters/connect-compat.js +71 -0
  6. package/dist/adapters/contract-fixture.d.ts +32 -0
  7. package/dist/adapters/contract-fixture.d.ts.map +1 -0
  8. package/dist/adapters/contract-fixture.js +152 -0
  9. package/dist/adapters/index.d.ts +331 -0
  10. package/dist/adapters/index.d.ts.map +1 -0
  11. package/dist/adapters/index.js +16 -0
  12. package/dist/adapters/memoize.d.ts +28 -0
  13. package/dist/adapters/memoize.d.ts.map +1 -0
  14. package/dist/adapters/memoize.js +131 -0
  15. package/dist/adapters/mock.d.ts +44 -0
  16. package/dist/adapters/mock.d.ts.map +1 -0
  17. package/dist/adapters/mock.js +192 -0
  18. package/dist/adapters/registry.d.ts +26 -0
  19. package/dist/adapters/registry.d.ts.map +1 -0
  20. package/dist/adapters/registry.js +42 -0
  21. package/dist/adapters/source-adapter-shim.d.ts +80 -0
  22. package/dist/adapters/source-adapter-shim.d.ts.map +1 -0
  23. package/dist/adapters/source-adapter-shim.js +390 -0
  24. package/dist/booking-engine/handler.d.ts +108 -0
  25. package/dist/booking-engine/handler.d.ts.map +1 -0
  26. package/dist/booking-engine/handler.js +225 -0
  27. package/dist/booking-engine/index.d.ts +9 -0
  28. package/dist/booking-engine/index.d.ts.map +1 -0
  29. package/dist/booking-engine/index.js +8 -0
  30. package/dist/booking-extension.d.ts +1179 -0
  31. package/dist/booking-extension.d.ts.map +1 -0
  32. package/dist/booking-extension.js +342 -0
  33. package/dist/cabin-features.d.ts +8 -0
  34. package/dist/cabin-features.d.ts.map +1 -0
  35. package/dist/cabin-features.js +7 -0
  36. package/dist/catalog-policy-cabins.d.ts +18 -0
  37. package/dist/catalog-policy-cabins.d.ts.map +1 -0
  38. package/dist/catalog-policy-cabins.js +96 -0
  39. package/dist/catalog-policy-core.d.ts +3 -0
  40. package/dist/catalog-policy-core.d.ts.map +1 -0
  41. package/dist/catalog-policy-core.js +247 -0
  42. package/dist/catalog-policy-structure.d.ts +3 -0
  43. package/dist/catalog-policy-structure.d.ts.map +1 -0
  44. package/dist/catalog-policy-structure.js +387 -0
  45. package/dist/catalog-policy.d.ts +15 -0
  46. package/dist/catalog-policy.d.ts.map +1 -0
  47. package/dist/catalog-policy.js +19 -0
  48. package/dist/content-shape.d.ts +5 -0
  49. package/dist/content-shape.d.ts.map +1 -0
  50. package/dist/content-shape.js +13 -0
  51. package/dist/draft-shape.d.ts +59 -0
  52. package/dist/draft-shape.d.ts.map +1 -0
  53. package/dist/draft-shape.js +98 -0
  54. package/dist/events.d.ts +21 -0
  55. package/dist/events.d.ts.map +1 -0
  56. package/dist/events.js +21 -0
  57. package/dist/index.d.ts +43 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +66 -0
  60. package/dist/lib/key.d.ts +41 -0
  61. package/dist/lib/key.d.ts.map +1 -0
  62. package/dist/lib/key.js +100 -0
  63. package/dist/routes-booking-payloads.d.ts +133 -0
  64. package/dist/routes-booking-payloads.d.ts.map +1 -0
  65. package/dist/routes-booking-payloads.js +142 -0
  66. package/dist/routes-content.d.ts +53 -0
  67. package/dist/routes-content.d.ts.map +1 -0
  68. package/dist/routes-content.js +158 -0
  69. package/dist/routes-core.d.ts +4 -0
  70. package/dist/routes-core.d.ts.map +1 -0
  71. package/dist/routes-core.js +68 -0
  72. package/dist/routes-detail.d.ts +4 -0
  73. package/dist/routes-detail.d.ts.map +1 -0
  74. package/dist/routes-detail.js +261 -0
  75. package/dist/routes-env.d.ts +13 -0
  76. package/dist/routes-env.d.ts.map +1 -0
  77. package/dist/routes-env.js +1 -0
  78. package/dist/routes-keying.d.ts +28 -0
  79. package/dist/routes-keying.d.ts.map +1 -0
  80. package/dist/routes-keying.js +70 -0
  81. package/dist/routes-public.d.ts +911 -0
  82. package/dist/routes-public.d.ts.map +1 -0
  83. package/dist/routes-public.js +252 -0
  84. package/dist/routes-sailings-prices.d.ts +4 -0
  85. package/dist/routes-sailings-prices.d.ts.map +1 -0
  86. package/dist/routes-sailings-prices.js +278 -0
  87. package/dist/routes-search-index.d.ts +4 -0
  88. package/dist/routes-search-index.d.ts.map +1 -0
  89. package/dist/routes-search-index.js +25 -0
  90. package/dist/routes-ships.d.ts +4 -0
  91. package/dist/routes-ships.d.ts.map +1 -0
  92. package/dist/routes-ships.js +147 -0
  93. package/dist/routes-voyage-groups.d.ts +4 -0
  94. package/dist/routes-voyage-groups.d.ts.map +1 -0
  95. package/dist/routes-voyage-groups.js +85 -0
  96. package/dist/routes.d.ts +5 -0
  97. package/dist/routes.d.ts.map +1 -0
  98. package/dist/routes.js +14 -0
  99. package/dist/schema-cabins.d.ts +1098 -0
  100. package/dist/schema-cabins.d.ts.map +1 -0
  101. package/dist/schema-cabins.js +105 -0
  102. package/dist/schema-content.d.ts +577 -0
  103. package/dist/schema-content.d.ts.map +1 -0
  104. package/dist/schema-content.js +63 -0
  105. package/dist/schema-core.d.ts +1790 -0
  106. package/dist/schema-core.d.ts.map +1 -0
  107. package/dist/schema-core.js +171 -0
  108. package/dist/schema-itinerary.d.ts +556 -0
  109. package/dist/schema-itinerary.d.ts.map +1 -0
  110. package/dist/schema-itinerary.js +50 -0
  111. package/dist/schema-pricing.d.ts +633 -0
  112. package/dist/schema-pricing.d.ts.map +1 -0
  113. package/dist/schema-pricing.js +73 -0
  114. package/dist/schema-search.d.ts +611 -0
  115. package/dist/schema-search.d.ts.map +1 -0
  116. package/dist/schema-search.js +64 -0
  117. package/dist/schema-shared.d.ts +23 -0
  118. package/dist/schema-shared.d.ts.map +1 -0
  119. package/dist/schema-shared.js +107 -0
  120. package/dist/schema-sourced-content.d.ts +247 -0
  121. package/dist/schema-sourced-content.d.ts.map +1 -0
  122. package/dist/schema-sourced-content.js +38 -0
  123. package/dist/schema.d.ts +10 -0
  124. package/dist/schema.d.ts.map +1 -0
  125. package/dist/schema.js +9 -0
  126. package/dist/service-booking-helpers.d.ts +12 -0
  127. package/dist/service-booking-helpers.d.ts.map +1 -0
  128. package/dist/service-booking-helpers.js +94 -0
  129. package/dist/service-booking-types.d.ts +101 -0
  130. package/dist/service-booking-types.d.ts.map +1 -0
  131. package/dist/service-booking-types.js +1 -0
  132. package/dist/service-bookings.d.ts +46 -0
  133. package/dist/service-bookings.d.ts.map +1 -0
  134. package/dist/service-bookings.js +420 -0
  135. package/dist/service-catalog-plane-cabins.d.ts +24 -0
  136. package/dist/service-catalog-plane-cabins.d.ts.map +1 -0
  137. package/dist/service-catalog-plane-cabins.js +90 -0
  138. package/dist/service-catalog-plane.d.ts +74 -0
  139. package/dist/service-catalog-plane.d.ts.map +1 -0
  140. package/dist/service-catalog-plane.js +194 -0
  141. package/dist/service-content-synthesizer.d.ts +42 -0
  142. package/dist/service-content-synthesizer.d.ts.map +1 -0
  143. package/dist/service-content-synthesizer.js +144 -0
  144. package/dist/service-content.d.ts +74 -0
  145. package/dist/service-content.d.ts.map +1 -0
  146. package/dist/service-content.js +315 -0
  147. package/dist/service-core.d.ts +134 -0
  148. package/dist/service-core.d.ts.map +1 -0
  149. package/dist/service-core.js +257 -0
  150. package/dist/service-detach.d.ts +18 -0
  151. package/dist/service-detach.d.ts.map +1 -0
  152. package/dist/service-detach.js +199 -0
  153. package/dist/service-enrichment.d.ts +11 -0
  154. package/dist/service-enrichment.d.ts.map +1 -0
  155. package/dist/service-enrichment.js +47 -0
  156. package/dist/service-external-refresh.d.ts +39 -0
  157. package/dist/service-external-refresh.d.ts.map +1 -0
  158. package/dist/service-external-refresh.js +47 -0
  159. package/dist/service-itinerary.d.ts +22 -0
  160. package/dist/service-itinerary.d.ts.map +1 -0
  161. package/dist/service-itinerary.js +34 -0
  162. package/dist/service-prices.d.ts +46 -0
  163. package/dist/service-prices.d.ts.map +1 -0
  164. package/dist/service-prices.js +89 -0
  165. package/dist/service-pricing.d.ts +97 -0
  166. package/dist/service-pricing.d.ts.map +1 -0
  167. package/dist/service-pricing.js +198 -0
  168. package/dist/service-sailings.d.ts +48 -0
  169. package/dist/service-sailings.d.ts.map +1 -0
  170. package/dist/service-sailings.js +145 -0
  171. package/dist/service-search-types.d.ts +54 -0
  172. package/dist/service-search-types.d.ts.map +1 -0
  173. package/dist/service-search-types.js +1 -0
  174. package/dist/service-search.d.ts +65 -0
  175. package/dist/service-search.d.ts.map +1 -0
  176. package/dist/service-search.js +467 -0
  177. package/dist/service-shared.d.ts +22 -0
  178. package/dist/service-shared.d.ts.map +1 -0
  179. package/dist/service-shared.js +22 -0
  180. package/dist/service-ships.d.ts +47 -0
  181. package/dist/service-ships.d.ts.map +1 -0
  182. package/dist/service-ships.js +156 -0
  183. package/dist/service.d.ts +255 -0
  184. package/dist/service.d.ts.map +1 -0
  185. package/dist/service.js +12 -0
  186. package/dist/validation-cabins.d.ts +267 -0
  187. package/dist/validation-cabins.d.ts.map +1 -0
  188. package/dist/validation-cabins.js +77 -0
  189. package/dist/validation-content.d.ts +123 -0
  190. package/dist/validation-content.d.ts.map +1 -0
  191. package/dist/validation-content.js +40 -0
  192. package/dist/validation-core.d.ts +393 -0
  193. package/dist/validation-core.d.ts.map +1 -0
  194. package/dist/validation-core.js +162 -0
  195. package/dist/validation-itinerary.d.ts +123 -0
  196. package/dist/validation-itinerary.d.ts.map +1 -0
  197. package/dist/validation-itinerary.js +47 -0
  198. package/dist/validation-pricing.d.ts +137 -0
  199. package/dist/validation-pricing.d.ts.map +1 -0
  200. package/dist/validation-pricing.js +49 -0
  201. package/dist/validation-search.d.ts +118 -0
  202. package/dist/validation-search.d.ts.map +1 -0
  203. package/dist/validation-search.js +60 -0
  204. package/dist/validation-shared.d.ts +123 -0
  205. package/dist/validation-shared.d.ts.map +1 -0
  206. package/dist/validation-shared.js +103 -0
  207. package/dist/validation.d.ts +8 -0
  208. package/dist/validation.d.ts.map +1 -0
  209. package/dist/validation.js +7 -0
  210. package/package.json +146 -0
@@ -0,0 +1,247 @@
1
+ export const CRUISE_CORE_FIELD_POLICY = [
2
+ // ── Source pointer / provenance ─────────────────────────────────────────
3
+ {
4
+ path: "source.kind",
5
+ class: "managed",
6
+ merge: "source-only",
7
+ drift: "critical",
8
+ reindex: "facet-affecting",
9
+ snapshot: "on-book",
10
+ query: "indexed-column",
11
+ localized: false,
12
+ visibility: ["staff"],
13
+ editRole: "none",
14
+ overrideFriction: "none",
15
+ sourceFreshness: "sync",
16
+ },
17
+ {
18
+ path: "source.ref",
19
+ class: "managed",
20
+ merge: "source-only",
21
+ drift: "critical",
22
+ reindex: "none",
23
+ snapshot: "on-book",
24
+ query: "indexed-column",
25
+ localized: false,
26
+ visibility: ["staff"],
27
+ editRole: "none",
28
+ overrideFriction: "none",
29
+ sourceFreshness: "sync",
30
+ },
31
+ {
32
+ path: "seller.operator_id",
33
+ class: "managed",
34
+ merge: "source-only",
35
+ drift: "critical",
36
+ reindex: "none",
37
+ snapshot: "on-book",
38
+ query: "indexed-column",
39
+ localized: false,
40
+ visibility: ["staff"],
41
+ editRole: "none",
42
+ overrideFriction: "none",
43
+ sourceFreshness: "static",
44
+ },
45
+ // ── Identity / lifecycle ────────────────────────────────────────────────
46
+ {
47
+ path: "id",
48
+ class: "managed",
49
+ merge: "source-only",
50
+ drift: "critical",
51
+ reindex: "none",
52
+ snapshot: "on-book",
53
+ query: "first-class-table",
54
+ localized: false,
55
+ visibility: ["staff", "customer", "partner"],
56
+ editRole: "none",
57
+ overrideFriction: "none",
58
+ sourceFreshness: "static",
59
+ },
60
+ {
61
+ path: "slug",
62
+ class: "managed",
63
+ merge: "source-only",
64
+ drift: "high",
65
+ reindex: "entry",
66
+ snapshot: "on-book",
67
+ query: "indexed-column",
68
+ localized: false,
69
+ visibility: ["staff", "customer", "partner"],
70
+ editRole: "none",
71
+ overrideFriction: "none",
72
+ sourceFreshness: "sync",
73
+ },
74
+ {
75
+ path: "createdAt",
76
+ class: "managed",
77
+ merge: "source-only",
78
+ drift: "none",
79
+ reindex: "none",
80
+ snapshot: "on-book",
81
+ query: "indexed-column",
82
+ localized: false,
83
+ visibility: ["staff"],
84
+ editRole: "none",
85
+ overrideFriction: "none",
86
+ sourceFreshness: "static",
87
+ },
88
+ {
89
+ path: "updatedAt",
90
+ class: "managed",
91
+ merge: "source-only",
92
+ drift: "none",
93
+ reindex: "none",
94
+ snapshot: "never",
95
+ query: "indexed-column",
96
+ localized: false,
97
+ visibility: ["staff"],
98
+ editRole: "none",
99
+ overrideFriction: "none",
100
+ sourceFreshness: "sync",
101
+ },
102
+ {
103
+ path: "externalRefs",
104
+ class: "managed",
105
+ merge: "source-only",
106
+ drift: "medium",
107
+ reindex: "none",
108
+ snapshot: "on-book",
109
+ query: "blob-only",
110
+ localized: false,
111
+ visibility: ["staff"],
112
+ editRole: "none",
113
+ overrideFriction: "none",
114
+ sourceFreshness: "sync",
115
+ },
116
+ // ── Merchandisable / marketing ──────────────────────────────────────────
117
+ {
118
+ path: "name",
119
+ class: "merchandisable",
120
+ merge: "replace",
121
+ drift: "medium",
122
+ reindex: "entry-locale",
123
+ snapshot: "on-book",
124
+ query: "indexed-column",
125
+ localized: true,
126
+ visibility: ["staff", "customer", "partner"],
127
+ editRole: "marketing",
128
+ overrideFriction: "none",
129
+ sourceFreshness: "sync",
130
+ },
131
+ {
132
+ path: "description",
133
+ class: "merchandisable",
134
+ merge: "replace",
135
+ drift: "low",
136
+ reindex: "entry-locale",
137
+ snapshot: "on-book",
138
+ query: "blob-only",
139
+ localized: true,
140
+ visibility: ["staff", "customer", "partner"],
141
+ editRole: "marketing",
142
+ overrideFriction: "none",
143
+ sourceFreshness: "sync",
144
+ },
145
+ {
146
+ path: "shortDescription",
147
+ class: "merchandisable",
148
+ merge: "replace",
149
+ drift: "low",
150
+ reindex: "entry-locale",
151
+ snapshot: "on-book",
152
+ query: "indexed-column",
153
+ localized: true,
154
+ visibility: ["staff", "customer", "partner"],
155
+ editRole: "marketing",
156
+ overrideFriction: "none",
157
+ sourceFreshness: "sync",
158
+ },
159
+ {
160
+ path: "highlights",
161
+ class: "merchandisable",
162
+ merge: "additive-list",
163
+ drift: "low",
164
+ reindex: "entry-locale",
165
+ snapshot: "on-book",
166
+ query: "blob-only",
167
+ localized: true,
168
+ visibility: ["staff", "customer", "partner"],
169
+ editRole: "marketing",
170
+ overrideFriction: "none",
171
+ sourceFreshness: "sync",
172
+ },
173
+ {
174
+ // Note: split rule §7.1 — `inclusionsHtml` is human-readable copy;
175
+ // `cruiseInclusionEntitlements` (deferred — child entity) is the
176
+ // machine-evaluable form. Today they live in separate columns; the
177
+ // split is honored.
178
+ path: "inclusionsHtml",
179
+ class: "merchandisable",
180
+ merge: "replace",
181
+ drift: "medium",
182
+ reindex: "entry-locale",
183
+ snapshot: "on-book",
184
+ query: "blob-only",
185
+ localized: true,
186
+ visibility: ["staff", "customer", "partner"],
187
+ editRole: "marketing",
188
+ overrideFriction: "none",
189
+ sourceFreshness: "sync",
190
+ },
191
+ {
192
+ path: "exclusionsHtml",
193
+ class: "merchandisable",
194
+ merge: "replace",
195
+ drift: "medium",
196
+ reindex: "entry-locale",
197
+ snapshot: "on-book",
198
+ query: "blob-only",
199
+ localized: true,
200
+ visibility: ["staff", "customer", "partner"],
201
+ editRole: "marketing",
202
+ overrideFriction: "none",
203
+ sourceFreshness: "sync",
204
+ },
205
+ {
206
+ path: "heroImageUrl",
207
+ class: "merchandisable",
208
+ merge: "replace",
209
+ drift: "low",
210
+ reindex: "entry",
211
+ snapshot: "on-book",
212
+ query: "blob-only",
213
+ localized: false,
214
+ visibility: ["staff", "customer", "partner"],
215
+ editRole: "marketing",
216
+ overrideFriction: "none",
217
+ sourceFreshness: "sync",
218
+ },
219
+ {
220
+ path: "thumbnailUrl",
221
+ class: "merchandisable",
222
+ merge: "source-only",
223
+ drift: "low",
224
+ reindex: "entry",
225
+ snapshot: "on-book",
226
+ query: "indexed-column",
227
+ localized: false,
228
+ visibility: ["staff", "customer", "partner"],
229
+ editRole: "none",
230
+ overrideFriction: "none",
231
+ sourceFreshness: "sync",
232
+ },
233
+ {
234
+ path: "mapImageUrl",
235
+ class: "merchandisable",
236
+ merge: "replace",
237
+ drift: "low",
238
+ reindex: "entry",
239
+ snapshot: "on-book",
240
+ query: "blob-only",
241
+ localized: false,
242
+ visibility: ["staff", "customer", "partner"],
243
+ editRole: "marketing",
244
+ overrideFriction: "none",
245
+ sourceFreshness: "sync",
246
+ },
247
+ ];
@@ -0,0 +1,3 @@
1
+ import type { FieldPolicyInput } from "@voyant-travel/catalog/contract";
2
+ export declare const CRUISE_STRUCTURE_FIELD_POLICY: FieldPolicyInput[];
3
+ //# sourceMappingURL=catalog-policy-structure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-policy-structure.d.ts","sourceRoot":"","sources":["../src/catalog-policy-structure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAEvE,eAAO,MAAM,6BAA6B,EAAE,gBAAgB,EAmY3D,CAAA"}
@@ -0,0 +1,387 @@
1
+ export const CRUISE_STRUCTURE_FIELD_POLICY = [
2
+ // ── Structural / facet-affecting ───────────────────────────────────────
3
+ {
4
+ path: "cruiseType",
5
+ class: "structural",
6
+ merge: "source-only",
7
+ drift: "high",
8
+ reindex: "facet-affecting",
9
+ snapshot: "on-book",
10
+ query: "indexed-column",
11
+ localized: false,
12
+ visibility: ["staff", "customer", "partner"],
13
+ editRole: "none",
14
+ overrideFriction: "none",
15
+ sourceFreshness: "sync",
16
+ },
17
+ {
18
+ // Supply mechanic — cruises are always `scheduled` (fixed dated sailings
19
+ // with cabin allotment). See docs/architecture/catalog-supply-models.md.
20
+ path: "supplyModel",
21
+ class: "structural",
22
+ merge: "source-only",
23
+ drift: "low",
24
+ reindex: "facet-affecting",
25
+ snapshot: "on-book",
26
+ query: "indexed-column",
27
+ localized: false,
28
+ visibility: ["staff", "customer", "partner"],
29
+ editRole: "none",
30
+ overrideFriction: "none",
31
+ sourceFreshness: "sync",
32
+ },
33
+ {
34
+ path: "status",
35
+ class: "structural",
36
+ merge: "source-only",
37
+ drift: "high",
38
+ reindex: "facet-affecting",
39
+ snapshot: "on-book",
40
+ query: "indexed-column",
41
+ localized: false,
42
+ visibility: ["staff"],
43
+ editRole: "none",
44
+ overrideFriction: "none",
45
+ sourceFreshness: "sync",
46
+ },
47
+ {
48
+ path: "lineSupplierId",
49
+ class: "structural",
50
+ merge: "source-only",
51
+ drift: "high",
52
+ reindex: "facet-affecting",
53
+ snapshot: "on-book",
54
+ query: "indexed-column",
55
+ localized: false,
56
+ visibility: ["staff", "customer", "partner"],
57
+ editRole: "none",
58
+ overrideFriction: "none",
59
+ sourceFreshness: "sync",
60
+ },
61
+ {
62
+ path: "defaultShipId",
63
+ class: "structural",
64
+ merge: "source-only",
65
+ drift: "medium",
66
+ reindex: "entry",
67
+ snapshot: "on-book",
68
+ query: "indexed-column",
69
+ localized: false,
70
+ visibility: ["staff", "customer", "partner"],
71
+ editRole: "none",
72
+ overrideFriction: "none",
73
+ sourceFreshness: "sync",
74
+ },
75
+ {
76
+ path: "nights",
77
+ class: "structural",
78
+ merge: "source-only",
79
+ drift: "high",
80
+ reindex: "facet-affecting",
81
+ snapshot: "on-book",
82
+ query: "indexed-column",
83
+ localized: false,
84
+ visibility: ["staff", "customer", "partner"],
85
+ editRole: "none",
86
+ overrideFriction: "none",
87
+ sourceFreshness: "sync",
88
+ },
89
+ {
90
+ path: "embarkPortFacilityId",
91
+ class: "structural",
92
+ merge: "source-only",
93
+ drift: "medium",
94
+ reindex: "facet-affecting",
95
+ snapshot: "on-book",
96
+ query: "indexed-column",
97
+ localized: false,
98
+ visibility: ["staff", "customer", "partner"],
99
+ editRole: "none",
100
+ overrideFriction: "none",
101
+ sourceFreshness: "sync",
102
+ },
103
+ {
104
+ path: "embarkPortCanonicalPlaceId",
105
+ class: "structural",
106
+ merge: "source-only",
107
+ drift: "medium",
108
+ reindex: "facet-affecting",
109
+ snapshot: "on-book",
110
+ query: "indexed-column",
111
+ localized: false,
112
+ visibility: ["staff", "customer", "partner"],
113
+ editRole: "none",
114
+ overrideFriction: "none",
115
+ sourceFreshness: "sync",
116
+ },
117
+ {
118
+ path: "disembarkPortFacilityId",
119
+ class: "structural",
120
+ merge: "source-only",
121
+ drift: "medium",
122
+ reindex: "facet-affecting",
123
+ snapshot: "on-book",
124
+ query: "indexed-column",
125
+ localized: false,
126
+ visibility: ["staff", "customer", "partner"],
127
+ editRole: "none",
128
+ overrideFriction: "none",
129
+ sourceFreshness: "sync",
130
+ },
131
+ {
132
+ path: "disembarkPortCanonicalPlaceId",
133
+ class: "structural",
134
+ merge: "source-only",
135
+ drift: "medium",
136
+ reindex: "facet-affecting",
137
+ snapshot: "on-book",
138
+ query: "indexed-column",
139
+ localized: false,
140
+ visibility: ["staff", "customer", "partner"],
141
+ editRole: "none",
142
+ overrideFriction: "none",
143
+ sourceFreshness: "sync",
144
+ },
145
+ {
146
+ path: "region_ids[]",
147
+ class: "structural",
148
+ merge: "source-only",
149
+ drift: "medium",
150
+ reindex: "facet-affecting",
151
+ snapshot: "on-book",
152
+ query: "indexed-column",
153
+ localized: false,
154
+ visibility: ["staff", "customer", "partner"],
155
+ editRole: "none",
156
+ overrideFriction: "none",
157
+ sourceFreshness: "sync",
158
+ },
159
+ {
160
+ path: "waterway_ids[]",
161
+ class: "structural",
162
+ merge: "source-only",
163
+ drift: "medium",
164
+ reindex: "facet-affecting",
165
+ snapshot: "on-book",
166
+ query: "indexed-column",
167
+ localized: false,
168
+ visibility: ["staff", "customer", "partner"],
169
+ editRole: "none",
170
+ overrideFriction: "none",
171
+ sourceFreshness: "sync",
172
+ },
173
+ {
174
+ path: "port_ids[]",
175
+ class: "structural",
176
+ merge: "source-only",
177
+ drift: "medium",
178
+ reindex: "facet-affecting",
179
+ snapshot: "on-book",
180
+ query: "indexed-column",
181
+ localized: false,
182
+ visibility: ["staff", "customer", "partner"],
183
+ editRole: "none",
184
+ overrideFriction: "none",
185
+ sourceFreshness: "sync",
186
+ },
187
+ {
188
+ path: "country_iso[]",
189
+ class: "structural",
190
+ merge: "source-only",
191
+ drift: "medium",
192
+ reindex: "facet-affecting",
193
+ snapshot: "on-book",
194
+ query: "indexed-column",
195
+ localized: false,
196
+ visibility: ["staff", "customer", "partner"],
197
+ editRole: "none",
198
+ overrideFriction: "none",
199
+ sourceFreshness: "sync",
200
+ },
201
+ // TODO(catalog): split into marketing_regions + facet_regions per §7.1.
202
+ // Today's schema has one `regions` column; declared structural so search
203
+ // facets work, but that means marketing edits to it would drift faceting.
204
+ // Operationally this is mostly source-controlled today; flag for split.
205
+ {
206
+ path: "regions[]",
207
+ class: "structural",
208
+ merge: "additive-set",
209
+ drift: "medium",
210
+ reindex: "facet-affecting",
211
+ snapshot: "on-book",
212
+ query: "indexed-column",
213
+ localized: false,
214
+ visibility: ["staff", "customer", "partner"],
215
+ editRole: "ops",
216
+ overrideFriction: "confirm",
217
+ sourceFreshness: "sync",
218
+ },
219
+ {
220
+ path: "waterways[]",
221
+ class: "structural",
222
+ merge: "source-only",
223
+ drift: "medium",
224
+ reindex: "facet-affecting",
225
+ snapshot: "on-book",
226
+ query: "indexed-column",
227
+ localized: true,
228
+ visibility: ["staff", "customer", "partner"],
229
+ editRole: "none",
230
+ overrideFriction: "none",
231
+ sourceFreshness: "sync",
232
+ },
233
+ {
234
+ path: "ports[]",
235
+ class: "structural",
236
+ merge: "source-only",
237
+ drift: "medium",
238
+ reindex: "facet-affecting",
239
+ snapshot: "on-book",
240
+ query: "indexed-column",
241
+ localized: true,
242
+ visibility: ["staff", "customer", "partner"],
243
+ editRole: "none",
244
+ overrideFriction: "none",
245
+ sourceFreshness: "sync",
246
+ },
247
+ {
248
+ path: "countries[]",
249
+ class: "structural",
250
+ merge: "source-only",
251
+ drift: "medium",
252
+ reindex: "facet-affecting",
253
+ snapshot: "on-book",
254
+ query: "indexed-column",
255
+ localized: true,
256
+ visibility: ["staff", "customer", "partner"],
257
+ editRole: "none",
258
+ overrideFriction: "none",
259
+ sourceFreshness: "sync",
260
+ },
261
+ {
262
+ // Same TODO as `regions` — split into marketing_themes + facet_themes
263
+ // when the rule lands.
264
+ path: "themes[]",
265
+ class: "structural",
266
+ merge: "additive-set",
267
+ drift: "medium",
268
+ reindex: "facet-affecting",
269
+ snapshot: "on-book",
270
+ query: "indexed-column",
271
+ localized: false,
272
+ visibility: ["staff", "customer", "partner"],
273
+ editRole: "ops",
274
+ overrideFriction: "confirm",
275
+ sourceFreshness: "sync",
276
+ },
277
+ // ── Volatile-indexed (browse-time approximations) ──────────────────────
278
+ // The cached lowest-price (integer minor units) + departure window are
279
+ // explicit Tier 1 indexed price summaries (architecture §5.4.3). Refreshed
280
+ // on source freshness sync; quote-time price comes through volatile-live
281
+ // elsewhere.
282
+ {
283
+ path: "lowestPriceCached",
284
+ class: "volatile-indexed",
285
+ merge: "source-only",
286
+ drift: "low",
287
+ reindex: "entry",
288
+ snapshot: "on-quote-and-book",
289
+ query: "indexed-column",
290
+ localized: false,
291
+ visibility: ["staff", "customer", "partner"],
292
+ editRole: "none",
293
+ overrideFriction: "none",
294
+ sourceFreshness: "sync",
295
+ },
296
+ {
297
+ path: "lowestPriceCurrencyCached",
298
+ class: "volatile-indexed",
299
+ merge: "source-only",
300
+ drift: "low",
301
+ reindex: "entry",
302
+ snapshot: "on-quote-and-book",
303
+ query: "indexed-column",
304
+ localized: false,
305
+ visibility: ["staff", "customer", "partner"],
306
+ editRole: "none",
307
+ overrideFriction: "none",
308
+ sourceFreshness: "sync",
309
+ },
310
+ {
311
+ path: "lowestPriceUnit",
312
+ class: "volatile-indexed",
313
+ merge: "source-only",
314
+ drift: "low",
315
+ reindex: "entry",
316
+ snapshot: "on-quote-and-book",
317
+ query: "indexed-column",
318
+ localized: false,
319
+ visibility: ["staff", "customer", "partner"],
320
+ editRole: "none",
321
+ overrideFriction: "none",
322
+ sourceFreshness: "sync",
323
+ },
324
+ {
325
+ path: "earliestDepartureCached",
326
+ class: "volatile-indexed",
327
+ merge: "source-only",
328
+ drift: "low",
329
+ reindex: "facet-affecting",
330
+ snapshot: "never",
331
+ query: "indexed-column",
332
+ localized: false,
333
+ visibility: ["staff", "customer", "partner"],
334
+ editRole: "none",
335
+ overrideFriction: "none",
336
+ sourceFreshness: "sync",
337
+ },
338
+ {
339
+ path: "latestDepartureCached",
340
+ class: "volatile-indexed",
341
+ merge: "source-only",
342
+ drift: "low",
343
+ reindex: "facet-affecting",
344
+ snapshot: "never",
345
+ query: "indexed-column",
346
+ localized: false,
347
+ visibility: ["staff", "customer", "partner"],
348
+ editRole: "none",
349
+ overrideFriction: "none",
350
+ sourceFreshness: "sync",
351
+ },
352
+ {
353
+ // Distinct departure months (`YYYY-MM`) across the cruise's sailings.
354
+ // Facet-affecting (string[]) so browse surfaces can filter by departure
355
+ // month/year. Populated from the per-cruise sailing list at sync time —
356
+ // the upstream search projection only carries the [earliest, latest]
357
+ // window, not the per-month breakdown.
358
+ path: "departureMonths[]",
359
+ class: "volatile-indexed",
360
+ merge: "source-only",
361
+ drift: "low",
362
+ reindex: "facet-affecting",
363
+ snapshot: "never",
364
+ query: "indexed-column",
365
+ localized: false,
366
+ visibility: ["staff", "customer", "partner"],
367
+ editRole: "none",
368
+ overrideFriction: "none",
369
+ sourceFreshness: "sync",
370
+ },
371
+ {
372
+ // Total sailing (departure) count — typed `int64` via the `Count` suffix.
373
+ // Rendered on browse cards alongside the next departure date.
374
+ path: "departureCount",
375
+ class: "volatile-indexed",
376
+ merge: "source-only",
377
+ drift: "low",
378
+ reindex: "entry",
379
+ snapshot: "never",
380
+ query: "indexed-column",
381
+ localized: false,
382
+ visibility: ["staff", "customer", "partner"],
383
+ editRole: "none",
384
+ overrideFriction: "none",
385
+ sourceFreshness: "sync",
386
+ },
387
+ ];
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Catalog plane field policy for root `cruises` rows.
3
+ *
4
+ * Deferred child-entity registries: sailings, cabin categories/decks,
5
+ * itinerary days, and pricing grids.
6
+ */
7
+ import { type FieldPolicyInput } from "@voyant-travel/catalog/contract";
8
+ declare const CRUISE_FIELD_POLICY: FieldPolicyInput[];
9
+ /**
10
+ * Resolved field-policy registry for cruises. Templates wire it into the
11
+ * indexer, overlay resolver, and snapshot capture pipeline.
12
+ */
13
+ export declare const cruiseCatalogPolicy: import("@voyant-travel/catalog").FieldPolicy[];
14
+ export { CRUISE_FIELD_POLICY };
15
+ //# sourceMappingURL=catalog-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-policy.d.ts","sourceRoot":"","sources":["../src/catalog-policy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAK1F,QAAA,MAAM,mBAAmB,EAAE,gBAAgB,EAG1C,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,gDAAyC,CAAA;AAEzE,OAAO,EAAE,mBAAmB,EAAE,CAAA"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Catalog plane field policy for root `cruises` rows.
3
+ *
4
+ * Deferred child-entity registries: sailings, cabin categories/decks,
5
+ * itinerary days, and pricing grids.
6
+ */
7
+ import { defineFieldPolicy } from "@voyant-travel/catalog/contract";
8
+ import { CRUISE_CORE_FIELD_POLICY } from "./catalog-policy-core.js";
9
+ import { CRUISE_STRUCTURE_FIELD_POLICY } from "./catalog-policy-structure.js";
10
+ const CRUISE_FIELD_POLICY = [
11
+ ...CRUISE_CORE_FIELD_POLICY,
12
+ ...CRUISE_STRUCTURE_FIELD_POLICY,
13
+ ];
14
+ /**
15
+ * Resolved field-policy registry for cruises. Templates wire it into the
16
+ * indexer, overlay resolver, and snapshot capture pipeline.
17
+ */
18
+ export const cruiseCatalogPolicy = defineFieldPolicy(CRUISE_FIELD_POLICY);
19
+ export { CRUISE_FIELD_POLICY };
@@ -0,0 +1,5 @@
1
+ import { type ContentOverlay, type MergeOverlaysOptions } from "@voyant-travel/catalog";
2
+ import { type CruiseContent } from "@voyant-travel/cruises-contracts/content-shape";
3
+ export { BOARD_BASIS_FROM_SHORT_CODE, BOARD_BASIS_SHORT_CODES, BOARD_BASIS_VALUES, type BoardBasis, type BoardBasisShortCode, boardBasisSchema, CRUISES_CONTENT_SCHEMA_VERSION, type CruiseCabinCategory, type CruiseContent, type CruiseItineraryStop, type CruisePolicy, type CruiseSailing, type CruiseShip, type CruiseSummary, cruiseCabinCategorySchema, cruiseContentSchema, cruiseItineraryStopSchema, cruisePolicySchema, cruiseSailingSchema, cruiseShipSchema, cruiseSummarySchema, validateCruiseContent, } from "@voyant-travel/cruises-contracts/content-shape";
4
+ export declare function mergeOverlaysIntoCruiseContent(payload: CruiseContent, overlays: ReadonlyArray<ContentOverlay>, options?: Pick<MergeOverlaysOptions, "onOverlayError">): CruiseContent;
5
+ //# 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,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,oBAAoB,EAE1B,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,KAAK,aAAa,EAGnB,MAAM,gDAAgD,CAAA;AAEvD,OAAO,EACL,2BAA2B,EAC3B,uBAAuB,EACvB,kBAAkB,EAClB,KAAK,UAAU,EACf,KAAK,mBAAmB,EACxB,gBAAgB,EAChB,8BAA8B,EAC9B,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,yBAAyB,EACzB,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,gDAAgD,CAAA;AAEvD,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,EACvC,OAAO,GAAE,IAAI,CAAC,oBAAoB,EAAE,gBAAgB,CAAM,GACzD,aAAa,CASf"}