convex-cms 0.0.11-alpha.4 → 0.0.15

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 (206) hide show
  1. package/README.md +1 -1
  2. package/admin/README.md +99 -0
  3. package/admin/src/components/ContentTypeFormModal.tsx +1 -1
  4. package/admin/src/contexts/AuthContext.tsx +1 -1
  5. package/admin/src/hooks/usePermissions.ts +1 -1
  6. package/admin/src/lib/adminApi.ts +13 -0
  7. package/admin/src/lib/cmsExports.ts +16 -6
  8. package/admin/src/standalone/App.tsx +156 -0
  9. package/admin/src/standalone/config.ts +24 -0
  10. package/admin/src/standalone/main.tsx +10 -0
  11. package/admin/src/standalone/router.tsx +901 -0
  12. package/admin-dist/{public/assets/index-D-4wFfgU.css → assets/index-BrbXSzjb.css} +1 -1
  13. package/admin-dist/assets/index-CdHu1-Ex.js +96 -0
  14. package/admin-dist/index.html +15 -0
  15. package/dist/cli/commands/admin.d.ts +0 -7
  16. package/dist/cli/commands/admin.d.ts.map +1 -1
  17. package/dist/cli/commands/admin.js +60 -49
  18. package/dist/cli/commands/admin.js.map +1 -1
  19. package/dist/cli/index.js +0 -0
  20. package/package.json +31 -26
  21. package/admin/src/lib/config.server.ts +0 -56
  22. package/admin/src/lib/convex.ts +0 -26
  23. package/admin/src/routeTree.gen.ts +0 -262
  24. package/admin/src/router.tsx +0 -22
  25. package/admin/src/routes/__root.tsx +0 -257
  26. package/admin/src/routes/content-types.tsx +0 -20
  27. package/admin/src/routes/content.tsx +0 -20
  28. package/admin/src/routes/entries/$entryId.tsx +0 -107
  29. package/admin/src/routes/entries/new.$contentTypeId.tsx +0 -69
  30. package/admin/src/routes/entries/type/$contentTypeId.tsx +0 -503
  31. package/admin/src/routes/index.tsx +0 -20
  32. package/admin/src/routes/media.tsx +0 -24
  33. package/admin/src/routes/settings.tsx +0 -20
  34. package/admin/src/routes/taxonomies.tsx +0 -20
  35. package/admin/src/routes/trash.tsx +0 -20
  36. package/admin-dist/nitro.json +0 -15
  37. package/admin-dist/public/assets/CmsEmptyState-BKeL4DBB.js +0 -1
  38. package/admin-dist/public/assets/CmsFilterBar-CEpMHd_c.js +0 -1
  39. package/admin-dist/public/assets/CmsPageHeader-CIEkTbyH.js +0 -1
  40. package/admin-dist/public/assets/CmsStatusBadge-BFMOsfMW.js +0 -1
  41. package/admin-dist/public/assets/CmsSurface-kqqaFKUI.js +0 -1
  42. package/admin-dist/public/assets/CmsTable-Db53Exq0.js +0 -1
  43. package/admin-dist/public/assets/ContentEntryEditor-Ct7cHayy.js +0 -4
  44. package/admin-dist/public/assets/TaxonomyFilter-Bm1DI1A7.js +0 -1
  45. package/admin-dist/public/assets/_contentTypeId-BekeCblX.js +0 -1
  46. package/admin-dist/public/assets/_entryId-CoZDE0l0.js +0 -1
  47. package/admin-dist/public/assets/alert-CpLdsTGU.js +0 -1
  48. package/admin-dist/public/assets/badge-BQAotc5B.js +0 -1
  49. package/admin-dist/public/assets/circle-check-big-BF3Y5nES.js +0 -1
  50. package/admin-dist/public/assets/command-lEq6f_Ee.js +0 -1
  51. package/admin-dist/public/assets/content-DH6k0dN6.js +0 -1
  52. package/admin-dist/public/assets/content-types-DHr9tc2V.js +0 -1
  53. package/admin-dist/public/assets/index-Cf0lbl0G.js +0 -1
  54. package/admin-dist/public/assets/main-B-6700eG.js +0 -137
  55. package/admin-dist/public/assets/media-DY5zD52L.js +0 -1
  56. package/admin-dist/public/assets/new._contentTypeId-Dq_NqTQV.js +0 -1
  57. package/admin-dist/public/assets/pencil-CI_KfxSx.js +0 -1
  58. package/admin-dist/public/assets/refresh-cw-BrXg9a2r.js +0 -1
  59. package/admin-dist/public/assets/rotate-ccw-PwzxdPxd.js +0 -1
  60. package/admin-dist/public/assets/scroll-area-DX_nZYp8.js +0 -1
  61. package/admin-dist/public/assets/search-DlwBH4C5.js +0 -1
  62. package/admin-dist/public/assets/settings-2mx3_ORG.js +0 -1
  63. package/admin-dist/public/assets/switch-CjPi4DKH.js +0 -1
  64. package/admin-dist/public/assets/tabs-B5X37GEM.js +0 -1
  65. package/admin-dist/public/assets/tanstack-adapter-KSm-nO5L.js +0 -1
  66. package/admin-dist/public/assets/taxonomies-CHjJKNlR.js +0 -1
  67. package/admin-dist/public/assets/trash-Cle-tcqq.js +0 -1
  68. package/admin-dist/public/assets/useBreadcrumbLabel-yZQG_N_3.js +0 -1
  69. package/admin-dist/public/assets/usePermissions-D6vsoaJf.js +0 -1
  70. package/admin-dist/server/_chunks/_libs/@date-fns/tz.mjs +0 -217
  71. package/admin-dist/server/_chunks/_libs/@floating-ui/core.mjs +0 -725
  72. package/admin-dist/server/_chunks/_libs/@floating-ui/dom.mjs +0 -622
  73. package/admin-dist/server/_chunks/_libs/@floating-ui/react-dom.mjs +0 -292
  74. package/admin-dist/server/_chunks/_libs/@floating-ui/utils.mjs +0 -320
  75. package/admin-dist/server/_chunks/_libs/@radix-ui/number.mjs +0 -6
  76. package/admin-dist/server/_chunks/_libs/@radix-ui/primitive.mjs +0 -11
  77. package/admin-dist/server/_chunks/_libs/@radix-ui/react-arrow.mjs +0 -23
  78. package/admin-dist/server/_chunks/_libs/@radix-ui/react-avatar.mjs +0 -119
  79. package/admin-dist/server/_chunks/_libs/@radix-ui/react-checkbox.mjs +0 -270
  80. package/admin-dist/server/_chunks/_libs/@radix-ui/react-collapsible.mjs +0 -144
  81. package/admin-dist/server/_chunks/_libs/@radix-ui/react-collection.mjs +0 -69
  82. package/admin-dist/server/_chunks/_libs/@radix-ui/react-compose-refs.mjs +0 -39
  83. package/admin-dist/server/_chunks/_libs/@radix-ui/react-context.mjs +0 -137
  84. package/admin-dist/server/_chunks/_libs/@radix-ui/react-dialog.mjs +0 -325
  85. package/admin-dist/server/_chunks/_libs/@radix-ui/react-direction.mjs +0 -9
  86. package/admin-dist/server/_chunks/_libs/@radix-ui/react-dismissable-layer.mjs +0 -210
  87. package/admin-dist/server/_chunks/_libs/@radix-ui/react-dropdown-menu.mjs +0 -253
  88. package/admin-dist/server/_chunks/_libs/@radix-ui/react-focus-guards.mjs +0 -29
  89. package/admin-dist/server/_chunks/_libs/@radix-ui/react-focus-scope.mjs +0 -206
  90. package/admin-dist/server/_chunks/_libs/@radix-ui/react-id.mjs +0 -14
  91. package/admin-dist/server/_chunks/_libs/@radix-ui/react-label.mjs +0 -23
  92. package/admin-dist/server/_chunks/_libs/@radix-ui/react-menu.mjs +0 -812
  93. package/admin-dist/server/_chunks/_libs/@radix-ui/react-popover.mjs +0 -300
  94. package/admin-dist/server/_chunks/_libs/@radix-ui/react-popper.mjs +0 -286
  95. package/admin-dist/server/_chunks/_libs/@radix-ui/react-portal.mjs +0 -16
  96. package/admin-dist/server/_chunks/_libs/@radix-ui/react-presence.mjs +0 -128
  97. package/admin-dist/server/_chunks/_libs/@radix-ui/react-primitive.mjs +0 -75
  98. package/admin-dist/server/_chunks/_libs/@radix-ui/react-roving-focus.mjs +0 -224
  99. package/admin-dist/server/_chunks/_libs/@radix-ui/react-scroll-area.mjs +0 -721
  100. package/admin-dist/server/_chunks/_libs/@radix-ui/react-select.mjs +0 -1163
  101. package/admin-dist/server/_chunks/_libs/@radix-ui/react-separator.mjs +0 -28
  102. package/admin-dist/server/_chunks/_libs/@radix-ui/react-slot.mjs +0 -186
  103. package/admin-dist/server/_chunks/_libs/@radix-ui/react-switch.mjs +0 -152
  104. package/admin-dist/server/_chunks/_libs/@radix-ui/react-tabs.mjs +0 -189
  105. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-callback-ref.mjs +0 -11
  106. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-controllable-state.mjs +0 -69
  107. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-effect-event.mjs +0 -1
  108. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-escape-keydown.mjs +0 -17
  109. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-is-hydrated.mjs +0 -15
  110. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-layout-effect.mjs +0 -6
  111. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-previous.mjs +0 -14
  112. package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-size.mjs +0 -39
  113. package/admin-dist/server/_chunks/_libs/@radix-ui/react-visually-hidden.mjs +0 -60
  114. package/admin-dist/server/_chunks/_libs/@tanstack/history.mjs +0 -33
  115. package/admin-dist/server/_chunks/_libs/@tanstack/react-router.mjs +0 -1485
  116. package/admin-dist/server/_chunks/_libs/@tanstack/react-store.mjs +0 -1
  117. package/admin-dist/server/_chunks/_libs/@tanstack/router-core.mjs +0 -4101
  118. package/admin-dist/server/_chunks/_libs/@tanstack/store.mjs +0 -1
  119. package/admin-dist/server/_chunks/_libs/react-dom.mjs +0 -10781
  120. package/admin-dist/server/_chunks/_libs/react.mjs +0 -513
  121. package/admin-dist/server/_libs/aria-hidden.mjs +0 -122
  122. package/admin-dist/server/_libs/class-variance-authority.mjs +0 -44
  123. package/admin-dist/server/_libs/clsx.mjs +0 -16
  124. package/admin-dist/server/_libs/cmdk.mjs +0 -315
  125. package/admin-dist/server/_libs/convex-helpers.mjs +0 -1112
  126. package/admin-dist/server/_libs/convex.mjs +0 -6239
  127. package/admin-dist/server/_libs/cookie-es.mjs +0 -1
  128. package/admin-dist/server/_libs/croner.mjs +0 -1
  129. package/admin-dist/server/_libs/crossws.mjs +0 -1
  130. package/admin-dist/server/_libs/date-fns.mjs +0 -1716
  131. package/admin-dist/server/_libs/detect-node-es.mjs +0 -1
  132. package/admin-dist/server/_libs/get-nonce.mjs +0 -9
  133. package/admin-dist/server/_libs/h3.mjs +0 -401
  134. package/admin-dist/server/_libs/hookable.mjs +0 -1
  135. package/admin-dist/server/_libs/isbot.mjs +0 -20
  136. package/admin-dist/server/_libs/lucide-react.mjs +0 -877
  137. package/admin-dist/server/_libs/ohash.mjs +0 -1
  138. package/admin-dist/server/_libs/react-day-picker.mjs +0 -2201
  139. package/admin-dist/server/_libs/react-remove-scroll-bar.mjs +0 -82
  140. package/admin-dist/server/_libs/react-remove-scroll.mjs +0 -328
  141. package/admin-dist/server/_libs/react-style-singleton.mjs +0 -69
  142. package/admin-dist/server/_libs/rou3.mjs +0 -8
  143. package/admin-dist/server/_libs/seroval-plugins.mjs +0 -1
  144. package/admin-dist/server/_libs/seroval.mjs +0 -1
  145. package/admin-dist/server/_libs/srvx.mjs +0 -719
  146. package/admin-dist/server/_libs/tailwind-merge.mjs +0 -3010
  147. package/admin-dist/server/_libs/tiny-invariant.mjs +0 -12
  148. package/admin-dist/server/_libs/tiny-warning.mjs +0 -5
  149. package/admin-dist/server/_libs/tslib.mjs +0 -39
  150. package/admin-dist/server/_libs/ufo.mjs +0 -54
  151. package/admin-dist/server/_libs/unctx.mjs +0 -1
  152. package/admin-dist/server/_libs/unstorage.mjs +0 -1
  153. package/admin-dist/server/_libs/use-callback-ref.mjs +0 -66
  154. package/admin-dist/server/_libs/use-sidecar.mjs +0 -106
  155. package/admin-dist/server/_libs/use-sync-external-store.mjs +0 -64
  156. package/admin-dist/server/_libs/zod.mjs +0 -4223
  157. package/admin-dist/server/_ssr/CmsEmptyState-DzzuQG0S.mjs +0 -38
  158. package/admin-dist/server/_ssr/CmsFilterBar-C5XADS12.mjs +0 -81
  159. package/admin-dist/server/_ssr/CmsPageHeader-DZ6h7smh.mjs +0 -24
  160. package/admin-dist/server/_ssr/CmsStatusBadge-D-YFSAa1.mjs +0 -127
  161. package/admin-dist/server/_ssr/CmsSurface-Cv51NBLZ.mjs +0 -44
  162. package/admin-dist/server/_ssr/CmsTable-DG88C5nO.mjs +0 -189
  163. package/admin-dist/server/_ssr/ContentEntryEditor-CRjwXB17.mjs +0 -3708
  164. package/admin-dist/server/_ssr/TaxonomyFilter-xGwcgtjr.mjs +0 -188
  165. package/admin-dist/server/_ssr/_contentTypeId-DRCfeKkm.mjs +0 -411
  166. package/admin-dist/server/_ssr/_entryId-DULm2TDy.mjs +0 -149
  167. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-iX3K33p1.mjs +0 -4
  168. package/admin-dist/server/_ssr/badge-CbjIvhb6.mjs +0 -39
  169. package/admin-dist/server/_ssr/command-xB2uiYps.mjs +0 -128
  170. package/admin-dist/server/_ssr/config.server-BOr7Jxr4.mjs +0 -105
  171. package/admin-dist/server/_ssr/content-BfLBaJCZ.mjs +0 -575
  172. package/admin-dist/server/_ssr/content-types-DZbF6O2q.mjs +0 -469
  173. package/admin-dist/server/_ssr/index-Cfe8sZv5.mjs +0 -374
  174. package/admin-dist/server/_ssr/index.mjs +0 -4673
  175. package/admin-dist/server/_ssr/media-Bds2AnPC.mjs +0 -2172
  176. package/admin-dist/server/_ssr/new._contentTypeId-DGvz_tlW.mjs +0 -132
  177. package/admin-dist/server/_ssr/router-DxF7GBcO.mjs +0 -11831
  178. package/admin-dist/server/_ssr/scroll-area-DLDlXI07.mjs +0 -59
  179. package/admin-dist/server/_ssr/settings-BbaiS6z9.mjs +0 -506
  180. package/admin-dist/server/_ssr/start-HYkvq4Ni.mjs +0 -4
  181. package/admin-dist/server/_ssr/switch-Bl89Pfxu.mjs +0 -31
  182. package/admin-dist/server/_ssr/tabs-QkbR0iir.mjs +0 -629
  183. package/admin-dist/server/_ssr/tanstack-adapter-CKknPtcU.mjs +0 -151
  184. package/admin-dist/server/_ssr/taxonomies-S_Ontd0z.mjs +0 -1020
  185. package/admin-dist/server/_ssr/trash-BzAIsbbN.mjs +0 -382
  186. package/admin-dist/server/_ssr/useBreadcrumbLabel-BjiR1fM_.mjs +0 -16
  187. package/admin-dist/server/_ssr/usePermissions-CDHN95Nz.mjs +0 -68
  188. package/admin-dist/server/favicon.ico +0 -0
  189. package/admin-dist/server/index.mjs +0 -718
  190. /package/admin-dist/{public/assets → assets}/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  191. /package/admin-dist/{public/assets → assets}/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  192. /package/admin-dist/{public/assets → assets}/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  193. /package/admin-dist/{public/assets → assets}/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  194. /package/admin-dist/{public/assets → assets}/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  195. /package/admin-dist/{public/assets → assets}/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  196. /package/admin-dist/{public/assets → assets}/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  197. /package/admin-dist/{public/assets → assets}/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
  198. /package/admin-dist/{public/assets → assets}/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
  199. /package/admin-dist/{public/assets → assets}/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
  200. /package/admin-dist/{public/assets → assets}/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
  201. /package/admin-dist/{public/assets → assets}/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  202. /package/admin-dist/{public/assets → assets}/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  203. /package/admin-dist/{public/assets → assets}/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
  204. /package/admin-dist/{public/assets → assets}/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
  205. /package/admin-dist/{public/assets → assets}/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
  206. /package/admin-dist/{public/favicon.ico → favicon.ico} +0 -0
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![npm version](https://badge.fury.io/js/convex-cms.svg)](https://www.npmjs.com/package/convex-cms)
4
4
  [![License: Apache-2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
5
5
 
6
- > **Alpha (v0.0.10)** Actively developed. APIs & docs may change. [Report issues](https://github.com/obkaro/convex-cms/issues).
6
+ > **Alpha** Actively developed. APIs & docs may change. [Report issues](https://github.com/obkaro/convex-cms/issues).
7
7
 
8
8
  A headless CMS built as a [Convex Component](https://docs.convex.dev/components). Content management that runs inside your Convex app.
9
9
 
@@ -0,0 +1,99 @@
1
+ # Convex CMS Admin UI
2
+
3
+ The Admin UI for Convex CMS, built with TanStack Start and React.
4
+
5
+ ## Getting Started
6
+
7
+ ### Prerequisites
8
+
9
+ - Node.js 18+
10
+ - A Convex account and project
11
+
12
+ ### Installation
13
+
14
+ ```bash
15
+ cd admin
16
+ pnpm install
17
+ ```
18
+
19
+ ### Development
20
+
21
+ 1. Start the Convex development server:
22
+
23
+ ```bash
24
+ pnpm convex dev
25
+ ```
26
+
27
+ This will generate the Convex API types and provide a `VITE_CONVEX_URL`.
28
+
29
+ 2. Create a `.env` file with your Convex URL:
30
+
31
+ ```bash
32
+ cp .env.example .env
33
+ # Edit .env with your VITE_CONVEX_URL from step 1
34
+ ```
35
+
36
+ 3. Start the development server:
37
+
38
+ ```bash
39
+ pnpm dev:vite
40
+ ```
41
+
42
+ Or run both Convex and Vite together:
43
+
44
+ ```bash
45
+ pnpm dev
46
+ ```
47
+
48
+ 4. Open [http://localhost:3000](http://localhost:3000) in your browser.
49
+
50
+ ## Project Structure
51
+
52
+ ```
53
+ admin/
54
+ ├── convex/ # Convex configuration
55
+ │ └── convex.config.ts # CMS component integration
56
+ ├── src/
57
+ │ ├── routes/ # TanStack Router routes
58
+ │ │ ├── __root.tsx # Root layout with Convex provider
59
+ │ │ ├── index.tsx # Dashboard page
60
+ │ │ ├── content.tsx # Content entries list
61
+ │ │ ├── media.tsx # Media library
62
+ │ │ ├── content-types.tsx # Content type management
63
+ │ │ └── settings.tsx # CMS settings
64
+ │ ├── components/ # Reusable React components
65
+ │ ├── lib/ # Utilities and helpers
66
+ │ │ └── convex.ts # Convex client utilities
67
+ │ ├── styles/ # CSS styles
68
+ │ │ └── app.css # Main stylesheet
69
+ │ └── router.tsx # Router configuration
70
+ ├── public/ # Static assets
71
+ ├── vite.config.ts # Vite + TanStack Start configuration
72
+ ├── tsconfig.json # TypeScript configuration
73
+ └── package.json # Dependencies and scripts
74
+ ```
75
+
76
+ ## Available Scripts
77
+
78
+ - `pnpm dev` - Start Convex and Vite development servers
79
+ - `pnpm dev:vite` - Start only the Vite development server
80
+ - `pnpm dev:convex` - Start only the Convex development server
81
+ - `pnpm build` - Build for production
82
+ - `pnpm preview` - Preview production build
83
+ - `pnpm typecheck` - Run TypeScript type checking
84
+
85
+ ## Features
86
+
87
+ - **Dashboard** - Overview of CMS status and quick navigation
88
+ - **Content Management** - Browse and manage content entries
89
+ - **Media Library** - Upload and organize media assets
90
+ - **Content Types** - Define content schemas with custom fields
91
+ - **Settings** - Configure CMS features and preferences
92
+
93
+ ## Technology Stack
94
+
95
+ - [TanStack Start](https://tanstack.com/start) - Full-stack React framework
96
+ - [TanStack Router](https://tanstack.com/router) - Type-safe routing
97
+ - [Convex](https://convex.dev) - Real-time backend platform
98
+ - [React 19](https://react.dev) - UI library
99
+ - [Vite 7](https://vitejs.dev) - Build tool
@@ -1,7 +1,7 @@
1
1
  import { useState, useCallback, useMemo, useEffect } from "react";
2
2
  import { useMutation } from "convex/react";
3
3
  import { useApi } from "~/embed/contexts/ApiContext";
4
- import type { FieldType, ContentType } from "convex-cms/types";
4
+ import type { FieldType, ContentType } from "~/lib/cmsExports";
5
5
  import { CmsDialog } from "~/components/cmsds/CmsDialog";
6
6
  import { CmsButton } from "~/components/cmsds/CmsButton";
7
7
  import { Input } from "~/components/ui/input";
@@ -39,7 +39,7 @@ import {
39
39
  type Resource,
40
40
  type Action,
41
41
  type OwnershipScope,
42
- } from '../../../src/component/index';
42
+ } from '../../../src/component/roles';
43
43
 
44
44
  // =============================================================================
45
45
  // Types
@@ -30,7 +30,7 @@ import {
30
30
  type Action,
31
31
  type OwnershipScope,
32
32
  type Permission,
33
- } from '../../../src/component/index';
33
+ } from '../../../src/component/roles';
34
34
 
35
35
  // =============================================================================
36
36
  // Types
@@ -0,0 +1,13 @@
1
+ import type { CmsAdminApi } from "~/embed/contexts/ApiContext";
2
+
3
+ const fnSymbol = Symbol.for("functionName");
4
+
5
+ function createApiProxy(prefix: string): CmsAdminApi {
6
+ return new Proxy({} as CmsAdminApi, {
7
+ get(_, prop: string) {
8
+ return { [fnSymbol]: `${prefix}:${prop}` };
9
+ },
10
+ });
11
+ }
12
+
13
+ export const adminApi = createApiProxy("admin");
@@ -1,6 +1,16 @@
1
- // Re-export CMS utilities that admin components need
2
- // Using relative imports to avoid circular dependency with convex-cms package
3
- export { getRole, getRolePermissions } from '../../../src/client/index';
4
- export type { RoleName, BaseAdminAPI } from '../../../src/client/index';
5
- export { useMediaUploadQueue } from '../../../src/react/index';
6
- export type { UploadQueueFile, UploadQueueFileStatus } from '../../../src/react/index';
1
+ // Re-export CMS utilities that admin components need.
2
+ // Uses published sub-path exports (not relative source paths) so this works both
3
+ // in the monorepo (via workspace:* link) and in user projects (via npm install).
4
+ //
5
+ // IMPORTANT: Do NOT import from the main 'convex-cms' barrel export here.
6
+ // It re-exports convex/server code (via admin functions) which contaminates
7
+ // the browser bundle. Use specific sub-paths that are browser-safe:
8
+ // - convex-cms/roles: only depends on convex/values
9
+ // - convex-cms/types: type-only re-exports from component modules
10
+ // - convex-cms/react: React hooks (browser-safe)
11
+ export { getRole, getRolePermissions } from 'convex-cms/roles';
12
+ export type { RoleName } from 'convex-cms/roles';
13
+ export type { BaseAdminAPI } from 'convex-cms';
14
+ export type { FieldType, ContentType } from 'convex-cms/types';
15
+ export { useMediaUploadQueue } from 'convex-cms/react';
16
+ export type { UploadQueueFile, UploadQueueFileStatus } from 'convex-cms/react';
@@ -0,0 +1,156 @@
1
+ import { ConvexProvider, ConvexReactClient } from "convex/react";
2
+ import { useMemo, type ReactNode } from "react";
3
+ import { RouterProvider } from "@tanstack/react-router";
4
+ import { RouteGuard } from "~/components";
5
+ import {
6
+ AuthProvider,
7
+ BreadcrumbProvider,
8
+ SettingsConfigProvider,
9
+ ThemeProvider,
10
+ type GetUserHook,
11
+ type GetUserRoleHook,
12
+ type LogoutHook,
13
+ } from "~/contexts";
14
+ import { ApiProvider } from "~/embed/contexts/ApiContext";
15
+ import type { AdminConfig } from "~/lib/admin-config";
16
+ import { resolveAdminConfig } from "~/lib/admin-config";
17
+ import { adminApi } from "~/lib/adminApi";
18
+ import { getCmsConfig } from "./config";
19
+ import { router } from "./router";
20
+
21
+ const mockGetUser: GetUserHook = () => ({
22
+ id: "mock_user_123",
23
+ name: "Demo Admin",
24
+ email: "admin@example.com",
25
+ });
26
+
27
+ const mockGetUserRole: GetUserRoleHook = () => "admin";
28
+ const mockLogout: LogoutHook = () => {
29
+ console.log("Logout called (mock mode)");
30
+ };
31
+
32
+ const noAuthGetUser: GetUserHook = () => null;
33
+ const noAuthGetUserRole: GetUserRoleHook = () => null;
34
+ const noAuthLogout: LogoutHook = () => {};
35
+
36
+ function getAuthConfig(authMode: string): {
37
+ getUser: GetUserHook;
38
+ getUserRole: GetUserRoleHook;
39
+ onLogout: LogoutHook;
40
+ } {
41
+ switch (authMode) {
42
+ case "mock":
43
+ case "demo":
44
+ return {
45
+ getUser: mockGetUser,
46
+ getUserRole: mockGetUserRole,
47
+ onLogout: mockLogout,
48
+ };
49
+ case "none":
50
+ case "disabled":
51
+ return {
52
+ getUser: noAuthGetUser,
53
+ getUserRole: noAuthGetUserRole,
54
+ onLogout: noAuthLogout,
55
+ };
56
+ default:
57
+ return {
58
+ getUser: mockGetUser,
59
+ getUserRole: mockGetUserRole,
60
+ onLogout: mockLogout,
61
+ };
62
+ }
63
+ }
64
+
65
+ export function App() {
66
+ const config = getCmsConfig();
67
+ const authConfig = useMemo(
68
+ () => getAuthConfig(config.authMode),
69
+ [config.authMode],
70
+ );
71
+ const adminConfig = useMemo(
72
+ () => resolveAdminConfig(config.adminConfig),
73
+ [config.adminConfig],
74
+ );
75
+
76
+ return (
77
+ <ThemeProvider>
78
+ <BreadcrumbProvider>
79
+ <ConvexProviderWrapper
80
+ convexUrl={config.convexUrl}
81
+ adminConfig={adminConfig}
82
+ >
83
+ <AuthProvider
84
+ getUser={authConfig.getUser}
85
+ getUserRole={authConfig.getUserRole}
86
+ onLogout={authConfig.onLogout}
87
+ >
88
+ <RouteGuard>
89
+ <RouterProvider router={router} />
90
+ </RouteGuard>
91
+ </AuthProvider>
92
+ </ConvexProviderWrapper>
93
+ </BreadcrumbProvider>
94
+ </ThemeProvider>
95
+ );
96
+ }
97
+
98
+ function ConvexProviderWrapper({
99
+ children,
100
+ convexUrl,
101
+ adminConfig,
102
+ }: {
103
+ children: ReactNode;
104
+ convexUrl: string;
105
+ adminConfig: AdminConfig;
106
+ }) {
107
+ const convex = useMemo(() => {
108
+ if (!convexUrl) return null;
109
+ return new ConvexReactClient(convexUrl);
110
+ }, [convexUrl]);
111
+
112
+ if (!convex) {
113
+ return (
114
+ <div className="flex min-h-screen items-center justify-center bg-background p-6">
115
+ <div className="diff-modified max-w-lg space-y-4 rounded-lg border p-6 text-center">
116
+ <h2 className="text-xl font-semibold text-diff-modified">
117
+ Convex Configuration Required
118
+ </h2>
119
+ <p className="text-sm text-diff-modified-foreground">
120
+ Please provide a Convex deployment URL to connect to your backend.
121
+ </p>
122
+ <div className="space-y-2 text-left text-sm text-diff-modified-foreground">
123
+ <p className="font-medium">Options:</p>
124
+ <ul className="list-inside list-disc space-y-1">
125
+ <li>
126
+ Run with URL:{" "}
127
+ <code className="rounded bg-diff-modified-bg/50 px-1">
128
+ npx convex-cms admin --url YOUR_URL
129
+ </code>
130
+ </li>
131
+ <li>
132
+ Set environment variable:{" "}
133
+ <code className="rounded bg-diff-modified-bg/50 px-1">
134
+ CONVEX_URL=YOUR_URL
135
+ </code>
136
+ </li>
137
+ </ul>
138
+ </div>
139
+ </div>
140
+ </div>
141
+ );
142
+ }
143
+
144
+ return (
145
+ <ConvexProvider client={convex}>
146
+ <ApiProvider api={adminApi}>
147
+ <SettingsConfigProvider
148
+ baseConfig={adminConfig}
149
+ api={{ getSettings: adminApi.getSettings }}
150
+ >
151
+ {children}
152
+ </SettingsConfigProvider>
153
+ </ApiProvider>
154
+ </ConvexProvider>
155
+ );
156
+ }
@@ -0,0 +1,24 @@
1
+ import type { AdminConfig } from "~/lib/admin-config";
2
+
3
+ interface CmsConfig {
4
+ convexUrl: string;
5
+ authMode: string;
6
+ adminConfig?: Partial<AdminConfig>;
7
+ }
8
+
9
+ declare global {
10
+ interface Window {
11
+ __CMS_CONFIG__?: CmsConfig;
12
+ }
13
+ }
14
+
15
+ export function getCmsConfig(): CmsConfig {
16
+ if (window.__CMS_CONFIG__) {
17
+ return window.__CMS_CONFIG__;
18
+ }
19
+
20
+ return {
21
+ convexUrl: import.meta.env.VITE_CONVEX_URL ?? "",
22
+ authMode: import.meta.env.VITE_AUTH_MODE ?? "demo",
23
+ };
24
+ }
@@ -0,0 +1,10 @@
1
+ import { StrictMode } from "react";
2
+ import { createRoot } from "react-dom/client";
3
+ import { App } from "./App";
4
+ import "~/index.css";
5
+
6
+ createRoot(document.getElementById("root")!).render(
7
+ <StrictMode>
8
+ <App />
9
+ </StrictMode>,
10
+ );