riverbankcms 0.28.1 → 0.29.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.
@@ -3462,6 +3462,16 @@ const locationAddressSchema = z.strictObject({
3462
3462
  postalCode: addressPart,
3463
3463
  country: addressPart.transform((value) => value?.length === 2 ? value.toUpperCase() : value)
3464
3464
  }).readonly().transform((address) => Object.values(address).some((part) => part !== null) ? address : null);
3465
+ /** Town, then county, then a complete UK postcode's outward half. Never geocodes. */
3466
+ function deriveLocationArea(address) {
3467
+ if (address === null) return null;
3468
+ const namedArea = [address.locality, address.region].map(trimmedStringOrNull).find((part) => part !== null);
3469
+ if (namedArea !== undefined) return namedArea;
3470
+ if (address.country !== null && !sameLocationCountry(address.country, "GB")) return null;
3471
+ const postcode = address.postalCode?.trim().toUpperCase() ?? "";
3472
+ const match = /^((?:[A-PR-UWYZ][0-9][0-9A-HJKPSTUW]?|[A-PR-UWYZ][A-HK-Y][0-9][0-9ABEHMNPRVWXY]?)|GIR)\s*[0-9][ABD-HJLNP-UW-Z]{2}$/.exec(postcode);
3473
+ return match?.[1] ?? null;
3474
+ }
3465
3475
  const locationAddressMatchSchema = z.strictObject({
3466
3476
  point: locationPinSchema,
3467
3477
  precision: z.enum([
@@ -3601,6 +3611,52 @@ function resolvePermittedLocation(permission, location, siteCountry) {
3601
3611
  };
3602
3612
  }
3603
3613
 
3614
+ //#endregion
3615
+ //#region ../core/src/venue-location.ts
3616
+ /**
3617
+ * Release 1 gate: anon can still read the legacy address columns until release 2's migration,
3618
+ * so "Only people who've booked" isn't offered or accepted yet. Release 2 deletes this.
3619
+ */
3620
+ const BOOKED_ONLY_VENUE_ADDRESS_AVAILABLE = false;
3621
+ const venueLocationAudience = Symbol("venue-location-audience");
3622
+ /** Eligibility to read the venue is decided by the resource owner before disclosure. */
3623
+ function decidePublicVenueLocation(venue, siteCountry) {
3624
+ const audience = { [venueLocationAudience]: "public" };
3625
+ if (venue.location === null) return {
3626
+ ...audience,
3627
+ kind: "none",
3628
+ name: venue.name
3629
+ };
3630
+ if (venue.addressVisibility === "booked") {
3631
+ return {
3632
+ ...audience,
3633
+ kind: "area",
3634
+ name: venue.name,
3635
+ area: deriveLocationArea(venue.location.address)
3636
+ };
3637
+ }
3638
+ return {
3639
+ ...audience,
3640
+ kind: "full",
3641
+ name: venue.name,
3642
+ ...projectPublicLocation(venue.location, siteCountry)
3643
+ };
3644
+ }
3645
+ /** Caller must already hold confirmed-booking or staff authorisation. */
3646
+ function decideArrivalVenueLocation(venue, siteCountry) {
3647
+ const audience = { [venueLocationAudience]: "arrival" };
3648
+ return venue.location === null ? {
3649
+ ...audience,
3650
+ kind: "none",
3651
+ name: venue.name
3652
+ } : {
3653
+ ...audience,
3654
+ kind: "full",
3655
+ name: venue.name,
3656
+ ...projectPublicLocation(venue.location, siteCountry)
3657
+ };
3658
+ }
3659
+
3604
3660
  //#endregion
3605
3661
  //#region ../core/src/locationLinks.ts
3606
3662
  /** Both outbound actions use the arrival pin, never match evidence. */
@@ -3767,65 +3823,21 @@ function planLocationOpeningEvidence(previous, evidence) {
3767
3823
  }
3768
3824
 
3769
3825
  //#endregion
3770
- //#region ../core/src/location-migration.ts
3771
- /** Offline expand/contract conversions, not runtime fallback readers. */
3772
- const legacyText = z.string().nullable().optional();
3773
- const legacyCoordinatesSchema = z.strictObject({
3826
+ //#region ../core/src/location-conversion.ts
3827
+ /** Shared by the business address input and the offline location data migration. */
3828
+ const conversionText = z.string().nullable().optional();
3829
+ const conversionCoordinatesSchema = z.strictObject({
3774
3830
  lat: z.number().min(-90).max(90).nullable().optional(),
3775
3831
  lng: z.number().min(-180).max(180).nullable().optional()
3776
3832
  }).superRefine((value, context) => {
3777
3833
  if (value.lat == null !== (value.lng == null)) {
3778
3834
  context.addIssue({
3779
3835
  code: "custom",
3780
- message: "Legacy pin is incomplete."
3836
+ message: "The pin is incomplete."
3781
3837
  });
3782
3838
  }
3783
3839
  });
3784
- const venueAddressSchema = z.strictObject({
3785
- street: legacyText,
3786
- line1: legacyText,
3787
- line2: legacyText,
3788
- city: legacyText,
3789
- state: legacyText,
3790
- region: legacyText,
3791
- postalCode: legacyText,
3792
- postal_code: legacyText,
3793
- postcode: legacyText,
3794
- country: legacyText,
3795
- formatted: legacyText,
3796
- summary: legacyText
3797
- }).superRefine((value, context) => {
3798
- const aliases = [
3799
- [value.street, value.line1],
3800
- [value.state, value.region],
3801
- [
3802
- value.postalCode,
3803
- value.postal_code,
3804
- value.postcode
3805
- ],
3806
- [value.formatted, value.summary]
3807
- ];
3808
- aliases.forEach((parts) => {
3809
- const meaningful = parts.filter((part) => displayComparison(part) !== "");
3810
- if (meaningful.some((part) => displayComparison(part) !== displayComparison(meaningful[0]))) {
3811
- context.addIssue({
3812
- code: "custom",
3813
- message: "Legacy address aliases disagree."
3814
- });
3815
- }
3816
- });
3817
- }).nullable();
3818
- const businessAddressSchema = legacyCoordinatesSchema.safeExtend({
3819
- addressLine1: legacyText,
3820
- addressLine2: legacyText,
3821
- locality: legacyText,
3822
- region: legacyText,
3823
- postalCode: legacyText,
3824
- countryCode: legacyText,
3825
- displayAddress: legacyText
3826
- });
3827
- const customLocationSchema = legacyCoordinatesSchema.safeExtend({ addressText: legacyText });
3828
- function finishConversion(address, coordinates) {
3840
+ function finishLocationConversion(address, coordinates) {
3829
3841
  const parsedAddress = locationAddressSchema.nullable().safeParse(address);
3830
3842
  if (!parsedAddress.success) return err({
3831
3843
  kind: "invalid_legacy_location",
@@ -3847,34 +3859,6 @@ function finishConversion(address, coordinates) {
3847
3859
  issues: result.error.issues
3848
3860
  });
3849
3861
  }
3850
- function convertVenue(input) {
3851
- const address = venueAddressSchema.safeParse(input.addressJson ?? null);
3852
- const coordinates = legacyCoordinatesSchema.safeParse(input.locationJson ?? {});
3853
- if (!address.success) return err({
3854
- kind: "invalid_legacy_location",
3855
- issues: address.error.issues
3856
- });
3857
- if (!coordinates.success) return err({
3858
- kind: "invalid_legacy_location",
3859
- issues: coordinates.error.issues
3860
- });
3861
- const result = finishConversion(mapVenueAddress(address.data), coordinates.data);
3862
- return checkDisplayText(result, firstText(address.data?.formatted, address.data?.summary));
3863
- }
3864
- const displayComparison = (text) => (text ?? "").trim().replace(/\s+/g, " ").toLowerCase();
3865
- const firstText = (...parts) => parts.find((part) => part != null && part.trim().length > 0)?.trim() ?? null;
3866
- function mapVenueAddress(address) {
3867
- if (address === null) return null;
3868
- const structured = {
3869
- street: firstText(address.street, address.line1),
3870
- unit: address.line2,
3871
- locality: address.city,
3872
- region: firstText(address.state, address.region),
3873
- postalCode: firstText(address.postalCode, address.postal_code, address.postcode),
3874
- country: address.country
3875
- };
3876
- return Object.values(structured).some((part) => displayComparison(part) !== "") ? structured : { street: firstText(address.formatted, address.summary) };
3877
- }
3878
3862
  const displayTokens = (text) => (text ?? "").toLowerCase().match(/[\p{L}\p{N}]+/gu) ?? [];
3879
3863
  /** Only redundant trailing country text is disposable; ordered address words must all survive. */
3880
3864
  function comparableDisplay(text, countries) {
@@ -3882,7 +3866,8 @@ function comparableDisplay(text, countries) {
3882
3866
  const suffixIndex = tokens.findIndex((_token, index) => countries.some((country) => sameLocationCountry(tokens.slice(index).join(" "), country)));
3883
3867
  return (suffixIndex < 0 ? tokens : tokens.slice(0, suffixIndex)).join(" ");
3884
3868
  }
3885
- function checkDisplayText(result, text, siteCountry) {
3869
+ /** Refuses a conversion whose formatted address loses words from the stored display text. */
3870
+ function checkConvertedDisplayText(result, text, siteCountry) {
3886
3871
  if (!result.ok) return result;
3887
3872
  const original = text?.trim() ?? "";
3888
3873
  const derived = formatLocationAddress(result.value?.address ?? null);
@@ -3893,39 +3878,6 @@ function checkDisplayText(result, text, siteCountry) {
3893
3878
  derived
3894
3879
  }) : result;
3895
3880
  }
3896
- function convertBusiness(value, siteCountry) {
3897
- if (value == null) return ok(null);
3898
- const parsed = businessAddressSchema.safeParse(value);
3899
- if (!parsed.success) return err({
3900
- kind: "invalid_legacy_location",
3901
- issues: parsed.error.issues
3902
- });
3903
- const result = finishConversion({
3904
- street: parsed.data.addressLine1,
3905
- unit: parsed.data.addressLine2,
3906
- locality: parsed.data.locality,
3907
- region: parsed.data.region,
3908
- postalCode: parsed.data.postalCode,
3909
- country: parsed.data.countryCode
3910
- }, parsed.data);
3911
- return checkDisplayText(result, parsed.data.displayAddress, siteCountry);
3912
- }
3913
- function convertCustom(value) {
3914
- if (value == null) return ok(null);
3915
- const parsed = customLocationSchema.safeParse(value);
3916
- return parsed.success ? finishConversion({ street: parsed.data.addressText }, parsed.data) : err({
3917
- kind: "invalid_legacy_location",
3918
- issues: parsed.error.issues
3919
- });
3920
- }
3921
- /** Preserve pins exactly; never split free text or fabricate match evidence. */
3922
- function convertLegacyLocation(input) {
3923
- switch (input.kind) {
3924
- case "venue": return convertVenue(input);
3925
- case "business": return convertBusiness(input.value, input.siteCountry);
3926
- case "custom": return convertCustom(input.value);
3927
- }
3928
- }
3929
3881
 
3930
3882
  //#endregion
3931
3883
  //#region ../core/src/business-address.ts
@@ -4054,10 +4006,7 @@ function editBusinessPin(previous, address) {
4054
4006
  }) : err({ kind: "invalid_location" });
4055
4007
  }
4056
4008
  function convertLegacyBusinessEdit(previous, address) {
4057
- const converted = convertLegacyLocation({
4058
- kind: "business",
4059
- value: address
4060
- });
4009
+ const converted = businessAddressToLocation(address);
4061
4010
  if (!converted.ok || converted.value === null) return converted;
4062
4011
  return editLocationValue(previous, {
4063
4012
  address: converted.value.address,
@@ -4092,6 +4041,32 @@ function businessPinErrors(lat, lng) {
4092
4041
  const longitude = lng === null ? ["missing_longitude"] : !isLongitude(lng) ? ["invalid_longitude"] : [];
4093
4042
  return [...latitude, ...longitude];
4094
4043
  }
4044
+ const businessAddressSchema = conversionCoordinatesSchema.safeExtend({
4045
+ addressLine1: conversionText,
4046
+ addressLine2: conversionText,
4047
+ locality: conversionText,
4048
+ region: conversionText,
4049
+ postalCode: conversionText,
4050
+ countryCode: conversionText,
4051
+ displayAddress: conversionText
4052
+ });
4053
+ function businessAddressToLocation(value, siteCountry) {
4054
+ if (value == null) return ok(null);
4055
+ const parsed = businessAddressSchema.safeParse(value);
4056
+ if (!parsed.success) return err({
4057
+ kind: "invalid_legacy_location",
4058
+ issues: parsed.error.issues
4059
+ });
4060
+ const result = finishLocationConversion({
4061
+ street: parsed.data.addressLine1,
4062
+ unit: parsed.data.addressLine2,
4063
+ locality: parsed.data.locality,
4064
+ region: parsed.data.region,
4065
+ postalCode: parsed.data.postalCode,
4066
+ country: parsed.data.countryCode
4067
+ }, parsed.data);
4068
+ return checkConvertedDisplayText(result, parsed.data.displayAddress, siteCountry);
4069
+ }
4095
4070
 
4096
4071
  //#endregion
4097
4072
  //#region ../core/src/try-async.ts
@@ -6010,30 +5985,34 @@ const centredSectionKinds = [
6010
5985
  "opening-hours",
6011
5986
  "social-links",
6012
5987
  "engagement",
6013
- "legal",
6014
- "legal-navigation"
5988
+ "legal-navigation",
5989
+ "legal"
6015
5990
  ];
6016
5991
  /** Section ownership is exhaustive for both arrangements; content never changes placement. */
6017
5992
  const rowSectionGroups = {
6018
5993
  brand: "identity",
6019
5994
  "supporting-text": "identity",
6020
- "social-links": "identity",
5995
+ "social-links": "contact",
6021
5996
  navigation: "main-navigation",
6022
5997
  "business-address": "visit",
6023
- contact: "visit",
6024
- "opening-hours": "visit",
5998
+ contact: "contact",
5999
+ "opening-hours": "hours",
6025
6000
  engagement: "engagement",
6026
6001
  "legal-navigation": "legal-ending",
6027
6002
  legal: "legal-ending"
6028
6003
  };
6029
6004
  const centredSectionGroups = {
6030
6005
  ...rowSectionGroups,
6006
+ contact: "visit",
6007
+ "opening-hours": "visit",
6031
6008
  "social-links": "social"
6032
6009
  };
6033
6010
  const rowGroupOrder = [
6034
6011
  "identity",
6035
6012
  "main-navigation",
6036
6013
  "visit",
6014
+ "hours",
6015
+ "contact",
6037
6016
  "engagement",
6038
6017
  "legal-ending"
6039
6018
  ];
@@ -6049,6 +6028,8 @@ const groupSlots = {
6049
6028
  identity: "head",
6050
6029
  "main-navigation": "navigation",
6051
6030
  visit: "contact",
6031
+ hours: "contact",
6032
+ contact: "contact",
6052
6033
  social: "social",
6053
6034
  engagement: "panel",
6054
6035
  "legal-ending": "base"
@@ -6063,20 +6044,25 @@ function footerArrangementPolicy(input) {
6063
6044
  const arrangement = input.arrangement ?? "simple";
6064
6045
  return {
6065
6046
  arrangement,
6066
- kind: arrangement === "centred" || input.legalRegion === "separate" ? "separate-legal-region" : "integrated-legal",
6067
6047
  navigationLayout: effectiveFooterNavigationLayout(arrangement, normalizeFooterNavigationLayout(input.storedNavigationLayout))
6068
6048
  };
6069
6049
  }
6050
+ /** Address and hours pair up only in row arrangements, and only when both have content. */
6051
+ function placementFor(kind, sections, policy) {
6052
+ if (kind === "engagement" || kind === "main-navigation" && policy.navigationLayout === "inline-wrap") return "full-row";
6053
+ const paired = policy.arrangement !== "centred" && (kind === "visit" || kind === "hours") && sections.some((section) => section.kind === "business-address") && sections.some((section) => section.kind === "opening-hours");
6054
+ return paired ? "paired-column" : "column";
6055
+ }
6070
6056
  function buildGroups(sections, policy) {
6071
6057
  const centred = policy.arrangement === "centred";
6072
6058
  const order = centred ? centredGroupOrder : rowGroupOrder;
6073
6059
  const owners = centred ? centredSectionGroups : rowSectionGroups;
6074
- const sectionOrder = centred ? centredSectionKinds : sectionKinds;
6060
+ const sectionOrder = centred ? centredSectionKinds : [...sectionKinds.filter((kind) => kind !== "social-links"), "social-links"];
6075
6061
  return order.flatMap((kind) => {
6076
6062
  const groupSections = sections.filter((section) => owners[section.kind] === kind).sort((left, right) => sectionOrder.indexOf(left.kind) - sectionOrder.indexOf(right.kind));
6077
6063
  return groupSections.length === 0 ? [] : [{
6078
6064
  kind,
6079
- width: kind === "main-navigation" && policy.navigationLayout === "inline-wrap" ? "full-row" : "column",
6065
+ placement: placementFor(kind, sections, policy),
6080
6066
  sections: groupSections,
6081
6067
  ...centred ? { slot: groupSlots[kind] } : {}
6082
6068
  }];
@@ -6091,7 +6077,7 @@ function footerMembershipKey(sections) {
6091
6077
  }
6092
6078
  function renderRegion(kind, groups, policy) {
6093
6079
  if (groups.length === 0) return [];
6094
- const columns = kind !== "main" || policy.arrangement === "centred" ? 1 : Math.max(1, Math.min(groups.filter((group) => group.width === "column").length, 5));
6080
+ const columns = kind !== "main" || policy.arrangement === "centred" ? 1 : Math.max(1, Math.min(groups.filter((group) => group.placement !== "full-row").length, 5));
6095
6081
  return [{
6096
6082
  kind,
6097
6083
  columns,
@@ -6104,9 +6090,9 @@ function planFooterArrangement(renderableSections, policy) {
6104
6090
  const groups = buildGroups(selectedSections, policy);
6105
6091
  const separateEngagement = groups.filter((group) => group.kind === "engagement" && group.sections.some((section) => section.kind === "engagement" && section.treatment === "separate-row"));
6106
6092
  const layoutGroups = groups.filter((group) => !separateEngagement.includes(group));
6107
- const legalGroups = policy.kind === "separate-legal-region" ? layoutGroups.filter((group) => group.kind === "legal-ending") : [];
6093
+ const legalGroups = layoutGroups.filter((group) => group.kind === "legal-ending");
6108
6094
  const unsortedMainGroups = layoutGroups.filter((group) => !legalGroups.includes(group));
6109
- const mainGroups = policy.arrangement === "centred" ? unsortedMainGroups : [...unsortedMainGroups.filter((group) => group.width === "column"), ...unsortedMainGroups.filter((group) => group.width === "full-row")];
6095
+ const mainGroups = policy.arrangement === "centred" ? unsortedMainGroups : [...unsortedMainGroups.filter((group) => group.placement !== "full-row"), ...unsortedMainGroups.filter((group) => group.placement === "full-row")];
6110
6096
  return {
6111
6097
  membershipKey: footerMembershipKey(selectedSections),
6112
6098
  regions: [
@@ -10547,6 +10533,12 @@ const OFFLINE_PAYMENT_METHODS = [
10547
10533
  "card_machine",
10548
10534
  "other"
10549
10535
  ];
10536
+ const OFFLINE_PAYMENT_METHOD_LABELS = {
10537
+ cash: "Cash",
10538
+ bank_transfer: "Bank transfer",
10539
+ card_machine: "Card machine",
10540
+ other: "Other"
10541
+ };
10550
10542
 
10551
10543
  //#endregion
10552
10544
  export { locationValueSchema as $, parseEventSeriesId as $n, publicEventPricingDisplay as $t, parseMailingListContentVersionId as A, parseMediaAssetId as An, parseBookingTimeZone as At, footerNavigationLayouts as B, unsafeAsStorageBucketName as Bn, getBookingInstalmentDepositRefundability as Bt, resolveWholeSeriesBookingPhase as C, parseSiteTermsVersionId as Cn, getLocalScheduleTime as Ct, parseManagementKey as D, parseDatedOfferingCapacityHoldAuditRef as Dn, resolveBookingBusinessTimeZone as Dt, exposeSecret as E, unsafeAsPassId as En, parseLocalScheduleTime as Et, parseMailingListGlobalForm as F, unsafeAsOriginalFilename as Fn, isLiveOrderInstalmentPlanStatus as Ft, formatOpeningHoursRows as G, parseEditorSessionGeneration as Gn, resolveFlexibleBalanceDueAt as Gt, DEFAULT_MAILING_LIST_TARGETING as H, unsafeAsUploadSessionId as Hn, getBookingInstalmentProtectedDepositAmountCents as Ht, DEFAULT_MAILING_LIST_PRIVACY_NOTE as I, unsafeAsPositiveByteCount as In, isSettleableFlexibleBalanceContractStatus as It, assertAllowedPublicUrl as J, parseApiKeyId as Jn, parseEventPageSurfaceSubject as Jt, parsePublicContactDetails as K, parsePageId as Kn, resolveFlexibleBalanceInitialPaymentCents as Kt, DEFAULT_MAILING_LIST_SUCCESS_MESSAGE as L, unsafeAsPositiveSeconds as Ln, isSettleableOrderInstalmentPlanStatus as Lt, parseMailingListRuntimeContext as M, unsafeAsDetectedMimeType as Mn, toUtcIsoDateTimeString as Mt, assessMailingListTargeting as N, unsafeAsFileChecksumSha256 as Nn, BOOKING_COURSE_INSTALMENT_DEADLINES as Nt, slugify as O, parseDatedOfferingCapacityHoldId as On, resolveBookingTimeZoneId as Ot, parseConfiguredMailingListProvider as P, unsafeAsMediaAssetId as Pn, validateBookingPaymentOptionKinds as Pt, locationMapLinks as Q, unsafeAsUserId as Qn, publicEventPricingCurrency as Qt, parseMailingListProviderScope as R, unsafeAsSafeDownloadFilename as Rn, addIntervalPreservingMonthAnchor as Rt, orderedLiveRunSessions as S, parseCustomerId as Sn, getLocalScheduleDate as St, createSecret as T, unsafeAsEntitlementId as Tn, parseBookingLocalDate as Tt, planMailingListChoicePresentation as U, unsafeAsProductId as Un, omitZeroAmountFutureRows as Ut, parseMailingListPlacementTargeting as V, unsafeAsStoragePath as Vn, getBookingInstalmentPlanIntervalCount as Vt, isCanonicalRichTextDoc as W, unsafeAsCheckoutLineId as Wn, splitAmountWithRemainderInFirst as Wt, decideLocationSave as X, parseUserId as Xn, formatEventPricing as Xt, SENSITIVE_COLLECTION_MODES as Y, parseSiteId as Yn, formatBookingPriceDisplay as Yt, stableJsonStringify as Z, unsafeAsSiteId as Zn, isPublicEventPricingOptionDisplayable as Zt, WHOLE_SERIES_EVENT_PRESET_VALUES as _, formatDurationUnitLabel as _n, buildBookingUtcDateWindow as _t, resolveEventCatalogue as a, mapNonEmptyArray as an, unsafeAsPricingOptionId as ar, isPresent as at, CANCELLED_SESSION_STATUS as b, unsafeAsAppointmentResourceId as bn, formatLocalScheduleTime as bt, areConfiguredBookingVerticalConfigsEqual as c, parseNonNegativeCents as cn, blockInteractionContextSchema as cr, formatDate as ct, parseVerticalPresetId as d, toNonNegativeCents as dn, formatDateTimeRange as dt, publicEventPricingOptions as en, parseRetiredCourseId as er, normalizeLocationAddressText as et, resolveSiteVerticalBookingConfig as f, unsafeAsNonNegativeCents as fn, formatTime as ft, SURFACE_EVENT_PRESET_VALUES as g, assertNever as gn, toScheduledBookingDateTime as gt, ORDINARY_EVENT_PRESET_VALUES as h, parseCurrencyCode as hn, resolveBookingDisplayContext as ht, authoredValuesEqual as i, fromArray as in, unsafeAsOccurrenceId as ir, toLocationCoordinates as it, parseMailingListSignedSourceToken as j, unsafeAsDeclaredMimeType as jn, parseUtcIsoDateTimeString as jt, parseMailingListBlockId as k, unsafeAsBookingSessionId as kn, toBookingTimeZone as kt, canonicalizeConfiguredBookingVerticalConfig as l, parsePositiveCents as ln, formatDateRange as lt, EVENT_PRESET_VALUES as m, formatCurrencyAmount as mn, inferSiteDateLocale as mt, committedWriteProofSchema as n, resolveExactOrFreePriceDisplay as nn, unsafeAsEventOfferingId as nr, projectPublicLocation as nt, EVENT_PRESET_VOCABULARY as o, mapReadonlyNonEmptyArray as on, err as or, mapDrawingSchema as ot, DEFAULT_EVENT_TYPE_PRESETS as p, unsafeAsPositiveCents as pn, formatTimeRange as pt, parseWeeklyOpeningHours as q, unsafeAsSiteFontId as qn, deriveTotalTicketQuantity as qt, isRecord as r, resolvePricingOptionsPriceDisplay as rn, unsafeAsEventSeriesId as rr, publicLocationSchema as rt, NAVIGATION_LOCATIONS as s, isNonNegativeWholeCents as sn, ok as sr, selectCategoryView as st, OFFLINE_PAYMENT_METHODS as t, publicEventPricingType as tn, unsafeAsEventInstanceId as tr, parseLocationValue as tt, parseVerticalId as u, toCents as un, formatDateTime as ut, getPublicReadCachePolicy as v, unsafeAsBookingRequirementId as vn, compareLocalScheduleDates as vt, resolveWholeSeriesRunLifecycle as w, parseMembershipId as wn, localScheduleTimePattern as wt, nextLiveRunSessionStartMs as x, unsafeAsStaffMemberId as xn, getBookingLocalDateKey as xt, publicReadFreshnessSeconds as y, unsafeAsDemoCapability as yn, formatLocalScheduleDate as yt, parseFooterCompositionV1 as z, unsafeAsSiteScopedStoragePath as zn, clampConfiguredAmount as zt };
package/dist/testing.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import "./sdk-event-upsert-4Dn75Ui9.mjs";
3
- import "./src-nzVzuMR1.mjs";
4
- import { Bt as preparePushConfigTarget, G as syncLocalMediaForPull, Lt as applyPushConfigPlan, W as syncLocalMediaForPush, at as readEntries, ht as writeMediaManifest, o as executeEntryCommandPlanAsSyncResult, t as compileEntryPushCommands, wn as createOutput, z as calculateEntryDiffs } from "./entryCommands-CrfobcW7.mjs";
5
- import "./load-config-DTbiJyCf.mjs";
2
+ import "./sdk-event-upsert-CXc13KPT.mjs";
3
+ import "./src-4CBCWovR.mjs";
4
+ import { Bt as preparePushConfigTarget, G as syncLocalMediaForPull, Lt as applyPushConfigPlan, W as syncLocalMediaForPush, at as readEntries, ht as writeMediaManifest, o as executeEntryCommandPlanAsSyncResult, t as compileEntryPushCommands, wn as createOutput, z as calculateEntryDiffs } from "./entryCommands-5kz7nIFG.mjs";
5
+ import "./load-config-JcidEUjc.mjs";
6
6
 
7
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.28.1",
3
+ "version": "0.29.0",
4
4
  "description": "Riverbank CMS command-line tools for SDK site developers",
5
5
  "bin": {
6
6
  "riverbankcms": "dist/cli/index.mjs"
@@ -1,4 +0,0 @@
1
- #!/usr/bin/env node
2
- import { t as loadConfigFile } from "./load-config-DTbiJyCf.mjs";
3
-
4
- export { loadConfigFile };