Skip to content

feat(unplugin): гейт дрейфа манифеста против exports ядра; свой линт - #14

Merged
efureev merged 1 commit into
mainfrom
feat/unplugin-drift-gate
Aug 28, 2026
Merged

feat(unplugin): гейт дрейфа манифеста против exports ядра; свой линт#14
efureev merged 1 commit into
mainfrom
feat/unplugin-drift-gate

Conversation

@efureev

@efureev efureev commented Aug 28, 2026

Copy link
Copy Markdown
Owner

Распространение гейта на granularity-datasource и unplugin-granularity.

granular doctor к ним неприменим

Проверено, а не предположено — ни у одного нет granular-провайдера:

провайдер CSS / классы зависимость от пресета
granularity-datasource нет нет нет, peer только vue
unplugin-granularity нет нет нет

Поэтому распространена не буква гейта, а его смысл — «молчаливый дрейф против того, что пакет правда отгружает».

Гейт дрейфа для резолвера

Дыра настоящая: манифест директив ведётся руками, а собственные тесты сверяют вывод резолвера с теми же литералами, что в него зашиты. Переименуй директиву в ядре — тесты зелёные, у потребителя пропал авто-импорт.

manifestAgainstCore.test.ts читает exports ядра, а не исходники: резолвер отдаёт строку импорта, и живёт она ровно пока ключ опубликован. Проверка в обе стороны:

  • каждая директива whitelist'а указывает на живой subpath и правда экспортирует своё имя;
  • каждая ./directives/* ядра резолверу известна — globalDirectives исключён как агрегат;
  • все 98 компонентных subpath ядра резолвятся обратно в себя;
  • ядро по-прежнему не публикует components/<Name>/styles.css — ради чего importStyle и выключен по умолчанию. Начнёт публиковать, тест упадёт и умолчание пересмотрят.

Проверено мутацией: переименование модуля в манифесте роняет три теста, потеря директивы — один. Гейт не пустой.

Заодно: у пакета не было линта

Единственный в монорепо без lint и без eslint.config.js — исходники не линтовались никогда, ни локально, ни в CI. Конфиг по образцу granularity-datasource (Node + TS, без Vue), vitest.config.ts добавлен в tsconfig#include — без него типизированные правила его не разбирают. Первый прогон дал 8 находок, все починены. Подключено в корневой lint и в CI-джобу.

granularity-datasource — добавлять нечего

Осмотрен: ни CSS, ни имён классов, ни --gr-*, ноль зависимостей. Набор гейтов уже полный — lint, typecheck, тесты, build, publint, defineEnvGuardGate и defineGateCoverage с явно суженным списком и записанным объяснением, почему остальные семь фабрик неприменимы.

Состояние

  • линт всего монорепо: 0 проблем
  • doctor: 7 пакетов, exit 0
  • unplugin-granularity 0.7.1: 27 тестов (было 10), lint/typecheck/build чисто
  • granularity-datasource: 57 тестов, без изменений

Версия патчевая: поведение резолвера и его публичная поверхность не менялись.

Whitelist резолвера ведётся руками — ради детерминизма и нулевого I/O, и это
верно. Плата в том, что расхождение с ядром ничем не наказывалось: собственные
тесты сверяют вывод резолвера с теми же литералами, какие в него зашиты, и
остаются зелёными, когда директиву переименовали, а компонентный subpath
перестал существовать. У компонентных пакетов эту роль играет `granular
doctor`; провайдера у резолвера нет, и доктору тут проверять нечего.

Гейт читает `exports` ядра, а не исходники: резолвер отдаёт потребителю строку
импорта, и живёт она ровно пока такой ключ объявлен. Проверка идёт в обе
стороны — каждая директива whitelist'а указывает на живой subpath и правда
экспортирует своё имя, каждая `./directives/*` ядра резолверу известна
(`globalDirectives` исключён как агрегат), — плюс все 98 компонентных subpath
резолвятся обратно в себя. Проверено мутацией: переименование модуля в
манифесте роняет три теста, потеря директивы — один.

Отдельным утверждением закреплён довод докблока: ядро по-прежнему не публикует
`components/<Name>/styles.css`, ради чего `importStyle` и выключен по
умолчанию. Начнёт публиковать — умолчание пересмотрят, а не оставят по инерции.

Заодно закрыта вторая дыра: пакет был единственным в монорепо без `lint` и без
`eslint.config.js`, его исходники не линтовались никогда. Конфиг по образцу
`granularity-datasource` (Node и TypeScript, без Vue); `vitest.config.ts`
добавлен в `tsconfig#include`, без него типизированные правила его не
разбирают. Первый прогон дал восемь находок, все починены. Линт подключён в
корневой `lint` и в CI-джобу пакета.

`granularity-datasource` осмотрен и оставлен как есть: ни CSS, ни имён классов,
ни `--gr-*`, ноль зависимостей, а набор гейтов у него уже полный.
@efureev
efureev merged commit a6ce78c into main Aug 28, 2026
45 checks passed
@efureev
efureev deleted the feat/unplugin-drift-gate branch August 28, 2026 13:17
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.

1 participant