@shivaedev/quality 0.5.1 → 0.7.0
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 +26 -0
- package/README.md +36 -39
- package/biome/declarations.json +55 -0
- package/biome/preset.json +29 -13
- package/dist/baseline/legacy.d.ts +0 -1
- package/dist/baseline/legacy.d.ts.map +1 -1
- package/dist/baseline/legacy.js +0 -1
- package/dist/baseline/legacy.js.map +1 -1
- package/dist/cli/args.d.ts +1 -6
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +7 -14
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/fix.d.ts +8 -2
- package/dist/cli/fix.d.ts.map +1 -1
- package/dist/cli/fix.js +55 -9
- package/dist/cli/fix.js.map +1 -1
- package/dist/cli.js +1 -4
- package/dist/cli.js.map +1 -1
- package/dist/config/decode.d.ts +0 -1
- package/dist/config/decode.d.ts.map +1 -1
- package/dist/config/decode.js +0 -1
- package/dist/config/decode.js.map +1 -1
- package/dist/config/load.d.ts +0 -1
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +0 -1
- package/dist/config/load.js.map +1 -1
- package/dist/config/resolve.d.ts +1 -1
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +0 -3
- package/dist/config/resolve.js.map +1 -1
- package/dist/config.d.ts +0 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/git/base.d.ts.map +1 -1
- package/dist/git/base.js +4 -27
- package/dist/git/base.js.map +1 -1
- package/dist/git/command.d.ts +1 -1
- package/dist/git/command.d.ts.map +1 -1
- package/dist/git/command.js +2 -2
- package/dist/git/command.js.map +1 -1
- package/dist/git/history.d.ts +0 -1
- package/dist/git/history.d.ts.map +1 -1
- package/dist/git/history.js +1 -6
- package/dist/git/history.js.map +1 -1
- package/dist/imports/departures.d.ts +9 -0
- package/dist/imports/departures.d.ts.map +1 -0
- package/dist/imports/departures.js +49 -0
- package/dist/imports/departures.js.map +1 -0
- package/dist/imports/specifiers.d.ts +9 -0
- package/dist/imports/specifiers.d.ts.map +1 -0
- package/dist/imports/specifiers.js +71 -0
- package/dist/imports/specifiers.js.map +1 -0
- package/dist/report/render.d.ts.map +1 -1
- package/dist/report/render.js +11 -0
- package/dist/report/render.js.map +1 -1
- package/dist/rule.d.ts +2 -1
- package/dist/rule.d.ts.map +1 -1
- package/dist/rule.js.map +1 -1
- package/dist/rules/biome.js +1 -1
- package/dist/rules/biome.js.map +1 -1
- package/dist/rules/built-in.d.ts +1 -1
- package/dist/rules/built-in.d.ts.map +1 -1
- package/dist/rules/built-in.js +2 -0
- package/dist/rules/built-in.js.map +1 -1
- package/dist/rules/imports/aliased.d.ts +2 -0
- package/dist/rules/imports/aliased.d.ts.map +1 -0
- package/dist/rules/imports/aliased.js +23 -0
- package/dist/rules/imports/aliased.js.map +1 -0
- package/package.json +3 -2
- package/src/baseline/legacy.ts +0 -2
- package/src/cli/args.ts +8 -16
- package/src/cli/fix.ts +72 -10
- package/src/cli.ts +1 -4
- package/src/config/decode.ts +0 -1
- package/src/config/load.ts +0 -2
- package/src/config/resolve.ts +1 -3
- package/src/config.ts +0 -3
- package/src/git/base.ts +4 -31
- package/src/git/command.ts +2 -2
- package/src/git/history.ts +1 -8
- package/src/imports/departures.ts +72 -0
- package/src/imports/specifiers.ts +94 -0
- package/src/report/render.ts +12 -0
- package/src/rule.ts +3 -2
- package/src/rules/biome.ts +1 -1
- package/src/rules/built-in.ts +2 -0
- package/src/rules/imports/aliased.ts +26 -0
- package/dist/baseline/guard.d.ts +0 -23
- package/dist/baseline/guard.d.ts.map +0 -1
- package/dist/baseline/guard.js +0 -32
- package/dist/baseline/guard.js.map +0 -1
- package/dist/cli/check.d.ts +0 -5
- package/dist/cli/check.d.ts.map +0 -1
- package/dist/cli/check.js +0 -39
- package/dist/cli/check.js.map +0 -1
- package/dist/report/guard.d.ts +0 -9
- package/dist/report/guard.d.ts.map +0 -1
- package/dist/report/guard.js +0 -34
- package/dist/report/guard.js.map +0 -1
- package/src/baseline/guard.ts +0 -48
- package/src/cli/check.ts +0 -51
- package/src/report/guard.ts +0 -46
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.7.0 - 2026-10-04
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- **Breaking:** `quality baseline check` is gone, and so is the `adopt` config option. A config that sets `adopt` fails to load until the key is removed, and a script that runs `quality baseline check` must drop it. A finding the baseline does not cover still fails `quality lint`; a baseline that grows is no longer a failed check but a change a reviewer sees in the diff. When the failing findings are debt the baseline should keep, such as a renamed file's, the report ends with the `quality baseline write --rule …` command that records their rules again, and the pull request calls out the growth.
|
|
8
|
+
- `quality baseline prune` no longer fetches the full history of a shallow clone to find the merge base. With `--against`, a merge base out of reach exits 2 and asks for `git fetch --unshallow`; without it, `prune` drops fixed debt without following moves.
|
|
9
|
+
- `quality fix` applies Biome's lint fixes, unsafe ones included, together with its assist actions and formatting, then runs Biome's formatter once more, because a lint fix can leave code unformatted. An unsafe fix can change behavior, such as `==` becoming `===`, so review what it changed.
|
|
10
|
+
- `quality fix` repeats Biome's fixes and its format pass until a round rewrites nothing, because one fix can make room for another, such as a `u` flag and an `await` in one file. It stops after 5 rounds, names the files that still changed and exits 2.
|
|
11
|
+
- The Biome preset turns off `noProcessGlobal`, `useJsonImportAttributes`, `noMisusedPromises`, `useExhaustiveSwitchCases`, `useSortedClasses`, `noDelete`, `useConsistentArrayType`, `useConsistentCurlyBraces`, `noEqualsToNull` and `noSkippedTests`, because their autofixes changed behavior or did not terminate on real code. Its `declarations.json` declares them.
|
|
12
|
+
- The Biome preset sets `useConsistentMethodSignatures` to the property style explicitly, and `quality fix` applies its fix. A function member written as a property is checked strictly; where a member must stay bivariant, such as a list of rules with different options, wrap its type in `Bivariant` from `@shivaedev/types`. `Rule.configure` does, so a list of rules with different options still type-checks; the package now depends on `@shivaedev/types`.
|
|
13
|
+
- The Biome preset keeps `noUnusedPrivateClassMembers` at `error` but turns off its fix, so `quality fix` no longer deletes an unused private member. Whether the member is still needed or should be used is a decision for a person; `quality lint` still reports it.
|
|
14
|
+
|
|
15
|
+
### Removed
|
|
16
|
+
|
|
17
|
+
- `quality fix --lint`. `quality fix` applies the lint fixes itself.
|
|
18
|
+
|
|
19
|
+
## 0.6.0 - 2026-10-04
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
|
|
23
|
+
- Add `imports/aliased`. A relative import may name only a file in its own folder; one that goes up (`../format.ts`) or down into a subfolder (`./parts/deeper.ts`) is reported, in static imports, re-exports, side-effect imports, `import()`, `require()`, `import()` types, JSDoc `@import` tags and the paths of `vi.mock` and its kin. The message names the fix for where the import lands: a `#` alias from the `imports` of its own package's `package.json`, declared if none fits; the name of another workspace package, through a path its `exports` lists; or the name of an installed package. The rule only reports: the author picks the alias. Like every rule it is an error by default, so a repository that upgrades adopts it into its baseline.
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- The Biome preset organizes imports in five groups: Node and Bun builtins, packages, `@shivaedev/*` packages, aliases (`#…`, `@/…`, `~…`) and relative paths. `quality fix` regroups the imports of every file once; until then each file out of order is a `biome/assist/source/organizeImports` finding.
|
|
28
|
+
|
|
3
29
|
## 0.5.1 - 2026-10-04
|
|
4
30
|
|
|
5
31
|
### Changed
|
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# @shivaedev/quality
|
|
2
2
|
|
|
3
|
-
One quality gate for a repository: typed rules, one report, a baseline
|
|
3
|
+
One quality gate for a repository: typed rules, one report, a baseline of existing debt and a registry of permanent exceptions, each with its reason.
|
|
4
4
|
|
|
5
|
-
Every rule is an error by default. A repository adopts the gate at once: it records its existing violations in the baseline, and from then on a
|
|
5
|
+
Every rule is an error by default. A repository adopts the gate at once: it records its existing violations in the baseline, and from then on a finding the baseline does not cover fails, and fixed debt leaves the baseline as files change. A baseline that grows shows in the diff, where a reviewer judges it.
|
|
6
6
|
|
|
7
7
|
## Setup
|
|
8
8
|
|
|
@@ -42,8 +42,7 @@ export default defineConfig({
|
|
|
42
42
|
| `exclude` | `[]` | Paths never checked, in `.gitignore` syntax. Files ignored by git, `.git` and `node_modules` are always skipped. |
|
|
43
43
|
| `extensions` | TypeScript and JavaScript modules | Which files rules read as sources. |
|
|
44
44
|
| `registry` | `quality/registry.json` | Permanent exceptions. |
|
|
45
|
-
| `baseline` | `quality/baseline.jsonl` | Existing violations that
|
|
46
|
-
| `adopt` | `[]` | Rules the baseline takes in for the first time; see [Adopting a rule](#adopting-a-rule). |
|
|
45
|
+
| `baseline` | `quality/baseline.jsonl` | Existing violations that the gate lets through. |
|
|
47
46
|
| `local` | `[]` | The repository's own rules, made with `defineRule`. |
|
|
48
47
|
| `rules` | every rule at `error` | A level per rule id, or `{ level, options }`. |
|
|
49
48
|
|
|
@@ -102,7 +101,7 @@ A repository with existing comments adopts the rules through the baseline, for e
|
|
|
102
101
|
|
|
103
102
|
### Suppressions
|
|
104
103
|
|
|
105
|
-
A check that is silenced at one site hides the problem instead of fixing it. Three rules close the escape hatches, and none of them takes registry exceptions: a registry entry that names one fails the gate as stale. A repository with existing suppressions adopts the rules through the baseline
|
|
104
|
+
A check that is silenced at one site hides the problem instead of fixing it. Three rules close the escape hatches, and none of them takes registry exceptions: a registry entry that names one fails the gate as stale. A repository with existing suppressions adopts the rules through the baseline.
|
|
106
105
|
|
|
107
106
|
| Rule | Reports | Options |
|
|
108
107
|
| --- | --- | --- |
|
|
@@ -197,13 +196,14 @@ A weakening the preset makes without such a declaration is reported at the line
|
|
|
197
196
|
|
|
198
197
|
### Imports
|
|
199
198
|
|
|
200
|
-
|
|
199
|
+
Four rules read the imports of the TypeScript and JavaScript modules among the sources. They build it once per run with the TypeScript compiler, without a bundler or another dependency.
|
|
201
200
|
|
|
202
201
|
| Rule | Reports | Options |
|
|
203
202
|
| --- | --- | --- |
|
|
204
203
|
| `imports/cycles` | Modules that import each other at run time | none |
|
|
205
204
|
| `imports/resolvable` | An import that resolves to nothing | `generated` |
|
|
206
205
|
| `imports/fences` | An import that crosses a fence the config declares | `fences` |
|
|
206
|
+
| `imports/aliased` | A relative import that leaves its own folder | none |
|
|
207
207
|
|
|
208
208
|
Each import resolves the way the compiler resolves it, with the options of the nearest `tsconfig.json` and the projects it references, under bundler resolution: `paths`, `package.json` `imports` and `exports` and the `source` condition hold, so a workspace package resolves to its source. The graph reads static and dynamic imports, `export ... from`, `require()`, `require.resolve()`, `import.meta.resolve()` of a bare specifier (a relative one is URL arithmetic that never checks the path), `import()` types, `/// <reference types>`, `/// <reference path>` and JSDoc `@import` tags.
|
|
209
209
|
|
|
@@ -221,6 +221,23 @@ Each import resolves the way the compiler resolves it, with the options of the n
|
|
|
221
221
|
|
|
222
222
|
The gate fails closed: when the sources hold no module at all, the imports rules stop the run instead of passing on an empty graph. Point `sources` at the code, or turn the rules off.
|
|
223
223
|
|
|
224
|
+
#### Aliases
|
|
225
|
+
|
|
226
|
+
A relative import names only a file in its own folder, such as `./format.ts`: the folder is one module. Every other import goes through an alias, so moving a file never rewrites a chain of `../`:
|
|
227
|
+
|
|
228
|
+
- the `imports` of the importer's nearest `package.json`, such as `"#lib/*": "./src/lib/*"`, or `"#shared/*": "@demo/shared/*"`, which names another workspace package;
|
|
229
|
+
- the name of another workspace package, as far as its `exports` reach.
|
|
230
|
+
|
|
231
|
+
An import that already goes through a tsconfig `paths` alias is not relative, so the rule leaves it alone.
|
|
232
|
+
|
|
233
|
+
`imports/aliased` reports a relative import that goes up (`../format.ts`) or down into a subfolder (`./parts/deeper.ts`, or `./widgets` for `widgets/index.ts`). It reads static imports, `export ... from`, side-effect imports, `import()`, `require()`, `import()` types, JSDoc `@import` tags and the paths of `vi.mock`, `vi.doMock`, `vi.unmock`, `vi.doUnmock`, `vi.importActual` and `vi.importMock`, so a mock keeps pointing at the module it replaces. An escaped path, such as `"\x2e\x2e/format.ts"`, counts as the path it spells. Each finding has the import as its subject. Its message names the fix for where the import lands:
|
|
234
|
+
|
|
235
|
+
- inside its own package: import through a `#` alias from the `imports` of the package's `package.json`, and declare one if none fits;
|
|
236
|
+
- inside another workspace package: import it by that package's name, through a path its `exports` lists;
|
|
237
|
+
- inside an installed package under `node_modules`: import that package by its name.
|
|
238
|
+
|
|
239
|
+
The rule only reports; nothing rewrites the import. Whoever writes the import picks the alias, because only they know which conditions their runtimes, bundler and tests use.
|
|
240
|
+
|
|
224
241
|
#### Fences
|
|
225
242
|
|
|
226
243
|
A fence is one prohibition, stated in the config without patterns:
|
|
@@ -306,39 +323,19 @@ Lowering entries in the commit that fixes them keeps the baseline current withou
|
|
|
306
323
|
```sh
|
|
307
324
|
quality baseline tighten --staged && git add quality/baseline.jsonl
|
|
308
325
|
quality lint
|
|
309
|
-
quality baseline check
|
|
310
326
|
```
|
|
311
327
|
|
|
312
328
|
`tighten` counts the files as they are on disk. When a commit stages only part of a file, stash the rest first (as lint-staged does), or the entry may be lowered below what the commit holds.
|
|
313
329
|
|
|
314
|
-
### Baseline
|
|
315
|
-
|
|
316
|
-
`quality lint` reads only the working tree, so on its own it cannot tell a raised entry from a recorded one: a hand edit, or deleting the baseline and writing it again, would hide new debt. `quality baseline check` compares the baseline with its version at the merge base of `HEAD` and the target branch, and fails when:
|
|
317
|
-
|
|
318
|
-
- an entry is new, for a rule the base baseline already covers;
|
|
319
|
-
- an entry's `count` is higher than at the base;
|
|
320
|
-
- a rule is baselined for the first time without `adopt` naming it;
|
|
321
|
-
- `adopt` names a rule with nothing baselined.
|
|
330
|
+
### Baseline growth
|
|
322
331
|
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
The check reads git, not the sources, so it is cheap enough for every commit; only a base in the earlier format makes it run the rules. The target is `--against <ref>`, or else `origin/HEAD`, `origin/main` and then `origin/master`, whichever exists first. In a shallow clone that does not reach the merge base, it runs `git fetch --unshallow`, which never stops to ask for a password, and looks again. It exits 2 when there is no git work tree, no target or no merge base, including when that fetch fails; then check out with `fetch-depth: 0` in GitHub Actions, or fetch enough history for `git merge-base HEAD <target>` to succeed.
|
|
326
|
-
|
|
327
|
-
### Adopting a rule
|
|
328
|
-
|
|
329
|
-
A rule enters the baseline for the first time only while the config names it under `adopt`, so the adoption shows in the config's diff, not only in the baseline's:
|
|
330
|
-
|
|
331
|
-
```ts
|
|
332
|
-
export default defineConfig({
|
|
333
|
-
adopt: ["comments/no-jsdoc"],
|
|
334
|
-
});
|
|
335
|
-
```
|
|
332
|
+
A finding that the baseline does not cover always fails `quality lint`, locally and in CI; that is how new debt gets noticed. The baseline itself may grow: a reviewer sees each new or raised entry in the diff and judges it. When the failing findings are debt the baseline should keep, such as the debt of a file that moved or was renamed, record the rule again with `quality baseline write --rule <id>`. The report ends with that command for the rules that failed. Then call out the baseline growth in the pull request description.
|
|
336
333
|
|
|
337
|
-
|
|
334
|
+
A rule enters the baseline the same way: set it to `error`, run `quality baseline write --rule <id>` and commit both.
|
|
338
335
|
|
|
339
336
|
### Changing a limit
|
|
340
337
|
|
|
341
|
-
A count depends on the configured limit, so changing a limit shifts every count of the rule. A looser limit leaves entries that allow more than is left: they pass, and `tighten` and `prune` lower them. A stricter limit makes the rule's files fail `quality lint`, since each is now further over the limit. Run `quality baseline write --rule <id>` to record the rule again under the new limit, and commit it with the config change.
|
|
338
|
+
A count depends on the configured limit, so changing a limit shifts every count of the rule. A looser limit leaves entries that allow more than is left: they pass, and `tighten` and `prune` lower them. A stricter limit makes the rule's files fail `quality lint`, since each is now further over the limit. Run `quality baseline write --rule <id>` to record the rule again under the new limit, and commit it with the config change. The raised entries show in the diff, and the pull request calls them out.
|
|
342
339
|
|
|
343
340
|
## Registry
|
|
344
341
|
|
|
@@ -358,21 +355,20 @@ An entry covers a rule's violations in one file, for good, and must say why. Wit
|
|
|
358
355
|
|
|
359
356
|
```text
|
|
360
357
|
quality lint [--config <file>] [--warnings summary|all]
|
|
361
|
-
quality fix [--config <file>]
|
|
358
|
+
quality fix [--config <file>]
|
|
362
359
|
quality baseline write [--config <file>] [--rule <id>]...
|
|
363
360
|
quality baseline prune [--config <file>] [--against <ref>]
|
|
364
361
|
quality baseline tighten [--config <file>] [--staged]
|
|
365
|
-
quality baseline check [--config <file>] [--against <ref>]
|
|
366
362
|
quality baseline migrate [--config <file>] [--from <file>]
|
|
367
363
|
```
|
|
368
364
|
|
|
369
|
-
`quality` alone runs `lint`. `--against <ref>` names the branch the work merges into. The report groups violations by rule and states each rule's description once; warnings are summarized per rule with the files that have the most, and `--warnings all` lists each one.
|
|
365
|
+
`quality` alone runs `lint`. `--against <ref>` names the branch the work merges into; `prune` follows the moves since its merge base. Without it, `prune` takes `origin/HEAD`, `origin/main` or `origin/master`, whichever exists first, and prunes without following moves when it finds no merge base. With `--against`, a missing merge base exits 2; in a shallow clone, run `git fetch --unshallow` first. The report groups violations by rule and states each rule's description once; warnings are summarized per rule with the files that have the most, and `--warnings all` lists each one.
|
|
370
366
|
|
|
371
367
|
| Exit code | Meaning |
|
|
372
368
|
| --- | --- |
|
|
373
369
|
| 0 | Passed. Warnings may remain. |
|
|
374
|
-
| 1 | Failed: an uncovered error-level violation, a baselined file that got worse, a stale registry entry, a baseline entry for a rule that is off or unknown
|
|
375
|
-
| 2 | Could not run: no or invalid config, an invalid baseline or registry, a baseline left in the earlier format, a missing source, a rule that threw, git history
|
|
370
|
+
| 1 | Failed: an uncovered error-level violation, a baselined file that got worse, a stale registry entry, or a baseline entry for a rule that is off or unknown. |
|
|
371
|
+
| 2 | Could not run: no or invalid config, an invalid baseline or registry, a baseline left in the earlier format, a missing source, a rule that threw, git history `prune --against` cannot read, a `quality fix` that does not settle in 5 rounds, or a usage error. |
|
|
376
372
|
|
|
377
373
|
## Biome preset
|
|
378
374
|
|
|
@@ -388,16 +384,17 @@ quality baseline migrate [--config <file>] [--from <file>]
|
|
|
388
384
|
The preset sets:
|
|
389
385
|
|
|
390
386
|
- **Formatting:** tabs, a line width of 150, double quotes, semicolons, trailing commas and operators at the start of a wrapped line.
|
|
391
|
-
- **Lint:** every rule Biome recommends, at `error`, and a list of stricter rules on top, among them `noUnsafeTypeAssertion`, `useBlockStatements`, `
|
|
387
|
+
- **Lint:** every rule Biome recommends, at `error`, and a list of stricter rules on top, among them `noUnsafeTypeAssertion`, `useBlockStatements`, `useNumericSeparators`, `useUnicodeRegex`, `useLiteralKeys`, `noFloatingPromises`, `useExhaustiveDependencies`, `it` for every test, function declarations over function expressions, interfaces for object types, a cognitive complexity limit of 15, no nested ternaries, no barrel files and no `export *`.
|
|
388
|
+
- **Imports:** organized in five groups: Node and Bun builtins, packages, `@shivaedev/*` packages, aliases and relative paths. Biome counts as an alias a specifier that starts with `#`, `@/`, `~`, `$` or `%`; a tsconfig path such as `@app/*` sorts with the packages, and Biome's `noUndeclaredDependencies` takes it for one, so name aliases in a form Biome recognizes.
|
|
392
389
|
- **Assist:** organized imports and sorted keys, attributes, enum members, interface members and properties. Keys are sorted in JSON and in object literals alike; `package.json` is left out, because `manifests/sorted` gives it the order npm users expect.
|
|
393
390
|
- **Plugins:** GritQL rules that ban ambient time, randomness, `console` and `process.env` for Effect's services, and that ask `Effect.fn` for a literal span name shaped `Owner.operation`. They load from `./node_modules/@shivaedev/quality/biome/plugins`, so the package must be installed at the repository root.
|
|
394
391
|
- Files ignored by git are skipped.
|
|
395
392
|
|
|
396
|
-
The preset turns off `noUnusedVariables` and `noUnusedFunctionParameters`, because the tsconfig presets report them through TypeScript, and allows default exports in `*.config.*` files, which tools load through the default export. It declares these weakenings in its `declarations.json`, so `suppressions/biome-overrides` takes them as declared. Every other weakening a repository adds is an override it declares with a reason.
|
|
393
|
+
The preset turns off `noUnusedVariables` and `noUnusedFunctionParameters`, because the tsconfig presets report them through TypeScript, and allows default exports in `*.config.*` files, which tools load through the default export. It also turns off `noProcessGlobal`, `useJsonImportAttributes`, `noMisusedPromises`, `useExhaustiveSwitchCases`, `useSortedClasses`, `noDelete`, `useConsistentArrayType`, `useConsistentCurlyBraces`, `noEqualsToNull` and `noSkippedTests`, because `quality fix` applies every lint fix and their fixes changed behavior or did not terminate on real code. It declares these weakenings in its `declarations.json`, so `suppressions/biome-overrides` takes them as declared. Every other weakening a repository adds is an override it declares with a reason.
|
|
397
394
|
|
|
398
|
-
The `biome` rule runs `biome check` with the repository's config and reports each finding as `biome/<category>`, such as `biome/lint/style/useBlockStatements`, `biome/assist/source/useSortedKeys`, `biome/format` or `biome/plugin`, so Biome's findings go through the baseline like any other rule's. `
|
|
395
|
+
The `biome` rule runs `biome check` with the repository's config and reports each finding as `biome/<category>`, such as `biome/lint/style/useBlockStatements`, `biome/assist/source/useSortedKeys`, `biome/format` or `biome/plugin`, so Biome's findings go through the baseline like any other rule's. `quality baseline write --rule biome` takes in every Biome category at once. A finding below `error`, such as a rule a repository declared at `warn`, is not reported. The rule also asks for a root `biome.json` or `biome.jsonc` that extends the preset, and it takes no registry exceptions. A Biome config that Biome cannot load stops the run with Biome's message.
|
|
399
396
|
|
|
400
|
-
`quality fix` sorts every `package.json`, then applies Biome's
|
|
397
|
+
`quality fix` sorts every `package.json`, then runs `biome check --write --unsafe`, which applies Biome's lint fixes, unsafe ones included, its assist actions, such as organized imports and sorted keys, and its formatting. It then runs Biome's formatter once more, because a lint fix can leave code unformatted. One fix can make room for another, so it repeats both passes until a round rewrites nothing, at most 5 rounds; when files still change in the fifth round, it names them and exits 2. An unsafe fix can change behavior, such as `==` becoming `===`, so review what it changed. An editor that runs Biome on save uses the same version when it resolves Biome from the root `node_modules`, so a repository that wants that installs `@biomejs/biome` at the version this package pins.
|
|
401
398
|
|
|
402
399
|
## Vitest projects
|
|
403
400
|
|
package/biome/declarations.json
CHANGED
|
@@ -13,5 +13,60 @@
|
|
|
13
13
|
"includes": ["**/*.config.*"],
|
|
14
14
|
"reason": "Tools load their config files through the default export.",
|
|
15
15
|
"rule": "lint/style/noDefaultExport"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"includes": ["**"],
|
|
19
|
+
"reason": "quality fix applies every Biome lint fix, and this rule's fix changed behavior or did not finish on real code, so the rule is off until it is reviewed.",
|
|
20
|
+
"rule": "lint/correctness/noProcessGlobal"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"includes": ["**"],
|
|
24
|
+
"reason": "quality fix applies every Biome lint fix, and this rule's fix changed behavior or did not finish on real code, so the rule is off until it is reviewed.",
|
|
25
|
+
"rule": "lint/correctness/useJsonImportAttributes"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"includes": ["**"],
|
|
29
|
+
"reason": "quality fix applies every Biome lint fix, and this rule's fix changed behavior or did not finish on real code, so the rule is off until it is reviewed.",
|
|
30
|
+
"rule": "lint/nursery/noMisusedPromises"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"includes": ["**"],
|
|
34
|
+
"reason": "quality fix applies every Biome lint fix, and this rule's fix changed behavior or did not finish on real code, so the rule is off until it is reviewed.",
|
|
35
|
+
"rule": "lint/nursery/useExhaustiveSwitchCases"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"includes": ["**"],
|
|
39
|
+
"reason": "quality fix applies every Biome lint fix, and this rule's fix changed behavior or did not finish on real code, so the rule is off until it is reviewed.",
|
|
40
|
+
"rule": "lint/nursery/useSortedClasses"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"includes": ["**"],
|
|
44
|
+
"reason": "quality fix applies every Biome lint fix, and this rule's fix changed behavior or did not finish on real code, so the rule is off until it is reviewed.",
|
|
45
|
+
"rule": "lint/performance/noDelete"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"includes": ["**"],
|
|
49
|
+
"reason": "quality fix applies every Biome lint fix, and this rule's fix changed behavior or did not finish on real code, so the rule is off until it is reviewed.",
|
|
50
|
+
"rule": "lint/style/useConsistentArrayType"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"includes": ["**"],
|
|
54
|
+
"reason": "quality fix applies every Biome lint fix, and this rule's fix changed behavior or did not finish on real code, so the rule is off until it is reviewed.",
|
|
55
|
+
"rule": "lint/style/useConsistentCurlyBraces"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"includes": ["**"],
|
|
59
|
+
"reason": "quality fix applies every Biome lint fix, and this rule's fix changed behavior or did not finish on real code, so the rule is off until it is reviewed.",
|
|
60
|
+
"rule": "lint/suspicious/noEqualsToNull"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"includes": ["**"],
|
|
64
|
+
"reason": "quality fix applies every Biome lint fix, and this rule's fix changed behavior or did not finish on real code, so the rule is off until it is reviewed.",
|
|
65
|
+
"rule": "lint/suspicious/noSkippedTests"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"includes": ["**"],
|
|
69
|
+
"reason": "An unused private member asks whether it is still needed or should be used; deleting it automatically skips that decision.",
|
|
70
|
+
"rule": "lint/correctness/noUnusedPrivateClassMembers"
|
|
16
71
|
}
|
|
17
72
|
]
|
package/biome/preset.json
CHANGED
|
@@ -3,7 +3,18 @@
|
|
|
3
3
|
"actions": {
|
|
4
4
|
"source": {
|
|
5
5
|
"noDuplicateClasses": "on",
|
|
6
|
-
"organizeImports":
|
|
6
|
+
"organizeImports": {
|
|
7
|
+
"level": "on",
|
|
8
|
+
"options": {
|
|
9
|
+
"groups": [
|
|
10
|
+
[":NODE:", ":BUN:"],
|
|
11
|
+
[":PACKAGE:", ":PACKAGE_WITH_PROTOCOL:", ":URL:", "!@shivaedev/**"],
|
|
12
|
+
["@shivaedev/**"],
|
|
13
|
+
[":ALIAS:"],
|
|
14
|
+
[":PATH:"]
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
},
|
|
7
18
|
"useSortedAttributes": "on",
|
|
8
19
|
"useSortedEnumMembers": "on",
|
|
9
20
|
"useSortedInterfaceMembers": "on",
|
|
@@ -207,7 +218,7 @@
|
|
|
207
218
|
"noNonoctalDecimalEscape": "error",
|
|
208
219
|
"noPrecisionLoss": "error",
|
|
209
220
|
"noPrivateImports": "error",
|
|
210
|
-
"noProcessGlobal": "
|
|
221
|
+
"noProcessGlobal": "off",
|
|
211
222
|
"noReactPropAssignments": "error",
|
|
212
223
|
"noRenderReturnValue": "error",
|
|
213
224
|
"noSelfAssign": "error",
|
|
@@ -231,7 +242,7 @@
|
|
|
231
242
|
"noUnusedImports": "error",
|
|
232
243
|
"noUnusedInstantiation": "error",
|
|
233
244
|
"noUnusedLabels": "error",
|
|
234
|
-
"noUnusedPrivateClassMembers": "error",
|
|
245
|
+
"noUnusedPrivateClassMembers": { "fix": "none", "level": "error" },
|
|
235
246
|
"noUnusedVariables": "off",
|
|
236
247
|
"noVoidElementsWithChildren": "error",
|
|
237
248
|
"noVoidTypeReturn": "error",
|
|
@@ -245,7 +256,7 @@
|
|
|
245
256
|
"useHookAtTopLevel": "error",
|
|
246
257
|
"useInlineScriptId": "error",
|
|
247
258
|
"useIsNan": "error",
|
|
248
|
-
"useJsonImportAttributes": "
|
|
259
|
+
"useJsonImportAttributes": "off",
|
|
249
260
|
"useJsxKeyInIterable": {
|
|
250
261
|
"level": "error",
|
|
251
262
|
"options": {
|
|
@@ -281,7 +292,7 @@
|
|
|
281
292
|
"noJsxLeakedDollar": "error",
|
|
282
293
|
"noJsxNamespace": "error",
|
|
283
294
|
"noLoopFunc": "error",
|
|
284
|
-
"noMisusedPromises": "
|
|
295
|
+
"noMisusedPromises": "off",
|
|
285
296
|
"noNegationInEqualityCheck": "error",
|
|
286
297
|
"noObsoleteTags": "error",
|
|
287
298
|
"noPlaywrightElementHandle": "error",
|
|
@@ -329,7 +340,7 @@
|
|
|
329
340
|
"useControlLabel": "error",
|
|
330
341
|
"useDisposables": "error",
|
|
331
342
|
"useExhaustiveSwitchCases": {
|
|
332
|
-
"level": "
|
|
343
|
+
"level": "off",
|
|
333
344
|
"options": {
|
|
334
345
|
"requireExplicitCase": true
|
|
335
346
|
}
|
|
@@ -343,7 +354,7 @@
|
|
|
343
354
|
"useRegexpExec": "error",
|
|
344
355
|
"useRegexpTest": "error",
|
|
345
356
|
"useSortedClasses": {
|
|
346
|
-
"level": "
|
|
357
|
+
"level": "off",
|
|
347
358
|
"options": {
|
|
348
359
|
"functions": ["cn", "clsx", "cva"]
|
|
349
360
|
}
|
|
@@ -358,7 +369,7 @@
|
|
|
358
369
|
"performance": {
|
|
359
370
|
"noAccumulatingSpread": "error",
|
|
360
371
|
"noBarrelFile": "error",
|
|
361
|
-
"noDelete": "
|
|
372
|
+
"noDelete": "off",
|
|
362
373
|
"noDynamicNamespaceImportAccess": "error",
|
|
363
374
|
"noReExportAll": "error",
|
|
364
375
|
"noSyncScripts": "error",
|
|
@@ -398,17 +409,22 @@
|
|
|
398
409
|
"useCollapsedElseIf": "error",
|
|
399
410
|
"useCollapsedIf": "error",
|
|
400
411
|
"useConsistentArrayType": {
|
|
401
|
-
"level": "
|
|
412
|
+
"level": "off",
|
|
402
413
|
"options": {
|
|
403
414
|
"syntax": "shorthand"
|
|
404
415
|
}
|
|
405
416
|
},
|
|
406
417
|
"useConsistentArrowReturn": "error",
|
|
407
418
|
"useConsistentBuiltinInstantiation": "error",
|
|
408
|
-
"useConsistentCurlyBraces": "
|
|
419
|
+
"useConsistentCurlyBraces": "off",
|
|
409
420
|
"useConsistentEnumValueType": "error",
|
|
410
421
|
"useConsistentMemberAccessibility": "error",
|
|
411
|
-
"useConsistentMethodSignatures":
|
|
422
|
+
"useConsistentMethodSignatures": {
|
|
423
|
+
"level": "error",
|
|
424
|
+
"options": {
|
|
425
|
+
"style": "property"
|
|
426
|
+
}
|
|
427
|
+
},
|
|
412
428
|
"useConsistentObjectDefinitions": "error",
|
|
413
429
|
"useConsistentTypeDefinitions": {
|
|
414
430
|
"level": "error",
|
|
@@ -490,7 +506,7 @@
|
|
|
490
506
|
"noEmptyBlockStatements": "error",
|
|
491
507
|
"noEmptyInterface": "error",
|
|
492
508
|
"noEmptySource": "error",
|
|
493
|
-
"noEqualsToNull": "
|
|
509
|
+
"noEqualsToNull": "off",
|
|
494
510
|
"noEvolvingTypes": "error",
|
|
495
511
|
"noExplicitAny": "error",
|
|
496
512
|
"noExportsInTest": "error",
|
|
@@ -527,7 +543,7 @@
|
|
|
527
543
|
"noShadow": "error",
|
|
528
544
|
"noShadowRestrictedNames": "error",
|
|
529
545
|
"noShorthandPropertyOverrides": "error",
|
|
530
|
-
"noSkippedTests": "
|
|
546
|
+
"noSkippedTests": "off",
|
|
531
547
|
"noSparseArray": "error",
|
|
532
548
|
"noSuspiciousSemicolonInJsx": "error",
|
|
533
549
|
"noTemplateCurlyInString": "error",
|
|
@@ -6,6 +6,5 @@ export interface LegacyEntry extends BaselineEntry {
|
|
|
6
6
|
readonly measure?: number | undefined;
|
|
7
7
|
}
|
|
8
8
|
export declare const decodeLegacyBaseline: (raw: string) => Promise<Decoded<readonly LegacyEntry[]>>;
|
|
9
|
-
export declare const measured: (legacy: readonly LegacyEntry[]) => boolean;
|
|
10
9
|
export declare const convertLegacy: (legacy: readonly LegacyEntry[], violations: readonly Violation[]) => readonly BaselineEntry[];
|
|
11
10
|
//# sourceMappingURL=legacy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legacy.d.ts","sourceRoot":"","sources":["../../src/baseline/legacy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,OAAO,EAAc,MAAM,eAAe,CAAC;AACzD,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,eAAe,0BAA0B,CAAC;AAWvD,MAAM,WAAW,WAAY,SAAQ,aAAa;IACjD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAED,eAAO,MAAM,oBAAoB,GAAU,KAAK,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CAS/F,CAAC;AAEF,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"legacy.d.ts","sourceRoot":"","sources":["../../src/baseline/legacy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,OAAO,EAAc,MAAM,eAAe,CAAC;AACzD,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,eAAe,0BAA0B,CAAC;AAWvD,MAAM,WAAW,WAAY,SAAQ,aAAa;IACjD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAED,eAAO,MAAM,oBAAoB,GAAU,KAAK,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CAS/F,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,QAAQ,SAAS,WAAW,EAAE,EAAE,YAAY,SAAS,SAAS,EAAE,KAAG,SAAS,aAAa,EAWtH,CAAC"}
|
package/dist/baseline/legacy.js
CHANGED
|
@@ -17,7 +17,6 @@ export const decodeLegacyBaseline = async (raw) => {
|
|
|
17
17
|
const entries = Object.entries(decoded.value).flatMap(([rule, files]) => Object.entries(files).map(([file, stored]) => ({ ...stored, file, rule })));
|
|
18
18
|
return { _tag: "Valid", value: entries };
|
|
19
19
|
};
|
|
20
|
-
export const measured = (legacy) => legacy.some((entry) => entry.measure !== undefined);
|
|
21
20
|
export const convertLegacy = (legacy, violations) => {
|
|
22
21
|
const current = groupBy(violations, (violation) => keyOf(violation.rule, violation.file));
|
|
23
22
|
return legacy.flatMap(({ count, file, measure, rule }) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legacy.js","sourceRoot":"","sources":["../../src/baseline/legacy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAgB,UAAU,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAkB,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,MAAM,CAAC,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAEvD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAChD,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;CAC1C,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAErF,MAAM,QAAQ,GAAG,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;AAM9I,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,GAAW,EAA4C,EAAE;IACnG,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAChD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC;IAChB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CACvE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAC1E,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"legacy.js","sourceRoot":"","sources":["../../src/baseline/legacy.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/args.d.ts
CHANGED
|
@@ -6,7 +6,6 @@ export type Command = {
|
|
|
6
6
|
} | {
|
|
7
7
|
readonly _tag: "Fix";
|
|
8
8
|
readonly config: string | undefined;
|
|
9
|
-
readonly lint: boolean;
|
|
10
9
|
} | {
|
|
11
10
|
readonly _tag: "BaselineWrite";
|
|
12
11
|
readonly config: string | undefined;
|
|
@@ -15,10 +14,6 @@ export type Command = {
|
|
|
15
14
|
readonly _tag: "BaselinePrune";
|
|
16
15
|
readonly config: string | undefined;
|
|
17
16
|
readonly against: string | undefined;
|
|
18
|
-
} | {
|
|
19
|
-
readonly _tag: "BaselineCheck";
|
|
20
|
-
readonly config: string | undefined;
|
|
21
|
-
readonly against: string | undefined;
|
|
22
17
|
} | {
|
|
23
18
|
readonly _tag: "BaselineTighten";
|
|
24
19
|
readonly config: string | undefined;
|
|
@@ -37,6 +32,6 @@ export type Parsed = {
|
|
|
37
32
|
readonly _tag: "Usage";
|
|
38
33
|
readonly problem: string;
|
|
39
34
|
};
|
|
40
|
-
export declare const USAGE = "Usage:\n quality lint [--config <file>] [--warnings summary|all]\n quality fix [--config <file>]
|
|
35
|
+
export declare const USAGE = "Usage:\n quality lint [--config <file>] [--warnings summary|all]\n quality fix [--config <file>]\n quality baseline write [--config <file>] [--rule <id>]...\n quality baseline prune [--config <file>] [--against <ref>]\n quality baseline tighten [--config <file>] [--staged]\n quality baseline migrate [--config <file>] [--from <file>]\n\nlint Run every rule. Exits 1 on an error-level violation, a file over its baseline, a stale registry entry\n or a baseline entry for a rule that is off or unknown.\nfix Sort every package.json, apply Biome's lint fixes, unsafe ones included, its assist actions and formatting, then format again.\nbaseline write Record current error-level violations. Creates the baseline, or records the named rules again, replacing their entries.\nbaseline prune Drop fixed debt, lower entries to what is left and carry entries to files git saw move. Never adds or raises an entry.\nbaseline tighten Prune only the entries of files changed since HEAD, or with --staged, in the index.\nbaseline migrate Move a baseline from the earlier JSON format (--from, quality/baseline.json by default) to the configured file.\n\n--config <file> Config file; its directory is the repository root. Defaults to ./quality.config.ts.\n--against <ref> The branch the work merges into, whose merge base prune follows moves from. Defaults to origin/HEAD, then origin/main, then origin/master.\nExit codes: 0 passed, 1 failed the gate, 2 could not run.";
|
|
41
36
|
export declare const parseCommand: (args: readonly string[]) => Parsed;
|
|
42
37
|
//# sourceMappingURL=args.d.ts.map
|
package/dist/cli/args.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,MAAM,OAAO,GAChB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAA;CAAE,GAChG;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,MAAM,OAAO,GAChB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAA;CAAE,GAChG;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAC7D;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAC1G;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAC7G;IAAE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACnG;IAAE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAC5G;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7B,MAAM,MAAM,MAAM,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnI,eAAO,MAAM,KAAK,++CAkBwC,CAAC;AA8D3D,eAAO,MAAM,YAAY,GAAI,MAAM,SAAS,MAAM,EAAE,KAAG,MAmBtD,CAAC"}
|
package/dist/cli/args.js
CHANGED
|
@@ -2,46 +2,41 @@ import { parseArgs } from "node:util";
|
|
|
2
2
|
import { Result } from "effect";
|
|
3
3
|
export const USAGE = `Usage:
|
|
4
4
|
quality lint [--config <file>] [--warnings summary|all]
|
|
5
|
-
quality fix [--config <file>]
|
|
5
|
+
quality fix [--config <file>]
|
|
6
6
|
quality baseline write [--config <file>] [--rule <id>]...
|
|
7
7
|
quality baseline prune [--config <file>] [--against <ref>]
|
|
8
8
|
quality baseline tighten [--config <file>] [--staged]
|
|
9
|
-
quality baseline check [--config <file>] [--against <ref>]
|
|
10
9
|
quality baseline migrate [--config <file>] [--from <file>]
|
|
11
10
|
|
|
12
11
|
lint Run every rule. Exits 1 on an error-level violation, a file over its baseline, a stale registry entry
|
|
13
12
|
or a baseline entry for a rule that is off or unknown.
|
|
14
|
-
fix Sort every package.json
|
|
15
|
-
With --lint, also apply Biome's safe lint fixes, which can change behavior.
|
|
13
|
+
fix Sort every package.json, apply Biome's lint fixes, unsafe ones included, its assist actions and formatting, then format again.
|
|
16
14
|
baseline write Record current error-level violations. Creates the baseline, or records the named rules again, replacing their entries.
|
|
17
15
|
baseline prune Drop fixed debt, lower entries to what is left and carry entries to files git saw move. Never adds or raises an entry.
|
|
18
16
|
baseline tighten Prune only the entries of files changed since HEAD, or with --staged, in the index.
|
|
19
|
-
baseline check Compare the baseline with its version at the merge base. Exits 1 when it gained an entry or a higher count.
|
|
20
17
|
baseline migrate Move a baseline from the earlier JSON format (--from, quality/baseline.json by default) to the configured file.
|
|
21
18
|
|
|
22
19
|
--config <file> Config file; its directory is the repository root. Defaults to ./quality.config.ts.
|
|
23
|
-
--against <ref> The branch the work merges into. Defaults to origin/HEAD, then origin/main, then origin/master.
|
|
20
|
+
--against <ref> The branch the work merges into, whose merge base prune follows moves from. Defaults to origin/HEAD, then origin/main, then origin/master.
|
|
24
21
|
Exit codes: 0 passed, 1 failed the gate, 2 could not run.`;
|
|
25
22
|
const OPTIONS = {
|
|
26
23
|
against: { type: "string" },
|
|
27
24
|
config: { type: "string" },
|
|
28
25
|
from: { type: "string" },
|
|
29
26
|
help: { short: "h", type: "boolean" },
|
|
30
|
-
lint: { type: "boolean" },
|
|
31
27
|
rule: { multiple: true, type: "string" },
|
|
32
28
|
staged: { type: "boolean" },
|
|
33
29
|
warnings: { type: "string" },
|
|
34
30
|
};
|
|
35
31
|
const usage = (problem) => ({ _tag: "Usage", problem });
|
|
36
32
|
const parsed = (command) => ({ _tag: "Parsed", command });
|
|
37
|
-
const COMMAND_OPTIONS = ["against", "from", "
|
|
33
|
+
const COMMAND_OPTIONS = ["against", "from", "rule", "staged", "warnings"];
|
|
38
34
|
const ACCEPTS = {
|
|
39
|
-
"baseline check": ["against"],
|
|
40
35
|
"baseline migrate": ["from"],
|
|
41
36
|
"baseline prune": ["against"],
|
|
42
37
|
"baseline tighten": ["staged"],
|
|
43
38
|
"baseline write": ["rule"],
|
|
44
|
-
fix: [
|
|
39
|
+
fix: [],
|
|
45
40
|
lint: ["warnings"],
|
|
46
41
|
};
|
|
47
42
|
const misplaced = (name, values) => {
|
|
@@ -60,13 +55,11 @@ const commandFor = (name, values) => {
|
|
|
60
55
|
: usage(`--warnings takes summary or all, not "${warnings}".`);
|
|
61
56
|
}
|
|
62
57
|
case "fix":
|
|
63
|
-
return parsed({ _tag: "Fix", config
|
|
58
|
+
return parsed({ _tag: "Fix", config });
|
|
64
59
|
case "baseline write":
|
|
65
60
|
return parsed({ _tag: "BaselineWrite", config, rules: values.rule ?? [] });
|
|
66
61
|
case "baseline prune":
|
|
67
62
|
return ref(values.against, { _tag: "BaselinePrune", against: values.against, config });
|
|
68
|
-
case "baseline check":
|
|
69
|
-
return ref(values.against, { _tag: "BaselineCheck", against: values.against, config });
|
|
70
63
|
case "baseline tighten":
|
|
71
64
|
return parsed({ _tag: "BaselineTighten", config, staged: values.staged === true });
|
|
72
65
|
default:
|
|
@@ -88,7 +81,7 @@ export const parseCommand = (args) => {
|
|
|
88
81
|
}
|
|
89
82
|
const name = [command, ...rest].join(" ");
|
|
90
83
|
if (ACCEPTS[name] === undefined) {
|
|
91
|
-
return usage(command === "baseline" && rest.length < 2 ? "baseline takes write, prune, tighten
|
|
84
|
+
return usage(command === "baseline" && rest.length < 2 ? "baseline takes write, prune, tighten or migrate." : `unknown command: ${name}`);
|
|
92
85
|
}
|
|
93
86
|
const problem = misplaced(name, values);
|
|
94
87
|
return problem === undefined ? commandFor(name, values) : usage(problem);
|
package/dist/cli/args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/fix.d.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import { Effect,
|
|
1
|
+
import { Effect, FileSystem } from "effect";
|
|
2
2
|
import { SetupFailure } from "../failure.ts";
|
|
3
|
-
export declare
|
|
3
|
+
export declare const MAX_FIX_ROUNDS = 5;
|
|
4
|
+
export interface Settling<Failure, Requirements> {
|
|
5
|
+
readonly round: (index: number) => Effect.Effect<number, Failure, Requirements>;
|
|
6
|
+
readonly snapshot: Effect.Effect<ReadonlyMap<string, string>, Failure, Requirements>;
|
|
7
|
+
}
|
|
8
|
+
export declare function settle<Failure, Requirements>({ round, snapshot, }: Settling<Failure, Requirements>): Effect.Effect<void, Failure | SetupFailure, Requirements>;
|
|
9
|
+
export declare function fix(cwd: string, config: string | undefined): Effect.Effect<void, SetupFailure, FileSystem.FileSystem>;
|
|
4
10
|
//# sourceMappingURL=fix.d.ts.map
|
package/dist/cli/fix.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fix.d.ts","sourceRoot":"","sources":["../../src/cli/fix.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fix.d.ts","sourceRoot":"","sources":["../../src/cli/fix.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGrD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAM7C,eAAO,MAAM,cAAc,IAAI,CAAC;AA+BhC,MAAM,WAAW,QAAQ,CAAC,OAAO,EAAE,YAAY;IAC9C,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAChF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;CACrF;AAeD,wBAAgB,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,EAC7C,KAAK,EACL,QAAQ,GACR,EAAE,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,EAAE,YAAY,CAAC,CAa7F;AAED,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,CAAC,UAAU,CAAC,CAOrH"}
|