@riverbankcms/sdk 0.4.1 → 0.4.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 (101) hide show
  1. package/README.md +73 -0
  2. package/dist/cli/index.js +46 -5
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/client/client.d.mts +3 -3
  5. package/dist/client/client.d.ts +3 -3
  6. package/dist/client/client.js +80 -170
  7. package/dist/client/client.js.map +1 -1
  8. package/dist/client/client.mjs +80 -170
  9. package/dist/client/client.mjs.map +1 -1
  10. package/dist/client/hooks.d.mts +3 -3
  11. package/dist/client/hooks.d.ts +3 -3
  12. package/dist/client/rendering/client.d.mts +1 -1
  13. package/dist/client/rendering/client.d.ts +1 -1
  14. package/dist/client/rendering/client.js +80 -142
  15. package/dist/client/rendering/client.js.map +1 -1
  16. package/dist/client/rendering/client.mjs +80 -142
  17. package/dist/client/rendering/client.mjs.map +1 -1
  18. package/dist/client/resolver-CYyfzTQ9.d.mts +61 -0
  19. package/dist/client/resolver-CYyfzTQ9.d.ts +61 -0
  20. package/dist/client/usePage-BC8Q2E3t.d.mts +6431 -0
  21. package/dist/client/usePage-CHEybPMD.d.ts +6429 -0
  22. package/dist/client/usePage-D4fxZbRR.d.mts +6429 -0
  23. package/dist/client/usePage-DpRNZUtP.d.ts +6431 -0
  24. package/dist/server/{Layout-B_zUr9ci.d.mts → Layout-ByUnm35V.d.mts} +1 -1
  25. package/dist/server/{Layout-CHG77dhK.d.ts → Layout-kRv5sU81.d.ts} +1 -1
  26. package/dist/server/{chunk-ZIM53VP6.js → chunk-6JBKKV3G.js} +27 -4
  27. package/dist/server/chunk-6JBKKV3G.js.map +1 -0
  28. package/dist/server/{chunk-SFQ7VF3G.mjs → chunk-7BOIO2S7.mjs} +7 -5
  29. package/dist/server/{chunk-SFQ7VF3G.mjs.map → chunk-7BOIO2S7.mjs.map} +1 -1
  30. package/dist/server/{chunk-P6CDRJN3.js → chunk-BLKVTULP.js} +13 -11
  31. package/dist/server/chunk-BLKVTULP.js.map +1 -0
  32. package/dist/server/{chunk-BOHTTHY5.mjs → chunk-I6K5REFT.mjs} +27 -4
  33. package/dist/server/chunk-I6K5REFT.mjs.map +1 -0
  34. package/dist/server/{chunk-BUCJWG6G.js → chunk-NW5KHH4A.js} +5 -5
  35. package/dist/server/{chunk-BUCJWG6G.js.map → chunk-NW5KHH4A.js.map} +1 -1
  36. package/dist/server/{chunk-XK2YIISA.mjs → chunk-SPXMMX3C.mjs} +2 -2
  37. package/dist/server/{chunk-IT5ICP43.js → chunk-TKMA6D6U.js} +139 -229
  38. package/dist/server/chunk-TKMA6D6U.js.map +1 -0
  39. package/dist/server/{chunk-NKXS4TBK.mjs → chunk-TNRADRPH.mjs} +79 -169
  40. package/dist/server/chunk-TNRADRPH.mjs.map +1 -0
  41. package/dist/server/{components-Bo3LPpVb.d.mts → components-CY8jDQjv.d.mts} +20 -12
  42. package/dist/server/{components-ClFs4PUa.d.ts → components-D1Z2mSDr.d.ts} +20 -12
  43. package/dist/server/components.d.mts +5 -5
  44. package/dist/server/components.d.ts +5 -5
  45. package/dist/server/components.js +3 -3
  46. package/dist/server/components.mjs +2 -2
  47. package/dist/server/config-validation.d.mts +2 -2
  48. package/dist/server/config-validation.d.ts +2 -2
  49. package/dist/server/config-validation.js +3 -3
  50. package/dist/server/config-validation.mjs +2 -2
  51. package/dist/server/config.d.mts +3 -3
  52. package/dist/server/config.d.ts +3 -3
  53. package/dist/server/config.js +3 -3
  54. package/dist/server/config.mjs +2 -2
  55. package/dist/server/data.d.mts +2 -2
  56. package/dist/server/data.d.ts +2 -2
  57. package/dist/server/{index-DbSfrRA0.d.ts → index-DCIz9Ptv.d.ts} +1 -1
  58. package/dist/server/{index-Dj7VKH34.d.mts → index-DFQwtj3J.d.mts} +1 -1
  59. package/dist/server/index.d.mts +4 -4
  60. package/dist/server/index.d.ts +4 -4
  61. package/dist/server/{loadContent-C_FipaAC.d.mts → loadContent-CWuE8FCx.d.mts} +3 -3
  62. package/dist/server/{loadContent-C2SwqmXy.d.ts → loadContent-DynBuR5f.d.ts} +3 -3
  63. package/dist/server/{loadPage-mavT3Jae.d.mts → loadPage-B8RmlYgV.d.mts} +60 -27
  64. package/dist/server/{loadPage-naVvoua8.d.ts → loadPage-BTkKpizX.d.ts} +60 -27
  65. package/dist/server/metadata.d.mts +3 -3
  66. package/dist/server/metadata.d.ts +3 -3
  67. package/dist/server/navigation.d.mts +2 -2
  68. package/dist/server/navigation.d.ts +2 -2
  69. package/dist/server/rendering/server.d.mts +4 -4
  70. package/dist/server/rendering/server.d.ts +4 -4
  71. package/dist/server/rendering/server.js +4 -4
  72. package/dist/server/rendering/server.mjs +3 -3
  73. package/dist/server/rendering.d.mts +7 -7
  74. package/dist/server/rendering.d.ts +7 -7
  75. package/dist/server/rendering.js +4 -4
  76. package/dist/server/rendering.mjs +3 -3
  77. package/dist/server/routing.d.mts +78 -5
  78. package/dist/server/routing.d.ts +78 -5
  79. package/dist/server/routing.js +56 -2
  80. package/dist/server/routing.js.map +1 -1
  81. package/dist/server/routing.mjs +54 -0
  82. package/dist/server/routing.mjs.map +1 -1
  83. package/dist/server/server.d.mts +5 -5
  84. package/dist/server/server.d.ts +5 -5
  85. package/dist/server/theme-bridge.js +7 -7
  86. package/dist/server/theme-bridge.mjs +1 -1
  87. package/dist/server/{types-5XdVD2J1.d.ts → types-BiRZnxDx.d.ts} +17 -6
  88. package/dist/server/{types-CMqVHYLG.d.ts → types-CL916r6x.d.ts} +23 -1
  89. package/dist/server/{types-BA-J9K8r.d.mts → types-CdrJqlKx.d.mts} +17 -6
  90. package/dist/server/{types-BC9eB2KH.d.mts → types-DkKEctWn.d.mts} +1 -1
  91. package/dist/server/{types-CAnC529E.d.ts → types-oCM-fw4O.d.ts} +1 -1
  92. package/dist/server/{types-CYfHxUhe.d.mts → types-txWsSxN7.d.mts} +23 -1
  93. package/dist/server/{validation-C7W2Fe0i.d.ts → validation-CoU8uAiu.d.ts} +1 -1
  94. package/dist/server/{validation-hg1sqhrt.d.mts → validation-DzvDwwRo.d.mts} +1 -1
  95. package/package.json +1 -1
  96. package/dist/server/chunk-BOHTTHY5.mjs.map +0 -1
  97. package/dist/server/chunk-IT5ICP43.js.map +0 -1
  98. package/dist/server/chunk-NKXS4TBK.mjs.map +0 -1
  99. package/dist/server/chunk-P6CDRJN3.js.map +0 -1
  100. package/dist/server/chunk-ZIM53VP6.js.map +0 -1
  101. /package/dist/server/{chunk-XK2YIISA.mjs.map → chunk-SPXMMX3C.mjs.map} +0 -0
package/README.md CHANGED
@@ -1987,6 +1987,46 @@ contentTypes: [
1987
1987
  ]
1988
1988
  ```
1989
1989
 
1990
+ ### Singleton Content Types
1991
+
1992
+ Singleton content types can only have one entry. Use them for unique content like homepage settings, site-wide configuration, or structured content that shouldn't be duplicated:
1993
+
1994
+ ```typescript
1995
+ contentTypes: [
1996
+ {
1997
+ key: 'homepage',
1998
+ name: 'Homepage',
1999
+ isSingleton: true, // Only one entry allowed
2000
+ hasPages: true,
2001
+ routePattern: '/', // Fixed path (no {slug} needed)
2002
+ fields: [
2003
+ { id: 'heroTitle', type: 'text', label: 'Hero Title', required: true, multiline: false },
2004
+ { id: 'heroSubtitle', type: 'text', label: 'Hero Subtitle', required: false, multiline: false },
2005
+ { id: 'heroImage', type: 'media', label: 'Hero Image', mediaKinds: ['image'] },
2006
+ ],
2007
+ titleField: 'heroTitle',
2008
+ },
2009
+ {
2010
+ key: 'site-settings',
2011
+ name: 'Site Settings',
2012
+ isSingleton: true,
2013
+ hasPages: false, // Not routable
2014
+ fields: [
2015
+ { id: 'contactEmail', type: 'text', label: 'Contact Email', required: false, multiline: false },
2016
+ { id: 'footerText', type: 'richText', label: 'Footer Text', required: false },
2017
+ ],
2018
+ titleField: 'contactEmail',
2019
+ },
2020
+ ]
2021
+ ```
2022
+
2023
+ **Singleton behavior:**
2024
+
2025
+ - When the content type is created, an entry is automatically created
2026
+ - Attempting to create additional entries returns a 409 Conflict error
2027
+ - The entry can be deleted and will reappear when recreated
2028
+ - Routable singletons use a fixed path instead of `{slug}` pattern
2029
+
1990
2030
  ### Pages
1991
2031
 
1992
2032
  Define pages with optional initial blocks:
@@ -2133,6 +2173,39 @@ import {
2133
2173
  } from '@riverbankcms/sdk/config';
2134
2174
  ```
2135
2175
 
2176
+ ## CLI
2177
+
2178
+ The SDK includes a CLI for syncing your local config to the dashboard.
2179
+
2180
+ ### push-config
2181
+
2182
+ Push content types, custom blocks, and block field extensions to your CMS dashboard:
2183
+
2184
+ ```bash
2185
+ npx riverbankcms push-config --api-key <key> --dashboard <url>
2186
+ ```
2187
+
2188
+ **Options:**
2189
+
2190
+ | Option | Description |
2191
+ |--------|-------------|
2192
+ | `--api-key <key>` | Dashboard API key (required) |
2193
+ | `--dashboard <url>` | Dashboard URL, or set `NEXT_PUBLIC_DASHBOARD_URL` env var |
2194
+ | `--config <path>` | Path to config file (default: `./riverbank.config.ts`) |
2195
+
2196
+ **Example:**
2197
+
2198
+ ```bash
2199
+ # Using environment variables
2200
+ export NEXT_PUBLIC_DASHBOARD_URL=https://www.riverbankcms.com
2201
+ npx riverbankcms push-config --api-key $RIVERBANK_API_KEY
2202
+
2203
+ # Or inline
2204
+ npx riverbankcms push-config \
2205
+ --api-key abc123 \
2206
+ --dashboard https://www.riverbankcms.com
2207
+ ```
2208
+
2136
2209
  ## Additional Exports
2137
2210
 
2138
2211
  - `@riverbankcms/sdk/rendering` - Low-level rendering components
package/dist/cli/index.js CHANGED
@@ -4884,15 +4884,23 @@ var contentTypeConfigSchema = zod.z.object({
4884
4884
  routePattern: zod.z.string().optional(),
4885
4885
  // Fields are validated as any[] here - deep field validation happens in @riverbankcms/blocks
4886
4886
  fields: zod.z.array(zod.z.any()).min(1, "At least one field is required"),
4887
- titleField: zod.z.string().optional()
4887
+ titleField: zod.z.string().optional(),
4888
+ isSingleton: zod.z.boolean().optional().default(false)
4888
4889
  }).refine(
4889
4890
  (data) => {
4890
4891
  if (data.hasPages) {
4891
- return data.routePattern && data.routePattern.includes("{slug}");
4892
+ if (!data.routePattern) {
4893
+ return false;
4894
+ }
4895
+ if (!data.isSingleton && !data.routePattern.includes("{slug}")) {
4896
+ return false;
4897
+ }
4892
4898
  }
4893
4899
  return true;
4894
4900
  },
4895
- { message: "routePattern with {slug} is required when hasPages is true" }
4901
+ {
4902
+ message: "routePattern is required when hasPages is true. Non-singleton types must include {slug} placeholder."
4903
+ }
4896
4904
  ).refine(
4897
4905
  (data) => {
4898
4906
  if (!data.hasPages && data.routePattern) {
@@ -5044,6 +5052,21 @@ var contentConfigSchema = contentConfigBaseSchema.superRefine((data, ctx) => {
5044
5052
  });
5045
5053
  }
5046
5054
  }
5055
+ if (data.contentTypes && data.entries) {
5056
+ const singletonKeys = new Set(
5057
+ data.contentTypes.filter((ct) => ct.isSingleton).map((ct) => ct.key)
5058
+ );
5059
+ for (const singletonKey of singletonKeys) {
5060
+ const entriesForType = data.entries.filter((e) => e.contentType === singletonKey);
5061
+ if (entriesForType.length > 1) {
5062
+ ctx.addIssue({
5063
+ code: zod.z.ZodIssueCode.custom,
5064
+ message: `Singleton content type "${singletonKey}" cannot have more than one entry. Found ${entriesForType.length} entries.`,
5065
+ path: ["entries"]
5066
+ });
5067
+ }
5068
+ }
5069
+ }
5047
5070
  });
5048
5071
 
5049
5072
  // src/data/prefetchBlockData.ts
@@ -5351,7 +5374,19 @@ function resolveDashboardUrl(cliOption) {
5351
5374
  }
5352
5375
  return url;
5353
5376
  }
5354
- var pushConfigCommand = new commander.Command("push-config").description("Push SDK config from riverbank.config.ts to dashboard").requiredOption("--api-key <key>", "Dashboard API key").option("--config <path>", "Path to riverbank.config.ts (default: ./riverbank.config.ts)").option("--dashboard <url>", "Dashboard API URL (or set NEXT_PUBLIC_DASHBOARD_URL)").action((options) => {
5377
+ var pushConfigCommand = new commander.Command("push-config").description("Push SDK config to dashboard").requiredOption("--api-key <key>", "Dashboard API key (required)").option("--dashboard <url>", "Dashboard URL (or set NEXT_PUBLIC_DASHBOARD_URL env var)").option("--config <path>", "Path to config file (default: ./riverbank.config.ts)").addHelpText("after", `
5378
+ Description:
5379
+ Syncs your local riverbank.config.ts to the CMS dashboard, including:
5380
+ - Custom blocks
5381
+ - Block field extensions
5382
+ - Block field options
5383
+ - Content types, pages, entries, and navigation
5384
+
5385
+ Examples:
5386
+ $ npx riverbankcms push-config --api-key $RIVERBANK_API_KEY
5387
+ $ npx riverbankcms push-config --api-key abc123 --dashboard https://www.riverbankcms.com
5388
+ $ npx riverbankcms push-config --api-key $API_KEY --config ./src/riverbank.config.ts
5389
+ `).action((options) => {
5355
5390
  const dashboard = resolveDashboardUrl(options.dashboard);
5356
5391
  return pushConfigAction({ ...options, dashboard });
5357
5392
  });
@@ -5360,7 +5395,13 @@ var pushConfigCommand = new commander.Command("push-config").description("Push S
5360
5395
  dotenv.config({ path: ".env.local" });
5361
5396
  dotenv.config({ path: ".env" });
5362
5397
  var program = new commander.Command();
5363
- program.name("riverbankcms").description("Builder SDK CLI tools").version("0.1.0");
5398
+ program.name("riverbankcms").description("Riverbank CMS SDK CLI - sync config to dashboard").version("0.1.0").addHelpText("after", `
5399
+ Examples:
5400
+ $ npx riverbankcms push-config --api-key $RIVERBANK_API_KEY
5401
+ $ npx riverbankcms push-config --api-key abc123 --dashboard https://www.riverbankcms.com
5402
+
5403
+ Run 'riverbankcms <command> --help' for detailed options.
5404
+ `);
5364
5405
  program.addCommand(pushConfigCommand);
5365
5406
  program.parse();
5366
5407
  //# sourceMappingURL=index.js.map