pm-ops 2026.9.13 → 2026.9.18
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 +29 -17
- package/README.md +100 -6
- package/dist/attestation.d.ts.map +1 -1
- package/dist/attestation.js +13 -23
- package/dist/attestation.js.map +1 -1
- package/dist/duplication.d.ts +75 -0
- package/dist/duplication.d.ts.map +1 -0
- package/dist/duplication.js +196 -0
- package/dist/duplication.js.map +1 -0
- package/dist/eslint.d.ts +41 -0
- package/dist/eslint.d.ts.map +1 -0
- package/dist/eslint.js +125 -0
- package/dist/eslint.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +92 -121
- package/dist/index.js.map +1 -1
- package/dist/invocation-audit.d.ts +33 -0
- package/dist/invocation-audit.d.ts.map +1 -0
- package/dist/invocation-audit.js +47 -0
- package/dist/invocation-audit.js.map +1 -0
- package/dist/merge-driver.d.ts +57 -0
- package/dist/merge-driver.d.ts.map +1 -0
- package/dist/merge-driver.js +122 -0
- package/dist/merge-driver.js.map +1 -0
- package/manifest.json +1 -1
- package/package.json +50 -5
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical TypeScript duplication analysis and fail-closed gate for the fleet.
|
|
3
|
+
*
|
|
4
|
+
* This module uses jscpd's programmatic detector rather than its CLI, keeping
|
|
5
|
+
* consumer launchers small while preserving the detector's clone locations and
|
|
6
|
+
* aggregate percentage for machine-readable callers.
|
|
7
|
+
*/
|
|
8
|
+
import fastGlob from "fast-glob";
|
|
9
|
+
import { createRequire } from "node:module";
|
|
10
|
+
import { readFileSync } from "node:fs";
|
|
11
|
+
import { relative, resolve, sep } from "node:path";
|
|
12
|
+
/** Default TypeScript glob scanned by the duplication gate. */
|
|
13
|
+
export const DEFAULT_DUPLICATION_GLOBS = ["**/*.ts"];
|
|
14
|
+
const defaultRepoRoot = process.cwd();
|
|
15
|
+
const MAX_DUPLICATION_LINES = Number.MAX_SAFE_INTEGER;
|
|
16
|
+
const MAX_DUPLICATION_SIZE = `${Number.MAX_SAFE_INTEGER}b`;
|
|
17
|
+
const DUPLICATION_IGNORES = [
|
|
18
|
+
"**/node_modules/**",
|
|
19
|
+
"**/dist/**",
|
|
20
|
+
"**/dist-test/**",
|
|
21
|
+
"**/coverage/**",
|
|
22
|
+
"**/.git/**",
|
|
23
|
+
"**/*.d.ts",
|
|
24
|
+
];
|
|
25
|
+
const require = createRequire(import.meta.url);
|
|
26
|
+
const jscpd = require("jscpd");
|
|
27
|
+
/** Return whether an unknown JSON value is a record with string keys. */
|
|
28
|
+
function isRecord(value) {
|
|
29
|
+
return typeof value === "object" && value !== null;
|
|
30
|
+
}
|
|
31
|
+
/** Parse and validate the package-level duplication gate contract. */
|
|
32
|
+
function readDuplicationConfig(manifest) {
|
|
33
|
+
if (!isRecord(manifest.duplicationGate))
|
|
34
|
+
return undefined;
|
|
35
|
+
const block = manifest.duplicationGate;
|
|
36
|
+
const threshold = block.threshold;
|
|
37
|
+
const minTokens = block.minTokens;
|
|
38
|
+
if (typeof threshold !== "number" ||
|
|
39
|
+
!Number.isFinite(threshold) ||
|
|
40
|
+
threshold < 0 ||
|
|
41
|
+
threshold > 100)
|
|
42
|
+
return undefined;
|
|
43
|
+
if (minTokens !== undefined &&
|
|
44
|
+
(typeof minTokens !== "number" || !Number.isInteger(minTokens) || minTokens < 1))
|
|
45
|
+
return undefined;
|
|
46
|
+
return { threshold, minTokens: minTokens ?? 50 };
|
|
47
|
+
}
|
|
48
|
+
/** Convert jscpd's source identifier into a stable repository-relative path. */
|
|
49
|
+
function relativeSource(repoRoot, sourceId) {
|
|
50
|
+
return relative(repoRoot, resolve(repoRoot, sourceId)).split(sep).join("/");
|
|
51
|
+
}
|
|
52
|
+
/** Convert one jscpd clone into the public report's line-range shape. */
|
|
53
|
+
function mapClone(repoRoot, clone) {
|
|
54
|
+
return {
|
|
55
|
+
first: {
|
|
56
|
+
file: relativeSource(repoRoot, clone.duplicationA.sourceId),
|
|
57
|
+
startLine: clone.duplicationA.start.line,
|
|
58
|
+
endLine: clone.duplicationA.end.line,
|
|
59
|
+
},
|
|
60
|
+
second: {
|
|
61
|
+
file: relativeSource(repoRoot, clone.duplicationB.sourceId),
|
|
62
|
+
startLine: clone.duplicationB.start.line,
|
|
63
|
+
endLine: clone.duplicationB.end.line,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/** Turn configured glob entries into the one fast-glob pattern jscpd accepts. */
|
|
68
|
+
function combineGlobs(globs) {
|
|
69
|
+
if (globs.length === 0)
|
|
70
|
+
throw new Error("duplication-gate: at least one source glob is required");
|
|
71
|
+
return globs.length === 1 ? globs[0] : `{${globs.join(",")}}`;
|
|
72
|
+
}
|
|
73
|
+
/** Match the files jscpd is expected to analyze with the same scope and ignores. */
|
|
74
|
+
function globMatchedSources(repoRoot, pattern) {
|
|
75
|
+
return fastGlob.sync(pattern, {
|
|
76
|
+
absolute: true,
|
|
77
|
+
cwd: repoRoot,
|
|
78
|
+
dot: true,
|
|
79
|
+
followSymbolicLinks: true,
|
|
80
|
+
ignore: [...DUPLICATION_IGNORES],
|
|
81
|
+
onlyFiles: true,
|
|
82
|
+
})
|
|
83
|
+
.filter((source) => source.endsWith(".ts") && !source.endsWith(".d.ts"))
|
|
84
|
+
.map((source) => relativeSource(repoRoot, source))
|
|
85
|
+
.sort();
|
|
86
|
+
}
|
|
87
|
+
/** Build the bounded jscpd options shared by matching and actual analysis. */
|
|
88
|
+
function duplicationOptions(repoRoot, pattern, minTokens) {
|
|
89
|
+
return {
|
|
90
|
+
path: [repoRoot],
|
|
91
|
+
pattern,
|
|
92
|
+
minTokens,
|
|
93
|
+
minLines: 1,
|
|
94
|
+
maxLines: MAX_DUPLICATION_LINES,
|
|
95
|
+
maxSize: MAX_DUPLICATION_SIZE,
|
|
96
|
+
format: ["typescript"],
|
|
97
|
+
ignore: [...DUPLICATION_IGNORES],
|
|
98
|
+
absolute: true,
|
|
99
|
+
gitignore: false,
|
|
100
|
+
reporters: [],
|
|
101
|
+
silent: true,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/** Return the fail-closed diagnostic for an empty or partially analyzed scope. */
|
|
105
|
+
export function duplicationGateDiagnostic(report) {
|
|
106
|
+
if (report.sources === 0)
|
|
107
|
+
return "duplication-gate: no TypeScript sources were analyzed for the configured glob scope.";
|
|
108
|
+
if (report.skippedSources.length > 0) {
|
|
109
|
+
return `duplication-gate: jscpd skipped ${report.skippedSources.length} in-scope file(s):\n`
|
|
110
|
+
+ report.skippedSources.map((source) => ` ${source}`).join("\n");
|
|
111
|
+
}
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Analyze a repository's TypeScript sources with jscpd's programmatic API.
|
|
116
|
+
*
|
|
117
|
+
* @param options - Repository root and optional source globs.
|
|
118
|
+
* @returns Aggregate percentage and every clone pair found by jscpd.
|
|
119
|
+
*/
|
|
120
|
+
export async function analyzeDuplication(options = {}) {
|
|
121
|
+
const repoRoot = options.repoRoot ?? defaultRepoRoot;
|
|
122
|
+
const pattern = combineGlobs(options.globs ?? DEFAULT_DUPLICATION_GLOBS);
|
|
123
|
+
const minTokens = options.minTokens ?? 50;
|
|
124
|
+
const result = await jscpd.detectClonesAndStatistic(duplicationOptions(repoRoot, pattern, minTokens));
|
|
125
|
+
const matchedSources = globMatchedSources(repoRoot, pattern);
|
|
126
|
+
const analyzedSources = Object.keys(result.statistic.formats.typescript?.sources ?? {})
|
|
127
|
+
.map((source) => relativeSource(repoRoot, source))
|
|
128
|
+
.sort();
|
|
129
|
+
const analyzed = new Set(analyzedSources);
|
|
130
|
+
return {
|
|
131
|
+
percentage: result.statistic.total.percentage,
|
|
132
|
+
totalLines: result.statistic.total.lines,
|
|
133
|
+
duplicatedLines: result.statistic.total.duplicatedLines,
|
|
134
|
+
sources: result.statistic.total.sources,
|
|
135
|
+
skippedSources: matchedSources.filter((source) => !analyzed.has(source)),
|
|
136
|
+
cloneCount: result.clones.length,
|
|
137
|
+
clones: result.clones.map((clone) => mapClone(repoRoot, clone)),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Run the configured duplication threshold gate and print every clone pair.
|
|
142
|
+
*
|
|
143
|
+
* A missing or malformed `duplicationGate` block fails closed with a
|
|
144
|
+
* remediation message. The default minimum token count is 50, matching jscpd.
|
|
145
|
+
*
|
|
146
|
+
* @param options - Repository, glob, logging, and process boundaries.
|
|
147
|
+
*/
|
|
148
|
+
export async function runDuplicationGate(options = {}) {
|
|
149
|
+
const repoRoot = options.repoRoot ?? defaultRepoRoot;
|
|
150
|
+
const log = options.log ?? console.log;
|
|
151
|
+
const error = options.error ?? console.error;
|
|
152
|
+
const exit = options.exit ?? process.exit;
|
|
153
|
+
let manifest;
|
|
154
|
+
try {
|
|
155
|
+
manifest = JSON.parse(readFileSync(resolve(repoRoot, "package.json"), "utf8"));
|
|
156
|
+
}
|
|
157
|
+
catch (cause) {
|
|
158
|
+
error(`duplication-gate: could not read package.json: ${String(cause)}`);
|
|
159
|
+
return exit(1);
|
|
160
|
+
}
|
|
161
|
+
if (!isRecord(manifest) || !("duplicationGate" in manifest)) {
|
|
162
|
+
error("duplication-gate: package.json has no `duplicationGate` block; add { \"threshold\": <percent>, \"minTokens\": <n> }.");
|
|
163
|
+
return exit(1);
|
|
164
|
+
}
|
|
165
|
+
const config = readDuplicationConfig(manifest);
|
|
166
|
+
if (config === undefined) {
|
|
167
|
+
error("duplication-gate: invalid `duplicationGate`; threshold must be a number from 0 to 100 and minTokens must be a positive integer.");
|
|
168
|
+
return exit(1);
|
|
169
|
+
}
|
|
170
|
+
let report;
|
|
171
|
+
try {
|
|
172
|
+
report = await analyzeDuplication({
|
|
173
|
+
repoRoot,
|
|
174
|
+
globs: options.globs,
|
|
175
|
+
minTokens: config.minTokens,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
catch (cause) {
|
|
179
|
+
error(`duplication-gate: jscpd analysis failed: ${String(cause)}`);
|
|
180
|
+
return exit(1);
|
|
181
|
+
}
|
|
182
|
+
log(`duplication-gate: ${report.percentage}% duplicated lines (${report.duplicatedLines}/${report.totalLines}), ${report.sources} source(s), ${report.cloneCount} clone pair(s), threshold ${config.threshold}%`);
|
|
183
|
+
const scopeDiagnostic = duplicationGateDiagnostic(report);
|
|
184
|
+
if (scopeDiagnostic) {
|
|
185
|
+
error(scopeDiagnostic);
|
|
186
|
+
return exit(1);
|
|
187
|
+
}
|
|
188
|
+
for (const clone of report.clones) {
|
|
189
|
+
log(` ${clone.first.file}:${clone.first.startLine}-${clone.first.endLine} <-> ${clone.second.file}:${clone.second.startLine}-${clone.second.endLine}`);
|
|
190
|
+
}
|
|
191
|
+
if (report.percentage > config.threshold) {
|
|
192
|
+
error(`duplication-gate: ${report.percentage}% exceeds the configured ${config.threshold}% threshold; remove the reported clone pairs or document a justified threshold change in package.json.`);
|
|
193
|
+
return exit(1);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=duplication.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplication.js","sourceRoot":"","sources":["../duplication.ts"],"names":[],"mappings":"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"}
|
package/dist/eslint.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical strict flat configuration for every fleet TypeScript repository.
|
|
3
|
+
*
|
|
4
|
+
* Babel supplies the ESLint parser because typescript-eslint rejects the
|
|
5
|
+
* TypeScript 7 compiler peer range used by part of the fleet. TypeScript stays
|
|
6
|
+
* the authoritative compiler; Babel only supplies ESLint's ESTree syntax tree.
|
|
7
|
+
*/
|
|
8
|
+
import type { Linter } from "eslint";
|
|
9
|
+
/** Inputs for constructing a reusable flat policy in a consumer package. */
|
|
10
|
+
export interface FleetEslintConfigOptions {
|
|
11
|
+
/** Additional repository-relative ignore globs appended to the fleet defaults. */
|
|
12
|
+
readonly ignores?: readonly string[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Build the fleet's strict, TypeScript-aware ESLint flat configuration.
|
|
16
|
+
*
|
|
17
|
+
* The returned array is intentionally a fresh flat-config value, so a
|
|
18
|
+
* consumer can append its own project-specific config without mutating the
|
|
19
|
+
* canonical policy or another ESLint invocation.
|
|
20
|
+
*
|
|
21
|
+
* @param options - Optional additional ignore globs for generated files.
|
|
22
|
+
* @returns ESLint flat-config entries ready for `ESLint` or `eslint`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function fleetEslintConfig(options?: FleetEslintConfigOptions): Linter.Config[];
|
|
25
|
+
/** Inputs for the canonical lint launcher. */
|
|
26
|
+
export interface RunLintGateOptions {
|
|
27
|
+
/** Directory ESLint treats as the project root. */
|
|
28
|
+
readonly cwd?: string;
|
|
29
|
+
/** Files or directories to lint; defaults to the current project. */
|
|
30
|
+
readonly files?: readonly string[];
|
|
31
|
+
/** Additional repository-relative ignore globs. */
|
|
32
|
+
readonly ignores?: readonly string[];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Run the canonical lint policy, print stylish diagnostics, and return a status.
|
|
36
|
+
*
|
|
37
|
+
* @param options - Optional project root, lint paths, and additional ignores.
|
|
38
|
+
* @returns `0` for a clean result and `1` when ESLint reports findings.
|
|
39
|
+
*/
|
|
40
|
+
export declare function runLintGate(options?: RunLintGateOptions): Promise<number>;
|
|
41
|
+
//# sourceMappingURL=eslint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eslint.d.ts","sourceRoot":"","sources":["../eslint.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,4EAA4E;AAC5E,MAAM,WAAW,wBAAwB;IACvC,kFAAkF;IAClF,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AA6DD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,wBAA6B,GACrC,MAAM,CAAC,MAAM,EAAE,CA4BjB;AAED,8CAA8C;AAC9C,MAAM,WAAW,kBAAkB;IACjC,mDAAmD;IACnD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,mDAAmD;IACnD,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAWnF"}
|
package/dist/eslint.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical strict flat configuration for every fleet TypeScript repository.
|
|
3
|
+
*
|
|
4
|
+
* Babel supplies the ESLint parser because typescript-eslint rejects the
|
|
5
|
+
* TypeScript 7 compiler peer range used by part of the fleet. TypeScript stays
|
|
6
|
+
* the authoritative compiler; Babel only supplies ESLint's ESTree syntax tree.
|
|
7
|
+
*/
|
|
8
|
+
import babelParser from "@babel/eslint-parser";
|
|
9
|
+
import { ESLint } from "eslint";
|
|
10
|
+
import { defineConfig } from "eslint/config";
|
|
11
|
+
const forbiddenSyntax = [
|
|
12
|
+
{ selector: "TSAnyKeyword", message: "Use a precise type instead of explicit any." },
|
|
13
|
+
{ selector: "ImportExpression", message: "Dynamic imports are forbidden; use a top-level import." },
|
|
14
|
+
{ selector: "TSImportType", message: "Inline type imports are forbidden; use a top-level type import." },
|
|
15
|
+
{ selector: "TSParameterProperty", message: "Parameter properties require non-erasable emit." },
|
|
16
|
+
{ selector: "TSEnumDeclaration", message: "Enums require non-erasable emit; use literal unions." },
|
|
17
|
+
{ selector: "TSModuleDeclaration", message: "Namespaces and TypeScript modules are forbidden." },
|
|
18
|
+
{ selector: "TSImportEqualsDeclaration", message: "Import-equals syntax is forbidden." },
|
|
19
|
+
{ selector: "TSExportAssignment", message: "Export-equals syntax is forbidden." },
|
|
20
|
+
];
|
|
21
|
+
const defaultIgnores = [
|
|
22
|
+
".agents/**",
|
|
23
|
+
"coverage/**",
|
|
24
|
+
"dist/**",
|
|
25
|
+
"dist-test/**",
|
|
26
|
+
"node_modules/**",
|
|
27
|
+
];
|
|
28
|
+
const rules = {
|
|
29
|
+
"constructor-super": "error",
|
|
30
|
+
"eqeqeq": ["error", "always"],
|
|
31
|
+
"no-array-constructor": "error",
|
|
32
|
+
"no-async-promise-executor": "error",
|
|
33
|
+
"no-constant-binary-expression": "error",
|
|
34
|
+
"no-constructor-return": "error",
|
|
35
|
+
"no-debugger": "error",
|
|
36
|
+
"no-dupe-args": "error",
|
|
37
|
+
"no-dupe-class-members": "error",
|
|
38
|
+
"no-dupe-else-if": "error",
|
|
39
|
+
"no-duplicate-imports": ["error", { allowSeparateTypeImports: true }],
|
|
40
|
+
"no-fallthrough": "error",
|
|
41
|
+
"no-import-assign": "error",
|
|
42
|
+
"no-new-native-nonconstructor": "error",
|
|
43
|
+
"no-promise-executor-return": "error",
|
|
44
|
+
"no-restricted-syntax": ["error", ...forbiddenSyntax],
|
|
45
|
+
"no-self-assign": "error",
|
|
46
|
+
"no-setter-return": "error",
|
|
47
|
+
"no-shadow-restricted-names": "error",
|
|
48
|
+
"no-sparse-arrays": "error",
|
|
49
|
+
"no-unexpected-multiline": "error",
|
|
50
|
+
"no-unmodified-loop-condition": "error",
|
|
51
|
+
"no-unreachable": "error",
|
|
52
|
+
"no-unreachable-loop": "error",
|
|
53
|
+
"no-unsafe-finally": "error",
|
|
54
|
+
"no-unsafe-negation": "error",
|
|
55
|
+
"no-unsafe-optional-chaining": "error",
|
|
56
|
+
"no-unused-private-class-members": "error",
|
|
57
|
+
"no-useless-backreference": "error",
|
|
58
|
+
"no-useless-catch": "error",
|
|
59
|
+
"no-useless-escape": "error",
|
|
60
|
+
"no-var": "error",
|
|
61
|
+
"prefer-const": "error",
|
|
62
|
+
"prefer-object-has-own": "error",
|
|
63
|
+
"require-atomic-updates": "error",
|
|
64
|
+
"use-isnan": "error",
|
|
65
|
+
"valid-typeof": "error",
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Build the fleet's strict, TypeScript-aware ESLint flat configuration.
|
|
69
|
+
*
|
|
70
|
+
* The returned array is intentionally a fresh flat-config value, so a
|
|
71
|
+
* consumer can append its own project-specific config without mutating the
|
|
72
|
+
* canonical policy or another ESLint invocation.
|
|
73
|
+
*
|
|
74
|
+
* @param options - Optional additional ignore globs for generated files.
|
|
75
|
+
* @returns ESLint flat-config entries ready for `ESLint` or `eslint`.
|
|
76
|
+
*/
|
|
77
|
+
export function fleetEslintConfig(options = {}) {
|
|
78
|
+
return defineConfig([
|
|
79
|
+
{
|
|
80
|
+
ignores: [...defaultIgnores, ...(options.ignores ?? [])],
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
files: ["**/*.ts"],
|
|
84
|
+
languageOptions: {
|
|
85
|
+
ecmaVersion: "latest",
|
|
86
|
+
sourceType: "module",
|
|
87
|
+
parser: babelParser,
|
|
88
|
+
parserOptions: {
|
|
89
|
+
requireConfigFile: false,
|
|
90
|
+
babelOptions: {
|
|
91
|
+
babelrc: false,
|
|
92
|
+
configFile: false,
|
|
93
|
+
parserOpts: {
|
|
94
|
+
plugins: [["typescript", { disallowAmbiguousJSXLike: true }]],
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
linterOptions: {
|
|
100
|
+
reportUnusedDisableDirectives: "error",
|
|
101
|
+
},
|
|
102
|
+
rules,
|
|
103
|
+
},
|
|
104
|
+
]);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Run the canonical lint policy, print stylish diagnostics, and return a status.
|
|
108
|
+
*
|
|
109
|
+
* @param options - Optional project root, lint paths, and additional ignores.
|
|
110
|
+
* @returns `0` for a clean result and `1` when ESLint reports findings.
|
|
111
|
+
*/
|
|
112
|
+
export async function runLintGate(options = {}) {
|
|
113
|
+
const eslint = new ESLint({
|
|
114
|
+
cwd: options.cwd,
|
|
115
|
+
overrideConfigFile: true,
|
|
116
|
+
overrideConfig: fleetEslintConfig({ ignores: options.ignores }),
|
|
117
|
+
});
|
|
118
|
+
const results = await eslint.lintFiles([...(options.files ?? ["."])]);
|
|
119
|
+
const formatter = await eslint.loadFormatter("stylish");
|
|
120
|
+
const output = formatter.format(results);
|
|
121
|
+
if (output)
|
|
122
|
+
console.error(output);
|
|
123
|
+
return results.some(({ errorCount, warningCount }) => errorCount + warningCount > 0) ? 1 : 0;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=eslint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eslint.js","sourceRoot":"","sources":["../eslint.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAA0C,MAAM,iCAAiC,CAAC;AAY5G,OAAO,EAKL,KAAK,oBAAoB,EACzB,KAAK,mCAAmC,EACxC,KAAK,qBAAqB,EAC3B,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|