@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.
- package/README.md +36 -0
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/routes-admin.d.ts +220 -0
- package/dist/routes-admin.d.ts.map +1 -0
- package/dist/routes-admin.js +28 -0
- package/dist/routes-public.d.ts +564 -15
- package/dist/routes-public.d.ts.map +1 -1
- package/dist/routes-public.js +68 -3
- package/dist/service-booking-session-bootstrap.d.ts +227 -0
- package/dist/service-booking-session-bootstrap.d.ts.map +1 -0
- package/dist/service-booking-session-bootstrap.js +297 -0
- package/dist/service-departures.d.ts +301 -2
- package/dist/service-departures.d.ts.map +1 -1
- package/dist/service-departures.js +406 -42
- package/dist/service.d.ts +628 -9
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +178 -2
- package/dist/validation-settings.d.ts +609 -0
- package/dist/validation-settings.d.ts.map +1 -0
- package/dist/validation-settings.js +235 -0
- package/dist/validation.d.ts +1260 -380
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +173 -126
- package/package.json +17 -10
package/dist/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;
|
|
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
|
-
|
|
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 ?? {}) }));
|