@feugene/granularity-test-kit
Релизы @feugene/granularity-test-kit из его CHANGELOG: последние 8 целиком, более ранние — списком версий.
Записи релизов — авторский текст библиотеки, и он английский. Портал его не переводит: журнал изменений — история чужого репозитория, а переписанная история перестаёт быть историей.
v1.2.02026-10-16
Changed
- Необязательный peer
@feugene/granum—>=2.0.0 <3.0.0. Гейт реестров берёт части составных компонентов из@feugene/granum/codegengranum 2.0, с которым собраны ядро и спутники; сообщение о недостающем пакете называет ту же версию.
v1.1.02026-10-06
Added
defineSafelistGate— гейт safelist-контракта, общий для ядра и спутников. Safelist компонента — только классы, собранные в рантайме из частей; запись, которая лежит в коде компонента целым литералом, гейт называет лишней: granum извлечёт её и так. Код компонента обходится так же, как его обходит сборка: от файлов компонента по относительным импортам — сквозьshared/,internal/и общие директории группы, — но не в директорию другого компонента. Наружу выставлены и части гейта:componentCodeFiles,parseRelativeImports,redundantSafelistEntries.
Changed
defineSafelistGateвходит вREQUIRED_GATES: пакет, который его не подключил, краснеет наdefineGateCoverage.
v1.0.02026-09-28
Переезд на @feugene/granum 1.0 и первый мажор пакета.
Публичная поверхность не менялась — ломающий тут сам конвейер: peer-зависимость
уезжает с @feugene/unocss-preset-granular на @feugene/granum
(>=1.0.0 <2.0.0), а приложение переходит с uno.config.ts на
granum.config.ts. Версия выровнена с ядром: @feugene/granularity 1.0.0.
Перед обновлением стоит прочитать руководство по переезду в granum — в частности про каскадные слои и сброс браузерных стилей, который теперь нужно импортировать в слой.
Changed
- The optional peer is
@feugene/granum>=0.4.0 <1.0.0. The kit’s gates do not depend on the engine vocabulary, but the range moved with the others: diverged ranges would leave a consumer with an uninstallable set. - The optional peer changed:
@feugene/granum>=0.2.0 <1.0.0instead of@feugene/unocss-preset-granular. The registry gate learns the parts of a composite component from@feugene/granum/codegen(collectGranumSubcomponents); it is still imported lazily and only insidedefineRegistryGate, so the other eight factories work without it. defineRegistryGatechecks the granum shape of a package. Instead of assertions about a generated block of vite entries there are three new ones: component entries are not maintained by hand invite.config.ts(granumProvider({,engine: miniEngine(), not a single component-entry marker), the manifest is exported as./granum.manifest.jsonright after".", and the provider registry arrives ascomponentConfigs.defineComponentTokensGatealso looks intosrc/components/shared/. Helpers shared by several components live there, and without this their tokens would look declared into the void.
v0.10.02026-08-31
Changed
-
BREAKING.
OVERLAY_COMPOSABLESбольше не перечисляет имена токенов — фабрика вычитывает их из кода композабла. Константа утверждала, чтоuseFloatingзаставляет компонент читатьgr-z-modal, но связи сoverlayStack.tsу неё не было никакой (grep -c overlayStackпо гейту давал ноль). Разойдись они — гейт продолжал бы требовать старое имя и оставался зелёным: охранная конструкция переставала охранять, ничего об этом не сообщая. Переименование токена третье правило (knownTokens) всё же ловило, а переключение кода на другой существующий токен проходило молча.Теперь
DynamicTokenComposableописывает не имена, а модули (modules), из которых имена вычитываются двумя формами: веткаcalc(var(--x) + N)даётalways(читает любой вызов),?? '--x'—defaultToken(читает вызов, не передавший имени). Список модулей нужен потому, что токен читается не в одноимённом файле: веткуcalc()уuseFloatingдержитoverlayStack, а самuseFloating— только свой дефолт. Класс кавычек в форме дефолта обязателен: вsrcон записан одинарными, вdist— двойными.alwaysиdefaultTokenостались в опциях как дополнение к выведенному (форма, регуляркой не выразимая, и разрешение неоднозначного дефолта), а не как его замена. -
Гейт падает, когда посмотреть не смог. Модуль не найден или из найденного не выведено ни одного имени — прогон краснеет с адресами корней и причиной. Молчаливый пропуск вернул бы ту же слепоту: тот же принцип, что у
check-entry-isolation.mjs, где файл без сорсмапы роняет прогон. -
Сообщение о нарушении называет обе стороны:
GrPopover читает gr-z-dropdown, gr-z-toast, а объявляет gr-z-dropdown, gr-z-modal— видно и появившееся имя, и исчезнувшее.
Added
composableSources— корни, в которых ищутся модули композаблов, в порядке предпочтения. По умолчанию<cwd>/srcиdistустановленного@feugene/granularity: у ядра модуль находится в исходниках, у спутника — в собранном ядре. Опцией, а не догадкой: спутник вправе линковаться и через workspace, и из реестра.
v0.9.02026-08-31
Added
-
defineDynamicTokensGate— фабрика для токенов, чьё имя собирается в рантайме.var(), склеенный из переменной, не находит ни один статический анализ: имя уходит в композабл параметром. Приложение с включённой обрезкой (pruneTokensпресета) считает такой токен ненужным и удаляет объявление молча — сборка зелёная, CSS валидный,z-indexразрешается вunset.Гейт держит три правила. Два знают про конкретные композаблы (
OVERLAY_COMPOSABLES—useFloatingиuseModalOverlayядра) и требуют от вызывающего объявить и свой слой, иgr-z-modalиз веткиcalc(var(--gr-z-modal) + N). Третье ловит источник, о котором фабрика ещё не знает, и потому переживает появление нового.Исходники компонента читаются вместе с общей директорией его группы: у графиков композабл зовёт рама, а не график. Список
appSuppliedNameвыводит из-под правила компоненты, которым объявлять нечего — имя приходит от приложения; список проверяется на протухание.Фабрика добавлена в
REQUIRED_GATES, то есть пакет без неё краснеет.
v0.8.12026-08-27
Fixed
gr-check-dist-dev-guardnow recognises the guard in either comparison direction. A minifier is free to normalise!(NODE_ENV !== 'production')intoNODE_ENV === 'production', and the gate — which only knew!==— failed the build of a package whose guard was expanded correctly.
v0.8.02026-08-27
Changed
-
Peer floors on
@feugene/*raised to the current minor. Every peer this package declares on the ecosystem now starts at the version the monorepo actually ships:@feugene/unocss-preset-granular→>=0.13.0 <1.0.0
The floors had drifted far behind — some still admitted releases from a year of development ago — and a range that claims support it was never tested against is worse than a narrow one: the install succeeds and the breakage surfaces later, in the consumer’s app.
This is breaking for anyone below a floor. Installing against an older
@feugene/granularitynow produces a peer conflict instead of silence. The fix is to move the core up; nothing in this package’s own API changed.
v0.7.42026-08-25
Fixed
-
The package tarball now ships
LICENSE. The manifest has always declared"license": "SEE LICENSE IN LICENSE", and the file it points at was not there:npmaddsLICENSEto a tarball on its own, but only when the file exists in the package directory. A consumer’s compliance scanner reads a licence reference that resolves to nothing and flags the dependency as unlicensed — a refusal on formal grounds, before anyone reads the terms.The copy is byte-identical to the one at the repository root and is kept that way by
yarn check:licenses, a gate in CI: eleven copies of a 598-line file drift silently, and they drift exactly when the licence text is being edited.
Более ранние версии
Тела этих релизов не показываются: лента целиком весит больше, чем страница имеет право весить. Файл в репозитории всегда полон.
v0.7.32026-08-23v0.7.22026-08-23v0.7.12026-08-23v0.7.02026-08-23v0.6.02026-08-22v0.5.02026-08-22v0.4.02026-08-20v0.3.02026-08-19v0.2.02026-08-19v0.1.02026-08-15