Skip to content

[pull] main from TryGhost:main#1099

Merged
pull[bot] merged 15 commits intocode:mainfrom
TryGhost:main
Apr 27, 2026
Merged

[pull] main from TryGhost:main#1099
pull[bot] merged 15 commits intocode:mainfrom
TryGhost:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented Apr 27, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

9larsons and others added 15 commits April 27, 2026 17:37
no ref

Adds 11 entries to the root `pnpm.overrides` block to force vulnerable
transitive deps forward, without touching any direct deps. All
replacement versions are pinned with `^x.y.z` to keep upgrades within
the existing major.

**Modules:** `@tootallnate/once`, `clean-css`, `debug` (×2 ranges),
`diff` (×2 ranges), `handlebars`, `minimatch` (×2 ranges), `qs`, `tmp`

**Audit delta:** `pnpm audit` 153 → 123 (−1 crit, −14 high, −4 mod, −11
low)

## Notes

- `handlebars` and `tmp` are direct deps in `ghost/core` but already
match the override-target version, so this is a no-op for direct deps.
- Transitive major-version jumps (`clean-css 3 → 4`, `tmp 0.0.x →
0.2.5`, `diff 1 → 3`, `minimatch 0 → 3`) are confined to the Ember admin
dev/build toolchain (`broccoli-clean-css`, `mocha 2.5.3`, `sane`,
`external-editor`, `fixturify-project`); none reach production runtime,
public apps, or `ghost/core/server/`.
- Lockfile shrank by ~110 lines from override deduplication.
closes https://linear.app/ghost/issue/DES-1355/
closes https://linear.app/ghost/issue/DES-1354/

- bumped Koenig dependencies, including core editor app that includes fix for Tailwind V4/V3 conflicts that doubled up on negative translate positioning styles
no ref

Adds a single override to root `pnpm.overrides`:

```json
"tar@<7.5.11": "^7.5.11"
```

Forces `sqlite3`'s internal `node-gyp 8` chain — which previously pulled
the deprecated `tar@6.2.1` — onto `tar@7.5.13`. After the override, all
`tar` versions in the tree collapse to a single `7.5.13`.

## On the 6 → 7 major jump

This crosses a major boundary. Two mitigations apply:

- The actual consumer in this chain is `node-gyp`'s prebuild-extraction
step. It calls `tar.x()` (and the streaming variants), which haven't
changed across 6 → 7.
- The version-engine bump in tar 7 (Node 10+ → Node 18+) is satisfied —
`ghost/core` requires `node ^22.13.1`.

The 6.x line of `tar` has no fixed version (publisher marked it
deprecated), so an in-major fix isn't possible. The override is
removable when `sqlite3` is bumped to a release that ships with
`node-gyp >= 11`.

## Audit delta

`pnpm audit`: 123 → 117 (`−6 high`).
no ref

Bumps `multer` in `ghost/core` from `2.0.2` to `2.1.1` to clear three
high-severity advisories. Minor version within the 2.x major — no API
changes; `multer()`, `upload.single()`, `upload.fields()`, and
`multer.MulterError` behave identically.

## Advisories cleared

| CVE | severity | fixed in |
|---|---|---|
| CVE-2026-3304 | high | 2.1.0 |
| CVE-2026-2359 | high | 2.1.0 |
| CVE-2026-3520 | high | 2.1.1 |

`pnpm audit` total: 123 → 120 (`−3 high`).
no ref

`hbs.cachePartials` is async, but we weren't waiting for it. Let's start
doing that, which should make this test more reliable.
…7576)

no ref

Adds a single override to root `pnpm.overrides`:

```json
"@xmldom/xmldom@<0.8.13": "^0.8.13"
```

`@xmldom/xmldom` is transitive only — pulled in by `ghost/admin >
testem`. Resolved version after the override is `0.8.13`, a patch-level
bump within the 0.8.x line; no API surface change.

The override is removable when `testem` is bumped to a version that
declares `@xmldom/xmldom >= 0.8.13` directly.

## Audit delta

`pnpm audit`: 123 → 118 (`−5 high`).

## Test plan

- [x] `pnpm install` clean; `@xmldom/xmldom@0.8.13` resolved (single
version, no major drift)
- [x] `ghost/admin` Ember test suite (testem is the consumer) — 1065 /
1065 passing
- [ ] CI green
no ref

_I recommend reviewing this with whitespace changes disabled._

This is a test-only change.
no ref

This is a test-only change. I think it's useful on its own, but will
make upcoming changes (like migrating to Vitest) a bit easier.
ref #27421 (comment)

`emailAddressService.init()` was put in a `Promise.all` unnecessarily.
Now it's just a regular function call.
no ref

Adds a single override to root `pnpm.overrides`:

```json
"undici@<6.24.0": "^6.24.0"
```

The vulnerable `undici@5.29.0` was being pulled in via:

```
ghost/core > @tryghost/metrics > @tryghost/elasticsearch
  > @elastic/transport > undici@5.29.0
```

After the override, the chain resolves to `undici@6.24.1` (caret-pinned
within the 6.x major). Other undici versions in the tree (`6.24.1` from
`@actions/http-client`, `7.x` from `jsdom`) are unaffected — those
consumers were already on safe ranges.

## On the 5 → 6 major bump

This forces `@elastic/transport@8.4.1` to use undici 6 instead of 5.
`@elastic/transport` is a **runtime path** — it executes when
`@tryghost/metrics` ships log/metric data to elasticsearch.

- `@elastic/transport` loads cleanly under undici 6 in unit tests (no
require-time / load-time errors surfaced).
- The undici 5 → 6 changes that affect consumers are mostly the removal
of deprecated APIs and a Node-version bump (10+ → 18+); `ghost/core`
requires Node 22+ so the engine constraint is satisfied.
- `@elastic/transport` uses standard request/response APIs that haven't
changed across the bump.

The residual unknown is **actual elasticsearch traffic in production**.
Local tests don't exercise live ES requests; staging / CI integration
coverage is the place to catch this.

The override is removable when `@tryghost/metrics` or
`@elastic/transport` ships a release that declares `undici >= 6.24.0`
directly.

## Audit delta

`pnpm audit`: 114 → 109 (`−2 high`, `−3 moderate`).
no ref

Two apps (`apps/announcement-bar`, `apps/sodo-search`) reference
`concurrently` in their own `dev` scripts but never declared it as a
`devDependency`.
ref 30ab483

This test-only cleanup should have no user impact.
no ref

Two changes work together to clear all 3 lingering `lodash` advisories:

1. `ghost/core` direct dep: `lodash` `4.17.23` → `4.18.1`
2. Root `pnpm.overrides`: `"lodash@<4.18.0": "^4.18.0"`

The direct edit alone was not enough — transitive consumers `@tryghost/limit-service` (in `admin-x-settings`) and `@testing-library/jest-dom` (in `admin-x-framework`) still pulled `lodash@4.17.x`, keeping the high and moderate advisories alive. The override forces every `lodash` consumer in the tree to `>=4.18.0`, collapsing the resolved tree to a single `lodash@4.18.1` instance.

`lodash` 4.17 → 4.18 is a minor bump within the 4.x major; the API and function signatures are unchanged.

The override is removable when `@tryghost/limit-service` and `@testing-library/jest-dom` each ship a release that declares `lodash >=4.18.0` directly.
)

## Summary

Bumps `dompurify` from a vulnerable `3.3.x` release to `3.4.1` (current
latest) in the three workspaces that depend on it directly:

- `ghost/core`: `3.3.0` → `3.4.1`
- `apps/activitypub`: `3.3.1` → `3.4.1`
- `apps/portal`: `3.3.1` → `3.4.1`

Patch and minor versions within the dompurify 3.x line are backward-compatible; the `sanitize()` API and option shape are unchanged.
@pull pull Bot locked and limited conversation to collaborators Apr 27, 2026
@pull pull Bot added the ⤵️ pull label Apr 27, 2026
@pull pull Bot merged commit 84e3d43 into code:main Apr 27, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants