riverbankcms 0.19.0 → 0.21.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/README.md +23 -0
- package/dist/acceptance/matrix.mjs +4 -4
- package/dist/cli/index.mjs +62492 -104568
- package/dist/cli/init-docs/content/getting-started.md +27 -0
- package/dist/cli/init-docs/content/workflow-content-types.md +25 -0
- package/dist/entryCommands-DSQZqznu.mjs +23110 -0
- package/dist/{eventUpsertInputSchema-Bkafrrjw.mjs → eventUpsertInputSchema-zCTx0fdF.mjs} +337 -325
- package/dist/{load-config-CErro6mj.mjs → load-config-B68gtN45.mjs} +3 -3
- package/dist/load-config-ghkXBKim.mjs +4 -0
- package/dist/{plan-DW5O751d.mjs → plan-CkMANumv.mjs} +36 -3
- package/dist/scaffold/index.mjs +2 -2
- package/dist/{sdk-event-upsert-BdvfnCyV.mjs → sdk-event-upsert-CrOuJrxo.mjs} +1033 -123
- package/dist/{src-yL0DBH7S.mjs → src-BENi4Q5k.mjs} +134 -29
- package/dist/testing.mjs +5 -4
- package/package.json +2 -2
- package/dist/load-config-rPaisrdG.mjs +0 -4
- package/dist/local-sync-CWLEhMZ-.mjs +0 -4635
|
@@ -94,6 +94,8 @@ const unsafeAsFormSubmissionId = (id) => id;
|
|
|
94
94
|
const unsafeAsPassId = (id) => id;
|
|
95
95
|
const unsafeAsMembershipId = (id) => id;
|
|
96
96
|
const unsafeAsCustomerId = (id) => id;
|
|
97
|
+
const unsafeAsSiteTermsVersionId = (id) => id;
|
|
98
|
+
const unsafeAsSiteTermsAgreementId = (id) => id;
|
|
97
99
|
const unsafeAsOrderRetirementOperationId = (id) => id;
|
|
98
100
|
const unsafeAsOrderId = (id) => id;
|
|
99
101
|
const unsafeAsOrderItemId = (id) => id;
|
|
@@ -198,6 +200,8 @@ const parseDatedOfferingWaitlistCapacityEffectId = (value) => parseUuidBrand(val
|
|
|
198
200
|
const parseDatedOfferingWaitlistCapacityEffectClaimToken = (value) => parseUuidBrand(value, unsafeAsDatedOfferingWaitlistCapacityEffectClaimToken);
|
|
199
201
|
const parseDatedOfferingRunCancellationOperationId = (value) => parseUuidBrand(value, unsafeAsDatedOfferingRunCancellationOperationId);
|
|
200
202
|
const parseCustomerId = (value) => parseUuidBrand(value, unsafeAsCustomerId);
|
|
203
|
+
const parseSiteTermsVersionId = (value) => parseUuidBrand(value, unsafeAsSiteTermsVersionId);
|
|
204
|
+
const parseSiteTermsAgreementId = (value) => parseUuidBrand(value, unsafeAsSiteTermsAgreementId);
|
|
201
205
|
const parseCustomerPassId = (value) => parseUuidBrand(value, unsafeAsCustomerPassId);
|
|
202
206
|
const parseCustomerMembershipId = (value) => parseUuidBrand(value, unsafeAsCustomerMembershipId);
|
|
203
207
|
const parseEventSeriesId = (value) => parseUuidBrand(value, unsafeAsEventSeriesId);
|
|
@@ -1601,7 +1605,7 @@ function createOriginalPaymentRefundCommand(options) {
|
|
|
1601
1605
|
protectedDepositOverride
|
|
1602
1606
|
};
|
|
1603
1607
|
}
|
|
1604
|
-
/** Narrow an already typed schedule
|
|
1608
|
+
/** Narrow an already typed run or schedule write response to its accepted receipt. */
|
|
1605
1609
|
function isAcceptedEventScheduleUpdate(response) {
|
|
1606
1610
|
return "kind" in response && response.kind === "accepted_unavailable";
|
|
1607
1611
|
}
|
|
@@ -1839,8 +1843,17 @@ function validateBookingPaymentOptionKinds(kinds) {
|
|
|
1839
1843
|
/** Shared Intl engine, internal to core's date presentation owners. */
|
|
1840
1844
|
const FORMATTER_CACHE_LIMIT$1 = 100;
|
|
1841
1845
|
const dateTimeFormatterCache = new Map();
|
|
1846
|
+
/** Intl's boolean clock option can select h11/h24 on other ICU builds. */
|
|
1847
|
+
function resolveClockCycle(format) {
|
|
1848
|
+
const { hour12, ...explicitFormat } = format;
|
|
1849
|
+
return hour12 === undefined ? explicitFormat : {
|
|
1850
|
+
...explicitFormat,
|
|
1851
|
+
hourCycle: hour12 ? "h12" : "h23"
|
|
1852
|
+
};
|
|
1853
|
+
}
|
|
1842
1854
|
function getDateTimeFormatter(locale, timeZone, format) {
|
|
1843
|
-
const
|
|
1855
|
+
const explicitFormat = resolveClockCycle(format);
|
|
1856
|
+
const formatKey = JSON.stringify(Object.entries(explicitFormat).sort(([left], [right]) => left.localeCompare(right)));
|
|
1844
1857
|
const key = `${locale}\u0000${timeZone}\u0000${formatKey}`;
|
|
1845
1858
|
const cached = dateTimeFormatterCache.get(key);
|
|
1846
1859
|
if (cached !== undefined) {
|
|
@@ -1853,7 +1866,7 @@ function getDateTimeFormatter(locale, timeZone, format) {
|
|
|
1853
1866
|
throw new RangeError("An explicit time zone is required");
|
|
1854
1867
|
}
|
|
1855
1868
|
const formatter = new Intl.DateTimeFormat(locale, {
|
|
1856
|
-
...
|
|
1869
|
+
...explicitFormat,
|
|
1857
1870
|
timeZone
|
|
1858
1871
|
});
|
|
1859
1872
|
if (dateTimeFormatterCache.size >= FORMATTER_CACHE_LIMIT$1) {
|
|
@@ -1945,7 +1958,7 @@ function getZonedDateTimeParts(date, timeZone) {
|
|
|
1945
1958
|
hour: "2-digit",
|
|
1946
1959
|
minute: "2-digit",
|
|
1947
1960
|
second: "2-digit",
|
|
1948
|
-
|
|
1961
|
+
hourCycle: "h23"
|
|
1949
1962
|
});
|
|
1950
1963
|
const read = (type) => Number(parts.get(type) ?? "");
|
|
1951
1964
|
return {
|
|
@@ -1979,6 +1992,15 @@ function resolveBookingTimeZoneId(...candidates) {
|
|
|
1979
1992
|
}
|
|
1980
1993
|
return FALLBACK_TIMEZONE;
|
|
1981
1994
|
}
|
|
1995
|
+
/** Canonical business-zone admission, shared by server and public wire boundaries. */
|
|
1996
|
+
const DEFAULT_BOOKING_BUSINESS_TIME_ZONE = "Europe/London";
|
|
1997
|
+
/** Effect boundary for browser-authored local inputs; formats no displayed date. */
|
|
1998
|
+
function getRuntimeBookingTimeZone() {
|
|
1999
|
+
return resolveBookingTimeZoneId(new Intl.DateTimeFormat("en-GB").resolvedOptions().timeZone);
|
|
2000
|
+
}
|
|
2001
|
+
function resolveBookingBusinessTimeZone(value) {
|
|
2002
|
+
return resolveBookingTimeZoneId(value, DEFAULT_BOOKING_BUSINESS_TIME_ZONE);
|
|
2003
|
+
}
|
|
1982
2004
|
function parseUtcIsoDateTimeString(value) {
|
|
1983
2005
|
const normalized = value.trim();
|
|
1984
2006
|
const hasUtcSuffix = normalized.endsWith("Z");
|
|
@@ -2094,7 +2116,7 @@ function formatBookingDate(input, format = {
|
|
|
2094
2116
|
function formatBookingTime(input, format = {
|
|
2095
2117
|
hour: "numeric",
|
|
2096
2118
|
minute: "2-digit",
|
|
2097
|
-
|
|
2119
|
+
hourCycle: "h12"
|
|
2098
2120
|
}) {
|
|
2099
2121
|
return formatBookingInstant(input.startsAt, {
|
|
2100
2122
|
locale: input.locale,
|
|
@@ -2109,7 +2131,7 @@ function formatBookingTime(input, format = {
|
|
|
2109
2131
|
* omission instead of depending on locale-specific spacing or punctuation.
|
|
2110
2132
|
* Callers must only use it for an English presentation contract.
|
|
2111
2133
|
*/
|
|
2112
|
-
function formatBookingCompactEnglishTime(input) {
|
|
2134
|
+
function formatBookingCompactEnglishTime(input, options = {}) {
|
|
2113
2135
|
const date = new Date(input.startsAt);
|
|
2114
2136
|
if (Number.isNaN(date.getTime())) {
|
|
2115
2137
|
return input.startsAt;
|
|
@@ -2117,16 +2139,22 @@ function formatBookingCompactEnglishTime(input) {
|
|
|
2117
2139
|
const parts = formatToPartsLookup(date, input.locale ?? "en-GB", input.timeZone, {
|
|
2118
2140
|
hour: "numeric",
|
|
2119
2141
|
minute: "2-digit",
|
|
2120
|
-
|
|
2142
|
+
hourCycle: "h12",
|
|
2143
|
+
...options.seconds === "include" ? { second: "2-digit" } : {}
|
|
2121
2144
|
});
|
|
2145
|
+
return compactEnglishClock(parts, options.seconds) ?? input.startsAt;
|
|
2146
|
+
}
|
|
2147
|
+
/** Precision and zero-minute omission are one decision for all compact clocks. */
|
|
2148
|
+
function compactEnglishClock(parts, seconds) {
|
|
2122
2149
|
const hour = parts.get("hour");
|
|
2123
2150
|
const minute = parts.get("minute");
|
|
2124
2151
|
const dayPeriod = parts.get("dayPeriod");
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
|
|
2152
|
+
const second = parts.get("second");
|
|
2153
|
+
if (hour === undefined || minute === undefined || dayPeriod === undefined) return null;
|
|
2154
|
+
const token = dayPeriod.toLowerCase();
|
|
2155
|
+
if (seconds === "include") return second === undefined ? null : `${hour}:${minute}:${second}${token}`;
|
|
2128
2156
|
const clock = minute === "00" ? hour : `${hour}:${minute}`;
|
|
2129
|
-
return `${clock}${
|
|
2157
|
+
return `${clock}${token}`;
|
|
2130
2158
|
}
|
|
2131
2159
|
function formatBookingDateTime(input, format = DEFAULT_BOOKING_DATE_TIME_FORMAT) {
|
|
2132
2160
|
if (format === DEFAULT_BOOKING_DATE_TIME_FORMAT) {
|
|
@@ -2153,7 +2181,7 @@ function formatBookingDateParts(input, options) {
|
|
|
2153
2181
|
time: formatBookingTime(input, options?.timeFormat ?? {
|
|
2154
2182
|
hour: "numeric",
|
|
2155
2183
|
minute: "2-digit",
|
|
2156
|
-
|
|
2184
|
+
hourCycle: "h12"
|
|
2157
2185
|
})
|
|
2158
2186
|
};
|
|
2159
2187
|
}
|
|
@@ -2263,6 +2291,8 @@ function formatBookingRange(input, options) {
|
|
|
2263
2291
|
});
|
|
2264
2292
|
return `${startDate}, ${startTime} - ${endDate}, ${endTime}`;
|
|
2265
2293
|
}
|
|
2294
|
+
/** Canonical schedule text at command and SDK boundaries: HH:MM or HH:MM:SS. */
|
|
2295
|
+
const localScheduleTimePattern = /^([01]\d|2[0-3]):[0-5]\d(:[0-5]\d)?$/u;
|
|
2266
2296
|
function parseLocalScheduleTime(value) {
|
|
2267
2297
|
const match = /^(?<hour>\d{1,2}):(?<minute>\d{2})(?::(?<second>\d{2}))?$/u.exec(value.trim());
|
|
2268
2298
|
if (match === null || match.groups === undefined) {
|
|
@@ -2396,28 +2426,35 @@ function formatDate(value, context, options = {}) {
|
|
|
2396
2426
|
return presentDate(value, context, displayProfile(options, "omit"));
|
|
2397
2427
|
}
|
|
2398
2428
|
function formatDateRange(start, endInclusive, context, options = {}) {
|
|
2399
|
-
|
|
2429
|
+
const first = {
|
|
2400
2430
|
kind: "civil",
|
|
2401
2431
|
value: projectDate(start, context)
|
|
2402
|
-
}
|
|
2432
|
+
};
|
|
2433
|
+
const last = {
|
|
2403
2434
|
kind: "civil",
|
|
2404
2435
|
value: projectDate(endInclusive, context)
|
|
2405
|
-
}
|
|
2436
|
+
};
|
|
2437
|
+
const preserveOrder = options.order === "session" && compareLocalScheduleDates(first.value, last.value) > 0;
|
|
2438
|
+
const profile = displayProfile(preserveOrder ? {
|
|
2439
|
+
...options,
|
|
2440
|
+
year: "numeric"
|
|
2441
|
+
} : options, "omit");
|
|
2442
|
+
return preserveOrder ? `${presentDate(first, context, profile)} – ${presentDate(last, context, profile)}` : presentDateRange(first, last, context, profile);
|
|
2406
2443
|
}
|
|
2407
2444
|
function formatDateTime(value, context, options) {
|
|
2408
|
-
return presentDateTime(value, context, displayProfile(options, options.zone));
|
|
2445
|
+
return presentDateTime(value, context, displayProfile(options, options.zone, options.seconds));
|
|
2409
2446
|
}
|
|
2410
2447
|
function formatDateTimeRange(span, context, options) {
|
|
2411
|
-
return presentDateTimeRange(span, context, displayProfile(options, options.zone));
|
|
2448
|
+
return presentDateTimeRange(span, context, displayProfile(options, options.zone, options.seconds));
|
|
2412
2449
|
}
|
|
2413
2450
|
function formatTime(value, context, options) {
|
|
2414
|
-
return presentTime(value, context, displayProfile({}, options.zone));
|
|
2451
|
+
return presentTime(value, context, displayProfile({}, options.zone, options.seconds));
|
|
2415
2452
|
}
|
|
2416
2453
|
function formatTimeRange(start, end, context, options) {
|
|
2417
2454
|
return presentTimeRange({
|
|
2418
2455
|
start,
|
|
2419
2456
|
end
|
|
2420
|
-
}, context, displayProfile({}, options.zone));
|
|
2457
|
+
}, context, displayProfile({}, options.zone, options.seconds));
|
|
2421
2458
|
}
|
|
2422
2459
|
/** Sole date projection/typography owner, used by display and scheduled adapters. */
|
|
2423
2460
|
function presentDate(value, context, profile) {
|
|
@@ -2524,13 +2561,14 @@ function combinedFormat(date, clock) {
|
|
|
2524
2561
|
...clock.format
|
|
2525
2562
|
};
|
|
2526
2563
|
}
|
|
2527
|
-
function displayProfile(options, zone) {
|
|
2564
|
+
function displayProfile(options, zone, seconds) {
|
|
2528
2565
|
return {
|
|
2529
2566
|
kind: "display",
|
|
2530
2567
|
dateFormat: dateFormat(options),
|
|
2531
2568
|
clock: {
|
|
2532
2569
|
kind: "compact",
|
|
2533
|
-
localeSource: "product"
|
|
2570
|
+
localeSource: "product",
|
|
2571
|
+
seconds
|
|
2534
2572
|
},
|
|
2535
2573
|
zone
|
|
2536
2574
|
};
|
|
@@ -2543,7 +2581,7 @@ function presentClock(value, context, clock) {
|
|
|
2543
2581
|
startsAt: value,
|
|
2544
2582
|
timeZone: context.timeZone,
|
|
2545
2583
|
locale: clock.localeSource === "product" ? "en-GB" : context.locale
|
|
2546
|
-
}) : getDateTimeFormatter(context.locale, context.timeZone, clock.format).format(new Date(value));
|
|
2584
|
+
}, { seconds: clock.seconds }) : getDateTimeFormatter(context.locale, context.timeZone, clock.format).format(new Date(value));
|
|
2547
2585
|
}
|
|
2548
2586
|
function offsetToken(value, context) {
|
|
2549
2587
|
return getDateTimeFormatter("en-GB", context.timeZone, { timeZoneName: "longOffset" }).formatToParts(new Date(value)).find((part) => part.type === "timeZoneName")?.value ?? "";
|
|
@@ -2557,8 +2595,8 @@ function formatTimeUntil(value, now, context) {
|
|
|
2557
2595
|
function dateFormat(options) {
|
|
2558
2596
|
const style = options.date ?? "long";
|
|
2559
2597
|
return {
|
|
2560
|
-
day: style === "numeric" ? "2-digit" : "numeric",
|
|
2561
|
-
month: style === "numeric" ? "2-digit" : style,
|
|
2598
|
+
day: style === "omit" || options.day === "omit" ? undefined : style === "numeric" ? "2-digit" : "numeric",
|
|
2599
|
+
month: style === "omit" ? undefined : style === "numeric" ? "2-digit" : style,
|
|
2562
2600
|
...options.year === "omit" ? {} : { year: "numeric" },
|
|
2563
2601
|
...options.weekday ? { weekday: options.weekday } : {}
|
|
2564
2602
|
};
|
|
@@ -2578,8 +2616,7 @@ function zoneToken(value, context, locale) {
|
|
|
2578
2616
|
function zoneLabel(value, context) {
|
|
2579
2617
|
const tokens = [zoneToken(value, context, "en-GB"), zoneToken(value, context, "en-US")];
|
|
2580
2618
|
const abbreviation = tokens.find((token) => /^[A-Z]{2,6}$/u.test(token));
|
|
2581
|
-
|
|
2582
|
-
return abbreviation ?? fallback;
|
|
2619
|
+
return abbreviation ?? formatTimeZoneCityLabel(context.timeZone);
|
|
2583
2620
|
}
|
|
2584
2621
|
function assertOrdered(start, end) {
|
|
2585
2622
|
if (new Date(end).getTime() < new Date(start).getTime()) {
|
|
@@ -2592,12 +2629,13 @@ function calendarDayDifference(value, now, context) {
|
|
|
2592
2629
|
function formatRelative(value, now, context, direction) {
|
|
2593
2630
|
const seconds = (new Date(value).getTime() - new Date(now).getTime()) / 1e3;
|
|
2594
2631
|
const magnitude = Math.abs(seconds);
|
|
2632
|
+
if (direction === "past" && seconds > 0 && seconds <= 120) return relativeNearNow(context.locale, "past");
|
|
2595
2633
|
if (magnitude < 60) return relativeNearNow(context.locale, direction);
|
|
2596
2634
|
const days = calendarDayDifference(value, now, context);
|
|
2597
2635
|
if (Math.abs(days) > 7) return formatDate({
|
|
2598
2636
|
kind: "instant",
|
|
2599
2637
|
value
|
|
2600
|
-
}, context);
|
|
2638
|
+
}, context, { date: "short" });
|
|
2601
2639
|
const formatter = new Intl.RelativeTimeFormat(context.locale, { numeric: "auto" });
|
|
2602
2640
|
if (days !== 0) return formatter.format(days, "day");
|
|
2603
2641
|
const unit = magnitude < 3600 ? "minute" : "hour";
|
|
@@ -2608,6 +2646,10 @@ function relativeNearNow(locale, direction) {
|
|
|
2608
2646
|
if (new Intl.Locale(locale).language === "en") return direction === "past" ? "just now" : "in a moment";
|
|
2609
2647
|
return new Intl.RelativeTimeFormat(locale, { numeric: "auto" }).format(0, "second");
|
|
2610
2648
|
}
|
|
2649
|
+
/** Same city vocabulary as clock-label fallback, for explanatory timezone copy. */
|
|
2650
|
+
function formatTimeZoneCityLabel(timeZone) {
|
|
2651
|
+
return timeZone.startsWith("Etc/") ? "local time" : `${timeZone.split("/").slice(-1)[0]?.replace(/_/gu, " ") ?? timeZone} time`;
|
|
2652
|
+
}
|
|
2611
2653
|
|
|
2612
2654
|
//#endregion
|
|
2613
2655
|
//#region ../core/src/scheduled-date-time.ts
|
|
@@ -2813,6 +2855,64 @@ function assertNever$3(value) {
|
|
|
2813
2855
|
throw new Error(`Unhandled date-time variant: ${String(value)}`);
|
|
2814
2856
|
}
|
|
2815
2857
|
|
|
2858
|
+
//#endregion
|
|
2859
|
+
//#region ../core/src/site-terms.ts
|
|
2860
|
+
function isSiteTermsMode(value) {
|
|
2861
|
+
return value === "site" || value === "off";
|
|
2862
|
+
}
|
|
2863
|
+
function siteTermsApplies(operation, items) {
|
|
2864
|
+
if (operation === "join_waitlist" || operation === "pay_existing_order") return false;
|
|
2865
|
+
return items.some((item) => item.kind === "event" || item.kind === "appointment" ? item.siteTermsMode === "site" : true);
|
|
2866
|
+
}
|
|
2867
|
+
/** History, rather than the head, survives stopping and re-publishing. */
|
|
2868
|
+
function nextSiteTermsVersionNumbering(history, askAgain) {
|
|
2869
|
+
const latest = history.reduce((highest, version) => highest === null || version.number > highest.number ? version : highest, null);
|
|
2870
|
+
return latest !== null ? {
|
|
2871
|
+
number: latest.number + 1,
|
|
2872
|
+
generation: latest.generation + (askAgain ? 1 : 0)
|
|
2873
|
+
} : {
|
|
2874
|
+
number: 1,
|
|
2875
|
+
generation: 1
|
|
2876
|
+
};
|
|
2877
|
+
}
|
|
2878
|
+
function qualifyingSiteTermsAcceptance(input) {
|
|
2879
|
+
return input.identity.kind === "verified" && input.prior !== null && input.prior.customerId === input.identity.customerId && input.prior.termsId === input.state.termsId && input.prior.generation === input.state.current.generation ? input.prior : null;
|
|
2880
|
+
}
|
|
2881
|
+
function admitSiteTerms(input) {
|
|
2882
|
+
if (!input.applies || input.state.kind === "none") return ok({ kind: "not_asked" });
|
|
2883
|
+
const version = input.state.current;
|
|
2884
|
+
const acceptance = qualifyingSiteTermsAcceptance({
|
|
2885
|
+
...input,
|
|
2886
|
+
state: input.state
|
|
2887
|
+
});
|
|
2888
|
+
if (acceptance !== null) return ok({
|
|
2889
|
+
kind: "already_agreed",
|
|
2890
|
+
version,
|
|
2891
|
+
reliedOn: acceptance
|
|
2892
|
+
});
|
|
2893
|
+
if (input.submission.shown.kind !== "checkbox" || input.submission.shown.versionId !== version.id) {
|
|
2894
|
+
return err({
|
|
2895
|
+
kind: "terms_changed",
|
|
2896
|
+
current: version
|
|
2897
|
+
});
|
|
2898
|
+
}
|
|
2899
|
+
if (!input.submission.agreed) return err({
|
|
2900
|
+
kind: "agreement_missing",
|
|
2901
|
+
current: version
|
|
2902
|
+
});
|
|
2903
|
+
return ok({
|
|
2904
|
+
kind: "ticked",
|
|
2905
|
+
version,
|
|
2906
|
+
agreedAt: input.now,
|
|
2907
|
+
identifiedBy: input.identity.kind === "verified" ? "signed_in" : "checkout_email"
|
|
2908
|
+
});
|
|
2909
|
+
}
|
|
2910
|
+
/** Customer copy for a checkout's terms box, shared by the client check and the server's rejection. */
|
|
2911
|
+
const SITE_TERMS_NOT_TICKED_MESSAGE = "Please agree to the booking terms to continue.";
|
|
2912
|
+
function siteTermsChangedMessage(businessName) {
|
|
2913
|
+
return `${businessName} updated their booking terms while you were booking. Please have a look and tick the box again.`;
|
|
2914
|
+
}
|
|
2915
|
+
|
|
2816
2916
|
//#endregion
|
|
2817
2917
|
//#region ../core/src/appointment-service-categories.ts
|
|
2818
2918
|
/**
|
|
@@ -7180,6 +7280,11 @@ function firstLiveRunSessionStartMs(sessions) {
|
|
|
7180
7280
|
const first = orderedLiveRunSessions(sessions)[0];
|
|
7181
7281
|
return first === undefined ? null : sessionStartMs(first);
|
|
7182
7282
|
}
|
|
7283
|
+
/** The next surviving session at or after the render clock, not the first week. */
|
|
7284
|
+
function nextLiveRunSessionStartMs(sessions, now) {
|
|
7285
|
+
const next = orderedLiveRunSessions(sessions).find((session) => sessionStartMs(session) >= now.getTime());
|
|
7286
|
+
return next === undefined ? null : sessionStartMs(next);
|
|
7287
|
+
}
|
|
7183
7288
|
/**
|
|
7184
7289
|
* Booking stays open until the run's first surviving session has started.
|
|
7185
7290
|
*
|
|
@@ -8048,7 +8153,7 @@ function parseSiteNavigationLocations(rows) {
|
|
|
8048
8153
|
*/
|
|
8049
8154
|
const PORTAL_NAV_DEFAULT_LABELS = {
|
|
8050
8155
|
loggedOut: "Login",
|
|
8051
|
-
loggedIn: "My
|
|
8156
|
+
loggedIn: "My account"
|
|
8052
8157
|
};
|
|
8053
8158
|
|
|
8054
8159
|
//#endregion
|
|
@@ -8177,4 +8282,4 @@ function mergeBag(stored, patch, options) {
|
|
|
8177
8282
|
}
|
|
8178
8283
|
|
|
8179
8284
|
//#endregion
|
|
8180
|
-
export {
|
|
8285
|
+
export { formatLocalScheduleTime as $, parseEventSeriesId as $t, DEFAULT_MAILING_LIST_SUCCESS_MESSAGE as A, unsafeAsSiteScopedStoragePath as An, publicEventPricingDisplay as At, isPresent as B, parsePositiveCents as Bt, stableJsonStringify as C, unsafeAsPositiveByteCount as Cn, resolveFlexibleBalanceInitialPaymentCents as Ct, parseMailingListSignedSourceToken as D, unsafeAsSafeDownloadFilename as Dn, formatEventPricing as Dt, parseMailingListContentVersionId as E, unsafeAsProductId as En, formatBookingPriceDisplay as Et, DEFAULT_MAILING_LIST_TARGETING as F, unsafeAsUserId as Fn, fromArray as Ft, formatDateRange as G, formatCurrencyAmount as Gt, toLocationCoordinates as H, toNonNegativeCents as Ht, planMailingListChoicePresentation as I, err as In, mapNonEmptyArray as It, buildBookingUtcDateWindow as J, formatDurationUnitLabel as Jt, formatDateTimeRange as K, parseCurrencyCode as Kt, isCanonicalRichTextDoc as L, ok as Ln, mapReadonlyNonEmptyArray as Lt, parseFooterCompositionV1 as M, unsafeAsStorageBucketName as Mn, publicEventPricingType as Mt, footerNavigationLayouts as N, unsafeAsStoragePath as Nn, resolveExactOrFreePriceDisplay as Nt, parseMailingListRuntimeContext as O, unsafeAsSiteFontId as On, isPublicEventPricingOptionDisplayable as Ot, parseMailingListPlacementTargeting as P, unsafeAsUploadSessionId as Pn, resolvePricingOptionsPriceDisplay as Pt, formatLocalScheduleDate as Q, parseDatedOfferingCapacityHoldId as Qt, parsePublicContactDetails as R, isNonNegativeWholeCents as Rt, parseManagementKey as S, unsafeAsPassId as Sn, resolveFlexibleBalanceDueAt as St, parseMailingListBlockId as T, unsafeAsPricingOptionId as Tn, parseEventPageSurfaceSubject as Tt, selectCategoryView as U, unsafeAsNonNegativeCents as Ut, normalizeLocationAddressText as V, toCents as Vt, formatDate as W, unsafeAsPositiveCents as Wt, formatBookingDateParts as X, parseCustomerId as Xt, formatBookingDate as Y, parseApiKeyId as Yt, formatBookingTime as Z, parseDatedOfferingCapacityHoldAuditRef as Zt, orderedLiveRunSessions as _, unsafeAsEventSeriesId as _n, getBookingInstalmentDepositRefundability as _t, canonicalizeConfiguredBookingVerticalConfig as a, parseSiteTermsVersionId as an, resolveBookingBusinessTimeZone as at, createSecret as b, unsafeAsOccurrenceId as bn, omitZeroAmountFutureRows as bt, resolveSiteVerticalBookingConfig as c, unsafeAsBookingRequirementId as cn, toScheduledBookingDateTime as ct, ORDINARY_EVENT_PRESET_VALUES as d, unsafeAsDeclaredMimeType as dn, validateBookingPaymentOptionKinds as dt, parseMediaAssetId as en, getBookingLocalDateKey as et, SURFACE_EVENT_PRESET_VALUES as f, unsafeAsDemoCapability as fn, isLiveOrderInstalmentPlanStatus as ft, nextLiveRunSessionStartMs as g, unsafeAsEventOfferingId as gn, clampConfiguredAmount as gt, CANCELLED_SESSION_STATUS as h, unsafeAsEventInstanceId as hn, addIntervalPreservingMonthAnchor as ht, areConfiguredBookingVerticalConfigsEqual as i, parseSiteId as in, parseUtcIsoDateTimeString as it, parseMailingListProviderScope as j, unsafeAsStaffMemberId as jn, publicEventPricingOptions as jt, assessMailingListTargeting as k, unsafeAsSiteId as kn, publicEventPricingCurrency as kt, DEFAULT_EVENT_TYPE_PRESETS as l, unsafeAsBookingSessionId as ln, toUtcIsoDateTimeString as lt, publicReadFreshnessSeconds as m, unsafeAsEntitlementId as mn, isSettleableOrderInstalmentPlanStatus as mt, EVENT_PRESET_VOCABULARY as n, parsePageId as nn, getLocalScheduleTime as nt, parseVerticalId as o, parseUserId as on, toBookingTimeZone as ot, WHOLE_SERIES_EVENT_PRESET_VALUES as p, unsafeAsDetectedMimeType as pn, isSettleableFlexibleBalanceContractStatus as pt, inferSiteDateLocale as q, assertNever as qt, NAVIGATION_LOCATIONS as r, parseRetiredCourseId as rn, localScheduleTimePattern as rt, parseVerticalPresetId as s, unsafeAsAppointmentResourceId as sn, toScheduledBookingDateRange as st, resolveEventCatalogue as t, parseMembershipId as tn, getLocalScheduleDate as tt, EVENT_PRESET_VALUES as u, unsafeAsCheckoutLineId as un, parseBookingTimeZone as ut, resolveWholeSeriesBookingPhase as v, unsafeAsFileChecksumSha256 as vn, getBookingInstalmentPlanIntervalCount as vt, slugify as w, unsafeAsPositiveSeconds as wn, deriveTotalTicketQuantity as wt, exposeSecret as x, unsafeAsOriginalFilename as xn, splitAmountWithRemainderInFirst as xt, resolveWholeSeriesRunLifecycle as y, unsafeAsMediaAssetId as yn, getBookingInstalmentProtectedDepositAmountCents as yt, assertAllowedPublicUrl as z, parseNonNegativeCents as zt };
|
package/dist/testing.mjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import "./sdk-event-upsert-
|
|
3
|
-
import "./src-
|
|
4
|
-
import {
|
|
2
|
+
import "./sdk-event-upsert-CrOuJrxo.mjs";
|
|
3
|
+
import "./src-BENi4Q5k.mjs";
|
|
4
|
+
import { An as createOutput, H as syncLocalMediaForPush, Ht as preparePushConfigTarget, L as calculateEntryDiffs, U as syncLocalMediaForPull, o as executeEntryCommandPlanAsSyncResult, pt as writeMediaManifest, rt as readEntries, t as compileEntryPushCommands, zt as applyPushConfigPlan } from "./entryCommands-DSQZqznu.mjs";
|
|
5
|
+
import "./load-config-B68gtN45.mjs";
|
|
5
6
|
|
|
6
|
-
export { syncLocalMediaForPull, syncLocalMediaForPush, writeMediaManifest };
|
|
7
|
+
export { applyPushConfigPlan, calculateEntryDiffs, compileEntryPushCommands, createOutput, executeEntryCommandPlanAsSyncResult, preparePushConfigTarget, readEntries, syncLocalMediaForPull, syncLocalMediaForPush, writeMediaManifest };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "riverbankcms",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.21.0",
|
|
4
4
|
"description": "Riverbank CMS command-line tools for SDK site developers",
|
|
5
5
|
"bin": {
|
|
6
6
|
"riverbankcms": "dist/cli/index.mjs"
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"zod": "^4.3.6"
|
|
44
44
|
},
|
|
45
45
|
"peerDependencies": {
|
|
46
|
-
"@riverbankcms/sdk": ">=0.
|
|
46
|
+
"@riverbankcms/sdk": ">=0.156.0 <1.0.0"
|
|
47
47
|
},
|
|
48
48
|
"optionalDependencies": {
|
|
49
49
|
"@napi-rs/keyring": "1.3.0"
|