@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
@@ -14,7 +14,6 @@ import {
14
14
  resolveImageUrl
15
15
  } from "./chunk-LNOUXALA.mjs";
16
16
  import "./chunk-BYBJA6SP.mjs";
17
- import "./chunk-BJTO5JO5.mjs";
18
17
  export {
19
18
  Layout,
20
19
  Page,
@@ -29,7 +29,6 @@ require('./chunk-GERCMTPQ.js');
29
29
  require('./chunk-7UPVCT3K.js');
30
30
  require('./chunk-RVDS7VSP.js');
31
31
  require('./chunk-YYO3RIFO.js');
32
- require('./chunk-DGUM43GV.js');
33
32
 
34
33
 
35
34
 
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/config-validation.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,2yDAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/config-validation.js"}
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/config-validation.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,2yDAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/config-validation.js"}
@@ -29,7 +29,6 @@ import "./chunk-D2QLTPUJ.mjs";
29
29
  import "./chunk-LNOUXALA.mjs";
30
30
  import "./chunk-AEFWG657.mjs";
31
31
  import "./chunk-BYBJA6SP.mjs";
32
- import "./chunk-BJTO5JO5.mjs";
33
32
  export {
34
33
  blockFieldConfigSchema,
35
34
  blockFieldExtensionSchema,
@@ -30,7 +30,6 @@ var _chunkGERCMTPQjs = require('./chunk-GERCMTPQ.js');
30
30
  require('./chunk-7UPVCT3K.js');
31
31
  require('./chunk-RVDS7VSP.js');
32
32
  require('./chunk-YYO3RIFO.js');
33
- require('./chunk-DGUM43GV.js');
34
33
 
35
34
  // src/config/typed-entries.ts
36
35
  function defineTypedContentType(config) {
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/config.js","../../src/config/typed-entries.ts","../../src/config/index.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACA;AC8KO,SAAS,sBAAA,CAGd,MAAA,EAAwD;AACxD,EAAA,OAAO,MAAA;AACT;AAwDO,SAAS,WAAA,CAId,WAAA,EACA,KAAA,EACa;AACb,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,WAAA,EAAa,WAAA,CAAY;AAAA,EAC3B,CAAA;AACF;AA2BO,IAAM,OAAA,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpB,KAAA,CAAA,EAAoB;AAClB,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,CAAC,EAAE,CAAA;AAAA,EACpC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAA,CAAU,IAAA,EAA0B;AAClC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,WAAA;AAAA,UACN,OAAA,EAAS,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAC,EAAA,EAAI,CAAC;AAAA,QAC9C;AAAA,MACF;AAAA,IACF,CAAA;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,GAAA,CAAI,OAAA,EAAmC;AACrC,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,QAAQ,CAAA;AAAA,EAChC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAA,CAAQ,KAAA,EAA8B,IAAA,EAA0B;AAC9D,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,EAAE,MAAM,CAAA;AAAA,MACf,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAC;AAAA,IAClC,CAAA;AAAA,EACF;AACF,CAAA;ADzQA;AACA;AEiCO,SAAS,YAAA,CAAa,MAAA,EAAkD;AAC7E,EAAA,OAAO,MAAA;AACT;AAuCO,SAAS,mBAAA,CAAoB,MAAA,EAAsC;AACxE,EAAA,OAAO,MAAA;AACT;AFrEA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,0/DAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/config.js","sourcesContent":[null,"/**\n * Type-Safe Content Entries\n *\n * This module provides type-safe helpers for defining content types and entries\n * in SDK site configurations. When used with `as const`, TypeScript can infer\n * the exact shape of entry data from the content type's field definitions.\n *\n * @example\n * ```typescript\n * import { defineTypedContentType, createEntry, tiptap } from '@riverbankcms/sdk/config';\n *\n * // Define content type with `as const` for type inference\n * export const testimonialType = defineTypedContentType({\n * key: 'testimonial',\n * name: 'Testimonial',\n * hasPages: false,\n * fields: [\n * { id: 'name', type: 'text', label: 'Name', required: true, multiline: false },\n * { id: 'quote', type: 'richText', label: 'Quote', required: true, format: 'html' },\n * ],\n * } as const);\n *\n * // Create entry with full type safety\n * const entry = createEntry(testimonialType, {\n * identifier: 'testimonial-1',\n * data: {\n * name: 'John Doe', // TypeScript knows this is string\n * quote: tiptap.paragraph('Great service!'), // TypeScript knows this is TipTapNode\n * },\n * });\n * ```\n */\n\nimport type {\n FieldDefinition,\n TextFieldDefinition,\n RichTextFieldDefinition,\n MediaFieldDefinition,\n BooleanFieldDefinition,\n NumberFieldDefinition,\n DateFieldDefinition,\n TimeFieldDefinition,\n DateTimeFieldDefinition,\n SlugFieldDefinition,\n UrlFieldDefinition,\n LinkFieldDefinition,\n SelectFieldDefinition,\n ReferenceFieldDefinition,\n RepeaterFieldDefinition,\n GroupFieldDefinition,\n ModalFieldDefinition,\n TabGroupFieldDefinition,\n PresetOrCustomFieldDefinition,\n ContentTypeSelectFieldDefinition,\n EntryPickerFieldDefinition,\n TipTapNode,\n Media,\n LinkValue,\n} from '@riverbankcms/blocks';\nimport type { ContentTypeConfig, EntryConfig } from './content-types';\n\n// Re-export value types for convenience\nexport type { TipTapNode, Media, LinkValue } from '@riverbankcms/blocks';\nexport type {\n InternalLinkValue,\n ExternalLinkValue,\n CustomLinkValue,\n} from '@riverbankcms/blocks';\n\n// =============================================================================\n// Type Infrastructure\n// =============================================================================\n\n/**\n * Infers the data object shape from tabGroup tabs (flattens all tab fields).\n * TabGroup fields flatten all their tab fields into a single data object.\n */\ntype InferDataFromTabs<Tabs extends readonly { fields: readonly FieldDefinition[] }[]> =\n InferDataFromFields<Tabs[number]['fields']>;\n\n// NOTE: Polymorphic repeater type inference would require a helper like this,\n// but TypeScript's mapped types don't distribute correctly over union keys\n// when nested inside conditional types. Left as documentation for future work.\n// type PolymorphicItemData<K, IT> = K extends string\n// ? K extends keyof IT\n// ? IT[K] extends { fields: infer F extends readonly FieldDefinition[] }\n// ? { _type: K } & InferDataFromFields<F>\n// : never\n// : never\n// : never;\n\n/**\n * Maps a field definition to its TypeScript value type.\n * Uses conditional types to infer the correct type based on field.type.\n *\n * Coverage:\n * - Simple primitives: text, boolean, number\n * - Complex types: richText (TipTapNode), media (Media | null), link (LinkValue | null)\n * - Date/time: date, time, datetime (all ISO strings)\n * - String-value: slug, url, reference, presetOrCustom, contentTypeSelect\n * - Select: single (string) vs multiple (string[])\n * - Entry picker: string | null\n * - Nested: group, modal (nested InferDataFromFields)\n * - Repeater: monomorphic (array) and polymorphic (discriminated union array)\n * - TabGroup: flattened fields from all tabs\n */\nexport type FieldValueType<F extends FieldDefinition> =\n // Simple primitives - use specific field types for better inference\n F extends TextFieldDefinition ? string :\n F extends BooleanFieldDefinition ? boolean :\n F extends NumberFieldDefinition ? number :\n // Complex types\n F extends RichTextFieldDefinition ? TipTapNode :\n F extends MediaFieldDefinition ? Media | null :\n F extends LinkFieldDefinition ? LinkValue | null :\n // Date/time types (all stored as ISO strings)\n F extends DateFieldDefinition ? string :\n F extends TimeFieldDefinition ? string :\n F extends DateTimeFieldDefinition ? string :\n // String-value types\n F extends SlugFieldDefinition ? string :\n F extends UrlFieldDefinition ? string :\n F extends ReferenceFieldDefinition ? string :\n F extends PresetOrCustomFieldDefinition ? string :\n F extends ContentTypeSelectFieldDefinition ? string :\n // Select: check multiple flag first (more specific match)\n F extends SelectFieldDefinition & { multiple: true } ? string[] :\n F extends SelectFieldDefinition ? string :\n // Entry picker\n F extends EntryPickerFieldDefinition ? string | null :\n // Nested types (group, modal)\n F extends GroupFieldDefinition & { schema: { fields: infer GF } } ?\n GF extends readonly FieldDefinition[] ? InferDataFromFields<GF> : never :\n F extends ModalFieldDefinition & { schema: { fields: infer MF } } ?\n MF extends readonly FieldDefinition[] ? InferDataFromFields<MF> : never :\n // Repeater types (polymorphic first - more specific, then monomorphic)\n // TODO: Polymorphic repeaters need more complex type distribution.\n // For now, return unknown[] - the runtime data is still correct.\n F extends { type: 'repeater'; polymorphic: true } ? unknown[] :\n F extends RepeaterFieldDefinition & { schema: { fields: infer RF } } ?\n RF extends readonly FieldDefinition[] ? InferDataFromFields<RF>[] : never :\n // TabGroup (flattens all tab fields)\n F extends TabGroupFieldDefinition & { tabs: infer T } ?\n T extends readonly { fields: readonly FieldDefinition[] }[] ?\n InferDataFromTabs<T> : never :\n // Fallback for unknown types\n unknown;\n\n/**\n * Infers the data object shape from an array of field definitions.\n * Required fields are non-optional, optional fields are `| undefined`.\n *\n * @example\n * ```typescript\n * const fields = [\n * { id: 'name', type: 'text', required: true },\n * { id: 'bio', type: 'text', required: false },\n * ] as const;\n *\n * type Data = InferDataFromFields<typeof fields>;\n * // { name: string; bio: string | undefined }\n * ```\n */\nexport type InferDataFromFields<Fields extends readonly FieldDefinition[]> = {\n [F in Fields[number] as F['id']]: F extends { required: true }\n ? FieldValueType<F>\n : FieldValueType<F> | undefined;\n};\n\n// =============================================================================\n// TypedContentType\n// =============================================================================\n\n/**\n * A content type definition with preserved field types for type inference.\n * Extends ContentTypeConfig to ensure all required fields are present.\n * The generic parameters capture the literal types from `as const`.\n */\nexport interface TypedContentType<\n K extends string = string,\n F extends readonly FieldDefinition[] = readonly FieldDefinition[]\n> extends Omit<ContentTypeConfig, 'key' | 'fields'> {\n key: K;\n fields: F;\n}\n\n/**\n * Define a content type with preserved field types for type inference.\n *\n * IMPORTANT: Use `as const` on the config object to enable type inference.\n * Without `as const`, TypeScript widens literal types and inference won't work.\n *\n * @param config - The content type configuration\n * @returns The same config object with preserved types\n *\n * @example\n * ```typescript\n * export const testimonialType = defineTypedContentType({\n * key: 'testimonial',\n * name: 'Testimonial',\n * hasPages: false,\n * fields: [\n * { id: 'name', type: 'text', label: 'Name', required: true, multiline: false },\n * { id: 'quote', type: 'richText', label: 'Quote', required: true, format: 'html' },\n * ],\n * } as const);\n * ```\n */\nexport function defineTypedContentType<\n K extends string,\n F extends readonly FieldDefinition[]\n>(config: TypedContentType<K, F>): TypedContentType<K, F> {\n return config;\n}\n\n// =============================================================================\n// TypedEntryConfig and createEntry\n// =============================================================================\n\n/**\n * Entry configuration with typed data field.\n * Used internally by createEntry to enforce type safety.\n */\nexport interface TypedEntryConfig<Data extends Record<string, unknown>> {\n /** Unique identifier for this entry. Required for SDK sync. */\n identifier: string;\n /** Title for the entry */\n title?: string;\n /** Slug for routable entries */\n slug?: string;\n /** Status: 'draft' or 'published' */\n status?: 'draft' | 'published';\n /** Summary/description */\n summary?: string;\n /** SEO meta title */\n metaTitle?: string;\n /** SEO meta description */\n metaDescription?: string;\n /** Entry data matching the content type's field definitions */\n data: Data;\n}\n\n/**\n * Create a type-safe content entry for a typed content type.\n *\n * The data field is validated against the content type's field definitions.\n * TypeScript will error if:\n * - A required field is missing\n * - A field name is misspelled\n * - A field value has the wrong type\n * - An extra field is provided (with strict mode)\n *\n * @param contentType - The typed content type definition\n * @param entry - The entry configuration with typed data\n * @returns EntryConfig compatible with SDK content configuration\n *\n * @example\n * ```typescript\n * const entry = createEntry(testimonialType, {\n * identifier: 'testimonial-1',\n * title: 'John Doe',\n * status: 'published',\n * data: {\n * name: 'John Doe',\n * quote: tiptap.paragraph('Great service!'),\n * },\n * });\n * ```\n */\nexport function createEntry<\n K extends string,\n F extends readonly FieldDefinition[]\n>(\n contentType: TypedContentType<K, F>,\n entry: TypedEntryConfig<InferDataFromFields<F>>\n): EntryConfig {\n return {\n ...entry,\n contentType: contentType.key,\n };\n}\n\n// =============================================================================\n// TipTap Helpers\n// =============================================================================\n\n/**\n * Helpers for creating TipTap document structures.\n *\n * Use these helpers when populating richText fields to avoid manually\n * constructing the TipTap JSON structure.\n *\n * @example\n * ```typescript\n * // Simple paragraph\n * const body = tiptap.paragraph('Hello, world!');\n *\n * // Empty document\n * const emptyDoc = tiptap.empty();\n *\n * // Complex document\n * const doc = tiptap.doc([\n * tiptap.heading(1, 'Welcome'),\n * { type: 'paragraph', content: [{ type: 'text', text: 'Introduction...' }] },\n * ]);\n * ```\n */\nexport const tiptap = {\n /**\n * Create an empty TipTap document.\n *\n * @returns An empty TipTap document node\n */\n empty(): TipTapNode {\n return { type: 'doc', content: [] };\n },\n\n /**\n * Create a TipTap document with a single paragraph.\n *\n * @param text - The paragraph text content\n * @returns A TipTap document with one paragraph\n */\n paragraph(text: string): TipTapNode {\n return {\n type: 'doc',\n content: [\n {\n type: 'paragraph',\n content: text ? [{ type: 'text', text }] : [],\n },\n ],\n };\n },\n\n /**\n * Create a TipTap document with custom content nodes.\n *\n * @param content - Array of TipTap nodes to include in the document\n * @returns A TipTap document wrapping the content\n */\n doc(content: TipTapNode[]): TipTapNode {\n return { type: 'doc', content };\n },\n\n /**\n * Create a heading node.\n *\n * Note: This returns a heading node, not a document. Use with tiptap.doc()\n * to create a complete document.\n *\n * @param level - Heading level (1-6)\n * @param text - Heading text content\n * @returns A TipTap heading node\n */\n heading(level: 1 | 2 | 3 | 4 | 5 | 6, text: string): TipTapNode {\n return {\n type: 'heading',\n attrs: { level },\n content: [{ type: 'text', text }],\n };\n },\n};\n","/**\n * SDK Site Configuration\n *\n * Types and utilities for defining site-level configuration\n * that SDK sites expose to the dashboard.\n */\n\nimport type { RiverbankSiteConfig, ContentConfig } from './types';\n\n// Types\nexport type {\n RiverbankSiteConfig,\n SiteStyleConfig,\n SectionBackground,\n SectionOptionsConfig,\n ContainerOptionsConfig,\n SectionSpacing,\n ContainerMaxWidth,\n ContainerAlignment,\n SdkThemeConfig,\n SdkThemePalette,\n SdkCustomBlock,\n FieldSelectOption,\n BlockFieldConfig,\n BlockFieldOptionsMap,\n BlockFieldExtension,\n BlockFieldExtensionsMap,\n FieldDefinition,\n // Content scaffolding types\n ContentConfig,\n ContentTypeConfig,\n PageConfig,\n EntryConfig,\n BlockConfig,\n NavigationMenuConfig,\n NavigationItemConfig,\n NavigationLinkType,\n SiteSettingsConfig,\n} from './types';\n\n// Validation schemas\nexport {\n riverbankSiteConfigSchema,\n siteStyleConfigSchema,\n sectionBackgroundSchema,\n sectionSpacingSchema,\n containerMaxWidthSchema,\n containerAlignmentSchema,\n sectionOptionsSchema,\n containerOptionsSchema,\n sdkThemeConfigSchema,\n sdkThemePaletteSchema,\n sdkCustomBlockSchema,\n fieldSelectOptionSchema,\n blockFieldConfigSchema,\n blockFieldOptionsSchema,\n blockFieldExtensionSchema,\n blockFieldExtensionsSchema,\n // Content scaffolding schemas\n contentConfigSchema,\n} from './validation';\n\n// Content validation schemas for more granular use\nexport {\n contentTypeConfigSchema,\n pageConfigSchema,\n entryConfigSchema,\n navigationMenuConfigSchema,\n navigationItemConfigSchema,\n siteSettingsConfigSchema,\n blockConfigSchema,\n} from './content-validation';\n\nexport type {\n ValidatedRiverbankSiteConfig,\n ValidatedSdkCustomBlock,\n ContentConfigInput,\n ContentConfigOutput,\n} from './validation';\n\n// Block kind types (single source of truth from @riverbankcms/blocks)\nexport {\n SYSTEM_BLOCK_KINDS,\n type SystemBlockKind,\n type CustomBlockKind,\n type BlockKind,\n} from '../types';\n\n// Type-safe content entry helpers\nexport {\n defineTypedContentType,\n createEntry,\n tiptap,\n type TypedContentType,\n type TypedEntryConfig,\n type InferDataFromFields,\n type FieldValueType,\n} from './typed-entries';\n\n// Re-export value types for convenience when building entry data\nexport type {\n TipTapNode,\n Media,\n LinkValue,\n InternalLinkValue,\n ExternalLinkValue,\n CustomLinkValue,\n} from './typed-entries';\n\n/**\n * Helper function to define a Builder site configuration with type checking.\n *\n * @example\n * ```typescript\n * import { defineConfig } from '@riverbankcms/sdk/config';\n *\n * export default defineConfig({\n * siteId: '123e4567-e89b-12d3-a456-426614174000',\n * theme: {\n * palette: {\n * primary: '#6d28d9',\n * },\n * },\n * styles: {\n * sectionBackgrounds: [\n * { id: 'primary', label: 'Purple', token: 'primary' },\n * ],\n * },\n * });\n * ```\n */\nexport function defineConfig(config: RiverbankSiteConfig): RiverbankSiteConfig {\n return config;\n}\n\n/**\n * Helper function to define content scaffolding configuration with type checking.\n *\n * This can be used to define content configuration in a separate file,\n * which is then imported into riverbank.config.ts.\n *\n * @example\n * ```typescript\n * // content.config.ts\n * import { defineContentConfig } from '@riverbankcms/sdk/config';\n *\n * export const contentConfig = defineContentConfig({\n * contentTypes: [\n * {\n * key: 'testimonial',\n * name: 'Testimonial',\n * hasPages: false,\n * fields: [\n * { id: 'quote', type: 'richText', label: 'Quote', required: true },\n * ],\n * },\n * ],\n * pages: [\n * { identifier: 'home', title: 'Home', path: '/' },\n * ],\n * });\n *\n * // riverbank.config.ts\n * import { defineConfig } from '@riverbankcms/sdk/config';\n * import { contentConfig } from './content.config';\n *\n * export default defineConfig({\n * siteId: '...',\n * content: contentConfig,\n * });\n * ```\n */\nexport function defineContentConfig(config: ContentConfig): ContentConfig {\n return config;\n}\n"]}
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/config.js","../../src/config/typed-entries.ts","../../src/config/index.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACA;AC+KO,SAAS,sBAAA,CAGd,MAAA,EAAwD;AACxD,EAAA,OAAO,MAAA;AACT;AAwDO,SAAS,WAAA,CAId,WAAA,EACA,KAAA,EACa;AACb,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,WAAA,EAAa,WAAA,CAAY;AAAA,EAC3B,CAAA;AACF;AA2BO,IAAM,OAAA,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpB,KAAA,CAAA,EAAoB;AAClB,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,CAAC,EAAE,CAAA;AAAA,EACpC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAA,CAAU,IAAA,EAA0B;AAClC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,WAAA;AAAA,UACN,OAAA,EAAS,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAC,EAAA,EAAI,CAAC;AAAA,QAC9C;AAAA,MACF;AAAA,IACF,CAAA;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,GAAA,CAAI,OAAA,EAAmC;AACrC,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,QAAQ,CAAA;AAAA,EAChC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAA,CAAQ,KAAA,EAA8B,IAAA,EAA0B;AAC9D,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,EAAE,MAAM,CAAA;AAAA,MACf,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAC;AAAA,IAClC,CAAA;AAAA,EACF;AACF,CAAA;AD1QA;AACA;AEkCO,SAAS,YAAA,CAAa,MAAA,EAAkD;AAC7E,EAAA,OAAO,MAAA;AACT;AAuCO,SAAS,mBAAA,CAAoB,MAAA,EAAsC;AACxE,EAAA,OAAO,MAAA;AACT;AFtEA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,0/DAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/config.js","sourcesContent":[null,"/**\n * Type-Safe Content Entries\n *\n * This module provides type-safe helpers for defining content types and entries\n * in SDK site configurations. When used with `as const`, TypeScript can infer\n * the exact shape of entry data from the content type's field definitions.\n *\n * @example\n * ```typescript\n * import { defineTypedContentType, createEntry, tiptap } from '@riverbankcms/sdk/config';\n *\n * // Define content type with `as const` for type inference\n * export const testimonialType = defineTypedContentType({\n * key: 'testimonial',\n * name: 'Testimonial',\n * hasPages: false,\n * fields: [\n * { id: 'name', type: 'text', label: 'Name', required: true, multiline: false },\n * { id: 'quote', type: 'richText', label: 'Quote', required: true, format: 'html' },\n * ],\n * } as const);\n *\n * // Create entry with full type safety\n * const entry = createEntry(testimonialType, {\n * identifier: 'testimonial-1',\n * data: {\n * name: 'John Doe', // TypeScript knows this is string\n * quote: tiptap.paragraph('Great service!'), // TypeScript knows this is TipTapNode\n * },\n * });\n * ```\n */\n\nimport type {\n FieldDefinition,\n TextFieldDefinition,\n RichTextFieldDefinition,\n MediaFieldDefinition,\n BooleanFieldDefinition,\n NumberFieldDefinition,\n DateFieldDefinition,\n TimeFieldDefinition,\n DateTimeFieldDefinition,\n SlugFieldDefinition,\n UrlFieldDefinition,\n LinkFieldDefinition,\n SelectFieldDefinition,\n ReferenceFieldDefinition,\n RepeaterFieldDefinition,\n GroupFieldDefinition,\n ModalFieldDefinition,\n TabGroupFieldDefinition,\n PresetOrCustomFieldDefinition,\n ContentTypeSelectFieldDefinition,\n EntryPickerFieldDefinition,\n TipTapNode,\n Media,\n LinkValue,\n} from '@riverbankcms/blocks';\nimport type { ContentTypeConfig, EntryConfig } from './content-types';\n\n// Re-export value types for convenience\nexport type { TipTapNode, Media, LinkValue } from '@riverbankcms/blocks';\nexport type {\n InternalLinkValue,\n ExternalLinkValue,\n CustomLinkValue,\n} from '@riverbankcms/blocks';\n\n// =============================================================================\n// Type Infrastructure\n// =============================================================================\n\n/**\n * Infers the data object shape from tabGroup tabs (flattens all tab fields).\n * TabGroup fields flatten all their tab fields into a single data object.\n */\ntype InferDataFromTabs<Tabs extends readonly { fields: readonly FieldDefinition[] }[]> =\n InferDataFromFields<Tabs[number]['fields']>;\n\n// NOTE: Polymorphic repeater type inference would require a helper like this,\n// but TypeScript's mapped types don't distribute correctly over union keys\n// when nested inside conditional types. Left as documentation for future work.\n// type PolymorphicItemData<K, IT> = K extends string\n// ? K extends keyof IT\n// ? IT[K] extends { fields: infer F extends readonly FieldDefinition[] }\n// ? { _type: K } & InferDataFromFields<F>\n// : never\n// : never\n// : never;\n\n/**\n * Maps a field definition to its TypeScript value type.\n * Uses conditional types to infer the correct type based on field.type.\n *\n * Coverage:\n * - Simple primitives: text, boolean, number\n * - Complex types: richText (TipTapNode), media (Media | null), link (LinkValue | null)\n * - Date/time: date, time, datetime (all ISO strings)\n * - String-value: slug, url, reference, presetOrCustom, contentTypeSelect\n * - Select: single (string) vs multiple (string[])\n * - Entry picker: string | null\n * - Nested: group, modal (nested InferDataFromFields)\n * - Repeater: monomorphic (array) and polymorphic (discriminated union array)\n * - TabGroup: flattened fields from all tabs\n */\nexport type FieldValueType<F extends FieldDefinition> =\n // Simple primitives - use specific field types for better inference\n F extends TextFieldDefinition ? string :\n F extends BooleanFieldDefinition ? boolean :\n F extends NumberFieldDefinition ? number :\n // Complex types\n F extends RichTextFieldDefinition ? TipTapNode :\n F extends MediaFieldDefinition ? Media | null :\n F extends LinkFieldDefinition ? LinkValue | null :\n // Date/time types (all stored as ISO strings)\n F extends DateFieldDefinition ? string :\n F extends TimeFieldDefinition ? string :\n F extends DateTimeFieldDefinition ? string :\n // String-value types\n F extends SlugFieldDefinition ? string :\n F extends UrlFieldDefinition ? string :\n F extends ReferenceFieldDefinition ? string :\n F extends PresetOrCustomFieldDefinition ? string :\n F extends ContentTypeSelectFieldDefinition ? string :\n // Select: check multiple flag first (more specific match)\n F extends SelectFieldDefinition & { multiple: true } ? string[] :\n F extends SelectFieldDefinition ? string :\n // Entry picker\n F extends EntryPickerFieldDefinition ? string | null :\n // Nested types (group, modal)\n F extends GroupFieldDefinition & { schema: { fields: infer GF } } ?\n GF extends readonly FieldDefinition[] ? InferDataFromFields<GF> : never :\n F extends ModalFieldDefinition & { schema: { fields: infer MF } } ?\n MF extends readonly FieldDefinition[] ? InferDataFromFields<MF> : never :\n // Repeater types (polymorphic first - more specific, then monomorphic)\n // TODO: Polymorphic repeaters need more complex type distribution.\n // For now, return unknown[] - the runtime data is still correct.\n F extends { type: 'repeater'; polymorphic: true } ? unknown[] :\n F extends RepeaterFieldDefinition & { schema: { fields: infer RF } } ?\n RF extends readonly FieldDefinition[] ? InferDataFromFields<RF>[] : never :\n // TabGroup (flattens all tab fields)\n F extends TabGroupFieldDefinition & { tabs: infer T } ?\n T extends readonly { fields: readonly FieldDefinition[] }[] ?\n InferDataFromTabs<T> : never :\n // Fallback for unknown types\n unknown;\n\n/**\n * Infers the data object shape from an array of field definitions.\n * Required fields are non-optional, optional fields are `| undefined`.\n *\n * @example\n * ```typescript\n * const fields = [\n * { id: 'name', type: 'text', required: true },\n * { id: 'bio', type: 'text', required: false },\n * ] as const;\n *\n * type Data = InferDataFromFields<typeof fields>;\n * // { name: string; bio: string | undefined }\n * ```\n */\nexport type InferDataFromFields<Fields extends readonly FieldDefinition[]> = {\n [F in Fields[number] as F['id']]: F extends { required: true }\n ? FieldValueType<F>\n : FieldValueType<F> | undefined;\n};\n\n// =============================================================================\n// TypedContentType\n// =============================================================================\n\n/**\n * A content type definition with preserved field types for type inference.\n * Extends ContentTypeConfig to ensure all required fields are present.\n * The generic parameters capture the literal types from `as const`.\n */\nexport interface TypedContentType<\n K extends string = string,\n F extends readonly FieldDefinition[] = readonly FieldDefinition[]\n> extends Omit<ContentTypeConfig, 'key' | 'fields'> {\n key: K;\n fields: F;\n}\n\n/**\n * Define a content type with preserved field types for type inference.\n *\n * IMPORTANT: Use `as const` on the config object to enable type inference.\n * Without `as const`, TypeScript widens literal types and inference won't work.\n *\n * @param config - The content type configuration\n * @returns The same config object with preserved types\n *\n * @example\n * ```typescript\n * export const testimonialType = defineTypedContentType({\n * key: 'testimonial',\n * name: 'Testimonial',\n * hasPages: false,\n * fields: [\n * { id: 'name', type: 'text', label: 'Name', required: true, multiline: false },\n * { id: 'quote', type: 'richText', label: 'Quote', required: true, format: 'html' },\n * ],\n * } as const);\n * ```\n */\nexport function defineTypedContentType<\n K extends string,\n F extends readonly FieldDefinition[]\n>(config: TypedContentType<K, F>): TypedContentType<K, F> {\n return config;\n}\n\n// =============================================================================\n// TypedEntryConfig and createEntry\n// =============================================================================\n\n/**\n * Entry configuration with typed data field.\n * Used internally by createEntry to enforce type safety.\n */\nexport interface TypedEntryConfig<Data extends Record<string, unknown>> {\n /** Unique identifier for this entry. Required for SDK sync. */\n identifier: string;\n /** Title for the entry */\n title?: string;\n /** Slug for routable entries */\n slug?: string;\n /** Status: 'draft' or 'published' */\n status?: 'draft' | 'published';\n /** Summary/description */\n summary?: string;\n /** SEO meta title */\n metaTitle?: string;\n /** SEO meta description */\n metaDescription?: string;\n /** Entry data matching the content type's field definitions */\n data: Data;\n}\n\n/**\n * Create a type-safe content entry for a typed content type.\n *\n * The data field is validated against the content type's field definitions.\n * TypeScript will error if:\n * - A required field is missing\n * - A field name is misspelled\n * - A field value has the wrong type\n * - An extra field is provided (with strict mode)\n *\n * @param contentType - The typed content type definition\n * @param entry - The entry configuration with typed data\n * @returns EntryConfig compatible with SDK content configuration\n *\n * @example\n * ```typescript\n * const entry = createEntry(testimonialType, {\n * identifier: 'testimonial-1',\n * title: 'John Doe',\n * status: 'published',\n * data: {\n * name: 'John Doe',\n * quote: tiptap.paragraph('Great service!'),\n * },\n * });\n * ```\n */\nexport function createEntry<\n K extends string,\n F extends readonly FieldDefinition[]\n>(\n contentType: TypedContentType<K, F>,\n entry: TypedEntryConfig<InferDataFromFields<F>>\n): EntryConfig {\n return {\n ...entry,\n contentType: contentType.key,\n };\n}\n\n// =============================================================================\n// TipTap Helpers\n// =============================================================================\n\n/**\n * Helpers for creating TipTap document structures.\n *\n * Use these helpers when populating richText fields to avoid manually\n * constructing the TipTap JSON structure.\n *\n * @example\n * ```typescript\n * // Simple paragraph\n * const body = tiptap.paragraph('Hello, world!');\n *\n * // Empty document\n * const emptyDoc = tiptap.empty();\n *\n * // Complex document\n * const doc = tiptap.doc([\n * tiptap.heading(1, 'Welcome'),\n * { type: 'paragraph', content: [{ type: 'text', text: 'Introduction...' }] },\n * ]);\n * ```\n */\nexport const tiptap = {\n /**\n * Create an empty TipTap document.\n *\n * @returns An empty TipTap document node\n */\n empty(): TipTapNode {\n return { type: 'doc', content: [] };\n },\n\n /**\n * Create a TipTap document with a single paragraph.\n *\n * @param text - The paragraph text content\n * @returns A TipTap document with one paragraph\n */\n paragraph(text: string): TipTapNode {\n return {\n type: 'doc',\n content: [\n {\n type: 'paragraph',\n content: text ? [{ type: 'text', text }] : [],\n },\n ],\n };\n },\n\n /**\n * Create a TipTap document with custom content nodes.\n *\n * @param content - Array of TipTap nodes to include in the document\n * @returns A TipTap document wrapping the content\n */\n doc(content: TipTapNode[]): TipTapNode {\n return { type: 'doc', content };\n },\n\n /**\n * Create a heading node.\n *\n * Note: This returns a heading node, not a document. Use with tiptap.doc()\n * to create a complete document.\n *\n * @param level - Heading level (1-6)\n * @param text - Heading text content\n * @returns A TipTap heading node\n */\n heading(level: 1 | 2 | 3 | 4 | 5 | 6, text: string): TipTapNode {\n return {\n type: 'heading',\n attrs: { level },\n content: [{ type: 'text', text }],\n };\n },\n};\n","/**\n * SDK Site Configuration\n *\n * Types and utilities for defining site-level configuration\n * that SDK sites expose to the dashboard.\n */\n\nimport type { RiverbankSiteConfig, ContentConfig } from './types';\n\n// Types\nexport type {\n RiverbankSiteConfig,\n SiteStyleConfig,\n SectionBackground,\n SectionOptionsConfig,\n ContainerOptionsConfig,\n SectionSpacing,\n ContainerMaxWidth,\n ContainerAlignment,\n SdkThemeConfig,\n SdkThemePalette,\n SdkCustomBlock,\n FieldSelectOption,\n BlockFieldConfig,\n BlockFieldOptionsMap,\n BlockFieldExtension,\n BlockFieldExtensionsMap,\n FieldDefinition,\n // Content scaffolding types\n ContentConfig,\n ContentTypeConfig,\n PageConfig,\n EntryConfig,\n BlockConfig,\n NavigationMenuConfig,\n NavigationItemConfig,\n NavigationLinkType,\n SiteSettingsConfig,\n} from './types';\n\n// Validation schemas\nexport {\n riverbankSiteConfigSchema,\n siteStyleConfigSchema,\n sectionBackgroundSchema,\n sectionSpacingSchema,\n containerMaxWidthSchema,\n containerAlignmentSchema,\n sectionOptionsSchema,\n containerOptionsSchema,\n sdkThemeConfigSchema,\n sdkThemePaletteSchema,\n sdkCustomBlockSchema,\n fieldSelectOptionSchema,\n blockFieldConfigSchema,\n blockFieldOptionsSchema,\n blockFieldExtensionSchema,\n blockFieldExtensionsSchema,\n // Content scaffolding schemas\n contentConfigSchema,\n} from './validation';\n\n// Content validation schemas for more granular use\nexport {\n contentTypeConfigSchema,\n pageConfigSchema,\n entryConfigSchema,\n navigationMenuConfigSchema,\n navigationItemConfigSchema,\n siteSettingsConfigSchema,\n blockConfigSchema,\n} from './content-validation';\n\nexport type {\n ValidatedRiverbankSiteConfig,\n ValidatedSdkCustomBlock,\n ContentConfigInput,\n ContentConfigOutput,\n} from './validation';\n\n// Block kind types (single source of truth from @riverbankcms/blocks)\nexport {\n SYSTEM_BLOCK_KINDS,\n type SystemBlockKind,\n type CustomBlockKind,\n type BlockKind,\n} from '../types';\n\n// Type-safe content entry helpers\nexport {\n defineTypedContentType,\n createEntry,\n tiptap,\n type TypedContentType,\n type TypedEntryConfig,\n type InferDataFromFields,\n type FieldValueType,\n} from './typed-entries';\n\n// Re-export value types for convenience when building entry data\nexport type {\n TipTapNode,\n Media,\n LinkValue,\n InternalLinkValue,\n ExternalLinkValue,\n CustomLinkValue,\n} from './typed-entries';\n\n/**\n * Helper function to define a Builder site configuration with type checking.\n *\n * @example\n * ```typescript\n * import { defineConfig } from '@riverbankcms/sdk/config';\n *\n * export default defineConfig({\n * siteId: '123e4567-e89b-12d3-a456-426614174000',\n * theme: {\n * palette: {\n * primary: '#6d28d9',\n * },\n * },\n * styles: {\n * sectionBackgrounds: [\n * { id: 'primary', label: 'Purple', token: 'primary' },\n * ],\n * },\n * });\n * ```\n */\nexport function defineConfig(config: RiverbankSiteConfig): RiverbankSiteConfig {\n return config;\n}\n\n/**\n * Helper function to define content scaffolding configuration with type checking.\n *\n * This can be used to define content configuration in a separate file,\n * which is then imported into riverbank.config.ts.\n *\n * @example\n * ```typescript\n * // content.config.ts\n * import { defineContentConfig } from '@riverbankcms/sdk/config';\n *\n * export const contentConfig = defineContentConfig({\n * contentTypes: [\n * {\n * key: 'testimonial',\n * name: 'Testimonial',\n * hasPages: false,\n * fields: [\n * { id: 'quote', type: 'richText', label: 'Quote', required: true },\n * ],\n * },\n * ],\n * pages: [\n * { identifier: 'home', title: 'Home', path: '/' },\n * ],\n * });\n *\n * // riverbank.config.ts\n * import { defineConfig } from '@riverbankcms/sdk/config';\n * import { contentConfig } from './content.config';\n *\n * export default defineConfig({\n * siteId: '...',\n * content: contentConfig,\n * });\n * ```\n */\nexport function defineContentConfig(config: ContentConfig): ContentConfig {\n return config;\n}\n"]}
@@ -30,7 +30,6 @@ import {
30
30
  import "./chunk-LNOUXALA.mjs";
31
31
  import "./chunk-AEFWG657.mjs";
32
32
  import "./chunk-BYBJA6SP.mjs";
33
- import "./chunk-BJTO5JO5.mjs";
34
33
 
35
34
  // src/config/typed-entries.ts
36
35
  function defineTypedContentType(config) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config/typed-entries.ts","../../src/config/index.ts"],"sourcesContent":["/**\n * Type-Safe Content Entries\n *\n * This module provides type-safe helpers for defining content types and entries\n * in SDK site configurations. When used with `as const`, TypeScript can infer\n * the exact shape of entry data from the content type's field definitions.\n *\n * @example\n * ```typescript\n * import { defineTypedContentType, createEntry, tiptap } from '@riverbankcms/sdk/config';\n *\n * // Define content type with `as const` for type inference\n * export const testimonialType = defineTypedContentType({\n * key: 'testimonial',\n * name: 'Testimonial',\n * hasPages: false,\n * fields: [\n * { id: 'name', type: 'text', label: 'Name', required: true, multiline: false },\n * { id: 'quote', type: 'richText', label: 'Quote', required: true, format: 'html' },\n * ],\n * } as const);\n *\n * // Create entry with full type safety\n * const entry = createEntry(testimonialType, {\n * identifier: 'testimonial-1',\n * data: {\n * name: 'John Doe', // TypeScript knows this is string\n * quote: tiptap.paragraph('Great service!'), // TypeScript knows this is TipTapNode\n * },\n * });\n * ```\n */\n\nimport type {\n FieldDefinition,\n TextFieldDefinition,\n RichTextFieldDefinition,\n MediaFieldDefinition,\n BooleanFieldDefinition,\n NumberFieldDefinition,\n DateFieldDefinition,\n TimeFieldDefinition,\n DateTimeFieldDefinition,\n SlugFieldDefinition,\n UrlFieldDefinition,\n LinkFieldDefinition,\n SelectFieldDefinition,\n ReferenceFieldDefinition,\n RepeaterFieldDefinition,\n GroupFieldDefinition,\n ModalFieldDefinition,\n TabGroupFieldDefinition,\n PresetOrCustomFieldDefinition,\n ContentTypeSelectFieldDefinition,\n EntryPickerFieldDefinition,\n TipTapNode,\n Media,\n LinkValue,\n} from '@riverbankcms/blocks';\nimport type { ContentTypeConfig, EntryConfig } from './content-types';\n\n// Re-export value types for convenience\nexport type { TipTapNode, Media, LinkValue } from '@riverbankcms/blocks';\nexport type {\n InternalLinkValue,\n ExternalLinkValue,\n CustomLinkValue,\n} from '@riverbankcms/blocks';\n\n// =============================================================================\n// Type Infrastructure\n// =============================================================================\n\n/**\n * Infers the data object shape from tabGroup tabs (flattens all tab fields).\n * TabGroup fields flatten all their tab fields into a single data object.\n */\ntype InferDataFromTabs<Tabs extends readonly { fields: readonly FieldDefinition[] }[]> =\n InferDataFromFields<Tabs[number]['fields']>;\n\n// NOTE: Polymorphic repeater type inference would require a helper like this,\n// but TypeScript's mapped types don't distribute correctly over union keys\n// when nested inside conditional types. Left as documentation for future work.\n// type PolymorphicItemData<K, IT> = K extends string\n// ? K extends keyof IT\n// ? IT[K] extends { fields: infer F extends readonly FieldDefinition[] }\n// ? { _type: K } & InferDataFromFields<F>\n// : never\n// : never\n// : never;\n\n/**\n * Maps a field definition to its TypeScript value type.\n * Uses conditional types to infer the correct type based on field.type.\n *\n * Coverage:\n * - Simple primitives: text, boolean, number\n * - Complex types: richText (TipTapNode), media (Media | null), link (LinkValue | null)\n * - Date/time: date, time, datetime (all ISO strings)\n * - String-value: slug, url, reference, presetOrCustom, contentTypeSelect\n * - Select: single (string) vs multiple (string[])\n * - Entry picker: string | null\n * - Nested: group, modal (nested InferDataFromFields)\n * - Repeater: monomorphic (array) and polymorphic (discriminated union array)\n * - TabGroup: flattened fields from all tabs\n */\nexport type FieldValueType<F extends FieldDefinition> =\n // Simple primitives - use specific field types for better inference\n F extends TextFieldDefinition ? string :\n F extends BooleanFieldDefinition ? boolean :\n F extends NumberFieldDefinition ? number :\n // Complex types\n F extends RichTextFieldDefinition ? TipTapNode :\n F extends MediaFieldDefinition ? Media | null :\n F extends LinkFieldDefinition ? LinkValue | null :\n // Date/time types (all stored as ISO strings)\n F extends DateFieldDefinition ? string :\n F extends TimeFieldDefinition ? string :\n F extends DateTimeFieldDefinition ? string :\n // String-value types\n F extends SlugFieldDefinition ? string :\n F extends UrlFieldDefinition ? string :\n F extends ReferenceFieldDefinition ? string :\n F extends PresetOrCustomFieldDefinition ? string :\n F extends ContentTypeSelectFieldDefinition ? string :\n // Select: check multiple flag first (more specific match)\n F extends SelectFieldDefinition & { multiple: true } ? string[] :\n F extends SelectFieldDefinition ? string :\n // Entry picker\n F extends EntryPickerFieldDefinition ? string | null :\n // Nested types (group, modal)\n F extends GroupFieldDefinition & { schema: { fields: infer GF } } ?\n GF extends readonly FieldDefinition[] ? InferDataFromFields<GF> : never :\n F extends ModalFieldDefinition & { schema: { fields: infer MF } } ?\n MF extends readonly FieldDefinition[] ? InferDataFromFields<MF> : never :\n // Repeater types (polymorphic first - more specific, then monomorphic)\n // TODO: Polymorphic repeaters need more complex type distribution.\n // For now, return unknown[] - the runtime data is still correct.\n F extends { type: 'repeater'; polymorphic: true } ? unknown[] :\n F extends RepeaterFieldDefinition & { schema: { fields: infer RF } } ?\n RF extends readonly FieldDefinition[] ? InferDataFromFields<RF>[] : never :\n // TabGroup (flattens all tab fields)\n F extends TabGroupFieldDefinition & { tabs: infer T } ?\n T extends readonly { fields: readonly FieldDefinition[] }[] ?\n InferDataFromTabs<T> : never :\n // Fallback for unknown types\n unknown;\n\n/**\n * Infers the data object shape from an array of field definitions.\n * Required fields are non-optional, optional fields are `| undefined`.\n *\n * @example\n * ```typescript\n * const fields = [\n * { id: 'name', type: 'text', required: true },\n * { id: 'bio', type: 'text', required: false },\n * ] as const;\n *\n * type Data = InferDataFromFields<typeof fields>;\n * // { name: string; bio: string | undefined }\n * ```\n */\nexport type InferDataFromFields<Fields extends readonly FieldDefinition[]> = {\n [F in Fields[number] as F['id']]: F extends { required: true }\n ? FieldValueType<F>\n : FieldValueType<F> | undefined;\n};\n\n// =============================================================================\n// TypedContentType\n// =============================================================================\n\n/**\n * A content type definition with preserved field types for type inference.\n * Extends ContentTypeConfig to ensure all required fields are present.\n * The generic parameters capture the literal types from `as const`.\n */\nexport interface TypedContentType<\n K extends string = string,\n F extends readonly FieldDefinition[] = readonly FieldDefinition[]\n> extends Omit<ContentTypeConfig, 'key' | 'fields'> {\n key: K;\n fields: F;\n}\n\n/**\n * Define a content type with preserved field types for type inference.\n *\n * IMPORTANT: Use `as const` on the config object to enable type inference.\n * Without `as const`, TypeScript widens literal types and inference won't work.\n *\n * @param config - The content type configuration\n * @returns The same config object with preserved types\n *\n * @example\n * ```typescript\n * export const testimonialType = defineTypedContentType({\n * key: 'testimonial',\n * name: 'Testimonial',\n * hasPages: false,\n * fields: [\n * { id: 'name', type: 'text', label: 'Name', required: true, multiline: false },\n * { id: 'quote', type: 'richText', label: 'Quote', required: true, format: 'html' },\n * ],\n * } as const);\n * ```\n */\nexport function defineTypedContentType<\n K extends string,\n F extends readonly FieldDefinition[]\n>(config: TypedContentType<K, F>): TypedContentType<K, F> {\n return config;\n}\n\n// =============================================================================\n// TypedEntryConfig and createEntry\n// =============================================================================\n\n/**\n * Entry configuration with typed data field.\n * Used internally by createEntry to enforce type safety.\n */\nexport interface TypedEntryConfig<Data extends Record<string, unknown>> {\n /** Unique identifier for this entry. Required for SDK sync. */\n identifier: string;\n /** Title for the entry */\n title?: string;\n /** Slug for routable entries */\n slug?: string;\n /** Status: 'draft' or 'published' */\n status?: 'draft' | 'published';\n /** Summary/description */\n summary?: string;\n /** SEO meta title */\n metaTitle?: string;\n /** SEO meta description */\n metaDescription?: string;\n /** Entry data matching the content type's field definitions */\n data: Data;\n}\n\n/**\n * Create a type-safe content entry for a typed content type.\n *\n * The data field is validated against the content type's field definitions.\n * TypeScript will error if:\n * - A required field is missing\n * - A field name is misspelled\n * - A field value has the wrong type\n * - An extra field is provided (with strict mode)\n *\n * @param contentType - The typed content type definition\n * @param entry - The entry configuration with typed data\n * @returns EntryConfig compatible with SDK content configuration\n *\n * @example\n * ```typescript\n * const entry = createEntry(testimonialType, {\n * identifier: 'testimonial-1',\n * title: 'John Doe',\n * status: 'published',\n * data: {\n * name: 'John Doe',\n * quote: tiptap.paragraph('Great service!'),\n * },\n * });\n * ```\n */\nexport function createEntry<\n K extends string,\n F extends readonly FieldDefinition[]\n>(\n contentType: TypedContentType<K, F>,\n entry: TypedEntryConfig<InferDataFromFields<F>>\n): EntryConfig {\n return {\n ...entry,\n contentType: contentType.key,\n };\n}\n\n// =============================================================================\n// TipTap Helpers\n// =============================================================================\n\n/**\n * Helpers for creating TipTap document structures.\n *\n * Use these helpers when populating richText fields to avoid manually\n * constructing the TipTap JSON structure.\n *\n * @example\n * ```typescript\n * // Simple paragraph\n * const body = tiptap.paragraph('Hello, world!');\n *\n * // Empty document\n * const emptyDoc = tiptap.empty();\n *\n * // Complex document\n * const doc = tiptap.doc([\n * tiptap.heading(1, 'Welcome'),\n * { type: 'paragraph', content: [{ type: 'text', text: 'Introduction...' }] },\n * ]);\n * ```\n */\nexport const tiptap = {\n /**\n * Create an empty TipTap document.\n *\n * @returns An empty TipTap document node\n */\n empty(): TipTapNode {\n return { type: 'doc', content: [] };\n },\n\n /**\n * Create a TipTap document with a single paragraph.\n *\n * @param text - The paragraph text content\n * @returns A TipTap document with one paragraph\n */\n paragraph(text: string): TipTapNode {\n return {\n type: 'doc',\n content: [\n {\n type: 'paragraph',\n content: text ? [{ type: 'text', text }] : [],\n },\n ],\n };\n },\n\n /**\n * Create a TipTap document with custom content nodes.\n *\n * @param content - Array of TipTap nodes to include in the document\n * @returns A TipTap document wrapping the content\n */\n doc(content: TipTapNode[]): TipTapNode {\n return { type: 'doc', content };\n },\n\n /**\n * Create a heading node.\n *\n * Note: This returns a heading node, not a document. Use with tiptap.doc()\n * to create a complete document.\n *\n * @param level - Heading level (1-6)\n * @param text - Heading text content\n * @returns A TipTap heading node\n */\n heading(level: 1 | 2 | 3 | 4 | 5 | 6, text: string): TipTapNode {\n return {\n type: 'heading',\n attrs: { level },\n content: [{ type: 'text', text }],\n };\n },\n};\n","/**\n * SDK Site Configuration\n *\n * Types and utilities for defining site-level configuration\n * that SDK sites expose to the dashboard.\n */\n\nimport type { RiverbankSiteConfig, ContentConfig } from './types';\n\n// Types\nexport type {\n RiverbankSiteConfig,\n SiteStyleConfig,\n SectionBackground,\n SectionOptionsConfig,\n ContainerOptionsConfig,\n SectionSpacing,\n ContainerMaxWidth,\n ContainerAlignment,\n SdkThemeConfig,\n SdkThemePalette,\n SdkCustomBlock,\n FieldSelectOption,\n BlockFieldConfig,\n BlockFieldOptionsMap,\n BlockFieldExtension,\n BlockFieldExtensionsMap,\n FieldDefinition,\n // Content scaffolding types\n ContentConfig,\n ContentTypeConfig,\n PageConfig,\n EntryConfig,\n BlockConfig,\n NavigationMenuConfig,\n NavigationItemConfig,\n NavigationLinkType,\n SiteSettingsConfig,\n} from './types';\n\n// Validation schemas\nexport {\n riverbankSiteConfigSchema,\n siteStyleConfigSchema,\n sectionBackgroundSchema,\n sectionSpacingSchema,\n containerMaxWidthSchema,\n containerAlignmentSchema,\n sectionOptionsSchema,\n containerOptionsSchema,\n sdkThemeConfigSchema,\n sdkThemePaletteSchema,\n sdkCustomBlockSchema,\n fieldSelectOptionSchema,\n blockFieldConfigSchema,\n blockFieldOptionsSchema,\n blockFieldExtensionSchema,\n blockFieldExtensionsSchema,\n // Content scaffolding schemas\n contentConfigSchema,\n} from './validation';\n\n// Content validation schemas for more granular use\nexport {\n contentTypeConfigSchema,\n pageConfigSchema,\n entryConfigSchema,\n navigationMenuConfigSchema,\n navigationItemConfigSchema,\n siteSettingsConfigSchema,\n blockConfigSchema,\n} from './content-validation';\n\nexport type {\n ValidatedRiverbankSiteConfig,\n ValidatedSdkCustomBlock,\n ContentConfigInput,\n ContentConfigOutput,\n} from './validation';\n\n// Block kind types (single source of truth from @riverbankcms/blocks)\nexport {\n SYSTEM_BLOCK_KINDS,\n type SystemBlockKind,\n type CustomBlockKind,\n type BlockKind,\n} from '../types';\n\n// Type-safe content entry helpers\nexport {\n defineTypedContentType,\n createEntry,\n tiptap,\n type TypedContentType,\n type TypedEntryConfig,\n type InferDataFromFields,\n type FieldValueType,\n} from './typed-entries';\n\n// Re-export value types for convenience when building entry data\nexport type {\n TipTapNode,\n Media,\n LinkValue,\n InternalLinkValue,\n ExternalLinkValue,\n CustomLinkValue,\n} from './typed-entries';\n\n/**\n * Helper function to define a Builder site configuration with type checking.\n *\n * @example\n * ```typescript\n * import { defineConfig } from '@riverbankcms/sdk/config';\n *\n * export default defineConfig({\n * siteId: '123e4567-e89b-12d3-a456-426614174000',\n * theme: {\n * palette: {\n * primary: '#6d28d9',\n * },\n * },\n * styles: {\n * sectionBackgrounds: [\n * { id: 'primary', label: 'Purple', token: 'primary' },\n * ],\n * },\n * });\n * ```\n */\nexport function defineConfig(config: RiverbankSiteConfig): RiverbankSiteConfig {\n return config;\n}\n\n/**\n * Helper function to define content scaffolding configuration with type checking.\n *\n * This can be used to define content configuration in a separate file,\n * which is then imported into riverbank.config.ts.\n *\n * @example\n * ```typescript\n * // content.config.ts\n * import { defineContentConfig } from '@riverbankcms/sdk/config';\n *\n * export const contentConfig = defineContentConfig({\n * contentTypes: [\n * {\n * key: 'testimonial',\n * name: 'Testimonial',\n * hasPages: false,\n * fields: [\n * { id: 'quote', type: 'richText', label: 'Quote', required: true },\n * ],\n * },\n * ],\n * pages: [\n * { identifier: 'home', title: 'Home', path: '/' },\n * ],\n * });\n *\n * // riverbank.config.ts\n * import { defineConfig } from '@riverbankcms/sdk/config';\n * import { contentConfig } from './content.config';\n *\n * export default defineConfig({\n * siteId: '...',\n * content: contentConfig,\n * });\n * ```\n */\nexport function defineContentConfig(config: ContentConfig): ContentConfig {\n return config;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgNO,SAAS,uBAGd,QAAwD;AACxD,SAAO;AACT;AAwDO,SAAS,YAId,aACA,OACa;AACb,SAAO;AAAA,IACL,GAAG;AAAA,IACH,aAAa,YAAY;AAAA,EAC3B;AACF;AA2BO,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpB,QAAoB;AAClB,WAAO,EAAE,MAAM,OAAO,SAAS,CAAC,EAAE;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,MAA0B;AAClC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,SAAS,OAAO,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,IAAI,CAAC;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,SAAmC;AACrC,WAAO,EAAE,MAAM,OAAO,QAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,QAAQ,OAA8B,MAA0B;AAC9D,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,EAAE,MAAM;AAAA,MACf,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,IAClC;AAAA,EACF;AACF;;;ACvOO,SAAS,aAAa,QAAkD;AAC7E,SAAO;AACT;AAuCO,SAAS,oBAAoB,QAAsC;AACxE,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/config/typed-entries.ts","../../src/config/index.ts"],"sourcesContent":["/**\n * Type-Safe Content Entries\n *\n * This module provides type-safe helpers for defining content types and entries\n * in SDK site configurations. When used with `as const`, TypeScript can infer\n * the exact shape of entry data from the content type's field definitions.\n *\n * @example\n * ```typescript\n * import { defineTypedContentType, createEntry, tiptap } from '@riverbankcms/sdk/config';\n *\n * // Define content type with `as const` for type inference\n * export const testimonialType = defineTypedContentType({\n * key: 'testimonial',\n * name: 'Testimonial',\n * hasPages: false,\n * fields: [\n * { id: 'name', type: 'text', label: 'Name', required: true, multiline: false },\n * { id: 'quote', type: 'richText', label: 'Quote', required: true, format: 'html' },\n * ],\n * } as const);\n *\n * // Create entry with full type safety\n * const entry = createEntry(testimonialType, {\n * identifier: 'testimonial-1',\n * data: {\n * name: 'John Doe', // TypeScript knows this is string\n * quote: tiptap.paragraph('Great service!'), // TypeScript knows this is TipTapNode\n * },\n * });\n * ```\n */\n\nimport type {\n FieldDefinition,\n TextFieldDefinition,\n RichTextFieldDefinition,\n MediaFieldDefinition,\n BooleanFieldDefinition,\n NumberFieldDefinition,\n DateFieldDefinition,\n TimeFieldDefinition,\n DateTimeFieldDefinition,\n SlugFieldDefinition,\n UrlFieldDefinition,\n LinkFieldDefinition,\n SelectFieldDefinition,\n ReferenceFieldDefinition,\n RepeaterFieldDefinition,\n GroupFieldDefinition,\n ModalFieldDefinition,\n TabGroupFieldDefinition,\n PresetOrCustomFieldDefinition,\n ContentTypeSelectFieldDefinition,\n EntryPickerFieldDefinition,\n TipTapNode,\n Media,\n LinkValue,\n} from '@riverbankcms/blocks';\nimport type { ContentTypeConfig, EntryConfig } from './content-types';\n\n// Re-export value types for convenience\nexport type { TipTapNode, Media, LinkValue } from '@riverbankcms/blocks';\nexport type {\n InternalLinkValue,\n ExternalLinkValue,\n CustomLinkValue,\n} from '@riverbankcms/blocks';\n\n// =============================================================================\n// Type Infrastructure\n// =============================================================================\n\n/**\n * Infers the data object shape from tabGroup tabs (flattens all tab fields).\n * TabGroup fields flatten all their tab fields into a single data object.\n */\ntype InferDataFromTabs<Tabs extends readonly { fields: readonly FieldDefinition[] }[]> =\n InferDataFromFields<Tabs[number]['fields']>;\n\n// NOTE: Polymorphic repeater type inference would require a helper like this,\n// but TypeScript's mapped types don't distribute correctly over union keys\n// when nested inside conditional types. Left as documentation for future work.\n// type PolymorphicItemData<K, IT> = K extends string\n// ? K extends keyof IT\n// ? IT[K] extends { fields: infer F extends readonly FieldDefinition[] }\n// ? { _type: K } & InferDataFromFields<F>\n// : never\n// : never\n// : never;\n\n/**\n * Maps a field definition to its TypeScript value type.\n * Uses conditional types to infer the correct type based on field.type.\n *\n * Coverage:\n * - Simple primitives: text, boolean, number\n * - Complex types: richText (TipTapNode), media (Media | null), link (LinkValue | null)\n * - Date/time: date, time, datetime (all ISO strings)\n * - String-value: slug, url, reference, presetOrCustom, contentTypeSelect\n * - Select: single (string) vs multiple (string[])\n * - Entry picker: string | null\n * - Nested: group, modal (nested InferDataFromFields)\n * - Repeater: monomorphic (array) and polymorphic (discriminated union array)\n * - TabGroup: flattened fields from all tabs\n */\nexport type FieldValueType<F extends FieldDefinition> =\n // Simple primitives - use specific field types for better inference\n F extends TextFieldDefinition ? string :\n F extends BooleanFieldDefinition ? boolean :\n F extends NumberFieldDefinition ? number :\n // Complex types\n F extends RichTextFieldDefinition ? TipTapNode :\n F extends MediaFieldDefinition ? Media | null :\n F extends LinkFieldDefinition ? LinkValue | null :\n // Date/time types (all stored as ISO strings)\n F extends DateFieldDefinition ? string :\n F extends TimeFieldDefinition ? string :\n F extends DateTimeFieldDefinition ? string :\n // String-value types\n F extends SlugFieldDefinition ? string :\n F extends UrlFieldDefinition ? string :\n F extends ReferenceFieldDefinition ? string :\n F extends PresetOrCustomFieldDefinition ? string :\n F extends ContentTypeSelectFieldDefinition ? string :\n // Select: check multiple flag first (more specific match)\n F extends SelectFieldDefinition & { multiple: true } ? string[] :\n F extends SelectFieldDefinition ? string :\n // Entry picker\n F extends EntryPickerFieldDefinition ? string | null :\n // Nested types (group, modal)\n F extends GroupFieldDefinition & { schema: { fields: infer GF } } ?\n GF extends readonly FieldDefinition[] ? InferDataFromFields<GF> : never :\n F extends ModalFieldDefinition & { schema: { fields: infer MF } } ?\n MF extends readonly FieldDefinition[] ? InferDataFromFields<MF> : never :\n // Repeater types (polymorphic first - more specific, then monomorphic)\n // TODO: Polymorphic repeaters need more complex type distribution.\n // For now, return unknown[] - the runtime data is still correct.\n F extends { type: 'repeater'; polymorphic: true } ? unknown[] :\n F extends RepeaterFieldDefinition & { schema: { fields: infer RF } } ?\n RF extends readonly FieldDefinition[] ? InferDataFromFields<RF>[] : never :\n // TabGroup (flattens all tab fields)\n F extends TabGroupFieldDefinition & { tabs: infer T } ?\n T extends readonly { fields: readonly FieldDefinition[] }[] ?\n InferDataFromTabs<T> : never :\n // Fallback for unknown types\n unknown;\n\n/**\n * Infers the data object shape from an array of field definitions.\n * Required fields are non-optional, optional fields are `| undefined`.\n *\n * @example\n * ```typescript\n * const fields = [\n * { id: 'name', type: 'text', required: true },\n * { id: 'bio', type: 'text', required: false },\n * ] as const;\n *\n * type Data = InferDataFromFields<typeof fields>;\n * // { name: string; bio: string | undefined }\n * ```\n */\nexport type InferDataFromFields<Fields extends readonly FieldDefinition[]> = {\n [F in Fields[number] as F['id']]: F extends { required: true }\n ? FieldValueType<F>\n : FieldValueType<F> | undefined;\n};\n\n// =============================================================================\n// TypedContentType\n// =============================================================================\n\n/**\n * A content type definition with preserved field types for type inference.\n * Extends ContentTypeConfig to ensure all required fields are present.\n * The generic parameters capture the literal types from `as const`.\n */\nexport interface TypedContentType<\n K extends string = string,\n F extends readonly FieldDefinition[] = readonly FieldDefinition[]\n> extends Omit<ContentTypeConfig, 'key' | 'fields'> {\n key: K;\n fields: F;\n}\n\n/**\n * Define a content type with preserved field types for type inference.\n *\n * IMPORTANT: Use `as const` on the config object to enable type inference.\n * Without `as const`, TypeScript widens literal types and inference won't work.\n *\n * @param config - The content type configuration\n * @returns The same config object with preserved types\n *\n * @example\n * ```typescript\n * export const testimonialType = defineTypedContentType({\n * key: 'testimonial',\n * name: 'Testimonial',\n * hasPages: false,\n * fields: [\n * { id: 'name', type: 'text', label: 'Name', required: true, multiline: false },\n * { id: 'quote', type: 'richText', label: 'Quote', required: true, format: 'html' },\n * ],\n * } as const);\n * ```\n */\nexport function defineTypedContentType<\n K extends string,\n F extends readonly FieldDefinition[]\n>(config: TypedContentType<K, F>): TypedContentType<K, F> {\n return config;\n}\n\n// =============================================================================\n// TypedEntryConfig and createEntry\n// =============================================================================\n\n/**\n * Entry configuration with typed data field.\n * Used internally by createEntry to enforce type safety.\n */\nexport interface TypedEntryConfig<Data extends Record<string, unknown>> {\n /** Unique identifier for this entry. Required for SDK sync. */\n identifier: string;\n /** Title for the entry */\n title?: string;\n /** Slug for routable entries */\n slug?: string;\n /** Status: 'draft' or 'published' */\n status?: 'draft' | 'published';\n /** Summary/description */\n summary?: string;\n /** SEO meta title */\n metaTitle?: string;\n /** SEO meta description */\n metaDescription?: string;\n /** Entry data matching the content type's field definitions */\n data: Data;\n}\n\n/**\n * Create a type-safe content entry for a typed content type.\n *\n * The data field is validated against the content type's field definitions.\n * TypeScript will error if:\n * - A required field is missing\n * - A field name is misspelled\n * - A field value has the wrong type\n * - An extra field is provided (with strict mode)\n *\n * @param contentType - The typed content type definition\n * @param entry - The entry configuration with typed data\n * @returns EntryConfig compatible with SDK content configuration\n *\n * @example\n * ```typescript\n * const entry = createEntry(testimonialType, {\n * identifier: 'testimonial-1',\n * title: 'John Doe',\n * status: 'published',\n * data: {\n * name: 'John Doe',\n * quote: tiptap.paragraph('Great service!'),\n * },\n * });\n * ```\n */\nexport function createEntry<\n K extends string,\n F extends readonly FieldDefinition[]\n>(\n contentType: TypedContentType<K, F>,\n entry: TypedEntryConfig<InferDataFromFields<F>>\n): EntryConfig {\n return {\n ...entry,\n contentType: contentType.key,\n };\n}\n\n// =============================================================================\n// TipTap Helpers\n// =============================================================================\n\n/**\n * Helpers for creating TipTap document structures.\n *\n * Use these helpers when populating richText fields to avoid manually\n * constructing the TipTap JSON structure.\n *\n * @example\n * ```typescript\n * // Simple paragraph\n * const body = tiptap.paragraph('Hello, world!');\n *\n * // Empty document\n * const emptyDoc = tiptap.empty();\n *\n * // Complex document\n * const doc = tiptap.doc([\n * tiptap.heading(1, 'Welcome'),\n * { type: 'paragraph', content: [{ type: 'text', text: 'Introduction...' }] },\n * ]);\n * ```\n */\nexport const tiptap = {\n /**\n * Create an empty TipTap document.\n *\n * @returns An empty TipTap document node\n */\n empty(): TipTapNode {\n return { type: 'doc', content: [] };\n },\n\n /**\n * Create a TipTap document with a single paragraph.\n *\n * @param text - The paragraph text content\n * @returns A TipTap document with one paragraph\n */\n paragraph(text: string): TipTapNode {\n return {\n type: 'doc',\n content: [\n {\n type: 'paragraph',\n content: text ? [{ type: 'text', text }] : [],\n },\n ],\n };\n },\n\n /**\n * Create a TipTap document with custom content nodes.\n *\n * @param content - Array of TipTap nodes to include in the document\n * @returns A TipTap document wrapping the content\n */\n doc(content: TipTapNode[]): TipTapNode {\n return { type: 'doc', content };\n },\n\n /**\n * Create a heading node.\n *\n * Note: This returns a heading node, not a document. Use with tiptap.doc()\n * to create a complete document.\n *\n * @param level - Heading level (1-6)\n * @param text - Heading text content\n * @returns A TipTap heading node\n */\n heading(level: 1 | 2 | 3 | 4 | 5 | 6, text: string): TipTapNode {\n return {\n type: 'heading',\n attrs: { level },\n content: [{ type: 'text', text }],\n };\n },\n};\n","/**\n * SDK Site Configuration\n *\n * Types and utilities for defining site-level configuration\n * that SDK sites expose to the dashboard.\n */\n\nimport type { RiverbankSiteConfig, ContentConfig } from './types';\n\n// Types\nexport type {\n RiverbankSiteConfig,\n SiteStyleConfig,\n SectionBackground,\n SectionOptionsConfig,\n ContainerOptionsConfig,\n SectionSpacing,\n ContainerMaxWidth,\n ContainerAlignment,\n SdkThemeConfig,\n SdkThemePalette,\n SdkCustomBlock,\n FieldSelectOption,\n BlockFieldConfig,\n BlockFieldOptionsMap,\n BlockFieldExtension,\n BlockFieldExtensionsMap,\n FieldDefinition,\n // Content scaffolding types\n ContentConfig,\n ContentTypeConfig,\n PageConfig,\n EntryConfig,\n BlockConfig,\n NavigationMenuConfig,\n NavigationItemConfig,\n NavigationLinkType,\n SiteSettingsConfig,\n} from './types';\n\n// Validation schemas\nexport {\n riverbankSiteConfigSchema,\n siteStyleConfigSchema,\n sectionBackgroundSchema,\n sectionSpacingSchema,\n containerMaxWidthSchema,\n containerAlignmentSchema,\n sectionOptionsSchema,\n containerOptionsSchema,\n sdkThemeConfigSchema,\n sdkThemePaletteSchema,\n sdkCustomBlockSchema,\n fieldSelectOptionSchema,\n blockFieldConfigSchema,\n blockFieldOptionsSchema,\n blockFieldExtensionSchema,\n blockFieldExtensionsSchema,\n // Content scaffolding schemas\n contentConfigSchema,\n} from './validation';\n\n// Content validation schemas for more granular use\nexport {\n contentTypeConfigSchema,\n pageConfigSchema,\n entryConfigSchema,\n navigationMenuConfigSchema,\n navigationItemConfigSchema,\n siteSettingsConfigSchema,\n blockConfigSchema,\n} from './content-validation';\n\nexport type {\n ValidatedRiverbankSiteConfig,\n ValidatedSdkCustomBlock,\n ContentConfigInput,\n ContentConfigOutput,\n} from './validation';\n\n// Block kind types (single source of truth from @riverbankcms/blocks)\nexport {\n SYSTEM_BLOCK_KINDS,\n type SystemBlockKind,\n type CustomBlockKind,\n type BlockKind,\n} from '../types';\n\n// Type-safe content entry helpers\nexport {\n defineTypedContentType,\n createEntry,\n tiptap,\n type TypedContentType,\n type TypedEntryConfig,\n type InferDataFromFields,\n type FieldValueType,\n} from './typed-entries';\n\n// Re-export value types for convenience when building entry data\nexport type {\n TipTapNode,\n Media,\n LinkValue,\n InternalLinkValue,\n ExternalLinkValue,\n CustomLinkValue,\n} from './typed-entries';\n\n/**\n * Helper function to define a Builder site configuration with type checking.\n *\n * @example\n * ```typescript\n * import { defineConfig } from '@riverbankcms/sdk/config';\n *\n * export default defineConfig({\n * siteId: '123e4567-e89b-12d3-a456-426614174000',\n * theme: {\n * palette: {\n * primary: '#6d28d9',\n * },\n * },\n * styles: {\n * sectionBackgrounds: [\n * { id: 'primary', label: 'Purple', token: 'primary' },\n * ],\n * },\n * });\n * ```\n */\nexport function defineConfig(config: RiverbankSiteConfig): RiverbankSiteConfig {\n return config;\n}\n\n/**\n * Helper function to define content scaffolding configuration with type checking.\n *\n * This can be used to define content configuration in a separate file,\n * which is then imported into riverbank.config.ts.\n *\n * @example\n * ```typescript\n * // content.config.ts\n * import { defineContentConfig } from '@riverbankcms/sdk/config';\n *\n * export const contentConfig = defineContentConfig({\n * contentTypes: [\n * {\n * key: 'testimonial',\n * name: 'Testimonial',\n * hasPages: false,\n * fields: [\n * { id: 'quote', type: 'richText', label: 'Quote', required: true },\n * ],\n * },\n * ],\n * pages: [\n * { identifier: 'home', title: 'Home', path: '/' },\n * ],\n * });\n *\n * // riverbank.config.ts\n * import { defineConfig } from '@riverbankcms/sdk/config';\n * import { contentConfig } from './content.config';\n *\n * export default defineConfig({\n * siteId: '...',\n * content: contentConfig,\n * });\n * ```\n */\nexport function defineContentConfig(config: ContentConfig): ContentConfig {\n return config;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgNO,SAAS,uBAGd,QAAwD;AACxD,SAAO;AACT;AAwDO,SAAS,YAId,aACA,OACa;AACb,SAAO;AAAA,IACL,GAAG;AAAA,IACH,aAAa,YAAY;AAAA,EAC3B;AACF;AA2BO,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpB,QAAoB;AAClB,WAAO,EAAE,MAAM,OAAO,SAAS,CAAC,EAAE;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,MAA0B;AAClC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,SAAS,OAAO,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,IAAI,CAAC;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,SAAmC;AACrC,WAAO,EAAE,MAAM,OAAO,QAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,QAAQ,OAA8B,MAA0B;AAC9D,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,EAAE,MAAM;AAAA,MACf,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,IAClC;AAAA,EACF;AACF;;;ACvOO,SAAS,aAAa,QAAkD;AAC7E,SAAO;AACT;AAuCO,SAAS,oBAAoB,QAAsC;AACxE,SAAO;AACT;","names":[]}
@@ -1,7 +1,7 @@
1
1
  import { P as PageOutline, S as SdkCustomBlock } from './schema-Z6-afHJG.mjs';
2
2
  import { P as PrefetchContext, R as ResolvedBlockData, D as DataLoaderOverrides } from './types-CbagRQ_7.mjs';
3
3
  export { B as BlockLoaderMap, a as DataLoaderContext, b as DataLoaderFn } from './types-CbagRQ_7.mjs';
4
- import { R as RiverbankClient } from './types-1cLz0vnq.mjs';
4
+ import { R as RiverbankClient } from './types-MF2AWoKv.mjs';
5
5
  import 'zod';
6
6
  import './blockKinds-B6MWzNWp.mjs';
7
7
  import './types-Dsu9wsUh.mjs';
@@ -1,7 +1,7 @@
1
1
  import { P as PageOutline, S as SdkCustomBlock } from './schema-Z6-afHJG.js';
2
2
  import { P as PrefetchContext, R as ResolvedBlockData, D as DataLoaderOverrides } from './types-DuQCNVV0.js';
3
3
  export { B as BlockLoaderMap, a as DataLoaderContext, b as DataLoaderFn } from './types-DuQCNVV0.js';
4
- import { R as RiverbankClient } from './types-BvcJU7zk.js';
4
+ import { R as RiverbankClient } from './types-DnkRh0UL.js';
5
5
  import 'zod';
6
6
  import './blockKinds-B6MWzNWp.js';
7
7
  import './types-CVykEqXN.js';
@@ -7,7 +7,6 @@ var _chunkY7347JMZjs = require('./chunk-Y7347JMZ.js');
7
7
 
8
8
  var _chunkRVDS7VSPjs = require('./chunk-RVDS7VSP.js');
9
9
  require('./chunk-YYO3RIFO.js');
10
- require('./chunk-DGUM43GV.js');
11
10
 
12
11
 
13
12
 
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/data.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,sDAA4B;AAC5B;AACE;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACA;AACA;AACA;AACF,qRAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/data.js"}
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/data.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,sDAA4B;AAC5B;AACE;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACA;AACA;AACA;AACF,qRAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/data.js"}
@@ -7,7 +7,6 @@ import {
7
7
  prefetchBlockData
8
8
  } from "./chunk-AEFWG657.mjs";
9
9
  import "./chunk-BYBJA6SP.mjs";
10
- import "./chunk-BJTO5JO5.mjs";
11
10
  export {
12
11
  SUPPORTED_LOADER_ENDPOINTS,
13
12
  executeCodeLoaders,
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Environment detection utilities for SDK
3
+ *
4
+ * Provides helpers for detecting preview mode and other environment states.
5
+ */
6
+ /**
7
+ * Detects if the current environment is in preview mode.
8
+ *
9
+ * Precedence:
10
+ * 1. RIVERBANK_PREVIEW env var (explicit override) - 'true' or 'false'
11
+ * 2. VERCEL_ENV === 'preview' (Vercel preview deployments)
12
+ * 3. Default: false (production behavior)
13
+ *
14
+ * In preview mode:
15
+ * - Draft content is visible
16
+ * - ISR revalidation is more aggressive
17
+ * - Cache bypass may be enabled
18
+ *
19
+ * @returns true if in preview mode, false otherwise
20
+ */
21
+ declare function isPreviewMode(): boolean;
22
+
23
+ export { isPreviewMode };
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Environment detection utilities for SDK
3
+ *
4
+ * Provides helpers for detecting preview mode and other environment states.
5
+ */
6
+ /**
7
+ * Detects if the current environment is in preview mode.
8
+ *
9
+ * Precedence:
10
+ * 1. RIVERBANK_PREVIEW env var (explicit override) - 'true' or 'false'
11
+ * 2. VERCEL_ENV === 'preview' (Vercel preview deployments)
12
+ * 3. Default: false (production behavior)
13
+ *
14
+ * In preview mode:
15
+ * - Draft content is visible
16
+ * - ISR revalidation is more aggressive
17
+ * - Cache bypass may be enabled
18
+ *
19
+ * @returns true if in preview mode, false otherwise
20
+ */
21
+ declare function isPreviewMode(): boolean;
22
+
23
+ export { isPreviewMode };
@@ -0,0 +1,7 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+ var _chunkWYNEYDXOjs = require('./chunk-WYNEYDXO.js');
4
+
5
+
6
+ exports.isPreviewMode = _chunkWYNEYDXOjs.isPreviewMode;
7
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/env.js"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B;AACE;AACF,uDAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/env.js"}
@@ -0,0 +1,7 @@
1
+ import {
2
+ isPreviewMode
3
+ } from "./chunk-LQUKXIW7.mjs";
4
+ export {
5
+ isPreviewMode
6
+ };
7
+ //# sourceMappingURL=env.mjs.map
@@ -1,5 +1,5 @@
1
- import { a as LoadPageResult } from './loadPage-B8mQUUSo.mjs';
2
- import { S as SiteResponse } from './types-1cLz0vnq.mjs';
1
+ import { a as LoadPageResult } from './loadPage-CxlYLe5K.mjs';
2
+ import { S as SiteResponse } from './types-MF2AWoKv.mjs';
3
3
 
4
4
  /**
5
5
  * Metadata generation helper for Next.js pages
@@ -1,4 +1,4 @@
1
- import { a as RiverbankClientConfig, R as RiverbankClient } from './types-1cLz0vnq.mjs';
1
+ import { a as RiverbankClientConfig, R as RiverbankClient } from './types-MF2AWoKv.mjs';
2
2
  import './schema-Z6-afHJG.mjs';
3
3
 
4
4
  /**
@@ -1,5 +1,5 @@
1
- import { a as LoadPageResult } from './loadPage-DP3nrHBi.js';
2
- import { S as SiteResponse } from './types-BvcJU7zk.js';
1
+ import { a as LoadPageResult } from './loadPage-i2r-X5b9.js';
2
+ import { S as SiteResponse } from './types-DnkRh0UL.js';
3
3
 
4
4
  /**
5
5
  * Metadata generation helper for Next.js pages
@@ -1,4 +1,4 @@
1
- import { a as RiverbankClientConfig, R as RiverbankClient } from './types-BvcJU7zk.js';
1
+ import { a as RiverbankClientConfig, R as RiverbankClient } from './types-DnkRh0UL.js';
2
2
  import './schema-Z6-afHJG.js';
3
3
 
4
4
  /**
@@ -1,5 +1,5 @@
1
- export { c as createRiverbankClient } from './index-Bucs6UqG.mjs';
2
- export { E as EntriesResponse, c as EntriesResponseWithMeta, b as EntryResponse, P as PageResponse, d as PaginationMeta, R as RiverbankClient, a as RiverbankClientConfig, S as SiteResponse } from './types-1cLz0vnq.mjs';
1
+ export { c as createRiverbankClient } from './index-Bkva0WAj.mjs';
2
+ export { E as EntriesResponse, c as EntriesResponseWithMeta, b as EntryResponse, P as PageResponse, d as PaginationMeta, R as RiverbankClient, a as RiverbankClientConfig, S as SiteResponse } from './types-MF2AWoKv.mjs';
3
3
  import { A as APIEndpoints, b as APICallParams } from './types-Dsu9wsUh.mjs';
4
4
  import './schema-Z6-afHJG.mjs';
5
5
  export { g as ContainerAlignment, f as ContainerMaxWidth, d as ContainerOptionsConfig, R as RiverbankSiteConfig, b as SectionBackground, c as SectionOptionsConfig, e as SectionSpacing, S as SiteStyleConfig } from './types-BjgZt8xJ.mjs';
@@ -35,7 +35,7 @@ interface ApiResponse<TData> {
35
35
  data: TData;
36
36
  meta: ResponseMeta;
37
37
  }
38
- type ApiErrorCode = 'auth:unauthenticated' | 'auth:token_expired' | 'auth:token_invalid' | 'auth:forbidden' | 'auth:mfa_required' | 'auth:sudo_required' | 'auth:insufficient_permissions' | 'auth:impersonation_restricted' | 'validation:invalid_input' | 'validation:missing_field' | 'validation:invalid_format' | 'validation:payload_too_large' | 'resource:not_found' | 'resource:already_exists' | 'resource:conflict' | 'resource:gone' | 'rate_limit:exceeded' | 'billing:payment_required' | 'billing:plan_limit_exceeded' | 'server:internal_error' | 'server:unavailable' | 'external:service_error';
38
+ type ApiErrorCode = 'auth:unauthenticated' | 'auth:token_expired' | 'auth:token_invalid' | 'auth:forbidden' | 'auth:mfa_required' | 'auth:sudo_required' | 'auth:insufficient_permissions' | 'auth:impersonation_restricted' | 'validation:invalid_input' | 'validation:missing_field' | 'validation:invalid_format' | 'validation:payload_too_large' | 'resource:not_found' | 'resource:already_exists' | 'resource:conflict' | 'resource:gone' | 'rate_limit:exceeded' | 'billing:payment_required' | 'billing:plan_limit_exceeded' | 'server:internal_error' | 'server:unavailable' | 'external:service_error' | 'network:connection_error' | 'network:timeout' | 'network:dns_error';
39
39
  interface FieldError {
40
40
  field: string;
41
41
  code: string;
@@ -1,5 +1,5 @@
1
- export { c as createRiverbankClient } from './index-Cp7tJuRt.js';
2
- export { E as EntriesResponse, c as EntriesResponseWithMeta, b as EntryResponse, P as PageResponse, d as PaginationMeta, R as RiverbankClient, a as RiverbankClientConfig, S as SiteResponse } from './types-BvcJU7zk.js';
1
+ export { c as createRiverbankClient } from './index-CSBWKA3r.js';
2
+ export { E as EntriesResponse, c as EntriesResponseWithMeta, b as EntryResponse, P as PageResponse, d as PaginationMeta, R as RiverbankClient, a as RiverbankClientConfig, S as SiteResponse } from './types-DnkRh0UL.js';
3
3
  import { A as APIEndpoints, b as APICallParams } from './types-CVykEqXN.js';
4
4
  import './schema-Z6-afHJG.js';
5
5
  export { g as ContainerAlignment, f as ContainerMaxWidth, d as ContainerOptionsConfig, R as RiverbankSiteConfig, b as SectionBackground, c as SectionOptionsConfig, e as SectionSpacing, S as SiteStyleConfig } from './types-DLBhEPSt.js';
@@ -35,7 +35,7 @@ interface ApiResponse<TData> {
35
35
  data: TData;
36
36
  meta: ResponseMeta;
37
37
  }
38
- type ApiErrorCode = 'auth:unauthenticated' | 'auth:token_expired' | 'auth:token_invalid' | 'auth:forbidden' | 'auth:mfa_required' | 'auth:sudo_required' | 'auth:insufficient_permissions' | 'auth:impersonation_restricted' | 'validation:invalid_input' | 'validation:missing_field' | 'validation:invalid_format' | 'validation:payload_too_large' | 'resource:not_found' | 'resource:already_exists' | 'resource:conflict' | 'resource:gone' | 'rate_limit:exceeded' | 'billing:payment_required' | 'billing:plan_limit_exceeded' | 'server:internal_error' | 'server:unavailable' | 'external:service_error';
38
+ type ApiErrorCode = 'auth:unauthenticated' | 'auth:token_expired' | 'auth:token_invalid' | 'auth:forbidden' | 'auth:mfa_required' | 'auth:sudo_required' | 'auth:insufficient_permissions' | 'auth:impersonation_restricted' | 'validation:invalid_input' | 'validation:missing_field' | 'validation:invalid_format' | 'validation:payload_too_large' | 'resource:not_found' | 'resource:already_exists' | 'resource:conflict' | 'resource:gone' | 'rate_limit:exceeded' | 'billing:payment_required' | 'billing:plan_limit_exceeded' | 'server:internal_error' | 'server:unavailable' | 'external:service_error' | 'network:connection_error' | 'network:timeout' | 'network:dns_error';
39
39
  interface FieldError {
40
40
  field: string;
41
41
  code: string;
@@ -5,8 +5,7 @@ var _chunkGERCMTPQjs = require('./chunk-GERCMTPQ.js');
5
5
 
6
6
 
7
7
 
8
- var _chunkP7UVAMK6js = require('./chunk-P7UVAMK6.js');
9
- require('./chunk-DGUM43GV.js');
8
+ var _chunkHMENX4Y7js = require('./chunk-HMENX4Y7.js');
10
9
 
11
10
  // ../api/src/aiPlayground.ts
12
11
  var _zod = require('zod');
@@ -101,5 +100,5 @@ var MultiPageUpdateResponse = _zod.z.object({
101
100
 
102
101
 
103
102
 
104
- exports.API_ENDPOINTS = _chunkP7UVAMK6js.API_ENDPOINTS; exports.SYSTEM_BLOCK_KINDS = _chunkGERCMTPQjs.SYSTEM_BLOCK_KINDS; exports.buildEndpointURL = _chunkP7UVAMK6js.buildEndpointURL; exports.createRiverbankClient = _chunkP7UVAMK6js.createRiverbankClient;
103
+ exports.API_ENDPOINTS = _chunkHMENX4Y7js.API_ENDPOINTS; exports.SYSTEM_BLOCK_KINDS = _chunkGERCMTPQjs.SYSTEM_BLOCK_KINDS; exports.buildEndpointURL = _chunkHMENX4Y7js.buildEndpointURL; exports.createRiverbankClient = _chunkHMENX4Y7js.createRiverbankClient;
105
104
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/index.js","../../../api/src/aiPlayground.ts"],"names":[],"mappings":"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","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/index.js","sourcesContent":[null,"import { z } from 'zod';\n\n/**\n * RFC-6902 JSON Patch Operations\n * Standard JSON Patch format for AI Playground content updates\n */\n\nexport const Rfc6902PatchOp = z.discriminatedUnion('op', [\n // Standard RFC-6902 operations\n z.object({\n op: z.literal('add'),\n path: z.string(),\n value: z.unknown(),\n }),\n z.object({\n op: z.literal('remove'),\n path: z.string(),\n }),\n z.object({\n op: z.literal('replace'),\n path: z.string(),\n value: z.unknown(),\n }),\n z.object({\n op: z.literal('move'),\n from: z.string(),\n path: z.string(),\n }),\n z.object({\n op: z.literal('copy'),\n from: z.string(),\n path: z.string(),\n }),\n // Block-level operations (Phase 2)\n z.object({\n op: z.literal('add_block'),\n blockKind: z.string(),\n afterBlockId: z.string().nullable(),\n content: z.record(z.string(), z.unknown()),\n rationale: z.string(),\n }),\n z.object({\n op: z.literal('delete_block'),\n blockId: z.string(),\n rationale: z.string(),\n }),\n z.object({\n op: z.literal('reorder_block'),\n blockId: z.string(),\n afterBlockId: z.string().nullable(),\n rationale: z.string(),\n }),\n]);\n\nexport const PatchEnvelope = z.object({\n blockId: z.string(),\n blockKind: z.string().optional(),\n blockPurpose: z.string().optional().nullable(),\n ops: z.array(Rfc6902PatchOp),\n rationale: z.string(),\n currentContent: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const ContentUpdateResponse = z.object({\n patches: z.array(PatchEnvelope),\n assistantMessage: z.string(),\n});\n\nexport const PlaygroundProposeRequest = z.object({\n request: z.string().min(1).max(2000),\n});\n\nexport const PlaygroundProposeResponse = z.object({\n patches: z.array(PatchEnvelope),\n assistantMessage: z.string(),\n validation: z.object({\n valid: z.boolean(),\n issues: z.array(z.string()),\n filtered: z.number(),\n }),\n});\n\n// Multi-page schemas (Phase 2)\nexport const MultiPagePatchEnvelope = z.object({\n pageId: z.string(),\n blockId: z.string().optional(), // Not present for page-level ops\n blockKind: z.string().optional(),\n blockPurpose: z.string().optional().nullable(),\n ops: z.array(Rfc6902PatchOp),\n rationale: z.string(),\n currentContent: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const MultiPageUpdateResponse = z.object({\n patches: z.array(MultiPagePatchEnvelope),\n assistantMessage: z.string(),\n pagesModified: z.number(),\n toolCallsUsed: z.number(),\n});\n\n// Stream event types for real-time updates\nexport type StreamEvent =\n | { type: 'status'; message: string; detail?: string }\n | { type: 'tool_call'; tool: string; args: unknown }\n | { type: 'tool_result'; tool: string; summary: string }\n | { type: 'patch_group'; envelope: MultiPagePatchEnvelope }\n | { type: 'complete'; response: MultiPageUpdateResponse };\n\n// Types - export both the schemas and the inferred types\nexport type Rfc6902PatchOp = z.infer<typeof Rfc6902PatchOp>;\nexport type PatchEnvelope = z.infer<typeof PatchEnvelope>;\nexport type ContentUpdateResponse = z.infer<typeof ContentUpdateResponse>;\nexport type PlaygroundProposeRequest = z.infer<typeof PlaygroundProposeRequest>;\nexport type PlaygroundProposeResponse = z.infer<typeof PlaygroundProposeResponse>;\nexport type MultiPagePatchEnvelope = z.infer<typeof MultiPagePatchEnvelope>;\nexport type MultiPageUpdateResponse = z.infer<typeof MultiPageUpdateResponse>;\n\n// Re-export schemas for runtime validation\nexport {\n Rfc6902PatchOp as Rfc6902PatchOpSchema,\n PatchEnvelope as PatchEnvelopeSchema,\n ContentUpdateResponse as ContentUpdateResponseSchema,\n PlaygroundProposeRequest as PlaygroundProposeRequestSchema,\n PlaygroundProposeResponse as PlaygroundProposeResponseSchema,\n MultiPagePatchEnvelope as MultiPagePatchEnvelopeSchema,\n MultiPageUpdateResponse as MultiPageUpdateResponseSchema,\n};\n\n// Page context types for building AI prompts\nexport type AllowedField = {\n path: string;\n type: 'richtext' | 'plaintext' | 'url' | 'number' | 'boolean';\n};\n\nexport type BlockContext = {\n id: string;\n kind: string;\n purpose: string | null;\n orderIndex: number;\n allowedPaths: string[]; // Legacy, kept for backward compat\n allowedFields?: AllowedField[]; // New structured format with types\n content: Record<string, unknown>;\n};\n\nexport type PageContext = {\n site: {\n id: string;\n title: string;\n primaryDomain: string | null;\n };\n page: {\n id: string;\n path: string;\n title: string;\n slug: string | null;\n metaTitle: string | null;\n metaDescription: string | null;\n blocks: BlockContext[];\n };\n};\n"]}
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/index.js","../../../api/src/aiPlayground.ts"],"names":[],"mappings":"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","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/index.js","sourcesContent":[null,"import { z } from 'zod';\n\n/**\n * RFC-6902 JSON Patch Operations\n * Standard JSON Patch format for AI Playground content updates\n */\n\nexport const Rfc6902PatchOp = z.discriminatedUnion('op', [\n // Standard RFC-6902 operations\n z.object({\n op: z.literal('add'),\n path: z.string(),\n value: z.unknown(),\n }),\n z.object({\n op: z.literal('remove'),\n path: z.string(),\n }),\n z.object({\n op: z.literal('replace'),\n path: z.string(),\n value: z.unknown(),\n }),\n z.object({\n op: z.literal('move'),\n from: z.string(),\n path: z.string(),\n }),\n z.object({\n op: z.literal('copy'),\n from: z.string(),\n path: z.string(),\n }),\n // Block-level operations (Phase 2)\n z.object({\n op: z.literal('add_block'),\n blockKind: z.string(),\n afterBlockId: z.string().nullable(),\n content: z.record(z.string(), z.unknown()),\n rationale: z.string(),\n }),\n z.object({\n op: z.literal('delete_block'),\n blockId: z.string(),\n rationale: z.string(),\n }),\n z.object({\n op: z.literal('reorder_block'),\n blockId: z.string(),\n afterBlockId: z.string().nullable(),\n rationale: z.string(),\n }),\n]);\n\nexport const PatchEnvelope = z.object({\n blockId: z.string(),\n blockKind: z.string().optional(),\n blockPurpose: z.string().optional().nullable(),\n ops: z.array(Rfc6902PatchOp),\n rationale: z.string(),\n currentContent: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const ContentUpdateResponse = z.object({\n patches: z.array(PatchEnvelope),\n assistantMessage: z.string(),\n});\n\nexport const PlaygroundProposeRequest = z.object({\n request: z.string().min(1).max(2000),\n});\n\nexport const PlaygroundProposeResponse = z.object({\n patches: z.array(PatchEnvelope),\n assistantMessage: z.string(),\n validation: z.object({\n valid: z.boolean(),\n issues: z.array(z.string()),\n filtered: z.number(),\n }),\n});\n\n// Multi-page schemas (Phase 2)\nexport const MultiPagePatchEnvelope = z.object({\n pageId: z.string(),\n blockId: z.string().optional(), // Not present for page-level ops\n blockKind: z.string().optional(),\n blockPurpose: z.string().optional().nullable(),\n ops: z.array(Rfc6902PatchOp),\n rationale: z.string(),\n currentContent: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const MultiPageUpdateResponse = z.object({\n patches: z.array(MultiPagePatchEnvelope),\n assistantMessage: z.string(),\n pagesModified: z.number(),\n toolCallsUsed: z.number(),\n});\n\n// Stream event types for real-time updates\nexport type StreamEvent =\n | { type: 'status'; message: string; detail?: string }\n | { type: 'tool_call'; tool: string; args: unknown }\n | { type: 'tool_result'; tool: string; summary: string }\n | { type: 'patch_group'; envelope: MultiPagePatchEnvelope }\n | { type: 'complete'; response: MultiPageUpdateResponse };\n\n// Types - export both the schemas and the inferred types\nexport type Rfc6902PatchOp = z.infer<typeof Rfc6902PatchOp>;\nexport type PatchEnvelope = z.infer<typeof PatchEnvelope>;\nexport type ContentUpdateResponse = z.infer<typeof ContentUpdateResponse>;\nexport type PlaygroundProposeRequest = z.infer<typeof PlaygroundProposeRequest>;\nexport type PlaygroundProposeResponse = z.infer<typeof PlaygroundProposeResponse>;\nexport type MultiPagePatchEnvelope = z.infer<typeof MultiPagePatchEnvelope>;\nexport type MultiPageUpdateResponse = z.infer<typeof MultiPageUpdateResponse>;\n\n// Re-export schemas for runtime validation\nexport {\n Rfc6902PatchOp as Rfc6902PatchOpSchema,\n PatchEnvelope as PatchEnvelopeSchema,\n ContentUpdateResponse as ContentUpdateResponseSchema,\n PlaygroundProposeRequest as PlaygroundProposeRequestSchema,\n PlaygroundProposeResponse as PlaygroundProposeResponseSchema,\n MultiPagePatchEnvelope as MultiPagePatchEnvelopeSchema,\n MultiPageUpdateResponse as MultiPageUpdateResponseSchema,\n};\n\n// Page context types for building AI prompts\nexport type AllowedField = {\n path: string;\n type: 'richtext' | 'plaintext' | 'url' | 'number' | 'boolean';\n};\n\nexport type BlockContext = {\n id: string;\n kind: string;\n purpose: string | null;\n orderIndex: number;\n allowedPaths: string[]; // Legacy, kept for backward compat\n allowedFields?: AllowedField[]; // New structured format with types\n content: Record<string, unknown>;\n};\n\nexport type PageContext = {\n site: {\n id: string;\n title: string;\n primaryDomain: string | null;\n };\n page: {\n id: string;\n path: string;\n title: string;\n slug: string | null;\n metaTitle: string | null;\n metaDescription: string | null;\n blocks: BlockContext[];\n };\n};\n"]}
@@ -5,8 +5,7 @@ import {
5
5
  API_ENDPOINTS,
6
6
  buildEndpointURL,
7
7
  createRiverbankClient
8
- } from "./chunk-7FIJSGHU.mjs";
9
- import "./chunk-BJTO5JO5.mjs";
8
+ } from "./chunk-5JT452F2.mjs";
10
9
 
11
10
  // ../api/src/aiPlayground.ts
12
11
  import { z } from "zod";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../api/src/aiPlayground.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * RFC-6902 JSON Patch Operations\n * Standard JSON Patch format for AI Playground content updates\n */\n\nexport const Rfc6902PatchOp = z.discriminatedUnion('op', [\n // Standard RFC-6902 operations\n z.object({\n op: z.literal('add'),\n path: z.string(),\n value: z.unknown(),\n }),\n z.object({\n op: z.literal('remove'),\n path: z.string(),\n }),\n z.object({\n op: z.literal('replace'),\n path: z.string(),\n value: z.unknown(),\n }),\n z.object({\n op: z.literal('move'),\n from: z.string(),\n path: z.string(),\n }),\n z.object({\n op: z.literal('copy'),\n from: z.string(),\n path: z.string(),\n }),\n // Block-level operations (Phase 2)\n z.object({\n op: z.literal('add_block'),\n blockKind: z.string(),\n afterBlockId: z.string().nullable(),\n content: z.record(z.string(), z.unknown()),\n rationale: z.string(),\n }),\n z.object({\n op: z.literal('delete_block'),\n blockId: z.string(),\n rationale: z.string(),\n }),\n z.object({\n op: z.literal('reorder_block'),\n blockId: z.string(),\n afterBlockId: z.string().nullable(),\n rationale: z.string(),\n }),\n]);\n\nexport const PatchEnvelope = z.object({\n blockId: z.string(),\n blockKind: z.string().optional(),\n blockPurpose: z.string().optional().nullable(),\n ops: z.array(Rfc6902PatchOp),\n rationale: z.string(),\n currentContent: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const ContentUpdateResponse = z.object({\n patches: z.array(PatchEnvelope),\n assistantMessage: z.string(),\n});\n\nexport const PlaygroundProposeRequest = z.object({\n request: z.string().min(1).max(2000),\n});\n\nexport const PlaygroundProposeResponse = z.object({\n patches: z.array(PatchEnvelope),\n assistantMessage: z.string(),\n validation: z.object({\n valid: z.boolean(),\n issues: z.array(z.string()),\n filtered: z.number(),\n }),\n});\n\n// Multi-page schemas (Phase 2)\nexport const MultiPagePatchEnvelope = z.object({\n pageId: z.string(),\n blockId: z.string().optional(), // Not present for page-level ops\n blockKind: z.string().optional(),\n blockPurpose: z.string().optional().nullable(),\n ops: z.array(Rfc6902PatchOp),\n rationale: z.string(),\n currentContent: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const MultiPageUpdateResponse = z.object({\n patches: z.array(MultiPagePatchEnvelope),\n assistantMessage: z.string(),\n pagesModified: z.number(),\n toolCallsUsed: z.number(),\n});\n\n// Stream event types for real-time updates\nexport type StreamEvent =\n | { type: 'status'; message: string; detail?: string }\n | { type: 'tool_call'; tool: string; args: unknown }\n | { type: 'tool_result'; tool: string; summary: string }\n | { type: 'patch_group'; envelope: MultiPagePatchEnvelope }\n | { type: 'complete'; response: MultiPageUpdateResponse };\n\n// Types - export both the schemas and the inferred types\nexport type Rfc6902PatchOp = z.infer<typeof Rfc6902PatchOp>;\nexport type PatchEnvelope = z.infer<typeof PatchEnvelope>;\nexport type ContentUpdateResponse = z.infer<typeof ContentUpdateResponse>;\nexport type PlaygroundProposeRequest = z.infer<typeof PlaygroundProposeRequest>;\nexport type PlaygroundProposeResponse = z.infer<typeof PlaygroundProposeResponse>;\nexport type MultiPagePatchEnvelope = z.infer<typeof MultiPagePatchEnvelope>;\nexport type MultiPageUpdateResponse = z.infer<typeof MultiPageUpdateResponse>;\n\n// Re-export schemas for runtime validation\nexport {\n Rfc6902PatchOp as Rfc6902PatchOpSchema,\n PatchEnvelope as PatchEnvelopeSchema,\n ContentUpdateResponse as ContentUpdateResponseSchema,\n PlaygroundProposeRequest as PlaygroundProposeRequestSchema,\n PlaygroundProposeResponse as PlaygroundProposeResponseSchema,\n MultiPagePatchEnvelope as MultiPagePatchEnvelopeSchema,\n MultiPageUpdateResponse as MultiPageUpdateResponseSchema,\n};\n\n// Page context types for building AI prompts\nexport type AllowedField = {\n path: string;\n type: 'richtext' | 'plaintext' | 'url' | 'number' | 'boolean';\n};\n\nexport type BlockContext = {\n id: string;\n kind: string;\n purpose: string | null;\n orderIndex: number;\n allowedPaths: string[]; // Legacy, kept for backward compat\n allowedFields?: AllowedField[]; // New structured format with types\n content: Record<string, unknown>;\n};\n\nexport type PageContext = {\n site: {\n id: string;\n title: string;\n primaryDomain: string | null;\n };\n page: {\n id: string;\n path: string;\n title: string;\n slug: string | null;\n metaTitle: string | null;\n metaDescription: string | null;\n blocks: BlockContext[];\n };\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../api/src/aiPlayground.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * RFC-6902 JSON Patch Operations\n * Standard JSON Patch format for AI Playground content updates\n */\n\nexport const Rfc6902PatchOp = z.discriminatedUnion('op', [\n // Standard RFC-6902 operations\n z.object({\n op: z.literal('add'),\n path: z.string(),\n value: z.unknown(),\n }),\n z.object({\n op: z.literal('remove'),\n path: z.string(),\n }),\n z.object({\n op: z.literal('replace'),\n path: z.string(),\n value: z.unknown(),\n }),\n z.object({\n op: z.literal('move'),\n from: z.string(),\n path: z.string(),\n }),\n z.object({\n op: z.literal('copy'),\n from: z.string(),\n path: z.string(),\n }),\n // Block-level operations (Phase 2)\n z.object({\n op: z.literal('add_block'),\n blockKind: z.string(),\n afterBlockId: z.string().nullable(),\n content: z.record(z.string(), z.unknown()),\n rationale: z.string(),\n }),\n z.object({\n op: z.literal('delete_block'),\n blockId: z.string(),\n rationale: z.string(),\n }),\n z.object({\n op: z.literal('reorder_block'),\n blockId: z.string(),\n afterBlockId: z.string().nullable(),\n rationale: z.string(),\n }),\n]);\n\nexport const PatchEnvelope = z.object({\n blockId: z.string(),\n blockKind: z.string().optional(),\n blockPurpose: z.string().optional().nullable(),\n ops: z.array(Rfc6902PatchOp),\n rationale: z.string(),\n currentContent: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const ContentUpdateResponse = z.object({\n patches: z.array(PatchEnvelope),\n assistantMessage: z.string(),\n});\n\nexport const PlaygroundProposeRequest = z.object({\n request: z.string().min(1).max(2000),\n});\n\nexport const PlaygroundProposeResponse = z.object({\n patches: z.array(PatchEnvelope),\n assistantMessage: z.string(),\n validation: z.object({\n valid: z.boolean(),\n issues: z.array(z.string()),\n filtered: z.number(),\n }),\n});\n\n// Multi-page schemas (Phase 2)\nexport const MultiPagePatchEnvelope = z.object({\n pageId: z.string(),\n blockId: z.string().optional(), // Not present for page-level ops\n blockKind: z.string().optional(),\n blockPurpose: z.string().optional().nullable(),\n ops: z.array(Rfc6902PatchOp),\n rationale: z.string(),\n currentContent: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport const MultiPageUpdateResponse = z.object({\n patches: z.array(MultiPagePatchEnvelope),\n assistantMessage: z.string(),\n pagesModified: z.number(),\n toolCallsUsed: z.number(),\n});\n\n// Stream event types for real-time updates\nexport type StreamEvent =\n | { type: 'status'; message: string; detail?: string }\n | { type: 'tool_call'; tool: string; args: unknown }\n | { type: 'tool_result'; tool: string; summary: string }\n | { type: 'patch_group'; envelope: MultiPagePatchEnvelope }\n | { type: 'complete'; response: MultiPageUpdateResponse };\n\n// Types - export both the schemas and the inferred types\nexport type Rfc6902PatchOp = z.infer<typeof Rfc6902PatchOp>;\nexport type PatchEnvelope = z.infer<typeof PatchEnvelope>;\nexport type ContentUpdateResponse = z.infer<typeof ContentUpdateResponse>;\nexport type PlaygroundProposeRequest = z.infer<typeof PlaygroundProposeRequest>;\nexport type PlaygroundProposeResponse = z.infer<typeof PlaygroundProposeResponse>;\nexport type MultiPagePatchEnvelope = z.infer<typeof MultiPagePatchEnvelope>;\nexport type MultiPageUpdateResponse = z.infer<typeof MultiPageUpdateResponse>;\n\n// Re-export schemas for runtime validation\nexport {\n Rfc6902PatchOp as Rfc6902PatchOpSchema,\n PatchEnvelope as PatchEnvelopeSchema,\n ContentUpdateResponse as ContentUpdateResponseSchema,\n PlaygroundProposeRequest as PlaygroundProposeRequestSchema,\n PlaygroundProposeResponse as PlaygroundProposeResponseSchema,\n MultiPagePatchEnvelope as MultiPagePatchEnvelopeSchema,\n MultiPageUpdateResponse as MultiPageUpdateResponseSchema,\n};\n\n// Page context types for building AI prompts\nexport type AllowedField = {\n path: string;\n type: 'richtext' | 'plaintext' | 'url' | 'number' | 'boolean';\n};\n\nexport type BlockContext = {\n id: string;\n kind: string;\n purpose: string | null;\n orderIndex: number;\n allowedPaths: string[]; // Legacy, kept for backward compat\n allowedFields?: AllowedField[]; // New structured format with types\n content: Record<string, unknown>;\n};\n\nexport type PageContext = {\n site: {\n id: string;\n title: string;\n primaryDomain: string | null;\n };\n page: {\n id: string;\n path: string;\n title: string;\n slug: string | null;\n metaTitle: string | null;\n metaDescription: string | null;\n blocks: BlockContext[];\n };\n};\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  import { T as Theme } from './types-CVykEqXN.js';
2
2
  import './schema-Z6-afHJG.js';
3
- import { R as RiverbankClient, S as SiteResponse } from './types-BvcJU7zk.js';
4
- import { P as PageProps } from './loadPage-DP3nrHBi.js';
3
+ import { R as RiverbankClient, S as SiteResponse } from './types-DnkRh0UL.js';
4
+ import { P as PageProps } from './loadPage-i2r-X5b9.js';
5
5
  import { R as ResolvedBlockData } from './types-DuQCNVV0.js';
6
6
 
7
7
  /**
@@ -1,7 +1,7 @@
1
1
  import { T as Theme } from './types-Dsu9wsUh.mjs';
2
2
  import './schema-Z6-afHJG.mjs';
3
- import { R as RiverbankClient, S as SiteResponse } from './types-1cLz0vnq.mjs';
4
- import { P as PageProps } from './loadPage-B8mQUUSo.mjs';
3
+ import { R as RiverbankClient, S as SiteResponse } from './types-MF2AWoKv.mjs';
4
+ import { P as PageProps } from './loadPage-CxlYLe5K.mjs';
5
5
  import { R as ResolvedBlockData } from './types-CbagRQ_7.mjs';
6
6
 
7
7
  /**
@@ -4,8 +4,7 @@ var _chunkP3NNN73Gjs = require('./chunk-P3NNN73G.js');
4
4
  require('./chunk-Y7347JMZ.js');
5
5
  require('./chunk-RVDS7VSP.js');
6
6
  require('./chunk-YYO3RIFO.js');
7
- require('./chunk-DGUM43GV.js');
8
7
 
9
8
 
10
9
  exports.loadPage = _chunkP3NNN73Gjs.loadPage;
11
- //# sourceMappingURL=loadPage-IDGVDFBB.js.map
10
+ //# sourceMappingURL=loadPage-6I7F6GRF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/loadPage-6I7F6GRF.js"],"names":[],"mappings":"AAAA;AACE;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACF,6CAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/loadPage-6I7F6GRF.js"}
@@ -1,4 +1,4 @@
1
- import { R as RiverbankClient, S as SiteResponse } from './types-1cLz0vnq.mjs';
1
+ import { R as RiverbankClient, S as SiteResponse } from './types-MF2AWoKv.mjs';
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';
@@ -4,8 +4,7 @@ import {
4
4
  import "./chunk-A2FZMRDW.mjs";
5
5
  import "./chunk-AEFWG657.mjs";
6
6
  import "./chunk-BYBJA6SP.mjs";
7
- import "./chunk-BJTO5JO5.mjs";
8
7
  export {
9
8
  loadPage
10
9
  };
11
- //# sourceMappingURL=loadPage-DNQTTRHL.mjs.map
10
+ //# sourceMappingURL=loadPage-JI2SML4M.mjs.map