@shivaedev/quality 0.23.0 → 0.25.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 +18 -0
- package/README.md +6 -2
- package/dist/baseline/compare.d.ts +2 -2
- package/dist/baseline/compare.d.ts.map +1 -1
- package/dist/baseline/compare.js +6 -4
- package/dist/baseline/compare.js.map +1 -1
- package/dist/baseline/format.d.ts +5 -5
- package/dist/baseline/format.d.ts.map +1 -1
- package/dist/baseline/format.js +23 -13
- package/dist/baseline/format.js.map +1 -1
- package/dist/baseline/legacy.d.ts +2 -2
- package/dist/baseline/legacy.d.ts.map +1 -1
- package/dist/baseline/legacy.js +4 -4
- package/dist/baseline/legacy.js.map +1 -1
- package/dist/baseline/rewrite.d.ts +1 -1
- package/dist/baseline/rewrite.d.ts.map +1 -1
- package/dist/baseline/rewrite.js +2 -2
- package/dist/baseline/rewrite.js.map +1 -1
- package/dist/baseline/update.d.ts +2 -2
- package/dist/baseline/update.d.ts.map +1 -1
- package/dist/baseline/update.js +27 -21
- package/dist/baseline/update.js.map +1 -1
- package/dist/cli/args.d.ts +2 -4
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +19 -18
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/baseline.d.ts +1 -1
- package/dist/cli/baseline.d.ts.map +1 -1
- package/dist/cli/baseline.js +10 -6
- package/dist/cli/baseline.js.map +1 -1
- package/dist/cli/fix.d.ts +2 -2
- package/dist/cli/fix.d.ts.map +1 -1
- package/dist/cli/fix.js +35 -41
- package/dist/cli/fix.js.map +1 -1
- package/dist/cli/lint.d.ts +1 -2
- package/dist/cli/lint.d.ts.map +1 -1
- package/dist/cli/lint.js +1 -2
- package/dist/cli/lint.js.map +1 -1
- package/dist/cli/messages.d.ts +1 -1
- package/dist/cli/messages.d.ts.map +1 -1
- package/dist/cli/messages.js +2 -2
- package/dist/cli/migrate.d.ts.map +1 -1
- package/dist/cli/migrate.js +2 -2
- package/dist/cli/migrate.js.map +1 -1
- package/dist/cli/migrateExceptions.js +1 -1
- package/dist/cli/migrateExceptions.js.map +1 -1
- package/dist/cli/program.js +1 -1
- package/dist/cli/program.js.map +1 -1
- package/dist/cli/{run-main.d.ts → runMain.d.ts} +1 -1
- package/dist/cli/runMain.d.ts.map +1 -0
- package/dist/cli/{run-main.js → runMain.js} +3 -3
- package/dist/cli/runMain.js.map +1 -0
- package/dist/cli/shrink.d.ts +2 -2
- package/dist/cli/shrink.d.ts.map +1 -1
- package/dist/cli/shrink.js +9 -3
- package/dist/cli/shrink.js.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/config/decode.d.ts +1 -1
- package/dist/config/decode.d.ts.map +1 -1
- package/dist/config/decode.js +13 -9
- package/dist/config/decode.js.map +1 -1
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +26 -20
- package/dist/config/load.js.map +1 -1
- package/dist/config/resolve.d.ts +23 -3
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +19 -11
- package/dist/config/resolve.js.map +1 -1
- package/dist/config.d.ts +3 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -1
- package/dist/config.js.map +1 -1
- package/dist/decoded.d.ts +3 -3
- package/dist/decoded.d.ts.map +1 -1
- package/dist/decoded.js +8 -6
- package/dist/decoded.js.map +1 -1
- package/dist/engine/{baseline-file.d.ts → baselineFile.d.ts} +2 -2
- package/dist/engine/baselineFile.d.ts.map +1 -0
- package/dist/engine/{baseline-file.js → baselineFile.js} +5 -3
- package/dist/engine/baselineFile.js.map +1 -0
- package/dist/engine/evaluate.d.ts +2 -3
- package/dist/engine/evaluate.d.ts.map +1 -1
- package/dist/engine/evaluate.js +6 -5
- package/dist/engine/evaluate.js.map +1 -1
- package/dist/engine/{run-rules.d.ts → runRules.d.ts} +2 -2
- package/dist/engine/runRules.d.ts.map +1 -0
- package/dist/engine/runRules.js +44 -0
- package/dist/engine/runRules.js.map +1 -0
- package/dist/engine/session.d.ts +1 -1
- package/dist/engine/session.d.ts.map +1 -1
- package/dist/engine/session.js +10 -6
- package/dist/engine/session.js.map +1 -1
- package/dist/engine/violation.d.ts +8 -8
- package/dist/engine/violation.d.ts.map +1 -1
- package/dist/engine/violation.js +23 -11
- package/dist/engine/violation.js.map +1 -1
- package/dist/exceptions/registry.d.ts +2 -2
- package/dist/exceptions/registry.d.ts.map +1 -1
- package/dist/exceptions/registry.js +10 -6
- package/dist/exceptions/registry.js.map +1 -1
- package/dist/git/base.d.ts +1 -2
- package/dist/git/base.d.ts.map +1 -1
- package/dist/git/base.js +22 -10
- package/dist/git/base.js.map +1 -1
- package/dist/git/command.d.ts +2 -2
- package/dist/git/command.d.ts.map +1 -1
- package/dist/git/command.js +13 -9
- package/dist/git/command.js.map +1 -1
- package/dist/git/history.d.ts +1 -1
- package/dist/git/history.d.ts.map +1 -1
- package/dist/git/history.js +5 -3
- package/dist/git/history.js.map +1 -1
- package/dist/hooks/preCommit.js +1 -1
- package/dist/hooks/preCommit.js.map +1 -1
- package/dist/imports/generated.js +1 -1
- package/dist/imports/generated.js.map +1 -1
- package/dist/imports/{pnpm-workspace.d.ts → pnpmWorkspacePatterns.d.ts} +1 -1
- package/dist/imports/pnpmWorkspacePatterns.d.ts.map +1 -0
- package/dist/imports/{pnpm-workspace.js → pnpmWorkspacePatterns.js} +1 -1
- package/dist/imports/pnpmWorkspacePatterns.js.map +1 -0
- package/dist/imports/resolve.js +1 -1
- package/dist/imports/resolve.js.map +1 -1
- package/dist/imports/workspace.js +1 -1
- package/dist/imports/workspace.js.map +1 -1
- package/dist/inventory/collect.d.ts +1 -1
- package/dist/inventory/collect.d.ts.map +1 -1
- package/dist/inventory/collect.js +8 -6
- package/dist/inventory/collect.js.map +1 -1
- package/dist/inventory/filesystem.d.ts +1 -1
- package/dist/inventory/filesystem.d.ts.map +1 -1
- package/dist/inventory/filesystem.js +11 -7
- package/dist/inventory/filesystem.js.map +1 -1
- package/dist/inventory/ignoreScope.d.ts +17 -0
- package/dist/inventory/ignoreScope.d.ts.map +1 -0
- package/dist/inventory/{ignore-scope.js → ignoreScope.js} +19 -10
- package/dist/inventory/ignoreScope.js.map +1 -0
- package/dist/inventory/walk.d.ts +1 -1
- package/dist/inventory/walk.d.ts.map +1 -1
- package/dist/inventory/walk.js +1 -1
- package/dist/inventory/walk.js.map +1 -1
- package/dist/manifests/sorted.d.ts +1 -1
- package/dist/manifests/sorted.d.ts.map +1 -1
- package/dist/manifests/sorted.js +15 -17
- package/dist/manifests/sorted.js.map +1 -1
- package/dist/report/plural.d.ts +1 -1
- package/dist/report/plural.d.ts.map +1 -1
- package/dist/report/plural.js +3 -1
- package/dist/report/plural.js.map +1 -1
- package/dist/report/render.d.ts +1 -3
- package/dist/report/render.d.ts.map +1 -1
- package/dist/report/render.js +30 -32
- package/dist/report/render.js.map +1 -1
- package/dist/report/stale.d.ts +1 -1
- package/dist/report/stale.d.ts.map +1 -1
- package/dist/report/stale.js +18 -8
- package/dist/report/stale.js.map +1 -1
- package/dist/rule.d.ts +14 -14
- package/dist/rule.d.ts.map +1 -1
- package/dist/rule.js +11 -9
- package/dist/rule.js.map +1 -1
- package/dist/rules/{built-in.d.ts → builtIn.d.ts} +3 -3
- package/dist/rules/builtIn.d.ts.map +1 -0
- package/dist/rules/{built-in.js → builtIn.js} +17 -13
- package/dist/rules/builtIn.js.map +1 -0
- package/dist/rules/comments/{pattern-rule.d.ts → definePattern.d.ts} +2 -2
- package/dist/rules/comments/definePattern.d.ts.map +1 -0
- package/dist/rules/comments/definePattern.js +18 -0
- package/dist/rules/comments/definePattern.js.map +1 -0
- package/dist/rules/comments/kinds.d.ts +4 -4
- package/dist/rules/comments/kinds.d.ts.map +1 -1
- package/dist/rules/comments/kinds.js +16 -8
- package/dist/rules/comments/kinds.js.map +1 -1
- package/dist/rules/comments/{max-per-file.d.ts → maxPerFile.d.ts} +1 -1
- package/dist/rules/comments/maxPerFile.d.ts.map +1 -0
- package/dist/rules/comments/{max-per-file.js → maxPerFile.js} +14 -10
- package/dist/rules/comments/maxPerFile.js.map +1 -0
- package/dist/rules/comments/{no-banner.d.ts → noBanner.d.ts} +1 -1
- package/dist/rules/comments/noBanner.d.ts.map +1 -0
- package/dist/rules/comments/{no-banner.js → noBanner.js} +2 -2
- package/dist/rules/comments/noBanner.js.map +1 -0
- package/dist/rules/comments/{no-environment-pragma.d.ts → noEnvironmentPragma.d.ts} +1 -1
- package/dist/rules/comments/noEnvironmentPragma.d.ts.map +1 -0
- package/dist/rules/comments/{no-environment-pragma.js → noEnvironmentPragma.js} +2 -2
- package/dist/rules/comments/noEnvironmentPragma.js.map +1 -0
- package/dist/rules/comments/{no-jsdoc.d.ts → noJsdoc.d.ts} +1 -1
- package/dist/rules/comments/noJsdoc.d.ts.map +1 -0
- package/dist/rules/comments/{no-jsdoc.js → noJsdoc.js} +1 -1
- package/dist/rules/comments/noJsdoc.js.map +1 -0
- package/dist/rules/comments/{no-line-reference.d.ts → noLineReference.d.ts} +1 -1
- package/dist/rules/comments/noLineReference.d.ts.map +1 -0
- package/dist/rules/comments/{no-line-reference.js → noLineReference.js} +2 -2
- package/dist/rules/comments/noLineReference.js.map +1 -0
- package/dist/rules/comments/{no-pr-reference.d.ts → noPrReference.d.ts} +1 -1
- package/dist/rules/comments/noPrReference.d.ts.map +1 -0
- package/dist/rules/comments/{no-pr-reference.js → noPrReference.js} +2 -2
- package/dist/rules/comments/noPrReference.js.map +1 -0
- package/dist/rules/comments/{no-todo.d.ts → noTodo.d.ts} +1 -1
- package/dist/rules/comments/noTodo.d.ts.map +1 -0
- package/dist/rules/comments/{no-todo.js → noTodo.js} +2 -2
- package/dist/rules/comments/noTodo.js.map +1 -0
- package/dist/rules/comments/scan.d.ts +3 -3
- package/dist/rules/comments/scan.d.ts.map +1 -1
- package/dist/rules/comments/scan.js +23 -19
- package/dist/rules/comments/scan.js.map +1 -1
- package/dist/rules/{manifests-sorted.d.ts → manifestsSorted.d.ts} +1 -1
- package/dist/rules/manifestsSorted.d.ts.map +1 -0
- package/dist/rules/{manifests-sorted.js → manifestsSorted.js} +1 -1
- package/dist/rules/manifestsSorted.js.map +1 -0
- package/dist/rules/manifestsSourceFirst.d.ts +2 -0
- package/dist/rules/manifestsSourceFirst.d.ts.map +1 -0
- package/dist/rules/manifestsSourceFirst.js +43 -0
- package/dist/rules/manifestsSourceFirst.js.map +1 -0
- package/dist/rules/{max-lines.d.ts → maxLines.d.ts} +1 -1
- package/dist/rules/maxLines.d.ts.map +1 -0
- package/dist/rules/{max-lines.js → maxLines.js} +13 -11
- package/dist/rules/maxLines.js.map +1 -0
- package/dist/rules/stories/origins.d.ts +10 -0
- package/dist/rules/stories/origins.d.ts.map +1 -0
- package/dist/rules/stories/origins.js +129 -0
- package/dist/rules/stories/origins.js.map +1 -0
- package/dist/rules/stories/prerequisites.d.ts +4 -0
- package/dist/rules/stories/prerequisites.d.ts.map +1 -0
- package/dist/rules/stories/prerequisites.js +32 -0
- package/dist/rules/stories/prerequisites.js.map +1 -0
- package/dist/rules/stories/program.d.ts +5 -0
- package/dist/rules/stories/program.d.ts.map +1 -0
- package/dist/rules/stories/program.js +22 -0
- package/dist/rules/stories/program.js.map +1 -0
- package/dist/rules/stories/specs.d.ts +2 -0
- package/dist/rules/stories/specs.d.ts.map +1 -0
- package/dist/rules/stories/specs.js +80 -0
- package/dist/rules/stories/specs.js.map +1 -0
- package/dist/rules/suppressions/biome/configs.d.ts +1 -1
- package/dist/rules/suppressions/biome/configs.d.ts.map +1 -1
- package/dist/rules/suppressions/biome/configs.js +23 -17
- package/dist/rules/suppressions/biome/configs.js.map +1 -1
- package/dist/rules/suppressions/biome/declarations.d.ts +4 -4
- package/dist/rules/suppressions/biome/declarations.d.ts.map +1 -1
- package/dist/rules/suppressions/biome/declarations.js +15 -7
- package/dist/rules/suppressions/biome/declarations.js.map +1 -1
- package/dist/rules/suppressions/biome/json.d.ts +6 -6
- package/dist/rules/suppressions/biome/json.d.ts.map +1 -1
- package/dist/rules/suppressions/biome/json.js +27 -13
- package/dist/rules/suppressions/biome/json.js.map +1 -1
- package/dist/rules/suppressions/biome/resolve.d.ts +1 -1
- package/dist/rules/suppressions/biome/resolve.d.ts.map +1 -1
- package/dist/rules/suppressions/biome/resolve.js +23 -17
- package/dist/rules/suppressions/biome/resolve.js.map +1 -1
- package/dist/rules/suppressions/biome/weakenings.d.ts +1 -1
- package/dist/rules/suppressions/biome/weakenings.d.ts.map +1 -1
- package/dist/rules/suppressions/biome/weakenings.js +78 -52
- package/dist/rules/suppressions/biome/weakenings.js.map +1 -1
- package/dist/rules/suppressions/{biome-overrides.d.ts → biomeOverrides.d.ts} +1 -1
- package/dist/rules/suppressions/biomeOverrides.d.ts.map +1 -0
- package/dist/rules/suppressions/biomeOverrides.js +75 -0
- package/dist/rules/suppressions/biomeOverrides.js.map +1 -0
- package/dist/rules/suppressions/directives.d.ts +1 -1
- package/dist/rules/suppressions/directives.d.ts.map +1 -1
- package/dist/rules/suppressions/directives.js +5 -3
- package/dist/rules/suppressions/directives.js.map +1 -1
- package/dist/rules/suppressions/{no-double-cast.d.ts → noDoubleCast.d.ts} +1 -1
- package/dist/rules/suppressions/noDoubleCast.d.ts.map +1 -0
- package/dist/rules/suppressions/{no-double-cast.js → noDoubleCast.js} +15 -11
- package/dist/rules/suppressions/noDoubleCast.js.map +1 -0
- package/dist/rules/suppressions/noIgnoreDeprecations.js +1 -1
- package/dist/rules/suppressions/noIgnoreDeprecations.js.map +1 -1
- package/dist/rules/suppressions/{no-inline.d.ts → noInline.d.ts} +1 -1
- package/dist/rules/suppressions/noInline.d.ts.map +1 -0
- package/dist/rules/suppressions/{no-inline.js → noInline.js} +10 -8
- package/dist/rules/suppressions/noInline.js.map +1 -0
- package/dist/rules/suppressions/stylesheetComments.d.ts +4 -0
- package/dist/rules/suppressions/stylesheetComments.d.ts.map +1 -0
- package/dist/rules/suppressions/{stylesheet-comments.js → stylesheetComments.js} +12 -6
- package/dist/rules/suppressions/stylesheetComments.js.map +1 -0
- package/dist/rules/syntax.d.ts +1 -1
- package/dist/rules/syntax.d.ts.map +1 -1
- package/dist/rules/syntax.js +2 -2
- package/dist/rules/syntax.js.map +1 -1
- package/dist/{standard-schema.d.ts → standardSchema.d.ts} +7 -7
- package/dist/standardSchema.d.ts.map +1 -0
- package/dist/{standard-schema.js → standardSchema.js} +1 -1
- package/dist/standardSchema.js.map +1 -0
- package/docs/debt-and-hooks.md +2 -2
- package/docs/modules.md +27 -24
- package/docs/roadmap.md +1 -1
- package/docs/rules.md +2 -0
- package/package.json +2 -3
- package/src/baseline/compare.ts +6 -4
- package/src/baseline/format.ts +17 -10
- package/src/baseline/legacy.ts +4 -4
- package/src/baseline/rewrite.ts +2 -2
- package/src/baseline/update.ts +23 -19
- package/src/cli/args.ts +20 -21
- package/src/cli/baseline.ts +36 -35
- package/src/cli/fix.ts +40 -43
- package/src/cli/lint.ts +17 -21
- package/src/cli/messages.ts +2 -2
- package/src/cli/migrate.ts +21 -22
- package/src/cli/migrateExceptions.ts +1 -1
- package/src/cli/program.ts +1 -1
- package/src/cli/{run-main.ts → runMain.ts} +2 -2
- package/src/cli/shrink.ts +11 -8
- package/src/cli.ts +1 -1
- package/src/config/decode.ts +15 -10
- package/src/config/load.ts +44 -37
- package/src/config/resolve.ts +34 -29
- package/src/config.ts +5 -3
- package/src/decoded.ts +6 -5
- package/src/engine/baselineFile.ts +29 -0
- package/src/engine/evaluate.ts +7 -8
- package/src/engine/{run-rules.ts → runRules.ts} +22 -14
- package/src/engine/session.ts +34 -27
- package/src/engine/violation.ts +24 -13
- package/src/exceptions/registry.ts +10 -8
- package/src/git/base.ts +45 -37
- package/src/git/command.ts +6 -4
- package/src/git/history.ts +5 -4
- package/src/hooks/preCommit.ts +1 -1
- package/src/imports/generated.ts +1 -1
- package/src/imports/resolve.ts +1 -1
- package/src/imports/workspace.ts +1 -1
- package/src/inventory/collect.ts +40 -35
- package/src/inventory/filesystem.ts +38 -30
- package/src/inventory/{ignore-scope.ts → ignoreScope.ts} +20 -10
- package/src/inventory/walk.ts +1 -1
- package/src/manifests/sorted.ts +19 -19
- package/src/report/plural.ts +3 -1
- package/src/report/render.ts +24 -39
- package/src/report/stale.ts +33 -25
- package/src/rule.ts +26 -20
- package/src/rules/{built-in.ts → builtIn.ts} +16 -12
- package/src/rules/comments/{pattern-rule.ts → definePattern.ts} +5 -4
- package/src/rules/comments/kinds.ts +16 -9
- package/src/rules/comments/{max-per-file.ts → maxPerFile.ts} +15 -11
- package/src/rules/comments/{no-banner.ts → noBanner.ts} +1 -1
- package/src/rules/comments/{no-environment-pragma.ts → noEnvironmentPragma.ts} +1 -1
- package/src/rules/comments/{no-line-reference.ts → noLineReference.ts} +1 -1
- package/src/rules/comments/{no-pr-reference.ts → noPrReference.ts} +1 -1
- package/src/rules/comments/{no-todo.ts → noTodo.ts} +1 -1
- package/src/rules/comments/scan.ts +18 -15
- package/src/rules/manifestsSourceFirst.ts +48 -0
- package/src/rules/{max-lines.ts → maxLines.ts} +3 -2
- package/src/rules/stories/origins.ts +147 -0
- package/src/rules/stories/prerequisites.ts +37 -0
- package/src/rules/stories/program.ts +29 -0
- package/src/rules/stories/specs.ts +93 -0
- package/src/rules/suppressions/biome/configs.ts +23 -17
- package/src/rules/suppressions/biome/declarations.ts +15 -10
- package/src/rules/suppressions/biome/json.ts +25 -13
- package/src/rules/suppressions/biome/resolve.ts +23 -18
- package/src/rules/suppressions/biome/weakenings.ts +60 -41
- package/src/rules/suppressions/{biome-overrides.ts → biomeOverrides.ts} +32 -22
- package/src/rules/suppressions/directives.ts +5 -4
- package/src/rules/suppressions/{no-double-cast.ts → noDoubleCast.ts} +14 -10
- package/src/rules/suppressions/noIgnoreDeprecations.ts +1 -1
- package/src/rules/suppressions/{no-inline.ts → noInline.ts} +6 -5
- package/src/rules/suppressions/{stylesheet-comments.ts → stylesheetComments.ts} +11 -6
- package/src/rules/syntax.ts +2 -2
- package/src/{standard-schema.ts → standardSchema.ts} +4 -4
- package/dist/cli/run-main.d.ts.map +0 -1
- package/dist/cli/run-main.js.map +0 -1
- package/dist/engine/baseline-file.d.ts.map +0 -1
- package/dist/engine/baseline-file.js.map +0 -1
- package/dist/engine/run-rules.d.ts.map +0 -1
- package/dist/engine/run-rules.js +0 -34
- package/dist/engine/run-rules.js.map +0 -1
- package/dist/imports/pnpm-workspace.d.ts.map +0 -1
- package/dist/imports/pnpm-workspace.js.map +0 -1
- package/dist/inventory/ignore-scope.d.ts +0 -17
- package/dist/inventory/ignore-scope.d.ts.map +0 -1
- package/dist/inventory/ignore-scope.js.map +0 -1
- package/dist/rules/built-in.d.ts.map +0 -1
- package/dist/rules/built-in.js.map +0 -1
- package/dist/rules/comments/max-per-file.d.ts.map +0 -1
- package/dist/rules/comments/max-per-file.js.map +0 -1
- package/dist/rules/comments/no-banner.d.ts.map +0 -1
- package/dist/rules/comments/no-banner.js.map +0 -1
- package/dist/rules/comments/no-environment-pragma.d.ts.map +0 -1
- package/dist/rules/comments/no-environment-pragma.js.map +0 -1
- package/dist/rules/comments/no-jsdoc.d.ts.map +0 -1
- package/dist/rules/comments/no-jsdoc.js.map +0 -1
- package/dist/rules/comments/no-line-reference.d.ts.map +0 -1
- package/dist/rules/comments/no-line-reference.js.map +0 -1
- package/dist/rules/comments/no-pr-reference.d.ts.map +0 -1
- package/dist/rules/comments/no-pr-reference.js.map +0 -1
- package/dist/rules/comments/no-todo.d.ts.map +0 -1
- package/dist/rules/comments/no-todo.js.map +0 -1
- package/dist/rules/comments/pattern-rule.d.ts.map +0 -1
- package/dist/rules/comments/pattern-rule.js +0 -16
- package/dist/rules/comments/pattern-rule.js.map +0 -1
- package/dist/rules/manifests-sorted.d.ts.map +0 -1
- package/dist/rules/manifests-sorted.js.map +0 -1
- package/dist/rules/max-lines.d.ts.map +0 -1
- package/dist/rules/max-lines.js.map +0 -1
- package/dist/rules/suppressions/biome-overrides.d.ts.map +0 -1
- package/dist/rules/suppressions/biome-overrides.js +0 -63
- package/dist/rules/suppressions/biome-overrides.js.map +0 -1
- package/dist/rules/suppressions/no-double-cast.d.ts.map +0 -1
- package/dist/rules/suppressions/no-double-cast.js.map +0 -1
- package/dist/rules/suppressions/no-inline.d.ts.map +0 -1
- package/dist/rules/suppressions/no-inline.js.map +0 -1
- package/dist/rules/suppressions/stylesheet-comments.d.ts +0 -4
- package/dist/rules/suppressions/stylesheet-comments.d.ts.map +0 -1
- package/dist/rules/suppressions/stylesheet-comments.js.map +0 -1
- package/dist/standard-schema.d.ts.map +0 -1
- package/dist/standard-schema.js.map +0 -1
- package/src/engine/baseline-file.ts +0 -27
- /package/src/imports/{pnpm-workspace.ts → pnpmWorkspacePatterns.ts} +0 -0
- /package/src/rules/comments/{no-jsdoc.ts → noJsdoc.ts} +0 -0
- /package/src/rules/{manifests-sorted.ts → manifestsSorted.ts} +0 -0
package/src/baseline/update.ts
CHANGED
|
@@ -13,8 +13,8 @@ export interface Pruned {
|
|
|
13
13
|
readonly removed: number;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
[...groupBy(violations, (violation) => keyOf(violation.rule, violation.file)).values()].flatMap((group) => {
|
|
16
|
+
function record(violations: readonly Violation[]): readonly BaselineEntry[] {
|
|
17
|
+
return [...groupBy(violations, (violation) => keyOf(violation.rule, violation.file)).values()].flatMap((group) => {
|
|
18
18
|
const first = group[0];
|
|
19
19
|
if (first === undefined) {
|
|
20
20
|
return [];
|
|
@@ -22,21 +22,22 @@ const record = (violations: readonly Violation[]): readonly BaselineEntry[] =>
|
|
|
22
22
|
const count = countOf(group);
|
|
23
23
|
return count > 0 ? [{ count, file: first.file, rule: first.rule }] : [];
|
|
24
24
|
});
|
|
25
|
+
}
|
|
25
26
|
|
|
26
|
-
|
|
27
|
+
function refusal(id: string, index: RuleIndex): readonly string[] {
|
|
27
28
|
const level = levelOf(index, id);
|
|
28
29
|
if (level === undefined) {
|
|
29
30
|
return [`${id}: no built-in or local rule has this id.`];
|
|
30
31
|
}
|
|
31
|
-
return
|
|
32
|
-
}
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
33
34
|
|
|
34
|
-
export
|
|
35
|
+
export function adopt(
|
|
35
36
|
existing: readonly BaselineEntry[] | undefined,
|
|
36
37
|
rules: readonly string[],
|
|
37
38
|
violations: readonly Violation[],
|
|
38
39
|
index: RuleIndex,
|
|
39
|
-
): Adoption
|
|
40
|
+
): Adoption {
|
|
40
41
|
if (existing !== undefined && rules.length === 0) {
|
|
41
42
|
return { _tag: "Refused", reasons: ["a baseline exists. Record a rule with --rule <id>, or drop fixed debt with prune."] };
|
|
42
43
|
}
|
|
@@ -44,38 +45,41 @@ export const adopt = (
|
|
|
44
45
|
if (reasons.length > 0) {
|
|
45
46
|
return { _tag: "Refused", reasons };
|
|
46
47
|
}
|
|
47
|
-
|
|
48
|
+
function named(rule: string): boolean {
|
|
49
|
+
return rules.some((name) => covers(name, rule));
|
|
50
|
+
}
|
|
48
51
|
const kept = (existing ?? []).filter((entry) => !named(entry.rule));
|
|
49
|
-
const adopted = violations.filter((violation) =>
|
|
52
|
+
const adopted = violations.filter((violation) => rules.length === 0 || named(violation.rule));
|
|
50
53
|
const added = record(adopted);
|
|
51
54
|
return { _tag: "Adopted", added: added.length, entries: [...kept, ...added], replaced: (existing ?? []).length - kept.length };
|
|
52
|
-
}
|
|
55
|
+
}
|
|
53
56
|
|
|
54
57
|
export interface Scope {
|
|
55
58
|
readonly files?: ReadonlySet<string> | undefined;
|
|
56
59
|
readonly moves: ReadonlyMap<string, string>;
|
|
57
60
|
}
|
|
58
61
|
|
|
59
|
-
|
|
60
|
-
scope.files === undefined || scope.files.has(entry.file) || scope.moves.has(entry.file);
|
|
62
|
+
function inScope(entry: BaselineEntry, scope: Scope): boolean {
|
|
63
|
+
return scope.files === undefined || scope.files.has(entry.file) || scope.moves.has(entry.file);
|
|
64
|
+
}
|
|
61
65
|
|
|
62
|
-
|
|
66
|
+
function destination(
|
|
63
67
|
before: BaselineEntry,
|
|
64
68
|
current: ReadonlyMap<string, BaselineEntry>,
|
|
65
69
|
moves: ReadonlyMap<string, string>,
|
|
66
70
|
taken: ReadonlySet<string>,
|
|
67
|
-
)
|
|
71
|
+
) {
|
|
68
72
|
const to = moves.get(before.file);
|
|
69
73
|
const key = to === undefined ? undefined : keyOf(before.rule, to);
|
|
70
74
|
return key === undefined || taken.has(key) ? undefined : current.get(key);
|
|
71
|
-
}
|
|
75
|
+
}
|
|
72
76
|
|
|
73
|
-
export
|
|
77
|
+
export function prune(
|
|
74
78
|
existing: readonly BaselineEntry[],
|
|
75
79
|
violations: readonly Violation[],
|
|
76
80
|
index: RuleIndex,
|
|
77
81
|
scope: Scope = { moves: new Map() },
|
|
78
|
-
): Pruned
|
|
82
|
+
): Pruned {
|
|
79
83
|
const current = new Map(record(violations).map((entry) => [keyOf(entry.rule, entry.file), entry]));
|
|
80
84
|
const taken = new Set(existing.map((entry) => keyOf(entry.rule, entry.file)));
|
|
81
85
|
let moved = 0;
|
|
@@ -85,7 +89,7 @@ export const prune = (
|
|
|
85
89
|
}
|
|
86
90
|
const level = levelOf(index, before.rule);
|
|
87
91
|
const now = current.get(keyOf(before.rule, before.file)) ?? destination(before, current, scope.moves, taken);
|
|
88
|
-
if (now === undefined || level === undefined
|
|
92
|
+
if (now === undefined || level === undefined) {
|
|
89
93
|
return [];
|
|
90
94
|
}
|
|
91
95
|
moved += Number(now.file !== before.file);
|
|
@@ -97,4 +101,4 @@ export const prune = (
|
|
|
97
101
|
moved,
|
|
98
102
|
removed: existing.length - kept.length,
|
|
99
103
|
};
|
|
100
|
-
}
|
|
104
|
+
}
|
package/src/cli/args.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { parseArgs } from "node:util";
|
|
2
2
|
import { Result } from "effect";
|
|
3
|
-
import type { WarningDetail } from "#report/render.ts";
|
|
4
3
|
import { ADOPT_REMOVED, USAGE as COMMAND_USAGE } from "./messages.ts";
|
|
5
4
|
|
|
6
5
|
export type Command =
|
|
7
|
-
| { readonly _tag: "Lint"; readonly config: string | undefined
|
|
6
|
+
| { readonly _tag: "Lint"; readonly config: string | undefined }
|
|
8
7
|
| { readonly _tag: "ExceptionsMigrate"; readonly config: string | undefined; readonly from: string | undefined }
|
|
9
8
|
| { readonly _tag: "Fix"; readonly config: string | undefined }
|
|
10
9
|
| { readonly _tag: "BaselineWrite"; readonly config: string | undefined; readonly rules: readonly string[] }
|
|
@@ -28,10 +27,11 @@ const OPTIONS = {
|
|
|
28
27
|
help: { short: "h", type: "boolean" },
|
|
29
28
|
rule: { multiple: true, type: "string" },
|
|
30
29
|
staged: { type: "boolean" },
|
|
31
|
-
warnings: { type: "string" },
|
|
32
30
|
} as const;
|
|
33
31
|
|
|
34
|
-
|
|
32
|
+
function usage(problem: string): Parsed {
|
|
33
|
+
return { _tag: "Usage", problem };
|
|
34
|
+
}
|
|
35
35
|
|
|
36
36
|
const SUBCOMMANDS: Readonly<Record<string, string>> = {
|
|
37
37
|
baseline: "baseline takes write, prune, tighten or migrate.",
|
|
@@ -39,13 +39,15 @@ const SUBCOMMANDS: Readonly<Record<string, string>> = {
|
|
|
39
39
|
hooks: "hooks takes install, uninstall or pre-commit.",
|
|
40
40
|
};
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
function parsed(command: Command): Parsed {
|
|
43
|
+
return { _tag: "Parsed", command };
|
|
44
|
+
}
|
|
43
45
|
|
|
44
46
|
type Values = ReturnType<typeof parseArgs<{ options: typeof OPTIONS; allowPositionals: true }>>["values"];
|
|
45
47
|
|
|
46
48
|
type Option = Exclude<keyof Values, "config" | "help">;
|
|
47
49
|
|
|
48
|
-
const COMMAND_OPTIONS: readonly Option[] = ["against", "force", "from", "rule", "staged"
|
|
50
|
+
const COMMAND_OPTIONS: readonly Option[] = ["against", "force", "from", "rule", "staged"];
|
|
49
51
|
|
|
50
52
|
const ACCEPTS: Readonly<Record<string, readonly Option[]>> = {
|
|
51
53
|
"baseline migrate": ["from"],
|
|
@@ -57,27 +59,24 @@ const ACCEPTS: Readonly<Record<string, readonly Option[]>> = {
|
|
|
57
59
|
"hooks install": ["force"],
|
|
58
60
|
"hooks pre-commit": [],
|
|
59
61
|
"hooks uninstall": [],
|
|
60
|
-
lint: [
|
|
62
|
+
lint: [],
|
|
61
63
|
};
|
|
62
64
|
|
|
63
|
-
|
|
65
|
+
function misplaced(name: string, values: Values): string | undefined {
|
|
64
66
|
const option = COMMAND_OPTIONS.find((key) => values[key] !== undefined && !(ACCEPTS[name] ?? []).includes(key));
|
|
65
67
|
const owners = Object.keys(ACCEPTS).filter((owner) => option !== undefined && (ACCEPTS[owner] ?? []).includes(option));
|
|
66
68
|
return option === undefined ? undefined : `--${option} applies only to ${owners.join(" and ")}.`;
|
|
67
|
-
}
|
|
69
|
+
}
|
|
68
70
|
|
|
69
|
-
|
|
70
|
-
against?.startsWith("-") === true ? usage(`--against takes a git ref, not "${against}".`) : parsed(command);
|
|
71
|
+
function ref(against: string | undefined, command: Command): Parsed {
|
|
72
|
+
return against?.startsWith("-") === true ? usage(`--against takes a git ref, not "${against}".`) : parsed(command);
|
|
73
|
+
}
|
|
71
74
|
|
|
72
|
-
|
|
75
|
+
function commandFor(name: string, values: Values): Parsed {
|
|
73
76
|
const config = values.config;
|
|
74
77
|
switch (name) {
|
|
75
|
-
case "lint":
|
|
76
|
-
|
|
77
|
-
return warnings === "summary" || warnings === "all"
|
|
78
|
-
? parsed({ _tag: "Lint", config, warnings })
|
|
79
|
-
: usage(`--warnings takes summary or all, not "${warnings}".`);
|
|
80
|
-
}
|
|
78
|
+
case "lint":
|
|
79
|
+
return parsed({ _tag: "Lint", config });
|
|
81
80
|
case "exceptions migrate":
|
|
82
81
|
return parsed({ _tag: "ExceptionsMigrate", config, from: values.from });
|
|
83
82
|
case "fix":
|
|
@@ -97,9 +96,9 @@ const commandFor = (name: string, values: Values): Parsed => {
|
|
|
97
96
|
default:
|
|
98
97
|
return parsed({ _tag: "BaselineMigrate", config, from: values.from });
|
|
99
98
|
}
|
|
100
|
-
}
|
|
99
|
+
}
|
|
101
100
|
|
|
102
|
-
export
|
|
101
|
+
export function parseCommand(args: readonly string[]): Parsed {
|
|
103
102
|
const result = Result.try({
|
|
104
103
|
catch: (error) => (error instanceof Error ? error.message : String(error)),
|
|
105
104
|
try: () => parseArgs({ allowPositionals: true, args: [...args], options: OPTIONS, strict: true }),
|
|
@@ -122,4 +121,4 @@ export const parseCommand = (args: readonly string[]): Parsed => {
|
|
|
122
121
|
}
|
|
123
122
|
const problem = misplaced(name, values);
|
|
124
123
|
return problem === undefined ? commandFor(name, values) : usage(problem);
|
|
125
|
-
}
|
|
124
|
+
}
|
package/src/cli/baseline.ts
CHANGED
|
@@ -9,57 +9,58 @@ import { SetupFailure } from "#failure.ts";
|
|
|
9
9
|
import { writeText } from "#inventory/filesystem.ts";
|
|
10
10
|
import { plural } from "#report/plural.ts";
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
Effect.mapError(
|
|
12
|
+
function save(session: Session, entries: readonly BaselineEntry[]): Effect.Effect<void, SetupFailure, FileSystem.FileSystem> {
|
|
13
|
+
return Effect.mapError(
|
|
14
14
|
writeText(join(session.config.root, session.config.baseline), rewriteBaseline(session.baseline.raw, session.baseline.entries, entries)),
|
|
15
15
|
(failure) => new SetupFailure({ message: failure.message }),
|
|
16
16
|
);
|
|
17
|
+
}
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
function unregistered(session: Session) {
|
|
20
|
+
return applyRegistry(session.violations, session.registry, session.config).kept;
|
|
21
|
+
}
|
|
19
22
|
|
|
20
|
-
export const writeBaseline = (
|
|
23
|
+
export const writeBaseline = Effect.fn("Cli.writeBaseline")(function* (
|
|
21
24
|
cwd: string,
|
|
22
25
|
config: string | undefined,
|
|
23
26
|
rules: readonly string[],
|
|
24
|
-
): Effect.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
});
|
|
27
|
+
): Effect.fn.Return<void, SetupFailure, FileSystem.FileSystem> {
|
|
28
|
+
const session = yield* openSession(cwd, config);
|
|
29
|
+
const existing = session.baseline.raw === undefined ? undefined : session.baseline.entries;
|
|
30
|
+
const adoption = adopt(existing, rules, unregistered(session), session.config);
|
|
31
|
+
if (adoption._tag === "Refused") {
|
|
32
|
+
return yield* new SetupFailure({ message: `baseline write refused:\n${adoption.reasons.map((reason) => ` - ${reason}`).join("\n")}` });
|
|
33
|
+
}
|
|
34
|
+
if (adoption.added === 0 && adoption.replaced === 0) {
|
|
35
|
+
return yield* Console.log(`quality: no error-level violations to record; ${session.config.baseline} is unchanged.`);
|
|
36
|
+
}
|
|
37
|
+
yield* save(session, adoption.entries);
|
|
38
|
+
const replaced = adoption.replaced > 0 ? `, replacing ${plural(adoption.replaced, "entry", "entries")}` : "";
|
|
39
|
+
yield* Console.log(`quality: recorded ${plural(adoption.added, "entry", "entries")} in ${session.config.baseline}${replaced}.`);
|
|
40
|
+
});
|
|
39
41
|
|
|
40
|
-
|
|
42
|
+
function changes(pruned: Pruned): string {
|
|
41
43
|
const parts = [
|
|
42
44
|
`removed ${plural(pruned.removed, "entry", "entries")}`,
|
|
43
45
|
`lowered ${plural(pruned.lowered, "entry", "entries")}`,
|
|
44
46
|
...(pruned.moved > 0 ? [`carried ${plural(pruned.moved, "entry", "entries")} to moved files`] : []),
|
|
45
47
|
];
|
|
46
48
|
return `${parts.slice(0, -1).join(", ")} and ${parts.at(-1)}`;
|
|
47
|
-
}
|
|
49
|
+
}
|
|
48
50
|
|
|
49
|
-
export const shrinkBaseline = <TRequirements>(
|
|
51
|
+
export const shrinkBaseline = Effect.fn("Cli.shrinkBaseline")(function* <TRequirements>(
|
|
50
52
|
cwd: string,
|
|
51
53
|
config: string | undefined,
|
|
52
54
|
scopeOf: (session: Session) => Effect.Effect<Scope, SetupFailure, TRequirements>,
|
|
53
|
-
): Effect.
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
});
|
|
55
|
+
): Effect.fn.Return<void, SetupFailure, FileSystem.FileSystem | TRequirements> {
|
|
56
|
+
const session = yield* openSession(cwd, config);
|
|
57
|
+
if (session.baseline.raw === undefined) {
|
|
58
|
+
return yield* Console.log(`quality: no baseline at ${session.config.baseline}; nothing to lower.`);
|
|
59
|
+
}
|
|
60
|
+
const pruned = prune(session.baseline.entries, unregistered(session), session.config, yield* scopeOf(session));
|
|
61
|
+
if (pruned.removed === 0 && pruned.lowered === 0 && pruned.moved === 0) {
|
|
62
|
+
return yield* Console.log(`quality: ${session.config.baseline} is current.`);
|
|
63
|
+
}
|
|
64
|
+
yield* save(session, pruned.entries);
|
|
65
|
+
yield* Console.log(`quality: ${changes(pruned)} in ${session.config.baseline}.`);
|
|
66
|
+
});
|
package/src/cli/fix.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { biomeReport, type Report } from "#biome/report.ts";
|
|
|
4
4
|
import { loadConfig } from "#config/load.ts";
|
|
5
5
|
import type { ExceptionDeclaration } from "#exceptions/declaration.ts";
|
|
6
6
|
import { SetupFailure } from "#failure.ts";
|
|
7
|
-
import { posix } from "#inventory/
|
|
7
|
+
import { posix } from "#inventory/ignoreScope.ts";
|
|
8
8
|
import { walk } from "#inventory/walk.ts";
|
|
9
9
|
import { sortManifests } from "#manifests/sorted.ts";
|
|
10
10
|
import { plural } from "#report/plural.ts";
|
|
@@ -62,24 +62,22 @@ function biomePasses(root: string, exceptions: readonly ExceptionDeclaration[]):
|
|
|
62
62
|
];
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
function
|
|
65
|
+
const round = Effect.fn("Cli.round")(function* <TFailure, TRequirements>(
|
|
66
66
|
passes: readonly Pass<TFailure, TRequirements>[],
|
|
67
67
|
index: number,
|
|
68
68
|
afterEachPass: Effect.Effect<void, TFailure, TRequirements>,
|
|
69
|
-
): Effect.
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
});
|
|
82
|
-
}
|
|
69
|
+
): Effect.fn.Return<number, TFailure, TRequirements> {
|
|
70
|
+
let total = 0;
|
|
71
|
+
const parts: string[] = [];
|
|
72
|
+
for (const pass of passes) {
|
|
73
|
+
const changed = yield* pass.run;
|
|
74
|
+
total += changed;
|
|
75
|
+
parts.push(`${plural(changed, "file")} ${pass.label}`);
|
|
76
|
+
yield* afterEachPass;
|
|
77
|
+
}
|
|
78
|
+
yield* Console.log(`quality: Biome round ${index} rewrote ${parts.join(" and ")}.`);
|
|
79
|
+
return total;
|
|
80
|
+
});
|
|
83
81
|
|
|
84
82
|
function changedBetween(before: ReadonlyMap<string, string>, after: ReadonlyMap<string, string>): readonly string[] {
|
|
85
83
|
return [...new Set([...before.keys(), ...after.keys()])].filter((path) => before.get(path) !== after.get(path));
|
|
@@ -100,36 +98,35 @@ function unsettled(changed: ReadonlySet<string>): SetupFailure {
|
|
|
100
98
|
});
|
|
101
99
|
}
|
|
102
100
|
|
|
103
|
-
export function
|
|
101
|
+
export const settle = Effect.fn("Cli.settle")(function* <TFailure, TRequirements>({
|
|
104
102
|
passes,
|
|
105
103
|
snapshot,
|
|
106
|
-
}: Settling<TFailure, TRequirements>): Effect.
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
if ((yield* round(passes, index, Effect.void)) === 0) {
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
const changed = new Set<string>();
|
|
114
|
-
let previous = yield* snapshot;
|
|
115
|
-
const record = Effect.map(snapshot, (current) => {
|
|
116
|
-
for (const path of changedBetween(previous, current)) {
|
|
117
|
-
changed.add(path);
|
|
118
|
-
}
|
|
119
|
-
previous = current;
|
|
120
|
-
});
|
|
121
|
-
if ((yield* round(passes, MAX_FIX_ROUNDS, record)) === 0) {
|
|
104
|
+
}: Settling<TFailure, TRequirements>): Effect.fn.Return<void, TFailure | SetupFailure, TRequirements> {
|
|
105
|
+
for (let index = 1; index < MAX_FIX_ROUNDS; index += 1) {
|
|
106
|
+
if ((yield* round(passes, index, Effect.void)) === 0) {
|
|
122
107
|
return;
|
|
123
108
|
}
|
|
124
|
-
|
|
109
|
+
}
|
|
110
|
+
const changed = new Set<string>();
|
|
111
|
+
let previous = yield* snapshot;
|
|
112
|
+
const record = Effect.map(snapshot, (current) => {
|
|
113
|
+
for (const path of changedBetween(previous, current)) {
|
|
114
|
+
changed.add(path);
|
|
115
|
+
}
|
|
116
|
+
previous = current;
|
|
125
117
|
});
|
|
126
|
-
|
|
118
|
+
if ((yield* round(passes, MAX_FIX_ROUNDS, record)) === 0) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
return yield* unsettled(changed);
|
|
122
|
+
});
|
|
127
123
|
|
|
128
|
-
export
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
});
|
|
135
|
-
}
|
|
124
|
+
export const fix = Effect.fn("Cli.fix")(function* (
|
|
125
|
+
cwd: string,
|
|
126
|
+
config: string | undefined,
|
|
127
|
+
): Effect.fn.Return<void, SetupFailure, FileSystem.FileSystem> {
|
|
128
|
+
const { root, exceptions } = yield* loadConfig(cwd, config);
|
|
129
|
+
const sorted = yield* Effect.mapError(sortManifests(root), (failure) => new SetupFailure({ message: failure.message }));
|
|
130
|
+
yield* Console.log(`quality: sort-package-json rewrote ${plural(sorted, "manifest")}.`);
|
|
131
|
+
yield* settle({ passes: biomePasses(root, exceptions), snapshot: snapshotOf(root) });
|
|
132
|
+
});
|
package/src/cli/lint.ts
CHANGED
|
@@ -3,27 +3,23 @@ import { Console, Effect, type FileSystem } from "effect";
|
|
|
3
3
|
import { evaluate, passes } from "#engine/evaluate.ts";
|
|
4
4
|
import { openSession } from "#engine/session.ts";
|
|
5
5
|
import { GateFailed, type SetupFailure } from "#failure.ts";
|
|
6
|
-
import { render
|
|
6
|
+
import { render } from "#report/render.ts";
|
|
7
7
|
|
|
8
|
-
export const lint = (
|
|
8
|
+
export const lint = Effect.fn("Cli.lint")(function* (
|
|
9
9
|
cwd: string,
|
|
10
10
|
config: string | undefined,
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
if (!passes(outcome)) {
|
|
27
|
-
return yield* new GateFailed();
|
|
28
|
-
}
|
|
29
|
-
});
|
|
11
|
+
): Effect.fn.Return<void, SetupFailure | GateFailed, FileSystem.FileSystem> {
|
|
12
|
+
const session = yield* openSession(cwd, config);
|
|
13
|
+
const outcome = evaluate(session.violations, session.registry, session.baseline.entries, session.config);
|
|
14
|
+
yield* Console.log(
|
|
15
|
+
render(outcome, {
|
|
16
|
+
baseline: session.config.baseline,
|
|
17
|
+
checked: session.inventory.sources.length,
|
|
18
|
+
descriptions: new Map(session.config.active.map((rule) => [rule.id, rule.description])),
|
|
19
|
+
registry: session.config.exceptions.length === 0 ? session.config.registry : `${relative(session.config.root, session.config.file)} exceptions`,
|
|
20
|
+
}),
|
|
21
|
+
);
|
|
22
|
+
if (!passes(outcome)) {
|
|
23
|
+
return yield* new GateFailed();
|
|
24
|
+
}
|
|
25
|
+
});
|
package/src/cli/messages.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export const USAGE = `Usage:
|
|
2
|
-
quality lint [--config <file>]
|
|
2
|
+
quality lint [--config <file>]
|
|
3
3
|
quality fix [--config <file>]
|
|
4
4
|
quality exceptions migrate [--config <file>] [--from <registry>]
|
|
5
5
|
quality baseline write [--config <file>] [--rule <id>]...
|
|
@@ -11,7 +11,7 @@ export const USAGE = `Usage:
|
|
|
11
11
|
quality hooks pre-commit [--config <file>]
|
|
12
12
|
|
|
13
13
|
lint Run every rule. Exits 1 on an error-level violation, a file over its baseline, a stale registry entry
|
|
14
|
-
or a baseline entry for
|
|
14
|
+
or a baseline entry for an unknown rule.
|
|
15
15
|
fix Sort every package.json, apply Biome's lint fixes, unsafe ones included, its assist actions and formatting, then format again.
|
|
16
16
|
exceptions migrate Move legacy registry entries and Biome declarations into quality.config.ts exceptions and remove matching root overrides.
|
|
17
17
|
baseline write Record current error-level violations. Creates the baseline, or records the named rules again, replacing their entries.
|
package/src/cli/migrate.ts
CHANGED
|
@@ -4,33 +4,32 @@ import { encodeBaseline } from "#baseline/format.ts";
|
|
|
4
4
|
import { convertLegacy, decodeLegacyBaseline, LEGACY_BASELINE } from "#baseline/legacy.ts";
|
|
5
5
|
import { loadConfig } from "#config/load.ts";
|
|
6
6
|
import { validOrFail } from "#decoded.ts";
|
|
7
|
-
import { readInput } from "#engine/
|
|
7
|
+
import { readInput } from "#engine/baselineFile.ts";
|
|
8
8
|
import { scan } from "#engine/session.ts";
|
|
9
9
|
import { SetupFailure } from "#failure.ts";
|
|
10
10
|
import { writeText } from "#inventory/filesystem.ts";
|
|
11
11
|
import { plural } from "#report/plural.ts";
|
|
12
12
|
|
|
13
|
-
export const migrateBaseline = (
|
|
13
|
+
export const migrateBaseline = Effect.fn("Cli.migrateBaseline")(function* (
|
|
14
14
|
cwd: string,
|
|
15
15
|
configPath: string | undefined,
|
|
16
16
|
from: string | undefined,
|
|
17
|
-
): Effect.
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
});
|
|
17
|
+
): Effect.fn.Return<void, SetupFailure, FileSystem.FileSystem> {
|
|
18
|
+
const config = yield* loadConfig(cwd, configPath);
|
|
19
|
+
const source = from ?? LEGACY_BASELINE;
|
|
20
|
+
if (source === config.baseline || (yield* readInput(config.root, config.baseline)) !== undefined) {
|
|
21
|
+
return yield* new SetupFailure({ message: `${config.baseline} already exists. Migrate into a baseline file that does not exist yet.` });
|
|
22
|
+
}
|
|
23
|
+
const raw = yield* readInput(config.root, source);
|
|
24
|
+
if (raw === undefined) {
|
|
25
|
+
return yield* new SetupFailure({ message: `no baseline at ${source} to migrate. Name it with --from <file>.` });
|
|
26
|
+
}
|
|
27
|
+
const legacy = yield* validOrFail(source, yield* Effect.promise(() => decodeLegacyBaseline(raw)));
|
|
28
|
+
const entries = convertLegacy(legacy, (yield* scan(config)).violations);
|
|
29
|
+
const fs = yield* FileSystem.FileSystem;
|
|
30
|
+
const written = Effect.andThen(writeText(join(config.root, config.baseline), encodeBaseline(entries)), fs.remove(join(config.root, source)));
|
|
31
|
+
yield* Effect.mapError(written, (failure) => new SetupFailure({ message: failure.message }));
|
|
32
|
+
const fixed = legacy.length - entries.length;
|
|
33
|
+
const dropped = fixed > 0 ? `, dropping ${plural(fixed, "fixed entry", "fixed entries")}` : "";
|
|
34
|
+
yield* Console.log(`quality: moved ${plural(entries.length, "entry", "entries")} from ${source} to ${config.baseline}${dropped}.`);
|
|
35
|
+
});
|
|
@@ -2,7 +2,7 @@ import { join } from "node:path";
|
|
|
2
2
|
import { Console, Effect, FileSystem } from "effect";
|
|
3
3
|
import { loadConfig } from "#config/load.ts";
|
|
4
4
|
import { validOrFail } from "#decoded.ts";
|
|
5
|
-
import { readInput } from "#engine/
|
|
5
|
+
import { readInput } from "#engine/baselineFile.ts";
|
|
6
6
|
import { decodeExceptions, type ExceptionDeclaration } from "#exceptions/declaration.ts";
|
|
7
7
|
import { migrateBiome } from "#exceptions/migrateBiome.ts";
|
|
8
8
|
import { migrateConfig } from "#exceptions/migrateConfig.ts";
|
package/src/cli/program.ts
CHANGED
|
@@ -27,7 +27,7 @@ export const program = Effect.fn("Cli.program")(function* (args: readonly string
|
|
|
27
27
|
case "Help":
|
|
28
28
|
return yield* Console.log(USAGE);
|
|
29
29
|
case "Lint":
|
|
30
|
-
return yield* lint(cwd, command.config
|
|
30
|
+
return yield* lint(cwd, command.config);
|
|
31
31
|
case "Fix":
|
|
32
32
|
return yield* fix(cwd, command.config);
|
|
33
33
|
case "BaselineWrite":
|
|
@@ -30,9 +30,9 @@ export function exitCode(exit: Exit.Exit<unknown, unknown>): number {
|
|
|
30
30
|
return Cause.hasInterruptsOnly(exit.cause) ? INTERRUPTED : exitCodeOf(Cause.squash(exit.cause));
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
function teardown(exit: Parameters<Runtime.Teardown>[0], onExit: Parameters<Runtime.Teardown>[1]): void {
|
|
34
34
|
process.stdout.write("", () => process.stderr.write("", () => onExit(exitCode(exit))));
|
|
35
|
-
}
|
|
35
|
+
}
|
|
36
36
|
|
|
37
37
|
function isClosedPipe(error: unknown): boolean {
|
|
38
38
|
return error instanceof Error && "code" in error && error.code === "EPIPE";
|
package/src/cli/shrink.ts
CHANGED
|
@@ -6,8 +6,8 @@ import type { Git } from "#git/command.ts";
|
|
|
6
6
|
import { changesSince } from "#git/history.ts";
|
|
7
7
|
import { shrinkBaseline } from "./baseline.ts";
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
resolveBase(root, against).pipe(
|
|
9
|
+
function followedMoves(root: string, against: string | undefined): Effect.Effect<Scope, SetupFailure, Git> {
|
|
10
|
+
return resolveBase(root, against).pipe(
|
|
11
11
|
Effect.flatMap((base) => changesSince(root, [base.commit])),
|
|
12
12
|
Effect.map((changes): Scope => ({ moves: changes.moves })),
|
|
13
13
|
Effect.catchIf(
|
|
@@ -15,17 +15,20 @@ const followedMoves = (root: string, against: string | undefined): Effect.Effect
|
|
|
15
15
|
(failure) => Effect.as(Console.error(`quality: moved files are not followed: ${failure.message}`), { moves: new Map() }),
|
|
16
16
|
),
|
|
17
17
|
);
|
|
18
|
+
}
|
|
18
19
|
|
|
19
|
-
export
|
|
20
|
+
export function pruneBaseline(
|
|
20
21
|
cwd: string,
|
|
21
22
|
config: string | undefined,
|
|
22
23
|
against: string | undefined,
|
|
23
|
-
): Effect.Effect<void, SetupFailure, FileSystem.FileSystem | Git>
|
|
24
|
-
shrinkBaseline(cwd, config, (session) => followedMoves(session.config.root, against));
|
|
24
|
+
): Effect.Effect<void, SetupFailure, FileSystem.FileSystem | Git> {
|
|
25
|
+
return shrinkBaseline(cwd, config, (session) => followedMoves(session.config.root, against));
|
|
26
|
+
}
|
|
25
27
|
|
|
26
|
-
export
|
|
28
|
+
export function tightenBaseline(
|
|
27
29
|
cwd: string,
|
|
28
30
|
config: string | undefined,
|
|
29
31
|
staged: boolean,
|
|
30
|
-
): Effect.Effect<void, SetupFailure, FileSystem.FileSystem | Git>
|
|
31
|
-
shrinkBaseline(cwd, config, (session) => changesSince(session.config.root, staged ? ["--cached"] : ["HEAD"]));
|
|
32
|
+
): Effect.Effect<void, SetupFailure, FileSystem.FileSystem | Git> {
|
|
33
|
+
return shrinkBaseline(cwd, config, (session) => changesSince(session.config.root, staged ? ["--cached"] : ["HEAD"]));
|
|
34
|
+
}
|
package/src/cli.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import process from "node:process";
|
|
3
3
|
import { program } from "#cli/program.ts";
|
|
4
|
-
import { runMain } from "#cli/
|
|
4
|
+
import { runMain } from "#cli/runMain.ts";
|
|
5
5
|
|
|
6
6
|
runMain(program(process.argv.slice(2), { cwd: process.cwd(), launch: { options: process.execArgv, script: process.argv[1] ?? "" } }));
|