@devvmichael/create-stacks-app 0.2.3 → 0.2.41

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 CHANGED
@@ -50,13 +50,13 @@ npx @devvmichael/create-stacks-app
50
50
  npx @devvmichael/create-stacks-app my-dapp [options]
51
51
 
52
52
  Options:
53
- -t, --template <name> Frontend template: nextjs, react, vue (default: nextjs)
53
+ -t, --template <name> Frontend template: nextjs, react, vue
54
54
  -c, --contracts <list> Contracts to include: counter,token,nft
55
55
  --typescript Use TypeScript (default: true)
56
56
  --no-typescript Use JavaScript
57
57
  --tailwind Include Tailwind CSS (default: true)
58
58
  --no-git Skip Git initialization
59
- --package-manager <pm> Package manager: npm, pnpm, yarn (default: pnpm)
59
+ --package-manager <pm> Package manager: npm, pnpm, yarn
60
60
  --skip-install Skip dependency installation
61
61
  -y, --yes Skip prompts, use defaults
62
62
  ```
@@ -1,7 +1,2 @@
1
- interface DeployOptions {
2
- network?: string;
3
- privateKey?: string;
4
- }
5
- export declare function deployCommand(network: string, options?: DeployOptions): Promise<void>;
6
- export {};
1
+ export declare function deployCommand(network: string): Promise<void>;
7
2
  //# sourceMappingURL=deploy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAUA,UAAU,aAAa;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,IAAI,CAAC,CA4Gf"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAeA,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,GAEd,OAAO,CAAC,IAAI,CAAC,CAkIf"}
@@ -1,30 +1,34 @@
1
- import { exec } from 'child_process';
2
- import { promisify } from 'util';
3
- import fs from 'fs-extra';
4
- import path from 'path';
5
- import ora from 'ora';
6
- import chalk from 'chalk';
7
- import inquirer from 'inquirer';
1
+ import { exec } from "child_process";
2
+ import { promisify } from "util";
3
+ import fs from "fs-extra";
4
+ import path from "path";
5
+ import ora from "ora";
6
+ import chalk from "chalk";
7
+ import inquirer from "inquirer";
8
8
  const execAsync = promisify(exec);
9
- export async function deployCommand(network, options) {
9
+ // interface DeployOptions {
10
+ // network?: string;
11
+ // privateKey?: string;
12
+ // }
13
+ export async function deployCommand(network) {
10
14
  const projectPath = process.cwd();
11
15
  // Verify we're in a stacks project
12
- if (!(await fs.pathExists(path.join(projectPath, 'Clarinet.toml')))) {
13
- console.error(chalk.red('Error: Not in a create-stacks-app project directory.'));
16
+ if (!(await fs.pathExists(path.join(projectPath, "Clarinet.toml")))) {
17
+ console.error(chalk.red("Error: Not in a create-stacks-app project directory."));
14
18
  process.exit(1);
15
19
  }
16
20
  // Warn for mainnet deployments
17
- if (network === 'mainnet') {
21
+ if (network === "mainnet") {
18
22
  const { confirm } = await inquirer.prompt([
19
23
  {
20
- type: 'confirm',
21
- name: 'confirm',
22
- message: chalk.yellow('⚠️ You are about to deploy to MAINNET. This is irreversible. Continue?'),
24
+ type: "confirm",
25
+ name: "confirm",
26
+ message: chalk.yellow("⚠️ You are about to deploy to MAINNET. This is irreversible. Continue?"),
23
27
  default: false,
24
28
  },
25
29
  ]);
26
30
  if (!confirm) {
27
- console.log('Deployment cancelled.');
31
+ console.log("Deployment cancelled.");
28
32
  process.exit(0);
29
33
  }
30
34
  }
@@ -32,17 +36,17 @@ export async function deployCommand(network, options) {
32
36
  try {
33
37
  // Check if Clarinet is installed
34
38
  try {
35
- await execAsync('clarinet --version');
39
+ await execAsync("clarinet --version");
36
40
  }
37
41
  catch {
38
- spinner.fail('Clarinet is not installed');
39
- console.error('Please install Clarinet: https://github.com/hirosystems/clarinet');
42
+ spinner.fail("Clarinet is not installed");
43
+ console.error("Please install Clarinet: https://github.com/hirosystems/clarinet");
40
44
  process.exit(1);
41
45
  }
42
46
  // Get contracts from Clarinet.toml
43
47
  const contracts = await getContractsFromConfig(projectPath);
44
48
  if (contracts.length === 0) {
45
- spinner.fail('No contracts found in Clarinet.toml');
49
+ spinner.fail("No contracts found in Clarinet.toml");
46
50
  process.exit(1);
47
51
  }
48
52
  spinner.text = `Found ${contracts.length} contract(s) to deploy`;
@@ -50,60 +54,60 @@ export async function deployCommand(network, options) {
50
54
  const deploymentPlan = await createDeploymentPlan(projectPath, network, contracts);
51
55
  spinner.succeed(`Deployment plan created`);
52
56
  console.log();
53
- console.log(chalk.bold('Contracts to deploy:'));
57
+ console.log(chalk.bold("Contracts to deploy:"));
54
58
  contracts.forEach((c, i) => console.log(` ${i + 1}. ${chalk.cyan(c)}`));
55
59
  console.log();
56
60
  // Confirm deployment
57
61
  const { proceed } = await inquirer.prompt([
58
62
  {
59
- type: 'confirm',
60
- name: 'proceed',
63
+ type: "confirm",
64
+ name: "proceed",
61
65
  message: `Deploy ${contracts.length} contract(s) to ${network}?`,
62
66
  default: true,
63
67
  },
64
68
  ]);
65
69
  if (!proceed) {
66
- console.log('Deployment cancelled.');
70
+ console.log("Deployment cancelled.");
67
71
  process.exit(0);
68
72
  }
69
73
  // Execute deployment
70
- const deploySpinner = ora('Deploying contracts...').start();
74
+ const deploySpinner = ora("Deploying contracts...").start();
71
75
  try {
72
- const result = await execAsync(`clarinet deployments apply -p ${deploymentPlan}`, {
76
+ await execAsync(`clarinet deployments apply -p ${deploymentPlan}`, {
73
77
  cwd: projectPath,
74
78
  });
75
- deploySpinner.succeed('Contracts deployed successfully!');
79
+ deploySpinner.succeed("Contracts deployed successfully!");
76
80
  console.log();
77
- console.log(chalk.green('✓ Deployment complete'));
81
+ console.log(chalk.green("✓ Deployment complete"));
78
82
  console.log();
79
- console.log(chalk.bold('Next steps:'));
80
- console.log(` 1. Update ${chalk.cyan('NEXT_PUBLIC_CONTRACT_ADDRESS')} in your frontend .env`);
83
+ console.log(chalk.bold("Next steps:"));
84
+ console.log(` 1. Update ${chalk.cyan("NEXT_PUBLIC_CONTRACT_ADDRESS")} in your frontend .env`);
81
85
  console.log(` 2. Verify contracts on explorer: ${getExplorerUrl(network)}`);
82
- console.log(` 3. Test your dApp at ${chalk.cyan('http://localhost:3000')}`);
86
+ console.log(` 3. Test your dApp at ${chalk.cyan("http://localhost:3000")}`);
83
87
  }
84
88
  catch (error) {
85
- deploySpinner.fail('Deployment failed');
89
+ deploySpinner.fail("Deployment failed");
86
90
  console.error(chalk.red(error.message));
87
91
  // Provide helpful error messages
88
- if (error.message.includes('insufficient funds')) {
92
+ if (error.message.includes("insufficient funds")) {
89
93
  console.log();
90
- console.log(chalk.yellow('Tip: Make sure you have enough STX for deployment fees.'));
91
- if (network === 'testnet') {
92
- console.log(`Get testnet STX from the faucet: ${chalk.cyan('https://explorer.stacks.co/sandbox/faucet?chain=testnet')}`);
94
+ console.log(chalk.yellow("Tip: Make sure you have enough STX for deployment fees."));
95
+ if (network === "testnet") {
96
+ console.log(`Get testnet STX from the faucet: ${chalk.cyan("https://explorer.stacks.co/sandbox/faucet?chain=testnet")}`);
93
97
  }
94
98
  }
95
99
  process.exit(1);
96
100
  }
97
101
  }
98
102
  catch (error) {
99
- spinner.fail('Deployment failed');
103
+ spinner.fail("Deployment failed");
100
104
  console.error(error.message);
101
105
  process.exit(1);
102
106
  }
103
107
  }
104
108
  async function getContractsFromConfig(projectPath) {
105
- const tomlPath = path.join(projectPath, 'Clarinet.toml');
106
- const content = await fs.readFile(tomlPath, 'utf-8');
109
+ const tomlPath = path.join(projectPath, "Clarinet.toml");
110
+ const content = await fs.readFile(tomlPath, "utf-8");
107
111
  const contracts = [];
108
112
  const regex = /\[contracts\.(\w+)\]/g;
109
113
  let match;
@@ -113,13 +117,13 @@ async function getContractsFromConfig(projectPath) {
113
117
  return contracts;
114
118
  }
115
119
  async function createDeploymentPlan(projectPath, network, contracts) {
116
- const deploymentsPath = path.join(projectPath, 'deployments');
120
+ const deploymentsPath = path.join(projectPath, "deployments");
117
121
  await fs.ensureDir(deploymentsPath);
118
122
  const planPath = path.join(deploymentsPath, `${network}.yaml`);
119
123
  // Read project name from Clarinet.toml
120
- const tomlContent = await fs.readFile(path.join(projectPath, 'Clarinet.toml'), 'utf-8');
124
+ const tomlContent = await fs.readFile(path.join(projectPath, "Clarinet.toml"), "utf-8");
121
125
  const nameMatch = tomlContent.match(/name\s*=\s*"([^"]+)"/);
122
- const projectName = nameMatch ? nameMatch[1] : 'stacks-app';
126
+ const projectName = nameMatch ? nameMatch[1] : "stacks-app";
123
127
  const plan = `---
124
128
  id: 0
125
129
  name: ${projectName} Deployment
@@ -130,30 +134,32 @@ plan:
130
134
  batches:
131
135
  - id: 0
132
136
  transactions:
133
- ${contracts.map((c, i) => ` - contract-publish:
137
+ ${contracts
138
+ .map((c) => ` - contract-publish:
134
139
  contract-name: ${c}
135
- expected-sender: \$DEPLOYER
140
+ expected-sender: $DEPLOYER
136
141
  cost: 10000
137
142
  path: contracts/${c}.clar
138
143
  anchor-block-only: true
139
- clarity-version: 2`).join('\n')}
144
+ clarity-version: 2`)
145
+ .join("\n")}
140
146
  `;
141
147
  await fs.writeFile(planPath, plan);
142
148
  return planPath;
143
149
  }
144
150
  function getStacksNode(network) {
145
- return network === 'mainnet'
146
- ? 'https://api.mainnet.hiro.so'
147
- : 'https://api.testnet.hiro.so';
151
+ return network === "mainnet"
152
+ ? "https://api.mainnet.hiro.so"
153
+ : "https://api.testnet.hiro.so";
148
154
  }
149
155
  function getBitcoinNode(network) {
150
- return network === 'mainnet'
151
- ? 'https://api.mainnet.hiro.so'
152
- : 'https://api.testnet.hiro.so';
156
+ return network === "mainnet"
157
+ ? "https://api.mainnet.hiro.so"
158
+ : "https://api.testnet.hiro.so";
153
159
  }
154
160
  function getExplorerUrl(network) {
155
- return network === 'mainnet'
156
- ? 'https://explorer.stacks.co'
157
- : 'https://explorer.stacks.co/?chain=testnet';
161
+ return network === "mainnet"
162
+ ? "https://explorer.stacks.co"
163
+ : "https://explorer.stacks.co/?chain=testnet";
158
164
  }
159
165
  //# sourceMappingURL=deploy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { ProjectConfig } from '../types/index.js';
1
+ import type { ProjectConfig } from "../types/index.js";
2
2
  export declare function checkClarinetInstallation(): Promise<boolean>;
3
3
  export declare function initializeClarinet(config: ProjectConfig): Promise<void>;
4
4
  export declare function updateClarinetConfig(projectPath: string, contracts: string[]): Promise<void>;
@@ -1 +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"}
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,CAiD7E;AAED,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,IAAI,CAAC,CAgBf"}
@@ -1,12 +1,12 @@
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';
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
6
  const execAsync = promisify(exec);
7
7
  export async function checkClarinetInstallation() {
8
8
  try {
9
- await execAsync('clarinet --version');
9
+ await execAsync("clarinet --version");
10
10
  return true;
11
11
  }
12
12
  catch {
@@ -14,50 +14,42 @@ export async function checkClarinetInstallation() {
14
14
  }
15
15
  }
16
16
  export async function initializeClarinet(config) {
17
- const spinner = ora('Initializing Clarinet...').start();
17
+ const spinner = ora("Initializing Clarinet...").start();
18
18
  try {
19
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');
20
+ // Create a temporary directory for Clarinet initialization
21
+ const tempDir = path.join(projectPath, ".temp_clarinet");
22
+ await fs.ensureDir(tempDir);
23
+ // Run clarinet new in temp directory
24
+ try {
25
+ await execAsync(`cd "${tempDir}" && clarinet new "${projectName}" --disable-telemetry`);
26
+ }
27
+ catch (e) {
28
+ // If clarinet new fails, it might be because of directory structure
29
+ // specific error handling could be added here
30
+ throw new Error(`Clarinet initialization failed: ${e.message}`);
31
+ }
32
+ const sourceDir = path.join(tempDir, projectName);
33
+ // Copy generated Clarinet.toml
34
+ if (await fs.pathExists(path.join(sourceDir, "Clarinet.toml"))) {
35
+ await fs.copy(path.join(sourceDir, "Clarinet.toml"), path.join(projectPath, "Clarinet.toml"));
36
+ }
37
+ // Copy settings directory (Devnet.toml)
38
+ if (await fs.pathExists(path.join(sourceDir, "settings"))) {
39
+ await fs.copy(path.join(sourceDir, "settings"), path.join(projectPath, "settings"));
40
+ }
41
+ // Cleanup temp directory
42
+ await fs.remove(tempDir);
43
+ spinner.succeed("Clarinet initialized");
52
44
  }
53
45
  catch (error) {
54
- spinner.fail('Failed to initialize Clarinet');
46
+ spinner.fail("Failed to initialize Clarinet");
55
47
  throw error;
56
48
  }
57
49
  }
58
50
  export async function updateClarinetConfig(projectPath, contracts) {
59
- const clarinetTomlPath = path.join(projectPath, 'Clarinet.toml');
60
- let tomlContent = await fs.readFile(clarinetTomlPath, 'utf-8');
51
+ const clarinetTomlPath = path.join(projectPath, "Clarinet.toml");
52
+ let tomlContent = await fs.readFile(clarinetTomlPath, "utf-8");
61
53
  // Add contracts based on selection
62
54
  for (const contract of contracts) {
63
55
  tomlContent += `
@@ -1 +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"}
1
+ {"version":3,"file":"clarinet.js","sourceRoot":"","sources":["../../src/utils/clarinet.ts"],"names":[],"mappings":"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"}
@@ -134,7 +134,7 @@ MIT
134
134
  await fs.writeFile(path.join(projectPath, 'README.md'), readme);
135
135
  }
136
136
  async function createRootPackageJson(projectPath, config) {
137
- const { projectName, packageManager } = config;
137
+ const { projectName } = config;
138
138
  const packageJson = {
139
139
  name: projectName,
140
140
  version: '0.1.0',
@@ -1 +1 @@
1
- {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/utils/filesystem.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/utils/filesystem.ts"],"names":[],"mappings":"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"}
package/dist/utils/git.js CHANGED
@@ -15,7 +15,7 @@ export async function initializeGit(projectPath) {
15
15
  catch (error) {
16
16
  spinner.fail('Failed to initialize Git repository');
17
17
  // Non-fatal error, just warn
18
- console.warn('Git initialization failed. You can initialize it manually.');
18
+ console.warn('Git initialization failed. You can initialize it manually.', error.message);
19
19
  }
20
20
  }
21
21
  //# sourceMappingURL=git.js.map
@@ -1 +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"}
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,KAAc,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACpD,6BAA6B;QAC7B,OAAO,CAAC,IAAI,CAAC,4DAA4D,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;IACvG,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devvmichael/create-stacks-app",
3
- "version": "0.2.3",
3
+ "version": "0.2.41",
4
4
  "description": "Scaffold full-stack Stacks blockchain applications",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -15,7 +15,7 @@
15
15
  "build": "tsc",
16
16
  "dev": "tsc --watch",
17
17
  "clean": "rm -rf dist",
18
- "lint": "eslint src --ext .ts",
18
+ "lint": "eslint src",
19
19
  "test": "vitest run",
20
20
  "prepublishOnly": "npm run build"
21
21
  },
@@ -40,10 +40,13 @@
40
40
  "zod": "^3.22.4"
41
41
  },
42
42
  "devDependencies": {
43
+ "@eslint/js": "^9.39.2",
43
44
  "@types/fs-extra": "^11.0.4",
44
45
  "@types/inquirer": "^9.0.7",
45
46
  "@types/node": "^20.10.0",
47
+ "eslint": "^9.39.2",
46
48
  "typescript": "^5.3.3",
49
+ "typescript-eslint": "^8.53.1",
47
50
  "vitest": "^1.0.4"
48
51
  },
49
52
  "engines": {
@@ -1,14 +1,11 @@
1
- import { useState, useEffect, useCallback } from 'react';
2
- import { AppConfig, UserSession, showConnect } from '@stacks/connect';
3
- import { StacksTestnet, StacksMainnet } from '@stacks/network';
4
- import { Header } from './components/Header';
5
- import { CounterInteraction } from './components/CounterInteraction';
6
-
7
- const appConfig = new AppConfig(['store_write', 'publish_data']);
8
- const userSession = new UserSession({ appConfig });
1
+ import { useState, useEffect, useCallback } from "react";
2
+ import { connect, disconnect, getLocalStorage } from "@stacks/connect";
3
+ import { StacksTestnet, StacksMainnet } from "@stacks/network";
4
+ import { Header } from "./components/Header";
5
+ import { CounterInteraction } from "./components/CounterInteraction";
9
6
 
10
7
  const network =
11
- import.meta.env.VITE_NETWORK === 'mainnet'
8
+ import.meta.env.VITE_NETWORK === "mainnet"
12
9
  ? new StacksMainnet()
13
10
  : new StacksTestnet();
14
11
 
@@ -16,29 +13,34 @@ function App() {
16
13
  const [address, setAddress] = useState<string | null>(null);
17
14
 
18
15
  useEffect(() => {
19
- if (userSession.isUserSignedIn()) {
20
- const userData = userSession.loadUserData();
21
- const networkKey = import.meta.env.VITE_NETWORK === 'mainnet' ? 'mainnet' : 'testnet';
22
- setAddress(userData.profile.stxAddress[networkKey]);
16
+ // Check local storage for existing session
17
+ const storage = getLocalStorage();
18
+ const networkKey =
19
+ import.meta.env.VITE_NETWORK === "mainnet" ? "mainnet" : "testnet";
20
+ if (storage?.addresses?.[networkKey]) {
21
+ setAddress(storage.addresses[networkKey]);
23
22
  }
24
23
  }, []);
25
24
 
26
- const handleConnect = useCallback(() => {
27
- showConnect({
28
- appDetails: {
29
- name: 'Stacks App',
30
- icon: window.location.origin + '/logo.svg',
31
- },
32
- redirectTo: '/',
33
- onFinish: () => {
25
+ const handleConnect = useCallback(async () => {
26
+ try {
27
+ const response = await connect();
28
+ // Access the first address from the response
29
+ const userAddress = response.addresses?.[0]?.address;
30
+ if (userAddress) {
31
+ setAddress(userAddress);
32
+ // Optional: reload if needed to reset state, or handle reactively
34
33
  window.location.reload();
35
- },
36
- userSession,
37
- });
34
+ }
35
+ } catch (error) {
36
+ console.error("Failed to connect:", error);
37
+ }
38
38
  }, []);
39
39
 
40
40
  const handleDisconnect = useCallback(() => {
41
- userSession.signUserOut('/');
41
+ disconnect();
42
+ setAddress(null);
43
+ window.location.reload();
42
44
  }, []);
43
45
 
44
46
  return (
@@ -51,7 +53,9 @@ function App() {
51
53
 
52
54
  <main className="flex-1 container mx-auto px-4 py-8">
53
55
  <div className="mb-8 text-center">
54
- <h1 className="mb-4 text-4xl font-bold">Welcome to Your Stacks App</h1>
56
+ <h1 className="mb-4 text-4xl font-bold">
57
+ Welcome to Your Stacks App
58
+ </h1>
55
59
  <p className="text-lg text-gray-400">
56
60
  A full-stack Stacks blockchain application
57
61
  </p>
@@ -71,19 +75,24 @@ function App() {
71
75
  <div className="card">
72
76
  <h3 className="font-semibold mb-2">📝 Edit Contracts</h3>
73
77
  <p className="text-sm text-gray-400">
74
- Modify contracts in <code className="bg-gray-800 px-1 rounded">contracts/</code>
78
+ Modify contracts in{" "}
79
+ <code className="bg-gray-800 px-1 rounded">contracts/</code>
75
80
  </p>
76
81
  </div>
77
82
  <div className="card">
78
83
  <h3 className="font-semibold mb-2">🧪 Run Tests</h3>
79
84
  <p className="text-sm text-gray-400">
80
- Run <code className="bg-gray-800 px-1 rounded">npm run test</code>
85
+ Run{" "}
86
+ <code className="bg-gray-800 px-1 rounded">npm run test</code>
81
87
  </p>
82
88
  </div>
83
89
  <div className="card">
84
90
  <h3 className="font-semibold mb-2">🚀 Deploy</h3>
85
91
  <p className="text-sm text-gray-400">
86
- Run <code className="bg-gray-800 px-1 rounded">npm run deploy:testnet</code>
92
+ Run{" "}
93
+ <code className="bg-gray-800 px-1 rounded">
94
+ npm run deploy:testnet
95
+ </code>
87
96
  </p>
88
97
  </div>
89
98
  </div>
@@ -1,7 +1,7 @@
1
- import { useState, useEffect, useCallback } from 'react';
2
- import { openContractCall } from '@stacks/connect';
3
- import { callReadOnlyFunction, cvToValue } from '@stacks/transactions';
4
- import type { StacksNetwork } from '@stacks/network';
1
+ import { useState, useEffect, useCallback } from "react";
2
+ import { request } from "@stacks/connect";
3
+ import { callReadOnlyFunction, cvToValue } from "@stacks/transactions";
4
+ import type { StacksNetwork } from "@stacks/network";
5
5
 
6
6
  interface CounterInteractionProps {
7
7
  network: StacksNetwork;
@@ -9,10 +9,16 @@ interface CounterInteractionProps {
9
9
  senderAddress: string | null;
10
10
  }
11
11
 
12
- const contractAddress = import.meta.env.VITE_CONTRACT_ADDRESS || 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM';
13
- const contractName = 'counter';
12
+ const contractAddress =
13
+ import.meta.env.VITE_CONTRACT_ADDRESS ||
14
+ "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM";
15
+ const contractName = "counter";
14
16
 
15
- export function CounterInteraction({ network, isConnected, senderAddress }: CounterInteractionProps) {
17
+ export function CounterInteraction({
18
+ network,
19
+ isConnected,
20
+ senderAddress,
21
+ }: CounterInteractionProps) {
16
22
  const [counter, setCounter] = useState<number | null>(null);
17
23
  const [isLoading, setIsLoading] = useState(true);
18
24
  const [isIncrementing, setIsIncrementing] = useState(false);
@@ -23,15 +29,15 @@ export function CounterInteraction({ network, isConnected, senderAddress }: Coun
23
29
  const result = await callReadOnlyFunction({
24
30
  contractAddress,
25
31
  contractName,
26
- functionName: 'get-counter',
32
+ functionName: "get-counter",
27
33
  functionArgs: [],
28
34
  network,
29
35
  senderAddress: contractAddress,
30
36
  });
31
37
  const value = cvToValue(result);
32
- setCounter(value?.value ?? 0);
38
+ setCounter(value?.value ? Number(value.value) : 0);
33
39
  } catch (error) {
34
- console.error('Failed to fetch counter:', error);
40
+ console.error("Failed to fetch counter:", error);
35
41
  } finally {
36
42
  setIsLoading(false);
37
43
  }
@@ -45,18 +51,16 @@ export function CounterInteraction({ network, isConnected, senderAddress }: Coun
45
51
  if (!senderAddress) return;
46
52
  setIsIncrementing(true);
47
53
  try {
48
- await openContractCall({
49
- contractAddress,
50
- contractName,
51
- functionName: 'increment',
54
+ await request("stx_callContract", {
55
+ contract: `${contractAddress}.${contractName}`,
56
+ functionName: "increment",
52
57
  functionArgs: [],
53
- network,
54
- onFinish: () => {
55
- setTimeout(fetchCounter, 2000);
56
- },
58
+ postConditions: [],
57
59
  });
60
+
61
+ setTimeout(fetchCounter, 2000);
58
62
  } catch (error) {
59
- console.error('Increment failed:', error);
63
+ console.error("Increment failed:", error);
60
64
  } finally {
61
65
  setIsIncrementing(false);
62
66
  }
@@ -66,18 +70,16 @@ export function CounterInteraction({ network, isConnected, senderAddress }: Coun
66
70
  if (!senderAddress) return;
67
71
  setIsDecrementing(true);
68
72
  try {
69
- await openContractCall({
70
- contractAddress,
71
- contractName,
72
- functionName: 'decrement',
73
+ await request("stx_callContract", {
74
+ contract: `${contractAddress}.${contractName}`,
75
+ functionName: "decrement",
73
76
  functionArgs: [],
74
- network,
75
- onFinish: () => {
76
- setTimeout(fetchCounter, 2000);
77
- },
77
+ postConditions: [],
78
78
  });
79
+
80
+ setTimeout(fetchCounter, 2000);
79
81
  } catch (error) {
80
- console.error('Decrement failed:', error);
82
+ console.error("Decrement failed:", error);
81
83
  } finally {
82
84
  setIsDecrementing(false);
83
85
  }
@@ -88,8 +90,8 @@ export function CounterInteraction({ network, isConnected, senderAddress }: Coun
88
90
  <h2 className="text-2xl font-bold mb-4">Counter Contract</h2>
89
91
 
90
92
  <div className="mb-6 text-center">
91
- <div className="text-6xl font-bold text-stacks-purple">
92
- {isLoading ? '...' : counter}
93
+ <div className="text-6xl font-bold text-gray-100">
94
+ {isLoading ? "..." : counter}
93
95
  </div>
94
96
  <p className="text-sm text-gray-500 mt-2">Current count</p>
95
97
  </div>
@@ -101,14 +103,14 @@ export function CounterInteraction({ network, isConnected, senderAddress }: Coun
101
103
  disabled={isDecrementing || counter === 0}
102
104
  className="btn-secondary flex-1 disabled:opacity-50"
103
105
  >
104
- {isDecrementing ? 'Processing...' : '− Decrement'}
106
+ {isDecrementing ? "Processing..." : "− Decrement"}
105
107
  </button>
106
108
  <button
107
109
  onClick={handleIncrement}
108
110
  disabled={isIncrementing}
109
111
  className="btn-primary flex-1 disabled:opacity-50"
110
112
  >
111
- {isIncrementing ? 'Processing...' : '+ Increment'}
113
+ {isIncrementing ? "Processing..." : "+ Increment"}
112
114
  </button>
113
115
  </div>
114
116
  ) : (
@@ -1,2 +1,2 @@
1
1
  VITE_NETWORK=testnet
2
- VITE_CONTRACT_ADDRESS=ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM
2
+ VITE_CONTRACT_ADDRESS=ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM
@@ -1,13 +1,10 @@
1
1
  <script setup lang="ts">
2
2
  import { ref, onMounted } from 'vue';
3
- import { AppConfig, UserSession, showConnect } from '@stacks/connect';
3
+ import { connect, disconnect, getLocalStorage } from '@stacks/connect';
4
4
  import { StacksTestnet, StacksMainnet } from '@stacks/network';
5
5
  import AppHeader from './components/AppHeader.vue';
6
6
  import CounterInteraction from './components/CounterInteraction.vue';
7
7
 
8
- const appConfig = new AppConfig(['store_write', 'publish_data']);
9
- const userSession = new UserSession({ appConfig });
10
-
11
8
  const network =
12
9
  import.meta.env.VITE_NETWORK === 'mainnet'
13
10
  ? new StacksMainnet()
@@ -16,29 +13,30 @@ const network =
16
13
  const address = ref<string | null>(null);
17
14
 
18
15
  onMounted(() => {
19
- if (userSession.isUserSignedIn()) {
20
- const userData = userSession.loadUserData();
21
- const networkKey = import.meta.env.VITE_NETWORK === 'mainnet' ? 'mainnet' : 'testnet';
22
- address.value = userData.profile.stxAddress[networkKey];
16
+ const storage = getLocalStorage();
17
+ const networkKey = import.meta.env.VITE_NETWORK === 'mainnet' ? 'mainnet' : 'testnet';
18
+ if (storage?.addresses?.[networkKey]) {
19
+ address.value = storage.addresses[networkKey];
23
20
  }
24
21
  });
25
22
 
26
- function handleConnect() {
27
- showConnect({
28
- appDetails: {
29
- name: 'Stacks App',
30
- icon: window.location.origin + '/logo.svg',
31
- },
32
- redirectTo: '/',
33
- onFinish: () => {
23
+ async function handleConnect() {
24
+ try {
25
+ const response = await connect();
26
+ const userAddress = response.addresses?.[0]?.address;
27
+ if (userAddress) {
28
+ address.value = userAddress;
34
29
  window.location.reload();
35
- },
36
- userSession,
37
- });
30
+ }
31
+ } catch (error) {
32
+ console.error('Failed to connect:', error);
33
+ }
38
34
  }
39
35
 
40
36
  function handleDisconnect() {
41
- userSession.signUserOut('/');
37
+ disconnect();
38
+ address.value = null;
39
+ window.location.reload();
42
40
  }
43
41
  </script>
44
42
 
@@ -1,6 +1,6 @@
1
1
  <script setup lang="ts">
2
2
  import { ref, onMounted } from 'vue';
3
- import { openContractCall } from '@stacks/connect';
3
+ import { request } from '@stacks/connect';
4
4
  import { callReadOnlyFunction, cvToValue } from '@stacks/transactions';
5
5
  import type { StacksNetwork } from '@stacks/network';
6
6
 
@@ -29,7 +29,8 @@ async function fetchCounter() {
29
29
  senderAddress: contractAddress,
30
30
  });
31
31
  const value = cvToValue(result);
32
- counter.value = value?.value ?? 0;
32
+ // Handle both bigint (Stacks returns bigint now often) and number types safely
33
+ counter.value = value?.value ? Number(value.value) : 0;
33
34
  } catch (error) {
34
35
  console.error('Failed to fetch counter:', error);
35
36
  } finally {
@@ -45,16 +46,15 @@ async function handleIncrement() {
45
46
  if (!props.senderAddress) return;
46
47
  isIncrementing.value = true;
47
48
  try {
48
- await openContractCall({
49
- contractAddress,
50
- contractName,
49
+ await request('stx_callContract', {
50
+ contract: `${contractAddress}.${contractName}`,
51
51
  functionName: 'increment',
52
52
  functionArgs: [],
53
- network: props.network,
54
- onFinish: () => {
55
- setTimeout(fetchCounter, 2000);
56
- },
53
+ postConditions: [],
57
54
  });
55
+
56
+ // Speculatively refetch
57
+ setTimeout(fetchCounter, 2000);
58
58
  } catch (error) {
59
59
  console.error('Increment failed:', error);
60
60
  } finally {
@@ -66,16 +66,14 @@ async function handleDecrement() {
66
66
  if (!props.senderAddress) return;
67
67
  isDecrementing.value = true;
68
68
  try {
69
- await openContractCall({
70
- contractAddress,
71
- contractName,
69
+ await request('stx_callContract', {
70
+ contract: `${contractAddress}.${contractName}`,
72
71
  functionName: 'decrement',
73
72
  functionArgs: [],
74
- network: props.network,
75
- onFinish: () => {
76
- setTimeout(fetchCounter, 2000);
77
- },
73
+ postConditions: [],
78
74
  });
75
+
76
+ setTimeout(fetchCounter, 2000);
79
77
  } catch (error) {
80
78
  console.error('Decrement failed:', error);
81
79
  } finally {
@@ -89,7 +87,7 @@ async function handleDecrement() {
89
87
  <h2 class="text-2xl font-bold mb-4">Counter Contract</h2>
90
88
 
91
89
  <div class="mb-6 text-center">
92
- <div class="text-6xl font-bold text-stacks-purple">
90
+ <div class="text-6xl font-bold text-gray-100">
93
91
  {{ isLoading ? '...' : counter }}
94
92
  </div>
95
93
  <p class="text-sm text-gray-500 mt-2">Current count</p>