@mvp-kit/create 0.0.1

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.
@@ -0,0 +1,160 @@
1
+ import Handlebars from 'handlebars';
2
+ // Register Handlebars helpers
3
+ Handlebars.registerHelper('kebabCase', (str) => str.toLowerCase().replace(/[_\s]+/g, '-'));
4
+ Handlebars.registerHelper('camelCase', (str) => str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase()));
5
+ Handlebars.registerHelper('pascalCase', (str) => str.replace(/(^|-)([a-z])/g, (_, __, letter) => letter.toUpperCase()));
6
+ Handlebars.registerHelper('eq', (a, b) => a === b);
7
+ Handlebars.registerHelper('startsWith', (str, prefix) => str && str.startsWith(prefix));
8
+ export function transformPackageJson(content, variables) {
9
+ try {
10
+ const pkg = JSON.parse(content);
11
+ // Transform root package.json (handles both old and new template format)
12
+ if (pkg.name === 'mvpkit-core' || pkg.name === '{{projectName}}') {
13
+ pkg.name = variables.projectKebabCase;
14
+ pkg.description = variables.projectDescription;
15
+ // Set package manager in package.json
16
+ pkg.packageManager = `${variables.packageManager}@${variables.packageManagerVersion || 'latest'}`;
17
+ }
18
+ // Transform frontend package.json
19
+ if (pkg.name === '@mvpkit/core-frontend') {
20
+ pkg.name = variables.frontendPackageName;
21
+ pkg.description = `${variables.projectDisplayName} - Frontend`;
22
+ }
23
+ // Transform backend package.json
24
+ if (pkg.name === '@mvpkit/core-backend') {
25
+ pkg.name = variables.backendPackageName;
26
+ pkg.description = `${variables.projectDisplayName} - Backend`;
27
+ }
28
+ // Transform api package.json
29
+ if (pkg.name === '@mvpkit/core-api') {
30
+ pkg.name = variables.apiPackageName;
31
+ pkg.description = `${variables.projectDisplayName} - API Types`;
32
+ }
33
+ // Transform config package.json
34
+ if (pkg.name === '@mvpkit/core-config') {
35
+ pkg.name = variables.configPackageName;
36
+ pkg.description = `${variables.projectDisplayName} - Configuration`;
37
+ }
38
+ // Update dependencies that reference @mvpkit/core-*
39
+ if (pkg.dependencies) {
40
+ Object.keys(pkg.dependencies).forEach(dep => {
41
+ if (dep.startsWith('@mvpkit/core-')) {
42
+ const newDep = dep.replace('@mvpkit/core-', `${variables.packageScope}/`);
43
+ pkg.dependencies[newDep] = pkg.dependencies[dep];
44
+ delete pkg.dependencies[dep];
45
+ }
46
+ });
47
+ }
48
+ // Update devDependencies that reference @mvpkit/core-*
49
+ if (pkg.devDependencies) {
50
+ Object.keys(pkg.devDependencies).forEach(dep => {
51
+ if (dep.startsWith('@mvpkit/core-')) {
52
+ const newDep = dep.replace('@mvpkit/core-', `${variables.packageScope}/`);
53
+ pkg.devDependencies[newDep] = pkg.devDependencies[dep];
54
+ delete pkg.devDependencies[dep];
55
+ }
56
+ });
57
+ }
58
+ // Update scripts that reference package names and database names
59
+ if (pkg.scripts) {
60
+ Object.keys(pkg.scripts).forEach(scriptName => {
61
+ if (typeof pkg.scripts[scriptName] === 'string') {
62
+ pkg.scripts[scriptName] = pkg.scripts[scriptName]
63
+ .replace(/@mvpkit\/core-frontend/g, variables.frontendPackageName)
64
+ .replace(/@mvpkit\/core-backend/g, variables.backendPackageName)
65
+ .replace(/mvpkit-core-frontend/g, variables.pagesName)
66
+ .replace(/mvpkit-core-backend/g, variables.workersName)
67
+ // Replace database names in scripts
68
+ .replace(/mvpkit-core-db-dev/g, `${variables.databaseName}-dev`)
69
+ .replace(/mvpkit-core-db/g, variables.databaseName)
70
+ // Replace template variables
71
+ .replace(/{{databaseName}}/g, variables.databaseName);
72
+ }
73
+ });
74
+ }
75
+ return JSON.stringify(pkg, null, 2);
76
+ }
77
+ catch (error) {
78
+ // If not valid JSON, treat as template
79
+ return transformTemplate(content, variables);
80
+ }
81
+ }
82
+ export function transformWranglerToml(content, variables) {
83
+ let transformed = content;
84
+ // Replace worker names
85
+ transformed = transformed.replace(/name = "mvpkit-core-backend"/g, `name = "${variables.workersName}"`);
86
+ // Replace database names
87
+ transformed = transformed.replace(/database_name = "mvpkit-core-db"/g, `database_name = "${variables.databaseName}"`);
88
+ transformed = transformed.replace(/database_name = "mvpkit-core-db-dev"/g, `database_name = "${variables.databaseName}-dev"`);
89
+ // Keep placeholder database IDs for local development
90
+ // Production database IDs will be configured when deploying
91
+ // Replace Pages project names
92
+ transformed = transformed.replace(/project-name=mvpkit-core-frontend/g, `project-name=${variables.pagesName}`);
93
+ return transformTemplate(transformed, variables);
94
+ }
95
+ export function transformEnvFile(content, variables) {
96
+ let transformed = content;
97
+ // Replace API URLs
98
+ transformed = transformed.replace(/mvpkit-core-backend/g, variables.workersName);
99
+ // Replace domain references
100
+ if (variables.domainName) {
101
+ transformed = transformed.replace(/localhost:5173/g, variables.domainName);
102
+ }
103
+ return transformTemplate(transformed, variables);
104
+ }
105
+ export function transformTypeScriptImports(content, variables) {
106
+ let transformed = content;
107
+ // Replace package imports
108
+ transformed = transformed.replace(/@mvpkit\/core-api/g, variables.apiPackageName);
109
+ transformed = transformed.replace(/@mvpkit\/core-config/g, variables.configPackageName);
110
+ // Fix specific unused input variables in the license validation procedures
111
+ // This is a temporary fix until the core template is cleaned up
112
+ // Fix validateLicense procedure that doesn't use input
113
+ transformed = transformed.replace('.mutation(async ({ input }) => ({\n valid: true,\n jwt_token: \'mock-jwt-token\',\n features: [\'basic-features\'],', '.mutation(async ({ input: _ }) => ({\n valid: true,\n jwt_token: \'mock-jwt-token\',\n features: [\'basic-features\'],');
114
+ // Fix getLicenseStatus procedure that doesn't use input
115
+ transformed = transformed.replace('.query(({ input }) => ({\n valid: true,\n license_id: \'lic_123\',', '.query(({ input: _ }) => ({\n valid: true,\n license_id: \'lic_123\',');
116
+ return transformTemplate(transformed, variables);
117
+ }
118
+ export function transformTemplate(content, variables) {
119
+ try {
120
+ const template = Handlebars.compile(content);
121
+ return template(variables);
122
+ }
123
+ catch (error) {
124
+ // If Handlebars compilation fails, do simple string replacement
125
+ let result = content;
126
+ // Replace common patterns
127
+ result = result.replace(/mvpkit-core/g, variables.projectKebabCase);
128
+ result = result.replace(/MVPKit Core/g, variables.projectDisplayName);
129
+ result = result.replace(/mvpkit\/core/g, `${variables.packageScope.slice(1)}/core`);
130
+ return result;
131
+ }
132
+ }
133
+ export function getFileTransformFunction(fileName) {
134
+ const lowerFileName = fileName.toLowerCase();
135
+ if (lowerFileName === 'package.json') {
136
+ return transformPackageJson;
137
+ }
138
+ if (lowerFileName === 'wrangler.toml') {
139
+ return transformWranglerToml;
140
+ }
141
+ if (lowerFileName.includes('.env') || lowerFileName.includes('.vars')) {
142
+ return transformEnvFile;
143
+ }
144
+ if (lowerFileName.endsWith('.ts') || lowerFileName.endsWith('.tsx') || lowerFileName.endsWith('.js') || lowerFileName.endsWith('.jsx')) {
145
+ return transformTypeScriptImports;
146
+ }
147
+ if (lowerFileName.endsWith('.md') || lowerFileName.endsWith('.mdx') || lowerFileName.endsWith('.html')) {
148
+ return transformTemplate;
149
+ }
150
+ // Default: try template transformation, fall back to no transformation
151
+ return (content, variables) => {
152
+ try {
153
+ return transformTemplate(content, variables);
154
+ }
155
+ catch {
156
+ return content;
157
+ }
158
+ };
159
+ }
160
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"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"}
package/dist/test.js ADDED
@@ -0,0 +1,359 @@
1
+ #!/usr/bin/env node
2
+ import fs from 'fs-extra';
3
+ import path from 'path';
4
+ import { execSync } from 'child_process';
5
+ import chalk from 'chalk';
6
+ import ora from 'ora';
7
+ import { createProject } from './create.js';
8
+ class AppValidator {
9
+ testDir;
10
+ appName;
11
+ appPath;
12
+ constructor(testDir = 'test-validation') {
13
+ this.testDir = testDir;
14
+ this.appName = `test-app-${Date.now()}`;
15
+ this.appPath = path.join(testDir, this.appName);
16
+ }
17
+ async runFullValidation() {
18
+ const results = [];
19
+ const originalCwd = process.cwd();
20
+ console.log(chalk.blue.bold('🧪 MVPKit CLI - Full App Validation\n'));
21
+ try {
22
+ // Clean up any existing test directory
23
+ const fullTestDir = path.resolve(originalCwd, this.testDir);
24
+ if (fs.existsSync(fullTestDir)) {
25
+ await fs.remove(fullTestDir);
26
+ }
27
+ await fs.ensureDir(fullTestDir);
28
+ // Test 1: App Creation
29
+ results.push(await this.testAppCreation(originalCwd));
30
+ // Test 2: Package.json Validation
31
+ results.push(await this.testPackageJsonTransformation());
32
+ // Test 3: Dependency Installation
33
+ results.push(await this.testDependencyInstallation());
34
+ // Test 4: Build Process (must come before TypeScript check)
35
+ results.push(await this.testBuildProcess());
36
+ // Test 5: TypeScript Compilation
37
+ results.push(await this.testTypeScriptCompilation());
38
+ // Test 6: Linting
39
+ results.push(await this.testLinting());
40
+ // Test 7: Project Structure
41
+ results.push(await this.testProjectStructure());
42
+ // Test 8: Environment Files
43
+ results.push(await this.testEnvironmentFiles());
44
+ }
45
+ catch (error) {
46
+ results.push({
47
+ name: 'Test Suite Setup',
48
+ success: false,
49
+ error: error instanceof Error ? error.message : String(error)
50
+ });
51
+ }
52
+ this.printResults(results);
53
+ return results;
54
+ }
55
+ async testAppCreation(originalCwd) {
56
+ const spinner = ora('Creating test app...').start();
57
+ const startTime = Date.now();
58
+ try {
59
+ // Create app in the test directory
60
+ const fullTestDir = path.resolve(originalCwd, this.testDir);
61
+ process.chdir(fullTestDir);
62
+ await createProject(this.appName, {
63
+ description: 'Test MVPKit application for validation',
64
+ install: false,
65
+ git: false
66
+ });
67
+ // Update app path to be absolute
68
+ this.appPath = path.join(fullTestDir, this.appName);
69
+ if (!fs.existsSync(this.appPath)) {
70
+ throw new Error('App directory was not created');
71
+ }
72
+ // Return to original directory
73
+ process.chdir(originalCwd);
74
+ spinner.succeed('App creation successful');
75
+ return {
76
+ name: 'App Creation',
77
+ success: true,
78
+ duration: Date.now() - startTime
79
+ };
80
+ }
81
+ catch (error) {
82
+ process.chdir(originalCwd); // Ensure we return to original directory
83
+ spinner.fail('App creation failed');
84
+ return {
85
+ name: 'App Creation',
86
+ success: false,
87
+ error: error instanceof Error ? error.message : String(error),
88
+ duration: Date.now() - startTime
89
+ };
90
+ }
91
+ }
92
+ async testPackageJsonTransformation() {
93
+ const startTime = Date.now();
94
+ try {
95
+ const rootPkg = await fs.readJson(path.join(this.appPath, 'package.json'));
96
+ const frontendPkg = await fs.readJson(path.join(this.appPath, 'apps/frontend/package.json'));
97
+ const backendPkg = await fs.readJson(path.join(this.appPath, 'apps/backend/package.json'));
98
+ const apiPkg = await fs.readJson(path.join(this.appPath, 'packages/api/package.json'));
99
+ // Validate transformations
100
+ const errors = [];
101
+ if (rootPkg.name !== this.appName) {
102
+ errors.push(`Root name not transformed: expected "${this.appName}", got "${rootPkg.name}"`);
103
+ }
104
+ if (frontendPkg.name !== `@${this.appName}/frontend`) {
105
+ errors.push(`Frontend name not transformed: expected "@${this.appName}/frontend", got "${frontendPkg.name}"`);
106
+ }
107
+ if (backendPkg.name !== `@${this.appName}/backend`) {
108
+ errors.push(`Backend name not transformed: expected "@${this.appName}/backend", got "${backendPkg.name}"`);
109
+ }
110
+ if (apiPkg.name !== `@${this.appName}/api`) {
111
+ errors.push(`API name not transformed: expected "@${this.appName}/api", got "${apiPkg.name}"`);
112
+ }
113
+ // Check if old @mvpkit/core references remain
114
+ const allPkgs = [frontendPkg, backendPkg, apiPkg];
115
+ for (const pkg of allPkgs) {
116
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
117
+ for (const dep of Object.keys(deps)) {
118
+ if (dep.startsWith('@mvpkit/core-')) {
119
+ errors.push(`Old dependency reference found: ${dep} in ${pkg.name}`);
120
+ }
121
+ }
122
+ }
123
+ if (errors.length > 0) {
124
+ throw new Error(errors.join('; '));
125
+ }
126
+ return {
127
+ name: 'Package.json Transformation',
128
+ success: true,
129
+ duration: Date.now() - startTime
130
+ };
131
+ }
132
+ catch (error) {
133
+ return {
134
+ name: 'Package.json Transformation',
135
+ success: false,
136
+ error: error instanceof Error ? error.message : String(error),
137
+ duration: Date.now() - startTime
138
+ };
139
+ }
140
+ }
141
+ async testDependencyInstallation() {
142
+ const spinner = ora('Installing dependencies...').start();
143
+ const startTime = Date.now();
144
+ try {
145
+ process.chdir(this.appPath);
146
+ execSync('pnpm install', { stdio: 'ignore' });
147
+ // Verify node_modules exist
148
+ if (!fs.existsSync('node_modules')) {
149
+ throw new Error('node_modules directory not created');
150
+ }
151
+ spinner.succeed('Dependencies installed');
152
+ return {
153
+ name: 'Dependency Installation',
154
+ success: true,
155
+ duration: Date.now() - startTime
156
+ };
157
+ }
158
+ catch (error) {
159
+ spinner.fail('Dependency installation failed');
160
+ return {
161
+ name: 'Dependency Installation',
162
+ success: false,
163
+ error: error instanceof Error ? error.message : String(error),
164
+ duration: Date.now() - startTime
165
+ };
166
+ }
167
+ }
168
+ async testTypeScriptCompilation() {
169
+ const spinner = ora('Running TypeScript checks...').start();
170
+ const startTime = Date.now();
171
+ try {
172
+ execSync('pnpm typecheck', { stdio: 'ignore' });
173
+ spinner.succeed('TypeScript compilation successful');
174
+ return {
175
+ name: 'TypeScript Compilation',
176
+ success: true,
177
+ duration: Date.now() - startTime
178
+ };
179
+ }
180
+ catch (error) {
181
+ spinner.fail('TypeScript compilation failed');
182
+ return {
183
+ name: 'TypeScript Compilation',
184
+ success: false,
185
+ error: 'TypeScript compilation errors detected',
186
+ duration: Date.now() - startTime
187
+ };
188
+ }
189
+ }
190
+ async testLinting() {
191
+ const spinner = ora('Running linting...').start();
192
+ const startTime = Date.now();
193
+ try {
194
+ execSync('pnpm lint', { stdio: 'ignore' });
195
+ spinner.succeed('Linting passed');
196
+ return {
197
+ name: 'Linting',
198
+ success: true,
199
+ duration: Date.now() - startTime
200
+ };
201
+ }
202
+ catch (error) {
203
+ spinner.fail('Linting failed');
204
+ return {
205
+ name: 'Linting',
206
+ success: false,
207
+ error: 'Linting errors detected',
208
+ duration: Date.now() - startTime
209
+ };
210
+ }
211
+ }
212
+ async testBuildProcess() {
213
+ const spinner = ora('Running build process...').start();
214
+ const startTime = Date.now();
215
+ try {
216
+ execSync('pnpm build', { stdio: 'ignore' });
217
+ // Verify build outputs exist
218
+ const expectedOutputs = [
219
+ 'packages/api/dist',
220
+ 'packages/config/dist',
221
+ 'apps/frontend/dist'
222
+ ];
223
+ for (const output of expectedOutputs) {
224
+ if (!fs.existsSync(output)) {
225
+ throw new Error(`Build output missing: ${output}`);
226
+ }
227
+ }
228
+ spinner.succeed('Build process successful');
229
+ return {
230
+ name: 'Build Process',
231
+ success: true,
232
+ duration: Date.now() - startTime
233
+ };
234
+ }
235
+ catch (error) {
236
+ spinner.fail('Build process failed');
237
+ return {
238
+ name: 'Build Process',
239
+ success: false,
240
+ error: error instanceof Error ? error.message : String(error),
241
+ duration: Date.now() - startTime
242
+ };
243
+ }
244
+ }
245
+ async testProjectStructure() {
246
+ const startTime = Date.now();
247
+ try {
248
+ const expectedStructure = [
249
+ 'package.json',
250
+ 'turbo.json',
251
+ 'biome.json',
252
+ 'README.md',
253
+ 'apps/frontend',
254
+ 'apps/backend',
255
+ 'packages/api',
256
+ 'packages/config',
257
+ 'apps/frontend/package.json',
258
+ 'apps/backend/package.json',
259
+ 'packages/api/package.json',
260
+ 'packages/config/package.json',
261
+ 'apps/frontend/.env.example',
262
+ 'apps/backend/.dev.vars.example'
263
+ ];
264
+ const missingFiles = [];
265
+ for (const file of expectedStructure) {
266
+ if (!fs.existsSync(path.join(this.appPath, file))) {
267
+ missingFiles.push(file);
268
+ }
269
+ }
270
+ if (missingFiles.length > 0) {
271
+ throw new Error(`Missing files: ${missingFiles.join(', ')}`);
272
+ }
273
+ return {
274
+ name: 'Project Structure',
275
+ success: true,
276
+ duration: Date.now() - startTime
277
+ };
278
+ }
279
+ catch (error) {
280
+ return {
281
+ name: 'Project Structure',
282
+ success: false,
283
+ error: error instanceof Error ? error.message : String(error),
284
+ duration: Date.now() - startTime
285
+ };
286
+ }
287
+ }
288
+ async testEnvironmentFiles() {
289
+ const startTime = Date.now();
290
+ try {
291
+ const frontendEnv = await fs.readFile(path.join(this.appPath, 'apps/frontend/.env.example'), 'utf8');
292
+ const backendEnv = await fs.readFile(path.join(this.appPath, 'apps/backend/.dev.vars.example'), 'utf8');
293
+ // Verify environment files contain expected content
294
+ if (!frontendEnv.includes('VITE_APP_NAME')) {
295
+ throw new Error('Frontend .env.example missing VITE_APP_NAME');
296
+ }
297
+ if (!backendEnv.includes('DATABASE_URL')) {
298
+ throw new Error('Backend .dev.vars.example missing DATABASE_URL');
299
+ }
300
+ return {
301
+ name: 'Environment Files',
302
+ success: true,
303
+ duration: Date.now() - startTime
304
+ };
305
+ }
306
+ catch (error) {
307
+ return {
308
+ name: 'Environment Files',
309
+ success: false,
310
+ error: error instanceof Error ? error.message : String(error),
311
+ duration: Date.now() - startTime
312
+ };
313
+ }
314
+ }
315
+ printResults(results) {
316
+ console.log(chalk.blue.bold('\n📊 Test Results:\n'));
317
+ let passed = 0;
318
+ let failed = 0;
319
+ for (const result of results) {
320
+ const icon = result.success ? '✅' : '❌';
321
+ const duration = result.duration ? ` (${result.duration}ms)` : '';
322
+ console.log(`${icon} ${result.name}${duration}`);
323
+ if (!result.success && result.error) {
324
+ console.log(chalk.red(` Error: ${result.error}`));
325
+ }
326
+ result.success ? passed++ : failed++;
327
+ }
328
+ console.log(chalk.blue.bold(`\n📈 Summary: ${passed} passed, ${failed} failed\n`));
329
+ if (failed === 0) {
330
+ console.log(chalk.green.bold('🎉 All tests passed! The CLI generates working applications.'));
331
+ }
332
+ else {
333
+ console.log(chalk.red.bold('⚠️ Some tests failed. The CLI needs fixes.'));
334
+ process.exit(1);
335
+ }
336
+ }
337
+ async cleanup() {
338
+ if (fs.existsSync(this.testDir)) {
339
+ await fs.remove(this.testDir);
340
+ }
341
+ }
342
+ }
343
+ // CLI interface for running tests
344
+ if (import.meta.url === `file://${process.argv[1]}`) {
345
+ const validator = new AppValidator();
346
+ try {
347
+ await validator.runFullValidation();
348
+ }
349
+ catch (error) {
350
+ console.error(chalk.red('Test suite failed:'), error);
351
+ process.exit(1);
352
+ }
353
+ finally {
354
+ // Clean up test directory
355
+ await validator.cleanup();
356
+ }
357
+ }
358
+ export { AppValidator };
359
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/dist/utils.js ADDED
@@ -0,0 +1,100 @@
1
+ import path from 'path';
2
+ import fs from 'fs';
3
+ import { fileURLToPath } from 'url';
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = path.dirname(__filename);
6
+ export function validateProjectName(name) {
7
+ if (!name) {
8
+ throw new Error('Project name is required');
9
+ }
10
+ if (!/^[a-zA-Z][a-zA-Z0-9-_]*$/.test(name)) {
11
+ throw new Error('Project name must start with a letter and contain only letters, numbers, hyphens, and underscores');
12
+ }
13
+ return name;
14
+ }
15
+ export function generateTemplateVariables(projectName, options = {}, packageManager = 'pnpm', packageManagerVersion) {
16
+ const validatedName = validateProjectName(projectName);
17
+ // Generate different case variations
18
+ const kebabCase = validatedName.toLowerCase().replace(/[_\s]+/g, '-');
19
+ const camelCase = kebabCase.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
20
+ const displayName = kebabCase.replace(/-/g, ' ').replace(/\b\w/g, l => l.toUpperCase());
21
+ // Generate package scope (user can override later)
22
+ const packageScope = `@${kebabCase}`;
23
+ return {
24
+ projectName: validatedName,
25
+ projectDisplayName: options.description || displayName,
26
+ projectDescription: options.description || `A new MVPKit Core application: ${displayName}`,
27
+ projectKebabCase: kebabCase,
28
+ projectCamelCase: camelCase,
29
+ domainName: options.domain,
30
+ databaseName: `${kebabCase}-db`,
31
+ packageManager,
32
+ packageManagerVersion,
33
+ packageScope,
34
+ frontendPackageName: `${packageScope}/frontend`,
35
+ backendPackageName: `${packageScope}/backend`,
36
+ apiPackageName: `${packageScope}/api`,
37
+ configPackageName: `${packageScope}/config`,
38
+ workersName: `${kebabCase}-api`,
39
+ pagesName: `${kebabCase}-frontend`,
40
+ databaseId: `${kebabCase}-db`,
41
+ kvNamespaceId: `${kebabCase}-kv`
42
+ };
43
+ }
44
+ export function getCoreRepositoryPath() {
45
+ // Find the mvpkit root directory
46
+ let currentDir = __dirname;
47
+ // Go up from the built CLI package to find mvpkit root
48
+ // Path: /mvpkit/cli/packages/create-mvpkit-core/dist -> /mvpkit
49
+ while (currentDir && currentDir !== path.parse(currentDir).root) {
50
+ if (path.basename(currentDir) === 'mvpkit') {
51
+ break;
52
+ }
53
+ currentDir = path.dirname(currentDir);
54
+ }
55
+ if (!currentDir || path.basename(currentDir) !== 'mvpkit') {
56
+ // Fallback: try relative from current working directory
57
+ const cwd = process.cwd();
58
+ const possiblePaths = [
59
+ path.resolve(cwd, '../core'), // from cli/test-output
60
+ path.resolve(cwd, '../../core'), // from cli/packages/create-mvpkit-core
61
+ path.resolve(cwd, '../../../core'), // from deeper nesting
62
+ ];
63
+ for (const possiblePath of possiblePaths) {
64
+ if (fs.existsSync(possiblePath)) {
65
+ return possiblePath;
66
+ }
67
+ }
68
+ }
69
+ const coreDir = path.join(currentDir, 'core');
70
+ return coreDir;
71
+ }
72
+ export function shouldSkipFile(filePath, skipPatterns) {
73
+ const fileName = path.basename(filePath);
74
+ const relativePath = filePath;
75
+ return skipPatterns.some(pattern => {
76
+ if (pattern.startsWith('/')) {
77
+ return relativePath.startsWith(pattern.slice(1));
78
+ }
79
+ if (pattern.endsWith('/')) {
80
+ return relativePath.startsWith(pattern) || relativePath.includes(pattern);
81
+ }
82
+ // Exact filename match
83
+ if (fileName === pattern) {
84
+ return true;
85
+ }
86
+ return fileName.includes(pattern) || relativePath.includes(pattern);
87
+ });
88
+ }
89
+ export function transformFileName(fileName, variables) {
90
+ return fileName
91
+ .replace(/mvpkit-core/g, variables.projectKebabCase)
92
+ .replace(/mvpkit/g, variables.projectKebabCase);
93
+ }
94
+ export const DEFAULT_SKIP_PATTERNS = [
95
+ '.git/',
96
+ '.serena',
97
+ 'examples/',
98
+ 'cleanup.sh'
99
+ ];
100
+ //# sourceMappingURL=utils.js.map