@dotcms/create-app 0.0.4

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 ADDED
@@ -0,0 +1,99 @@
1
+ # πŸš€ create-dotcms-app
2
+
3
+ > 🚧 **Beta Notice:**
4
+ > This CLI is currently in **beta**. Features and APIs may change as we continue improving the tool.
5
+
6
+ With a single command, you can bootstrap a fully functional frontend (Next.js,Vue,Angular, etc.) connected to dotCMS APIs β€” including the following:
7
+
8
+ - Spinning up dotCMS using docker
9
+ - Universal Visual Editor pre configured
10
+ - Generating site id and authentication token (just copy paste them in frontend .env and enjoy).
11
+
12
+ ---
13
+
14
+ ## ✨ What is `create-dotcms-app`?
15
+
16
+ `create-dotcms-app` is a command-line tool that helps developers quickly spin up headless frontends powered by **dotCMS**.
17
+
18
+ It automates the tedious work of:
19
+
20
+ - Setting up a framework
21
+ - Connecting to dotCMS REST & GraphQL APIs
22
+ - Providing content-fetching helpers
23
+ - Adding example components & pages
24
+ - Creating environment variable templates
25
+ - Optional Setting up local dotCMS instance using docker.
26
+
27
+ This tool lets you focus on **building**, not configuring.
28
+
29
+ ---
30
+
31
+ ## 🎯 Why this project exists
32
+
33
+ dotCMS is a hybrid headless CMS with powerful APIs β€” but initializing a frontend manually takes time.
34
+
35
+ This CLI solves that by offering:
36
+
37
+ - **Frictionless onboarding**
38
+ - **Standardized project setup**
39
+ - **Fast prototyping & demos**
40
+ - **DevRel-friendly scaffolding for workshops & tutorials**
41
+ - **Production-ready integration patterns**
42
+
43
+ ---
44
+
45
+ ## πŸ› οΈ Installation
46
+
47
+ Run using npx (recommended):
48
+
49
+ ```sh
50
+ npx @dotcms/create-app <project-name>
51
+ ```
52
+
53
+ Or install cli globally
54
+
55
+ ```sh
56
+ npm install -g @dotcms/create-app
57
+ ```
58
+
59
+ ## Usage
60
+
61
+ ```sh
62
+ npx @dotcms/create-app <project-name>
63
+ ```
64
+
65
+ This will:
66
+
67
+ - Ask for the target directory
68
+ - Ask which frontend framework you want (Next.js,Angular,Vue, etc.)
69
+ - Ask if you’re using dotCMS Cloud or Local Docker dotCMS
70
+ - Automatically scaffold your project
71
+ - Configure UVE (Edit Mode Anywhere)
72
+ - Start dotCMS (if using Docker)
73
+ - Print required environment variables for your frontend
74
+
75
+ ## Env variables
76
+
77
+ You will get the following env variables generated by cli **just copy and replace them in the frontend of the env and enjoy dotCMS in headless mode**.
78
+
79
+ ```sh
80
+ Host (site) : http://localhost:8082
81
+ Site ID : 59bb8831-6706-4589-9ca0-ff74016e02b2
82
+ API Token : YOUR_API_TOKEN
83
+ ```
84
+
85
+ ## CLI Syntax
86
+
87
+ ```sh
88
+ create-dotcms-app <project-name> [options]
89
+ ```
90
+
91
+ | Option | Description |
92
+ |--------------------------|-----------------------------------------------------------------------------------------------------------------|
93
+ | `-f, --framework <name>` | Skip prompts and directly choose a framework. Must be one of: `nextjs`, `angular`, `angular-ssr`, `astro`, etc. |
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 url (skip in case of local) |
99
+ | `-V, --version` | Show CLI version |
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@dotcms/create-app",
3
+ "version": "0.0.4",
4
+ "type": "commonjs",
5
+ "main": "./src/index.js",
6
+ "types": "./src/index.d.ts",
7
+ "bin": {
8
+ "create-dotcms-app": "./src/index.js"
9
+ },
10
+ "files": [
11
+ "src",
12
+ "README.md"
13
+ ],
14
+ "dependencies": {
15
+ "axios": "^1.13.2",
16
+ "chalk": "^5.6.2",
17
+ "commander": "^14.0.2",
18
+ "execa": "^9.6.0",
19
+ "fs-extra": "^11.3.2",
20
+ "inquirer": "^13.0.1",
21
+ "ora": "^9.0.0",
22
+ "ts-results": "^3.3.0",
23
+ "tslib": "^2.3.0"
24
+ }
25
+ }
@@ -0,0 +1,26 @@
1
+ import { type Result } from 'ts-results';
2
+ import { FailedToGetDemoSiteIdentifierError, FailedToGetDotcmsTokenError, FailedToSetUpUVEConfig } from '../errors';
3
+ import type { DemoSiteResponse, GetUserTokenRequest, UVEConfigRequest } from '../types';
4
+ export declare class DotCMSApi {
5
+ private static defaultTokenApi;
6
+ private static defaultDemoSiteApi;
7
+ private static defaultUveConfigApi;
8
+ /** Get authentication token */
9
+ static getAuthToken({ payload, url }: {
10
+ payload: GetUserTokenRequest;
11
+ url?: string;
12
+ }): Promise<Result<string, FailedToGetDotcmsTokenError>>;
13
+ /** Get demo site identifier */
14
+ static getDemoSiteIdentifier({ siteName, authenticationToken, url }: {
15
+ siteName: string;
16
+ authenticationToken: string;
17
+ url?: string;
18
+ }): Promise<Result<DemoSiteResponse, FailedToGetDemoSiteIdentifierError>>;
19
+ /** Setup UVE Config */
20
+ static setupUVEConfig({ payload, siteId, authenticationToken, url }: {
21
+ payload: UVEConfigRequest;
22
+ siteId: string;
23
+ authenticationToken: string;
24
+ url?: string;
25
+ }): Promise<Result<'Ok', FailedToSetUpUVEConfig>>;
26
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DotCMSApi = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const axios_1 = tslib_1.__importDefault(require("axios"));
6
+ const ts_results_1 = require("ts-results");
7
+ const constants_1 = require("../constants");
8
+ const errors_1 = require("../errors");
9
+ class DotCMSApi {
10
+ /** Get authentication token */
11
+ static async getAuthToken({ payload, url }) {
12
+ try {
13
+ const endpoint = url || this.defaultTokenApi;
14
+ const res = await axios_1.default.post(endpoint, payload);
15
+ return (0, ts_results_1.Ok)(res.data.entity.token);
16
+ }
17
+ catch (err) {
18
+ console.error('dotCMS failed to get token' + JSON.stringify(err));
19
+ return (0, ts_results_1.Err)(new errors_1.FailedToGetDotcmsTokenError());
20
+ }
21
+ }
22
+ /** Get demo site identifier */
23
+ static async getDemoSiteIdentifier({ siteName, authenticationToken, url }) {
24
+ try {
25
+ const endpoint = (url || this.defaultDemoSiteApi) + siteName;
26
+ const res = await axios_1.default.get(endpoint, {
27
+ headers: { Authorization: `Bearer ${authenticationToken}` }
28
+ });
29
+ return (0, ts_results_1.Ok)(res.data);
30
+ }
31
+ catch (err) {
32
+ console.error('failed to get demo site identifier : ' + JSON.stringify(err));
33
+ return (0, ts_results_1.Err)(new errors_1.FailedToGetDemoSiteIdentifierError());
34
+ }
35
+ }
36
+ /** Setup UVE Config */
37
+ static async setupUVEConfig({ payload, siteId, authenticationToken, url }) {
38
+ try {
39
+ const endpoint = (url || this.defaultUveConfigApi) + siteId;
40
+ const res = await axios_1.default.post(endpoint, payload, {
41
+ headers: { Authorization: `Bearer ${authenticationToken}` }
42
+ });
43
+ return (0, ts_results_1.Ok)(res.data.entity);
44
+ }
45
+ catch (err) {
46
+ console.error('failed to setup UVE config' + JSON.stringify(err));
47
+ return (0, ts_results_1.Err)(new errors_1.FailedToSetUpUVEConfig());
48
+ }
49
+ }
50
+ }
51
+ exports.DotCMSApi = DotCMSApi;
52
+ DotCMSApi.defaultTokenApi = constants_1.DOTCMS_TOKEN_API;
53
+ DotCMSApi.defaultDemoSiteApi = constants_1.DOTCMS_DEMO_SITE;
54
+ DotCMSApi.defaultUveConfigApi = constants_1.DOTCMS_EMA_CONFIG_API;
55
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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,sCAImB;AASnB,MAAa,SAAS;IAKlB,+BAA+B;IAC/B,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,EACtB,OAAO,EACP,GAAG,EAIN;QACG,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAI,CAAC,eAAe,CAAC;YAC7C,MAAM,GAAG,GAAG,MAAM,eAAK,CAAC,IAAI,CAAuB,QAAQ,EAAE,OAAO,CAAC,CAAC;YACtE,OAAO,IAAA,eAAE,EAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,4BAA4B,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAClE,OAAO,IAAA,gBAAG,EAAC,IAAI,oCAA2B,EAAE,CAAC,CAAC;QAClD,CAAC;IACL,CAAC;IAED,+BAA+B;IAC/B,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAC/B,QAAQ,EACR,mBAAmB,EACnB,GAAG,EAKN;QACG,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,QAAQ,CAAC;YAC7D,MAAM,GAAG,GAAG,MAAM,eAAK,CAAC,GAAG,CAAmB,QAAQ,EAAE;gBACpD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,mBAAmB,EAAE,EAAE;aAC9D,CAAC,CAAC;YACH,OAAO,IAAA,eAAE,EAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,uCAAuC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7E,OAAO,IAAA,gBAAG,EAAC,IAAI,2CAAkC,EAAE,CAAC,CAAC;QACzD,CAAC;IACL,CAAC;IAED,uBAAuB;IACvB,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,EACxB,OAAO,EACP,MAAM,EACN,mBAAmB,EACnB,GAAG,EAMN;QACG,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,mBAAmB,CAAC,GAAG,MAAM,CAAC;YAC5D,MAAM,GAAG,GAAG,MAAM,eAAK,CAAC,IAAI,CAAoB,QAAQ,EAAE,OAAO,EAAE;gBAC/D,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,mBAAmB,EAAE,EAAE;aAC9D,CAAC,CAAC;YACH,OAAO,IAAA,eAAE,EAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,4BAA4B,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAClE,OAAO,IAAA,gBAAG,EAAC,IAAI,+BAAsB,EAAE,CAAC,CAAC;QAC7C,CAAC;IACL,CAAC;;AAnEL,8BAoEC;AAnEkB,yBAAe,GAAG,4BAAgB,CAAC;AACnC,4BAAkB,GAAG,4BAAgB,CAAC;AACtC,6BAAmB,GAAG,iCAAqB,CAAC"}
package/src/asks.d.ts ADDED
@@ -0,0 +1,35 @@
1
+ import type { SupportedFrontEndFrameworks } from './types';
2
+ /**
3
+ * Ask interactively if framework not specified
4
+ */
5
+ export declare function askFramework(): Promise<SupportedFrontEndFrameworks>;
6
+ /**
7
+ * Ask user where to create the project
8
+ */
9
+ export declare function askDirectory(): Promise<any>;
10
+ /**
11
+ * Ask user the url of the dotCMS instance
12
+ */
13
+ export declare function askDotcmsCloudUrl(): Promise<any>;
14
+ /**
15
+ * Ask user the username of the dotCMS instance
16
+ */
17
+ export declare function askUserNameForDotcmsCloud(): Promise<any>;
18
+ /**
19
+ * Ask user the username of the dotCMS instance
20
+ */
21
+ export declare function askPasswordForDotcmsCloud(): Promise<any>;
22
+ /**
23
+ * Ask if the user wants to use cloud instance or local dotcms
24
+ * Example:
25
+ * user enters: "y/n"
26
+ */
27
+ export declare function askCloudOrLocalInstance(): Promise<boolean>;
28
+ /**
29
+ * Prepare final project directory
30
+ * Example:
31
+ * user enters: "."
32
+ * projectName: "my-app"
33
+ * final path becomes "./my-app"
34
+ */
35
+ export declare function prepareDirectory(basePath: string, projectName: string): Promise<string>;
package/src/asks.js ADDED
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.askFramework = askFramework;
4
+ exports.askDirectory = askDirectory;
5
+ exports.askDotcmsCloudUrl = askDotcmsCloudUrl;
6
+ exports.askUserNameForDotcmsCloud = askUserNameForDotcmsCloud;
7
+ exports.askPasswordForDotcmsCloud = askPasswordForDotcmsCloud;
8
+ exports.askCloudOrLocalInstance = askCloudOrLocalInstance;
9
+ exports.prepareDirectory = prepareDirectory;
10
+ const tslib_1 = require("tslib");
11
+ const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
12
+ const inquirer_1 = tslib_1.__importDefault(require("inquirer"));
13
+ const path_1 = tslib_1.__importDefault(require("path"));
14
+ const constants_1 = require("./constants");
15
+ /**
16
+ * Ask interactively if framework not specified
17
+ */
18
+ async function askFramework() {
19
+ const ans = await inquirer_1.default.prompt([
20
+ {
21
+ type: 'checkbox',
22
+ name: 'frameworks',
23
+ message: 'Select the frontend framework:',
24
+ choices: constants_1.FRAMEWORKS_CHOICES,
25
+ validate(selected) {
26
+ if (selected.length === 0)
27
+ return 'Please select at least one framework.';
28
+ return true;
29
+ }
30
+ }
31
+ ]);
32
+ // Return the first selected framework (checkbox returns array)
33
+ return ans.frameworks[0];
34
+ }
35
+ /**
36
+ * Ask user where to create the project
37
+ */
38
+ async function askDirectory() {
39
+ const ans = await inquirer_1.default.prompt([
40
+ {
41
+ type: 'input',
42
+ name: 'directory',
43
+ message: 'Project directory:',
44
+ default: `.`
45
+ }
46
+ ]);
47
+ return ans.directory;
48
+ }
49
+ /**
50
+ * Ask user the url of the dotCMS instance
51
+ */
52
+ async function askDotcmsCloudUrl() {
53
+ const ans = await inquirer_1.default.prompt([
54
+ {
55
+ type: 'input',
56
+ name: 'url',
57
+ message: 'DotCMS instance URL:',
58
+ default: `https://demo.dotcms.com`
59
+ }
60
+ ]);
61
+ return ans.url;
62
+ }
63
+ /**
64
+ * Ask user the username of the dotCMS instance
65
+ */
66
+ async function askUserNameForDotcmsCloud() {
67
+ const ans = await inquirer_1.default.prompt([
68
+ {
69
+ type: 'input',
70
+ name: 'username',
71
+ message: 'Username:',
72
+ default: `admin@dotcms.com`
73
+ }
74
+ ]);
75
+ return ans.username;
76
+ }
77
+ /**
78
+ * Ask user the username of the dotCMS instance
79
+ */
80
+ async function askPasswordForDotcmsCloud() {
81
+ const ans = await inquirer_1.default.prompt([
82
+ {
83
+ type: 'input',
84
+ name: 'password',
85
+ message: 'Password:',
86
+ default: `admin`
87
+ }
88
+ ]);
89
+ return ans.password;
90
+ }
91
+ /**
92
+ * Ask if the user wants to use cloud instance or local dotcms
93
+ * Example:
94
+ * user enters: "y/n"
95
+ */
96
+ async function askCloudOrLocalInstance() {
97
+ const ans = await inquirer_1.default.prompt([
98
+ {
99
+ type: 'confirm',
100
+ name: 'confirm',
101
+ message: `Running dotCMS in the cloud? If not, no worries β€” select No to spin up dotCMS using Docker.`,
102
+ default: false
103
+ }
104
+ ]);
105
+ return ans.confirm;
106
+ }
107
+ /**
108
+ * Prepare final project directory
109
+ * Example:
110
+ * user enters: "."
111
+ * projectName: "my-app"
112
+ * final path becomes "./my-app"
113
+ */
114
+ async function prepareDirectory(basePath, projectName) {
115
+ const targetPath = path_1.default.resolve(basePath, projectName);
116
+ // If path doesn't exist β†’ create
117
+ if (!fs_extra_1.default.existsSync(targetPath)) {
118
+ fs_extra_1.default.mkdirSync(targetPath, { recursive: true });
119
+ return targetPath;
120
+ }
121
+ // Directory exists β†’ check if empty
122
+ const files = fs_extra_1.default.readdirSync(targetPath);
123
+ if (files.length === 0) {
124
+ return targetPath; // empty β†’ OK
125
+ }
126
+ // Directory not empty β†’ warn user
127
+ const ans = await inquirer_1.default.prompt([
128
+ {
129
+ type: 'confirm',
130
+ name: 'confirm',
131
+ message: `⚠️ Directory "${targetPath}" is not empty. All files inside will be deleted. Continue?`,
132
+ default: false
133
+ }
134
+ ]);
135
+ if (!ans.confirm) {
136
+ console.log('❌ Operation cancelled.');
137
+ process.exit(1);
138
+ }
139
+ // Empty directory
140
+ await fs_extra_1.default.emptyDir(targetPath);
141
+ return targetPath;
142
+ }
143
+ //# sourceMappingURL=asks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asks.js","sourceRoot":"","sources":["../../../../../libs/sdk/create-app/src/asks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { FrameworkChoices, SupportedFrontEndFrameworks } from '../types';
2
+ export declare const DOTCMS_HOST = "http://localhost:8082";
3
+ export declare const DOTCMS_USER: {
4
+ username: string;
5
+ password: string;
6
+ };
7
+ export declare const DOTCMS_HEALTH_API = "http://localhost:8082/api/v1/probes/alive";
8
+ export declare const DOTCMS_TOKEN_API = "http://localhost:8082/api/v1/authentication/api-token";
9
+ export declare const DOTCMS_EMA_CONFIG_API = "http://localhost:8082/api/v1/apps/dotema-config-v2/";
10
+ export declare const DOTCMS_DEMO_SITE = "http://localhost:8082/api/v1/site/";
11
+ export declare const FRAMEWORKS: SupportedFrontEndFrameworks[];
12
+ export declare const FRAMEWORKS_CHOICES: FrameworkChoices[];
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ 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;
4
+ exports.DOTCMS_HOST = 'http://localhost:8082';
5
+ exports.DOTCMS_USER = {
6
+ username: 'admin@dotcms.com',
7
+ password: 'admin'
8
+ };
9
+ // USED APIS
10
+ exports.DOTCMS_HEALTH_API = `${exports.DOTCMS_HOST}/api/v1/probes/alive`;
11
+ exports.DOTCMS_TOKEN_API = `${exports.DOTCMS_HOST}/api/v1/authentication/api-token`;
12
+ exports.DOTCMS_EMA_CONFIG_API = `${exports.DOTCMS_HOST}/api/v1/apps/dotema-config-v2/`;
13
+ exports.DOTCMS_DEMO_SITE = `${exports.DOTCMS_HOST}/api/v1/site/`;
14
+ // App constants
15
+ exports.FRAMEWORKS = [
16
+ 'nextjs',
17
+ 'astro',
18
+ 'angular',
19
+ 'angular-ssr'
20
+ ];
21
+ exports.FRAMEWORKS_CHOICES = [
22
+ { name: 'Next.js', value: 'nextjs' },
23
+ { name: 'Astro', value: 'astro' },
24
+ { name: 'Angular', value: 'angular' },
25
+ { name: 'Angular (SSR)', value: 'angular-ssr' }
26
+ ];
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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;AACC,QAAA,iBAAiB,GAAG,GAAG,mBAAW,sBAAsB,CAAC;AACzD,QAAA,gBAAgB,GAAG,GAAG,mBAAW,kCAAkC,CAAC;AACpE,QAAA,qBAAqB,GAAG,GAAG,mBAAW,gCAAgC,CAAC;AACvE,QAAA,gBAAgB,GAAG,GAAG,mBAAW,eAAe,CAAC;AAE9D,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"}
@@ -0,0 +1,18 @@
1
+ export declare class FailedToCreateFrontendProjectError extends Error {
2
+ constructor(framework: string);
3
+ }
4
+ export declare class DockerCliNotInstalledError extends Error {
5
+ constructor();
6
+ }
7
+ export declare class FailedToDownloadDockerComposeError extends Error {
8
+ constructor();
9
+ }
10
+ export declare class FailedToGetDotcmsTokenError extends Error {
11
+ constructor();
12
+ }
13
+ export declare class FailedToSetUpUVEConfig extends Error {
14
+ constructor();
15
+ }
16
+ export declare class FailedToGetDemoSiteIdentifierError extends Error {
17
+ constructor();
18
+ }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FailedToGetDemoSiteIdentifierError = exports.FailedToSetUpUVEConfig = exports.FailedToGetDotcmsTokenError = exports.FailedToDownloadDockerComposeError = exports.DockerCliNotInstalledError = exports.FailedToCreateFrontendProjectError = void 0;
4
+ class FailedToCreateFrontendProjectError extends Error {
5
+ constructor(framework) {
6
+ super(`Failed to create frontend project for framework: ${framework}. Please check if you have git installed and an active internet connection.`);
7
+ }
8
+ }
9
+ exports.FailedToCreateFrontendProjectError = FailedToCreateFrontendProjectError;
10
+ class DockerCliNotInstalledError extends Error {
11
+ constructor() {
12
+ super(`Please check if Docker CLI installed in you system!`);
13
+ }
14
+ }
15
+ exports.DockerCliNotInstalledError = DockerCliNotInstalledError;
16
+ class FailedToDownloadDockerComposeError extends Error {
17
+ constructor() {
18
+ super(`Failed to download the docker compose file`);
19
+ }
20
+ }
21
+ exports.FailedToDownloadDockerComposeError = FailedToDownloadDockerComposeError;
22
+ class FailedToGetDotcmsTokenError extends Error {
23
+ constructor() {
24
+ super(`Failed to get dotCMS API token. Please make sure if dotCMS container is running.`);
25
+ }
26
+ }
27
+ exports.FailedToGetDotcmsTokenError = FailedToGetDotcmsTokenError;
28
+ class FailedToSetUpUVEConfig extends Error {
29
+ constructor() {
30
+ super(`Failed to set up UVE configuration in DotCMS.`);
31
+ }
32
+ }
33
+ exports.FailedToSetUpUVEConfig = FailedToSetUpUVEConfig;
34
+ class FailedToGetDemoSiteIdentifierError extends Error {
35
+ constructor() {
36
+ super(`Failed to get demo site identifier from DotCMS.`);
37
+ }
38
+ }
39
+ exports.FailedToGetDemoSiteIdentifierError = FailedToGetDemoSiteIdentifierError;
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/sdk/create-app/src/errors/index.ts"],"names":[],"mappings":";;;AAAA,MAAa,kCAAmC,SAAQ,KAAK;IACzD,YAAY,SAAiB;QACzB,KAAK,CACD,oDAAoD,SAAS,6EAA6E,CAC7I,CAAC;IACN,CAAC;CACJ;AAND,gFAMC;AAED,MAAa,0BAA2B,SAAQ,KAAK;IACjD;QACI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACjE,CAAC;CACJ;AAJD,gEAIC;AAED,MAAa,kCAAmC,SAAQ,KAAK;IACzD;QACI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IACxD,CAAC;CACJ;AAJD,gFAIC;AAED,MAAa,2BAA4B,SAAQ,KAAK;IAClD;QACI,KAAK,CAAC,kFAAkF,CAAC,CAAC;IAC9F,CAAC;CACJ;AAJD,kEAIC;AAED,MAAa,sBAAuB,SAAQ,KAAK;IAC7C;QACI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAC3D,CAAC;CACJ;AAJD,wDAIC;AAED,MAAa,kCAAmC,SAAQ,KAAK;IACzD;QACI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IAC7D,CAAC;CACJ;AAJD,gFAIC"}
@@ -0,0 +1,6 @@
1
+ import type { SupportedFrontEndFrameworks } from '../types';
2
+ export declare const cloneFrontEndSample: ({ framework, directory }: {
3
+ framework: SupportedFrontEndFrameworks;
4
+ directory: string;
5
+ }) => Promise<void>;
6
+ export declare function downloadDockerCompose(directory: string): Promise<void>;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cloneFrontEndSample = void 0;
4
+ exports.downloadDockerCompose = downloadDockerCompose;
5
+ const tslib_1 = require("tslib");
6
+ const execa_1 = require("execa");
7
+ const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
8
+ const path_1 = tslib_1.__importDefault(require("path"));
9
+ const utils_1 = require("../utils");
10
+ const cloneFrontEndSample = async ({ framework, directory }) => {
11
+ // 1. Clone repository (sparse + blobless)
12
+ await (0, execa_1.execa)('git', ['clone', '--filter=blob:none', '--sparse', 'https://github.com/dotCMS/core.git', '.'], { cwd: directory });
13
+ // 2. Enable sparse checkout & select the folder
14
+ await (0, execa_1.execa)('git', ['sparse-checkout', 'set', `examples/${framework}`], {
15
+ cwd: directory
16
+ });
17
+ // await fs.ensureDir(path.join(directory, framework));
18
+ // 3. Checkout main branch (only the selected folder is downloaded)
19
+ await (0, execa_1.execa)('git', ['checkout', 'main'], {
20
+ cwd: directory
21
+ // stdio: 'inherit'
22
+ });
23
+ const src = path_1.default.join(directory, 'examples', `${framework}`);
24
+ const dest = directory;
25
+ // const dest = path.join(directory, framework);
26
+ // Ensure framework directory exists
27
+ // await fs.ensureDir(dest);
28
+ // Remove EVERYTHING in repo except the examples folder
29
+ const items = await fs_extra_1.default.readdir(directory);
30
+ for (const item of items) {
31
+ if (item !== 'examples') {
32
+ await fs_extra_1.default.remove(path_1.default.join(directory, item));
33
+ }
34
+ }
35
+ // Copy only the nextjs folder into the framework folder
36
+ await fs_extra_1.default.copy(src, dest, { overwrite: true });
37
+ // Remove the remaining examples folder
38
+ const allItems = await fs_extra_1.default.readdir(directory);
39
+ for (const item of allItems) {
40
+ if (item === 'examples') {
41
+ await fs_extra_1.default.remove(path_1.default.join(directory, item));
42
+ }
43
+ }
44
+ };
45
+ exports.cloneFrontEndSample = cloneFrontEndSample;
46
+ async function downloadDockerCompose(directory) {
47
+ // 6. Download docker-compose file
48
+ const dockerUrl = 'https://raw.githubusercontent.com/dotCMS/core/main/docker/docker-compose-examples/single-node-demo-site/docker-compose.yml';
49
+ const dockerComposePath = path_1.default.join(directory, 'docker-compose.yml');
50
+ await (0, utils_1.downloadFile)(dockerUrl, dockerComposePath);
51
+ }
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/sdk/create-app/src/git/index.ts"],"names":[],"mappings":";;;AAiEA,sDAQC;;AAzED,iCAA8B;AAC9B,gEAA0B;AAE1B,wDAAwB;AAExB,oCAAwC;AAIjC,MAAM,mBAAmB,GAAG,KAAK,EAAE,EACtC,SAAS,EACT,SAAS,EAIZ,EAAE,EAAE;IACD,0CAA0C;IAC1C,MAAM,IAAA,aAAK,EACP,KAAK,EACL,CAAC,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,oCAAoC,EAAE,GAAG,CAAC,EACtF,EAAE,GAAG,EAAE,SAAS,EAAE,CACrB,CAAC;IAEF,gDAAgD;IAChD,MAAM,IAAA,aAAK,EAAC,KAAK,EAAE,CAAC,iBAAiB,EAAE,KAAK,EAAE,YAAY,SAAS,EAAE,CAAC,EAAE;QACpE,GAAG,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,uDAAuD;IAEvD,mEAAmE;IACnE,MAAM,IAAA,aAAK,EAAC,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE;QACrC,GAAG,EAAE,SAAS;QACd,mBAAmB;KACtB,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,SAAS,CAAC;IACvB,gDAAgD;IAEhD,oCAAoC;IACpC,4BAA4B;IAE5B,uDAAuD;IACvD,MAAM,KAAK,GAAG,MAAM,kBAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACtB,MAAM,kBAAE,CAAC,MAAM,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QAChD,CAAC;IACL,CAAC;IAED,wDAAwD;IACxD,MAAM,kBAAE,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,uCAAuC;IACvC,MAAM,QAAQ,GAAG,MAAM,kBAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE7C,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACtB,MAAM,kBAAE,CAAC,MAAM,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QAChD,CAAC;IACL,CAAC;AACL,CAAC,CAAC;AAtDW,QAAA,mBAAmB,uBAsD9B;AAEK,KAAK,UAAU,qBAAqB,CAAC,SAAiB;IACzD,kCAAkC;IAClC,MAAM,SAAS,GACX,4HAA4H,CAAC;IAEjI,MAAM,iBAAiB,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IAErE,MAAM,IAAA,oBAAY,EAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AACrD,CAAC"}
package/src/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export declare function createApp(): Promise<void>;
package/src/index.js ADDED
@@ -0,0 +1,347 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.createApp = createApp;
5
+ const tslib_1 = require("tslib");
6
+ const chalk_1 = tslib_1.__importDefault(require("chalk"));
7
+ const commander_1 = require("commander");
8
+ const execa_1 = require("execa");
9
+ const ora_1 = tslib_1.__importDefault(require("ora"));
10
+ const ts_results_1 = require("ts-results");
11
+ const path_1 = tslib_1.__importDefault(require("path"));
12
+ const api_1 = require("./api");
13
+ const asks_1 = require("./asks");
14
+ const constants_1 = require("./constants");
15
+ const errors_1 = require("./errors");
16
+ const git_1 = require("./git");
17
+ const utils_1 = require("./utils");
18
+ // Supported values
19
+ const program = new commander_1.Command();
20
+ program
21
+ .name('dotcms-create-app')
22
+ .description('dotCMS CLI for creating applications')
23
+ .version('0.1.0-beta');
24
+ program
25
+ .argument('<project-name>', 'Name of the project folder')
26
+ .option('-f, --framework <framework>', 'Framework to use [nextjs,astro,angular,angular-ssr]')
27
+ // directory flags
28
+ .option('-d, --directory <path>', 'Project directory')
29
+ // cloud / no-cloud
30
+ .option('--local', 'Use local dotCMS instance using docker')
31
+ // cloud options (if cloud selected)
32
+ .option('--url <url>', 'DotCMS instance url (skip in case of local)')
33
+ .option('-u, --username <username>', 'DotCMS instance username (skip in case of local)')
34
+ .option('-p, --password <password>', 'DotCMS instance password (skip in case of local)')
35
+ .action(async (projectName, options) => {
36
+ // <-- Add beta notice here
37
+ console.log(chalk_1.default.bgGrey.white('\n\n ℹ️ Beta: Features may change \n'));
38
+ const { dir, directory } = options;
39
+ const { url } = options;
40
+ const { user, username } = options;
41
+ const { pass, password } = options;
42
+ const { framework, f } = options;
43
+ let directoryInput;
44
+ let finalDirectory;
45
+ let isCloudInstanceSelected;
46
+ let selectedFramework;
47
+ if (dir === undefined && directory === undefined) {
48
+ directoryInput = await (0, asks_1.askDirectory)();
49
+ finalDirectory = await (0, asks_1.prepareDirectory)(directoryInput, projectName);
50
+ }
51
+ else {
52
+ directoryInput = dir || directory;
53
+ finalDirectory = await (0, asks_1.prepareDirectory)(directoryInput, projectName);
54
+ }
55
+ if (framework === undefined && f === undefined) {
56
+ selectedFramework = await (0, asks_1.askFramework)();
57
+ }
58
+ else {
59
+ selectedFramework = framework || f;
60
+ }
61
+ if (options.local === undefined) {
62
+ isCloudInstanceSelected = await (0, asks_1.askCloudOrLocalInstance)();
63
+ }
64
+ else {
65
+ isCloudInstanceSelected = !JSON.parse(options.local);
66
+ }
67
+ if (isCloudInstanceSelected) {
68
+ const urlDotcmsInstance = url === undefined ? await (0, asks_1.askDotcmsCloudUrl)() : url;
69
+ const userNameDotCmsInstance = user === undefined && username === undefined
70
+ ? await (0, asks_1.askUserNameForDotcmsCloud)()
71
+ : user || username;
72
+ const passwordDotCmsInstance = pass === undefined && password === undefined
73
+ ? await (0, asks_1.askPasswordForDotcmsCloud)()
74
+ : pass || password;
75
+ const spinner = (0, ora_1.default)(`Scaffolding ${selectedFramework} application ...`).start();
76
+ const created = await scaffoldFrontendProject({
77
+ framework: selectedFramework,
78
+ directory: finalDirectory
79
+ });
80
+ if (!created.ok) {
81
+ spinner.fail(`Failed to scaffold frontend project (${selectedFramework}).`);
82
+ return;
83
+ }
84
+ spinner.succeed(`Frontend project (${selectedFramework}) scaffolded successfully.`);
85
+ const healthApiURL = (0, utils_1.getDotcmsApisByBaseUrl)(urlDotcmsInstance).DOTCMS_HEALTH_API;
86
+ const emaConfigApiURL = (0, utils_1.getDotcmsApisByBaseUrl)(urlDotcmsInstance).DOTCMS_EMA_CONFIG_API;
87
+ const demoSiteApiURL = (0, utils_1.getDotcmsApisByBaseUrl)(urlDotcmsInstance).DOTCMS_DEMO_SITE;
88
+ const tokenApiUrl = (0, utils_1.getDotcmsApisByBaseUrl)(urlDotcmsInstance).DOTCMS_TOKEN_API;
89
+ spinner.start('Verifying if dotCMS is running...');
90
+ const checkIfDotcmsIsRunning = await isDotcmsRunning(`DotCMS is not running on the provided url ${urlDotcmsInstance}.Please make sure you have typed the correct url`, healthApiURL);
91
+ if (!checkIfDotcmsIsRunning) {
92
+ spinner.fail('dotCMS is not running on the following url ' +
93
+ urlDotcmsInstance +
94
+ '. Please check the url and try again.');
95
+ return;
96
+ }
97
+ spinner.succeed('dotCMS is running.');
98
+ const dotcmsToken = await api_1.DotCMSApi.getAuthToken({
99
+ payload: {
100
+ user: userNameDotCmsInstance,
101
+ password: passwordDotCmsInstance,
102
+ expirationDays: '30',
103
+ label: 'token for frontend app'
104
+ },
105
+ url: tokenApiUrl
106
+ });
107
+ if (!dotcmsToken.ok) {
108
+ spinner.fail('Failed to get authentication token from Dotcms.');
109
+ return;
110
+ }
111
+ const demoSite = await api_1.DotCMSApi.getDemoSiteIdentifier({
112
+ siteName: 'demo.dotcms.com',
113
+ authenticationToken: dotcmsToken.val,
114
+ url: demoSiteApiURL
115
+ });
116
+ if (!demoSite.ok) {
117
+ spinner.fail('Failed to get demo site identifier from Dotcms.');
118
+ return;
119
+ }
120
+ const setUpUVE = await api_1.DotCMSApi.setupUVEConfig({
121
+ payload: {
122
+ configuration: {
123
+ hidden: false,
124
+ value: (0, utils_1.getUVEConfigValue)(`http://localhost:${(0, utils_1.getPortByFramework)(selectedFramework)}`)
125
+ }
126
+ },
127
+ siteId: demoSite.val.entity.identifier,
128
+ authenticationToken: dotcmsToken.val,
129
+ url: emaConfigApiURL
130
+ });
131
+ if (!setUpUVE.ok) {
132
+ spinner.fail('Failed to setup UVE configuration in Dotcms.');
133
+ return;
134
+ }
135
+ spinner.succeed('Project setup completed successfully.');
136
+ const relativePath = path_1.default.relative(process.cwd(), finalDirectory) || '.';
137
+ switch (selectedFramework) {
138
+ case 'nextjs': {
139
+ (0, utils_1.finalStepsForNextjs)({
140
+ projectPath: relativePath,
141
+ token: dotcmsToken.val,
142
+ siteId: demoSite.val.entity.identifier,
143
+ urlDotCMSInstance: urlDotcmsInstance
144
+ });
145
+ break;
146
+ }
147
+ case 'angular': {
148
+ (0, utils_1.finalStepsForAngularAndAngularSSR)({
149
+ projectPath: relativePath,
150
+ token: dotcmsToken.val,
151
+ siteId: demoSite.val.entity.identifier,
152
+ urlDotCMSInstance: urlDotcmsInstance
153
+ });
154
+ break;
155
+ }
156
+ case 'angular-ssr': {
157
+ (0, utils_1.finalStepsForAngularAndAngularSSR)({
158
+ projectPath: relativePath,
159
+ token: dotcmsToken.val,
160
+ siteId: demoSite.val.entity.identifier,
161
+ urlDotCMSInstance: urlDotcmsInstance
162
+ });
163
+ break;
164
+ }
165
+ case 'astro': {
166
+ (0, utils_1.finalStepsForAstro)({
167
+ projectPath: relativePath,
168
+ token: dotcmsToken.val,
169
+ siteId: demoSite.val.entity.identifier,
170
+ urlDotCMSInstance: urlDotcmsInstance
171
+ });
172
+ break;
173
+ }
174
+ }
175
+ return;
176
+ }
177
+ // console.log(chalk.green("βœ” Starting DotCMS app setup...\n"));
178
+ // const spinner = ora(`Scaffolding ${framework} application ...`).start();
179
+ const spinner = (0, ora_1.default)(`Scaffolding ${selectedFramework} application ...`).start();
180
+ // STEP 1 β€” Scaffold front-end
181
+ const created = await scaffoldFrontendProject({
182
+ framework: selectedFramework,
183
+ directory: finalDirectory
184
+ });
185
+ if (!created.ok) {
186
+ spinner.fail(`Failed to scaffold frontend project (${selectedFramework}).`);
187
+ return;
188
+ }
189
+ spinner.succeed(`Frontend project (${selectedFramework}) scaffolded successfully.`);
190
+ spinner.start('Setting up dotCMS with Docker Compose...');
191
+ // STEP 2 β€” Download docker-compose
192
+ const downloaded = await downloadTheDockerCompose({
193
+ directory: finalDirectory
194
+ });
195
+ if (!downloaded.ok) {
196
+ spinner.fail('Failed to download Docker Compose file.');
197
+ return;
198
+ }
199
+ spinner.succeed('Docker Compose Download completed.');
200
+ spinner.start('Starting dotCMS with Docker Compose (This may take sometime enjoy a coffee β˜•οΈ )...');
201
+ // STEP 3 β€” Run docker-compose
202
+ const ran = await runDockerCompose({ directory: finalDirectory });
203
+ if (!ran.ok) {
204
+ spinner.fail('Failed to start dotCMS ensure docker is running and ports 8082, 8443, 9200, and 9600 are free.');
205
+ return;
206
+ }
207
+ spinner.succeed('dotCMS containers started successfully.');
208
+ spinner.start('Verifying if dotCMS is running...');
209
+ const checkIfDotcmsIsRunning = await isDotcmsRunning('Failed to start dotCMS.Ensure Docker is running and ports 8082, 8443, 9200, and 9600 are free');
210
+ if (!checkIfDotcmsIsRunning) {
211
+ spinner.fail('dotCMS is not running. Please check the docker containers.');
212
+ return;
213
+ }
214
+ spinner.succeed('dotCMS is running.');
215
+ const dotcmsToken = await api_1.DotCMSApi.getAuthToken({
216
+ payload: {
217
+ user: constants_1.DOTCMS_USER.username,
218
+ password: constants_1.DOTCMS_USER.password,
219
+ expirationDays: '30',
220
+ label: 'token for frontend app'
221
+ }
222
+ });
223
+ if (!dotcmsToken.ok) {
224
+ spinner.fail('Failed to get authentication token from Dotcms.');
225
+ return;
226
+ }
227
+ const demoSite = await api_1.DotCMSApi.getDemoSiteIdentifier({
228
+ siteName: 'demo.dotcms.com',
229
+ authenticationToken: dotcmsToken.val
230
+ });
231
+ if (!demoSite.ok) {
232
+ spinner.fail('Failed to get demo site identifier from Dotcms.');
233
+ return;
234
+ }
235
+ const setUpUVE = await api_1.DotCMSApi.setupUVEConfig({
236
+ payload: {
237
+ configuration: {
238
+ hidden: false,
239
+ value: (0, utils_1.getUVEConfigValue)(`http://localhost:${(0, utils_1.getPortByFramework)(selectedFramework)}`)
240
+ }
241
+ },
242
+ siteId: demoSite.val.entity.identifier,
243
+ authenticationToken: dotcmsToken.val
244
+ });
245
+ if (!setUpUVE.ok) {
246
+ spinner.fail('Failed to setup UVE configuration in Dotcms.');
247
+ return;
248
+ }
249
+ spinner.succeed('Project setup completed successfully.');
250
+ const relativePath = path_1.default.relative(process.cwd(), finalDirectory) || '.';
251
+ switch (selectedFramework) {
252
+ case 'nextjs': {
253
+ (0, utils_1.finalStepsForNextjs)({
254
+ projectPath: relativePath,
255
+ token: dotcmsToken.val,
256
+ siteId: demoSite.val.entity.identifier,
257
+ urlDotCMSInstance: 'http://localhost:8082'
258
+ });
259
+ break;
260
+ }
261
+ case 'angular': {
262
+ (0, utils_1.finalStepsForAngularAndAngularSSR)({
263
+ projectPath: relativePath,
264
+ token: dotcmsToken.val,
265
+ siteId: demoSite.val.entity.identifier,
266
+ urlDotCMSInstance: 'http://localhost:8082'
267
+ });
268
+ break;
269
+ }
270
+ case 'angular-ssr': {
271
+ (0, utils_1.finalStepsForAngularAndAngularSSR)({
272
+ projectPath: relativePath,
273
+ token: dotcmsToken.val,
274
+ siteId: demoSite.val.entity.identifier,
275
+ urlDotCMSInstance: 'http://localhost:8082'
276
+ });
277
+ break;
278
+ }
279
+ case 'astro': {
280
+ (0, utils_1.finalStepsForAstro)({
281
+ projectPath: relativePath,
282
+ token: dotcmsToken.val,
283
+ siteId: demoSite.val.entity.identifier,
284
+ urlDotCMSInstance: 'http://localhost:8082'
285
+ });
286
+ break;
287
+ }
288
+ }
289
+ });
290
+ async function createApp() {
291
+ program.parse();
292
+ }
293
+ /* -------------------------------------------------------
294
+ * STEP FUNCTIONS (no spinner, only chalk)
295
+ * -----------------------------------------------------*/
296
+ async function scaffoldFrontendProject({ framework, directory }) {
297
+ try {
298
+ await (0, git_1.cloneFrontEndSample)({ directory, framework });
299
+ return (0, ts_results_1.Ok)(undefined);
300
+ }
301
+ catch (err) {
302
+ console.log(chalk_1.default.red(`❌ Failed to create ${framework} project. Please check git installation and network connection.` +
303
+ JSON.stringify(err)));
304
+ return (0, ts_results_1.Err)(new errors_1.FailedToCreateFrontendProjectError(framework));
305
+ }
306
+ }
307
+ async function downloadTheDockerCompose({ directory }) {
308
+ try {
309
+ // console.log(chalk.cyan("πŸ“₯ Downloading docker-compose.yml..."));
310
+ await (0, git_1.downloadDockerCompose)(directory);
311
+ // console.log(chalk.green(`βœ” docker-compose.yml downloaded successfully!\n`));
312
+ return (0, ts_results_1.Ok)(undefined);
313
+ }
314
+ catch (err) {
315
+ console.log(chalk_1.default.red('❌ Failed to download docker-compose.yml.' + JSON.stringify(err)));
316
+ return (0, ts_results_1.Err)(new errors_1.FailedToDownloadDockerComposeError());
317
+ }
318
+ }
319
+ async function runDockerCompose({ directory }) {
320
+ try {
321
+ // console.log(chalk.cyan("🐳 Starting Docker containers... (This might take some time)"));
322
+ await (0, execa_1.execa)('docker', ['compose', 'up', '-d'], { cwd: directory });
323
+ await (0, execa_1.execa)('docker', ['ps'], { cwd: directory });
324
+ // console.log(chalk.green("βœ” Docker containers started successfully!\n"));
325
+ return (0, ts_results_1.Ok)(undefined);
326
+ }
327
+ catch (err) {
328
+ return (0, ts_results_1.Err)(err);
329
+ }
330
+ }
331
+ async function isDotcmsRunning(errorMessage, url) {
332
+ try {
333
+ // console.log(chalk.cyan("Waiting for DotCMS to be up ...."));
334
+ const res = await (0, utils_1.fetchWithRetry)(url ?? constants_1.DOTCMS_HEALTH_API, 20, 5000);
335
+ if (res && res.status === 200) {
336
+ // console.log(chalk.green("βœ” DotCMS container started sucessfully!\n"));
337
+ return true;
338
+ }
339
+ return false;
340
+ }
341
+ catch {
342
+ console.log(chalk_1.default.red('❌' + errorMessage));
343
+ return false;
344
+ }
345
+ }
346
+ createApp();
347
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/sdk/create-app/src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ export type SupportedFrontEndFrameworks = 'nextjs' | 'astro' | 'angular' | 'angular-ssr';
2
+ export type FrameworkChoices = {
3
+ name: string;
4
+ value: SupportedFrontEndFrameworks;
5
+ };
6
+ export interface GetUserTokenRequest {
7
+ user: string;
8
+ password: string;
9
+ expirationDays: string;
10
+ label: string;
11
+ }
12
+ export interface GetUserTokenResponse {
13
+ entity: {
14
+ token: string;
15
+ };
16
+ }
17
+ export interface UVEConfigRequest {
18
+ configuration: {
19
+ hidden: false;
20
+ value: string;
21
+ };
22
+ }
23
+ export interface UVEConfigResponse {
24
+ entity: 'Ok';
25
+ }
26
+ export interface DemoSiteResponse {
27
+ entity: {
28
+ addThis: string;
29
+ aliases: string;
30
+ archived: boolean;
31
+ default: boolean;
32
+ description: string;
33
+ embeddedDashboard: string | null;
34
+ googleAnalytics: string;
35
+ googleMap: string;
36
+ identifier: string;
37
+ inode: string;
38
+ keywords: string;
39
+ languageId: number;
40
+ live: boolean;
41
+ locked: boolean;
42
+ modDate: number;
43
+ modUser: string;
44
+ proxyUrlForEditMode: string | null;
45
+ runDashboard: boolean;
46
+ siteName: string;
47
+ siteThumbnail: string;
48
+ systemHost: boolean;
49
+ tagStorage: string;
50
+ working: boolean;
51
+ };
52
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/sdk/create-app/src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import type { SupportedFrontEndFrameworks } from '../types';
2
+ export declare function fetchWithRetry(url: string, retries?: number, delay?: number): Promise<import("axios").AxiosResponse<any, any, {}>>;
3
+ export declare function getUVEConfigValue(frontEndUrl: string): string;
4
+ export declare function getPortByFramework(framework: SupportedFrontEndFrameworks): string;
5
+ export declare function getDotcmsApisByBaseUrl(baseUrl: string): {
6
+ DOTCMS_HEALTH_API: string;
7
+ DOTCMS_TOKEN_API: string;
8
+ DOTCMS_EMA_CONFIG_API: string;
9
+ DOTCMS_DEMO_SITE: string;
10
+ };
11
+ /** Utility to download a file using https */
12
+ export declare function downloadFile(url: string, dest: string): Promise<void>;
13
+ export declare function finalStepsForNextjs({ projectPath, urlDotCMSInstance, siteId, token }: {
14
+ projectPath: string;
15
+ urlDotCMSInstance: string;
16
+ siteId: string;
17
+ token: string;
18
+ }): void;
19
+ export declare function finalStepsForAstro({ projectPath, urlDotCMSInstance, siteId, token }: {
20
+ projectPath: string;
21
+ urlDotCMSInstance: string;
22
+ siteId: string;
23
+ token: string;
24
+ }): void;
25
+ export declare function finalStepsForAngularAndAngularSSR({ projectPath, urlDotCMSInstance, siteId, token }: {
26
+ projectPath: string;
27
+ urlDotCMSInstance: string;
28
+ siteId: string;
29
+ token: string;
30
+ }): void;
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchWithRetry = fetchWithRetry;
4
+ exports.getUVEConfigValue = getUVEConfigValue;
5
+ exports.getPortByFramework = getPortByFramework;
6
+ exports.getDotcmsApisByBaseUrl = getDotcmsApisByBaseUrl;
7
+ exports.downloadFile = downloadFile;
8
+ exports.finalStepsForNextjs = finalStepsForNextjs;
9
+ exports.finalStepsForAstro = finalStepsForAstro;
10
+ exports.finalStepsForAngularAndAngularSSR = finalStepsForAngularAndAngularSSR;
11
+ const tslib_1 = require("tslib");
12
+ const axios_1 = tslib_1.__importDefault(require("axios"));
13
+ const chalk_1 = tslib_1.__importDefault(require("chalk"));
14
+ const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
15
+ const https_1 = tslib_1.__importDefault(require("https"));
16
+ async function fetchWithRetry(url, retries = 5, delay = 5000) {
17
+ for (let i = 0; i < retries; i++) {
18
+ try {
19
+ return await axios_1.default.get(url);
20
+ }
21
+ catch (err) {
22
+ console.log(`dotCMS still not up 😴 ${i + 1}. Retrying in ${delay / 1000}s...`);
23
+ if (i === retries - 1)
24
+ throw err; // throw after last attempt
25
+ await new Promise((r) => setTimeout(r, delay));
26
+ }
27
+ }
28
+ }
29
+ function getUVEConfigValue(frontEndUrl) {
30
+ return JSON.stringify({
31
+ config: [
32
+ {
33
+ pattern: '.*',
34
+ url: frontEndUrl
35
+ }
36
+ ]
37
+ });
38
+ }
39
+ function getPortByFramework(framework) {
40
+ switch (framework) {
41
+ case 'angular':
42
+ return '4200';
43
+ case 'angular-ssr':
44
+ return '4200';
45
+ case 'nextjs':
46
+ return '3000';
47
+ case 'astro':
48
+ return '4321';
49
+ default:
50
+ throw new Error(`Unsupported framework: ${framework}`);
51
+ }
52
+ }
53
+ function getDotcmsApisByBaseUrl(baseUrl) {
54
+ return {
55
+ DOTCMS_HEALTH_API: `${baseUrl}/api/v1/probes/alive`,
56
+ DOTCMS_TOKEN_API: `${baseUrl}/api/v1/authentication/api-token`,
57
+ DOTCMS_EMA_CONFIG_API: `${baseUrl}/api/v1/apps/dotema-config-v2/`,
58
+ DOTCMS_DEMO_SITE: `${baseUrl}/api/v1/site/`
59
+ };
60
+ }
61
+ /** Utility to download a file using https */
62
+ function downloadFile(url, dest) {
63
+ return new Promise((resolve, reject) => {
64
+ const file = fs_extra_1.default.createWriteStream(dest);
65
+ https_1.default
66
+ .get(url, (response) => {
67
+ if (response.statusCode !== 200) {
68
+ return reject(new Error(`Failed to download file: ${response.statusCode}`));
69
+ }
70
+ response.pipe(file);
71
+ file.on('finish', () => file.close(() => resolve()));
72
+ })
73
+ .on('error', (err) => {
74
+ fs_extra_1.default.unlink(dest);
75
+ reject(err);
76
+ });
77
+ });
78
+ }
79
+ function finalStepsForNextjs({ projectPath, urlDotCMSInstance, siteId, token }) {
80
+ console.log('\n');
81
+ console.log(chalk_1.default.cyanBright('πŸ“„ Update your frontend environment variables:\n'));
82
+ console.log(chalk_1.default.white('πŸͺœ Steps:\n'));
83
+ console.log(chalk_1.default.white('1- cd ') + chalk_1.default.green(projectPath));
84
+ console.log(chalk_1.default.white('2- Create a new file with the name ') +
85
+ chalk_1.default.green('.env') +
86
+ ' and paste the following:\n');
87
+ // ENV BLOCK β€” nicely spaced + grouped
88
+ console.log(chalk_1.default.white('──────────────────────────────────────────────'));
89
+ console.log(chalk_1.default.white(getEnvVariablesForNextJS(urlDotCMSInstance, siteId, token)));
90
+ console.log(chalk_1.default.white('──────────────────────────────────────────────\n'));
91
+ // INSTALL DEPENDENCIES
92
+ console.log(chalk_1.default.magentaBright('πŸ“¦ Install frontend dependencies:'));
93
+ console.log(chalk_1.default.white('$ npm install\n'));
94
+ // START DEV SERVER
95
+ console.log(chalk_1.default.blueBright('πŸ’» Start your frontend development server:'));
96
+ console.log(chalk_1.default.white('$ npm run dev\n'));
97
+ console.log(chalk_1.default.greenBright("πŸŽ‰ You're all set! Start building your app with dotCMS + your chosen frontend framework.\n"));
98
+ }
99
+ function finalStepsForAstro({ projectPath, urlDotCMSInstance, siteId, token }) {
100
+ console.log('\n');
101
+ console.log(chalk_1.default.cyanBright('πŸ“„ Update your frontend environment variables:\n'));
102
+ console.log(chalk_1.default.white('πŸͺœ Steps:\n'));
103
+ console.log(chalk_1.default.white('1- cd ') + chalk_1.default.green(projectPath));
104
+ console.log(chalk_1.default.white('2- Create a new file with the name ') +
105
+ chalk_1.default.green('.env') +
106
+ ' and paste the following:\n');
107
+ // ENV BLOCK β€” nicely spaced + grouped
108
+ console.log(chalk_1.default.white('──────────────────────────────────────────────'));
109
+ console.log(chalk_1.default.white(getEnvVariablesForAstro(urlDotCMSInstance, siteId, token)));
110
+ console.log();
111
+ console.log(chalk_1.default.white('──────────────────────────────────────────────\n'));
112
+ // INSTALL DEPENDENCIES
113
+ console.log(chalk_1.default.magentaBright('πŸ“¦ Install frontend dependencies:'));
114
+ console.log(chalk_1.default.white('$ npm install\n'));
115
+ // START DEV SERVER
116
+ console.log(chalk_1.default.blueBright('πŸ’» Start your frontend development server:'));
117
+ console.log(chalk_1.default.white('$ npm run dev\n'));
118
+ console.log(chalk_1.default.greenBright("πŸŽ‰ You're all set! Start building your app with dotCMS + your chosen frontend framework.\n"));
119
+ }
120
+ function finalStepsForAngularAndAngularSSR({ projectPath, urlDotCMSInstance, siteId, token }) {
121
+ console.log('\n');
122
+ console.log(chalk_1.default.cyanBright('πŸ“„ Update your frontend environment variables:\n'));
123
+ console.log(chalk_1.default.white('πŸͺœ Steps:\n'));
124
+ console.log(chalk_1.default.white('1- cd ') + chalk_1.default.green(projectPath) + '/src/environments');
125
+ console.log(chalk_1.default.white('2- Replace the content of the file ' +
126
+ chalk_1.default.green('environment.ts') +
127
+ ' and ' +
128
+ chalk_1.default.green('environment.development.ts') +
129
+ ' with the following:'));
130
+ // ENV BLOCK β€” nicely spaced + grouped
131
+ console.log(chalk_1.default.white('──────────────────────────────────────────────'));
132
+ console.log(chalk_1.default.white(getEnvVariablesForAngular(urlDotCMSInstance, siteId, token)));
133
+ console.log(chalk_1.default.white('──────────────────────────────────────────────\n'));
134
+ // INSTALL DEPENDENCIES
135
+ console.log(chalk_1.default.magentaBright('πŸ“¦ Install frontend dependencies:'));
136
+ console.log(chalk_1.default.white('$ npm install\n'));
137
+ // START DEV SERVER
138
+ console.log(chalk_1.default.blueBright('πŸ’» Start your frontend development server:'));
139
+ console.log(chalk_1.default.white('$ ng serve\n'));
140
+ console.log(chalk_1.default.greenBright("πŸŽ‰ You're all set! Start building your app with dotCMS + your chosen frontend framework.\n"));
141
+ }
142
+ function getEnvVariablesForNextJS(host, siteId, token) {
143
+ return `
144
+ NEXT_PUBLIC_DOTCMS_AUTH_TOKEN=${token}
145
+ NEXT_PUBLIC_DOTCMS_HOST=${host}
146
+ NEXT_PUBLIC_DOTCMS_SITE_ID=${siteId}
147
+ NEXT_PUBLIC_DOTCMS_MODE='production'
148
+ NODE_TLS_REJECT_UNAUTHORIZED=0
149
+ `;
150
+ }
151
+ function getEnvVariablesForAstro(host, siteId, token) {
152
+ return `
153
+ PUBLIC_DOTCMS_AUTH_TOKEN=${token}
154
+ PUBLIC_DOTCMS_HOST=${host}
155
+ PUBLIC_DOTCMS_SITE_ID=${siteId}
156
+ PUBLIC_EXPERIMENTS_API_KEY=analytic-api-key-from-dotcms-portlet
157
+ PUBLIC_EXPERIMENTS_DEBUG=true
158
+ # If your local dotcms instance is running in https, this setting allows Node.js to connect to servers with invalid SSL certificates.
159
+ # For testing purposes only.
160
+ NODE_TLS_REJECT_UNAUTHORIZED=0
161
+ `;
162
+ }
163
+ function getEnvVariablesForAngular(host, siteId, token) {
164
+ return `
165
+ export const environment = {
166
+ dotcmsUrl: ${host},
167
+ authToken: ${token},
168
+ siteId: ${siteId},
169
+ };
170
+ `;
171
+ }
172
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/sdk/create-app/src/utils/index.ts"],"names":[],"mappings":"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"}