cmssy-cli 0.6.0 ā 0.9.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/README.md +382 -36
- package/dist/cli.js +29 -10
- package/dist/cli.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +10 -0
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +251 -12
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +32 -22
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/package.d.ts +7 -0
- package/dist/commands/package.d.ts.map +1 -0
- package/dist/commands/package.js +161 -0
- package/dist/commands/package.js.map +1 -0
- package/dist/commands/publish.d.ts +12 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +395 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/push.d.ts +9 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +199 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/upload.d.ts +7 -0
- package/dist/commands/upload.d.ts.map +1 -0
- package/dist/commands/upload.js +126 -0
- package/dist/commands/upload.js.map +1 -0
- package/dist/dev-ui/app.js +657 -0
- package/dist/dev-ui/index.html +837 -0
- package/dist/utils/block-config.d.ts.map +1 -1
- package/dist/utils/block-config.js +49 -3
- package/dist/utils/block-config.js.map +1 -1
- package/dist/utils/cmssy-config.d.ts +0 -3
- package/dist/utils/cmssy-config.d.ts.map +1 -1
- package/dist/utils/cmssy-config.js.map +1 -1
- package/dist/utils/config.d.ts +1 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +1 -0
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/graphql.d.ts +1 -0
- package/dist/utils/graphql.d.ts.map +1 -1
- package/dist/utils/graphql.js +28 -0
- package/dist/utils/graphql.js.map +1 -1
- package/package.json +8 -3
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import fs from "fs-extra";
|
|
3
|
+
import { GraphQLClient } from "graphql-request";
|
|
4
|
+
import inquirer from "inquirer";
|
|
5
|
+
import ora from "ora";
|
|
6
|
+
import path from "path";
|
|
7
|
+
import { hasConfig, loadConfig } from "../utils/config.js";
|
|
8
|
+
import { IMPORT_BLOCK_MUTATION } from "../utils/graphql.js";
|
|
9
|
+
export async function pushCommand(options) {
|
|
10
|
+
console.log(chalk.blue.bold("\nš Cmssy - Push to Workspace\n"));
|
|
11
|
+
// Check configuration
|
|
12
|
+
if (!hasConfig()) {
|
|
13
|
+
console.error(chalk.red("ā Not configured. Run: cmssy configure\n"));
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
const config = loadConfig();
|
|
17
|
+
// Find cmssy.config.js
|
|
18
|
+
const configPath = path.join(process.cwd(), "cmssy.config.js");
|
|
19
|
+
if (!fs.existsSync(configPath)) {
|
|
20
|
+
console.error(chalk.red("ā Not a cmssy project (missing cmssy.config.js)\n"));
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
// Get workspace ID
|
|
24
|
+
let workspaceId = options.workspace;
|
|
25
|
+
if (!workspaceId) {
|
|
26
|
+
const answer = await inquirer.prompt([
|
|
27
|
+
{
|
|
28
|
+
type: "input",
|
|
29
|
+
name: "workspaceId",
|
|
30
|
+
message: "Enter Workspace ID:",
|
|
31
|
+
validate: (input) => {
|
|
32
|
+
if (!input) {
|
|
33
|
+
return "Workspace ID is required";
|
|
34
|
+
}
|
|
35
|
+
return true;
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
]);
|
|
39
|
+
workspaceId = answer.workspaceId;
|
|
40
|
+
}
|
|
41
|
+
// Scan for packages to push
|
|
42
|
+
const packages = await scanPackages(options);
|
|
43
|
+
if (packages.length === 0) {
|
|
44
|
+
console.log(chalk.yellow("ā No packages found to push\n"));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
console.log(chalk.cyan(`Found ${packages.length} package(s) to push:\n`));
|
|
48
|
+
packages.forEach((pkg) => {
|
|
49
|
+
console.log(chalk.white(` ⢠${pkg.packageJson.name} v${pkg.packageJson.version}`));
|
|
50
|
+
});
|
|
51
|
+
console.log("");
|
|
52
|
+
// Push each package
|
|
53
|
+
let successCount = 0;
|
|
54
|
+
let errorCount = 0;
|
|
55
|
+
for (const pkg of packages) {
|
|
56
|
+
const spinner = ora(`Pushing ${pkg.packageJson.name} to workspace...`).start();
|
|
57
|
+
try {
|
|
58
|
+
await pushPackage(pkg, workspaceId, config.apiToken, config.apiUrl);
|
|
59
|
+
spinner.succeed(chalk.green(`${pkg.packageJson.name} pushed successfully`));
|
|
60
|
+
successCount++;
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
spinner.fail(chalk.red(`${pkg.packageJson.name} failed`));
|
|
64
|
+
console.error(chalk.red(` Error: ${error.message}\n`));
|
|
65
|
+
errorCount++;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
console.log("");
|
|
69
|
+
if (errorCount === 0) {
|
|
70
|
+
console.log(chalk.green.bold(`ā ${successCount} package(s) pushed to workspace\n`));
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
console.log(chalk.yellow(`ā ${successCount} succeeded, ${errorCount} failed\n`));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async function scanPackages(options) {
|
|
77
|
+
const packages = [];
|
|
78
|
+
// Scan blocks
|
|
79
|
+
const blocksDir = path.join(process.cwd(), "blocks");
|
|
80
|
+
if (fs.existsSync(blocksDir)) {
|
|
81
|
+
const blockDirs = fs
|
|
82
|
+
.readdirSync(blocksDir, { withFileTypes: true })
|
|
83
|
+
.filter((dirent) => dirent.isDirectory())
|
|
84
|
+
.map((dirent) => dirent.name);
|
|
85
|
+
for (const blockName of blockDirs) {
|
|
86
|
+
// Filter by options
|
|
87
|
+
if (options.blocks && !options.blocks.includes(blockName)) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (!options.all && !options.blocks) {
|
|
91
|
+
continue; // Skip unless --all or specifically listed
|
|
92
|
+
}
|
|
93
|
+
const blockPath = path.join(blocksDir, blockName);
|
|
94
|
+
const pkgPath = path.join(blockPath, "package.json");
|
|
95
|
+
if (!fs.existsSync(pkgPath))
|
|
96
|
+
continue;
|
|
97
|
+
const packageJson = fs.readJsonSync(pkgPath);
|
|
98
|
+
if (!packageJson.cmssy)
|
|
99
|
+
continue;
|
|
100
|
+
packages.push({
|
|
101
|
+
type: "block",
|
|
102
|
+
name: blockName,
|
|
103
|
+
path: blockPath,
|
|
104
|
+
packageJson,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Scan templates
|
|
109
|
+
const templatesDir = path.join(process.cwd(), "templates");
|
|
110
|
+
if (fs.existsSync(templatesDir)) {
|
|
111
|
+
const templateDirs = fs
|
|
112
|
+
.readdirSync(templatesDir, { withFileTypes: true })
|
|
113
|
+
.filter((dirent) => dirent.isDirectory())
|
|
114
|
+
.map((dirent) => dirent.name);
|
|
115
|
+
for (const templateName of templateDirs) {
|
|
116
|
+
// Filter by options
|
|
117
|
+
if (options.templates && !options.templates.includes(templateName)) {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (!options.all && !options.templates) {
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const templatePath = path.join(templatesDir, templateName);
|
|
124
|
+
const pkgPath = path.join(templatePath, "package.json");
|
|
125
|
+
if (!fs.existsSync(pkgPath))
|
|
126
|
+
continue;
|
|
127
|
+
const packageJson = fs.readJsonSync(pkgPath);
|
|
128
|
+
if (!packageJson.cmssy)
|
|
129
|
+
continue;
|
|
130
|
+
packages.push({
|
|
131
|
+
type: "template",
|
|
132
|
+
name: templateName,
|
|
133
|
+
path: templatePath,
|
|
134
|
+
packageJson,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return packages;
|
|
139
|
+
}
|
|
140
|
+
async function pushPackage(pkg, workspaceId, apiToken, apiUrl) {
|
|
141
|
+
const { packageJson, path: packagePath } = pkg;
|
|
142
|
+
const metadata = packageJson.cmssy;
|
|
143
|
+
// Read source code from src/index.tsx or src/index.ts
|
|
144
|
+
const srcDir = path.join(packagePath, "src");
|
|
145
|
+
let sourceCode;
|
|
146
|
+
const tsxPath = path.join(srcDir, "index.tsx");
|
|
147
|
+
const tsPath = path.join(srcDir, "index.ts");
|
|
148
|
+
if (fs.existsSync(tsxPath)) {
|
|
149
|
+
sourceCode = fs.readFileSync(tsxPath, "utf-8");
|
|
150
|
+
}
|
|
151
|
+
else if (fs.existsSync(tsPath)) {
|
|
152
|
+
sourceCode = fs.readFileSync(tsPath, "utf-8");
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
throw new Error(`Source code not found. Expected ${tsxPath} or ${tsPath}`);
|
|
156
|
+
}
|
|
157
|
+
// Read CSS if exists
|
|
158
|
+
const cssPath = path.join(srcDir, "index.css");
|
|
159
|
+
let cssCode;
|
|
160
|
+
if (fs.existsSync(cssPath)) {
|
|
161
|
+
cssCode = fs.readFileSync(cssPath, "utf-8");
|
|
162
|
+
}
|
|
163
|
+
// Generate block_type from package name
|
|
164
|
+
// @cmssy/blocks.hero -> hero
|
|
165
|
+
const blockType = packageJson.name
|
|
166
|
+
.replace(/@[^/]+\//, "")
|
|
167
|
+
.replace(/^blocks\./, "")
|
|
168
|
+
.replace(/^templates\./, "");
|
|
169
|
+
// Build input
|
|
170
|
+
const input = {
|
|
171
|
+
blockType,
|
|
172
|
+
name: metadata.displayName,
|
|
173
|
+
description: packageJson.description || metadata.description || "",
|
|
174
|
+
icon: metadata.icon || "Blocks",
|
|
175
|
+
category: metadata.category || "Custom",
|
|
176
|
+
sourceCode,
|
|
177
|
+
schemaFields: metadata.schemaFields || [],
|
|
178
|
+
defaultContent: metadata.defaultContent || {},
|
|
179
|
+
sourceRegistry: "local",
|
|
180
|
+
sourceItem: packageJson.name,
|
|
181
|
+
version: packageJson.version || "1.0.0",
|
|
182
|
+
};
|
|
183
|
+
// Create client with workspace header
|
|
184
|
+
const client = new GraphQLClient(apiUrl, {
|
|
185
|
+
headers: {
|
|
186
|
+
"Content-Type": "application/json",
|
|
187
|
+
Authorization: `Bearer ${apiToken}`,
|
|
188
|
+
"X-Workspace-ID": workspaceId,
|
|
189
|
+
},
|
|
190
|
+
});
|
|
191
|
+
// Send mutation
|
|
192
|
+
const result = await client.request(IMPORT_BLOCK_MUTATION, {
|
|
193
|
+
input,
|
|
194
|
+
});
|
|
195
|
+
if (!result.importBlock) {
|
|
196
|
+
throw new Error("Failed to import block");
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=push.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"AAQA,UAAU,aAAa;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,aAAa,CACjC,YAAY,EAAE,MAAM,EAAE,YAAK,EAC3B,OAAO,EAAE,aAAa,iBAiGvB"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import fs from "fs-extra";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import ora from "ora";
|
|
5
|
+
import FormData from "form-data";
|
|
6
|
+
import fetch from "node-fetch";
|
|
7
|
+
import { loadConfig } from "../utils/config.js";
|
|
8
|
+
export async function uploadCommand(packageFiles = [], options) {
|
|
9
|
+
const cwd = process.cwd();
|
|
10
|
+
const packagesDir = path.join(cwd, "packages");
|
|
11
|
+
// Load API config
|
|
12
|
+
const config = loadConfig();
|
|
13
|
+
if (!config.apiToken) {
|
|
14
|
+
console.error(chalk.red("ā API token not configured. Run:") +
|
|
15
|
+
chalk.white("\n cmssy configure"));
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
// Determine workspace ID
|
|
19
|
+
let workspaceId = options.workspace || config.workspaceId;
|
|
20
|
+
if (!workspaceId) {
|
|
21
|
+
console.error(chalk.red("ā Workspace ID required. Specify with --workspace or set CMSSY_WORKSPACE_ID in .env"));
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
// Check if packages directory exists
|
|
25
|
+
if (!(await fs.pathExists(packagesDir))) {
|
|
26
|
+
console.error(chalk.red("ā No packages directory found. Run:") +
|
|
27
|
+
chalk.white("\n cmssy package --all"));
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
// Determine which packages to upload
|
|
31
|
+
let toUpload = [];
|
|
32
|
+
if (options.all) {
|
|
33
|
+
// Get all ZIP files from packages directory
|
|
34
|
+
const files = await fs.readdir(packagesDir);
|
|
35
|
+
toUpload = files
|
|
36
|
+
.filter((f) => f.endsWith(".zip"))
|
|
37
|
+
.map((f) => path.join(packagesDir, f));
|
|
38
|
+
}
|
|
39
|
+
else if (packageFiles.length > 0) {
|
|
40
|
+
// Specific files
|
|
41
|
+
for (const file of packageFiles) {
|
|
42
|
+
const filePath = path.isAbsolute(file) ? file : path.join(packagesDir, file);
|
|
43
|
+
// Add .zip extension if missing
|
|
44
|
+
const zipPath = filePath.endsWith(".zip") ? filePath : `${filePath}.zip`;
|
|
45
|
+
if (!(await fs.pathExists(zipPath))) {
|
|
46
|
+
console.error(chalk.red(`ā Package not found: ${zipPath}`));
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
toUpload.push(zipPath);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
console.error(chalk.red("ā Specify packages to upload or use --all:\n") +
|
|
54
|
+
chalk.white(" cmssy upload hero-1.0.0.zip\n") +
|
|
55
|
+
chalk.white(" cmssy upload hero-1.0.0 pricing-2.1.0\n") +
|
|
56
|
+
chalk.white(" cmssy upload --all"));
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
if (toUpload.length === 0) {
|
|
60
|
+
console.log(chalk.yellow("ā No packages found to upload"));
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
console.log(chalk.blue(`\nš¤ Uploading ${toUpload.length} package(s)...\n`));
|
|
64
|
+
// Upload each package
|
|
65
|
+
let successCount = 0;
|
|
66
|
+
let failCount = 0;
|
|
67
|
+
for (const filePath of toUpload) {
|
|
68
|
+
const fileName = path.basename(filePath);
|
|
69
|
+
const result = await uploadPackage(filePath, workspaceId, config.apiUrl, config.apiToken);
|
|
70
|
+
if (result.success) {
|
|
71
|
+
successCount++;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
failCount++;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
console.log();
|
|
78
|
+
if (successCount > 0) {
|
|
79
|
+
console.log(chalk.green(`ā Successfully uploaded ${successCount} package(s)`));
|
|
80
|
+
}
|
|
81
|
+
if (failCount > 0) {
|
|
82
|
+
console.log(chalk.red(`ā Failed to upload ${failCount} package(s)`));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async function uploadPackage(filePath, workspaceId, apiUrl, apiToken) {
|
|
86
|
+
const fileName = path.basename(filePath);
|
|
87
|
+
const spinner = ora(`Uploading ${chalk.cyan(fileName)}`).start();
|
|
88
|
+
try {
|
|
89
|
+
// Create form data
|
|
90
|
+
const form = new FormData();
|
|
91
|
+
form.append("file", fs.createReadStream(filePath), {
|
|
92
|
+
filename: fileName,
|
|
93
|
+
contentType: "application/zip",
|
|
94
|
+
});
|
|
95
|
+
form.append("workspaceId", workspaceId);
|
|
96
|
+
// Determine upload endpoint
|
|
97
|
+
const uploadUrl = apiUrl.replace("/graphql", "/api/upload-package");
|
|
98
|
+
// Upload file
|
|
99
|
+
const response = await fetch(uploadUrl, {
|
|
100
|
+
method: "POST",
|
|
101
|
+
headers: {
|
|
102
|
+
Authorization: `Bearer ${apiToken}`,
|
|
103
|
+
...form.getHeaders(),
|
|
104
|
+
},
|
|
105
|
+
body: form,
|
|
106
|
+
});
|
|
107
|
+
if (!response.ok) {
|
|
108
|
+
const errorText = await response.text();
|
|
109
|
+
throw new Error(`HTTP ${response.status}: ${errorText || response.statusText}`);
|
|
110
|
+
}
|
|
111
|
+
const result = await response.json();
|
|
112
|
+
if (result.success || result.url) {
|
|
113
|
+
const fileSize = (fs.statSync(filePath).size / 1024).toFixed(2);
|
|
114
|
+
spinner.succeed(`Uploaded ${chalk.cyan(fileName)} (${fileSize} KB)${result.url ? chalk.gray(` ā ${result.url}`) : ""}`);
|
|
115
|
+
return { success: true };
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
throw new Error(result.error || "Upload failed");
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
spinner.fail(`Failed to upload ${chalk.cyan(fileName)}: ${error.message}`);
|
|
123
|
+
return { success: false, error: error.message };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"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"}
|