create-fhevm-example 1.2.3 → 1.3.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.
Files changed (65) hide show
  1. package/README.md +72 -146
  2. package/dist/scripts/add-mode.d.ts +11 -0
  3. package/dist/scripts/add-mode.d.ts.map +1 -0
  4. package/dist/{add-mode.js → scripts/add-mode.js} +84 -58
  5. package/dist/scripts/builders.d.ts +19 -0
  6. package/dist/scripts/builders.d.ts.map +1 -0
  7. package/dist/scripts/builders.js +211 -0
  8. package/dist/{config.d.ts → scripts/config.d.ts} +24 -3
  9. package/dist/scripts/config.d.ts.map +1 -0
  10. package/dist/scripts/config.js +465 -0
  11. package/dist/scripts/doctor.d.ts +11 -0
  12. package/dist/scripts/doctor.d.ts.map +1 -0
  13. package/dist/scripts/doctor.js +165 -0
  14. package/dist/scripts/generate-config.d.ts +9 -0
  15. package/dist/scripts/generate-config.d.ts.map +1 -0
  16. package/dist/scripts/generate-config.js +323 -0
  17. package/dist/scripts/generate-docs.d.ts +10 -0
  18. package/dist/scripts/generate-docs.d.ts.map +1 -0
  19. package/dist/scripts/generate-docs.js +190 -0
  20. package/dist/scripts/index.d.ts +12 -0
  21. package/dist/scripts/index.d.ts.map +1 -0
  22. package/dist/scripts/index.js +384 -0
  23. package/dist/scripts/maintenance.d.ts +13 -0
  24. package/dist/scripts/maintenance.d.ts.map +1 -0
  25. package/dist/scripts/maintenance.js +271 -0
  26. package/dist/{prompts.d.ts → scripts/ui.d.ts} +8 -7
  27. package/dist/scripts/ui.d.ts.map +1 -0
  28. package/dist/scripts/ui.js +170 -0
  29. package/dist/scripts/utils.d.ts +86 -0
  30. package/dist/scripts/utils.d.ts.map +1 -0
  31. package/dist/scripts/utils.js +525 -0
  32. package/package.json +25 -13
  33. package/dist/add-mode.d.ts +0 -21
  34. package/dist/add-mode.d.ts.map +0 -1
  35. package/dist/add-mode.js.map +0 -1
  36. package/dist/builders.d.ts +0 -30
  37. package/dist/builders.d.ts.map +0 -1
  38. package/dist/builders.js +0 -195
  39. package/dist/builders.js.map +0 -1
  40. package/dist/commands.d.ts +0 -19
  41. package/dist/commands.d.ts.map +0 -1
  42. package/dist/commands.js +0 -91
  43. package/dist/commands.js.map +0 -1
  44. package/dist/config.d.ts.map +0 -1
  45. package/dist/config.js +0 -398
  46. package/dist/config.js.map +0 -1
  47. package/dist/constants.d.ts +0 -16
  48. package/dist/constants.d.ts.map +0 -1
  49. package/dist/constants.js +0 -40
  50. package/dist/constants.js.map +0 -1
  51. package/dist/index.d.ts +0 -20
  52. package/dist/index.d.ts.map +0 -1
  53. package/dist/index.js +0 -337
  54. package/dist/index.js.map +0 -1
  55. package/dist/prompts.d.ts.map +0 -1
  56. package/dist/prompts.js +0 -79
  57. package/dist/prompts.js.map +0 -1
  58. package/dist/ui.d.ts +0 -35
  59. package/dist/ui.d.ts.map +0 -1
  60. package/dist/ui.js +0 -155
  61. package/dist/ui.js.map +0 -1
  62. package/dist/utils.d.ts +0 -99
  63. package/dist/utils.d.ts.map +0 -1
  64. package/dist/utils.js +0 -285
  65. package/dist/utils.js.map +0 -1
@@ -0,0 +1,525 @@
1
+ "use strict";
2
+ /**
3
+ * Shared Utilities - Helper functions for the FHEVM Example Factory.
4
+ *
5
+ * Contains common logic for file system operations, string formatting,
6
+ * error handling, and terminal logging used throughout the project.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __importDefault = (this && this.__importDefault) || function (mod) {
42
+ return (mod && mod.__esModule) ? mod : { "default": mod };
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.log = exports.ERROR_MESSAGES = exports.TEST_TYPES_CONTENT = exports.CATEGORY_ORDER = exports.FHEVM_DEPENDENCIES = exports.EXCLUDE_DIRS = exports.MAX_DESCRIPTION_LENGTH = exports.TEMPLATE_DIR_NAME = exports.CATEGORY_ICON = void 0;
46
+ exports.handleError = handleError;
47
+ exports.getRootDir = getRootDir;
48
+ exports.getTemplateDir = getTemplateDir;
49
+ exports.copyDirectoryRecursive = copyDirectoryRecursive;
50
+ exports.toKebabCase = toKebabCase;
51
+ exports.contractNameToExampleName = contractNameToExampleName;
52
+ exports.contractNameToTitle = contractNameToTitle;
53
+ exports.formatCategoryName = formatCategoryName;
54
+ exports.getContractName = getContractName;
55
+ exports.validateExample = validateExample;
56
+ exports.validateCategory = validateCategory;
57
+ exports.validateDirectoryNotExists = validateDirectoryNotExists;
58
+ exports.cleanupTemplate = cleanupTemplate;
59
+ exports.generateDeployScript = generateDeployScript;
60
+ exports.generateGitBookMarkdown = generateGitBookMarkdown;
61
+ exports.updateProjectPackageJson = updateProjectPackageJson;
62
+ exports.runCommand = runCommand;
63
+ exports.runCommandWithStatus = runCommandWithStatus;
64
+ exports.extractTestResults = extractTestResults;
65
+ exports.extractErrorMessage = extractErrorMessage;
66
+ exports.downloadFileFromGitHub = downloadFileFromGitHub;
67
+ exports.cloneTemplate = cloneTemplate;
68
+ exports.initSubmodule = initSubmodule;
69
+ const fs = __importStar(require("fs"));
70
+ const path = __importStar(require("path"));
71
+ const child_process_1 = require("child_process");
72
+ const picocolors_1 = __importDefault(require("picocolors"));
73
+ const config_1 = require("./config");
74
+ exports.CATEGORY_ICON = "📁";
75
+ /** Template directory name within the cloned repo */
76
+ exports.TEMPLATE_DIR_NAME = "fhevm-hardhat-template";
77
+ /** Maximum description length for UI display */
78
+ exports.MAX_DESCRIPTION_LENGTH = 80;
79
+ /** Directories to exclude when copying template */
80
+ exports.EXCLUDE_DIRS = [
81
+ "node_modules",
82
+ "artifacts",
83
+ "cache",
84
+ "coverage",
85
+ "types",
86
+ "dist",
87
+ ".git",
88
+ ];
89
+ /** FHEVM package versions for --add mode */
90
+ exports.FHEVM_DEPENDENCIES = {
91
+ dependencies: {
92
+ "encrypted-types": "^0.0.4",
93
+ "@fhevm/solidity": "^0.9.1",
94
+ },
95
+ devDependencies: {
96
+ "@fhevm/hardhat-plugin": "^0.3.0-1",
97
+ "@zama-fhe/relayer-sdk": "^0.3.0-5",
98
+ },
99
+ };
100
+ exports.CATEGORY_ORDER = [
101
+ "Basic - Encryption",
102
+ "Basic - Decryption",
103
+ "Basic - FHE Operations",
104
+ "Concepts",
105
+ "Gaming",
106
+ "Openzeppelin",
107
+ "Advanced",
108
+ ];
109
+ exports.TEST_TYPES_CONTENT = `import type { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers";
110
+
111
+ /**
112
+ * Common signers interface used across test files
113
+ */
114
+ export interface Signers {
115
+ owner: HardhatEthersSigner;
116
+ alice: HardhatEthersSigner;
117
+ }
118
+ `;
119
+ exports.ERROR_MESSAGES = {
120
+ EXAMPLE_REQUIRED: "Error: Either --example or --category is required",
121
+ BOTH_SPECIFIED: "Error: Cannot use both --example and --category",
122
+ UNKNOWN_EXAMPLE: (name) => `Error: Unknown example "${name}"`,
123
+ UNKNOWN_CATEGORY: (name) => `Error: Unknown category "${name}"`,
124
+ DIR_EXISTS: (path) => `Error: Directory already exists: ${path}`,
125
+ NOT_HARDHAT: "This directory does not contain a valid Hardhat project.",
126
+ CONFIG_NOT_FOUND: "hardhat.config.ts or hardhat.config.js not found",
127
+ CONTRACT_NAME_FAILED: "Could not extract contract name",
128
+ };
129
+ // =============================================================================
130
+ // Logging Utility
131
+ // =============================================================================
132
+ exports.log = {
133
+ success: (msg) => console.log(picocolors_1.default.green(msg)),
134
+ error: (msg) => console.error(picocolors_1.default.red(msg)),
135
+ info: (msg) => console.log(picocolors_1.default.cyan(msg)),
136
+ dim: (msg) => console.log(picocolors_1.default.dim(msg)),
137
+ message: (msg) => console.log(msg),
138
+ };
139
+ /**
140
+ * Standardized error handler for CLI - logs error and exits
141
+ */
142
+ function handleError(error, exitCode = 1) {
143
+ const message = error instanceof Error ? error.message : String(error);
144
+ exports.log.error(message);
145
+ process.exit(exitCode);
146
+ }
147
+ // =============================================================================
148
+ // File System Utilities
149
+ // =============================================================================
150
+ /** Resolves root directory of the project */
151
+ function getRootDir() {
152
+ return path.resolve(__dirname, "..");
153
+ }
154
+ /** Resolves template directory path */
155
+ function getTemplateDir() {
156
+ return path.join(getRootDir(), exports.TEMPLATE_DIR_NAME);
157
+ }
158
+ /** Copies directory recursively, excluding specified directories */
159
+ function copyDirectoryRecursive(source, destination, excludeDirs = exports.EXCLUDE_DIRS) {
160
+ if (!fs.existsSync(destination)) {
161
+ fs.mkdirSync(destination, { recursive: true });
162
+ }
163
+ const items = fs.readdirSync(source);
164
+ items.forEach((item) => {
165
+ const sourcePath = path.join(source, item);
166
+ const destPath = path.join(destination, item);
167
+ const stat = fs.statSync(sourcePath);
168
+ if (stat.isDirectory()) {
169
+ if (excludeDirs.includes(item)) {
170
+ return;
171
+ }
172
+ copyDirectoryRecursive(sourcePath, destPath, excludeDirs);
173
+ }
174
+ else {
175
+ fs.copyFileSync(sourcePath, destPath);
176
+ }
177
+ });
178
+ }
179
+ // =============================================================================
180
+ // Naming Utilities
181
+ // =============================================================================
182
+ function toKebabCase(str) {
183
+ return str
184
+ .replace(/([a-z])([A-Z])/g, "$1-$2")
185
+ .replace(/([0-9])([A-Z])/g, "$1-$2")
186
+ .replace(/([A-Z]+)([A-Z][a-z])/g, "$1-$2")
187
+ .toLowerCase();
188
+ }
189
+ function contractNameToExampleName(contractName) {
190
+ return toKebabCase(contractName);
191
+ }
192
+ function contractNameToTitle(contractName) {
193
+ return contractName
194
+ .replace(/([a-z])([A-Z])/g, "$1 $2")
195
+ .replace(/([0-9])([A-Z])/g, "$1 $2")
196
+ .replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2");
197
+ }
198
+ function formatCategoryName(folderName) {
199
+ return folderName
200
+ .replace(/\bfhe\b/gi, "FHE")
201
+ .replace(/-/g, " ")
202
+ .replace(/\b\w/g, (char) => char.toUpperCase());
203
+ }
204
+ function getContractName(contractPathOrContent) {
205
+ let content;
206
+ if (contractPathOrContent.includes("contract ") ||
207
+ contractPathOrContent.includes("pragma solidity")) {
208
+ content = contractPathOrContent;
209
+ }
210
+ else {
211
+ const fullPath = contractPathOrContent.startsWith("/")
212
+ ? contractPathOrContent
213
+ : path.join(getRootDir(), contractPathOrContent);
214
+ if (!fs.existsSync(fullPath)) {
215
+ const match = contractPathOrContent.match(/([^/]+)\.sol$/);
216
+ return match ? match[1] : null;
217
+ }
218
+ content = fs.readFileSync(fullPath, "utf-8");
219
+ }
220
+ const match = content.match(/^\s*contract\s+(\w+)(?:\s+is\s+|\s*\{)/m);
221
+ return match ? match[1] : null;
222
+ }
223
+ // =============================================================================
224
+ // Validation Functions
225
+ // =============================================================================
226
+ function validateExample(name) {
227
+ if (!config_1.EXAMPLES[name]) {
228
+ throw new Error(exports.ERROR_MESSAGES.UNKNOWN_EXAMPLE(name));
229
+ }
230
+ }
231
+ function validateCategory(name) {
232
+ if (!config_1.CATEGORIES[name]) {
233
+ throw new Error(exports.ERROR_MESSAGES.UNKNOWN_CATEGORY(name));
234
+ }
235
+ }
236
+ function validateDirectoryNotExists(dirPath) {
237
+ if (fs.existsSync(dirPath)) {
238
+ throw new Error(exports.ERROR_MESSAGES.DIR_EXISTS(dirPath));
239
+ }
240
+ }
241
+ // =============================================================================
242
+ // Template & Scaffolding Utilities
243
+ // =============================================================================
244
+ function cleanupTemplate(outputDir) {
245
+ const gitDir = path.join(outputDir, ".git");
246
+ if (fs.existsSync(gitDir)) {
247
+ fs.rmSync(gitDir, { recursive: true, force: true });
248
+ }
249
+ const githubDir = path.join(outputDir, ".github");
250
+ if (fs.existsSync(githubDir)) {
251
+ fs.rmSync(githubDir, { recursive: true, force: true });
252
+ }
253
+ const templateContract = path.join(outputDir, "contracts", "FHECounter.sol");
254
+ if (fs.existsSync(templateContract)) {
255
+ fs.unlinkSync(templateContract);
256
+ }
257
+ const contractsGitkeep = path.join(outputDir, "contracts", ".gitkeep");
258
+ if (fs.existsSync(contractsGitkeep)) {
259
+ fs.unlinkSync(contractsGitkeep);
260
+ }
261
+ const testDir = path.join(outputDir, "test");
262
+ if (fs.existsSync(testDir)) {
263
+ fs.readdirSync(testDir).forEach((file) => {
264
+ if (file.endsWith(".ts") || file === ".gitkeep") {
265
+ fs.unlinkSync(path.join(testDir, file));
266
+ }
267
+ });
268
+ }
269
+ const configPath = path.join(outputDir, "hardhat.config.ts");
270
+ if (fs.existsSync(configPath)) {
271
+ let configContent = fs.readFileSync(configPath, "utf-8");
272
+ configContent = configContent.replace(/import "\.\/tasks\/FHECounter";\n?/g, "");
273
+ fs.writeFileSync(configPath, configContent);
274
+ }
275
+ const oldTaskFile = path.join(outputDir, "tasks", "FHECounter.ts");
276
+ if (fs.existsSync(oldTaskFile)) {
277
+ fs.unlinkSync(oldTaskFile);
278
+ }
279
+ fs.writeFileSync(path.join(outputDir, "test", "types.ts"), exports.TEST_TYPES_CONTENT);
280
+ }
281
+ function generateDeployScript(contractName) {
282
+ return `import { DeployFunction } from "hardhat-deploy/types";
283
+ import { HardhatRuntimeEnvironment } from "hardhat/types";
284
+
285
+ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
286
+ const { deployer } = await hre.getNamedAccounts();
287
+ const { deploy } = hre.deployments;
288
+
289
+ console.log("\\n🚀 Deploying ${contractName}...");
290
+ console.log(\`📍 Network: \${hre.network.name}\`);
291
+ console.log(\`👤 Deployer: \${deployer}\\n\`);
292
+
293
+ const deployed = await deploy("${contractName}", {
294
+ from: deployer,
295
+ args: [],
296
+ log: true,
297
+ });
298
+
299
+ console.log("\\n✅ Deployment Complete!");
300
+ console.log(\`📄 Contract: ${contractName}\`);
301
+ console.log(\`📍 Contract Address: \${deployed.address}\`);
302
+
303
+ if (deployed.newlyDeployed) {
304
+ console.log(\`⛽ Gas Used: \${deployed.receipt?.gasUsed}\`);
305
+ } else {
306
+ console.log("ℹ️ Contract was already deployed");
307
+ }
308
+ console.log("");
309
+ };
310
+
311
+ export default func;
312
+ func.id = "deploy_${contractName.toLowerCase()}";
313
+ func.tags = ["${contractName}"];
314
+ `;
315
+ }
316
+ function generateGitBookMarkdown(description, contractContent, testContent, contractName, testFileName) {
317
+ let markdown = `${description}\n\n`;
318
+ markdown += `{% hint style="info" %}\n`;
319
+ markdown += `To run this example correctly, make sure the files are placed in the following directories:\n\n`;
320
+ markdown += `- \`.sol\` file → \`<your-project-root-dir>/contracts/\`\n`;
321
+ markdown += `- \`.ts\` file → \`<your-project-root-dir>/test/\`\n\n`;
322
+ markdown += `This ensures Hardhat can compile and test your contracts as expected.\n`;
323
+ markdown += `{% endhint %}\n\n`;
324
+ markdown += `{% tabs %}\n\n`;
325
+ markdown += `{% tab title="${contractName}.sol" %}\n\n`;
326
+ markdown += `\`\`\`solidity\n`;
327
+ markdown += contractContent;
328
+ markdown += `\n\`\`\`\n\n`;
329
+ markdown += `{% endtab %}\n\n`;
330
+ markdown += `{% tab title="${testFileName}" %}\n\n`;
331
+ markdown += `\`\`\`typescript\n`;
332
+ markdown += testContent;
333
+ markdown += `\n\`\`\`\n\n`;
334
+ markdown += `{% endtab %}\n\n`;
335
+ markdown += `{% endtabs %}\n`;
336
+ return markdown;
337
+ }
338
+ function updateProjectPackageJson(outputDir, projectName, description, npmDependencies) {
339
+ const packageJsonPath = path.join(outputDir, "package.json");
340
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
341
+ packageJson.name = projectName;
342
+ if (description) {
343
+ packageJson.description = description;
344
+ }
345
+ if (npmDependencies && Object.keys(npmDependencies).length > 0) {
346
+ if (!packageJson.dependencies) {
347
+ packageJson.dependencies = {};
348
+ }
349
+ Object.assign(packageJson.dependencies, npmDependencies);
350
+ }
351
+ fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
352
+ }
353
+ // =============================================================================
354
+ // Command Execution Utilities
355
+ // =============================================================================
356
+ function runCommand(cmd, args, cwd) {
357
+ return new Promise((resolve, reject) => {
358
+ const child = (0, child_process_1.spawn)(cmd, args, {
359
+ cwd,
360
+ shell: true,
361
+ stdio: "pipe",
362
+ });
363
+ let stdout = "";
364
+ let stderr = "";
365
+ child.stdout?.on("data", (data) => {
366
+ stdout += data.toString();
367
+ });
368
+ child.stderr?.on("data", (data) => {
369
+ stderr += data.toString();
370
+ });
371
+ child.on("close", (code) => {
372
+ if (code === 0) {
373
+ resolve(stdout);
374
+ }
375
+ else {
376
+ reject(new Error(stderr || stdout || `Command failed with code ${code}`));
377
+ }
378
+ });
379
+ child.on("error", reject);
380
+ });
381
+ }
382
+ function runCommandWithStatus(cmd, args, cwd) {
383
+ return new Promise((resolve) => {
384
+ let output = "";
385
+ const proc = (0, child_process_1.spawn)(cmd, args, {
386
+ cwd,
387
+ shell: true,
388
+ stdio: ["ignore", "pipe", "pipe"],
389
+ });
390
+ proc.stdout?.on("data", (data) => {
391
+ output += data.toString();
392
+ });
393
+ proc.stderr?.on("data", (data) => {
394
+ output += data.toString();
395
+ });
396
+ proc.on("close", (code) => {
397
+ resolve({ success: code === 0, output });
398
+ });
399
+ proc.on("error", (err) => {
400
+ output += err.message;
401
+ resolve({ success: false, output });
402
+ });
403
+ });
404
+ }
405
+ function extractTestResults(output) {
406
+ const passingMatch = output.match(/(\d+)\s+passing/);
407
+ const failingMatch = output.match(/(\d+)\s+failing/);
408
+ if (passingMatch) {
409
+ const passing = passingMatch[1];
410
+ const failing = failingMatch ? failingMatch[1] : "0";
411
+ if (failing === "0") {
412
+ return `${passing} tests passing ✓`;
413
+ }
414
+ else {
415
+ return `${passing} passing, ${failing} failing`;
416
+ }
417
+ }
418
+ return null;
419
+ }
420
+ function extractErrorMessage(output) {
421
+ const lines = output.split("\n");
422
+ const errorLines = [];
423
+ for (const line of lines) {
424
+ if (line.includes("Error:") || line.includes("error:")) {
425
+ errorLines.push(line.trim());
426
+ }
427
+ if (line.includes("TypeError") || line.includes("SyntaxError")) {
428
+ errorLines.push(line.trim());
429
+ }
430
+ if (line.includes("AssertionError") || line.includes("expected")) {
431
+ errorLines.push(line.trim());
432
+ }
433
+ if (line.includes("revert") || line.includes("reverted")) {
434
+ errorLines.push(line.trim());
435
+ }
436
+ if (line.includes("HardhatError") || line.includes("ENOENT")) {
437
+ errorLines.push(line.trim());
438
+ }
439
+ }
440
+ if (errorLines.length > 0) {
441
+ return errorLines.slice(0, 5).join("\n");
442
+ }
443
+ const nonEmptyLines = lines.filter((l) => l.trim().length > 0);
444
+ return nonEmptyLines.slice(-5).join("\n");
445
+ }
446
+ // =============================================================================
447
+ // GitHub Repository Utilities
448
+ // =============================================================================
449
+ /**
450
+ * Downloads a file from GitHub repository
451
+ */
452
+ async function downloadFileFromGitHub(filePath, outputPath) {
453
+ const urlParts = config_1.REPO_URL.replace("https://github.com/", "").split("/");
454
+ const owner = urlParts[0];
455
+ const repo = urlParts[1];
456
+ const url = `https://raw.githubusercontent.com/${owner}/${repo}/${config_1.REPO_BRANCH}/${filePath}`;
457
+ const response = await fetch(url);
458
+ if (!response.ok) {
459
+ throw new Error(`Failed to download ${filePath}: ${response.statusText}`);
460
+ }
461
+ const content = await response.text();
462
+ const dir = path.dirname(outputPath);
463
+ if (!fs.existsSync(dir)) {
464
+ fs.mkdirSync(dir, { recursive: true });
465
+ }
466
+ fs.writeFileSync(outputPath, content);
467
+ }
468
+ /**
469
+ * Clones the template repository to temp directory
470
+ */
471
+ async function cloneTemplate(tempDir) {
472
+ const templatePath = path.join(tempDir, "template");
473
+ return new Promise((resolve, reject) => {
474
+ const cloneUrl = `${config_1.REPO_URL}.git`;
475
+ const args = [
476
+ "clone",
477
+ "--depth=1",
478
+ "--branch",
479
+ config_1.REPO_BRANCH,
480
+ "--single-branch",
481
+ cloneUrl,
482
+ templatePath,
483
+ ];
484
+ const child = (0, child_process_1.spawn)("git", args, {
485
+ stdio: "pipe",
486
+ });
487
+ let stderr = "";
488
+ child.stderr?.on("data", (data) => {
489
+ stderr += data.toString();
490
+ });
491
+ child.on("close", (code) => {
492
+ if (code === 0) {
493
+ resolve(templatePath);
494
+ }
495
+ else {
496
+ reject(new Error(`Git clone failed: ${stderr}`));
497
+ }
498
+ });
499
+ child.on("error", reject);
500
+ });
501
+ }
502
+ /**
503
+ * Initializes git submodule for the template
504
+ */
505
+ async function initSubmodule(repoPath) {
506
+ return new Promise((resolve, reject) => {
507
+ const child = (0, child_process_1.spawn)("git", ["submodule", "update", "--init", "--recursive", exports.TEMPLATE_DIR_NAME], {
508
+ cwd: repoPath,
509
+ stdio: "pipe",
510
+ });
511
+ let stderr = "";
512
+ child.stderr?.on("data", (data) => {
513
+ stderr += data.toString();
514
+ });
515
+ child.on("close", (code) => {
516
+ if (code === 0) {
517
+ resolve();
518
+ }
519
+ else {
520
+ reject(new Error(`Submodule init failed: ${stderr}`));
521
+ }
522
+ });
523
+ child.on("error", reject);
524
+ });
525
+ }
package/package.json CHANGED
@@ -1,20 +1,31 @@
1
1
  {
2
2
  "name": "create-fhevm-example",
3
- "version": "1.2.3",
4
- "description": "Create FHEVM example projects with a single command",
5
- "type": "module",
3
+ "version": "1.3.1",
4
+ "description": "Create FHEVM example projects with a single command - A comprehensive toolkit for building privacy-preserving smart contracts",
6
5
  "bin": {
7
- "create-fhevm-example": "./dist/index.js"
6
+ "create-fhevm-example": "./dist/scripts/index.js"
8
7
  },
8
+ "main": "./dist/scripts/index.js",
9
9
  "files": [
10
- "dist",
11
- "README.md"
10
+ "dist"
12
11
  ],
13
12
  "scripts": {
14
13
  "build": "tsc",
15
- "dev": "tsc --watch",
16
- "update:config": "npx ts-node --esm scripts/update-config.ts",
17
- "prepublishOnly": "npm run update:config && npm run build"
14
+ "create": "LOCAL_DEV=1 npx ts-node scripts/index.ts",
15
+ "create:example": "npx ts-node scripts/index.ts --example",
16
+ "create:category": "npx ts-node scripts/index.ts --category",
17
+ "create:docs": "npx ts-node scripts/generate-docs.ts",
18
+ "test:all": "npx ts-node scripts/maintenance.ts test-all",
19
+ "generate:config": "npx ts-node scripts/generate-config.ts",
20
+ "doctor": "npx ts-node scripts/doctor.ts",
21
+ "help:create": "npx ts-node scripts/index.ts --help",
22
+ "help:docs": "npx ts-node scripts/generate-docs.ts --help",
23
+ "help:test": "npx ts-node scripts/maintenance.ts test-all --help",
24
+
25
+ "postinstall": "git submodule update --init --recursive",
26
+ "prepublishOnly": "npm run build",
27
+ "prepack": "mv README.md GITHUB_README.md && cp NPM_README.md README.md",
28
+ "postpack": "mv GITHUB_README.md README.md"
18
29
  },
19
30
  "keywords": [
20
31
  "fhevm",
@@ -23,10 +34,12 @@
23
34
  "blockchain",
24
35
  "examples",
25
36
  "cli",
37
+ "scaffold",
26
38
  "create",
27
- "scaffold"
39
+ "privacy",
40
+ "fhe"
28
41
  ],
29
- "author": "Zama",
42
+ "author": "Necip Akgz",
30
43
  "license": "BSD-3-Clause-Clear",
31
44
  "engines": {
32
45
  "node": ">=20"
@@ -34,8 +47,7 @@
34
47
  "homepage": "https://necips-organization-1.gitbook.io",
35
48
  "repository": {
36
49
  "type": "git",
37
- "url": "https://github.com/NecipAkgz/fhevm-example-factory",
38
- "directory": "packages/create-fhevm-example"
50
+ "url": "https://github.com/NecipAkgz/fhevm-example-factory"
39
51
  },
40
52
  "dependencies": {
41
53
  "@clack/prompts": "^0.11.0",
@@ -1,21 +0,0 @@
1
- /**
2
- * Detects if the target directory is a valid Hardhat project
3
- */
4
- export declare function detectHardhatProject(targetDir: string): boolean;
5
- /**
6
- * Updates package.json with FHEVM dependencies
7
- */
8
- export declare function updatePackageJson(targetDir: string): void;
9
- /**
10
- * Updates hardhat.config.ts/js with FHEVM plugin import
11
- */
12
- export declare function updateHardhatConfig(targetDir: string): void;
13
- /**
14
- * Adds example contract and test files to the project
15
- */
16
- export declare function addExampleFiles(exampleName: string, targetDir: string): Promise<void>;
17
- /**
18
- * Main function to add FHEVM capabilities to an existing Hardhat project
19
- */
20
- export declare function runAddMode(targetDir?: string): Promise<void>;
21
- //# sourceMappingURL=add-mode.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"add-mode.d.ts","sourceRoot":"","sources":["../src/add-mode.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAqB/D;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAsBzD;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CA4C3D;AAMD;;GAEG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA+If;AAMD;;GAEG;AACH,wBAAsB,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqFlE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"add-mode.js","sourceRoot":"","sources":["../src/add-mode.ts"],"names":[],"mappings":"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"}
@@ -1,30 +0,0 @@
1
- /**
2
- * Project Builders
3
- *
4
- * Creates single example and category projects from templates.
5
- * Similar to main project's create-example.ts and create-category.ts
6
- */
7
- /**
8
- * Cleans up template-specific files after copying
9
- * Similar to cleanupTemplate() in main project's shared/utils.ts
10
- */
11
- export declare function cleanupTemplate(outputDir: string): void;
12
- /**
13
- * Creates a single example project from the template
14
- *
15
- * Steps:
16
- * 1. Copy template directory and clean up
17
- * 2. Download contract and test files from GitHub
18
- * 3. Update package.json and deploy scripts
19
- */
20
- export declare function createSingleExample(exampleName: string, outputDir: string, tempRepoPath: string): Promise<void>;
21
- /**
22
- * Creates a category project with multiple examples
23
- *
24
- * Steps:
25
- * 1. Copy template directory and clean up
26
- * 2. Download all contracts and tests for the category
27
- * 3. Update package.json
28
- */
29
- export declare function createCategoryProject(categoryName: string, outputDir: string, tempRepoPath: string): Promise<void>;
30
- //# sourceMappingURL=builders.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../src/builders.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkBH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAmDvD;AAoED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAgDf;AAMD;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CA4Df"}