@riverbankcms/sdk 0.7.0 → 0.7.2

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 (151) hide show
  1. package/README.md +175 -0
  2. package/dist/cli/index.js +42 -95
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/cli/init-docs/content/agents-section.md +50 -0
  5. package/dist/cli/init-docs/content/cli-reference.md +574 -0
  6. package/dist/cli/init-docs/content/content-management.md +384 -0
  7. package/dist/cli/init-docs/content/context-brand.md +125 -0
  8. package/dist/cli/init-docs/content/context-brief.md +77 -0
  9. package/dist/cli/init-docs/content/context-knowledge.md +111 -0
  10. package/dist/cli/init-docs/content/getting-started.md +130 -0
  11. package/dist/cli/init-docs/content/site-workflows-readme.md +96 -0
  12. package/dist/cli/init-docs/content/workflow-add-block.md +228 -0
  13. package/dist/cli/init-docs/content/workflow-create-page.md +193 -0
  14. package/dist/cli/init-docs/content/workflow-publish.md +280 -0
  15. package/dist/client/client.d.mts +2 -2
  16. package/dist/client/client.d.ts +2 -2
  17. package/dist/client/client.js +536 -71
  18. package/dist/client/client.js.map +1 -1
  19. package/dist/client/client.mjs +536 -78
  20. package/dist/client/client.mjs.map +1 -1
  21. package/dist/client/hooks.d.mts +2 -2
  22. package/dist/client/hooks.d.ts +2 -2
  23. package/dist/client/usePage-C9tJpuKa.d.mts +6813 -0
  24. package/dist/client/usePage-Db9kzA41.d.ts +6813 -0
  25. package/dist/server/{Layout-wBtJLTVX.d.ts → Layout-Ce7PU9I5.d.ts} +1 -1
  26. package/dist/server/{Layout-B7cvis7r.d.mts → Layout-WllR8Zug.d.mts} +1 -1
  27. package/dist/server/{chunk-7FIJSGHU.mjs → chunk-5JT452F2.mjs} +537 -76
  28. package/dist/server/chunk-5JT452F2.mjs.map +1 -0
  29. package/dist/server/chunk-AET56TQX.mjs +45 -0
  30. package/dist/server/chunk-AET56TQX.mjs.map +1 -0
  31. package/dist/server/{chunk-P7UVAMK6.js → chunk-HMENX4Y7.js} +543 -82
  32. package/dist/server/chunk-HMENX4Y7.js.map +1 -0
  33. package/dist/server/chunk-LQUKXIW7.mjs +13 -0
  34. package/dist/server/chunk-LQUKXIW7.mjs.map +1 -0
  35. package/dist/server/chunk-VODFQMUW.js +45 -0
  36. package/dist/server/chunk-VODFQMUW.js.map +1 -0
  37. package/dist/server/chunk-WYNEYDXO.js +13 -0
  38. package/dist/server/chunk-WYNEYDXO.js.map +1 -0
  39. package/dist/server/{components-CICSJyp_.d.ts → components--LT61IKp.d.ts} +2 -2
  40. package/dist/server/{components-CMMwDXTW.d.mts → components-RPzRQve6.d.mts} +2 -2
  41. package/dist/server/components.d.mts +4 -4
  42. package/dist/server/components.d.ts +4 -4
  43. package/dist/server/components.js +0 -1
  44. package/dist/server/components.js.map +1 -1
  45. package/dist/server/components.mjs +0 -1
  46. package/dist/server/config-validation.js +0 -1
  47. package/dist/server/config-validation.js.map +1 -1
  48. package/dist/server/config-validation.mjs +0 -1
  49. package/dist/server/config.js +0 -1
  50. package/dist/server/config.js.map +1 -1
  51. package/dist/server/config.mjs +0 -1
  52. package/dist/server/config.mjs.map +1 -1
  53. package/dist/server/data.d.mts +1 -1
  54. package/dist/server/data.d.ts +1 -1
  55. package/dist/server/data.js +0 -1
  56. package/dist/server/data.js.map +1 -1
  57. package/dist/server/data.mjs +0 -1
  58. package/dist/server/env.d.mts +23 -0
  59. package/dist/server/env.d.ts +23 -0
  60. package/dist/server/env.js +7 -0
  61. package/dist/server/env.js.map +1 -0
  62. package/dist/server/env.mjs +7 -0
  63. package/dist/server/{index-DI_qlYx3.d.mts → index-BL66CU6d.d.mts} +2 -2
  64. package/dist/server/{index-Bucs6UqG.d.mts → index-Bkva0WAj.d.mts} +1 -1
  65. package/dist/server/{index-BTwWvSBu.d.ts → index-CJk9iQQW.d.ts} +2 -2
  66. package/dist/server/{index-Cp7tJuRt.d.ts → index-CSBWKA3r.d.ts} +1 -1
  67. package/dist/server/index.d.mts +3 -3
  68. package/dist/server/index.d.ts +3 -3
  69. package/dist/server/index.js +2 -3
  70. package/dist/server/index.js.map +1 -1
  71. package/dist/server/index.mjs +1 -2
  72. package/dist/server/index.mjs.map +1 -1
  73. package/dist/server/{loadContent-DmgpFcFC.d.ts → loadContent-CXUWMuzY.d.ts} +2 -2
  74. package/dist/server/{loadContent-C-YYUKQa.d.mts → loadContent-F_tAS0Nl.d.mts} +2 -2
  75. package/dist/server/{loadPage-IDGVDFBB.js → loadPage-6I7F6GRF.js} +1 -2
  76. package/dist/server/loadPage-6I7F6GRF.js.map +1 -0
  77. package/dist/server/{loadPage-B8mQUUSo.d.mts → loadPage-CxlYLe5K.d.mts} +1 -1
  78. package/dist/server/{loadPage-DNQTTRHL.mjs → loadPage-JI2SML4M.mjs} +1 -2
  79. package/dist/server/{loadPage-DP3nrHBi.d.ts → loadPage-i2r-X5b9.d.ts} +1 -1
  80. package/dist/server/metadata.d.mts +3 -3
  81. package/dist/server/metadata.d.ts +3 -3
  82. package/dist/server/metadata.js +0 -1
  83. package/dist/server/metadata.js.map +1 -1
  84. package/dist/server/metadata.mjs +0 -1
  85. package/dist/server/navigation.js +0 -1
  86. package/dist/server/navigation.js.map +1 -1
  87. package/dist/server/navigation.mjs +0 -1
  88. package/dist/server/next/revalidate.d.mts +66 -0
  89. package/dist/server/next/revalidate.d.ts +66 -0
  90. package/dist/server/next/revalidate.js +59 -0
  91. package/dist/server/next/revalidate.js.map +1 -0
  92. package/dist/server/next/revalidate.mjs +59 -0
  93. package/dist/server/next/revalidate.mjs.map +1 -0
  94. package/dist/server/next/tags.d.mts +78 -0
  95. package/dist/server/next/tags.d.ts +78 -0
  96. package/dist/server/next/tags.js +34 -0
  97. package/dist/server/next/tags.js.map +1 -0
  98. package/dist/server/next/tags.mjs +34 -0
  99. package/dist/server/next/tags.mjs.map +1 -0
  100. package/dist/server/next.d.mts +163 -5
  101. package/dist/server/next.d.ts +163 -5
  102. package/dist/server/next.js +78 -11
  103. package/dist/server/next.js.map +1 -1
  104. package/dist/server/next.mjs +75 -8
  105. package/dist/server/next.mjs.map +1 -1
  106. package/dist/server/rendering/server.d.mts +3 -3
  107. package/dist/server/rendering/server.d.ts +3 -3
  108. package/dist/server/rendering/server.js +0 -1
  109. package/dist/server/rendering/server.js.map +1 -1
  110. package/dist/server/rendering/server.mjs +0 -1
  111. package/dist/server/rendering.d.mts +6 -6
  112. package/dist/server/rendering.d.ts +6 -6
  113. package/dist/server/rendering.js +2 -3
  114. package/dist/server/rendering.js.map +1 -1
  115. package/dist/server/rendering.mjs +3 -4
  116. package/dist/server/routing.d.mts +2 -2
  117. package/dist/server/routing.d.ts +2 -2
  118. package/dist/server/routing.js +2 -4
  119. package/dist/server/routing.js.map +1 -1
  120. package/dist/server/routing.mjs +1 -3
  121. package/dist/server/routing.mjs.map +1 -1
  122. package/dist/server/server.d.mts +4 -4
  123. package/dist/server/server.d.ts +4 -4
  124. package/dist/server/server.js +4 -5
  125. package/dist/server/server.js.map +1 -1
  126. package/dist/server/server.mjs +4 -5
  127. package/dist/server/theme-bridge.js +0 -1
  128. package/dist/server/theme-bridge.js.map +1 -1
  129. package/dist/server/theme-bridge.mjs +0 -1
  130. package/dist/server/theme-bridge.mjs.map +1 -1
  131. package/dist/server/theme.js +1 -3
  132. package/dist/server/theme.js.map +1 -1
  133. package/dist/server/theme.mjs +0 -2
  134. package/dist/server/theme.mjs.map +1 -1
  135. package/dist/server/{types-BvcJU7zk.d.ts → types-DnkRh0UL.d.ts} +118 -9
  136. package/dist/server/{types-1cLz0vnq.d.mts → types-MF2AWoKv.d.mts} +118 -9
  137. package/dist/server/webhooks.d.mts +75 -0
  138. package/dist/server/webhooks.d.ts +75 -0
  139. package/dist/server/webhooks.js +11 -0
  140. package/dist/server/webhooks.js.map +1 -0
  141. package/dist/server/webhooks.mjs +11 -0
  142. package/dist/server/webhooks.mjs.map +1 -0
  143. package/package.json +23 -3
  144. package/dist/server/chunk-7FIJSGHU.mjs.map +0 -1
  145. package/dist/server/chunk-BJTO5JO5.mjs +0 -11
  146. package/dist/server/chunk-DGUM43GV.js +0 -11
  147. package/dist/server/chunk-DGUM43GV.js.map +0 -1
  148. package/dist/server/chunk-P7UVAMK6.js.map +0 -1
  149. package/dist/server/loadPage-IDGVDFBB.js.map +0 -1
  150. /package/dist/server/{chunk-BJTO5JO5.mjs.map → env.mjs.map} +0 -0
  151. /package/dist/server/{loadPage-DNQTTRHL.mjs.map → loadPage-JI2SML4M.mjs.map} +0 -0
@@ -1,4 +1,4 @@
1
- import { R as RiverbankClient, S as SiteResponse } from './types-BvcJU7zk.js';
1
+ import { R as RiverbankClient, S as SiteResponse } from './types-DnkRh0UL.js';
2
2
  import * as react_jsx_runtime from 'react/jsx-runtime';
3
3
  import * as React$1 from 'react';
4
4
  import React__default from 'react';
@@ -1,6 +1,6 @@
1
- export { P as PageMetadataInput, g as generatePageMetadata, a as generatePreviewMetadata } from './index-DI_qlYx3.mjs';
2
- import './loadPage-B8mQUUSo.mjs';
3
- import './types-1cLz0vnq.mjs';
1
+ export { P as PageMetadataInput, g as generatePageMetadata, a as generatePreviewMetadata } from './index-BL66CU6d.mjs';
2
+ import './loadPage-CxlYLe5K.mjs';
3
+ import './types-MF2AWoKv.mjs';
4
4
  import './types-Dsu9wsUh.mjs';
5
5
  import '@riverbankcms/ai';
6
6
  import './schema-Z6-afHJG.mjs';
@@ -1,6 +1,6 @@
1
- export { P as PageMetadataInput, g as generatePageMetadata, a as generatePreviewMetadata } from './index-BTwWvSBu.js';
2
- import './loadPage-DP3nrHBi.js';
3
- import './types-BvcJU7zk.js';
1
+ export { P as PageMetadataInput, g as generatePageMetadata, a as generatePreviewMetadata } from './index-CJk9iQQW.js';
2
+ import './loadPage-i2r-X5b9.js';
3
+ import './types-DnkRh0UL.js';
4
4
  import './types-CVykEqXN.js';
5
5
  import '@riverbankcms/ai';
6
6
  import './schema-Z6-afHJG.js';
@@ -2,7 +2,6 @@
2
2
 
3
3
 
4
4
  var _chunkBNQV3PXPjs = require('./chunk-BNQV3PXP.js');
5
- require('./chunk-DGUM43GV.js');
6
5
 
7
6
 
8
7
 
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/metadata.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACA;AACF,iJAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/metadata.js"}
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/metadata.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,sDAA4B;AAC5B;AACE;AACA;AACF,iJAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/metadata.js"}
@@ -2,7 +2,6 @@ import {
2
2
  generatePageMetadata,
3
3
  generatePreviewMetadata
4
4
  } from "./chunk-SWYWZT3L.mjs";
5
- import "./chunk-BJTO5JO5.mjs";
6
5
  export {
7
6
  generatePageMetadata,
8
7
  generatePreviewMetadata
@@ -13,7 +13,6 @@
13
13
 
14
14
 
15
15
  var _chunkEIVISR62js = require('./chunk-EIVISR62.js');
16
- require('./chunk-DGUM43GV.js');
17
16
 
18
17
 
19
18
 
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/navigation.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,mxBAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/navigation.js"}
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/navigation.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,mxBAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/navigation.js"}
@@ -13,7 +13,6 @@ import {
13
13
  isNavLink,
14
14
  transformToNavItems
15
15
  } from "./chunk-YXA4GAAQ.mjs";
16
- import "./chunk-BJTO5JO5.mjs";
17
16
  export {
18
17
  buildLogo,
19
18
  buildLogoViewModel,
@@ -0,0 +1,66 @@
1
+ import { WebhookPayload } from '../webhooks.mjs';
2
+ import 'zod';
3
+
4
+ /**
5
+ * Next.js revalidation handler for webhook-based cache invalidation
6
+ *
7
+ * This module provides a pre-built API route handler for processing
8
+ * CMS webhooks and revalidating Next.js cache entries.
9
+ *
10
+ * @example One-line setup in consumer site
11
+ * ```ts
12
+ * // app/api/revalidate/route.ts
13
+ * import { createRevalidateHandler } from '@riverbankcms/sdk/next/revalidate';
14
+ * export const POST = createRevalidateHandler();
15
+ * ```
16
+ *
17
+ * @example With custom options
18
+ * ```ts
19
+ * // app/api/revalidate/route.ts
20
+ * import { createRevalidateHandler } from '@riverbankcms/sdk/next/revalidate';
21
+ *
22
+ * export const POST = createRevalidateHandler({
23
+ * onRevalidate: (payload, items) => {
24
+ * console.log(`Revalidated ${items.length} items for ${payload.event}`);
25
+ * },
26
+ * });
27
+ * ```
28
+ */
29
+
30
+ /**
31
+ * Options for the revalidation handler.
32
+ */
33
+ interface RevalidateHandlerOptions {
34
+ /**
35
+ * Override the webhook secret. Defaults to RIVERBANK_WEBHOOK_SECRET env var.
36
+ */
37
+ secret?: string;
38
+ /**
39
+ * Callback called after successful revalidation.
40
+ * Useful for logging or analytics.
41
+ */
42
+ onRevalidate?: (payload: WebhookPayload, revalidatedItems: string[]) => void;
43
+ }
44
+ /**
45
+ * Create a Next.js API route handler for webhook revalidation.
46
+ *
47
+ * The handler:
48
+ * 1. Verifies the webhook signature using HMAC-SHA256
49
+ * 2. Calls `revalidateTag()` for each tag in the payload
50
+ * 3. Calls `revalidatePath()` if a path is included in the data
51
+ * 4. Returns a JSON response with the revalidation results
52
+ *
53
+ * @param options - Configuration options
54
+ * @returns A Next.js Route Handler function
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * // app/api/revalidate/route.ts
59
+ * import { createRevalidateHandler } from '@riverbankcms/sdk/next/revalidate';
60
+ *
61
+ * export const POST = createRevalidateHandler();
62
+ * ```
63
+ */
64
+ declare function createRevalidateHandler(options?: RevalidateHandlerOptions): (request: Request) => Promise<Response>;
65
+
66
+ export { type RevalidateHandlerOptions, createRevalidateHandler };
@@ -0,0 +1,66 @@
1
+ import { WebhookPayload } from '../webhooks.js';
2
+ import 'zod';
3
+
4
+ /**
5
+ * Next.js revalidation handler for webhook-based cache invalidation
6
+ *
7
+ * This module provides a pre-built API route handler for processing
8
+ * CMS webhooks and revalidating Next.js cache entries.
9
+ *
10
+ * @example One-line setup in consumer site
11
+ * ```ts
12
+ * // app/api/revalidate/route.ts
13
+ * import { createRevalidateHandler } from '@riverbankcms/sdk/next/revalidate';
14
+ * export const POST = createRevalidateHandler();
15
+ * ```
16
+ *
17
+ * @example With custom options
18
+ * ```ts
19
+ * // app/api/revalidate/route.ts
20
+ * import { createRevalidateHandler } from '@riverbankcms/sdk/next/revalidate';
21
+ *
22
+ * export const POST = createRevalidateHandler({
23
+ * onRevalidate: (payload, items) => {
24
+ * console.log(`Revalidated ${items.length} items for ${payload.event}`);
25
+ * },
26
+ * });
27
+ * ```
28
+ */
29
+
30
+ /**
31
+ * Options for the revalidation handler.
32
+ */
33
+ interface RevalidateHandlerOptions {
34
+ /**
35
+ * Override the webhook secret. Defaults to RIVERBANK_WEBHOOK_SECRET env var.
36
+ */
37
+ secret?: string;
38
+ /**
39
+ * Callback called after successful revalidation.
40
+ * Useful for logging or analytics.
41
+ */
42
+ onRevalidate?: (payload: WebhookPayload, revalidatedItems: string[]) => void;
43
+ }
44
+ /**
45
+ * Create a Next.js API route handler for webhook revalidation.
46
+ *
47
+ * The handler:
48
+ * 1. Verifies the webhook signature using HMAC-SHA256
49
+ * 2. Calls `revalidateTag()` for each tag in the payload
50
+ * 3. Calls `revalidatePath()` if a path is included in the data
51
+ * 4. Returns a JSON response with the revalidation results
52
+ *
53
+ * @param options - Configuration options
54
+ * @returns A Next.js Route Handler function
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * // app/api/revalidate/route.ts
59
+ * import { createRevalidateHandler } from '@riverbankcms/sdk/next/revalidate';
60
+ *
61
+ * export const POST = createRevalidateHandler();
62
+ * ```
63
+ */
64
+ declare function createRevalidateHandler(options?: RevalidateHandlerOptions): (request: Request) => Promise<Response>;
65
+
66
+ export { type RevalidateHandlerOptions, createRevalidateHandler };
@@ -0,0 +1,59 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } 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; }
2
+
3
+
4
+ var _chunkVODFQMUWjs = require('../chunk-VODFQMUW.js');
5
+
6
+ // src/next/revalidate.ts
7
+ var _cache = require('next/cache');
8
+ function createRevalidateHandler(options = {}) {
9
+ return async function handleRevalidateRequest(request) {
10
+ const secret = _nullishCoalesce(options.secret, () => ( process.env.RIVERBANK_WEBHOOK_SECRET));
11
+ if (!secret) {
12
+ console.error("[Riverbank] RIVERBANK_WEBHOOK_SECRET not configured");
13
+ return Response.json(
14
+ { error: "Webhook secret not configured" },
15
+ { status: 500 }
16
+ );
17
+ }
18
+ const body = await request.text();
19
+ const signature = request.headers.get("x-riverbank-signature");
20
+ if (!signature || !_chunkVODFQMUWjs.verifyWebhookSignature.call(void 0, body, signature, secret)) {
21
+ return Response.json({ error: "Invalid signature" }, { status: 401 });
22
+ }
23
+ const parseResult = _chunkVODFQMUWjs.parseWebhookPayload.call(void 0, body);
24
+ if (!parseResult.success) {
25
+ return Response.json({ error: parseResult.error }, { status: 400 });
26
+ }
27
+ const payload = parseResult.payload;
28
+ const revalidated = [];
29
+ if (_optionalChain([payload, 'access', _ => _.tags, 'optionalAccess', _2 => _2.length])) {
30
+ for (const tag of payload.tags) {
31
+ _cache.revalidateTag.call(void 0, tag);
32
+ revalidated.push(`tag:${tag}`);
33
+ }
34
+ }
35
+ const path = _optionalChain([payload, 'access', _3 => _3.data, 'optionalAccess', _4 => _4.path]);
36
+ if (path) {
37
+ _cache.revalidatePath.call(void 0, path);
38
+ revalidated.push(`path:${path}`);
39
+ }
40
+ if (revalidated.length > 0) {
41
+ console.log(
42
+ `[Riverbank] Revalidated: ${revalidated.join(", ")} (event: ${payload.event})`
43
+ );
44
+ }
45
+ if (options.onRevalidate) {
46
+ options.onRevalidate(payload, revalidated);
47
+ }
48
+ return Response.json({
49
+ revalidated: true,
50
+ items: revalidated,
51
+ event: payload.event,
52
+ timestamp: Date.now()
53
+ });
54
+ };
55
+ }
56
+
57
+
58
+ exports.createRevalidateHandler = createRevalidateHandler;
59
+ //# sourceMappingURL=revalidate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/next/revalidate.js","../../../src/next/revalidate.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,uDAA6B;AAC7B;AACA;ACqBA,mCAA8C;AA2CvC,SAAS,uBAAA,CACd,QAAA,EAAoC,CAAC,CAAA,EACI;AACzC,EAAA,OAAO,MAAA,SAAe,uBAAA,CAAwB,OAAA,EAAqC;AAEjF,IAAA,MAAM,OAAA,mBAAS,OAAA,CAAQ,MAAA,UAAU,OAAA,CAAQ,GAAA,CAAI,0BAAA;AAE7C,IAAA,GAAA,CAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAA,CAAQ,KAAA,CAAM,qDAAqD,CAAA;AACnE,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,QACd,EAAE,KAAA,EAAO,gCAAgC,CAAA;AAAA,QACzC,EAAE,MAAA,EAAQ,IAAI;AAAA,MAChB,CAAA;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,EAAO,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAA;AAChC,IAAA,MAAM,UAAA,EAAY,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,uBAAuB,CAAA;AAG7D,IAAA,GAAA,CAAI,CAAC,UAAA,GAAa,CAAC,qDAAA,IAAuB,EAAM,SAAA,EAAW,MAAM,CAAA,EAAG;AAClE,MAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,oBAAoB,CAAA,EAAG,EAAE,MAAA,EAAQ,IAAI,CAAC,CAAA;AAAA,IACtE;AAGA,IAAA,MAAM,YAAA,EAAc,kDAAA,IAAwB,CAAA;AAC5C,IAAA,GAAA,CAAI,CAAC,WAAA,CAAY,OAAA,EAAS;AACxB,MAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,CAAY,MAAM,CAAA,EAAG,EAAE,MAAA,EAAQ,IAAI,CAAC,CAAA;AAAA,IACpE;AACA,IAAA,MAAM,QAAA,EAAU,WAAA,CAAY,OAAA;AAC5B,IAAA,MAAM,YAAA,EAAwB,CAAC,CAAA;AAG/B,IAAA,GAAA,iBAAI,OAAA,mBAAQ,IAAA,6BAAM,QAAA,EAAQ;AACxB,MAAA,IAAA,CAAA,MAAW,IAAA,GAAO,OAAA,CAAQ,IAAA,EAAM;AAC9B,QAAA,kCAAA,GAAiB,CAAA;AACjB,QAAA,WAAA,CAAY,IAAA,CAAK,CAAA,IAAA,EAAO,GAAG,CAAA,CAAA;AAC7B,MAAA;AACF,IAAA;AAG2B,IAAA;AACjB,IAAA;AACW,MAAA;AACU,MAAA;AAC/B,IAAA;AAG4B,IAAA;AAClB,MAAA;AACsB,QAAA;AAC9B,MAAA;AACF,IAAA;AAG0B,IAAA;AACM,MAAA;AAChC,IAAA;AAEqB,IAAA;AACN,MAAA;AACN,MAAA;AACQ,MAAA;AACK,MAAA;AACrB,IAAA;AACH,EAAA;AACF;ADhFoC;AACA;AACA","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/next/revalidate.js","sourcesContent":[null,"/**\n * Next.js revalidation handler for webhook-based cache invalidation\n *\n * This module provides a pre-built API route handler for processing\n * CMS webhooks and revalidating Next.js cache entries.\n *\n * @example One-line setup in consumer site\n * ```ts\n * // app/api/revalidate/route.ts\n * import { createRevalidateHandler } from '@riverbankcms/sdk/next/revalidate';\n * export const POST = createRevalidateHandler();\n * ```\n *\n * @example With custom options\n * ```ts\n * // app/api/revalidate/route.ts\n * import { createRevalidateHandler } from '@riverbankcms/sdk/next/revalidate';\n *\n * export const POST = createRevalidateHandler({\n * onRevalidate: (payload, items) => {\n * console.log(`Revalidated ${items.length} items for ${payload.event}`);\n * },\n * });\n * ```\n */\n\nimport { revalidateTag, revalidatePath } from 'next/cache';\nimport {\n verifyWebhookSignature,\n parseWebhookPayload,\n type WebhookPayload,\n} from '../webhooks/verify';\n\n/**\n * Options for the revalidation handler.\n */\nexport interface RevalidateHandlerOptions {\n /**\n * Override the webhook secret. Defaults to RIVERBANK_WEBHOOK_SECRET env var.\n */\n secret?: string;\n\n /**\n * Callback called after successful revalidation.\n * Useful for logging or analytics.\n */\n onRevalidate?: (payload: WebhookPayload, revalidatedItems: string[]) => void;\n}\n\n/**\n * Create a Next.js API route handler for webhook revalidation.\n *\n * The handler:\n * 1. Verifies the webhook signature using HMAC-SHA256\n * 2. Calls `revalidateTag()` for each tag in the payload\n * 3. Calls `revalidatePath()` if a path is included in the data\n * 4. Returns a JSON response with the revalidation results\n *\n * @param options - Configuration options\n * @returns A Next.js Route Handler function\n *\n * @example\n * ```ts\n * // app/api/revalidate/route.ts\n * import { createRevalidateHandler } from '@riverbankcms/sdk/next/revalidate';\n *\n * export const POST = createRevalidateHandler();\n * ```\n */\nexport function createRevalidateHandler(\n options: RevalidateHandlerOptions = {}\n): (request: Request) => Promise<Response> {\n return async function handleRevalidateRequest(request: Request): Promise<Response> {\n // Get webhook secret\n const secret = options.secret ?? process.env.RIVERBANK_WEBHOOK_SECRET;\n\n if (!secret) {\n console.error('[Riverbank] RIVERBANK_WEBHOOK_SECRET not configured');\n return Response.json(\n { error: 'Webhook secret not configured' },\n { status: 500 }\n );\n }\n\n // Read request body\n const body = await request.text();\n const signature = request.headers.get('x-riverbank-signature');\n\n // Verify signature\n if (!signature || !verifyWebhookSignature(body, signature, secret)) {\n return Response.json({ error: 'Invalid signature' }, { status: 401 });\n }\n\n // Parse and validate payload\n const parseResult = parseWebhookPayload(body);\n if (!parseResult.success) {\n return Response.json({ error: parseResult.error }, { status: 400 });\n }\n const payload = parseResult.payload;\n const revalidated: string[] = [];\n\n // Tag-based revalidation (preferred)\n if (payload.tags?.length) {\n for (const tag of payload.tags) {\n revalidateTag(tag);\n revalidated.push(`tag:${tag}`);\n }\n }\n\n // Path-based fallback (from data.path if present)\n const path = payload.data?.path as string | undefined;\n if (path) {\n revalidatePath(path);\n revalidated.push(`path:${path}`);\n }\n\n // Log revalidation\n if (revalidated.length > 0) {\n console.log(\n `[Riverbank] Revalidated: ${revalidated.join(', ')} (event: ${payload.event})`\n );\n }\n\n // Call optional callback\n if (options.onRevalidate) {\n options.onRevalidate(payload, revalidated);\n }\n\n return Response.json({\n revalidated: true,\n items: revalidated,\n event: payload.event,\n timestamp: Date.now(),\n });\n };\n}\n"]}
@@ -0,0 +1,59 @@
1
+ import {
2
+ parseWebhookPayload,
3
+ verifyWebhookSignature
4
+ } from "../chunk-AET56TQX.mjs";
5
+
6
+ // src/next/revalidate.ts
7
+ import { revalidateTag, revalidatePath } from "next/cache";
8
+ function createRevalidateHandler(options = {}) {
9
+ return async function handleRevalidateRequest(request) {
10
+ const secret = options.secret ?? process.env.RIVERBANK_WEBHOOK_SECRET;
11
+ if (!secret) {
12
+ console.error("[Riverbank] RIVERBANK_WEBHOOK_SECRET not configured");
13
+ return Response.json(
14
+ { error: "Webhook secret not configured" },
15
+ { status: 500 }
16
+ );
17
+ }
18
+ const body = await request.text();
19
+ const signature = request.headers.get("x-riverbank-signature");
20
+ if (!signature || !verifyWebhookSignature(body, signature, secret)) {
21
+ return Response.json({ error: "Invalid signature" }, { status: 401 });
22
+ }
23
+ const parseResult = parseWebhookPayload(body);
24
+ if (!parseResult.success) {
25
+ return Response.json({ error: parseResult.error }, { status: 400 });
26
+ }
27
+ const payload = parseResult.payload;
28
+ const revalidated = [];
29
+ if (payload.tags?.length) {
30
+ for (const tag of payload.tags) {
31
+ revalidateTag(tag);
32
+ revalidated.push(`tag:${tag}`);
33
+ }
34
+ }
35
+ const path = payload.data?.path;
36
+ if (path) {
37
+ revalidatePath(path);
38
+ revalidated.push(`path:${path}`);
39
+ }
40
+ if (revalidated.length > 0) {
41
+ console.log(
42
+ `[Riverbank] Revalidated: ${revalidated.join(", ")} (event: ${payload.event})`
43
+ );
44
+ }
45
+ if (options.onRevalidate) {
46
+ options.onRevalidate(payload, revalidated);
47
+ }
48
+ return Response.json({
49
+ revalidated: true,
50
+ items: revalidated,
51
+ event: payload.event,
52
+ timestamp: Date.now()
53
+ });
54
+ };
55
+ }
56
+ export {
57
+ createRevalidateHandler
58
+ };
59
+ //# sourceMappingURL=revalidate.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/next/revalidate.ts"],"sourcesContent":["/**\n * Next.js revalidation handler for webhook-based cache invalidation\n *\n * This module provides a pre-built API route handler for processing\n * CMS webhooks and revalidating Next.js cache entries.\n *\n * @example One-line setup in consumer site\n * ```ts\n * // app/api/revalidate/route.ts\n * import { createRevalidateHandler } from '@riverbankcms/sdk/next/revalidate';\n * export const POST = createRevalidateHandler();\n * ```\n *\n * @example With custom options\n * ```ts\n * // app/api/revalidate/route.ts\n * import { createRevalidateHandler } from '@riverbankcms/sdk/next/revalidate';\n *\n * export const POST = createRevalidateHandler({\n * onRevalidate: (payload, items) => {\n * console.log(`Revalidated ${items.length} items for ${payload.event}`);\n * },\n * });\n * ```\n */\n\nimport { revalidateTag, revalidatePath } from 'next/cache';\nimport {\n verifyWebhookSignature,\n parseWebhookPayload,\n type WebhookPayload,\n} from '../webhooks/verify';\n\n/**\n * Options for the revalidation handler.\n */\nexport interface RevalidateHandlerOptions {\n /**\n * Override the webhook secret. Defaults to RIVERBANK_WEBHOOK_SECRET env var.\n */\n secret?: string;\n\n /**\n * Callback called after successful revalidation.\n * Useful for logging or analytics.\n */\n onRevalidate?: (payload: WebhookPayload, revalidatedItems: string[]) => void;\n}\n\n/**\n * Create a Next.js API route handler for webhook revalidation.\n *\n * The handler:\n * 1. Verifies the webhook signature using HMAC-SHA256\n * 2. Calls `revalidateTag()` for each tag in the payload\n * 3. Calls `revalidatePath()` if a path is included in the data\n * 4. Returns a JSON response with the revalidation results\n *\n * @param options - Configuration options\n * @returns A Next.js Route Handler function\n *\n * @example\n * ```ts\n * // app/api/revalidate/route.ts\n * import { createRevalidateHandler } from '@riverbankcms/sdk/next/revalidate';\n *\n * export const POST = createRevalidateHandler();\n * ```\n */\nexport function createRevalidateHandler(\n options: RevalidateHandlerOptions = {}\n): (request: Request) => Promise<Response> {\n return async function handleRevalidateRequest(request: Request): Promise<Response> {\n // Get webhook secret\n const secret = options.secret ?? process.env.RIVERBANK_WEBHOOK_SECRET;\n\n if (!secret) {\n console.error('[Riverbank] RIVERBANK_WEBHOOK_SECRET not configured');\n return Response.json(\n { error: 'Webhook secret not configured' },\n { status: 500 }\n );\n }\n\n // Read request body\n const body = await request.text();\n const signature = request.headers.get('x-riverbank-signature');\n\n // Verify signature\n if (!signature || !verifyWebhookSignature(body, signature, secret)) {\n return Response.json({ error: 'Invalid signature' }, { status: 401 });\n }\n\n // Parse and validate payload\n const parseResult = parseWebhookPayload(body);\n if (!parseResult.success) {\n return Response.json({ error: parseResult.error }, { status: 400 });\n }\n const payload = parseResult.payload;\n const revalidated: string[] = [];\n\n // Tag-based revalidation (preferred)\n if (payload.tags?.length) {\n for (const tag of payload.tags) {\n revalidateTag(tag);\n revalidated.push(`tag:${tag}`);\n }\n }\n\n // Path-based fallback (from data.path if present)\n const path = payload.data?.path as string | undefined;\n if (path) {\n revalidatePath(path);\n revalidated.push(`path:${path}`);\n }\n\n // Log revalidation\n if (revalidated.length > 0) {\n console.log(\n `[Riverbank] Revalidated: ${revalidated.join(', ')} (event: ${payload.event})`\n );\n }\n\n // Call optional callback\n if (options.onRevalidate) {\n options.onRevalidate(payload, revalidated);\n }\n\n return Response.json({\n revalidated: true,\n items: revalidated,\n event: payload.event,\n timestamp: Date.now(),\n });\n };\n}\n"],"mappings":";;;;;;AA0BA,SAAS,eAAe,sBAAsB;AA2CvC,SAAS,wBACd,UAAoC,CAAC,GACI;AACzC,SAAO,eAAe,wBAAwB,SAAqC;AAEjF,UAAM,SAAS,QAAQ,UAAU,QAAQ,IAAI;AAE7C,QAAI,CAAC,QAAQ;AACX,cAAQ,MAAM,qDAAqD;AACnE,aAAO,SAAS;AAAA,QACd,EAAE,OAAO,gCAAgC;AAAA,QACzC,EAAE,QAAQ,IAAI;AAAA,MAChB;AAAA,IACF;AAGA,UAAM,OAAO,MAAM,QAAQ,KAAK;AAChC,UAAM,YAAY,QAAQ,QAAQ,IAAI,uBAAuB;AAG7D,QAAI,CAAC,aAAa,CAAC,uBAAuB,MAAM,WAAW,MAAM,GAAG;AAClE,aAAO,SAAS,KAAK,EAAE,OAAO,oBAAoB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,IACtE;AAGA,UAAM,cAAc,oBAAoB,IAAI;AAC5C,QAAI,CAAC,YAAY,SAAS;AACxB,aAAO,SAAS,KAAK,EAAE,OAAO,YAAY,MAAM,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,IACpE;AACA,UAAM,UAAU,YAAY;AAC5B,UAAM,cAAwB,CAAC;AAG/B,QAAI,QAAQ,MAAM,QAAQ;AACxB,iBAAW,OAAO,QAAQ,MAAM;AAC9B,sBAAc,GAAG;AACjB,oBAAY,KAAK,OAAO,GAAG,EAAE;AAAA,MAC/B;AAAA,IACF;AAGA,UAAM,OAAO,QAAQ,MAAM;AAC3B,QAAI,MAAM;AACR,qBAAe,IAAI;AACnB,kBAAY,KAAK,QAAQ,IAAI,EAAE;AAAA,IACjC;AAGA,QAAI,YAAY,SAAS,GAAG;AAC1B,cAAQ;AAAA,QACN,4BAA4B,YAAY,KAAK,IAAI,CAAC,YAAY,QAAQ,KAAK;AAAA,MAC7E;AAAA,IACF;AAGA,QAAI,QAAQ,cAAc;AACxB,cAAQ,aAAa,SAAS,WAAW;AAAA,IAC3C;AAEA,WAAO,SAAS,KAAK;AAAA,MACnB,aAAa;AAAA,MACb,OAAO;AAAA,MACP,OAAO,QAAQ;AAAA,MACf,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Tag generation helpers for Next.js cache invalidation
3
+ *
4
+ * These helpers generate consistent cache tags for use with Next.js
5
+ * `unstable_cache` and `revalidateTag` APIs.
6
+ *
7
+ * Tag naming convention:
8
+ * - `riverbank` - Global tag that invalidates ALL Riverbank data
9
+ * - `riverbank:<resource>` - Collection tag (e.g., `riverbank:pages`)
10
+ * - `riverbank:<resource>:<id>` - Specific resource tag (e.g., `riverbank:page:page-123`)
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * // Consumer site: lib/cms-fetchers.ts
15
+ * import { unstable_cache } from 'next/cache';
16
+ * import { loadPage } from '@riverbankcms/sdk';
17
+ * import { getPageTags } from '@riverbankcms/sdk/next/tags';
18
+ *
19
+ * export const getCachedPage = unstable_cache(
20
+ * async (path: string) => loadPage({ client, siteId, path }),
21
+ * ['riverbank-page'],
22
+ * { tags: getPageTags(), revalidate: 300 }
23
+ * );
24
+ * ```
25
+ */
26
+ /**
27
+ * Global tag that invalidates ALL Riverbank data.
28
+ * Revalidating this tag will refresh everything.
29
+ */
30
+ declare const RIVERBANK_GLOBAL_TAG = "riverbank";
31
+ /**
32
+ * Generate tags for site-level data (settings, theme).
33
+ *
34
+ * @returns Array of tags: ['riverbank', 'riverbank:site']
35
+ */
36
+ declare function getSiteTags(): string[];
37
+ /**
38
+ * Generate tags for page data.
39
+ *
40
+ * @param pageId - Optional specific page ID to include
41
+ * @returns Array of tags including global, pages collection, and optionally page-specific
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * getPageTags() // ['riverbank', 'riverbank:pages']
46
+ * getPageTags('page-123') // ['riverbank', 'riverbank:pages', 'riverbank:page:page-123']
47
+ * ```
48
+ */
49
+ declare function getPageTags(pageId?: string): string[];
50
+ /**
51
+ * Generate tags for content entries.
52
+ *
53
+ * @param contentTypeSlug - The content type slug (e.g., 'blog-post', 'event')
54
+ * @param entryId - Optional specific entry ID to include
55
+ * @returns Array of tags including global, content-type, and optionally entry-specific
56
+ *
57
+ * @example
58
+ * ```ts
59
+ * getEntryTags('blog-post') // ['riverbank', 'riverbank:content-type:blog-post']
60
+ * getEntryTags('blog-post', 'entry-456') // ['riverbank', 'riverbank:content-type:blog-post', 'riverbank:entry:entry-456']
61
+ * ```
62
+ */
63
+ declare function getEntryTags(contentTypeSlug: string, entryId?: string): string[];
64
+ /**
65
+ * Generate tags for navigation menus.
66
+ *
67
+ * @param menuKey - Optional specific menu key to include
68
+ * @returns Array of tags including global, navigation collection, and optionally menu-specific
69
+ *
70
+ * @example
71
+ * ```ts
72
+ * getNavigationTags() // ['riverbank', 'riverbank:navigation']
73
+ * getNavigationTags('main') // ['riverbank', 'riverbank:navigation', 'riverbank:navigation:main']
74
+ * ```
75
+ */
76
+ declare function getNavigationTags(menuKey?: string): string[];
77
+
78
+ export { RIVERBANK_GLOBAL_TAG, getEntryTags, getNavigationTags, getPageTags, getSiteTags };
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Tag generation helpers for Next.js cache invalidation
3
+ *
4
+ * These helpers generate consistent cache tags for use with Next.js
5
+ * `unstable_cache` and `revalidateTag` APIs.
6
+ *
7
+ * Tag naming convention:
8
+ * - `riverbank` - Global tag that invalidates ALL Riverbank data
9
+ * - `riverbank:<resource>` - Collection tag (e.g., `riverbank:pages`)
10
+ * - `riverbank:<resource>:<id>` - Specific resource tag (e.g., `riverbank:page:page-123`)
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * // Consumer site: lib/cms-fetchers.ts
15
+ * import { unstable_cache } from 'next/cache';
16
+ * import { loadPage } from '@riverbankcms/sdk';
17
+ * import { getPageTags } from '@riverbankcms/sdk/next/tags';
18
+ *
19
+ * export const getCachedPage = unstable_cache(
20
+ * async (path: string) => loadPage({ client, siteId, path }),
21
+ * ['riverbank-page'],
22
+ * { tags: getPageTags(), revalidate: 300 }
23
+ * );
24
+ * ```
25
+ */
26
+ /**
27
+ * Global tag that invalidates ALL Riverbank data.
28
+ * Revalidating this tag will refresh everything.
29
+ */
30
+ declare const RIVERBANK_GLOBAL_TAG = "riverbank";
31
+ /**
32
+ * Generate tags for site-level data (settings, theme).
33
+ *
34
+ * @returns Array of tags: ['riverbank', 'riverbank:site']
35
+ */
36
+ declare function getSiteTags(): string[];
37
+ /**
38
+ * Generate tags for page data.
39
+ *
40
+ * @param pageId - Optional specific page ID to include
41
+ * @returns Array of tags including global, pages collection, and optionally page-specific
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * getPageTags() // ['riverbank', 'riverbank:pages']
46
+ * getPageTags('page-123') // ['riverbank', 'riverbank:pages', 'riverbank:page:page-123']
47
+ * ```
48
+ */
49
+ declare function getPageTags(pageId?: string): string[];
50
+ /**
51
+ * Generate tags for content entries.
52
+ *
53
+ * @param contentTypeSlug - The content type slug (e.g., 'blog-post', 'event')
54
+ * @param entryId - Optional specific entry ID to include
55
+ * @returns Array of tags including global, content-type, and optionally entry-specific
56
+ *
57
+ * @example
58
+ * ```ts
59
+ * getEntryTags('blog-post') // ['riverbank', 'riverbank:content-type:blog-post']
60
+ * getEntryTags('blog-post', 'entry-456') // ['riverbank', 'riverbank:content-type:blog-post', 'riverbank:entry:entry-456']
61
+ * ```
62
+ */
63
+ declare function getEntryTags(contentTypeSlug: string, entryId?: string): string[];
64
+ /**
65
+ * Generate tags for navigation menus.
66
+ *
67
+ * @param menuKey - Optional specific menu key to include
68
+ * @returns Array of tags including global, navigation collection, and optionally menu-specific
69
+ *
70
+ * @example
71
+ * ```ts
72
+ * getNavigationTags() // ['riverbank', 'riverbank:navigation']
73
+ * getNavigationTags('main') // ['riverbank', 'riverbank:navigation', 'riverbank:navigation:main']
74
+ * ```
75
+ */
76
+ declare function getNavigationTags(menuKey?: string): string[];
77
+
78
+ export { RIVERBANK_GLOBAL_TAG, getEntryTags, getNavigationTags, getPageTags, getSiteTags };
@@ -0,0 +1,34 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/next/tags.ts
2
+ var RIVERBANK_GLOBAL_TAG = "riverbank";
3
+ function getSiteTags() {
4
+ return [RIVERBANK_GLOBAL_TAG, "riverbank:site"];
5
+ }
6
+ function getPageTags(pageId) {
7
+ const tags = [RIVERBANK_GLOBAL_TAG, "riverbank:pages"];
8
+ if (pageId) {
9
+ tags.push(`riverbank:page:${pageId}`);
10
+ }
11
+ return tags;
12
+ }
13
+ function getEntryTags(contentTypeSlug, entryId) {
14
+ const tags = [RIVERBANK_GLOBAL_TAG, `riverbank:content-type:${contentTypeSlug}`];
15
+ if (entryId) {
16
+ tags.push(`riverbank:entry:${entryId}`);
17
+ }
18
+ return tags;
19
+ }
20
+ function getNavigationTags(menuKey) {
21
+ const tags = [RIVERBANK_GLOBAL_TAG, "riverbank:navigation"];
22
+ if (menuKey) {
23
+ tags.push(`riverbank:navigation:${menuKey}`);
24
+ }
25
+ return tags;
26
+ }
27
+
28
+
29
+
30
+
31
+
32
+
33
+ exports.RIVERBANK_GLOBAL_TAG = RIVERBANK_GLOBAL_TAG; exports.getEntryTags = getEntryTags; exports.getNavigationTags = getNavigationTags; exports.getPageTags = getPageTags; exports.getSiteTags = getSiteTags;
34
+ //# sourceMappingURL=tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/next/tags.js","../../../src/next/tags.ts"],"names":[],"mappings":"AAAA;AC8BO,IAAM,qBAAA,EAAuB,WAAA;AAO7B,SAAS,WAAA,CAAA,EAAwB;AACtC,EAAA,OAAO,CAAC,oBAAA,EAAsB,gBAAgB,CAAA;AAChD;AAcO,SAAS,WAAA,CAAY,MAAA,EAA2B;AACrD,EAAA,MAAM,KAAA,EAAO,CAAC,oBAAA,EAAsB,iBAAiB,CAAA;AACrD,EAAA,GAAA,CAAI,MAAA,EAAQ;AACV,IAAA,IAAA,CAAK,IAAA,CAAK,CAAA,eAAA,EAAkB,MAAM,CAAA,CAAA;AACpC,EAAA;AACO,EAAA;AACT;AAesD;AAChB,EAAA;AACvB,EAAA;AACkB,IAAA;AAC/B,EAAA;AACO,EAAA;AACT;AAc8D;AACxB,EAAA;AACvB,EAAA;AACuB,IAAA;AACpC,EAAA;AACO,EAAA;AACT;AD1EuC;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/next/tags.js","sourcesContent":[null,"/**\n * Tag generation helpers for Next.js cache invalidation\n *\n * These helpers generate consistent cache tags for use with Next.js\n * `unstable_cache` and `revalidateTag` APIs.\n *\n * Tag naming convention:\n * - `riverbank` - Global tag that invalidates ALL Riverbank data\n * - `riverbank:<resource>` - Collection tag (e.g., `riverbank:pages`)\n * - `riverbank:<resource>:<id>` - Specific resource tag (e.g., `riverbank:page:page-123`)\n *\n * @example\n * ```tsx\n * // Consumer site: lib/cms-fetchers.ts\n * import { unstable_cache } from 'next/cache';\n * import { loadPage } from '@riverbankcms/sdk';\n * import { getPageTags } from '@riverbankcms/sdk/next/tags';\n *\n * export const getCachedPage = unstable_cache(\n * async (path: string) => loadPage({ client, siteId, path }),\n * ['riverbank-page'],\n * { tags: getPageTags(), revalidate: 300 }\n * );\n * ```\n */\n\n/**\n * Global tag that invalidates ALL Riverbank data.\n * Revalidating this tag will refresh everything.\n */\nexport const RIVERBANK_GLOBAL_TAG = 'riverbank';\n\n/**\n * Generate tags for site-level data (settings, theme).\n *\n * @returns Array of tags: ['riverbank', 'riverbank:site']\n */\nexport function getSiteTags(): string[] {\n return [RIVERBANK_GLOBAL_TAG, 'riverbank:site'];\n}\n\n/**\n * Generate tags for page data.\n *\n * @param pageId - Optional specific page ID to include\n * @returns Array of tags including global, pages collection, and optionally page-specific\n *\n * @example\n * ```ts\n * getPageTags() // ['riverbank', 'riverbank:pages']\n * getPageTags('page-123') // ['riverbank', 'riverbank:pages', 'riverbank:page:page-123']\n * ```\n */\nexport function getPageTags(pageId?: string): string[] {\n const tags = [RIVERBANK_GLOBAL_TAG, 'riverbank:pages'];\n if (pageId) {\n tags.push(`riverbank:page:${pageId}`);\n }\n return tags;\n}\n\n/**\n * Generate tags for content entries.\n *\n * @param contentTypeSlug - The content type slug (e.g., 'blog-post', 'event')\n * @param entryId - Optional specific entry ID to include\n * @returns Array of tags including global, content-type, and optionally entry-specific\n *\n * @example\n * ```ts\n * getEntryTags('blog-post') // ['riverbank', 'riverbank:content-type:blog-post']\n * getEntryTags('blog-post', 'entry-456') // ['riverbank', 'riverbank:content-type:blog-post', 'riverbank:entry:entry-456']\n * ```\n */\nexport function getEntryTags(contentTypeSlug: string, entryId?: string): string[] {\n const tags = [RIVERBANK_GLOBAL_TAG, `riverbank:content-type:${contentTypeSlug}`];\n if (entryId) {\n tags.push(`riverbank:entry:${entryId}`);\n }\n return tags;\n}\n\n/**\n * Generate tags for navigation menus.\n *\n * @param menuKey - Optional specific menu key to include\n * @returns Array of tags including global, navigation collection, and optionally menu-specific\n *\n * @example\n * ```ts\n * getNavigationTags() // ['riverbank', 'riverbank:navigation']\n * getNavigationTags('main') // ['riverbank', 'riverbank:navigation', 'riverbank:navigation:main']\n * ```\n */\nexport function getNavigationTags(menuKey?: string): string[] {\n const tags = [RIVERBANK_GLOBAL_TAG, 'riverbank:navigation'];\n if (menuKey) {\n tags.push(`riverbank:navigation:${menuKey}`);\n }\n return tags;\n}\n"]}
@@ -0,0 +1,34 @@
1
+ // src/next/tags.ts
2
+ var RIVERBANK_GLOBAL_TAG = "riverbank";
3
+ function getSiteTags() {
4
+ return [RIVERBANK_GLOBAL_TAG, "riverbank:site"];
5
+ }
6
+ function getPageTags(pageId) {
7
+ const tags = [RIVERBANK_GLOBAL_TAG, "riverbank:pages"];
8
+ if (pageId) {
9
+ tags.push(`riverbank:page:${pageId}`);
10
+ }
11
+ return tags;
12
+ }
13
+ function getEntryTags(contentTypeSlug, entryId) {
14
+ const tags = [RIVERBANK_GLOBAL_TAG, `riverbank:content-type:${contentTypeSlug}`];
15
+ if (entryId) {
16
+ tags.push(`riverbank:entry:${entryId}`);
17
+ }
18
+ return tags;
19
+ }
20
+ function getNavigationTags(menuKey) {
21
+ const tags = [RIVERBANK_GLOBAL_TAG, "riverbank:navigation"];
22
+ if (menuKey) {
23
+ tags.push(`riverbank:navigation:${menuKey}`);
24
+ }
25
+ return tags;
26
+ }
27
+ export {
28
+ RIVERBANK_GLOBAL_TAG,
29
+ getEntryTags,
30
+ getNavigationTags,
31
+ getPageTags,
32
+ getSiteTags
33
+ };
34
+ //# sourceMappingURL=tags.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/next/tags.ts"],"sourcesContent":["/**\n * Tag generation helpers for Next.js cache invalidation\n *\n * These helpers generate consistent cache tags for use with Next.js\n * `unstable_cache` and `revalidateTag` APIs.\n *\n * Tag naming convention:\n * - `riverbank` - Global tag that invalidates ALL Riverbank data\n * - `riverbank:<resource>` - Collection tag (e.g., `riverbank:pages`)\n * - `riverbank:<resource>:<id>` - Specific resource tag (e.g., `riverbank:page:page-123`)\n *\n * @example\n * ```tsx\n * // Consumer site: lib/cms-fetchers.ts\n * import { unstable_cache } from 'next/cache';\n * import { loadPage } from '@riverbankcms/sdk';\n * import { getPageTags } from '@riverbankcms/sdk/next/tags';\n *\n * export const getCachedPage = unstable_cache(\n * async (path: string) => loadPage({ client, siteId, path }),\n * ['riverbank-page'],\n * { tags: getPageTags(), revalidate: 300 }\n * );\n * ```\n */\n\n/**\n * Global tag that invalidates ALL Riverbank data.\n * Revalidating this tag will refresh everything.\n */\nexport const RIVERBANK_GLOBAL_TAG = 'riverbank';\n\n/**\n * Generate tags for site-level data (settings, theme).\n *\n * @returns Array of tags: ['riverbank', 'riverbank:site']\n */\nexport function getSiteTags(): string[] {\n return [RIVERBANK_GLOBAL_TAG, 'riverbank:site'];\n}\n\n/**\n * Generate tags for page data.\n *\n * @param pageId - Optional specific page ID to include\n * @returns Array of tags including global, pages collection, and optionally page-specific\n *\n * @example\n * ```ts\n * getPageTags() // ['riverbank', 'riverbank:pages']\n * getPageTags('page-123') // ['riverbank', 'riverbank:pages', 'riverbank:page:page-123']\n * ```\n */\nexport function getPageTags(pageId?: string): string[] {\n const tags = [RIVERBANK_GLOBAL_TAG, 'riverbank:pages'];\n if (pageId) {\n tags.push(`riverbank:page:${pageId}`);\n }\n return tags;\n}\n\n/**\n * Generate tags for content entries.\n *\n * @param contentTypeSlug - The content type slug (e.g., 'blog-post', 'event')\n * @param entryId - Optional specific entry ID to include\n * @returns Array of tags including global, content-type, and optionally entry-specific\n *\n * @example\n * ```ts\n * getEntryTags('blog-post') // ['riverbank', 'riverbank:content-type:blog-post']\n * getEntryTags('blog-post', 'entry-456') // ['riverbank', 'riverbank:content-type:blog-post', 'riverbank:entry:entry-456']\n * ```\n */\nexport function getEntryTags(contentTypeSlug: string, entryId?: string): string[] {\n const tags = [RIVERBANK_GLOBAL_TAG, `riverbank:content-type:${contentTypeSlug}`];\n if (entryId) {\n tags.push(`riverbank:entry:${entryId}`);\n }\n return tags;\n}\n\n/**\n * Generate tags for navigation menus.\n *\n * @param menuKey - Optional specific menu key to include\n * @returns Array of tags including global, navigation collection, and optionally menu-specific\n *\n * @example\n * ```ts\n * getNavigationTags() // ['riverbank', 'riverbank:navigation']\n * getNavigationTags('main') // ['riverbank', 'riverbank:navigation', 'riverbank:navigation:main']\n * ```\n */\nexport function getNavigationTags(menuKey?: string): string[] {\n const tags = [RIVERBANK_GLOBAL_TAG, 'riverbank:navigation'];\n if (menuKey) {\n tags.push(`riverbank:navigation:${menuKey}`);\n }\n return tags;\n}\n"],"mappings":";AA8BO,IAAM,uBAAuB;AAO7B,SAAS,cAAwB;AACtC,SAAO,CAAC,sBAAsB,gBAAgB;AAChD;AAcO,SAAS,YAAY,QAA2B;AACrD,QAAM,OAAO,CAAC,sBAAsB,iBAAiB;AACrD,MAAI,QAAQ;AACV,SAAK,KAAK,kBAAkB,MAAM,EAAE;AAAA,EACtC;AACA,SAAO;AACT;AAeO,SAAS,aAAa,iBAAyB,SAA4B;AAChF,QAAM,OAAO,CAAC,sBAAsB,0BAA0B,eAAe,EAAE;AAC/E,MAAI,SAAS;AACX,SAAK,KAAK,mBAAmB,OAAO,EAAE;AAAA,EACxC;AACA,SAAO;AACT;AAcO,SAAS,kBAAkB,SAA4B;AAC5D,QAAM,OAAO,CAAC,sBAAsB,sBAAsB;AAC1D,MAAI,SAAS;AACX,SAAK,KAAK,wBAAwB,OAAO,EAAE;AAAA,EAC7C;AACA,SAAO;AACT;","names":[]}