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.
- package/README.md +1 -1
- package/admin/README.md +99 -0
- package/admin/src/components/ContentTypeFormModal.tsx +1 -1
- package/admin/src/contexts/AuthContext.tsx +1 -1
- package/admin/src/hooks/usePermissions.ts +1 -1
- package/admin/src/lib/adminApi.ts +13 -0
- package/admin/src/lib/cmsExports.ts +16 -6
- package/admin/src/standalone/App.tsx +156 -0
- package/admin/src/standalone/config.ts +24 -0
- package/admin/src/standalone/main.tsx +10 -0
- package/admin/src/standalone/router.tsx +901 -0
- package/admin-dist/{public/assets/index-D-4wFfgU.css → assets/index-BrbXSzjb.css} +1 -1
- package/admin-dist/assets/index-CdHu1-Ex.js +96 -0
- package/admin-dist/index.html +15 -0
- package/dist/cli/commands/admin.d.ts +0 -7
- package/dist/cli/commands/admin.d.ts.map +1 -1
- package/dist/cli/commands/admin.js +60 -49
- package/dist/cli/commands/admin.js.map +1 -1
- package/dist/cli/index.js +0 -0
- package/package.json +31 -26
- package/admin/src/lib/config.server.ts +0 -56
- package/admin/src/lib/convex.ts +0 -26
- package/admin/src/routeTree.gen.ts +0 -262
- package/admin/src/router.tsx +0 -22
- package/admin/src/routes/__root.tsx +0 -257
- package/admin/src/routes/content-types.tsx +0 -20
- package/admin/src/routes/content.tsx +0 -20
- package/admin/src/routes/entries/$entryId.tsx +0 -107
- package/admin/src/routes/entries/new.$contentTypeId.tsx +0 -69
- package/admin/src/routes/entries/type/$contentTypeId.tsx +0 -503
- package/admin/src/routes/index.tsx +0 -20
- package/admin/src/routes/media.tsx +0 -24
- package/admin/src/routes/settings.tsx +0 -20
- package/admin/src/routes/taxonomies.tsx +0 -20
- package/admin/src/routes/trash.tsx +0 -20
- package/admin-dist/nitro.json +0 -15
- package/admin-dist/public/assets/CmsEmptyState-BKeL4DBB.js +0 -1
- package/admin-dist/public/assets/CmsFilterBar-CEpMHd_c.js +0 -1
- package/admin-dist/public/assets/CmsPageHeader-CIEkTbyH.js +0 -1
- package/admin-dist/public/assets/CmsStatusBadge-BFMOsfMW.js +0 -1
- package/admin-dist/public/assets/CmsSurface-kqqaFKUI.js +0 -1
- package/admin-dist/public/assets/CmsTable-Db53Exq0.js +0 -1
- package/admin-dist/public/assets/ContentEntryEditor-Ct7cHayy.js +0 -4
- package/admin-dist/public/assets/TaxonomyFilter-Bm1DI1A7.js +0 -1
- package/admin-dist/public/assets/_contentTypeId-BekeCblX.js +0 -1
- package/admin-dist/public/assets/_entryId-CoZDE0l0.js +0 -1
- package/admin-dist/public/assets/alert-CpLdsTGU.js +0 -1
- package/admin-dist/public/assets/badge-BQAotc5B.js +0 -1
- package/admin-dist/public/assets/circle-check-big-BF3Y5nES.js +0 -1
- package/admin-dist/public/assets/command-lEq6f_Ee.js +0 -1
- package/admin-dist/public/assets/content-DH6k0dN6.js +0 -1
- package/admin-dist/public/assets/content-types-DHr9tc2V.js +0 -1
- package/admin-dist/public/assets/index-Cf0lbl0G.js +0 -1
- package/admin-dist/public/assets/main-B-6700eG.js +0 -137
- package/admin-dist/public/assets/media-DY5zD52L.js +0 -1
- package/admin-dist/public/assets/new._contentTypeId-Dq_NqTQV.js +0 -1
- package/admin-dist/public/assets/pencil-CI_KfxSx.js +0 -1
- package/admin-dist/public/assets/refresh-cw-BrXg9a2r.js +0 -1
- package/admin-dist/public/assets/rotate-ccw-PwzxdPxd.js +0 -1
- package/admin-dist/public/assets/scroll-area-DX_nZYp8.js +0 -1
- package/admin-dist/public/assets/search-DlwBH4C5.js +0 -1
- package/admin-dist/public/assets/settings-2mx3_ORG.js +0 -1
- package/admin-dist/public/assets/switch-CjPi4DKH.js +0 -1
- package/admin-dist/public/assets/tabs-B5X37GEM.js +0 -1
- package/admin-dist/public/assets/tanstack-adapter-KSm-nO5L.js +0 -1
- package/admin-dist/public/assets/taxonomies-CHjJKNlR.js +0 -1
- package/admin-dist/public/assets/trash-Cle-tcqq.js +0 -1
- package/admin-dist/public/assets/useBreadcrumbLabel-yZQG_N_3.js +0 -1
- package/admin-dist/public/assets/usePermissions-D6vsoaJf.js +0 -1
- package/admin-dist/server/_chunks/_libs/@date-fns/tz.mjs +0 -217
- package/admin-dist/server/_chunks/_libs/@floating-ui/core.mjs +0 -725
- package/admin-dist/server/_chunks/_libs/@floating-ui/dom.mjs +0 -622
- package/admin-dist/server/_chunks/_libs/@floating-ui/react-dom.mjs +0 -292
- package/admin-dist/server/_chunks/_libs/@floating-ui/utils.mjs +0 -320
- package/admin-dist/server/_chunks/_libs/@radix-ui/number.mjs +0 -6
- package/admin-dist/server/_chunks/_libs/@radix-ui/primitive.mjs +0 -11
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-arrow.mjs +0 -23
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-avatar.mjs +0 -119
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-checkbox.mjs +0 -270
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-collapsible.mjs +0 -144
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-collection.mjs +0 -69
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-compose-refs.mjs +0 -39
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-context.mjs +0 -137
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-dialog.mjs +0 -325
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-direction.mjs +0 -9
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-dismissable-layer.mjs +0 -210
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-dropdown-menu.mjs +0 -253
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-focus-guards.mjs +0 -29
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-focus-scope.mjs +0 -206
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-id.mjs +0 -14
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-label.mjs +0 -23
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-menu.mjs +0 -812
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-popover.mjs +0 -300
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-popper.mjs +0 -286
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-portal.mjs +0 -16
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-presence.mjs +0 -128
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-primitive.mjs +0 -75
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-roving-focus.mjs +0 -224
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-scroll-area.mjs +0 -721
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-select.mjs +0 -1163
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-separator.mjs +0 -28
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-slot.mjs +0 -186
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-switch.mjs +0 -152
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-tabs.mjs +0 -189
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-callback-ref.mjs +0 -11
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-controllable-state.mjs +0 -69
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-effect-event.mjs +0 -1
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-escape-keydown.mjs +0 -17
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-is-hydrated.mjs +0 -15
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-layout-effect.mjs +0 -6
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-previous.mjs +0 -14
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-use-size.mjs +0 -39
- package/admin-dist/server/_chunks/_libs/@radix-ui/react-visually-hidden.mjs +0 -60
- package/admin-dist/server/_chunks/_libs/@tanstack/history.mjs +0 -33
- package/admin-dist/server/_chunks/_libs/@tanstack/react-router.mjs +0 -1485
- package/admin-dist/server/_chunks/_libs/@tanstack/react-store.mjs +0 -1
- package/admin-dist/server/_chunks/_libs/@tanstack/router-core.mjs +0 -4101
- package/admin-dist/server/_chunks/_libs/@tanstack/store.mjs +0 -1
- package/admin-dist/server/_chunks/_libs/react-dom.mjs +0 -10781
- package/admin-dist/server/_chunks/_libs/react.mjs +0 -513
- package/admin-dist/server/_libs/aria-hidden.mjs +0 -122
- package/admin-dist/server/_libs/class-variance-authority.mjs +0 -44
- package/admin-dist/server/_libs/clsx.mjs +0 -16
- package/admin-dist/server/_libs/cmdk.mjs +0 -315
- package/admin-dist/server/_libs/convex-helpers.mjs +0 -1112
- package/admin-dist/server/_libs/convex.mjs +0 -6239
- package/admin-dist/server/_libs/cookie-es.mjs +0 -1
- package/admin-dist/server/_libs/croner.mjs +0 -1
- package/admin-dist/server/_libs/crossws.mjs +0 -1
- package/admin-dist/server/_libs/date-fns.mjs +0 -1716
- package/admin-dist/server/_libs/detect-node-es.mjs +0 -1
- package/admin-dist/server/_libs/get-nonce.mjs +0 -9
- package/admin-dist/server/_libs/h3.mjs +0 -401
- package/admin-dist/server/_libs/hookable.mjs +0 -1
- package/admin-dist/server/_libs/isbot.mjs +0 -20
- package/admin-dist/server/_libs/lucide-react.mjs +0 -877
- package/admin-dist/server/_libs/ohash.mjs +0 -1
- package/admin-dist/server/_libs/react-day-picker.mjs +0 -2201
- package/admin-dist/server/_libs/react-remove-scroll-bar.mjs +0 -82
- package/admin-dist/server/_libs/react-remove-scroll.mjs +0 -328
- package/admin-dist/server/_libs/react-style-singleton.mjs +0 -69
- package/admin-dist/server/_libs/rou3.mjs +0 -8
- package/admin-dist/server/_libs/seroval-plugins.mjs +0 -1
- package/admin-dist/server/_libs/seroval.mjs +0 -1
- package/admin-dist/server/_libs/srvx.mjs +0 -719
- package/admin-dist/server/_libs/tailwind-merge.mjs +0 -3010
- package/admin-dist/server/_libs/tiny-invariant.mjs +0 -12
- package/admin-dist/server/_libs/tiny-warning.mjs +0 -5
- package/admin-dist/server/_libs/tslib.mjs +0 -39
- package/admin-dist/server/_libs/ufo.mjs +0 -54
- package/admin-dist/server/_libs/unctx.mjs +0 -1
- package/admin-dist/server/_libs/unstorage.mjs +0 -1
- package/admin-dist/server/_libs/use-callback-ref.mjs +0 -66
- package/admin-dist/server/_libs/use-sidecar.mjs +0 -106
- package/admin-dist/server/_libs/use-sync-external-store.mjs +0 -64
- package/admin-dist/server/_libs/zod.mjs +0 -4223
- package/admin-dist/server/_ssr/CmsEmptyState-DzzuQG0S.mjs +0 -38
- package/admin-dist/server/_ssr/CmsFilterBar-C5XADS12.mjs +0 -81
- package/admin-dist/server/_ssr/CmsPageHeader-DZ6h7smh.mjs +0 -24
- package/admin-dist/server/_ssr/CmsStatusBadge-D-YFSAa1.mjs +0 -127
- package/admin-dist/server/_ssr/CmsSurface-Cv51NBLZ.mjs +0 -44
- package/admin-dist/server/_ssr/CmsTable-DG88C5nO.mjs +0 -189
- package/admin-dist/server/_ssr/ContentEntryEditor-CRjwXB17.mjs +0 -3708
- package/admin-dist/server/_ssr/TaxonomyFilter-xGwcgtjr.mjs +0 -188
- package/admin-dist/server/_ssr/_contentTypeId-DRCfeKkm.mjs +0 -411
- package/admin-dist/server/_ssr/_entryId-DULm2TDy.mjs +0 -149
- package/admin-dist/server/_ssr/_tanstack-start-manifest_v-iX3K33p1.mjs +0 -4
- package/admin-dist/server/_ssr/badge-CbjIvhb6.mjs +0 -39
- package/admin-dist/server/_ssr/command-xB2uiYps.mjs +0 -128
- package/admin-dist/server/_ssr/config.server-BOr7Jxr4.mjs +0 -105
- package/admin-dist/server/_ssr/content-BfLBaJCZ.mjs +0 -575
- package/admin-dist/server/_ssr/content-types-DZbF6O2q.mjs +0 -469
- package/admin-dist/server/_ssr/index-Cfe8sZv5.mjs +0 -374
- package/admin-dist/server/_ssr/index.mjs +0 -4673
- package/admin-dist/server/_ssr/media-Bds2AnPC.mjs +0 -2172
- package/admin-dist/server/_ssr/new._contentTypeId-DGvz_tlW.mjs +0 -132
- package/admin-dist/server/_ssr/router-DxF7GBcO.mjs +0 -11831
- package/admin-dist/server/_ssr/scroll-area-DLDlXI07.mjs +0 -59
- package/admin-dist/server/_ssr/settings-BbaiS6z9.mjs +0 -506
- package/admin-dist/server/_ssr/start-HYkvq4Ni.mjs +0 -4
- package/admin-dist/server/_ssr/switch-Bl89Pfxu.mjs +0 -31
- package/admin-dist/server/_ssr/tabs-QkbR0iir.mjs +0 -629
- package/admin-dist/server/_ssr/tanstack-adapter-CKknPtcU.mjs +0 -151
- package/admin-dist/server/_ssr/taxonomies-S_Ontd0z.mjs +0 -1020
- package/admin-dist/server/_ssr/trash-BzAIsbbN.mjs +0 -382
- package/admin-dist/server/_ssr/useBreadcrumbLabel-BjiR1fM_.mjs +0 -16
- package/admin-dist/server/_ssr/usePermissions-CDHN95Nz.mjs +0 -68
- package/admin-dist/server/favicon.ico +0 -0
- package/admin-dist/server/index.mjs +0 -718
- /package/admin-dist/{public/assets → assets}/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- /package/admin-dist/{public/assets → assets}/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- /package/admin-dist/{public/assets → assets}/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- /package/admin-dist/{public/assets → assets}/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- /package/admin-dist/{public/assets → assets}/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- /package/admin-dist/{public/assets → assets}/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- /package/admin-dist/{public/assets → assets}/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- /package/admin-dist/{public/assets → assets}/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
- /package/admin-dist/{public/assets → assets}/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
- /package/admin-dist/{public/assets → assets}/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
- /package/admin-dist/{public/assets → assets}/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
- /package/admin-dist/{public/assets → assets}/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
- /package/admin-dist/{public/assets → assets}/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
- /package/admin-dist/{public/assets → assets}/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
- /package/admin-dist/{public/assets → assets}/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
- /package/admin-dist/{public/assets → assets}/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
- /package/admin-dist/{public/favicon.ico → favicon.ico} +0 -0
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/convex-cms)
|
|
4
4
|
[](https://opensource.org/licenses/Apache-2.0)
|
|
5
5
|
|
|
6
|
-
> **Alpha
|
|
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
|
|
package/admin/README.md
ADDED
|
@@ -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 "
|
|
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";
|
|
@@ -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
|
-
//
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
+
}
|