@riverbankcms/sdk 0.78.2 → 0.79.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 (159) hide show
  1. package/README.md +80 -0
  2. package/dist/{PreviewEditorSidebar-4DXLYX2V.mjs → PreviewEditorSidebar-56NMJMIK.mjs} +724 -47
  3. package/dist/{PreviewEditorUI-CS5P4N3P.mjs → PreviewEditorUI-27KJVEET.mjs} +3 -3
  4. package/dist/SdkPreviewModeRuntime-H4BSP6E7.mjs +8 -0
  5. package/dist/_dts/ai/src/contracts/proposals.d.ts +36 -0
  6. package/dist/_dts/api/src/endpoints.d.ts +55 -0
  7. package/dist/_dts/api/src/index.d.ts +5 -3
  8. package/dist/_dts/api/src/media.d.ts +8 -1
  9. package/dist/_dts/api/src/navigation/dashboardSettingsNav.d.ts +1 -1
  10. package/dist/_dts/api/src/navigation/dashboardSiteNav.d.ts +8 -8
  11. package/dist/_dts/api/src/navigation/identity.d.ts +59 -0
  12. package/dist/_dts/api/src/navigation.d.ts +2 -0
  13. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +4 -0
  14. package/dist/_dts/api/src/sdkContracts.d.ts +1 -0
  15. package/dist/_dts/api/src/siteIcons.d.ts +128 -0
  16. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +16 -0
  17. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +7 -0
  18. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +6 -1
  19. package/dist/_dts/api/src/types.d.ts +1 -1
  20. package/dist/_dts/api/src/webhooks.d.ts +239 -0
  21. package/dist/_dts/blocks/src/index.d.ts +4 -0
  22. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +288 -288
  23. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +288 -288
  24. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +288 -288
  25. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +288 -288
  26. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +288 -288
  27. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +294 -289
  28. package/dist/_dts/blocks/src/system/blocks/feature-card-icons.d.ts +57 -0
  29. package/dist/_dts/blocks/src/system/blocks/feature-cards.d.ts +4 -0
  30. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +288 -288
  31. package/dist/_dts/blocks/src/system/blocks/index.d.ts +1 -0
  32. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -1
  33. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +22 -22
  34. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +288 -288
  35. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +288 -288
  36. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +288 -288
  37. package/dist/_dts/blocks/src/system/blocks/testimonials.d.ts +7 -1
  38. package/dist/_dts/blocks/src/system/customize/backgrounds.d.ts +170 -0
  39. package/dist/_dts/blocks/src/system/fragments/library/testimonialsCarousel.d.ts +5 -0
  40. package/dist/_dts/blocks/src/system/helpers/resolveBackground.d.ts +3 -1
  41. package/dist/_dts/blocks/src/system/icons/ids.d.ts +13 -0
  42. package/dist/_dts/blocks/src/system/icons/index.d.ts +6 -0
  43. package/dist/_dts/blocks/src/system/icons/presets.d.ts +4 -0
  44. package/dist/_dts/blocks/src/system/icons/registry.d.ts +18 -0
  45. package/dist/_dts/blocks/src/system/icons/semantic.d.ts +239 -0
  46. package/dist/_dts/blocks/src/system/icons/value.d.ts +94 -0
  47. package/dist/_dts/blocks/src/system/index.d.ts +1 -0
  48. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +4 -1
  49. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +23 -0
  50. package/dist/_dts/blocks/src/system/runtime/nodes/feature-card-icon.d.ts +13 -0
  51. package/dist/_dts/content-model/src/contentManifest.d.ts +3 -1
  52. package/dist/_dts/core/src/branded.d.ts +6 -0
  53. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +191 -0
  54. package/dist/_dts/editor-blocks/src/block-editor/BlockCard.d.ts +12 -1
  55. package/dist/_dts/editor-blocks/src/block-editor/BlockCardBody.d.ts +12 -1
  56. package/dist/_dts/editor-blocks/src/block-editor/BlockCardHeader.d.ts +12 -2
  57. package/dist/_dts/editor-blocks/src/block-editor/FeatureCardIconsPanel.d.ts +21 -0
  58. package/dist/_dts/editor-blocks/src/block-editor/GeneratedIconSetDialog.d.ts +40 -0
  59. package/dist/_dts/editor-blocks/src/block-editor/SortableBlockItem.d.ts +11 -1
  60. package/dist/_dts/editor-blocks/src/block-editor/featureCardIconActions.d.ts +82 -0
  61. package/dist/_dts/editor-blocks/src/widgets/icon-picker/IconPickerField.d.ts +1 -1
  62. package/dist/_dts/media-core/src/fileDomain.d.ts +8 -1
  63. package/dist/_dts/media-editor/src/MediaEditor.d.ts +3 -2
  64. package/dist/_dts/media-react/src/components/MediaLibrary.d.ts +2 -1
  65. package/dist/_dts/media-react/src/components/MediaPickerMini.d.ts +2 -1
  66. package/dist/_dts/preview-next/src/client/blocks/previewCustomizeActions.d.ts +17 -0
  67. package/dist/_dts/preview-next/src/client/preview/PageDesignEditorStateContext.d.ts +4 -0
  68. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +3 -2
  69. package/dist/_dts/preview-next/src/client/preview/previewCustomizeHistory.d.ts +6 -0
  70. package/dist/_dts/sdk/src/cli/navigationIdentity.d.ts +11 -0
  71. package/dist/_dts/sdk/src/cli/site-commands/navigationCommands.d.ts +4 -0
  72. package/dist/_dts/sdk/src/cli/site-commands/oneOffCommands.d.ts +1 -0
  73. package/dist/_dts/sdk/src/cli/sync/diff.d.ts +9 -0
  74. package/dist/_dts/sdk/src/client/management/types.d.ts +2 -0
  75. package/dist/_dts/sdk/src/config/field-definitions.d.ts +3 -1
  76. package/dist/_dts/sdk/src/contracts/index.d.ts +1 -1
  77. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +19 -2
  78. package/dist/_dts/sdk/src/next/index.d.ts +1 -1
  79. package/dist/_dts/sdk/src/next/revalidate.d.ts +26 -5
  80. package/dist/_dts/sdk/src/next/static-params.d.ts +28 -3
  81. package/dist/_dts/sdk/src/public-api/contracts.d.ts +5 -1
  82. package/dist/_dts/sdk/src/public-api/runtime.d.ts +1 -1
  83. package/dist/_dts/sdk/src/version.d.ts +1 -1
  84. package/dist/_dts/sdk/src/webhooks/index.d.ts +1 -1
  85. package/dist/_dts/sdk/src/webhooks/verify.d.ts +6 -102
  86. package/dist/_dts/site-commands/src/commands.d.ts +3 -0
  87. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  88. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +3 -3
  89. package/dist/_dts/theme-core/src/schema.d.ts +5 -5
  90. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +25 -2
  91. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +5 -5
  92. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
  93. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +4 -4
  94. package/dist/_dts/theme-core/src/tokens/themeColorTokens.d.ts +2 -0
  95. package/dist/_dts/ui/src/combobox.d.ts +1 -0
  96. package/dist/{chunk-RGTOD4AJ.mjs → chunk-4HCW7FHJ.mjs} +491 -56
  97. package/dist/{chunk-OKMBEAXY.mjs → chunk-A3HHFKVT.mjs} +1 -1
  98. package/dist/{chunk-6HYXHRAI.mjs → chunk-GP555I66.mjs} +177 -7
  99. package/dist/{chunk-CR5HKAGU.mjs → chunk-K2IIF34C.mjs} +55 -0
  100. package/dist/{chunk-4QEGTLK6.mjs → chunk-LCY32PXF.mjs} +1 -1
  101. package/dist/{chunk-MCRQMPET.mjs → chunk-V47ZU33I.mjs} +1745 -157
  102. package/dist/cli/index.mjs +1169 -171
  103. package/dist/cli/init-docs/content/workflow-editor-workflows.md +2 -0
  104. package/dist/cli/init-docs/content/workflow-isr-revalidation.md +138 -0
  105. package/dist/client/{accordion-PLYNJIIM.mjs → accordion-QLA7KBYO.mjs} +1 -1
  106. package/dist/client/{bookingForm-BXAP6AO7.mjs → bookingForm-PYZIPA5G.mjs} +3 -3
  107. package/dist/client/bookings.mjs +110 -2
  108. package/dist/client/{carousel-TRBXDHGF.mjs → carousel-5EIULWBI.mjs} +2 -2
  109. package/dist/client/{cart-Z7H3HJRS.mjs → cart-DOP3FNI4.mjs} +5 -5
  110. package/dist/client/{checkout-WAFCUBIX.mjs → checkout-BVMF6FBV.mjs} +5 -5
  111. package/dist/client/{chunk-JRDUHZCT.mjs → chunk-44K2U3QI.mjs} +4 -4
  112. package/dist/client/{chunk-UVQEJJTN.mjs → chunk-CCNTDRCF.mjs} +1 -1
  113. package/dist/client/{chunk-ZI3LLBPZ.mjs → chunk-GG4M2NP6.mjs} +1 -1
  114. package/dist/client/{chunk-JGXPTEI2.mjs → chunk-R5ESWNKX.mjs} +6 -3
  115. package/dist/client/{chunk-CWGTG37I.mjs → chunk-TYONZMST.mjs} +1 -1
  116. package/dist/client/{chunk-75OUS5MT.mjs → chunk-UDS3NTWA.mjs} +1 -1
  117. package/dist/client/{chunk-DNRGY432.mjs → chunk-V6M5FCR5.mjs} +1 -1
  118. package/dist/client/{chunk-FUXW6VW2.mjs → chunk-YLDYVRZL.mjs} +4 -4
  119. package/dist/client/client.mjs +21329 -19729
  120. package/dist/client/{courseRegistration-AHFQHWIJ.mjs → courseRegistration-E6EAA6NL.mjs} +3 -3
  121. package/dist/client/{eventCalendar-LDXTV5R7.mjs → eventCalendar-HBG3HAK6.mjs} +5 -5
  122. package/dist/client/{eventCombined-A4JGTNJO.mjs → eventCombined-6K5ZZWAK.mjs} +5 -5
  123. package/dist/client/{eventDetails-4YXTZ7EG.mjs → eventDetails-Q75ICXLT.mjs} +5 -5
  124. package/dist/client/{eventListing-P72TPFFM.mjs → eventListing-27P5F7DZ.mjs} +5 -5
  125. package/dist/client/{eventRegistration-LSYJHGMT.mjs → eventRegistration-IQ7AMASR.mjs} +5 -5
  126. package/dist/client/{form-AOPYOKOW.mjs → form-JRTD65FN.mjs} +1 -1
  127. package/dist/client/{headerSection-5TFYDFVQ.mjs → headerSection-7FPSSZHS.mjs} +2 -2
  128. package/dist/client/hooks.mjs +350 -35
  129. package/dist/client/{locationMap-QSZ3ZVAZ.mjs → locationMap-7NGFNYBH.mjs} +1 -1
  130. package/dist/client/{newsletterForm-KTRHZY52.mjs → newsletterForm-F3BADCI2.mjs} +1 -1
  131. package/dist/client/{productDetail-N4E775RG.mjs → productDetail-V3HP7ITJ.mjs} +5 -5
  132. package/dist/client/{productList-UGUQ2S45.mjs → productList-L3EGJUF2.mjs} +5 -5
  133. package/dist/client/rendering/client.mjs +2713 -1382
  134. package/dist/client/rendering/islands.mjs +18 -18
  135. package/dist/client/rendering.mjs +2014 -414
  136. package/dist/client/{shop-VHSZEEQ2.mjs → shop-DQUB5E2C.mjs} +5 -5
  137. package/dist/preview-next/before-render.mjs +55 -0
  138. package/dist/preview-next/client/runtime.mjs +5 -5
  139. package/dist/preview-next/middleware.mjs +55 -0
  140. package/dist/{sdk-runtime-WHPJEF5G.mjs → sdk-runtime-AF6KXJU4.mjs} +6 -6
  141. package/dist/server/components.mjs +2169 -781
  142. package/dist/server/config-validation.mjs +350 -35
  143. package/dist/server/config.mjs +350 -35
  144. package/dist/server/data.mjs +350 -35
  145. package/dist/server/index.mjs +64 -1
  146. package/dist/server/next/revalidate.mjs +229 -34
  147. package/dist/server/next.mjs +2307 -818
  148. package/dist/server/page-converter.mjs +275 -34
  149. package/dist/server/prebuild.mjs +1 -1
  150. package/dist/server/rendering/server.mjs +2174 -786
  151. package/dist/server/rendering.mjs +2187 -799
  152. package/dist/server/routing.mjs +767 -50
  153. package/dist/server/server.mjs +351 -36
  154. package/dist/server/theme-bridge.mjs +164 -2
  155. package/dist/server/theme.mjs +2 -2
  156. package/dist/server/webhooks.mjs +129 -25
  157. package/dist/styles/index.css +55 -0
  158. package/package.json +2 -1
  159. package/dist/SdkPreviewModeRuntime-IJDHTW4W.mjs +0 -8
@@ -1,56 +1,156 @@
1
1
  // src/next/revalidate.ts
2
2
  import { revalidateTag, revalidatePath } from "next/cache";
3
3
 
4
- // src/webhooks/verify.ts
5
- import crypto from "crypto";
4
+ // ../api/src/webhooks.ts
6
5
  import { z } from "zod";
7
- var WebhookEventSchema = z.enum([
6
+ var RIVERBANK_SIGNATURE_PREFIX = "sha256=";
7
+ var SUPPORTED_WEBHOOK_EVENTS = [
8
8
  "page.published",
9
+ "page.unpublished",
10
+ "page.deleted",
11
+ "page.path_changed",
9
12
  "entry.published",
13
+ "entry.unpublished",
14
+ "entry.deleted",
15
+ "entry.path_changed",
10
16
  "navigation.updated",
11
17
  "theme.updated",
12
18
  "site.settings_updated"
13
- ]);
19
+ ];
20
+ var WebhookEventSchema = z.enum(SUPPORTED_WEBHOOK_EVENTS);
21
+ function asRevalidationPath(path) {
22
+ return path;
23
+ }
24
+ function parseRevalidationPath(input) {
25
+ const trimmed = input.trim();
26
+ if (!trimmed) {
27
+ return { success: false, error: { tag: "EMPTY_PATH", input } };
28
+ }
29
+ if (/^[a-z][a-z\d+.-]*:/i.test(trimmed) || trimmed.startsWith("//") || !trimmed.startsWith("/")) {
30
+ return { success: false, error: { tag: "ABSOLUTE_OR_PROTOCOL_PATH", input } };
31
+ }
32
+ if (/[\u0000-\u001F\u007F]/.test(trimmed) || trimmed.includes("\\") || trimmed.includes("?") || trimmed.includes("#")) {
33
+ return { success: false, error: { tag: "MALFORMED_PATH", input } };
34
+ }
35
+ const collapsed = trimmed.replace(/\/{2,}/g, "/");
36
+ const normalized = collapsed === "/" ? "/" : collapsed.replace(/\/+$/g, "");
37
+ return { success: true, path: asRevalidationPath(normalized) };
38
+ }
39
+ function normalizeRevalidationPath(input) {
40
+ const result = parseRevalidationPath(input);
41
+ return result.success ? result.path : null;
42
+ }
14
43
  var PagePublishedDataSchema = z.object({
15
44
  pageId: z.string(),
16
45
  path: z.string(),
17
46
  slug: z.string().optional()
18
- });
47
+ }).strict();
48
+ var PageRemovedDataSchema = z.object({
49
+ pageId: z.string(),
50
+ path: z.string(),
51
+ slug: z.string().optional()
52
+ }).strict();
53
+ var PagePathChangedDataSchema = z.object({
54
+ pageId: z.string(),
55
+ previousPath: z.string(),
56
+ path: z.string(),
57
+ slug: z.string().optional()
58
+ }).strict();
19
59
  var EntryPublishedDataSchema = z.object({
20
60
  entryId: z.string(),
21
61
  path: z.string(),
22
62
  contentType: z.string()
23
- });
63
+ }).strict();
64
+ var EntryRemovedDataSchema = z.object({
65
+ entryId: z.string(),
66
+ path: z.string(),
67
+ contentType: z.string()
68
+ }).strict();
69
+ var EntryPathChangedDataSchema = z.object({
70
+ entryId: z.string(),
71
+ previousPath: z.string(),
72
+ path: z.string(),
73
+ contentType: z.string()
74
+ }).strict();
24
75
  var NavigationUpdatedDataSchema = z.object({
25
76
  menuId: z.string().optional()
26
- });
27
- var EmptyDataSchema = z.object({});
28
- var WebhookDataSchema = z.union([
29
- PagePublishedDataSchema,
30
- EntryPublishedDataSchema,
31
- NavigationUpdatedDataSchema,
32
- EmptyDataSchema
33
- ]);
34
- var WebhookPayloadSchema = z.object({
35
- /** Event type */
36
- event: WebhookEventSchema,
37
- /** ISO timestamp of when the event occurred */
77
+ }).strict();
78
+ var EmptyWebhookDataSchema = z.object({}).strict();
79
+ var WebhookPayloadBaseSchema = z.object({
38
80
  timestamp: z.string(),
39
- /** Site ID that triggered the event */
81
+ dispatchId: z.string().optional(),
40
82
  siteId: z.string(),
41
- /** Event-specific data (shape depends on event type) */
42
- data: z.record(z.string(), z.unknown()),
43
- /** Cache invalidation tags (for tag-based revalidation) */
44
- tags: z.array(z.string()).optional()
83
+ tags: z.array(z.string()).optional(),
84
+ paths: z.array(z.string()).optional()
45
85
  });
86
+ var WebhookPayloadSchema = z.discriminatedUnion("event", [
87
+ WebhookPayloadBaseSchema.extend({
88
+ event: z.literal("page.published"),
89
+ data: PagePublishedDataSchema
90
+ }),
91
+ WebhookPayloadBaseSchema.extend({
92
+ event: z.literal("page.unpublished"),
93
+ data: PageRemovedDataSchema
94
+ }),
95
+ WebhookPayloadBaseSchema.extend({
96
+ event: z.literal("page.deleted"),
97
+ data: PageRemovedDataSchema
98
+ }),
99
+ WebhookPayloadBaseSchema.extend({
100
+ event: z.literal("page.path_changed"),
101
+ data: PagePathChangedDataSchema
102
+ }),
103
+ WebhookPayloadBaseSchema.extend({
104
+ event: z.literal("entry.published"),
105
+ data: EntryPublishedDataSchema
106
+ }),
107
+ WebhookPayloadBaseSchema.extend({
108
+ event: z.literal("entry.unpublished"),
109
+ data: EntryRemovedDataSchema
110
+ }),
111
+ WebhookPayloadBaseSchema.extend({
112
+ event: z.literal("entry.deleted"),
113
+ data: EntryRemovedDataSchema
114
+ }),
115
+ WebhookPayloadBaseSchema.extend({
116
+ event: z.literal("entry.path_changed"),
117
+ data: EntryPathChangedDataSchema
118
+ }),
119
+ WebhookPayloadBaseSchema.extend({
120
+ event: z.literal("navigation.updated"),
121
+ data: NavigationUpdatedDataSchema
122
+ }),
123
+ WebhookPayloadBaseSchema.extend({
124
+ event: z.literal("theme.updated"),
125
+ data: EmptyWebhookDataSchema
126
+ }),
127
+ WebhookPayloadBaseSchema.extend({
128
+ event: z.literal("site.settings_updated"),
129
+ data: EmptyWebhookDataSchema
130
+ })
131
+ ]);
132
+
133
+ // src/client/types.ts
134
+ var SDK_CORRELATION_HEADER_NAMES = [
135
+ "x-request-id",
136
+ "x-correlation-id",
137
+ "x-riverbank-monitor-run-id"
138
+ ];
139
+
140
+ // src/webhooks/verify.ts
141
+ import crypto from "crypto";
46
142
  function verifyWebhookSignature(payload, signature, secret) {
47
- const expectedSignature = crypto.createHmac("sha256", secret).update(payload).digest("hex");
48
- if (signature.length !== expectedSignature.length) {
143
+ if (!signature.startsWith(RIVERBANK_SIGNATURE_PREFIX)) {
144
+ return false;
145
+ }
146
+ const signatureDigest = signature.slice(RIVERBANK_SIGNATURE_PREFIX.length);
147
+ if (!/^[a-f0-9]{64}$/.test(signatureDigest)) {
49
148
  return false;
50
149
  }
150
+ const expectedSignature = crypto.createHmac("sha256", secret).update(payload).digest("hex");
51
151
  return crypto.timingSafeEqual(
52
- Buffer.from(signature),
53
- Buffer.from(expectedSignature)
152
+ Buffer.from(signatureDigest, "hex"),
153
+ Buffer.from(expectedSignature, "hex")
54
154
  );
55
155
  }
56
156
  function parseWebhookPayload(body) {
@@ -68,6 +168,65 @@ function parseWebhookPayload(body) {
68
168
  }
69
169
 
70
170
  // src/next/revalidate.ts
171
+ var [
172
+ SDK_REQUEST_ID_HEADER,
173
+ SDK_CORRELATION_ID_HEADER,
174
+ SDK_MONITOR_RUN_ID_HEADER
175
+ ] = SDK_CORRELATION_HEADER_NAMES;
176
+ var RIVERBANK_DISPATCH_ID_HEADER = "x-riverbank-dispatch-id";
177
+ var RIVERBANK_CORRELATION_ID_HEADER = "x-riverbank-correlation-id";
178
+ function normalizeRevalidationPath2(path) {
179
+ return normalizeRevalidationPath(path);
180
+ }
181
+ function normalizeRevalidationPaths(paths = []) {
182
+ const normalized = [];
183
+ const invalidPaths = [];
184
+ const seen = /* @__PURE__ */ new Set();
185
+ for (const path of paths) {
186
+ const normalizedPath = normalizeRevalidationPath2(path);
187
+ if (!normalizedPath) {
188
+ invalidPaths.push(path);
189
+ continue;
190
+ }
191
+ if (!seen.has(normalizedPath)) {
192
+ seen.add(normalizedPath);
193
+ normalized.push(normalizedPath);
194
+ }
195
+ }
196
+ return { paths: normalized, invalidPaths };
197
+ }
198
+ function normalizeRevalidationTags(tags = []) {
199
+ const normalized = [];
200
+ const seen = /* @__PURE__ */ new Set();
201
+ for (const tag of tags) {
202
+ const trimmed = tag.trim();
203
+ if (!trimmed || seen.has(trimmed)) continue;
204
+ seen.add(trimmed);
205
+ normalized.push(trimmed);
206
+ }
207
+ return normalized;
208
+ }
209
+ function getOptionalHeader(headers, name) {
210
+ const value = headers.get(name)?.trim();
211
+ return value ? value : void 0;
212
+ }
213
+ function getRevalidationRequestMetadata(request, payload, counts) {
214
+ const dispatchId = payload.dispatchId ?? getOptionalHeader(request.headers, RIVERBANK_DISPATCH_ID_HEADER);
215
+ const requestId = getOptionalHeader(request.headers, "x-vercel-id") ?? getOptionalHeader(request.headers, SDK_REQUEST_ID_HEADER);
216
+ const correlationId = getOptionalHeader(request.headers, RIVERBANK_CORRELATION_ID_HEADER) ?? getOptionalHeader(request.headers, SDK_CORRELATION_ID_HEADER);
217
+ const monitorRunId = getOptionalHeader(request.headers, SDK_MONITOR_RUN_ID_HEADER);
218
+ return {
219
+ event: payload.event,
220
+ siteId: payload.siteId,
221
+ ...dispatchId ? { dispatchId } : {},
222
+ pathCount: counts.pathCount,
223
+ tagCount: counts.tagCount,
224
+ itemCount: counts.itemCount,
225
+ ...requestId ? { requestId } : {},
226
+ ...correlationId ? { correlationId } : {},
227
+ ...monitorRunId ? { monitorRunId } : {}
228
+ };
229
+ }
71
230
  function createRevalidateHandler(options = {}) {
72
231
  return async function handleRevalidateRequest(request) {
73
232
  const secret = options.secret ?? process.env.RIVERBANK_WEBHOOK_SECRET;
@@ -81,41 +240,77 @@ function createRevalidateHandler(options = {}) {
81
240
  const body = await request.text();
82
241
  const signature = request.headers.get("x-riverbank-signature");
83
242
  if (!signature || !verifyWebhookSignature(body, signature, secret)) {
243
+ console.warn("[Riverbank] Rejected webhook with invalid signature");
84
244
  return Response.json({ error: "Invalid signature" }, { status: 401 });
85
245
  }
86
246
  const parseResult = parseWebhookPayload(body);
87
247
  if (!parseResult.success) {
248
+ console.warn("[Riverbank] Rejected webhook with invalid payload", {
249
+ reason: parseResult.error
250
+ });
88
251
  return Response.json({ error: parseResult.error }, { status: 400 });
89
252
  }
90
253
  const payload = parseResult.payload;
91
254
  const revalidated = [];
92
- if (payload.tags?.length) {
93
- for (const tag of payload.tags) {
255
+ const normalizedPaths = normalizeRevalidationPaths(payload.paths);
256
+ if (normalizedPaths.invalidPaths.length > 0) {
257
+ console.warn(
258
+ "[Riverbank] Ignored invalid revalidation paths",
259
+ {
260
+ event: payload.event,
261
+ siteId: payload.siteId,
262
+ invalidPathCount: normalizedPaths.invalidPaths.length
263
+ }
264
+ );
265
+ }
266
+ const normalizedTags = normalizeRevalidationTags(payload.tags);
267
+ if (normalizedTags.length) {
268
+ for (const tag of normalizedTags) {
94
269
  revalidateTag(tag, "max");
95
270
  revalidated.push(`tag:${tag}`);
96
271
  }
97
272
  }
98
- const path = typeof payload.data?.path === "string" ? payload.data.path : void 0;
99
- if (path) {
273
+ for (const path of normalizedPaths.paths) {
100
274
  revalidatePath(path);
101
275
  revalidated.push(`path:${path}`);
102
276
  }
277
+ const metadata = getRevalidationRequestMetadata(
278
+ request,
279
+ payload,
280
+ {
281
+ pathCount: normalizedPaths.paths.length,
282
+ tagCount: normalizedTags.length,
283
+ itemCount: revalidated.length
284
+ }
285
+ );
103
286
  if (revalidated.length > 0) {
104
287
  console.log(
105
- `[Riverbank] Revalidated: ${revalidated.join(", ")} (event: ${payload.event})`
288
+ [
289
+ `[Riverbank] Revalidated ${normalizedPaths.paths.length} path(s)`,
290
+ `and ${normalizedTags.length} tag(s)`,
291
+ `(event: ${payload.event}, site: ${payload.siteId})`
292
+ ].join(" "),
293
+ metadata
106
294
  );
107
295
  }
108
296
  if (options.onRevalidate) {
109
- options.onRevalidate(payload, revalidated);
297
+ options.onRevalidate(payload, revalidated, metadata);
110
298
  }
111
299
  return Response.json({
112
300
  revalidated: true,
113
301
  items: revalidated,
114
302
  event: payload.event,
303
+ dispatchId: metadata.dispatchId,
304
+ pathCount: normalizedPaths.paths.length,
305
+ tagCount: normalizedTags.length,
306
+ invalidPathCount: normalizedPaths.invalidPaths.length,
115
307
  timestamp: Date.now()
116
308
  });
117
309
  };
118
310
  }
119
311
  export {
120
- createRevalidateHandler
312
+ createRevalidateHandler,
313
+ normalizeRevalidationPath2 as normalizeRevalidationPath,
314
+ normalizeRevalidationPaths,
315
+ normalizeRevalidationTags
121
316
  };