@flowgram.ai/cli 0.1.8
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/bin/index.js +2 -0
- package/dist/index.cjs +493 -0
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +472 -0
- package/package.json +40 -0
- package/src/create-app/index.ts +130 -0
- package/src/index.ts +31 -0
- package/src/materials/index.ts +93 -0
- package/src/materials/materials.ts +134 -0
- package/src/utils/import.ts +127 -0
- package/src/utils/npm.ts +43 -0
- package/src/utils/project.ts +100 -0
- package/src/utils/traverse-file.ts +60 -0
package/bin/index.js
ADDED
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
+
for (let key of __getOwnPropNames(from))
|
|
11
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
12
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
13
|
+
}
|
|
14
|
+
return to;
|
|
15
|
+
};
|
|
16
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
17
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
18
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
19
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
20
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
21
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
+
mod
|
|
23
|
+
));
|
|
24
|
+
|
|
25
|
+
// ../../common/temp/node_modules/.pnpm/tsup@8.3.5_typescript@5.8.3/node_modules/tsup/assets/cjs_shims.js
|
|
26
|
+
var getImportMetaUrl = () => typeof document === "undefined" ? new URL(`file:${__filename}`).href : document.currentScript && document.currentScript.src || new URL("main.js", document.baseURI).href;
|
|
27
|
+
var importMetaUrl = /* @__PURE__ */ getImportMetaUrl();
|
|
28
|
+
|
|
29
|
+
// src/index.ts
|
|
30
|
+
var import_commander = require("commander");
|
|
31
|
+
|
|
32
|
+
// src/materials/index.ts
|
|
33
|
+
var import_inquirer = __toESM(require("inquirer"), 1);
|
|
34
|
+
var import_chalk2 = __toESM(require("chalk"), 1);
|
|
35
|
+
|
|
36
|
+
// src/materials/materials.ts
|
|
37
|
+
var import_url = require("url");
|
|
38
|
+
var import_path2 = __toESM(require("path"), 1);
|
|
39
|
+
var import_fs2 = __toESM(require("fs"), 1);
|
|
40
|
+
|
|
41
|
+
// src/utils/traverse-file.ts
|
|
42
|
+
var import_path = __toESM(require("path"), 1);
|
|
43
|
+
var import_fs = __toESM(require("fs"), 1);
|
|
44
|
+
var File = class {
|
|
45
|
+
constructor(filePath, root = "/") {
|
|
46
|
+
this.root = root;
|
|
47
|
+
this.path = filePath;
|
|
48
|
+
this.relativePath = import_path.default.relative(this.root, this.path);
|
|
49
|
+
this.suffix = import_path.default.extname(this.path);
|
|
50
|
+
if (!import_fs.default.existsSync(this.path)) {
|
|
51
|
+
throw Error(`File ${import_path.default} Not Exists`);
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
this.content = import_fs.default.readFileSync(this.path, "utf-8");
|
|
55
|
+
this.isUtf8 = true;
|
|
56
|
+
} catch (e) {
|
|
57
|
+
this.isUtf8 = false;
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
replace(updater) {
|
|
62
|
+
if (!this.isUtf8) {
|
|
63
|
+
console.warn("Not UTF-8 file skipped: ", this.path);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
this.content = updater(this.content);
|
|
67
|
+
import_fs.default.writeFileSync(this.path, this.content, "utf-8");
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
function* traverseRecursiveFiles(folder) {
|
|
71
|
+
const files = import_fs.default.readdirSync(folder);
|
|
72
|
+
for (const file of files) {
|
|
73
|
+
const filePath = import_path.default.join(folder, file);
|
|
74
|
+
if (import_fs.default.statSync(filePath).isDirectory()) {
|
|
75
|
+
yield* traverseRecursiveFiles(filePath);
|
|
76
|
+
} else {
|
|
77
|
+
yield new File(filePath);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// src/utils/import.ts
|
|
83
|
+
function assembleImport(declaration) {
|
|
84
|
+
const { namedImports, defaultImport, namespaceImport, source } = declaration;
|
|
85
|
+
const importClauses = [];
|
|
86
|
+
if (namedImports) {
|
|
87
|
+
importClauses.push(
|
|
88
|
+
`{ ${namedImports.map(
|
|
89
|
+
({ local, imported, typeOnly }) => `${typeOnly ? "type " : ""}${imported}${local ? ` as ${local}` : ""}`
|
|
90
|
+
).join(", ")} }`
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
if (defaultImport) {
|
|
94
|
+
importClauses.push(defaultImport);
|
|
95
|
+
}
|
|
96
|
+
if (namespaceImport) {
|
|
97
|
+
importClauses.push(`* as ${namespaceImport}`);
|
|
98
|
+
}
|
|
99
|
+
return `import ${importClauses.join(", ")} from '${source}'`;
|
|
100
|
+
}
|
|
101
|
+
function replaceImport(fileContent, origin, replaceTo) {
|
|
102
|
+
const replaceImportStatements = replaceTo.map(assembleImport);
|
|
103
|
+
return fileContent.replace(origin.statement, replaceImportStatements.join("\n"));
|
|
104
|
+
}
|
|
105
|
+
function* traverseFileImports(fileContent) {
|
|
106
|
+
const importRegex = /import\s+([^{}*,]*?)?(?:\s*\*\s*as\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\s*,?)?(?:\s*\{([^}]*)\}\s*,?)?(?:\s*([a-zA-Z_$][a-zA-Z0-9_$]*)\s*,?)?\s*from\s*['"`]([^'"`]+)['"`]/g;
|
|
107
|
+
let match;
|
|
108
|
+
while ((match = importRegex.exec(fileContent)) !== null) {
|
|
109
|
+
const [fullMatch, defaultPart, namespacePart, namedPart, defaultPart2, source] = match;
|
|
110
|
+
const declaration = {
|
|
111
|
+
statement: fullMatch,
|
|
112
|
+
source
|
|
113
|
+
};
|
|
114
|
+
const defaultImport = defaultPart?.trim() || defaultPart2?.trim();
|
|
115
|
+
if (defaultImport && !namespacePart && !namedPart) {
|
|
116
|
+
declaration.defaultImport = defaultImport;
|
|
117
|
+
} else if (defaultImport && (namespacePart || namedPart)) {
|
|
118
|
+
declaration.defaultImport = defaultImport;
|
|
119
|
+
}
|
|
120
|
+
if (namespacePart) {
|
|
121
|
+
declaration.namespaceImport = namespacePart.trim();
|
|
122
|
+
}
|
|
123
|
+
if (namedPart) {
|
|
124
|
+
const namedImports = [];
|
|
125
|
+
const namedItems = namedPart.split(",").map((item) => item.trim()).filter(Boolean);
|
|
126
|
+
for (const item of namedItems) {
|
|
127
|
+
const typeOnly = item.startsWith("type ");
|
|
128
|
+
const cleanItem = typeOnly ? item.slice(5).trim() : item;
|
|
129
|
+
if (cleanItem.includes(" as ")) {
|
|
130
|
+
const [imported, local] = cleanItem.split(" as ").map((s) => s.trim());
|
|
131
|
+
namedImports.push({
|
|
132
|
+
imported,
|
|
133
|
+
local,
|
|
134
|
+
typeOnly
|
|
135
|
+
});
|
|
136
|
+
} else {
|
|
137
|
+
namedImports.push({
|
|
138
|
+
imported: cleanItem,
|
|
139
|
+
typeOnly
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (namedImports.length > 0) {
|
|
144
|
+
declaration.namedImports = namedImports;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
yield declaration;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// src/materials/materials.ts
|
|
152
|
+
var __filename2 = (0, import_url.fileURLToPath)(importMetaUrl);
|
|
153
|
+
var __dirname2 = import_path2.default.dirname(__filename2);
|
|
154
|
+
var _types = [
|
|
155
|
+
"components",
|
|
156
|
+
"effects",
|
|
157
|
+
"plugins",
|
|
158
|
+
"shared",
|
|
159
|
+
"typings",
|
|
160
|
+
"validate",
|
|
161
|
+
"form-plugins",
|
|
162
|
+
"hooks"
|
|
163
|
+
];
|
|
164
|
+
function listAllMaterials(formMaterialSrc) {
|
|
165
|
+
const _materials = [];
|
|
166
|
+
for (const _type of _types) {
|
|
167
|
+
const materialsPath = import_path2.default.join(formMaterialSrc, _type);
|
|
168
|
+
_materials.push(
|
|
169
|
+
...import_fs2.default.readdirSync(materialsPath).map((_path) => {
|
|
170
|
+
if (_path === "index.ts") {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
name: _path,
|
|
175
|
+
// Assuming the folder name is the material name
|
|
176
|
+
type: _type,
|
|
177
|
+
path: import_path2.default.join(materialsPath, _path)
|
|
178
|
+
};
|
|
179
|
+
}).filter((material) => material !== null)
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
return _materials;
|
|
183
|
+
}
|
|
184
|
+
var getFormMaterialDependencies = (formMaterialPath) => {
|
|
185
|
+
const packageJsonPath = import_path2.default.join(formMaterialPath, "package.json");
|
|
186
|
+
const packageJson = JSON.parse(import_fs2.default.readFileSync(packageJsonPath, "utf8"));
|
|
187
|
+
return packageJson.dependencies;
|
|
188
|
+
};
|
|
189
|
+
var copyMaterial = (material, project, formMaterialPath) => {
|
|
190
|
+
const formMaterialDependencies = getFormMaterialDependencies(formMaterialPath);
|
|
191
|
+
const sourceDir = material.path;
|
|
192
|
+
const materialRoot = import_path2.default.join(
|
|
193
|
+
project.projectPath,
|
|
194
|
+
"src",
|
|
195
|
+
"form-materials",
|
|
196
|
+
`${material.type}`
|
|
197
|
+
);
|
|
198
|
+
const targetDir = import_path2.default.join(materialRoot, material.name);
|
|
199
|
+
const packagesToInstall = /* @__PURE__ */ new Set();
|
|
200
|
+
import_fs2.default.cpSync(sourceDir, targetDir, { recursive: true });
|
|
201
|
+
for (const file of traverseRecursiveFiles(targetDir)) {
|
|
202
|
+
if ([".ts", ".tsx"].includes(file.suffix)) {
|
|
203
|
+
for (const importDeclaration of traverseFileImports(file.content)) {
|
|
204
|
+
const { source } = importDeclaration;
|
|
205
|
+
if (source.startsWith("@/")) {
|
|
206
|
+
console.log(
|
|
207
|
+
`Replace Import from ${source} to @flowgram.ai/form-materials`
|
|
208
|
+
);
|
|
209
|
+
file.replace(
|
|
210
|
+
(content) => replaceImport(content, importDeclaration, [
|
|
211
|
+
{ ...importDeclaration, source: "@flowgram.ai/form-materials" }
|
|
212
|
+
])
|
|
213
|
+
);
|
|
214
|
+
packagesToInstall.add(
|
|
215
|
+
`@flowgram.ai/form-materials@${project.flowgramVersion}`
|
|
216
|
+
);
|
|
217
|
+
} else if (!source.startsWith(".") && !source.startsWith("react")) {
|
|
218
|
+
const [dep, version] = Object.entries(formMaterialDependencies).find(
|
|
219
|
+
([_key]) => source.startsWith(_key)
|
|
220
|
+
) || [];
|
|
221
|
+
if (!dep) {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
if (dep.startsWith("@flowgram.ai/")) {
|
|
225
|
+
packagesToInstall.add(`${dep}@${project.flowgramVersion}`);
|
|
226
|
+
} else {
|
|
227
|
+
packagesToInstall.add(`${dep}@${version}`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
packagesToInstall: [...packagesToInstall]
|
|
235
|
+
};
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
// src/utils/npm.ts
|
|
239
|
+
var import_child_process = require("child_process");
|
|
240
|
+
var import_fs3 = require("fs");
|
|
241
|
+
var import_path3 = __toESM(require("path"), 1);
|
|
242
|
+
var import_download = __toESM(require("download"), 1);
|
|
243
|
+
async function getLatestVersion(packageName) {
|
|
244
|
+
return (0, import_child_process.execSync)(`npm view ${packageName} version --tag=latest`).toString().trim();
|
|
245
|
+
}
|
|
246
|
+
async function loadNpm(packageName) {
|
|
247
|
+
const packageLatestVersion = await getLatestVersion(packageName);
|
|
248
|
+
const packagePath = import_path3.default.join(
|
|
249
|
+
__dirname,
|
|
250
|
+
`./.download/${packageName}-${packageLatestVersion}`
|
|
251
|
+
);
|
|
252
|
+
if ((0, import_fs3.existsSync)(packagePath)) {
|
|
253
|
+
return packagePath;
|
|
254
|
+
}
|
|
255
|
+
try {
|
|
256
|
+
const tarballUrl = (0, import_child_process.execSync)(
|
|
257
|
+
`npm view ${packageName}@${packageLatestVersion} dist.tarball`
|
|
258
|
+
).toString().trim();
|
|
259
|
+
await (0, import_download.default)(tarballUrl, packagePath, { extract: true, strip: 1 });
|
|
260
|
+
return packagePath;
|
|
261
|
+
} catch (error) {
|
|
262
|
+
console.error(`Error downloading or extracting package: ${error}`);
|
|
263
|
+
throw error;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// src/materials/index.ts
|
|
268
|
+
var import_path5 = __toESM(require("path"), 1);
|
|
269
|
+
|
|
270
|
+
// src/utils/project.ts
|
|
271
|
+
var import_fs4 = require("fs");
|
|
272
|
+
var import_path4 = __toESM(require("path"), 1);
|
|
273
|
+
var import_chalk = __toESM(require("chalk"), 1);
|
|
274
|
+
var Project = class _Project {
|
|
275
|
+
constructor() {
|
|
276
|
+
}
|
|
277
|
+
async init() {
|
|
278
|
+
let projectPath = process.cwd();
|
|
279
|
+
while (projectPath !== "/" && !(0, import_fs4.existsSync)(import_path4.default.join(projectPath, "package.json"))) {
|
|
280
|
+
projectPath = import_path4.default.join(projectPath, "..");
|
|
281
|
+
}
|
|
282
|
+
if (projectPath === "/") {
|
|
283
|
+
throw new Error("Please run this command in a valid project");
|
|
284
|
+
}
|
|
285
|
+
this.projectPath = projectPath;
|
|
286
|
+
this.packageJsonPath = import_path4.default.join(projectPath, "package.json");
|
|
287
|
+
this.packageJson = JSON.parse((0, import_fs4.readFileSync)(this.packageJsonPath, "utf8"));
|
|
288
|
+
this.flowgramVersion = this.packageJson.dependencies["@flowgram.ai/fixed-layout-editor"] || this.packageJson.dependencies["@flowgram.ai/free-layout-editor"] || this.packageJson.dependencies["@flowgram.ai/editor"];
|
|
289
|
+
}
|
|
290
|
+
async addDependency(dependency) {
|
|
291
|
+
let name;
|
|
292
|
+
let version;
|
|
293
|
+
const lastAtIndex = dependency.lastIndexOf("@");
|
|
294
|
+
if (lastAtIndex <= 0) {
|
|
295
|
+
name = dependency;
|
|
296
|
+
version = await getLatestVersion(name);
|
|
297
|
+
} else {
|
|
298
|
+
name = dependency.substring(0, lastAtIndex);
|
|
299
|
+
version = dependency.substring(lastAtIndex + 1);
|
|
300
|
+
if (!version.trim()) {
|
|
301
|
+
version = await getLatestVersion(name);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
this.packageJson.dependencies[name] = version;
|
|
305
|
+
(0, import_fs4.writeFileSync)(
|
|
306
|
+
this.packageJsonPath,
|
|
307
|
+
JSON.stringify(this.packageJson, null, 2)
|
|
308
|
+
);
|
|
309
|
+
}
|
|
310
|
+
async addDependencies(dependencies) {
|
|
311
|
+
for (const dependency of dependencies) {
|
|
312
|
+
await this.addDependency(dependency);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
printInfo() {
|
|
316
|
+
console.log(import_chalk.default.bold("Project Info:"));
|
|
317
|
+
console.log(import_chalk.default.black(` - Flowgram Version: ${this.flowgramVersion}`));
|
|
318
|
+
console.log(import_chalk.default.black(` - Project Path: ${this.projectPath}`));
|
|
319
|
+
}
|
|
320
|
+
static async getSingleton() {
|
|
321
|
+
const info = new _Project();
|
|
322
|
+
await info.init();
|
|
323
|
+
return info;
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
// src/materials/index.ts
|
|
328
|
+
async function syncMaterial(materialName) {
|
|
329
|
+
console.log(import_chalk2.default.bgGreenBright("Welcome to @flowgram.ai form-materials!"));
|
|
330
|
+
const project = await Project.getSingleton();
|
|
331
|
+
project.printInfo();
|
|
332
|
+
if (!project.flowgramVersion) {
|
|
333
|
+
throw new Error(
|
|
334
|
+
"Please install @flowgram.ai/fixed-layout-editor or @flowgram.ai/free-layout-editor"
|
|
335
|
+
);
|
|
336
|
+
}
|
|
337
|
+
const formMaterialPath = await loadNpm("@flowgram.ai/form-materials");
|
|
338
|
+
const formMaterialSrc = import_path5.default.join(formMaterialPath, "src");
|
|
339
|
+
const materials = listAllMaterials(formMaterialSrc);
|
|
340
|
+
let material;
|
|
341
|
+
if (materialName) {
|
|
342
|
+
const selectedMaterial = materials.find(
|
|
343
|
+
(m) => `${m.type}/${m.name}` === materialName
|
|
344
|
+
);
|
|
345
|
+
if (selectedMaterial) {
|
|
346
|
+
material = selectedMaterial;
|
|
347
|
+
console.log(import_chalk2.default.green(`Using material: ${materialName}`));
|
|
348
|
+
} else {
|
|
349
|
+
console.log(
|
|
350
|
+
import_chalk2.default.yellow(
|
|
351
|
+
`Material "${materialName}" not found. Please select from the list:`
|
|
352
|
+
)
|
|
353
|
+
);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
if (!material) {
|
|
357
|
+
const result = await import_inquirer.default.prompt([
|
|
358
|
+
{
|
|
359
|
+
type: "list",
|
|
360
|
+
name: "material",
|
|
361
|
+
message: "Select one material to add:",
|
|
362
|
+
choices: [
|
|
363
|
+
...materials.map((_material) => ({
|
|
364
|
+
name: `${_material.type}/${_material.name}`,
|
|
365
|
+
value: _material
|
|
366
|
+
}))
|
|
367
|
+
]
|
|
368
|
+
}
|
|
369
|
+
]);
|
|
370
|
+
material = result.material;
|
|
371
|
+
}
|
|
372
|
+
if (!material) {
|
|
373
|
+
console.error(import_chalk2.default.red("No material selected. Exiting."));
|
|
374
|
+
process.exit(1);
|
|
375
|
+
}
|
|
376
|
+
console.log(
|
|
377
|
+
import_chalk2.default.bold("The following materials will be added to your project")
|
|
378
|
+
);
|
|
379
|
+
console.log(material);
|
|
380
|
+
let { packagesToInstall } = copyMaterial(material, project, formMaterialPath);
|
|
381
|
+
await project.addDependencies(packagesToInstall);
|
|
382
|
+
console.log(
|
|
383
|
+
import_chalk2.default.bold("These npm dependencies is added to your package.json")
|
|
384
|
+
);
|
|
385
|
+
packagesToInstall.forEach((_package) => {
|
|
386
|
+
console.log(`- ${_package}`);
|
|
387
|
+
});
|
|
388
|
+
console.log(import_chalk2.default.bold("\nPlease run npm install to install dependencies"));
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
// src/create-app/index.ts
|
|
392
|
+
var import_path6 = __toESM(require("path"), 1);
|
|
393
|
+
var import_child_process2 = require("child_process");
|
|
394
|
+
var import_inquirer2 = __toESM(require("inquirer"), 1);
|
|
395
|
+
var import_fs_extra = __toESM(require("fs-extra"), 1);
|
|
396
|
+
var import_chalk3 = __toESM(require("chalk"), 1);
|
|
397
|
+
var import_download2 = __toESM(require("download"), 1);
|
|
398
|
+
var tar = __toESM(require("tar"), 1);
|
|
399
|
+
var args = process.argv.slice(2);
|
|
400
|
+
var updateFlowGramVersions = (dependencies, latestVersion) => {
|
|
401
|
+
for (const packageName in dependencies) {
|
|
402
|
+
if (packageName.startsWith("@flowgram.ai")) {
|
|
403
|
+
dependencies[packageName] = latestVersion;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
};
|
|
407
|
+
var createApp = async (projectName) => {
|
|
408
|
+
console.log(import_chalk3.default.green("Welcome to @flowgram.ai/create-app CLI!"));
|
|
409
|
+
const latest = (0, import_child_process2.execSync)("npm view @flowgram.ai/demo-fixed-layout version --tag=latest latest").toString().trim();
|
|
410
|
+
let folderName = "";
|
|
411
|
+
if (!projectName) {
|
|
412
|
+
const { repo } = await import_inquirer2.default.prompt([
|
|
413
|
+
{
|
|
414
|
+
type: "list",
|
|
415
|
+
name: "repo",
|
|
416
|
+
message: "Select a demo to create:",
|
|
417
|
+
choices: [
|
|
418
|
+
{ name: "Fixed Layout Demo", value: "demo-fixed-layout" },
|
|
419
|
+
{ name: "Free Layout Demo", value: "demo-free-layout" },
|
|
420
|
+
{ name: "Fixed Layout Demo Simple", value: "demo-fixed-layout-simple" },
|
|
421
|
+
{ name: "Free Layout Demo Simple", value: "demo-free-layout-simple" },
|
|
422
|
+
{ name: "Free Layout Nextjs Demo", value: "demo-nextjs" },
|
|
423
|
+
{ name: "Free Layout Vite Demo Simple", value: "demo-vite" },
|
|
424
|
+
{ name: "Demo Playground for infinite canvas", value: "demo-playground" }
|
|
425
|
+
]
|
|
426
|
+
}
|
|
427
|
+
]);
|
|
428
|
+
folderName = repo;
|
|
429
|
+
} else {
|
|
430
|
+
if (["fixed-layout", "free-layout", "fixed-layout-simple", "free-layout-simple", "playground", "nextjs"].includes(projectName)) {
|
|
431
|
+
folderName = `demo-${projectName}`;
|
|
432
|
+
} else {
|
|
433
|
+
console.error('Invalid projectName. Please run "npx create-app" to choose demo.');
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
try {
|
|
438
|
+
const targetDir = import_path6.default.join(process.cwd());
|
|
439
|
+
const downloadPackage = async () => {
|
|
440
|
+
try {
|
|
441
|
+
const tarballBuffer = await (0, import_download2.default)(`https://registry.npmjs.org/@flowgram.ai/${folderName}/-/${folderName}-${latest}.tgz`);
|
|
442
|
+
import_fs_extra.default.ensureDirSync(targetDir);
|
|
443
|
+
const tempTarballPath = import_path6.default.join(process.cwd(), `${folderName}.tgz`);
|
|
444
|
+
import_fs_extra.default.writeFileSync(tempTarballPath, tarballBuffer);
|
|
445
|
+
await tar.x({
|
|
446
|
+
file: tempTarballPath,
|
|
447
|
+
C: targetDir
|
|
448
|
+
});
|
|
449
|
+
import_fs_extra.default.renameSync(import_path6.default.join(targetDir, "package"), import_path6.default.join(targetDir, folderName));
|
|
450
|
+
import_fs_extra.default.unlinkSync(tempTarballPath);
|
|
451
|
+
return true;
|
|
452
|
+
} catch (error) {
|
|
453
|
+
console.error(`Error downloading or extracting package: ${error}`);
|
|
454
|
+
return false;
|
|
455
|
+
}
|
|
456
|
+
};
|
|
457
|
+
const res = await downloadPackage();
|
|
458
|
+
const pkgJsonPath = import_path6.default.join(targetDir, folderName, "package.json");
|
|
459
|
+
const data = import_fs_extra.default.readFileSync(pkgJsonPath, "utf-8");
|
|
460
|
+
const packageLatestVersion = (0, import_child_process2.execSync)("npm view @flowgram.ai/core version --tag=latest latest").toString().trim();
|
|
461
|
+
const jsonData = JSON.parse(data);
|
|
462
|
+
if (jsonData.dependencies) {
|
|
463
|
+
updateFlowGramVersions(jsonData.dependencies, packageLatestVersion);
|
|
464
|
+
}
|
|
465
|
+
if (jsonData.devDependencies) {
|
|
466
|
+
updateFlowGramVersions(jsonData.devDependencies, packageLatestVersion);
|
|
467
|
+
}
|
|
468
|
+
import_fs_extra.default.writeFileSync(pkgJsonPath, JSON.stringify(jsonData, null, 2), "utf-8");
|
|
469
|
+
if (res) {
|
|
470
|
+
console.log(import_chalk3.default.green(`${folderName} Demo project created successfully!`));
|
|
471
|
+
console.log(import_chalk3.default.yellow("Run the following commands to start:"));
|
|
472
|
+
console.log(import_chalk3.default.cyan(` cd ${folderName}`));
|
|
473
|
+
console.log(import_chalk3.default.cyan(" npm install"));
|
|
474
|
+
console.log(import_chalk3.default.cyan(" npm start"));
|
|
475
|
+
} else {
|
|
476
|
+
console.log(import_chalk3.default.red("Download failed"));
|
|
477
|
+
}
|
|
478
|
+
} catch (error) {
|
|
479
|
+
console.error("Error downloading repo:", error);
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
};
|
|
483
|
+
|
|
484
|
+
// src/index.ts
|
|
485
|
+
var program = new import_commander.Command();
|
|
486
|
+
program.name("flowgram-cli").version("1.0.0").description("Flowgram CLI");
|
|
487
|
+
program.command("create-app").description("Create a new flowgram project").argument("[string]", "Project name").action(async (projectName) => {
|
|
488
|
+
await createApp(projectName);
|
|
489
|
+
});
|
|
490
|
+
program.command("materials").description("Sync materials to the project").argument("[string]", "Material name").action(async (materialName) => {
|
|
491
|
+
await syncMaterial(materialName);
|
|
492
|
+
});
|
|
493
|
+
program.parse(process.argv);
|
package/dist/index.d.cts
ADDED
package/dist/index.d.ts
ADDED