@dotcms/create-app 1.2.5-next.7 → 1.2.6-next.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.
@@ -1,286 +0,0 @@
1
- import chalk from 'chalk';
2
- import path from 'path';
3
- import { FRAMEWORKS } from '../constants';
4
- /**
5
- * Maximum allowed length for project names (typical filesystem limit)
6
- */
7
- const MAX_PROJECT_NAME_LENGTH = 255;
8
- /**
9
- * Framework aliases to accept common variations
10
- */
11
- const FRAMEWORK_ALIASES = {
12
- next: 'nextjs',
13
- 'next.js': 'nextjs',
14
- ng: 'angular',
15
- 'angular-server': 'angular-ssr'
16
- };
17
- /**
18
- * Validates and normalizes framework name
19
- * Supports case-insensitive matching and common aliases
20
- *
21
- * @param framework - The framework name from CLI flag
22
- * @returns Normalized framework name or undefined if not provided
23
- * @throws Error if framework is invalid
24
- */
25
- export function validateAndNormalizeFramework(framework) {
26
- if (!framework)
27
- return undefined; // Will be prompted interactively
28
- // Normalize: lowercase, remove spaces
29
- const normalized = framework.toLowerCase().replace(/\s+/g, '');
30
- // Check aliases first
31
- if (normalized in FRAMEWORK_ALIASES) {
32
- return FRAMEWORK_ALIASES[normalized];
33
- }
34
- // Check exact match against supported frameworks
35
- if (FRAMEWORKS.includes(normalized)) {
36
- return normalized;
37
- }
38
- // Invalid framework - throw helpful error
39
- throw new Error(chalk.red(`❌ Invalid framework: "${framework}"`) +
40
- '\n\n' +
41
- chalk.white('Supported frameworks:\n') +
42
- FRAMEWORKS.map((f) => chalk.cyan(` • ${f}`)).join('\n') +
43
- '\n\n' +
44
- chalk.gray('💡 Tip: Framework names are case-insensitive\n') +
45
- chalk.gray(' Aliases: next → nextjs, ng → angular'));
46
- }
47
- /**
48
- * Normalizes a URL by removing trailing slashes
49
- * @param url - The URL to normalize
50
- * @returns URL without trailing slash
51
- */
52
- export function normalizeUrl(url) {
53
- return url.replace(/\/+$/, ''); // Remove one or more trailing slashes
54
- }
55
- /**
56
- * Validates URL format
57
- * Checks for protocol, valid format, and hostname
58
- *
59
- * @param url - The URL from CLI flag
60
- * @throws Error if URL format is invalid
61
- */
62
- export function validateUrl(url) {
63
- if (!url || url.trim() === '')
64
- return; // Will be prompted interactively
65
- // Normalize URL (remove trailing slashes)
66
- const normalizedUrl = normalizeUrl(url);
67
- // Basic format check before URL parsing
68
- if (!normalizedUrl.includes('://')) {
69
- throw new Error(chalk.red(`❌ Invalid URL format: "${normalizedUrl}"`) +
70
- '\n\n' +
71
- chalk.white('URLs must include the protocol (http:// or https://)\n\n') +
72
- chalk.cyan('Example:\n https://demo.dotcms.com\n\n') +
73
- chalk.gray('Need help?\n') +
74
- chalk.gray(' • Use --local flag to run dotCMS in Docker\n') +
75
- chalk.gray(' • Check our docs: https://dev.dotcms.com'));
76
- }
77
- // Parse URL - catch only parsing errors (TypeError from invalid URL format)
78
- let parsed;
79
- try {
80
- parsed = new URL(normalizedUrl);
81
- }
82
- catch (error) {
83
- // Only catch TypeError from URL constructor (invalid URL format)
84
- if (error instanceof TypeError) {
85
- throw new Error(chalk.red(`❌ Invalid URL format: "${normalizedUrl}"`) +
86
- '\n\n' +
87
- chalk.white('Please provide a valid HTTP/HTTPS URL\n\n') +
88
- chalk.cyan('Example:\n https://demo.dotcms.com'));
89
- }
90
- // Re-throw any other unexpected errors
91
- throw error;
92
- }
93
- // Protocol validation (throws custom error that propagates directly)
94
- if (!['http:', 'https:'].includes(parsed.protocol)) {
95
- throw new Error(chalk.red(`❌ Unsupported protocol: ${parsed.protocol}`) +
96
- '\n\n' +
97
- chalk.white('Only HTTP and HTTPS are supported'));
98
- }
99
- // Hostname validation (throws custom error that propagates directly)
100
- if (!parsed.hostname) {
101
- throw new Error(chalk.red('❌ URL missing hostname'));
102
- }
103
- // Warn about localhost without Docker flag
104
- if (parsed.hostname === 'localhost' && parsed.port !== '8082') {
105
- console.log(chalk.yellow('⚠️ Warning: ') +
106
- chalk.white('Using localhost but port is not 8082 (default dotCMS port)'));
107
- }
108
- }
109
- /**
110
- * Validates project name for filesystem safety and best practices
111
- *
112
- * @param projectName - The project name from CLI flag or prompt
113
- * @returns Validated project name (preserves original casing)
114
- * @throws Error if project name is invalid
115
- */
116
- export function validateProjectName(projectName) {
117
- if (projectName === undefined || projectName === null) {
118
- return undefined; // Will be prompted interactively
119
- }
120
- const trimmed = projectName.trim();
121
- // Empty or whitespace-only
122
- if (trimmed.length === 0) {
123
- throw new Error(chalk.red('❌ Invalid project name: cannot be empty') +
124
- '\n\n' +
125
- chalk.white('Project name must contain at least one character\n\n') +
126
- chalk.cyan('Valid examples:\n') +
127
- chalk.gray(' • my-dotcms-app\n') +
128
- chalk.gray(' • my_project\n') +
129
- chalk.gray(' • MyProject123'));
130
- }
131
- // Path traversal check
132
- if (trimmed === '.' ||
133
- trimmed === '..' ||
134
- trimmed.includes('../') ||
135
- trimmed.includes('..\\')) {
136
- throw new Error(chalk.red(`❌ Invalid project name: "${projectName}"`) +
137
- '\n\n' +
138
- chalk.white('Project name cannot contain path traversal patterns (..)\n\n') +
139
- chalk.gray('Use the --directory flag to specify the parent directory'));
140
- }
141
- // Absolute path check
142
- if (path.isAbsolute(trimmed)) {
143
- throw new Error(chalk.red(`❌ Invalid project name: "${projectName}"`) +
144
- '\n\n' +
145
- chalk.white('Project name cannot be an absolute path\n\n') +
146
- chalk.gray('Use the --directory flag to specify the location'));
147
- }
148
- // Check for leading hyphen or dot (problematic patterns)
149
- if (trimmed.startsWith('-')) {
150
- throw new Error(chalk.red(`❌ Invalid project name: "${projectName}"`) +
151
- '\n\n' +
152
- chalk.white('Project name cannot start with a hyphen (-)\n\n') +
153
- chalk.gray('This can be confused with command-line flags\n\n') +
154
- chalk.cyan('Try:\n') +
155
- chalk.gray(` • ${trimmed.slice(1)} (remove leading hyphen)\n`) +
156
- chalk.gray(` • my${trimmed} (add prefix)`));
157
- }
158
- if (trimmed.startsWith('.')) {
159
- console.warn(chalk.yellow('\n⚠️ Warning: Project name starts with a dot\n') +
160
- chalk.gray('This will create a hidden directory on Unix systems\n'));
161
- }
162
- // Only allow alphanumeric characters, hyphens, underscores, and dots
163
- // This prevents issues with npm, Docker, and other tools
164
- const validPattern = /^[a-zA-Z0-9._-]+$/;
165
- if (!validPattern.test(trimmed)) {
166
- throw new Error(chalk.red(`❌ Invalid project name: "${projectName}"`) +
167
- '\n\n' +
168
- chalk.white('Project names can only contain:\n') +
169
- chalk.white(' • Letters (a-z, A-Z)\n') +
170
- chalk.white(' • Numbers (0-9)\n') +
171
- chalk.white(' • Hyphens (-)\n') +
172
- chalk.white(' • Underscores (_)\n') +
173
- chalk.white(' • Dots (.)\n\n') +
174
- chalk.cyan('Valid examples:\n') +
175
- chalk.gray(' • my-dotcms-app\n') +
176
- chalk.gray(' • my_project\n') +
177
- chalk.gray(' • MyProject.v2\n') +
178
- chalk.gray(' • project-123\n\n') +
179
- chalk.yellow('Invalid examples:\n') +
180
- chalk.gray(' • test@#$%project (special characters)\n') +
181
- chalk.gray(' • my project (spaces)\n') +
182
- chalk.gray(' • project! (exclamation marks)'));
183
- }
184
- // Windows reserved names
185
- const reservedNames = [
186
- 'CON',
187
- 'PRN',
188
- 'AUX',
189
- 'NUL',
190
- 'COM1',
191
- 'COM2',
192
- 'COM3',
193
- 'COM4',
194
- 'COM5',
195
- 'COM6',
196
- 'COM7',
197
- 'COM8',
198
- 'COM9',
199
- 'LPT1',
200
- 'LPT2',
201
- 'LPT3',
202
- 'LPT4',
203
- 'LPT5',
204
- 'LPT6',
205
- 'LPT7',
206
- 'LPT8',
207
- 'LPT9'
208
- ];
209
- if (reservedNames.includes(trimmed.toUpperCase())) {
210
- throw new Error(chalk.red(`❌ Invalid project name: "${projectName}"`) +
211
- '\n\n' +
212
- chalk.white('This is a reserved system name on Windows\n\n') +
213
- chalk.gray('Please choose a different name'));
214
- }
215
- // Length validation
216
- if (trimmed.length > MAX_PROJECT_NAME_LENGTH) {
217
- throw new Error(chalk.red('❌ Project name too long') +
218
- '\n\n' +
219
- chalk.white(`Maximum: ${MAX_PROJECT_NAME_LENGTH} characters (you provided: ${trimmed.length})\n\n`) +
220
- chalk.gray('Please use a shorter name'));
221
- }
222
- return projectName; // Return original to preserve user's casing
223
- }
224
- /**
225
- * Escapes a file path for safe use in shell commands across platforms
226
- * Handles spaces, special characters, and cross-platform compatibility
227
- *
228
- * @param filePath - The file path to escape
229
- * @returns Shell-safe escaped path
230
- */
231
- export function escapeShellPath(filePath) {
232
- if (!filePath)
233
- return '""';
234
- // Already quoted - return as-is (idempotent)
235
- if ((filePath.startsWith('"') && filePath.endsWith('"')) ||
236
- (filePath.startsWith("'") && filePath.endsWith("'"))) {
237
- return filePath;
238
- }
239
- // Check if escaping needed
240
- // Platform-specific: Windows paths use backslashes natively, Unix paths need backslash escaping
241
- const needsEscaping = process.platform === 'win32'
242
- ? /[\s'"`$!&*(){};<>?|\n\r\t[\]]/.test(filePath) // Skip backslash on Windows
243
- : /[\s'"`$!&*(){};<>?|\\\n\r\t[\]]/.test(filePath); // Include backslash on Unix
244
- if (needsEscaping) {
245
- // Use double quotes. On Windows, escape only internal quotes; on Unix, also escape backslashes.
246
- const escaped = process.platform === 'win32'
247
- ? filePath.replace(/"/g, '\\"')
248
- : filePath.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
249
- return `"${escaped}"`;
250
- }
251
- return filePath; // Simple path - no escaping needed
252
- }
253
- /**
254
- * Validates CLI options for conflicting parameters
255
- * Warns user when both local and cloud parameters are provided
256
- *
257
- * @param options - CLI options to validate
258
- */
259
- export function validateConflictingParameters(options) {
260
- const isLocalSet = options.local === true;
261
- if (!isLocalSet)
262
- return; // No conflict possible
263
- // Check for cloud parameters
264
- const cloudParams = [];
265
- if (options.url)
266
- cloudParams.push('--url');
267
- if (options.username)
268
- cloudParams.push('--username');
269
- if (options.password)
270
- cloudParams.push('--password');
271
- // Warn about conflict
272
- if (cloudParams.length > 0) {
273
- console.warn(chalk.yellow('\n⚠️ Warning: Conflicting parameters detected\n') +
274
- chalk.white('You provided ') +
275
- chalk.cyan('--local') +
276
- chalk.white(' flag along with cloud parameters: ') +
277
- chalk.cyan(cloudParams.join(', ')) +
278
- '\n\n' +
279
- chalk.gray('The ') +
280
- chalk.gray.bold('--local') +
281
- chalk.gray(' flag will be used (Docker deployment)') +
282
- '\n' +
283
- chalk.gray('Cloud parameters will be ignored\n'));
284
- }
285
- }
286
- //# sourceMappingURL=validation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../../../libs/sdk/create-app/src/utils/validation.ts"],"names":[],"mappings":"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"}