@riverbankcms/sdk 0.91.0 → 0.93.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.
Files changed (118) hide show
  1. package/dist/{PreviewEditorSidebar-3TT47WCF.mjs → PreviewEditorSidebar-D3PAF7NW.mjs} +3 -3
  2. package/dist/{PreviewEditorUI-ORCLLUNZ.mjs → PreviewEditorUI-G5JVJEIJ.mjs} +3 -3
  3. package/dist/SdkPreviewModeRuntime-NHTLRNQD.mjs +8 -0
  4. package/dist/_dts/api/src/bookingConfig.d.ts +13 -1
  5. package/dist/_dts/api/src/bookingOperations.d.ts +1 -0
  6. package/dist/_dts/api/src/bookingRefundOutcomes.d.ts +6 -6
  7. package/dist/_dts/api/src/common/envelope.d.ts +10 -0
  8. package/dist/_dts/api/src/customerMembershipOutcomes.d.ts +4 -4
  9. package/dist/_dts/api/src/index.d.ts +2 -2
  10. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +6 -0
  11. package/dist/_dts/api/src/request.d.ts +1 -1
  12. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +32 -0
  13. package/dist/_dts/blocks/src/system/blocks/courses/shared/pricing.d.ts +12 -1
  14. package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +12 -0
  15. package/dist/_dts/blocks/src/system/blocks/courses/shared/types.d.ts +4 -1
  16. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +44 -0
  17. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +8 -0
  18. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +8 -1
  19. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessBookingFlow.d.ts +8 -1
  20. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessBookingFlow.state.d.ts +1 -0
  21. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.headless.state.d.ts +4 -0
  22. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.interactive.d.ts +40 -0
  23. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.reserved-fields.d.ts +1 -1
  24. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.state.d.ts +29 -0
  25. package/dist/_dts/blocks/src/system/runtime/nodes/booking-runtime-sources.d.ts +1 -0
  26. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/components.d.ts +6 -0
  27. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationWizard.d.ts +8 -0
  28. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/TicketSelectionStep.d.ts +8 -0
  29. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.d.ts +1 -0
  30. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +1 -1
  31. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +1 -0
  32. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +9 -0
  33. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +14 -14
  34. package/dist/_dts/content-editor/src/controller/useEntrySyncHelpers.d.ts +1 -1
  35. package/dist/_dts/content-editor/src/hooks/useEntryActions.d.ts +5 -15
  36. package/dist/_dts/content-editor/src/ui/editorSnapshot.d.ts +46 -0
  37. package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +43 -36
  38. package/dist/_dts/content-model/src/entry-slots/types.d.ts +110 -2
  39. package/dist/_dts/core/src/branded.d.ts +3 -0
  40. package/dist/_dts/core/src/event-pricing.d.ts +18 -1
  41. package/dist/_dts/core/src/money-input.d.ts +34 -4
  42. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +70 -0
  43. package/dist/_dts/media-core/src/fileAssetCompatibility.d.ts +1 -1
  44. package/dist/_dts/media-core/src/filePersistence.d.ts +5 -1
  45. package/dist/_dts/media-core/src/fileStorage.d.ts +1 -0
  46. package/dist/_dts/media-core/src/fileUploadFinalization.d.ts +29 -1
  47. package/dist/_dts/media-core/src/index.d.ts +1 -0
  48. package/dist/_dts/media-core/src/legacyMediaValue.d.ts +11 -0
  49. package/dist/_dts/media-core/src/videoPrep.d.ts +15 -6
  50. package/dist/_dts/media-core/src/videoSlotPolicy.d.ts +5 -5
  51. package/dist/_dts/media-react/src/hooks/useApiMediaUploader.d.ts +2 -1
  52. package/dist/_dts/sdk/src/cli/commands/push/execute/diff.d.ts +2 -0
  53. package/dist/_dts/sdk/src/cli/commands/push/execute/localMediaReporting.d.ts +23 -0
  54. package/dist/_dts/sdk/src/cli/commands/push/scopes/commandBackedDatedOfferingScope.d.ts +54 -0
  55. package/dist/_dts/sdk/src/cli/commands/push/scopes/mediaPrep.d.ts +7 -2
  56. package/dist/_dts/sdk/src/cli/commands/push/scopes/types.d.ts +6 -0
  57. package/dist/_dts/sdk/src/cli/media/local-sync.d.ts +35 -0
  58. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +23 -1
  59. package/dist/_dts/sdk/src/version.d.ts +1 -1
  60. package/dist/{chunk-GDT2QGIL.mjs → chunk-A63UXN3P.mjs} +21 -19
  61. package/dist/{chunk-U5YM4AWE.mjs → chunk-AJZGT6YG.mjs} +1 -1
  62. package/dist/{chunk-AFPMCLS7.mjs → chunk-AQ6RT6LZ.mjs} +2 -2
  63. package/dist/{chunk-ZA2S7H34.mjs → chunk-NT76QGIJ.mjs} +98 -1
  64. package/dist/{chunk-RQUZYSES.mjs → chunk-PCNCETBI.mjs} +1196 -426
  65. package/dist/{chunk-S3YHJWEU.mjs → chunk-XIK2HYI3.mjs} +7 -7
  66. package/dist/cli/index.mjs +749 -166
  67. package/dist/client/{accordion-AFX37652.mjs → accordion-RNQIPG55.mjs} +2 -2
  68. package/dist/client/{bookingForm-32V5QCOW.mjs → bookingForm-HYEEVRLP.mjs} +89 -14
  69. package/dist/client/bookings.mjs +243 -17
  70. package/dist/client/{carousel-TJGQJ7ER.mjs → carousel-W7DQ3YPU.mjs} +3 -3
  71. package/dist/client/{cart-JUU2JEW4.mjs → cart-PXJ3SXXO.mjs} +7 -7
  72. package/dist/client/{checkout-RD6BTFX4.mjs → checkout-X3JYSOXI.mjs} +7 -7
  73. package/dist/client/{chunk-MLBNVN4H.mjs → chunk-6SYGVVWA.mjs} +67 -4
  74. package/dist/client/{chunk-E6VIWZUG.mjs → chunk-DUOHLWLF.mjs} +3 -3
  75. package/dist/client/{chunk-6QZIBNGV.mjs → chunk-IXDSXF2D.mjs} +154 -16
  76. package/dist/client/{chunk-CKXEUWWA.mjs → chunk-J6TMMMXW.mjs} +3 -3
  77. package/dist/client/{chunk-PMNAV6LO.mjs → chunk-JNE6UI6U.mjs} +7 -6
  78. package/dist/client/{chunk-ISAUXU5R.mjs → chunk-OLAOAZEO.mjs} +1 -1
  79. package/dist/client/{chunk-RWYFG625.mjs → chunk-PCHACQEB.mjs} +30 -2
  80. package/dist/client/{chunk-FMZZHAIR.mjs → chunk-PICR3NTQ.mjs} +52 -5
  81. package/dist/client/{chunk-6RN62XBV.mjs → chunk-Q47XGAGS.mjs} +1 -1
  82. package/dist/client/{chunk-WHZQDPBZ.mjs → chunk-TNGL2WJF.mjs} +1 -0
  83. package/dist/client/{chunk-C4LP6BPG.mjs → chunk-WERRJXNJ.mjs} +1 -1
  84. package/dist/client/{chunk-RMOFBBNA.mjs → chunk-YYVGSYBO.mjs} +6 -6
  85. package/dist/client/client.mjs +641 -54
  86. package/dist/client/{courseRegistration-X63QAIVV.mjs → courseRegistration-QZ67PVHO.mjs} +111 -11
  87. package/dist/client/{eventCalendar-5T24GCZL.mjs → eventCalendar-V3BDHQNT.mjs} +9 -9
  88. package/dist/client/{eventCombined-AZVTF22X.mjs → eventCombined-XYFRN2RG.mjs} +9 -9
  89. package/dist/client/{eventDetails-7GPFNLGF.mjs → eventDetails-TFE5TWKV.mjs} +9 -9
  90. package/dist/client/{eventListing-QEUMTMUM.mjs → eventListing-IQ6AGWZ6.mjs} +9 -9
  91. package/dist/client/{eventRegistration-P2EDKCQZ.mjs → eventRegistration-WGJVFKQJ.mjs} +9 -9
  92. package/dist/client/{form-NUJ7H4IN.mjs → form-6UZY6RUA.mjs} +3 -3
  93. package/dist/client/{headerSection-JB7LECPL.mjs → headerSection-RSFXY6V3.mjs} +3 -3
  94. package/dist/client/hooks.mjs +57 -5
  95. package/dist/client/{locationMap-UEYWUCSW.mjs → locationMap-24FH67I4.mjs} +3 -3
  96. package/dist/client/{newsletterForm-S2YZQ2X7.mjs → newsletterForm-QVL3MLTN.mjs} +3 -3
  97. package/dist/client/{productDetail-H5MADGG7.mjs → productDetail-ZDYN3G4T.mjs} +7 -7
  98. package/dist/client/{productList-DK7YON7H.mjs → productList-4BMJLQHZ.mjs} +7 -7
  99. package/dist/client/rendering/client.mjs +503 -36
  100. package/dist/client/rendering/islands.mjs +19 -19
  101. package/dist/client/rendering.mjs +583 -39
  102. package/dist/client/{shop-6PA7RDRJ.mjs → shop-U5C634FF.mjs} +7 -7
  103. package/dist/preview-next/client/runtime.mjs +5 -5
  104. package/dist/{sdk-runtime-JP5347OB.mjs → sdk-runtime-VGV46WVB.mjs} +6 -6
  105. package/dist/server/components.mjs +287 -68
  106. package/dist/server/config-validation.mjs +58 -5
  107. package/dist/server/config.mjs +58 -5
  108. package/dist/server/data.mjs +57 -5
  109. package/dist/server/index.mjs +104 -29
  110. package/dist/server/next.mjs +347 -85
  111. package/dist/server/page-converter.mjs +22 -5
  112. package/dist/server/prebuild.mjs +1 -1
  113. package/dist/server/rendering/server.mjs +287 -68
  114. package/dist/server/rendering.mjs +287 -68
  115. package/dist/server/routing.mjs +131 -67
  116. package/dist/server/server.mjs +189 -94
  117. package/package.json +1 -1
  118. package/dist/SdkPreviewModeRuntime-GMCDQPZZ.mjs +0 -8
@@ -45,9 +45,6 @@ function formatKeyAsLabel(key) {
45
45
  return key.replace(/([A-Z])/g, " $1").replace(/[-_]/g, " ").trim().split(" ").map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(" ");
46
46
  }
47
47
 
48
- // ../blocks/src/system/manifest/schema.ts
49
- import { z as z2 } from "zod";
50
-
51
48
  // ../core/src/result.ts
52
49
  function ok(value) {
53
50
  return { ok: true, value };
@@ -101,6 +98,7 @@ function publicEventPricingType(pricing) {
101
98
  return "free";
102
99
  case "single_paid":
103
100
  case "ticket_types":
101
+ case "sliding_scale":
104
102
  case "course":
105
103
  return isFreePublicEventPriceDisplay(pricing.display) ? "free" : "paid";
106
104
  case "external":
@@ -299,6 +297,9 @@ function parseAspectRatioValue(value) {
299
297
  return numeric;
300
298
  }
301
299
 
300
+ // ../blocks/src/system/manifest/schema.ts
301
+ import { z as z2 } from "zod";
302
+
302
303
  // ../blocks/src/system/node/schema.ts
303
304
  import { z } from "zod";
304
305
  var transformStepSchema = z.object({
@@ -19282,9 +19283,12 @@ var coursePricingOptionSchema = z35.object({
19282
19283
  });
19283
19284
  var coursePricingSchema = z35.object({
19284
19285
  bookingRequirement: z35.enum(["none", "required"]),
19285
- pricingStrategy: z35.enum(["free", "single", "tiered"]),
19286
+ pricingStrategy: z35.enum(["free", "single", "tiered", "sliding_scale"]),
19286
19287
  currency: z35.string(),
19287
19288
  singlePriceAmount: z35.number().nullable(),
19289
+ slidingMinAmount: z35.number().nullable().optional(),
19290
+ slidingMaxAmount: z35.number().nullable().optional(),
19291
+ slidingSuggestedAmount: z35.number().nullable().optional(),
19288
19292
  paymentTerms: blockBookingPaymentTermsSchema,
19289
19293
  options: z35.array(coursePricingOptionSchema)
19290
19294
  });
@@ -19438,6 +19442,19 @@ var publicEventPricingSchema = z36.discriminatedUnion("kind", [
19438
19442
  ticketTypes: z36.array(publicEventTicketTypeSchema),
19439
19443
  display: publicEventTicketTypePriceDisplaySchema
19440
19444
  }),
19445
+ z36.object({
19446
+ kind: z36.literal("sliding_scale"),
19447
+ minAmount: z36.number(),
19448
+ maxAmount: z36.number(),
19449
+ suggestedAmount: z36.number().nullable(),
19450
+ currency: z36.string(),
19451
+ display: z36.object({
19452
+ kind: z36.literal("range"),
19453
+ minAmount: z36.number(),
19454
+ maxAmount: z36.number(),
19455
+ currency: z36.string()
19456
+ })
19457
+ }),
19441
19458
  z36.object({
19442
19459
  kind: z36.literal("course"),
19443
19460
  display: z36.object({ kind: z36.literal("course"), display: publicCoursePriceDisplaySchema })
@@ -19854,7 +19871,7 @@ function isRecord3(value) {
19854
19871
  }
19855
19872
  function isPublicEventPricing(value) {
19856
19873
  if (!isRecord3(value) || typeof value.kind !== "string") return false;
19857
- return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course" || value.kind === "external";
19874
+ return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "sliding_scale" || value.kind === "ticket_types" || value.kind === "course" || value.kind === "external";
19858
19875
  }
19859
19876
  function isPublicEventTicketType(value) {
19860
19877
  return isRecord3(value) && typeof value.id === "string";
@@ -4,7 +4,7 @@ import * as path from "path";
4
4
  import * as crypto from "crypto";
5
5
 
6
6
  // src/version.ts
7
- var SDK_VERSION = "0.91.0";
7
+ var SDK_VERSION = "0.93.0";
8
8
 
9
9
  // src/constants.ts
10
10
  var PREBUILD_PAGE_SIZE = 50;
@@ -54,65 +54,6 @@ function formatKeyAsLabel(key) {
54
54
  // ../blocks/src/system/manifest/fieldValidation/index.ts
55
55
  import { z as z4 } from "zod";
56
56
 
57
- // ../blocks/src/system/types/link.ts
58
- import { z } from "zod";
59
- var nullableString = z.union([z.string().min(1), z.null()]);
60
- var resolvedInternalLinkKeys = ["entityId", "entityType", "href", "title", "typeLabel"];
61
- var internalRouteOnlyLinkSchema = z.object({
62
- kind: z.literal("internal"),
63
- routeId: z.string().min(1)
64
- }).passthrough().superRefine((value, ctx) => {
65
- const hasResolvedMetadata = resolvedInternalLinkKeys.some((key) => value[key] != null);
66
- if (!hasResolvedMetadata) return;
67
- ctx.addIssue({
68
- code: "custom",
69
- message: "Internal links with resolved metadata must include entityId, entityType, href, title, and typeLabel"
70
- });
71
- });
72
- var internalResolvedLinkSchema = z.object({
73
- kind: z.literal("internal"),
74
- routeId: z.string().min(1),
75
- entityId: z.string().min(1),
76
- entityType: z.enum(["page", "content"]),
77
- href: z.string().min(1),
78
- title: z.string().min(1),
79
- typeLabel: z.string().min(1),
80
- contentTypeKey: nullableString.optional(),
81
- contentTypeName: nullableString.optional(),
82
- updatedAt: nullableString.optional()
83
- }).passthrough();
84
- var internalLinkSchema = z.union([
85
- internalResolvedLinkSchema,
86
- internalRouteOnlyLinkSchema
87
- ]);
88
- var externalLinkSchema = z.object({
89
- kind: z.literal("external"),
90
- href: z.string().min(1)
91
- }).passthrough();
92
- var customLinkSchema = z.object({
93
- kind: z.literal("url"),
94
- href: z.string().min(1)
95
- }).passthrough();
96
- var pageLinkSchema = z.object({
97
- kind: z.literal("page"),
98
- identifier: z.string().min(1)
99
- }).passthrough();
100
- var entryLinkSchema = z.object({
101
- kind: z.literal("entry"),
102
- contentType: z.string().min(1),
103
- identifier: z.string().min(1)
104
- }).passthrough();
105
- var linkSchema = z.union([
106
- internalLinkSchema,
107
- externalLinkSchema,
108
- customLinkSchema,
109
- pageLinkSchema,
110
- entryLinkSchema
111
- ]);
112
-
113
- // ../blocks/src/system/manifest/schema.ts
114
- import { z as z3 } from "zod";
115
-
116
57
  // ../core/src/result.ts
117
58
  function ok(value) {
118
59
  return { ok: true, value };
@@ -123,6 +64,8 @@ function err(error) {
123
64
 
124
65
  // ../core/src/branded.ts
125
66
  var unsafeAsMediaAssetId = (id) => id;
67
+ var unsafeAsStorageBucketName = (value) => value;
68
+ var unsafeAsStoragePath = (value) => value;
126
69
 
127
70
  // ../core/src/assert-never.ts
128
71
  function assertNever(value, message = "Unexpected variant") {
@@ -177,6 +120,7 @@ function publicEventPricingType(pricing) {
177
120
  return "free";
178
121
  case "single_paid":
179
122
  case "ticket_types":
123
+ case "sliding_scale":
180
124
  case "course":
181
125
  return isFreePublicEventPriceDisplay(pricing.display) ? "free" : "paid";
182
126
  case "external":
@@ -189,6 +133,7 @@ function publicEventPricingCurrency(pricing) {
189
133
  case "free_registration":
190
134
  case "single_paid":
191
135
  case "ticket_types":
136
+ case "sliding_scale":
192
137
  return pricing.currency;
193
138
  case "course":
194
139
  return pricing.display.display.currency;
@@ -220,6 +165,8 @@ function formatCoursePriceDisplayLabel(display, options) {
220
165
  return `Course (${formatCurrencyAmount(display.amount, display.currency, options)})`;
221
166
  case "from":
222
167
  return `Course (From ${formatCurrencyAmount(display.amount, display.currency, options)})`;
168
+ case "range":
169
+ return `Course (${formatCurrencyAmount(display.minAmount, display.currency, options)} - ${formatCurrencyAmount(display.maxAmount, display.currency, options)})`;
223
170
  default:
224
171
  return assertNever(display);
225
172
  }
@@ -511,6 +458,77 @@ function resolvePlanningDateInput(input = {}) {
511
458
  return resolvePlanningNowDate(input);
512
459
  }
513
460
 
461
+ // ../media-core/src/fileSafety.ts
462
+ var CONTROL_CHARACTER_PATTERN = /[\u0000-\u001f\u007f]/u;
463
+ function containsUnsafePathSegmentCharacter(value) {
464
+ return value.includes("/") || value.includes("\\") || CONTROL_CHARACTER_PATTERN.test(value);
465
+ }
466
+ function isReservedPathSegment(value) {
467
+ return value === "." || value === "..";
468
+ }
469
+ function isUnsafePathSegment(segment) {
470
+ return segment.trim().length === 0 || segment !== segment.trim() || isReservedPathSegment(segment) || containsUnsafePathSegmentCharacter(segment);
471
+ }
472
+
473
+ // ../media-core/src/fileStorage.ts
474
+ var FILE_STORAGE_BUCKETS = {
475
+ publicSite: unsafeAsStorageBucketName("media"),
476
+ privateSite: unsafeAsStorageBucketName("site-files-private"),
477
+ temporary: unsafeAsStorageBucketName("temp-uploads")
478
+ };
479
+ var PUBLIC_SITE_FILE_STORAGE_BUCKETS = [
480
+ FILE_STORAGE_BUCKETS.publicSite,
481
+ // Existing site logo and font uploads predate the unified file buckets.
482
+ unsafeAsStorageBucketName("site-assets"),
483
+ unsafeAsStorageBucketName("site-fonts")
484
+ ];
485
+ var PRIVATE_SITE_FILE_BUCKET_MIME_TYPES = [
486
+ "application/pdf",
487
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
488
+ "text/plain",
489
+ "application/rtf",
490
+ "text/rtf",
491
+ "image/jpeg",
492
+ "image/png",
493
+ "image/webp",
494
+ "image/gif",
495
+ "image/avif",
496
+ "image/heic",
497
+ "image/heif",
498
+ "image/svg+xml",
499
+ "text/csv",
500
+ "application/csv",
501
+ "application/vnd.ms-excel",
502
+ "application/zip",
503
+ "application/x-zip-compressed",
504
+ "audio/mpeg",
505
+ "audio/mp4",
506
+ "audio/wav",
507
+ "audio/x-wav",
508
+ "audio/ogg",
509
+ "audio/webm",
510
+ "audio/flac",
511
+ "video/mp4",
512
+ "video/webm",
513
+ "video/quicktime"
514
+ ];
515
+ var TEMP_UPLOAD_BUCKET_MIME_TYPES = [
516
+ ...PRIVATE_SITE_FILE_BUCKET_MIME_TYPES,
517
+ "font/woff2",
518
+ "application/font-woff2",
519
+ "application/x-font-woff2",
520
+ "application/octet-stream"
521
+ ];
522
+ function parseStoragePath(value) {
523
+ return joinStoragePathSegments(value.split("/"));
524
+ }
525
+ function joinStoragePathSegments(segments) {
526
+ if (segments.some(isUnsafePathSegment)) {
527
+ return err("unsafe-path-segment");
528
+ }
529
+ return ok(unsafeAsStoragePath(segments.join("/")));
530
+ }
531
+
514
532
  // ../media-core/src/typeGuards.ts
515
533
  function isRecord(value) {
516
534
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
@@ -527,10 +545,10 @@ var RELATIVE_STORAGE_PATH_PREFIXES = [
527
545
  "imports/"
528
546
  ];
529
547
  function isRelativeDirectImageStoragePath(storagePath) {
530
- return RELATIVE_STORAGE_PATH_PREFIXES.some((prefix) => storagePath.startsWith(prefix));
548
+ return RELATIVE_STORAGE_PATH_PREFIXES.some((prefix) => storagePath.startsWith(prefix)) && parseStoragePath(storagePath).ok;
531
549
  }
532
550
  function isSiteScopedDirectImageStoragePath(storagePath) {
533
- return storagePath.startsWith("sites/");
551
+ return storagePath.startsWith("sites/") && parseStoragePath(storagePath).ok;
534
552
  }
535
553
  function encodeStoragePath(storagePath) {
536
554
  return storagePath.split("/").map((segment) => encodeURIComponent(segment)).join("/");
@@ -786,6 +804,82 @@ function mediaIdentifierOrFallback(current, fallback2) {
786
804
  return fallback2 ?? (typeof current === "string" ? current : void 0);
787
805
  }
788
806
 
807
+ // ../media-core/src/legacyMediaValue.ts
808
+ function legacyStringMediaTypeForField(field) {
809
+ if (field.type === "file") {
810
+ return field.fileKinds?.[0] ?? "document";
811
+ }
812
+ return field.mediaKinds?.[0] ?? "image";
813
+ }
814
+ function normalizeLegacyStringMediaValueForField(value, field) {
815
+ if (typeof value !== "string") return value;
816
+ const src = value.trim();
817
+ if (!src) return value;
818
+ return {
819
+ type: legacyStringMediaTypeForField(field),
820
+ src
821
+ };
822
+ }
823
+
824
+ // ../blocks/src/system/types/link.ts
825
+ import { z } from "zod";
826
+ var nullableString = z.union([z.string().min(1), z.null()]);
827
+ var resolvedInternalLinkKeys = ["entityId", "entityType", "href", "title", "typeLabel"];
828
+ var internalRouteOnlyLinkSchema = z.object({
829
+ kind: z.literal("internal"),
830
+ routeId: z.string().min(1)
831
+ }).passthrough().superRefine((value, ctx) => {
832
+ const hasResolvedMetadata = resolvedInternalLinkKeys.some((key) => value[key] != null);
833
+ if (!hasResolvedMetadata) return;
834
+ ctx.addIssue({
835
+ code: "custom",
836
+ message: "Internal links with resolved metadata must include entityId, entityType, href, title, and typeLabel"
837
+ });
838
+ });
839
+ var internalResolvedLinkSchema = z.object({
840
+ kind: z.literal("internal"),
841
+ routeId: z.string().min(1),
842
+ entityId: z.string().min(1),
843
+ entityType: z.enum(["page", "content"]),
844
+ href: z.string().min(1),
845
+ title: z.string().min(1),
846
+ typeLabel: z.string().min(1),
847
+ contentTypeKey: nullableString.optional(),
848
+ contentTypeName: nullableString.optional(),
849
+ updatedAt: nullableString.optional()
850
+ }).passthrough();
851
+ var internalLinkSchema = z.union([
852
+ internalResolvedLinkSchema,
853
+ internalRouteOnlyLinkSchema
854
+ ]);
855
+ var externalLinkSchema = z.object({
856
+ kind: z.literal("external"),
857
+ href: z.string().min(1)
858
+ }).passthrough();
859
+ var customLinkSchema = z.object({
860
+ kind: z.literal("url"),
861
+ href: z.string().min(1)
862
+ }).passthrough();
863
+ var pageLinkSchema = z.object({
864
+ kind: z.literal("page"),
865
+ identifier: z.string().min(1)
866
+ }).passthrough();
867
+ var entryLinkSchema = z.object({
868
+ kind: z.literal("entry"),
869
+ contentType: z.string().min(1),
870
+ identifier: z.string().min(1)
871
+ }).passthrough();
872
+ var linkSchema = z.union([
873
+ internalLinkSchema,
874
+ externalLinkSchema,
875
+ customLinkSchema,
876
+ pageLinkSchema,
877
+ entryLinkSchema
878
+ ]);
879
+
880
+ // ../blocks/src/system/manifest/schema.ts
881
+ import { z as z3 } from "zod";
882
+
789
883
  // ../blocks/src/system/node/schema.ts
790
884
  import { z as z2 } from "zod";
791
885
  var transformStepSchema = z2.object({
@@ -2546,7 +2640,10 @@ function deriveFieldValidationPlan(field, path = [field.id]) {
2546
2640
  return makePlan("richText", "object", field, path, required, commonConstraints(required, { kind: "richTextDoc" }));
2547
2641
  case "media":
2548
2642
  case "file":
2549
- return makePlan("media", "object", field, path, required, commonConstraints(required, { kind: "mediaObject" }));
2643
+ return {
2644
+ ...makePlan("media", "object", field, path, required, commonConstraints(required, { kind: "mediaObject" })),
2645
+ legacyStringType: legacyStringMediaTypeForField(field)
2646
+ };
2550
2647
  case "link":
2551
2648
  return makePlan("link", "object", field, path, required, commonConstraints(required, { kind: "linkObject" }));
2552
2649
  case "boolean":
@@ -2731,15 +2828,23 @@ function normalizeFieldValue(plan, value, ctx) {
2731
2828
  return normalizeRepeaterItems(plan, value, ctx);
2732
2829
  case "boolean":
2733
2830
  case "richText":
2734
- case "media":
2735
2831
  case "link":
2736
2832
  case "select":
2737
2833
  case "passthrough":
2738
2834
  return value;
2835
+ case "media":
2836
+ return normalizeMediaInput(plan, value);
2739
2837
  default:
2740
2838
  return assertNever2(plan);
2741
2839
  }
2742
2840
  }
2841
+ function normalizeMediaInput(plan, value) {
2842
+ return normalizeLegacyStringMediaValueForField(value, {
2843
+ type: plan.fieldType,
2844
+ mediaKinds: plan.fieldType === "media" ? [plan.legacyStringType] : void 0,
2845
+ fileKinds: plan.fieldType === "file" ? [plan.legacyStringType] : void 0
2846
+ });
2847
+ }
2743
2848
  function normalizeObjectChildren(children, value, ctx) {
2744
2849
  if (!value || typeof value !== "object" || Array.isArray(value)) return value;
2745
2850
  const normalized = {
@@ -3003,6 +3108,21 @@ function fieldPlanToZod(plan, options = {}) {
3003
3108
  }
3004
3109
  });
3005
3110
  }
3111
+ function fieldPresenceForPlan(plan) {
3112
+ return plan.required ? { kind: "required" } : { kind: "optional" };
3113
+ }
3114
+ function fieldPlanToObjectPropertyZod(plan, options = {}) {
3115
+ const schema = fieldPlanToZod(plan, options);
3116
+ const presence = fieldPresenceForPlan(plan);
3117
+ switch (presence.kind) {
3118
+ case "required":
3119
+ return schema;
3120
+ case "optional":
3121
+ return schema.optional();
3122
+ default:
3123
+ return assertNever2(presence);
3124
+ }
3125
+ }
3006
3126
  function addFieldIssueToZodContext(zodCtx, validationIssue, rootPath) {
3007
3127
  const message = fieldIssueToMessage(validationIssue);
3008
3128
  const path = relativeZodIssuePath(validationIssue.path, rootPath);
@@ -3215,7 +3335,7 @@ function createManifestValidator(manifestOrFields, options = {}) {
3215
3335
  function deriveContentZodFromPlans(plans, options) {
3216
3336
  const shape = {};
3217
3337
  for (const plan of plans) {
3218
- shape[plan.fieldId] = fieldPlanToZod(plan, options);
3338
+ shape[plan.fieldId] = fieldPlanToObjectPropertyZod(plan, options);
3219
3339
  }
3220
3340
  return z5.object(shape).catchall(z5.unknown()).passthrough();
3221
3341
  }
@@ -26324,9 +26444,12 @@ var coursePricingOptionSchema = z43.object({
26324
26444
  });
26325
26445
  var coursePricingSchema = z43.object({
26326
26446
  bookingRequirement: z43.enum(["none", "required"]),
26327
- pricingStrategy: z43.enum(["free", "single", "tiered"]),
26447
+ pricingStrategy: z43.enum(["free", "single", "tiered", "sliding_scale"]),
26328
26448
  currency: z43.string(),
26329
26449
  singlePriceAmount: z43.number().nullable(),
26450
+ slidingMinAmount: z43.number().nullable().optional(),
26451
+ slidingMaxAmount: z43.number().nullable().optional(),
26452
+ slidingSuggestedAmount: z43.number().nullable().optional(),
26330
26453
  paymentTerms: blockBookingPaymentTermsSchema,
26331
26454
  options: z43.array(coursePricingOptionSchema)
26332
26455
  });
@@ -26480,6 +26603,19 @@ var publicEventPricingSchema = z44.discriminatedUnion("kind", [
26480
26603
  ticketTypes: z44.array(publicEventTicketTypeSchema),
26481
26604
  display: publicEventTicketTypePriceDisplaySchema
26482
26605
  }),
26606
+ z44.object({
26607
+ kind: z44.literal("sliding_scale"),
26608
+ minAmount: z44.number(),
26609
+ maxAmount: z44.number(),
26610
+ suggestedAmount: z44.number().nullable(),
26611
+ currency: z44.string(),
26612
+ display: z44.object({
26613
+ kind: z44.literal("range"),
26614
+ minAmount: z44.number(),
26615
+ maxAmount: z44.number(),
26616
+ currency: z44.string()
26617
+ })
26618
+ }),
26483
26619
  z44.object({
26484
26620
  kind: z44.literal("course"),
26485
26621
  display: z44.object({ kind: z44.literal("course"), display: publicCoursePriceDisplaySchema })
@@ -26896,7 +27032,7 @@ function isRecord6(value) {
26896
27032
  }
26897
27033
  function isPublicEventPricing(value) {
26898
27034
  if (!isRecord6(value) || typeof value.kind !== "string") return false;
26899
- return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course" || value.kind === "external";
27035
+ return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "sliding_scale" || value.kind === "ticket_types" || value.kind === "course" || value.kind === "external";
26900
27036
  }
26901
27037
  function isPublicEventTicketType(value) {
26902
27038
  return isRecord6(value) && typeof value.id === "string";
@@ -27513,7 +27649,9 @@ function getSelectableCoursePricingOptionsForNow(course, now) {
27513
27649
  return left.name.localeCompare(right.name);
27514
27650
  });
27515
27651
  }
27516
- function resolveCoursePricingState(course, selectedPricingOptionId, nowInput = {}) {
27652
+ function resolveCoursePricingState(course, selectedPricingOptionId, selectedSlidingAmountOrNowInput, nowInput = {}) {
27653
+ const selectedSlidingAmount = typeof selectedSlidingAmountOrNowInput === "number" || selectedSlidingAmountOrNowInput === null ? selectedSlidingAmountOrNowInput : null;
27654
+ const effectiveNowInput = typeof selectedSlidingAmountOrNowInput === "object" && selectedSlidingAmountOrNowInput !== null ? selectedSlidingAmountOrNowInput : nowInput;
27517
27655
  const currency = course.pricing?.currency ?? course.currency;
27518
27656
  if (!course.pricing) {
27519
27657
  const legacyAmount = course.priceCents ?? 0;
@@ -27523,6 +27661,8 @@ function resolveCoursePricingState(course, selectedPricingOptionId, nowInput = {
27523
27661
  selectableOptions: [],
27524
27662
  requiresSelection: false,
27525
27663
  selectedOption: null,
27664
+ slidingScale: null,
27665
+ selectedSlidingAmount: null,
27526
27666
  selectedPriceAmount: legacyAmount,
27527
27667
  selectedRequiresPayment: legacyAmount > 0,
27528
27668
  hasPaidSelection: legacyAmount > 0,
@@ -27537,6 +27677,8 @@ function resolveCoursePricingState(course, selectedPricingOptionId, nowInput = {
27537
27677
  selectableOptions: [],
27538
27678
  requiresSelection: false,
27539
27679
  selectedOption: null,
27680
+ slidingScale: null,
27681
+ selectedSlidingAmount: null,
27540
27682
  selectedPriceAmount: 0,
27541
27683
  selectedRequiresPayment: false,
27542
27684
  hasPaidSelection: false,
@@ -27550,6 +27692,8 @@ function resolveCoursePricingState(course, selectedPricingOptionId, nowInput = {
27550
27692
  selectableOptions: [],
27551
27693
  requiresSelection: false,
27552
27694
  selectedOption: null,
27695
+ slidingScale: null,
27696
+ selectedSlidingAmount: null,
27553
27697
  selectedPriceAmount: amount,
27554
27698
  selectedRequiresPayment: amount > 0,
27555
27699
  hasPaidSelection: amount > 0,
@@ -27559,7 +27703,7 @@ function resolveCoursePricingState(course, selectedPricingOptionId, nowInput = {
27559
27703
  case "tiered": {
27560
27704
  const selectableOptions = getSelectableCoursePricingOptionsForNow(
27561
27705
  course,
27562
- resolvePlanningDateInput(nowInput)
27706
+ resolvePlanningDateInput(effectiveNowInput)
27563
27707
  );
27564
27708
  const selectedOption = (selectedPricingOptionId ? selectableOptions.find((option) => option.id === selectedPricingOptionId) : null) ?? (selectableOptions.length === 1 ? selectableOptions[0] ?? null : null);
27565
27709
  const lowestAmount = selectableOptions.reduce((lowest, option) => {
@@ -27575,12 +27719,51 @@ function resolveCoursePricingState(course, selectedPricingOptionId, nowInput = {
27575
27719
  selectableOptions,
27576
27720
  requiresSelection: selectableOptions.length > 1,
27577
27721
  selectedOption,
27722
+ slidingScale: null,
27723
+ selectedSlidingAmount: null,
27578
27724
  selectedPriceAmount: selectedOption?.priceAmount ?? null,
27579
27725
  selectedRequiresPayment: (selectedOption?.priceAmount ?? 0) > 0,
27580
27726
  hasPaidSelection: selectableOptions.some((option) => option.priceAmount > 0),
27581
27727
  hasFreeSelection: selectableOptions.some((option) => option.priceAmount === 0)
27582
27728
  };
27583
27729
  }
27730
+ case "sliding_scale": {
27731
+ const minAmount = course.pricing.slidingMinAmount ?? null;
27732
+ const maxAmount = course.pricing.slidingMaxAmount ?? null;
27733
+ if (minAmount === null || maxAmount === null || minAmount < 0 || maxAmount < minAmount) {
27734
+ return {
27735
+ currency,
27736
+ display: { kind: "unavailable", currency },
27737
+ selectableOptions: [],
27738
+ requiresSelection: true,
27739
+ selectedOption: null,
27740
+ slidingScale: null,
27741
+ selectedSlidingAmount: null,
27742
+ selectedPriceAmount: null,
27743
+ selectedRequiresPayment: false,
27744
+ hasPaidSelection: false,
27745
+ hasFreeSelection: false
27746
+ };
27747
+ }
27748
+ const normalizedSelectedAmount = typeof selectedSlidingAmount === "number" && Number.isFinite(selectedSlidingAmount) ? selectedSlidingAmount : null;
27749
+ return {
27750
+ currency,
27751
+ display: { kind: "range", minAmount, maxAmount, currency },
27752
+ selectableOptions: [],
27753
+ requiresSelection: normalizedSelectedAmount === null,
27754
+ selectedOption: null,
27755
+ slidingScale: {
27756
+ minAmount,
27757
+ maxAmount,
27758
+ suggestedAmount: course.pricing.slidingSuggestedAmount ?? null
27759
+ },
27760
+ selectedSlidingAmount: normalizedSelectedAmount,
27761
+ selectedPriceAmount: normalizedSelectedAmount,
27762
+ selectedRequiresPayment: (normalizedSelectedAmount ?? 0) > 0,
27763
+ hasPaidSelection: maxAmount > 0,
27764
+ hasFreeSelection: minAmount === 0
27765
+ };
27766
+ }
27584
27767
  }
27585
27768
  }
27586
27769
  function formatCoursePriceDisplay(display, locale) {
@@ -40035,6 +40218,7 @@ var bookingServiceSchema = z64.object({
40035
40218
  title: z64.string(),
40036
40219
  description: z64.string().nullable().optional().transform((value) => value ?? void 0),
40037
40220
  durationMinutes: z64.number().optional(),
40221
+ pricing: z64.custom().optional(),
40038
40222
  priceAmount: z64.number().nullable().optional(),
40039
40223
  priceCurrency: z64.string().nullable().optional(),
40040
40224
  paymentTerms: blockBookingPaymentTermsSchema.optional(),
@@ -68165,6 +68349,38 @@ var NAMED_SURFACE_IDS = SURFACE_IDS.filter(
68165
68349
  (surfaceId) => surfaceId !== DEFAULT_SURFACE_ID
68166
68350
  );
68167
68351
 
68352
+ // ../api/src/common/envelope.ts
68353
+ var API_ERROR_CODES = [
68354
+ "auth:unauthenticated",
68355
+ "auth:token_expired",
68356
+ "auth:token_invalid",
68357
+ "auth:forbidden",
68358
+ "auth:mfa_required",
68359
+ "auth:sudo_required",
68360
+ "auth:insufficient_permissions",
68361
+ "auth:impersonation_restricted",
68362
+ "validation:invalid_input",
68363
+ "validation:missing_field",
68364
+ "validation:invalid_format",
68365
+ "validation:payload_too_large",
68366
+ "resource:not_found",
68367
+ "resource:already_exists",
68368
+ "resource:conflict",
68369
+ "resource:gone",
68370
+ "rate_limit:exceeded",
68371
+ "billing:payment_required",
68372
+ "billing:plan_limit_exceeded",
68373
+ "billing:pass_redemption_failed",
68374
+ "server:internal_error",
68375
+ "server:unavailable",
68376
+ "external:service_error",
68377
+ "external:registrar_orphaned_contact_profile",
68378
+ "network:connection_error",
68379
+ "network:timeout",
68380
+ "network:dns_error"
68381
+ ];
68382
+ var API_ERROR_CODE_SET = new Set(API_ERROR_CODES);
68383
+
68168
68384
  // ../api/src/customerMembershipOutcomes.ts
68169
68385
  var CANONICAL_REFUND_CONFLICT_CODES = [
68170
68386
  "already_refunded",
@@ -68174,6 +68390,7 @@ var CANONICAL_REFUND_CONFLICT_CODES = [
68174
68390
  ];
68175
68391
  var CANONICAL_REFUND_PLANNER_ERROR_CODES = [
68176
68392
  ...CANONICAL_REFUND_CONFLICT_CODES,
68393
+ "invalid_amount",
68177
68394
  "amount_exceeds_remaining",
68178
68395
  "pass_revoke_requires_full_refund",
68179
68396
  "refund_failed"
@@ -68200,6 +68417,7 @@ var CUSTOMER_MEMBERSHIP_PAYMENT_REFUND_FAILED_CODES = [
68200
68417
  // ../api/src/bookingRefundOutcomes.ts
68201
68418
  var STANDARD_LINE_ITEM_REFUND_INVALID_CODES = [
68202
68419
  "missing_amount",
68420
+ "invalid_amount",
68203
68421
  "amount_exceeds_remaining",
68204
68422
  "credit_refunds_disabled",
68205
68423
  "missing_credit_customer",
@@ -68214,6 +68432,7 @@ var EVENT_ATTENDEE_REFUND_INVALID_CODES = [
68214
68432
  var MANAGED_PRODUCT_REFUND_INVALID_CODES = [
68215
68433
  "credit_refunds_disabled",
68216
68434
  "not_refundable",
68435
+ "invalid_amount",
68217
68436
  "amount_exceeds_remaining"
68218
68437
  ];
68219
68438
  var CUSTOMER_PASS_REFUND_INVALID_CODES = [