@adobe/aem-cli 16.18.7 → 16.19.1

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/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [16.19.1](https://github.com/adobe/helix-cli/compare/v16.19.0...v16.19.1) (2026-04-28)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **deps:** update adobe fixes ([#2718](https://github.com/adobe/helix-cli/issues/2718)) ([487bd65](https://github.com/adobe/helix-cli/commit/487bd65e26a38707050f4605f45f515bf59bf9e3))
7
+
8
+ # [16.19.0](https://github.com/adobe/helix-cli/compare/v16.18.7...v16.19.0) (2026-04-27)
9
+
10
+
11
+ ### Features
12
+
13
+ * extend --html-folder to serve local JSON form definitions on-the-fly ([3f0623a](https://github.com/adobe/helix-cli/commit/3f0623aa497c0f7aab4618808d8110ac460a14fb))
14
+
1
15
  ## [16.18.7](https://github.com/adobe/helix-cli/compare/v16.18.6...v16.18.7) (2026-04-27)
2
16
 
3
17
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adobe/aem-cli",
3
- "version": "16.18.7",
3
+ "version": "16.19.1",
4
4
  "description": "AEM CLI",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -45,10 +45,10 @@
45
45
  "dependencies": {
46
46
  "@adobe/fetch": "4.3.0",
47
47
  "@adobe/helix-log": "7.0.0",
48
- "@adobe/helix-shared-config": "11.1.21",
48
+ "@adobe/helix-shared-config": "11.1.22",
49
49
  "@adobe/helix-shared-git": "3.0.23",
50
50
  "@adobe/helix-shared-indexer": "2.2.7",
51
- "@adobe/helix-shared-process-queue": "3.1.8",
51
+ "@adobe/helix-shared-process-queue": "3.1.9",
52
52
  "camelcase": "9.0.0",
53
53
  "chalk-template": "1.1.2",
54
54
  "chokidar": "5.0.0",
@@ -87,7 +87,7 @@
87
87
  "yargs": "18.0.0"
88
88
  },
89
89
  "devDependencies": {
90
- "@adobe/eslint-config-helix": "3.0.25",
90
+ "@adobe/eslint-config-helix": "3.0.26",
91
91
  "@eslint/config-helpers": "0.5.5",
92
92
  "@semantic-release/changelog": "6.0.3",
93
93
  "@semantic-release/git": "10.0.1",
@@ -22,15 +22,15 @@
22
22
  }
23
23
  },
24
24
  "node_modules/@adobe/eslint-config-helix": {
25
- "version": "3.0.25",
26
- "resolved": "https://registry.npmjs.org/@adobe/eslint-config-helix/-/eslint-config-helix-3.0.25.tgz",
27
- "integrity": "sha512-3m8DoRPS/vq91ANyqbrgh/YnDljbHhZXpKooSWRK+OIoArkY6ju/NSFYYzbLj5ImVmfg3I4JPoiiWnNR/OTCGQ==",
25
+ "version": "3.0.26",
26
+ "resolved": "https://registry.npmjs.org/@adobe/eslint-config-helix/-/eslint-config-helix-3.0.26.tgz",
27
+ "integrity": "sha512-fF+yS57VSRd7ydKSgY170Q412dqwAB9euugEHDNBv3+qNvKByqiLvgfcAtodY6cwN9aUa6K8z1Yuezi3Q2+RyQ==",
28
28
  "dev": true,
29
29
  "license": "Apache-2.0",
30
30
  "dependencies": {
31
- "@eslint/config-helpers": "0.5.4",
31
+ "@eslint/config-helpers": "0.5.5",
32
32
  "eslint-plugin-import": "2.32.0",
33
- "globals": "17.4.0"
33
+ "globals": "17.5.0"
34
34
  },
35
35
  "engines": {
36
36
  "node": ">= 12"
@@ -39,32 +39,6 @@
39
39
  "eslint": "^9.0.0"
40
40
  }
41
41
  },
42
- "node_modules/@adobe/eslint-config-helix/node_modules/@eslint/config-helpers": {
43
- "version": "0.5.4",
44
- "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.4.tgz",
45
- "integrity": "sha512-jJhqiY3wPMlWWO3370M86CPJ7pt8GmEwSLglMfQhjXal07RCvhmU0as4IuUEW5SJeunfItiEetHmSxCCe9lDBg==",
46
- "dev": true,
47
- "license": "Apache-2.0",
48
- "dependencies": {
49
- "@eslint/core": "^1.2.0"
50
- },
51
- "engines": {
52
- "node": "^20.19.0 || ^22.13.0 || >=24"
53
- }
54
- },
55
- "node_modules/@adobe/eslint-config-helix/node_modules/@eslint/core": {
56
- "version": "1.2.1",
57
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz",
58
- "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==",
59
- "dev": true,
60
- "license": "Apache-2.0",
61
- "dependencies": {
62
- "@types/json-schema": "^7.0.15"
63
- },
64
- "engines": {
65
- "node": "^20.19.0 || ^22.13.0 || >=24"
66
- }
67
- },
68
42
  "node_modules/@babel/code-frame": {
69
43
  "version": "7.27.1",
70
44
  "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
@@ -3595,9 +3569,9 @@
3595
3569
  }
3596
3570
  },
3597
3571
  "node_modules/globals": {
3598
- "version": "17.4.0",
3599
- "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz",
3600
- "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==",
3572
+ "version": "17.5.0",
3573
+ "resolved": "https://registry.npmjs.org/globals/-/globals-17.5.0.tgz",
3574
+ "integrity": "sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==",
3601
3575
  "dev": true,
3602
3576
  "license": "MIT",
3603
3577
  "engines": {
@@ -228,7 +228,10 @@ export class HelixProject extends BaseProject {
228
228
  await lstat(htmlFolderPath);
229
229
  this.log.debug(`Registered HTML folder for live-reload: ${this._htmlFolder}`);
230
230
  // Watch all HTML files in the folder - only .html extension
231
- this.liveReload.registerFiles([`${htmlFolderPath}/**/*.html`], this._server.mountPrefix);
231
+ this.liveReload.registerFiles([
232
+ `${htmlFolderPath}/**/*.html`,
233
+ `${htmlFolderPath}/**/*.json`,
234
+ ], this._server.mountPrefix);
232
235
  } catch (e) {
233
236
  this.log.error(`HTML folder '${this._htmlFolder}' does not exist`);
234
237
  throw new Error(`HTML folder '${this._htmlFolder}' does not exist`);
@@ -307,6 +307,10 @@ export class HelixServer extends BaseServer {
307
307
  // Resolve which file to serve (.html or .plain.html)
308
308
  const resolvedFile = await this.resolveHtmlFolderFile(relativePath);
309
309
  if (!resolvedFile) {
310
+ // Serve static assets (e.g. .json) from the html-folder as-is
311
+ if (relativePath.includes('.')) {
312
+ return this.serveHtmlFolderStaticFile(req, res, next, relativePath);
313
+ }
310
314
  return next();
311
315
  }
312
316
 
@@ -348,6 +352,55 @@ export class HelixServer extends BaseServer {
348
352
  return undefined;
349
353
  }
350
354
 
355
+ /**
356
+ * Serves static files from the HTML folder as-is
357
+ * @param {Express.Request} req request
358
+ * @param {Express.Response} res response
359
+ * @param {Function} next next middleware
360
+ * @param {string} relativePath path relative to HTML folder
361
+ */
362
+ async serveHtmlFolderStaticFile(req, res, next, relativePath) {
363
+ if (relativePath.includes('/../') || relativePath.includes('..')) {
364
+ return next();
365
+ }
366
+
367
+ const filePath = path.resolve(
368
+ this._project.directory,
369
+ this._htmlFolder,
370
+ relativePath,
371
+ );
372
+
373
+ if (!utils.validatePathSecurity(
374
+ filePath,
375
+ this._project.directory,
376
+ )) {
377
+ return next();
378
+ }
379
+
380
+ try {
381
+ const stats = await lstat(filePath);
382
+ if (!stats.isFile()) {
383
+ return next();
384
+ }
385
+ } catch (e) {
386
+ return next();
387
+ }
388
+
389
+ const sendFile = promisify(res.sendFile).bind(res);
390
+ try {
391
+ await sendFile(filePath, {
392
+ dotfiles: 'allow',
393
+ headers: { 'access-control-allow-origin': '*' },
394
+ });
395
+ this.log.debug(
396
+ `served static file ${filePath} for ${req.url}`,
397
+ );
398
+ } catch (e) {
399
+ return next();
400
+ }
401
+ return undefined;
402
+ }
403
+
351
404
  /**
352
405
  * Proxy Mode route handler
353
406
  * @param {Express.Request} req request