@shivaedev/quality 0.0.0 → 0.1.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.
Files changed (159) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/LICENSE +21 -0
  3. package/README.md +127 -1
  4. package/dist/baseline/compare.d.ts +26 -0
  5. package/dist/baseline/compare.d.ts.map +1 -0
  6. package/dist/baseline/compare.js +42 -0
  7. package/dist/baseline/compare.js.map +1 -0
  8. package/dist/baseline/format.d.ts +13 -0
  9. package/dist/baseline/format.d.ts.map +1 -0
  10. package/dist/baseline/format.js +32 -0
  11. package/dist/baseline/format.js.map +1 -0
  12. package/dist/baseline/update.d.ts +24 -0
  13. package/dist/baseline/update.d.ts.map +1 -0
  14. package/dist/baseline/update.js +60 -0
  15. package/dist/baseline/update.js.map +1 -0
  16. package/dist/cli/args.d.ts +25 -0
  17. package/dist/cli/args.d.ts.map +1 -0
  18. package/dist/cli/args.js +64 -0
  19. package/dist/cli/args.js.map +1 -0
  20. package/dist/cli/baseline.d.ts +5 -0
  21. package/dist/cli/baseline.d.ts.map +1 -0
  22. package/dist/cli/baseline.js +37 -0
  23. package/dist/cli/baseline.js.map +1 -0
  24. package/dist/cli/lint.d.ts +5 -0
  25. package/dist/cli/lint.d.ts.map +1 -0
  26. package/dist/cli/lint.js +20 -0
  27. package/dist/cli/lint.js.map +1 -0
  28. package/dist/cli/run-main.d.ts +3 -0
  29. package/dist/cli/run-main.d.ts.map +1 -0
  30. package/dist/cli/run-main.js +24 -0
  31. package/dist/cli/run-main.js.map +1 -0
  32. package/dist/cli.d.ts +3 -0
  33. package/dist/cli.d.ts.map +1 -0
  34. package/dist/cli.js +27 -0
  35. package/dist/cli.js.map +1 -0
  36. package/dist/config/decode.d.ts +19 -0
  37. package/dist/config/decode.d.ts.map +1 -0
  38. package/dist/config/decode.js +25 -0
  39. package/dist/config/decode.js.map +1 -0
  40. package/dist/config/load.d.ts +13 -0
  41. package/dist/config/load.d.ts.map +1 -0
  42. package/dist/config/load.js +47 -0
  43. package/dist/config/load.js.map +1 -0
  44. package/dist/config/resolve.d.ts +11 -0
  45. package/dist/config/resolve.d.ts.map +1 -0
  46. package/dist/config/resolve.js +31 -0
  47. package/dist/config/resolve.js.map +1 -0
  48. package/dist/config.d.ts +31 -0
  49. package/dist/config.d.ts.map +1 -0
  50. package/dist/config.js +2 -0
  51. package/dist/config.js.map +1 -0
  52. package/dist/decoded.d.ts +13 -0
  53. package/dist/decoded.d.ts.map +1 -0
  54. package/dist/decoded.js +11 -0
  55. package/dist/decoded.js.map +1 -0
  56. package/dist/engine/evaluate.d.ts +18 -0
  57. package/dist/engine/evaluate.d.ts.map +1 -0
  58. package/dist/engine/evaluate.js +20 -0
  59. package/dist/engine/evaluate.js.map +1 -0
  60. package/dist/engine/run-rules.d.ts +12 -0
  61. package/dist/engine/run-rules.d.ts.map +1 -0
  62. package/dist/engine/run-rules.js +19 -0
  63. package/dist/engine/run-rules.js.map +1 -0
  64. package/dist/engine/session.d.ts +19 -0
  65. package/dist/engine/session.d.ts.map +1 -0
  66. package/dist/engine/session.js +25 -0
  67. package/dist/engine/session.js.map +1 -0
  68. package/dist/engine/violation.d.ts +12 -0
  69. package/dist/engine/violation.d.ts.map +1 -0
  70. package/dist/engine/violation.js +23 -0
  71. package/dist/engine/violation.js.map +1 -0
  72. package/dist/exceptions/registry.d.ts +24 -0
  73. package/dist/exceptions/registry.d.ts.map +1 -0
  74. package/dist/exceptions/registry.js +33 -0
  75. package/dist/exceptions/registry.js.map +1 -0
  76. package/dist/failure.d.ts +21 -0
  77. package/dist/failure.d.ts.map +1 -0
  78. package/dist/failure.js +12 -0
  79. package/dist/failure.js.map +1 -0
  80. package/dist/index.d.ts +6 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +3 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/inventory/collect.d.ts +15 -0
  85. package/dist/inventory/collect.d.ts.map +1 -0
  86. package/dist/inventory/collect.js +34 -0
  87. package/dist/inventory/collect.js.map +1 -0
  88. package/dist/inventory/filesystem.d.ts +16 -0
  89. package/dist/inventory/filesystem.d.ts.map +1 -0
  90. package/dist/inventory/filesystem.js +26 -0
  91. package/dist/inventory/filesystem.js.map +1 -0
  92. package/dist/inventory/ignore-scope.d.ts +17 -0
  93. package/dist/inventory/ignore-scope.d.ts.map +1 -0
  94. package/dist/inventory/ignore-scope.js +26 -0
  95. package/dist/inventory/ignore-scope.js.map +1 -0
  96. package/dist/inventory/walk.d.ts +8 -0
  97. package/dist/inventory/walk.d.ts.map +1 -0
  98. package/dist/inventory/walk.js +38 -0
  99. package/dist/inventory/walk.js.map +1 -0
  100. package/dist/report/plural.d.ts +2 -0
  101. package/dist/report/plural.d.ts.map +1 -0
  102. package/dist/report/plural.js +2 -0
  103. package/dist/report/plural.js.map +1 -0
  104. package/dist/report/render.d.ts +11 -0
  105. package/dist/report/render.d.ts.map +1 -0
  106. package/dist/report/render.js +55 -0
  107. package/dist/report/render.js.map +1 -0
  108. package/dist/report/stale.d.ts +8 -0
  109. package/dist/report/stale.d.ts.map +1 -0
  110. package/dist/report/stale.js +9 -0
  111. package/dist/report/stale.js.map +1 -0
  112. package/dist/rule.d.ts +56 -0
  113. package/dist/rule.d.ts.map +1 -0
  114. package/dist/rule.js +23 -0
  115. package/dist/rule.js.map +1 -0
  116. package/dist/rules/built-in.d.ts +6 -0
  117. package/dist/rules/built-in.d.ts.map +1 -0
  118. package/dist/rules/built-in.js +3 -0
  119. package/dist/rules/built-in.js.map +1 -0
  120. package/dist/rules/max-lines.d.ts +6 -0
  121. package/dist/rules/max-lines.d.ts.map +1 -0
  122. package/dist/rules/max-lines.js +26 -0
  123. package/dist/rules/max-lines.js.map +1 -0
  124. package/dist/standard-schema.d.ts +25 -0
  125. package/dist/standard-schema.d.ts.map +1 -0
  126. package/dist/standard-schema.js +3 -0
  127. package/dist/standard-schema.js.map +1 -0
  128. package/package.json +53 -4
  129. package/src/baseline/compare.ts +81 -0
  130. package/src/baseline/format.ts +53 -0
  131. package/src/baseline/update.ts +83 -0
  132. package/src/cli/args.ts +81 -0
  133. package/src/cli/baseline.ts +52 -0
  134. package/src/cli/lint.ts +27 -0
  135. package/src/cli/run-main.ts +29 -0
  136. package/src/cli.ts +29 -0
  137. package/src/config/decode.ts +35 -0
  138. package/src/config/load.ts +58 -0
  139. package/src/config/resolve.ts +60 -0
  140. package/src/config.ts +33 -0
  141. package/src/decoded.ts +15 -0
  142. package/src/engine/evaluate.ts +39 -0
  143. package/src/engine/run-rules.ts +40 -0
  144. package/src/engine/session.ts +40 -0
  145. package/src/engine/violation.ts +35 -0
  146. package/src/exceptions/registry.ts +58 -0
  147. package/src/failure.ts +13 -0
  148. package/src/index.ts +5 -0
  149. package/src/inventory/collect.ts +53 -0
  150. package/src/inventory/filesystem.ts +47 -0
  151. package/src/inventory/ignore-scope.ts +44 -0
  152. package/src/inventory/walk.ts +58 -0
  153. package/src/report/plural.ts +1 -0
  154. package/src/report/render.ts +85 -0
  155. package/src/report/stale.ts +30 -0
  156. package/src/rule.ts +90 -0
  157. package/src/rules/built-in.ts +3 -0
  158. package/src/rules/max-lines.ts +31 -0
  159. package/src/standard-schema.ts +22 -0
@@ -0,0 +1,33 @@
1
+ import { Schema } from "effect";
2
+ import { decodeWith } from "../decoded.js";
3
+ import { unusedEntryProblem } from "../engine/violation.js";
4
+ const RegistryEntry = Schema.Struct({
5
+ rule: Schema.NonEmptyString,
6
+ file: Schema.NonEmptyString,
7
+ subject: Schema.optionalKey(Schema.NonEmptyString),
8
+ reason: Schema.String.check(Schema.isPattern(/\S/, { expected: "a reason that says why the exception is permanent" })),
9
+ });
10
+ const standard = Schema.toStandardSchemaV1(Schema.fromJsonString(Schema.Array(RegistryEntry)), {
11
+ parseOptions: { errors: "all", onExcessProperty: "error" },
12
+ });
13
+ export const decodeRegistry = (raw) => raw === undefined ? Promise.resolve({ _tag: "Valid", value: [] }) : decodeWith(standard, raw);
14
+ const covers = (entry, violation) => entry.rule === violation.rule && entry.file === violation.file && (entry.subject === undefined || entry.subject === violation.subject);
15
+ const coveringEntry = (entries, violation) => {
16
+ const matching = entries.filter((entry) => covers(entry, violation));
17
+ return matching.find((entry) => entry.subject !== undefined) ?? matching[0];
18
+ };
19
+ export const applyRegistry = (violations, entries, levels) => {
20
+ const used = new Set();
21
+ const kept = violations.filter((violation) => {
22
+ const entry = coveringEntry(entries, violation);
23
+ if (entry !== undefined) {
24
+ used.add(entry);
25
+ }
26
+ return entry === undefined;
27
+ });
28
+ const stale = entries
29
+ .filter((entry) => !used.has(entry))
30
+ .map((entry) => ({ entry, problem: unusedEntryProblem(levels, entry.rule, "matches no violation") }));
31
+ return { kept, registered: violations.length - kept.length, stale };
32
+ };
33
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/exceptions/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Runtime } from "effect";
2
+ declare const SetupFailure_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
3
+ readonly _tag: "SetupFailure";
4
+ } & Readonly<A>;
5
+ /** The check could not run: invalid configuration, unreadable input or a crashed rule. Exits 2. */
6
+ export declare class SetupFailure extends SetupFailure_base<{
7
+ readonly message: string;
8
+ }> {
9
+ readonly [Runtime.errorReported] = false;
10
+ readonly [Runtime.errorExitCode] = 2;
11
+ }
12
+ declare const GateFailed_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
13
+ readonly _tag: "GateFailed";
14
+ } & Readonly<A>;
15
+ /** The check ran and the repository fails the gate. The report is already printed. Exits 1. */
16
+ export declare class GateFailed extends GateFailed_base {
17
+ readonly [Runtime.errorReported] = false;
18
+ readonly [Runtime.errorExitCode] = 1;
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=failure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure.d.ts","sourceRoot":"","sources":["../src/failure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,OAAO,EAAE,MAAM,QAAQ,CAAC;;;;AAEvC,mGAAmG;AACnG,qBAAa,YAAa,SAAQ,kBAAiC;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;IAC/F,SAAkB,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS;IAClD,SAAkB,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK;CAC9C;;;;AAED,+FAA+F;AAC/F,qBAAa,UAAW,SAAQ,eAA8B;IAC7D,SAAkB,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS;IAClD,SAAkB,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK;CAC9C"}
@@ -0,0 +1,12 @@
1
+ import { Data, Runtime } from "effect";
2
+ /** The check could not run: invalid configuration, unreadable input or a crashed rule. Exits 2. */
3
+ export class SetupFailure extends Data.TaggedError("SetupFailure") {
4
+ [Runtime.errorReported] = false;
5
+ [Runtime.errorExitCode] = 2;
6
+ }
7
+ /** The check ran and the repository fails the gate. The report is already printed. Exits 1. */
8
+ export class GateFailed extends Data.TaggedError("GateFailed") {
9
+ [Runtime.errorReported] = false;
10
+ [Runtime.errorExitCode] = 1;
11
+ }
12
+ //# sourceMappingURL=failure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure.js","sourceRoot":"","sources":["../src/failure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEvC,mGAAmG;AACnG,MAAM,OAAO,YAAa,SAAQ,IAAI,CAAC,WAAW,CAAC,cAAc,CAA+B;IAC7E,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC;IAChC,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;CAC9C;AAED,+FAA+F;AAC/F,MAAM,OAAO,UAAW,SAAQ,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;IAC3C,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC;IAChC,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;CAC9C"}
@@ -0,0 +1,6 @@
1
+ export type { BuiltInRules, Level, QualityConfig, RuleSetting, RuleSettings } from "./config.ts";
2
+ export { defineConfig } from "./config.ts";
3
+ export type { Configured, Finding, Findings, Rule, RuleContext, RuleInputs, SourceFile } from "./rule.ts";
4
+ export { defineRule } from "./rule.ts";
5
+ export type { StandardIssue, StandardResult, StandardSchemaV1 } from "./standard-schema.ts";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC1G,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { defineConfig } from "./config.js";
2
+ export { defineRule } from "./rule.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { Effect, FileSystem } from "effect";
2
+ import type { SourceFile } from "../rule.ts";
3
+ import { FilesystemFailure } from "./filesystem.ts";
4
+ export interface InventoryScope {
5
+ readonly sources: ReadonlyArray<string>;
6
+ readonly exclude: ReadonlyArray<string>;
7
+ readonly extensions: ReadonlyArray<string>;
8
+ }
9
+ export interface Inventory {
10
+ readonly files: ReadonlyArray<string>;
11
+ readonly sources: ReadonlyArray<SourceFile>;
12
+ }
13
+ export declare const linesOf: (text: string) => ReadonlyArray<string>;
14
+ export declare const collectInventory: (root: string, scope: InventoryScope) => Effect.Effect<Inventory, FilesystemFailure, FileSystem.FileSystem>;
15
+ //# sourceMappingURL=collect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect.d.ts","sourceRoot":"","sources":["../../src/inventory/collect.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAkC,MAAM,iBAAiB,CAAC;AAIpF,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CAC5C;AAID,eAAO,MAAM,OAAO,GAAI,MAAM,MAAM,KAAG,aAAa,CAAC,MAAM,CAG1D,CAAC;AAmBF,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,EAAE,OAAO,cAAc,KAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,iBAAiB,EAAE,UAAU,CAAC,UAAU,CASrI,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { join, relative } from "node:path";
2
+ import { Effect, FileSystem } from "effect";
3
+ import ignore from "ignore";
4
+ import { FilesystemFailure, orWhenAbsent, readRequiredText } from "./filesystem.js";
5
+ import { posix } from "./ignore-scope.js";
6
+ import { scopeAbove, walk } from "./walk.js";
7
+ const READ_CONCURRENCY = 16;
8
+ export const linesOf = (text) => {
9
+ const lines = text.split("\n");
10
+ return lines.at(-1) === "" ? lines.slice(0, -1) : lines;
11
+ };
12
+ const zoneFiles = (root, zone) => Effect.gen(function* () {
13
+ const fs = yield* FileSystem.FileSystem;
14
+ const path = join(root, zone);
15
+ if (posix(relative(root, path)).startsWith("..")) {
16
+ return yield* new FilesystemFailure({ message: `source "${zone}" lies outside the repository at ${root}`, path });
17
+ }
18
+ const info = yield* orWhenAbsent(path, fs.stat(path), undefined);
19
+ if (info === undefined) {
20
+ return yield* new FilesystemFailure({ message: `source "${zone}" does not exist in ${root}`, path });
21
+ }
22
+ return info.type === "Directory" ? yield* walk(path, yield* scopeAbove(root, path)) : [path];
23
+ });
24
+ const readSource = (root, path) => Effect.map(readRequiredText(join(root, path)), (text) => ({ lines: linesOf(text), path, text }));
25
+ export const collectInventory = (root, scope) => Effect.gen(function* () {
26
+ const excluded = ignore().add([...scope.exclude]);
27
+ const zones = yield* Effect.forEach(scope.sources, (zone) => zoneFiles(root, zone), { concurrency: READ_CONCURRENCY });
28
+ const relativePaths = zones.flat().map((absolute) => posix(relative(root, absolute)));
29
+ const files = [...new Set(relativePaths)].filter((path) => !excluded.ignores(path)).sort();
30
+ const sourcePaths = files.filter((path) => scope.extensions.some((extension) => path.endsWith(extension)));
31
+ const sources = yield* Effect.forEach(sourcePaths, (path) => readSource(root, path), { concurrency: READ_CONCURRENCY });
32
+ return { files, sources };
33
+ });
34
+ //# sourceMappingURL=collect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect.js","sourceRoot":"","sources":["../../src/inventory/collect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { Effect, FileSystem } from "effect";
2
+ import type { PlatformError } from "effect/PlatformError";
3
+ declare const FilesystemFailure_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
4
+ readonly _tag: "FilesystemFailure";
5
+ } & Readonly<A>;
6
+ export declare class FilesystemFailure extends FilesystemFailure_base<{
7
+ readonly message: string;
8
+ readonly path: string;
9
+ }> {
10
+ }
11
+ export declare const orWhenAbsent: <Value>(path: string, action: Effect.Effect<Value, PlatformError, FileSystem.FileSystem>, whenAbsent: Value) => Effect.Effect<Value, FilesystemFailure, FileSystem.FileSystem>;
12
+ export declare const readOptionalText: (path: string) => Effect.Effect<string | undefined, FilesystemFailure, FileSystem.FileSystem>;
13
+ export declare const readRequiredText: (path: string) => Effect.Effect<string, FilesystemFailure, FileSystem.FileSystem>;
14
+ export declare const writeText: (path: string, text: string) => Effect.Effect<void, FilesystemFailure, FileSystem.FileSystem>;
15
+ export {};
16
+ //# sourceMappingURL=filesystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/inventory/filesystem.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;;;;AAI1D,qBAAa,iBAAkB,SAAQ,uBAAsC;IAC5E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB,CAAC;CAAG;AAWL,eAAO,MAAM,YAAY,GAAI,KAAK,EACjC,MAAM,MAAM,EACZ,QAAQ,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,CAAC,UAAU,CAAC,EAClE,YAAY,KAAK,KACf,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,iBAAiB,EAAE,UAAU,CAAC,UAAU,CACmF,CAAC;AAEpJ,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,iBAAiB,EAAE,UAAU,CAAC,UAAU,CAIvH,CAAC;AAEJ,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,UAAU,CAAC,UAAU,CAM3G,CAAC;AAEJ,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,EAAE,MAAM,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,EAAE,UAAU,CAAC,UAAU,CAKhH,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { dirname } from "node:path";
2
+ import { Data, Effect, FileSystem } from "effect";
3
+ const ABSENT = new Set(["ENOENT", "ENOTDIR"]);
4
+ export class FilesystemFailure extends Data.TaggedError("FilesystemFailure") {
5
+ }
6
+ // Effect maps ENOTDIR and EISDIR to BadResource; the original errno remains on the cause.
7
+ const errnoOf = (error) => {
8
+ const cause = error.reason.cause;
9
+ return typeof cause === "object" && cause !== null && "code" in cause && typeof cause.code === "string" ? cause.code : "";
10
+ };
11
+ const failure = (path, error) => new FilesystemFailure({ message: `cannot read ${path}: ${error.message}`, path });
12
+ export const orWhenAbsent = (path, action, whenAbsent) => Effect.catchTag(action, "PlatformError", (error) => (ABSENT.has(errnoOf(error)) ? Effect.succeed(whenAbsent) : Effect.fail(failure(path, error))));
13
+ export const readOptionalText = (path) => Effect.gen(function* () {
14
+ const fs = yield* FileSystem.FileSystem;
15
+ return yield* orWhenAbsent(path, fs.readFileString(path), undefined);
16
+ });
17
+ export const readRequiredText = (path) => Effect.gen(function* () {
18
+ const fs = yield* FileSystem.FileSystem;
19
+ return yield* Effect.mapError(fs.readFileString(path), (error) => ABSENT.has(errnoOf(error)) ? new FilesystemFailure({ message: `required input is missing: ${path}`, path }) : failure(path, error));
20
+ });
21
+ export const writeText = (path, text) => Effect.gen(function* () {
22
+ const fs = yield* FileSystem.FileSystem;
23
+ const written = Effect.andThen(fs.makeDirectory(dirname(path), { recursive: true }), fs.writeFileString(path, text));
24
+ return yield* Effect.mapError(written, (error) => new FilesystemFailure({ message: `cannot write ${path}: ${error.message}`, path }));
25
+ });
26
+ //# sourceMappingURL=filesystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/inventory/filesystem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import ignore from "ignore";
2
+ export type Verdict = "ignored" | "kept" | "unknown";
3
+ interface IgnoreMatcher {
4
+ readonly base: string;
5
+ readonly rules: ReturnType<typeof ignore>;
6
+ }
7
+ export interface IgnoreScope {
8
+ readonly boundary: string | undefined;
9
+ readonly matchers: readonly IgnoreMatcher[];
10
+ }
11
+ export declare const emptyScope: IgnoreScope;
12
+ export declare const posix: (path: string) => string;
13
+ export declare const withIgnoreFile: (scope: IgnoreScope, base: string, contents: string) => IgnoreScope;
14
+ export declare const insideKept: (scope: IgnoreScope, directory: string) => IgnoreScope;
15
+ export declare const verdictFor: (scope: IgnoreScope, path: string, directory: boolean) => Verdict;
16
+ export {};
17
+ //# sourceMappingURL=ignore-scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ignore-scope.d.ts","sourceRoot":"","sources":["../../src/inventory/ignore-scope.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAErD,UAAU,aAAa;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CAC5C;AAED,eAAO,MAAM,UAAU,EAAE,WAAmD,CAAC;AAE7E,eAAO,MAAM,KAAK,GAAI,MAAM,MAAM,KAAG,MAAoC,CAAC;AAE1E,eAAO,MAAM,cAAc,GAAI,OAAO,WAAW,EAAE,MAAM,MAAM,EAAE,UAAU,MAAM,KAAG,WAGlF,CAAC;AAGH,eAAO,MAAM,UAAU,GAAI,OAAO,WAAW,EAAE,WAAW,MAAM,KAAG,WAAkE,CAAC;AAiBtI,eAAO,MAAM,UAAU,GAAI,OAAO,WAAW,EAAE,MAAM,MAAM,EAAE,WAAW,OAAO,KAAG,OACkE,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { relative } from "node:path";
2
+ import ignore from "ignore";
3
+ export const emptyScope = { boundary: undefined, matchers: [] };
4
+ export const posix = (path) => path.replaceAll("\\", "/");
5
+ export const withIgnoreFile = (scope, base, contents) => ({
6
+ boundary: scope.boundary,
7
+ matchers: [...scope.matchers, { base, rules: ignore().add(contents) }],
8
+ });
9
+ // Re-including a directory resets directory rules below that boundary; filename rules still apply.
10
+ export const insideKept = (scope, directory) => ({ boundary: directory, matchers: scope.matchers });
11
+ const matcherVerdict = (matcher, boundary, path, directory) => {
12
+ const anchor = boundary !== undefined && boundary.length > matcher.base.length ? boundary : matcher.base;
13
+ const rel = posix(relative(anchor, path));
14
+ if (rel === "" || rel.startsWith("..")) {
15
+ return "unknown";
16
+ }
17
+ // Directory-only patterns match paths with a trailing slash.
18
+ const result = matcher.rules.test(directory ? `${rel}/` : rel);
19
+ if (result.ignored) {
20
+ return "ignored";
21
+ }
22
+ return result.unignored ? "kept" : "unknown";
23
+ };
24
+ // The deepest ignore file with an opinion wins.
25
+ export const verdictFor = (scope, path, directory) => scope.matchers.map((matcher) => matcherVerdict(matcher, scope.boundary, path, directory)).findLast((verdict) => verdict !== "unknown") ?? "unknown";
26
+ //# sourceMappingURL=ignore-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ignore-scope.js","sourceRoot":"","sources":["../../src/inventory/ignore-scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAc5B,MAAM,CAAC,MAAM,UAAU,GAAgB,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAE7E,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAE1E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAkB,EAAE,IAAY,EAAE,QAAgB,EAAe,EAAE,CAAC,CAAC;IACnG,QAAQ,EAAE,KAAK,CAAC,QAAQ;IACxB,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;CACtE,CAAC,CAAC;AAEH,mGAAmG;AACnG,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAkB,EAAE,SAAiB,EAAe,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;AAEtI,MAAM,cAAc,GAAG,CAAC,OAAsB,EAAE,QAA4B,EAAE,IAAY,EAAE,SAAkB,EAAW,EAAE;IAC1H,MAAM,MAAM,GAAG,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACzG,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAC1C,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,6DAA6D;IAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9C,CAAC,CAAC;AAEF,gDAAgD;AAChD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAkB,EAAE,IAAY,EAAE,SAAkB,EAAW,EAAE,CAC3F,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,SAAS,CAAC,IAAI,SAAS,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Effect, FileSystem } from "effect";
2
+ import { type FilesystemFailure } from "./filesystem.ts";
3
+ import { type IgnoreScope } from "./ignore-scope.ts";
4
+ export declare const ignoreScopeAt: (dir: string, inherited?: IgnoreScope) => Effect.Effect<IgnoreScope, FilesystemFailure, FileSystem.FileSystem>;
5
+ /** The ignore files of every directory between the root and a walked directory, which the walk itself does not visit. */
6
+ export declare const scopeAbove: (root: string, dir: string) => Effect.Effect<IgnoreScope, FilesystemFailure, FileSystem.FileSystem>;
7
+ export declare const walk: (dir: string, inherited?: IgnoreScope) => Effect.Effect<readonly string[], FilesystemFailure, FileSystem.FileSystem>;
8
+ //# sourceMappingURL=walk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk.d.ts","sourceRoot":"","sources":["../../src/inventory/walk.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,KAAK,iBAAiB,EAAkC,MAAM,iBAAiB,CAAC;AACzF,OAAO,EAAc,KAAK,WAAW,EAA0C,MAAM,mBAAmB,CAAC;AAIzG,eAAO,MAAM,aAAa,GACzB,KAAK,MAAM,EACX,YAAW,WAAwB,KACjC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,iBAAiB,EAAE,UAAU,CAAC,UAAU,CAGpE,CAAC;AAEH,yHAAyH;AACzH,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,KAAK,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,iBAAiB,EAAE,UAAU,CAAC,UAAU,CAUzH,CAAC;AAEF,eAAO,MAAM,IAAI,GAAI,KAAK,MAAM,EAAE,YAAW,WAAwB,KAAG,MAAM,CAAC,MAAM,CAAC,SAAS,MAAM,EAAE,EAAE,iBAAiB,EAAE,UAAU,CAAC,UAAU,CAW9I,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { join, relative, sep } from "node:path";
2
+ import { Effect, FileSystem } from "effect";
3
+ import { orWhenAbsent, readOptionalText } from "./filesystem.js";
4
+ import { emptyScope, insideKept, verdictFor, withIgnoreFile } from "./ignore-scope.js";
5
+ const SKIPPED = new Set([".git", "node_modules"]);
6
+ export const ignoreScopeAt = (dir, inherited = emptyScope) => Effect.map(readOptionalText(join(dir, ".gitignore")), (contents) => contents === undefined || contents === "" ? inherited : withIgnoreFile(inherited, dir, contents));
7
+ /** The ignore files of every directory between the root and a walked directory, which the walk itself does not visit. */
8
+ export const scopeAbove = (root, dir) => {
9
+ const parts = relative(root, dir)
10
+ .split(sep)
11
+ .filter((part) => part !== "");
12
+ const ancestors = parts.length === 0 ? [] : [root, ...parts.slice(0, -1).map((_, index) => join(root, ...parts.slice(0, index + 1)))];
13
+ return Effect.reduce(ancestors, () => emptyScope, (scope, ancestor) => ignoreScopeAt(ancestor, scope));
14
+ };
15
+ export const walk = (dir, inherited = emptyScope) => Effect.gen(function* () {
16
+ const fs = yield* FileSystem.FileSystem;
17
+ const scope = yield* ignoreScopeAt(dir, inherited);
18
+ const entries = yield* orWhenAbsent(dir, fs.readDirectory(dir), []);
19
+ const nested = yield* Effect.forEach(entries.filter((entry) => !SKIPPED.has(entry)), (entry) => walkEntry(join(dir, entry), scope), { concurrency: 1 });
20
+ return nested.flat();
21
+ });
22
+ const walkEntry = (path, scope) => Effect.gen(function* () {
23
+ const fs = yield* FileSystem.FileSystem;
24
+ const info = yield* orWhenAbsent(path, fs.stat(path), undefined);
25
+ if (info === undefined) {
26
+ return [];
27
+ }
28
+ const directory = info.type === "Directory";
29
+ const verdict = verdictFor(scope, path, directory);
30
+ if (verdict === "ignored") {
31
+ return [];
32
+ }
33
+ if (!directory) {
34
+ return [path];
35
+ }
36
+ return yield* walk(path, verdict === "kept" ? insideKept(scope, path) : scope);
37
+ });
38
+ //# sourceMappingURL=walk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk.js","sourceRoot":"","sources":["../../src/inventory/walk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const plural: (count: number, singular: string, many?: string) => string;
2
+ //# sourceMappingURL=plural.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plural.d.ts","sourceRoot":"","sources":["../../src/report/plural.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM,GAAI,OAAO,MAAM,EAAE,UAAU,MAAM,EAAE,aAAqB,KAAG,MAAqD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const plural = (count, singular, many = `${singular}s`) => `${count} ${count === 1 ? singular : many}`;
2
+ //# sourceMappingURL=plural.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plural.js","sourceRoot":"","sources":["../../src/report/plural.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,QAAgB,EAAE,IAAI,GAAG,GAAG,QAAQ,GAAG,EAAU,EAAE,CAAC,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type Outcome } from "../engine/evaluate.ts";
2
+ export type WarningDetail = "summary" | "all";
3
+ export interface ReportContext {
4
+ readonly descriptions: ReadonlyMap<string, string>;
5
+ readonly registry: string;
6
+ readonly baseline: string;
7
+ readonly checked: number;
8
+ readonly warnings: WarningDetail;
9
+ }
10
+ export declare const render: (outcome: Outcome, context: ReportContext) => string;
11
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/report/render.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,OAAO,EAAU,MAAM,uBAAuB,CAAC;AAK7D,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,KAAK,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;CACjC;AA6DD,eAAO,MAAM,MAAM,GAAI,SAAS,OAAO,EAAE,SAAS,aAAa,KAAG,MASjE,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { describeEntry, describeTally } from "../baseline/compare.js";
2
+ import { passes } from "../engine/evaluate.js";
3
+ import { groupBy, keyOf } from "../engine/violation.js";
4
+ import { plural } from "./plural.js";
5
+ import { staleSections } from "./stale.js";
6
+ const LISTED_FILES = 5;
7
+ const locate = (violation) => (violation.line === undefined ? violation.file : `${violation.file}:${violation.line}`);
8
+ const regressionNote = (regression) => ` ${regression.entry.file} is over its baseline: ${describeTally(regression.tally)} against ${describeEntry(regression.entry)} baselined.`;
9
+ const heading = (label, rule, violations, context) => {
10
+ const description = context.descriptions.get(rule);
11
+ return [`${label} ${rule} (${violations.length})`, ...(description === undefined ? [] : [` ${description}`])];
12
+ };
13
+ const detailed = (violations, regressions) => [...groupBy(violations, (violation) => violation.file).values()].flatMap((inFile) => {
14
+ const first = inFile[0];
15
+ const regression = first === undefined ? undefined : regressions.get(keyOf(first.rule, first.file));
16
+ return [
17
+ ...inFile.map((violation) => ` ${locate(violation)} ${violation.message}`),
18
+ ...(regression === undefined ? [] : [regressionNote(regression)]),
19
+ ];
20
+ });
21
+ const summarized = (violations) => {
22
+ const files = [...groupBy(violations, (violation) => violation.file).entries()].sort(([, left], [, right]) => right.length - left.length);
23
+ const listed = files.slice(0, LISTED_FILES).map(([file, inFile]) => `${file} (${inFile.length})`);
24
+ const rest = files.length - listed.length;
25
+ return [` ${listed.join(", ")}${rest > 0 ? `, and ${plural(rest, "more file", "more files")}` : ""}. --warnings all lists each one.`];
26
+ };
27
+ const ruleSections = (label, violations, context, body) => [...groupBy(violations, (violation) => violation.rule).entries()].map(([rule, inRule]) => [...heading(label, rule, inRule, context), ...body(inRule)].join("\n"));
28
+ const failures = (outcome) => {
29
+ const stale = outcome.staleBaseline.length + outcome.staleRegistry.length;
30
+ return [
31
+ ...(outcome.errors.length > 0 ? [plural(outcome.errors.length, "error")] : []),
32
+ ...(stale > 0 ? [plural(stale, "stale entry", "stale entries")] : []),
33
+ ].join(" and ");
34
+ };
35
+ const summary = (outcome, context) => {
36
+ const verdict = passes(outcome) ? "quality: passed" : `quality: failed with ${failures(outcome)}`;
37
+ const warnings = outcome.warnings.length > 0 ? `; ${plural(outcome.warnings.length, "warning")} from rules still at warn` : "";
38
+ const hidden = [
39
+ ...(outcome.baselined > 0 ? [`${outcome.baselined} baselined`] : []),
40
+ ...(outcome.registered > 0 ? [`${outcome.registered} registered`] : []),
41
+ ];
42
+ const suppressed = hidden.length === 0 ? "" : `; ${hidden.join(" and ")} ${outcome.baselined + outcome.registered === 1 ? "violation" : "violations"} not shown`;
43
+ return `${verdict}${warnings}. ${plural(context.checked, "source file")} checked${suppressed}.`;
44
+ };
45
+ export const render = (outcome, context) => {
46
+ const regressions = new Map(outcome.regressions.map((regression) => [keyOf(regression.entry.rule, regression.entry.file), regression]));
47
+ const warningBody = context.warnings === "all" ? (inRule) => detailed(inRule, regressions) : summarized;
48
+ return [
49
+ ...ruleSections("error", outcome.errors, context, (inRule) => detailed(inRule, regressions)),
50
+ ...ruleSections("warn", outcome.warnings, context, warningBody),
51
+ ...staleSections(outcome, context),
52
+ summary(outcome, context),
53
+ ].join("\n\n");
54
+ };
55
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/report/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Outcome } from "../engine/evaluate.ts";
2
+ interface StaleFiles {
3
+ readonly registry: string;
4
+ readonly baseline: string;
5
+ }
6
+ export declare const staleSections: (outcome: Outcome, files: StaleFiles) => ReadonlyArray<string>;
7
+ export {};
8
+ //# sourceMappingURL=stale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stale.d.ts","sourceRoot":"","sources":["../../src/report/stale.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAIrD,UAAU,UAAU;IACnB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC1B;AAUD,eAAO,MAAM,aAAa,GAAI,SAAS,OAAO,EAAE,OAAO,UAAU,KAAG,aAAa,CAAC,MAAM,CAWvF,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { plural } from "./plural.js";
2
+ const section = (file, guidance, lines) => lines.length === 0 ? [] : [[`error ${file}: ${plural(lines.length, "stale entry", "stale entries")}`, ` ${guidance}`, ...lines].join("\n")];
3
+ const baselineLine = ({ entry, problem }) => ` ${entry.rule} ${entry.file} ${problem}.`;
4
+ const registryLine = ({ entry, problem }) => ` ${entry.rule} ${entry.file}${entry.subject === undefined ? "" : ` (${entry.subject})`} ${problem}.`;
5
+ export const staleSections = (outcome, files) => [
6
+ ...section(files.baseline, "The baseline only shrinks. Run `quality baseline prune` to drop fixed debt; prune never adds or raises an entry.", outcome.staleBaseline.map(baselineLine)),
7
+ ...section(files.registry, "Every registered exception must still apply. Remove the entries whose exception is gone.", outcome.staleRegistry.map(registryLine)),
8
+ ];
9
+ //# sourceMappingURL=stale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stale.js","sourceRoot":"","sources":["../../src/report/stale.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAOrC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAE,KAA4B,EAAyB,EAAE,CACvG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,EAAE,eAAe,CAAC,EAAE,EAAE,KAAK,QAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAE9I,MAAM,YAAY,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAsB,EAAU,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC;AAErH,MAAM,YAAY,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAsB,EAAU,EAAE,CACvE,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,GAAG,IAAI,OAAO,GAAG,CAAC;AAExG,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAgB,EAAE,KAAiB,EAAyB,EAAE,CAAC;IAC5F,GAAG,OAAO,CACT,KAAK,CAAC,QAAQ,EACd,kHAAkH,EAClH,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CACvC;IACD,GAAG,OAAO,CACT,KAAK,CAAC,QAAQ,EACd,0FAA0F,EAC1F,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CACvC;CACD,CAAC"}
package/dist/rule.d.ts ADDED
@@ -0,0 +1,56 @@
1
+ import { type StandardSchemaV1 } from "./standard-schema.ts";
2
+ export interface Finding {
3
+ readonly file: string;
4
+ readonly line?: number | undefined;
5
+ readonly message: string;
6
+ /** Tells apart exceptions of one rule in one file, such as which Biome rule an override turns off. */
7
+ readonly subject?: string | undefined;
8
+ /** A size where larger is worse, such as a file's line count. A baselined file may not grow past it. */
9
+ readonly measure?: number | undefined;
10
+ }
11
+ export type Findings = ReadonlyArray<Finding>;
12
+ export interface SourceFile {
13
+ readonly path: string;
14
+ readonly text: string;
15
+ readonly lines: ReadonlyArray<string>;
16
+ }
17
+ export interface RuleInputs {
18
+ readonly root: string;
19
+ readonly files: ReadonlyArray<string>;
20
+ readonly sources: ReadonlyArray<SourceFile>;
21
+ readonly readText: (path: string) => Promise<string | undefined>;
22
+ }
23
+ export interface RuleContext<Options> extends RuleInputs {
24
+ readonly options: Options;
25
+ }
26
+ export type Configured = {
27
+ readonly _tag: "Invalid";
28
+ readonly issues: ReadonlyArray<string>;
29
+ } | {
30
+ readonly _tag: "Ready";
31
+ readonly check: (inputs: RuleInputs) => Promise<Findings>;
32
+ };
33
+ export interface Rule<Id extends string = string, Input = unknown> {
34
+ readonly id: Id;
35
+ readonly description: string;
36
+ configure(options: Input | undefined): Promise<Configured>;
37
+ }
38
+ interface RuleDefinition<Id extends string, Options> {
39
+ readonly id: Id;
40
+ readonly description: string;
41
+ readonly check: (context: RuleContext<Options>) => Findings | PromiseLike<Findings>;
42
+ }
43
+ interface RuleDefinitionWithOptions<Id extends string, Input, Options> extends RuleDefinition<Id, Options> {
44
+ readonly options: StandardSchemaV1<Input, Options>;
45
+ }
46
+ interface RuleDefinitionWithoutOptions<Id extends string> extends RuleDefinition<Id, undefined> {
47
+ readonly options?: undefined;
48
+ }
49
+ /**
50
+ * Defines a rule. Options are an object validated by a Standard Schema; a rule the config gives no options validates `{}`,
51
+ * so give each option a default or make it optional.
52
+ */
53
+ export declare function defineRule<const Id extends string, Input, Options>(definition: RuleDefinitionWithOptions<Id, Input, Options>): Rule<Id, Input>;
54
+ export declare function defineRule<const Id extends string>(definition: RuleDefinitionWithoutOptions<Id>): Rule<Id, undefined>;
55
+ export {};
56
+ //# sourceMappingURL=rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../src/rule.ts"],"names":[],"mappings":"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"}
package/dist/rule.js ADDED
@@ -0,0 +1,23 @@
1
+ import { describeIssue } from "./standard-schema.js";
2
+ const noOptions = {
3
+ "~standard": {
4
+ validate: (value) => (value === undefined ? { value: undefined } : { issues: [{ message: "this rule takes no options" }] }),
5
+ vendor: "@shivaedev/quality",
6
+ version: 1,
7
+ },
8
+ };
9
+ const configureWith = (schema, check, absent) => async (options) => {
10
+ const result = await schema["~standard"].validate(options ?? absent);
11
+ if (result.issues !== undefined) {
12
+ return { _tag: "Invalid", issues: result.issues.map(describeIssue) };
13
+ }
14
+ const value = result.value;
15
+ return { _tag: "Ready", check: async (inputs) => check({ ...inputs, options: value }) };
16
+ };
17
+ export function defineRule(definition) {
18
+ const configure = definition.options === undefined
19
+ ? configureWith(noOptions, definition.check, undefined)
20
+ : configureWith(definition.options, definition.check, {});
21
+ return { configure, description: definition.description, id: definition.id };
22
+ }
23
+ //# sourceMappingURL=rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.js","sourceRoot":"","sources":["../src/rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAyB,MAAM,sBAAsB,CAAC;AAwD5E,MAAM,SAAS,GAA2C;IACzD,WAAW,EAAE;QACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC,EAAE,CAAC;QAC3H,MAAM,EAAE,oBAAoB;QAC5B,OAAO,EAAE,CAAC;KACV;CACD,CAAC;AAEF,MAAM,aAAa,GAClB,CAAiB,MAAwC,EAAE,KAA+C,EAAE,MAAe,EAAE,EAAE,CAC/H,KAAK,EAAE,OAAgB,EAAuB,EAAE;IAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;IACtE,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AACzF,CAAC,CAAC;AAQH,MAAM,UAAU,UAAU,CACzB,UAA4F;IAE5F,MAAM,SAAS,GACd,UAAU,CAAC,OAAO,KAAK,SAAS;QAC/B,CAAC,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC;QACvD,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare const builtInRules: readonly [import("../rule.ts").Rule<"structure/max-lines", {
2
+ readonly source?: number;
3
+ readonly test?: number;
4
+ readonly testFiles?: readonly string[];
5
+ }>];
6
+ //# sourceMappingURL=built-in.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"built-in.d.ts","sourceRoot":"","sources":["../../src/rules/built-in.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY;;;;GAAsB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { maxLines } from "./max-lines.js";
2
+ export const builtInRules = [maxLines];
3
+ //# sourceMappingURL=built-in.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"built-in.js","sourceRoot":"","sources":["../../src/rules/built-in.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAQ,CAAU,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare const maxLines: import("../rule.ts").Rule<"structure/max-lines", {
2
+ readonly source?: number;
3
+ readonly test?: number;
4
+ readonly testFiles?: readonly string[];
5
+ }>;
6
+ //# sourceMappingURL=max-lines.d.ts.map