Design System for the City of Amsterdam http://designsystem.amsterdam
  • TypeScript 74.7%
  • MDX 13.8%
  • SCSS 6.3%
  • JavaScript 4.2%
  • CSS 0.8%
  • Other 0.2%
Find a file
Vincent Smedinga 9d9bf5f7b2
chore(deps): Update dependencies and resolve all security alerts (#2822)
# Describe the pull request

## Links

- [Dependabot
alerts](https://github.com/Amsterdam/design-system/security/dependabot)
-
[GHSA-23hp-3jrh-7fpw](https://github.com/advisories/GHSA-23hp-3jrh-7fpw),
the critical node-tar advisory that prompted this
- [rollup-plugin-filesize on
npm](https://www.npmjs.com/package/rollup-plugin-filesize), last
published in February 2023

## What

Three separate commits. The first runs `pnpm run update:minor`, which
moves fifteen packages including ESLint, typescript-eslint, Storybook,
Prettier, Stylelint, Vite, PostCSS and SVGO. The second clears every
open Dependabot alert. The third removes `rollup-plugin-filesize`, which
takes 198 packages out of the lockfile.

## Why

Dependabot listed eight open alerts: four for node-tar, three for
brace-expansion and one for js-yaml. The most recent is rated critical.

None of them were reachable in practice. All eight sit in development
dependencies, and the four node-tar ones entered through a code path
that our configuration never executes, so nothing that ships to
consumers was ever affected. They are worth clearing regardless, since
the fix is small and leaving known-vulnerable versions in the lockfile
makes it harder to notice an alert that does matter.

Two of the overrides already existed but had quietly gone stale: both
`js-yaml` and `tar` were pinned to versions that newer advisories have
since come to cover. They were fixes that expired without anyone
noticing.

The third commit addresses the cause rather than the symptom. Every
node-tar alert reached us through `rollup-plugin-filesize`, which pulls
in the npm registry client stack — `pacote`, `node-gyp`, `cacache` and
`tar` — to support a feature we do not use. Bumping `tar` would have
left that chain in place to produce the same alerts again.

## How

For the security commit, the overrides in `pnpm-workspace.yaml` were
updated to versions that satisfy every advisory. `brace-expansion` is
vulnerable across three major lines at once, so it gets one entry per
line. Raising every consumer to 5.x instead would have handed
`minimatch` 3 an API it does not expect.

`npm-check-updates` rewrites the `packageManager` field without its
integrity hash. The pinned `+sha512.…` form is restored, using a hash
derived as the hex-encoded SHA-512 of the published tarball. That
derivation was validated against the existing pin for the previous
version first, where it reproduced the committed hash exactly.

For the removal, alternatives were measured before deciding to drop it
outright. `rollup-plugin-summary` costs 79 packages and ships ESLint
config packages as runtime dependencies; `rollup-plugin-visualizer`
costs 28 but produces a treemap rather than a console summary;
`rollup-plugin-bundle-size` costs 15 but was abandoned in 2022. None is
a good trade.

No replacement was added, because the Check bundle size workflow has
reported the same numbers on every pull request since April 2026, built
from both the base branch and the pull request so the figures come with
a baseline to compare against. Nothing reads the plugin's console
output. It also reported a minified size for a bundle that is never
minified, since the build has no terser step and consumers minify the
package themselves.

## Checklist

- [x] Add or update unit tests
- [x] Add or update documentation
- [x] Add or update stories
- [x] Add or update exports in index.\* files
- [x] Comment `/chromatic test` and verify visual regression tests pass
- [x] Start the PR title with a Conventional Commit prefix, [as
explained
here](https://github.com/Amsterdam/design-system/blob/main/documentation/publishing.md?plain=1#L11).

## Additional notes

Build output is unchanged by the removal, verified by comparing
checksums of every build artefact before and after.

The `tar` override is now technically redundant, as nothing pulls `tar`
any more. It is kept deliberately: an inert override costs nothing and
guards against the chain returning through a future dependency.

Worth a reviewer's attention: `pnpm run update:minor` also bumps pnpm
itself, from 11.11.0 to 11.15.1. That is a toolchain change riding along
with the dependency update rather than a deliberate decision, so it is
easy to drop if you would rather it landed separately.

Separately, the `minimumReleaseAgeExclude` list in `pnpm-workspace.yaml`
appears to be dead configuration. The setting it belongs to is not
configured anywhere, and most of the versions it pins no longer exist in
the tree. It is left untouched here and is worth a look on its own.
2026-07-21 15:27:24 +02:00
.github chore(deps): Bump actions/setup-node from 6.4.0 to 7.0.0 (#2800) 2026-07-17 14:45:09 +02:00
.husky chore(deps): Adopt nano-staged instead of lint-staged (#2740) 2026-07-02 17:56:36 +02:00
documentation chore(Storybook): Snapshot CSS utilities in Chromatic (#2816) 2026-07-21 08:12:23 +02:00
packages chore(deps): Update dependencies and resolve all security alerts (#2822) 2026-07-21 15:27:24 +02:00
packages-proprietary chore(deps): Update dependencies and resolve all security alerts (#2822) 2026-07-21 15:27:24 +02:00
plop-templates chore(plop): Add missing blank lines between import groups in templates (#2742) 2026-07-03 01:02:17 +02:00
storybook chore(deps): Update dependencies and resolve all security alerts (#2822) 2026-07-21 15:27:24 +02:00
stylelint chore(deps): Update dependencies and resolve all security alerts (#2822) 2026-07-21 15:27:24 +02:00
.editorconfig Initial commit 2022-11-18 11:19:08 +01:00
.gitattributes Initial commit 2022-11-18 11:19:08 +01:00
.gitignore chore(deps): Upgrade TypeScript to 6.0.3 (#2790) 2026-07-12 22:16:29 +02:00
.nano-staged.json chore: Check staged YAML with Prettier (#2759) 2026-07-06 21:57:19 +02:00
.npmpackagejsonlintrc.json fix(css, tokens, assets): Declare which files each package publishes to npm (#2821) 2026-07-21 13:54:47 +02:00
.nvmrc chore: Use npm trusted publishing (#2278) 2025-10-31 12:18:37 +00:00
.prettierignore chore: Add instructions for AI coding agents (#2511) 2026-04-24 13:40:27 +02:00
.prettierrc.json Fix prettier issues (#462) 2023-08-03 16:48:09 +02:00
.release-please-manifest.json chore: release main (#2787) 2026-07-12 12:16:38 +02:00
.stylelintignore chore: Remove unnecessary entries from ignore files, use pnpm in contributor docs (#2489) 2026-03-27 15:35:02 +01:00
.stylelintrc.json fix(Description List): Let tokenised grid tracks shrink below the minimum content size (#2806) 2026-07-18 16:10:48 +02:00
AGENTS.md chore(Storybook): Add a Release notes page (#2801) 2026-07-17 23:48:54 +02:00
CONTRIBUTING.md chore(pnpm): Post-v11 cleanup and explicit build step (#2639) 2026-05-22 13:58:43 +00:00
eslint.config.mjs chore(ESLint): Enable Markdown linting and declare plugins explicitly (#2739) 2026-07-02 17:52:49 +02:00
eslint.rules.mjs chore(storybook): introduce #storybook and #tokens path aliases 2026-06-16 14:41:39 +02:00
LICENSE.md chore: Translate all documentation to English (#1054) 2024-01-26 15:55:19 +01:00
LICENSE.txt Initial commit 2022-11-18 11:19:08 +01:00
NOTICE.md chore(docs): Improve documentation on Spacious and Compact Mode (#2289) 2025-11-21 12:34:52 +01:00
package.json chore(deps): Update dependencies and resolve all security alerts (#2822) 2026-07-21 15:27:24 +02:00
plopfile.mjs chore: Insert scaffolded index entries in sorted order (#2743) 2026-07-03 01:17:16 +02:00
pnpm-lock.yaml chore(deps): Update dependencies and resolve all security alerts (#2822) 2026-07-21 15:27:24 +02:00
pnpm-workspace.yaml chore(deps): Update dependencies and resolve all security alerts (#2822) 2026-07-21 15:27:24 +02:00
publiccode.yml chore: Enable indexing on oss.developer.overheid.nl (#2737) 2026-07-10 22:40:29 +02:00
README.md feat(Storybook): Add an MCP server for AI assistants (#2760) 2026-07-06 23:36:04 +02:00
release-please-config.json chore: Rename ‘proprietary’ directory to ‘packages-proprietary’ (#1969) 2025-04-04 11:42:07 +02:00
tsconfig.json chore(deps): Upgrade TypeScript to 6.0.3 (#2790) 2026-07-12 22:16:29 +02:00

Amsterdam Design System

This is the guide for the user interfaces of all digital products and services provided by the City of Amsterdam.

We offer reusable components, patterns and guides for teams that work on our websites. This helps everyone work faster and better, with more time to create value. To our citizens and businesses, all our channels look the same and work similarly; they are broadly accessible and evoke trust.

We aim to create libraries for, or support otherwise, Figma, CSS, React, React Native, and Mendix.

A Storybook portal demonstrates our components and documentation.

Our Figma Library contains the design of our components and patterns.

Getting started

See the getting started documentation for developers on how to use our React components.

AI assistance

If you build with an AI coding assistant, connect it to our Model Context Protocol (MCP) server. Your assistant then works with real Amsterdam Design System components and their correct properties, instead of inventing markup. See connecting AI assistants to set it up.

Contributing

See the documentation for contributors.

Code of conduct

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. Read our Code of Conduct if you havent already.

NL Design System

This project is part of a community initiative to use NL Design System components for websites that comply with the Amsterdam Design System.

Join the #nl-design-system Slack via praatmee.codefor.nl for more information and to learn about things happening in our open-source community.

Thanks

Thanks to Chromatic for providing the visual testing platform that helps us review UI changes and catch visual regressions.

Licence

This project is free and open-source software licenced under the European Union Public License (EUPL) v1.2 or higher. Documentation is licenced as Creative Commons Zero 1.0 Universal (CC0-1.0).

The open-source licences do not cover the assets in the packages-proprietary directory. Each directory in the packages-proprietary directory specifies the applicable licence for that directory. Please read the notice for more information about proprietary assets.