@magnolia/cli-jumpstart-plugin 1.1.4 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"t":0,"agent":"a0b40ff","agent_type":"unknown","event":"agent_stop","success":true}
@@ -0,0 +1,7 @@
1
+ {
2
+ "agents": [],
3
+ "total_spawned": 0,
4
+ "total_completed": 0,
5
+ "total_failed": 0,
6
+ "last_updated": "2026-05-15T10:21:31.045Z"
7
+ }
package/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.2.0 (2026-05-15)
4
+ * Install Magnolia CLI as a devDependency in jumpstarted projects ([MGNLCLI-440](https://magnolia-cms.atlassian.net/browse/MGNLCLI-440))
5
+ * Add resolver for US and AP nexus regions ([MGNLCLI-442](https://magnolia-cms.atlassian.net/browse/MGNLCLI-442))
6
+ * Add `--apache-tomcat` flag to override the Tomcat version ([MGNLCLI-480](https://magnolia-cms.atlassian.net/browse/MGNLCLI-480))
7
+ * Enable New UI Forms opt-in flags by default for 6.4.x jumpstart ([MGNLCLI-484](https://magnolia-cms.atlassian.net/browse/MGNLCLI-484))
8
+
9
+ ## 1.1.5 (2025-10-02)
10
+ * Update dependencies ([MGNLCLI-436](https://magnolia-cms.atlassian.net/browse/MGNLCLI-436))
11
+
3
12
  ## 1.1.4 (2025-09-19)
4
13
  * Hotfix: Remove part causing 404 when downloading from nexus
5
14
 
@@ -22,7 +22,7 @@ import { installDependencies } from './lib/install.js';
22
22
  import path from 'path';
23
23
  import fs from 'fs-extra';
24
24
  import process from 'process';
25
- import { askForCredentials, copyDownloadedFile, handleLightModulesFolder, handleLightModulesPathInTemplate, initializeNodeProject, } from './lib/helper.js';
25
+ import { askForCredentials, copyDownloadedFile, extractMagnoliaVersion, handleLightModulesFolder, handleLightModulesPathInTemplate, initializeNodeProject, } from './lib/helper.js';
26
26
  import { compileCustomPrompts, evaluateCustomPrompts, } from './lib/extensions.js';
27
27
  import { addConfigProps } from './lib/config-helper.js';
28
28
  import { installAdditionalPlugins } from './lib/config-helper.js';
@@ -52,6 +52,7 @@ export default class JumpstartPlugin extends PluginTemplate {
52
52
  new Option('-s, --snapshot', i18nInstance.t('option-snapshot-description')),
53
53
  new Option('-t, --template <name>', i18nInstance.t('option-template-description')),
54
54
  new Option('-pt, --project-templates <source>', i18nInstance.t('option-projectTemplates-description')),
55
+ new Option('-at, --apache-tomcat <version>', i18nInstance.t('option-tomcatVersion-description')),
55
56
  ];
56
57
  }
57
58
  executePostCommands(bundle, file) {
@@ -125,7 +126,7 @@ export default class JumpstartPlugin extends PluginTemplate {
125
126
  throw new CreateError(e.message);
126
127
  }
127
128
  }
128
- yield handleLightModulesFolder();
129
+ yield handleLightModulesFolder(extractMagnoliaVersion(template.bundles));
129
130
  yield initializeNodeProject();
130
131
  if (template.plugins) {
131
132
  yield installAdditionalPlugins(template.plugins);
@@ -1,4 +1,5 @@
1
1
  import { Bundle, Credentials, PluginOptions } from '../types/types.js';
2
+ export declare const isMagnoliaBundle: (bundle: Bundle) => boolean;
2
3
  export declare const downloadBundle: (bundle: Bundle, credentials: Credentials, dest: string | undefined, options: PluginOptions, allBundles?: Bundle[], authProfiles?: Record<string, Credentials>) => Promise<string>;
3
4
  export declare const getDownloadUrl: (bundle: Bundle, credentials: Credentials, options: PluginOptions, authProfiles?: Record<string, Credentials>) => Promise<string>;
4
5
  export declare const selectTag: (url: string, credentials: Credentials) => Promise<string>;
@@ -18,6 +18,10 @@ import { CreateError, prependNumbersToChoices, } from '@magnolia/cli-helper/gene
18
18
  import { HttpsProxyAgent } from 'https-proxy-agent';
19
19
  import { HttpProxyAgent } from 'http-proxy-agent';
20
20
  let discoveredMagnoliaVersion = null;
21
+ export const isMagnoliaBundle = (bundle) => {
22
+ return (bundle.url.includes('maven.groupId=info.magnolia') &&
23
+ !bundle.url.includes('magnolia-tomcat-barebone'));
24
+ };
21
25
  const constructMavenSearchUrl = (bundle, options, isTomcatExcluded = false) => {
22
26
  const bundleCopy = Object.assign({}, bundle);
23
27
  const url = new URL(bundleCopy.url);
@@ -150,6 +154,13 @@ const modifyTomcatBundleUrl = (bundle, allBundles, credentials, options, authPro
150
154
  if (!bundle.url.includes('magnolia-tomcat-barebone')) {
151
155
  return bundle;
152
156
  }
157
+ if (options === null || options === void 0 ? void 0 : options.apacheTomcat) {
158
+ if (!bundle.url.includes('maven.baseVersion=') || bundle.version) {
159
+ bundle.url = `${bundle.url}&maven.baseVersion=${options.apacheTomcat}`;
160
+ }
161
+ bundle.version = options.apacheTomcat;
162
+ return bundle;
163
+ }
153
164
  if (discoveredMagnoliaVersion) {
154
165
  return updateTomcatBundleUrl(bundle, discoveredMagnoliaVersion);
155
166
  }
@@ -171,10 +182,6 @@ const modifyTomcatBundleUrl = (bundle, allBundles, credentials, options, authPro
171
182
  }
172
183
  return bundle;
173
184
  });
174
- const isMagnoliaBundle = (bundle) => {
175
- return (bundle.url.includes('maven.groupId=info.magnolia') &&
176
- !bundle.url.includes('magnolia-tomcat-barebone'));
177
- };
178
185
  const updateTomcatBundleUrl = (bundle, magnoliaVersion) => {
179
186
  const versionParts = magnoliaVersion.split('.');
180
187
  const majorVersion = parseInt(versionParts[0]);
@@ -198,7 +205,9 @@ export const downloadBundle = (bundle, credentials, dest, options, allBundles, a
198
205
  downloadUrl = yield selectTag(url, credentials);
199
206
  }
200
207
  else if (url.includes('https://nexus.magnolia-cms.com/service/rest/v1/search') ||
201
- url.includes('https://nexus.magnolia-cms.cn/service/rest/v1/search')) {
208
+ url.includes('https://nexus.magnolia-cms.cn/service/rest/v1/search') ||
209
+ url.includes('http://nexus.us.magnolia-cms.com/service/rest/v1/search') ||
210
+ url.includes('https://nexus.ap.magnolia-cms.com/service/rest/v1/search')) {
202
211
  logger === null || logger === void 0 ? void 0 : logger.info(i18nInstance.t('info-download-preparing', {
203
212
  url,
204
213
  }));
@@ -269,7 +278,10 @@ export const getDownloadUrl = (bundle, credentials, options, authProfiles) => __
269
278
  const { item, modifiedBundle } = yield fetchMavenArtifact(bundle, options, credentials, true, authProfiles);
270
279
  bundle.version = modifiedBundle.version;
271
280
  if (!item) {
272
- throw new Error(i18nInstance.t('error-no-artifact-available', {
281
+ const isTomcatBundle = bundle.url.includes('magnolia-tomcat-barebone');
282
+ throw new Error(i18nInstance.t(isTomcatBundle
283
+ ? 'error-no-tomcat-artifact-available'
284
+ : 'error-no-artifact-available', {
273
285
  version: bundle.version,
274
286
  }));
275
287
  }
@@ -1,5 +1,10 @@
1
1
  import { Bundle, Credentials } from '../types/types.js';
2
- export declare const handleLightModulesFolder: () => Promise<void>;
2
+ export declare const isMagnoliaSixFourVersion: (version: string | null | undefined) => boolean;
3
+ export declare const extractMagnoliaVersion: (bundles: Array<Bundle> | undefined) => string | null;
4
+ export declare const buildWebAppMagnoliaProperties: (webAppPath: string, lightModulesRelativePath: string, magnoliaVersion: string | null | undefined) => {
5
+ [key: string]: string;
6
+ };
7
+ export declare const handleLightModulesFolder: (magnoliaVersion?: string | null) => Promise<void>;
3
8
  export declare const handleLightModulesPathInTemplate: (template: any) => Promise<void>;
4
9
  export declare const findLightModulesFolder: (p: string) => Promise<unknown>;
5
10
  export declare const findWebAppsList: (apacheTomcatPath: string) => string[];
@@ -15,13 +15,43 @@ import { execa } from 'execa';
15
15
  import path from 'path';
16
16
  import fs from 'fs-extra';
17
17
  import { findExtractedApacheTomcatDir } from './extract.js';
18
+ import { isMagnoliaBundle } from './download.js';
18
19
  import walk from 'walk';
19
20
  import { i18nInstance, logger } from '../jumpstart-plugin.js';
20
21
  import inquirer from 'inquirer';
21
22
  import { CreateError } from '@magnolia/cli-helper/general-utils';
22
23
  import { getRelativePathToMGNLConfig } from '@magnolia/cli-helper';
23
24
  import chalk from 'chalk';
24
- export const handleLightModulesFolder = () => __awaiter(void 0, void 0, void 0, function* () {
25
+ export const isMagnoliaSixFourVersion = (version) => {
26
+ if (!version)
27
+ return false;
28
+ const parts = version.split('.');
29
+ return parseInt(parts[0]) === 6 && parseInt(parts[1]) === 4;
30
+ };
31
+ export const extractMagnoliaVersion = (bundles) => {
32
+ var _a;
33
+ const magnoliaBundle = (bundles || []).find(isMagnoliaBundle);
34
+ return (_a = magnoliaBundle === null || magnoliaBundle === void 0 ? void 0 : magnoliaBundle.version) !== null && _a !== void 0 ? _a : null;
35
+ };
36
+ export const buildWebAppMagnoliaProperties = (webAppPath, lightModulesRelativePath, magnoliaVersion) => {
37
+ const props = {
38
+ 'magnolia.resources.dir': '${magnolia.home}/' + lightModulesRelativePath,
39
+ 'magnolia.update.auto': 'true',
40
+ };
41
+ if (webAppPath.endsWith('magnoliaAuthor')) {
42
+ props['magnolia.develop'] = 'true';
43
+ props['magnolia.graphql.introspection.enabled'] = 'true';
44
+ props['magnolia.personalization.rest.allowVariants'] = 'true';
45
+ if (isMagnoliaSixFourVersion(magnoliaVersion)) {
46
+ props['magnolia.warp.forms.vaadin.actions'] = 'true';
47
+ props['magnolia.warp.forms.tabs.enabled'] = 'true';
48
+ props['magnolia.warp.forms.field.codeField'] = 'true';
49
+ props['magnolia.warp.forms.field.hiddenField'] = 'true';
50
+ }
51
+ }
52
+ return props;
53
+ };
54
+ export const handleLightModulesFolder = (magnoliaVersion) => __awaiter(void 0, void 0, void 0, function* () {
25
55
  // eslint-disable-next-line no-console
26
56
  console.log(chalk.cyanBright('==========================================='));
27
57
  let lightModulesPath;
@@ -59,15 +89,7 @@ export const handleLightModulesFolder = () => __awaiter(void 0, void 0, void 0,
59
89
  const lightModulesPathToMagnoliaHomeRelPath = process.platform === 'win32'
60
90
  ? path.relative(webApp, lightModulesPath).replace(/\\/g, '/')
61
91
  : path.relative(webApp, lightModulesPath);
62
- const props = {
63
- 'magnolia.resources.dir': '${magnolia.home}/' + lightModulesPathToMagnoliaHomeRelPath,
64
- 'magnolia.update.auto': 'true',
65
- };
66
- if (webApp.endsWith('magnoliaAuthor')) {
67
- props['magnolia.develop'] = 'true';
68
- props['magnolia.graphql.introspection.enabled'] = 'true';
69
- props['magnolia.personalization.rest.allowVariants'] = 'true';
70
- }
92
+ const props = buildWebAppMagnoliaProperties(webApp, lightModulesPathToMagnoliaHomeRelPath, magnoliaVersion);
71
93
  const webAppPropertiesFilePath = path.join(webApp, 'WEB-INF', 'config', 'default', 'magnolia.properties');
72
94
  editProperties(webAppPropertiesFilePath, props);
73
95
  }
@@ -164,7 +186,10 @@ export const installPackage = (packageManager, packageReference, packageName) =>
164
186
  packageName: packageName,
165
187
  }));
166
188
  try {
167
- yield execa(packageManager, [packageManager === 'npm' ? 'install' : 'add', packageReference], {
189
+ const installArgs = packageManager === 'npm'
190
+ ? ['install', '--save-dev', packageReference]
191
+ : ['add', '--dev', packageReference];
192
+ yield execa(packageManager, installArgs, {
168
193
  buffer: true,
169
194
  cwd: process.cwd(),
170
195
  });
@@ -198,7 +223,9 @@ export const askForCredentials = (bundle) => __awaiter(void 0, void 0, void 0, f
198
223
  bundle: bundle,
199
224
  }));
200
225
  if (bundle.startsWith('https://nexus.magnolia-cms.com') ||
201
- bundle.startsWith('https://nexus.magnolia-cms.cn')) {
226
+ bundle.startsWith('https://nexus.magnolia-cms.cn') ||
227
+ bundle.startsWith('http://nexus.us.magnolia-cms.com') ||
228
+ bundle.startsWith('http://nexus.ap.magnolia-cms.com')) {
202
229
  logger === null || logger === void 0 ? void 0 : logger.warn(i18nInstance.t('info-use-nexus-token'));
203
230
  }
204
231
  return inquirer.prompt([
@@ -4,6 +4,7 @@
4
4
  "option-projectTemplates-description": "specify the source to load project templates from",
5
5
  "option-magnolia-description": "set the Magnolia version; defaults to the latest stable version",
6
6
  "option-snapshot-description": "download the latest snapshot version of the specified or latest stable webapp",
7
+ "option-tomcatVersion-description": "override the Apache Tomcat version; defaults to the version determined by the Magnolia version",
7
8
 
8
9
  "info-enter-credentials": "Enter the credentials for \"{{bundle}}\"",
9
10
  "info-use-nexus-token": [
@@ -50,6 +51,7 @@
50
51
  "Please search the web on \"unable to get local issuer certificate\" for more information"
51
52
  ],
52
53
  "error-no-artifact-available": "No Magnolia bundle with version \"{{version}}\" is available",
54
+ "error-no-tomcat-artifact-available": "No Apache Tomcat (\"magnolia-tomcat-barebone\") with version \"{{version}}\" is available",
53
55
  "error-while-getting-projectTemplates": "An error occurred while getting \"projectTemplates\":",
54
56
  "error-no-projectTemplates-from-url": "Cannot fetch remote projectTemplates file located at: \"{{url}}\"; are you connected to the internet? does it point to a JSON file?",
55
57
  "error-no-projectTemplates-from-path": "Cannot read projectTemplates from a local file located at: \"{{path}}\"; is it a JSON file?",
@@ -22,7 +22,8 @@ export const handlePackageJSON = () => __awaiter(void 0, void 0, void 0, functio
22
22
  });
23
23
  export const modifyPackageJSON = (pjPath) => __awaiter(void 0, void 0, void 0, function* () {
24
24
  let pj = JSON.parse(fs.readFileSync(pjPath, 'utf8'));
25
- let isMgnlCliInstalled = (pj === null || pj === void 0 ? void 0 : pj.dependencies) && (pj === null || pj === void 0 ? void 0 : pj.dependencies['@magnolia/cli']);
25
+ let isMgnlCliInstalled = ((pj === null || pj === void 0 ? void 0 : pj.dependencies) && (pj === null || pj === void 0 ? void 0 : pj.dependencies['@magnolia/cli'])) ||
26
+ ((pj === null || pj === void 0 ? void 0 : pj.devDependencies) && (pj === null || pj === void 0 ? void 0 : pj.devDependencies['@magnolia/cli']));
26
27
  if (!isMgnlCliInstalled) {
27
28
  isMgnlCliInstalled = yield installCLI();
28
29
  if (isMgnlCliInstalled) {
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magnolia/cli-jumpstart-plugin",
3
- "version": "1.1.4",
3
+ "version": "1.2.0",
4
4
  "description": "A plugin for Magnolia CLI to download and set up a new headless or freemarker-based project with Magnolia webapp",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -25,50 +25,50 @@
25
25
  "devDependencies": {
26
26
  "@jest/globals": "^29.7.0",
27
27
  "@types/decompress": "^4.2.7",
28
- "@types/filenamify": "^2.0.1",
28
+ "@types/filenamify": "^3.0.1",
29
29
  "@types/fs-extra": "^11.0.4",
30
- "@types/inquirer": "^9.0.7",
30
+ "@types/inquirer": "^9.0.9",
31
31
  "@types/js-beautify": "^1.14.3",
32
- "@types/node": "^22.13.4",
32
+ "@types/node": "^24.5.2",
33
33
  "@types/progress": "^2.0.7",
34
34
  "@types/underscore": "^1.13.0",
35
35
  "@types/walk": "^2.3.4",
36
- "cpy-cli": "^5.0.0",
36
+ "cpy-cli": "^6.0.0",
37
37
  "depcheck": "^1.4.7",
38
- "eslint": "^9.20.1",
38
+ "eslint": "^9.36.0",
39
39
  "husky": "^9.1.7",
40
40
  "jest": "^29.7.0",
41
- "lint-staged": "^15.4.3",
42
- "prettier": "^3.5.1",
43
- "typescript": "^5.7.3"
41
+ "lint-staged": "^16.2.0",
42
+ "prettier": "^3.6.2",
43
+ "typescript": "^5.9.2"
44
44
  },
45
45
  "dependencies": {
46
- "@babel/generator": "^7.26.9",
47
- "@babel/parser": "^7.26.9",
48
- "@babel/traverse": "^7.26.9",
49
- "@babel/types": "^7.26.9",
50
- "@magnolia/cli-helper": "^1.0.5",
51
- "@magnolia/cli-plugin-template": "^1.1.3",
52
- "axios": "^1.7.9",
53
- "chalk": "^5.4.1",
46
+ "@babel/generator": "^7.28.3",
47
+ "@babel/parser": "^7.28.4",
48
+ "@babel/traverse": "^7.28.4",
49
+ "@babel/types": "^7.28.4",
50
+ "@magnolia/cli-helper": "^1.1.1",
51
+ "@magnolia/cli-plugin-template": "^1.2.1",
52
+ "axios": "^1.12.2",
53
+ "chalk": "^5.6.2",
54
54
  "commander": "^12.1.0",
55
55
  "decompress": "^4.2.1",
56
- "dotenv": "^16.4.7",
57
- "execa": "^9.5.2",
58
- "filenamify": "^6.0.0",
59
- "fs-extra": "^11.3.0",
60
- "glob": "^11.0.1",
56
+ "dotenv": "^17.2.2",
57
+ "execa": "^9.6.0",
58
+ "filenamify": "^7.0.0",
59
+ "fs-extra": "^11.3.2",
60
+ "glob": "^11.0.3",
61
61
  "http-proxy-agent": "^7.0.2",
62
62
  "https-proxy-agent": "^7.0.6",
63
- "inquirer": "^12.4.2",
64
- "js-beautify": "^1.15.3",
63
+ "inquirer": "^12.9.6",
64
+ "js-beautify": "^1.15.4",
65
65
  "json5": "^2.2.3",
66
- "ora": "^8.2.0",
66
+ "ora": "^9.0.0",
67
67
  "progress": "^2.0.3",
68
68
  "underscore": "^1.13.7",
69
69
  "walk": "^2.3.15",
70
70
  "winston": "^3.17.0",
71
- "yaml": "^2.7.0"
71
+ "yaml": "^2.8.1"
72
72
  },
73
73
  "type": "module",
74
74
  "standard": {
@@ -3,6 +3,7 @@ export interface PluginOptions {
3
3
  projectTemplates: string;
4
4
  magnolia?: string;
5
5
  snapshot?: boolean;
6
+ apacheTomcat?: string;
6
7
  }
7
8
  export interface Bundle {
8
9
  url: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magnolia/cli-jumpstart-plugin",
3
- "version": "1.1.4",
3
+ "version": "1.2.0",
4
4
  "description": "A plugin for Magnolia CLI to download and set up a new headless or freemarker-based project with Magnolia webapp",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -25,50 +25,50 @@
25
25
  "devDependencies": {
26
26
  "@jest/globals": "^29.7.0",
27
27
  "@types/decompress": "^4.2.7",
28
- "@types/filenamify": "^2.0.1",
28
+ "@types/filenamify": "^3.0.1",
29
29
  "@types/fs-extra": "^11.0.4",
30
- "@types/inquirer": "^9.0.7",
30
+ "@types/inquirer": "^9.0.9",
31
31
  "@types/js-beautify": "^1.14.3",
32
- "@types/node": "^22.13.4",
32
+ "@types/node": "^24.5.2",
33
33
  "@types/progress": "^2.0.7",
34
34
  "@types/underscore": "^1.13.0",
35
35
  "@types/walk": "^2.3.4",
36
- "cpy-cli": "^5.0.0",
36
+ "cpy-cli": "^6.0.0",
37
37
  "depcheck": "^1.4.7",
38
- "eslint": "^9.20.1",
38
+ "eslint": "^9.36.0",
39
39
  "husky": "^9.1.7",
40
40
  "jest": "^29.7.0",
41
- "lint-staged": "^15.4.3",
42
- "prettier": "^3.5.1",
43
- "typescript": "^5.7.3"
41
+ "lint-staged": "^16.2.0",
42
+ "prettier": "^3.6.2",
43
+ "typescript": "^5.9.2"
44
44
  },
45
45
  "dependencies": {
46
- "@babel/generator": "^7.26.9",
47
- "@babel/parser": "^7.26.9",
48
- "@babel/traverse": "^7.26.9",
49
- "@babel/types": "^7.26.9",
50
- "@magnolia/cli-helper": "^1.0.5",
51
- "@magnolia/cli-plugin-template": "^1.1.3",
52
- "axios": "^1.7.9",
53
- "chalk": "^5.4.1",
46
+ "@babel/generator": "^7.28.3",
47
+ "@babel/parser": "^7.28.4",
48
+ "@babel/traverse": "^7.28.4",
49
+ "@babel/types": "^7.28.4",
50
+ "@magnolia/cli-helper": "^1.1.1",
51
+ "@magnolia/cli-plugin-template": "^1.2.1",
52
+ "axios": "^1.12.2",
53
+ "chalk": "^5.6.2",
54
54
  "commander": "^12.1.0",
55
55
  "decompress": "^4.2.1",
56
- "dotenv": "^16.4.7",
57
- "execa": "^9.5.2",
58
- "filenamify": "^6.0.0",
59
- "fs-extra": "^11.3.0",
60
- "glob": "^11.0.1",
56
+ "dotenv": "^17.2.2",
57
+ "execa": "^9.6.0",
58
+ "filenamify": "^7.0.0",
59
+ "fs-extra": "^11.3.2",
60
+ "glob": "^11.0.3",
61
61
  "http-proxy-agent": "^7.0.2",
62
62
  "https-proxy-agent": "^7.0.6",
63
- "inquirer": "^12.4.2",
64
- "js-beautify": "^1.15.3",
63
+ "inquirer": "^12.9.6",
64
+ "js-beautify": "^1.15.4",
65
65
  "json5": "^2.2.3",
66
- "ora": "^8.2.0",
66
+ "ora": "^9.0.0",
67
67
  "progress": "^2.0.3",
68
68
  "underscore": "^1.13.7",
69
69
  "walk": "^2.3.15",
70
70
  "winston": "^3.17.0",
71
- "yaml": "^2.7.0"
71
+ "yaml": "^2.8.1"
72
72
  },
73
73
  "type": "module",
74
74
  "standard": {