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