@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,8 @@
1
+ interface AddOptions {
2
+ sip010?: boolean;
3
+ sip009?: boolean;
4
+ template?: string;
5
+ }
6
+ export declare function addCommand(type: string, name: string, options?: AddOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AASA,UAAU,UAAU;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,UAAU,GACnB,OAAO,CAAC,IAAI,CAAC,CAsBf"}
@@ -0,0 +1,215 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import ora from 'ora';
4
+ import chalk from 'chalk';
5
+ import { fileURLToPath } from 'url';
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+ export async function addCommand(type, name, options) {
9
+ const projectPath = process.cwd();
10
+ // Verify we're in a create-stacks-app project
11
+ if (!(await isStacksProject(projectPath))) {
12
+ console.error(chalk.red('Error: Not in a create-stacks-app project directory.'));
13
+ console.error('Please run this command from the root of your project.');
14
+ process.exit(1);
15
+ }
16
+ switch (type) {
17
+ case 'contract':
18
+ await addContract(projectPath, name, options);
19
+ break;
20
+ case 'component':
21
+ await addComponent(projectPath, name);
22
+ break;
23
+ default:
24
+ console.error(chalk.red(`Unknown type: ${type}`));
25
+ console.error('Valid types are: contract, component');
26
+ process.exit(1);
27
+ }
28
+ }
29
+ async function isStacksProject(projectPath) {
30
+ const clarinetToml = path.join(projectPath, 'Clarinet.toml');
31
+ return fs.pathExists(clarinetToml);
32
+ }
33
+ async function addContract(projectPath, name, options) {
34
+ const spinner = ora(`Adding contract: ${name}`).start();
35
+ try {
36
+ const contractsPath = path.join(projectPath, 'contracts');
37
+ const testsPath = path.join(projectPath, 'tests');
38
+ const templatesDir = path.join(__dirname, '..', '..', 'templates', 'contracts');
39
+ // Determine which template to use
40
+ let templateName = options?.template || name;
41
+ if (options?.sip010)
42
+ templateName = 'token';
43
+ if (options?.sip009)
44
+ templateName = 'nft';
45
+ const templatePath = path.join(templatesDir, templateName);
46
+ const templateExists = await fs.pathExists(templatePath);
47
+ if (templateExists) {
48
+ // Copy all files from template
49
+ const files = await fs.readdir(templatePath);
50
+ for (const file of files) {
51
+ if (file.endsWith('.clar')) {
52
+ // If file matches template name, rename to requested name
53
+ // e.g. marketplace.clar -> my-market.clar
54
+ // e.g. nft-trait.clar -> nft-trait.clar (keep)
55
+ const isMainMock = file === `${templateName}.clar`;
56
+ const targetName = isMainMock ? `${name}.clar` : file;
57
+ const targetPath = path.join(contractsPath, targetName);
58
+ if (await fs.pathExists(targetPath)) {
59
+ // Skip if exists
60
+ continue;
61
+ }
62
+ await fs.copy(path.join(templatePath, file), targetPath);
63
+ await updateClarinetToml(projectPath, targetName.replace('.clar', ''));
64
+ }
65
+ if (file.endsWith('.test.ts')) {
66
+ // Only copy the main test file for now
67
+ if (file === `${templateName}.test.ts`) {
68
+ let testContent = await fs.readFile(path.join(templatePath, file), 'utf-8');
69
+ testContent = testContent.replace(new RegExp(templateName, 'g'), name);
70
+ await fs.writeFile(path.join(testsPath, `${name}.test.ts`), testContent);
71
+ }
72
+ }
73
+ }
74
+ }
75
+ else {
76
+ // If basic contract (no template found)
77
+ // But if user explicitly requested a non-existent template, error out
78
+ if (options?.template) {
79
+ throw new Error(`Template '${options.template}' not found.`);
80
+ }
81
+ // Create a basic contract template
82
+ const basicContract = `;; ${name} Contract
83
+ ;; Add your contract logic here
84
+
85
+ ;; Data variables
86
+ (define-data-var owner principal tx-sender)
87
+
88
+ ;; Error codes
89
+ (define-constant ERR-NOT-OWNER (err u403))
90
+
91
+ ;; Public functions
92
+
93
+ ;; Read-only functions
94
+ (define-read-only (get-owner)
95
+ (ok (var-get owner)))
96
+ `;
97
+ await fs.writeFile(path.join(contractsPath, `${name}.clar`), basicContract);
98
+ // Create basic test
99
+ const basicTest = `import { describe, expect, it } from "vitest";
100
+ import { Cl } from "@stacks/transactions";
101
+
102
+ const accounts = simnet.getAccounts();
103
+ const deployer = accounts.get("deployer")!;
104
+
105
+ describe("${name} Contract", () => {
106
+ it("should have deployer as owner", () => {
107
+ const result = simnet.callReadOnlyFn(
108
+ "${name}",
109
+ "get-owner",
110
+ [],
111
+ deployer
112
+ );
113
+ expect(result.result).toBeOk(Cl.principal(deployer));
114
+ });
115
+ });
116
+ `;
117
+ await fs.writeFile(path.join(testsPath, `${name}.test.ts`), basicTest);
118
+ await updateClarinetToml(projectPath, name);
119
+ }
120
+ spinner.succeed(`Contract ${chalk.cyan(name)} added successfully`);
121
+ console.log();
122
+ console.log('Next steps:');
123
+ console.log(` 1. Edit ${chalk.cyan(`contracts/${name}.clar`)}`);
124
+ console.log(` 2. Update tests in ${chalk.cyan(`tests/${name}.test.ts`)}`);
125
+ console.log(` 3. Run ${chalk.cyan('npm run test')} to verify`);
126
+ }
127
+ catch (error) {
128
+ spinner.fail('Failed to add contract');
129
+ throw error;
130
+ }
131
+ }
132
+ async function updateClarinetToml(projectPath, contractName) {
133
+ const tomlPath = path.join(projectPath, 'Clarinet.toml');
134
+ let content = await fs.readFile(tomlPath, 'utf-8');
135
+ // Check if contract already exists
136
+ if (content.includes(`[contracts.${contractName}]`)) {
137
+ return;
138
+ }
139
+ content += `
140
+ [contracts.${contractName}]
141
+ path = "contracts/${contractName}.clar"
142
+ clarity_version = 2
143
+ epoch = 2.5
144
+ `;
145
+ await fs.writeFile(tomlPath, content);
146
+ }
147
+ async function addComponent(projectPath, name) {
148
+ const spinner = ora(`Adding component: ${name}`).start();
149
+ try {
150
+ // Detect frontend type
151
+ const frontendPath = path.join(projectPath, 'frontend');
152
+ const isNextjs = await fs.pathExists(path.join(frontendPath, 'next.config.js'));
153
+ const isVite = await fs.pathExists(path.join(frontendPath, 'vite.config.ts'));
154
+ let componentsPath;
155
+ if (isNextjs) {
156
+ componentsPath = path.join(frontendPath, 'components');
157
+ }
158
+ else if (isVite) {
159
+ componentsPath = path.join(frontendPath, 'src', 'components');
160
+ }
161
+ else {
162
+ spinner.fail('Could not detect frontend framework');
163
+ return;
164
+ }
165
+ await fs.ensureDir(componentsPath);
166
+ // Generate component based on name
167
+ const componentContent = generateComponent(name, isNextjs);
168
+ const fileName = isNextjs ? `${name}.tsx` : `${name}.vue`;
169
+ await fs.writeFile(path.join(componentsPath, fileName), componentContent);
170
+ spinner.succeed(`Component ${chalk.cyan(name)} added successfully`);
171
+ console.log();
172
+ console.log(`Component created at ${chalk.cyan(`frontend/components/${fileName}`)}`);
173
+ }
174
+ catch (error) {
175
+ spinner.fail('Failed to add component');
176
+ throw error;
177
+ }
178
+ }
179
+ function generateComponent(name, isReact) {
180
+ const componentName = name.charAt(0).toUpperCase() + name.slice(1);
181
+ if (isReact) {
182
+ return `'use client';
183
+
184
+ interface ${componentName}Props {
185
+ // Add your props here
186
+ }
187
+
188
+ export function ${componentName}({ }: ${componentName}Props) {
189
+ return (
190
+ <div className="card">
191
+ <h2 className="text-2xl font-bold mb-4">${componentName}</h2>
192
+ <p className="text-gray-400">
193
+ Edit this component in components/${name}.tsx
194
+ </p>
195
+ </div>
196
+ );
197
+ }
198
+ `;
199
+ }
200
+ // Vue component
201
+ return `<script setup lang="ts">
202
+ // Add your props and logic here
203
+ </script>
204
+
205
+ <template>
206
+ <div class="card">
207
+ <h2 class="text-2xl font-bold mb-4">${componentName}</h2>
208
+ <p class="text-gray-400">
209
+ Edit this component in components/${name}.vue
210
+ </p>
211
+ </div>
212
+ </template>
213
+ `;
214
+ }
215
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CreateOptions } from "../types/index.js";
2
+ export declare function createCommand(projectName?: string, options?: CreateOptions): Promise<void>;
3
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAiB,MAAM,mBAAmB,CAAC;AAoBtE,wBAAsB,aAAa,CACjC,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,IAAI,CAAC,CAsDf"}
@@ -0,0 +1,63 @@
1
+ import path from "path";
2
+ import { fileURLToPath } from "url";
3
+ import { validateProjectName, validateProjectPath, } from "../utils/validation.js";
4
+ import { showIntro, showSuccess, logError } from "../utils/logger.js";
5
+ import { runPrompts, getDefaultConfig } from "../prompts/project.js";
6
+ import { createProjectStructure, copyBaseFiles } from "../utils/filesystem.js";
7
+ import { initializeGit } from "../utils/git.js";
8
+ import { initializeClarinet, updateClarinetConfig } from "../utils/clarinet.js";
9
+ import { installFrontendTemplate, installContracts, } from "../templates/installer.js";
10
+ import { installDependencies } from "../utils/package-manager.js";
11
+ const __filename = fileURLToPath(import.meta.url);
12
+ const __dirname = path.dirname(__filename);
13
+ export async function createCommand(projectName, options) {
14
+ try {
15
+ showIntro();
16
+ // Get project configuration
17
+ const config = await getProjectConfig(projectName, options);
18
+ // Validate project name
19
+ validateProjectName(config.projectName);
20
+ // Validate project path
21
+ await validateProjectPath(config.projectPath);
22
+ // Get templates directory
23
+ const templatesDir = path.join(__dirname, "..", "..", "templates");
24
+ // Create project structure
25
+ await createProjectStructure(config);
26
+ // Copy base files
27
+ await copyBaseFiles(config.projectPath, config, templatesDir);
28
+ // Initialize Clarinet
29
+ await initializeClarinet(config);
30
+ // Install contracts
31
+ await installContracts(config, templatesDir);
32
+ // Update Clarinet config with contracts
33
+ await updateClarinetConfig(config.projectPath, config.contracts);
34
+ // Install frontend template
35
+ await installFrontendTemplate(config, templatesDir);
36
+ // Install dependencies
37
+ if (!config.skipInstall) {
38
+ await installDependencies(config.projectPath, config.packageManager);
39
+ }
40
+ // Initialize Git
41
+ if (config.git) {
42
+ await initializeGit(config.projectPath);
43
+ }
44
+ // Show success message
45
+ showSuccess(config);
46
+ }
47
+ catch (error) {
48
+ if (error instanceof Error) {
49
+ logError(error.message);
50
+ }
51
+ else {
52
+ logError("An unexpected error occurred");
53
+ }
54
+ process.exit(1);
55
+ }
56
+ }
57
+ async function getProjectConfig(projectName, options) {
58
+ if (options?.yes) {
59
+ return await getDefaultConfig(projectName || "my-stacks-app", options);
60
+ }
61
+ return runPrompts(projectName, options);
62
+ }
63
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ interface DeployOptions {
2
+ network?: string;
3
+ privateKey?: string;
4
+ }
5
+ export declare function deployCommand(network: string, options?: DeployOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,159 @@
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
+ const execAsync = promisify(exec);
9
+ export async function deployCommand(network, options) {
10
+ const projectPath = process.cwd();
11
+ // 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.'));
14
+ process.exit(1);
15
+ }
16
+ // Warn for mainnet deployments
17
+ if (network === 'mainnet') {
18
+ const { confirm } = await inquirer.prompt([
19
+ {
20
+ type: 'confirm',
21
+ name: 'confirm',
22
+ message: chalk.yellow('⚠️ You are about to deploy to MAINNET. This is irreversible. Continue?'),
23
+ default: false,
24
+ },
25
+ ]);
26
+ if (!confirm) {
27
+ console.log('Deployment cancelled.');
28
+ process.exit(0);
29
+ }
30
+ }
31
+ const spinner = ora(`Deploying contracts to ${network}...`).start();
32
+ try {
33
+ // Check if Clarinet is installed
34
+ try {
35
+ await execAsync('clarinet --version');
36
+ }
37
+ catch {
38
+ spinner.fail('Clarinet is not installed');
39
+ console.error('Please install Clarinet: https://github.com/hirosystems/clarinet');
40
+ process.exit(1);
41
+ }
42
+ // Get contracts from Clarinet.toml
43
+ const contracts = await getContractsFromConfig(projectPath);
44
+ if (contracts.length === 0) {
45
+ spinner.fail('No contracts found in Clarinet.toml');
46
+ process.exit(1);
47
+ }
48
+ spinner.text = `Found ${contracts.length} contract(s) to deploy`;
49
+ // Create deployment plan
50
+ const deploymentPlan = await createDeploymentPlan(projectPath, network, contracts);
51
+ spinner.succeed(`Deployment plan created`);
52
+ console.log();
53
+ console.log(chalk.bold('Contracts to deploy:'));
54
+ contracts.forEach((c, i) => console.log(` ${i + 1}. ${chalk.cyan(c)}`));
55
+ console.log();
56
+ // Confirm deployment
57
+ const { proceed } = await inquirer.prompt([
58
+ {
59
+ type: 'confirm',
60
+ name: 'proceed',
61
+ message: `Deploy ${contracts.length} contract(s) to ${network}?`,
62
+ default: true,
63
+ },
64
+ ]);
65
+ if (!proceed) {
66
+ console.log('Deployment cancelled.');
67
+ process.exit(0);
68
+ }
69
+ // Execute deployment
70
+ const deploySpinner = ora('Deploying contracts...').start();
71
+ try {
72
+ const result = await execAsync(`clarinet deployments apply -p ${deploymentPlan}`, {
73
+ cwd: projectPath,
74
+ });
75
+ deploySpinner.succeed('Contracts deployed successfully!');
76
+ console.log();
77
+ console.log(chalk.green('✓ Deployment complete'));
78
+ console.log();
79
+ console.log(chalk.bold('Next steps:'));
80
+ console.log(` 1. Update ${chalk.cyan('NEXT_PUBLIC_CONTRACT_ADDRESS')} in your frontend .env`);
81
+ console.log(` 2. Verify contracts on explorer: ${getExplorerUrl(network)}`);
82
+ console.log(` 3. Test your dApp at ${chalk.cyan('http://localhost:3000')}`);
83
+ }
84
+ catch (error) {
85
+ deploySpinner.fail('Deployment failed');
86
+ console.error(chalk.red(error.message));
87
+ // Provide helpful error messages
88
+ if (error.message.includes('insufficient funds')) {
89
+ 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')}`);
93
+ }
94
+ }
95
+ process.exit(1);
96
+ }
97
+ }
98
+ catch (error) {
99
+ spinner.fail('Deployment failed');
100
+ console.error(error.message);
101
+ process.exit(1);
102
+ }
103
+ }
104
+ async function getContractsFromConfig(projectPath) {
105
+ const tomlPath = path.join(projectPath, 'Clarinet.toml');
106
+ const content = await fs.readFile(tomlPath, 'utf-8');
107
+ const contracts = [];
108
+ const regex = /\[contracts\.(\w+)\]/g;
109
+ let match;
110
+ while ((match = regex.exec(content)) !== null) {
111
+ contracts.push(match[1]);
112
+ }
113
+ return contracts;
114
+ }
115
+ async function createDeploymentPlan(projectPath, network, contracts) {
116
+ const deploymentsPath = path.join(projectPath, 'deployments');
117
+ await fs.ensureDir(deploymentsPath);
118
+ const planPath = path.join(deploymentsPath, `${network}.yaml`);
119
+ // Read project name from Clarinet.toml
120
+ const tomlContent = await fs.readFile(path.join(projectPath, 'Clarinet.toml'), 'utf-8');
121
+ const nameMatch = tomlContent.match(/name\s*=\s*"([^"]+)"/);
122
+ const projectName = nameMatch ? nameMatch[1] : 'stacks-app';
123
+ const plan = `---
124
+ id: 0
125
+ name: ${projectName} Deployment
126
+ network: ${network}
127
+ stacks-node: "${getStacksNode(network)}"
128
+ bitcoin-node: "${getBitcoinNode(network)}"
129
+ plan:
130
+ batches:
131
+ - id: 0
132
+ transactions:
133
+ ${contracts.map((c, i) => ` - contract-publish:
134
+ contract-name: ${c}
135
+ expected-sender: \$DEPLOYER
136
+ cost: 10000
137
+ path: contracts/${c}.clar
138
+ anchor-block-only: true
139
+ clarity-version: 2`).join('\n')}
140
+ `;
141
+ await fs.writeFile(planPath, plan);
142
+ return planPath;
143
+ }
144
+ function getStacksNode(network) {
145
+ return network === 'mainnet'
146
+ ? 'https://api.mainnet.hiro.so'
147
+ : 'https://api.testnet.hiro.so';
148
+ }
149
+ function getBitcoinNode(network) {
150
+ return network === 'mainnet'
151
+ ? 'https://api.mainnet.hiro.so'
152
+ : 'https://api.testnet.hiro.so';
153
+ }
154
+ function getExplorerUrl(network) {
155
+ return network === 'mainnet'
156
+ ? 'https://explorer.stacks.co'
157
+ : 'https://explorer.stacks.co/?chain=testnet';
158
+ }
159
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAOlC,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAe,EACf,OAAuB;IAEvB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAElC,mCAAmC;IACnC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,+BAA+B;IAC/B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACxC;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,yEAAyE,CAAC;gBAChG,OAAO,EAAE,KAAK;aACf;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,OAAO,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IAEpE,IAAI,CAAC;QACH,iCAAiC;QACjC,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;YAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,mCAAmC;QACnC,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,WAAW,CAAC,CAAC;QAE5D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,IAAI,GAAG,SAAS,SAAS,CAAC,MAAM,wBAAwB,CAAC;QAEjE,yBAAyB;QACzB,MAAM,cAAc,GAAG,MAAM,oBAAoB,CAAC,WAAW,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAEnF,OAAO,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAChD,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,qBAAqB;QACrB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACxC;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,UAAU,SAAS,CAAC,MAAM,mBAAmB,OAAO,GAAG;gBAChE,OAAO,EAAE,IAAI;aACd;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,qBAAqB;QACrB,MAAM,aAAa,GAAG,GAAG,CAAC,wBAAwB,CAAC,CAAC,KAAK,EAAE,CAAC;QAE5D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,iCAAiC,cAAc,EAAE,EAAE;gBAChF,GAAG,EAAE,WAAW;aACjB,CAAC,CAAC;YAEH,aAAa,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,wBAAwB,CAAC,CAAC;YAC/F,OAAO,CAAC,GAAG,CAAC,sCAAsC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC7E,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACxC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAExC,iCAAiC;YACjC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;gBACjD,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yDAAyD,CAAC,CAAC,CAAC;gBACrF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC1B,OAAO,CAAC,GAAG,CAAC,oCAAoC,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,EAAE,CAAC,CAAC;gBAC3H,CAAC;YACH,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,WAAmB;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAErD,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,uBAAuB,CAAC;IACtC,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9C,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,WAAmB,EACnB,OAAe,EACf,SAAmB;IAEnB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAEpC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;IAE/D,uCAAuC;IACvC,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,OAAO,CAAC,CAAC;IACxF,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAE5D,MAAM,IAAI,GAAG;;QAEP,WAAW;WACR,OAAO;gBACF,aAAa,CAAC,OAAO,CAAC;iBACrB,cAAc,CAAC,OAAO,CAAC;;;;;EAKtC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;6BACG,CAAC;;;8BAGA,CAAC;;+BAEA,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;CAC1C,CAAC;IAEA,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACnC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO,OAAO,KAAK,SAAS;QAC1B,CAAC,CAAC,6BAA6B;QAC/B,CAAC,CAAC,6BAA6B,CAAC;AACpC,CAAC;AAED,SAAS,cAAc,CAAC,OAAe;IACrC,OAAO,OAAO,KAAK,SAAS;QAC1B,CAAC,CAAC,6BAA6B;QAC/B,CAAC,CAAC,6BAA6B,CAAC;AACpC,CAAC;AAED,SAAS,cAAc,CAAC,OAAe;IACrC,OAAO,OAAO,KAAK,SAAS;QAC1B,CAAC,CAAC,4BAA4B;QAC9B,CAAC,CAAC,2CAA2C,CAAC;AAClD,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { createCommand } from './commands/create.js';
4
+ import { addCommand } from './commands/add.js';
5
+ import { deployCommand } from './commands/deploy.js';
6
+ import { readFileSync } from 'fs';
7
+ import { fileURLToPath } from 'url';
8
+ import { dirname, join } from 'path';
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = dirname(__filename);
11
+ const packageJsonPath = join(__dirname, '..', 'package.json');
12
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
13
+ const program = new Command();
14
+ program
15
+ .name('create-stacks-app')
16
+ .description('Scaffold full-stack Stacks blockchain applications')
17
+ .version(packageJson.version);
18
+ // Main create command (default)
19
+ program
20
+ .argument('[project-name]', 'Name of the project')
21
+ .option('-t, --template <name>', 'Template to use (nextjs, react, vue)', 'nextjs')
22
+ .option('-c, --contracts <list>', 'Contracts to include (counter,token,nft)')
23
+ .option('--typescript', 'Use TypeScript', true)
24
+ .option('--no-typescript', 'Use JavaScript')
25
+ .option('--tailwind', 'Include Tailwind CSS', true)
26
+ .option('--no-tailwind', 'Skip Tailwind CSS')
27
+ .option('--no-git', 'Skip Git initialization')
28
+ .option('--package-manager <pm>', 'Package manager (npm, pnpm, yarn)', 'pnpm')
29
+ .option('--skip-install', 'Skip dependency installation')
30
+ .option('-y, --yes', 'Skip prompts, use defaults')
31
+ .action(createCommand);
32
+ // Add command for contracts and components
33
+ program
34
+ .command('add <type> <name>')
35
+ .description('Add a contract or component to existing project')
36
+ .option('--sip010', 'Create a SIP-010 fungible token contract')
37
+ .option('--sip009', 'Create a SIP-009 NFT contract')
38
+ .option('-t, --template <name>', 'Use a specific template (e.g. marketplace, defi)')
39
+ .action(addCommand);
40
+ // Deploy command
41
+ program
42
+ .command('deploy <network>')
43
+ .description('Deploy contracts to testnet or mainnet')
44
+ .option('--private-key <key>', 'Private key for deployment (or use env var)')
45
+ .action(deployCommand);
46
+ program.parse();
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;AAEvE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,mBAAmB,CAAC;KACzB,WAAW,CAAC,oDAAoD,CAAC;KACjE,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAEhC,gCAAgC;AAChC,OAAO;KACJ,QAAQ,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;KACjD,MAAM,CAAC,uBAAuB,EAAE,sCAAsC,EAAE,QAAQ,CAAC;KACjF,MAAM,CAAC,wBAAwB,EAAE,0CAA0C,CAAC;KAC5E,MAAM,CAAC,cAAc,EAAE,gBAAgB,EAAE,IAAI,CAAC;KAC9C,MAAM,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;KAC3C,MAAM,CAAC,YAAY,EAAE,sBAAsB,EAAE,IAAI,CAAC;KAClD,MAAM,CAAC,eAAe,EAAE,mBAAmB,CAAC;KAC5C,MAAM,CAAC,UAAU,EAAE,yBAAyB,CAAC;KAC7C,MAAM,CAAC,wBAAwB,EAAE,mCAAmC,EAAE,MAAM,CAAC;KAC7E,MAAM,CAAC,gBAAgB,EAAE,8BAA8B,CAAC;KACxD,MAAM,CAAC,WAAW,EAAE,4BAA4B,CAAC;KACjD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,2CAA2C;AAC3C,OAAO;KACJ,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,UAAU,EAAE,0CAA0C,CAAC;KAC9D,MAAM,CAAC,UAAU,EAAE,+BAA+B,CAAC;KACnD,MAAM,CAAC,uBAAuB,EAAE,kDAAkD,CAAC;KACnF,MAAM,CAAC,UAAU,CAAC,CAAC;AAGtB,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,qBAAqB,EAAE,6CAA6C,CAAC;KAC5E,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ProjectConfig, CreateOptions } from "../types/index.js";
2
+ export declare function runPrompts(projectName?: string, options?: CreateOptions): Promise<ProjectConfig>;
3
+ export declare function getDefaultConfig(projectName: string, options?: CreateOptions): Promise<ProjectConfig>;
4
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/prompts/project.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EAEd,MAAM,mBAAmB,CAAC;AAI3B,wBAAsB,UAAU,CAC9B,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,aAAa,CAAC,CA4GxB;AAED,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,aAAa,CAAC,CAaxB"}