@dotcms/create-app 1.2.3 → 1.2.4-next.2

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