@riverbankcms/sdk 0.7.2 → 0.7.3

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 (187) hide show
  1. package/README.md +54 -0
  2. package/dist/client/bookings.d.mts +2 -0
  3. package/dist/client/bookings.d.ts +2 -0
  4. package/dist/client/bookings.js +2956 -104
  5. package/dist/client/bookings.js.map +1 -1
  6. package/dist/client/bookings.mjs +2929 -70
  7. package/dist/client/bookings.mjs.map +1 -1
  8. package/dist/client/client.d.mts +2 -2
  9. package/dist/client/client.d.ts +2 -2
  10. package/dist/client/client.js +80 -11
  11. package/dist/client/client.js.map +1 -1
  12. package/dist/client/client.mjs +87 -11
  13. package/dist/client/client.mjs.map +1 -1
  14. package/dist/client/hooks.d.mts +2 -2
  15. package/dist/client/hooks.d.ts +2 -2
  16. package/dist/client/rendering/client.js +3070 -259
  17. package/dist/client/rendering/client.js.map +1 -1
  18. package/dist/client/rendering/client.mjs +3212 -395
  19. package/dist/client/rendering/client.mjs.map +1 -1
  20. package/dist/client/spam-protection.d.mts +55 -0
  21. package/dist/client/spam-protection.d.ts +55 -0
  22. package/dist/client/spam-protection.js +2915 -0
  23. package/dist/client/spam-protection.js.map +1 -0
  24. package/dist/client/spam-protection.mjs +2893 -0
  25. package/dist/client/spam-protection.mjs.map +1 -0
  26. package/dist/client/{usePage-Db9kzA41.d.ts → usePage-BYmJCCm1.d.ts} +14 -2
  27. package/dist/client/{usePage-C9tJpuKa.d.mts → usePage-DZtrWajy.d.mts} +14 -2
  28. package/dist/server/{Layout-Ce7PU9I5.d.ts → Layout-Yluyb6sK.d.ts} +1 -1
  29. package/dist/server/{Layout-WllR8Zug.d.mts → Layout-qWLdVm5-.d.mts} +1 -1
  30. package/dist/server/chunk-2IZ6S225.js +122 -0
  31. package/dist/server/chunk-2IZ6S225.js.map +1 -0
  32. package/dist/server/chunk-4CV4JOE5.js +27 -0
  33. package/dist/server/chunk-4CV4JOE5.js.map +1 -0
  34. package/dist/server/{chunk-AET56TQX.mjs → chunk-5LRR64Y6.mjs} +32 -5
  35. package/dist/server/chunk-5LRR64Y6.mjs.map +1 -0
  36. package/dist/server/{chunk-VODFQMUW.js → chunk-NBTRDLCM.js} +32 -5
  37. package/dist/server/chunk-NBTRDLCM.js.map +1 -0
  38. package/dist/server/chunk-NFEGQTCC.mjs +27 -0
  39. package/dist/server/{chunk-5JT452F2.mjs → chunk-NFQLH5IA.mjs} +340 -19
  40. package/dist/server/chunk-NFQLH5IA.mjs.map +1 -0
  41. package/dist/server/chunk-PPHZV6YD.mjs +122 -0
  42. package/dist/server/chunk-PPHZV6YD.mjs.map +1 -0
  43. package/dist/server/{chunk-HMENX4Y7.js → chunk-VLXTNB2C.js} +370 -49
  44. package/dist/server/chunk-VLXTNB2C.js.map +1 -0
  45. package/dist/server/{components-RPzRQve6.d.mts → components-DNHfSCML.d.mts} +3 -3
  46. package/dist/server/{components--LT61IKp.d.ts → components-Di5ME6He.d.ts} +3 -3
  47. package/dist/server/components.d.mts +5 -5
  48. package/dist/server/components.d.ts +5 -5
  49. package/dist/server/components.js +1 -0
  50. package/dist/server/components.js.map +1 -1
  51. package/dist/server/components.mjs +1 -0
  52. package/dist/server/config-validation.js +1 -0
  53. package/dist/server/config-validation.js.map +1 -1
  54. package/dist/server/config-validation.mjs +1 -0
  55. package/dist/server/config.js +1 -0
  56. package/dist/server/config.js.map +1 -1
  57. package/dist/server/config.mjs +1 -0
  58. package/dist/server/config.mjs.map +1 -1
  59. package/dist/server/data.d.mts +2 -2
  60. package/dist/server/data.d.ts +2 -2
  61. package/dist/server/data.js +1 -0
  62. package/dist/server/data.js.map +1 -1
  63. package/dist/server/data.mjs +1 -0
  64. package/dist/server/env.d.mts +91 -5
  65. package/dist/server/env.d.ts +91 -5
  66. package/dist/server/env.js +9 -2
  67. package/dist/server/env.js.map +1 -1
  68. package/dist/server/env.mjs +8 -1
  69. package/dist/server/{index-BL66CU6d.d.mts → index--Oyunk_B.d.mts} +2 -2
  70. package/dist/server/{index-CJk9iQQW.d.ts → index-C9Ra8dza.d.ts} +2 -2
  71. package/dist/server/{index-Bkva0WAj.d.mts → index-Clm3skz_.d.mts} +1 -1
  72. package/dist/server/{index-CSBWKA3r.d.ts → index-DLvNddi-.d.ts} +1 -1
  73. package/dist/server/index.d.mts +215 -4
  74. package/dist/server/index.d.ts +215 -4
  75. package/dist/server/index.js +301 -3
  76. package/dist/server/index.js.map +1 -1
  77. package/dist/server/index.mjs +301 -3
  78. package/dist/server/index.mjs.map +1 -1
  79. package/dist/server/{loadContent-CXUWMuzY.d.ts → loadContent-D7LQwI0o.d.ts} +3 -3
  80. package/dist/server/{loadContent-F_tAS0Nl.d.mts → loadContent-DVfuBLiZ.d.mts} +3 -3
  81. package/dist/server/{loadPage-6I7F6GRF.js → loadPage-AXNAERDS.js} +2 -1
  82. package/dist/server/loadPage-AXNAERDS.js.map +1 -0
  83. package/dist/server/{loadPage-i2r-X5b9.d.ts → loadPage-BmYJCe_V.d.ts} +2 -2
  84. package/dist/server/{loadPage-CxlYLe5K.d.mts → loadPage-BucnLHmE.d.mts} +2 -2
  85. package/dist/server/{loadPage-JI2SML4M.mjs → loadPage-XR7ORQ2E.mjs} +2 -1
  86. package/dist/server/loadPage-XR7ORQ2E.mjs.map +1 -0
  87. package/dist/server/metadata.d.mts +4 -4
  88. package/dist/server/metadata.d.ts +4 -4
  89. package/dist/server/metadata.js +1 -0
  90. package/dist/server/metadata.js.map +1 -1
  91. package/dist/server/metadata.mjs +1 -0
  92. package/dist/server/navigation.d.mts +2 -2
  93. package/dist/server/navigation.d.ts +2 -2
  94. package/dist/server/navigation.js +1 -0
  95. package/dist/server/navigation.js.map +1 -1
  96. package/dist/server/navigation.mjs +1 -0
  97. package/dist/server/next/revalidate.js +5 -4
  98. package/dist/server/next/revalidate.js.map +1 -1
  99. package/dist/server/next/revalidate.mjs +3 -2
  100. package/dist/server/next/revalidate.mjs.map +1 -1
  101. package/dist/server/next/tags.d.mts +3 -0
  102. package/dist/server/next/tags.d.ts +3 -0
  103. package/dist/server/next/tags.js +3 -1
  104. package/dist/server/next/tags.js.map +1 -1
  105. package/dist/server/next/tags.mjs +2 -0
  106. package/dist/server/next/tags.mjs.map +1 -1
  107. package/dist/server/next.d.mts +5 -5
  108. package/dist/server/next.d.ts +5 -5
  109. package/dist/server/next.js +5 -4
  110. package/dist/server/next.js.map +1 -1
  111. package/dist/server/next.mjs +3 -2
  112. package/dist/server/next.mjs.map +1 -1
  113. package/dist/server/rendering/server.d.mts +4 -4
  114. package/dist/server/rendering/server.d.ts +4 -4
  115. package/dist/server/rendering/server.js +1 -0
  116. package/dist/server/rendering/server.js.map +1 -1
  117. package/dist/server/rendering/server.mjs +1 -0
  118. package/dist/server/rendering.d.mts +7 -7
  119. package/dist/server/rendering.d.ts +7 -7
  120. package/dist/server/rendering.js +1 -0
  121. package/dist/server/rendering.js.map +1 -1
  122. package/dist/server/rendering.mjs +1 -0
  123. package/dist/server/routing.d.mts +3 -3
  124. package/dist/server/routing.d.ts +3 -3
  125. package/dist/server/routing.js +4 -2
  126. package/dist/server/routing.js.map +1 -1
  127. package/dist/server/routing.mjs +3 -1
  128. package/dist/server/routing.mjs.map +1 -1
  129. package/dist/server/server.d.mts +5 -5
  130. package/dist/server/server.d.ts +5 -5
  131. package/dist/server/server.js +3 -2
  132. package/dist/server/server.js.map +1 -1
  133. package/dist/server/server.mjs +2 -1
  134. package/dist/server/theme-bridge.js +1 -0
  135. package/dist/server/theme-bridge.js.map +1 -1
  136. package/dist/server/theme-bridge.mjs +1 -0
  137. package/dist/server/theme-bridge.mjs.map +1 -1
  138. package/dist/server/theme.js +3 -1
  139. package/dist/server/theme.js.map +1 -1
  140. package/dist/server/theme.mjs +2 -0
  141. package/dist/server/theme.mjs.map +1 -1
  142. package/dist/server/{types-DnkRh0UL.d.ts → types-BRQyLrQU.d.ts} +14 -2
  143. package/dist/server/{types-Dsu9wsUh.d.mts → types-BSV6Vc-P.d.mts} +2 -2
  144. package/dist/server/{types-MF2AWoKv.d.mts → types-C-LShyIg.d.mts} +14 -2
  145. package/dist/server/{types-CVykEqXN.d.ts → types-Dt98DeYa.d.ts} +2 -2
  146. package/dist/server/webhooks.d.mts +8 -2
  147. package/dist/server/webhooks.d.ts +8 -2
  148. package/dist/server/webhooks.js +3 -2
  149. package/dist/server/webhooks.js.map +1 -1
  150. package/dist/server/webhooks.mjs +2 -1
  151. package/package.json +7 -1
  152. package/dist/client/resolver-BhueZVxZ.d.mts +0 -61
  153. package/dist/client/resolver-BhueZVxZ.d.ts +0 -61
  154. package/dist/client/usePage--fGlyrgj.d.mts +0 -6439
  155. package/dist/client/usePage-BBcFCxOU.d.ts +0 -6297
  156. package/dist/client/usePage-BC8Q2E3t.d.mts +0 -6431
  157. package/dist/client/usePage-BTPnCuWC.d.mts +0 -6511
  158. package/dist/client/usePage-BXjk8BhD.d.mts +0 -6704
  159. package/dist/client/usePage-BafOS9UT.d.mts +0 -6512
  160. package/dist/client/usePage-BcjWPXvh.d.mts +0 -6388
  161. package/dist/client/usePage-BiOReg0_.d.ts +0 -6704
  162. package/dist/client/usePage-Bnx-kA6x.d.mts +0 -6670
  163. package/dist/client/usePage-BvKAa3Zw.d.mts +0 -366
  164. package/dist/client/usePage-BvKAa3Zw.d.ts +0 -366
  165. package/dist/client/usePage-BydHcMYB.d.mts +0 -6297
  166. package/dist/client/usePage-C3ZKNwY7.d.mts +0 -6393
  167. package/dist/client/usePage-CE7X5NcN.d.ts +0 -6439
  168. package/dist/client/usePage-CHEybPMD.d.ts +0 -6429
  169. package/dist/client/usePage-CrKw1H6Y.d.ts +0 -6338
  170. package/dist/client/usePage-CyYpOJud.d.ts +0 -6388
  171. package/dist/client/usePage-D4fxZbRR.d.mts +0 -6429
  172. package/dist/client/usePage-DMI8ImsU.d.mts +0 -6338
  173. package/dist/client/usePage-DoPI6b8V.d.ts +0 -6511
  174. package/dist/client/usePage-DpRNZUtP.d.ts +0 -6431
  175. package/dist/client/usePage-QNWArrVO.d.ts +0 -6670
  176. package/dist/client/usePage-fBgPB6Oq.d.ts +0 -6512
  177. package/dist/client/usePage-gpVaeWDy.d.ts +0 -6393
  178. package/dist/server/chunk-5JT452F2.mjs.map +0 -1
  179. package/dist/server/chunk-AET56TQX.mjs.map +0 -1
  180. package/dist/server/chunk-HMENX4Y7.js.map +0 -1
  181. package/dist/server/chunk-LQUKXIW7.mjs +0 -13
  182. package/dist/server/chunk-LQUKXIW7.mjs.map +0 -1
  183. package/dist/server/chunk-VODFQMUW.js.map +0 -1
  184. package/dist/server/chunk-WYNEYDXO.js +0 -13
  185. package/dist/server/chunk-WYNEYDXO.js.map +0 -1
  186. package/dist/server/loadPage-6I7F6GRF.js.map +0 -1
  187. /package/dist/server/{loadPage-JI2SML4M.mjs.map → chunk-NFEGQTCC.mjs.map} +0 -0
@@ -0,0 +1,122 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// src/env.ts
2
+ var RiverbankEnvError = class extends Error {
3
+ constructor(message, missingVars) {
4
+ super(message);
5
+ this.missingVars = missingVars;
6
+ this.name = "RiverbankEnvError";
7
+ }
8
+ };
9
+ function getEnvPrefix(target) {
10
+ return target === "remote" ? "RIVERBANK_REMOTE" : "RIVERBANK_LOCAL";
11
+ }
12
+ function detectTarget() {
13
+ const env = _optionalChain([process, 'access', _ => _.env, 'access', _2 => _2.RIVERBANK_ENV, 'optionalAccess', _3 => _3.toLowerCase, 'call', _4 => _4()]);
14
+ if (env === "remote" || env === "production" || env === "prod") {
15
+ return "remote";
16
+ }
17
+ return "local";
18
+ }
19
+ function detectPreviewMode() {
20
+ const previewMode = process.env.RIVERBANK_PREVIEW_MODE;
21
+ if (previewMode !== void 0 && previewMode !== "") {
22
+ return previewMode === "true";
23
+ }
24
+ const previewLegacy = process.env.RIVERBANK_PREVIEW;
25
+ if (previewLegacy !== void 0 && previewLegacy !== "") {
26
+ return previewLegacy === "true";
27
+ }
28
+ return process.env.VERCEL_ENV === "preview";
29
+ }
30
+ function validateKeyType(key, expectedType) {
31
+ const isPreviewKey = key.startsWith("bld_preview_sk_");
32
+ const isContentKey = key.startsWith("bld_live_sk_");
33
+ if (expectedType === "preview" && !isPreviewKey) {
34
+ if (isContentKey) {
35
+ throw new RiverbankEnvError(
36
+ `Preview mode is enabled (RIVERBANK_PREVIEW_MODE=true) but a content key was provided. Preview mode requires a preview API key (bld_preview_sk_...) to access draft content. Either:
37
+ 1. Set RIVERBANK_*_PREVIEW_API_KEY with your preview key, or
38
+ 2. Set RIVERBANK_PREVIEW_MODE=false to fetch published content instead.`,
39
+ []
40
+ );
41
+ }
42
+ throw new RiverbankEnvError(
43
+ `Invalid API key format for preview mode. Expected key starting with bld_preview_sk_`,
44
+ []
45
+ );
46
+ }
47
+ if (expectedType === "content" && !isContentKey) {
48
+ if (isPreviewKey) {
49
+ console.debug(
50
+ "[getRiverbankEnv] Using preview key for published content. Consider using a content key (bld_live_sk_...) for production."
51
+ );
52
+ return;
53
+ }
54
+ throw new RiverbankEnvError(
55
+ `Invalid API key format for content access. Expected key starting with bld_live_sk_ or bld_preview_sk_`,
56
+ []
57
+ );
58
+ }
59
+ }
60
+ function isPreviewMode() {
61
+ return detectPreviewMode();
62
+ }
63
+ function getRiverbankTarget() {
64
+ return detectTarget();
65
+ }
66
+ function getRiverbankEnv() {
67
+ const target = detectTarget();
68
+ const previewMode = detectPreviewMode();
69
+ const prefix = getEnvPrefix(target);
70
+ const siteId = process.env[`${prefix}_SITE_ID`];
71
+ const dashboardUrl = process.env[`${prefix}_DASHBOARD_URL`];
72
+ const contentKey = process.env[`${prefix}_API_KEY`];
73
+ const previewKey = process.env[`${prefix}_PREVIEW_API_KEY`];
74
+ const missingVars = [];
75
+ if (!siteId) missingVars.push(`${prefix}_SITE_ID`);
76
+ if (!dashboardUrl) missingVars.push(`${prefix}_DASHBOARD_URL`);
77
+ let apiKey;
78
+ let keyType;
79
+ if (previewMode) {
80
+ apiKey = previewKey;
81
+ keyType = "preview";
82
+ if (!apiKey) {
83
+ missingVars.push(`${prefix}_PREVIEW_API_KEY`);
84
+ }
85
+ } else {
86
+ apiKey = contentKey || previewKey;
87
+ keyType = contentKey ? "content" : "preview";
88
+ if (!apiKey) {
89
+ missingVars.push(`${prefix}_API_KEY`);
90
+ }
91
+ }
92
+ if (missingVars.length > 0) {
93
+ throw new RiverbankEnvError(
94
+ `Missing required environment variables for Riverbank SDK:
95
+ ` + missingVars.map((v) => ` - ${v}`).join("\n") + `
96
+
97
+ Current settings: RIVERBANK_ENV=${process.env.RIVERBANK_ENV || "local"}, RIVERBANK_PREVIEW_MODE=${process.env.RIVERBANK_PREVIEW_MODE || "false"}`,
98
+ missingVars
99
+ );
100
+ }
101
+ validateKeyType(apiKey, keyType);
102
+ let baseUrl = dashboardUrl;
103
+ if (!baseUrl.endsWith("/api")) {
104
+ baseUrl = baseUrl.replace(/\/$/, "") + "/api";
105
+ }
106
+ return {
107
+ target,
108
+ previewMode,
109
+ siteId,
110
+ baseUrl,
111
+ apiKey,
112
+ keyType
113
+ };
114
+ }
115
+
116
+
117
+
118
+
119
+
120
+
121
+ exports.RiverbankEnvError = RiverbankEnvError; exports.isPreviewMode = isPreviewMode; exports.getRiverbankTarget = getRiverbankTarget; exports.getRiverbankEnv = getRiverbankEnv;
122
+ //# sourceMappingURL=chunk-2IZ6S225.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-2IZ6S225.js","../../src/env.ts"],"names":[],"mappings":"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","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-2IZ6S225.js","sourcesContent":[null,"/**\n * Environment detection utilities for SDK\n *\n * Provides helpers for detecting preview mode and auto-selecting the correct API key.\n *\n * @example\n * ```ts\n * import { getRiverbankEnv } from '@riverbankcms/sdk/env';\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n *\n * const env = getRiverbankEnv();\n * const client = createRiverbankClient({\n * apiKey: env.apiKey,\n * baseUrl: env.baseUrl,\n * });\n * ```\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Environment target: 'local' for development, 'remote' for production\n */\nexport type RiverbankEnvTarget = 'local' | 'remote';\n\n/**\n * Runtime environment configuration\n */\nexport interface RiverbankEnvConfig {\n /** The detected environment target */\n target: RiverbankEnvTarget;\n /** Whether preview mode is enabled */\n previewMode: boolean;\n /** Site ID */\n siteId: string;\n /** Dashboard/API base URL */\n baseUrl: string;\n /** The auto-selected API key (preview or content key based on mode) */\n apiKey: string;\n /** The type of key being used */\n keyType: 'preview' | 'content';\n}\n\n/**\n * Error thrown when required environment variables are missing\n */\nexport class RiverbankEnvError extends Error {\n constructor(\n message: string,\n public readonly missingVars: string[]\n ) {\n super(message);\n this.name = 'RiverbankEnvError';\n }\n}\n\n// ============================================================================\n// Internal Helpers\n// ============================================================================\n\n/**\n * Get the environment variable prefix based on target\n */\nfunction getEnvPrefix(target: RiverbankEnvTarget): string {\n return target === 'remote' ? 'RIVERBANK_REMOTE' : 'RIVERBANK_LOCAL';\n}\n\n/**\n * Detect the environment target from RIVERBANK_ENV\n */\nfunction detectTarget(): RiverbankEnvTarget {\n const env = process.env.RIVERBANK_ENV?.toLowerCase();\n if (env === 'remote' || env === 'production' || env === 'prod') {\n return 'remote';\n }\n return 'local';\n}\n\n/**\n * Detect if preview mode is enabled.\n * Uses RIVERBANK_PREVIEW_MODE first, then falls back to RIVERBANK_PREVIEW for backward compat.\n */\nfunction detectPreviewMode(): boolean {\n // RIVERBANK_PREVIEW_MODE takes precedence (new convention)\n const previewMode = process.env.RIVERBANK_PREVIEW_MODE;\n if (previewMode !== undefined && previewMode !== '') {\n return previewMode === 'true';\n }\n\n // Fall back to RIVERBANK_PREVIEW (backward compatibility)\n const previewLegacy = process.env.RIVERBANK_PREVIEW;\n if (previewLegacy !== undefined && previewLegacy !== '') {\n return previewLegacy === 'true';\n }\n\n // Fall back to Vercel environment detection\n return process.env.VERCEL_ENV === 'preview';\n}\n\n/**\n * Validate that an API key matches the expected format for its type\n */\nfunction validateKeyType(key: string, expectedType: 'preview' | 'content'): void {\n const isPreviewKey = key.startsWith('bld_preview_sk_');\n const isContentKey = key.startsWith('bld_live_sk_');\n\n if (expectedType === 'preview' && !isPreviewKey) {\n if (isContentKey) {\n throw new RiverbankEnvError(\n `Preview mode is enabled (RIVERBANK_PREVIEW_MODE=true) but a content key was provided. ` +\n `Preview mode requires a preview API key (bld_preview_sk_...) to access draft content. ` +\n `Either:\\n` +\n ` 1. Set RIVERBANK_*_PREVIEW_API_KEY with your preview key, or\\n` +\n ` 2. Set RIVERBANK_PREVIEW_MODE=false to fetch published content instead.`,\n []\n );\n }\n throw new RiverbankEnvError(\n `Invalid API key format for preview mode. Expected key starting with bld_preview_sk_`,\n []\n );\n }\n\n if (expectedType === 'content' && !isContentKey) {\n if (isPreviewKey) {\n // This is actually fine - preview keys can access both draft and published content\n // Just log a note that they could use a more restrictive key\n console.debug(\n '[getRiverbankEnv] Using preview key for published content. ' +\n 'Consider using a content key (bld_live_sk_...) for production.'\n );\n return;\n }\n throw new RiverbankEnvError(\n `Invalid API key format for content access. Expected key starting with bld_live_sk_ or bld_preview_sk_`,\n []\n );\n }\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Detects if the current environment is in preview mode.\n *\n * Precedence:\n * 1. RIVERBANK_PREVIEW_MODE env var (explicit override) - 'true' or 'false'\n * 2. RIVERBANK_PREVIEW env var (legacy) - 'true' or 'false'\n * 3. VERCEL_ENV === 'preview' (Vercel preview deployments)\n * 4. Default: false (production behavior)\n *\n * In preview mode:\n * - Draft content is visible\n * - ISR revalidation is more aggressive\n * - Cache bypass may be enabled\n *\n * @returns true if in preview mode, false otherwise\n */\nexport function isPreviewMode(): boolean {\n return detectPreviewMode();\n}\n\n/**\n * Get the current environment target.\n *\n * This is a convenience function for checking `RIVERBANK_ENV`.\n *\n * @returns 'local' or 'remote'\n */\nexport function getRiverbankTarget(): RiverbankEnvTarget {\n return detectTarget();\n}\n\n/**\n * Get runtime environment configuration with automatic API key selection.\n *\n * This helper reads environment variables and automatically selects the correct\n * API key based on the current environment and preview mode:\n *\n * - When `RIVERBANK_PREVIEW_MODE=true`: Uses preview API key (bld_preview_sk_...)\n * - When `RIVERBANK_PREVIEW_MODE=false` (default): Uses content API key (bld_live_sk_...)\n *\n * Environment variable patterns:\n * - `RIVERBANK_ENV`: 'local' (default) or 'remote'\n * - `RIVERBANK_PREVIEW_MODE`: 'true' or 'false' (default)\n * - `RIVERBANK_{LOCAL|REMOTE}_SITE_ID`: Site ID\n * - `RIVERBANK_{LOCAL|REMOTE}_DASHBOARD_URL`: Dashboard URL\n * - `RIVERBANK_{LOCAL|REMOTE}_API_KEY`: Content/live API key\n * - `RIVERBANK_{LOCAL|REMOTE}_PREVIEW_API_KEY`: Preview API key\n *\n * @returns Environment configuration with auto-selected API key\n * @throws {RiverbankEnvError} If required environment variables are missing\n *\n * @example\n * ```ts\n * // lib/builder-client.ts\n * import { getRiverbankEnv } from '@riverbankcms/sdk/env';\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n *\n * const env = getRiverbankEnv();\n *\n * export const client = createRiverbankClient({\n * apiKey: env.apiKey,\n * baseUrl: env.baseUrl,\n * });\n *\n * export const siteId = env.siteId;\n * ```\n */\nexport function getRiverbankEnv(): RiverbankEnvConfig {\n const target = detectTarget();\n const previewMode = detectPreviewMode();\n const prefix = getEnvPrefix(target);\n\n // Required vars\n const siteId = process.env[`${prefix}_SITE_ID`];\n const dashboardUrl = process.env[`${prefix}_DASHBOARD_URL`];\n\n // API keys - pick based on preview mode\n const contentKey = process.env[`${prefix}_API_KEY`];\n const previewKey = process.env[`${prefix}_PREVIEW_API_KEY`];\n\n // Collect missing required vars\n const missingVars: string[] = [];\n if (!siteId) missingVars.push(`${prefix}_SITE_ID`);\n if (!dashboardUrl) missingVars.push(`${prefix}_DASHBOARD_URL`);\n\n // Select the appropriate key\n let apiKey: string | undefined;\n let keyType: 'preview' | 'content';\n\n if (previewMode) {\n apiKey = previewKey;\n keyType = 'preview';\n if (!apiKey) {\n missingVars.push(`${prefix}_PREVIEW_API_KEY`);\n }\n } else {\n // For published content, prefer content key but allow preview key as fallback\n apiKey = contentKey || previewKey;\n keyType = contentKey ? 'content' : 'preview';\n if (!apiKey) {\n missingVars.push(`${prefix}_API_KEY`);\n }\n }\n\n if (missingVars.length > 0) {\n throw new RiverbankEnvError(\n `Missing required environment variables for Riverbank SDK:\\n` +\n missingVars.map((v) => ` - ${v}`).join('\\n') +\n `\\n\\nCurrent settings: RIVERBANK_ENV=${process.env.RIVERBANK_ENV || 'local'}, ` +\n `RIVERBANK_PREVIEW_MODE=${process.env.RIVERBANK_PREVIEW_MODE || 'false'}`,\n missingVars\n );\n }\n\n // Validate key type matches expected usage\n validateKeyType(apiKey!, keyType);\n\n // Construct base URL (ensure it ends with /api)\n let baseUrl = dashboardUrl!;\n if (!baseUrl.endsWith('/api')) {\n baseUrl = baseUrl.replace(/\\/$/, '') + '/api';\n }\n\n return {\n target,\n previewMode,\n siteId: siteId!,\n baseUrl,\n apiKey: apiKey!,\n keyType,\n };\n}\n"]}
@@ -0,0 +1,27 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __esm = (fn, res) => function __init() {
6
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
7
+ };
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+
23
+
24
+
25
+
26
+ exports.__esm = __esm; exports.__export = __export; exports.__toCommonJS = __toCommonJS;
27
+ //# sourceMappingURL=chunk-4CV4JOE5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-4CV4JOE5.js"],"names":[],"mappings":"AAAA,6EAAI,UAAU,EAAE,MAAM,CAAC,cAAc;AACrC,IAAI,iBAAiB,EAAE,MAAM,CAAC,wBAAwB;AACtD,IAAI,kBAAkB,EAAE,MAAM,CAAC,mBAAmB;AAClD,IAAI,aAAa,EAAE,MAAM,CAAC,SAAS,CAAC,cAAc;AAClD,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,SAAS,MAAM,CAAC,EAAE;AAC3C,EAAE,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG;AACrE,CAAC;AACD,IAAI,SAAS,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG;AAChC,EAAE,IAAI,CAAC,IAAI,KAAK,GAAG,GAAG;AACtB,IAAI,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;AACjE,CAAC;AACD,IAAI,YAAY,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG;AAC9C,EAAE,GAAG,CAAC,KAAK,GAAG,OAAO,KAAK,IAAI,SAAS,GAAG,OAAO,KAAK,IAAI,UAAU,EAAE;AACtE,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC;AAC3C,MAAM,GAAG,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,IAAI,MAAM;AACvD,QAAQ,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,EAAE,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;AAC1H,EAAE;AACF,EAAE,OAAO,EAAE;AACX,CAAC;AACD,IAAI,aAAa,EAAE,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;AAC1F;AACA;AACE;AACA;AACA;AACF,wFAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-4CV4JOE5.js"}
@@ -1,15 +1,42 @@
1
1
  // src/webhooks/verify.ts
2
2
  import crypto from "crypto";
3
3
  import { z } from "zod";
4
+ var WebhookEventSchema = z.enum([
5
+ "page.published",
6
+ "entry.published",
7
+ "navigation.updated",
8
+ "theme.updated",
9
+ "site.settings_updated"
10
+ ]);
11
+ var PagePublishedDataSchema = z.object({
12
+ pageId: z.string(),
13
+ path: z.string(),
14
+ slug: z.string().optional()
15
+ });
16
+ var EntryPublishedDataSchema = z.object({
17
+ entryId: z.string(),
18
+ path: z.string(),
19
+ contentType: z.string()
20
+ });
21
+ var NavigationUpdatedDataSchema = z.object({
22
+ menuId: z.string().optional()
23
+ });
24
+ var EmptyDataSchema = z.object({});
25
+ var WebhookDataSchema = z.union([
26
+ PagePublishedDataSchema,
27
+ EntryPublishedDataSchema,
28
+ NavigationUpdatedDataSchema,
29
+ EmptyDataSchema
30
+ ]);
4
31
  var WebhookPayloadSchema = z.object({
5
- /** Event type (e.g., 'page.published', 'entry.published') */
6
- event: z.string(),
32
+ /** Event type */
33
+ event: WebhookEventSchema,
7
34
  /** ISO timestamp of when the event occurred */
8
35
  timestamp: z.string(),
9
36
  /** Site ID that triggered the event */
10
37
  siteId: z.string(),
11
- /** Event-specific data (varies by event type) */
12
- data: z.record(z.string(), z.any()),
38
+ /** Event-specific data (shape depends on event type) */
39
+ data: z.record(z.string(), z.unknown()),
13
40
  /** Cache invalidation tags (for tag-based revalidation) */
14
41
  tags: z.array(z.string()).optional()
15
42
  });
@@ -42,4 +69,4 @@ export {
42
69
  verifyWebhookSignature,
43
70
  parseWebhookPayload
44
71
  };
45
- //# sourceMappingURL=chunk-AET56TQX.mjs.map
72
+ //# sourceMappingURL=chunk-5LRR64Y6.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/webhooks/verify.ts"],"sourcesContent":["/**\n * Webhook verification utilities for Riverbank SDK\n *\n * Provides framework-agnostic webhook signature verification and payload parsing.\n */\n\nimport crypto from 'crypto';\nimport { z } from 'zod';\n\n// ============================================================================\n// Webhook Event Types\n// ============================================================================\n\n/**\n * Supported webhook event types.\n * Keep in sync with apps/dashboard/src/lib/db/helpers/webhooks.ts\n */\nexport const WebhookEventSchema = z.enum([\n 'page.published',\n 'entry.published',\n 'navigation.updated',\n 'theme.updated',\n 'site.settings_updated',\n]);\n\nexport type WebhookEvent = z.infer<typeof WebhookEventSchema>;\n\n// ============================================================================\n// Event-Specific Data Schemas\n// ============================================================================\n\n/** Data for page.published events */\nexport const PagePublishedDataSchema = z.object({\n pageId: z.string(),\n path: z.string(),\n slug: z.string().optional(),\n});\n\n/** Data for entry.published events */\nexport const EntryPublishedDataSchema = z.object({\n entryId: z.string(),\n path: z.string(),\n contentType: z.string(),\n});\n\n/** Data for navigation.updated events */\nexport const NavigationUpdatedDataSchema = z.object({\n menuId: z.string().optional(),\n});\n\n/** Data for theme.updated and site.settings_updated events (empty) */\nexport const EmptyDataSchema = z.object({});\n\n/**\n * Combined data schema that accepts any valid event data.\n * The actual shape depends on the event type.\n */\nexport const WebhookDataSchema = z.union([\n PagePublishedDataSchema,\n EntryPublishedDataSchema,\n NavigationUpdatedDataSchema,\n EmptyDataSchema,\n]);\n\nexport type PagePublishedData = z.infer<typeof PagePublishedDataSchema>;\nexport type EntryPublishedData = z.infer<typeof EntryPublishedDataSchema>;\nexport type NavigationUpdatedData = z.infer<typeof NavigationUpdatedDataSchema>;\n\n// ============================================================================\n// Webhook Payload Schema\n// ============================================================================\n\n/**\n * Zod schema for webhook payload validation.\n */\nexport const WebhookPayloadSchema = z.object({\n /** Event type */\n event: WebhookEventSchema,\n /** ISO timestamp of when the event occurred */\n timestamp: z.string(),\n /** Site ID that triggered the event */\n siteId: z.string(),\n /** Event-specific data (shape depends on event type) */\n data: z.record(z.string(), z.unknown()),\n /** Cache invalidation tags (for tag-based revalidation) */\n tags: z.array(z.string()).optional(),\n});\n\n/**\n * Webhook payload structure sent by the CMS.\n */\nexport type WebhookPayload = z.infer<typeof WebhookPayloadSchema>;\n\n/**\n * Type-safe webhook payload with discriminated data based on event type.\n */\nexport type TypedWebhookPayload =\n | { event: 'page.published'; data: PagePublishedData; siteId: string; timestamp: string; tags?: string[] }\n | { event: 'entry.published'; data: EntryPublishedData; siteId: string; timestamp: string; tags?: string[] }\n | { event: 'navigation.updated'; data: NavigationUpdatedData; siteId: string; timestamp: string; tags?: string[] }\n | { event: 'theme.updated'; data: Record<string, never>; siteId: string; timestamp: string; tags?: string[] }\n | { event: 'site.settings_updated'; data: Record<string, never>; siteId: string; timestamp: string; tags?: string[] };\n\n/**\n * Verify a webhook signature using HMAC-SHA256.\n *\n * Uses timing-safe comparison to prevent timing attacks.\n *\n * @param payload - The raw request body as a string\n * @param signature - The X-Riverbank-Signature header value\n * @param secret - The webhook signing secret (RIVERBANK_WEBHOOK_SECRET)\n * @returns true if signature is valid, false otherwise\n *\n * @example\n * ```ts\n * const body = await request.text();\n * const signature = request.headers.get('x-riverbank-signature');\n * const secret = process.env.RIVERBANK_WEBHOOK_SECRET;\n *\n * if (!verifyWebhookSignature(body, signature, secret)) {\n * return new Response('Invalid signature', { status: 401 });\n * }\n * ```\n */\nexport function verifyWebhookSignature(\n payload: string,\n signature: string,\n secret: string\n): boolean {\n const expectedSignature = crypto\n .createHmac('sha256', secret)\n .update(payload)\n .digest('hex');\n\n // Length check before timing-safe comparison\n // timingSafeEqual throws if lengths differ\n if (signature.length !== expectedSignature.length) {\n return false;\n }\n\n // Timing-safe comparison to prevent timing attacks\n return crypto.timingSafeEqual(\n Buffer.from(signature),\n Buffer.from(expectedSignature)\n );\n}\n\n/**\n * Result type for webhook payload parsing.\n */\nexport type ParseWebhookResult =\n | { success: true; payload: WebhookPayload }\n | { success: false; error: string };\n\n/**\n * Parse and validate a webhook payload from the request body.\n *\n * Uses Zod schema validation to ensure the payload has the expected structure.\n *\n * @param body - The raw request body as a string\n * @returns A result object with either the validated payload or an error message\n *\n * @example\n * ```ts\n * const body = await request.text();\n * const result = parseWebhookPayload(body);\n * if (!result.success) {\n * return new Response(result.error, { status: 400 });\n * }\n * console.log(`Received ${result.payload.event} for site ${result.payload.siteId}`);\n * ```\n */\nexport function parseWebhookPayload(body: string): ParseWebhookResult {\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n return { success: false, error: 'Invalid JSON' };\n }\n\n const result = WebhookPayloadSchema.safeParse(parsed);\n if (!result.success) {\n return { success: false, error: `Invalid payload: ${result.error.message}` };\n }\n\n return { success: true, payload: result.data };\n}\n"],"mappings":";AAMA,OAAO,YAAY;AACnB,SAAS,SAAS;AAUX,IAAM,qBAAqB,EAAE,KAAK;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AASM,IAAM,0BAA0B,EAAE,OAAO;AAAA,EAC9C,QAAQ,EAAE,OAAO;AAAA,EACjB,MAAM,EAAE,OAAO;AAAA,EACf,MAAM,EAAE,OAAO,EAAE,SAAS;AAC5B,CAAC;AAGM,IAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,SAAS,EAAE,OAAO;AAAA,EAClB,MAAM,EAAE,OAAO;AAAA,EACf,aAAa,EAAE,OAAO;AACxB,CAAC;AAGM,IAAM,8BAA8B,EAAE,OAAO;AAAA,EAClD,QAAQ,EAAE,OAAO,EAAE,SAAS;AAC9B,CAAC;AAGM,IAAM,kBAAkB,EAAE,OAAO,CAAC,CAAC;AAMnC,IAAM,oBAAoB,EAAE,MAAM;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAaM,IAAM,uBAAuB,EAAE,OAAO;AAAA;AAAA,EAE3C,OAAO;AAAA;AAAA,EAEP,WAAW,EAAE,OAAO;AAAA;AAAA,EAEpB,QAAQ,EAAE,OAAO;AAAA;AAAA,EAEjB,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC;AAAA;AAAA,EAEtC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AACrC,CAAC;AAsCM,SAAS,uBACd,SACA,WACA,QACS;AACT,QAAM,oBAAoB,OACvB,WAAW,UAAU,MAAM,EAC3B,OAAO,OAAO,EACd,OAAO,KAAK;AAIf,MAAI,UAAU,WAAW,kBAAkB,QAAQ;AACjD,WAAO;AAAA,EACT;AAGA,SAAO,OAAO;AAAA,IACZ,OAAO,KAAK,SAAS;AAAA,IACrB,OAAO,KAAK,iBAAiB;AAAA,EAC/B;AACF;AA2BO,SAAS,oBAAoB,MAAkC;AACpE,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,IAAI;AAAA,EAC1B,QAAQ;AACN,WAAO,EAAE,SAAS,OAAO,OAAO,eAAe;AAAA,EACjD;AAEA,QAAM,SAAS,qBAAqB,UAAU,MAAM;AACpD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,EAAE,SAAS,OAAO,OAAO,oBAAoB,OAAO,MAAM,OAAO,GAAG;AAAA,EAC7E;AAEA,SAAO,EAAE,SAAS,MAAM,SAAS,OAAO,KAAK;AAC/C;","names":[]}
@@ -1,15 +1,42 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }// src/webhooks/verify.ts
2
2
  var _crypto = require('crypto'); var _crypto2 = _interopRequireDefault(_crypto);
3
3
  var _zod = require('zod');
4
+ var WebhookEventSchema = _zod.z.enum([
5
+ "page.published",
6
+ "entry.published",
7
+ "navigation.updated",
8
+ "theme.updated",
9
+ "site.settings_updated"
10
+ ]);
11
+ var PagePublishedDataSchema = _zod.z.object({
12
+ pageId: _zod.z.string(),
13
+ path: _zod.z.string(),
14
+ slug: _zod.z.string().optional()
15
+ });
16
+ var EntryPublishedDataSchema = _zod.z.object({
17
+ entryId: _zod.z.string(),
18
+ path: _zod.z.string(),
19
+ contentType: _zod.z.string()
20
+ });
21
+ var NavigationUpdatedDataSchema = _zod.z.object({
22
+ menuId: _zod.z.string().optional()
23
+ });
24
+ var EmptyDataSchema = _zod.z.object({});
25
+ var WebhookDataSchema = _zod.z.union([
26
+ PagePublishedDataSchema,
27
+ EntryPublishedDataSchema,
28
+ NavigationUpdatedDataSchema,
29
+ EmptyDataSchema
30
+ ]);
4
31
  var WebhookPayloadSchema = _zod.z.object({
5
- /** Event type (e.g., 'page.published', 'entry.published') */
6
- event: _zod.z.string(),
32
+ /** Event type */
33
+ event: WebhookEventSchema,
7
34
  /** ISO timestamp of when the event occurred */
8
35
  timestamp: _zod.z.string(),
9
36
  /** Site ID that triggered the event */
10
37
  siteId: _zod.z.string(),
11
- /** Event-specific data (varies by event type) */
12
- data: _zod.z.record(_zod.z.string(), _zod.z.any()),
38
+ /** Event-specific data (shape depends on event type) */
39
+ data: _zod.z.record(_zod.z.string(), _zod.z.unknown()),
13
40
  /** Cache invalidation tags (for tag-based revalidation) */
14
41
  tags: _zod.z.array(_zod.z.string()).optional()
15
42
  });
@@ -42,4 +69,4 @@ function parseWebhookPayload(body) {
42
69
 
43
70
 
44
71
  exports.WebhookPayloadSchema = WebhookPayloadSchema; exports.verifyWebhookSignature = verifyWebhookSignature; exports.parseWebhookPayload = parseWebhookPayload;
45
- //# sourceMappingURL=chunk-VODFQMUW.js.map
72
+ //# sourceMappingURL=chunk-NBTRDLCM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-NBTRDLCM.js","../../src/webhooks/verify.ts"],"names":[],"mappings":"AAAA;ACMA,gFAAmB;AACnB,0BAAkB;AAUX,IAAM,mBAAA,EAAqB,MAAA,CAAE,IAAA,CAAK;AAAA,EACvC,gBAAA;AAAA,EACA,iBAAA;AAAA,EACA,oBAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAC,CAAA;AASM,IAAM,wBAAA,EAA0B,MAAA,CAAE,MAAA,CAAO;AAAA,EAC9C,MAAA,EAAQ,MAAA,CAAE,MAAA,CAAO,CAAA;AAAA,EACjB,IAAA,EAAM,MAAA,CAAE,MAAA,CAAO,CAAA;AAAA,EACf,IAAA,EAAM,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS;AAC5B,CAAC,CAAA;AAGM,IAAM,yBAAA,EAA2B,MAAA,CAAE,MAAA,CAAO;AAAA,EAC/C,OAAA,EAAS,MAAA,CAAE,MAAA,CAAO,CAAA;AAAA,EAClB,IAAA,EAAM,MAAA,CAAE,MAAA,CAAO,CAAA;AAAA,EACf,WAAA,EAAa,MAAA,CAAE,MAAA,CAAO;AACxB,CAAC,CAAA;AAGM,IAAM,4BAAA,EAA8B,MAAA,CAAE,MAAA,CAAO;AAAA,EAClD,MAAA,EAAQ,MAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAA,CAAS;AAC9B,CAAC,CAAA;AAGM,IAAM,gBAAA,EAAkB,MAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA;AAMnC,IAAM,kBAAA,EAAoB,MAAA,CAAE,KAAA,CAAM;AAAA,EACvC,uBAAA;AAAA,EACA,wBAAA;AAAA,EACA,2BAAA;AAAA,EACA;AACF,CAAC,CAAA;AAaM,IAAM,qBAAA,EAAuB,MAAA,CAAE,MAAA,CAAO;AAAA;AAAA,EAE3C,KAAA,EAAO,kBAAA;AAAA;AAAA,EAEP,SAAA,EAAW,MAAA,CAAE,MAAA,CAAO,CAAA;AAAA;AAAA,EAEpB,MAAA,EAAQ,MAAA,CAAE,MAAA,CAAO,CAAA;AAAA;AAAA,EAEjB,IAAA,EAAM,MAAA,CAAE,MAAA,CAAO,MAAA,CAAE,MAAA,CAAO,CAAA,EAAG,MAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAAA;AAAA,EAEtC,IAAA,EAAM,MAAA,CAAE,KAAA,CAAM,MAAA,CAAE,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS;AACrC,CAAC,CAAA;AAsCM,SAAS,sBAAA,CACd,OAAA,EACA,SAAA,EACA,MAAA,EACS;AACT,EAAA,MAAM,kBAAA,EAAoB,gBAAA,CACvB,UAAA,CAAW,QAAA,EAAU,MAAM,CAAA,CAC3B,MAAA,CAAO,OAAO,CAAA,CACd,MAAA,CAAO,KAAK,CAAA;AAIf,EAAA,GAAA,CAAI,SAAA,CAAU,OAAA,IAAW,iBAAA,CAAkB,MAAA,EAAQ;AACjD,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,OAAO,gBAAA,CAAO,eAAA;AAAA,IACZ,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,IACrB,MAAA,CAAO,IAAA,CAAK,iBAAiB;AAAA,EAC/B,CAAA;AACF;AA2BO,SAAS,mBAAA,CAAoB,IAAA,EAAkC;AACpE,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAAA,EAC1B,EAAA,UAAQ;AACN,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,eAAe,CAAA;AAAA,EACjD;AAEA,EAAA,MAAM,OAAA,EAAS,oBAAA,CAAqB,SAAA,CAAU,MAAM,CAAA;AACpD,EAAA,GAAA,CAAI,CAAC,MAAA,CAAO,OAAA,EAAS;AACnB,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,iBAAA,EAAoB,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,EAAA;AAC1E,EAAA;AAE6C,EAAA;AAC/C;ADzH6E;AACA;AACA;AACA;AACA;AACA","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-NBTRDLCM.js","sourcesContent":[null,"/**\n * Webhook verification utilities for Riverbank SDK\n *\n * Provides framework-agnostic webhook signature verification and payload parsing.\n */\n\nimport crypto from 'crypto';\nimport { z } from 'zod';\n\n// ============================================================================\n// Webhook Event Types\n// ============================================================================\n\n/**\n * Supported webhook event types.\n * Keep in sync with apps/dashboard/src/lib/db/helpers/webhooks.ts\n */\nexport const WebhookEventSchema = z.enum([\n 'page.published',\n 'entry.published',\n 'navigation.updated',\n 'theme.updated',\n 'site.settings_updated',\n]);\n\nexport type WebhookEvent = z.infer<typeof WebhookEventSchema>;\n\n// ============================================================================\n// Event-Specific Data Schemas\n// ============================================================================\n\n/** Data for page.published events */\nexport const PagePublishedDataSchema = z.object({\n pageId: z.string(),\n path: z.string(),\n slug: z.string().optional(),\n});\n\n/** Data for entry.published events */\nexport const EntryPublishedDataSchema = z.object({\n entryId: z.string(),\n path: z.string(),\n contentType: z.string(),\n});\n\n/** Data for navigation.updated events */\nexport const NavigationUpdatedDataSchema = z.object({\n menuId: z.string().optional(),\n});\n\n/** Data for theme.updated and site.settings_updated events (empty) */\nexport const EmptyDataSchema = z.object({});\n\n/**\n * Combined data schema that accepts any valid event data.\n * The actual shape depends on the event type.\n */\nexport const WebhookDataSchema = z.union([\n PagePublishedDataSchema,\n EntryPublishedDataSchema,\n NavigationUpdatedDataSchema,\n EmptyDataSchema,\n]);\n\nexport type PagePublishedData = z.infer<typeof PagePublishedDataSchema>;\nexport type EntryPublishedData = z.infer<typeof EntryPublishedDataSchema>;\nexport type NavigationUpdatedData = z.infer<typeof NavigationUpdatedDataSchema>;\n\n// ============================================================================\n// Webhook Payload Schema\n// ============================================================================\n\n/**\n * Zod schema for webhook payload validation.\n */\nexport const WebhookPayloadSchema = z.object({\n /** Event type */\n event: WebhookEventSchema,\n /** ISO timestamp of when the event occurred */\n timestamp: z.string(),\n /** Site ID that triggered the event */\n siteId: z.string(),\n /** Event-specific data (shape depends on event type) */\n data: z.record(z.string(), z.unknown()),\n /** Cache invalidation tags (for tag-based revalidation) */\n tags: z.array(z.string()).optional(),\n});\n\n/**\n * Webhook payload structure sent by the CMS.\n */\nexport type WebhookPayload = z.infer<typeof WebhookPayloadSchema>;\n\n/**\n * Type-safe webhook payload with discriminated data based on event type.\n */\nexport type TypedWebhookPayload =\n | { event: 'page.published'; data: PagePublishedData; siteId: string; timestamp: string; tags?: string[] }\n | { event: 'entry.published'; data: EntryPublishedData; siteId: string; timestamp: string; tags?: string[] }\n | { event: 'navigation.updated'; data: NavigationUpdatedData; siteId: string; timestamp: string; tags?: string[] }\n | { event: 'theme.updated'; data: Record<string, never>; siteId: string; timestamp: string; tags?: string[] }\n | { event: 'site.settings_updated'; data: Record<string, never>; siteId: string; timestamp: string; tags?: string[] };\n\n/**\n * Verify a webhook signature using HMAC-SHA256.\n *\n * Uses timing-safe comparison to prevent timing attacks.\n *\n * @param payload - The raw request body as a string\n * @param signature - The X-Riverbank-Signature header value\n * @param secret - The webhook signing secret (RIVERBANK_WEBHOOK_SECRET)\n * @returns true if signature is valid, false otherwise\n *\n * @example\n * ```ts\n * const body = await request.text();\n * const signature = request.headers.get('x-riverbank-signature');\n * const secret = process.env.RIVERBANK_WEBHOOK_SECRET;\n *\n * if (!verifyWebhookSignature(body, signature, secret)) {\n * return new Response('Invalid signature', { status: 401 });\n * }\n * ```\n */\nexport function verifyWebhookSignature(\n payload: string,\n signature: string,\n secret: string\n): boolean {\n const expectedSignature = crypto\n .createHmac('sha256', secret)\n .update(payload)\n .digest('hex');\n\n // Length check before timing-safe comparison\n // timingSafeEqual throws if lengths differ\n if (signature.length !== expectedSignature.length) {\n return false;\n }\n\n // Timing-safe comparison to prevent timing attacks\n return crypto.timingSafeEqual(\n Buffer.from(signature),\n Buffer.from(expectedSignature)\n );\n}\n\n/**\n * Result type for webhook payload parsing.\n */\nexport type ParseWebhookResult =\n | { success: true; payload: WebhookPayload }\n | { success: false; error: string };\n\n/**\n * Parse and validate a webhook payload from the request body.\n *\n * Uses Zod schema validation to ensure the payload has the expected structure.\n *\n * @param body - The raw request body as a string\n * @returns A result object with either the validated payload or an error message\n *\n * @example\n * ```ts\n * const body = await request.text();\n * const result = parseWebhookPayload(body);\n * if (!result.success) {\n * return new Response(result.error, { status: 400 });\n * }\n * console.log(`Received ${result.payload.event} for site ${result.payload.siteId}`);\n * ```\n */\nexport function parseWebhookPayload(body: string): ParseWebhookResult {\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n return { success: false, error: 'Invalid JSON' };\n }\n\n const result = WebhookPayloadSchema.safeParse(parsed);\n if (!result.success) {\n return { success: false, error: `Invalid payload: ${result.error.message}` };\n }\n\n return { success: true, payload: result.data };\n}\n"]}
@@ -0,0 +1,27 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __esm = (fn, res) => function __init() {
6
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
7
+ };
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ export {
23
+ __esm,
24
+ __export,
25
+ __toCommonJS
26
+ };
27
+ //# sourceMappingURL=chunk-NFEGQTCC.mjs.map