@cmssy/cli 0.22.3 → 1.0.0

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 (260) hide show
  1. package/README.md +49 -650
  2. package/dist/cli.js +706 -328
  3. package/package.json +26 -73
  4. package/templates/block/Component.module.css.tpl +12 -0
  5. package/templates/block/Component.tsx.tpl +15 -0
  6. package/templates/block/block.ts.tpl +11 -0
  7. package/templates/init/app/[[...path]]/page.tsx +19 -0
  8. package/templates/init/app/api/draft/route.ts +5 -0
  9. package/templates/init/blocks/hero/Hero.module.css +131 -0
  10. package/templates/init/blocks/hero/Hero.tsx +100 -0
  11. package/templates/init/blocks/hero/block.ts +21 -0
  12. package/templates/init/cmssy/blocks.ts +5 -0
  13. package/templates/init/cmssy/editor.tsx +10 -0
  14. package/templates/init/cmssy.config.ts +8 -0
  15. package/templates/init/env.example +4 -0
  16. package/templates/init/next.config.mjs +8 -0
  17. package/templates/init/proxy.ts +32 -0
  18. package/config.d.ts +0 -3
  19. package/config.js +0 -4
  20. package/dist/cli.d.ts +0 -3
  21. package/dist/cli.d.ts.map +0 -1
  22. package/dist/cli.js.map +0 -1
  23. package/dist/commands/add-source.d.ts +0 -13
  24. package/dist/commands/add-source.d.ts.map +0 -1
  25. package/dist/commands/add-source.js +0 -273
  26. package/dist/commands/add-source.js.map +0 -1
  27. package/dist/commands/build.d.ts +0 -7
  28. package/dist/commands/build.d.ts.map +0 -1
  29. package/dist/commands/build.js +0 -127
  30. package/dist/commands/build.js.map +0 -1
  31. package/dist/commands/codegen.d.ts +0 -7
  32. package/dist/commands/codegen.d.ts.map +0 -1
  33. package/dist/commands/codegen.js +0 -150
  34. package/dist/commands/codegen.js.map +0 -1
  35. package/dist/commands/configure.d.ts +0 -6
  36. package/dist/commands/configure.d.ts.map +0 -1
  37. package/dist/commands/configure.js +0 -39
  38. package/dist/commands/configure.js.map +0 -1
  39. package/dist/commands/create.d.ts +0 -18
  40. package/dist/commands/create.d.ts.map +0 -1
  41. package/dist/commands/create.js +0 -403
  42. package/dist/commands/create.js.map +0 -1
  43. package/dist/commands/dev.d.ts +0 -6
  44. package/dist/commands/dev.d.ts.map +0 -1
  45. package/dist/commands/dev.js +0 -144
  46. package/dist/commands/dev.js.map +0 -1
  47. package/dist/commands/doctor.d.ts +0 -2
  48. package/dist/commands/doctor.d.ts.map +0 -1
  49. package/dist/commands/doctor.js +0 -230
  50. package/dist/commands/doctor.js.map +0 -1
  51. package/dist/commands/init.d.ts +0 -6
  52. package/dist/commands/init.d.ts.map +0 -1
  53. package/dist/commands/init.js +0 -414
  54. package/dist/commands/init.js.map +0 -1
  55. package/dist/commands/lib.d.ts +0 -17
  56. package/dist/commands/lib.d.ts.map +0 -1
  57. package/dist/commands/lib.js +0 -132
  58. package/dist/commands/lib.js.map +0 -1
  59. package/dist/commands/link.d.ts +0 -8
  60. package/dist/commands/link.d.ts.map +0 -1
  61. package/dist/commands/link.js +0 -116
  62. package/dist/commands/link.js.map +0 -1
  63. package/dist/commands/migrate.d.ts +0 -2
  64. package/dist/commands/migrate.d.ts.map +0 -1
  65. package/dist/commands/migrate.js +0 -231
  66. package/dist/commands/migrate.js.map +0 -1
  67. package/dist/commands/package.d.ts +0 -14
  68. package/dist/commands/package.d.ts.map +0 -1
  69. package/dist/commands/package.js +0 -137
  70. package/dist/commands/package.js.map +0 -1
  71. package/dist/commands/publish-block-buildtime.d.ts +0 -8
  72. package/dist/commands/publish-block-buildtime.d.ts.map +0 -1
  73. package/dist/commands/publish-block-buildtime.js +0 -290
  74. package/dist/commands/publish-block-buildtime.js.map +0 -1
  75. package/dist/commands/publish-template.d.ts +0 -22
  76. package/dist/commands/publish-template.d.ts.map +0 -1
  77. package/dist/commands/publish-template.js +0 -345
  78. package/dist/commands/publish-template.js.map +0 -1
  79. package/dist/commands/publish.d.ts +0 -15
  80. package/dist/commands/publish.d.ts.map +0 -1
  81. package/dist/commands/publish.js +0 -1003
  82. package/dist/commands/publish.js.map +0 -1
  83. package/dist/commands/skills.d.ts +0 -11
  84. package/dist/commands/skills.d.ts.map +0 -1
  85. package/dist/commands/skills.js +0 -178
  86. package/dist/commands/skills.js.map +0 -1
  87. package/dist/commands/sync.d.ts +0 -6
  88. package/dist/commands/sync.d.ts.map +0 -1
  89. package/dist/commands/sync.js +0 -208
  90. package/dist/commands/sync.js.map +0 -1
  91. package/dist/commands/test.d.ts +0 -8
  92. package/dist/commands/test.d.ts.map +0 -1
  93. package/dist/commands/test.js +0 -60
  94. package/dist/commands/test.js.map +0 -1
  95. package/dist/commands/upload.d.ts +0 -11
  96. package/dist/commands/upload.d.ts.map +0 -1
  97. package/dist/commands/upload.js +0 -128
  98. package/dist/commands/upload.js.map +0 -1
  99. package/dist/commands/workspaces.d.ts +0 -2
  100. package/dist/commands/workspaces.d.ts.map +0 -1
  101. package/dist/commands/workspaces.js +0 -62
  102. package/dist/commands/workspaces.js.map +0 -1
  103. package/dist/dev-ui/app.js +0 -1284
  104. package/dist/dev-ui/index.html +0 -1511
  105. package/dist/dev-ui-react/App.tsx +0 -164
  106. package/dist/dev-ui-react/__tests__/previewData.test.ts +0 -193
  107. package/dist/dev-ui-react/components/BlocksList.tsx +0 -232
  108. package/dist/dev-ui-react/components/Editor.tsx +0 -469
  109. package/dist/dev-ui-react/components/Preview.tsx +0 -146
  110. package/dist/dev-ui-react/hooks/useBlocks.ts +0 -80
  111. package/dist/dev-ui-react/index.html +0 -13
  112. package/dist/dev-ui-react/main.tsx +0 -8
  113. package/dist/dev-ui-react/styles.css +0 -856
  114. package/dist/dev-ui-react/types.ts +0 -45
  115. package/dist/skills/claude/cmssy-block.md +0 -454
  116. package/dist/skills/claude/cmssy-mcp-content.md +0 -231
  117. package/dist/test-helpers/index.d.ts +0 -23
  118. package/dist/test-helpers/index.d.ts.map +0 -1
  119. package/dist/test-helpers/index.js +0 -50
  120. package/dist/test-helpers/index.js.map +0 -1
  121. package/dist/types/block-config.d.ts +0 -6
  122. package/dist/types/block-config.d.ts.map +0 -1
  123. package/dist/types/block-config.js +0 -12
  124. package/dist/types/block-config.js.map +0 -1
  125. package/dist/types/publish-job.d.ts +0 -61
  126. package/dist/types/publish-job.d.ts.map +0 -1
  127. package/dist/types/publish-job.js +0 -13
  128. package/dist/types/publish-job.js.map +0 -1
  129. package/dist/utils/api-error.d.ts +0 -10
  130. package/dist/utils/api-error.d.ts.map +0 -1
  131. package/dist/utils/api-error.js +0 -55
  132. package/dist/utils/api-error.js.map +0 -1
  133. package/dist/utils/block-config.d.ts +0 -87
  134. package/dist/utils/block-config.d.ts.map +0 -1
  135. package/dist/utils/block-config.js +0 -214
  136. package/dist/utils/block-config.js.map +0 -1
  137. package/dist/utils/blocks-meta-cache.d.ts +0 -28
  138. package/dist/utils/blocks-meta-cache.d.ts.map +0 -1
  139. package/dist/utils/blocks-meta-cache.js +0 -72
  140. package/dist/utils/blocks-meta-cache.js.map +0 -1
  141. package/dist/utils/builder.d.ts +0 -34
  142. package/dist/utils/builder.d.ts.map +0 -1
  143. package/dist/utils/builder.js +0 -140
  144. package/dist/utils/builder.js.map +0 -1
  145. package/dist/utils/cmssy-config.d.ts +0 -16
  146. package/dist/utils/cmssy-config.d.ts.map +0 -1
  147. package/dist/utils/cmssy-config.js +0 -19
  148. package/dist/utils/cmssy-config.js.map +0 -1
  149. package/dist/utils/config.d.ts +0 -9
  150. package/dist/utils/config.d.ts.map +0 -1
  151. package/dist/utils/config.js +0 -51
  152. package/dist/utils/config.js.map +0 -1
  153. package/dist/utils/dependency-check.d.ts +0 -21
  154. package/dist/utils/dependency-check.d.ts.map +0 -1
  155. package/dist/utils/dependency-check.js +0 -56
  156. package/dist/utils/dependency-check.js.map +0 -1
  157. package/dist/utils/dev-generator/api-routes/blocks.d.ts +0 -3
  158. package/dist/utils/dev-generator/api-routes/blocks.d.ts.map +0 -1
  159. package/dist/utils/dev-generator/api-routes/blocks.js +0 -194
  160. package/dist/utils/dev-generator/api-routes/blocks.js.map +0 -1
  161. package/dist/utils/dev-generator/api-routes/config.d.ts +0 -2
  162. package/dist/utils/dev-generator/api-routes/config.d.ts.map +0 -1
  163. package/dist/utils/dev-generator/api-routes/config.js +0 -107
  164. package/dist/utils/dev-generator/api-routes/config.js.map +0 -1
  165. package/dist/utils/dev-generator/api-routes/preview.d.ts +0 -2
  166. package/dist/utils/dev-generator/api-routes/preview.d.ts.map +0 -1
  167. package/dist/utils/dev-generator/api-routes/preview.js +0 -50
  168. package/dist/utils/dev-generator/api-routes/preview.js.map +0 -1
  169. package/dist/utils/dev-generator/api-routes/workspaces.d.ts +0 -2
  170. package/dist/utils/dev-generator/api-routes/workspaces.d.ts.map +0 -1
  171. package/dist/utils/dev-generator/api-routes/workspaces.js +0 -128
  172. package/dist/utils/dev-generator/api-routes/workspaces.js.map +0 -1
  173. package/dist/utils/dev-generator/helpers.d.ts +0 -23
  174. package/dist/utils/dev-generator/helpers.d.ts.map +0 -1
  175. package/dist/utils/dev-generator/helpers.js +0 -128
  176. package/dist/utils/dev-generator/helpers.js.map +0 -1
  177. package/dist/utils/dev-generator/home-page.d.ts +0 -2
  178. package/dist/utils/dev-generator/home-page.d.ts.map +0 -1
  179. package/dist/utils/dev-generator/home-page.js +0 -643
  180. package/dist/utils/dev-generator/home-page.js.map +0 -1
  181. package/dist/utils/dev-generator/index.d.ts +0 -11
  182. package/dist/utils/dev-generator/index.d.ts.map +0 -1
  183. package/dist/utils/dev-generator/index.js +0 -85
  184. package/dist/utils/dev-generator/index.js.map +0 -1
  185. package/dist/utils/dev-generator/layout.d.ts +0 -3
  186. package/dist/utils/dev-generator/layout.d.ts.map +0 -1
  187. package/dist/utils/dev-generator/layout.js +0 -63
  188. package/dist/utils/dev-generator/layout.js.map +0 -1
  189. package/dist/utils/dev-generator/next-config.d.ts +0 -3
  190. package/dist/utils/dev-generator/next-config.d.ts.map +0 -1
  191. package/dist/utils/dev-generator/next-config.js +0 -111
  192. package/dist/utils/dev-generator/next-config.js.map +0 -1
  193. package/dist/utils/dev-generator/preview-pages.d.ts +0 -3
  194. package/dist/utils/dev-generator/preview-pages.d.ts.map +0 -1
  195. package/dist/utils/dev-generator/preview-pages.js +0 -833
  196. package/dist/utils/dev-generator/preview-pages.js.map +0 -1
  197. package/dist/utils/dev-generator.d.ts +0 -12
  198. package/dist/utils/dev-generator.d.ts.map +0 -1
  199. package/dist/utils/dev-generator.js +0 -1752
  200. package/dist/utils/dev-generator.js.map +0 -1
  201. package/dist/utils/field-schema.d.ts +0 -13
  202. package/dist/utils/field-schema.d.ts.map +0 -1
  203. package/dist/utils/field-schema.js +0 -182
  204. package/dist/utils/field-schema.js.map +0 -1
  205. package/dist/utils/graphql.d.ts +0 -39
  206. package/dist/utils/graphql.d.ts.map +0 -1
  207. package/dist/utils/graphql.js +0 -138
  208. package/dist/utils/graphql.js.map +0 -1
  209. package/dist/utils/lib-manifest.d.ts +0 -7
  210. package/dist/utils/lib-manifest.d.ts.map +0 -1
  211. package/dist/utils/lib-manifest.js +0 -59
  212. package/dist/utils/lib-manifest.js.map +0 -1
  213. package/dist/utils/publish-helpers.d.ts +0 -43
  214. package/dist/utils/publish-helpers.d.ts.map +0 -1
  215. package/dist/utils/publish-helpers.js +0 -215
  216. package/dist/utils/publish-helpers.js.map +0 -1
  217. package/dist/utils/publish-helpers.test.d.ts +0 -2
  218. package/dist/utils/publish-helpers.test.d.ts.map +0 -1
  219. package/dist/utils/publish-helpers.test.js +0 -24
  220. package/dist/utils/publish-helpers.test.js.map +0 -1
  221. package/dist/utils/resolve-workspace.d.ts +0 -6
  222. package/dist/utils/resolve-workspace.d.ts.map +0 -1
  223. package/dist/utils/resolve-workspace.js +0 -32
  224. package/dist/utils/resolve-workspace.js.map +0 -1
  225. package/dist/utils/scanner.d.ts +0 -42
  226. package/dist/utils/scanner.d.ts.map +0 -1
  227. package/dist/utils/scanner.js +0 -156
  228. package/dist/utils/scanner.js.map +0 -1
  229. package/dist/utils/schema-diff.d.ts +0 -22
  230. package/dist/utils/schema-diff.d.ts.map +0 -1
  231. package/dist/utils/schema-diff.js +0 -107
  232. package/dist/utils/schema-diff.js.map +0 -1
  233. package/dist/utils/source-collector.d.ts +0 -19
  234. package/dist/utils/source-collector.d.ts.map +0 -1
  235. package/dist/utils/source-collector.js +0 -565
  236. package/dist/utils/source-collector.js.map +0 -1
  237. package/dist/utils/theme-builder.d.ts +0 -12
  238. package/dist/utils/theme-builder.d.ts.map +0 -1
  239. package/dist/utils/theme-builder.js +0 -117
  240. package/dist/utils/theme-builder.js.map +0 -1
  241. package/dist/utils/type-generator.d.ts +0 -9
  242. package/dist/utils/type-generator.d.ts.map +0 -1
  243. package/dist/utils/type-generator.js +0 -86
  244. package/dist/utils/type-generator.js.map +0 -1
  245. package/dist/utils/version.d.ts +0 -10
  246. package/dist/utils/version.d.ts.map +0 -1
  247. package/dist/utils/version.js +0 -30
  248. package/dist/utils/version.js.map +0 -1
  249. package/dist/utils/versions.d.ts.map +0 -1
  250. package/dist/utils/versions.js.map +0 -1
  251. package/src/dev-app/app/api/blocks/[name]/config/route.ts +0 -140
  252. package/src/dev-app/app/api/blocks/route.ts +0 -61
  253. package/src/dev-app/app/api/config/route.ts +0 -98
  254. package/src/dev-app/app/api/context/route.ts +0 -126
  255. package/src/dev-app/app/api/preview/[name]/route.ts +0 -137
  256. package/src/dev-app/app/api/workspaces/route.ts +0 -124
  257. package/src/dev-app/app/layout.tsx +0 -18
  258. package/src/dev-app/app/page.tsx +0 -1785
  259. package/test.d.ts +0 -1
  260. package/test.js +0 -2
@@ -1,117 +0,0 @@
1
- const BORDER_RADIUS_MAP = {
2
- none: "0",
3
- sm: "0.25rem",
4
- md: "0.5rem",
5
- lg: "0.625rem",
6
- full: "9999px",
7
- };
8
- const COLOR_MAP = {
9
- primary: "primary",
10
- primaryForeground: "primary-foreground",
11
- secondary: "secondary",
12
- secondaryForeground: "secondary-foreground",
13
- accent: "accent",
14
- accentForeground: "accent-foreground",
15
- background: "background",
16
- foreground: "foreground",
17
- muted: "muted",
18
- mutedForeground: "muted-foreground",
19
- card: "card",
20
- cardForeground: "card-foreground",
21
- border: "border",
22
- input: "input",
23
- ring: "ring",
24
- destructive: "destructive",
25
- };
26
- const TYPO_MAP = {
27
- h1: "font-size-h1",
28
- h2: "font-size-h2",
29
- h3: "font-size-h3",
30
- h4: "font-size-h4",
31
- h5: "font-size-h5",
32
- h6: "font-size-h6",
33
- body: "font-size-body",
34
- small: "font-size-small",
35
- };
36
- /**
37
- * Build CSS from a DefineThemeConfig.
38
- * Returns a complete stylesheet string.
39
- */
40
- export function buildThemeCSS(theme) {
41
- const lines = [];
42
- lines.push(`/* Cmssy Theme: ${theme.name} */`);
43
- // Font variables
44
- const vars = [];
45
- if (theme.fonts?.heading) {
46
- vars.push(`--font-heading: "${theme.fonts.heading.family}", serif`);
47
- }
48
- if (theme.fonts?.body) {
49
- vars.push(`--font-body: "${theme.fonts.body.family}", sans-serif`);
50
- }
51
- // Color variables
52
- if (theme.colors) {
53
- for (const [key, cssVar] of Object.entries(COLOR_MAP)) {
54
- const value = theme.colors[key];
55
- if (value)
56
- vars.push(`--${cssVar}: ${value}`);
57
- }
58
- }
59
- // Typography variables
60
- if (theme.typography) {
61
- for (const [key, cssVar] of Object.entries(TYPO_MAP)) {
62
- const value = theme.typography[key];
63
- if (value)
64
- vars.push(`--${cssVar}: ${value}`);
65
- }
66
- }
67
- // Spacing + border radius
68
- if (theme.spacing != null) {
69
- vars.push(`--theme-spacing: ${theme.spacing}`);
70
- }
71
- if (theme.borderRadius) {
72
- vars.push(`--radius: ${BORDER_RADIUS_MAP[theme.borderRadius] ?? "0.625rem"}`);
73
- }
74
- // Custom variables
75
- if (theme.customVariables) {
76
- for (const [key, value] of Object.entries(theme.customVariables)) {
77
- vars.push(`${key}: ${value}`);
78
- }
79
- }
80
- if (vars.length > 0) {
81
- lines.push(`:root {\n ${vars.join(";\n ")};\n}`);
82
- }
83
- // Typography tag styles
84
- if (theme.typography) {
85
- const tags = ["h1", "h2", "h3", "h4", "h5", "h6"];
86
- for (const tag of tags) {
87
- const val = theme.typography[tag];
88
- if (val) {
89
- lines.push(`${tag} { font-size: var(--font-size-${tag}, ${val}); }`);
90
- }
91
- }
92
- if (theme.typography.body) {
93
- lines.push(`body { font-size: var(--font-size-body, ${theme.typography.body}); }`);
94
- }
95
- if (theme.typography.small) {
96
- lines.push(`small { font-size: var(--font-size-small, ${theme.typography.small}); }`);
97
- }
98
- }
99
- // Dark mode overrides
100
- if (theme.darkColors) {
101
- const darkVars = [];
102
- for (const [key, cssVar] of Object.entries(COLOR_MAP)) {
103
- const value = theme.darkColors[key];
104
- if (value)
105
- darkVars.push(`--${cssVar}: ${value}`);
106
- }
107
- if (darkVars.length > 0) {
108
- lines.push(`.dark {\n ${darkVars.join(";\n ")};\n}`);
109
- }
110
- }
111
- // Custom CSS
112
- if (theme.customCSS) {
113
- lines.push(theme.customCSS);
114
- }
115
- return lines.join("\n\n");
116
- }
117
- //# sourceMappingURL=theme-builder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"theme-builder.js","sourceRoot":"","sources":["../../src/utils/theme-builder.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import { FieldConfig } from "../types/block-config.js";
2
- import { FieldTypeDefinition } from "./field-schema.js";
3
- export interface GenerateTypesOptions {
4
- blockPath: string;
5
- schema: Record<string, FieldConfig>;
6
- fieldTypes?: FieldTypeDefinition[];
7
- }
8
- export declare function generateTypes(options: GenerateTypesOptions): Promise<void>;
9
- //# sourceMappingURL=type-generator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"type-generator.d.ts","sourceRoot":"","sources":["../../src/utils/type-generator.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,EAGZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAmBxD,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACpC;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAkBf"}
@@ -1,86 +0,0 @@
1
- import fs from "fs-extra";
2
- import path from "path";
3
- // Default value type mappings (used when field types are not provided)
4
- const DEFAULT_VALUE_TYPES = {
5
- singleLine: "string",
6
- multiLine: "string",
7
- richText: "string",
8
- numeric: "number",
9
- date: "string",
10
- media: "string",
11
- link: "string",
12
- select: "string",
13
- multiselect: "string[]",
14
- boolean: "boolean",
15
- color: "string",
16
- repeater: "Record<string, unknown>[]",
17
- form: "string",
18
- };
19
- export async function generateTypes(options) {
20
- const { blockPath, schema, fieldTypes } = options;
21
- const typeDefinition = generateTypeDefinition({
22
- schema,
23
- fieldTypes,
24
- indent: " ",
25
- });
26
- const outputPath = path.join(blockPath, "src", "block.d.ts");
27
- const fileContent = `// Auto-generated from config.ts
28
- // DO NOT EDIT - This file is automatically regenerated
29
-
30
- export interface BlockContent {
31
- ${typeDefinition}
32
- }
33
- `;
34
- await fs.writeFile(outputPath, fileContent);
35
- }
36
- function generateTypeDefinition(options) {
37
- const { schema, fieldTypes, indent = " " } = options;
38
- const lines = [];
39
- Object.entries(schema).forEach(([key, field]) => {
40
- const optional = field.required ? "" : "?";
41
- const tsType = mapFieldTypeToTypeScript({ field, fieldTypes, indent });
42
- if (field.helpText) {
43
- lines.push(`${indent}/** ${field.helpText} */`);
44
- }
45
- lines.push(`${indent}${key}${optional}: ${tsType};`);
46
- });
47
- return lines.join("\n");
48
- }
49
- function mapFieldTypeToTypeScript(options) {
50
- const { field, fieldTypes, indent = " " } = options;
51
- // Special handling for select (generate union type from options)
52
- if (field.type === "select") {
53
- const selectField = field;
54
- if (selectField.options && selectField.options.length > 0) {
55
- const unionTypes = selectField.options
56
- .map((opt) => `"${opt.value}"`)
57
- .join(" | ");
58
- return unionTypes;
59
- }
60
- return "string";
61
- }
62
- // Special handling for repeater (generate nested type from schema)
63
- if (field.type === "repeater") {
64
- const repeaterField = field;
65
- if (repeaterField.schema) {
66
- const nestedIndent = indent + " ";
67
- const nestedType = `{\n${generateTypeDefinition({
68
- schema: repeaterField.schema,
69
- fieldTypes,
70
- indent: nestedIndent,
71
- })}\n${indent}}`;
72
- return `Array<${nestedType}>`;
73
- }
74
- return "any[]";
75
- }
76
- // Look up valueType from backend field types
77
- if (fieldTypes) {
78
- const fieldTypeDef = fieldTypes.find((ft) => ft.type === field.type);
79
- if (fieldTypeDef?.valueType) {
80
- return fieldTypeDef.valueType;
81
- }
82
- }
83
- // Fall back to default mappings
84
- return DEFAULT_VALUE_TYPES[field.type] || "any";
85
- }
86
- //# sourceMappingURL=type-generator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"type-generator.js","sourceRoot":"","sources":["../../src/utils/type-generator.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- /** This CLI's package name, e.g. "@cmssy/cli". */
2
- export declare const CLI_NAME: string;
3
- /** This CLI's semver version, e.g. "0.22.2". */
4
- export declare const CLI_VERSION: string;
5
- /**
6
- * Headers every request should carry so the API can identify the client and,
7
- * in the future, warn/reject on incompatible versions.
8
- */
9
- export declare function clientHeaders(): Record<string, string>;
10
- //# sourceMappingURL=version.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAoBA,kDAAkD;AAClD,eAAO,MAAM,QAAQ,QAA2B,CAAC;AAEjD,gDAAgD;AAChD,eAAO,MAAM,WAAW,QAAyB,CAAC;AAElD;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKtD"}
@@ -1,30 +0,0 @@
1
- import { readFileSync } from "fs";
2
- import { fileURLToPath } from "url";
3
- import { dirname, join } from "path";
4
- const __dirname = dirname(fileURLToPath(import.meta.url));
5
- function readPkg() {
6
- // Works for both src/utils/version.ts and dist/utils/version.js
7
- // (package.json is two levels up in both layouts).
8
- try {
9
- return JSON.parse(readFileSync(join(__dirname, "../../package.json"), "utf-8"));
10
- }
11
- catch {
12
- return {};
13
- }
14
- }
15
- const pkg = readPkg();
16
- /** This CLI's package name, e.g. "@cmssy/cli". */
17
- export const CLI_NAME = pkg.name ?? "@cmssy/cli";
18
- /** This CLI's semver version, e.g. "0.22.2". */
19
- export const CLI_VERSION = pkg.version ?? "0.0.0";
20
- /**
21
- * Headers every request should carry so the API can identify the client and,
22
- * in the future, warn/reject on incompatible versions.
23
- */
24
- export function clientHeaders() {
25
- return {
26
- "x-client-name": CLI_NAME,
27
- "x-client-version": CLI_VERSION,
28
- };
29
- }
30
- //# sourceMappingURL=version.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,SAAS,OAAO;IACd,gEAAgE;IAChE,mDAAmD;IACnD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CACf,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CAC7D,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;AAEtB,kDAAkD;AAClD,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,IAAI,YAAY,CAAC;AAEjD,gDAAgD;AAChD,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;AAElD;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO;QACL,eAAe,EAAE,QAAQ;QACzB,kBAAkB,EAAE,WAAW;KAChC,CAAC;AACJ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../../src/utils/versions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;CAUX,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"versions.js","sourceRoot":"","sources":["../../src/utils/versions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,KAAK,EAAE,SAAS;IAChB,QAAQ,EAAE,SAAS;IACnB,IAAI,EAAE,UAAU;IAChB,UAAU,EAAE,QAAQ;IACpB,WAAW,EAAE,SAAS;IACtB,eAAe,EAAE,SAAS;IAC1B,UAAU,EAAE,SAAS;IACrB,aAAa,EAAE,SAAS;IACxB,SAAS,EAAE,SAAS;CACZ,CAAC"}
@@ -1,140 +0,0 @@
1
- import { NextResponse } from "next/server";
2
- import fs from "fs";
3
- import path from "path";
4
- import { execSync } from "child_process";
5
-
6
- const projectRoot = process.env.CMSSY_PROJECT_ROOT || process.cwd();
7
- const SAFE_NAME_RE = /^[a-zA-Z0-9_-]+$/;
8
-
9
- function loadBlockConfig(blockPath: string): Record<string, unknown> | null {
10
- const configPath = path.join(blockPath, "config.ts");
11
- if (!fs.existsSync(configPath)) return null;
12
-
13
- try {
14
- const tsxPaths = [
15
- path.join(projectRoot, "node_modules", ".bin", "tsx"),
16
- path.join(
17
- projectRoot,
18
- "node_modules",
19
- "cmssy-cli",
20
- "node_modules",
21
- ".bin",
22
- "tsx",
23
- ),
24
- ];
25
- const tsxBinary = tsxPaths.find((p) => fs.existsSync(p)) || "npx -y tsx";
26
-
27
- const cacheDir = path.join(projectRoot, ".cmssy", "cache");
28
- fs.mkdirSync(cacheDir, { recursive: true });
29
-
30
- const tempDir = fs.mkdtempSync(path.join(cacheDir, "block-config-"));
31
- try {
32
- const mockConfigPath = path.join(tempDir, "cmssy-cli-config.mjs");
33
- fs.writeFileSync(
34
- mockConfigPath,
35
- "export const defineBlock = (config) => config;\nexport const defineTemplate = (config) => config;\nexport const field = (config) => config;",
36
- );
37
-
38
- const configContent = fs.readFileSync(configPath, "utf-8");
39
- const modified = configContent.replace(
40
- /from\s+['"](?:@cmssy\/cli\/config|cmssy-cli\/config)['"]/g,
41
- `from '${mockConfigPath.replace(/\\\\/g, "/")}'`,
42
- );
43
-
44
- const tempPath = path.join(tempDir, "temp-block-config.ts");
45
- fs.writeFileSync(tempPath, modified);
46
-
47
- const evalCode = `import cfg from '${tempPath.replace(/\\\\/g, "/")}'; console.log(JSON.stringify(cfg.default || cfg));`;
48
- const cmd = tsxBinary.includes("npx")
49
- ? `${tsxBinary} --eval "${evalCode}"`
50
- : `"${tsxBinary}" --eval "${evalCode}"`;
51
-
52
- const output = execSync(cmd, {
53
- encoding: "utf-8",
54
- cwd: projectRoot,
55
- stdio: ["pipe", "pipe", "pipe"],
56
- });
57
-
58
- const lines = output.trim().split("\n");
59
- return JSON.parse(lines[lines.length - 1]);
60
- } finally {
61
- try {
62
- fs.rmSync(tempDir, { recursive: true });
63
- } catch {}
64
- }
65
- } catch {
66
- return null;
67
- }
68
- }
69
-
70
- export async function GET(
71
- _request: Request,
72
- { params }: { params: Promise<{ name: string }> },
73
- ) {
74
- const { name } = await params;
75
- if (!SAFE_NAME_RE.test(name)) {
76
- return NextResponse.json({ error: "Invalid name" }, { status: 400 });
77
- }
78
-
79
- let blockPath = path.join(projectRoot, "blocks", name);
80
- if (!fs.existsSync(blockPath)) {
81
- blockPath = path.join(projectRoot, "templates", name);
82
- }
83
-
84
- if (!fs.existsSync(blockPath)) {
85
- return NextResponse.json({ error: "Block not found" }, { status: 404 });
86
- }
87
-
88
- const previewPath = path.join(blockPath, "preview.json");
89
- const previewData = fs.existsSync(previewPath)
90
- ? JSON.parse(fs.readFileSync(previewPath, "utf-8"))
91
- : {};
92
-
93
- const config = loadBlockConfig(blockPath);
94
-
95
- const pagesJsonPath = path.join(blockPath, "pages.json");
96
- let pagesData = fs.existsSync(pagesJsonPath)
97
- ? JSON.parse(fs.readFileSync(pagesJsonPath, "utf-8"))
98
- : null;
99
-
100
- if (!pagesData && config && (config.pages || config.layoutPositions)) {
101
- const layoutPositions: Record<string, any> = {};
102
- if (Array.isArray(config.layoutPositions)) {
103
- for (const lp of config.layoutPositions as any[]) {
104
- layoutPositions[lp.position] = {
105
- type: lp.type,
106
- content: lp.content || {},
107
- };
108
- }
109
- } else if (
110
- config.layoutPositions &&
111
- typeof config.layoutPositions === "object"
112
- ) {
113
- Object.assign(layoutPositions, config.layoutPositions);
114
- }
115
-
116
- const pages = ((config.pages || []) as any[]).map(
117
- (page: any, index: number) => ({
118
- name: page.name,
119
- slug:
120
- page.slug === "home" || page.slug === "/" || index === 0
121
- ? "/"
122
- : page.slug.startsWith("/")
123
- ? page.slug
124
- : "/" + page.slug,
125
- blocks: page.blocks || [],
126
- }),
127
- );
128
-
129
- pagesData = { layoutPositions, pages };
130
- }
131
-
132
- return NextResponse.json({
133
- name,
134
- schema: config?.schema || {},
135
- previewData,
136
- pages: config?.pages,
137
- layoutPositions: config?.layoutPositions,
138
- pagesData,
139
- });
140
- }
@@ -1,61 +0,0 @@
1
- import { NextResponse } from "next/server";
2
- import fs from "fs";
3
- import path from "path";
4
-
5
- const projectRoot = process.env.CMSSY_PROJECT_ROOT || process.cwd();
6
-
7
- export async function GET() {
8
- const blocks: any[] = [];
9
-
10
- const blocksDir = path.join(projectRoot, "blocks");
11
- if (fs.existsSync(blocksDir)) {
12
- const dirs = fs
13
- .readdirSync(blocksDir, { withFileTypes: true })
14
- .filter((d) => d.isDirectory());
15
-
16
- for (const dir of dirs) {
17
- const pkgPath = path.join(blocksDir, dir.name, "package.json");
18
- const pkg = fs.existsSync(pkgPath)
19
- ? JSON.parse(fs.readFileSync(pkgPath, "utf-8"))
20
- : {};
21
- blocks.push({
22
- type: "block",
23
- name: dir.name,
24
- displayName: pkg.cmssy?.displayName || dir.name,
25
- version: pkg.version || "1.0.0",
26
- category: pkg.cmssy?.category || "other",
27
- tags: pkg.cmssy?.tags || [],
28
- description: pkg.description || "",
29
- hasConfig: fs.existsSync(path.join(blocksDir, dir.name, "config.ts")),
30
- });
31
- }
32
- }
33
-
34
- const templatesDir = path.join(projectRoot, "templates");
35
- if (fs.existsSync(templatesDir)) {
36
- const dirs = fs
37
- .readdirSync(templatesDir, { withFileTypes: true })
38
- .filter((d) => d.isDirectory());
39
-
40
- for (const dir of dirs) {
41
- const pkgPath = path.join(templatesDir, dir.name, "package.json");
42
- const pkg = fs.existsSync(pkgPath)
43
- ? JSON.parse(fs.readFileSync(pkgPath, "utf-8"))
44
- : {};
45
- blocks.push({
46
- type: "template",
47
- name: dir.name,
48
- displayName: pkg.cmssy?.displayName || dir.name,
49
- version: pkg.version || "1.0.0",
50
- category: pkg.cmssy?.category || "pages",
51
- tags: pkg.cmssy?.tags || [],
52
- description: pkg.description || "",
53
- hasConfig: fs.existsSync(
54
- path.join(templatesDir, dir.name, "config.ts"),
55
- ),
56
- });
57
- }
58
- }
59
-
60
- return NextResponse.json(blocks);
61
- }
@@ -1,98 +0,0 @@
1
- import { NextResponse } from "next/server";
2
- import fs from "fs";
3
- import path from "path";
4
-
5
- const projectRoot = process.env.CMSSY_PROJECT_ROOT || process.cwd();
6
-
7
- function getEnvPath() {
8
- return path.join(projectRoot, ".env");
9
- }
10
-
11
- function readEnv(): Record<string, string> {
12
- const envPath = getEnvPath();
13
- const result: Record<string, string> = {};
14
- if (!fs.existsSync(envPath)) return result;
15
- const content = fs.readFileSync(envPath, "utf-8");
16
- for (const line of content.split("\n")) {
17
- const match = line.match(/^([A-Z_]+)=(.*)$/);
18
- if (match) result[match[1]] = match[2].trim();
19
- }
20
- return result;
21
- }
22
-
23
- function writeEnv(updates: Record<string, string>) {
24
- const envPath = getEnvPath();
25
- let content = fs.existsSync(envPath) ? fs.readFileSync(envPath, "utf-8") : "";
26
-
27
- for (const [key, value] of Object.entries(updates)) {
28
- const regex = new RegExp(`^(${key})=.*$`, "m");
29
- if (regex.test(content)) {
30
- content = content.replace(regex, `${key}=${value}`);
31
- } else {
32
- content = content.trimEnd() + "\n" + `${key}=${value}` + "\n";
33
- }
34
- }
35
-
36
- fs.writeFileSync(envPath, content);
37
- }
38
-
39
- function maskToken(token: string | undefined): string | null {
40
- if (!token || token.length < 8) return token ? "***" : null;
41
- return token.substring(0, 3) + "***" + token.substring(token.length - 3);
42
- }
43
-
44
- function readCmssyConfig(): Record<string, any> | null {
45
- const configPath = path.join(projectRoot, "cmssy.config.js");
46
- if (!fs.existsSync(configPath)) return null;
47
- try {
48
- const content = fs.readFileSync(configPath, "utf-8");
49
- const match = content.match(/export\s+default\s+({[\s\S]*});?/);
50
- if (match)
51
- return JSON.parse(match[1].replace(/,\s*}/g, "}").replace(/'/g, '"'));
52
- } catch {}
53
- return null;
54
- }
55
-
56
- export async function GET() {
57
- const env = readEnv();
58
- const cmssyConfig = readCmssyConfig();
59
-
60
- return NextResponse.json({
61
- env: {
62
- apiUrl: env.CMSSY_API_URL || "https://api.cmssy.io/graphql",
63
- hasToken: !!env.CMSSY_API_TOKEN,
64
- maskedToken: maskToken(env.CMSSY_API_TOKEN),
65
- workspaceId: env.CMSSY_WORKSPACE_ID || null,
66
- },
67
- project: cmssyConfig,
68
- });
69
- }
70
-
71
- export async function PUT(request: Request) {
72
- try {
73
- const body = await request.json();
74
- const updates: Record<string, string> = {};
75
-
76
- if (body.apiUrl !== undefined) {
77
- updates.CMSSY_API_URL = body.apiUrl;
78
- }
79
- if (body.apiToken !== undefined) {
80
- updates.CMSSY_API_TOKEN = body.apiToken;
81
- }
82
- if (body.workspaceId !== undefined) {
83
- updates.CMSSY_WORKSPACE_ID = body.workspaceId;
84
- }
85
-
86
- if (Object.keys(updates).length === 0) {
87
- return NextResponse.json(
88
- { error: "No values to update" },
89
- { status: 400 },
90
- );
91
- }
92
-
93
- writeEnv(updates);
94
- return NextResponse.json({ success: true });
95
- } catch (error: any) {
96
- return NextResponse.json({ error: error.message }, { status: 500 });
97
- }
98
- }