@feugene/unplugin-granularity
Releases of @feugene/unplugin-granularity from its CHANGELOG: the latest 8 in full, the earlier ones as a list of versions.
v1.2.12026-10-21
Changed
- Peer
@feugene/granularity—>=1.0.0 <4.0.0. Подпути компонентов у ядра 3 те же, что у ядра 2: значения у темы поменяли данные тем, а неexports.
v1.2.02026-10-19
Changed
- Peer
@feugene/granularity—>=1.0.0 <3.0.0. Резолвер судит поexportsпакета, а подпути компонентов у ядра 2 те же, что у ядра 1.
v1.1.12026-10-16
Docs
- Почему часть составного компонента приезжает из подпути родителя. Прежнее объяснение («селекция granum знает компонент только по родителю») с granum 2.1 неверно: он сводит к владельцу и подпуть самой части, если пакет собран 2.1. Резолвер по-прежнему ведёт часть в подпуть родителя — такой импорт guard и селекция судят по владельцу с любой версии granum 2.x. README и комментарий индекса исправлены.
v1.1.02026-10-16
Changed
GranularityResolver()— один резолвер на ядро и все спутники. Компоненты он берёт изexportsустановленных пакетов: находит вdependencies,devDependenciesиpeerDependenciesприложения все@feugene/granularityи@feugene/granularity-*и читает их ключи./components/<Name>. Спутникам больше не нужны свои резолверы со списками, а порядок регистрации — не важен.- Неизвестное имя не резолвится. Прежний резолвер отдавал любое имя на
Grв ядро, и опечатка или компонент спутника превращались в импорт несуществующего пути — сборка падала у потребителя. Теперь такое имя остаётся Vue, и тот предупреждает о неизвестном компоненте. Имя, которое экспортируют два пакета, тоже не резолвится. - Часть составного компонента — из подпути родителя.
GrListItemприезжает из@feugene/granularity/components/GrList: туда ведёт его запись вexports, и селекция granum знает компонент по родителю.
Added
- Опции
packages(чьи компоненты резолвить) иroot(откуда читатьpackage.json). buildComponentIndex,componentsOfExports,discoverGranularityPackages,GRANULARITY_PACKAGE_PATTERN— индекс компонентов для своих инструментов.- Гейт дрейфа импортирует каждый модуль, куда резолвер ведёт имя компонента ядра, и проверяет, что компонент там правда есть.
v1.0.02026-09-28
Привязка к мажору ядра: peer на @feugene/granularity стал >=1.0.0 <2.0.0.
Прежний диапазон (>=0.38.0 <1.0.0) исключал ядро 1.0.0, и после его выкатки
установка этого пакета рядом с ним давала неудовлетворённый peer: у npm
предупреждением, у pnpm и yarn berry со строгими настройками — отказом установки.
Собственный API не менялся. Для потребителя на @feugene/granularity 0.x это
всё равно ломающее изменение: новая версия на старое ядро не встанет — оставайтесь
на предыдущем релизе или обновляйте ядро вместе с ним.
v0.7.12026-08-28
Internal only: the resolver’s behaviour and its public surface are unchanged.
Added
-
Drift gate: the whitelist is checked against what the core actually ships. The manifest is maintained by hand on purpose — that keeps the resolver deterministic and free of I/O — but nothing punished it for drifting. The package’s own tests compare the resolver’s output against the same literals that are baked into it, so they stay green when a directive is renamed in the core or a component subpath stops existing. Component packages get that from
granular doctor; the resolver has no granular provider, so the doctor has nothing to inspect here.The gate reads the core’s
package.json#exports, not its sources: what the resolver hands a consumer is an import string, and it lives exactly as long as that key is published. It checks both directions — every whitelisted directive points at a live subpath and really exports its named binding, and every./directives/*the core publishes is known to the resolver (globalDirectivesexcepted as an aggregate) — plus that every component subpath the core exports resolves back into itself. Verified by mutation: renaming a module in the manifest reddens three tests, dropping a directive reddens one.One more assertion keeps a docblock honest: the core still publishes no
components/<Name>/styles.css, which is the whole reasonimportStyledefaults tofalse. Should that change, the default is to be revisited rather than left running on inertia. -
lintscript and an ESLint config. This was the only package in the monorepo without either, so its sources were never linted — in CI or locally. The config matchesgranularity-datasource(Node + TypeScript, no Vue);vitest.config.tsjoinedtsconfig.json#include, without which typed rules cannot parse it. The first run found eight problems, all fixed. The rootlintalias and thebuild-unplugin-granularityCI job run it now.
v0.7.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/granularity→>=0.36.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.6.12026-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. -
The readme no longer calls the licence
Apache-2.0. It is Apache License 2.0 plus an Additional Ethical Use Clause — a use restriction on top, which makes the licence source-available rather than OSI-approved open source. The readme ships inside the tarball and is what npm renders on the package page, so the claim was wrong in the one place a consumer is most likely to read it.
Earlier versions
The bodies of these releases are not shown: the full feed weighs more than a page is allowed to. The file in the repository is always complete.
v0.6.02026-08-22v0.5.02026-08-22v0.4.12026-08-12v0.4.02026-07-19v0.3.12026-07-16