cmssy-cli 0.5.0 → 0.6.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 (37) hide show
  1. package/dist/cli.js +7 -1
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/build.d.ts.map +1 -1
  4. package/dist/commands/build.js +67 -8
  5. package/dist/commands/build.js.map +1 -1
  6. package/dist/commands/create.d.ts.map +1 -1
  7. package/dist/commands/create.js +114 -70
  8. package/dist/commands/create.js.map +1 -1
  9. package/dist/commands/dev.d.ts.map +1 -1
  10. package/dist/commands/dev.js +73 -10
  11. package/dist/commands/dev.js.map +1 -1
  12. package/dist/commands/init.d.ts.map +1 -1
  13. package/dist/commands/init.js +70 -67
  14. package/dist/commands/init.js.map +1 -1
  15. package/dist/commands/migrate.d.ts +2 -0
  16. package/dist/commands/migrate.d.ts.map +1 -0
  17. package/dist/commands/migrate.js +225 -0
  18. package/dist/commands/migrate.js.map +1 -0
  19. package/dist/types/block-config.d.ts +40 -0
  20. package/dist/types/block-config.d.ts.map +1 -0
  21. package/dist/types/block-config.js +3 -0
  22. package/dist/types/block-config.js.map +1 -0
  23. package/dist/utils/block-config.d.ts +10 -0
  24. package/dist/utils/block-config.d.ts.map +1 -0
  25. package/dist/utils/block-config.js +145 -0
  26. package/dist/utils/block-config.js.map +1 -0
  27. package/dist/utils/field-schema.d.ts +10 -0
  28. package/dist/utils/field-schema.d.ts.map +1 -0
  29. package/dist/utils/field-schema.js +155 -0
  30. package/dist/utils/field-schema.js.map +1 -0
  31. package/dist/utils/graphql.js +1 -1
  32. package/dist/utils/graphql.js.map +1 -1
  33. package/dist/utils/type-generator.d.ts +3 -0
  34. package/dist/utils/type-generator.d.ts.map +1 -0
  35. package/dist/utils/type-generator.js +67 -0
  36. package/dist/utils/type-generator.js.map +1 -0
  37. package/package.json +5 -1
@@ -0,0 +1,225 @@
1
+ import chalk from "chalk";
2
+ import fs from "fs-extra";
3
+ import ora from "ora";
4
+ import path from "path";
5
+ import { getPackageJson } from "../utils/cmssy-config.js";
6
+ import { generateTypes } from "../utils/type-generator.js";
7
+ export async function migrateCommand(blockName) {
8
+ const spinner = ora("Starting migration...").start();
9
+ try {
10
+ const blocksToMigrate = [];
11
+ if (blockName) {
12
+ // Migrate specific block
13
+ const blockPath = path.join(process.cwd(), "blocks", blockName);
14
+ const templatePath = path.join(process.cwd(), "templates", blockName);
15
+ if (fs.existsSync(blockPath)) {
16
+ blocksToMigrate.push(path.join("blocks", blockName));
17
+ }
18
+ else if (fs.existsSync(templatePath)) {
19
+ blocksToMigrate.push(path.join("templates", blockName));
20
+ }
21
+ else {
22
+ spinner.fail(`Block or template "${blockName}" not found`);
23
+ process.exit(1);
24
+ }
25
+ }
26
+ else {
27
+ // Migrate all blocks and templates
28
+ const blocksDir = path.join(process.cwd(), "blocks");
29
+ const templatesDir = path.join(process.cwd(), "templates");
30
+ if (fs.existsSync(blocksDir)) {
31
+ const dirs = fs
32
+ .readdirSync(blocksDir, { withFileTypes: true })
33
+ .filter((d) => d.isDirectory())
34
+ .map((d) => path.join("blocks", d.name));
35
+ blocksToMigrate.push(...dirs);
36
+ }
37
+ if (fs.existsSync(templatesDir)) {
38
+ const dirs = fs
39
+ .readdirSync(templatesDir, { withFileTypes: true })
40
+ .filter((d) => d.isDirectory())
41
+ .map((d) => path.join("templates", d.name));
42
+ blocksToMigrate.push(...dirs);
43
+ }
44
+ }
45
+ if (blocksToMigrate.length === 0) {
46
+ spinner.warn("No blocks or templates found to migrate");
47
+ process.exit(0);
48
+ }
49
+ let migratedCount = 0;
50
+ let skippedCount = 0;
51
+ let errorCount = 0;
52
+ spinner.stop();
53
+ console.log(chalk.cyan(`\nFound ${blocksToMigrate.length} block(s)/template(s)\n`));
54
+ for (const relativePath of blocksToMigrate) {
55
+ const fullPath = path.join(process.cwd(), relativePath);
56
+ const name = path.basename(fullPath);
57
+ // Check if already migrated
58
+ if (fs.existsSync(path.join(fullPath, "block.config.ts"))) {
59
+ console.log(chalk.yellow(` ⊘ ${name} - already migrated`));
60
+ skippedCount++;
61
+ continue;
62
+ }
63
+ // Load package.json
64
+ const pkg = getPackageJson(fullPath);
65
+ if (!pkg || !pkg.cmssy) {
66
+ console.log(chalk.yellow(` ⊘ ${name} - no cmssy metadata found`));
67
+ skippedCount++;
68
+ continue;
69
+ }
70
+ try {
71
+ await migrateBlock(fullPath, pkg);
72
+ console.log(chalk.green(` ✓ ${name} - migrated successfully`));
73
+ migratedCount++;
74
+ }
75
+ catch (error) {
76
+ console.error(chalk.red(` ✖ ${name} - ${error.message}`));
77
+ errorCount++;
78
+ }
79
+ }
80
+ console.log("");
81
+ if (errorCount === 0) {
82
+ console.log(chalk.green.bold(`✓ Migration complete!`));
83
+ console.log(chalk.white(` Migrated: ${migratedCount}`));
84
+ console.log(chalk.white(` Skipped: ${skippedCount}`));
85
+ console.log(chalk.cyan("\nNext steps:"));
86
+ console.log(chalk.white(" 1. Review generated block.config.ts files"));
87
+ console.log(chalk.white(" 2. Run: cmssy build\n"));
88
+ }
89
+ else {
90
+ console.log(chalk.yellow(`⚠ Migration completed with errors`));
91
+ console.log(chalk.white(` Migrated: ${migratedCount}`));
92
+ console.log(chalk.white(` Skipped: ${skippedCount}`));
93
+ console.log(chalk.white(` Errors: ${errorCount}\n`));
94
+ }
95
+ }
96
+ catch (error) {
97
+ spinner.fail("Migration failed");
98
+ console.error(chalk.red("Error:"), error);
99
+ process.exit(1);
100
+ }
101
+ }
102
+ async function migrateBlock(blockPath, pkg) {
103
+ const cmssy = pkg.cmssy;
104
+ const isTemplate = cmssy.packageType === "template";
105
+ // Convert schemaFields to schema format
106
+ const schema = convertLegacySchemaToNew(cmssy.schemaFields || []);
107
+ // Merge defaultContent into schema
108
+ if (cmssy.defaultContent) {
109
+ Object.keys(cmssy.defaultContent).forEach((key) => {
110
+ if (schema[key]) {
111
+ schema[key].defaultValue = cmssy.defaultContent[key];
112
+ }
113
+ });
114
+ }
115
+ // Generate block.config.ts
116
+ const configContent = generateBlockConfigContent(cmssy.displayName || pkg.name, pkg.description || cmssy.description || "", cmssy.longDescription, cmssy.category || (isTemplate ? "pages" : "other"), cmssy.tags || [], schema, cmssy.pricing || { licenseType: "free" }, isTemplate);
117
+ fs.writeFileSync(path.join(blockPath, "block.config.ts"), configContent);
118
+ // Update package.json - remove cmssy section
119
+ const newPkg = { ...pkg };
120
+ delete newPkg.cmssy;
121
+ fs.writeFileSync(path.join(blockPath, "package.json"), JSON.stringify(newPkg, null, 2) + "\n");
122
+ // Generate types
123
+ await generateTypes(blockPath, schema);
124
+ }
125
+ function convertLegacySchemaToNew(schemaFields) {
126
+ const schema = {};
127
+ schemaFields.forEach((field) => {
128
+ const newField = {
129
+ type: mapLegacyType(field.type),
130
+ label: field.label,
131
+ required: field.required || false,
132
+ };
133
+ if (field.placeholder)
134
+ newField.placeholder = field.placeholder;
135
+ if (field.helpText)
136
+ newField.helpText = field.helpText;
137
+ // Handle select fields
138
+ if (field.type === "select" && field.options) {
139
+ newField.options = field.options;
140
+ }
141
+ // Handle repeater fields
142
+ if (field.type === "repeater" && field.itemSchema) {
143
+ if (field.minItems)
144
+ newField.minItems = field.minItems;
145
+ if (field.maxItems)
146
+ newField.maxItems = field.maxItems;
147
+ if (field.itemSchema.fields) {
148
+ newField.schema = convertLegacySchemaToNew(field.itemSchema.fields);
149
+ }
150
+ else {
151
+ newField.schema = {};
152
+ }
153
+ }
154
+ schema[field.key] = newField;
155
+ });
156
+ return schema;
157
+ }
158
+ function mapLegacyType(legacyType) {
159
+ // Map old type names to new ones
160
+ const typeMap = {
161
+ text: "singleLine",
162
+ string: "singleLine",
163
+ // Most other types stay the same
164
+ };
165
+ return typeMap[legacyType] || legacyType;
166
+ }
167
+ function generateBlockConfigContent(name, description, longDescription, category, tags, schema, pricing, isTemplate) {
168
+ const defineFunction = isTemplate ? "defineTemplate" : "defineBlock";
169
+ // Format schema as code (not JSON)
170
+ const schemaCode = formatSchemaAsCode(schema, 2);
171
+ return `import { ${defineFunction} } from 'cmssy-cli/config';
172
+
173
+ export default ${defineFunction}({
174
+ name: '${name.replace(/'/g, "\\'")}',
175
+ description: '${description.replace(/'/g, "\\'")}',${longDescription ? `\n longDescription: '${longDescription.replace(/'/g, "\\'")}',` : ""}
176
+ category: '${category}',
177
+ tags: ${JSON.stringify(tags)},
178
+
179
+ schema: ${schemaCode},
180
+
181
+ pricing: ${JSON.stringify(pricing)},
182
+ });
183
+ `;
184
+ }
185
+ function formatSchemaAsCode(schema, indent) {
186
+ const indentStr = " ".repeat(indent);
187
+ const lines = ["{"];
188
+ Object.entries(schema).forEach(([key, field], index, arr) => {
189
+ const fieldLines = [`${indentStr}${key}: {`];
190
+ fieldLines.push(`${indentStr} type: '${field.type}',`);
191
+ fieldLines.push(`${indentStr} label: '${field.label.replace(/'/g, "\\'")}',`);
192
+ if (field.required) {
193
+ fieldLines.push(`${indentStr} required: true,`);
194
+ }
195
+ if (field.placeholder) {
196
+ fieldLines.push(`${indentStr} placeholder: '${field.placeholder.replace(/'/g, "\\'")}',`);
197
+ }
198
+ if (field.helpText) {
199
+ fieldLines.push(`${indentStr} helpText: '${field.helpText.replace(/'/g, "\\'")}',`);
200
+ }
201
+ if (field.defaultValue !== undefined) {
202
+ fieldLines.push(`${indentStr} defaultValue: ${JSON.stringify(field.defaultValue)},`);
203
+ }
204
+ // Handle select options
205
+ if (field.options) {
206
+ fieldLines.push(`${indentStr} options: ${JSON.stringify(field.options)},`);
207
+ }
208
+ // Handle repeater schema
209
+ if (field.schema) {
210
+ if (field.minItems) {
211
+ fieldLines.push(`${indentStr} minItems: ${field.minItems},`);
212
+ }
213
+ if (field.maxItems) {
214
+ fieldLines.push(`${indentStr} maxItems: ${field.maxItems},`);
215
+ }
216
+ const nestedSchema = formatSchemaAsCode(field.schema, indent + 2);
217
+ fieldLines.push(`${indentStr} schema: ${nestedSchema},`);
218
+ }
219
+ fieldLines.push(`${indentStr}},${index < arr.length - 1 ? "" : ""}`);
220
+ lines.push(...fieldLines);
221
+ });
222
+ lines.push(`${" ".repeat((indent - 1) * 2)}}`);
223
+ return lines.join("\n");
224
+ }
225
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ export type FieldType = "singleLine" | "multiLine" | "richText" | "text" | "string" | "number" | "boolean" | "date" | "media" | "link" | "select" | "color" | "repeater";
2
+ export interface BaseFieldConfig {
3
+ type: FieldType;
4
+ label: string;
5
+ required?: boolean;
6
+ placeholder?: string;
7
+ defaultValue?: any;
8
+ helpText?: string;
9
+ }
10
+ export interface SelectFieldConfig extends BaseFieldConfig {
11
+ type: "select";
12
+ options: Array<{
13
+ label: string;
14
+ value: string;
15
+ }>;
16
+ }
17
+ export interface RepeaterFieldConfig extends BaseFieldConfig {
18
+ type: "repeater";
19
+ minItems?: number;
20
+ maxItems?: number;
21
+ schema: Record<string, FieldConfig>;
22
+ }
23
+ export type FieldConfig = BaseFieldConfig | SelectFieldConfig | RepeaterFieldConfig;
24
+ export interface BlockConfig {
25
+ name: string;
26
+ description?: string;
27
+ longDescription?: string;
28
+ category: string;
29
+ tags?: string[];
30
+ schema: Record<string, FieldConfig>;
31
+ pricing?: {
32
+ licenseType: "free" | "paid";
33
+ priceCents?: number;
34
+ };
35
+ }
36
+ export interface TemplateConfig extends Omit<BlockConfig, "category"> {
37
+ category?: string;
38
+ }
39
+ export type ResourceConfig = BlockConfig | TemplateConfig;
40
+ //# sourceMappingURL=block-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-config.d.ts","sourceRoot":"","sources":["../../src/types/block-config.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GACjB,YAAY,GACZ,WAAW,GACX,UAAU,GACV,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,MAAM,GACN,OAAO,GACP,MAAM,GACN,QAAQ,GACR,OAAO,GACP,UAAU,CAAC;AAEf,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAkB,SAAQ,eAAe;IACxD,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,mBAAoB,SAAQ,eAAe;IAC1D,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACrC;AAED,MAAM,MAAM,WAAW,GACnB,eAAe,GACf,iBAAiB,GACjB,mBAAmB,CAAC;AAExB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE;QACR,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;QAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ // Type definitions for block.config.ts system
2
+ export {};
3
+ //# sourceMappingURL=block-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-config.js","sourceRoot":"","sources":["../../src/types/block-config.ts"],"names":[],"mappings":"AAAA,8CAA8C"}
@@ -0,0 +1,10 @@
1
+ import { BlockConfig, TemplateConfig, ResourceConfig, FieldConfig } from "../types/block-config.js";
2
+ export declare function defineBlock(config: BlockConfig): BlockConfig;
3
+ export declare function defineTemplate(config: TemplateConfig): TemplateConfig;
4
+ export declare function loadBlockConfig(blockPath: string): Promise<ResourceConfig | null>;
5
+ export declare function validateSchema(schema: Record<string, FieldConfig>, blockPath: string): Promise<{
6
+ valid: boolean;
7
+ errors: string[];
8
+ }>;
9
+ export declare function generatePackageJsonMetadata(config: ResourceConfig, packageType: "block" | "template"): any;
10
+ //# sourceMappingURL=block-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-config.d.ts","sourceRoot":"","sources":["../../src/utils/block-config.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,WAAW,EACX,cAAc,EACd,cAAc,EACd,WAAW,EAGZ,MAAM,0BAA0B,CAAC;AAIlC,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAE5D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAErE;AAGD,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAgBhC;AAGD,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACnC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAqF/C;AAGD,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,OAAO,GAAG,UAAU,GAChC,GAAG,CAkBL"}
@@ -0,0 +1,145 @@
1
+ import fs from "fs-extra";
2
+ import path from "path";
3
+ import chalk from "chalk";
4
+ import { getFieldTypes, isValidFieldType } from "./field-schema.js";
5
+ // Helper function for type-safe config authoring
6
+ export function defineBlock(config) {
7
+ return config;
8
+ }
9
+ export function defineTemplate(config) {
10
+ return config;
11
+ }
12
+ // Load block.config.ts dynamically
13
+ export async function loadBlockConfig(blockPath) {
14
+ const configPath = path.join(blockPath, "block.config.ts");
15
+ if (!fs.existsSync(configPath)) {
16
+ return null;
17
+ }
18
+ try {
19
+ // Dynamic import for ESM
20
+ const configModule = await import(`file://${configPath}`);
21
+ return configModule.default;
22
+ }
23
+ catch (error) {
24
+ throw new Error(`Failed to load block.config.ts at ${configPath}: ${error.message}`);
25
+ }
26
+ }
27
+ // Validate schema against backend field types
28
+ export async function validateSchema(schema, blockPath) {
29
+ const errors = [];
30
+ const fieldTypes = await getFieldTypes();
31
+ function validateField(key, field, parentPath = "") {
32
+ const fullPath = parentPath ? `${parentPath}.${key}` : key;
33
+ // Check if field type is valid
34
+ if (!isValidFieldType(field.type, fieldTypes)) {
35
+ errors.push(`Invalid field type "${field.type}" for field "${fullPath}". Valid types: ${fieldTypes.map((ft) => ft.type).join(", ")}`);
36
+ }
37
+ // Validate repeater nested schema
38
+ if (field.type === "repeater") {
39
+ const repeaterField = field;
40
+ if (!repeaterField.schema || typeof repeaterField.schema !== "object") {
41
+ errors.push(`Repeater field "${fullPath}" must have a "schema" property`);
42
+ }
43
+ else {
44
+ // Recursively validate nested schema
45
+ Object.entries(repeaterField.schema).forEach(([nestedKey, nestedField]) => {
46
+ validateField(nestedKey, nestedField, fullPath);
47
+ });
48
+ }
49
+ // Validate minItems/maxItems
50
+ if (repeaterField.minItems !== undefined && repeaterField.minItems < 0) {
51
+ errors.push(`Repeater field "${fullPath}" has invalid minItems (must be >= 0)`);
52
+ }
53
+ if (repeaterField.maxItems !== undefined && repeaterField.maxItems < 1) {
54
+ errors.push(`Repeater field "${fullPath}" has invalid maxItems (must be >= 1)`);
55
+ }
56
+ if (repeaterField.minItems &&
57
+ repeaterField.maxItems &&
58
+ repeaterField.minItems > repeaterField.maxItems) {
59
+ errors.push(`Repeater field "${fullPath}" has minItems > maxItems`);
60
+ }
61
+ }
62
+ // Validate select options
63
+ if (field.type === "select") {
64
+ const selectField = field;
65
+ if (!selectField.options ||
66
+ !Array.isArray(selectField.options) ||
67
+ selectField.options.length === 0) {
68
+ errors.push(`Select field "${fullPath}" must have at least one option`);
69
+ }
70
+ }
71
+ // Warn about required fields with default values
72
+ if (field.required && field.defaultValue !== undefined) {
73
+ console.warn(chalk.yellow(`Warning: Field "${fullPath}" is required but has a defaultValue. The defaultValue will be ignored.`));
74
+ }
75
+ }
76
+ Object.entries(schema).forEach(([key, field]) => {
77
+ validateField(key, field);
78
+ });
79
+ return { valid: errors.length === 0, errors };
80
+ }
81
+ // Generate package.json cmssy section from block.config.ts
82
+ export function generatePackageJsonMetadata(config, packageType) {
83
+ // Convert schema to legacy schemaFields format
84
+ const schemaFields = convertSchemaToLegacyFormat(config.schema);
85
+ // Extract default content from schema
86
+ const defaultContent = extractDefaultContent(config.schema);
87
+ return {
88
+ packageType,
89
+ displayName: config.name,
90
+ description: config.description,
91
+ longDescription: config.longDescription,
92
+ category: config.category || (packageType === "template" ? "pages" : "other"),
93
+ tags: config.tags || [],
94
+ pricing: config.pricing || { licenseType: "free" },
95
+ schemaFields,
96
+ defaultContent,
97
+ };
98
+ }
99
+ function convertSchemaToLegacyFormat(schema) {
100
+ const fields = [];
101
+ function convertField(key, field) {
102
+ const baseField = {
103
+ key,
104
+ type: field.type,
105
+ label: field.label,
106
+ required: field.required || false,
107
+ };
108
+ if (field.placeholder) {
109
+ baseField.placeholder = field.placeholder;
110
+ }
111
+ if (field.type === "select") {
112
+ const selectField = field;
113
+ baseField.options = selectField.options;
114
+ }
115
+ if (field.type === "repeater") {
116
+ const repeaterField = field;
117
+ const nestedFields = convertSchemaToLegacyFormat(repeaterField.schema);
118
+ baseField.minItems = repeaterField.minItems;
119
+ baseField.maxItems = repeaterField.maxItems;
120
+ baseField.itemSchema = {
121
+ type: "object",
122
+ fields: nestedFields,
123
+ };
124
+ }
125
+ return baseField;
126
+ }
127
+ Object.entries(schema).forEach(([key, field]) => {
128
+ fields.push(convertField(key, field));
129
+ });
130
+ return fields;
131
+ }
132
+ function extractDefaultContent(schema) {
133
+ const content = {};
134
+ Object.entries(schema).forEach(([key, field]) => {
135
+ if (field.defaultValue !== undefined) {
136
+ content[key] = field.defaultValue;
137
+ }
138
+ else if (field.type === "repeater") {
139
+ // Repeaters default to empty array
140
+ content[key] = [];
141
+ }
142
+ });
143
+ return content;
144
+ }
145
+ //# sourceMappingURL=block-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-config.js","sourceRoot":"","sources":["../../src/utils/block-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface FieldTypeDefinition {
2
+ type: string;
3
+ label: string;
4
+ description: string;
5
+ allowsDefaultValue: boolean;
6
+ supportsValidation: boolean;
7
+ }
8
+ export declare function getFieldTypes(): Promise<FieldTypeDefinition[]>;
9
+ export declare function isValidFieldType(type: string, fieldTypes: FieldTypeDefinition[]): boolean;
10
+ //# sourceMappingURL=field-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-schema.d.ts","sourceRoot":"","sources":["../../src/utils/field-schema.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAoGD,wBAAsB,aAAa,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC,CA2BpE;AA8BD,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,mBAAmB,EAAE,GAChC,OAAO,CAET"}
@@ -0,0 +1,155 @@
1
+ import fs from "fs-extra";
2
+ import path from "path";
3
+ import { loadConfig, hasConfig } from "./config.js";
4
+ import fetch from "node-fetch";
5
+ const CACHE_FILE = ".cmssy/field-types.json";
6
+ const CACHE_DURATION_MS = 24 * 60 * 60 * 1000; // 24 hours
7
+ // Fallback field types if backend is unreachable
8
+ const FALLBACK_FIELD_TYPES = [
9
+ {
10
+ type: "singleLine",
11
+ label: "Single Line Text",
12
+ description: "Short text input",
13
+ allowsDefaultValue: true,
14
+ supportsValidation: true,
15
+ },
16
+ {
17
+ type: "multiLine",
18
+ label: "Multi-line Text",
19
+ description: "Text area",
20
+ allowsDefaultValue: true,
21
+ supportsValidation: true,
22
+ },
23
+ {
24
+ type: "richText",
25
+ label: "Rich Text",
26
+ description: "WYSIWYG editor",
27
+ allowsDefaultValue: true,
28
+ supportsValidation: false,
29
+ },
30
+ {
31
+ type: "text",
32
+ label: "Text (legacy)",
33
+ description: "Legacy text field",
34
+ allowsDefaultValue: true,
35
+ supportsValidation: true,
36
+ },
37
+ {
38
+ type: "string",
39
+ label: "String (legacy)",
40
+ description: "Legacy string field",
41
+ allowsDefaultValue: true,
42
+ supportsValidation: true,
43
+ },
44
+ {
45
+ type: "number",
46
+ label: "Number",
47
+ description: "Numeric input",
48
+ allowsDefaultValue: true,
49
+ supportsValidation: true,
50
+ },
51
+ {
52
+ type: "boolean",
53
+ label: "Boolean",
54
+ description: "True/false toggle",
55
+ allowsDefaultValue: true,
56
+ supportsValidation: false,
57
+ },
58
+ {
59
+ type: "date",
60
+ label: "Date",
61
+ description: "Date picker",
62
+ allowsDefaultValue: true,
63
+ supportsValidation: true,
64
+ },
65
+ {
66
+ type: "media",
67
+ label: "Media",
68
+ description: "Image/video upload",
69
+ allowsDefaultValue: false,
70
+ supportsValidation: true,
71
+ },
72
+ {
73
+ type: "link",
74
+ label: "Link",
75
+ description: "URL input",
76
+ allowsDefaultValue: true,
77
+ supportsValidation: true,
78
+ },
79
+ {
80
+ type: "select",
81
+ label: "Select",
82
+ description: "Dropdown selection",
83
+ allowsDefaultValue: true,
84
+ supportsValidation: true,
85
+ },
86
+ {
87
+ type: "color",
88
+ label: "Color",
89
+ description: "Color picker",
90
+ allowsDefaultValue: true,
91
+ supportsValidation: false,
92
+ },
93
+ {
94
+ type: "repeater",
95
+ label: "Repeater",
96
+ description: "Repeatable nested fields",
97
+ allowsDefaultValue: false,
98
+ supportsValidation: true,
99
+ },
100
+ ];
101
+ export async function getFieldTypes() {
102
+ // Check cache first
103
+ const cached = await loadCachedFieldTypes();
104
+ if (cached)
105
+ return cached;
106
+ // Try to fetch from backend if configured
107
+ if (hasConfig()) {
108
+ try {
109
+ const config = loadConfig();
110
+ const apiBase = config.apiUrl.replace("/graphql", "");
111
+ const response = await fetch(`${apiBase}/api/field-types`, {
112
+ headers: config.apiToken
113
+ ? { Authorization: `Bearer ${config.apiToken}` }
114
+ : {},
115
+ });
116
+ if (response.ok) {
117
+ const fieldTypes = (await response.json());
118
+ await cacheFieldTypes(fieldTypes);
119
+ return fieldTypes;
120
+ }
121
+ }
122
+ catch (error) {
123
+ // Backend unreachable, use fallback
124
+ }
125
+ }
126
+ return FALLBACK_FIELD_TYPES;
127
+ }
128
+ async function loadCachedFieldTypes() {
129
+ const cachePath = path.join(process.cwd(), CACHE_FILE);
130
+ if (!fs.existsSync(cachePath))
131
+ return null;
132
+ try {
133
+ const cached = await fs.readJson(cachePath);
134
+ const age = Date.now() - cached.timestamp;
135
+ if (age < CACHE_DURATION_MS) {
136
+ return cached.fieldTypes;
137
+ }
138
+ }
139
+ catch {
140
+ // Invalid cache
141
+ }
142
+ return null;
143
+ }
144
+ async function cacheFieldTypes(fieldTypes) {
145
+ const cachePath = path.join(process.cwd(), CACHE_FILE);
146
+ fs.ensureDirSync(path.dirname(cachePath));
147
+ await fs.writeJson(cachePath, {
148
+ timestamp: Date.now(),
149
+ fieldTypes,
150
+ });
151
+ }
152
+ export function isValidFieldType(type, fieldTypes) {
153
+ return fieldTypes.some((ft) => ft.type === type);
154
+ }
155
+ //# sourceMappingURL=field-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-schema.js","sourceRoot":"","sources":["../../src/utils/field-schema.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import { loadConfig } from "./config.js";
3
3
  export function createClient() {
4
4
  const config = loadConfig();
5
5
  if (!config.apiToken) {
6
- throw new Error("CMSSY_API_TOKEN not configured. Run: cmssy-forge configure");
6
+ throw new Error("CMSSY_API_TOKEN not configured. Run: cmssy configure");
7
7
  }
8
8
  return new GraphQLClient(config.apiUrl, {
9
9
  headers: {