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.
@@ -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-write response by its receipt discriminant. */
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 formatKey = JSON.stringify(Object.entries(format).sort(([left], [right]) => left.localeCompare(right)));
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
- ...format,
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
- hour12: false
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
- hour12: true
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
- hour12: true
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
- if (hour === undefined || minute === undefined || dayPeriod === undefined) {
2126
- return input.startsAt;
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}${dayPeriod.toLowerCase()}`;
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
- hour12: true
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
- return presentDateRange({
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
- }, context, displayProfile(options, "omit"));
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
- const fallback = context.timeZone.startsWith("Etc/") ? "local time" : `${context.timeZone.split("/").slice(-1)[0]?.replace(/_/gu, " ") ?? context.timeZone} time`;
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 Account"
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 { parseUtcIsoDateTimeString as $, unsafeAsBookingSessionId as $t, parseFooterCompositionV1 as A, parseNonNegativeCents as At, normalizeLocationAddressText as B, parseApiKeyId as Bt, parseMailingListBlockId as C, unsafeAsStoragePath as Cn, publicEventPricingOptions as Ct, assessMailingListTargeting as D, ok as Dn, fromArray as Dt, parseMailingListRuntimeContext as E, err as En, resolvePricingOptionsPriceDisplay as Et, sameMailingListPlacementTargeting as F, unsafeAsPositiveCents as Ft, formatBookingDate as G, parseMediaAssetId as Gt, selectCategoryView as H, parseDatedOfferingCapacityHoldAuditRef as Ht, isCanonicalRichTextDoc as I, formatCurrencyAmount as It, formatLocalScheduleDate as J, parseRetiredCourseId as Jt, formatBookingDateParts as K, parseMembershipId as Kt, parsePublicContactDetails as L, parseCurrencyCode as Lt, parseMailingListPlacementTargeting as M, toCents as Mt, DEFAULT_MAILING_LIST_TARGETING as N, toNonNegativeCents as Nt, DEFAULT_MAILING_LIST_SUCCESS_MESSAGE as O, mapNonEmptyArray as Ot, planMailingListChoicePresentation as P, unsafeAsNonNegativeCents as Pt, getLocalScheduleTime as Q, unsafeAsBookingRequirementId as Qt, assertAllowedPublicUrl as R, assertNever as Rt, buildMailingListSignupBlockSourceRef as S, unsafeAsStorageBucketName as Sn, publicEventPricingDisplay as St, parseMailingListSignedSourceToken as T, unsafeAsUserId as Tn, resolveExactOrFreePriceDisplay as Tt, inferSiteDateLocale as U, parseDatedOfferingCapacityHoldId as Ut, toLocationCoordinates as V, parseCustomerId as Vt, buildBookingUtcDateWindow as W, parseEventSeriesId as Wt, getBookingLocalDateKey as X, parseUserId as Xt, formatLocalScheduleTime as Y, parseSiteId as Yt, getLocalScheduleDate as Z, unsafeAsAppointmentResourceId as Zt, resolveWholeSeriesBookingPhase as _, unsafeAsSafeDownloadFilename as _n, parseEventPageSurfaceSubject as _t, canonicalizeConfiguredBookingVerticalConfig as a, unsafeAsEventInstanceId as an, isLiveOrderInstalmentPlanStatus as at, parseManagementKey as b, unsafeAsSiteScopedStoragePath as bn, isPublicEventPricingOptionDisplayable as bt, resolveSiteVerticalBookingConfig as c, unsafeAsFileChecksumSha256 as cn, addIntervalPreservingMonthAnchor as ct, ORDINARY_EVENT_PRESET_VALUES as d, unsafeAsOriginalFilename as dn, getBookingInstalmentPlanIntervalCount as dt, unsafeAsCheckoutLineId as en, toBookingTimeZone as et, SURFACE_EVENT_PRESET_VALUES as f, unsafeAsPassId as fn, getBookingInstalmentProtectedDepositAmountCents as ft, orderedLiveRunSessions as g, unsafeAsProductId as gn, resolveFlexibleBalanceInitialPaymentCents as gt, CANCELLED_SESSION_STATUS as h, unsafeAsPricingOptionId as hn, resolveFlexibleBalanceDueAt as ht, areConfiguredBookingVerticalConfigsEqual as i, unsafeAsEntitlementId as in, validateBookingPaymentOptionKinds as it, footerNavigationLayouts as j, parsePositiveCents as jt, parseMailingListProviderScope as k, isNonNegativeWholeCents as kt, DEFAULT_EVENT_TYPE_PRESETS as l, unsafeAsMediaAssetId as ln, clampConfiguredAmount as lt, publicReadFreshnessSeconds as m, unsafeAsPositiveSeconds as mn, splitAmountWithRemainderInFirst as mt, EVENT_PRESET_VOCABULARY as n, unsafeAsDemoCapability as nn, toScheduledBookingDateTime as nt, parseVerticalId as o, unsafeAsEventOfferingId as on, isSettleableFlexibleBalanceContractStatus as ot, WHOLE_SERIES_EVENT_PRESET_VALUES as p, unsafeAsPositiveByteCount as pn, omitZeroAmountFutureRows as pt, formatBookingTime as q, parsePageId as qt, NAVIGATION_LOCATIONS as r, unsafeAsDetectedMimeType as rn, parseBookingTimeZone as rt, parseVerticalPresetId as s, unsafeAsEventSeriesId as sn, isSettleableOrderInstalmentPlanStatus as st, resolveEventCatalogue as t, unsafeAsDeclaredMimeType as tn, toScheduledBookingDateRange as tt, EVENT_PRESET_VALUES as u, unsafeAsOccurrenceId as un, getBookingInstalmentDepositRefundability as ut, createSecret as v, unsafeAsSiteFontId as vn, formatBookingPriceDisplay as vt, parseMailingListContentVersionId as w, unsafeAsUploadSessionId as wn, publicEventPricingType as wt, stableJsonStringify as x, unsafeAsStaffMemberId as xn, publicEventPricingCurrency as xt, exposeSecret as y, unsafeAsSiteId as yn, formatEventPricing as yt, isPresent as z, formatDurationUnitLabel as zt };
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-BdvfnCyV.mjs";
3
- import "./src-yL0DBH7S.mjs";
4
- import { n as syncLocalMediaForPush, r as syncLocalMediaForPull, y as writeMediaManifest } from "./local-sync-CWLEhMZ-.mjs";
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.19.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.139.0 <1.0.0"
46
+ "@riverbankcms/sdk": ">=0.156.0 <1.0.0"
47
47
  },
48
48
  "optionalDependencies": {
49
49
  "@napi-rs/keyring": "1.3.0"
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env node
2
- import { t as loadConfigFile } from "./load-config-CErro6mj.mjs";
3
-
4
- export { loadConfigFile };