@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
package/README.md
CHANGED
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
> 🚧 **Beta Notice:**
|
|
4
4
|
> This CLI is currently in **beta**. Features and APIs may change as we continue improving the tool.
|
|
5
5
|
|
|
6
|
-
With a single command, you can bootstrap a fully functional frontend (Next.js,
|
|
6
|
+
With a single command, you can bootstrap a fully functional frontend (Next.js, Angular, Astro, etc.) connected to dotCMS APIs — including the following:
|
|
7
7
|
|
|
8
|
-
- Spinning up dotCMS using
|
|
9
|
-
- Universal Visual Editor pre
|
|
10
|
-
- Generating site
|
|
8
|
+
- Spinning up dotCMS using Docker with intelligent pre-flight checks
|
|
9
|
+
- Universal Visual Editor pre-configured
|
|
10
|
+
- Generating site ID and authentication token (just copy paste them in frontend .env and enjoy)
|
|
11
|
+
- Comprehensive validation and helpful error messages
|
|
11
12
|
|
|
12
13
|
---
|
|
13
14
|
|
|
@@ -17,12 +18,13 @@ With a single command, you can bootstrap a fully functional frontend (Next.js,Vu
|
|
|
17
18
|
|
|
18
19
|
It automates the tedious work of:
|
|
19
20
|
|
|
20
|
-
- Setting up a framework
|
|
21
|
+
- Setting up a framework with best practices
|
|
21
22
|
- Connecting to dotCMS REST & GraphQL APIs
|
|
22
23
|
- Providing content-fetching helpers
|
|
23
24
|
- Adding example components & pages
|
|
24
25
|
- Creating environment variable templates
|
|
25
|
-
-
|
|
26
|
+
- Optionally setting up local dotCMS instance using Docker
|
|
27
|
+
- Validating your environment (Docker, ports, URLs)
|
|
26
28
|
|
|
27
29
|
This tool lets you focus on **building**, not configuring.
|
|
28
30
|
|
|
@@ -65,8 +67,12 @@ npx @dotcms/create-app <project-name>
|
|
|
65
67
|
This will:
|
|
66
68
|
|
|
67
69
|
- Ask for the target directory
|
|
68
|
-
- Ask which frontend framework you want (Next.js,Angular,
|
|
69
|
-
- Ask if you
|
|
70
|
+
- Ask which frontend framework you want (Next.js, Angular, Astro, etc.)
|
|
71
|
+
- Ask if you're using dotCMS Cloud or Local Docker dotCMS
|
|
72
|
+
- **For local Docker setup:**
|
|
73
|
+
- Check if Docker is installed and running
|
|
74
|
+
- Verify required ports are available (8082, 8443, 9200, 9600)
|
|
75
|
+
- Provide specific error messages and solutions if issues are found
|
|
70
76
|
- Automatically scaffold your project
|
|
71
77
|
- Configure UVE (Edit Mode Anywhere)
|
|
72
78
|
- Start dotCMS (if using Docker)
|
|
@@ -88,12 +94,145 @@ API Token : YOUR_API_TOKEN
|
|
|
88
94
|
create-dotcms-app <project-name> [options]
|
|
89
95
|
```
|
|
90
96
|
|
|
91
|
-
| Option | Description
|
|
92
|
-
|
|
93
|
-
| `-f, --framework <name>` | Skip prompts and directly choose a framework.
|
|
94
|
-
| `-d, --directory` | Project Directory
|
|
95
|
-
| `--local` | Use local dotCMS instance using docker
|
|
96
|
-
| `-u, --username` | dotCMS instance username (skip in case of local)
|
|
97
|
-
| `-p, --password` | dotCMS instance password (skip in case of local)
|
|
98
|
-
| `--url` | dotCMS instance
|
|
99
|
-
| `-V, --version` | Show CLI version
|
|
97
|
+
| Option | Description |
|
|
98
|
+
|--------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|
99
|
+
| `-f, --framework <name>` | Skip prompts and directly choose a framework. Supported: `nextjs`, `angular`, `angular-ssr`, `astro`. Case-insensitive. Aliases: `next`, `ng`, `next.js`, `angular-server` |
|
|
100
|
+
| `-d, --directory` | Project Directory |
|
|
101
|
+
| `--local` | Use local dotCMS instance using docker |
|
|
102
|
+
| `-u, --username` | dotCMS instance username (skip in case of local) |
|
|
103
|
+
| `-p, --password` | dotCMS instance password (skip in case of local) |
|
|
104
|
+
| `--url` | dotCMS instance URL (skip in case of local). Must include protocol (http:// or https://) |
|
|
105
|
+
| `-V, --version` | Show CLI version |
|
|
106
|
+
|
|
107
|
+
### Framework Aliases
|
|
108
|
+
|
|
109
|
+
For convenience, the CLI accepts common framework name variations (case-insensitive):
|
|
110
|
+
|
|
111
|
+
- `next`, `next.js`, `Next.js` → `nextjs`
|
|
112
|
+
- `ng`, `Angular` → `angular`
|
|
113
|
+
- `angular-server` → `angular-ssr`
|
|
114
|
+
- `angular-server` → `angular-ssr`
|
|
115
|
+
|
|
116
|
+
### URL Format
|
|
117
|
+
|
|
118
|
+
When using `--url`, make sure to include the full URL with protocol:
|
|
119
|
+
|
|
120
|
+
✅ **Valid:** `https://demo.dotcms.com`, `http://localhost:8082`
|
|
121
|
+
❌ **Invalid:** `demo.dotcms.com`, `localhost:8082` (missing protocol)
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 🛡️ Built-in Validation & Error Handling
|
|
126
|
+
|
|
127
|
+
The CLI includes comprehensive validation to help you avoid common setup issues:
|
|
128
|
+
|
|
129
|
+
### Input Validation
|
|
130
|
+
- **Project names:** Validates against filesystem limitations, reserved names, special characters, and path traversal
|
|
131
|
+
- **Framework names:** Supports aliases and case-insensitive matching
|
|
132
|
+
- **URLs:** Ensures proper protocol and format
|
|
133
|
+
- **Conflicting parameters:** Warns when mixing `--local` with cloud parameters
|
|
134
|
+
|
|
135
|
+
### Docker Environment Checks
|
|
136
|
+
When using local Docker setup, the CLI performs pre-flight checks:
|
|
137
|
+
|
|
138
|
+
1. **Docker Availability**
|
|
139
|
+
- Verifies Docker is installed and running
|
|
140
|
+
- Provides installation instructions if not found
|
|
141
|
+
- Direct link to Docker Desktop download
|
|
142
|
+
|
|
143
|
+
2. **Port Availability**
|
|
144
|
+
- Checks all required ports before starting containers
|
|
145
|
+
- Lists which specific ports are busy
|
|
146
|
+
- Provides platform-specific commands to identify blocking processes
|
|
147
|
+
- Suggests `docker compose down` to stop existing containers
|
|
148
|
+
|
|
149
|
+
3. **Container Health**
|
|
150
|
+
- Monitors dotCMS startup with intelligent retries
|
|
151
|
+
- Shows detailed diagnostics if startup fails
|
|
152
|
+
- Displays container status and recent logs
|
|
153
|
+
|
|
154
|
+
### Error Messages
|
|
155
|
+
All error messages include:
|
|
156
|
+
- **Clear problem description** - What went wrong
|
|
157
|
+
- **Specific suggestions** - How to fix it
|
|
158
|
+
- **Alternative solutions** - Other ways to proceed
|
|
159
|
+
- **Platform-specific commands** - Commands tailored to your OS
|
|
160
|
+
|
|
161
|
+
### Debug Mode
|
|
162
|
+
Run with `DEBUG=1` to see detailed stack traces:
|
|
163
|
+
```sh
|
|
164
|
+
DEBUG=1 npx @dotcms/create-app my-project
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 🔧 Troubleshooting
|
|
170
|
+
|
|
171
|
+
### Docker Issues
|
|
172
|
+
|
|
173
|
+
**"Docker is not available"**
|
|
174
|
+
- Ensure Docker Desktop is installed and running
|
|
175
|
+
- Check the Docker icon in your system tray
|
|
176
|
+
- Download from: https://www.docker.com/products/docker-desktop
|
|
177
|
+
|
|
178
|
+
**"Required ports are already in use"**
|
|
179
|
+
- Check what's using the ports:
|
|
180
|
+
- macOS/Linux: `lsof -i :8082`
|
|
181
|
+
- Windows: `netstat -ano | findstr ":8082"`
|
|
182
|
+
- Stop existing dotCMS containers: `docker compose down`
|
|
183
|
+
- Stop conflicting services or choose a different port mapping
|
|
184
|
+
|
|
185
|
+
**"dotCMS failed to start properly"**
|
|
186
|
+
- Check container logs: `docker logs <container-name>`
|
|
187
|
+
- Verify sufficient system resources (RAM, disk space)
|
|
188
|
+
- Review Docker diagnostics output from the CLI
|
|
189
|
+
|
|
190
|
+
### Validation Errors
|
|
191
|
+
|
|
192
|
+
**"Invalid project name"**
|
|
193
|
+
- Avoid special characters: `< > : " | ? *`
|
|
194
|
+
- Don't use Windows reserved names: `CON`, `PRN`, `AUX`, `NUL`, etc.
|
|
195
|
+
- Maximum 255 characters
|
|
196
|
+
- No path traversal patterns (`..`)
|
|
197
|
+
|
|
198
|
+
**"Invalid URL format"**
|
|
199
|
+
- Include protocol: `https://` or `http://`
|
|
200
|
+
- Verify hostname is correct
|
|
201
|
+
- For localhost, default port is 8082
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## 🚀 Examples
|
|
206
|
+
|
|
207
|
+
### Quick Start with Interactive Prompts
|
|
208
|
+
```sh
|
|
209
|
+
npx @dotcms/create-app my-blog
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### Using CLI Flags (Skip Prompts)
|
|
213
|
+
```sh
|
|
214
|
+
# Local Docker setup
|
|
215
|
+
npx @dotcms/create-app my-blog --framework nextjs --local
|
|
216
|
+
|
|
217
|
+
# Cloud instance
|
|
218
|
+
npx @dotcms/create-app my-blog \
|
|
219
|
+
--framework angular \
|
|
220
|
+
--url https://demo.dotcms.com \
|
|
221
|
+
--username admin@dotcms.com \
|
|
222
|
+
--password mypassword
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Debug Mode
|
|
226
|
+
```sh
|
|
227
|
+
DEBUG=1 npx @dotcms/create-app my-blog --framework nextjs --local
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## 🔒 Security Notes
|
|
233
|
+
|
|
234
|
+
- Never commit API tokens or passwords to version control
|
|
235
|
+
- The CLI validates all inputs to prevent injection attacks
|
|
236
|
+
- Project names are sanitized to prevent path traversal
|
|
237
|
+
- Shell commands are properly escaped for cross-platform safety
|
|
238
|
+
|
package/package.json
CHANGED
package/src/api/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Result } from 'ts-results';
|
|
2
|
-
import { FailedToGetDemoSiteIdentifierError,
|
|
2
|
+
import { FailedToGetDemoSiteIdentifierError, FailedToSetUpUVEConfig } from '../errors';
|
|
3
3
|
import type { DemoSiteResponse, GetUserTokenRequest, UVEConfigRequest } from '../types';
|
|
4
4
|
export declare class DotCMSApi {
|
|
5
5
|
private static defaultTokenApi;
|
|
@@ -9,7 +9,7 @@ export declare class DotCMSApi {
|
|
|
9
9
|
static getAuthToken({ payload, url }: {
|
|
10
10
|
payload: GetUserTokenRequest;
|
|
11
11
|
url?: string;
|
|
12
|
-
}): Promise<Result<string,
|
|
12
|
+
}): Promise<Result<string, string>>;
|
|
13
13
|
/** Get demo site identifier */
|
|
14
14
|
static getDemoSiteIdentifier({ siteName, authenticationToken, url }: {
|
|
15
15
|
siteName: string;
|
package/src/api/index.js
CHANGED
|
@@ -3,20 +3,45 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.DotCMSApi = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const axios_1 = tslib_1.__importDefault(require("axios"));
|
|
6
|
+
const chalk_1 = tslib_1.__importDefault(require("chalk"));
|
|
6
7
|
const ts_results_1 = require("ts-results");
|
|
7
8
|
const constants_1 = require("../constants");
|
|
8
9
|
const errors_1 = require("../errors");
|
|
9
10
|
class DotCMSApi {
|
|
10
11
|
/** Get authentication token */
|
|
11
12
|
static async getAuthToken({ payload, url }) {
|
|
13
|
+
const endpoint = url || this.defaultTokenApi;
|
|
12
14
|
try {
|
|
13
|
-
const endpoint = url || this.defaultTokenApi;
|
|
14
15
|
const res = await axios_1.default.post(endpoint, payload);
|
|
15
16
|
return (0, ts_results_1.Ok)(res.data.entity.token);
|
|
16
17
|
}
|
|
17
18
|
catch (err) {
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
// Provide specific error messages based on error type
|
|
20
|
+
if (axios_1.default.isAxiosError(err)) {
|
|
21
|
+
if (err.response?.status === 401) {
|
|
22
|
+
return (0, ts_results_1.Err)(chalk_1.default.red('\n❌ Authentication failed\n\n') +
|
|
23
|
+
chalk_1.default.white('Invalid username or password.\n\n') +
|
|
24
|
+
chalk_1.default.yellow('Please check your credentials and try again:\n') +
|
|
25
|
+
chalk_1.default.white(' • Verify your username is correct\n') +
|
|
26
|
+
chalk_1.default.white(' • Ensure your password is correct\n') +
|
|
27
|
+
chalk_1.default.white(' • Check if your account is active\n'));
|
|
28
|
+
}
|
|
29
|
+
else if (err.code === 'ECONNREFUSED') {
|
|
30
|
+
return (0, ts_results_1.Err)(chalk_1.default.red('\n❌ Connection refused\n\n') +
|
|
31
|
+
chalk_1.default.white(`Could not connect to dotCMS at: ${endpoint}\n\n`) +
|
|
32
|
+
chalk_1.default.yellow('Please verify:\n') +
|
|
33
|
+
chalk_1.default.white(' • The URL is correct\n') +
|
|
34
|
+
chalk_1.default.white(' • The dotCMS instance is running\n') +
|
|
35
|
+
chalk_1.default.white(' • There are no firewall issues\n'));
|
|
36
|
+
}
|
|
37
|
+
else if (err.response) {
|
|
38
|
+
return (0, ts_results_1.Err)(chalk_1.default.red(`\n❌ Server error (${err.response.status})\n\n`) +
|
|
39
|
+
chalk_1.default.white('The dotCMS server returned an error.\n') +
|
|
40
|
+
chalk_1.default.gray(`Details: ${err.response.statusText || 'Unknown error'}\n`));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return (0, ts_results_1.Err)(chalk_1.default.red('\n❌ Failed to get authentication token\n\n') +
|
|
44
|
+
chalk_1.default.gray(err instanceof Error ? err.message : String(err)));
|
|
20
45
|
}
|
|
21
46
|
}
|
|
22
47
|
/** Get demo site identifier */
|
package/src/api/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/sdk/create-app/src/api/index.ts"],"names":[],"mappings":";;;;AAAA,0DAA0B;AAC1B,2CAAkD;AAElD,4CAAyF;AACzF,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/sdk/create-app/src/api/index.ts"],"names":[],"mappings":"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"}
|
package/src/asks.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export declare function askDotcmsCloudUrl(): Promise<any>;
|
|
|
20
20
|
*/
|
|
21
21
|
export declare function askUserNameForDotcmsCloud(): Promise<any>;
|
|
22
22
|
/**
|
|
23
|
-
* Ask user the
|
|
23
|
+
* Ask user the password of the dotCMS instance
|
|
24
24
|
*/
|
|
25
25
|
export declare function askPasswordForDotcmsCloud(): Promise<any>;
|
|
26
26
|
/**
|
|
@@ -38,5 +38,10 @@ export declare function askCloudOrLocalInstance(): Promise<boolean>;
|
|
|
38
38
|
* user enters: "."
|
|
39
39
|
* projectName: "my-app"
|
|
40
40
|
* final path becomes "./my-app"
|
|
41
|
+
*
|
|
42
|
+
* @remarks
|
|
43
|
+
* - Prevents nested directories when basePath already ends with projectName
|
|
44
|
+
* - Example: basePath="/tmp/my-app" + projectName="my-app" → "/tmp/my-app" (not "/tmp/my-app/my-app")
|
|
45
|
+
* - Handles both absolute and relative paths correctly
|
|
41
46
|
*/
|
|
42
47
|
export declare function prepareDirectory(basePath: string, projectName: string): Promise<string>;
|
package/src/asks.js
CHANGED
|
@@ -13,6 +13,7 @@ const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
|
|
|
13
13
|
const inquirer_1 = tslib_1.__importDefault(require("inquirer"));
|
|
14
14
|
const path_1 = tslib_1.__importDefault(require("path"));
|
|
15
15
|
const constants_1 = require("./constants");
|
|
16
|
+
const validation_1 = require("./utils/validation");
|
|
16
17
|
/**
|
|
17
18
|
* Ask interactively if framework not specified
|
|
18
19
|
*/
|
|
@@ -37,7 +38,16 @@ async function askProjectName() {
|
|
|
37
38
|
type: 'input',
|
|
38
39
|
name: 'projectName',
|
|
39
40
|
message: 'What is your project name ?',
|
|
40
|
-
default: `my-dotcms-app
|
|
41
|
+
default: `my-dotcms-app`,
|
|
42
|
+
validate: (input) => {
|
|
43
|
+
try {
|
|
44
|
+
(0, validation_1.validateProjectName)(input);
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return error instanceof Error ? error.message : String(error);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
41
51
|
}
|
|
42
52
|
]);
|
|
43
53
|
return ans.projectName;
|
|
@@ -65,7 +75,16 @@ async function askDotcmsCloudUrl() {
|
|
|
65
75
|
type: 'input',
|
|
66
76
|
name: 'url',
|
|
67
77
|
message: 'dotCMS instance URL:',
|
|
68
|
-
default: `https://demo.dotcms.com
|
|
78
|
+
default: `https://demo.dotcms.com`,
|
|
79
|
+
validate: (input) => {
|
|
80
|
+
try {
|
|
81
|
+
(0, validation_1.validateUrl)(input);
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
return error instanceof Error ? error.message : String(error);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
69
88
|
}
|
|
70
89
|
]);
|
|
71
90
|
return ans.url;
|
|
@@ -79,13 +98,19 @@ async function askUserNameForDotcmsCloud() {
|
|
|
79
98
|
type: 'input',
|
|
80
99
|
name: 'username',
|
|
81
100
|
message: 'Username:',
|
|
82
|
-
default: `admin@dotcms.com
|
|
101
|
+
default: `admin@dotcms.com`,
|
|
102
|
+
validate: (input) => {
|
|
103
|
+
if (!input || input.trim() === '') {
|
|
104
|
+
return 'Username cannot be empty';
|
|
105
|
+
}
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
83
108
|
}
|
|
84
109
|
]);
|
|
85
110
|
return ans.username;
|
|
86
111
|
}
|
|
87
112
|
/**
|
|
88
|
-
* Ask user the
|
|
113
|
+
* Ask user the password of the dotCMS instance
|
|
89
114
|
*/
|
|
90
115
|
async function askPasswordForDotcmsCloud() {
|
|
91
116
|
const ans = await inquirer_1.default.prompt([
|
|
@@ -94,7 +119,13 @@ async function askPasswordForDotcmsCloud() {
|
|
|
94
119
|
name: 'password',
|
|
95
120
|
mask: '•',
|
|
96
121
|
message: 'Password:',
|
|
97
|
-
default: `admin
|
|
122
|
+
default: `admin`,
|
|
123
|
+
validate: (input) => {
|
|
124
|
+
if (!input || input.trim() === '') {
|
|
125
|
+
return 'Password cannot be empty';
|
|
126
|
+
}
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
98
129
|
}
|
|
99
130
|
]);
|
|
100
131
|
return ans.password;
|
|
@@ -124,7 +155,7 @@ async function askCloudOrLocalInstance() {
|
|
|
124
155
|
{
|
|
125
156
|
type: 'select',
|
|
126
157
|
name: 'isCloud',
|
|
127
|
-
message: 'Do you have an
|
|
158
|
+
message: 'Do you have an existing dotCMS instance?',
|
|
128
159
|
choices: [
|
|
129
160
|
{ name: 'Yes - I have a dotCMS instance URL', value: true },
|
|
130
161
|
{ name: 'No - Spin up dotCMS locally with Docker', value: false }
|
|
@@ -140,9 +171,27 @@ async function askCloudOrLocalInstance() {
|
|
|
140
171
|
* user enters: "."
|
|
141
172
|
* projectName: "my-app"
|
|
142
173
|
* final path becomes "./my-app"
|
|
174
|
+
*
|
|
175
|
+
* @remarks
|
|
176
|
+
* - Prevents nested directories when basePath already ends with projectName
|
|
177
|
+
* - Example: basePath="/tmp/my-app" + projectName="my-app" → "/tmp/my-app" (not "/tmp/my-app/my-app")
|
|
178
|
+
* - Handles both absolute and relative paths correctly
|
|
143
179
|
*/
|
|
144
180
|
async function prepareDirectory(basePath, projectName) {
|
|
145
|
-
|
|
181
|
+
// Resolve basePath to absolute path for consistent comparison
|
|
182
|
+
const resolvedBasePath = path_1.default.resolve(basePath);
|
|
183
|
+
const basePathDirName = path_1.default.basename(resolvedBasePath);
|
|
184
|
+
// Check if basePath already ends with the project name
|
|
185
|
+
// This prevents nested directories like "/tmp/my-app/my-app"
|
|
186
|
+
let targetPath;
|
|
187
|
+
if (basePathDirName === projectName) {
|
|
188
|
+
// User specified full path including project name (e.g., "-d /tmp/my-app" with projectName="my-app")
|
|
189
|
+
targetPath = resolvedBasePath;
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
// User specified parent directory (e.g., "-d /tmp" with projectName="my-app")
|
|
193
|
+
targetPath = path_1.default.resolve(resolvedBasePath, projectName);
|
|
194
|
+
}
|
|
146
195
|
// If path doesn't exist → create
|
|
147
196
|
if (!fs_extra_1.default.existsSync(targetPath)) {
|
|
148
197
|
fs_extra_1.default.mkdirSync(targetPath, { recursive: true });
|
package/src/asks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asks.js","sourceRoot":"","sources":["../../../../../libs/sdk/create-app/src/asks.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"asks.js","sourceRoot":"","sources":["../../../../../libs/sdk/create-app/src/asks.ts"],"names":[],"mappings":"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"}
|
package/src/constants/index.d.ts
CHANGED
|
@@ -4,10 +4,12 @@ export declare const DOTCMS_USER: {
|
|
|
4
4
|
username: string;
|
|
5
5
|
password: string;
|
|
6
6
|
};
|
|
7
|
-
export declare const DOTCMS_HEALTH_API = "http://localhost:8082/api/v1/
|
|
7
|
+
export declare const DOTCMS_HEALTH_API = "http://localhost:8082/api/v1/appconfiguration";
|
|
8
8
|
export declare const DOTCMS_TOKEN_API = "http://localhost:8082/api/v1/authentication/api-token";
|
|
9
9
|
export declare const DOTCMS_EMA_CONFIG_API = "http://localhost:8082/api/v1/apps/dotema-config-v2/";
|
|
10
10
|
export declare const DOTCMS_DEMO_SITE = "http://localhost:8082/api/v1/site/";
|
|
11
|
+
export declare const CLOUD_HEALTH_CHECK_RETRIES = 5;
|
|
12
|
+
export declare const LOCAL_HEALTH_CHECK_RETRIES = 60;
|
|
11
13
|
export declare const FRAMEWORKS: SupportedFrontEndFrameworks[];
|
|
12
14
|
export declare const FRAMEWORKS_CHOICES: FrameworkChoices[];
|
|
13
15
|
export declare const NEXTJS_DEPENDENCIES: string[];
|
package/src/constants/index.js
CHANGED
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ANGULAR_SSR_DEPENDENCIES_DEV = exports.ANGULAR_SSR_DEPENDENCIES = exports.ANGULAR_DEPENDENCIES_DEV = exports.ANGULAR_DEPENDENCIES = exports.ASTRO_DEPENDENCIES_DEV = exports.ASTRO_DEPENDENCIES = exports.NEXTJS_DEPENDENCIES_DEV = exports.NEXTJS_DEPENDENCIES = exports.FRAMEWORKS_CHOICES = exports.FRAMEWORKS = exports.DOTCMS_DEMO_SITE = exports.DOTCMS_EMA_CONFIG_API = exports.DOTCMS_TOKEN_API = exports.DOTCMS_HEALTH_API = exports.DOTCMS_USER = exports.DOTCMS_HOST = void 0;
|
|
3
|
+
exports.ANGULAR_SSR_DEPENDENCIES_DEV = exports.ANGULAR_SSR_DEPENDENCIES = exports.ANGULAR_DEPENDENCIES_DEV = exports.ANGULAR_DEPENDENCIES = exports.ASTRO_DEPENDENCIES_DEV = exports.ASTRO_DEPENDENCIES = exports.NEXTJS_DEPENDENCIES_DEV = exports.NEXTJS_DEPENDENCIES = exports.FRAMEWORKS_CHOICES = exports.FRAMEWORKS = exports.LOCAL_HEALTH_CHECK_RETRIES = exports.CLOUD_HEALTH_CHECK_RETRIES = exports.DOTCMS_DEMO_SITE = exports.DOTCMS_EMA_CONFIG_API = exports.DOTCMS_TOKEN_API = exports.DOTCMS_HEALTH_API = exports.DOTCMS_USER = exports.DOTCMS_HOST = void 0;
|
|
4
4
|
exports.DOTCMS_HOST = 'http://localhost:8082';
|
|
5
5
|
exports.DOTCMS_USER = {
|
|
6
6
|
username: 'admin@dotcms.com',
|
|
7
7
|
password: 'admin'
|
|
8
8
|
};
|
|
9
9
|
// USED APIS
|
|
10
|
-
|
|
10
|
+
// Note: Using /appconfiguration instead of /probes/alive because the probe endpoints
|
|
11
|
+
// have IP ACL restrictions that block requests from Docker host. See GitHub issue #34509
|
|
12
|
+
exports.DOTCMS_HEALTH_API = `${exports.DOTCMS_HOST}/api/v1/appconfiguration`;
|
|
11
13
|
exports.DOTCMS_TOKEN_API = `${exports.DOTCMS_HOST}/api/v1/authentication/api-token`;
|
|
12
14
|
exports.DOTCMS_EMA_CONFIG_API = `${exports.DOTCMS_HOST}/api/v1/apps/dotema-config-v2/`;
|
|
13
15
|
exports.DOTCMS_DEMO_SITE = `${exports.DOTCMS_HOST}/api/v1/site/`;
|
|
16
|
+
// Health check configuration
|
|
17
|
+
exports.CLOUD_HEALTH_CHECK_RETRIES = 5; // Retries for cloud instances (faster expected startup)
|
|
18
|
+
exports.LOCAL_HEALTH_CHECK_RETRIES = 60; // Retries for local Docker (slower startup)
|
|
14
19
|
// App constants
|
|
15
20
|
exports.FRAMEWORKS = [
|
|
16
21
|
'nextjs',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/sdk/create-app/src/constants/index.ts"],"names":[],"mappings":";;;AAEa,QAAA,WAAW,GAAG,uBAAuB,CAAC;AACtC,QAAA,WAAW,GAAG;IACvB,QAAQ,EAAE,kBAAkB;IAC5B,QAAQ,EAAE,OAAO;CACpB,CAAC;AAEF,YAAY;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/sdk/create-app/src/constants/index.ts"],"names":[],"mappings":";;;AAEa,QAAA,WAAW,GAAG,uBAAuB,CAAC;AACtC,QAAA,WAAW,GAAG;IACvB,QAAQ,EAAE,kBAAkB;IAC5B,QAAQ,EAAE,OAAO;CACpB,CAAC;AAEF,YAAY;AACZ,qFAAqF;AACrF,yFAAyF;AAC5E,QAAA,iBAAiB,GAAG,GAAG,mBAAW,0BAA0B,CAAC;AAC7D,QAAA,gBAAgB,GAAG,GAAG,mBAAW,kCAAkC,CAAC;AACpE,QAAA,qBAAqB,GAAG,GAAG,mBAAW,gCAAgC,CAAC;AACvE,QAAA,gBAAgB,GAAG,GAAG,mBAAW,eAAe,CAAC;AAE9D,6BAA6B;AAChB,QAAA,0BAA0B,GAAG,CAAC,CAAC,CAAC,wDAAwD;AACxF,QAAA,0BAA0B,GAAG,EAAE,CAAC,CAAC,4CAA4C;AAE1F,gBAAgB;AACH,QAAA,UAAU,GAAkC;IACrD,QAAQ;IACR,OAAO;IACP,SAAS;IACT,aAAa;CAChB,CAAC;AAEW,QAAA,kBAAkB,GAAuB;IAClD,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE;IACpC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;IACjC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;IACrC,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,EAAE;CAClD,CAAC;AAEW,QAAA,mBAAmB,GAAa;IACzC,gBAAgB;IAChB,qBAAqB;IACrB,eAAe;IACf,eAAe;IACf,aAAa;IACb,wBAAwB;IACxB,MAAM;IACN,OAAO;IACP,WAAW;CACd,CAAC;AAEW,QAAA,uBAAuB,GAAa;IAC7C,sBAAsB;IACtB,yBAAyB;IACzB,QAAQ;IACR,oBAAoB;IACpB,SAAS;IACT,UAAU;IACV,aAAa;CAChB,CAAC;AAEW,QAAA,kBAAkB,GAAa;IACxC,gBAAgB;IAChB,gBAAgB;IAChB,oBAAoB;IACpB,iBAAiB;IACjB,gBAAgB;IAChB,eAAe;IACf,eAAe;IACf,aAAa;IACb,yBAAyB;IACzB,mBAAmB;IACnB,wBAAwB;IACxB,cAAc;IACd,kBAAkB;IAClB,OAAO;IACP,QAAQ;IACR,OAAO;IACP,WAAW;IACX,aAAa;IACb,YAAY;CACf,CAAC;AAEW,QAAA,sBAAsB,GAAa;IAC5C,aAAa;IACb,UAAU;IACV,uBAAuB;CAC1B,CAAC;AAEW,QAAA,oBAAoB,GAAa;IAC1C,qBAAqB;IACrB,iBAAiB;IACjB,mBAAmB;IACnB,eAAe;IACf,gBAAgB;IAChB,2BAA2B;IAC3B,mCAAmC;IACnC,iBAAiB;IACjB,iBAAiB;IACjB,gBAAgB;IAChB,eAAe;IACf,aAAa;IACb,MAAM;IACN,OAAO;IACP,SAAS;CACZ,CAAC;AAEW,QAAA,wBAAwB,GAAa;IAC9C,gBAAgB;IAChB,cAAc;IACd,uBAAuB;IACvB,yBAAyB;IACzB,gBAAgB;IAChB,cAAc;IACd,cAAc;IACd,OAAO;IACP,uBAAuB;IACvB,gBAAgB;IAChB,eAAe;IACf,6BAA6B;IAC7B,SAAS;IACT,aAAa;IACb,YAAY;CACf,CAAC;AAEW,QAAA,wBAAwB,GAAa;IAC9C,iBAAiB;IACjB,mBAAmB;IACnB,eAAe;IACf,gBAAgB;IAChB,2BAA2B;IAC3B,0BAA0B;IAC1B,iBAAiB;IACjB,cAAc;IACd,iBAAiB;IACjB,gBAAgB;IAChB,eAAe;IACf,aAAa;IACb,sBAAsB;IACtB,eAAe;IACf,QAAQ;IACR,SAAS;IACT,SAAS;IACT,MAAM;IACN,aAAa;IACb,OAAO;IACP,SAAS;CACZ,CAAC;AAEW,QAAA,4BAA4B,GAAa;IAClD,gBAAgB;IAChB,cAAc;IACd,uBAAuB;IACvB,yBAAyB;IACzB,gBAAgB;IAChB,gBAAgB;IAChB,aAAa;IACb,cAAc;IACd,OAAO;IACP,uBAAuB;IACvB,gBAAgB;IAChB,eAAe;IACf,6BAA6B;IAC7B,YAAY;CACf,CAAC"}
|