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.
- package/dist/cli.js +7 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +67 -8
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +114 -70
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +73 -10
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +70 -67
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate.d.ts +2 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +225 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/types/block-config.d.ts +40 -0
- package/dist/types/block-config.d.ts.map +1 -0
- package/dist/types/block-config.js +3 -0
- package/dist/types/block-config.js.map +1 -0
- package/dist/utils/block-config.d.ts +10 -0
- package/dist/utils/block-config.d.ts.map +1 -0
- package/dist/utils/block-config.js +145 -0
- package/dist/utils/block-config.js.map +1 -0
- package/dist/utils/field-schema.d.ts +10 -0
- package/dist/utils/field-schema.d.ts.map +1 -0
- package/dist/utils/field-schema.js +155 -0
- package/dist/utils/field-schema.js.map +1 -0
- package/dist/utils/graphql.js +1 -1
- package/dist/utils/graphql.js.map +1 -1
- package/dist/utils/type-generator.d.ts +3 -0
- package/dist/utils/type-generator.d.ts.map +1 -0
- package/dist/utils/type-generator.js +67 -0
- package/dist/utils/type-generator.js.map +1 -0
- 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":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAG3D,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAkB;IACrD,MAAM,OAAO,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,eAAe,GAAa,EAAE,CAAC;QAErC,IAAI,SAAS,EAAE,CAAC;YACd,yBAAyB;YACzB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAChE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;YAEtE,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;YACvD,CAAC;iBAAM,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBACvC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,sBAAsB,SAAS,aAAa,CAAC,CAAC;gBAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,mCAAmC;YACnC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;YACrD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;YAE3D,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,GAAG,EAAE;qBACZ,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;qBAC/C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;qBAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC3C,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YAChC,CAAC;YAED,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,EAAE;qBACZ,WAAW,CAAC,YAAY,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;qBAClD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;qBAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC9C,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,eAAe,CAAC,MAAM,yBAAyB,CAAC,CAAC,CAAC;QAEpF,KAAK,MAAM,YAAY,IAAI,eAAe,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;YACxD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAErC,4BAA4B;YAC5B,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC;gBAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,qBAAqB,CAAC,CAAC,CAAC;gBAC5D,YAAY,EAAE,CAAC;gBACf,SAAS;YACX,CAAC;YAED,oBAAoB;YACpB,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;YACrC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,4BAA4B,CAAC,CAAC,CAAC;gBACnE,YAAY,EAAE,CAAC;gBACf,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,0BAA0B,CAAC,CAAC,CAAC;gBAChE,aAAa,EAAE,CAAC;YAClB,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAC3D,UAAU,EAAE,CAAC;YACf,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,aAAa,EAAE,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,YAAY,EAAE,CAAC,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mCAAmC,CAAC,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,aAAa,EAAE,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,YAAY,EAAE,CAAC,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,UAAU,IAAI,CAAC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,SAAiB,EAAE,GAAQ;IACrD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACxB,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,KAAK,UAAU,CAAC;IAEpD,wCAAwC;IACxC,MAAM,MAAM,GAAG,wBAAwB,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IAElE,mCAAmC;IACnC,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAChD,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChB,MAAM,CAAC,GAAG,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YACvD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,2BAA2B;IAC3B,MAAM,aAAa,GAAG,0BAA0B,CAC9C,KAAK,CAAC,WAAW,IAAI,GAAG,CAAC,IAAI,EAC7B,GAAG,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,IAAI,EAAE,EAC1C,KAAK,CAAC,eAAe,EACrB,KAAK,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAClD,KAAK,CAAC,IAAI,IAAI,EAAE,EAChB,MAAM,EACN,KAAK,CAAC,OAAO,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EACxC,UAAU,CACX,CAAC;IAEF,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,aAAa,CAAC,CAAC;IAEzE,6CAA6C;IAC7C,MAAM,MAAM,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;IAC1B,OAAO,MAAM,CAAC,KAAK,CAAC;IAEpB,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EACpC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CACvC,CAAC;IAEF,iBAAiB;IACjB,MAAM,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,wBAAwB,CAC/B,YAAmB;IAEnB,MAAM,MAAM,GAAwB,EAAE,CAAC;IAEvC,YAAY,CAAC,OAAO,CAAC,CAAC,KAAU,EAAE,EAAE;QAClC,MAAM,QAAQ,GAAQ;YACpB,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;YAC/B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK;SAClC,CAAC;QAEF,IAAI,KAAK,CAAC,WAAW;YAAE,QAAQ,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QAChE,IAAI,KAAK,CAAC,QAAQ;YAAE,QAAQ,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAEvD,uBAAuB;QACvB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAC7C,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QACnC,CAAC;QAED,yBAAyB;QACzB,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAClD,IAAI,KAAK,CAAC,QAAQ;gBAAE,QAAQ,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YACvD,IAAI,KAAK,CAAC,QAAQ;gBAAE,QAAQ,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YAEvD,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;gBAC5B,QAAQ,CAAC,MAAM,GAAG,wBAAwB,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACtE,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,UAAkB;IACvC,iCAAiC;IACjC,MAAM,OAAO,GAA2B;QACtC,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,YAAY;QACpB,iCAAiC;KAClC,CAAC;IAEF,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC;AAC3C,CAAC;AAED,SAAS,0BAA0B,CACjC,IAAY,EACZ,WAAmB,EACnB,eAAmC,EACnC,QAAgB,EAChB,IAAc,EACd,MAA2B,EAC3B,OAAY,EACZ,UAAmB;IAEnB,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAC;IAErE,mCAAmC;IACnC,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAEjD,OAAO,YAAY,cAAc;;iBAElB,cAAc;WACpB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;kBAClB,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,KAC9C,eAAe,CAAC,CAAC,CAAC,yBAAyB,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EACxF;eACa,QAAQ;UACb,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;;YAElB,UAAU;;aAET,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;;CAEnC,CAAC;AACF,CAAC;AAED,SAAS,kBAAkB,CAAC,MAA2B,EAAE,MAAc;IACrE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,KAAK,GAAa,CAAC,GAAG,CAAC,CAAC;IAE9B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC1D,MAAM,UAAU,GAAa,CAAC,GAAG,SAAS,GAAG,GAAG,KAAK,CAAC,CAAC;QAEvD,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,YAAY,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;QACxD,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,aAAa,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAE/E,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,mBAAmB,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,mBAAmB,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7F,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,gBAAgB,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACvF,CAAC;QACD,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACrC,UAAU,CAAC,IAAI,CACb,GAAG,SAAS,mBAAmB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CACrE,CAAC;QACJ,CAAC;QAED,wBAAwB;QACxB,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,cAAc,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9E,CAAC;QAED,yBAAyB;QACzB,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,eAAe,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;YAChE,CAAC;YACD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,eAAe,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;YAChE,CAAC;YACD,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;YAClE,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,aAAa,YAAY,GAAG,CAAC,CAAC;QAC5D,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,KAAK,KAAK,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -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 @@
|
|
|
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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"}
|
package/dist/utils/graphql.js
CHANGED
|
@@ -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
|
|
6
|
+
throw new Error("CMSSY_API_TOKEN not configured. Run: cmssy configure");
|
|
7
7
|
}
|
|
8
8
|
return new GraphQLClient(config.apiUrl, {
|
|
9
9
|
headers: {
|