create-sumit-app 1.0.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/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +543 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +9 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +49 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/logger.d.ts +18 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +71 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/templates.d.ts +5 -0
- package/dist/lib/templates.d.ts.map +1 -0
- package/dist/lib/templates.js +30 -0
- package/dist/lib/templates.js.map +1 -0
- package/dist/lib/utils.d.ts +12 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +107 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/types/index.d.ts +30 -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/package.json +77 -0
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,543 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
import { Command } from 'commander';
|
|
4
|
+
import { execa } from 'execa';
|
|
5
|
+
import prompts from 'prompts';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import fs from 'fs-extra';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import ora from 'ora';
|
|
10
|
+
import { Logger } from './lib/logger.js';
|
|
11
|
+
import { TEMPLATES, getTemplate, listTemplates } from './lib/templates.js';
|
|
12
|
+
import { loadConfig, updateConfig, resetConfig, showConfig, getConfigPath, } from './lib/config.js';
|
|
13
|
+
import { getPackageManagerInfo, checkForUpdates, isDirectoryEmpty, validateProjectName, formatDuration,
|
|
14
|
+
// initializeGitRepository,
|
|
15
|
+
} from './lib/utils.js';
|
|
16
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
+
const __dirname = path.dirname(__filename);
|
|
18
|
+
function getTemplatePath(template) {
|
|
19
|
+
return template.path || `templates/${template.name}`;
|
|
20
|
+
}
|
|
21
|
+
async function cleanupGitDirectory(projectPath, logger) {
|
|
22
|
+
const gitDir = path.join(projectPath, '.git');
|
|
23
|
+
if (!(await fs.pathExists(gitDir))) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
let retries = 3;
|
|
27
|
+
while (retries > 0) {
|
|
28
|
+
try {
|
|
29
|
+
await fs.remove(gitDir);
|
|
30
|
+
logger.verbose('Removed template .git directory');
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
retries--;
|
|
35
|
+
if (error.code === 'EBUSY' || error.code === 'EPERM') {
|
|
36
|
+
if (retries > 0) {
|
|
37
|
+
logger.verbose(`Git cleanup failed, retrying... (${retries} attempts left)`);
|
|
38
|
+
// Wait a bit before retrying
|
|
39
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
40
|
+
// Try to make files writable on Windows
|
|
41
|
+
try {
|
|
42
|
+
await makeGitFilesWritable(gitDir);
|
|
43
|
+
}
|
|
44
|
+
catch (chmodError) {
|
|
45
|
+
// Ignore chmod errors
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
logger.warn('Could not remove .git directory automatically');
|
|
50
|
+
logger.info('You may need to manually delete the .git folder if it exists');
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// For other errors, just warn and continue
|
|
56
|
+
logger.verbose(`Git cleanup error: ${error.message}`);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Helper function to make git files writable
|
|
63
|
+
async function makeGitFilesWritable(gitDir) {
|
|
64
|
+
try {
|
|
65
|
+
const files = await fs.readdir(gitDir, { withFileTypes: true });
|
|
66
|
+
for (const file of files) {
|
|
67
|
+
const fullPath = path.join(gitDir, file.name);
|
|
68
|
+
if (file.isDirectory()) {
|
|
69
|
+
await makeGitFilesWritable(fullPath);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
try {
|
|
73
|
+
await fs.chmod(fullPath, 0o666); // Make file writable
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
// Ignore individual file errors
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
// Ignore directory traversal errors
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async function selectPackageManager(config, logger, packageManagerName) {
|
|
86
|
+
// Available package managers with descriptions
|
|
87
|
+
const availableManagers = [
|
|
88
|
+
{
|
|
89
|
+
name: 'bun',
|
|
90
|
+
description: '⚡ Ultra-fast JavaScript runtime and package manager',
|
|
91
|
+
},
|
|
92
|
+
// {
|
|
93
|
+
// name: 'pnpm',
|
|
94
|
+
// description: '📦 Fast, disk space efficient package manager',
|
|
95
|
+
// },
|
|
96
|
+
// {
|
|
97
|
+
// name: 'yarn',
|
|
98
|
+
// description: '🐈 Fast, reliable, and secure dependency management',
|
|
99
|
+
// },
|
|
100
|
+
// {
|
|
101
|
+
// name: 'npm',
|
|
102
|
+
// description: '📦 Simple and widely used Node.js package manager',
|
|
103
|
+
// },
|
|
104
|
+
];
|
|
105
|
+
// If package manager specified via CLI, use it
|
|
106
|
+
if (packageManagerName) {
|
|
107
|
+
const manager = availableManagers.find((m) => m.name === packageManagerName);
|
|
108
|
+
if (!manager) {
|
|
109
|
+
logger.error(`Package manager "${packageManagerName}" not found.`);
|
|
110
|
+
logger.info('Available package managers:');
|
|
111
|
+
availableManagers.forEach((m) => logger.info(` • ${m.name} - ${m.description}`));
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
logger.verbose(`Using CLI specified package manager: ${manager.name}`);
|
|
115
|
+
return manager.name;
|
|
116
|
+
}
|
|
117
|
+
// If default package manager in config, use it
|
|
118
|
+
if (config.packageManager) {
|
|
119
|
+
logger.verbose(`Using config default package manager: ${config.packageManager}`);
|
|
120
|
+
return config.packageManager;
|
|
121
|
+
}
|
|
122
|
+
// Check for lockfiles in the CURRENT directory for auto-detection
|
|
123
|
+
const lockFiles = [
|
|
124
|
+
{ name: 'bun', file: 'bun.lockb' },
|
|
125
|
+
{ name: 'pnpm', file: 'pnpm-lock.yaml' },
|
|
126
|
+
{ name: 'yarn', file: 'yarn.lock' },
|
|
127
|
+
{ name: 'npm', file: 'package-lock.json' },
|
|
128
|
+
];
|
|
129
|
+
for (const lockFile of lockFiles) {
|
|
130
|
+
if (await fs.pathExists(path.join(process.cwd(), lockFile.file))) {
|
|
131
|
+
logger.verbose(`Auto-detected ${lockFile.name} from ${lockFile.file}`);
|
|
132
|
+
return lockFile.name;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Interactive selection (no auto-detection from global availability)
|
|
136
|
+
logger.newLine();
|
|
137
|
+
logger.log('📦 Choose a package manager:');
|
|
138
|
+
const { selectedManager } = await prompts({
|
|
139
|
+
type: 'select',
|
|
140
|
+
name: 'selectedManager',
|
|
141
|
+
message: 'Select a package manager',
|
|
142
|
+
choices: availableManagers.map((manager) => ({
|
|
143
|
+
title: `${manager.name}`,
|
|
144
|
+
description: manager.description,
|
|
145
|
+
value: manager.name,
|
|
146
|
+
})),
|
|
147
|
+
initial: 0, // Default to bun (first option)
|
|
148
|
+
});
|
|
149
|
+
if (!selectedManager) {
|
|
150
|
+
logger.error('Package manager selection cancelled');
|
|
151
|
+
process.exit(0);
|
|
152
|
+
}
|
|
153
|
+
return selectedManager;
|
|
154
|
+
}
|
|
155
|
+
async function selectTemplate(config, logger, templateName) {
|
|
156
|
+
// If template specified via CLI, use it
|
|
157
|
+
if (templateName) {
|
|
158
|
+
const template = getTemplate(templateName);
|
|
159
|
+
if (!template) {
|
|
160
|
+
logger.error(`Template "${templateName}" not found.`);
|
|
161
|
+
logger.info('Available templates:');
|
|
162
|
+
TEMPLATES.forEach((t) => logger.info(` • ${t.name} - ${t.description}`));
|
|
163
|
+
process.exit(1);
|
|
164
|
+
}
|
|
165
|
+
return template;
|
|
166
|
+
}
|
|
167
|
+
// If default template in config, use it
|
|
168
|
+
if (config.defaultTemplate) {
|
|
169
|
+
const template = getTemplate(config.defaultTemplate);
|
|
170
|
+
if (template) {
|
|
171
|
+
logger.verbose(`Using default template: ${template.name}`);
|
|
172
|
+
return template;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Interactive selection
|
|
176
|
+
logger.newLine();
|
|
177
|
+
logger.log('🎨 Choose a template for your project:');
|
|
178
|
+
const { selectedTemplate } = await prompts({
|
|
179
|
+
type: 'select',
|
|
180
|
+
name: 'selectedTemplate',
|
|
181
|
+
message: 'Select a template',
|
|
182
|
+
choices: TEMPLATES.map((template, index) => ({
|
|
183
|
+
title: `${template.name}`,
|
|
184
|
+
description: template.description,
|
|
185
|
+
value: template,
|
|
186
|
+
})),
|
|
187
|
+
initial: 0,
|
|
188
|
+
});
|
|
189
|
+
if (!selectedTemplate) {
|
|
190
|
+
logger.error('Template selection cancelled');
|
|
191
|
+
process.exit(0);
|
|
192
|
+
}
|
|
193
|
+
logger.newLine();
|
|
194
|
+
return selectedTemplate;
|
|
195
|
+
}
|
|
196
|
+
async function createProject(projectName, options = {}) {
|
|
197
|
+
const startTime = Date.now();
|
|
198
|
+
const logger = new Logger(options.verbose);
|
|
199
|
+
const config = await loadConfig();
|
|
200
|
+
// Show banner
|
|
201
|
+
logger.banner();
|
|
202
|
+
// Check for updates
|
|
203
|
+
if (!config.skipUpdateCheck && !options.verbose) {
|
|
204
|
+
await checkForUpdates(logger);
|
|
205
|
+
}
|
|
206
|
+
let targetDir = projectName;
|
|
207
|
+
// Handle project name
|
|
208
|
+
if (!targetDir) {
|
|
209
|
+
const { projectName: inputName } = await prompts({
|
|
210
|
+
type: 'text',
|
|
211
|
+
name: 'projectName',
|
|
212
|
+
message: 'What is your project named?',
|
|
213
|
+
initial: 'my-sumit-app',
|
|
214
|
+
validate: async (value) => {
|
|
215
|
+
if (!value.trim())
|
|
216
|
+
return 'Project name is required';
|
|
217
|
+
// Allow dot (.) for current directory
|
|
218
|
+
if (value === '.')
|
|
219
|
+
return true;
|
|
220
|
+
const validation = await validateProjectName(value);
|
|
221
|
+
return validation.valid || validation.message;
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
if (!inputName) {
|
|
225
|
+
logger.warn('Project creation cancelled.');
|
|
226
|
+
process.exit(0);
|
|
227
|
+
}
|
|
228
|
+
targetDir = inputName;
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
// Validate provided project name (allow dot for current directory)
|
|
232
|
+
if (targetDir !== '.') {
|
|
233
|
+
const validation = await validateProjectName(targetDir);
|
|
234
|
+
if (!validation.valid) {
|
|
235
|
+
logger.error(validation.message);
|
|
236
|
+
process.exit(1);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// Type guard to ensure targetDir is defined
|
|
241
|
+
if (!targetDir) {
|
|
242
|
+
logger.error('Project name is required');
|
|
243
|
+
process.exit(1);
|
|
244
|
+
}
|
|
245
|
+
// Handle current directory installation
|
|
246
|
+
let resolvedProjectPath; // ← Changed name to avoid conflict
|
|
247
|
+
let displayPath; // ← Changed name to avoid conflict
|
|
248
|
+
if (targetDir === '.') {
|
|
249
|
+
// Install in current directory
|
|
250
|
+
resolvedProjectPath = process.cwd();
|
|
251
|
+
displayPath = 'current directory';
|
|
252
|
+
// Validate current directory name for package.json compatibility
|
|
253
|
+
const currentDirName = path.basename(resolvedProjectPath);
|
|
254
|
+
const validation = await validateProjectName(currentDirName);
|
|
255
|
+
if (!validation.valid) {
|
|
256
|
+
logger.error(`Current directory name "${currentDirName}" is not a valid package name.`);
|
|
257
|
+
logger.error(validation.message);
|
|
258
|
+
logger.info('Please rename your directory to use lowercase letters, numbers, hyphens, underscores, and dots only.');
|
|
259
|
+
process.exit(1);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
// Install in new directory
|
|
264
|
+
resolvedProjectPath = path.resolve(process.cwd(), targetDir);
|
|
265
|
+
const relativeProjectPath = path.relative(process.cwd(), resolvedProjectPath);
|
|
266
|
+
displayPath = relativeProjectPath || 'current directory';
|
|
267
|
+
}
|
|
268
|
+
logger.step(1, 4, `Creating project in ${chalk.cyan(displayPath)}`);
|
|
269
|
+
// Check if directory exists and is not empty
|
|
270
|
+
if (await fs.pathExists(resolvedProjectPath)) {
|
|
271
|
+
if (!(await isDirectoryEmpty(resolvedProjectPath))) {
|
|
272
|
+
logger.error(`Directory "${targetDir === '.' ? 'current directory' : targetDir}" already exists and is not empty.`);
|
|
273
|
+
const { overwrite } = await prompts({
|
|
274
|
+
type: 'confirm',
|
|
275
|
+
name: 'overwrite',
|
|
276
|
+
message: 'Remove existing files and continue?',
|
|
277
|
+
initial: false,
|
|
278
|
+
});
|
|
279
|
+
if (overwrite) {
|
|
280
|
+
// Add spinner while deleting files
|
|
281
|
+
const deleteSpinner = ora({
|
|
282
|
+
text: 'Removing existing files...',
|
|
283
|
+
spinner: 'dots',
|
|
284
|
+
}).start();
|
|
285
|
+
try {
|
|
286
|
+
await fs.emptyDir(resolvedProjectPath);
|
|
287
|
+
deleteSpinner.succeed(chalk.green('Existing files removed'));
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
deleteSpinner.fail(chalk.red('Failed to remove existing files'));
|
|
291
|
+
logger.error(`Directory cleanup failed: ${error}`);
|
|
292
|
+
process.exit(1);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
logger.warn('Project creation cancelled.');
|
|
297
|
+
process.exit(0);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// Select template
|
|
302
|
+
logger.newLine();
|
|
303
|
+
const template = await selectTemplate(config, logger, options.template);
|
|
304
|
+
logger.step(2, 4, `Using template: ${chalk.cyan(template.name)}`);
|
|
305
|
+
// Show template features
|
|
306
|
+
if (options.verbose) {
|
|
307
|
+
logger.box(template.features.map((f) => `• ${f}`).join('\n'), `✨ ${template.name} template's features`);
|
|
308
|
+
}
|
|
309
|
+
// Clone template with sparse checkout for subdirectories
|
|
310
|
+
const downloadSpinner = ora({
|
|
311
|
+
text: 'Downloading template...',
|
|
312
|
+
spinner: 'dots12',
|
|
313
|
+
}).start();
|
|
314
|
+
try {
|
|
315
|
+
logger.verbose(`Cloning from: ${template.url}`);
|
|
316
|
+
// For templates with subdirectories, use sparse checkout
|
|
317
|
+
if (template.url.includes('SumitApp.git')) {
|
|
318
|
+
// Step 1: Clone with no checkout
|
|
319
|
+
await execa('git', ['clone', '--no-checkout', '--depth=1', template.url, targetDir], {
|
|
320
|
+
stdio: options.verbose ? 'inherit' : 'pipe',
|
|
321
|
+
});
|
|
322
|
+
// Step 2: Configure sparse checkout
|
|
323
|
+
await execa('git', ['sparse-checkout', 'init'], {
|
|
324
|
+
cwd: resolvedProjectPath,
|
|
325
|
+
stdio: options.verbose ? 'inherit' : 'pipe',
|
|
326
|
+
});
|
|
327
|
+
// Step 3: Set the specific template directory
|
|
328
|
+
const templatePath = getTemplatePath(template); // e.g., "templates/default"
|
|
329
|
+
await execa('git', ['sparse-checkout', 'set', templatePath], {
|
|
330
|
+
cwd: resolvedProjectPath,
|
|
331
|
+
stdio: options.verbose ? 'inherit' : 'pipe',
|
|
332
|
+
});
|
|
333
|
+
// Step 4: Checkout the files
|
|
334
|
+
await execa('git', ['checkout'], {
|
|
335
|
+
cwd: resolvedProjectPath,
|
|
336
|
+
stdio: options.verbose ? 'inherit' : 'pipe',
|
|
337
|
+
});
|
|
338
|
+
// Step 5: Move files from subdirectory to root
|
|
339
|
+
const templateDir = path.join(resolvedProjectPath, templatePath);
|
|
340
|
+
if (await fs.pathExists(templateDir)) {
|
|
341
|
+
const files = await fs.readdir(templateDir);
|
|
342
|
+
for (const file of files) {
|
|
343
|
+
await fs.move(path.join(templateDir, file), path.join(resolvedProjectPath, file));
|
|
344
|
+
}
|
|
345
|
+
// Clean up the empty template directory structure
|
|
346
|
+
await fs.remove(path.join(resolvedProjectPath, 'templates'));
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
// Standard clone for standalone repositories
|
|
351
|
+
await execa('git', ['clone', '--depth=1', template.url, targetDir], {
|
|
352
|
+
stdio: options.verbose ? 'inherit' : 'pipe',
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
downloadSpinner.succeed(chalk.green('Template downloaded successfully!'));
|
|
356
|
+
}
|
|
357
|
+
catch (error) {
|
|
358
|
+
downloadSpinner.fail(chalk.red('Failed to download template'));
|
|
359
|
+
logger.error(`Git clone failed: ${error}`);
|
|
360
|
+
logger.info('Make sure you have git installed and the repository is accessible.');
|
|
361
|
+
process.exit(1);
|
|
362
|
+
}
|
|
363
|
+
// Clean up git directory
|
|
364
|
+
await cleanupGitDirectory(resolvedProjectPath, logger);
|
|
365
|
+
logger.verbose('Removed template .git directory');
|
|
366
|
+
// Detect/Select package manager
|
|
367
|
+
const packageManager = await selectPackageManager(config, logger, options.packageManager);
|
|
368
|
+
const pmInfo = getPackageManagerInfo(packageManager);
|
|
369
|
+
logger.newLine();
|
|
370
|
+
logger.step(3, 4, `Using package manager: ${chalk.cyan(packageManager)}`);
|
|
371
|
+
// Install dependencies
|
|
372
|
+
if (!options.skipInstall) {
|
|
373
|
+
const installSpinner = ora({
|
|
374
|
+
text: `Installing dependencies with ${packageManager}...`,
|
|
375
|
+
spinner: 'bouncingBar',
|
|
376
|
+
}).start();
|
|
377
|
+
try {
|
|
378
|
+
await execa(pmInfo.command, pmInfo.installArgs, {
|
|
379
|
+
cwd: resolvedProjectPath,
|
|
380
|
+
stdio: options.verbose ? 'inherit' : 'pipe',
|
|
381
|
+
});
|
|
382
|
+
installSpinner.succeed(chalk.green('Dependencies installed successfully!'));
|
|
383
|
+
}
|
|
384
|
+
catch (error) {
|
|
385
|
+
installSpinner.fail(chalk.red('Failed to install dependencies'));
|
|
386
|
+
logger.error(`Dependency installation failed: ${error}`);
|
|
387
|
+
logger.warn('You can install dependencies manually by running:');
|
|
388
|
+
logger.info(` cd ${targetDir}`);
|
|
389
|
+
logger.info(` ${pmInfo.command} ${pmInfo.installArgs.join(' ')}`);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
else {
|
|
393
|
+
logger.info('Skipped dependency installation');
|
|
394
|
+
}
|
|
395
|
+
// Initialize git repository
|
|
396
|
+
// logger.step(4, 5, 'Initializing git repository...');
|
|
397
|
+
// logger.newLine();
|
|
398
|
+
// if (options.git !== false && config.git !== false) {
|
|
399
|
+
// const gitSuccess = await initializeGitRepository(projectPath, logger);
|
|
400
|
+
// if (gitSuccess) {
|
|
401
|
+
// logger.success('Git repository initialized');
|
|
402
|
+
// } else {
|
|
403
|
+
// logger.warn(
|
|
404
|
+
// 'Git initialization failed, but project was created successfully'
|
|
405
|
+
// );
|
|
406
|
+
// }
|
|
407
|
+
// } else {
|
|
408
|
+
// logger.info('Skipped git initialization');
|
|
409
|
+
// }
|
|
410
|
+
// Get the actual project name for display
|
|
411
|
+
const actualProjectName = targetDir === '.' ? path.basename(resolvedProjectPath) : targetDir;
|
|
412
|
+
// Success message
|
|
413
|
+
const duration = formatDuration(Date.now() - startTime);
|
|
414
|
+
logger.newLine();
|
|
415
|
+
logger.step(4, 4, 'Project setup complete!');
|
|
416
|
+
logger.newLine();
|
|
417
|
+
logger.success(`🎉 Successfully created ${chalk.green(actualProjectName)} in ${chalk.green(duration)}`);
|
|
418
|
+
logger.newLine();
|
|
419
|
+
// Next steps - show actual commands based on directory
|
|
420
|
+
const nextSteps = [];
|
|
421
|
+
if (targetDir === '.') {
|
|
422
|
+
// Current directory - no cd command needed
|
|
423
|
+
nextSteps.push(`${pmInfo.command} ${pmInfo.name === 'npm' ? 'run ' : ''}dev`);
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
// New directory - include cd command
|
|
427
|
+
nextSteps.push(`cd ${chalk.hex('#FFFFFF')(actualProjectName)}`);
|
|
428
|
+
nextSteps.push(`${pmInfo.command} ${pmInfo.name === 'npm' ? 'run ' : ''}dev`);
|
|
429
|
+
}
|
|
430
|
+
if (options.skipInstall) {
|
|
431
|
+
// Insert install command at appropriate position
|
|
432
|
+
const installCmd = `${pmInfo.command} ${pmInfo.installArgs.join(' ')}`;
|
|
433
|
+
if (targetDir === '.') {
|
|
434
|
+
nextSteps.splice(0, 0, installCmd); // Add as first step
|
|
435
|
+
}
|
|
436
|
+
else {
|
|
437
|
+
nextSteps.splice(1, 0, installCmd); // Add after cd command
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
logger.box(nextSteps
|
|
441
|
+
.map((step, i) => `${i + 1}. ${chalk.hex('#FFE600FF')(step)}`)
|
|
442
|
+
.join('\n'), '🚀 Get started');
|
|
443
|
+
logger.newLine();
|
|
444
|
+
logger.log('Happy coding! 🎨✨');
|
|
445
|
+
logger.newLine();
|
|
446
|
+
}
|
|
447
|
+
// CLI Setup
|
|
448
|
+
const program = new Command();
|
|
449
|
+
program
|
|
450
|
+
.name('create-sumit-app')
|
|
451
|
+
.description("✨ A beautiful CLI to bootstrap projects from Sumit.app's project templates")
|
|
452
|
+
.version('1.0.0')
|
|
453
|
+
.argument('[project-name]', 'The name of the project to create')
|
|
454
|
+
.option('-t, --template <template>', 'Template to use (default, react-native, nextjs, minimal)')
|
|
455
|
+
.option('-p, --package-manager <manager>', 'Package manager to use (npm, yarn, pnpm, bun)')
|
|
456
|
+
.option('-v, --verbose', 'Enable verbose logging')
|
|
457
|
+
// .option('--no-git', 'Skip git repository initialization')
|
|
458
|
+
.option('--skip-install', 'Skip dependency installation')
|
|
459
|
+
.action(async (projectName, options) => {
|
|
460
|
+
await createProject(projectName, options);
|
|
461
|
+
});
|
|
462
|
+
// Config command
|
|
463
|
+
program
|
|
464
|
+
.command('config')
|
|
465
|
+
.description('Manage CLI configuration')
|
|
466
|
+
.option('-l, --list', 'List current configuration')
|
|
467
|
+
.option('-s, --set <key=value>', 'Set configuration value')
|
|
468
|
+
.option('-r, --reset', 'Reset configuration to defaults')
|
|
469
|
+
.action(async (options) => {
|
|
470
|
+
const logger = new Logger();
|
|
471
|
+
if (options.list) {
|
|
472
|
+
await showConfig(logger);
|
|
473
|
+
return;
|
|
474
|
+
}
|
|
475
|
+
if (options.reset) {
|
|
476
|
+
await resetConfig();
|
|
477
|
+
logger.success('Configuration reset to defaults');
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
if (options.set) {
|
|
481
|
+
const [key, value] = options.set.split('=');
|
|
482
|
+
if (!key || value === undefined) {
|
|
483
|
+
logger.error('Invalid format. Use: --set key=value');
|
|
484
|
+
return;
|
|
485
|
+
}
|
|
486
|
+
// Validate configuration keys
|
|
487
|
+
const validKeys = [
|
|
488
|
+
'defaultTemplate',
|
|
489
|
+
'packageManager',
|
|
490
|
+
// 'git',
|
|
491
|
+
'verbose',
|
|
492
|
+
'skipUpdateCheck',
|
|
493
|
+
];
|
|
494
|
+
if (!validKeys.includes(key)) {
|
|
495
|
+
logger.error(`Invalid configuration key: ${key}`);
|
|
496
|
+
logger.info(`Valid keys: ${validKeys.join(', ')}`);
|
|
497
|
+
return;
|
|
498
|
+
}
|
|
499
|
+
// Parse boolean values
|
|
500
|
+
let parsedValue = value;
|
|
501
|
+
if (value === 'true' || value === 'false') {
|
|
502
|
+
parsedValue = value === 'true';
|
|
503
|
+
}
|
|
504
|
+
await updateConfig(key, parsedValue);
|
|
505
|
+
logger.success(`Configuration updated: ${chalk.cyan(key)} = ${chalk.green(String(parsedValue))}`);
|
|
506
|
+
logger.info(`Config file: ${chalk.gray(getConfigPath())}`);
|
|
507
|
+
}
|
|
508
|
+
});
|
|
509
|
+
// Templates command
|
|
510
|
+
program
|
|
511
|
+
.command('templates')
|
|
512
|
+
.description('List available templates')
|
|
513
|
+
.action(() => {
|
|
514
|
+
listTemplates();
|
|
515
|
+
});
|
|
516
|
+
// Info command
|
|
517
|
+
program
|
|
518
|
+
.command('info')
|
|
519
|
+
.description('Display environment info')
|
|
520
|
+
.action(async () => {
|
|
521
|
+
const logger = new Logger();
|
|
522
|
+
const packageJson = await fs.readJson(path.join(__dirname, '..', 'package.json'));
|
|
523
|
+
logger.banner();
|
|
524
|
+
logger.box(`Version: ${packageJson.version}\n` +
|
|
525
|
+
`Node: ${process.version}\n` +
|
|
526
|
+
`Platform: ${process.platform}\n` +
|
|
527
|
+
`Architecture: ${process.arch}\n` +
|
|
528
|
+
`Config: ${getConfigPath()}`, '🔍 Environment Info');
|
|
529
|
+
});
|
|
530
|
+
// Handle uncaught errors
|
|
531
|
+
process.on('uncaughtException', (error) => {
|
|
532
|
+
const logger = new Logger();
|
|
533
|
+
logger.error(`Unexpected error: ${error.message}`);
|
|
534
|
+
logger.debug(error.stack || '');
|
|
535
|
+
process.exit(1);
|
|
536
|
+
});
|
|
537
|
+
process.on('unhandledRejection', (reason, promise) => {
|
|
538
|
+
const logger = new Logger();
|
|
539
|
+
logger.error(`Unhandled rejection at: ${promise}, reason: ${reason}`);
|
|
540
|
+
process.exit(1);
|
|
541
|
+
});
|
|
542
|
+
program.parse(process.argv);
|
|
543
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Config } from '../types/index.js';
|
|
2
|
+
import { Logger } from './logger.js';
|
|
3
|
+
export declare function loadConfig(): Promise<Config>;
|
|
4
|
+
export declare function saveConfig(config: Config): Promise<void>;
|
|
5
|
+
export declare function updateConfig(key: string, value: any): Promise<void>;
|
|
6
|
+
export declare function resetConfig(): Promise<void>;
|
|
7
|
+
export declare function getConfigPath(): string;
|
|
8
|
+
export declare function showConfig(logger: Logger): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAQrC,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAYlD;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM9D;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzE;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAQjD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS9D"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
const CONFIG_DIR_NAME = 'sumitapp';
|
|
4
|
+
const CONFIG_FILE_NAME = 'config.json';
|
|
5
|
+
const CONFIG_PATH = path.join(CONFIG_DIR_NAME, CONFIG_FILE_NAME);
|
|
6
|
+
export async function loadConfig() {
|
|
7
|
+
const configPath = path.join(process.cwd(), CONFIG_PATH);
|
|
8
|
+
try {
|
|
9
|
+
if (await fs.pathExists(configPath)) {
|
|
10
|
+
return await fs.readJson(configPath);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
// Silently ignore config loading errors
|
|
15
|
+
}
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
export async function saveConfig(config) {
|
|
19
|
+
const configPath = path.join(process.cwd(), CONFIG_PATH);
|
|
20
|
+
const configDir = path.join(process.cwd(), CONFIG_DIR_NAME);
|
|
21
|
+
await fs.ensureDir(configDir);
|
|
22
|
+
await fs.writeJson(configPath, config, { spaces: 2 });
|
|
23
|
+
}
|
|
24
|
+
export async function updateConfig(key, value) {
|
|
25
|
+
const config = await loadConfig();
|
|
26
|
+
config[key] = value;
|
|
27
|
+
await saveConfig(config);
|
|
28
|
+
}
|
|
29
|
+
export async function resetConfig() {
|
|
30
|
+
const configPath = path.join(process.cwd(), CONFIG_PATH);
|
|
31
|
+
try {
|
|
32
|
+
await fs.remove(configPath);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
// Ignore errors if file doesn't exist
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export function getConfigPath() {
|
|
39
|
+
return CONFIG_PATH;
|
|
40
|
+
}
|
|
41
|
+
export async function showConfig(logger) {
|
|
42
|
+
const config = await loadConfig();
|
|
43
|
+
if (Object.keys(config).length === 0) {
|
|
44
|
+
logger.info('No configuration found. Using defaults.');
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
logger.box(JSON.stringify(config, null, 2), '🔧 Current Configuration');
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,eAAe,GAAG,UAAU,CAAC;AACnC,MAAM,gBAAgB,GAAG,aAAa,CAAC;AACvC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;AAEjE,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAEzD,IAAI,CAAC;QACH,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,wCAAwC;IAC1C,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAc;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;IAE5D,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC9B,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,KAAU;IACxD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IACjC,MAAc,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC7B,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAEzD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sCAAsC;IACxC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAc;IAC7C,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare class Logger {
|
|
2
|
+
private verboseEnabled;
|
|
3
|
+
constructor(verbose?: boolean);
|
|
4
|
+
banner(): void;
|
|
5
|
+
log(message: string): void;
|
|
6
|
+
info(message: string, icon?: string): void;
|
|
7
|
+
success(message: string, icon?: string): void;
|
|
8
|
+
error(message: string, icon?: string): void;
|
|
9
|
+
warn(message: string, icon?: string): void;
|
|
10
|
+
debug(message: string, icon?: string): void;
|
|
11
|
+
verbose(message: string, icon?: string): void;
|
|
12
|
+
step(step: number, total: number, message: string): void;
|
|
13
|
+
newLine(): void;
|
|
14
|
+
divider(): void;
|
|
15
|
+
box(message: string, title?: string): void;
|
|
16
|
+
gradient(text: string, colors?: string[]): string;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"AAIA,qBAAa,MAAM;IACjB,OAAO,CAAC,cAAc,CAAU;gBAEpB,OAAO,UAAQ;IAI3B,MAAM;IAgBN,GAAG,CAAC,OAAO,EAAE,MAAM;IAInB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,SAAM;IAIhC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,SAAM;IAInC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,SAAM;IAIjC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,SAAM;IAIhC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,SAAO;IAMlC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,SAAO;IAMpC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAKjD,OAAO;IAIP,OAAO;IAIP,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAWnC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,EAA2B;CAGjE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import gradient from 'gradient-string';
|
|
2
|
+
import boxen from 'boxen';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
export class Logger {
|
|
5
|
+
verboseEnabled;
|
|
6
|
+
constructor(verbose = false) {
|
|
7
|
+
this.verboseEnabled = verbose;
|
|
8
|
+
}
|
|
9
|
+
banner() {
|
|
10
|
+
const banner = `
|
|
11
|
+
███████╗██╗ ██╗███╗ ███╗██╗████████╗ █████╗ ██████╗ ██████╗
|
|
12
|
+
██╔════╝██║ ██║████╗ ████║██║╚══██╔══╝ ██╔══██╗██╔══██╗██╔══██╗
|
|
13
|
+
███████╗██║ ██║██╔████╔██║██║ ██║ ███████║██████╔╝██████╔╝
|
|
14
|
+
╚════██║██║ ██║██║╚██╔╝██║██║ ██║ ██╔══██║██╔═══╝ ██╔═══╝
|
|
15
|
+
███████║╚██████╔╝██║ ╚═╝ ██║██║ ██║ ██╗ ██║ ██║██║ ██║
|
|
16
|
+
╚══════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝
|
|
17
|
+
`;
|
|
18
|
+
const description = ` 🚀 Create beautiful apps in seconds`;
|
|
19
|
+
// console.log(gradient.pastel.multiline(banner));
|
|
20
|
+
console.log(chalk.hex('#505050')(banner));
|
|
21
|
+
console.log(chalk.hex('#FFFFFF')(description));
|
|
22
|
+
console.log();
|
|
23
|
+
}
|
|
24
|
+
log(message) {
|
|
25
|
+
console.log(message);
|
|
26
|
+
}
|
|
27
|
+
info(message, icon = 'ℹ') {
|
|
28
|
+
console.log(`${chalk.cyan(icon)} ${message}`);
|
|
29
|
+
}
|
|
30
|
+
success(message, icon = '✓') {
|
|
31
|
+
console.log(`${chalk.green(icon)} ${chalk.green(message)}`);
|
|
32
|
+
}
|
|
33
|
+
error(message, icon = '✗') {
|
|
34
|
+
console.error(`${chalk.red(icon)} ${chalk.red(message)}`);
|
|
35
|
+
}
|
|
36
|
+
warn(message, icon = '⚠') {
|
|
37
|
+
console.log(`${chalk.yellow(icon)} ${chalk.yellow(message)}`);
|
|
38
|
+
}
|
|
39
|
+
debug(message, icon = '🐛') {
|
|
40
|
+
if (this.verboseEnabled) {
|
|
41
|
+
console.log(`${chalk.gray(icon)} ${chalk.gray(message)}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
verbose(message, icon = '📝') {
|
|
45
|
+
if (this.verboseEnabled) {
|
|
46
|
+
console.log(`${chalk.dim(icon)} ${chalk.dim(message)}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
step(step, total, message) {
|
|
50
|
+
const progress = `${chalk.cyan(`[${step}/${total}]`)}`;
|
|
51
|
+
console.log(`${progress} ${message}`);
|
|
52
|
+
}
|
|
53
|
+
newLine() {
|
|
54
|
+
console.log();
|
|
55
|
+
}
|
|
56
|
+
divider() {
|
|
57
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
58
|
+
}
|
|
59
|
+
box(message, title) {
|
|
60
|
+
console.log(boxen(message, {
|
|
61
|
+
title,
|
|
62
|
+
padding: 1,
|
|
63
|
+
borderColor: 'gray',
|
|
64
|
+
borderStyle: 'classic', // round
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
gradient(text, colors = ['#ff6b6b', '#4ecdc4']) {
|
|
68
|
+
return gradient(colors)(text);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AACvC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,OAAO,MAAM;IACT,cAAc,CAAU;IAEhC,YAAY,OAAO,GAAG,KAAK;QACzB,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;IAChC,CAAC;IAED,MAAM;QACJ,MAAM,MAAM,GAAG;;;;;;;KAOd,CAAC;QACF,MAAM,WAAW,GAAG,wCAAwC,CAAC;QAC7D,kDAAkD;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,GAAG,CAAC,OAAe;QACjB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAAI,GAAG,GAAG;QAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,CAAC,OAAe,EAAE,IAAI,GAAG,GAAG;QACjC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAAI,GAAG,GAAG;QAC/B,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAAI,GAAG,GAAG;QAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAAI,GAAG,IAAI;QAChC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,CAAC,OAAe,EAAE,IAAI,GAAG,IAAI;QAClC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,KAAa,EAAE,OAAe;QAC/C,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,IAAI,OAAO,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,OAAO;QACL,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,OAAO;QACL,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,GAAG,CAAC,OAAe,EAAE,KAAc;QACjC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,OAAO,EAAE;YACb,KAAK;YACL,OAAO,EAAE,CAAC;YACV,WAAW,EAAE,MAAM;YACnB,WAAW,EAAE,SAAS,EAAE,QAAQ;SACjC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,IAAY,EAAE,SAAmB,CAAC,SAAS,EAAE,SAAS,CAAC;QAC9D,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAI7C,eAAO,MAAM,SAAS,EAAE,QAAQ,EAe/B,CAAC;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAE9D;AAED,wBAAgB,aAAa,IAAI,IAAI,CAWpC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const mainRepoUrl = 'https://github.com/sumittttpaul/SumitApp.git';
|
|
2
|
+
export const TEMPLATES = [
|
|
3
|
+
{
|
|
4
|
+
name: 'default',
|
|
5
|
+
description: 'Full-stack template with Next.js + Expo + Node.js',
|
|
6
|
+
url: mainRepoUrl,
|
|
7
|
+
path: 'templates/default',
|
|
8
|
+
features: [
|
|
9
|
+
'React Native with Expo',
|
|
10
|
+
'Next.js 15 with App Router',
|
|
11
|
+
'TypeScript configured',
|
|
12
|
+
'Tailwind CSS',
|
|
13
|
+
'Legend State for state management',
|
|
14
|
+
'Shared components library',
|
|
15
|
+
],
|
|
16
|
+
},
|
|
17
|
+
];
|
|
18
|
+
export function getTemplate(name) {
|
|
19
|
+
return TEMPLATES.find((template) => template.name === name);
|
|
20
|
+
}
|
|
21
|
+
export function listTemplates() {
|
|
22
|
+
console.log('\n📋 Available templates:\n');
|
|
23
|
+
TEMPLATES.forEach((template, index) => {
|
|
24
|
+
console.log(`${index + 1}. ${template.name}`);
|
|
25
|
+
console.log(` ${template.description}`);
|
|
26
|
+
console.log(` Features: ${template.features.slice(0, 3).join(', ')}${template.features.length > 3 ? '...' : ''}`);
|
|
27
|
+
console.log();
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAG,8CAA8C,CAAC;AAEnE,MAAM,CAAC,MAAM,SAAS,GAAe;IACnC;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,mDAAmD;QAChE,GAAG,EAAE,WAAW;QAChB,IAAI,EAAE,mBAAmB;QACzB,QAAQ,EAAE;YACR,wBAAwB;YACxB,4BAA4B;YAC5B,uBAAuB;YACvB,cAAc;YACd,mCAAmC;YACnC,2BAA2B;SAC5B;KACF;CACF,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAE3C,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;QACpC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CACT,gBAAgB,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CACvG,CAAC;QACF,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { PackageManager, PackageManagerInfo } from '../types/index.js';
|
|
2
|
+
import { Logger } from './logger.js';
|
|
3
|
+
export declare function getPackageManagerInfo(name: PackageManager): PackageManagerInfo;
|
|
4
|
+
export declare function checkForUpdates(logger: Logger): Promise<void>;
|
|
5
|
+
export declare function isDirectoryEmpty(dirPath: string): Promise<boolean>;
|
|
6
|
+
export declare function validateProjectName(name: string): Promise<{
|
|
7
|
+
valid: boolean;
|
|
8
|
+
message?: string;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function formatDuration(ms: number): string;
|
|
11
|
+
export declare function initializeGitRepository(projectPath: string, logger: Logger): Promise<boolean>;
|
|
12
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAgCrC,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,cAAc,GACnB,kBAAkB,CAEpB;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBnE;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOxE;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B/C;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAelB"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import updateCheck from 'update-check';
|
|
2
|
+
import { execa } from 'execa';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
const PACKAGE_MANAGERS = [
|
|
6
|
+
{
|
|
7
|
+
name: 'bun',
|
|
8
|
+
lockFile: 'bun.lock',
|
|
9
|
+
command: 'bun',
|
|
10
|
+
installArgs: ['install'],
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: 'pnpm',
|
|
14
|
+
lockFile: 'pnpm-lock.yaml',
|
|
15
|
+
command: 'pnpm',
|
|
16
|
+
installArgs: ['install'],
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'yarn',
|
|
20
|
+
lockFile: 'yarn.lock',
|
|
21
|
+
command: 'yarn',
|
|
22
|
+
installArgs: ['install'],
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: 'npm',
|
|
26
|
+
lockFile: 'package-lock.json',
|
|
27
|
+
command: 'npm',
|
|
28
|
+
installArgs: ['install'],
|
|
29
|
+
},
|
|
30
|
+
];
|
|
31
|
+
export function getPackageManagerInfo(name) {
|
|
32
|
+
return PACKAGE_MANAGERS.find((pm) => pm.name === name) || PACKAGE_MANAGERS[3]; // Default to npm
|
|
33
|
+
}
|
|
34
|
+
export async function checkForUpdates(logger) {
|
|
35
|
+
try {
|
|
36
|
+
const packagePath = path.resolve(process.cwd(), 'package.json');
|
|
37
|
+
if (!(await fs.pathExists(packagePath)))
|
|
38
|
+
return;
|
|
39
|
+
const packageJson = await fs.readJson(packagePath);
|
|
40
|
+
const update = await updateCheck(packageJson);
|
|
41
|
+
if (update) {
|
|
42
|
+
logger.newLine();
|
|
43
|
+
logger.box(`A new version is available: ${logger.gradient(update.latest)}\n` +
|
|
44
|
+
`Current version: ${packageJson.version}\n\n` +
|
|
45
|
+
`Run: ${logger.gradient('npm install -g create-sumit-app@latest')} to update`, '🚀 Update Available');
|
|
46
|
+
logger.newLine();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
logger.debug(`Update check failed: ${error}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export async function isDirectoryEmpty(dirPath) {
|
|
54
|
+
try {
|
|
55
|
+
const files = await fs.readdir(dirPath);
|
|
56
|
+
return files.length === 0;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return true; // Directory doesn't exist, so it's "empty"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export async function validateProjectName(name) {
|
|
63
|
+
// Check for valid npm package name
|
|
64
|
+
const validNameRegex = /^[a-z0-9]([a-z0-9._-]*[a-z0-9])?$/i;
|
|
65
|
+
if (!validNameRegex.test(name)) {
|
|
66
|
+
return {
|
|
67
|
+
valid: false,
|
|
68
|
+
message: 'Project name must be a valid package name (lowercase, no spaces, only letters, numbers, dashes, underscores, and dots)',
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (name.length > 214) {
|
|
72
|
+
return {
|
|
73
|
+
valid: false,
|
|
74
|
+
message: 'Project name must be less than 214 characters',
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
if (name.startsWith('.') || name.startsWith('-') || name.startsWith('_')) {
|
|
78
|
+
return {
|
|
79
|
+
valid: false,
|
|
80
|
+
message: 'Project name cannot start with a dot, dash, or underscore',
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
return { valid: true };
|
|
84
|
+
}
|
|
85
|
+
export function formatDuration(ms) {
|
|
86
|
+
if (ms < 1000)
|
|
87
|
+
return `${ms}ms`;
|
|
88
|
+
const seconds = Math.floor(ms / 1000);
|
|
89
|
+
if (seconds < 60)
|
|
90
|
+
return `${seconds}s`;
|
|
91
|
+
const minutes = Math.floor(seconds / 60);
|
|
92
|
+
return `${minutes}m ${seconds % 60}s`;
|
|
93
|
+
}
|
|
94
|
+
export async function initializeGitRepository(projectPath, logger) {
|
|
95
|
+
try {
|
|
96
|
+
await execa('git', ['init'], { cwd: projectPath });
|
|
97
|
+
await execa('git', ['add', '.'], { cwd: projectPath });
|
|
98
|
+
await execa('git', ['commit', '-m', 'Initial commit from create-sumit-app'], { cwd: projectPath });
|
|
99
|
+
logger.verbose('Initialized git repository with initial commit');
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
logger.debug(`Git initialization failed: ${error}`);
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface Template {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
url: string;
|
|
5
|
+
path?: string;
|
|
6
|
+
dependencies?: string[];
|
|
7
|
+
features: string[];
|
|
8
|
+
}
|
|
9
|
+
export interface Config {
|
|
10
|
+
defaultTemplate?: string;
|
|
11
|
+
packageManager?: 'npm' | 'yarn' | 'pnpm' | 'bun';
|
|
12
|
+
git?: boolean;
|
|
13
|
+
verbose?: boolean;
|
|
14
|
+
skipUpdateCheck?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface CreateProjectOptions {
|
|
17
|
+
template?: string;
|
|
18
|
+
packageManager?: string;
|
|
19
|
+
verbose?: boolean;
|
|
20
|
+
git?: boolean;
|
|
21
|
+
skipInstall?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';
|
|
24
|
+
export interface PackageManagerInfo {
|
|
25
|
+
name: PackageManager;
|
|
26
|
+
lockFile: string;
|
|
27
|
+
command: string;
|
|
28
|
+
installArgs: string[];
|
|
29
|
+
}
|
|
30
|
+
//# 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,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,MAAM;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IACjD,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "create-sumit-app",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "✨ A beautiful CLI to bootstrap projects from Sumit.app's project templates",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"create-sumit-app": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsx src/index.ts",
|
|
13
|
+
"test": "vitest",
|
|
14
|
+
"test:coverage": "vitest run --coverage",
|
|
15
|
+
"prepublishOnly": "npm run build",
|
|
16
|
+
"lint": "eslint src/**/*.ts",
|
|
17
|
+
"format": "prettier --write src/**/*.ts"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"react",
|
|
21
|
+
"react-native",
|
|
22
|
+
"nextjs",
|
|
23
|
+
"template",
|
|
24
|
+
"cli",
|
|
25
|
+
"sumit-app",
|
|
26
|
+
"scaffold",
|
|
27
|
+
"generator",
|
|
28
|
+
"boilerplate",
|
|
29
|
+
"create-app",
|
|
30
|
+
"npx"
|
|
31
|
+
],
|
|
32
|
+
"author": "Sumit Paul <sumitpaul.project@gmail.com>",
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "https://github.com/sumittttpaul/SumitApp.git",
|
|
37
|
+
"directory": "create-sumit-app"
|
|
38
|
+
},
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/sumittttpaul/SumitApp/issues"
|
|
41
|
+
},
|
|
42
|
+
"homepage": "https://github.com/sumittttpaul/SumitApp/tree/master/create-sumit-app#readme",
|
|
43
|
+
"files": [
|
|
44
|
+
"dist/**/*",
|
|
45
|
+
"README.md",
|
|
46
|
+
"LICENSE"
|
|
47
|
+
],
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"chalk": "^5.6.0",
|
|
50
|
+
"commander": "^14.0.0",
|
|
51
|
+
"execa": "^9.6.0",
|
|
52
|
+
"fs-extra": "^11.3.1",
|
|
53
|
+
"ora": "^8.2.0",
|
|
54
|
+
"prompts": "^2.4.2",
|
|
55
|
+
"semver": "^7.5.4",
|
|
56
|
+
"update-check": "^1.5.4",
|
|
57
|
+
"boxen": "^7.1.1",
|
|
58
|
+
"gradient-string": "^2.0.2"
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@types/fs-extra": "^11.0.4",
|
|
62
|
+
"@types/node": "^20.0.0",
|
|
63
|
+
"@types/prompts": "^2.4.9",
|
|
64
|
+
"@types/semver": "^7.5.6",
|
|
65
|
+
"@types/gradient-string": "^1.1.6",
|
|
66
|
+
"@vitest/coverage-v8": "^1.0.0",
|
|
67
|
+
"tsx": "^4.7.0",
|
|
68
|
+
"typescript": "^5.3.0",
|
|
69
|
+
"vitest": "^1.0.0",
|
|
70
|
+
"eslint": "^8.0.0",
|
|
71
|
+
"prettier": "^3.0.0"
|
|
72
|
+
},
|
|
73
|
+
"engines": {
|
|
74
|
+
"node": ">=18.0.0"
|
|
75
|
+
},
|
|
76
|
+
"packageManager": "bun@1.2.22"
|
|
77
|
+
}
|