create-stackr 0.2.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/LICENSE +21 -0
- package/README.md +642 -0
- package/bin/cli.js +12 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +113 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/dependencies.d.ts +82 -0
- package/dist/config/dependencies.d.ts.map +1 -0
- package/dist/config/dependencies.js +82 -0
- package/dist/config/dependencies.js.map +1 -0
- package/dist/config/presets.d.ts +3 -0
- package/dist/config/presets.d.ts.map +1 -0
- package/dist/config/presets.js +174 -0
- package/dist/config/presets.js.map +1 -0
- package/dist/generators/index.d.ts +40 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +130 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/onboarding.d.ts +8 -0
- package/dist/generators/onboarding.d.ts.map +1 -0
- package/dist/generators/onboarding.js +141 -0
- package/dist/generators/onboarding.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +65 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/features.d.ts +14 -0
- package/dist/prompts/features.d.ts.map +1 -0
- package/dist/prompts/features.js +96 -0
- package/dist/prompts/features.js.map +1 -0
- package/dist/prompts/index.d.ts +3 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +93 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/onboarding.d.ts +6 -0
- package/dist/prompts/onboarding.d.ts.map +1 -0
- package/dist/prompts/onboarding.js +37 -0
- package/dist/prompts/onboarding.js.map +1 -0
- package/dist/prompts/orm.d.ts +3 -0
- package/dist/prompts/orm.d.ts.map +1 -0
- package/dist/prompts/orm.js +23 -0
- package/dist/prompts/orm.js.map +1 -0
- package/dist/prompts/packageManager.d.ts +2 -0
- package/dist/prompts/packageManager.d.ts.map +1 -0
- package/dist/prompts/packageManager.js +18 -0
- package/dist/prompts/packageManager.js.map +1 -0
- package/dist/prompts/platform.d.ts +3 -0
- package/dist/prompts/platform.d.ts.map +1 -0
- package/dist/prompts/platform.js +21 -0
- package/dist/prompts/platform.js.map +1 -0
- package/dist/prompts/preset.d.ts +4 -0
- package/dist/prompts/preset.d.ts.map +1 -0
- package/dist/prompts/preset.js +165 -0
- package/dist/prompts/preset.js.map +1 -0
- package/dist/prompts/project.d.ts +2 -0
- package/dist/prompts/project.d.ts.map +1 -0
- package/dist/prompts/project.js +27 -0
- package/dist/prompts/project.js.map +1 -0
- package/dist/prompts/sdks.d.ts +2 -0
- package/dist/prompts/sdks.d.ts.map +1 -0
- package/dist/prompts/sdks.js +46 -0
- package/dist/prompts/sdks.js.map +1 -0
- package/dist/types/index.d.ts +77 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +25 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/cleanup.d.ts +5 -0
- package/dist/utils/cleanup.d.ts.map +1 -0
- package/dist/utils/cleanup.js +38 -0
- package/dist/utils/cleanup.js.map +1 -0
- package/dist/utils/copy.d.ts +10 -0
- package/dist/utils/copy.d.ts.map +1 -0
- package/dist/utils/copy.js +53 -0
- package/dist/utils/copy.js.map +1 -0
- package/dist/utils/errors.d.ts +33 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +136 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/git.d.ts +5 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +33 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +22 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/package.d.ts +16 -0
- package/dist/utils/package.d.ts.map +1 -0
- package/dist/utils/package.js +86 -0
- package/dist/utils/package.js.map +1 -0
- package/dist/utils/system-validation.d.ts +9 -0
- package/dist/utils/system-validation.d.ts.map +1 -0
- package/dist/utils/system-validation.js +31 -0
- package/dist/utils/system-validation.js.map +1 -0
- package/dist/utils/template.d.ts +20 -0
- package/dist/utils/template.d.ts.map +1 -0
- package/dist/utils/template.js +234 -0
- package/dist/utils/template.js.map +1 -0
- package/dist/utils/validation.d.ts +8 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +94 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +96 -0
- package/templates/base/backend/.dockerignore.ejs +62 -0
- package/templates/base/backend/.env.example.ejs +116 -0
- package/templates/base/backend/Dockerfile.ejs +142 -0
- package/templates/base/backend/controllers/event-queue/index.ts +20 -0
- package/templates/base/backend/controllers/event-queue/workers/user.ts +39 -0
- package/templates/base/backend/controllers/rest-api/index.ts +48 -0
- package/templates/base/backend/controllers/rest-api/plugins/auth.ts +152 -0
- package/templates/base/backend/controllers/rest-api/plugins/config.ts +64 -0
- package/templates/base/backend/controllers/rest-api/plugins/error-handler.ts +118 -0
- package/templates/base/backend/controllers/rest-api/routes/auth.ts.ejs +180 -0
- package/templates/base/backend/controllers/rest-api/routes/device-sessions.ts +197 -0
- package/templates/base/backend/controllers/rest-api/routes/oauth-web.ts.ejs +375 -0
- package/templates/base/backend/controllers/rest-api/server.ts.ejs +87 -0
- package/templates/base/backend/domain/device-session/repository.drizzle.ts +209 -0
- package/templates/base/backend/domain/device-session/repository.prisma.ts +248 -0
- package/templates/base/backend/domain/device-session/schema.ts +72 -0
- package/templates/base/backend/domain/session/repository.drizzle.ts +72 -0
- package/templates/base/backend/domain/session/repository.prisma.ts +72 -0
- package/templates/base/backend/domain/session/schema.ts +29 -0
- package/templates/base/backend/domain/user/repository.drizzle.ts +127 -0
- package/templates/base/backend/domain/user/repository.prisma.ts +115 -0
- package/templates/base/backend/domain/user/schema.ts +14 -0
- package/templates/base/backend/drizzle/schema.drizzle.ts +111 -0
- package/templates/base/backend/drizzle.config.drizzle.ts +13 -0
- package/templates/base/backend/lib/auth.drizzle.ts.ejs +104 -0
- package/templates/base/backend/lib/auth.prisma.ts.ejs +97 -0
- package/templates/base/backend/lib/constants.ts.ejs +29 -0
- package/templates/base/backend/package.json.ejs +50 -0
- package/templates/base/backend/prisma/schema.prisma.ejs +102 -0
- package/templates/base/backend/prisma.config.prisma.ts +12 -0
- package/templates/base/backend/tsconfig.json +39 -0
- package/templates/base/backend/utils/db.drizzle.ts +41 -0
- package/templates/base/backend/utils/db.prisma.ts +51 -0
- package/templates/base/backend/utils/email.ts.ejs +35 -0
- package/templates/base/backend/utils/errors.ts +348 -0
- package/templates/base/backend/utils/redis.ts.ejs +279 -0
- package/templates/base/mobile/.env.example.ejs +35 -0
- package/templates/base/mobile/.gitignore.ejs +167 -0
- package/templates/base/mobile/app/+not-found.tsx +85 -0
- package/templates/base/mobile/app/_layout.tsx.ejs +71 -0
- package/templates/base/mobile/app.json.ejs +88 -0
- package/templates/base/mobile/assets/images/adaptive-icon.png +0 -0
- package/templates/base/mobile/assets/images/favicon.png +0 -0
- package/templates/base/mobile/assets/images/icon.png +0 -0
- package/templates/base/mobile/assets/images/onboarding_page_1.png +0 -0
- package/templates/base/mobile/assets/images/onboarding_page_2.png +0 -0
- package/templates/base/mobile/assets/images/onboarding_page_3.png +0 -0
- package/templates/base/mobile/assets/images/paywall_image.png +0 -0
- package/templates/base/mobile/assets/images/splash.png +0 -0
- package/templates/base/mobile/eas.json.ejs +49 -0
- package/templates/base/mobile/metro.config.js +9 -0
- package/templates/base/mobile/package.json.ejs +53 -0
- package/templates/base/mobile/src/components/ui/Button.tsx +131 -0
- package/templates/base/mobile/src/components/ui/Card.tsx +68 -0
- package/templates/base/mobile/src/components/ui/IconSymbol.tsx +90 -0
- package/templates/base/mobile/src/components/ui/Input.tsx +142 -0
- package/templates/base/mobile/src/components/ui/LoadingSpinner.tsx +98 -0
- package/templates/base/mobile/src/components/ui/OnboardingLayout.tsx +356 -0
- package/templates/base/mobile/src/components/ui/PaywallLayout.tsx +311 -0
- package/templates/base/mobile/src/components/ui/Skeleton.tsx +58 -0
- package/templates/base/mobile/src/components/ui/index.ts +6 -0
- package/templates/base/mobile/src/constants/Theme.ts +163 -0
- package/templates/base/mobile/src/context/ThemeContext.tsx +157 -0
- package/templates/base/mobile/src/lib/auth-client.ts.ejs +51 -0
- package/templates/base/mobile/src/services/api.ts.ejs +71 -0
- package/templates/base/mobile/src/services/errorService.ts +179 -0
- package/templates/base/mobile/src/services/sdkInitializer.ts.ejs +36 -0
- package/templates/base/mobile/src/store/index.ts.ejs +18 -0
- package/templates/base/mobile/src/store/ui.store.ts +100 -0
- package/templates/base/mobile/src/utils/formatters.ts +105 -0
- package/templates/base/mobile/src/utils/logger.ts +73 -0
- package/templates/base/mobile/src/utils/responsive.ts +234 -0
- package/templates/base/mobile/tsconfig.json +32 -0
- package/templates/base/web/.env.example.ejs +26 -0
- package/templates/base/web/components.json +22 -0
- package/templates/base/web/eslint.config.mjs +18 -0
- package/templates/base/web/next.config.ts +7 -0
- package/templates/base/web/package.json.ejs +35 -0
- package/templates/base/web/postcss.config.mjs +7 -0
- package/templates/base/web/public/.gitkeep +0 -0
- package/templates/base/web/public/file.svg +1 -0
- package/templates/base/web/public/globe.svg +1 -0
- package/templates/base/web/public/next.svg +1 -0
- package/templates/base/web/public/vercel.svg +1 -0
- package/templates/base/web/public/window.svg +1 -0
- package/templates/base/web/src/app/favicon.ico +0 -0
- package/templates/base/web/src/app/globals.css +152 -0
- package/templates/base/web/src/app/layout.tsx.ejs +54 -0
- package/templates/base/web/src/app/page.tsx.ejs +92 -0
- package/templates/base/web/src/components/auth/auth-hydrator.tsx.ejs +19 -0
- package/templates/base/web/src/components/auth/protected-route.tsx.ejs +109 -0
- package/templates/base/web/src/components/providers/device-session-setup.tsx.ejs +56 -0
- package/templates/base/web/src/components/providers/theme-provider.tsx +17 -0
- package/templates/base/web/src/components/theme-toggle.tsx +34 -0
- package/templates/base/web/src/components/ui/button.tsx +62 -0
- package/templates/base/web/src/components/ui/card.tsx +92 -0
- package/templates/base/web/src/components/ui/input.tsx +21 -0
- package/templates/base/web/src/components/ui/label.tsx +24 -0
- package/templates/base/web/src/components/ui/skeleton.tsx +13 -0
- package/templates/base/web/src/components/ui/spinner.tsx +20 -0
- package/templates/base/web/src/hooks/use-device-session.ts.ejs +40 -0
- package/templates/base/web/src/hooks/use-session.ts.ejs +56 -0
- package/templates/base/web/src/lib/auth/actions.ts.ejs +334 -0
- package/templates/base/web/src/lib/auth/config.ts.ejs +65 -0
- package/templates/base/web/src/lib/auth/cookies.ts.ejs +74 -0
- package/templates/base/web/src/lib/auth/index.ts.ejs +40 -0
- package/templates/base/web/src/lib/auth/oauth.ts.ejs +72 -0
- package/templates/base/web/src/lib/auth/pkce.ts.ejs +48 -0
- package/templates/base/web/src/lib/auth/sessions.ts.ejs +135 -0
- package/templates/base/web/src/lib/auth/user-agent.ts.ejs +47 -0
- package/templates/base/web/src/lib/device/actions.ts.ejs +148 -0
- package/templates/base/web/src/lib/device/id.ts.ejs +74 -0
- package/templates/base/web/src/lib/utils.ts +6 -0
- package/templates/base/web/src/proxy.ts.ejs +66 -0
- package/templates/base/web/src/store/auth.store.ts.ejs +89 -0
- package/templates/base/web/src/store/deviceSession.store.ts.ejs +141 -0
- package/templates/base/web/tsconfig.json +34 -0
- package/templates/features/mobile/auth/app/(auth)/_layout.tsx +16 -0
- package/templates/features/mobile/auth/app/(auth)/login.tsx +86 -0
- package/templates/features/mobile/auth/app/(auth)/register.tsx +86 -0
- package/templates/features/mobile/auth/components/auth/LoginForm.tsx.ejs +349 -0
- package/templates/features/mobile/auth/components/auth/RegisterForm.tsx.ejs +407 -0
- package/templates/features/mobile/auth/components/auth/index.ts +2 -0
- package/templates/features/mobile/auth/hooks/index.ts.ejs +1 -0
- package/templates/features/mobile/auth/hooks/useAuth.ts.ejs +367 -0
- package/templates/features/mobile/auth/services/deviceSession.ts +370 -0
- package/templates/features/mobile/auth/store/deviceSession.store.ts +326 -0
- package/templates/features/mobile/onboarding/app/(onboarding)/_layout.tsx.ejs +11 -0
- package/templates/features/mobile/onboarding/app/(onboarding)/page-1.tsx.ejs +52 -0
- package/templates/features/mobile/onboarding/app/(onboarding)/page-2.tsx.ejs +52 -0
- package/templates/features/mobile/onboarding/app/(onboarding)/page-3.tsx.ejs +60 -0
- package/templates/features/mobile/paywall/app/paywall.tsx +550 -0
- package/templates/features/mobile/tabs/app/(tabs)/_layout.tsx +26 -0
- package/templates/features/mobile/tabs/app/(tabs)/index.tsx +565 -0
- package/templates/features/web/.gitkeep +0 -0
- package/templates/features/web/auth/app/(app)/dashboard/dashboard-client.tsx.ejs +166 -0
- package/templates/features/web/auth/app/(app)/dashboard/page.tsx.ejs +24 -0
- package/templates/features/web/auth/app/(app)/layout.tsx.ejs +43 -0
- package/templates/features/web/auth/app/(app)/settings/sessions/page.tsx.ejs +29 -0
- package/templates/features/web/auth/app/(app)/settings/sessions/sessions-client.tsx.ejs +77 -0
- package/templates/features/web/auth/app/(auth)/forgot-password/page.tsx.ejs +127 -0
- package/templates/features/web/auth/app/(auth)/layout.tsx.ejs +32 -0
- package/templates/features/web/auth/app/(auth)/login/page.tsx.ejs +35 -0
- package/templates/features/web/auth/app/(auth)/register/page.tsx.ejs +19 -0
- package/templates/features/web/auth/app/(auth)/reset-password/page.tsx.ejs +40 -0
- package/templates/features/web/auth/app/(auth)/verify-email/page.tsx.ejs +198 -0
- package/templates/features/web/auth/app/auth/callback/route.ts.ejs +152 -0
- package/templates/features/web/auth/components/auth/login-form.tsx.ejs +100 -0
- package/templates/features/web/auth/components/auth/oauth-buttons.tsx.ejs +126 -0
- package/templates/features/web/auth/components/auth/password-reset-form.tsx.ejs +103 -0
- package/templates/features/web/auth/components/auth/register-form.tsx.ejs +139 -0
- package/templates/features/web/auth/components/settings/session-card.tsx.ejs +132 -0
- package/templates/integrations/mobile/adjust/services/adjustService.ts.ejs +163 -0
- package/templates/integrations/mobile/adjust/store/adjust.store.ts +243 -0
- package/templates/integrations/mobile/att/services/attService.ts +84 -0
- package/templates/integrations/mobile/att/services/trackingPermissions.ts +208 -0
- package/templates/integrations/mobile/att/store/att.store.ts +162 -0
- package/templates/integrations/mobile/revenuecat/services/revenuecatService.ts.ejs +174 -0
- package/templates/integrations/mobile/revenuecat/store/revenuecat.store.ts +286 -0
- package/templates/integrations/mobile/scate/services/scateService.ts.ejs +85 -0
- package/templates/integrations/mobile/scate/store/scate.store.ts +125 -0
- package/templates/integrations/web/.gitkeep +0 -0
- package/templates/shared/.env.example.ejs +21 -0
- package/templates/shared/.gitignore.ejs +145 -0
- package/templates/shared/README.md.ejs +134 -0
- package/templates/shared/docker-compose.prod.yml.ejs +120 -0
- package/templates/shared/docker-compose.yml.ejs +129 -0
- package/templates/shared/scripts/docker-dev.sh.ejs +395 -0
- package/templates/shared/scripts/docker-prod.sh.ejs +542 -0
- package/templates/shared/scripts/setup.sh.ejs +979 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import boxen from 'boxen';
|
|
3
|
+
export class ProjectGenerationError extends Error {
|
|
4
|
+
cause;
|
|
5
|
+
hints;
|
|
6
|
+
recovery;
|
|
7
|
+
constructor(message, cause, hints, recovery) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.cause = cause;
|
|
10
|
+
this.hints = hints;
|
|
11
|
+
this.recovery = recovery;
|
|
12
|
+
this.name = 'ProjectGenerationError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function displayError(error) {
|
|
16
|
+
console.error();
|
|
17
|
+
if (error instanceof ProjectGenerationError) {
|
|
18
|
+
// Enhanced error with hints
|
|
19
|
+
console.error(chalk.red.bold('❌ Error:'), chalk.red(error.message));
|
|
20
|
+
if (error.cause) {
|
|
21
|
+
console.error(chalk.gray('\n Caused by:'), chalk.gray(error.cause.message));
|
|
22
|
+
}
|
|
23
|
+
if (error.hints && error.hints.length > 0) {
|
|
24
|
+
console.error(chalk.yellow('\n💡 Hints:'));
|
|
25
|
+
error.hints.forEach((hint) => {
|
|
26
|
+
console.error(chalk.yellow(` • ${hint}`));
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
if (error.recovery && error.recovery.length > 0) {
|
|
30
|
+
console.error(chalk.cyan('\n🔧 To recover:'));
|
|
31
|
+
error.recovery.forEach((step, i) => {
|
|
32
|
+
console.error(chalk.cyan(` ${i + 1}. ${step}`));
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// Standard error
|
|
38
|
+
console.error(chalk.red.bold('❌ Error:'), chalk.red(error.message));
|
|
39
|
+
}
|
|
40
|
+
console.error();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Common error scenarios with helpful messages
|
|
44
|
+
*/
|
|
45
|
+
export const errors = {
|
|
46
|
+
directoryExists: (name) => new ProjectGenerationError(`Directory "${name}" already exists`, undefined, [
|
|
47
|
+
'Choose a different project name',
|
|
48
|
+
'Remove the existing directory if you want to recreate it',
|
|
49
|
+
], [`rm -rf ${name}`, `npx create-fullstack-app ${name}-v2`]),
|
|
50
|
+
invalidProjectName: (name, reason) => new ProjectGenerationError(`Invalid project name: "${name}"`, undefined, [
|
|
51
|
+
reason,
|
|
52
|
+
'Use only lowercase letters, numbers, and hyphens',
|
|
53
|
+
'Must be 1-214 characters long',
|
|
54
|
+
], ['Choose a valid name (e.g., my-fullstack-app)']),
|
|
55
|
+
configValidationFailed: (errors) => new ProjectGenerationError('Configuration validation failed', undefined, errors, ['Run the CLI again and choose valid options']),
|
|
56
|
+
templateNotFound: (template) => new ProjectGenerationError(`Template not found: ${template}`, undefined, [
|
|
57
|
+
'This is likely a bug in create-fullstack-app',
|
|
58
|
+
'Please report this issue on GitHub',
|
|
59
|
+
], [
|
|
60
|
+
'Try running: npx create-fullstack-app@latest',
|
|
61
|
+
'Open an issue: https://github.com/yourusername/create-fullstack-app/issues',
|
|
62
|
+
]),
|
|
63
|
+
templateRenderFailed: (file, cause) => new ProjectGenerationError(`Failed to render template: ${file}`, cause, [
|
|
64
|
+
'Template rendering error (EJS syntax issue)',
|
|
65
|
+
'This is likely a bug in create-fullstack-app',
|
|
66
|
+
], ['Please report this issue on GitHub']),
|
|
67
|
+
fileCopyFailed: (src, dest, cause) => new ProjectGenerationError(`Failed to copy file: ${src} → ${dest}`, cause, [
|
|
68
|
+
'Check file system permissions',
|
|
69
|
+
'Ensure you have write access to the target directory',
|
|
70
|
+
], ['Try running with sudo (not recommended)', 'Check disk space availability']),
|
|
71
|
+
dependencyInstallFailed: (packageManager, dir) => new ProjectGenerationError('Dependency installation failed', undefined, [
|
|
72
|
+
`${packageManager} install command failed`,
|
|
73
|
+
'Your project was created but dependencies failed to install',
|
|
74
|
+
'You can install them manually',
|
|
75
|
+
], [
|
|
76
|
+
`cd ${dir}/mobile && ${packageManager} install`,
|
|
77
|
+
`cd ${dir}/backend && ${packageManager} install`,
|
|
78
|
+
]),
|
|
79
|
+
gitInitFailed: (cause) => new ProjectGenerationError('Git initialization failed', cause, [
|
|
80
|
+
'Your project was created successfully',
|
|
81
|
+
'But git repository initialization failed (non-critical)',
|
|
82
|
+
], ['Initialize git manually: git init', 'Check if git is installed: git --version']),
|
|
83
|
+
nodeVersionTooLow: (current, required) => new ProjectGenerationError(`Node.js version too low: ${current} (required: >=${required})`, undefined, ['create-fullstack-app requires Node.js 18.0.0 or higher'], [
|
|
84
|
+
'Install nvm: https://github.com/nvm-sh/nvm',
|
|
85
|
+
`Install Node.js: nvm install ${required}`,
|
|
86
|
+
'Or download from: https://nodejs.org/',
|
|
87
|
+
]),
|
|
88
|
+
diskSpaceError: () => new ProjectGenerationError('Insufficient disk space', undefined, ['Full-stack projects require ~500MB of space (with dependencies)'], ['Free up disk space', 'Try generating with --skip-install flag']),
|
|
89
|
+
networkError: (operation) => new ProjectGenerationError(`Network error during ${operation}`, undefined, [
|
|
90
|
+
'Check your internet connection',
|
|
91
|
+
'Some firewalls/proxies block npm registry',
|
|
92
|
+
'You can retry with --skip-install and install manually',
|
|
93
|
+
], [
|
|
94
|
+
'Check network: ping registry.npmjs.org',
|
|
95
|
+
'Configure npm proxy if needed: npm config set proxy http://proxy:port',
|
|
96
|
+
'Retry with --skip-install flag',
|
|
97
|
+
]),
|
|
98
|
+
packageManagerNotFound: (pm) => new ProjectGenerationError(`Package manager "${pm}" not found`, undefined, [
|
|
99
|
+
`${pm} is not installed on your system`,
|
|
100
|
+
'Install it or choose a different package manager',
|
|
101
|
+
], [
|
|
102
|
+
pm === 'npm' ? 'npm comes with Node.js - reinstall Node.js' : `Install ${pm}: npm install -g ${pm}`,
|
|
103
|
+
'Or run the CLI again and choose a different package manager',
|
|
104
|
+
]),
|
|
105
|
+
};
|
|
106
|
+
/**
|
|
107
|
+
* Display a warning (non-fatal)
|
|
108
|
+
*/
|
|
109
|
+
export function displayWarning(message, details) {
|
|
110
|
+
console.warn();
|
|
111
|
+
console.warn(chalk.yellow.bold('⚠️ Warning:'), chalk.yellow(message));
|
|
112
|
+
if (details && details.length > 0) {
|
|
113
|
+
details.forEach((detail) => {
|
|
114
|
+
console.warn(chalk.gray(` ${detail}`));
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
console.warn();
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Display success message with box
|
|
121
|
+
*/
|
|
122
|
+
export function displaySuccess(message, details) {
|
|
123
|
+
const content = [
|
|
124
|
+
chalk.green.bold('✨ ' + message),
|
|
125
|
+
'',
|
|
126
|
+
...(details || []).map(d => chalk.gray(d)),
|
|
127
|
+
].join('\n');
|
|
128
|
+
console.log();
|
|
129
|
+
console.log(boxen(content, {
|
|
130
|
+
padding: 1,
|
|
131
|
+
borderColor: 'green',
|
|
132
|
+
borderStyle: 'round',
|
|
133
|
+
}));
|
|
134
|
+
console.log();
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCpE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { execa } from 'execa';
|
|
2
|
+
/**
|
|
3
|
+
* Initialize a git repository with an initial commit
|
|
4
|
+
*/
|
|
5
|
+
export async function initializeGit(targetDir) {
|
|
6
|
+
// Check if git is available
|
|
7
|
+
try {
|
|
8
|
+
await execa('git', ['--version']);
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
throw new Error('Git is not installed or not in PATH');
|
|
12
|
+
}
|
|
13
|
+
// Initialize repository
|
|
14
|
+
await execa('git', ['init'], { cwd: targetDir });
|
|
15
|
+
// Configure git user if not already set (for CI/CD environments)
|
|
16
|
+
try {
|
|
17
|
+
await execa('git', ['config', 'user.email'], { cwd: targetDir });
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// If no user.email is set, configure a default for the initial commit
|
|
21
|
+
await execa('git', ['config', 'user.email', 'create-fullstack-app@example.com'], { cwd: targetDir });
|
|
22
|
+
await execa('git', ['config', 'user.name', 'create-fullstack-app'], { cwd: targetDir });
|
|
23
|
+
}
|
|
24
|
+
// Add all files
|
|
25
|
+
await execa('git', ['add', '.'], { cwd: targetDir });
|
|
26
|
+
// Create initial commit
|
|
27
|
+
await execa('git', [
|
|
28
|
+
'commit',
|
|
29
|
+
'-m',
|
|
30
|
+
'Initial commit\n\nGenerated with create-fullstack-app\nhttps://github.com/yourusername/create-fullstack-app',
|
|
31
|
+
], { cwd: targetDir });
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAAiB;IACnD,4BAA4B;IAC5B,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,wBAAwB;IACxB,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IAEjD,iEAAiE;IACjE,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;QACtE,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,kCAAkC,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;QACrG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,sBAAsB,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,gBAAgB;IAChB,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IAErD,wBAAwB;IACxB,MAAM,KAAK,CACT,KAAK,EACL;QACE,QAAQ;QACR,IAAI;QACJ,6GAA6G;KAC9G,EACD,EAAE,GAAG,EAAE,SAAS,EAAE,CACnB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const logger: {
|
|
2
|
+
info: (message: string) => void;
|
|
3
|
+
success: (message: string) => void;
|
|
4
|
+
warning: (message: string) => void;
|
|
5
|
+
error: (message: string) => void;
|
|
6
|
+
gray: (message: string) => void;
|
|
7
|
+
bold: (message: string) => void;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM;oBACD,MAAM;uBAIH,MAAM;uBAIN,MAAM;qBAIR,MAAM;oBAIP,MAAM;oBAIN,MAAM;CAGvB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export const logger = {
|
|
3
|
+
info: (message) => {
|
|
4
|
+
console.log(chalk.cyan(message));
|
|
5
|
+
},
|
|
6
|
+
success: (message) => {
|
|
7
|
+
console.log(chalk.green(message));
|
|
8
|
+
},
|
|
9
|
+
warning: (message) => {
|
|
10
|
+
console.log(chalk.yellow(message));
|
|
11
|
+
},
|
|
12
|
+
error: (message) => {
|
|
13
|
+
console.log(chalk.red(message));
|
|
14
|
+
},
|
|
15
|
+
gray: (message) => {
|
|
16
|
+
console.log(chalk.gray(message));
|
|
17
|
+
},
|
|
18
|
+
bold: (message) => {
|
|
19
|
+
console.log(chalk.bold(message));
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACnC,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ProjectConfig } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build mobile package.json based on configuration
|
|
4
|
+
*
|
|
5
|
+
* NOTE: The actual package.json generation in production happens via EJS templates.
|
|
6
|
+
* This function serves as a programmatic representation for testing and validation.
|
|
7
|
+
*/
|
|
8
|
+
export declare function buildMobilePackageJson(config: ProjectConfig): Record<string, unknown>;
|
|
9
|
+
/**
|
|
10
|
+
* Build backend package.json based on configuration
|
|
11
|
+
*
|
|
12
|
+
* NOTE: The actual package.json generation in production happens via EJS templates.
|
|
13
|
+
* This function serves as a programmatic representation for testing and validation.
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildBackendPackageJson(config: ProjectConfig): Record<string, unknown>;
|
|
16
|
+
//# sourceMappingURL=package.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../../src/utils/package.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA2CrF;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqCtF"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { DEPENDENCY_VERSIONS } from '../config/dependencies.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build mobile package.json based on configuration
|
|
4
|
+
*
|
|
5
|
+
* NOTE: The actual package.json generation in production happens via EJS templates.
|
|
6
|
+
* This function serves as a programmatic representation for testing and validation.
|
|
7
|
+
*/
|
|
8
|
+
export function buildMobilePackageJson(config) {
|
|
9
|
+
const dependencies = {
|
|
10
|
+
...DEPENDENCY_VERSIONS.mobile.core,
|
|
11
|
+
};
|
|
12
|
+
// Add conditional dependencies based on features
|
|
13
|
+
if (config.features.authentication) {
|
|
14
|
+
Object.assign(dependencies, DEPENDENCY_VERSIONS.mobile.authentication);
|
|
15
|
+
}
|
|
16
|
+
if (config.integrations.revenueCat.enabled) {
|
|
17
|
+
Object.assign(dependencies, DEPENDENCY_VERSIONS.mobile.revenueCat);
|
|
18
|
+
}
|
|
19
|
+
if (config.integrations.adjust.enabled) {
|
|
20
|
+
Object.assign(dependencies, DEPENDENCY_VERSIONS.mobile.adjust);
|
|
21
|
+
}
|
|
22
|
+
if (config.integrations.scate.enabled) {
|
|
23
|
+
Object.assign(dependencies, DEPENDENCY_VERSIONS.mobile.scate);
|
|
24
|
+
}
|
|
25
|
+
if (config.integrations.att.enabled) {
|
|
26
|
+
Object.assign(dependencies, DEPENDENCY_VERSIONS.mobile.att);
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
name: `${config.projectName}-mobile`,
|
|
30
|
+
version: '1.0.0',
|
|
31
|
+
description: `React Native mobile app for ${config.projectName}`,
|
|
32
|
+
main: 'expo-router/entry',
|
|
33
|
+
scripts: {
|
|
34
|
+
start: 'expo start',
|
|
35
|
+
android: 'expo run:android',
|
|
36
|
+
ios: 'expo run:ios',
|
|
37
|
+
web: 'expo start --web',
|
|
38
|
+
lint: 'expo lint',
|
|
39
|
+
'type-check': 'tsc --noEmit',
|
|
40
|
+
},
|
|
41
|
+
dependencies,
|
|
42
|
+
devDependencies: DEPENDENCY_VERSIONS.devDependencies.mobile,
|
|
43
|
+
private: true,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Build backend package.json based on configuration
|
|
48
|
+
*
|
|
49
|
+
* NOTE: The actual package.json generation in production happens via EJS templates.
|
|
50
|
+
* This function serves as a programmatic representation for testing and validation.
|
|
51
|
+
*/
|
|
52
|
+
export function buildBackendPackageJson(config) {
|
|
53
|
+
const dependencies = {
|
|
54
|
+
...DEPENDENCY_VERSIONS.backend.core,
|
|
55
|
+
};
|
|
56
|
+
// Add event queue dependencies if enabled
|
|
57
|
+
if (config.backend.eventQueue) {
|
|
58
|
+
Object.assign(dependencies, DEPENDENCY_VERSIONS.backend.eventQueue);
|
|
59
|
+
}
|
|
60
|
+
const scripts = {
|
|
61
|
+
'dev:rest-api': 'bun --watch ./controllers/rest-api/index.ts | pino-pretty --colorize',
|
|
62
|
+
build: 'bun run tsc',
|
|
63
|
+
'start:rest-api': 'bun run dist/controllers/rest-api/index.js',
|
|
64
|
+
'db:generate': 'prisma generate',
|
|
65
|
+
'db:push': 'prisma db push',
|
|
66
|
+
'db:migrate': 'prisma migrate dev',
|
|
67
|
+
'db:studio': 'prisma studio',
|
|
68
|
+
postinstall: 'prisma generate',
|
|
69
|
+
};
|
|
70
|
+
// Add event queue scripts if enabled
|
|
71
|
+
if (config.backend.eventQueue) {
|
|
72
|
+
scripts['dev:event-queue'] = 'bun --watch ./controllers/event-queue/index.ts | pino-pretty --colorize';
|
|
73
|
+
scripts['start:event-queue'] = 'bun run dist/controllers/event-queue/index.js';
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
name: `${config.projectName}-backend`,
|
|
77
|
+
version: '1.0.0',
|
|
78
|
+
description: `Backend API for ${config.projectName}`,
|
|
79
|
+
type: 'module',
|
|
80
|
+
main: 'controllers/rest-api/index.ts',
|
|
81
|
+
scripts,
|
|
82
|
+
dependencies,
|
|
83
|
+
devDependencies: DEPENDENCY_VERSIONS.devDependencies.backend,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=package.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.js","sourceRoot":"","sources":["../../src/utils/package.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if Node.js version meets minimum requirement
|
|
3
|
+
*/
|
|
4
|
+
export declare function validateNodeVersion(): void;
|
|
5
|
+
/**
|
|
6
|
+
* Check if package manager is available
|
|
7
|
+
*/
|
|
8
|
+
export declare function validatePackageManager(pm: 'npm' | 'yarn' | 'bun'): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=system-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-validation.d.ts","sourceRoot":"","sources":["../../src/utils/system-validation.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAU1C;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,EAAE,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { errors } from './errors.js';
|
|
2
|
+
import { execa } from 'execa';
|
|
3
|
+
/**
|
|
4
|
+
* Check if Node.js version meets minimum requirement
|
|
5
|
+
*/
|
|
6
|
+
export function validateNodeVersion() {
|
|
7
|
+
const currentVersion = process.version;
|
|
8
|
+
const requiredVersion = '18.0.0';
|
|
9
|
+
const current = parseVersion(currentVersion);
|
|
10
|
+
const required = parseVersion(requiredVersion);
|
|
11
|
+
if (current.major < required.major) {
|
|
12
|
+
throw errors.nodeVersionTooLow(currentVersion, requiredVersion);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Check if package manager is available
|
|
17
|
+
*/
|
|
18
|
+
export async function validatePackageManager(pm) {
|
|
19
|
+
try {
|
|
20
|
+
await execa(pm, ['--version'], { reject: true });
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
throw errors.packageManagerNotFound(pm);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function parseVersion(version) {
|
|
27
|
+
const cleaned = version.replace(/^v/, '');
|
|
28
|
+
const [major, minor, patch] = cleaned.split('.').map(Number);
|
|
29
|
+
return { major, minor, patch };
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=system-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-validation.js","sourceRoot":"","sources":["../../src/utils/system-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IACvC,MAAM,eAAe,GAAG,QAAQ,CAAC;IAEjC,MAAM,OAAO,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;IAE/C,IAAI,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnC,MAAM,MAAM,CAAC,iBAAiB,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,EAA0B;IACrE,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,MAAM,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ProjectConfig } from '../types/index.js';
|
|
2
|
+
export declare const TEMPLATE_DIR: string;
|
|
3
|
+
/**
|
|
4
|
+
* Render an EJS template with configuration
|
|
5
|
+
*/
|
|
6
|
+
export declare function renderTemplate(templatePath: string, config: ProjectConfig): Promise<string>;
|
|
7
|
+
/**
|
|
8
|
+
* Check if a file should be included based on configuration
|
|
9
|
+
*/
|
|
10
|
+
export declare function shouldIncludeFile(filePath: string, config: ProjectConfig): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Check if a file is an EJS template
|
|
13
|
+
*/
|
|
14
|
+
export declare function isTemplate(filePath: string): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Get destination path for a template file
|
|
17
|
+
* Removes .ejs extension and maps template path to project path
|
|
18
|
+
*/
|
|
19
|
+
export declare function getDestinationPath(templatePath: string, targetDir: string): string;
|
|
20
|
+
//# sourceMappingURL=template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/utils/template.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAMvD,eAAO,MAAM,YAAY,QAA0C,CAAC;AAEpE;;GAEG;AACH,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,MAAM,CAAC,CASjB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,aAAa,GACpB,OAAO,CAgIT;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,MAAM,CAwGR"}
|