basalt-ui 1.34.0 → 1.34.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/MIGRATING.md +19 -12
- package/dist/cli/check-theme.d.ts.map +1 -1
- package/dist/cli/check-theme.js +4 -1
- package/dist/cli/doctor.d.ts +5 -10
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +4 -0
- package/dist/cli/index.d.ts +18 -24
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +10 -0
- package/llms.txt +2 -2
- package/package.json +1 -1
- package/src/cli/check-theme.ts +4 -1
- package/src/cli/doctor.ts +9 -10
- package/src/cli/index.ts +26 -24
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [1.34.1](https://github.com/jkrumm/basalt-ui/compare/v1.34.0...v1.34.1) (2026-10-01)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* count the oxlint lane as wired only when an oxlint binary resolves ([013c496](https://github.com/jkrumm/basalt-ui/commit/013c496d84b17d9f2715e94e49e4c7d2de50d8fc))
|
|
7
|
+
|
|
1
8
|
# [1.34.0](https://github.com/jkrumm/basalt-ui/compare/v1.33.0...v1.34.0) (2026-10-01)
|
|
2
9
|
|
|
3
10
|
|
package/MIGRATING.md
CHANGED
|
@@ -66,18 +66,18 @@ There is one row per SURFACE, not per export, and a surface earns a row once any
|
|
|
66
66
|
shipped lefthook preset both changed in 1.30.0 with no row that owned them — which is how a
|
|
67
67
|
consumer read this index, found nothing, and diffed a KPI row that had silently gone 4-up → 2-up.
|
|
68
68
|
|
|
69
|
-
| Surface | 1.27.0 | 1.28.0 | 1.29.0 | 1.30.0 | 1.30.1 | 1.30.2 | 1.31.0 | 1.32.0 | 1.32.1 | 1.33.0 | 1.34.0 | Unreleased |
|
|
70
|
-
| ----------------------------- | ------------------------------------------------------------ | -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | --------------------------------------------------------------------- | ------ | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ---------------------------------- | ---------- |
|
|
71
|
-
| **tokens** (`./tokens`) | — | `--vx-divider` → `rgba()` on both schemes (§ Shell) | `--vx-space-touch-target` added (§ Additions) | eight spacing numbers (§ Chrome) | — | — | `--vx-hit` replaces the touch vars; `SIZE_CLASSES` (§ 1.31.0) | — | `SIZE_CLASSES`/`CONTAINER_CLASSES` actually exported (§ Fixes) | `CONTAINER_GRID_BREAKPOINTS`; `raw-breakpoint` trusts it (§ 1.33.0) | `CONTAINER_KEYS` (§ 1.34.0) | — |
|
|
72
|
-
| **charts** (`./charts`) | — | phone tier, `curve`, formatters, `state`, log axis (§ preamble) | `ChartState.empty: string`, `AxisBottomNumeric` (§ Additions) | responsive `height`, `legend.maxRows` (§ Charts) | `height` reaches the kinds; `maxRows` beats the `fill` fit (§ Charts) | — | container-class tier + `height` keys (§ 1.31.0) | — | `ResponsiveChartHeight` `sm` → key (§ Container recipes) | — | — | — |
|
|
73
|
-
| **shell** (`.`) | — | scrollport, region seams, **the brand left the sidebar** (§§ scrollport, brand, Shell) | `PageTitle`, `BasaltDevDock`, `useBreakpoint` (§ Additions) | More popover, aside pill, the responsive gutter, `useBasaltSpacing` (§ Chrome) | — | — | `theme.breakpoints` derived, `useSizeClass`, `data-basalt-host`, `useBreakpoint` on notice (§ 1.31.0) | `useBreakpoint` removal → 1.33.0; `useSizeClass` is shell-only (§ 1.32.0) | shell-less `shell/` gutter, `AppShell` breakpoints, `useSizeClass` for overlays (§§ Shell-less, `useSizeClass`) | — | `useBreakpoint` removed (§ 1.34.0) | — |
|
|
74
|
-
| **controls** (`./controls`) | `NumberFilter`, `field.number` (§ Controls) | sheet renders panel rows; `PanelRow`, `SliderControl` (§ `basalt-ui/controls`) | — | — | — | — | — | — | — | `NumberFilter clearable`; `createSearchStore` `resets` (§ State and controls) | — | — |
|
|
75
|
-
| **forms** (`./forms`) | — | `field` → `inputProps`, **`inputProps` drops `key`**, the layout tier (§ `inputProps`) | `field` DELETED — and the `--fix` recipe no longer works (§ Consolidation) | — | — | — | — | — | `FormGroup` row no longer stretches (§ Fixes) | — | — | — |
|
|
76
|
-
| **data** (`./data/table`) | — | root is a `<div>`, row selection, `getItemKey` required (§ `basalt-ui/data`) | `./data` + `./query` + `./connectivity` dropped (§ Consolidation) | — | — | — | — | — | `renderCard` documented (§ `renderCard`) | — | — | — |
|
|
77
|
-
| **dashboard** (`.`) | `StatCard`: `unit`, `breakdown`, delta format (§ `StatCard`) | `StatGroup`, `WidgetGrid`, query-aware `StatCard` — additive | — | **the column law keys on the CONTAINER; `cols={4}` is 2-up at `sm`** (§ Dashboard) | — | — | — | — | — | — | — | — |
|
|
78
|
-
| **toolchain** (`./configs/*`) | — | — | the shipped lefthook preset's `check-theme` BROKE — the CLI resolver stopped ascending (§ CLI) | the preset's default bin, and the `root:` recipe (§ Toolchain) | — | — | — | — | — | — | — | — |
|
|
79
|
-
| **CLI** (`basalt-ui`) | — | — | **resolver stops relocating; `doctor` loses 6 of 10 checks** (§ CLI) | — | — | — | — | — | — | — | — | — |
|
|
80
|
-
| **guards** | five rules → `error` (§ Guards) | six new ids at `warn` (§ preamble) | `query-dual-import` retired in 1.29.1 (§ Guards) | four rules → `error` (§ Guards) | — | — | — | `raw-breakpoint`: the container-grid answer, `error` at 1.33.0 (§ 1.32.0) | `FormRow`/`FormGroup` homes in both lanes; `basalt-main` dropped (§ Fixes) | C1 + breakpoint pairs → `error`; `unknown-vx-token` `warn` (§ Guards) | — | — |
|
|
69
|
+
| Surface | 1.27.0 | 1.28.0 | 1.29.0 | 1.30.0 | 1.30.1 | 1.30.2 | 1.31.0 | 1.32.0 | 1.32.1 | 1.33.0 | 1.34.0 | 1.34.1 | Unreleased |
|
|
70
|
+
| ----------------------------- | ------------------------------------------------------------ | -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | --------------------------------------------------------------------- | ------ | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ---------------------------------- | ------ | ---------- |
|
|
71
|
+
| **tokens** (`./tokens`) | — | `--vx-divider` → `rgba()` on both schemes (§ Shell) | `--vx-space-touch-target` added (§ Additions) | eight spacing numbers (§ Chrome) | — | — | `--vx-hit` replaces the touch vars; `SIZE_CLASSES` (§ 1.31.0) | — | `SIZE_CLASSES`/`CONTAINER_CLASSES` actually exported (§ Fixes) | `CONTAINER_GRID_BREAKPOINTS`; `raw-breakpoint` trusts it (§ 1.33.0) | `CONTAINER_KEYS` (§ 1.34.0) | — | — |
|
|
72
|
+
| **charts** (`./charts`) | — | phone tier, `curve`, formatters, `state`, log axis (§ preamble) | `ChartState.empty: string`, `AxisBottomNumeric` (§ Additions) | responsive `height`, `legend.maxRows` (§ Charts) | `height` reaches the kinds; `maxRows` beats the `fill` fit (§ Charts) | — | container-class tier + `height` keys (§ 1.31.0) | — | `ResponsiveChartHeight` `sm` → key (§ Container recipes) | — | — | — | — |
|
|
73
|
+
| **shell** (`.`) | — | scrollport, region seams, **the brand left the sidebar** (§§ scrollport, brand, Shell) | `PageTitle`, `BasaltDevDock`, `useBreakpoint` (§ Additions) | More popover, aside pill, the responsive gutter, `useBasaltSpacing` (§ Chrome) | — | — | `theme.breakpoints` derived, `useSizeClass`, `data-basalt-host`, `useBreakpoint` on notice (§ 1.31.0) | `useBreakpoint` removal → 1.33.0; `useSizeClass` is shell-only (§ 1.32.0) | shell-less `shell/` gutter, `AppShell` breakpoints, `useSizeClass` for overlays (§§ Shell-less, `useSizeClass`) | — | `useBreakpoint` removed (§ 1.34.0) | — | — |
|
|
74
|
+
| **controls** (`./controls`) | `NumberFilter`, `field.number` (§ Controls) | sheet renders panel rows; `PanelRow`, `SliderControl` (§ `basalt-ui/controls`) | — | — | — | — | — | — | — | `NumberFilter clearable`; `createSearchStore` `resets` (§ State and controls) | — | — | — |
|
|
75
|
+
| **forms** (`./forms`) | — | `field` → `inputProps`, **`inputProps` drops `key`**, the layout tier (§ `inputProps`) | `field` DELETED — and the `--fix` recipe no longer works (§ Consolidation) | — | — | — | — | — | `FormGroup` row no longer stretches (§ Fixes) | — | — | — | — |
|
|
76
|
+
| **data** (`./data/table`) | — | root is a `<div>`, row selection, `getItemKey` required (§ `basalt-ui/data`) | `./data` + `./query` + `./connectivity` dropped (§ Consolidation) | — | — | — | — | — | `renderCard` documented (§ `renderCard`) | — | — | — | — |
|
|
77
|
+
| **dashboard** (`.`) | `StatCard`: `unit`, `breakdown`, delta format (§ `StatCard`) | `StatGroup`, `WidgetGrid`, query-aware `StatCard` — additive | — | **the column law keys on the CONTAINER; `cols={4}` is 2-up at `sm`** (§ Dashboard) | — | — | — | — | — | — | — | — | — |
|
|
78
|
+
| **toolchain** (`./configs/*`) | — | — | the shipped lefthook preset's `check-theme` BROKE — the CLI resolver stopped ascending (§ CLI) | the preset's default bin, and the `root:` recipe (§ Toolchain) | — | — | — | — | — | — | — | — | — |
|
|
79
|
+
| **CLI** (`basalt-ui`) | — | — | **resolver stops relocating; `doctor` loses 6 of 10 checks** (§ CLI) | — | — | — | — | — | — | — | — | — | — |
|
|
80
|
+
| **guards** | five rules → `error` (§ Guards) | six new ids at `warn` (§ preamble) | `query-dual-import` retired in 1.29.1 (§ Guards) | four rules → `error` (§ Guards) | — | — | — | `raw-breakpoint`: the container-grid answer, `error` at 1.33.0 (§ 1.32.0) | `FormRow`/`FormGroup` homes in both lanes; `basalt-main` dropped (§ Fixes) | C1 + breakpoint pairs → `error`; `unknown-vx-token` `warn` (§ Guards) | — | — | — |
|
|
81
81
|
|
|
82
82
|
---
|
|
83
83
|
|
|
@@ -86,6 +86,13 @@ consumer read this index, found nothing, and diffed a KPI row that had silently
|
|
|
86
86
|
_Nothing yet. Author the next section under this heading as `## Unreleased — <title>`; the
|
|
87
87
|
release renames it and opens a new one here._
|
|
88
88
|
|
|
89
|
+
## 1.34.1 — the AST lane needs a binary
|
|
90
|
+
|
|
91
|
+
`check-theme`'s "AST lane not enforced" notice and `doctor`'s `oxlint-preset` check now count the
|
|
92
|
+
lane as wired only when `.oxlintrc.json` extends the shipped preset AND an `oxlint` bin resolves
|
|
93
|
+
(`node_modules/.bin/oxlint`, from the project up to the repo root) — a config with no binary lints
|
|
94
|
+
nothing; add `oxlint` as a devDependency (no API change).
|
|
95
|
+
|
|
89
96
|
## 1.34.0 — the 1.34.0 minor
|
|
90
97
|
|
|
91
98
|
### `CONTAINER_KEYS` — the `SimpleGrid type="container"` keys ship
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-theme.d.ts","sourceRoot":"","sources":["../../src/cli/check-theme.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"check-theme.d.ts","sourceRoot":"","sources":["../../src/cli/check-theme.ts"],"names":[],"mappings":"AAkFA;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,aAAa,GAAE,MAAsB,EACrC,KAAK,GAAE,SAAS,MAAM,EAAO,GAC5B,MAAM,CA6IR"}
|
package/dist/cli/check-theme.js
CHANGED
|
@@ -17,6 +17,8 @@ import {
|
|
|
17
17
|
namesShipped,
|
|
18
18
|
noteRelocation,
|
|
19
19
|
OXLINT_FILES,
|
|
20
|
+
OXLINT_NO_BIN,
|
|
21
|
+
oxlintBinResolves,
|
|
20
22
|
packageRoot,
|
|
21
23
|
parseJsonc,
|
|
22
24
|
readBasaltConfig,
|
|
@@ -41,7 +43,8 @@ function astLaneNotice(cwd) {
|
|
|
41
43
|
const root = findRepoRoot(cwd);
|
|
42
44
|
for (let dir = cwd; ; dir = dirname(dir)) {
|
|
43
45
|
const lane = oxlintLaneAt(dir);
|
|
44
|
-
if (lane === "wired")
|
|
46
|
+
if (lane === "wired")
|
|
47
|
+
return oxlintBinResolves(cwd) ? null : `\u2139 basalt-ui check-theme: ${OXLINT_NO_BIN}.`;
|
|
45
48
|
if (lane === "unwired" || dir === root || dirname(dir) === dir) break;
|
|
46
49
|
}
|
|
47
50
|
const preset = readSource(packageRoot(), OXLINT_FILES.guards);
|
package/dist/cli/doctor.d.ts
CHANGED
|
@@ -24,20 +24,15 @@ export type DoctorResult = {
|
|
|
24
24
|
* version agrees with the manifest's `basaltVersion`.
|
|
25
25
|
* 3. `guard-scan`: `check-theme` would scan more than zero files, sharing `scannableFiles` so the
|
|
26
26
|
* two cannot disagree. Both RESTORED in 1.30.0 after four minors gone with no MIGRATING row —
|
|
27
|
-
* README § `doctor` carries what their absence cost
|
|
28
|
-
* nothing, and two basalt-WRITTEN docs describing output the CLI no longer produced).
|
|
27
|
+
* README § `doctor` carries what their absence cost.
|
|
29
28
|
* 4. `oxlint-preset` ("rules in sync"): the consumer's `.oxlintrc.json` extends the shipped
|
|
30
|
-
* preset AND that path resolves. `init` keeps an existing config, so the framework's whole
|
|
29
|
+
* preset AND that path resolves (warns when no `oxlint` bin does). `init` keeps an existing config, so the framework's whole
|
|
31
30
|
* lint half can be silently off — one repo carried six real violations invisibly across five
|
|
32
31
|
* minors this way.
|
|
33
32
|
* 6. `ai-major-parity`: within THIS package.json, `dependencies`/`devDependencies`/
|
|
34
|
-
* `peerDependencies` agree on the `ai` package's major
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* dependents for one major while it itself runs another. A detected skew is exempt-able via
|
|
38
|
-
* `basalt.aiMajorSkewReason` (a non-empty reason string, not a bare `true`); missing or
|
|
39
|
-
* invalid still hard-fails as if the key were absent. A declared reason when the majors
|
|
40
|
-
* already agree warns that the exemption is stale.
|
|
33
|
+
* `peerDependencies` agree on the `ai` package's major — the shape `basalt/ai-sdk-major` (per
|
|
34
|
+
* linted FILE) cannot see. A skew is exempt-able via `basalt.aiMajorSkewReason` (a non-empty
|
|
35
|
+
* reason, not a bare `true`); a declared reason when the majors agree warns it is stale.
|
|
41
36
|
*
|
|
42
37
|
* Warning (non-fatal):
|
|
43
38
|
* 5. `lefthook-preset` ("lefthook wired"): a pre-commit command runs `check-theme`, read from
|
package/dist/cli/doctor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAgCA,MAAM,MAAM,YAAY,GAAG;IACzB,+CAA+C;IAC/C,YAAY,EAAE,MAAM,CAAA;IACpB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAA;IAChB;;;;;OAKG;IACH,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AA8DD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,MAAM,CAAC,aAAa,GAAE,MAAsB,EAAE,KAAK,GAAE,MAAM,EAAO,GAAG,MAAM,CAqO1F"}
|
package/dist/cli/doctor.js
CHANGED
|
@@ -10,6 +10,8 @@ import {
|
|
|
10
10
|
findRepoRoot,
|
|
11
11
|
inspectLefthookGate,
|
|
12
12
|
OXLINT_FILES,
|
|
13
|
+
OXLINT_NO_BIN,
|
|
14
|
+
oxlintBinResolves,
|
|
13
15
|
parseJsonc,
|
|
14
16
|
readBasaltConfig,
|
|
15
17
|
readIfExists,
|
|
@@ -143,6 +145,8 @@ basalt-ui doctor \u2014 ${cwd}
|
|
|
143
145
|
fail(
|
|
144
146
|
`.oxlintrc.json extends "${entry}", which does not exist (${resolve(cwd, entry)}) \u2014 oxlint refuses to start on a missing extends target (\`NotFound\`), so nothing is linted at all. Repoint it at "${correct}", where basalt-ui actually resolves.`
|
|
145
147
|
);
|
|
148
|
+
} else if (!oxlintBinResolves(cwd)) {
|
|
149
|
+
warn(`.oxlintrc.json extends the shipped preset (${entry}), but ${OXLINT_NO_BIN}`);
|
|
146
150
|
} else {
|
|
147
151
|
pass(`.oxlintrc.json extends the shipped basalt-ui oxlint preset (${entry})`);
|
|
148
152
|
}
|
package/dist/cli/index.d.ts
CHANGED
|
@@ -26,13 +26,12 @@ export declare function relativePosix(fromDir: string, toPath: string): string;
|
|
|
26
26
|
/**
|
|
27
27
|
* Where `basalt-ui` actually resolves from, seen from a consumer directory.
|
|
28
28
|
*
|
|
29
|
-
* Every
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* renders its paths from the answer rather than assuming the root.
|
|
29
|
+
* Every seam basalt seeds (oxlint/lefthook `extends`, the CI `run:` steps) used to hardcode
|
|
30
|
+
* `./node_modules/basalt-ui` at the repo ROOT; under bun's isolated linker a package that declares
|
|
31
|
+
* basalt a peer + devDependency gets it at `<pkg>/node_modules` and NOTHING at the root, so all three
|
|
32
|
+
* silently failed to resolve and `bunx` fetched a second, different copy. Resolution therefore walks
|
|
33
|
+
* OUTWARD from the consumer dir, then across the workspace packages — and every caller renders its
|
|
34
|
+
* paths from the answer rather than assuming the root.
|
|
36
35
|
*/
|
|
37
36
|
export type BasaltInstall = {
|
|
38
37
|
/** Absolute path of the resolved `node_modules/basalt-ui` directory, or null when unresolvable. */
|
|
@@ -242,6 +241,9 @@ export declare const ROOT_PLACEMENT: PlacementFlags;
|
|
|
242
241
|
* consumer not using git falls back to today's behaviour exactly.
|
|
243
242
|
*/
|
|
244
243
|
export declare function findRepoRoot(dir: string): string;
|
|
244
|
+
/** The AST lane's other half: an `oxlint` bin in `node_modules/.bin`, `dir` up to the repo root. */
|
|
245
|
+
export declare const OXLINT_NO_BIN = "oxlint config found but no oxlint binary \u2014 the AST lane never runs; add oxlint as a devDependency";
|
|
246
|
+
export declare function oxlintBinResolves(dir: string): boolean;
|
|
245
247
|
/** Resolve a run's placement flags once, from the consumer cwd. */
|
|
246
248
|
export declare function resolvePlacement(cwd: string): PlacementFlags;
|
|
247
249
|
/** The full managed-file manifest. Stable, declarative — the single source of truth for init/sync. */
|
|
@@ -358,24 +360,16 @@ export declare function writeUnit(file: ManagedFile, cwd: string, desired: strin
|
|
|
358
360
|
* Classify a managed file against the manifest for a sync run.
|
|
359
361
|
* - missing : the managed unit is absent on disk → recreate.
|
|
360
362
|
* - current : on disk == desired → nothing to do.
|
|
361
|
-
* - unchanged: on disk matches a KNOWN-SHIPPED rendering of this template
|
|
362
|
-
*
|
|
363
|
-
* 1. `sha256(current) === manifestHash` — legacy raw-hash path
|
|
364
|
-
*
|
|
365
|
-
*
|
|
366
|
-
*
|
|
367
|
-
*
|
|
368
|
-
*
|
|
369
|
-
* 2. `sha256(normalizeForLedger(current)) === manifestHash` — the ledger proper.
|
|
370
|
-
* `manifestHash` normally holds `sha256(normalizeForLedger(<bytes written at the
|
|
371
|
-
* last sync>))` (see `writeUnit`); normalizing `current` the same way and comparing
|
|
372
|
-
* survives a downstream formatter reformatting the file AND a version bump that
|
|
373
|
-
* changed the template's own words between the sync that wrote this manifest entry
|
|
374
|
-
* and the version being synced now — the argo cross-version false positive.
|
|
363
|
+
* - unchanged: on disk matches a KNOWN-SHIPPED rendering of this template (any one is sufficient) —
|
|
364
|
+
* but != desired as-is → safe overwrite:
|
|
365
|
+
* 1. `sha256(current) === manifestHash` — legacy raw-hash path (manifests written before
|
|
366
|
+
* the ledger normalized hold the RAW hash; keep matching so an upgrade never
|
|
367
|
+
* mass-classifies a pristine tree as drifted).
|
|
368
|
+
* 2. `sha256(normalizeForLedger(current)) === manifestHash` — the ledger proper (see
|
|
369
|
+
* `writeUnit`): survives a downstream formatter AND a version bump that changed the
|
|
370
|
+
* template's own words since the manifest entry was written (the argo false positive).
|
|
375
371
|
* 3. `normalizeForLedger(current) === normalizeForLedger(desired)` — same-version
|
|
376
|
-
* fallback
|
|
377
|
-
* was dropped), but the on-disk bytes still match today's rendering modulo
|
|
378
|
-
* formatting noise.
|
|
372
|
+
* fallback when no manifest entry exists at all.
|
|
379
373
|
* - drifted : on disk matches NONE of the above (a real, word-level local edit) → skip unless
|
|
380
374
|
* --force.
|
|
381
375
|
*/
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,WAAW,EAA4B,MAAM,UAAU,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAiC5C,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,GAAG,WAAW,CAiBzF;AA4BD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,EAAE,CAEzD;AAED,eAAO,MAAM,IAAI,QAAyC,CAAA;AAC1D,mGAAmG;AACnG,eAAO,MAAM,qBAAqB,QAA6B,CAAA;AAoC/D;qGACqG;AACrG,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOjD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAS1D;AAoDD,mGAAmG;AACnG,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAIrE;AAED
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -338,6 +338,14 @@ function findRepoRoot(dir) {
|
|
|
338
338
|
current = parent;
|
|
339
339
|
}
|
|
340
340
|
}
|
|
341
|
+
const OXLINT_NO_BIN = "oxlint config found but no oxlint binary \u2014 the AST lane never runs; add oxlint as a devDependency";
|
|
342
|
+
function oxlintBinResolves(dir) {
|
|
343
|
+
const root = findRepoRoot(dir);
|
|
344
|
+
for (let d = dir; ; d = dirname(d)) {
|
|
345
|
+
if (existsSync(resolve(d, "node_modules/.bin/oxlint"))) return true;
|
|
346
|
+
if (d === root || dirname(d) === d) return false;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
341
349
|
function findFileNamed(dir, filename) {
|
|
342
350
|
let entries;
|
|
343
351
|
try {
|
|
@@ -938,6 +946,7 @@ function run(argv, cwd = process.cwd()) {
|
|
|
938
946
|
export {
|
|
939
947
|
MANIFEST_PATH,
|
|
940
948
|
OXLINT_FILES,
|
|
949
|
+
OXLINT_NO_BIN,
|
|
941
950
|
ROOT_PLACEMENT,
|
|
942
951
|
RULE_NAMES,
|
|
943
952
|
SERIES_MODULE_HINT_RE,
|
|
@@ -966,6 +975,7 @@ export {
|
|
|
966
975
|
normalizeColorFunctions,
|
|
967
976
|
normalizeForLedger,
|
|
968
977
|
noteRelocation,
|
|
978
|
+
oxlintBinResolves,
|
|
969
979
|
packageRoot,
|
|
970
980
|
parseJsonc,
|
|
971
981
|
patchPackageJson,
|
package/llms.txt
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# basalt-ui v1.34.
|
|
1
|
+
# basalt-ui v1.34.1
|
|
2
2
|
# Opinionated framework for Mantine-based React apps — theme, app shell, visx charts, toolchain presets
|
|
3
3
|
#
|
|
4
4
|
# basalt-ui is an opinionated framework for Mantine-based React apps.
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
# ./tokens.css subpath. Guide: docs/FRAMEWORK-FREE.md in the repo.
|
|
20
20
|
|
|
21
21
|
Package: basalt-ui
|
|
22
|
-
Version: 1.34.
|
|
22
|
+
Version: 1.34.1
|
|
23
23
|
|
|
24
24
|
## basalt-ui
|
|
25
25
|
Import: import { ... } from 'basalt-ui'
|
package/package.json
CHANGED
package/src/cli/check-theme.ts
CHANGED
|
@@ -24,6 +24,8 @@ import {
|
|
|
24
24
|
namesShipped,
|
|
25
25
|
noteRelocation,
|
|
26
26
|
OXLINT_FILES,
|
|
27
|
+
OXLINT_NO_BIN,
|
|
28
|
+
oxlintBinResolves,
|
|
27
29
|
packageRoot,
|
|
28
30
|
parseJsonc,
|
|
29
31
|
readBasaltConfig,
|
|
@@ -61,7 +63,8 @@ function astLaneNotice(cwd: string): string | null {
|
|
|
61
63
|
const root = findRepoRoot(cwd)
|
|
62
64
|
for (let dir = cwd; ; dir = dirname(dir)) {
|
|
63
65
|
const lane = oxlintLaneAt(dir)
|
|
64
|
-
if (lane === 'wired')
|
|
66
|
+
if (lane === 'wired')
|
|
67
|
+
return oxlintBinResolves(cwd) ? null : `ℹ basalt-ui check-theme: ${OXLINT_NO_BIN}.`
|
|
65
68
|
if (lane === 'unwired' || dir === root || dirname(dir) === dir) break
|
|
66
69
|
}
|
|
67
70
|
const preset = readSource(packageRoot(), OXLINT_FILES.guards)
|
package/src/cli/doctor.ts
CHANGED
|
@@ -17,6 +17,8 @@ import {
|
|
|
17
17
|
findRepoRoot,
|
|
18
18
|
inspectLefthookGate,
|
|
19
19
|
OXLINT_FILES,
|
|
20
|
+
OXLINT_NO_BIN,
|
|
21
|
+
oxlintBinResolves,
|
|
20
22
|
parseJsonc,
|
|
21
23
|
readBasaltConfig,
|
|
22
24
|
readIfExists,
|
|
@@ -115,20 +117,15 @@ function resolveAiMajorSkewReason(cfg: BasaltConfig): {
|
|
|
115
117
|
* version agrees with the manifest's `basaltVersion`.
|
|
116
118
|
* 3. `guard-scan`: `check-theme` would scan more than zero files, sharing `scannableFiles` so the
|
|
117
119
|
* two cannot disagree. Both RESTORED in 1.30.0 after four minors gone with no MIGRATING row —
|
|
118
|
-
* README § `doctor` carries what their absence cost
|
|
119
|
-
* nothing, and two basalt-WRITTEN docs describing output the CLI no longer produced).
|
|
120
|
+
* README § `doctor` carries what their absence cost.
|
|
120
121
|
* 4. `oxlint-preset` ("rules in sync"): the consumer's `.oxlintrc.json` extends the shipped
|
|
121
|
-
* preset AND that path resolves. `init` keeps an existing config, so the framework's whole
|
|
122
|
+
* preset AND that path resolves (warns when no `oxlint` bin does). `init` keeps an existing config, so the framework's whole
|
|
122
123
|
* lint half can be silently off — one repo carried six real violations invisibly across five
|
|
123
124
|
* minors this way.
|
|
124
125
|
* 6. `ai-major-parity`: within THIS package.json, `dependencies`/`devDependencies`/
|
|
125
|
-
* `peerDependencies` agree on the `ai` package's major
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
* dependents for one major while it itself runs another. A detected skew is exempt-able via
|
|
129
|
-
* `basalt.aiMajorSkewReason` (a non-empty reason string, not a bare `true`); missing or
|
|
130
|
-
* invalid still hard-fails as if the key were absent. A declared reason when the majors
|
|
131
|
-
* already agree warns that the exemption is stale.
|
|
126
|
+
* `peerDependencies` agree on the `ai` package's major — the shape `basalt/ai-sdk-major` (per
|
|
127
|
+
* linted FILE) cannot see. A skew is exempt-able via `basalt.aiMajorSkewReason` (a non-empty
|
|
128
|
+
* reason, not a bare `true`); a declared reason when the majors agree warns it is stale.
|
|
132
129
|
*
|
|
133
130
|
* Warning (non-fatal):
|
|
134
131
|
* 5. `lefthook-preset` ("lefthook wired"): a pre-commit command runs `check-theme`, read from
|
|
@@ -267,6 +264,8 @@ export function doctor(invocationCwd: string = process.cwd(), flags: string[] =
|
|
|
267
264
|
'oxlint refuses to start on a missing extends target (`NotFound`), so nothing is ' +
|
|
268
265
|
`linted at all. Repoint it at "${correct}", where basalt-ui actually resolves.`,
|
|
269
266
|
)
|
|
267
|
+
} else if (!oxlintBinResolves(cwd)) {
|
|
268
|
+
warn(`.oxlintrc.json extends the shipped preset (${entry}), but ${OXLINT_NO_BIN}`)
|
|
270
269
|
} else {
|
|
271
270
|
pass(`.oxlintrc.json extends the shipped basalt-ui oxlint preset (${entry})`)
|
|
272
271
|
}
|
package/src/cli/index.ts
CHANGED
|
@@ -238,13 +238,12 @@ export function relativePosix(fromDir: string, toPath: string): string {
|
|
|
238
238
|
/**
|
|
239
239
|
* Where `basalt-ui` actually resolves from, seen from a consumer directory.
|
|
240
240
|
*
|
|
241
|
-
* Every
|
|
242
|
-
*
|
|
243
|
-
*
|
|
244
|
-
*
|
|
245
|
-
*
|
|
246
|
-
*
|
|
247
|
-
* renders its paths from the answer rather than assuming the root.
|
|
241
|
+
* Every seam basalt seeds (oxlint/lefthook `extends`, the CI `run:` steps) used to hardcode
|
|
242
|
+
* `./node_modules/basalt-ui` at the repo ROOT; under bun's isolated linker a package that declares
|
|
243
|
+
* basalt a peer + devDependency gets it at `<pkg>/node_modules` and NOTHING at the root, so all three
|
|
244
|
+
* silently failed to resolve and `bunx` fetched a second, different copy. Resolution therefore walks
|
|
245
|
+
* OUTWARD from the consumer dir, then across the workspace packages — and every caller renders its
|
|
246
|
+
* paths from the answer rather than assuming the root.
|
|
248
247
|
*/
|
|
249
248
|
export type BasaltInstall = {
|
|
250
249
|
/** Absolute path of the resolved `node_modules/basalt-ui` directory, or null when unresolvable. */
|
|
@@ -724,6 +723,17 @@ export function findRepoRoot(dir: string): string {
|
|
|
724
723
|
}
|
|
725
724
|
}
|
|
726
725
|
|
|
726
|
+
/** The AST lane's other half: an `oxlint` bin in `node_modules/.bin`, `dir` up to the repo root. */
|
|
727
|
+
export const OXLINT_NO_BIN =
|
|
728
|
+
'oxlint config found but no oxlint binary — the AST lane never runs; add oxlint as a devDependency'
|
|
729
|
+
export function oxlintBinResolves(dir: string): boolean {
|
|
730
|
+
const root = findRepoRoot(dir)
|
|
731
|
+
for (let d = dir; ; d = dirname(d)) {
|
|
732
|
+
if (existsSync(resolve(d, 'node_modules/.bin/oxlint'))) return true
|
|
733
|
+
if (d === root || dirname(d) === d) return false
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
|
|
727
737
|
/**
|
|
728
738
|
* First path under `dir` (recursive) whose basename is `filename`, or null. Skips dependency/build
|
|
729
739
|
* dirs, mirroring `walkSourceFiles`'s scoping.
|
|
@@ -1228,24 +1238,16 @@ export function writeUnit(file: ManagedFile, cwd: string, desired: string): stri
|
|
|
1228
1238
|
* Classify a managed file against the manifest for a sync run.
|
|
1229
1239
|
* - missing : the managed unit is absent on disk → recreate.
|
|
1230
1240
|
* - current : on disk == desired → nothing to do.
|
|
1231
|
-
* - unchanged: on disk matches a KNOWN-SHIPPED rendering of this template
|
|
1232
|
-
*
|
|
1233
|
-
* 1. `sha256(current) === manifestHash` — legacy raw-hash path
|
|
1234
|
-
*
|
|
1235
|
-
*
|
|
1236
|
-
*
|
|
1237
|
-
*
|
|
1238
|
-
*
|
|
1239
|
-
* 2. `sha256(normalizeForLedger(current)) === manifestHash` — the ledger proper.
|
|
1240
|
-
* `manifestHash` normally holds `sha256(normalizeForLedger(<bytes written at the
|
|
1241
|
-
* last sync>))` (see `writeUnit`); normalizing `current` the same way and comparing
|
|
1242
|
-
* survives a downstream formatter reformatting the file AND a version bump that
|
|
1243
|
-
* changed the template's own words between the sync that wrote this manifest entry
|
|
1244
|
-
* and the version being synced now — the argo cross-version false positive.
|
|
1241
|
+
* - unchanged: on disk matches a KNOWN-SHIPPED rendering of this template (any one is sufficient) —
|
|
1242
|
+
* but != desired as-is → safe overwrite:
|
|
1243
|
+
* 1. `sha256(current) === manifestHash` — legacy raw-hash path (manifests written before
|
|
1244
|
+
* the ledger normalized hold the RAW hash; keep matching so an upgrade never
|
|
1245
|
+
* mass-classifies a pristine tree as drifted).
|
|
1246
|
+
* 2. `sha256(normalizeForLedger(current)) === manifestHash` — the ledger proper (see
|
|
1247
|
+
* `writeUnit`): survives a downstream formatter AND a version bump that changed the
|
|
1248
|
+
* template's own words since the manifest entry was written (the argo false positive).
|
|
1245
1249
|
* 3. `normalizeForLedger(current) === normalizeForLedger(desired)` — same-version
|
|
1246
|
-
* fallback
|
|
1247
|
-
* was dropped), but the on-disk bytes still match today's rendering modulo
|
|
1248
|
-
* formatting noise.
|
|
1250
|
+
* fallback when no manifest entry exists at all.
|
|
1249
1251
|
* - drifted : on disk matches NONE of the above (a real, word-level local edit) → skip unless
|
|
1250
1252
|
* --force.
|
|
1251
1253
|
*/
|