create-mn-app 0.0.6
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 +239 -0
- package/bin/create-midnight-app.js +47 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +35 -0
- package/dist/cli.js.map +1 -0
- package/dist/create-app.d.ts +10 -0
- package/dist/create-app.d.ts.map +1 -0
- package/dist/create-app.js +186 -0
- package/dist/create-app.js.map +1 -0
- package/dist/installers/package-installer.d.ts +8 -0
- package/dist/installers/package-installer.d.ts.map +1 -0
- package/dist/installers/package-installer.js +62 -0
- package/dist/installers/package-installer.js.map +1 -0
- package/dist/installers/proof-server-setup.d.ts +6 -0
- package/dist/installers/proof-server-setup.d.ts.map +1 -0
- package/dist/installers/proof-server-setup.js +54 -0
- package/dist/installers/proof-server-setup.js.map +1 -0
- package/dist/installers/wallet-generator.d.ts +4 -0
- package/dist/installers/wallet-generator.d.ts.map +1 -0
- package/dist/installers/wallet-generator.js +64 -0
- package/dist/installers/wallet-generator.js.map +1 -0
- package/dist/test.d.ts +2 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +53 -0
- package/dist/test.js.map +1 -0
- package/dist/utils/git-utils.d.ts +6 -0
- package/dist/utils/git-utils.d.ts.map +1 -0
- package/dist/utils/git-utils.js +51 -0
- package/dist/utils/git-utils.js.map +1 -0
- package/dist/utils/template-manager.d.ts +7 -0
- package/dist/utils/template-manager.d.ts.map +1 -0
- package/dist/utils/template-manager.js +61 -0
- package/dist/utils/template-manager.js.map +1 -0
- package/dist/utils/validation.d.ts +6 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +32 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +60 -0
- package/templates/hello-world/README.md.template +99 -0
- package/templates/hello-world/_env.template +0 -0
- package/templates/hello-world/_gitignore +52 -0
- package/templates/hello-world/contracts/hello-world.compact.template +12 -0
- package/templates/hello-world/nodemon.json.template +7 -0
- package/templates/hello-world/package.json.template +51 -0
- package/templates/hello-world/src/check-balance.ts.template +107 -0
- package/templates/hello-world/src/cli.ts.template +194 -0
- package/templates/hello-world/src/deploy.ts.template +218 -0
- package/templates/hello-world/src/providers/midnight-providers.ts.template +46 -0
- package/templates/hello-world/src/utils/environment.ts.template +51 -0
- package/templates/hello-world/tsconfig.json.template +20 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProofServerSetup = void 0;
|
|
4
|
+
const cross_spawn_1 = require("cross-spawn");
|
|
5
|
+
class ProofServerSetup {
|
|
6
|
+
async verify() {
|
|
7
|
+
try {
|
|
8
|
+
// Check if Docker is available
|
|
9
|
+
const dockerAvailable = await this.isDockerAvailable();
|
|
10
|
+
if (!dockerAvailable) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
// Check if proof server image is available
|
|
14
|
+
return await this.isProofServerImageAvailable();
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async isDockerAvailable() {
|
|
21
|
+
return new Promise((resolve) => {
|
|
22
|
+
const child = (0, cross_spawn_1.spawn)("docker", ["--version"], {
|
|
23
|
+
stdio: "pipe",
|
|
24
|
+
});
|
|
25
|
+
child.on("close", (code) => {
|
|
26
|
+
resolve(code === 0);
|
|
27
|
+
});
|
|
28
|
+
child.on("error", () => {
|
|
29
|
+
resolve(false);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
async isProofServerImageAvailable() {
|
|
34
|
+
return new Promise((resolve) => {
|
|
35
|
+
const child = (0, cross_spawn_1.spawn)("docker", ["images", "midnightnetwork/proof-server"], {
|
|
36
|
+
stdio: "pipe",
|
|
37
|
+
});
|
|
38
|
+
let output = "";
|
|
39
|
+
child.stdout?.on("data", (data) => {
|
|
40
|
+
output += data.toString();
|
|
41
|
+
});
|
|
42
|
+
child.on("close", (code) => {
|
|
43
|
+
// Check if image exists in output
|
|
44
|
+
const hasImage = output.includes("midnightnetwork/proof-server");
|
|
45
|
+
resolve(code === 0 && hasImage);
|
|
46
|
+
});
|
|
47
|
+
child.on("error", () => {
|
|
48
|
+
resolve(false);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.ProofServerSetup = ProofServerSetup;
|
|
54
|
+
//# sourceMappingURL=proof-server-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proof-server-setup.js","sourceRoot":"","sources":["../../src/installers/proof-server-setup.ts"],"names":[],"mappings":";;;AAAA,6CAAoC;AAEpC,MAAa,gBAAgB;IAC3B,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,+BAA+B;YAC/B,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvD,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,OAAO,KAAK,CAAC;YACf,CAAC;YAED,2CAA2C;YAC3C,OAAO,MAAM,IAAI,CAAC,2BAA2B,EAAE,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,IAAA,mBAAK,EAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE;gBAC3C,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;YACtB,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACrB,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,2BAA2B;QACvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,IAAA,mBAAK,EACjB,QAAQ,EACR,CAAC,QAAQ,EAAE,8BAA8B,CAAC,EAC1C;gBACE,KAAK,EAAE,MAAM;aACd,CACF,CAAC;YAEF,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBAChC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,kCAAkC;gBAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC;gBACjE,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACrB,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AA1DD,4CA0DC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-generator.d.ts","sourceRoot":"","sources":["../../src/installers/wallet-generator.ts"],"names":[],"mappings":"AAIA,qBAAa,eAAe;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAwDrD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.WalletGenerator = void 0;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
9
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
10
|
+
class WalletGenerator {
|
|
11
|
+
async generate(projectPath) {
|
|
12
|
+
// Generate 32 random bytes and convert to hex string
|
|
13
|
+
const bytes = crypto_1.default.randomBytes(32);
|
|
14
|
+
const walletSeed = bytes.toString("hex");
|
|
15
|
+
// Create .env file
|
|
16
|
+
const envPath = path_1.default.join(projectPath, ".env");
|
|
17
|
+
const envContent = `# Midnight Network Configuration
|
|
18
|
+
# Generated on ${new Date().toISOString()}
|
|
19
|
+
|
|
20
|
+
# Network Configuration
|
|
21
|
+
MIDNIGHT_NETWORK=testnet
|
|
22
|
+
PROOF_SERVER_URL=http://127.0.0.1:6300
|
|
23
|
+
|
|
24
|
+
# Wallet Configuration (KEEP PRIVATE!)
|
|
25
|
+
WALLET_SEED=${walletSeed}
|
|
26
|
+
|
|
27
|
+
# Contract Configuration
|
|
28
|
+
CONTRACT_NAME=hello-world
|
|
29
|
+
|
|
30
|
+
# Development Settings
|
|
31
|
+
DEBUG_LEVEL=info
|
|
32
|
+
AUTO_START_PROOF_SERVER=true
|
|
33
|
+
|
|
34
|
+
# Security Warning:
|
|
35
|
+
# Keep your wallet seed private and secure!
|
|
36
|
+
# Never commit this file to version control.
|
|
37
|
+
# Add .env to your .gitignore file.
|
|
38
|
+
`;
|
|
39
|
+
await fs_extra_1.default.writeFile(envPath, envContent);
|
|
40
|
+
// Also create .env.example for reference
|
|
41
|
+
const envExamplePath = path_1.default.join(projectPath, ".env.example");
|
|
42
|
+
const envExampleContent = `# Midnight Network Configuration
|
|
43
|
+
# Copy this file to .env and fill in your values
|
|
44
|
+
|
|
45
|
+
# Network Configuration
|
|
46
|
+
MIDNIGHT_NETWORK=testnet
|
|
47
|
+
PROOF_SERVER_URL=http://127.0.0.1:6300
|
|
48
|
+
|
|
49
|
+
# Wallet Configuration (KEEP PRIVATE!)
|
|
50
|
+
WALLET_SEED=your_64_character_wallet_seed_here
|
|
51
|
+
|
|
52
|
+
# Contract Configuration
|
|
53
|
+
CONTRACT_NAME=hello-world
|
|
54
|
+
|
|
55
|
+
# Development Settings
|
|
56
|
+
DEBUG_LEVEL=info
|
|
57
|
+
AUTO_START_PROOF_SERVER=true
|
|
58
|
+
`;
|
|
59
|
+
await fs_extra_1.default.writeFile(envExamplePath, envExampleContent);
|
|
60
|
+
return walletSeed;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.WalletGenerator = WalletGenerator;
|
|
64
|
+
//# sourceMappingURL=wallet-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-generator.js","sourceRoot":"","sources":["../../src/installers/wallet-generator.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,wDAA0B;AAC1B,oDAA4B;AAE5B,MAAa,eAAe;IAC1B,KAAK,CAAC,QAAQ,CAAC,WAAmB;QAChC,qDAAqD;QACrD,MAAM,KAAK,GAAG,gBAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAEzC,mBAAmB;QACnB,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG;iBACN,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;;;;;;;cAO3B,UAAU;;;;;;;;;;;;;CAavB,CAAC;QAEE,MAAM,kBAAE,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAExC,yCAAyC;QACzC,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAC9D,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;CAgB7B,CAAC;QAEE,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;QAEtD,OAAO,UAAU,CAAC;IACpB,CAAC;CACF;AAzDD,0CAyDC"}
|
package/dist/test.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":""}
|
package/dist/test.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const create_app_1 = require("./create-app");
|
|
9
|
+
async function testCreateApp() {
|
|
10
|
+
console.log("🧪 Testing create-midnight-app...\n");
|
|
11
|
+
const testDir = path_1.default.join(process.cwd(), "test-app");
|
|
12
|
+
// Clean up any existing test
|
|
13
|
+
if (fs_extra_1.default.existsSync(testDir)) {
|
|
14
|
+
await fs_extra_1.default.remove(testDir);
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
await (0, create_app_1.createApp)("test-app", {
|
|
18
|
+
template: "hello-world",
|
|
19
|
+
useNpm: true,
|
|
20
|
+
skipInstall: false,
|
|
21
|
+
skipGit: true,
|
|
22
|
+
verbose: true,
|
|
23
|
+
});
|
|
24
|
+
console.log("\n✅ Test completed successfully!");
|
|
25
|
+
// Verify structure
|
|
26
|
+
const requiredFiles = [
|
|
27
|
+
"package.json",
|
|
28
|
+
"tsconfig.json",
|
|
29
|
+
".env",
|
|
30
|
+
".env.example",
|
|
31
|
+
".gitignore",
|
|
32
|
+
"README.md",
|
|
33
|
+
"contracts/hello-world.compact",
|
|
34
|
+
"src/deploy.ts",
|
|
35
|
+
"src/cli.ts",
|
|
36
|
+
"src/providers/midnight-providers.ts",
|
|
37
|
+
"src/utils/environment.ts",
|
|
38
|
+
];
|
|
39
|
+
for (const file of requiredFiles) {
|
|
40
|
+
const filePath = path_1.default.join(testDir, file);
|
|
41
|
+
if (!fs_extra_1.default.existsSync(filePath)) {
|
|
42
|
+
throw new Error(`Missing file: ${file}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
console.log("✅ All required files present");
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
console.error("❌ Test failed:", error);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
testCreateApp();
|
|
53
|
+
//# sourceMappingURL=test.js.map
|
package/dist/test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":";;;;;AAAA,wDAA0B;AAC1B,gDAAwB;AACxB,6CAAyC;AAEzC,KAAK,UAAU,aAAa;IAC1B,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IAEnD,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;IAErD,6BAA6B;IAC7B,IAAI,kBAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,kBAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAA,sBAAS,EAAC,UAAU,EAAE;YAC1B,QAAQ,EAAE,aAAa;YACvB,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,KAAK;YAClB,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAEhD,mBAAmB;QACnB,MAAM,aAAa,GAAG;YACpB,cAAc;YACd,eAAe;YACf,MAAM;YACN,cAAc;YACd,YAAY;YACZ,WAAW;YACX,+BAA+B;YAC/B,eAAe;YACf,YAAY;YACZ,qCAAqC;YACrC,0BAA0B;SAC3B,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,kBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-utils.d.ts","sourceRoot":"","sources":["../../src/utils/git-utils.ts"],"names":[],"mappings":"AAIA,qBAAa,QAAQ;WACN,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;mBAqBhC,cAAc;mBASd,aAAa;CAqBnC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GitUtils = void 0;
|
|
4
|
+
const cross_spawn_1 = require("cross-spawn");
|
|
5
|
+
class GitUtils {
|
|
6
|
+
static async init(projectPath) {
|
|
7
|
+
// Check if git is available
|
|
8
|
+
const gitAvailable = await this.isGitAvailable();
|
|
9
|
+
if (!gitAvailable) {
|
|
10
|
+
throw new Error("Git is not available");
|
|
11
|
+
}
|
|
12
|
+
// Initialize git repository
|
|
13
|
+
await this.runGitCommand(projectPath, ["init"]);
|
|
14
|
+
// Add all files
|
|
15
|
+
await this.runGitCommand(projectPath, ["add", "."]);
|
|
16
|
+
// Create initial commit
|
|
17
|
+
await this.runGitCommand(projectPath, [
|
|
18
|
+
"commit",
|
|
19
|
+
"-m",
|
|
20
|
+
"Initial commit from create-midnight-app",
|
|
21
|
+
]);
|
|
22
|
+
}
|
|
23
|
+
static async isGitAvailable() {
|
|
24
|
+
try {
|
|
25
|
+
await this.runGitCommand(process.cwd(), ["--version"]);
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
static async runGitCommand(cwd, args) {
|
|
33
|
+
return new Promise((resolve, reject) => {
|
|
34
|
+
const child = (0, cross_spawn_1.spawn)("git", args, {
|
|
35
|
+
cwd,
|
|
36
|
+
stdio: "pipe",
|
|
37
|
+
});
|
|
38
|
+
child.on("close", (code) => {
|
|
39
|
+
if (code === 0) {
|
|
40
|
+
resolve();
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
reject(new Error(`Git command failed with code ${code}`));
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
child.on("error", reject);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.GitUtils = GitUtils;
|
|
51
|
+
//# sourceMappingURL=git-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-utils.js","sourceRoot":"","sources":["../../src/utils/git-utils.ts"],"names":[],"mappings":";;;AAAA,6CAAoC;AAIpC,MAAa,QAAQ;IACnB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAmB;QACnC,4BAA4B;QAC5B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QACjD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QAED,4BAA4B;QAC5B,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAEhD,gBAAgB;QAChB,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QAEpD,wBAAwB;QACxB,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE;YACpC,QAAQ;YACR,IAAI;YACJ,yCAAyC;SAC1C,CAAC,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,cAAc;QACjC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,aAAa,CAChC,GAAW,EACX,IAAc;QAEd,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,IAAA,mBAAK,EAAC,KAAK,EAAE,IAAI,EAAE;gBAC/B,GAAG;gBACH,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AApDD,4BAoDC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-manager.d.ts","sourceRoot":"","sources":["../../src/utils/template-manager.ts"],"names":[],"mappings":"AAIA,qBAAa,eAAe;IACd,OAAO,CAAC,YAAY;gBAAZ,YAAY,EAAE,MAAM;IAElC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAuBzD,YAAY;CAmC3B"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TemplateManager = void 0;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
9
|
+
const mustache_1 = __importDefault(require("mustache"));
|
|
10
|
+
class TemplateManager {
|
|
11
|
+
constructor(templateName) {
|
|
12
|
+
this.templateName = templateName;
|
|
13
|
+
}
|
|
14
|
+
async scaffold(projectPath, projectName) {
|
|
15
|
+
const templatePath = path_1.default.join(__dirname, "../../templates", this.templateName);
|
|
16
|
+
if (!fs_extra_1.default.existsSync(templatePath)) {
|
|
17
|
+
throw new Error(`Template "${this.templateName}" not found`);
|
|
18
|
+
}
|
|
19
|
+
const templateVars = {
|
|
20
|
+
projectName,
|
|
21
|
+
timestamp: new Date().toISOString(),
|
|
22
|
+
year: new Date().getFullYear(),
|
|
23
|
+
capitalizedName: projectName.charAt(0).toUpperCase() + projectName.slice(1),
|
|
24
|
+
kebabName: projectName.toLowerCase().replace(/\s+/g, "-"),
|
|
25
|
+
};
|
|
26
|
+
await this.copyTemplate(templatePath, projectPath, templateVars);
|
|
27
|
+
}
|
|
28
|
+
async copyTemplate(templatePath, projectPath, templateVars) {
|
|
29
|
+
const files = await fs_extra_1.default.readdir(templatePath, { withFileTypes: true });
|
|
30
|
+
for (const file of files) {
|
|
31
|
+
const sourcePath = path_1.default.join(templatePath, file.name);
|
|
32
|
+
let destPath = path_1.default.join(projectPath, file.name);
|
|
33
|
+
// Handle special file names
|
|
34
|
+
if (file.name === "_gitignore") {
|
|
35
|
+
destPath = path_1.default.join(projectPath, ".gitignore");
|
|
36
|
+
}
|
|
37
|
+
else if (file.name === "_env.template") {
|
|
38
|
+
destPath = path_1.default.join(projectPath, ".env.example");
|
|
39
|
+
}
|
|
40
|
+
if (file.isDirectory()) {
|
|
41
|
+
await fs_extra_1.default.ensureDir(destPath);
|
|
42
|
+
await this.copyTemplate(sourcePath, destPath, templateVars);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
if (file.name.endsWith(".template")) {
|
|
46
|
+
// Render template file
|
|
47
|
+
const content = await fs_extra_1.default.readFile(sourcePath, "utf8");
|
|
48
|
+
const rendered = mustache_1.default.render(content, templateVars);
|
|
49
|
+
const finalPath = destPath.replace(".template", "");
|
|
50
|
+
await fs_extra_1.default.writeFile(finalPath, rendered);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// Copy binary file as-is
|
|
54
|
+
await fs_extra_1.default.copy(sourcePath, destPath);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.TemplateManager = TemplateManager;
|
|
61
|
+
//# sourceMappingURL=template-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-manager.js","sourceRoot":"","sources":["../../src/utils/template-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CA8BlE"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.validateProjectName = validateProjectName;
|
|
7
|
+
const validate_npm_package_name_1 = __importDefault(require("validate-npm-package-name"));
|
|
8
|
+
function validateProjectName(name) {
|
|
9
|
+
const validation = (0, validate_npm_package_name_1.default)(name);
|
|
10
|
+
if (validation.validForNewPackages) {
|
|
11
|
+
return { valid: true };
|
|
12
|
+
}
|
|
13
|
+
const problems = [];
|
|
14
|
+
if (validation.errors) {
|
|
15
|
+
problems.push(...validation.errors);
|
|
16
|
+
}
|
|
17
|
+
if (validation.warnings) {
|
|
18
|
+
problems.push(...validation.warnings);
|
|
19
|
+
}
|
|
20
|
+
// Additional checks
|
|
21
|
+
if (name.length === 0) {
|
|
22
|
+
problems.push("Project name cannot be empty");
|
|
23
|
+
}
|
|
24
|
+
if (name.match(/[A-Z]/)) {
|
|
25
|
+
problems.push("Project name cannot contain uppercase letters");
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
valid: false,
|
|
29
|
+
problems: problems.length > 0 ? problems : ["Invalid project name"],
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":";;;;;AAOA,kDA8BC;AArCD,0FAA4D;AAO5D,SAAgB,mBAAmB,CAAC,IAAY;IAC9C,MAAM,UAAU,GAAG,IAAA,mCAAmB,EAAC,IAAI,CAAC,CAAC;IAE7C,IAAI,UAAU,CAAC,mBAAmB,EAAE,CAAC;QACnC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACtB,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,oBAAoB;IACpB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,QAAQ,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IACjE,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC;KACpE,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "create-mn-app",
|
|
3
|
+
"version": "0.0.6",
|
|
4
|
+
"description": "Create Midnight Network applications with zero configuration",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"create-mn-app": "./bin/create-midnight-app.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"bin",
|
|
11
|
+
"dist",
|
|
12
|
+
"templates"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"dev": "tsc --watch",
|
|
17
|
+
"prepublishOnly": "npm run build",
|
|
18
|
+
"test": "npm run build && node dist/test.js",
|
|
19
|
+
"test-local": "npm run build && npm link && npx create-midnight-app test-app",
|
|
20
|
+
"clean": "rm -rf dist test-app"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"midnight",
|
|
24
|
+
"blockchain",
|
|
25
|
+
"zero-knowledge",
|
|
26
|
+
"privacy",
|
|
27
|
+
"scaffold",
|
|
28
|
+
"cli",
|
|
29
|
+
"create-app"
|
|
30
|
+
],
|
|
31
|
+
"author": "Midnight Network",
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"chalk": "^4.1.2",
|
|
35
|
+
"commander": "^11.0.0",
|
|
36
|
+
"cross-spawn": "^7.0.3",
|
|
37
|
+
"fs-extra": "^11.1.1",
|
|
38
|
+
"mustache": "^4.2.0",
|
|
39
|
+
"ora": "^5.4.1",
|
|
40
|
+
"prompts": "^2.4.2",
|
|
41
|
+
"semver": "^7.5.4",
|
|
42
|
+
"validate-npm-package-name": "^5.0.0"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/cross-spawn": "^6.0.2",
|
|
46
|
+
"@types/fs-extra": "^11.0.1",
|
|
47
|
+
"@types/mustache": "^4.2.2",
|
|
48
|
+
"@types/node": "^20.0.0",
|
|
49
|
+
"@types/prompts": "^2.4.4",
|
|
50
|
+
"@types/validate-npm-package-name": "^4.0.2",
|
|
51
|
+
"typescript": "^5.0.0"
|
|
52
|
+
},
|
|
53
|
+
"engines": {
|
|
54
|
+
"node": ">=18.0.0"
|
|
55
|
+
},
|
|
56
|
+
"repository": {
|
|
57
|
+
"type": "git",
|
|
58
|
+
"url": "https://github.com/midnightntwrk/create-midnight-app.git"
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# {{projectName}}
|
|
2
|
+
|
|
3
|
+
A Midnight Network application created with `create-midnight-app`.
|
|
4
|
+
|
|
5
|
+
## Getting Started
|
|
6
|
+
|
|
7
|
+
### Prerequisites
|
|
8
|
+
|
|
9
|
+
- Node.js 18+ installed
|
|
10
|
+
- Docker installed (for proof server)
|
|
11
|
+
|
|
12
|
+
### Quick Start
|
|
13
|
+
|
|
14
|
+
1. **Install dependencies**:
|
|
15
|
+
```bash
|
|
16
|
+
npm install
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
2. **Setup and deploy**:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm run setup
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
This will:
|
|
26
|
+
|
|
27
|
+
- Compile your Compact contract
|
|
28
|
+
- Build TypeScript to JavaScript
|
|
29
|
+
- Deploy contract to the testnet
|
|
30
|
+
|
|
31
|
+
3. **Interact with your contract**:
|
|
32
|
+
```bash
|
|
33
|
+
npm run cli
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Available Scripts
|
|
37
|
+
|
|
38
|
+
- `npm run setup` - Compile, build, and deploy contract
|
|
39
|
+
- `npm run compile` - Compile Compact contract
|
|
40
|
+
- `npm run build` - Build TypeScript
|
|
41
|
+
- `npm run deploy` - Deploy contract to testnet
|
|
42
|
+
- `npm run cli` - Interactive CLI for contract
|
|
43
|
+
- `npm run check-balance` - Check wallet balance
|
|
44
|
+
- `npm run reset` - Reset all compiled/built files
|
|
45
|
+
- `npm run clean` - Clean build artifacts
|
|
46
|
+
|
|
47
|
+
### Environment Variables
|
|
48
|
+
|
|
49
|
+
Copy `.env.example` to `.env` and configure:
|
|
50
|
+
|
|
51
|
+
- `WALLET_SEED` - Your 64-character wallet seed (auto-generated)
|
|
52
|
+
- `MIDNIGHT_NETWORK` - Network to use (testnet)
|
|
53
|
+
- `PROOF_SERVER_URL` - Proof server URL
|
|
54
|
+
- `CONTRACT_NAME` - Contract name
|
|
55
|
+
|
|
56
|
+
### Project Structure
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
{{projectName}}/
|
|
60
|
+
├── contracts/
|
|
61
|
+
│ ├── hello-world.compact # Smart contract source
|
|
62
|
+
│ └── managed/ # Compiled artifacts
|
|
63
|
+
├── src/
|
|
64
|
+
│ ├── deploy.ts # Deployment script
|
|
65
|
+
│ ├── cli.ts # Interactive CLI
|
|
66
|
+
│ ├── providers/ # Shared providers
|
|
67
|
+
│ └── utils/ # Utility functions
|
|
68
|
+
├── .env # Environment config (keep private!)
|
|
69
|
+
├── deployment.json # Deployment info
|
|
70
|
+
└── package.json
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Getting Testnet Tokens
|
|
74
|
+
|
|
75
|
+
1. Run `npm run deploy` to see your wallet address
|
|
76
|
+
2. Visit [https://midnight.network/test-faucet](https://midnight.network/test-faucet)
|
|
77
|
+
3. Enter your address to receive test tokens
|
|
78
|
+
|
|
79
|
+
### Learn More
|
|
80
|
+
|
|
81
|
+
- [Midnight Documentation](https://docs.midnight.network)
|
|
82
|
+
- [Compact Language Guide](https://docs.midnight.network/compact)
|
|
83
|
+
- [Tutorial Series](https://docs.midnight.network/tutorials)
|
|
84
|
+
|
|
85
|
+
## Contract Overview
|
|
86
|
+
|
|
87
|
+
This project includes a simple "Hello World" contract that:
|
|
88
|
+
|
|
89
|
+
- Stores a message on the blockchain
|
|
90
|
+
- Allows reading the current message
|
|
91
|
+
- Demonstrates basic Midnight functionality
|
|
92
|
+
|
|
93
|
+
The contract uses:
|
|
94
|
+
|
|
95
|
+
- **Public ledger state** for the message
|
|
96
|
+
- **Zero-knowledge proofs** for transactions
|
|
97
|
+
- **Privacy-preserving** architecture
|
|
98
|
+
|
|
99
|
+
Happy coding! 🌙
|
|
File without changes
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Dependencies
|
|
2
|
+
node_modules/
|
|
3
|
+
npm-debug.log*
|
|
4
|
+
yarn-debug.log*
|
|
5
|
+
yarn-error.log*
|
|
6
|
+
|
|
7
|
+
# Build output
|
|
8
|
+
dist/
|
|
9
|
+
build/
|
|
10
|
+
|
|
11
|
+
# Environment variables
|
|
12
|
+
.env
|
|
13
|
+
.env.local
|
|
14
|
+
.env.development.local
|
|
15
|
+
.env.test.local
|
|
16
|
+
.env.production.local
|
|
17
|
+
|
|
18
|
+
# Contract artifacts
|
|
19
|
+
contracts/managed/
|
|
20
|
+
|
|
21
|
+
# Deployment info
|
|
22
|
+
deployment.json
|
|
23
|
+
|
|
24
|
+
# OS generated files
|
|
25
|
+
.DS_Store
|
|
26
|
+
Thumbs.db
|
|
27
|
+
|
|
28
|
+
# IDE files
|
|
29
|
+
.vscode/settings.json
|
|
30
|
+
.idea/
|
|
31
|
+
*.swp
|
|
32
|
+
*.swo
|
|
33
|
+
|
|
34
|
+
# Logs
|
|
35
|
+
logs/
|
|
36
|
+
*.log
|
|
37
|
+
|
|
38
|
+
# Runtime data
|
|
39
|
+
pids/
|
|
40
|
+
*.pid
|
|
41
|
+
*.seed
|
|
42
|
+
*.pid.lock
|
|
43
|
+
|
|
44
|
+
# Coverage directory
|
|
45
|
+
coverage/
|
|
46
|
+
|
|
47
|
+
# Private state
|
|
48
|
+
*-state/
|
|
49
|
+
|
|
50
|
+
# Temporary files
|
|
51
|
+
tmp/
|
|
52
|
+
temp/
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
pragma language_version >= 0.16 && <= 0.17;
|
|
2
|
+
|
|
3
|
+
import CompactStandardLibrary;
|
|
4
|
+
|
|
5
|
+
// Public ledger state - visible on blockchain
|
|
6
|
+
export ledger message: Opaque<"string">;
|
|
7
|
+
|
|
8
|
+
// Circuit to store a message on the blockchain
|
|
9
|
+
// The message will be publicly visible
|
|
10
|
+
export circuit storeMessage(customMessage: Opaque<"string">): [] {
|
|
11
|
+
message = disclose(customMessage);
|
|
12
|
+
}
|