@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.
- package/README.md +80 -0
- package/dist/{PreviewEditorSidebar-4DXLYX2V.mjs → PreviewEditorSidebar-56NMJMIK.mjs} +724 -47
- package/dist/{PreviewEditorUI-CS5P4N3P.mjs → PreviewEditorUI-27KJVEET.mjs} +3 -3
- package/dist/SdkPreviewModeRuntime-H4BSP6E7.mjs +8 -0
- package/dist/_dts/ai/src/contracts/proposals.d.ts +36 -0
- package/dist/_dts/api/src/endpoints.d.ts +55 -0
- package/dist/_dts/api/src/index.d.ts +5 -3
- package/dist/_dts/api/src/media.d.ts +8 -1
- package/dist/_dts/api/src/navigation/dashboardSettingsNav.d.ts +1 -1
- package/dist/_dts/api/src/navigation/dashboardSiteNav.d.ts +8 -8
- package/dist/_dts/api/src/navigation/identity.d.ts +59 -0
- package/dist/_dts/api/src/navigation.d.ts +2 -0
- package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +4 -0
- package/dist/_dts/api/src/sdkContracts.d.ts +1 -0
- package/dist/_dts/api/src/siteIcons.d.ts +128 -0
- package/dist/_dts/api/src/siteManagementEndpoints.d.ts +16 -0
- package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +7 -0
- package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +6 -1
- package/dist/_dts/api/src/types.d.ts +1 -1
- package/dist/_dts/api/src/webhooks.d.ts +239 -0
- package/dist/_dts/blocks/src/index.d.ts +4 -0
- package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +288 -288
- package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +288 -288
- package/dist/_dts/blocks/src/system/blocks/cart.d.ts +288 -288
- package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +288 -288
- package/dist/_dts/blocks/src/system/blocks/collection.d.ts +288 -288
- package/dist/_dts/blocks/src/system/blocks/faq.d.ts +294 -289
- package/dist/_dts/blocks/src/system/blocks/feature-card-icons.d.ts +57 -0
- package/dist/_dts/blocks/src/system/blocks/feature-cards.d.ts +4 -0
- package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +288 -288
- package/dist/_dts/blocks/src/system/blocks/index.d.ts +1 -0
- package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -1
- package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +22 -22
- package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +288 -288
- package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +288 -288
- package/dist/_dts/blocks/src/system/blocks/shop.d.ts +288 -288
- package/dist/_dts/blocks/src/system/blocks/testimonials.d.ts +7 -1
- package/dist/_dts/blocks/src/system/customize/backgrounds.d.ts +170 -0
- package/dist/_dts/blocks/src/system/fragments/library/testimonialsCarousel.d.ts +5 -0
- package/dist/_dts/blocks/src/system/helpers/resolveBackground.d.ts +3 -1
- package/dist/_dts/blocks/src/system/icons/ids.d.ts +13 -0
- package/dist/_dts/blocks/src/system/icons/index.d.ts +6 -0
- package/dist/_dts/blocks/src/system/icons/presets.d.ts +4 -0
- package/dist/_dts/blocks/src/system/icons/registry.d.ts +18 -0
- package/dist/_dts/blocks/src/system/icons/semantic.d.ts +239 -0
- package/dist/_dts/blocks/src/system/icons/value.d.ts +94 -0
- package/dist/_dts/blocks/src/system/index.d.ts +1 -0
- package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +4 -1
- package/dist/_dts/blocks/src/system/manifest/schema.d.ts +23 -0
- package/dist/_dts/blocks/src/system/runtime/nodes/feature-card-icon.d.ts +13 -0
- package/dist/_dts/content-model/src/contentManifest.d.ts +3 -1
- package/dist/_dts/core/src/branded.d.ts +6 -0
- package/dist/_dts/db/src/generated/supabase/database.types.d.ts +191 -0
- package/dist/_dts/editor-blocks/src/block-editor/BlockCard.d.ts +12 -1
- package/dist/_dts/editor-blocks/src/block-editor/BlockCardBody.d.ts +12 -1
- package/dist/_dts/editor-blocks/src/block-editor/BlockCardHeader.d.ts +12 -2
- package/dist/_dts/editor-blocks/src/block-editor/FeatureCardIconsPanel.d.ts +21 -0
- package/dist/_dts/editor-blocks/src/block-editor/GeneratedIconSetDialog.d.ts +40 -0
- package/dist/_dts/editor-blocks/src/block-editor/SortableBlockItem.d.ts +11 -1
- package/dist/_dts/editor-blocks/src/block-editor/featureCardIconActions.d.ts +82 -0
- package/dist/_dts/editor-blocks/src/widgets/icon-picker/IconPickerField.d.ts +1 -1
- package/dist/_dts/media-core/src/fileDomain.d.ts +8 -1
- package/dist/_dts/media-editor/src/MediaEditor.d.ts +3 -2
- package/dist/_dts/media-react/src/components/MediaLibrary.d.ts +2 -1
- package/dist/_dts/media-react/src/components/MediaPickerMini.d.ts +2 -1
- package/dist/_dts/preview-next/src/client/blocks/previewCustomizeActions.d.ts +17 -0
- package/dist/_dts/preview-next/src/client/preview/PageDesignEditorStateContext.d.ts +4 -0
- package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +3 -2
- package/dist/_dts/preview-next/src/client/preview/previewCustomizeHistory.d.ts +6 -0
- package/dist/_dts/sdk/src/cli/navigationIdentity.d.ts +11 -0
- package/dist/_dts/sdk/src/cli/site-commands/navigationCommands.d.ts +4 -0
- package/dist/_dts/sdk/src/cli/site-commands/oneOffCommands.d.ts +1 -0
- package/dist/_dts/sdk/src/cli/sync/diff.d.ts +9 -0
- package/dist/_dts/sdk/src/client/management/types.d.ts +2 -0
- package/dist/_dts/sdk/src/config/field-definitions.d.ts +3 -1
- package/dist/_dts/sdk/src/contracts/index.d.ts +1 -1
- package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +19 -2
- package/dist/_dts/sdk/src/next/index.d.ts +1 -1
- package/dist/_dts/sdk/src/next/revalidate.d.ts +26 -5
- package/dist/_dts/sdk/src/next/static-params.d.ts +28 -3
- package/dist/_dts/sdk/src/public-api/contracts.d.ts +5 -1
- package/dist/_dts/sdk/src/public-api/runtime.d.ts +1 -1
- package/dist/_dts/sdk/src/version.d.ts +1 -1
- package/dist/_dts/sdk/src/webhooks/index.d.ts +1 -1
- package/dist/_dts/sdk/src/webhooks/verify.d.ts +6 -102
- package/dist/_dts/site-commands/src/commands.d.ts +3 -0
- package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
- package/dist/_dts/theme-core/src/mock-themes/all.d.ts +3 -3
- package/dist/_dts/theme-core/src/schema.d.ts +5 -5
- package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +25 -2
- package/dist/_dts/theme-core/src/site-styles/designState.d.ts +5 -5
- package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
- package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +4 -4
- package/dist/_dts/theme-core/src/tokens/themeColorTokens.d.ts +2 -0
- package/dist/_dts/ui/src/combobox.d.ts +1 -0
- package/dist/{chunk-RGTOD4AJ.mjs → chunk-4HCW7FHJ.mjs} +491 -56
- package/dist/{chunk-OKMBEAXY.mjs → chunk-A3HHFKVT.mjs} +1 -1
- package/dist/{chunk-6HYXHRAI.mjs → chunk-GP555I66.mjs} +177 -7
- package/dist/{chunk-CR5HKAGU.mjs → chunk-K2IIF34C.mjs} +55 -0
- package/dist/{chunk-4QEGTLK6.mjs → chunk-LCY32PXF.mjs} +1 -1
- package/dist/{chunk-MCRQMPET.mjs → chunk-V47ZU33I.mjs} +1745 -157
- package/dist/cli/index.mjs +1169 -171
- package/dist/cli/init-docs/content/workflow-editor-workflows.md +2 -0
- package/dist/cli/init-docs/content/workflow-isr-revalidation.md +138 -0
- package/dist/client/{accordion-PLYNJIIM.mjs → accordion-QLA7KBYO.mjs} +1 -1
- package/dist/client/{bookingForm-BXAP6AO7.mjs → bookingForm-PYZIPA5G.mjs} +3 -3
- package/dist/client/bookings.mjs +110 -2
- package/dist/client/{carousel-TRBXDHGF.mjs → carousel-5EIULWBI.mjs} +2 -2
- package/dist/client/{cart-Z7H3HJRS.mjs → cart-DOP3FNI4.mjs} +5 -5
- package/dist/client/{checkout-WAFCUBIX.mjs → checkout-BVMF6FBV.mjs} +5 -5
- package/dist/client/{chunk-JRDUHZCT.mjs → chunk-44K2U3QI.mjs} +4 -4
- package/dist/client/{chunk-UVQEJJTN.mjs → chunk-CCNTDRCF.mjs} +1 -1
- package/dist/client/{chunk-ZI3LLBPZ.mjs → chunk-GG4M2NP6.mjs} +1 -1
- package/dist/client/{chunk-JGXPTEI2.mjs → chunk-R5ESWNKX.mjs} +6 -3
- package/dist/client/{chunk-CWGTG37I.mjs → chunk-TYONZMST.mjs} +1 -1
- package/dist/client/{chunk-75OUS5MT.mjs → chunk-UDS3NTWA.mjs} +1 -1
- package/dist/client/{chunk-DNRGY432.mjs → chunk-V6M5FCR5.mjs} +1 -1
- package/dist/client/{chunk-FUXW6VW2.mjs → chunk-YLDYVRZL.mjs} +4 -4
- package/dist/client/client.mjs +21329 -19729
- package/dist/client/{courseRegistration-AHFQHWIJ.mjs → courseRegistration-E6EAA6NL.mjs} +3 -3
- package/dist/client/{eventCalendar-LDXTV5R7.mjs → eventCalendar-HBG3HAK6.mjs} +5 -5
- package/dist/client/{eventCombined-A4JGTNJO.mjs → eventCombined-6K5ZZWAK.mjs} +5 -5
- package/dist/client/{eventDetails-4YXTZ7EG.mjs → eventDetails-Q75ICXLT.mjs} +5 -5
- package/dist/client/{eventListing-P72TPFFM.mjs → eventListing-27P5F7DZ.mjs} +5 -5
- package/dist/client/{eventRegistration-LSYJHGMT.mjs → eventRegistration-IQ7AMASR.mjs} +5 -5
- package/dist/client/{form-AOPYOKOW.mjs → form-JRTD65FN.mjs} +1 -1
- package/dist/client/{headerSection-5TFYDFVQ.mjs → headerSection-7FPSSZHS.mjs} +2 -2
- package/dist/client/hooks.mjs +350 -35
- package/dist/client/{locationMap-QSZ3ZVAZ.mjs → locationMap-7NGFNYBH.mjs} +1 -1
- package/dist/client/{newsletterForm-KTRHZY52.mjs → newsletterForm-F3BADCI2.mjs} +1 -1
- package/dist/client/{productDetail-N4E775RG.mjs → productDetail-V3HP7ITJ.mjs} +5 -5
- package/dist/client/{productList-UGUQ2S45.mjs → productList-L3EGJUF2.mjs} +5 -5
- package/dist/client/rendering/client.mjs +2713 -1382
- package/dist/client/rendering/islands.mjs +18 -18
- package/dist/client/rendering.mjs +2014 -414
- package/dist/client/{shop-VHSZEEQ2.mjs → shop-DQUB5E2C.mjs} +5 -5
- package/dist/preview-next/before-render.mjs +55 -0
- package/dist/preview-next/client/runtime.mjs +5 -5
- package/dist/preview-next/middleware.mjs +55 -0
- package/dist/{sdk-runtime-WHPJEF5G.mjs → sdk-runtime-AF6KXJU4.mjs} +6 -6
- package/dist/server/components.mjs +2169 -781
- package/dist/server/config-validation.mjs +350 -35
- package/dist/server/config.mjs +350 -35
- package/dist/server/data.mjs +350 -35
- package/dist/server/index.mjs +64 -1
- package/dist/server/next/revalidate.mjs +229 -34
- package/dist/server/next.mjs +2307 -818
- package/dist/server/page-converter.mjs +275 -34
- package/dist/server/prebuild.mjs +1 -1
- package/dist/server/rendering/server.mjs +2174 -786
- package/dist/server/rendering.mjs +2187 -799
- package/dist/server/routing.mjs +767 -50
- package/dist/server/server.mjs +351 -36
- package/dist/server/theme-bridge.mjs +164 -2
- package/dist/server/theme.mjs +2 -2
- package/dist/server/webhooks.mjs +129 -25
- package/dist/styles/index.css +55 -0
- package/package.json +2 -1
- 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
|
|
5
|
-
import crypto from "crypto";
|
|
4
|
+
// ../api/src/webhooks.ts
|
|
6
5
|
import { z } from "zod";
|
|
7
|
-
var
|
|
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
|
|
28
|
-
var
|
|
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
|
-
|
|
81
|
+
dispatchId: z.string().optional(),
|
|
40
82
|
siteId: z.string(),
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
48
|
-
|
|
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(
|
|
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
|
-
|
|
93
|
-
|
|
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
|
|
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
|
-
|
|
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
|
};
|