@getpara/create-para-app 0.6.0 → 2.7.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/README.md +71 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +306 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -48
- package/dist/index.js.map +1 -0
- package/dist/package-builder.d.ts +13 -0
- package/dist/package-builder.d.ts.map +1 -0
- package/dist/package-builder.js +89 -0
- package/dist/package-builder.js.map +1 -0
- package/dist/post-scaffold.d.ts +3 -0
- package/dist/post-scaffold.d.ts.map +1 -0
- package/dist/post-scaffold.js +64 -0
- package/dist/post-scaffold.js.map +1 -0
- package/dist/prompt-orchestrator.d.ts +3 -0
- package/dist/prompt-orchestrator.d.ts.map +1 -0
- package/dist/prompt-orchestrator.js +198 -0
- package/dist/prompt-orchestrator.js.map +1 -0
- package/dist/scaffolder.d.ts +3 -0
- package/dist/scaffolder.d.ts.map +1 -0
- package/dist/scaffolder.js +82 -0
- package/dist/scaffolder.js.map +1 -0
- package/dist/template-registry.d.ts +12 -0
- package/dist/template-registry.d.ts.map +1 -0
- package/dist/template-registry.js +29 -0
- package/dist/template-registry.js.map +1 -0
- package/dist/template-renderer.d.ts +11 -0
- package/dist/template-renderer.d.ts.map +1 -0
- package/dist/template-renderer.js +133 -0
- package/dist/template-renderer.js.map +1 -0
- package/dist/template-strategies/expo-template.d.ts +18 -0
- package/dist/template-strategies/expo-template.d.ts.map +1 -0
- package/dist/template-strategies/expo-template.js +173 -0
- package/dist/template-strategies/expo-template.js.map +1 -0
- package/dist/template-strategies/index.d.ts +4 -0
- package/dist/template-strategies/index.d.ts.map +1 -0
- package/dist/template-strategies/index.js +3 -0
- package/dist/template-strategies/index.js.map +1 -0
- package/dist/template-strategies/nextjs-template.d.ts +12 -0
- package/dist/template-strategies/nextjs-template.d.ts.map +1 -0
- package/dist/template-strategies/nextjs-template.js +123 -0
- package/dist/template-strategies/nextjs-template.js.map +1 -0
- package/dist/types.d.ts +67 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/fs.d.ts +11 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +38 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +25 -19
- package/dist/utils/logger.js.map +1 -0
- package/package.json +35 -30
- package/templates/expo/_env.example +3 -0
- package/templates/expo/_gitignore +48 -0
- package/templates/expo/_yarnrc.yml +1 -0
- package/templates/expo/app/(auth)/_layout.tsx +12 -0
- package/templates/expo/app/(auth)/index.tsx.template +86 -0
- package/templates/expo/app/(tabs)/_layout.tsx +16 -0
- package/templates/expo/app/(tabs)/index.tsx +112 -0
- package/templates/expo/app/(tabs)/send.tsx +111 -0
- package/templates/expo/app/_layout.tsx +17 -0
- package/templates/expo/app/index.tsx +22 -0
- package/templates/expo/app.json.template +32 -0
- package/templates/expo/assets/adaptive-icon.png +0 -0
- package/templates/expo/assets/favicon.png +0 -0
- package/templates/expo/assets/icon.png +0 -0
- package/templates/expo/assets/splash.png +0 -0
- package/templates/expo/babel.config.cjs +12 -0
- package/templates/expo/components/features/AuthForm.tsx.template +138 -0
- package/templates/expo/components/features/OAuthButtons.tsx.template +27 -0
- package/templates/expo/components/features/index.ts.template +4 -0
- package/templates/expo/components/ui/Button.tsx +58 -0
- package/templates/expo/components/ui/Card.tsx +11 -0
- package/templates/expo/components/ui/Divider.tsx +19 -0
- package/templates/expo/components/ui/Input.tsx +23 -0
- package/templates/expo/components/ui/WalletCard.tsx +44 -0
- package/templates/expo/components/ui/index.ts +5 -0
- package/templates/expo/eslint.config.cjs +15 -0
- package/templates/expo/global.css +3 -0
- package/templates/expo/hooks/useOneClickLogin.ts.template +161 -0
- package/templates/expo/hooks/useViemClient.ts +118 -0
- package/templates/expo/hooks/useWallets.ts +52 -0
- package/templates/expo/index.js +2 -0
- package/templates/expo/lib/auth.ts +54 -0
- package/templates/expo/lib/constants.ts.template +2 -0
- package/templates/expo/lib/para.ts +13 -0
- package/templates/expo/metro.config.cjs +14 -0
- package/templates/expo/nativewind-env.d.ts +2 -0
- package/templates/expo/prettier.config.cjs +10 -0
- package/templates/expo/providers/ParaProvider.tsx +140 -0
- package/templates/expo/tailwind.config.cjs +23 -0
- package/templates/expo/tsconfig.json +11 -0
- package/templates/expo/types/index.ts +28 -0
- package/templates/nextjs/README.md +69 -0
- package/templates/nextjs/_env.example +8 -0
- package/templates/nextjs/_gitignore +36 -0
- package/templates/nextjs/_yarnrc.yml +1 -0
- package/templates/nextjs/next.config.ts +5 -0
- package/templates/nextjs/postcss.config.mjs +7 -0
- package/templates/nextjs/public/para.svg +3 -0
- package/templates/nextjs/src/app/layout.tsx +30 -0
- package/templates/nextjs/src/app/page.tsx +40 -0
- package/templates/nextjs/src/components/ParaProvider.tsx +116 -0
- package/templates/nextjs/src/components/layout/Header.tsx +44 -0
- package/templates/nextjs/src/components/ui/ConnectCard.tsx +24 -0
- package/templates/nextjs/src/components/ui/SignMessage.tsx +53 -0
- package/templates/nextjs/src/components/ui/WalletInfo.tsx +22 -0
- package/templates/nextjs/src/hooks/useSignHelloWorld.ts +23 -0
- package/templates/nextjs/src/styles/globals.css +1 -0
- package/templates/nextjs/tsconfig.json +27 -0
- package/dist/bin/index.js +0 -2
- package/dist/commands/scaffold.js +0 -137
- package/dist/integrations/codeGenerators.js +0 -637
- package/dist/integrations/packageJsonHelpers.js +0 -77
- package/dist/integrations/sdkSetup.js +0 -24
- package/dist/integrations/sdkSetupNextjs.js +0 -111
- package/dist/integrations/sdkSetupVite.js +0 -82
- package/dist/package.json +0 -44
- package/dist/prompts/interactive.js +0 -98
- package/dist/src/commands/scaffold.js +0 -157
- package/dist/src/index.js +0 -48
- package/dist/src/integrations/codeGenerators.js +0 -633
- package/dist/src/integrations/packageJsonHelpers.js +0 -77
- package/dist/src/integrations/sdkSetup.js +0 -24
- package/dist/src/integrations/sdkSetupNextjs.js +0 -111
- package/dist/src/integrations/sdkSetupVite.js +0 -82
- package/dist/src/prompts/interactive.js +0 -98
- package/dist/src/templates/nextjs.js +0 -68
- package/dist/src/templates/vite-react.js +0 -52
- package/dist/src/utils/exec.js +0 -16
- package/dist/src/utils/formatting.js +0 -31
- package/dist/src/utils/logger.js +0 -19
- package/dist/templates/nextjs.js +0 -61
- package/dist/templates/vite-react.js +0 -43
- package/dist/utils/exec.js +0 -16
- package/dist/utils/formatting.js +0 -31
package/README.md
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# @getpara/create-para-app
|
|
2
|
+
|
|
3
|
+
Create Para SDK applications with one command.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npx @getpara/create-para-app my-app
|
|
9
|
+
cd my-app
|
|
10
|
+
cp .env.example .env
|
|
11
|
+
# Add your Para API key to .env
|
|
12
|
+
yarn dev
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Features
|
|
16
|
+
|
|
17
|
+
- **Interactive setup** - Choose your networks, auth methods, and wallets
|
|
18
|
+
- **Network support** - EVM (Ethereum, Polygon, etc.), Solana, Cosmos
|
|
19
|
+
- **Auth methods** - Email, Phone, OAuth (Google, Apple, Twitter, etc.)
|
|
20
|
+
- **External wallets** - MetaMask, Phantom, Keplr, and more
|
|
21
|
+
- **Modern stack** - Next.js 15, React 19, Tailwind CSS 4, TypeScript
|
|
22
|
+
|
|
23
|
+
## Usage
|
|
24
|
+
|
|
25
|
+
### Interactive Mode
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npx @getpara/create-para-app
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Follow the prompts to configure your app:
|
|
32
|
+
|
|
33
|
+
1. **App name** - Your project name (lowercase, hyphens allowed)
|
|
34
|
+
2. **Networks** - Select EVM, Solana, Cosmos (or multiple)
|
|
35
|
+
3. **Auth methods** - Email, Phone, OAuth providers
|
|
36
|
+
4. **External wallets** - Wallets to support based on selected networks
|
|
37
|
+
|
|
38
|
+
### With App Name
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npx @getpara/create-para-app my-para-app
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Generated Project
|
|
45
|
+
|
|
46
|
+
The CLI creates a Next.js application with:
|
|
47
|
+
|
|
48
|
+
- Para SDK pre-configured with your selected options
|
|
49
|
+
- Connect wallet UI
|
|
50
|
+
- Message signing example
|
|
51
|
+
- Tailwind CSS styling
|
|
52
|
+
- TypeScript configured
|
|
53
|
+
|
|
54
|
+
## Requirements
|
|
55
|
+
|
|
56
|
+
- Node.js 18.0.0 or higher
|
|
57
|
+
- Yarn or npm
|
|
58
|
+
|
|
59
|
+
## Get Your API Key
|
|
60
|
+
|
|
61
|
+
Visit [developer.getpara.com](https://developer.getpara.com) to create an account and get your API key.
|
|
62
|
+
|
|
63
|
+
## Documentation
|
|
64
|
+
|
|
65
|
+
- [Para Documentation](https://docs.getpara.com)
|
|
66
|
+
- [Para React SDK](https://docs.getpara.com/react-sdk)
|
|
67
|
+
- [Examples](https://github.com/para-space/examples-hub)
|
|
68
|
+
|
|
69
|
+
## License
|
|
70
|
+
|
|
71
|
+
MIT
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AA+LA,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CA0JzC"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import pc from 'picocolors';
|
|
3
|
+
import { runPrompts } from './prompt-orchestrator.js';
|
|
4
|
+
import { scaffold } from './scaffolder.js';
|
|
5
|
+
import { runPostScaffold } from './post-scaffold.js';
|
|
6
|
+
import { templateRegistry } from './template-registry.js';
|
|
7
|
+
import { pathExists, removeDir } from './utils/fs.js';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
function parseArgs(argv) {
|
|
10
|
+
const args = {};
|
|
11
|
+
for (let i = 0; i < argv.length; i++) {
|
|
12
|
+
const arg = argv[i];
|
|
13
|
+
if (arg === '--help' || arg === '-h') {
|
|
14
|
+
args.help = true;
|
|
15
|
+
}
|
|
16
|
+
else if (arg === '--yes' || arg === '-y') {
|
|
17
|
+
args.yes = true;
|
|
18
|
+
}
|
|
19
|
+
else if (arg === '--skip-install') {
|
|
20
|
+
args.skipInstall = true;
|
|
21
|
+
}
|
|
22
|
+
else if (arg === '--template' && argv[i + 1]) {
|
|
23
|
+
args.template = argv[++i];
|
|
24
|
+
}
|
|
25
|
+
else if (arg === '--bundle-id' && argv[i + 1]) {
|
|
26
|
+
args.bundleId = argv[++i];
|
|
27
|
+
}
|
|
28
|
+
else if (arg === '--networks' && argv[i + 1]) {
|
|
29
|
+
args.networks = argv[++i].split(',');
|
|
30
|
+
}
|
|
31
|
+
else if (arg === '--email') {
|
|
32
|
+
args.email = true;
|
|
33
|
+
}
|
|
34
|
+
else if (arg === '--phone') {
|
|
35
|
+
args.phone = true;
|
|
36
|
+
}
|
|
37
|
+
else if (arg === '--oauth' && argv[i + 1]) {
|
|
38
|
+
args.oauth = argv[++i].split(',');
|
|
39
|
+
}
|
|
40
|
+
else if (arg === '--wallets' && argv[i + 1]) {
|
|
41
|
+
args.wallets = argv[++i].split(',');
|
|
42
|
+
}
|
|
43
|
+
else if (!arg.startsWith('-') && !args.appName) {
|
|
44
|
+
args.appName = arg;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return args;
|
|
48
|
+
}
|
|
49
|
+
function printHelp() {
|
|
50
|
+
console.log(`
|
|
51
|
+
${pc.bold('@getpara/create-para-app')} - Create Para SDK applications
|
|
52
|
+
|
|
53
|
+
${pc.dim('Usage:')}
|
|
54
|
+
npx @getpara/create-para-app [app-name] [options]
|
|
55
|
+
|
|
56
|
+
${pc.dim('Options:')}
|
|
57
|
+
--template <type> Template: nextjs, expo (default: nextjs)
|
|
58
|
+
--bundle-id <id> Bundle ID for Expo (e.g., com.company.app)
|
|
59
|
+
--networks <list> Comma-separated networks: evm,solana,cosmos
|
|
60
|
+
--email Enable email authentication
|
|
61
|
+
--phone Enable phone authentication
|
|
62
|
+
--oauth <list> OAuth providers: GOOGLE,APPLE,TWITTER,DISCORD,FACEBOOK,FARCASTER
|
|
63
|
+
--wallets <list> External wallets: METAMASK,PHANTOM,KEPLR,etc.
|
|
64
|
+
--skip-install Skip dependency installation
|
|
65
|
+
-y, --yes Skip confirmations (overwrite existing directory)
|
|
66
|
+
-h, --help Show this help message
|
|
67
|
+
|
|
68
|
+
${pc.dim('Examples:')}
|
|
69
|
+
${pc.cyan('npx @getpara/create-para-app my-app')}
|
|
70
|
+
${pc.cyan('npx @getpara/create-para-app my-app --template expo --bundle-id com.company.myapp')}
|
|
71
|
+
${pc.cyan('npx @getpara/create-para-app my-app --template nextjs --networks evm --email')}
|
|
72
|
+
${pc.cyan('npx @getpara/create-para-app my-app --networks evm,solana --oauth GOOGLE,APPLE -y')}
|
|
73
|
+
|
|
74
|
+
${pc.dim('Interactive mode:')}
|
|
75
|
+
Run without options for interactive prompts.
|
|
76
|
+
`);
|
|
77
|
+
}
|
|
78
|
+
function isNonInteractive(args) {
|
|
79
|
+
// Non-interactive if:
|
|
80
|
+
// - For Next.js: networks are specified (minimum required)
|
|
81
|
+
// - For Expo: bundle-id is specified (networks default to EVM)
|
|
82
|
+
if (args.template === 'expo') {
|
|
83
|
+
return !!args.bundleId;
|
|
84
|
+
}
|
|
85
|
+
return !!args.networks && args.networks.length > 0;
|
|
86
|
+
}
|
|
87
|
+
function buildConfigFromArgs(args) {
|
|
88
|
+
if (!args.appName) {
|
|
89
|
+
throw new Error('App name is required in non-interactive mode');
|
|
90
|
+
}
|
|
91
|
+
const template = args.template ?? 'nextjs';
|
|
92
|
+
// Validate template
|
|
93
|
+
if (!templateRegistry.hasTemplate(template)) {
|
|
94
|
+
throw new Error(`Unknown template: ${template}. Available: nextjs, expo`);
|
|
95
|
+
}
|
|
96
|
+
// Template-specific validation
|
|
97
|
+
if (template === 'expo') {
|
|
98
|
+
// Expo requires bundle ID
|
|
99
|
+
if (!args.bundleId) {
|
|
100
|
+
throw new Error('--bundle-id is required for Expo template');
|
|
101
|
+
}
|
|
102
|
+
// Validate bundle ID format
|
|
103
|
+
const expoStrategy = templateRegistry.getStrategy('expo');
|
|
104
|
+
const bundleIdError = expoStrategy.validateBundleId(args.bundleId);
|
|
105
|
+
if (bundleIdError) {
|
|
106
|
+
throw new Error(`Invalid bundle ID: ${bundleIdError}`);
|
|
107
|
+
}
|
|
108
|
+
// Expo is EVM-only, warn if other networks specified
|
|
109
|
+
if (args.networks && args.networks.some(n => n !== 'evm')) {
|
|
110
|
+
console.log(pc.yellow('Warning: Expo template only supports EVM. Other networks will be ignored.'));
|
|
111
|
+
}
|
|
112
|
+
// Expo doesn't support external wallets
|
|
113
|
+
if (args.wallets && args.wallets.length > 0) {
|
|
114
|
+
console.log(pc.yellow('Warning: Expo template does not support external wallets. --wallets will be ignored.'));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
// Next.js requires networks
|
|
119
|
+
if (!args.networks || args.networks.length === 0) {
|
|
120
|
+
throw new Error('--networks is required in non-interactive mode');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Default to email auth if no auth method specified
|
|
124
|
+
const hasEmail = args.email ?? (!args.phone && !args.oauth);
|
|
125
|
+
const hasPhone = args.phone ?? false;
|
|
126
|
+
const hasOAuth = !!(args.oauth && args.oauth.length > 0);
|
|
127
|
+
// For Expo: EVM only, no external wallets
|
|
128
|
+
// For Next.js: use provided networks and wallets
|
|
129
|
+
const networks = template === 'expo' ? ['evm'] : args.networks;
|
|
130
|
+
const externalWallets = template === 'expo' ? [] : (args.wallets ?? []);
|
|
131
|
+
const baseConfig = {
|
|
132
|
+
appName: args.appName,
|
|
133
|
+
template,
|
|
134
|
+
networks: networks,
|
|
135
|
+
authMethods: {
|
|
136
|
+
email: hasEmail,
|
|
137
|
+
phone: hasPhone,
|
|
138
|
+
oauth: hasOAuth,
|
|
139
|
+
oauthProviders: args.oauth ?? [],
|
|
140
|
+
},
|
|
141
|
+
externalWallets: externalWallets,
|
|
142
|
+
};
|
|
143
|
+
if (template === 'expo') {
|
|
144
|
+
return {
|
|
145
|
+
...baseConfig,
|
|
146
|
+
template: 'expo',
|
|
147
|
+
bundleId: args.bundleId,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
...baseConfig,
|
|
152
|
+
template: 'nextjs',
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
function getStartCommand(config) {
|
|
156
|
+
return config.template === 'expo' ? 'yarn start' : 'yarn dev';
|
|
157
|
+
}
|
|
158
|
+
function getEnvVarName(config) {
|
|
159
|
+
return config.template === 'expo' ? 'EXPO_PUBLIC_PARA_API_KEY' : 'NEXT_PUBLIC_PARA_API_KEY';
|
|
160
|
+
}
|
|
161
|
+
export async function cli() {
|
|
162
|
+
const args = parseArgs(process.argv.slice(2));
|
|
163
|
+
// Help
|
|
164
|
+
if (args.help) {
|
|
165
|
+
printHelp();
|
|
166
|
+
process.exit(0);
|
|
167
|
+
}
|
|
168
|
+
let config;
|
|
169
|
+
if (isNonInteractive(args)) {
|
|
170
|
+
// Non-interactive mode
|
|
171
|
+
console.log(pc.cyan('@getpara/create-para-app'), pc.dim('(non-interactive mode)'));
|
|
172
|
+
console.log();
|
|
173
|
+
try {
|
|
174
|
+
config = buildConfigFromArgs(args);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
console.error(pc.red('Error:'), error.message);
|
|
178
|
+
console.log();
|
|
179
|
+
console.log(pc.dim('Run with --help for usage information.'));
|
|
180
|
+
process.exit(1);
|
|
181
|
+
}
|
|
182
|
+
console.log(pc.dim('Configuration:'));
|
|
183
|
+
console.log(pc.dim(` Template: ${config.template}`));
|
|
184
|
+
console.log(pc.dim(` App name: ${config.appName}`));
|
|
185
|
+
if (config.template === 'expo') {
|
|
186
|
+
console.log(pc.dim(` Bundle ID: ${config.bundleId}`));
|
|
187
|
+
}
|
|
188
|
+
console.log(pc.dim(` Networks: ${config.networks.join(', ')}`));
|
|
189
|
+
console.log(pc.dim(` Auth: ${[
|
|
190
|
+
config.authMethods.email && 'email',
|
|
191
|
+
config.authMethods.phone && 'phone',
|
|
192
|
+
config.authMethods.oauth && `oauth(${config.authMethods.oauthProviders.join(',')})`,
|
|
193
|
+
]
|
|
194
|
+
.filter(Boolean)
|
|
195
|
+
.join(', ')}`));
|
|
196
|
+
if (config.externalWallets.length > 0) {
|
|
197
|
+
console.log(pc.dim(` Wallets: ${config.externalWallets.join(', ')}`));
|
|
198
|
+
}
|
|
199
|
+
console.log();
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
// Interactive mode
|
|
203
|
+
console.log();
|
|
204
|
+
p.intro(pc.bgCyan(pc.black(' @getpara/create-para-app ')));
|
|
205
|
+
try {
|
|
206
|
+
config = await runPrompts(args.appName, args.template);
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
if (error instanceof Error && error.message === 'cancelled') {
|
|
210
|
+
p.cancel('Operation cancelled.');
|
|
211
|
+
process.exit(0);
|
|
212
|
+
}
|
|
213
|
+
throw error;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// Check if directory already exists
|
|
217
|
+
const targetDir = path.join(process.cwd(), config.appName);
|
|
218
|
+
if (await pathExists(targetDir)) {
|
|
219
|
+
if (isNonInteractive(args)) {
|
|
220
|
+
if (args.yes) {
|
|
221
|
+
console.log(pc.yellow(`Overwriting existing directory: ${config.appName}`));
|
|
222
|
+
await removeDir(targetDir);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
console.error(pc.red(`Error: Directory ${config.appName} already exists.`));
|
|
226
|
+
console.log(pc.dim('Use --yes to overwrite.'));
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
const shouldOverwrite = await p.confirm({
|
|
232
|
+
message: `Directory ${pc.cyan(config.appName)} already exists. Overwrite?`,
|
|
233
|
+
initialValue: false,
|
|
234
|
+
});
|
|
235
|
+
if (p.isCancel(shouldOverwrite) || !shouldOverwrite) {
|
|
236
|
+
p.cancel('Operation cancelled.');
|
|
237
|
+
process.exit(0);
|
|
238
|
+
}
|
|
239
|
+
const s = p.spinner();
|
|
240
|
+
s.start('Removing existing directory...');
|
|
241
|
+
await removeDir(targetDir);
|
|
242
|
+
s.stop('Removed existing directory');
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// Scaffold the project
|
|
246
|
+
if (isNonInteractive(args)) {
|
|
247
|
+
console.log(pc.cyan('Creating project...'));
|
|
248
|
+
await scaffold(config);
|
|
249
|
+
console.log(pc.green('✓'), 'Project created!');
|
|
250
|
+
if (!args.skipInstall) {
|
|
251
|
+
await runPostScaffold(config, true); // silent mode
|
|
252
|
+
}
|
|
253
|
+
console.log();
|
|
254
|
+
console.log(pc.green('Done!'), `Your Para app is ready at ${pc.cyan(config.appName)}`);
|
|
255
|
+
console.log();
|
|
256
|
+
console.log(pc.dim('Next steps:'));
|
|
257
|
+
console.log(` cd ${config.appName}`);
|
|
258
|
+
console.log(' cp .env.example .env');
|
|
259
|
+
console.log(` # Add your ${getEnvVarName(config)} to .env`);
|
|
260
|
+
if (args.skipInstall) {
|
|
261
|
+
console.log(' yarn install');
|
|
262
|
+
}
|
|
263
|
+
if (config.template === 'expo') {
|
|
264
|
+
console.log(' npx expo prebuild');
|
|
265
|
+
console.log(' yarn ios # or yarn android');
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
console.log(` ${getStartCommand(config)}`);
|
|
269
|
+
}
|
|
270
|
+
console.log();
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
const s = p.spinner();
|
|
274
|
+
s.start('Creating your Para app...');
|
|
275
|
+
try {
|
|
276
|
+
await scaffold(config);
|
|
277
|
+
s.stop('Project created!');
|
|
278
|
+
// Post-scaffold tasks
|
|
279
|
+
await runPostScaffold(config);
|
|
280
|
+
// Final message
|
|
281
|
+
console.log();
|
|
282
|
+
p.outro(pc.green('Your Para app is ready!'));
|
|
283
|
+
console.log();
|
|
284
|
+
console.log(pc.dim(' Next steps:'));
|
|
285
|
+
console.log();
|
|
286
|
+
console.log(` ${pc.cyan('cd')} ${config.appName}`);
|
|
287
|
+
console.log(` ${pc.cyan('cp')} .env.example .env`);
|
|
288
|
+
console.log(` ${pc.dim(`# Add your ${getEnvVarName(config)} to .env`)}`);
|
|
289
|
+
if (config.template === 'expo') {
|
|
290
|
+
console.log(` ${pc.cyan('npx')} expo prebuild`);
|
|
291
|
+
console.log(` ${pc.cyan('yarn')} ios ${pc.dim('# or yarn android')}`);
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
console.log(` ${pc.cyan(getStartCommand(config).split(' ')[0])} ${getStartCommand(config).split(' ')[1]}`);
|
|
295
|
+
}
|
|
296
|
+
console.log();
|
|
297
|
+
console.log(pc.dim(` Get your API key at ${pc.underline('https://developer.getpara.com')}`));
|
|
298
|
+
console.log();
|
|
299
|
+
}
|
|
300
|
+
catch (error) {
|
|
301
|
+
s.stop('Failed to create project');
|
|
302
|
+
throw error;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.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
CHANGED
|
@@ -1,48 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
import { program } from 'commander';
|
|
11
|
-
import updateNotifier from 'update-notifier';
|
|
12
|
-
import pkg from '../package.json' assert { type: 'json' };
|
|
13
|
-
import scaffold from './commands/scaffold.js';
|
|
14
|
-
updateNotifier({ pkg }).notify();
|
|
15
|
-
program
|
|
16
|
-
.name('create-para-app')
|
|
17
|
-
.description('CLI tool for scaffolding new apps with Para SDKs')
|
|
18
|
-
.version(pkg.version)
|
|
19
|
-
.usage('[projectName] [options]')
|
|
20
|
-
.helpOption('--help', 'Display help for command');
|
|
21
|
-
program
|
|
22
|
-
.argument('[projectName]')
|
|
23
|
-
.description('Scaffold a new app with specified template and features')
|
|
24
|
-
.option('--template <template>', 'Specify the template: nextjs or vite-react')
|
|
25
|
-
.option('--use-latest', 'Use the latest version of the underlying framework')
|
|
26
|
-
.option('--no-prompt', 'Skip interactive prompts')
|
|
27
|
-
.option('--no-git', 'Disable git initialization')
|
|
28
|
-
.option('--package-manager <pm>', 'Specify package manager: npm, yarn, bun, pnpm', 'yarn')
|
|
29
|
-
.option('--skip-deps', 'Skip dependency installation')
|
|
30
|
-
.option('--typescript', 'Enable TypeScript (default: enabled)', true)
|
|
31
|
-
.option('--no-typescript', 'Disable TypeScript')
|
|
32
|
-
.option('--eslint', 'Enable ESLint (default: enabled)', true)
|
|
33
|
-
.option('--no-eslint', 'Disable ESLint')
|
|
34
|
-
.option('--tailwind', 'Enable Tailwind CSS (default: enabled)', true)
|
|
35
|
-
.option('--no-tailwind', 'Disable Tailwind CSS')
|
|
36
|
-
.option('--src-dir', 'Use src/ directory (default: enabled)', true)
|
|
37
|
-
.option('--no-src-dir', 'Disable src/ directory')
|
|
38
|
-
.option('--app', 'Use the App Router (default: enabled)', true)
|
|
39
|
-
.option('--no-app', 'Disable App Router')
|
|
40
|
-
.option('--networks <list>', 'Comma separated networks: "evm,cosmos,solana"')
|
|
41
|
-
.option('--evm-signer <signer>', 'Specify EVM signer: "ethers" or "viem"')
|
|
42
|
-
.option('--external-wallet', 'Enable external wallet support (default: false)')
|
|
43
|
-
.option('--api-key <key>', 'Provide your API key to skip prompt')
|
|
44
|
-
.option('--project-name <name>', 'Explicitly set project name to skip name prompt')
|
|
45
|
-
.action((projectName, options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
46
|
-
yield scaffold(projectName, options);
|
|
47
|
-
}));
|
|
48
|
-
program.parse(process.argv);
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { cli } from './cli.js';
|
|
3
|
+
cli().catch(error => {
|
|
4
|
+
console.error('Error:', error);
|
|
5
|
+
process.exit(1);
|
|
6
|
+
});
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;IAClB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ScaffoldConfig } from './types.js';
|
|
2
|
+
interface PackageJson {
|
|
3
|
+
name: string;
|
|
4
|
+
version: string;
|
|
5
|
+
private: boolean;
|
|
6
|
+
type: string;
|
|
7
|
+
scripts: Record<string, string>;
|
|
8
|
+
dependencies: Record<string, string>;
|
|
9
|
+
devDependencies: Record<string, string>;
|
|
10
|
+
}
|
|
11
|
+
export declare function buildPackageJson(config: ScaffoldConfig): PackageJson;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=package-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-builder.d.ts","sourceRoot":"","sources":["../src/package-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AA0DD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,WAAW,CA4BpE"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// All dependencies - included regardless of selected networks
|
|
2
|
+
// This matches the para-modal examples and ensures @getpara/react-sdk works correctly
|
|
3
|
+
const DEPENDENCIES = {
|
|
4
|
+
// EVM + wagmi peer deps
|
|
5
|
+
'@base-org/account': '^2.5.0',
|
|
6
|
+
'@gemini-wallet/core': '^0.3.2',
|
|
7
|
+
'@metamask/sdk': '^0.34.0',
|
|
8
|
+
'@safe-global/safe-apps-provider': '^0.18.6',
|
|
9
|
+
'@safe-global/safe-apps-sdk': '^9.1.0',
|
|
10
|
+
'porto': '^0.2.37',
|
|
11
|
+
'viem': '2.42.1',
|
|
12
|
+
'wagmi': '3.1.0',
|
|
13
|
+
// Cosmos
|
|
14
|
+
'@cosmjs/amino': '0.37.0',
|
|
15
|
+
'@cosmjs/cosmwasm-stargate': '0.37.0',
|
|
16
|
+
'@cosmjs/encoding': '0.37.0',
|
|
17
|
+
'@cosmjs/launchpad': '0.27.1',
|
|
18
|
+
'@cosmjs/proto-signing': '0.37.0',
|
|
19
|
+
'@cosmjs/stargate': '0.37.0',
|
|
20
|
+
'@cosmjs/tendermint-rpc': '0.37.0',
|
|
21
|
+
'graz': '0.4.2',
|
|
22
|
+
// Solana
|
|
23
|
+
'@solana-mobile/wallet-adapter-mobile': '2.2.5',
|
|
24
|
+
'@solana/wallet-adapter-base': '0.9.27',
|
|
25
|
+
'@solana/wallet-adapter-react': '0.15.39',
|
|
26
|
+
'@solana/wallet-adapter-walletconnect': '0.1.21',
|
|
27
|
+
'@solana/web3.js': '1.98.4',
|
|
28
|
+
// Farcaster (peer deps of Para SDK)
|
|
29
|
+
'@farcaster/mini-app-solana': '1.1.1',
|
|
30
|
+
'@farcaster/miniapp-sdk': '0.2.1',
|
|
31
|
+
'@farcaster/miniapp-wagmi-connector': '1.1.0',
|
|
32
|
+
// Core
|
|
33
|
+
'@getpara/react-sdk': '2.5.0',
|
|
34
|
+
'@tanstack/react-query': '5.90.12',
|
|
35
|
+
'arg': '^5.0.2',
|
|
36
|
+
'next': '15.1.5',
|
|
37
|
+
'react': '^19.0.0',
|
|
38
|
+
'react-dom': '^19.0.0',
|
|
39
|
+
'starknet': '^9.2.1',
|
|
40
|
+
};
|
|
41
|
+
// Dev dependencies
|
|
42
|
+
const DEV_DEPENDENCIES = {
|
|
43
|
+
'@eslint/js': '^9.29.0',
|
|
44
|
+
'@tailwindcss/postcss': '^4.1.10',
|
|
45
|
+
'@types/node': '^20',
|
|
46
|
+
'@types/react': '^19',
|
|
47
|
+
'@types/react-dom': '^19',
|
|
48
|
+
'eslint': '^9.29.0',
|
|
49
|
+
'pino-pretty': '13.0.0',
|
|
50
|
+
'postcss': '^8',
|
|
51
|
+
'tailwindcss': '^4.1.10',
|
|
52
|
+
'typescript': '^5',
|
|
53
|
+
'typescript-eslint': '^8.22.0',
|
|
54
|
+
};
|
|
55
|
+
export function buildPackageJson(config) {
|
|
56
|
+
// Build scripts
|
|
57
|
+
const scripts = {
|
|
58
|
+
dev: 'next dev',
|
|
59
|
+
build: 'next build',
|
|
60
|
+
start: 'next start',
|
|
61
|
+
lint: 'eslint .',
|
|
62
|
+
typecheck: 'tsc --noEmit',
|
|
63
|
+
};
|
|
64
|
+
// Add postinstall for Cosmos (graz codegen)
|
|
65
|
+
if (config.networks.includes('cosmos')) {
|
|
66
|
+
scripts.postinstall = 'yarn graz --generate';
|
|
67
|
+
}
|
|
68
|
+
// Sort dependencies alphabetically
|
|
69
|
+
const sortedDeps = sortObject(DEPENDENCIES);
|
|
70
|
+
const sortedDevDeps = sortObject(DEV_DEPENDENCIES);
|
|
71
|
+
return {
|
|
72
|
+
name: config.appName,
|
|
73
|
+
version: '0.1.0',
|
|
74
|
+
private: true,
|
|
75
|
+
type: 'module',
|
|
76
|
+
scripts,
|
|
77
|
+
dependencies: sortedDeps,
|
|
78
|
+
devDependencies: sortedDevDeps,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function sortObject(obj) {
|
|
82
|
+
return Object.keys(obj)
|
|
83
|
+
.sort()
|
|
84
|
+
.reduce((acc, key) => {
|
|
85
|
+
acc[key] = obj[key];
|
|
86
|
+
return acc;
|
|
87
|
+
}, {});
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=package-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-builder.js","sourceRoot":"","sources":["../src/package-builder.ts"],"names":[],"mappings":"AAYA,8DAA8D;AAC9D,sFAAsF;AACtF,MAAM,YAAY,GAA2B;IAC3C,wBAAwB;IACxB,mBAAmB,EAAE,QAAQ;IAC7B,qBAAqB,EAAE,QAAQ;IAC/B,eAAe,EAAE,SAAS;IAC1B,iCAAiC,EAAE,SAAS;IAC5C,4BAA4B,EAAE,QAAQ;IACtC,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,OAAO;IAChB,SAAS;IACT,eAAe,EAAE,QAAQ;IACzB,2BAA2B,EAAE,QAAQ;IACrC,kBAAkB,EAAE,QAAQ;IAC5B,mBAAmB,EAAE,QAAQ;IAC7B,uBAAuB,EAAE,QAAQ;IACjC,kBAAkB,EAAE,QAAQ;IAC5B,wBAAwB,EAAE,QAAQ;IAClC,MAAM,EAAE,OAAO;IACf,SAAS;IACT,sCAAsC,EAAE,OAAO;IAC/C,6BAA6B,EAAE,QAAQ;IACvC,8BAA8B,EAAE,SAAS;IACzC,sCAAsC,EAAE,QAAQ;IAChD,iBAAiB,EAAE,QAAQ;IAC3B,oCAAoC;IACpC,4BAA4B,EAAE,OAAO;IACrC,wBAAwB,EAAE,OAAO;IACjC,oCAAoC,EAAE,OAAO;IAC7C,OAAO;IACP,oBAAoB,EAAE,OAAO;IAC7B,uBAAuB,EAAE,SAAS;IAClC,KAAK,EAAE,QAAQ;IACf,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,WAAW,EAAE,SAAS;IACtB,UAAU,EAAE,QAAQ;CACrB,CAAC;AAEF,mBAAmB;AACnB,MAAM,gBAAgB,GAA2B;IAC/C,YAAY,EAAE,SAAS;IACvB,sBAAsB,EAAE,SAAS;IACjC,aAAa,EAAE,KAAK;IACpB,cAAc,EAAE,KAAK;IACrB,kBAAkB,EAAE,KAAK;IACzB,QAAQ,EAAE,SAAS;IACnB,aAAa,EAAE,QAAQ;IACvB,SAAS,EAAE,IAAI;IACf,aAAa,EAAE,SAAS;IACxB,YAAY,EAAE,IAAI;IAClB,mBAAmB,EAAE,SAAS;CAC/B,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,MAAsB;IACrD,gBAAgB;IAChB,MAAM,OAAO,GAA2B;QACtC,GAAG,EAAE,UAAU;QACf,KAAK,EAAE,YAAY;QACnB,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,UAAU;QAChB,SAAS,EAAE,cAAc;KAC1B,CAAC;IAEF,4CAA4C;IAC5C,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,WAAW,GAAG,sBAAsB,CAAC;IAC/C,CAAC;IAED,mCAAmC;IACnC,MAAM,UAAU,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAEnD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,OAAO;QACpB,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,QAAQ;QACd,OAAO;QACP,YAAY,EAAE,UAAU;QACxB,eAAe,EAAE,aAAa;KAC/B,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,GAA2B;IAC7C,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;SACpB,IAAI,EAAE;SACN,MAAM,CACL,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACX,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAA4B,CAC7B,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-scaffold.d.ts","sourceRoot":"","sources":["../src/post-scaffold.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,wBAAsB,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAqC3F"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import * as p from '@clack/prompts';
|
|
4
|
+
import pc from 'picocolors';
|
|
5
|
+
export async function runPostScaffold(config, silent = false) {
|
|
6
|
+
const projectDir = path.join(process.cwd(), config.appName);
|
|
7
|
+
if (silent) {
|
|
8
|
+
// Non-interactive mode - just install without prompts
|
|
9
|
+
console.log(pc.cyan('Installing dependencies...'));
|
|
10
|
+
try {
|
|
11
|
+
await runCommand('yarn', ['install'], projectDir);
|
|
12
|
+
console.log(pc.green('✓'), 'Dependencies installed!');
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
console.log(pc.yellow('⚠'), 'Could not install dependencies. Run `yarn install` manually.');
|
|
16
|
+
}
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
// Interactive mode - ask user
|
|
20
|
+
const shouldInstall = await p.confirm({
|
|
21
|
+
message: 'Install dependencies now?',
|
|
22
|
+
initialValue: true,
|
|
23
|
+
});
|
|
24
|
+
if (p.isCancel(shouldInstall)) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (shouldInstall) {
|
|
28
|
+
const s = p.spinner();
|
|
29
|
+
s.start('Installing dependencies with yarn...');
|
|
30
|
+
try {
|
|
31
|
+
await runCommand('yarn', ['install'], projectDir);
|
|
32
|
+
s.stop('Dependencies installed!');
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
s.stop('Failed to install dependencies');
|
|
36
|
+
p.log.warn('Could not install dependencies automatically. Please run `yarn install` manually.');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function runCommand(command, args, cwd) {
|
|
41
|
+
return new Promise((resolve, reject) => {
|
|
42
|
+
const child = spawn(command, args, {
|
|
43
|
+
cwd,
|
|
44
|
+
stdio: 'pipe', // Don't show output
|
|
45
|
+
shell: true,
|
|
46
|
+
});
|
|
47
|
+
let stderr = '';
|
|
48
|
+
child.stderr?.on('data', data => {
|
|
49
|
+
stderr += data.toString();
|
|
50
|
+
});
|
|
51
|
+
child.on('close', code => {
|
|
52
|
+
if (code === 0) {
|
|
53
|
+
resolve();
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
reject(new Error(`Command failed with code ${code}: ${stderr}`));
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
child.on('error', error => {
|
|
60
|
+
reject(error);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=post-scaffold.js.map
|