riverbankcms 0.21.0 → 0.22.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/dist/acceptance/matrix.mjs +3 -3
- package/dist/cli/index.mjs +1691 -866
- package/dist/cli/init-docs/content/getting-started.md +17 -1
- package/dist/{entryCommands-DSQZqznu.mjs → entryCommands-CoGu0G2R.mjs} +1624 -1529
- package/dist/{eventUpsertInputSchema-zCTx0fdF.mjs → eventUpsertInputSchema-B0ubhUu5.mjs} +8 -2
- package/dist/load-config-Kg45qY-N.mjs +4 -0
- package/dist/{load-config-B68gtN45.mjs → load-config-j58KSqxl.mjs} +3 -3
- package/dist/{plan-CkMANumv.mjs → plan-C4IphkPc.mjs} +8 -3
- package/dist/scaffold/index.mjs +2 -2
- package/dist/{sdk-event-upsert-CrOuJrxo.mjs → sdk-event-upsert-BqjzK2zT.mjs} +461 -35
- package/dist/{src-BENi4Q5k.mjs → src-zzwJUef5.mjs} +154 -17
- package/dist/testing.mjs +4 -4
- package/package.json +2 -2
- package/dist/load-config-ghkXBKim.mjs +0 -4
|
@@ -603,13 +603,17 @@ const CURRENCY_LOCALE_BY_CODE = {
|
|
|
603
603
|
function resolveCurrencyLocale(currencyCode, override) {
|
|
604
604
|
return override ?? CURRENCY_LOCALE_BY_CODE[currencyCode] ?? "en";
|
|
605
605
|
}
|
|
606
|
-
function fractionDigitsFor(decimals, exactFormatter) {
|
|
606
|
+
function fractionDigitsFor(decimals, exactFormatter, amount) {
|
|
607
607
|
switch (decimals) {
|
|
608
608
|
case "exact": return {};
|
|
609
|
-
case "auto":
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
609
|
+
case "auto": {
|
|
610
|
+
const fraction = exactFormatter.formatToParts(amount).find((part) => part.type === "fraction")?.value;
|
|
611
|
+
const zeroFraction = exactFormatter.formatToParts(0).find((part) => part.type === "fraction")?.value;
|
|
612
|
+
return fraction === zeroFraction ? {
|
|
613
|
+
minimumFractionDigits: 0,
|
|
614
|
+
maximumFractionDigits: exactFormatter.resolvedOptions().maximumFractionDigits
|
|
615
|
+
} : {};
|
|
616
|
+
}
|
|
613
617
|
case "whole": return {
|
|
614
618
|
minimumFractionDigits: 0,
|
|
615
619
|
maximumFractionDigits: 0
|
|
@@ -643,12 +647,19 @@ function formatCurrencyMajorUnits(amount, currency, options) {
|
|
|
643
647
|
return new Intl.NumberFormat(locale, {
|
|
644
648
|
style: "currency",
|
|
645
649
|
currency: currencyCode,
|
|
646
|
-
...fractionDigitsFor(options?.decimals ?? "exact", exactFormatter)
|
|
650
|
+
...fractionDigitsFor(options?.decimals ?? "exact", exactFormatter, amount)
|
|
647
651
|
}).format(amount);
|
|
648
652
|
} catch {
|
|
649
653
|
return `${amount.toFixed(2)} ${currencyCode}`;
|
|
650
654
|
}
|
|
651
655
|
}
|
|
656
|
+
/** Gift-card copy retains pence only when the amount has a fractional part. */
|
|
657
|
+
function formatGiftCardAmountLabel(amountCents, currency = "GBP") {
|
|
658
|
+
return formatCurrencyAmount(amountCents, currency, {
|
|
659
|
+
locale: "en-GB",
|
|
660
|
+
decimals: amountCents % 100 === 0 ? "whole" : "exact"
|
|
661
|
+
});
|
|
662
|
+
}
|
|
652
663
|
|
|
653
664
|
//#endregion
|
|
654
665
|
//#region ../core/src/money-input.ts
|
|
@@ -2398,7 +2409,7 @@ function resolveBookingDisplayContext(input) {
|
|
|
2398
2409
|
locale: input.locale,
|
|
2399
2410
|
timeZone: input.sessionTimeZone
|
|
2400
2411
|
},
|
|
2401
|
-
zone: input.surface
|
|
2412
|
+
zone: input.surface !== "dashboard" && input.isOnline || input.sessionTimeZone !== input.siteTimeZone ? "always" : "omit"
|
|
2402
2413
|
};
|
|
2403
2414
|
}
|
|
2404
2415
|
const SDK_STANDARD_TIME_FORMAT = {
|
|
@@ -2442,19 +2453,19 @@ function formatDateRange(start, endInclusive, context, options = {}) {
|
|
|
2442
2453
|
return preserveOrder ? `${presentDate(first, context, profile)} – ${presentDate(last, context, profile)}` : presentDateRange(first, last, context, profile);
|
|
2443
2454
|
}
|
|
2444
2455
|
function formatDateTime(value, context, options) {
|
|
2445
|
-
return presentDateTime(value, context, displayProfile(options, options.zone, options.seconds));
|
|
2456
|
+
return presentDateTime(value, context, displayProfile(options, options.zone, options.clock, options.seconds));
|
|
2446
2457
|
}
|
|
2447
2458
|
function formatDateTimeRange(span, context, options) {
|
|
2448
|
-
return presentDateTimeRange(span, context, displayProfile(options, options.zone, options.seconds));
|
|
2459
|
+
return presentDateTimeRange(span, context, displayProfile(options, options.zone, options.clock, options.seconds));
|
|
2449
2460
|
}
|
|
2450
2461
|
function formatTime(value, context, options) {
|
|
2451
|
-
return presentTime(value, context, displayProfile({}, options.zone, options.seconds));
|
|
2462
|
+
return presentTime(value, context, displayProfile({}, options.zone, options.clock, options.seconds));
|
|
2452
2463
|
}
|
|
2453
2464
|
function formatTimeRange(start, end, context, options) {
|
|
2454
2465
|
return presentTimeRange({
|
|
2455
2466
|
start,
|
|
2456
2467
|
end
|
|
2457
|
-
}, context, displayProfile({}, options.zone, options.seconds));
|
|
2468
|
+
}, context, displayProfile({}, options.zone, options.clock, options.seconds));
|
|
2458
2469
|
}
|
|
2459
2470
|
/** Sole date projection/typography owner, used by display and scheduled adapters. */
|
|
2460
2471
|
function presentDate(value, context, profile) {
|
|
@@ -2561,11 +2572,19 @@ function combinedFormat(date, clock) {
|
|
|
2561
2572
|
...clock.format
|
|
2562
2573
|
};
|
|
2563
2574
|
}
|
|
2564
|
-
function displayProfile(options, zone, seconds) {
|
|
2575
|
+
function displayProfile(options, zone, clock, seconds) {
|
|
2565
2576
|
return {
|
|
2566
2577
|
kind: "display",
|
|
2567
2578
|
dateFormat: dateFormat(options),
|
|
2568
|
-
clock: {
|
|
2579
|
+
clock: clock === "24-hour" ? {
|
|
2580
|
+
kind: "intl",
|
|
2581
|
+
format: {
|
|
2582
|
+
hour: "2-digit",
|
|
2583
|
+
minute: "2-digit",
|
|
2584
|
+
...seconds === "include" ? { second: "2-digit" } : {},
|
|
2585
|
+
hourCycle: "h23"
|
|
2586
|
+
}
|
|
2587
|
+
} : {
|
|
2569
2588
|
kind: "compact",
|
|
2570
2589
|
localeSource: "product",
|
|
2571
2590
|
seconds
|
|
@@ -2592,11 +2611,29 @@ function formatTimeAgo(value, now, context) {
|
|
|
2592
2611
|
function formatTimeUntil(value, now, context) {
|
|
2593
2612
|
return formatRelative(value, now, context, "future");
|
|
2594
2613
|
}
|
|
2614
|
+
const DATE_STYLE_PARTS = {
|
|
2615
|
+
numeric: {
|
|
2616
|
+
day: "2-digit",
|
|
2617
|
+
month: "2-digit"
|
|
2618
|
+
},
|
|
2619
|
+
short: {
|
|
2620
|
+
day: "numeric",
|
|
2621
|
+
month: "short"
|
|
2622
|
+
},
|
|
2623
|
+
long: {
|
|
2624
|
+
day: "numeric",
|
|
2625
|
+
month: "long"
|
|
2626
|
+
},
|
|
2627
|
+
omit: {
|
|
2628
|
+
day: undefined,
|
|
2629
|
+
month: undefined
|
|
2630
|
+
}
|
|
2631
|
+
};
|
|
2595
2632
|
function dateFormat(options) {
|
|
2596
|
-
const style = options.date ?? "long";
|
|
2597
2633
|
return {
|
|
2598
|
-
|
|
2599
|
-
|
|
2634
|
+
...DATE_STYLE_PARTS[options.date ?? "long"],
|
|
2635
|
+
...options.day ? { day: options.day === "omit" ? undefined : options.day } : {},
|
|
2636
|
+
...options.month === "omit" ? { month: undefined } : {},
|
|
2600
2637
|
...options.year === "omit" ? {} : { year: "numeric" },
|
|
2601
2638
|
...options.weekday ? { weekday: options.weekday } : {}
|
|
2602
2639
|
};
|
|
@@ -8282,4 +8319,104 @@ function mergeBag(stored, patch, options) {
|
|
|
8282
8319
|
}
|
|
8283
8320
|
|
|
8284
8321
|
//#endregion
|
|
8285
|
-
|
|
8322
|
+
//#region ../core/src/appointment-lifecycle.ts
|
|
8323
|
+
const APPOINTMENT_STATUS_VALUES = [
|
|
8324
|
+
"requested",
|
|
8325
|
+
"pending",
|
|
8326
|
+
"confirmed",
|
|
8327
|
+
"cancelled",
|
|
8328
|
+
"no_show"
|
|
8329
|
+
];
|
|
8330
|
+
const APPOINTMENT_REQUEST_OUTCOME_VALUES = [
|
|
8331
|
+
"approved",
|
|
8332
|
+
"declined",
|
|
8333
|
+
"lapsed",
|
|
8334
|
+
"withdrawn"
|
|
8335
|
+
];
|
|
8336
|
+
const APPOINTMENT_REQUEST_NOTICE_KIND_VALUES = [
|
|
8337
|
+
"received",
|
|
8338
|
+
"confirmed",
|
|
8339
|
+
"declined"
|
|
8340
|
+
];
|
|
8341
|
+
function parseAppointmentStatus(value) {
|
|
8342
|
+
const status = APPOINTMENT_STATUS_VALUES.find((status$1) => status$1 === value);
|
|
8343
|
+
if (status === undefined) throw new Error("Unexpected appointment status");
|
|
8344
|
+
return status;
|
|
8345
|
+
}
|
|
8346
|
+
function parseAppointmentRequestOutcome(value) {
|
|
8347
|
+
if (value === null) return null;
|
|
8348
|
+
const outcome = APPOINTMENT_REQUEST_OUTCOME_VALUES.find((outcome$1) => outcome$1 === value);
|
|
8349
|
+
if (outcome === undefined) throw new Error("Unexpected appointment request outcome");
|
|
8350
|
+
return outcome;
|
|
8351
|
+
}
|
|
8352
|
+
function parseAppointmentRequestNoticeKind(value) {
|
|
8353
|
+
const kind = APPOINTMENT_REQUEST_NOTICE_KIND_VALUES.find((kind$1) => kind$1 === value);
|
|
8354
|
+
if (kind === undefined) throw new Error("Unexpected appointment request notice kind");
|
|
8355
|
+
return kind;
|
|
8356
|
+
}
|
|
8357
|
+
const APPOINTMENT_HISTORY_STATUS_VALUES = [
|
|
8358
|
+
"requested",
|
|
8359
|
+
"no_show",
|
|
8360
|
+
"scheduled",
|
|
8361
|
+
"pending",
|
|
8362
|
+
"confirmed",
|
|
8363
|
+
"cancelled"
|
|
8364
|
+
];
|
|
8365
|
+
function parseAppointmentHistoryStatus(value) {
|
|
8366
|
+
const status = APPOINTMENT_HISTORY_STATUS_VALUES.find((status$1) => status$1 === value);
|
|
8367
|
+
if (status === undefined) throw new Error("Unexpected appointment history status");
|
|
8368
|
+
return status;
|
|
8369
|
+
}
|
|
8370
|
+
const appointmentStatusLabels = {
|
|
8371
|
+
requested: "Waiting for approval",
|
|
8372
|
+
pending: "Awaiting payment",
|
|
8373
|
+
confirmed: "Confirmed",
|
|
8374
|
+
cancelled: "Cancelled",
|
|
8375
|
+
no_show: "No show"
|
|
8376
|
+
};
|
|
8377
|
+
/** Current appointment wording shared by dashboard and customer surfaces. */
|
|
8378
|
+
function appointmentStatusLabel(status) {
|
|
8379
|
+
return appointmentStatusLabels[status];
|
|
8380
|
+
}
|
|
8381
|
+
|
|
8382
|
+
//#endregion
|
|
8383
|
+
//#region ../core/src/gift-expiry.ts
|
|
8384
|
+
/** Gifts expire at an exclusive boundary; vouchers include their end instant. */
|
|
8385
|
+
function formatGiftExpiryDate(expiresAt, context, kind = "gift_card") {
|
|
8386
|
+
const instant = toUtcIsoDateTimeString(expiresAt);
|
|
8387
|
+
const lastValidInstant = kind === "gift_card" ? toUtcIsoDateTimeString(new Date(Date.parse(instant) - 1).toISOString()) : instant;
|
|
8388
|
+
return formatDate({
|
|
8389
|
+
kind: "instant",
|
|
8390
|
+
value: lastValidInstant
|
|
8391
|
+
}, {
|
|
8392
|
+
timeZone: resolveBookingTimeZoneId(context.siteTimezone),
|
|
8393
|
+
locale: context.locale
|
|
8394
|
+
}, { date: "long" });
|
|
8395
|
+
}
|
|
8396
|
+
|
|
8397
|
+
//#endregion
|
|
8398
|
+
//#region ../core/src/site-visibility.ts
|
|
8399
|
+
function isSitePubliclyAvailable(billingPausedAt) {
|
|
8400
|
+
return billingPausedAt == null || billingPausedAt.length === 0;
|
|
8401
|
+
}
|
|
8402
|
+
function isSiteLaunched(launchedAt) {
|
|
8403
|
+
return typeof launchedAt === "string" && launchedAt.length > 0;
|
|
8404
|
+
}
|
|
8405
|
+
function resolvePublicSiteVisibility(input) {
|
|
8406
|
+
if (input.isPreviewAttempt) {
|
|
8407
|
+
return "live";
|
|
8408
|
+
}
|
|
8409
|
+
if (!isSiteLaunched(input.launchedAt) && input.allowUnlaunchedDevAccess !== true) {
|
|
8410
|
+
return "prelaunch";
|
|
8411
|
+
}
|
|
8412
|
+
if (input.publiclyAvailable === false) {
|
|
8413
|
+
return "maintenance";
|
|
8414
|
+
}
|
|
8415
|
+
if (input.maintenanceModeEnabled) {
|
|
8416
|
+
return "maintenance";
|
|
8417
|
+
}
|
|
8418
|
+
return "live";
|
|
8419
|
+
}
|
|
8420
|
+
|
|
8421
|
+
//#endregion
|
|
8422
|
+
export { compareLocalScheduleDates as $, parseCustomerId as $t, DEFAULT_MAILING_LIST_SUCCESS_MESSAGE as A, unsafeAsSafeDownloadFilename as An, formatEventPricing as At, isPresent as B, ok as Bn, mapReadonlyNonEmptyArray as Bt, stableJsonStringify as C, unsafeAsOccurrenceId as Cn, omitZeroAmountFutureRows as Ct, parseMailingListSignedSourceToken as D, unsafeAsPositiveSeconds as Dn, deriveTotalTicketQuantity as Dt, parseMailingListContentVersionId as E, unsafeAsPositiveByteCount as En, resolveFlexibleBalanceInitialPaymentCents as Et, DEFAULT_MAILING_LIST_TARGETING as F, unsafeAsStorageBucketName as Fn, publicEventPricingType as Ft, formatDateRange as G, toNonNegativeCents as Gt, toLocationCoordinates as H, parseNonNegativeCents as Ht, planMailingListChoicePresentation as I, unsafeAsStoragePath as In, resolveExactOrFreePriceDisplay as It, formatTime as J, formatCurrencyAmount as Jt, formatDateTime as K, unsafeAsNonNegativeCents as Kt, isCanonicalRichTextDoc as L, unsafeAsUploadSessionId as Ln, resolvePricingOptionsPriceDisplay as Lt, parseFooterCompositionV1 as M, unsafeAsSiteId as Mn, publicEventPricingCurrency as Mt, footerNavigationLayouts as N, unsafeAsSiteScopedStoragePath as Nn, publicEventPricingDisplay as Nt, parseMailingListRuntimeContext as O, unsafeAsPricingOptionId as On, parseEventPageSurfaceSubject as Ot, parseMailingListPlacementTargeting as P, unsafeAsStaffMemberId as Pn, publicEventPricingOptions as Pt, buildBookingUtcDateWindow as Q, parseApiKeyId as Qt, parsePublicContactDetails as R, unsafeAsUserId as Rn, fromArray as Rt, parseManagementKey as S, unsafeAsMediaAssetId as Sn, getBookingInstalmentProtectedDepositAmountCents as St, parseMailingListBlockId as T, unsafeAsPassId as Tn, resolveFlexibleBalanceDueAt as Tt, selectCategoryView as U, parsePositiveCents as Ut, normalizeLocationAddressText as V, isNonNegativeWholeCents as Vt, formatDate as W, toCents as Wt, inferSiteDateLocale as X, assertNever as Xt, formatTimeRange as Y, parseCurrencyCode as Yt, resolveBookingDisplayContext as Z, formatDurationUnitLabel as Zt, orderedLiveRunSessions as _, unsafeAsEntitlementId as _n, isSettleableOrderInstalmentPlanStatus as _t, canonicalizeConfiguredBookingVerticalConfig as a, parsePageId as an, localScheduleTimePattern as at, createSecret as b, unsafeAsEventSeriesId as bn, getBookingInstalmentDepositRefundability as bt, resolveSiteVerticalBookingConfig as c, parseSiteTermsVersionId as cn, resolveBookingBusinessTimeZone as ct, ORDINARY_EVENT_PRESET_VALUES as d, unsafeAsBookingRequirementId as dn, toScheduledBookingDateTime as dt, parseDatedOfferingCapacityHoldAuditRef as en, formatLocalScheduleDate as et, SURFACE_EVENT_PRESET_VALUES as f, unsafeAsBookingSessionId as fn, toUtcIsoDateTimeString as ft, nextLiveRunSessionStartMs as g, unsafeAsDetectedMimeType as gn, isSettleableFlexibleBalanceContractStatus as gt, CANCELLED_SESSION_STATUS as h, unsafeAsDemoCapability as hn, isLiveOrderInstalmentPlanStatus as ht, areConfiguredBookingVerticalConfigsEqual as i, parseMembershipId as in, getLocalScheduleTime as it, parseMailingListProviderScope as j, unsafeAsSiteFontId as jn, isPublicEventPricingOptionDisplayable as jt, assessMailingListTargeting as k, unsafeAsProductId as kn, formatBookingPriceDisplay as kt, DEFAULT_EVENT_TYPE_PRESETS as l, parseUserId as ln, resolveBookingTimeZoneId as lt, publicReadFreshnessSeconds as m, unsafeAsDeclaredMimeType as mn, validateBookingPaymentOptionKinds as mt, EVENT_PRESET_VOCABULARY as n, parseEventSeriesId as nn, getBookingLocalDateKey as nt, parseVerticalId as o, parseRetiredCourseId as on, parseBookingLocalDate as ot, WHOLE_SERIES_EVENT_PRESET_VALUES as p, unsafeAsCheckoutLineId as pn, parseBookingTimeZone as pt, formatDateTimeRange as q, unsafeAsPositiveCents as qt, NAVIGATION_LOCATIONS as r, parseMediaAssetId as rn, getLocalScheduleDate as rt, parseVerticalPresetId as s, parseSiteId as sn, parseUtcIsoDateTimeString as st, resolveEventCatalogue as t, parseDatedOfferingCapacityHoldId as tn, formatLocalScheduleTime as tt, EVENT_PRESET_VALUES as u, unsafeAsAppointmentResourceId as un, toBookingTimeZone as ut, resolveWholeSeriesBookingPhase as v, unsafeAsEventInstanceId as vn, addIntervalPreservingMonthAnchor as vt, slugify as w, unsafeAsOriginalFilename as wn, splitAmountWithRemainderInFirst as wt, exposeSecret as x, unsafeAsFileChecksumSha256 as xn, getBookingInstalmentPlanIntervalCount as xt, resolveWholeSeriesRunLifecycle as y, unsafeAsEventOfferingId as yn, clampConfiguredAmount as yt, assertAllowedPublicUrl as z, err as zn, mapNonEmptyArray as zt };
|
package/dist/testing.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import "./sdk-event-upsert-
|
|
3
|
-
import "./src-
|
|
4
|
-
import { An as createOutput,
|
|
5
|
-
import "./load-config-
|
|
2
|
+
import "./sdk-event-upsert-BqjzK2zT.mjs";
|
|
3
|
+
import "./src-zzwJUef5.mjs";
|
|
4
|
+
import { An as createOutput, Ft as applyPushConfigPlan, H as syncLocalMediaForPush, L as calculateEntryDiffs, Rt as preparePushConfigTarget, U as syncLocalMediaForPull, o as executeEntryCommandPlanAsSyncResult, pt as writeMediaManifest, rt as readEntries, t as compileEntryPushCommands } from "./entryCommands-CoGu0G2R.mjs";
|
|
5
|
+
import "./load-config-j58KSqxl.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.
|
|
3
|
+
"version": "0.22.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.157.0 <1.0.0"
|
|
47
47
|
},
|
|
48
48
|
"optionalDependencies": {
|
|
49
49
|
"@napi-rs/keyring": "1.3.0"
|