@devvmichael/create-stacks-app 0.1.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.
Files changed (115) hide show
  1. package/dist/commands/add.d.ts +8 -0
  2. package/dist/commands/add.d.ts.map +1 -0
  3. package/dist/commands/add.js +215 -0
  4. package/dist/commands/add.js.map +1 -0
  5. package/dist/commands/create.d.ts +3 -0
  6. package/dist/commands/create.d.ts.map +1 -0
  7. package/dist/commands/create.js +63 -0
  8. package/dist/commands/create.js.map +1 -0
  9. package/dist/commands/deploy.d.ts +7 -0
  10. package/dist/commands/deploy.d.ts.map +1 -0
  11. package/dist/commands/deploy.js +159 -0
  12. package/dist/commands/deploy.js.map +1 -0
  13. package/dist/index.d.ts +3 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +47 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/prompts/project.d.ts +4 -0
  18. package/dist/prompts/project.d.ts.map +1 -0
  19. package/dist/prompts/project.js +124 -0
  20. package/dist/prompts/project.js.map +1 -0
  21. package/dist/templates/installer.d.ts +4 -0
  22. package/dist/templates/installer.d.ts.map +1 -0
  23. package/dist/templates/installer.js +91 -0
  24. package/dist/templates/installer.js.map +1 -0
  25. package/dist/types/index.d.ts +40 -0
  26. package/dist/types/index.d.ts.map +1 -0
  27. package/dist/types/index.js +2 -0
  28. package/dist/types/index.js.map +1 -0
  29. package/dist/utils/clarinet.d.ts +5 -0
  30. package/dist/utils/clarinet.d.ts.map +1 -0
  31. package/dist/utils/clarinet.js +72 -0
  32. package/dist/utils/clarinet.js.map +1 -0
  33. package/dist/utils/filesystem.d.ts +4 -0
  34. package/dist/utils/filesystem.d.ts.map +1 -0
  35. package/dist/utils/filesystem.js +158 -0
  36. package/dist/utils/filesystem.js.map +1 -0
  37. package/dist/utils/git.d.ts +2 -0
  38. package/dist/utils/git.d.ts.map +1 -0
  39. package/dist/utils/git.js +21 -0
  40. package/dist/utils/git.js.map +1 -0
  41. package/dist/utils/logger.d.ts +7 -0
  42. package/dist/utils/logger.d.ts.map +1 -0
  43. package/dist/utils/logger.js +45 -0
  44. package/dist/utils/logger.js.map +1 -0
  45. package/dist/utils/package-manager.d.ts +5 -0
  46. package/dist/utils/package-manager.d.ts.map +1 -0
  47. package/dist/utils/package-manager.js +65 -0
  48. package/dist/utils/package-manager.js.map +1 -0
  49. package/dist/utils/validation.d.ts +5 -0
  50. package/dist/utils/validation.d.ts.map +1 -0
  51. package/dist/utils/validation.js +41 -0
  52. package/dist/utils/validation.js.map +1 -0
  53. package/package.json +52 -0
  54. package/templates/base/editorconfig +12 -0
  55. package/templates/base/gitignore +13 -0
  56. package/templates/base/prettierrc +7 -0
  57. package/templates/contracts/counter/counter.clar +43 -0
  58. package/templates/contracts/counter/counter.test.ts +127 -0
  59. package/templates/contracts/defi/sip010-trait.clar +11 -0
  60. package/templates/contracts/defi/staking-pool.clar +20 -0
  61. package/templates/contracts/marketplace/nft-marketplace.clar +44 -0
  62. package/templates/contracts/marketplace/nft-trait.clar +8 -0
  63. package/templates/contracts/marketplace/sip009-nft.clar +25 -0
  64. package/templates/contracts/nft/nft.clar +111 -0
  65. package/templates/contracts/nft/nft.test.ts +204 -0
  66. package/templates/contracts/token/token.clar +67 -0
  67. package/templates/contracts/token/token.test.ts +139 -0
  68. package/templates/frontends/nextjs/template/.env.example +2 -0
  69. package/templates/frontends/nextjs/template/app/globals.css +40 -0
  70. package/templates/frontends/nextjs/template/app/layout.tsx +36 -0
  71. package/templates/frontends/nextjs/template/app/page.tsx +42 -0
  72. package/templates/frontends/nextjs/template/app/providers.tsx +31 -0
  73. package/templates/frontends/nextjs/template/components/contracts/counter-interaction.tsx +80 -0
  74. package/templates/frontends/nextjs/template/components/header.tsx +24 -0
  75. package/templates/frontends/nextjs/template/components/wallet/connect-button.tsx +44 -0
  76. package/templates/frontends/nextjs/template/hooks/use-contract-call.ts +52 -0
  77. package/templates/frontends/nextjs/template/hooks/use-contract-read.ts +49 -0
  78. package/templates/frontends/nextjs/template/hooks/use-stacks.ts +26 -0
  79. package/templates/frontends/nextjs/template/lib/contracts.ts +29 -0
  80. package/templates/frontends/nextjs/template/lib/stacks.ts +18 -0
  81. package/templates/frontends/nextjs/template/next.config.js +6 -0
  82. package/templates/frontends/nextjs/template/package.json +29 -0
  83. package/templates/frontends/nextjs/template/postcss.config.js +6 -0
  84. package/templates/frontends/nextjs/template/public/logo.svg +3 -0
  85. package/templates/frontends/nextjs/template/tailwind.config.js +18 -0
  86. package/templates/frontends/nextjs/template/tsconfig.json +26 -0
  87. package/templates/frontends/react/template/.env.example +2 -0
  88. package/templates/frontends/react/template/index.html +13 -0
  89. package/templates/frontends/react/template/package.json +29 -0
  90. package/templates/frontends/react/template/postcss.config.js +6 -0
  91. package/templates/frontends/react/template/public/logo.svg +3 -0
  92. package/templates/frontends/react/template/src/App.tsx +100 -0
  93. package/templates/frontends/react/template/src/components/CounterInteraction.tsx +121 -0
  94. package/templates/frontends/react/template/src/components/Header.tsx +39 -0
  95. package/templates/frontends/react/template/src/index.css +33 -0
  96. package/templates/frontends/react/template/src/main.tsx +10 -0
  97. package/templates/frontends/react/template/tailwind.config.js +15 -0
  98. package/templates/frontends/react/template/tsconfig.json +25 -0
  99. package/templates/frontends/react/template/tsconfig.node.json +10 -0
  100. package/templates/frontends/react/template/vite.config.ts +12 -0
  101. package/templates/frontends/vue/template/.env.example +2 -0
  102. package/templates/frontends/vue/template/index.html +13 -0
  103. package/templates/frontends/vue/template/package.json +27 -0
  104. package/templates/frontends/vue/template/postcss.config.js +6 -0
  105. package/templates/frontends/vue/template/public/logo.svg +3 -0
  106. package/templates/frontends/vue/template/src/App.vue +98 -0
  107. package/templates/frontends/vue/template/src/components/AppHeader.vue +39 -0
  108. package/templates/frontends/vue/template/src/components/CounterInteraction.vue +120 -0
  109. package/templates/frontends/vue/template/src/env.d.ts +16 -0
  110. package/templates/frontends/vue/template/src/main.ts +5 -0
  111. package/templates/frontends/vue/template/src/style.css +33 -0
  112. package/templates/frontends/vue/template/tailwind.config.js +15 -0
  113. package/templates/frontends/vue/template/tsconfig.json +25 -0
  114. package/templates/frontends/vue/template/tsconfig.node.json +10 -0
  115. package/templates/frontends/vue/template/vite.config.ts +12 -0
@@ -0,0 +1,124 @@
1
+ import inquirer from "inquirer";
2
+ import path from "path";
3
+ import { detectPackageManager } from "../utils/package-manager.js";
4
+ export async function runPrompts(projectName, options) {
5
+ const defaultPM = await detectPackageManager();
6
+ const answers = await inquirer.prompt([
7
+ {
8
+ type: "input",
9
+ name: "projectName",
10
+ message: "Project name:",
11
+ default: projectName || "my-stacks-app",
12
+ when: !projectName,
13
+ validate: (input) => {
14
+ if (!input.trim())
15
+ return "Project name is required";
16
+ if (!/^[a-z0-9-]+$/.test(input)) {
17
+ return "Project name must contain only lowercase letters, numbers, and hyphens";
18
+ }
19
+ if (input.startsWith("-") || input.endsWith("-")) {
20
+ return "Project name cannot start or end with a hyphen";
21
+ }
22
+ return true;
23
+ },
24
+ },
25
+ {
26
+ type: "list",
27
+ name: "template",
28
+ message: "Select a frontend framework:",
29
+ choices: [
30
+ { name: "Next.js (Recommended)", value: "nextjs" },
31
+ { name: "React", value: "react" },
32
+ { name: "Vue", value: "vue" },
33
+ ],
34
+ default: "nextjs",
35
+ when: !options?.template,
36
+ },
37
+ {
38
+ type: "confirm",
39
+ name: "typescript",
40
+ message: "Use TypeScript?",
41
+ default: true,
42
+ when: options?.typescript === undefined,
43
+ },
44
+ {
45
+ type: "checkbox",
46
+ name: "contracts",
47
+ message: "Select smart contracts to include:",
48
+ choices: [
49
+ {
50
+ name: "Counter (Simple state management example)",
51
+ value: "counter",
52
+ checked: true,
53
+ },
54
+ {
55
+ name: "Token (SIP-010 fungible token)",
56
+ value: "token",
57
+ checked: false,
58
+ },
59
+ {
60
+ name: "NFT (SIP-009 non-fungible token)",
61
+ value: "nft",
62
+ checked: false,
63
+ },
64
+ ],
65
+ when: !options?.contracts,
66
+ },
67
+ {
68
+ type: "confirm",
69
+ name: "tailwind",
70
+ message: "Include Tailwind CSS?",
71
+ default: true,
72
+ when: options?.tailwind === undefined,
73
+ },
74
+ {
75
+ type: "confirm",
76
+ name: "git",
77
+ message: "Initialize Git repository?",
78
+ default: true,
79
+ when: options?.git !== false,
80
+ },
81
+ {
82
+ type: "list",
83
+ name: "packageManager",
84
+ message: "Package manager:",
85
+ choices: [
86
+ { name: "pnpm (Recommended)", value: "pnpm" },
87
+ { name: "npm", value: "npm" },
88
+ { name: "yarn", value: "yarn" },
89
+ ],
90
+ default: defaultPM,
91
+ when: !options?.packageManager,
92
+ },
93
+ ]);
94
+ const finalProjectName = answers.projectName || projectName || "my-stacks-app";
95
+ return {
96
+ projectName: finalProjectName,
97
+ projectPath: path.resolve(process.cwd(), finalProjectName),
98
+ template: answers.template || options?.template || "nextjs",
99
+ typescript: answers.typescript ?? options?.typescript ?? true,
100
+ contracts: answers.contracts ||
101
+ options?.contracts?.split(",") || ["counter"],
102
+ tailwind: answers.tailwind ?? options?.tailwind ?? true,
103
+ git: answers.git ?? options?.git !== false,
104
+ packageManager: (answers.packageManager ||
105
+ options?.packageManager ||
106
+ defaultPM),
107
+ skipInstall: options?.skipInstall || false,
108
+ };
109
+ }
110
+ export async function getDefaultConfig(projectName, options) {
111
+ const defaultPM = await detectPackageManager();
112
+ return {
113
+ projectName,
114
+ projectPath: path.resolve(process.cwd(), projectName),
115
+ template: options?.template || "nextjs",
116
+ typescript: options?.typescript ?? true,
117
+ contracts: options?.contracts?.split(",") || ["counter"],
118
+ tailwind: options?.tailwind ?? true,
119
+ git: options?.git !== false,
120
+ packageManager: options?.packageManager || defaultPM,
121
+ skipInstall: options?.skipInstall || false,
122
+ };
123
+ }
124
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/prompts/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ProjectConfig } from '../types/index.js';
2
+ export declare function installFrontendTemplate(config: ProjectConfig, templatesDir: string): Promise<void>;
3
+ export declare function installContracts(config: ProjectConfig, templatesDir: string): Promise<void>;
4
+ //# sourceMappingURL=installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/templates/installer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,aAAa,EACrB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,aAAa,EACrB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
@@ -0,0 +1,91 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import ora from 'ora';
4
+ import Handlebars from 'handlebars';
5
+ export async function installFrontendTemplate(config, templatesDir) {
6
+ const spinner = ora('Installing frontend template...').start();
7
+ try {
8
+ const { projectPath, template, typescript } = config;
9
+ const frontendPath = path.join(projectPath, 'frontend');
10
+ // Determine template path
11
+ const templateName = `${template}-${typescript ? 'typescript' : 'javascript'}`;
12
+ const templatePath = path.join(templatesDir, 'frontends', templateName, 'template');
13
+ if (!(await fs.pathExists(templatePath))) {
14
+ // Fallback to just the template name if typescript/javascript variant doesn't exist
15
+ const fallbackPath = path.join(templatesDir, 'frontends', template, 'template');
16
+ if (await fs.pathExists(fallbackPath)) {
17
+ await fs.copy(fallbackPath, frontendPath);
18
+ }
19
+ else {
20
+ throw new Error(`Template not found: ${templateName}`);
21
+ }
22
+ }
23
+ else {
24
+ await fs.copy(templatePath, frontendPath);
25
+ }
26
+ // Process template variables
27
+ await processTemplateVariables(frontendPath, config);
28
+ spinner.succeed('Frontend template installed');
29
+ }
30
+ catch (error) {
31
+ spinner.fail('Failed to install frontend template');
32
+ throw error;
33
+ }
34
+ }
35
+ export async function installContracts(config, templatesDir) {
36
+ const spinner = ora('Installing smart contracts...').start();
37
+ try {
38
+ const { projectPath, contracts } = config;
39
+ const contractsPath = path.join(projectPath, 'contracts');
40
+ const testsPath = path.join(projectPath, 'tests');
41
+ for (const contract of contracts) {
42
+ const contractTemplatePath = path.join(templatesDir, 'contracts', contract);
43
+ // Copy contract file
44
+ const contractFile = path.join(contractTemplatePath, `${contract}.clar`);
45
+ if (await fs.pathExists(contractFile)) {
46
+ await fs.copy(contractFile, path.join(contractsPath, `${contract}.clar`));
47
+ }
48
+ // Copy test file
49
+ const testFile = path.join(contractTemplatePath, `${contract}.test.ts`);
50
+ if (await fs.pathExists(testFile)) {
51
+ await fs.copy(testFile, path.join(testsPath, `${contract}.test.ts`));
52
+ }
53
+ }
54
+ spinner.succeed('Smart contracts installed');
55
+ }
56
+ catch (error) {
57
+ spinner.fail('Failed to install smart contracts');
58
+ throw error;
59
+ }
60
+ }
61
+ async function processTemplateVariables(frontendPath, config) {
62
+ const files = await getAllFiles(frontendPath);
63
+ // Register Handlebars helpers
64
+ Handlebars.registerHelper('includes', (array, value) => {
65
+ return array.includes(value);
66
+ });
67
+ for (const file of files) {
68
+ if (file.endsWith('.hbs') || file.endsWith('.template')) {
69
+ const content = await fs.readFile(file, 'utf-8');
70
+ const template = Handlebars.compile(content);
71
+ const result = template({
72
+ projectName: config.projectName,
73
+ contracts: config.contracts,
74
+ typescript: config.typescript,
75
+ tailwind: config.tailwind,
76
+ });
77
+ const newPath = file.replace('.hbs', '').replace('.template', '');
78
+ await fs.writeFile(newPath, result);
79
+ await fs.remove(file);
80
+ }
81
+ }
82
+ }
83
+ async function getAllFiles(dir) {
84
+ const entries = await fs.readdir(dir, { withFileTypes: true });
85
+ const files = await Promise.all(entries.map((entry) => {
86
+ const fullPath = path.join(dir, entry.name);
87
+ return entry.isDirectory() ? getAllFiles(fullPath) : fullPath;
88
+ }));
89
+ return files.flat();
90
+ }
91
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/templates/installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ export type PackageManager = 'npm' | 'pnpm' | 'yarn';
2
+ export interface CreateOptions {
3
+ template?: string;
4
+ contracts?: string;
5
+ typescript?: boolean;
6
+ tailwind?: boolean;
7
+ git?: boolean;
8
+ packageManager?: PackageManager;
9
+ skipInstall?: boolean;
10
+ yes?: boolean;
11
+ }
12
+ export interface ProjectConfig {
13
+ projectName: string;
14
+ projectPath: string;
15
+ template: 'nextjs' | 'react' | 'vue';
16
+ typescript: boolean;
17
+ contracts: string[];
18
+ tailwind: boolean;
19
+ git: boolean;
20
+ packageManager: PackageManager;
21
+ skipInstall: boolean;
22
+ }
23
+ export interface ContractTemplate {
24
+ name: string;
25
+ description: string;
26
+ files: {
27
+ contract: string;
28
+ test: string;
29
+ };
30
+ }
31
+ export interface FrontendTemplate {
32
+ name: string;
33
+ description: string;
34
+ path: string;
35
+ supports: {
36
+ typescript: boolean;
37
+ javascript: boolean;
38
+ };
39
+ }
40
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;IACrC,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,GAAG,EAAE,OAAO,CAAC;IACb,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE;QACR,UAAU,EAAE,OAAO,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;CACH"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import type { ProjectConfig } from '../types/index.js';
2
+ export declare function checkClarinetInstallation(): Promise<boolean>;
3
+ export declare function initializeClarinet(config: ProjectConfig): Promise<void>;
4
+ export declare function updateClarinetConfig(projectPath: string, contracts: string[]): Promise<void>;
5
+ //# sourceMappingURL=clarinet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clarinet.d.ts","sourceRoot":"","sources":["../../src/utils/clarinet.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIvD,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,OAAO,CAAC,CAOlE;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA+C7E;AAED,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,IAAI,CAAC,CAgBf"}
@@ -0,0 +1,72 @@
1
+ import { exec } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import ora from 'ora';
4
+ import path from 'path';
5
+ import fs from 'fs-extra';
6
+ const execAsync = promisify(exec);
7
+ export async function checkClarinetInstallation() {
8
+ try {
9
+ await execAsync('clarinet --version');
10
+ return true;
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ }
16
+ export async function initializeClarinet(config) {
17
+ const spinner = ora('Initializing Clarinet...').start();
18
+ try {
19
+ const { projectPath, projectName } = config;
20
+ // Create Clarinet.toml manually instead of using clarinet new
21
+ const clarinetToml = `[project]
22
+ name = "${projectName}"
23
+ description = ""
24
+ authors = []
25
+ telemetry = false
26
+ cache_dir = "./.cache"
27
+
28
+ [contracts]
29
+ `;
30
+ await fs.writeFile(path.join(projectPath, 'Clarinet.toml'), clarinetToml);
31
+ // Create settings directory
32
+ await fs.ensureDir(path.join(projectPath, 'settings'));
33
+ // Create Devnet.toml
34
+ const devnetToml = `[network]
35
+ name = "devnet"
36
+ deployment_fee_rate = 10
37
+
38
+ [accounts.deployer]
39
+ mnemonic = "twice particular affair smile push picture miss direct toss brass expose better"
40
+ balance = 10_000_000_000_000_000
41
+
42
+ [accounts.wallet_1]
43
+ mnemonic = "sell invite acquire kitten believe struggle find damp current debris convince key"
44
+ balance = 10_000_000_000_000_000
45
+
46
+ [accounts.wallet_2]
47
+ mnemonic = "hold excess usual excess ring elephant install account glad dry display sauce"
48
+ balance = 10_000_000_000_000_000
49
+ `;
50
+ await fs.writeFile(path.join(projectPath, 'settings', 'Devnet.toml'), devnetToml);
51
+ spinner.succeed('Clarinet initialized');
52
+ }
53
+ catch (error) {
54
+ spinner.fail('Failed to initialize Clarinet');
55
+ throw error;
56
+ }
57
+ }
58
+ export async function updateClarinetConfig(projectPath, contracts) {
59
+ const clarinetTomlPath = path.join(projectPath, 'Clarinet.toml');
60
+ let tomlContent = await fs.readFile(clarinetTomlPath, 'utf-8');
61
+ // Add contracts based on selection
62
+ for (const contract of contracts) {
63
+ tomlContent += `
64
+ [contracts.${contract}]
65
+ path = "contracts/${contract}.clar"
66
+ clarity_version = 2
67
+ epoch = 2.5
68
+ `;
69
+ }
70
+ await fs.writeFile(clarinetTomlPath, tomlContent);
71
+ }
72
+ //# sourceMappingURL=clarinet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clarinet.js","sourceRoot":"","sources":["../../src/utils/clarinet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,UAAU,CAAC;AAG1B,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAC7C,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAqB;IAC5D,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;IAExD,IAAI,CAAC;QACH,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;QAE5C,8DAA8D;QAC9D,MAAM,YAAY,GAAG;UACf,WAAW;;;;;;;CAOpB,CAAC;QAEE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,YAAY,CAAC,CAAC;QAE1E,4BAA4B;QAC5B,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;QAEvD,qBAAqB;QACrB,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;CAetB,CAAC;QAEE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,UAAU,CAAC,CAAC;QAElF,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC9C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,WAAmB,EACnB,SAAmB;IAEnB,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAEjE,IAAI,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IAE/D,mCAAmC;IACnC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,WAAW,IAAI;aACN,QAAQ;oBACD,QAAQ;;;CAG3B,CAAC;IACA,CAAC;IAED,MAAM,EAAE,CAAC,SAAS,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ProjectConfig } from '../types/index.js';
2
+ export declare function createProjectStructure(config: ProjectConfig): Promise<void>;
3
+ export declare function copyBaseFiles(projectPath: string, config: ProjectConfig, templatesDir: string): Promise<void>;
4
+ //# sourceMappingURL=filesystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/utils/filesystem.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBjF;AAED,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,aAAa,EACrB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAyCf"}
@@ -0,0 +1,158 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import ora from 'ora';
4
+ export async function createProjectStructure(config) {
5
+ const spinner = ora('Creating project structure...').start();
6
+ try {
7
+ const { projectPath } = config;
8
+ // Check if directory exists
9
+ if (await fs.pathExists(projectPath)) {
10
+ spinner.fail(`Directory ${config.projectName} already exists`);
11
+ throw new Error(`Directory ${config.projectName} already exists`);
12
+ }
13
+ // Create main directories
14
+ await fs.ensureDir(projectPath);
15
+ await fs.ensureDir(path.join(projectPath, 'contracts'));
16
+ await fs.ensureDir(path.join(projectPath, 'tests'));
17
+ await fs.ensureDir(path.join(projectPath, 'frontend'));
18
+ await fs.ensureDir(path.join(projectPath, 'scripts'));
19
+ spinner.succeed('Project structure created');
20
+ }
21
+ catch (error) {
22
+ spinner.fail('Failed to create project structure');
23
+ throw error;
24
+ }
25
+ }
26
+ export async function copyBaseFiles(projectPath, config, templatesDir) {
27
+ const spinner = ora('Copying base files...').start();
28
+ try {
29
+ const baseTemplatePath = path.join(templatesDir, 'base');
30
+ // Copy .gitignore
31
+ if (await fs.pathExists(path.join(baseTemplatePath, 'gitignore'))) {
32
+ await fs.copy(path.join(baseTemplatePath, 'gitignore'), path.join(projectPath, '.gitignore'));
33
+ }
34
+ // Copy .editorconfig
35
+ if (await fs.pathExists(path.join(baseTemplatePath, 'editorconfig'))) {
36
+ await fs.copy(path.join(baseTemplatePath, 'editorconfig'), path.join(projectPath, '.editorconfig'));
37
+ }
38
+ // Copy .prettierrc
39
+ if (await fs.pathExists(path.join(baseTemplatePath, 'prettierrc'))) {
40
+ await fs.copy(path.join(baseTemplatePath, 'prettierrc'), path.join(projectPath, '.prettierrc'));
41
+ }
42
+ // Generate README
43
+ await generateReadme(projectPath, config);
44
+ // Create root package.json
45
+ await createRootPackageJson(projectPath, config);
46
+ spinner.succeed('Base files copied');
47
+ }
48
+ catch (error) {
49
+ spinner.fail('Failed to copy base files');
50
+ throw error;
51
+ }
52
+ }
53
+ async function generateReadme(projectPath, config) {
54
+ const { projectName, packageManager } = config;
55
+ const runCmd = packageManager === 'npm' ? 'npm run' : packageManager;
56
+ const readme = `# ${projectName}
57
+
58
+ A full-stack Stacks blockchain application built with Create-Stacks-App.
59
+
60
+ ## Getting Started
61
+
62
+ ### Prerequisites
63
+
64
+ - Node.js 18+ and ${packageManager}
65
+ - [Clarinet](https://github.com/hirosystems/clarinet) installed
66
+
67
+ ### Development
68
+
69
+ Start the development server:
70
+
71
+ \`\`\`bash
72
+ ${runCmd} dev
73
+ \`\`\`
74
+
75
+ This will:
76
+ - Start the Clarinet devnet
77
+ - Launch the frontend development server
78
+ - Enable hot-reload for both contracts and frontend
79
+
80
+ The app will be available at http://localhost:3000
81
+
82
+ ### Testing
83
+
84
+ Run contract tests:
85
+
86
+ \`\`\`bash
87
+ ${runCmd} test
88
+ \`\`\`
89
+
90
+ ### Building
91
+
92
+ Build the frontend for production:
93
+
94
+ \`\`\`bash
95
+ ${runCmd} build
96
+ \`\`\`
97
+
98
+ ### Deployment
99
+
100
+ Deploy contracts to testnet:
101
+
102
+ \`\`\`bash
103
+ ${runCmd} deploy:testnet
104
+ \`\`\`
105
+
106
+ Deploy contracts to mainnet:
107
+
108
+ \`\`\`bash
109
+ ${runCmd} deploy:mainnet
110
+ \`\`\`
111
+
112
+ ## Project Structure
113
+
114
+ \`\`\`
115
+ ${projectName}/
116
+ ├── contracts/ # Clarity smart contracts
117
+ ├── tests/ # Contract tests
118
+ ├── frontend/ # Frontend application
119
+ ├── scripts/ # Utility scripts
120
+ └── Clarinet.toml # Clarinet configuration
121
+ \`\`\`
122
+
123
+ ## Learn More
124
+
125
+ - [Stacks Documentation](https://docs.stacks.co)
126
+ - [Clarity Language](https://docs.stacks.co/clarity)
127
+ - [Stacks.js](https://github.com/hirosystems/stacks.js)
128
+ - [Clarinet](https://github.com/hirosystems/clarinet)
129
+
130
+ ## License
131
+
132
+ MIT
133
+ `;
134
+ await fs.writeFile(path.join(projectPath, 'README.md'), readme);
135
+ }
136
+ async function createRootPackageJson(projectPath, config) {
137
+ const { projectName, packageManager } = config;
138
+ const packageJson = {
139
+ name: projectName,
140
+ version: '0.1.0',
141
+ private: true,
142
+ scripts: {
143
+ dev: 'concurrently "npm run dev:clarinet" "npm run dev:frontend"',
144
+ 'dev:clarinet': 'clarinet devnet start',
145
+ 'dev:frontend': 'cd frontend && npm run dev',
146
+ test: 'clarinet test',
147
+ 'test:frontend': 'cd frontend && npm run test',
148
+ build: 'cd frontend && npm run build',
149
+ 'deploy:testnet': 'node scripts/deploy-testnet.js',
150
+ 'deploy:mainnet': 'node scripts/deploy-mainnet.js',
151
+ },
152
+ devDependencies: {
153
+ concurrently: '^8.2.2',
154
+ },
155
+ };
156
+ await fs.writeFile(path.join(projectPath, 'package.json'), JSON.stringify(packageJson, null, 2));
157
+ }
158
+ //# sourceMappingURL=filesystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/utils/filesystem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function initializeGit(projectPath: string): Promise<void>;
2
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAMA,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBtE"}
@@ -0,0 +1,21 @@
1
+ import ora from 'ora';
2
+ import { exec } from 'child_process';
3
+ import { promisify } from 'util';
4
+ const execAsync = promisify(exec);
5
+ export async function initializeGit(projectPath) {
6
+ const spinner = ora('Initializing Git repository...').start();
7
+ try {
8
+ await execAsync('git init', { cwd: projectPath });
9
+ await execAsync('git add -A', { cwd: projectPath });
10
+ await execAsync('git commit -m "Initial commit from create-stacks-app"', {
11
+ cwd: projectPath,
12
+ });
13
+ spinner.succeed('Git repository initialized');
14
+ }
15
+ catch (error) {
16
+ spinner.fail('Failed to initialize Git repository');
17
+ // Non-fatal error, just warn
18
+ console.warn('Git initialization failed. You can initialize it manually.');
19
+ }
20
+ }
21
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,WAAmB;IACrD,MAAM,OAAO,GAAG,GAAG,CAAC,gCAAgC,CAAC,CAAC,KAAK,EAAE,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;QAClD,MAAM,SAAS,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;QACpD,MAAM,SAAS,CAAC,uDAAuD,EAAE;YACvE,GAAG,EAAE,WAAW;SACjB,CAAC,CAAC;QAEH,OAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACpD,6BAA6B;QAC7B,OAAO,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ProjectConfig } from '../types/index.js';
2
+ export declare function showIntro(): void;
3
+ export declare function showSuccess(config: ProjectConfig): void;
4
+ export declare function logStep(message: string): void;
5
+ export declare function logError(message: string): void;
6
+ export declare function logWarning(message: string): void;
7
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,wBAAgB,SAAS,IAAI,IAAI,CAKhC;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CA6BvD;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD"}
@@ -0,0 +1,45 @@
1
+ import chalk from 'chalk';
2
+ export function showIntro() {
3
+ console.log();
4
+ console.log(chalk.cyan.bold(' Create Stacks App'));
5
+ console.log(chalk.gray(' Scaffold full-stack Stacks blockchain applications'));
6
+ console.log();
7
+ }
8
+ export function showSuccess(config) {
9
+ const { projectName, packageManager } = config;
10
+ const runCmd = packageManager === 'npm' ? 'npm run' : packageManager;
11
+ console.log();
12
+ console.log(chalk.green('✓') + ' Success! Created ' + chalk.bold(projectName));
13
+ console.log();
14
+ console.log(chalk.bold('Next steps:'));
15
+ console.log();
16
+ console.log(chalk.cyan(' 1.') + ` cd ${projectName}`);
17
+ console.log(chalk.cyan(' 2.') + ` ${runCmd} dev`);
18
+ console.log();
19
+ console.log(chalk.bold('Available commands:'));
20
+ console.log();
21
+ console.log(chalk.cyan(` ${runCmd} dev`));
22
+ console.log(' Start development server with Clarinet devnet');
23
+ console.log();
24
+ console.log(chalk.cyan(` ${runCmd} test`));
25
+ console.log(' Run contract tests');
26
+ console.log();
27
+ console.log(chalk.cyan(` ${runCmd} build`));
28
+ console.log(' Build frontend for production');
29
+ console.log();
30
+ console.log(chalk.cyan(` ${runCmd} deploy:testnet`));
31
+ console.log(' Deploy contracts to testnet');
32
+ console.log();
33
+ console.log(chalk.yellow('Happy building! 🚀'));
34
+ console.log();
35
+ }
36
+ export function logStep(message) {
37
+ console.log(chalk.cyan('○') + ' ' + message);
38
+ }
39
+ export function logError(message) {
40
+ console.error(chalk.red('✖') + ' ' + message);
41
+ }
42
+ export function logWarning(message) {
43
+ console.warn(chalk.yellow('⚠') + ' ' + message);
44
+ }
45
+ //# sourceMappingURL=logger.js.map