convex-cms 0.0.5-alpha.4 → 0.0.5-alpha.5

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 (145) hide show
  1. package/README.md +3 -3
  2. package/admin/src/components/Sidebar.tsx +150 -58
  3. package/admin/src/components/ui/collapsible.tsx +7 -0
  4. package/admin/src/embed/components/EmbedSidebar.tsx +163 -68
  5. package/admin-dist/nitro.json +1 -1
  6. package/admin-dist/public/assets/{CmsEmptyState-CkqBIab3.js → CmsEmptyState-Do_erIgn.js} +1 -1
  7. package/admin-dist/public/assets/{CmsPageHeader-CUtl5MMG.js → CmsPageHeader-qDwPGi48.js} +1 -1
  8. package/admin-dist/public/assets/{CmsStatusBadge-CUYFgEe-.js → CmsStatusBadge-Dd9uToHE.js} +1 -1
  9. package/admin-dist/public/assets/{CmsSurface-CsJfAVa3.js → CmsSurface-DBy5Lumx.js} +1 -1
  10. package/admin-dist/public/assets/{CmsToolbar-CnfbcxeP.js → CmsToolbar-D1-Y-7SK.js} +1 -1
  11. package/admin-dist/public/assets/ContentEntryEditor-CWBiIx52.js +4 -0
  12. package/admin-dist/public/assets/{TaxonomyFilter-CWCxC5HZ.js → TaxonomyFilter-CdYQawxb.js} +1 -1
  13. package/admin-dist/public/assets/_contentTypeId-D9VMP6Gs.js +1 -0
  14. package/admin-dist/public/assets/_entryId-2FlCfqE7.js +1 -0
  15. package/admin-dist/public/assets/{alert-CF1BSzGR.js → alert-GxZx0y5c.js} +1 -1
  16. package/admin-dist/public/assets/{badge-CmuOIVKp.js → badge-BAlGIjop.js} +1 -1
  17. package/admin-dist/public/assets/{circle-check-big-BKDVG6DU.js → circle-check-big-CpLxAvEj.js} +1 -1
  18. package/admin-dist/public/assets/{command-XJxnF2Sd.js → command-di7XCqcv.js} +1 -1
  19. package/admin-dist/public/assets/content-D8zELsDG.js +1 -0
  20. package/admin-dist/public/assets/{content-types-CrNEm8Hf.js → content-types-BmzD0krT.js} +2 -2
  21. package/admin-dist/public/assets/globals-BvFfH-v9.css +1 -0
  22. package/admin-dist/public/assets/{index-C7xOwudI.js → index-zqfj4T_v.js} +1 -1
  23. package/admin-dist/public/assets/{label-CHCnXeBk.js → label-B6PPtKR5.js} +1 -1
  24. package/admin-dist/public/assets/{link-2-Bb34judH.js → link-2-W2fVnVOf.js} +1 -1
  25. package/admin-dist/public/assets/{list-9Pzt48ld.js → list-F8O0lZXC.js} +1 -1
  26. package/admin-dist/public/assets/main-dZT72bAG.js +97 -0
  27. package/admin-dist/public/assets/media-CETueFbV.js +1 -0
  28. package/admin-dist/public/assets/new._contentTypeId-BV2-TyyR.js +1 -0
  29. package/admin-dist/public/assets/{plus-Ceef7DHk.js → plus-AABQIF0N.js} +1 -1
  30. package/admin-dist/public/assets/{rotate-ccw-7k7-4VUq.js → rotate-ccw-BZpZtw0N.js} +1 -1
  31. package/admin-dist/public/assets/{scroll-area-CC6wujnp.js → scroll-area-CDfk-zrz.js} +1 -1
  32. package/admin-dist/public/assets/{search-DwoUV2pv.js → search-BvgYr-c9.js} +1 -1
  33. package/admin-dist/public/assets/{select-hOZTp8aC.js → select-BuiHcMzS.js} +1 -1
  34. package/admin-dist/public/assets/settings-DBxbYDvn.js +1 -0
  35. package/admin-dist/public/assets/{switch-jX2pDaNU.js → switch-DiJvolcs.js} +1 -1
  36. package/admin-dist/public/assets/tabs-Cgz6G_Xy.js +1 -0
  37. package/admin-dist/public/assets/{tanstack-adapter-B-Glm4kH.js → tanstack-adapter-BknsSgra.js} +1 -1
  38. package/admin-dist/public/assets/taxonomies-DOErsLl5.js +1 -0
  39. package/admin-dist/public/assets/{textarea-B6SfBmr0.js → textarea-CgggMxUX.js} +1 -1
  40. package/admin-dist/public/assets/{trash-BOCnIznD.js → trash-BU4ANuaW.js} +1 -1
  41. package/admin-dist/public/assets/{triangle-alert-CXFIO_Gu.js → triangle-alert-lvCbwp0s.js} +1 -1
  42. package/admin-dist/public/assets/{useBreadcrumbLabel-_6qBagc3.js → useBreadcrumbLabel-D00rvqjw.js} +1 -1
  43. package/admin-dist/public/assets/{usePermissions-M1ijZ7a6.js → usePermissions-D7tQowaF.js} +1 -1
  44. package/admin-dist/server/_chunks/_libs/@radix-ui/react-collapsible.mjs +144 -0
  45. package/admin-dist/server/_chunks/_libs/@radix-ui/react-slot.mjs +21 -21
  46. package/admin-dist/server/_libs/lucide-react.mjs +131 -124
  47. package/admin-dist/server/_ssr/{CmsButton-DOiTVKQq.mjs → CmsButton-DbzfJru_.mjs} +1 -1
  48. package/admin-dist/server/_ssr/{CmsEmptyState-fbnGt3LD.mjs → CmsEmptyState-CuvcXr3Z.mjs} +3 -3
  49. package/admin-dist/server/_ssr/{CmsPageHeader-DHRrdOZa.mjs → CmsPageHeader-ClNPU7Up.mjs} +1 -1
  50. package/admin-dist/server/_ssr/{CmsStatusBadge-s7obWbKZ.mjs → CmsStatusBadge-CojMbrY7.mjs} +2 -2
  51. package/admin-dist/server/_ssr/{CmsSurface-rFoYjb62.mjs → CmsSurface-Dcv440rp.mjs} +1 -1
  52. package/admin-dist/server/_ssr/{CmsToolbar-zTE45z2q.mjs → CmsToolbar-BKv1nL6u.mjs} +2 -2
  53. package/admin-dist/server/_ssr/{ContentEntryEditor-BLoEjT_m.mjs → ContentEntryEditor-weiXSBdZ.mjs} +35 -51
  54. package/admin-dist/server/_ssr/{TaxonomyFilter-XAtaJC2z.mjs → TaxonomyFilter-BPQ57Mwk.mjs} +7 -7
  55. package/admin-dist/server/_ssr/{_contentTypeId-Csl4822C.mjs → _contentTypeId-DyyauLOs.mjs} +24 -23
  56. package/admin-dist/server/_ssr/{_entryId-D8alLFBx.mjs → _entryId-9Cafwxmw.mjs} +22 -21
  57. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-Dk-FIYPN.mjs +4 -0
  58. package/admin-dist/server/_ssr/{command-C0Di14--.mjs → command-CEf8YBxY.mjs} +1 -1
  59. package/admin-dist/server/_ssr/{content-CT-FPsmV.mjs → content-ZFWVzO25.mjs} +20 -19
  60. package/admin-dist/server/_ssr/{content-types-C8cBFdzE.mjs → content-types-D25lUE-j.mjs} +18 -17
  61. package/admin-dist/server/_ssr/{index-BJtcrEc-.mjs → index-BlSIlH4Z.mjs} +10 -9
  62. package/admin-dist/server/_ssr/index.mjs +2 -2
  63. package/admin-dist/server/_ssr/{label-qn2Afwl4.mjs → label-PblVvdRv.mjs} +1 -1
  64. package/admin-dist/server/_ssr/{media-qv5IAsMZ.mjs → media-CD2_NUMw.mjs} +683 -314
  65. package/admin-dist/server/_ssr/{new._contentTypeId-DdGyrhqs.mjs → new._contentTypeId-dmZy6PBX.mjs} +20 -19
  66. package/admin-dist/server/_ssr/{router-nSVkxb6Y.mjs → router-x6Ab8T4s.mjs} +109 -43
  67. package/admin-dist/server/_ssr/{scroll-area-BCinP455.mjs → scroll-area-BH_1K-WT.mjs} +1 -1
  68. package/admin-dist/server/_ssr/{select-BKQlQScw.mjs → select-CrfEkFJw.mjs} +2 -2
  69. package/admin-dist/server/_ssr/{settings-BCr2KQlk.mjs → settings-DVdsoWoh.mjs} +158 -105
  70. package/admin-dist/server/_ssr/{switch-BaOi42fE.mjs → switch-DX_X8vZl.mjs} +1 -1
  71. package/admin-dist/server/_ssr/{tabs-DYXEi9kq.mjs → tabs-4FWM0sn8.mjs} +3 -3
  72. package/admin-dist/server/_ssr/{tanstack-adapter-Bsz8kha-.mjs → tanstack-adapter-D3ZcKtbY.mjs} +1 -1
  73. package/admin-dist/server/_ssr/{taxonomies-CueMHTbE.mjs → taxonomies-BHFfO9Yr.mjs} +21 -20
  74. package/admin-dist/server/_ssr/{textarea-CI0Jqx2x.mjs → textarea-CZVaroMc.mjs} +1 -1
  75. package/admin-dist/server/_ssr/{trash-DE6W8GoX.mjs → trash-9tUB2KwI.mjs} +14 -13
  76. package/admin-dist/server/_ssr/{useBreadcrumbLabel-B5Yi72lM.mjs → useBreadcrumbLabel-DVme3DSb.mjs} +1 -1
  77. package/admin-dist/server/_ssr/{usePermissions-C3nZ-Izm.mjs → usePermissions-zAQj-ruE.mjs} +1 -1
  78. package/admin-dist/server/index.mjs +188 -188
  79. package/dist/cli/commands/init.d.ts +12 -2
  80. package/dist/cli/commands/init.d.ts.map +1 -1
  81. package/dist/cli/commands/init.js +136 -138
  82. package/dist/cli/commands/init.js.map +1 -1
  83. package/dist/cli/index.js +2 -1
  84. package/dist/cli/index.js.map +1 -1
  85. package/dist/cli/templates/admin.d.ts +10 -0
  86. package/dist/cli/templates/admin.d.ts.map +1 -0
  87. package/dist/cli/templates/admin.js +212 -0
  88. package/dist/cli/templates/admin.js.map +1 -0
  89. package/dist/cli/templates/cmsClient.d.ts +7 -0
  90. package/dist/cli/templates/cmsClient.d.ts.map +1 -0
  91. package/dist/cli/templates/cmsClient.js +36 -0
  92. package/dist/cli/templates/cmsClient.js.map +1 -0
  93. package/dist/cli/templates/cmsConfig.d.ts +7 -0
  94. package/dist/cli/templates/cmsConfig.d.ts.map +1 -0
  95. package/dist/cli/templates/cmsConfig.js +86 -0
  96. package/dist/cli/templates/cmsConfig.js.map +1 -0
  97. package/dist/cli/templates/index.d.ts +10 -0
  98. package/dist/cli/templates/index.d.ts.map +1 -0
  99. package/dist/cli/templates/index.js +10 -0
  100. package/dist/cli/templates/index.js.map +1 -0
  101. package/dist/cli/templates/schemas/blog.d.ts +8 -0
  102. package/dist/cli/templates/schemas/blog.d.ts.map +1 -0
  103. package/dist/cli/templates/schemas/blog.js +103 -0
  104. package/dist/cli/templates/schemas/blog.js.map +1 -0
  105. package/dist/cli/templates/schemas/docs.d.ts +8 -0
  106. package/dist/cli/templates/schemas/docs.d.ts.map +1 -0
  107. package/dist/cli/templates/schemas/docs.js +110 -0
  108. package/dist/cli/templates/schemas/docs.js.map +1 -0
  109. package/dist/cli/templates/schemas/index.d.ts +11 -0
  110. package/dist/cli/templates/schemas/index.d.ts.map +1 -0
  111. package/dist/cli/templates/schemas/index.js +13 -0
  112. package/dist/cli/templates/schemas/index.js.map +1 -0
  113. package/dist/cli/templates/schemas/landing.d.ts +8 -0
  114. package/dist/cli/templates/schemas/landing.d.ts.map +1 -0
  115. package/dist/cli/templates/schemas/landing.js +135 -0
  116. package/dist/cli/templates/schemas/landing.js.map +1 -0
  117. package/dist/cli/utils/fileUtils.d.ts +21 -0
  118. package/dist/cli/utils/fileUtils.d.ts.map +1 -0
  119. package/dist/cli/utils/fileUtils.js +95 -0
  120. package/dist/cli/utils/fileUtils.js.map +1 -0
  121. package/dist/cli/utils/prompts.d.ts +25 -0
  122. package/dist/cli/utils/prompts.d.ts.map +1 -0
  123. package/dist/cli/utils/prompts.js +87 -0
  124. package/dist/cli/utils/prompts.js.map +1 -0
  125. package/dist/client/agentTools.d.ts +1 -1427
  126. package/dist/client/agentTools.d.ts.map +1 -1
  127. package/dist/component/contentTypeMutations.d.ts +1 -1
  128. package/dist/test.d.ts +5 -0
  129. package/dist/test.d.ts.map +1 -1
  130. package/dist/test.js +0 -1
  131. package/dist/test.js.map +1 -1
  132. package/package.json +28 -28
  133. package/admin/README.md +0 -99
  134. package/admin-dist/public/assets/ContentEntryEditor-BU220CCy.js +0 -4
  135. package/admin-dist/public/assets/_contentTypeId-DK8cskRt.js +0 -1
  136. package/admin-dist/public/assets/_entryId-CuVMExbb.js +0 -1
  137. package/admin-dist/public/assets/content-QBUxdxbS.js +0 -1
  138. package/admin-dist/public/assets/globals-B7Wsfh_v.css +0 -1
  139. package/admin-dist/public/assets/main-CjQ2VI9L.js +0 -97
  140. package/admin-dist/public/assets/media-Dc5PWt2Q.js +0 -1
  141. package/admin-dist/public/assets/new._contentTypeId-C_I4YxIa.js +0 -1
  142. package/admin-dist/public/assets/settings-t2PbCZh4.js +0 -1
  143. package/admin-dist/public/assets/tabs-q4EbZk7c.js +0 -1
  144. package/admin-dist/public/assets/taxonomies-kyk5P4ZW.js +0 -1
  145. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-BffZedId.mjs +0 -4
@@ -1,156 +1,154 @@
1
- import fs from "fs";
2
- import path from "path";
3
- const ADMIN_TEMPLATE = `/**
4
- * Admin API for CMS Admin UI
5
- *
6
- * This file exports Convex functions that the admin UI calls.
7
- * Generated by: npx convex-cms init
1
+ /**
2
+ * Init Command
8
3
  *
9
- * @example Usage with embedded admin:
10
- * \`\`\`tsx
11
- * import { CmsAdmin } from "convex-cms-admin";
4
+ * Sets up Convex CMS in a project with interactive template selection.
12
5
  *
13
- * function AdminPage() {
14
- * return (
15
- * <CmsAdmin
16
- * convexUrl={import.meta.env.VITE_CONVEX_URL}
17
- * auth={{
18
- * getUser: () => yourAuth.getUser(),
19
- * getUserRole: (id) => yourAuth.getRole(id),
20
- * }}
21
- * />
22
- * );
23
- * }
24
- * \`\`\`
6
+ * Usage:
7
+ * npx convex-cms init # Interactive mode
8
+ * npx convex-cms init --template blog # Use blog template
9
+ * npx convex-cms init --force # Overwrite existing files
25
10
  */
26
-
27
- import { defineAdminAPI } from "convex-cms";
28
- import { components } from "./_generated/api";
29
-
30
- export const {
31
- // Content Types
32
- listContentTypes,
33
- getContentType,
34
- createContentType,
35
- updateContentType,
36
- deleteContentType,
37
-
38
- // Entries
39
- listEntries,
40
- getEntry,
41
- createEntry,
42
- updateEntry,
43
- publishEntry,
44
- unpublishEntry,
45
- deleteEntry,
46
- duplicateEntry,
47
- scheduleEntry,
48
- cancelScheduledEntry,
49
- getScheduledEntries,
50
-
51
- // Media Assets
52
- listMediaAssets,
53
- getMediaAsset,
54
- createMediaAsset,
55
- updateMediaAsset,
56
- deleteMediaAsset,
57
- restoreMediaAsset,
58
- moveMediaAssets,
59
-
60
- // Media Folders
61
- listMediaFolders,
62
- getMediaFolder,
63
- getMediaFolderTree,
64
- createMediaFolder,
65
- updateMediaFolder,
66
- moveMediaFolder,
67
- deleteMediaFolder,
68
- restoreMediaFolder,
69
-
70
- // Upload
71
- generateUploadUrl,
72
-
73
- // Stats
74
- getDashboardStats,
75
- } = defineAdminAPI(components.convexCms, {
76
- // Optional: Add auth callback to validate access
77
- // auth: async (ctx, operation) => {
78
- // const identity = await ctx.auth.getUserIdentity();
79
- // if (!identity) {
80
- // throw new Error("Unauthorized: Please sign in");
81
- // }
82
- // // Optionally check operation.type for fine-grained access control
83
- // return identity.subject;
84
- // },
85
- });
86
- `;
11
+ import path from "path";
12
+ import { promptForTemplate, showIntro, showOutro, logStep, logSuccess, logWarning, logError, logInfo, note, } from "../utils/prompts.js";
13
+ import { fileExists, writeFile, updateConvexConfig, } from "../utils/fileUtils.js";
14
+ import { ADMIN_TEMPLATE } from "../templates/admin.js";
15
+ import { CMS_CONFIG_TEMPLATE } from "../templates/cmsConfig.js";
16
+ import { CMS_CLIENT_TEMPLATE } from "../templates/cmsClient.js";
17
+ import { BLOG_SCHEMA_TEMPLATE } from "../templates/schemas/blog.js";
18
+ import { DOCS_SCHEMA_TEMPLATE } from "../templates/schemas/docs.js";
19
+ import { LANDING_SCHEMA_TEMPLATE } from "../templates/schemas/landing.js";
20
+ const TEMPLATE_DESCRIPTIONS = {
21
+ blog: "Blog content types",
22
+ docs: "Documentation content types",
23
+ landing: "Landing page content types",
24
+ blank: "No schemas",
25
+ };
26
+ function getSchemaTemplate(template) {
27
+ switch (template) {
28
+ case "blog":
29
+ return BLOG_SCHEMA_TEMPLATE;
30
+ case "docs":
31
+ return DOCS_SCHEMA_TEMPLATE;
32
+ case "landing":
33
+ return LANDING_SCHEMA_TEMPLATE;
34
+ case "blank":
35
+ return null;
36
+ default:
37
+ return null;
38
+ }
39
+ }
40
+ function validateTemplate(template) {
41
+ return ["blog", "docs", "landing", "blank"].includes(template);
42
+ }
87
43
  export async function initCommand(options) {
88
44
  const cwd = process.cwd();
89
45
  const convexDir = path.join(cwd, "convex");
90
- const adminPath = path.join(convexDir, "admin.ts");
91
- console.log("");
92
- console.log(" Convex CMS - Init");
93
- console.log(" -----------------");
94
- console.log("");
95
- // Check if convex/ directory exists
96
- if (!fs.existsSync(convexDir)) {
97
- console.error(" Error: No convex/ directory found.");
98
- console.error("");
99
- console.error(" Please run this command from a Convex project root,");
100
- console.error(" or initialize Convex first with: npx convex dev");
101
- process.exit(1);
102
- }
103
- // Check if admin.ts already exists
104
- if (fs.existsSync(adminPath) && !options.force) {
105
- console.error(" Error: convex/admin.ts already exists.");
106
- console.error("");
107
- console.error(" Use --force to overwrite the existing file.");
46
+ if (!fileExists(convexDir)) {
47
+ console.log("");
48
+ logError("No convex/ directory found.");
49
+ console.log("");
50
+ logInfo("Please run this command from a Convex project root,");
51
+ logInfo("or initialize Convex first with: npx convex dev");
108
52
  process.exit(1);
109
53
  }
110
- // Write the admin.ts file
111
- try {
112
- fs.writeFileSync(adminPath, ADMIN_TEMPLATE);
113
- console.log(" Created convex/admin.ts");
54
+ let template;
55
+ if (options.template) {
56
+ if (!validateTemplate(options.template)) {
57
+ logError(`Invalid template: ${options.template}`);
58
+ logInfo("Valid templates: blog, docs, landing, blank");
59
+ process.exit(1);
60
+ }
61
+ template = options.template;
62
+ showIntro();
63
+ logStep(`Using template: ${template}`);
114
64
  }
115
- catch (error) {
116
- console.error(" Error writing convex/admin.ts:", error);
117
- process.exit(1);
65
+ else {
66
+ const result = await promptForTemplate();
67
+ if (result.cancelled) {
68
+ process.exit(0);
69
+ }
70
+ template = result.template;
118
71
  }
119
- // Check if convex.config.ts mentions convexCms
120
- const configPath = path.join(convexDir, "convex.config.ts");
121
- let configHasComponent = false;
122
- if (fs.existsSync(configPath)) {
123
- const configContent = fs.readFileSync(configPath, "utf-8");
124
- configHasComponent = configContent.includes("convexCms");
72
+ const files = [
73
+ {
74
+ name: "convex/admin.ts",
75
+ path: path.join(convexDir, "admin.ts"),
76
+ content: ADMIN_TEMPLATE,
77
+ },
78
+ {
79
+ name: "convex/cms.config.ts",
80
+ path: path.join(convexDir, "cms.config.ts"),
81
+ content: CMS_CONFIG_TEMPLATE,
82
+ },
83
+ {
84
+ name: "convex/cms.ts",
85
+ path: path.join(convexDir, "cms.ts"),
86
+ content: CMS_CLIENT_TEMPLATE,
87
+ },
88
+ ];
89
+ const schemaContent = getSchemaTemplate(template);
90
+ if (schemaContent) {
91
+ files.push({
92
+ name: "convex/schemas.ts",
93
+ path: path.join(convexDir, "schemas.ts"),
94
+ content: schemaContent,
95
+ });
125
96
  }
126
97
  console.log("");
127
- console.log(" Next steps:");
98
+ logStep("Creating files...");
99
+ const results = [];
100
+ const createdFiles = [];
101
+ const modifiedFiles = [];
102
+ const skippedFiles = [];
103
+ for (const file of files) {
104
+ try {
105
+ const result = writeFile(file.path, file.content, {
106
+ force: options.force,
107
+ });
108
+ results.push(result);
109
+ if (result.created) {
110
+ createdFiles.push(file.name);
111
+ logSuccess(`${file.name}`);
112
+ }
113
+ else if (result.modified) {
114
+ modifiedFiles.push(file.name);
115
+ logSuccess(`${file.name} (updated)`);
116
+ }
117
+ else if (result.skipped) {
118
+ skippedFiles.push(file.name);
119
+ logWarning(`${file.name} (skipped - already exists)`);
120
+ }
121
+ }
122
+ catch (error) {
123
+ logError(`Failed to write ${file.name}: ${error}`);
124
+ }
125
+ }
126
+ const configPath = path.join(convexDir, "convex.config.ts");
127
+ const configResult = updateConvexConfig(configPath, { force: options.force });
128
128
  console.log("");
129
- if (!configHasComponent) {
130
- console.log(" 1. Add the CMS component to convex/convex.config.ts:");
131
- console.log("");
132
- console.log(' import convexCms from "convex-cms/convex.config";');
133
- console.log("");
134
- console.log(" const app = defineApp();");
135
- console.log(" app.use(convexCms);");
136
- console.log(" export default app;");
137
- console.log("");
138
- console.log(" 2. Run Convex dev server:");
139
- console.log(" npx convex dev");
140
- console.log("");
141
- console.log(" 3. Access admin (development):");
142
- console.log(" npx convex-cms admin");
129
+ if (configResult.created) {
130
+ logSuccess("convex/convex.config.ts (created)");
143
131
  }
144
- else {
145
- console.log(" 1. Run Convex dev server:");
146
- console.log(" npx convex dev");
132
+ else if (configResult.modified) {
133
+ logSuccess("convex/convex.config.ts (added CMS component)");
134
+ }
135
+ else if (configResult.skipped) {
136
+ logInfo("convex/convex.config.ts (CMS already configured)");
137
+ }
138
+ if (skippedFiles.length > 0 && !options.force) {
147
139
  console.log("");
148
- console.log(" 2. Access admin (development):");
149
- console.log(" npx convex-cms admin");
140
+ logWarning("Some files were skipped. Use --force to overwrite.");
150
141
  }
151
- console.log("");
152
- console.log(" For production, embed the admin UI in your app:");
153
- console.log(" https://github.com/obkaro/convex-cms#embedding-admin-ui");
154
- console.log("");
142
+ const nextSteps = `
143
+ 1. Start Convex:
144
+ npx convex dev
145
+
146
+ 2. Launch admin UI (development):
147
+ npx convex-cms admin
148
+
149
+ Documentation: https://github.com/obkaro/convex-cms`;
150
+ note(nextSteps, "Next steps");
151
+ const templateDesc = TEMPLATE_DESCRIPTIONS[template];
152
+ showOutro(`Setup complete! Template: ${templateDesc}`);
155
153
  }
156
154
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -10,7 +10,8 @@ program
10
10
  program
11
11
  .command("init")
12
12
  .description("Initialize CMS admin API in your Convex project")
13
- .option("-f, --force", "Overwrite existing convex/admin.ts")
13
+ .option("-f, --force", "Overwrite existing files")
14
+ .option("-t, --template <template>", "Schema template (blog, docs, landing, blank)")
14
15
  .action(initCommand);
15
16
  program
16
17
  .command("admin")
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,+CAA+C,CAAC;KAC5D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,aAAa,EAAE,oCAAoC,CAAC;KAC3D,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,aAAa,EAAE,uBAAuB,CAAC;KAC9C,MAAM,CAAC,eAAe,EAAE,wBAAwB,EAAE,MAAM,CAAC;KACzD,MAAM,CAAC,QAAQ,EAAE,2CAA2C,CAAC;KAC7D,MAAM,CAAC,WAAW,EAAE,mCAAmC,CAAC;KACxD,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,+CAA+C,CAAC;KAC5D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,aAAa,EAAE,0BAA0B,CAAC;KACjD,MAAM,CACL,2BAA2B,EAC3B,8CAA8C,CAC/C;KACA,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,aAAa,EAAE,uBAAuB,CAAC;KAC9C,MAAM,CAAC,eAAe,EAAE,wBAAwB,EAAE,MAAM,CAAC;KACzD,MAAM,CAAC,QAAQ,EAAE,2CAA2C,CAAC;KAC7D,MAAM,CAAC,WAAW,EAAE,mCAAmC,CAAC;KACxD,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Admin API template for CMS Admin UI
3
+ *
4
+ * Generated by: npx convex-cms init
5
+ *
6
+ * This file exports all 87 Convex functions required by the admin UI.
7
+ * All exports are required - removing any will break the admin interface.
8
+ */
9
+ export declare const ADMIN_TEMPLATE = "/**\n * Admin API for CMS Admin UI\n *\n * Uses the unified config pattern - all CMS settings are defined\n * once in cms.config.ts and shared with the client API.\n *\n * Usage:\n * 1. Run your Convex dev server: `npx convex dev`\n * 2. Launch the admin UI: `npx convex-cms admin`\n * 3. Or embed in your app: `<CmsAdmin convexUrl={...} />`\n */\n\nimport { defineAdminAPI } from \"convex-cms\";\nimport { components } from \"./_generated/api\";\nimport cmsConfig from \"./cms.config\";\n\nconst admin = defineAdminAPI(components.convexCms, cmsConfig);\n\n// =============================================================================\n// Dashboard\n// =============================================================================\n\nexport const getDashboardStats = admin.getDashboardStats;\n\n// =============================================================================\n// Content Types\n// =============================================================================\n\nexport const listContentTypes = admin.listContentTypes;\nexport const getContentType = admin.getContentType;\nexport const createContentType = admin.createContentType;\nexport const updateContentType = admin.updateContentType;\nexport const deleteContentType = admin.deleteContentType;\n\n// =============================================================================\n// Content Entries\n// =============================================================================\n\nexport const listEntries = admin.listEntries;\nexport const getEntry = admin.getEntry;\nexport const createEntry = admin.createEntry;\nexport const updateEntry = admin.updateEntry;\nexport const publishEntry = admin.publishEntry;\nexport const unpublishEntry = admin.unpublishEntry;\nexport const deleteEntry = admin.deleteEntry;\nexport const duplicateEntry = admin.duplicateEntry;\nexport const scheduleEntry = admin.scheduleEntry;\nexport const cancelScheduledEntry = admin.cancelScheduledEntry;\nexport const getScheduledEntries = admin.getScheduledEntries;\nexport const restoreEntry = admin.restoreEntry;\nexport const getEntryBySlug = admin.getEntryBySlug;\nexport const getEntryBySlugAndTypeName = admin.getEntryBySlugAndTypeName;\n\n// =============================================================================\n// Bulk Operations\n// =============================================================================\n\nexport const bulkPublish = admin.bulkPublish;\nexport const bulkUnpublish = admin.bulkUnpublish;\nexport const bulkDelete = admin.bulkDelete;\nexport const bulkUpdate = admin.bulkUpdate;\nexport const bulkRestore = admin.bulkRestore;\n\n// =============================================================================\n// Trash\n// =============================================================================\n\nexport const getTrashConfig = admin.getTrashConfig;\nexport const listTrash = admin.listTrash;\nexport const getTrashStats = admin.getTrashStats;\nexport const updateTrashConfig = admin.updateTrashConfig;\nexport const emptyTrash = admin.emptyTrash;\nexport const runTrashCleanup = admin.runTrashCleanup;\n\n// =============================================================================\n// Content Lock\n// =============================================================================\n\nexport const checkContentLock = admin.checkContentLock;\nexport const listLockedContent = admin.listLockedContent;\nexport const acquireContentLock = admin.acquireContentLock;\nexport const releaseContentLock = admin.releaseContentLock;\nexport const renewContentLock = admin.renewContentLock;\nexport const forceReleaseContentLock = admin.forceReleaseContentLock;\n\n// =============================================================================\n// Versions\n// =============================================================================\n\nexport const getVersionHistory = admin.getVersionHistory;\nexport const getVersion = admin.getVersion;\nexport const compareVersions = admin.compareVersions;\nexport const rollbackVersion = admin.rollbackVersion;\n\n// =============================================================================\n// Media Assets\n// =============================================================================\n\nexport const listMediaAssets = admin.listMediaAssets;\nexport const getMediaAsset = admin.getMediaAsset;\nexport const createMediaAsset = admin.createMediaAsset;\nexport const updateMediaAsset = admin.updateMediaAsset;\nexport const deleteMediaAsset = admin.deleteMediaAsset;\nexport const restoreMediaAsset = admin.restoreMediaAsset;\nexport const permanentDeleteMediaAsset = admin.permanentDeleteMediaAsset;\nexport const bulkPermanentDeleteMediaAssets =\n admin.bulkPermanentDeleteMediaAssets;\nexport const moveMediaAssets = admin.moveMediaAssets;\nexport const getMediaTrashCount = admin.getMediaTrashCount;\n\n// =============================================================================\n// Media Folders\n// =============================================================================\n\nexport const listMediaFolders = admin.listMediaFolders;\nexport const getMediaFolder = admin.getMediaFolder;\nexport const getMediaFolderTree = admin.getMediaFolderTree;\nexport const createMediaFolder = admin.createMediaFolder;\nexport const updateMediaFolder = admin.updateMediaFolder;\nexport const moveMediaFolder = admin.moveMediaFolder;\nexport const deleteMediaFolder = admin.deleteMediaFolder;\nexport const restoreMediaFolder = admin.restoreMediaFolder;\n\n// =============================================================================\n// Media Variants\n// =============================================================================\n\nexport const listMediaVariants = admin.listMediaVariants;\nexport const getMediaVariant = admin.getMediaVariant;\nexport const getBestMediaVariant = admin.getBestMediaVariant;\nexport const getMediaResponsiveSrcset = admin.getMediaResponsiveSrcset;\nexport const getMediaVariantPresets = admin.getMediaVariantPresets;\nexport const getMediaAssetWithVariants = admin.getMediaAssetWithVariants;\nexport const createMediaVariant = admin.createMediaVariant;\nexport const requestMediaVariantGeneration =\n admin.requestMediaVariantGeneration;\nexport const deleteMediaVariant = admin.deleteMediaVariant;\nexport const deleteMediaAssetVariants = admin.deleteMediaAssetVariants;\nexport const generateMediaVariantsFromPresets =\n admin.generateMediaVariantsFromPresets;\nexport const restoreMediaVariant = admin.restoreMediaVariant;\n\n// =============================================================================\n// Upload\n// =============================================================================\n\nexport const generateUploadUrl = admin.generateUploadUrl;\n\n// =============================================================================\n// Taxonomies\n// =============================================================================\n\nexport const getTaxonomy = admin.getTaxonomy;\nexport const listTaxonomies = admin.listTaxonomies;\nexport const createTaxonomy = admin.createTaxonomy;\nexport const updateTaxonomy = admin.updateTaxonomy;\nexport const deleteTaxonomy = admin.deleteTaxonomy;\nexport const restoreTaxonomy = admin.restoreTaxonomy;\n\n// =============================================================================\n// Terms\n// =============================================================================\n\nexport const getTerm = admin.getTerm;\nexport const listTerms = admin.listTerms;\nexport const getTermsHierarchy = admin.getTermsHierarchy;\nexport const suggestTerms = admin.suggestTerms;\nexport const countTerms = admin.countTerms;\nexport const createTerm = admin.createTerm;\nexport const updateTerm = admin.updateTerm;\nexport const deleteTerm = admin.deleteTerm;\nexport const restoreTerm = admin.restoreTerm;\n\n// =============================================================================\n// Entry-Term Relations\n// =============================================================================\n\nexport const getTermsByEntry = admin.getTermsByEntry;\nexport const getEntriesByTerm = admin.getEntriesByTerm;\nexport const setEntryTerms = admin.setEntryTerms;\nexport const addTermToEntry = admin.addTermToEntry;\nexport const removeTermFromEntry = admin.removeTermFromEntry;\nexport const createTermAndAddToEntry = admin.createTermAndAddToEntry;\n\n// =============================================================================\n// Media-Term Relations\n// =============================================================================\n\nexport const getTermsByMedia = admin.getTermsByMedia;\nexport const getMediaByTerm = admin.getMediaByTerm;\nexport const setMediaTerms = admin.setMediaTerms;\nexport const addTermToMedia = admin.addTermToMedia;\nexport const removeTermFromMedia = admin.removeTermFromMedia;\nexport const createTermAndAddToMedia = admin.createTermAndAddToMedia;\n\n// =============================================================================\n// Settings\n// =============================================================================\n\nexport const getSettings = admin.getSettings;\nexport const updateSettings = admin.updateSettings;\nexport const resetSettings = admin.resetSettings;\n";
10
+ //# sourceMappingURL=admin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/admin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,cAAc,kjSA0M1B,CAAC"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Admin API template for CMS Admin UI
3
+ *
4
+ * Generated by: npx convex-cms init
5
+ *
6
+ * This file exports all 87 Convex functions required by the admin UI.
7
+ * All exports are required - removing any will break the admin interface.
8
+ */
9
+ export const ADMIN_TEMPLATE = `/**
10
+ * Admin API for CMS Admin UI
11
+ *
12
+ * Uses the unified config pattern - all CMS settings are defined
13
+ * once in cms.config.ts and shared with the client API.
14
+ *
15
+ * Usage:
16
+ * 1. Run your Convex dev server: \`npx convex dev\`
17
+ * 2. Launch the admin UI: \`npx convex-cms admin\`
18
+ * 3. Or embed in your app: \`<CmsAdmin convexUrl={...} />\`
19
+ */
20
+
21
+ import { defineAdminAPI } from "convex-cms";
22
+ import { components } from "./_generated/api";
23
+ import cmsConfig from "./cms.config";
24
+
25
+ const admin = defineAdminAPI(components.convexCms, cmsConfig);
26
+
27
+ // =============================================================================
28
+ // Dashboard
29
+ // =============================================================================
30
+
31
+ export const getDashboardStats = admin.getDashboardStats;
32
+
33
+ // =============================================================================
34
+ // Content Types
35
+ // =============================================================================
36
+
37
+ export const listContentTypes = admin.listContentTypes;
38
+ export const getContentType = admin.getContentType;
39
+ export const createContentType = admin.createContentType;
40
+ export const updateContentType = admin.updateContentType;
41
+ export const deleteContentType = admin.deleteContentType;
42
+
43
+ // =============================================================================
44
+ // Content Entries
45
+ // =============================================================================
46
+
47
+ export const listEntries = admin.listEntries;
48
+ export const getEntry = admin.getEntry;
49
+ export const createEntry = admin.createEntry;
50
+ export const updateEntry = admin.updateEntry;
51
+ export const publishEntry = admin.publishEntry;
52
+ export const unpublishEntry = admin.unpublishEntry;
53
+ export const deleteEntry = admin.deleteEntry;
54
+ export const duplicateEntry = admin.duplicateEntry;
55
+ export const scheduleEntry = admin.scheduleEntry;
56
+ export const cancelScheduledEntry = admin.cancelScheduledEntry;
57
+ export const getScheduledEntries = admin.getScheduledEntries;
58
+ export const restoreEntry = admin.restoreEntry;
59
+ export const getEntryBySlug = admin.getEntryBySlug;
60
+ export const getEntryBySlugAndTypeName = admin.getEntryBySlugAndTypeName;
61
+
62
+ // =============================================================================
63
+ // Bulk Operations
64
+ // =============================================================================
65
+
66
+ export const bulkPublish = admin.bulkPublish;
67
+ export const bulkUnpublish = admin.bulkUnpublish;
68
+ export const bulkDelete = admin.bulkDelete;
69
+ export const bulkUpdate = admin.bulkUpdate;
70
+ export const bulkRestore = admin.bulkRestore;
71
+
72
+ // =============================================================================
73
+ // Trash
74
+ // =============================================================================
75
+
76
+ export const getTrashConfig = admin.getTrashConfig;
77
+ export const listTrash = admin.listTrash;
78
+ export const getTrashStats = admin.getTrashStats;
79
+ export const updateTrashConfig = admin.updateTrashConfig;
80
+ export const emptyTrash = admin.emptyTrash;
81
+ export const runTrashCleanup = admin.runTrashCleanup;
82
+
83
+ // =============================================================================
84
+ // Content Lock
85
+ // =============================================================================
86
+
87
+ export const checkContentLock = admin.checkContentLock;
88
+ export const listLockedContent = admin.listLockedContent;
89
+ export const acquireContentLock = admin.acquireContentLock;
90
+ export const releaseContentLock = admin.releaseContentLock;
91
+ export const renewContentLock = admin.renewContentLock;
92
+ export const forceReleaseContentLock = admin.forceReleaseContentLock;
93
+
94
+ // =============================================================================
95
+ // Versions
96
+ // =============================================================================
97
+
98
+ export const getVersionHistory = admin.getVersionHistory;
99
+ export const getVersion = admin.getVersion;
100
+ export const compareVersions = admin.compareVersions;
101
+ export const rollbackVersion = admin.rollbackVersion;
102
+
103
+ // =============================================================================
104
+ // Media Assets
105
+ // =============================================================================
106
+
107
+ export const listMediaAssets = admin.listMediaAssets;
108
+ export const getMediaAsset = admin.getMediaAsset;
109
+ export const createMediaAsset = admin.createMediaAsset;
110
+ export const updateMediaAsset = admin.updateMediaAsset;
111
+ export const deleteMediaAsset = admin.deleteMediaAsset;
112
+ export const restoreMediaAsset = admin.restoreMediaAsset;
113
+ export const permanentDeleteMediaAsset = admin.permanentDeleteMediaAsset;
114
+ export const bulkPermanentDeleteMediaAssets =
115
+ admin.bulkPermanentDeleteMediaAssets;
116
+ export const moveMediaAssets = admin.moveMediaAssets;
117
+ export const getMediaTrashCount = admin.getMediaTrashCount;
118
+
119
+ // =============================================================================
120
+ // Media Folders
121
+ // =============================================================================
122
+
123
+ export const listMediaFolders = admin.listMediaFolders;
124
+ export const getMediaFolder = admin.getMediaFolder;
125
+ export const getMediaFolderTree = admin.getMediaFolderTree;
126
+ export const createMediaFolder = admin.createMediaFolder;
127
+ export const updateMediaFolder = admin.updateMediaFolder;
128
+ export const moveMediaFolder = admin.moveMediaFolder;
129
+ export const deleteMediaFolder = admin.deleteMediaFolder;
130
+ export const restoreMediaFolder = admin.restoreMediaFolder;
131
+
132
+ // =============================================================================
133
+ // Media Variants
134
+ // =============================================================================
135
+
136
+ export const listMediaVariants = admin.listMediaVariants;
137
+ export const getMediaVariant = admin.getMediaVariant;
138
+ export const getBestMediaVariant = admin.getBestMediaVariant;
139
+ export const getMediaResponsiveSrcset = admin.getMediaResponsiveSrcset;
140
+ export const getMediaVariantPresets = admin.getMediaVariantPresets;
141
+ export const getMediaAssetWithVariants = admin.getMediaAssetWithVariants;
142
+ export const createMediaVariant = admin.createMediaVariant;
143
+ export const requestMediaVariantGeneration =
144
+ admin.requestMediaVariantGeneration;
145
+ export const deleteMediaVariant = admin.deleteMediaVariant;
146
+ export const deleteMediaAssetVariants = admin.deleteMediaAssetVariants;
147
+ export const generateMediaVariantsFromPresets =
148
+ admin.generateMediaVariantsFromPresets;
149
+ export const restoreMediaVariant = admin.restoreMediaVariant;
150
+
151
+ // =============================================================================
152
+ // Upload
153
+ // =============================================================================
154
+
155
+ export const generateUploadUrl = admin.generateUploadUrl;
156
+
157
+ // =============================================================================
158
+ // Taxonomies
159
+ // =============================================================================
160
+
161
+ export const getTaxonomy = admin.getTaxonomy;
162
+ export const listTaxonomies = admin.listTaxonomies;
163
+ export const createTaxonomy = admin.createTaxonomy;
164
+ export const updateTaxonomy = admin.updateTaxonomy;
165
+ export const deleteTaxonomy = admin.deleteTaxonomy;
166
+ export const restoreTaxonomy = admin.restoreTaxonomy;
167
+
168
+ // =============================================================================
169
+ // Terms
170
+ // =============================================================================
171
+
172
+ export const getTerm = admin.getTerm;
173
+ export const listTerms = admin.listTerms;
174
+ export const getTermsHierarchy = admin.getTermsHierarchy;
175
+ export const suggestTerms = admin.suggestTerms;
176
+ export const countTerms = admin.countTerms;
177
+ export const createTerm = admin.createTerm;
178
+ export const updateTerm = admin.updateTerm;
179
+ export const deleteTerm = admin.deleteTerm;
180
+ export const restoreTerm = admin.restoreTerm;
181
+
182
+ // =============================================================================
183
+ // Entry-Term Relations
184
+ // =============================================================================
185
+
186
+ export const getTermsByEntry = admin.getTermsByEntry;
187
+ export const getEntriesByTerm = admin.getEntriesByTerm;
188
+ export const setEntryTerms = admin.setEntryTerms;
189
+ export const addTermToEntry = admin.addTermToEntry;
190
+ export const removeTermFromEntry = admin.removeTermFromEntry;
191
+ export const createTermAndAddToEntry = admin.createTermAndAddToEntry;
192
+
193
+ // =============================================================================
194
+ // Media-Term Relations
195
+ // =============================================================================
196
+
197
+ export const getTermsByMedia = admin.getTermsByMedia;
198
+ export const getMediaByTerm = admin.getMediaByTerm;
199
+ export const setMediaTerms = admin.setMediaTerms;
200
+ export const addTermToMedia = admin.addTermToMedia;
201
+ export const removeTermFromMedia = admin.removeTermFromMedia;
202
+ export const createTermAndAddToMedia = admin.createTermAndAddToMedia;
203
+
204
+ // =============================================================================
205
+ // Settings
206
+ // =============================================================================
207
+
208
+ export const getSettings = admin.getSettings;
209
+ export const updateSettings = admin.updateSettings;
210
+ export const resetSettings = admin.resetSettings;
211
+ `;
212
+ //# sourceMappingURL=admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../../src/cli/templates/admin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0M7B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * CMS Client template
3
+ *
4
+ * Generated by: npx convex-cms init
5
+ */
6
+ export declare const CMS_CLIENT_TEMPLATE = "/**\n * CMS Client\n *\n * Uses the unified config pattern - all CMS settings are defined\n * once in cms.config.ts and shared with the admin API.\n *\n * @example\n * ```typescript\n * import { cms } from \"./cms\";\n *\n * // Use in a mutation\n * export const createPost = mutation({\n * args: { title: v.string(), createdBy: v.string() },\n * handler: async (ctx, args) => {\n * return await cms.contentEntries.create(ctx, {\n * contentTypeId,\n * data: { title: args.title },\n * createdBy: args.createdBy,\n * });\n * },\n * });\n * ```\n */\n\nimport { createCmsClient } from \"convex-cms\";\nimport { components } from \"./_generated/api\";\nimport cmsConfig from \"./cms.config\";\n\nexport const cms = createCmsClient(components.convexCms, cmsConfig);\n";
7
+ //# sourceMappingURL=cmsClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmsClient.d.ts","sourceRoot":"","sources":["../../../src/cli/templates/cmsClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,mBAAmB,gyBA6B/B,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * CMS Client template
3
+ *
4
+ * Generated by: npx convex-cms init
5
+ */
6
+ export const CMS_CLIENT_TEMPLATE = `/**
7
+ * CMS Client
8
+ *
9
+ * Uses the unified config pattern - all CMS settings are defined
10
+ * once in cms.config.ts and shared with the admin API.
11
+ *
12
+ * @example
13
+ * \`\`\`typescript
14
+ * import { cms } from "./cms";
15
+ *
16
+ * // Use in a mutation
17
+ * export const createPost = mutation({
18
+ * args: { title: v.string(), createdBy: v.string() },
19
+ * handler: async (ctx, args) => {
20
+ * return await cms.contentEntries.create(ctx, {
21
+ * contentTypeId,
22
+ * data: { title: args.title },
23
+ * createdBy: args.createdBy,
24
+ * });
25
+ * },
26
+ * });
27
+ * \`\`\`
28
+ */
29
+
30
+ import { createCmsClient } from "convex-cms";
31
+ import { components } from "./_generated/api";
32
+ import cmsConfig from "./cms.config";
33
+
34
+ export const cms = createCmsClient(components.convexCms, cmsConfig);
35
+ `;
36
+ //# sourceMappingURL=cmsClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmsClient.js","sourceRoot":"","sources":["../../../src/cli/templates/cmsClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BlC,CAAC"}