@redocly/recheck 2.58.2 → 2.59.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/lib/actions/baseline.d.ts +7 -1
- package/lib/actions/baseline.d.ts.map +1 -1
- package/lib/actions/baseline.js +17 -3
- package/lib/actions/baseline.js.map +1 -1
- package/lib/actions/embedded.d.ts +16 -0
- package/lib/actions/embedded.d.ts.map +1 -0
- package/lib/actions/embedded.js +26 -0
- package/lib/actions/embedded.js.map +1 -0
- package/lib/actions/lint.d.ts +10 -0
- package/lib/actions/lint.d.ts.map +1 -1
- package/lib/actions/lint.js +106 -16
- package/lib/actions/lint.js.map +1 -1
- package/lib/config/resolve.d.ts +1 -1
- package/lib/config/resolve.d.ts.map +1 -1
- package/lib/config/resolve.js +89 -3
- package/lib/config/resolve.js.map +1 -1
- package/lib/core/baseline.d.ts +2 -0
- package/lib/core/baseline.d.ts.map +1 -1
- package/lib/core/baseline.js +5 -1
- package/lib/core/baseline.js.map +1 -1
- package/lib/core/rule-filters.d.ts +14 -0
- package/lib/core/rule-filters.d.ts.map +1 -1
- package/lib/core/rule-filters.js +11 -7
- package/lib/core/rule-filters.js.map +1 -1
- package/lib/core/runner.d.ts.map +1 -1
- package/lib/core/runner.js +2 -2
- package/lib/core/runner.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/parser/markdoc/syntax.js +1 -1
- package/lib/parser/markdoc/syntax.js.map +1 -1
- package/lib/types/problems.d.ts +1 -0
- package/lib/types/problems.d.ts.map +1 -1
- package/package.json +2 -2
- package/presets/google/PROVENANCE.md +10 -10
- package/presets/inclusive-language/PROVENANCE.md +12 -12
- package/presets/microsoft/PROVENANCE.md +7 -7
- package/presets/plain-language/PROVENANCE.md +1 -1
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { type ResolvedRecheckConfig } from '../config/resolve.js';
|
|
2
|
+
import type { Problem } from '../types/index.js';
|
|
3
|
+
import { type EmbeddedInput } from './embedded.js';
|
|
2
4
|
export interface BaselineRunResult {
|
|
3
5
|
roots: string[];
|
|
4
6
|
filesFound: number;
|
|
@@ -6,10 +8,14 @@ export interface BaselineRunResult {
|
|
|
6
8
|
outPath: string;
|
|
7
9
|
errorCount: number;
|
|
8
10
|
baselinedFileCount: number;
|
|
11
|
+
apiDescriptionCount: number;
|
|
9
12
|
}
|
|
10
13
|
/**
|
|
11
14
|
* Runs all configured rules and writes the baseline file: the error count for each
|
|
12
15
|
* file and rule. The format is in core/baseline.ts.
|
|
13
16
|
*/
|
|
14
|
-
export declare function generateBaseline(paths: string | string[] | undefined, config: ResolvedRecheckConfig
|
|
17
|
+
export declare function generateBaseline(paths: string | string[] | undefined, config: ResolvedRecheckConfig, options?: {
|
|
18
|
+
embeddedInputs?: EmbeddedInput[];
|
|
19
|
+
isIgnored?: (problem: Problem) => boolean;
|
|
20
|
+
}): Promise<BaselineRunResult>;
|
|
15
21
|
//# sourceMappingURL=baseline.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../../src/actions/baseline.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyB,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../../src/actions/baseline.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyB,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAKzF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAGvE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,YAAM,EAC9B,MAAM,EAAE,qBAAqB,EAC7B,OAAO,GAAE;IACP,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IAIjC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;CACtC,GACL,OAAO,CAAC,iBAAiB,CAAC,CAuD5B"}
|
package/lib/actions/baseline.js
CHANGED
|
@@ -5,13 +5,15 @@ import { buildBaseline, serializeBaseline, baselineKeyMapper } from '../core/bas
|
|
|
5
5
|
import { needsImageMetadata, loadImageMetadata } from '../core/files.js';
|
|
6
6
|
import { filterEnabledRules } from '../core/rule-filters.js';
|
|
7
7
|
import { runRules } from '../core/runner.js';
|
|
8
|
+
import { lintEmbeddedInputs } from './embedded.js';
|
|
8
9
|
import { discoverFilesForRoots, rootForFile, toRoots } from './roots.js';
|
|
9
10
|
/**
|
|
10
11
|
* Runs all configured rules and writes the baseline file: the error count for each
|
|
11
12
|
* file and rule. The format is in core/baseline.ts.
|
|
12
13
|
*/
|
|
13
|
-
export async function generateBaseline(paths = '.', config) {
|
|
14
|
-
const
|
|
14
|
+
export async function generateBaseline(paths = '.', config, options = {}) {
|
|
15
|
+
const embeddedInputs = options.embeddedInputs ?? [];
|
|
16
|
+
const roots = Array.isArray(paths) && paths.length === 0 ? [] : toRoots(paths);
|
|
15
17
|
const configDir = config.configDir;
|
|
16
18
|
const { enabled: rulesToRun } = filterEnabledRules(config.rules);
|
|
17
19
|
const files = await discoverFilesForRoots(roots);
|
|
@@ -35,7 +37,18 @@ export async function generateBaseline(paths = '.', config) {
|
|
|
35
37
|
markdoc: config.markdoc,
|
|
36
38
|
markdocSchema: config.markdocSchema,
|
|
37
39
|
});
|
|
38
|
-
|
|
40
|
+
if (embeddedInputs.length > 0) {
|
|
41
|
+
const { enabled: descriptionRulesToRun } = filterEnabledRules(config.descriptionRules);
|
|
42
|
+
const embedded = await lintEmbeddedInputs(embeddedInputs, descriptionRulesToRun, {
|
|
43
|
+
knownRuleNames: new Set(config.rules.map((rule) => rule.name)),
|
|
44
|
+
markdoc: config.markdoc,
|
|
45
|
+
markdocSchema: config.markdocSchema,
|
|
46
|
+
});
|
|
47
|
+
problems.push(...embedded.problems);
|
|
48
|
+
}
|
|
49
|
+
const isIgnored = options.isIgnored;
|
|
50
|
+
const kept = isIgnored ? problems.filter((problem) => !isIgnored(problem)) : problems;
|
|
51
|
+
const errors = kept.filter((problem) => problem.severity === 'error');
|
|
39
52
|
const baseline = buildBaseline(errors, baselineKeyMapper(configDir));
|
|
40
53
|
const outPath = pathModule.resolve(configDir, DEFAULT_BASELINE_FILE);
|
|
41
54
|
await fs.writeFile(outPath, serializeBaseline(baseline), 'utf8');
|
|
@@ -46,6 +59,7 @@ export async function generateBaseline(paths = '.', config) {
|
|
|
46
59
|
outPath,
|
|
47
60
|
errorCount: errors.length,
|
|
48
61
|
baselinedFileCount: Object.keys(baseline.files).length,
|
|
62
|
+
apiDescriptionCount: embeddedInputs.length,
|
|
49
63
|
};
|
|
50
64
|
}
|
|
51
65
|
//# sourceMappingURL=baseline.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/actions/baseline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AAEnC,OAAO,EAAE,qBAAqB,EAA8B,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAkB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/actions/baseline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type RunnerOptions } from '../core/runner.js';
|
|
2
|
+
import type { NormalizedRule, Problem } from '../types/index.js';
|
|
3
|
+
export interface EmbeddedInput {
|
|
4
|
+
file: string;
|
|
5
|
+
pointer: string;
|
|
6
|
+
content: string;
|
|
7
|
+
mapPosition(line: number, column: number): {
|
|
8
|
+
line: number;
|
|
9
|
+
column: number;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export declare function lintEmbeddedInputs(inputs: EmbeddedInput[], rules: NormalizedRule[], runnerOptions: RunnerOptions): Promise<{
|
|
13
|
+
problems: Problem[];
|
|
14
|
+
fixableCount: number;
|
|
15
|
+
}>;
|
|
16
|
+
//# sourceMappingURL=embedded.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedded.d.ts","sourceRoot":"","sources":["../../src/actions/embedded.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAKjE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7E;AAID,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,aAAa,EAAE,EACvB,KAAK,EAAE,cAAc,EAAE,EACvB,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAoBxD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { runRules } from '../core/runner.js';
|
|
2
|
+
// Lints each input on its own in embedded mode and remaps every finding to
|
|
3
|
+
// the owning file. Fixes never apply to embedded content.
|
|
4
|
+
export async function lintEmbeddedInputs(inputs, rules, runnerOptions) {
|
|
5
|
+
const problems = [];
|
|
6
|
+
let fixableCount = 0;
|
|
7
|
+
for (const input of inputs) {
|
|
8
|
+
const result = await runRules([{ path: input.file, content: input.content }], rules, {
|
|
9
|
+
...runnerOptions,
|
|
10
|
+
embedded: true,
|
|
11
|
+
});
|
|
12
|
+
for (const problem of result.problems) {
|
|
13
|
+
const position = input.mapPosition(problem.line, problem.column);
|
|
14
|
+
if (problem.fixable)
|
|
15
|
+
fixableCount++;
|
|
16
|
+
problems.push({
|
|
17
|
+
...problem,
|
|
18
|
+
line: position.line,
|
|
19
|
+
column: position.column,
|
|
20
|
+
pointer: input.pointer,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return { problems, fixableCount };
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=embedded.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedded.js","sourceRoot":"","sources":["../../src/actions/embedded.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAsB,MAAM,mBAAmB,CAAC;AAajE,2EAA2E;AAC3E,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAuB,EACvB,KAAuB,EACvB,aAA4B;IAE5B,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE;YACnF,GAAG,aAAa;YAChB,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QACH,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACjE,IAAI,OAAO,CAAC,OAAO;gBAAE,YAAY,EAAE,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC;gBACZ,GAAG,OAAO;gBACV,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AACpC,CAAC"}
|
package/lib/actions/lint.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ResolvedRecheckConfig } from '../config/resolve.js';
|
|
2
2
|
import type { Fix, Problem } from '../types/index.js';
|
|
3
|
+
import { type EmbeddedInput } from './embedded.js';
|
|
3
4
|
export interface LintOptions {
|
|
4
5
|
severity?: 'off' | 'info' | 'warn' | 'warning' | 'error';
|
|
5
6
|
tags?: (string | number)[];
|
|
@@ -8,9 +9,14 @@ export interface LintOptions {
|
|
|
8
9
|
fix?: boolean;
|
|
9
10
|
changedOnly?: boolean;
|
|
10
11
|
changedListPath?: string;
|
|
12
|
+
embeddedInputs?: EmbeddedInput[];
|
|
13
|
+
apiFiles?: string[];
|
|
14
|
+
unreadableFiles?: string[];
|
|
15
|
+
isIgnored?: (problem: Problem) => boolean;
|
|
11
16
|
}
|
|
12
17
|
export interface LintRunReport {
|
|
13
18
|
roots: string[];
|
|
19
|
+
apiDescriptionCount: number;
|
|
14
20
|
ruleCount: number;
|
|
15
21
|
disabledRuleCount: number;
|
|
16
22
|
filesFound: number;
|
|
@@ -20,11 +26,15 @@ export interface LintRunReport {
|
|
|
20
26
|
};
|
|
21
27
|
unreadableFiles: string[];
|
|
22
28
|
scannedFileCount: number;
|
|
29
|
+
scannedDescriptionFileCount: number;
|
|
30
|
+
executedDescriptionRuleCount: number;
|
|
23
31
|
problems: Problem[];
|
|
24
32
|
fixes?: {
|
|
25
33
|
applied: Fix[];
|
|
26
34
|
skippedCount: number;
|
|
27
35
|
};
|
|
36
|
+
descriptionFixesSkipped: number;
|
|
37
|
+
suppressedByIgnoreFile: number;
|
|
28
38
|
baseline?: {
|
|
29
39
|
matched: number;
|
|
30
40
|
new: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/actions/lint.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/actions/lint.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAUlE,OAAO,KAAK,EAAE,GAAG,EAAkB,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAGvE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACzD,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IAEjC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAEpB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAE3B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;CAC3C;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IAEnB,aAAa,CAAC,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IAEzB,2BAA2B,EAAE,MAAM,CAAC;IACpC,4BAA4B,EAAE,MAAM,CAAC;IACrC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAEjD,uBAAuB,EAAE,MAAM,CAAC;IAChC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,GAChE;IAAE,MAAM,EAAE,kBAAkB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAC3E;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAC5D,CAAC;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,GAAG,aAAa,CAAC,CAAC;AAmB9C,wBAAsB,OAAO,CAC3B,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,YAAM,EAC9B,MAAM,EAAE,qBAAqB,EAC7B,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,aAAa,CAAC,CAoNxB"}
|
package/lib/actions/lint.js
CHANGED
|
@@ -2,20 +2,49 @@ import * as fs from 'fs/promises';
|
|
|
2
2
|
import * as pathModule from 'path';
|
|
3
3
|
import { parseBaseline, compareToBaseline, baselineKeyMapper } from '../core/baseline.js';
|
|
4
4
|
import { loadChangedFiles, needsImageMetadata, loadImageMetadata } from '../core/files.js';
|
|
5
|
-
import { applyFilters, UnknownRuleNameError } from '../core/rule-filters.js';
|
|
5
|
+
import { applyFilters, assertRuleNamesKnown, matchesRuleName, UnknownRuleNameError, } from '../core/rule-filters.js';
|
|
6
6
|
import { runRules, runRulesUntilStable } from '../core/runner.js';
|
|
7
|
+
import { lintEmbeddedInputs } from './embedded.js';
|
|
7
8
|
import { discoverFilesForRoots, rootForFile, toRoots } from './roots.js';
|
|
9
|
+
// Filters one rule set by name. It does not check for unknown names:
|
|
10
|
+
// `assertRuleNamesKnown` already checked pages and descriptions together.
|
|
11
|
+
function narrowByRuleNames(rules, include, exclude) {
|
|
12
|
+
let narrowed = rules;
|
|
13
|
+
if (include.length > 0) {
|
|
14
|
+
narrowed = narrowed.filter((rule) => include.some((name) => matchesRuleName(rule, name)));
|
|
15
|
+
}
|
|
16
|
+
if (exclude.length > 0) {
|
|
17
|
+
narrowed = narrowed.filter((rule) => !exclude.some((name) => matchesRuleName(rule, name)));
|
|
18
|
+
}
|
|
19
|
+
return narrowed;
|
|
20
|
+
}
|
|
8
21
|
export async function runLint(paths = '.', config, options) {
|
|
9
|
-
|
|
22
|
+
let embeddedInputs = options.embeddedInputs ?? [];
|
|
23
|
+
let apiFiles = options.apiFiles ?? [];
|
|
24
|
+
// An empty path list means no page discovery. A call with no paths uses the default `.`.
|
|
25
|
+
const roots = Array.isArray(paths) && paths.length === 0 ? [] : toRoots(paths);
|
|
26
|
+
const ruleNames = options.rules ?? [];
|
|
27
|
+
const excludeRuleNames = options.excludeRules ?? [];
|
|
10
28
|
let rulesToRun;
|
|
11
29
|
let disabledCount;
|
|
30
|
+
let descriptionRules = [];
|
|
12
31
|
try {
|
|
13
32
|
({ filtered: rulesToRun, disabledCount } = applyFilters(config.rules, {
|
|
14
33
|
severity: options.severity,
|
|
15
34
|
tags: options.tags,
|
|
16
|
-
rules: options.rules,
|
|
17
|
-
excludeRules: options.excludeRules,
|
|
18
35
|
}));
|
|
36
|
+
// A name filter must match a rule in effect on pages or, when the run has
|
|
37
|
+
// description inputs, on descriptions: `apiDescriptions.rules` can turn on
|
|
38
|
+
// a rule that is `off` for pages. The check runs once over both sides;
|
|
39
|
+
// each side then narrows on its own, so a name the other side matches
|
|
40
|
+
// leaves this side empty instead of failing the run.
|
|
41
|
+
if (embeddedInputs.length > 0 || apiFiles.length > 0) {
|
|
42
|
+
descriptionRules = applyFilters(config.descriptionRules, {
|
|
43
|
+
severity: options.severity,
|
|
44
|
+
tags: options.tags,
|
|
45
|
+
}).filtered;
|
|
46
|
+
}
|
|
47
|
+
assertRuleNamesKnown([...rulesToRun, ...descriptionRules], [...ruleNames, ...excludeRuleNames]);
|
|
19
48
|
}
|
|
20
49
|
catch (error) {
|
|
21
50
|
if (error instanceof UnknownRuleNameError) {
|
|
@@ -23,24 +52,36 @@ export async function runLint(paths = '.', config, options) {
|
|
|
23
52
|
}
|
|
24
53
|
throw error;
|
|
25
54
|
}
|
|
55
|
+
rulesToRun = narrowByRuleNames(rulesToRun, ruleNames, excludeRuleNames);
|
|
56
|
+
descriptionRules = narrowByRuleNames(descriptionRules, ruleNames, excludeRuleNames);
|
|
26
57
|
const report = {
|
|
27
58
|
roots,
|
|
59
|
+
apiDescriptionCount: embeddedInputs.length,
|
|
28
60
|
ruleCount: rulesToRun.length,
|
|
29
61
|
disabledRuleCount: disabledCount,
|
|
30
62
|
filesFound: 0,
|
|
31
63
|
unreadableFiles: [],
|
|
32
64
|
scannedFileCount: 0,
|
|
65
|
+
scannedDescriptionFileCount: 0,
|
|
66
|
+
executedDescriptionRuleCount: 0,
|
|
33
67
|
problems: [],
|
|
68
|
+
descriptionFixesSkipped: 0,
|
|
69
|
+
suppressedByIgnoreFile: 0,
|
|
34
70
|
empty: true,
|
|
35
71
|
};
|
|
36
72
|
try {
|
|
37
73
|
let files = await discoverFilesForRoots(roots);
|
|
38
74
|
report.filesFound = files.length;
|
|
39
75
|
// With a baseline, still compare when no files are found: deleting the last
|
|
40
|
-
// baselined files makes their entries stale. Changed-only runs skip this
|
|
41
|
-
|
|
42
|
-
|
|
76
|
+
// baselined files makes their entries stale. Changed-only runs skip this,
|
|
77
|
+
// unless they have API files: a changed API file without descriptions
|
|
78
|
+
// must still be compared.
|
|
79
|
+
if (files.length === 0 && embeddedInputs.length === 0) {
|
|
80
|
+
const compareBaseline = config.baselinePath !== undefined && (!options.changedOnly || apiFiles.length > 0);
|
|
81
|
+
if (!compareBaseline)
|
|
82
|
+
return { status: 'completed', ...report };
|
|
43
83
|
}
|
|
84
|
+
// The changed-file filter covers pages and API descriptions alike.
|
|
44
85
|
if (options.changedOnly) {
|
|
45
86
|
const changedCandidates = await loadChangedFiles(options.changedListPath);
|
|
46
87
|
if (!changedCandidates || changedCandidates.length === 0) {
|
|
@@ -48,11 +89,26 @@ export async function runLint(paths = '.', config, options) {
|
|
|
48
89
|
return { status: 'completed', ...report };
|
|
49
90
|
}
|
|
50
91
|
const changedSet = new Set(changedCandidates.map((candidate) => pathModule.isAbsolute(candidate) ? candidate : pathModule.resolve(candidate)));
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
92
|
+
const changedFiles = files.filter((file) => changedSet.has(pathModule.resolve(file)));
|
|
93
|
+
const changedEmbeddedInputs = embeddedInputs.filter((input) => changedSet.has(pathModule.resolve(input.file)));
|
|
94
|
+
apiFiles = apiFiles.filter((file) => changedSet.has(pathModule.resolve(file)));
|
|
95
|
+
// Pages plus the distinct API files the list kept, whether they carry
|
|
96
|
+
// descriptions or not.
|
|
97
|
+
const changedApiFiles = new Set([
|
|
98
|
+
...changedEmbeddedInputs.map((input) => input.file),
|
|
99
|
+
...apiFiles,
|
|
100
|
+
]);
|
|
101
|
+
report.changedFilter = {
|
|
102
|
+
provided: true,
|
|
103
|
+
matched: changedFiles.length + changedApiFiles.size,
|
|
104
|
+
};
|
|
105
|
+
if (changedFiles.length === 0 &&
|
|
106
|
+
changedEmbeddedInputs.length === 0 &&
|
|
107
|
+
(apiFiles.length === 0 || config.baselinePath === undefined)) {
|
|
54
108
|
return { status: 'completed', ...report };
|
|
55
|
-
|
|
109
|
+
}
|
|
110
|
+
files = changedFiles;
|
|
111
|
+
embeddedInputs = changedEmbeddedInputs;
|
|
56
112
|
}
|
|
57
113
|
const loadImageMeta = needsImageMetadata(rulesToRun);
|
|
58
114
|
const fileInputs = [];
|
|
@@ -76,7 +132,7 @@ export async function runLint(paths = '.', config, options) {
|
|
|
76
132
|
markdoc: config.markdoc,
|
|
77
133
|
markdocSchema: config.markdocSchema,
|
|
78
134
|
};
|
|
79
|
-
const { problems:
|
|
135
|
+
const { problems: pageProblems, fixedFiles, fixes, skippedFixes, } = options.fix
|
|
80
136
|
? await runRulesUntilStable(fileInputs, rulesToRun, runnerOptions)
|
|
81
137
|
: await runRules(fileInputs, rulesToRun, runnerOptions);
|
|
82
138
|
if (options.fix) {
|
|
@@ -85,7 +141,34 @@ export async function runLint(paths = '.', config, options) {
|
|
|
85
141
|
}
|
|
86
142
|
report.fixes = { applied: fixes, skippedCount: skippedFixes.length };
|
|
87
143
|
}
|
|
88
|
-
|
|
144
|
+
let problems = [...pageProblems];
|
|
145
|
+
const executedDescriptionRules = new Set();
|
|
146
|
+
// A scanned API file with zero descriptions still needs the description
|
|
147
|
+
// rules recorded as executed, so a leftover baseline entry for it goes stale.
|
|
148
|
+
if (embeddedInputs.length > 0 || apiFiles.length > 0) {
|
|
149
|
+
const noRulesLeftForDescriptions = ruleNames.length > 0 && descriptionRules.length === 0;
|
|
150
|
+
if (!noRulesLeftForDescriptions) {
|
|
151
|
+
for (const rule of descriptionRules)
|
|
152
|
+
executedDescriptionRules.add(rule.name);
|
|
153
|
+
const embedded = await lintEmbeddedInputs(embeddedInputs, descriptionRules, runnerOptions);
|
|
154
|
+
problems.push(...embedded.problems);
|
|
155
|
+
report.descriptionFixesSkipped = options.fix ? embedded.fixableCount : 0;
|
|
156
|
+
report.executedDescriptionRuleCount = descriptionRules.length;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (options.isIgnored) {
|
|
160
|
+
const isIgnored = options.isIgnored;
|
|
161
|
+
const kept = problems.filter((problem) => !isIgnored(problem));
|
|
162
|
+
report.suppressedByIgnoreFile = problems.length - kept.length;
|
|
163
|
+
problems = kept;
|
|
164
|
+
}
|
|
165
|
+
// Union with `apiFiles`: a parsed API file with no local descriptions has
|
|
166
|
+
// no entry in `embeddedInputs`, but it was still scanned.
|
|
167
|
+
const scannedDescriptionFiles = [
|
|
168
|
+
...new Set([...embeddedInputs.map((input) => input.file), ...apiFiles]),
|
|
169
|
+
];
|
|
170
|
+
report.scannedDescriptionFileCount = scannedDescriptionFiles.length;
|
|
171
|
+
report.problems = problems;
|
|
89
172
|
if (config.baselinePath) {
|
|
90
173
|
let baselineText;
|
|
91
174
|
try {
|
|
@@ -96,12 +179,19 @@ export async function runLint(paths = '.', config, options) {
|
|
|
96
179
|
}
|
|
97
180
|
const baseline = parseBaseline(baselineText, config.baselinePath);
|
|
98
181
|
const toKey = baselineKeyMapper(config.configDir);
|
|
99
|
-
const comparison = compareToBaseline(
|
|
100
|
-
scannedFiles: fileInputs.map((file) => file.path),
|
|
101
|
-
|
|
182
|
+
const comparison = compareToBaseline(problems, baseline, {
|
|
183
|
+
scannedFiles: [...fileInputs.map((file) => file.path), ...scannedDescriptionFiles],
|
|
184
|
+
// Page rules run over the walked roots, so a run with no root ran
|
|
185
|
+
// none of them; description rules run over embedded inputs and
|
|
186
|
+
// any parsed API file.
|
|
187
|
+
executedRules: new Set([
|
|
188
|
+
...(roots.length > 0 ? rulesToRun.map((rule) => rule.name) : []),
|
|
189
|
+
...executedDescriptionRules,
|
|
190
|
+
]),
|
|
102
191
|
toKey,
|
|
103
192
|
// A changed-only run does not scan every file, so a missing file means nothing there.
|
|
104
193
|
scanRoots: options.changedOnly ? undefined : roots.map(toKey),
|
|
194
|
+
skipFiles: new Set((options.unreadableFiles ?? []).map(toKey)),
|
|
105
195
|
});
|
|
106
196
|
report.problems = comparison.problems;
|
|
107
197
|
report.baseline = {
|
package/lib/actions/lint.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/actions/lint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AAGnC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC3F,OAAO,
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/actions/lint.ts"],"names":[],"mappings":"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"}
|
package/lib/config/resolve.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ export interface ResolvedRecheckConfig {
|
|
|
15
15
|
markdoc: boolean;
|
|
16
16
|
markdocSchema: MarkdocSchema | null;
|
|
17
17
|
baselinePath?: string;
|
|
18
|
-
|
|
18
|
+
descriptionRules: NormalizedRule[];
|
|
19
19
|
}
|
|
20
20
|
export interface RecheckBlockInput {
|
|
21
21
|
block?: unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/config/resolve.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIjG,KAAK,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AAG1E,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,GAAG,iBAAiB,CAAC;IACtC,eAAe,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,iBAAiB,CAAA;KAAE,CAAC;CACjD;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/config/resolve.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIjG,KAAK,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AAG1E,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,GAAG,iBAAiB,CAAC;IACtC,eAAe,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,iBAAiB,CAAA;KAAE,CAAC;CACjD;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,gBAAgB,EAAE,cAAc,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAEhC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,qBAAqB,CAAC;IAAC,MAAM,EAAE,EAAE,CAAA;CAAE,GAC5D;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC;AAElD,eAAO,MAAM,qBAAqB,mCAAmC,CAAC;AAmGtE,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CA0F3F"}
|
package/lib/config/resolve.js
CHANGED
|
@@ -18,6 +18,63 @@ function toEngineConfig(block) {
|
|
|
18
18
|
}
|
|
19
19
|
return engineConfig;
|
|
20
20
|
}
|
|
21
|
+
const OVERRIDE_KEYS = new Set([
|
|
22
|
+
'severity',
|
|
23
|
+
'message',
|
|
24
|
+
'tags',
|
|
25
|
+
'description',
|
|
26
|
+
'link',
|
|
27
|
+
'scope',
|
|
28
|
+
'appliesTo',
|
|
29
|
+
'excludes',
|
|
30
|
+
'exceptions',
|
|
31
|
+
'fix',
|
|
32
|
+
'assertions',
|
|
33
|
+
]);
|
|
34
|
+
// Applies `apiDescriptions.rules` on top of the effective rules. A severity
|
|
35
|
+
// string sets the severity; an object merges its fields. Every key must name
|
|
36
|
+
// a rule that is in effect.
|
|
37
|
+
function applyDescriptionOverrides(rules, overrides) {
|
|
38
|
+
if (!isPlainObject(overrides))
|
|
39
|
+
return { rules, errors: [] };
|
|
40
|
+
const errors = [];
|
|
41
|
+
const byName = new Map(rules.map((rule) => [rule.name, rule]));
|
|
42
|
+
for (const [name, value] of Object.entries(overrides)) {
|
|
43
|
+
const path = `recheck.apiDescriptions.rules.${name}`;
|
|
44
|
+
const rule = byName.get(name);
|
|
45
|
+
if (rule === undefined) {
|
|
46
|
+
errors.push({ message: `"${name}" is not a rule in effect, so it has no override`, path });
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (typeof value === 'string') {
|
|
50
|
+
if (!SEVERITIES.has(value)) {
|
|
51
|
+
errors.push({ message: `"${name}" has an unknown severity "${value}"`, path });
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
byName.set(name, { ...rule, severity: value });
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (!isPlainObject(value)) {
|
|
58
|
+
errors.push({ message: `"${name}" must be a severity string or a rule object`, path });
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const unknown = Object.keys(value).filter((key) => !OVERRIDE_KEYS.has(key));
|
|
62
|
+
if (unknown.length > 0) {
|
|
63
|
+
errors.push({ message: `"${name}" has unknown keys: ${unknown.join(', ')}`, path });
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if ('severity' in value &&
|
|
67
|
+
!(typeof value.severity === 'string' && SEVERITIES.has(value.severity))) {
|
|
68
|
+
errors.push({
|
|
69
|
+
message: `"${name}" has an unknown severity "${String(value.severity)}"`,
|
|
70
|
+
path,
|
|
71
|
+
});
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
byName.set(name, { ...rule, ...value });
|
|
75
|
+
}
|
|
76
|
+
return { rules: [...byName.values()], errors };
|
|
77
|
+
}
|
|
21
78
|
// The engine validates the flat shape (rule keys at the top level). The block
|
|
22
79
|
// nests them under `rules`, so the reported path must say where the user wrote it.
|
|
23
80
|
function toBlockPath(enginePath) {
|
|
@@ -71,6 +128,33 @@ export async function resolveRecheckConfig(input) {
|
|
|
71
128
|
errors: [{ message: '`recheck.rules` must be an object', path: 'recheck.rules' }],
|
|
72
129
|
};
|
|
73
130
|
}
|
|
131
|
+
if ('apiDescriptions' in block) {
|
|
132
|
+
const { apiDescriptions } = block;
|
|
133
|
+
const errors = [];
|
|
134
|
+
if (!isPlainObject(apiDescriptions)) {
|
|
135
|
+
errors.push({
|
|
136
|
+
message: '`recheck.apiDescriptions` must be an object',
|
|
137
|
+
path: 'recheck.apiDescriptions',
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
const unknownKeys = Object.keys(apiDescriptions).filter((key) => key !== 'rules');
|
|
142
|
+
if (unknownKeys.length > 0) {
|
|
143
|
+
errors.push({
|
|
144
|
+
message: `\`recheck.apiDescriptions\` has unknown keys: ${unknownKeys.join(', ')}`,
|
|
145
|
+
path: 'recheck.apiDescriptions',
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
if ('rules' in apiDescriptions && !isPlainObject(apiDescriptions.rules)) {
|
|
149
|
+
errors.push({
|
|
150
|
+
message: '`recheck.apiDescriptions.rules` must be an object',
|
|
151
|
+
path: 'recheck.apiDescriptions.rules',
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (errors.length > 0)
|
|
156
|
+
return { success: false, errors };
|
|
157
|
+
}
|
|
74
158
|
const validation = await validate(toEngineConfig(block), {
|
|
75
159
|
configDir: input.configDir,
|
|
76
160
|
warn: input.warn,
|
|
@@ -82,6 +166,10 @@ export async function resolveRecheckConfig(input) {
|
|
|
82
166
|
};
|
|
83
167
|
}
|
|
84
168
|
const apiDescriptions = isPlainObject(block.apiDescriptions) ? block.apiDescriptions : undefined;
|
|
169
|
+
const overrides = applyDescriptionOverrides(validation.rules, apiDescriptions?.rules);
|
|
170
|
+
if (overrides.errors.length > 0) {
|
|
171
|
+
return { success: false, errors: overrides.errors };
|
|
172
|
+
}
|
|
85
173
|
return {
|
|
86
174
|
success: true,
|
|
87
175
|
errors: [],
|
|
@@ -91,9 +179,7 @@ export async function resolveRecheckConfig(input) {
|
|
|
91
179
|
markdoc: validation.markdoc.enabled,
|
|
92
180
|
markdocSchema: validation.markdoc.schema,
|
|
93
181
|
baselinePath: resolveBaselinePath(input.configDir),
|
|
94
|
-
|
|
95
|
-
? apiDescriptions?.rules
|
|
96
|
-
: undefined,
|
|
182
|
+
descriptionRules: overrides.rules,
|
|
97
183
|
},
|
|
98
184
|
};
|
|
99
185
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/config/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAIlC,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/config/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAIlC,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAiCzC,MAAM,CAAC,MAAM,qBAAqB,GAAG,gCAAgC,CAAC;AAEtE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAC7D,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;AAEzD,2EAA2E;AAC3E,iEAAiE;AACjE,SAAS,cAAc,CAAC,KAA8B;IACpD,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACpE,MAAM,YAAY,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAC;IAC1D,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAClD,YAAY,CAAC,IAAI,CAAC;gBAChB,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QACrF,CAAC;IACH,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,UAAU;IACV,SAAS;IACT,MAAM;IACN,aAAa;IACb,MAAM;IACN,OAAO;IACP,WAAW;IACX,UAAU;IACV,YAAY;IACZ,KAAK;IACL,YAAY;CACb,CAAC,CAAC;AAEH,4EAA4E;AAC5E,6EAA6E;AAC7E,4BAA4B;AAC5B,SAAS,yBAAyB,CAChC,KAAuB,EACvB,SAAkB;IAElB,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC5D,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/D,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,iCAAiC,IAAI,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,IAAI,kDAAkD,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3F,SAAS;QACX,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,IAAI,8BAA8B,KAAK,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/E,SAAS;YACX,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,KAAmC,EAAE,CAAC,CAAC;YAC7E,SAAS;QACX,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,IAAI,8CAA8C,EAAE,IAAI,EAAE,CAAC,CAAC;YACvF,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,IAAI,uBAAuB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YACpF,SAAS;QACX,CAAC;QACD,IACE,UAAU,IAAI,KAAK;YACnB,CAAC,CAAC,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EACvE,CAAC;YACD,MAAM,CAAC,IAAI,CAAC;gBACV,OAAO,EAAE,IAAI,IAAI,8BAA8B,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG;gBACxE,IAAI;aACL,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,GAAI,KAAiC,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;AACjD,CAAC;AAED,8EAA8E;AAC9E,mFAAmF;AACnF,SAAS,WAAW,CAAC,UAA8B;IACjD,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,GAAG;QAAE,OAAO,SAAS,CAAC;IACxD,qCAAqC;IACrC,sDAAsD;IACtD,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC;QACzC,CAAC,CAAC,UAAU;aACP,KAAK,CAAC,GAAG,CAAC;aACV,KAAK,CAAC,CAAC,CAAC;aACR,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACjB,OAAO,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,WAAW,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QACjC,CAAC,CAAC,iBAAiB,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAAwB;IACjE,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACrF,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,6BAA6B,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;SACtE,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;QACvB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE;gBACN;oBACE,OAAO,EACL,oKAAoK;oBACtK,IAAI,EAAE,iBAAiB;iBACxB;aACF;SACF,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;QACxB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE;gBACN;oBACE,OAAO,EACL,iHAAiH;oBACnH,IAAI,EAAE,kBAAkB;iBACzB;aACF;SACF,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,mCAAmC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;SAClF,CAAC;IACJ,CAAC;IACD,IAAI,iBAAiB,IAAI,KAAK,EAAE,CAAC;QAC/B,MAAM,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;QAClC,MAAM,MAAM,GAAsB,EAAE,CAAC;QACrC,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC;gBACV,OAAO,EAAE,6CAA6C;gBACtD,IAAI,EAAE,yBAAyB;aAChC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC;YAClF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC;oBACV,OAAO,EAAE,iDAAiD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBAClF,IAAI,EAAE,yBAAyB;iBAChC,CAAC,CAAC;YACL,CAAC;YACD,IAAI,OAAO,IAAI,eAAe,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxE,MAAM,CAAC,IAAI,CAAC;oBACV,OAAO,EAAE,mDAAmD;oBAC5D,IAAI,EAAE,+BAA+B;iBACtC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC3D,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE;QACvD,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;KACjB,CAAC,CAAC;IACH,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACxF,CAAC;IACJ,CAAC;IACD,MAAM,eAAe,GAAG,aAAa,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;IACjG,MAAM,SAAS,GAAG,yBAAyB,CAAC,UAAU,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;IACtF,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;IACtD,CAAC;IACD,OAAO;QACL,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,EAAE;QACV,MAAM,EAAE;YACN,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,OAAO;YACnC,aAAa,EAAE,UAAU,CAAC,OAAO,CAAC,MAAM;YACxC,YAAY,EAAE,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC;YAClD,gBAAgB,EAAE,SAAS,CAAC,KAAK;SAClC;KACF,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,YAAY;AACZ,SAAS,mBAAmB,CAAC,SAAiB;IAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;IACnE,OAAO,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,CAAC"}
|
package/lib/core/baseline.d.ts
CHANGED
|
@@ -31,6 +31,8 @@ export interface CompareOptions {
|
|
|
31
31
|
* seen even if the file was deleted, so they turn stale. Leave unset for `--changed-only`.
|
|
32
32
|
*/
|
|
33
33
|
scanRoots?: string[];
|
|
34
|
+
/** Baseline keys of files this run could not read; their entries are neither matched nor stale. */
|
|
35
|
+
skipFiles?: Set<string>;
|
|
34
36
|
}
|
|
35
37
|
/**
|
|
36
38
|
* Applies the baseline to the problems. Only errors are affected. An entry is checked for
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../../src/core/baseline.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAGjD,sEAAsE;AACtE,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,kBAAkB;IACjC,6EAA6E;IAC7E,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,mFAAmF;IACnF,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,YAAY,EAAE,MAAM,CAAC;CACtB;AAKD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,CA8B/E;AAED,qGAAqG;AACrG,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,YAAY,CAUhG;AAED,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAUhE;AAED,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,uDAAuD;IACvD,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,0EAA0E;IAC1E,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAChC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"baseline.d.ts","sourceRoot":"","sources":["../../src/core/baseline.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAGjD,sEAAsE;AACtE,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,kBAAkB;IACjC,6EAA6E;IAC7E,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,mFAAmF;IACnF,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,YAAY,EAAE,MAAM,CAAC;CACtB;AAKD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,CA8B/E;AAED,qGAAqG;AACrG,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,YAAY,CAUhG;AAED,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAUhE;AAED,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,uDAAuD;IACvD,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,0EAA0E;IAC1E,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAChC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,mGAAmG;IACnG,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACzB;AAOD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,OAAO,EAAE,EACnB,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,cAAc,GACtB,kBAAkB,CA2EpB;AAED,sEAAsE;AACtE,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAE7E"}
|
package/lib/core/baseline.js
CHANGED
|
@@ -84,7 +84,9 @@ export function compareToBaseline(problems, baseline, options) {
|
|
|
84
84
|
errorGroups.set(groupId, group);
|
|
85
85
|
}
|
|
86
86
|
for (const group of errorGroups.values()) {
|
|
87
|
-
const budget =
|
|
87
|
+
const budget = options.skipFiles?.has(group.key)
|
|
88
|
+
? 0
|
|
89
|
+
: (baseline.files[group.key]?.[group.rule] ?? 0);
|
|
88
90
|
const found = group.problems.length;
|
|
89
91
|
if (found <= budget) {
|
|
90
92
|
suppressed += found;
|
|
@@ -105,6 +107,8 @@ export function compareToBaseline(problems, baseline, options) {
|
|
|
105
107
|
const scannedKeys = new Set(options.scannedFiles.map(options.toKey));
|
|
106
108
|
const staleProblems = [];
|
|
107
109
|
for (const [file, rules] of Object.entries(baseline.files)) {
|
|
110
|
+
if (options.skipFiles?.has(file))
|
|
111
|
+
continue;
|
|
108
112
|
const seen = scannedKeys.has(file) || (options.scanRoots ?? []).some((root) => underRoot(file, root));
|
|
109
113
|
if (!seen)
|
|
110
114
|
continue;
|