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