@voyantjs/storefront 0.49.0 → 0.50.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
package/dist/service.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { bootstrapStorefrontBookingSession, } from "./service-booking-session-bootstrap.js";
1
2
  import { getStorefrontDeparture, getStorefrontDepartureItinerary, getStorefrontProductAvailabilitySummary, getStorefrontProductExtensions, listStorefrontProductDepartures, previewStorefrontDeparturePrice, } from "./service-departures.js";
2
3
  import { createStorefrontLeadSignal, subscribeStorefrontNewsletter, } from "./service-intake.js";
3
4
  import { evaluateStorefrontTransportEligibility } from "./service-transport-eligibility.js";
@@ -29,22 +30,141 @@ function normalizePaymentMethod(method) {
29
30
  enabled: method.enabled,
30
31
  };
31
32
  }
33
+ function normalizePaymentSchedule(schedule) {
34
+ if (!schedule)
35
+ return null;
36
+ return {
37
+ depositPercent: schedule.depositPercent ?? null,
38
+ balanceDueDaysBeforeDeparture: schedule.balanceDueDaysBeforeDeparture ?? null,
39
+ };
40
+ }
41
+ function scheduleEntriesFromDefaultSchedule(schedule) {
42
+ if (!schedule?.depositPercent || schedule.depositPercent >= 100) {
43
+ return [];
44
+ }
45
+ const remainderPercent = 100 - schedule.depositPercent;
46
+ return [
47
+ {
48
+ percent: schedule.depositPercent,
49
+ dueInDays: 0,
50
+ dueCondition: "after_booking",
51
+ },
52
+ {
53
+ percent: remainderPercent,
54
+ dueInDays: schedule.balanceDueDaysBeforeDeparture ?? 0,
55
+ dueCondition: "before_departure",
56
+ },
57
+ ];
58
+ }
59
+ function normalizePaymentScheduleEntries(schedule, defaultSchedule) {
60
+ if (schedule)
61
+ return schedule;
62
+ return scheduleEntriesFromDefaultSchedule(defaultSchedule);
63
+ }
64
+ function normalizePaymentStructure(structure, schedule, defaultSchedule) {
65
+ if (structure)
66
+ return structure;
67
+ if (schedule.length > 0)
68
+ return "split";
69
+ return defaultSchedule?.depositPercent && defaultSchedule.depositPercent > 0 ? "split" : "full";
70
+ }
71
+ function normalizeBankTransferAccount(account, bankTransfer) {
72
+ const resolved = account ??
73
+ (bankTransfer.iban && bankTransfer.accountHolder && bankTransfer.bankName
74
+ ? {
75
+ provider: null,
76
+ currency: null,
77
+ iban: bankTransfer.iban,
78
+ beneficiary: bankTransfer.accountHolder,
79
+ bank: bankTransfer.bankName,
80
+ }
81
+ : null);
82
+ if (!resolved)
83
+ return null;
84
+ return {
85
+ provider: resolved.provider ?? null,
86
+ currency: resolved.currency ?? null,
87
+ iban: resolved.iban,
88
+ beneficiary: resolved.beneficiary,
89
+ bank: resolved.bank,
90
+ };
91
+ }
92
+ function normalizeBankTransfer(bankTransfer) {
93
+ if (!bankTransfer)
94
+ return null;
95
+ return {
96
+ dueDays: bankTransfer.dueDays ?? null,
97
+ account: normalizeBankTransferAccount(bankTransfer.account, bankTransfer),
98
+ accountHolder: bankTransfer.accountHolder ?? null,
99
+ bankName: bankTransfer.bankName ?? null,
100
+ iban: bankTransfer.iban ?? null,
101
+ bic: bankTransfer.bic ?? null,
102
+ paymentReference: bankTransfer.paymentReference ?? null,
103
+ instructions: bankTransfer.instructions ?? null,
104
+ };
105
+ }
106
+ function mergePaymentSchedule(current, patch) {
107
+ if (patch === null)
108
+ return null;
109
+ return {
110
+ ...(current ?? {
111
+ depositPercent: null,
112
+ balanceDueDaysBeforeDeparture: null,
113
+ }),
114
+ ...patch,
115
+ };
116
+ }
117
+ function mergeBankTransfer(current, patch) {
118
+ if (patch === null)
119
+ return null;
120
+ const merged = {
121
+ ...(current ?? {
122
+ dueDays: null,
123
+ account: null,
124
+ accountHolder: null,
125
+ bankName: null,
126
+ iban: null,
127
+ bic: null,
128
+ paymentReference: null,
129
+ instructions: null,
130
+ }),
131
+ ...patch,
132
+ };
133
+ const shouldRefreshAccountFromLegacyFields = patch.account === undefined &&
134
+ ("accountHolder" in patch || "bankName" in patch || "iban" in patch);
135
+ return {
136
+ ...merged,
137
+ account: normalizeBankTransferAccount(shouldRefreshAccountFromLegacyFields ? null : merged.account, merged),
138
+ };
139
+ }
32
140
  export function resolveStorefrontSettings(input) {
33
141
  const parsed = storefrontSettingsInputSchema.parse(input ?? {});
142
+ const defaultSchedule = normalizePaymentSchedule(parsed.payment?.defaultSchedule ?? null);
143
+ const schedule = normalizePaymentScheduleEntries(parsed.payment?.schedule, defaultSchedule);
34
144
  return storefrontSettingsSchema.parse({
35
145
  branding: {
36
146
  logoUrl: parsed.branding?.logoUrl ?? null,
147
+ faviconUrl: parsed.branding?.faviconUrl ?? null,
148
+ brandMarkUrl: parsed.branding?.brandMarkUrl ?? null,
149
+ primaryColor: parsed.branding?.primaryColor ?? null,
150
+ accentColor: parsed.branding?.accentColor ?? null,
37
151
  supportedLanguages: parsed.branding?.supportedLanguages ?? [],
38
152
  },
39
153
  support: {
40
154
  email: parsed.support?.email ?? null,
41
155
  phone: parsed.support?.phone ?? null,
156
+ links: parsed.support?.links ?? [],
42
157
  },
43
158
  legal: {
44
159
  termsUrl: parsed.legal?.termsUrl ?? null,
45
160
  privacyUrl: parsed.legal?.privacyUrl ?? null,
161
+ cancellationUrl: parsed.legal?.cancellationUrl ?? null,
46
162
  defaultContractTemplateId: parsed.legal?.defaultContractTemplateId ?? null,
47
163
  },
164
+ localization: {
165
+ defaultLocale: parsed.localization?.defaultLocale ?? null,
166
+ currencyDisplay: parsed.localization?.currencyDisplay ?? "code",
167
+ },
48
168
  forms: {
49
169
  billing: {
50
170
  fields: (parsed.forms?.billing?.fields ?? []).map(normalizeField),
@@ -56,9 +176,45 @@ export function resolveStorefrontSettings(input) {
56
176
  payment: {
57
177
  defaultMethod: parsed.payment?.defaultMethod ?? null,
58
178
  methods: (parsed.payment?.methods ?? []).map(normalizePaymentMethod),
179
+ structure: normalizePaymentStructure(parsed.payment?.structure, schedule, defaultSchedule),
180
+ schedule,
181
+ defaultSchedule,
182
+ bankTransfer: normalizeBankTransfer(parsed.payment?.bankTransfer ?? null),
59
183
  },
60
184
  });
61
185
  }
186
+ export function mergeStorefrontSettingsPatch(current, patch) {
187
+ return resolveStorefrontSettings({
188
+ branding: patch.branding ? { ...current.branding, ...patch.branding } : current.branding,
189
+ support: patch.support ? { ...current.support, ...patch.support } : current.support,
190
+ legal: patch.legal ? { ...current.legal, ...patch.legal } : current.legal,
191
+ localization: patch.localization
192
+ ? { ...current.localization, ...patch.localization }
193
+ : current.localization,
194
+ forms: patch.forms
195
+ ? {
196
+ billing: patch.forms.billing
197
+ ? { ...current.forms.billing, ...patch.forms.billing }
198
+ : current.forms.billing,
199
+ travelers: patch.forms.travelers
200
+ ? { ...current.forms.travelers, ...patch.forms.travelers }
201
+ : current.forms.travelers,
202
+ }
203
+ : current.forms,
204
+ payment: patch.payment
205
+ ? {
206
+ ...current.payment,
207
+ ...patch.payment,
208
+ defaultSchedule: patch.payment.defaultSchedule === undefined
209
+ ? current.payment.defaultSchedule
210
+ : mergePaymentSchedule(current.payment.defaultSchedule, patch.payment.defaultSchedule),
211
+ bankTransfer: patch.payment.bankTransfer === undefined
212
+ ? current.payment.bankTransfer
213
+ : mergeBankTransfer(current.payment.bankTransfer, patch.payment.bankTransfer),
214
+ }
215
+ : current.payment,
216
+ });
217
+ }
62
218
  export function createStorefrontService(options) {
63
219
  const settings = resolveStorefrontSettings(options?.settings);
64
220
  async function resolveSettings(context = {}) {
@@ -67,6 +223,14 @@ export function createStorefrontService(options) {
67
223
  }
68
224
  return resolveStorefrontSettings(await options.resolveSettings(context));
69
225
  }
226
+ async function updateSettings(patch, context = {}) {
227
+ if (!options?.updateSettings) {
228
+ return null;
229
+ }
230
+ const current = await resolveSettings(context);
231
+ const next = mergeStorefrontSettingsPatch(current, patch);
232
+ return resolveStorefrontSettings(await options.updateSettings(next, context));
233
+ }
70
234
  async function resolveOffers(context = {}) {
71
235
  return (await options?.resolveOffers?.(context)) ?? options?.offers;
72
236
  }
@@ -83,14 +247,23 @@ export function createStorefrontService(options) {
83
247
  return settings;
84
248
  },
85
249
  resolveSettings,
250
+ updateSettings,
86
251
  getDeparture(db, departureId) {
87
252
  return getStorefrontDeparture(db, departureId);
88
253
  },
89
254
  listProductDepartures(db, productId, query) {
90
255
  return listStorefrontProductDepartures(db, productId, query);
91
256
  },
92
- previewDeparturePrice(db, departureId, input) {
93
- return previewStorefrontDeparturePrice(db, departureId, input);
257
+ previewDeparturePrice(db, departureId, input, context = {}) {
258
+ const offerContext = { ...context, db: context.db ?? db };
259
+ return previewStorefrontDeparturePrice(db, departureId, input, {
260
+ listApplicableOffers: async (offerInput) => {
261
+ const offers = await resolveOffers(offerContext)?.then((resolvers) => resolvers?.listApplicableOffers?.({ ...offerInput, ...offerContext }));
262
+ return offers ?? [];
263
+ },
264
+ applyOffer: async (offerInput) => (await resolveOffers(offerContext)?.then((resolvers) => resolvers?.applyOffer?.({ ...offerInput, ...offerContext }))) ?? null,
265
+ redeemOffer: async (offerInput) => (await resolveOffers(offerContext)?.then((resolvers) => resolvers?.redeemOffer?.({ ...offerInput, ...offerContext }))) ?? null,
266
+ });
94
267
  },
95
268
  getProductExtensions(db, productId, optionId) {
96
269
  return getStorefrontProductExtensions(db, productId, optionId);
@@ -124,6 +297,9 @@ export function createStorefrontService(options) {
124
297
  rules,
125
298
  });
126
299
  },
300
+ async bootstrapBookingSession(context, input, userId) {
301
+ return bootstrapStorefrontBookingSession(context, input, options?.bookingSessionBootstrap, userId);
302
+ },
127
303
  async listApplicableOffers(input) {
128
304
  const { context, ...offerInput } = input;
129
305
  const offers = await resolveOffers(context)?.then((resolvers) => resolvers?.listApplicableOffers?.({ ...offerInput, ...(context ?? {}) }));