@dotcms/create-app 1.2.1-next.13

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,95 @@
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 create-dotcms-app <project-name>
51
+ ```
52
+
53
+ Or install cli globally
54
+
55
+ ```sh
56
+ npm install -g @dotcms/sdk-create-app
57
+ ```
58
+
59
+ ## Usage
60
+
61
+ ```sh
62
+ npx create-dotcms-app my-dotcms-site
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`, `react`, `vue`, `svelte`, etc. |
94
+ | `-h, --help` | Show help menu |
95
+ | `-V, --version` | Show CLI version |
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@dotcms/create-app",
3
+ "version": "1.2.1-next.13",
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":";;AAYA,oCAgBC;AAKD,oCAUC;AAKD,8CAUC;AAKD,8DAUC;AAKD,8DAUC;AAOD,0DAUC;AASD,4CAmCC;;AArJD,gEAA0B;AAC1B,gEAAgC;AAEhC,wDAAwB;AAExB,2CAAiD;AAIjD;;GAEG;AACI,KAAK,UAAU,YAAY;IAC9B,MAAM,GAAG,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAgD;QAC7E;YACI,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,gCAAgC;YACzC,OAAO,EAAE,8BAAkB;YAC3B,QAAQ,CAAC,QAAQ;gBACb,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,uCAAuC,CAAC;gBAC1E,OAAO,IAAI,CAAC;YAChB,CAAC;SACJ;KACJ,CAAC,CAAC;IAEH,+DAA+D;IAC/D,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,YAAY;IAC9B,MAAM,GAAG,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QAC9B;YACI,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,oBAAoB;YAC7B,OAAO,EAAE,GAAG;SACf;KACJ,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,SAAS,CAAC;AACzB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,iBAAiB;IACnC,MAAM,GAAG,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QAC9B;YACI,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,sBAAsB;YAC/B,OAAO,EAAE,yBAAyB;SACrC;KACJ,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,GAAG,CAAC;AACnB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,yBAAyB;IAC3C,MAAM,GAAG,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QAC9B;YACI,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,kBAAkB;SAC9B;KACJ,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,QAAQ,CAAC;AACxB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,yBAAyB;IAC3C,MAAM,GAAG,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QAC9B;YACI,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,OAAO;SACnB;KACJ,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,QAAQ,CAAC;AACxB,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,uBAAuB;IACzC,MAAM,GAAG,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QAC9B;YACI,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,6FAA6F;YACtG,OAAO,EAAE,KAAK;SACjB;KACJ,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,OAAO,CAAC;AACvB,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,gBAAgB,CAAC,QAAgB,EAAE,WAAmB;IACxE,MAAM,UAAU,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAEvD,iCAAiC;IACjC,IAAI,CAAC,kBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,kBAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,OAAO,UAAU,CAAC;IACtB,CAAC;IAED,oCAAoC;IACpC,MAAM,KAAK,GAAG,kBAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAEzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,UAAU,CAAC,CAAC,aAAa;IACpC,CAAC;IAED,kCAAkC;IAClC,MAAM,GAAG,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QAC9B;YACI,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,kBAAkB,UAAU,6DAA6D;YAClG,OAAO,EAAE,KAAK;SACjB;KACJ,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,kBAAkB;IAClB,MAAM,kBAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAE9B,OAAO,UAAU,CAAC;AACtB,CAAC"}
@@ -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,306 @@
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 api_1 = require("./api");
12
+ const asks_1 = require("./asks");
13
+ const constants_1 = require("./constants");
14
+ const errors_1 = require("./errors");
15
+ const git_1 = require("./git");
16
+ const utils_1 = require("./utils");
17
+ // Supported values
18
+ const program = new commander_1.Command();
19
+ program
20
+ .name('dotcms-create-app')
21
+ .description('dotCMS CLI for creating applications')
22
+ .version('0.1.0-beta');
23
+ program
24
+ .argument('<project-name>', 'Name of the project folder')
25
+ .option('-f, --framework <framework>', 'Framework to use [nextjs,astro,angular,angular-ssr]')
26
+ // directory flags
27
+ .option('-d, --directory <path>', 'Project directory')
28
+ // cloud / no-cloud
29
+ .option('--local', 'Use local dotCMS instance using docker')
30
+ // cloud options (if cloud selected)
31
+ .option('--url <url>', 'DotCMS instance url (skip in case of local)')
32
+ .option('-u, --username <username>', 'DotCMS instance username (skip in case of local)')
33
+ .option('-p, --password <password>', 'DotCMS instance password (skip in case of local)')
34
+ .action(async (projectName, options) => {
35
+ // <-- Add beta notice here
36
+ console.log(chalk_1.default.bgYellow.black(' ⚠️ Beta Version Notice ⚠️ '));
37
+ console.log(chalk_1.default.yellow('This CLI is currently in beta. Features may change and some bugs may be present.\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
+ if (dir === undefined && directory === undefined) {
46
+ directoryInput = await (0, asks_1.askDirectory)();
47
+ finalDirectory = await (0, asks_1.prepareDirectory)(directoryInput, projectName);
48
+ }
49
+ else {
50
+ directoryInput = dir || directory;
51
+ finalDirectory = await (0, asks_1.prepareDirectory)(directoryInput, projectName);
52
+ }
53
+ let selectedFramework;
54
+ if (framework === undefined && f === undefined) {
55
+ selectedFramework = await (0, asks_1.askFramework)();
56
+ }
57
+ else {
58
+ selectedFramework = framework || f;
59
+ }
60
+ const isCloudInstanceSelected = options.local === undefined;
61
+ if (isCloudInstanceSelected) {
62
+ let urlDotcmsInstance;
63
+ let userNameDotCmsInstance;
64
+ let passwordDotCmsInstance;
65
+ if (url === undefined)
66
+ await (0, asks_1.askDotcmsCloudUrl)();
67
+ else
68
+ urlDotcmsInstance = url;
69
+ if (user === undefined && username === undefined)
70
+ await (0, asks_1.askUserNameForDotcmsCloud)();
71
+ else
72
+ userNameDotCmsInstance = user || username;
73
+ if (pass === undefined && password === undefined)
74
+ await (0, asks_1.askPasswordForDotcmsCloud)();
75
+ else
76
+ passwordDotCmsInstance = pass || password;
77
+ const spinner = (0, ora_1.default)(`Scaffolding ${selectedFramework} application ...`).start();
78
+ const created = await scaffoldFrontendProject({
79
+ framework: selectedFramework,
80
+ directory: finalDirectory
81
+ });
82
+ if (!created.ok) {
83
+ spinner.fail(`Failed to scaffold frontend project (${selectedFramework}).`);
84
+ return;
85
+ }
86
+ spinner.succeed(`Frontend project (${selectedFramework}) scaffolded successfully.`);
87
+ const healthApiURL = (0, utils_1.getDotcmsApisByBaseUrl)(urlDotcmsInstance).DOTCMS_HEALTH_API;
88
+ const emaConfigApiURL = (0, utils_1.getDotcmsApisByBaseUrl)(urlDotcmsInstance).DOTCMS_EMA_CONFIG_API;
89
+ const demoSiteApiURL = (0, utils_1.getDotcmsApisByBaseUrl)(urlDotcmsInstance).DOTCMS_DEMO_SITE;
90
+ const tokenApiUrl = (0, utils_1.getDotcmsApisByBaseUrl)(urlDotcmsInstance).DOTCMS_TOKEN_API;
91
+ spinner.start('Verifying if dotCMS is running...');
92
+ const checkIfDotcmsIsRunning = await isDotcmsRunning(healthApiURL);
93
+ if (!checkIfDotcmsIsRunning) {
94
+ spinner.fail('dotCMS is not running on the following url ' +
95
+ urlDotcmsInstance +
96
+ '. Please check the url and try again.');
97
+ return;
98
+ }
99
+ spinner.succeed('dotCMS is running.');
100
+ const dotcmsToken = await api_1.DotCMSApi.getAuthToken({
101
+ payload: {
102
+ user: userNameDotCmsInstance,
103
+ password: passwordDotCmsInstance,
104
+ expirationDays: '30',
105
+ label: 'token for frontend app'
106
+ },
107
+ url: tokenApiUrl
108
+ });
109
+ if (!dotcmsToken.ok) {
110
+ spinner.fail('Failed to get authentication token from Dotcms.');
111
+ return;
112
+ }
113
+ const demoSite = await api_1.DotCMSApi.getDemoSiteIdentifier({
114
+ siteName: 'demo.dotcms.com',
115
+ authenticationToken: dotcmsToken.val,
116
+ url: demoSiteApiURL
117
+ });
118
+ if (!demoSite.ok) {
119
+ spinner.fail('Failed to get demo site identifier from Dotcms.');
120
+ return;
121
+ }
122
+ const setUpUVE = await api_1.DotCMSApi.setupUVEConfig({
123
+ payload: {
124
+ configuration: {
125
+ hidden: false,
126
+ value: (0, utils_1.getUVEConfigValue)(`http://localhost:${(0, utils_1.getPortByFramework)(selectedFramework)}`)
127
+ }
128
+ },
129
+ siteId: demoSite.val.entity.identifier,
130
+ authenticationToken: dotcmsToken.val,
131
+ url: emaConfigApiURL
132
+ });
133
+ if (!setUpUVE.ok) {
134
+ spinner.fail('Failed to setup UVE configuration in Dotcms.');
135
+ return;
136
+ }
137
+ spinner.succeed('Project setup completed successfully.');
138
+ console.log('\n');
139
+ console.log(chalk_1.default.cyanBright('πŸ“„ Update your frontend environment variables:\n'));
140
+ // ENV BLOCK β€” nicely spaced + grouped
141
+ console.log(chalk_1.default.white('──────────────────────────────────────────────'));
142
+ console.log(chalk_1.default.white('🌐 Host (site): ') + chalk_1.default.green(urlDotcmsInstance));
143
+ console.log(chalk_1.default.white('🏷️ Site ID: ') + chalk_1.default.green(demoSite.val.entity.identifier));
144
+ console.log(chalk_1.default.white('πŸ” API Token: ') + chalk_1.default.green(dotcmsToken.val));
145
+ console.log(chalk_1.default.white('──────────────────────────────────────────────\n'));
146
+ // INSTALL DEPENDENCIES
147
+ console.log(chalk_1.default.magentaBright('πŸ“¦ Install frontend dependencies:'));
148
+ console.log(chalk_1.default.white(`$ cd ${finalDirectory}`));
149
+ console.log(chalk_1.default.white('$ npm install\n'));
150
+ // START DEV SERVER
151
+ console.log(chalk_1.default.blueBright('πŸ’» Start your frontend development server:'));
152
+ console.log(chalk_1.default.white('$ npm run dev\n'));
153
+ // FINAL MESSAGE
154
+ console.log(chalk_1.default.greenBright("πŸŽ‰ You're all set! Start building your app with dotCMS + your chosen frontend framework.\n"));
155
+ return;
156
+ }
157
+ // console.log(chalk.green("βœ” Starting DotCMS app setup...\n"));
158
+ // const spinner = ora(`Scaffolding ${framework} application ...`).start();
159
+ const spinner = (0, ora_1.default)(`Scaffolding ${selectedFramework} application ...`).start();
160
+ // STEP 1 β€” Scaffold front-end
161
+ const created = await scaffoldFrontendProject({
162
+ framework: selectedFramework,
163
+ directory: finalDirectory
164
+ });
165
+ if (!created.ok) {
166
+ spinner.fail(`Failed to scaffold frontend project (${selectedFramework}).`);
167
+ return;
168
+ }
169
+ spinner.succeed(`Frontend project (${selectedFramework}) scaffolded successfully.`);
170
+ spinner.start('Setting up dotCMS with Docker Compose...');
171
+ // STEP 2 β€” Download docker-compose
172
+ const downloaded = await downloadTheDockerCompose({
173
+ directory: finalDirectory
174
+ });
175
+ if (!downloaded.ok) {
176
+ spinner.fail('Failed to download Docker Compose file.');
177
+ return;
178
+ }
179
+ spinner.succeed('Docker Compose Download completed.');
180
+ spinner.start('Starting dotCMS with Docker Compose (This may take sometime enjoy a coffee β˜•οΈ )...');
181
+ // STEP 3 β€” Run docker-compose
182
+ const ran = await runDockerCompose({ directory: finalDirectory });
183
+ if (!ran.ok) {
184
+ spinner.fail('Failed to start dotCMS with Docker Compose.Please make sure docker is installed and running.');
185
+ return;
186
+ }
187
+ spinner.succeed('dotCMS containers started successfully.');
188
+ spinner.start('Verifying if dotCMS is running...');
189
+ const checkIfDotcmsIsRunning = await isDotcmsRunning();
190
+ if (!checkIfDotcmsIsRunning) {
191
+ spinner.fail('dotCMS is not running. Please check the docker containers.');
192
+ return;
193
+ }
194
+ spinner.succeed('dotCMS is running.');
195
+ const dotcmsToken = await api_1.DotCMSApi.getAuthToken({
196
+ payload: {
197
+ user: constants_1.DOTCMS_USER.username,
198
+ password: constants_1.DOTCMS_USER.password,
199
+ expirationDays: '30',
200
+ label: 'token for frontend app'
201
+ }
202
+ });
203
+ if (!dotcmsToken.ok) {
204
+ spinner.fail('Failed to get authentication token from Dotcms.');
205
+ return;
206
+ }
207
+ const demoSite = await api_1.DotCMSApi.getDemoSiteIdentifier({
208
+ siteName: 'demo.dotcms.com',
209
+ authenticationToken: dotcmsToken.val
210
+ });
211
+ if (!demoSite.ok) {
212
+ spinner.fail('Failed to get demo site identifier from Dotcms.');
213
+ return;
214
+ }
215
+ const setUpUVE = await api_1.DotCMSApi.setupUVEConfig({
216
+ payload: {
217
+ configuration: {
218
+ hidden: false,
219
+ value: (0, utils_1.getUVEConfigValue)(`http://localhost:${(0, utils_1.getPortByFramework)(selectedFramework)}`)
220
+ }
221
+ },
222
+ siteId: demoSite.val.entity.identifier,
223
+ authenticationToken: dotcmsToken.val
224
+ });
225
+ if (!setUpUVE.ok) {
226
+ spinner.fail('Failed to setup UVE configuration in Dotcms.');
227
+ return;
228
+ }
229
+ spinner.succeed('Project setup completed successfully.');
230
+ // ADD FINAL INSTRUCTIONS
231
+ console.log('\n');
232
+ console.log(chalk_1.default.cyanBright('πŸ“„ Update your frontend environment variables:\n'));
233
+ // ENV BLOCK β€” nicely spaced + grouped
234
+ console.log(chalk_1.default.white('──────────────────────────────────────────────'));
235
+ console.log(chalk_1.default.white('🌐 Host (site): ') + chalk_1.default.green(constants_1.DOTCMS_HOST));
236
+ console.log(chalk_1.default.white('🏷️ Site ID: ') + chalk_1.default.green(demoSite.val.entity.identifier));
237
+ console.log(chalk_1.default.white('πŸ” API Token: ') + chalk_1.default.green(dotcmsToken.val));
238
+ console.log(chalk_1.default.white('──────────────────────────────────────────────\n'));
239
+ // INSTALL DEPENDENCIES
240
+ console.log(chalk_1.default.magentaBright('πŸ“¦ Install frontend dependencies:'));
241
+ console.log(chalk_1.default.white(`$ cd ${finalDirectory}`));
242
+ console.log(chalk_1.default.white('$ npm install\n'));
243
+ // START DEV SERVER
244
+ console.log(chalk_1.default.blueBright('πŸ’» Start your frontend development server:'));
245
+ console.log(chalk_1.default.white('$ npm run dev\n'));
246
+ // FINAL MESSAGE
247
+ console.log(chalk_1.default.greenBright("πŸŽ‰ You're all set! Start building your app with dotCMS + your chosen frontend framework.\n"));
248
+ });
249
+ async function createApp() {
250
+ program.parse();
251
+ }
252
+ /* -------------------------------------------------------
253
+ * STEP FUNCTIONS (no spinner, only chalk)
254
+ * -----------------------------------------------------*/
255
+ async function scaffoldFrontendProject({ framework, directory }) {
256
+ try {
257
+ await (0, git_1.cloneFrontEndSample)({ directory, framework });
258
+ return (0, ts_results_1.Ok)(undefined);
259
+ }
260
+ catch (err) {
261
+ console.log(chalk_1.default.red(`❌ Failed to create ${framework} project. Please check git installation and network connection.` +
262
+ JSON.stringify(err)));
263
+ return (0, ts_results_1.Err)(new errors_1.FailedToCreateFrontendProjectError(framework));
264
+ }
265
+ }
266
+ async function downloadTheDockerCompose({ directory }) {
267
+ try {
268
+ // console.log(chalk.cyan("πŸ“₯ Downloading docker-compose.yml..."));
269
+ await (0, git_1.downloadDockerCompose)(directory);
270
+ // console.log(chalk.green(`βœ” docker-compose.yml downloaded successfully!\n`));
271
+ return (0, ts_results_1.Ok)(undefined);
272
+ }
273
+ catch (err) {
274
+ console.log(chalk_1.default.red('❌ Failed to download docker-compose.yml.' + JSON.stringify(err)));
275
+ return (0, ts_results_1.Err)(new errors_1.FailedToDownloadDockerComposeError());
276
+ }
277
+ }
278
+ async function runDockerCompose({ directory }) {
279
+ try {
280
+ // console.log(chalk.cyan("🐳 Starting Docker containers... (This might take some time)"));
281
+ await (0, execa_1.execa)('docker', ['compose', 'up', '-d'], { cwd: directory });
282
+ await (0, execa_1.execa)('docker', ['ps'], { cwd: directory });
283
+ // console.log(chalk.green("βœ” Docker containers started successfully!\n"));
284
+ return (0, ts_results_1.Ok)(undefined);
285
+ }
286
+ catch (err) {
287
+ return (0, ts_results_1.Err)(err);
288
+ }
289
+ }
290
+ async function isDotcmsRunning(url) {
291
+ try {
292
+ // console.log(chalk.cyan("Waiting for DotCMS to be up ...."));
293
+ const res = await (0, utils_1.fetchWithRetry)(url ?? constants_1.DOTCMS_HEALTH_API, 20, 5000);
294
+ if (res && res.status === 200) {
295
+ // console.log(chalk.green("βœ” DotCMS container started sucessfully!\n"));
296
+ return true;
297
+ }
298
+ return false;
299
+ }
300
+ catch (err) {
301
+ console.log(chalk_1.default.red('❌ Failed to run docker-compose. Please make sure if docker is installed and running inside your machine.', +JSON.stringify(err)));
302
+ return false;
303
+ }
304
+ }
305
+ createApp();
306
+ //# 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,12 @@
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>;
@@ -0,0 +1,75 @@
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
+ const tslib_1 = require("tslib");
9
+ const axios_1 = tslib_1.__importDefault(require("axios"));
10
+ const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
11
+ const https_1 = tslib_1.__importDefault(require("https"));
12
+ async function fetchWithRetry(url, retries = 5, delay = 5000) {
13
+ for (let i = 0; i < retries; i++) {
14
+ try {
15
+ return await axios_1.default.get(url);
16
+ }
17
+ catch (err) {
18
+ console.log(`dotCMS still not up 😴 ${i + 1}. Retrying in ${delay / 1000}s...`);
19
+ if (i === retries - 1)
20
+ throw err; // throw after last attempt
21
+ await new Promise((r) => setTimeout(r, delay));
22
+ }
23
+ }
24
+ }
25
+ function getUVEConfigValue(frontEndUrl) {
26
+ return JSON.stringify({
27
+ config: [
28
+ {
29
+ pattern: '.*',
30
+ url: frontEndUrl
31
+ }
32
+ ]
33
+ });
34
+ }
35
+ function getPortByFramework(framework) {
36
+ switch (framework) {
37
+ case 'angular':
38
+ return '4200';
39
+ case 'angular-ssr':
40
+ return '4200';
41
+ case 'nextjs':
42
+ return '3000';
43
+ case 'astro':
44
+ return '4321';
45
+ default:
46
+ throw new Error(`Unsupported framework: ${framework}`);
47
+ }
48
+ }
49
+ function getDotcmsApisByBaseUrl(baseUrl) {
50
+ return {
51
+ DOTCMS_HEALTH_API: `${baseUrl}/api/v1/probes/alive`,
52
+ DOTCMS_TOKEN_API: `${baseUrl}/api/v1/authentication/api-token`,
53
+ DOTCMS_EMA_CONFIG_API: `${baseUrl}/api/v1/apps/dotema-config-v2/`,
54
+ DOTCMS_DEMO_SITE: `${baseUrl}/api/v1/site/`
55
+ };
56
+ }
57
+ /** Utility to download a file using https */
58
+ function downloadFile(url, dest) {
59
+ return new Promise((resolve, reject) => {
60
+ const file = fs_extra_1.default.createWriteStream(dest);
61
+ https_1.default
62
+ .get(url, (response) => {
63
+ if (response.statusCode !== 200) {
64
+ return reject(new Error(`Failed to download file: ${response.statusCode}`));
65
+ }
66
+ response.pipe(file);
67
+ file.on('finish', () => file.close(() => resolve()));
68
+ })
69
+ .on('error', (err) => {
70
+ fs_extra_1.default.unlink(dest);
71
+ reject(err);
72
+ });
73
+ });
74
+ }
75
+ //# 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":";;AAOA,wCAYC;AAED,8CASC;AAED,gDAaC;AAED,wDAOC;AAGD,oCAkBC;;AA3ED,0DAA0B;AAC1B,gEAA0B;AAE1B,0DAA0B;AAInB,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,OAAO,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI;IACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,IAAI,CAAC;YACD,OAAO,MAAM,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,GAAG,CAAC,iBAAiB,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC;YAEhF,IAAI,CAAC,KAAK,OAAO,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC,CAAC,2BAA2B;YAE7D,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QACnD,CAAC;IACL,CAAC;AACL,CAAC;AAED,SAAgB,iBAAiB,CAAC,WAAmB;IACjD,OAAO,IAAI,CAAC,SAAS,CAAC;QAClB,MAAM,EAAE;YACJ;gBACI,OAAO,EAAE,IAAI;gBACb,GAAG,EAAE,WAAW;aACnB;SACJ;KACJ,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,kBAAkB,CAAC,SAAsC;IACrE,QAAQ,SAAS,EAAE,CAAC;QAChB,KAAK,SAAS;YACV,OAAO,MAAM,CAAC;QAClB,KAAK,aAAa;YACd,OAAO,MAAM,CAAC;QAClB,KAAK,QAAQ;YACT,OAAO,MAAM,CAAC;QAClB,KAAK,OAAO;YACR,OAAO,MAAM,CAAC;QAClB;YACI,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,EAAE,CAAC,CAAC;IAC/D,CAAC;AACL,CAAC;AAED,SAAgB,sBAAsB,CAAC,OAAe;IAClD,OAAO;QACH,iBAAiB,EAAE,GAAG,OAAO,sBAAsB;QACnD,gBAAgB,EAAE,GAAG,OAAO,kCAAkC;QAC9D,qBAAqB,EAAE,GAAG,OAAO,gCAAgC;QACjE,gBAAgB,EAAE,GAAG,OAAO,eAAe;KAC9C,CAAC;AACN,CAAC;AAED,6CAA6C;AAC7C,SAAgB,YAAY,CAAC,GAAW,EAAE,IAAY;IAClD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,MAAM,IAAI,GAAG,kBAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAExC,eAAK;aACA,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE;YACnB,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAC9B,OAAO,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAChF,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC;aACD,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACjB,kBAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAChB,MAAM,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACP,CAAC"}