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.
Files changed (51) hide show
  1. package/README.md +239 -0
  2. package/bin/create-midnight-app.js +47 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +35 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/create-app.d.ts +10 -0
  8. package/dist/create-app.d.ts.map +1 -0
  9. package/dist/create-app.js +186 -0
  10. package/dist/create-app.js.map +1 -0
  11. package/dist/installers/package-installer.d.ts +8 -0
  12. package/dist/installers/package-installer.d.ts.map +1 -0
  13. package/dist/installers/package-installer.js +62 -0
  14. package/dist/installers/package-installer.js.map +1 -0
  15. package/dist/installers/proof-server-setup.d.ts +6 -0
  16. package/dist/installers/proof-server-setup.d.ts.map +1 -0
  17. package/dist/installers/proof-server-setup.js +54 -0
  18. package/dist/installers/proof-server-setup.js.map +1 -0
  19. package/dist/installers/wallet-generator.d.ts +4 -0
  20. package/dist/installers/wallet-generator.d.ts.map +1 -0
  21. package/dist/installers/wallet-generator.js +64 -0
  22. package/dist/installers/wallet-generator.js.map +1 -0
  23. package/dist/test.d.ts +2 -0
  24. package/dist/test.d.ts.map +1 -0
  25. package/dist/test.js +53 -0
  26. package/dist/test.js.map +1 -0
  27. package/dist/utils/git-utils.d.ts +6 -0
  28. package/dist/utils/git-utils.d.ts.map +1 -0
  29. package/dist/utils/git-utils.js +51 -0
  30. package/dist/utils/git-utils.js.map +1 -0
  31. package/dist/utils/template-manager.d.ts +7 -0
  32. package/dist/utils/template-manager.d.ts.map +1 -0
  33. package/dist/utils/template-manager.js +61 -0
  34. package/dist/utils/template-manager.js.map +1 -0
  35. package/dist/utils/validation.d.ts +6 -0
  36. package/dist/utils/validation.d.ts.map +1 -0
  37. package/dist/utils/validation.js +32 -0
  38. package/dist/utils/validation.js.map +1 -0
  39. package/package.json +60 -0
  40. package/templates/hello-world/README.md.template +99 -0
  41. package/templates/hello-world/_env.template +0 -0
  42. package/templates/hello-world/_gitignore +52 -0
  43. package/templates/hello-world/contracts/hello-world.compact.template +12 -0
  44. package/templates/hello-world/nodemon.json.template +7 -0
  45. package/templates/hello-world/package.json.template +51 -0
  46. package/templates/hello-world/src/check-balance.ts.template +107 -0
  47. package/templates/hello-world/src/cli.ts.template +194 -0
  48. package/templates/hello-world/src/deploy.ts.template +218 -0
  49. package/templates/hello-world/src/providers/midnight-providers.ts.template +46 -0
  50. package/templates/hello-world/src/utils/environment.ts.template +51 -0
  51. 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,4 @@
1
+ export declare class WalletGenerator {
2
+ generate(projectPath: string): Promise<string>;
3
+ }
4
+ //# sourceMappingURL=wallet-generator.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test.d.ts.map
@@ -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
@@ -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,6 @@
1
+ export declare class GitUtils {
2
+ static init(projectPath: string): Promise<void>;
3
+ private static isGitAvailable;
4
+ private static runGitCommand;
5
+ }
6
+ //# sourceMappingURL=git-utils.d.ts.map
@@ -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,7 @@
1
+ export declare class TemplateManager {
2
+ private templateName;
3
+ constructor(templateName: string);
4
+ scaffold(projectPath: string, projectName: string): Promise<void>;
5
+ private copyTemplate;
6
+ }
7
+ //# sourceMappingURL=template-manager.d.ts.map
@@ -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,6 @@
1
+ export interface ValidationResult {
2
+ valid: boolean;
3
+ problems?: string[];
4
+ }
5
+ export declare function validateProjectName(name: string): ValidationResult;
6
+ //# sourceMappingURL=validation.d.ts.map
@@ -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
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "watch": ["contracts/**/*.compact", "src/**/*.ts"],
3
+ "ext": "compact,ts",
4
+ "ignore": ["contracts/managed/**", "dist/**", "node_modules/**"],
5
+ "exec": "npm run compile && npm run build",
6
+ "delay": "1000"
7
+ }