Skip to content

Upgrade the remaining major dependencies deferred from the Astro 7 PR#4139

Merged
bgruening merged 8 commits into
galaxyproject:mainfrom
dannon:dep-upgrades
Jul 20, 2026
Merged

Upgrade the remaining major dependencies deferred from the Astro 7 PR#4139
bgruening merged 8 commits into
galaxyproject:mainfrom
dannon:dep-upgrades

Conversation

@dannon

@dannon dannon commented Jul 20, 2026

Copy link
Copy Markdown
Member

Follow-up to #4124, taking care of the rest of the majors that dependabot's #4122 tried to land in one shot: linkinator 7, @sindresorhus/slugify 3, marked 18, @citation-js 0.8, lucide 1.x, and eslint 10. One commit per upgrade, each verified independently.

Most were mechanical, verified by diffing generated output before and after: slugify's generated redirects and the citation-js citations pages are byte-identical, and marked 18's only output change is the documented trailing-blank-line trim, which shows up as cosmetic whitespace between tags in three feed files.

Two needed real changes:

  • lucide 1.0 renamed lucide-vue-next to @lucide/vue (same API, import swap) and dropped brand icons. Content still references github/twitter/linkedin through the mdx Icon component, so those three SVGs are vendored from lucide-static 0.575 (ISC) in brand-icons.ts with a fallback lookup in Icon.astro -- the built site renders identically, verified by comparing unknown-icon spans and brand SVG presence across the full build.
  • eslint 10 drops legacy .eslintrc support, so the config moves to eslint.config.mjs with the same semantics (same recommended sets, same rule overrides), the plugins move to their current majors (eslint-plugin-astro 2, eslint-plugin-vue 10), @typescript-eslint/* becomes the typescript-eslint meta package, and the lint scripts drop --ext. The flat config lints exactly the same 260 files the old setup covered. The new recommended rules flagged a handful of real minor issues (dead initializers, required-props-with-defaults) -- fixed in their own commit.

Rounded off with an npm update to refresh in-range minors (astro 7.1, lucide 1.25, playwright 1.61, prettier 3.9 -- which reformatted two files, type-level only).

Build, unit tests (191), lint, format check, and the full Playwright suite (145) all pass at the tip.

dannon added 8 commits July 20, 2026 08:28
API is unchanged for our check-links script (LinkChecker class, link/pagestart
events, check() options all work as before). Verified by running the full
internal link crawl against a served build with both v6 and v7 -- v7 finds a
strict superset of v6's results, catching a few trailing-slash variants of
already-broken links that v6 missed.
Only used in generate-redirects.mjs for legacy Gridsome-style slugs. v3 just
raises the Node floor to 20 and adds new options -- regenerated redirects are
byte-identical to v2's output.
We only use plain marked.parse/parseInline with no extensions or custom
renderers. The one output change is the documented trailing-blank-line trim
after raw HTML blocks, which shows up as removed \n\n between tags in feed
content strings -- verified by diffing the full built site (2800+ pages) with
asset hashes normalized; the only real differences were that whitespace in
three feed files, which renders identically.
We only use the BibTeX input parser (new Cite(text) + cite.data for CSL-JSON);
the 0.7/0.8 breaking changes are in output plugins (csl/ris/wikidata) we don't
touch. All ten built citations pages are byte-identical before and after.
lucide-vue-next was renamed to @lucide/vue at 1.0 (the old package is
deprecated) -- same API, so the Vue components just get an import swap. The
five icons we import (ChevronDown, ChevronUp, Check, X, Menu) all exist in v1.

lucide v1 also dropped brand icons (github, twitter, linkedin), which our
content still references through the mdx Icon component. Those three SVGs are
now vendored from lucide-static 0.575 (ISC) in brand-icons.ts, and Icon.astro
falls back to them, so the built pages render identically -- verified by
checking the built site before and after for unknown-icon spans (zero both
ways) and brand SVG presence (same pages both ways).
A handful of let declarations had initializers that could never be read (every
code path either reassigns or bails), one loop assigned a counter right before
breaking out of scope, and the two map components marked a prop required while
also giving it a default. All harmless, but eslint 10's new no-useless-assignment
rule and eslint-plugin-vue 10's no-required-prop-with-default flag them, and
they're legitimate cleanups on their own.
eslint 10 drops legacy .eslintrc support, so the config moves to
eslint.config.mjs with the same semantics as before: the recommended sets from
core, typescript-eslint, eslint-plugin-vue (vue3), and eslint-plugin-astro,
plus our existing rule overrides. The plugins move to their current majors
(eslint-plugin-astro 2, eslint-plugin-vue 10), @typescript-eslint/* is replaced
by the typescript-eslint meta package, and the lint scripts drop --ext since
flat config file matching handles extensions now. Verified the flat setup lints
the exact same file set as the old --ext list (260 files) and passes clean.
npm update across the board now that the majors are handled -- notably astro
7.1, @lucide/vue and lucide-static 1.25, eslint-plugin-vue 10.10, playwright
1.61, and prettier 3.9. Everything was already allowed by the existing semver
ranges, so this is lockfile-only except for two files reformatted by prettier
3.9's new union-type collapsing (type-level, no runtime change).
@bgruening
bgruening merged commit c5f43dc into galaxyproject:main Jul 20, 2026
5 checks passed
@bgruening

Copy link
Copy Markdown
Member

Thanks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants