Releases: DrSkillIssue/Ganko
Releases · DrSkillIssue/Ganko
v0.3.3
v0.3.2
Solid rule and analysis improvements
- New loop-indexed aggregate signal detection flags
signal()[item.key]patterns only when paired with incremental spread-map setter updates - Shared Solid query/rule helpers now centralize variable call discovery and updater body extraction instead of duplicating AST plumbing
- Cleanup for existing ganko lint blockers: inline type imports removed and hot-loop traversal no longer allocates callback closures
LSP Tailwind and VS Code startup fixes
- LSP workspace enrichment now starts Tailwind resolution earlier so initial enriched compilations can include Tailwind state on startup
- Tailwind re-resolution refreshes the active validator and rebuilds compilation state after watched entry-file changes instead of keeping stale state
- Added focused Tailwind lifecycle regression tests covering startup ordering and validator refresh behavior
v0.3.1
Tailwind compilation pipeline
- Single-pass Tailwind symbol resolution in
buildSymbolTable— solid tree class tokens resolved alongside CSS trees during construction ClassNameSymbol.tailwindResolvedCSSfield preserves CSS source metadata while carrying Tailwind resolution for cascade augmentation- Evaluator returns resolved CSS strings from
candidatesToCssinstead of booleans - Batch resolution sends all solid tree class tokens (previously excluded compiled Tailwind utilities)
- Cascade augmentation fills scope gaps for classes in both CSS selectors and Tailwind
Analysis rule improvements
- Attribute selector matching:
[attr]existence checks treat static boolean attributes as definite matches - Alignment analysis: suppress all evidence when parent uses geometric alignment (
center,stretch,flex-start, etc.) - Unstable style toggle: exempt elements inside
overflow:hidden/clipparents - Unused custom prop: check
var()references instead of definitions - Hidden class transition: handle string index signatures and pre-initialized literal properties
v0.3.0
v0.3.0 — StyleCompilation architecture, LSP redesign, analysis dispatcher
Full architectural rewrite from the legacy SolidGraph/CSSGraph/cross-file/ system to a Roslyn-inspired compilation model.
Highlights
- StyleCompilation — immutable compilation object replacing the ad-hoc graph caching layer. Owns all CSS/Solid trees and a unified SymbolTable.
- Cascade binder — full CSS cascade resolution per element with selector matching, specificity ordering, conditional guard tracking, and layout fact computation.
- Analysis dispatcher — tiered rule execution framework. 70+ rules migrated to self-contained modules with typed registry subscriptions.
- Incremental tracker — dependency graph-based change propagation for minimal re-analysis.
- LSP redesign — immutable Session model, unified diagnostic pipeline (push + pull), compilation builder, cancellation support, daemon rewrite.
- Tailwind integration —
TailwindValidatorwired throughSymbolTable.hasClassName()for class-name-aware rules. Arbitrary value batch validation across CLI, daemon, and LSP.
Bug fixes
css-layout-conditional-offset-shift: suppressed false positives for elements insideposition: fixed/absolutecontainers.no-duplicate-selectors: accounts for parent at-rule context.- Monorepo support: workspace files synced into TS program.
- Replaced all
Bun.spawncalls with Nodechild_processfor runtime compatibility.
Breaking changes
- Deleted
cross-file/directory,cache.ts,SolidGraph/CSSGraphclasses. - Rule IDs unchanged but internal registration API moved from imperative visitors to
defineAnalysisRule+registerConditionalDeltaAction/registerElementAction/ etc.
See PR #33 for the full diff.
v0.2.82
Conditional Cascade Shadowing Fix
Fixes ~130 false-positive padding-right: 0px warnings on Button components where a conditional CSS variant (e.g., [data-icon]) with higher specificity shadowed the unconditional base sizing.
Changes
- var() substitution moved to declaration collection — resolves once per selector instead of per element; delta fact system automatically receives resolved values
- Touch-target unconditional fallback — when a conditional selector shadows the base value, the rule consults the delta fact's unconditional values instead of falling through to the global reset
v0.2.81
Touch-Target False Positive Elimination
Eliminates false-positive 0px padding/height warnings from jsx-layout-policy-touch-target on component-authored interactive elements.
Core fixes
- Cross-component CSS scope propagation — component co-located CSS enters call-site cascade
- Cross-component attribute prop bindings —
data-size={props.size ?? "sm"}resolves from call-site props - CSS
var()value substitution —var(--name)resolved to concrete values from CSSGraph - Polymorphic
as={Component}resolution —as={Button}traced through host resolver
Additional improvements
padding-inlineshorthand expansion- Parenthesis-aware shorthand tokenization (
padding: 0 calc(...)) - Static
calc()/min()/max()/clamp()evaluation max-width/max-heightconstraining signal monitoringflex-basiscounted as declared inline dimension- CSS-wide keywords (
inherit/initial/unset/revert) as non-reserving - sr-only
1px×1pxpattern detection (Kobalte/Radix/Tailwind) - String fallback extraction (
x ?? "literal")
Stats
- 13 files changed, +1158 −36
- 22 new tests (45 total touch-target tests, 445 cross-file + CSS tests)
v0.2.9
LSP Architecture Redesign + Bug Fixes
LSP Architecture Redesign
Complete redesign modeled after typescript-language-server:
- LifecyclePhase discriminated union —
phase.tagnarrowing replaces nullable fields. Each phase declares exactly what's available. - DiagnosticsManager — per-file aggregation by kind (Ganko/CrossFile/TypeScript). Eliminates
tsDiagCache. - DocumentManager — coherent lifecycle state machine. Eliminates
handlers/document.ts. - TsService — unified Quick/Incremental tier interface. Eliminates
cachedCompilerOptions/cachedTier1Host. - ChangeProcessor — atomic change propagation. Eliminates
evictFileCache/rediagnoseAffected/rediagnoseAll. - ResourceMap — type-safe canonical-path-keyed maps.
- Three handler context types — FeatureHandlerContext, DocumentHandlerContext, LifecycleHandlerContext.
- ServerConfig — extracted from mutable ServerState.
Bug Fixes
- Workspace symlink discovery — follows symlinked workspace packages in
node_modulesusingpackage.jsonworkspaces field. Component CSS from workspace deps now in analysis set. - Keyframe selector indexing —
16.67%/33.33%no longer parsed as class selectors. - Diagnostic pipeline — removed double publication and unnecessary debounce.
v0.2.8
Core
- compound-grouped CSS selector parsing, eliminate cross-file re-parse
- delete trivial query accessors, consolidate deferred index methods
- fold selector and declaration index building into insertion time
- inline element kind classification into AST selector creation
- remove dead CSS indexes, lazy-compute derived collections
- eliminate redundant string allocations in signal normalization and dispatch
- replace string discriminants with numeric const enums
- flatten LayoutGraph interface, unify dispatch key extraction
- unified single-pass graph builder, forward-pass signal snapshots
- consolidated LayoutElementRecord, pre-expanded shorthand declarations
- dispatch-key-indexed cross-component selector fallback, unified dimension facts, test batch optimization
- migrate touch-target rule to cross-file layout graph, fix diagCache poisoning
Infrastructure
- remove completed implementation plan documents
- bump version to 0.2.8
- CSS selector compound grouping implementation plan
- update CSS overhaul plan — Phase 4 deferred, Phase 6 assessed
- CSS subsystem architecture overhaul implementation plan
- bump version to 0.2.72
v0.2.72
Core
- migrate touch-target rule to cross-file layout graph, fix diagCache poisoning
Infrastructure
- bump version to 0.2.72
v0.2.71
Fix
getStaticStringFromJSXValuenow serializes numeric JSX literals (e.g.width={16}) to their string representation ("16") instead of dropping them tonull, fixingcss-layout-unsized-replaced-elementfalse positives on components with numeric HTML size attributes