Миграция nikalexan.com
Astro 5 → 7октябрь 2026
npm audit нашёл критическую уязвимость в самом Astro
В astro 5.16.15 оптимизация AVIF-картинок позволяла удалённо выполнить код (GHSA-26w7-cxv4-gfx2). Исправление вышло только в 7.2.8, а Astro 6 удалил старый API коллекций контента, на котором держались все страницы проектов. Обновиться точечно не получалось: пришлось перескочить через мажорную версию и переписать загрузку контента.
Статический сайт на Astro
Astro собирает статические страницы на русском и английском, контент лежит в Markdown-коллекциях со схемами на Zod. Стили на Tailwind 4, деплой на Netlify. Большинство уязвимостей сидело не в Astro, а в его зависимостях: sharp, vite, rollup, postcss, svgo.
- Astro
- TypeScript
- Zod
- Tailwind CSS
- Netlify
import { glob } from "astro/loaders";
import { z } from "astro/zod";
const projects = defineCollection({
loader: glob({
pattern: "**/*.{md,mdx}",
base: "./src/content/projects"
}),
schema: z.object({ /* ... */ })
});- 01 / 03
Сразу на 7.x
Обновил astro до 7.4.1 и @astrojs/mdx до 8.1.0, заодно Tailwind до 4.3.3. Промежуточная шестая версия не закрывала критическую уязвимость.
- 02 / 03
Content Layer API
Перенёс src/content/config.ts в src/content.config.ts с загрузчиком glob(), z теперь из astro/zod. Вместо entry.slug везде entry.id, вместо getEntryBySlug обычный поиск по коллекции.
- 03 / 03
Проверка, что ничего не сломалось
После npm audit fix для остальных транзитивных пакетов сравнил сборку: те же 6 страниц с тем же текстом, маршруты /project/* и /en/project/* на месте.
16 → 0
Что изменил после
Я пропустил мажорную версию, и обновление стало большим. После миграции я включил Dependabot: теперь он сам сообщает об уязвимостях, и обновления приходят, пока они ещё небольшие.