create-fhevm-example 1.0.1
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 +320 -0
- package/dist/config.d.ts +34 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +302 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +483 -0
- package/dist/index.js.map +1 -0
- package/dist/utils.d.ts +44 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +320 -0
- package/dist/utils.js.map +1 -0
- package/package.json +46 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* create-fhevm-example - CLI for creating FHEVM example projects
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* npx create-fhevm-example
|
|
7
|
+
* npx create-fhevm-example --example fhe-counter
|
|
8
|
+
* npx create-fhevm-example --category basic
|
|
9
|
+
*/
|
|
10
|
+
import * as p from "@clack/prompts";
|
|
11
|
+
import pc from "picocolors";
|
|
12
|
+
import * as fs from "fs";
|
|
13
|
+
import * as path from "path";
|
|
14
|
+
import * as os from "os";
|
|
15
|
+
import { EXAMPLES, CATEGORIES } from "./config.js";
|
|
16
|
+
import { cloneTemplate, initSubmodule, copyDirectoryRecursive, getContractName, downloadFileFromGitHub, runCommand, extractTestResults, generateExampleReadme, generateCategoryReadme, generateDeployScript, } from "./utils.js";
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// Create Single Example
|
|
19
|
+
// =============================================================================
|
|
20
|
+
async function createSingleExample(exampleName, outputDir, tempRepoPath) {
|
|
21
|
+
const example = EXAMPLES[exampleName];
|
|
22
|
+
if (!example) {
|
|
23
|
+
throw new Error(`Unknown example: ${exampleName}`);
|
|
24
|
+
}
|
|
25
|
+
const templateDir = path.join(tempRepoPath, "fhevm-hardhat-template");
|
|
26
|
+
// Copy template
|
|
27
|
+
copyDirectoryRecursive(templateDir, outputDir);
|
|
28
|
+
// Get contract name
|
|
29
|
+
const contractName = getContractName(example.contract);
|
|
30
|
+
if (!contractName) {
|
|
31
|
+
throw new Error("Could not extract contract name");
|
|
32
|
+
}
|
|
33
|
+
// Remove template contract
|
|
34
|
+
const templateContract = path.join(outputDir, "contracts", "FHECounter.sol");
|
|
35
|
+
if (fs.existsSync(templateContract)) {
|
|
36
|
+
fs.unlinkSync(templateContract);
|
|
37
|
+
}
|
|
38
|
+
// Download contract and test from GitHub
|
|
39
|
+
await downloadFileFromGitHub(example.contract, path.join(outputDir, "contracts", `${contractName}.sol`));
|
|
40
|
+
// Remove .gitkeep from contracts
|
|
41
|
+
const contractsGitkeep = path.join(outputDir, "contracts", ".gitkeep");
|
|
42
|
+
if (fs.existsSync(contractsGitkeep)) {
|
|
43
|
+
fs.unlinkSync(contractsGitkeep);
|
|
44
|
+
}
|
|
45
|
+
// Clear test directory
|
|
46
|
+
const testDir = path.join(outputDir, "test");
|
|
47
|
+
fs.readdirSync(testDir).forEach((file) => {
|
|
48
|
+
if (file.endsWith(".ts") || file === ".gitkeep") {
|
|
49
|
+
fs.unlinkSync(path.join(testDir, file));
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
// Download test file
|
|
53
|
+
await downloadFileFromGitHub(example.test, path.join(outputDir, "test", path.basename(example.test)));
|
|
54
|
+
// Update deploy script
|
|
55
|
+
fs.writeFileSync(path.join(outputDir, "deploy", "deploy.ts"), generateDeployScript(contractName));
|
|
56
|
+
// Update package.json
|
|
57
|
+
const packageJsonPath = path.join(outputDir, "package.json");
|
|
58
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
|
|
59
|
+
packageJson.name = `fhevm-example-${exampleName}`;
|
|
60
|
+
packageJson.description = example.description;
|
|
61
|
+
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
|
62
|
+
// Update hardhat.config.ts - remove FHECounter task import
|
|
63
|
+
const configPath = path.join(outputDir, "hardhat.config.ts");
|
|
64
|
+
let configContent = fs.readFileSync(configPath, "utf-8");
|
|
65
|
+
configContent = configContent.replace(/import "\.\/tasks\/FHECounter";\n?/g, "");
|
|
66
|
+
fs.writeFileSync(configPath, configContent);
|
|
67
|
+
// Remove FHECounter task
|
|
68
|
+
const oldTaskFile = path.join(outputDir, "tasks", "FHECounter.ts");
|
|
69
|
+
if (fs.existsSync(oldTaskFile)) {
|
|
70
|
+
fs.unlinkSync(oldTaskFile);
|
|
71
|
+
}
|
|
72
|
+
// Generate README
|
|
73
|
+
fs.writeFileSync(path.join(outputDir, "README.md"), generateExampleReadme(exampleName, example.description, contractName));
|
|
74
|
+
}
|
|
75
|
+
// =============================================================================
|
|
76
|
+
// Create Category Project
|
|
77
|
+
// =============================================================================
|
|
78
|
+
async function createCategoryProject(categoryName, outputDir, tempRepoPath) {
|
|
79
|
+
const category = CATEGORIES[categoryName];
|
|
80
|
+
if (!category) {
|
|
81
|
+
throw new Error(`Unknown category: ${categoryName}`);
|
|
82
|
+
}
|
|
83
|
+
const templateDir = path.join(tempRepoPath, "fhevm-hardhat-template");
|
|
84
|
+
// Copy template
|
|
85
|
+
copyDirectoryRecursive(templateDir, outputDir);
|
|
86
|
+
// Clear template files
|
|
87
|
+
const templateContract = path.join(outputDir, "contracts", "FHECounter.sol");
|
|
88
|
+
if (fs.existsSync(templateContract))
|
|
89
|
+
fs.unlinkSync(templateContract);
|
|
90
|
+
// Remove .gitkeep from contracts
|
|
91
|
+
const contractsGitkeep = path.join(outputDir, "contracts", ".gitkeep");
|
|
92
|
+
if (fs.existsSync(contractsGitkeep))
|
|
93
|
+
fs.unlinkSync(contractsGitkeep);
|
|
94
|
+
// Clear test directory
|
|
95
|
+
const testDir = path.join(outputDir, "test");
|
|
96
|
+
fs.readdirSync(testDir).forEach((file) => {
|
|
97
|
+
if (file.endsWith(".ts") || file === ".gitkeep") {
|
|
98
|
+
fs.unlinkSync(path.join(testDir, file));
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
// Download contracts and tests
|
|
102
|
+
const contractNames = [];
|
|
103
|
+
for (const item of category.contracts) {
|
|
104
|
+
const contractName = getContractName(item.sol);
|
|
105
|
+
if (contractName) {
|
|
106
|
+
contractNames.push(contractName);
|
|
107
|
+
await downloadFileFromGitHub(item.sol, path.join(outputDir, "contracts", `${contractName}.sol`));
|
|
108
|
+
}
|
|
109
|
+
if (item.test) {
|
|
110
|
+
await downloadFileFromGitHub(item.test, path.join(outputDir, "test", path.basename(item.test)));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Update hardhat.config.ts - remove FHECounter task import
|
|
114
|
+
const configPath = path.join(outputDir, "hardhat.config.ts");
|
|
115
|
+
let configContent = fs.readFileSync(configPath, "utf-8");
|
|
116
|
+
configContent = configContent.replace(/import "\.\/tasks\/FHECounter";\n?/g, "");
|
|
117
|
+
fs.writeFileSync(configPath, configContent);
|
|
118
|
+
// Remove FHECounter task
|
|
119
|
+
const oldTaskFile = path.join(outputDir, "tasks", "FHECounter.ts");
|
|
120
|
+
if (fs.existsSync(oldTaskFile)) {
|
|
121
|
+
fs.unlinkSync(oldTaskFile);
|
|
122
|
+
}
|
|
123
|
+
// Update package.json
|
|
124
|
+
const packageJsonPath = path.join(outputDir, "package.json");
|
|
125
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
|
|
126
|
+
packageJson.name = `fhevm-examples-${categoryName}`;
|
|
127
|
+
packageJson.description = category.description;
|
|
128
|
+
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
|
129
|
+
// Generate README
|
|
130
|
+
fs.writeFileSync(path.join(outputDir, "README.md"), generateCategoryReadme(category.name, category.description, contractNames));
|
|
131
|
+
}
|
|
132
|
+
// =============================================================================
|
|
133
|
+
// Install and Test
|
|
134
|
+
// =============================================================================
|
|
135
|
+
async function runInstallAndTest(projectPath) {
|
|
136
|
+
const steps = [
|
|
137
|
+
{
|
|
138
|
+
name: "Installing dependencies",
|
|
139
|
+
cmd: "npm",
|
|
140
|
+
args: ["install"],
|
|
141
|
+
showOutput: false,
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
name: "Compiling contracts",
|
|
145
|
+
cmd: "npm",
|
|
146
|
+
args: ["run", "compile"],
|
|
147
|
+
showOutput: false,
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
name: "Running tests",
|
|
151
|
+
cmd: "npm",
|
|
152
|
+
args: ["run", "test"],
|
|
153
|
+
showOutput: true,
|
|
154
|
+
},
|
|
155
|
+
];
|
|
156
|
+
for (const step of steps) {
|
|
157
|
+
const s = p.spinner();
|
|
158
|
+
s.start(step.name + "...");
|
|
159
|
+
try {
|
|
160
|
+
const output = await runCommand(step.cmd, step.args, projectPath);
|
|
161
|
+
if (step.showOutput) {
|
|
162
|
+
const testResults = extractTestResults(output);
|
|
163
|
+
if (testResults) {
|
|
164
|
+
s.stop(pc.green(`✓ ${step.name} - ${testResults}`));
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
s.stop(pc.green(`✓ ${step.name} completed`));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
s.stop(pc.green(`✓ ${step.name} completed`));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
s.stop(pc.red(`✗ ${step.name} failed`));
|
|
176
|
+
if (error instanceof Error) {
|
|
177
|
+
p.log.error(error.message);
|
|
178
|
+
}
|
|
179
|
+
throw new Error(`${step.name} failed`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
p.log.success(pc.green("All steps completed successfully!"));
|
|
183
|
+
}
|
|
184
|
+
function showQuickStart(relativePath) {
|
|
185
|
+
p.note(`${pc.dim("$")} cd ${relativePath}\n${pc.dim("$")} npm install\n${pc.dim("$")} npm run compile\n${pc.dim("$")} npm run test`, "🚀 Quick Start");
|
|
186
|
+
}
|
|
187
|
+
async function askInstallAndTest(resolvedOutput, relativePath) {
|
|
188
|
+
const shouldInstall = await p.confirm({
|
|
189
|
+
message: "Install dependencies and run tests?",
|
|
190
|
+
initialValue: false,
|
|
191
|
+
});
|
|
192
|
+
if (p.isCancel(shouldInstall)) {
|
|
193
|
+
showQuickStart(relativePath);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (shouldInstall) {
|
|
197
|
+
p.log.message("");
|
|
198
|
+
await runInstallAndTest(resolvedOutput);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
showQuickStart(relativePath);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// =============================================================================
|
|
205
|
+
// Interactive Mode
|
|
206
|
+
// =============================================================================
|
|
207
|
+
async function runInteractiveMode() {
|
|
208
|
+
console.clear();
|
|
209
|
+
p.intro(pc.bgCyan(pc.black(" 🔐 Create FHEVM Example ")));
|
|
210
|
+
const mode = await p.select({
|
|
211
|
+
message: "What would you like to create?",
|
|
212
|
+
options: [
|
|
213
|
+
{
|
|
214
|
+
value: "single",
|
|
215
|
+
label: "Single example",
|
|
216
|
+
hint: "One example contract with tests",
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
value: "category",
|
|
220
|
+
label: "Category project",
|
|
221
|
+
hint: "Multiple examples by category",
|
|
222
|
+
},
|
|
223
|
+
],
|
|
224
|
+
});
|
|
225
|
+
if (p.isCancel(mode)) {
|
|
226
|
+
p.cancel("Operation cancelled.");
|
|
227
|
+
process.exit(0);
|
|
228
|
+
}
|
|
229
|
+
let exampleName = "";
|
|
230
|
+
let categoryName = "";
|
|
231
|
+
let projectName = "";
|
|
232
|
+
if (mode === "single") {
|
|
233
|
+
// Group examples by category
|
|
234
|
+
const grouped = {};
|
|
235
|
+
for (const [key, config] of Object.entries(EXAMPLES)) {
|
|
236
|
+
if (!grouped[config.category]) {
|
|
237
|
+
grouped[config.category] = [];
|
|
238
|
+
}
|
|
239
|
+
grouped[config.category].push({
|
|
240
|
+
value: key,
|
|
241
|
+
label: key,
|
|
242
|
+
hint: config.description.slice(0, 50) +
|
|
243
|
+
(config.description.length > 50 ? "..." : ""),
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
// Flatten to options
|
|
247
|
+
const options = [];
|
|
248
|
+
for (const [, items] of Object.entries(grouped)) {
|
|
249
|
+
options.push(...items);
|
|
250
|
+
}
|
|
251
|
+
exampleName = await p.select({
|
|
252
|
+
message: "Select an example:",
|
|
253
|
+
options,
|
|
254
|
+
});
|
|
255
|
+
if (p.isCancel(exampleName)) {
|
|
256
|
+
p.cancel("Operation cancelled.");
|
|
257
|
+
process.exit(0);
|
|
258
|
+
}
|
|
259
|
+
projectName = await p.text({
|
|
260
|
+
message: "Project name:",
|
|
261
|
+
placeholder: `my-${exampleName}-project`,
|
|
262
|
+
defaultValue: `my-${exampleName}-project`,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
categoryName = await p.select({
|
|
267
|
+
message: "Select a category:",
|
|
268
|
+
options: Object.entries(CATEGORIES).map(([key, config]) => ({
|
|
269
|
+
value: key,
|
|
270
|
+
label: config.name,
|
|
271
|
+
hint: `${config.contracts.length} contracts`,
|
|
272
|
+
})),
|
|
273
|
+
});
|
|
274
|
+
if (p.isCancel(categoryName)) {
|
|
275
|
+
p.cancel("Operation cancelled.");
|
|
276
|
+
process.exit(0);
|
|
277
|
+
}
|
|
278
|
+
projectName = await p.text({
|
|
279
|
+
message: "Project name:",
|
|
280
|
+
placeholder: `my-${categoryName}-project`,
|
|
281
|
+
defaultValue: `my-${categoryName}-project`,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
if (p.isCancel(projectName)) {
|
|
285
|
+
p.cancel("Operation cancelled.");
|
|
286
|
+
process.exit(0);
|
|
287
|
+
}
|
|
288
|
+
const outputDir = await p.text({
|
|
289
|
+
message: "Output directory:",
|
|
290
|
+
placeholder: `./${projectName}`,
|
|
291
|
+
defaultValue: `./${projectName}`,
|
|
292
|
+
});
|
|
293
|
+
if (p.isCancel(outputDir)) {
|
|
294
|
+
p.cancel("Operation cancelled.");
|
|
295
|
+
process.exit(0);
|
|
296
|
+
}
|
|
297
|
+
const resolvedOutput = path.resolve(process.cwd(), outputDir);
|
|
298
|
+
if (fs.existsSync(resolvedOutput)) {
|
|
299
|
+
p.log.error(`Directory already exists: ${resolvedOutput}`);
|
|
300
|
+
process.exit(1);
|
|
301
|
+
}
|
|
302
|
+
// Clone repository to temp directory
|
|
303
|
+
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "fhevm-"));
|
|
304
|
+
const s = p.spinner();
|
|
305
|
+
try {
|
|
306
|
+
s.start("Downloading template...");
|
|
307
|
+
const tempRepoPath = await cloneTemplate(tempDir);
|
|
308
|
+
s.message("Initializing submodules...");
|
|
309
|
+
await initSubmodule(tempRepoPath);
|
|
310
|
+
s.message("Creating project...");
|
|
311
|
+
if (mode === "single") {
|
|
312
|
+
await createSingleExample(exampleName, resolvedOutput, tempRepoPath);
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
await createCategoryProject(categoryName, resolvedOutput, tempRepoPath);
|
|
316
|
+
}
|
|
317
|
+
s.stop("Project created successfully!");
|
|
318
|
+
const relativePath = path.relative(process.cwd(), resolvedOutput);
|
|
319
|
+
p.log.success(`📁 Created: ${pc.cyan(relativePath)}`);
|
|
320
|
+
if (mode === "single") {
|
|
321
|
+
const exampleConfig = EXAMPLES[exampleName];
|
|
322
|
+
p.log.info(`📝 Example: ${pc.yellow(exampleConfig?.title || exampleName)}`);
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
const categoryConfig = CATEGORIES[categoryName];
|
|
326
|
+
p.log.info(`📦 Category: ${pc.yellow(categoryConfig?.name || categoryName)}`);
|
|
327
|
+
p.log.info(`📄 Contracts: ${pc.green(String(categoryConfig?.contracts.length || 0))}`);
|
|
328
|
+
}
|
|
329
|
+
await askInstallAndTest(resolvedOutput, relativePath);
|
|
330
|
+
}
|
|
331
|
+
catch (error) {
|
|
332
|
+
s.stop("Failed to create project");
|
|
333
|
+
p.log.error(error instanceof Error ? error.message : String(error));
|
|
334
|
+
process.exit(1);
|
|
335
|
+
}
|
|
336
|
+
finally {
|
|
337
|
+
// Cleanup temp directory
|
|
338
|
+
if (fs.existsSync(tempDir)) {
|
|
339
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
p.outro(pc.green("🎉 Happy coding with FHEVM!"));
|
|
343
|
+
}
|
|
344
|
+
// =============================================================================
|
|
345
|
+
// Direct Mode (CLI Arguments)
|
|
346
|
+
// =============================================================================
|
|
347
|
+
function showHelp() {
|
|
348
|
+
console.log(`
|
|
349
|
+
${pc.cyan("create-fhevm-example")}
|
|
350
|
+
|
|
351
|
+
${pc.yellow("Usage:")}
|
|
352
|
+
npx create-fhevm-example ${pc.dim("# Interactive mode")}
|
|
353
|
+
npx create-fhevm-example --example <name> ${pc.dim("# Create single example")}
|
|
354
|
+
npx create-fhevm-example --category <name> ${pc.dim("# Create category project")}
|
|
355
|
+
|
|
356
|
+
${pc.yellow("Options:")}
|
|
357
|
+
--example <name> Create a single example project
|
|
358
|
+
--category <name> Create a category project
|
|
359
|
+
--output <dir> Output directory (default: ./<project-name>)
|
|
360
|
+
--install Auto-install dependencies
|
|
361
|
+
--test Auto-run tests (requires --install)
|
|
362
|
+
--help, -h Show this help message
|
|
363
|
+
|
|
364
|
+
${pc.yellow("Examples:")}
|
|
365
|
+
${pc.green("npx create-fhevm-example --example fhe-counter")}
|
|
366
|
+
${pc.green("npx create-fhevm-example --category basic --output ./my-project")}
|
|
367
|
+
${pc.green("npx create-fhevm-example --example fhe-counter --install --test")}
|
|
368
|
+
|
|
369
|
+
${pc.yellow("Available examples:")}
|
|
370
|
+
${Object.keys(EXAMPLES).join(", ")}
|
|
371
|
+
|
|
372
|
+
${pc.yellow("Available categories:")}
|
|
373
|
+
${Object.keys(CATEGORIES).join(", ")}
|
|
374
|
+
`);
|
|
375
|
+
}
|
|
376
|
+
async function runDirectMode(args) {
|
|
377
|
+
const parsedArgs = {};
|
|
378
|
+
for (let i = 0; i < args.length; i++) {
|
|
379
|
+
const arg = args[i];
|
|
380
|
+
if (arg.startsWith("--")) {
|
|
381
|
+
const key = arg.slice(2);
|
|
382
|
+
const nextArg = args[i + 1];
|
|
383
|
+
if (nextArg && !nextArg.startsWith("--")) {
|
|
384
|
+
parsedArgs[key] = nextArg;
|
|
385
|
+
i++;
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
parsedArgs[key] = true;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
else if (arg === "-h") {
|
|
392
|
+
parsedArgs["help"] = true;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
if (parsedArgs["help"]) {
|
|
396
|
+
showHelp();
|
|
397
|
+
return;
|
|
398
|
+
}
|
|
399
|
+
const exampleName = parsedArgs["example"];
|
|
400
|
+
const categoryName = parsedArgs["category"];
|
|
401
|
+
const outputDir = parsedArgs["output"];
|
|
402
|
+
const shouldInstall = parsedArgs["install"] === true;
|
|
403
|
+
const shouldTest = parsedArgs["test"] === true;
|
|
404
|
+
if (!exampleName && !categoryName) {
|
|
405
|
+
console.error(pc.red("Error: Either --example or --category is required"));
|
|
406
|
+
showHelp();
|
|
407
|
+
process.exit(1);
|
|
408
|
+
}
|
|
409
|
+
if (exampleName && categoryName) {
|
|
410
|
+
console.error(pc.red("Error: Cannot use both --example and --category"));
|
|
411
|
+
process.exit(1);
|
|
412
|
+
}
|
|
413
|
+
const mode = exampleName ? "example" : "category";
|
|
414
|
+
const name = (exampleName || categoryName);
|
|
415
|
+
if (mode === "example" && !EXAMPLES[name]) {
|
|
416
|
+
console.error(pc.red(`Error: Unknown example "${name}"`));
|
|
417
|
+
console.log("Available:", Object.keys(EXAMPLES).join(", "));
|
|
418
|
+
process.exit(1);
|
|
419
|
+
}
|
|
420
|
+
if (mode === "category" && !CATEGORIES[name]) {
|
|
421
|
+
console.error(pc.red(`Error: Unknown category "${name}"`));
|
|
422
|
+
console.log("Available:", Object.keys(CATEGORIES).join(", "));
|
|
423
|
+
process.exit(1);
|
|
424
|
+
}
|
|
425
|
+
const defaultOutput = mode === "example" ? `./my-${name}-project` : `./my-${name}-examples`;
|
|
426
|
+
const output = outputDir || defaultOutput;
|
|
427
|
+
const resolved = path.resolve(process.cwd(), output);
|
|
428
|
+
if (fs.existsSync(resolved)) {
|
|
429
|
+
console.error(pc.red(`Error: Directory already exists: ${resolved}`));
|
|
430
|
+
process.exit(1);
|
|
431
|
+
}
|
|
432
|
+
// Clone repository to temp directory
|
|
433
|
+
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "fhevm-"));
|
|
434
|
+
try {
|
|
435
|
+
console.log(pc.cyan(`Creating ${mode}: ${name}`));
|
|
436
|
+
console.log(pc.dim("Downloading template..."));
|
|
437
|
+
const tempRepoPath = await cloneTemplate(tempDir);
|
|
438
|
+
console.log(pc.dim("Initializing submodules..."));
|
|
439
|
+
await initSubmodule(tempRepoPath);
|
|
440
|
+
console.log(pc.dim("Creating project..."));
|
|
441
|
+
if (mode === "example") {
|
|
442
|
+
await createSingleExample(name, resolved, tempRepoPath);
|
|
443
|
+
}
|
|
444
|
+
else {
|
|
445
|
+
await createCategoryProject(name, resolved, tempRepoPath);
|
|
446
|
+
}
|
|
447
|
+
console.log(pc.green(`✓ Created: ${output}`));
|
|
448
|
+
if (shouldInstall) {
|
|
449
|
+
console.log(pc.dim("\nInstalling dependencies..."));
|
|
450
|
+
await runInstallAndTest(resolved);
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
console.log(pc.dim(`\nNext: cd ${output} && npm install && npm run compile && npm run test`));
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
catch (error) {
|
|
457
|
+
console.error(pc.red("Error:"), error instanceof Error ? error.message : String(error));
|
|
458
|
+
process.exit(1);
|
|
459
|
+
}
|
|
460
|
+
finally {
|
|
461
|
+
// Cleanup temp directory
|
|
462
|
+
if (fs.existsSync(tempDir)) {
|
|
463
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
// =============================================================================
|
|
468
|
+
// Main
|
|
469
|
+
// =============================================================================
|
|
470
|
+
async function main() {
|
|
471
|
+
const args = process.argv.slice(2);
|
|
472
|
+
if (args.length > 0) {
|
|
473
|
+
await runDirectMode(args);
|
|
474
|
+
}
|
|
475
|
+
else {
|
|
476
|
+
await runInteractiveMode();
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
main().catch((error) => {
|
|
480
|
+
console.error(pc.red("Fatal error:"), error);
|
|
481
|
+
process.exit(1);
|
|
482
|
+
});
|
|
483
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for creating FHEVM example projects
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Get contract name from file path
|
|
6
|
+
*/
|
|
7
|
+
export declare function getContractName(contractPath: string): string | null;
|
|
8
|
+
/**
|
|
9
|
+
* Recursively copy directory
|
|
10
|
+
*/
|
|
11
|
+
export declare function copyDirectoryRecursive(src: string, dest: string): void;
|
|
12
|
+
/**
|
|
13
|
+
* Download file from GitHub repository
|
|
14
|
+
*/
|
|
15
|
+
export declare function downloadFileFromGitHub(filePath: string, outputPath: string): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Clone template repository to temporary directory
|
|
18
|
+
*/
|
|
19
|
+
export declare function cloneTemplate(tempDir: string): Promise<string>;
|
|
20
|
+
/**
|
|
21
|
+
* Initialize git submodule for template
|
|
22
|
+
*/
|
|
23
|
+
export declare function initSubmodule(repoPath: string): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Run a shell command
|
|
26
|
+
*/
|
|
27
|
+
export declare function runCommand(cmd: string, args: string[], cwd: string): Promise<string>;
|
|
28
|
+
/**
|
|
29
|
+
* Extract test results from npm test output
|
|
30
|
+
*/
|
|
31
|
+
export declare function extractTestResults(output: string): string | null;
|
|
32
|
+
/**
|
|
33
|
+
* Generate README for single example project
|
|
34
|
+
*/
|
|
35
|
+
export declare function generateExampleReadme(exampleName: string, description: string, contractName: string): string;
|
|
36
|
+
/**
|
|
37
|
+
* Generate README for category project
|
|
38
|
+
*/
|
|
39
|
+
export declare function generateCategoryReadme(categoryName: string, description: string, contractNames: string[]): string;
|
|
40
|
+
/**
|
|
41
|
+
* Generate deploy script
|
|
42
|
+
*/
|
|
43
|
+
export declare function generateDeployScript(contractName: string): string;
|
|
44
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH;;GAEG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGnE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAqBtE;AAMD;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmCpE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BnE;AAMD;;GAEG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CA+BjB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAchE;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,MAAM,CAqDR;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EAAE,GACtB,MAAM,CA2DR;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAqBjE"}
|