@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.
- package/README.md +156 -17
- package/package.json +2 -2
- package/src/api/index.d.ts +2 -2
- package/src/api/index.js +28 -3
- package/src/api/index.js.map +1 -1
- package/src/asks.d.ts +6 -1
- package/src/asks.js +56 -7
- package/src/asks.js.map +1 -1
- package/src/constants/index.d.ts +3 -1
- package/src/constants/index.js +7 -2
- package/src/constants/index.js.map +1 -1
- package/src/index.js +209 -126
- package/src/index.js.map +1 -1
- package/src/utils/index.d.ts +46 -1
- package/src/utils/index.js +264 -9
- package/src/utils/index.js.map +1 -1
- package/src/utils/validation.d.ts +47 -0
- package/src/utils/validation.js +295 -0
- package/src/utils/validation.js.map +1 -0
|
@@ -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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"}
|