@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.
- package/dist/commands/add.d.ts +8 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +215 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/create.d.ts +3 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +63 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/deploy.d.ts +7 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +159 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/project.d.ts +4 -0
- package/dist/prompts/project.d.ts.map +1 -0
- package/dist/prompts/project.js +124 -0
- package/dist/prompts/project.js.map +1 -0
- package/dist/templates/installer.d.ts +4 -0
- package/dist/templates/installer.d.ts.map +1 -0
- package/dist/templates/installer.js +91 -0
- package/dist/templates/installer.js.map +1 -0
- package/dist/types/index.d.ts +40 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/clarinet.d.ts +5 -0
- package/dist/utils/clarinet.d.ts.map +1 -0
- package/dist/utils/clarinet.js +72 -0
- package/dist/utils/clarinet.js.map +1 -0
- package/dist/utils/filesystem.d.ts +4 -0
- package/dist/utils/filesystem.d.ts.map +1 -0
- package/dist/utils/filesystem.js +158 -0
- package/dist/utils/filesystem.js.map +1 -0
- package/dist/utils/git.d.ts +2 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +21 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +45 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/package-manager.d.ts +5 -0
- package/dist/utils/package-manager.d.ts.map +1 -0
- package/dist/utils/package-manager.js +65 -0
- package/dist/utils/package-manager.js.map +1 -0
- package/dist/utils/validation.d.ts +5 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +41 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +52 -0
- package/templates/base/editorconfig +12 -0
- package/templates/base/gitignore +13 -0
- package/templates/base/prettierrc +7 -0
- package/templates/contracts/counter/counter.clar +43 -0
- package/templates/contracts/counter/counter.test.ts +127 -0
- package/templates/contracts/defi/sip010-trait.clar +11 -0
- package/templates/contracts/defi/staking-pool.clar +20 -0
- package/templates/contracts/marketplace/nft-marketplace.clar +44 -0
- package/templates/contracts/marketplace/nft-trait.clar +8 -0
- package/templates/contracts/marketplace/sip009-nft.clar +25 -0
- package/templates/contracts/nft/nft.clar +111 -0
- package/templates/contracts/nft/nft.test.ts +204 -0
- package/templates/contracts/token/token.clar +67 -0
- package/templates/contracts/token/token.test.ts +139 -0
- package/templates/frontends/nextjs/template/.env.example +2 -0
- package/templates/frontends/nextjs/template/app/globals.css +40 -0
- package/templates/frontends/nextjs/template/app/layout.tsx +36 -0
- package/templates/frontends/nextjs/template/app/page.tsx +42 -0
- package/templates/frontends/nextjs/template/app/providers.tsx +31 -0
- package/templates/frontends/nextjs/template/components/contracts/counter-interaction.tsx +80 -0
- package/templates/frontends/nextjs/template/components/header.tsx +24 -0
- package/templates/frontends/nextjs/template/components/wallet/connect-button.tsx +44 -0
- package/templates/frontends/nextjs/template/hooks/use-contract-call.ts +52 -0
- package/templates/frontends/nextjs/template/hooks/use-contract-read.ts +49 -0
- package/templates/frontends/nextjs/template/hooks/use-stacks.ts +26 -0
- package/templates/frontends/nextjs/template/lib/contracts.ts +29 -0
- package/templates/frontends/nextjs/template/lib/stacks.ts +18 -0
- package/templates/frontends/nextjs/template/next.config.js +6 -0
- package/templates/frontends/nextjs/template/package.json +29 -0
- package/templates/frontends/nextjs/template/postcss.config.js +6 -0
- package/templates/frontends/nextjs/template/public/logo.svg +3 -0
- package/templates/frontends/nextjs/template/tailwind.config.js +18 -0
- package/templates/frontends/nextjs/template/tsconfig.json +26 -0
- package/templates/frontends/react/template/.env.example +2 -0
- package/templates/frontends/react/template/index.html +13 -0
- package/templates/frontends/react/template/package.json +29 -0
- package/templates/frontends/react/template/postcss.config.js +6 -0
- package/templates/frontends/react/template/public/logo.svg +3 -0
- package/templates/frontends/react/template/src/App.tsx +100 -0
- package/templates/frontends/react/template/src/components/CounterInteraction.tsx +121 -0
- package/templates/frontends/react/template/src/components/Header.tsx +39 -0
- package/templates/frontends/react/template/src/index.css +33 -0
- package/templates/frontends/react/template/src/main.tsx +10 -0
- package/templates/frontends/react/template/tailwind.config.js +15 -0
- package/templates/frontends/react/template/tsconfig.json +25 -0
- package/templates/frontends/react/template/tsconfig.node.json +10 -0
- package/templates/frontends/react/template/vite.config.ts +12 -0
- package/templates/frontends/vue/template/.env.example +2 -0
- package/templates/frontends/vue/template/index.html +13 -0
- package/templates/frontends/vue/template/package.json +27 -0
- package/templates/frontends/vue/template/postcss.config.js +6 -0
- package/templates/frontends/vue/template/public/logo.svg +3 -0
- package/templates/frontends/vue/template/src/App.vue +98 -0
- package/templates/frontends/vue/template/src/components/AppHeader.vue +39 -0
- package/templates/frontends/vue/template/src/components/CounterInteraction.vue +120 -0
- package/templates/frontends/vue/template/src/env.d.ts +16 -0
- package/templates/frontends/vue/template/src/main.ts +5 -0
- package/templates/frontends/vue/template/src/style.css +33 -0
- package/templates/frontends/vue/template/tailwind.config.js +15 -0
- package/templates/frontends/vue/template/tsconfig.json +25 -0
- package/templates/frontends/vue/template/tsconfig.node.json +10 -0
- package/templates/frontends/vue/template/vite.config.ts +12 -0
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|