skuba 9.0.0-renovate-eslint-9.x-20240811012135 → 9.0.0-renovate-eslint-9.x-20240811034714

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.
@@ -57,10 +57,21 @@ const runESLint = async (mode, logger, overrideConfigFile) => {
57
57
  });
58
58
  logger.debug("Processing files...");
59
59
  const start = process.hrtime.bigint();
60
- const [formatter, results] = await Promise.all([
60
+ const [formatter, { type, results }] = await Promise.all([
61
61
  engine.loadFormatter(),
62
- engine.lintFiles([])
62
+ engine.lintFiles([]).then((r) => ({ type: "results", results: r })).catch((error) => {
63
+ if (error instanceof Error && error.message === "Could not find config file.") {
64
+ return { type: "no-config", results: void 0 };
65
+ }
66
+ throw error;
67
+ })
63
68
  ]);
69
+ if (type === "no-config") {
70
+ logger.plain(
71
+ "skuba could not find an eslint config file. Do you need to run format or configure?"
72
+ );
73
+ return { ok: false, fixable: false, errors: [], warnings: [], output: "" };
74
+ }
64
75
  const end = process.hrtime.bigint();
65
76
  logger.plain(
66
77
  `Processed ${(0, import_logging.pluralise)(results.length, "file")} in ${logger.timing(
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cli/adapter/eslint.ts"],
4
- "sourcesContent": ["import path from 'path';\n\nimport chalk from 'chalk';\nimport { type ESLint, type Linter, loadESLint } from 'eslint';\n\nimport { type Logger, pluralise } from '../../utils/logging';\n\nconst symbolForResult = (result: ESLint.LintResult) => {\n if (result.errorCount) {\n return chalk.red('\u25CB');\n }\n\n return result.warningCount ? chalk.yellow('\u25CD') : chalk.green('\u25CB');\n};\n\nexport interface ESLintResult {\n messages: Linter.LintMessage[];\n filePath: string;\n}\n\nexport interface ESLintOutput {\n errors: ESLintResult[];\n fixable: boolean;\n ok: boolean;\n output: string;\n warnings: ESLintResult[];\n}\n\nexport const runESLint = async (\n mode: 'format' | 'lint',\n logger: Logger,\n overrideConfigFile?: string,\n): Promise<ESLintOutput> => {\n logger.debug('Initialising ESLint...');\n\n const cwd = process.cwd();\n\n const ESLint = await loadESLint({ useFlatConfig: true });\n const engine = new ESLint({\n cache: true,\n fix: mode === 'format',\n overrideConfigFile,\n overrideConfig: {\n linterOptions: {\n reportUnusedDisableDirectives: true,\n },\n },\n });\n\n logger.debug('Processing files...');\n\n const start = process.hrtime.bigint();\n\n const [formatter, results] = await Promise.all([\n engine.loadFormatter(),\n engine.lintFiles([]),\n ]);\n\n const end = process.hrtime.bigint();\n\n logger.plain(\n `Processed ${pluralise(results.length, 'file')} in ${logger.timing(\n start,\n end,\n )}.`,\n );\n\n const errors: ESLintResult[] = [];\n const warnings: ESLintResult[] = [];\n let fixable = false;\n\n for (const result of results) {\n const relativePath = path.relative(cwd, result.filePath);\n if (result.fixableErrorCount + result.fixableWarningCount) {\n fixable = true;\n }\n\n if (result.errorCount) {\n errors.push({\n filePath: relativePath,\n messages: result.messages,\n });\n }\n\n if (result.warningCount) {\n warnings.push({\n filePath: relativePath,\n messages: result.messages,\n });\n }\n\n logger.debug(symbolForResult(result), relativePath);\n }\n\n const ok = errors.length === 0;\n\n await ESLint.outputFixes(results);\n\n const output = await formatter.format(results, {\n cwd,\n rulesMeta: engine.getRulesMetaForResults(results),\n });\n\n if (output) {\n logger.plain(output);\n }\n\n return { errors, fixable, ok, output, warnings };\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiB;AAEjB,mBAAkB;AAClB,oBAAqD;AAErD,qBAAuC;AAEvC,MAAM,kBAAkB,CAAC,WAA8B;AACrD,MAAI,OAAO,YAAY;AACrB,WAAO,aAAAA,QAAM,IAAI,QAAG;AAAA,EACtB;AAEA,SAAO,OAAO,eAAe,aAAAA,QAAM,OAAO,QAAG,IAAI,aAAAA,QAAM,MAAM,QAAG;AAClE;AAeO,MAAM,YAAY,OACvB,MACA,QACA,uBAC0B;AAC1B,SAAO,MAAM,wBAAwB;AAErC,QAAM,MAAM,QAAQ,IAAI;AAExB,QAAM,SAAS,UAAM,0BAAW,EAAE,eAAe,KAAK,CAAC;AACvD,QAAM,SAAS,IAAI,OAAO;AAAA,IACxB,OAAO;AAAA,IACP,KAAK,SAAS;AAAA,IACd;AAAA,IACA,gBAAgB;AAAA,MACd,eAAe;AAAA,QACb,+BAA+B;AAAA,MACjC;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO,MAAM,qBAAqB;AAElC,QAAM,QAAQ,QAAQ,OAAO,OAAO;AAEpC,QAAM,CAAC,WAAW,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC7C,OAAO,cAAc;AAAA,IACrB,OAAO,UAAU,CAAC,CAAC;AAAA,EACrB,CAAC;AAED,QAAM,MAAM,QAAQ,OAAO,OAAO;AAElC,SAAO;AAAA,IACL,iBAAa,0BAAU,QAAQ,QAAQ,MAAM,CAAC,OAAO,OAAO;AAAA,MAC1D;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,SAAyB,CAAC;AAChC,QAAM,WAA2B,CAAC;AAClC,MAAI,UAAU;AAEd,aAAW,UAAU,SAAS;AAC5B,UAAM,eAAe,YAAAC,QAAK,SAAS,KAAK,OAAO,QAAQ;AACvD,QAAI,OAAO,oBAAoB,OAAO,qBAAqB;AACzD,gBAAU;AAAA,IACZ;AAEA,QAAI,OAAO,YAAY;AACrB,aAAO,KAAK;AAAA,QACV,UAAU;AAAA,QACV,UAAU,OAAO;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,QAAI,OAAO,cAAc;AACvB,eAAS,KAAK;AAAA,QACZ,UAAU;AAAA,QACV,UAAU,OAAO;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,WAAO,MAAM,gBAAgB,MAAM,GAAG,YAAY;AAAA,EACpD;AAEA,QAAM,KAAK,OAAO,WAAW;AAE7B,QAAM,OAAO,YAAY,OAAO;AAEhC,QAAM,SAAS,MAAM,UAAU,OAAO,SAAS;AAAA,IAC7C;AAAA,IACA,WAAW,OAAO,uBAAuB,OAAO;AAAA,EAClD,CAAC;AAED,MAAI,QAAQ;AACV,WAAO,MAAM,MAAM;AAAA,EACrB;AAEA,SAAO,EAAE,QAAQ,SAAS,IAAI,QAAQ,SAAS;AACjD;",
4
+ "sourcesContent": ["import path from 'path';\n\nimport chalk from 'chalk';\nimport { type ESLint, type Linter, loadESLint } from 'eslint';\n\nimport { type Logger, pluralise } from '../../utils/logging';\n\nconst symbolForResult = (result: ESLint.LintResult) => {\n if (result.errorCount) {\n return chalk.red('\u25CB');\n }\n\n return result.warningCount ? chalk.yellow('\u25CD') : chalk.green('\u25CB');\n};\n\nexport interface ESLintResult {\n messages: Linter.LintMessage[];\n filePath: string;\n}\n\nexport interface ESLintOutput {\n errors: ESLintResult[];\n fixable: boolean;\n ok: boolean;\n output: string;\n warnings: ESLintResult[];\n}\n\nexport const runESLint = async (\n mode: 'format' | 'lint',\n logger: Logger,\n overrideConfigFile?: string,\n): Promise<ESLintOutput> => {\n logger.debug('Initialising ESLint...');\n\n const cwd = process.cwd();\n\n const ESLint = await loadESLint({ useFlatConfig: true });\n const engine = new ESLint({\n cache: true,\n fix: mode === 'format',\n overrideConfigFile,\n overrideConfig: {\n linterOptions: {\n reportUnusedDisableDirectives: true,\n },\n },\n });\n\n logger.debug('Processing files...');\n\n const start = process.hrtime.bigint();\n\n const [formatter, { type, results }] = await Promise.all([\n engine.loadFormatter(),\n engine\n .lintFiles([])\n .then((r) => ({ type: 'results', results: r }) as const)\n .catch((error) => {\n if (\n error instanceof Error &&\n error.message === 'Could not find config file.'\n ) {\n return { type: 'no-config', results: undefined } as const;\n }\n throw error;\n }),\n ]);\n\n if (type === 'no-config') {\n logger.plain(\n 'skuba could not find an eslint config file. Do you need to run format or configure?',\n );\n return { ok: false, fixable: false, errors: [], warnings: [], output: '' };\n }\n\n const end = process.hrtime.bigint();\n\n logger.plain(\n `Processed ${pluralise(results.length, 'file')} in ${logger.timing(\n start,\n end,\n )}.`,\n );\n\n const errors: ESLintResult[] = [];\n const warnings: ESLintResult[] = [];\n let fixable = false;\n\n for (const result of results) {\n const relativePath = path.relative(cwd, result.filePath);\n if (result.fixableErrorCount + result.fixableWarningCount) {\n fixable = true;\n }\n\n if (result.errorCount) {\n errors.push({\n filePath: relativePath,\n messages: result.messages,\n });\n }\n\n if (result.warningCount) {\n warnings.push({\n filePath: relativePath,\n messages: result.messages,\n });\n }\n\n logger.debug(symbolForResult(result), relativePath);\n }\n\n const ok = errors.length === 0;\n\n await ESLint.outputFixes(results);\n\n const output = await formatter.format(results, {\n cwd,\n rulesMeta: engine.getRulesMetaForResults(results),\n });\n\n if (output) {\n logger.plain(output);\n }\n\n return { errors, fixable, ok, output, warnings };\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiB;AAEjB,mBAAkB;AAClB,oBAAqD;AAErD,qBAAuC;AAEvC,MAAM,kBAAkB,CAAC,WAA8B;AACrD,MAAI,OAAO,YAAY;AACrB,WAAO,aAAAA,QAAM,IAAI,QAAG;AAAA,EACtB;AAEA,SAAO,OAAO,eAAe,aAAAA,QAAM,OAAO,QAAG,IAAI,aAAAA,QAAM,MAAM,QAAG;AAClE;AAeO,MAAM,YAAY,OACvB,MACA,QACA,uBAC0B;AAC1B,SAAO,MAAM,wBAAwB;AAErC,QAAM,MAAM,QAAQ,IAAI;AAExB,QAAM,SAAS,UAAM,0BAAW,EAAE,eAAe,KAAK,CAAC;AACvD,QAAM,SAAS,IAAI,OAAO;AAAA,IACxB,OAAO;AAAA,IACP,KAAK,SAAS;AAAA,IACd;AAAA,IACA,gBAAgB;AAAA,MACd,eAAe;AAAA,QACb,+BAA+B;AAAA,MACjC;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO,MAAM,qBAAqB;AAElC,QAAM,QAAQ,QAAQ,OAAO,OAAO;AAEpC,QAAM,CAAC,WAAW,EAAE,MAAM,QAAQ,CAAC,IAAI,MAAM,QAAQ,IAAI;AAAA,IACvD,OAAO,cAAc;AAAA,IACrB,OACG,UAAU,CAAC,CAAC,EACZ,KAAK,CAAC,OAAO,EAAE,MAAM,WAAW,SAAS,EAAE,EAAW,EACtD,MAAM,CAAC,UAAU;AAChB,UACE,iBAAiB,SACjB,MAAM,YAAY,+BAClB;AACA,eAAO,EAAE,MAAM,aAAa,SAAS,OAAU;AAAA,MACjD;AACA,YAAM;AAAA,IACR,CAAC;AAAA,EACL,CAAC;AAED,MAAI,SAAS,aAAa;AACxB,WAAO;AAAA,MACL;AAAA,IACF;AACA,WAAO,EAAE,IAAI,OAAO,SAAS,OAAO,QAAQ,CAAC,GAAG,UAAU,CAAC,GAAG,QAAQ,GAAG;AAAA,EAC3E;AAEA,QAAM,MAAM,QAAQ,OAAO,OAAO;AAElC,SAAO;AAAA,IACL,iBAAa,0BAAU,QAAQ,QAAQ,MAAM,CAAC,OAAO,OAAO;AAAA,MAC1D;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,SAAyB,CAAC;AAChC,QAAM,WAA2B,CAAC;AAClC,MAAI,UAAU;AAEd,aAAW,UAAU,SAAS;AAC5B,UAAM,eAAe,YAAAC,QAAK,SAAS,KAAK,OAAO,QAAQ;AACvD,QAAI,OAAO,oBAAoB,OAAO,qBAAqB;AACzD,gBAAU;AAAA,IACZ;AAEA,QAAI,OAAO,YAAY;AACrB,aAAO,KAAK;AAAA,QACV,UAAU;AAAA,QACV,UAAU,OAAO;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,QAAI,OAAO,cAAc;AACvB,eAAS,KAAK;AAAA,QACZ,UAAU;AAAA,QACV,UAAU,OAAO;AAAA,MACnB,CAAC;AAAA,IACH;AAEA,WAAO,MAAM,gBAAgB,MAAM,GAAG,YAAY;AAAA,EACpD;AAEA,QAAM,KAAK,OAAO,WAAW;AAE7B,QAAM,OAAO,YAAY,OAAO;AAEhC,QAAM,SAAS,MAAM,UAAU,OAAO,SAAS;AAAA,IAC7C;AAAA,IACA,WAAW,OAAO,uBAAuB,OAAO;AAAA,EAClD,CAAC;AAED,MAAI,QAAQ;AACV,WAAO,MAAM,MAAM;AAAA,EACrB;AAEA,SAAO,EAAE,QAAQ,SAAS,IAAI,QAAQ,SAAS;AACjD;",
6
6
  "names": ["chalk", "path"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ import type { PatchFunction } from '../..';
2
+ export declare const tryCollapseDuplicateMergeKeys: PatchFunction;
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var collapseDuplicateMergeKeys_exports = {};
30
+ __export(collapseDuplicateMergeKeys_exports, {
31
+ tryCollapseDuplicateMergeKeys: () => tryCollapseDuplicateMergeKeys
32
+ });
33
+ module.exports = __toCommonJS(collapseDuplicateMergeKeys_exports);
34
+ var import_util = require("util");
35
+ var import_fast_glob = __toESM(require("fast-glob"));
36
+ var import_fs_extra = require("fs-extra");
37
+ var import_logging = require("../../../../../../utils/logging");
38
+ const collapseDuplicateMergeKeys = async ({
39
+ mode
40
+ }) => {
41
+ const buildkiteFiles = await (0, import_fast_glob.default)([".buildkite/**/*"], { onlyFiles: true });
42
+ if (buildkiteFiles.length === 0) {
43
+ return { result: "skip", reason: "no Buildkite files found" };
44
+ }
45
+ const input = await Promise.all(
46
+ buildkiteFiles.map((name) => (0, import_fs_extra.readFile)(name, "utf-8"))
47
+ );
48
+ const replaced = await Promise.all(
49
+ input.map(collapseDuplicateMergeKeysInFile)
50
+ );
51
+ if (replaced.every((r, i) => r === input[i])) {
52
+ return { result: "skip" };
53
+ }
54
+ if (mode === "lint") {
55
+ return { result: "apply" };
56
+ }
57
+ await Promise.all(
58
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
59
+ buildkiteFiles.map((name, i) => (0, import_fs_extra.writeFile)(name, replaced[i]))
60
+ );
61
+ return { result: "apply" };
62
+ };
63
+ const collapseDuplicateMergeKeysInFile = (input) => replaceAllUntilStable(
64
+ input,
65
+ /^([ \-]*)<<: \[?(\*[^\n\]]+)\]?$\n^( *)<<: \[?(\*[^\n\]]+)\]?$/gm,
66
+ (match, a, b, c, d) => {
67
+ if (a.length === c.length) {
68
+ return `${a}<<: [${b}, ${d}]`;
69
+ }
70
+ return match;
71
+ }
72
+ );
73
+ const replaceAllUntilStable = (input, searchValue, replacer) => {
74
+ let output = input;
75
+ let previousOutput;
76
+ do {
77
+ previousOutput = output;
78
+ output = output.replace(searchValue, replacer);
79
+ } while (output !== previousOutput);
80
+ return output;
81
+ };
82
+ const tryCollapseDuplicateMergeKeys = async (config) => {
83
+ try {
84
+ return await collapseDuplicateMergeKeys(config);
85
+ } catch (err) {
86
+ import_logging.log.warn("Failed to collapse duplicate merge keys.");
87
+ import_logging.log.subtle((0, import_util.inspect)(err));
88
+ return { result: "skip", reason: "due to an error" };
89
+ }
90
+ };
91
+ // Annotate the CommonJS export names for ESM import in node:
92
+ 0 && (module.exports = {
93
+ tryCollapseDuplicateMergeKeys
94
+ });
95
+ //# sourceMappingURL=collapseDuplicateMergeKeys.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/cli/lint/internalLints/upgrade/patches/8.2.1/collapseDuplicateMergeKeys.ts"],
4
+ "sourcesContent": ["import { inspect } from 'util';\n\nimport fg from 'fast-glob';\nimport { readFile, writeFile } from 'fs-extra';\n\nimport type { PatchFunction, PatchReturnType } from '../..';\nimport { log } from '../../../../../../utils/logging';\n\nconst collapseDuplicateMergeKeys: PatchFunction = async ({\n mode,\n}): Promise<PatchReturnType> => {\n const buildkiteFiles = await fg(['.buildkite/**/*'], { onlyFiles: true });\n\n if (buildkiteFiles.length === 0) {\n return { result: 'skip', reason: 'no Buildkite files found' };\n }\n\n const input = await Promise.all(\n buildkiteFiles.map((name) => readFile(name, 'utf-8')),\n );\n\n const replaced = await Promise.all(\n input.map(collapseDuplicateMergeKeysInFile),\n );\n\n if (replaced.every((r, i) => r === input[i])) {\n return { result: 'skip' };\n }\n\n if (mode === 'lint') {\n return { result: 'apply' };\n }\n\n await Promise.all(\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n buildkiteFiles.map((name, i) => writeFile(name, replaced[i]!)),\n );\n\n return { result: 'apply' };\n};\n\nconst collapseDuplicateMergeKeysInFile = (input: string) =>\n replaceAllUntilStable(\n input,\n /^([ \\-]*)<<: \\[?(\\*[^\\n\\]]+)\\]?$\\n^( *)<<: \\[?(\\*[^\\n\\]]+)\\]?$/gm,\n (match, a, b, c, d) => {\n if (a.length === c.length) {\n return `${a}<<: [${b}, ${d}]`;\n }\n return match;\n },\n );\n\nconst replaceAllUntilStable = (\n input: string,\n searchValue: RegExp,\n replacer: (substring: string, ...args: string[]) => string,\n): string => {\n let output = input;\n let previousOutput;\n\n do {\n previousOutput = output;\n output = output.replace(searchValue, replacer);\n } while (output !== previousOutput);\n\n return output;\n};\n\nexport const tryCollapseDuplicateMergeKeys: PatchFunction = async (config) => {\n try {\n return await collapseDuplicateMergeKeys(config);\n } catch (err) {\n log.warn('Failed to collapse duplicate merge keys.');\n log.subtle(inspect(err));\n return { result: 'skip', reason: 'due to an error' };\n }\n};\n\n// TODO: write some tests\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAwB;AAExB,uBAAe;AACf,sBAAoC;AAGpC,qBAAoB;AAEpB,MAAM,6BAA4C,OAAO;AAAA,EACvD;AACF,MAAgC;AAC9B,QAAM,iBAAiB,UAAM,iBAAAA,SAAG,CAAC,iBAAiB,GAAG,EAAE,WAAW,KAAK,CAAC;AAExE,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAO,EAAE,QAAQ,QAAQ,QAAQ,2BAA2B;AAAA,EAC9D;AAEA,QAAM,QAAQ,MAAM,QAAQ;AAAA,IAC1B,eAAe,IAAI,CAAC,aAAS,0BAAS,MAAM,OAAO,CAAC;AAAA,EACtD;AAEA,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,MAAM,IAAI,gCAAgC;AAAA,EAC5C;AAEA,MAAI,SAAS,MAAM,CAAC,GAAG,MAAM,MAAM,MAAM,CAAC,CAAC,GAAG;AAC5C,WAAO,EAAE,QAAQ,OAAO;AAAA,EAC1B;AAEA,MAAI,SAAS,QAAQ;AACnB,WAAO,EAAE,QAAQ,QAAQ;AAAA,EAC3B;AAEA,QAAM,QAAQ;AAAA;AAAA,IAEZ,eAAe,IAAI,CAAC,MAAM,UAAM,2BAAU,MAAM,SAAS,CAAC,CAAE,CAAC;AAAA,EAC/D;AAEA,SAAO,EAAE,QAAQ,QAAQ;AAC3B;AAEA,MAAM,mCAAmC,CAAC,UACxC;AAAA,EACE;AAAA,EACA;AAAA,EACA,CAAC,OAAO,GAAG,GAAG,GAAG,MAAM;AACrB,QAAI,EAAE,WAAW,EAAE,QAAQ;AACzB,aAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AACF;AAEF,MAAM,wBAAwB,CAC5B,OACA,aACA,aACW;AACX,MAAI,SAAS;AACb,MAAI;AAEJ,KAAG;AACD,qBAAiB;AACjB,aAAS,OAAO,QAAQ,aAAa,QAAQ;AAAA,EAC/C,SAAS,WAAW;AAEpB,SAAO;AACT;AAEO,MAAM,gCAA+C,OAAO,WAAW;AAC5E,MAAI;AACF,WAAO,MAAM,2BAA2B,MAAM;AAAA,EAChD,SAAS,KAAK;AACZ,uBAAI,KAAK,0CAA0C;AACnD,uBAAI,WAAO,qBAAQ,GAAG,CAAC;AACvB,WAAO,EAAE,QAAQ,QAAQ,QAAQ,kBAAkB;AAAA,EACrD;AACF;",
6
+ "names": ["fg"]
7
+ }
@@ -21,8 +21,13 @@ __export(__exports, {
21
21
  patches: () => patches
22
22
  });
23
23
  module.exports = __toCommonJS(__exports);
24
+ var import_collapseDuplicateMergeKeys = require("./collapseDuplicateMergeKeys");
24
25
  var import_upgradeESLint = require("./upgradeESLint");
25
26
  const patches = [
27
+ {
28
+ apply: import_collapseDuplicateMergeKeys.tryCollapseDuplicateMergeKeys,
29
+ description: "Collapse duplicate merge keys in .buildkite files"
30
+ },
26
31
  {
27
32
  apply: import_upgradeESLint.tryUpgradeESLint,
28
33
  description: "Upgrade to ESLint flat config"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/cli/lint/internalLints/upgrade/patches/8.2.1/index.ts"],
4
- "sourcesContent": ["import type { Patches } from '../..';\n\nimport { tryUpgradeESLint } from './upgradeESLint';\n\nexport const patches: Patches = [\n {\n apply: tryUpgradeESLint,\n description: 'Upgrade to ESLint flat config',\n },\n];\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,2BAAiC;AAE1B,MAAM,UAAmB;AAAA,EAC9B;AAAA,IACE,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AACF;",
4
+ "sourcesContent": ["import type { Patches } from '../..';\n\nimport { tryCollapseDuplicateMergeKeys } from './collapseDuplicateMergeKeys';\nimport { tryUpgradeESLint } from './upgradeESLint';\n\nexport const patches: Patches = [\n {\n apply: tryCollapseDuplicateMergeKeys,\n description: 'Collapse duplicate merge keys in .buildkite files',\n },\n {\n apply: tryUpgradeESLint,\n description: 'Upgrade to ESLint flat config',\n },\n];\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,wCAA8C;AAC9C,2BAAiC;AAE1B,MAAM,UAAmB;AAAA,EAC9B;AAAA,IACE,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AACF;",
6
6
  "names": []
7
7
  }
@@ -25,40 +25,61 @@ var import_util = require("util");
25
25
  var import_fs_extra = require("fs-extra");
26
26
  var import_exec = require("../../../../../../utils/exec");
27
27
  var import_logging = require("../../../../../../utils/logging");
28
+ var import_project = require("../../../../../configure/analysis/project");
28
29
  var import_configFile = require("../../../../../configure/processing/configFile");
29
30
  const upgradeESLint = async ({
30
- mode
31
+ mode,
32
+ dir = process.cwd()
31
33
  }) => {
32
- let originalIgnoreContents;
33
- try {
34
- originalIgnoreContents = await (0, import_fs_extra.readFile)(".eslintignore", "utf8");
35
- } catch (err) {
36
- if (typeof err === "object" && err !== null && "code" in err && err.code === "ENOENT") {
37
- return { result: "skip", reason: "already migrated" };
38
- }
39
- throw err;
34
+ const readFile = (0, import_project.createDestinationFileReader)(dir);
35
+ const originalIgnoreContents = await readFile(".eslintignore");
36
+ if (originalIgnoreContents === null) {
37
+ return { result: "skip", reason: "already migrated" };
40
38
  }
41
39
  if (mode === "lint") {
42
40
  return { result: "apply" };
43
41
  }
44
- await (0, import_fs_extra.writeFile)(
45
- ".eslintignore",
46
- (0, import_configFile.mergeWithConfigFile)("", "ignore")(originalIgnoreContents)
47
- );
42
+ const merged = (0, import_configFile.mergeWithConfigFile)("", "ignore")(originalIgnoreContents);
43
+ let deletedIgnoreFile = false;
44
+ if (merged.trim().length === 0) {
45
+ await (0, import_fs_extra.rm)(".eslintignore");
46
+ deletedIgnoreFile = true;
47
+ } else {
48
+ await (0, import_fs_extra.writeFile)(".eslintignore", merged);
49
+ }
48
50
  const exec = (0, import_exec.createExec)({
49
51
  cwd: process.cwd(),
50
52
  stdio: "ignore"
51
53
  });
52
54
  await exec("eslint-migrate-config", ".eslintrc.js", "--commonjs");
53
- const output = await (0, import_fs_extra.readFile)("eslint.config.cjs", "utf8");
55
+ const output = fiddleWithOutput(await readFile("eslint.config.cjs") ?? "");
54
56
  await (0, import_fs_extra.writeFile)("eslint.config.js", output);
55
57
  await Promise.all([
56
- (0, import_fs_extra.rm)(".eslintignore"),
58
+ deletedIgnoreFile ? Promise.resolve() : (0, import_fs_extra.rm)(".eslintignore"),
57
59
  (0, import_fs_extra.rm)("eslint.config.cjs"),
58
60
  (0, import_fs_extra.rm)(".eslintrc.js")
59
61
  ]);
60
62
  return { result: "apply" };
61
63
  };
64
+ const fiddleWithOutput = (input) => {
65
+ let output = input.replace(/compat.extends\(["']skuba["']\)/, "skuba");
66
+ if (!output.includes("eslint-config-skuba")) {
67
+ output = `const skuba = require('eslint-config-skuba');
68
+
69
+ ${output}`;
70
+ }
71
+ if (!output.includes("compat.")) {
72
+ output = output.replace(/const compat = new FlatCompat\(\{[^}]+\}\);/m, "");
73
+ output = output.replace(
74
+ /const \{\s*FlatCompat,?\s*\}\s*=\s*require\(["']@eslint\/eslintrc["']\);/m,
75
+ ""
76
+ );
77
+ }
78
+ if (!output.includes("js.")) {
79
+ output = output.replace(/const js = require\(['"]@eslint\/js['"]\);/, "");
80
+ }
81
+ return output;
82
+ };
62
83
  const tryUpgradeESLint = async (config) => {
63
84
  try {
64
85
  return await upgradeESLint(config);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/cli/lint/internalLints/upgrade/patches/8.2.1/upgradeESLint.ts"],
4
- "sourcesContent": ["import { inspect } from 'util';\n\nimport { readFile, rm, writeFile } from 'fs-extra';\n\nimport type { PatchFunction, PatchReturnType } from '../..';\nimport { createExec } from '../../../../../../utils/exec';\nimport { log } from '../../../../../../utils/logging';\nimport { mergeWithConfigFile } from '../../../../../configure/processing/configFile';\n\nconst upgradeESLint: PatchFunction = async ({\n mode,\n}): Promise<PatchReturnType> => {\n let originalIgnoreContents;\n\n try {\n originalIgnoreContents = await readFile('.eslintignore', 'utf8');\n } catch (err) {\n if (\n typeof err === 'object' &&\n err !== null &&\n 'code' in err &&\n err.code === 'ENOENT'\n ) {\n return { result: 'skip', reason: 'already migrated' };\n }\n\n throw err;\n }\n\n if (mode === 'lint') {\n return { result: 'apply' };\n }\n\n // Remove managed section of .eslintignore\n await writeFile(\n '.eslintignore',\n mergeWithConfigFile('', 'ignore')(originalIgnoreContents),\n );\n\n const exec = createExec({\n cwd: process.cwd(),\n stdio: 'ignore',\n });\n\n await exec('eslint-migrate-config', '.eslintrc.js', '--commonjs');\n\n const output = await readFile('eslint.config.cjs', 'utf8');\n await writeFile('eslint.config.js', output);\n\n await Promise.all([\n rm('.eslintignore'),\n rm('eslint.config.cjs'),\n rm('.eslintrc.js'),\n ]);\n\n return { result: 'apply' };\n};\n\nexport const tryUpgradeESLint: PatchFunction = async (config) => {\n try {\n return await upgradeESLint(config);\n } catch (err) {\n log.warn('Failed to upgrade ESLint to flag config.');\n log.subtle(inspect(err));\n return { result: 'skip', reason: 'due to an error' };\n }\n};\n\n// TODO: write some tests\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAwB;AAExB,sBAAwC;AAGxC,kBAA2B;AAC3B,qBAAoB;AACpB,wBAAoC;AAEpC,MAAM,gBAA+B,OAAO;AAAA,EAC1C;AACF,MAAgC;AAC9B,MAAI;AAEJ,MAAI;AACF,6BAAyB,UAAM,0BAAS,iBAAiB,MAAM;AAAA,EACjE,SAAS,KAAK;AACZ,QACE,OAAO,QAAQ,YACf,QAAQ,QACR,UAAU,OACV,IAAI,SAAS,UACb;AACA,aAAO,EAAE,QAAQ,QAAQ,QAAQ,mBAAmB;AAAA,IACtD;AAEA,UAAM;AAAA,EACR;AAEA,MAAI,SAAS,QAAQ;AACnB,WAAO,EAAE,QAAQ,QAAQ;AAAA,EAC3B;AAGA,YAAM;AAAA,IACJ;AAAA,QACA,uCAAoB,IAAI,QAAQ,EAAE,sBAAsB;AAAA,EAC1D;AAEA,QAAM,WAAO,wBAAW;AAAA,IACtB,KAAK,QAAQ,IAAI;AAAA,IACjB,OAAO;AAAA,EACT,CAAC;AAED,QAAM,KAAK,yBAAyB,gBAAgB,YAAY;AAEhE,QAAM,SAAS,UAAM,0BAAS,qBAAqB,MAAM;AACzD,YAAM,2BAAU,oBAAoB,MAAM;AAE1C,QAAM,QAAQ,IAAI;AAAA,QAChB,oBAAG,eAAe;AAAA,QAClB,oBAAG,mBAAmB;AAAA,QACtB,oBAAG,cAAc;AAAA,EACnB,CAAC;AAED,SAAO,EAAE,QAAQ,QAAQ;AAC3B;AAEO,MAAM,mBAAkC,OAAO,WAAW;AAC/D,MAAI;AACF,WAAO,MAAM,cAAc,MAAM;AAAA,EACnC,SAAS,KAAK;AACZ,uBAAI,KAAK,0CAA0C;AACnD,uBAAI,WAAO,qBAAQ,GAAG,CAAC;AACvB,WAAO,EAAE,QAAQ,QAAQ,QAAQ,kBAAkB;AAAA,EACrD;AACF;",
4
+ "sourcesContent": ["import { inspect } from 'util';\n\nimport { rm, writeFile } from 'fs-extra';\n\nimport type { PatchFunction, PatchReturnType } from '../..';\nimport { createExec } from '../../../../../../utils/exec';\nimport { log } from '../../../../../../utils/logging';\nimport { createDestinationFileReader } from '../../../../../configure/analysis/project';\nimport { mergeWithConfigFile } from '../../../../../configure/processing/configFile';\n\nconst upgradeESLint: PatchFunction = async ({\n mode,\n dir = process.cwd(),\n}): Promise<PatchReturnType> => {\n const readFile = createDestinationFileReader(dir);\n const originalIgnoreContents = await readFile('.eslintignore');\n\n if (originalIgnoreContents === null) {\n return { result: 'skip', reason: 'already migrated' };\n }\n\n if (mode === 'lint') {\n return { result: 'apply' };\n }\n\n // Remove managed section of .eslintignore\n const merged = mergeWithConfigFile('', 'ignore')(originalIgnoreContents);\n let deletedIgnoreFile = false;\n if (merged.trim().length === 0) {\n await rm('.eslintignore');\n deletedIgnoreFile = true;\n } else {\n await writeFile('.eslintignore', merged);\n }\n\n const exec = createExec({\n cwd: process.cwd(),\n stdio: 'ignore',\n });\n\n await exec('eslint-migrate-config', '.eslintrc.js', '--commonjs');\n\n const output = fiddleWithOutput((await readFile('eslint.config.cjs')) ?? '');\n await writeFile('eslint.config.js', output);\n\n await Promise.all([\n deletedIgnoreFile ? Promise.resolve() : rm('.eslintignore'),\n rm('eslint.config.cjs'),\n rm('.eslintrc.js'),\n ]);\n\n return { result: 'apply' };\n};\n\nconst fiddleWithOutput = (input: string) => {\n let output = input.replace(/compat.extends\\([\"']skuba[\"']\\)/, 'skuba');\n\n if (!output.includes('eslint-config-skuba')) {\n output = `const skuba = require('eslint-config-skuba');\\n\\n${output}`;\n }\n\n if (!output.includes('compat.')) {\n output = output.replace(/const compat = new FlatCompat\\(\\{[^}]+\\}\\);/m, '');\n output = output.replace(\n /const \\{\\s*FlatCompat,?\\s*\\}\\s*=\\s*require\\([\"']@eslint\\/eslintrc[\"']\\);/m,\n '',\n );\n }\n\n if (!output.includes('js.')) {\n output = output.replace(/const js = require\\(['\"]@eslint\\/js['\"]\\);/, '');\n }\n\n return output;\n};\n\nexport const tryUpgradeESLint: PatchFunction = async (config) => {\n try {\n return await upgradeESLint(config);\n } catch (err) {\n log.warn('Failed to upgrade ESLint to flag config.');\n log.subtle(inspect(err));\n return { result: 'skip', reason: 'due to an error' };\n }\n};\n\n// TODO: write some tests\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAwB;AAExB,sBAA8B;AAG9B,kBAA2B;AAC3B,qBAAoB;AACpB,qBAA4C;AAC5C,wBAAoC;AAEpC,MAAM,gBAA+B,OAAO;AAAA,EAC1C;AAAA,EACA,MAAM,QAAQ,IAAI;AACpB,MAAgC;AAC9B,QAAM,eAAW,4CAA4B,GAAG;AAChD,QAAM,yBAAyB,MAAM,SAAS,eAAe;AAE7D,MAAI,2BAA2B,MAAM;AACnC,WAAO,EAAE,QAAQ,QAAQ,QAAQ,mBAAmB;AAAA,EACtD;AAEA,MAAI,SAAS,QAAQ;AACnB,WAAO,EAAE,QAAQ,QAAQ;AAAA,EAC3B;AAGA,QAAM,aAAS,uCAAoB,IAAI,QAAQ,EAAE,sBAAsB;AACvE,MAAI,oBAAoB;AACxB,MAAI,OAAO,KAAK,EAAE,WAAW,GAAG;AAC9B,cAAM,oBAAG,eAAe;AACxB,wBAAoB;AAAA,EACtB,OAAO;AACL,cAAM,2BAAU,iBAAiB,MAAM;AAAA,EACzC;AAEA,QAAM,WAAO,wBAAW;AAAA,IACtB,KAAK,QAAQ,IAAI;AAAA,IACjB,OAAO;AAAA,EACT,CAAC;AAED,QAAM,KAAK,yBAAyB,gBAAgB,YAAY;AAEhE,QAAM,SAAS,iBAAkB,MAAM,SAAS,mBAAmB,KAAM,EAAE;AAC3E,YAAM,2BAAU,oBAAoB,MAAM;AAE1C,QAAM,QAAQ,IAAI;AAAA,IAChB,oBAAoB,QAAQ,QAAQ,QAAI,oBAAG,eAAe;AAAA,QAC1D,oBAAG,mBAAmB;AAAA,QACtB,oBAAG,cAAc;AAAA,EACnB,CAAC;AAED,SAAO,EAAE,QAAQ,QAAQ;AAC3B;AAEA,MAAM,mBAAmB,CAAC,UAAkB;AAC1C,MAAI,SAAS,MAAM,QAAQ,mCAAmC,OAAO;AAErE,MAAI,CAAC,OAAO,SAAS,qBAAqB,GAAG;AAC3C,aAAS;AAAA;AAAA,EAAoD,MAAM;AAAA,EACrE;AAEA,MAAI,CAAC,OAAO,SAAS,SAAS,GAAG;AAC/B,aAAS,OAAO,QAAQ,gDAAgD,EAAE;AAC1E,aAAS,OAAO;AAAA,MACd;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,aAAS,OAAO,QAAQ,8CAA8C,EAAE;AAAA,EAC1E;AAEA,SAAO;AACT;AAEO,MAAM,mBAAkC,OAAO,WAAW;AAC/D,MAAI;AACF,WAAO,MAAM,cAAc,MAAM;AAAA,EACnC,SAAS,KAAK;AACZ,uBAAI,KAAK,0CAA0C;AACnD,uBAAI,WAAO,qBAAQ,GAAG,CAAC;AACvB,WAAO,EAAE,QAAQ,QAAQ,QAAQ,kBAAkB;AAAA,EACrD;AACF;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skuba",
3
- "version": "9.0.0-renovate-eslint-9.x-20240811012135",
3
+ "version": "9.0.0-renovate-eslint-9.x-20240811034714",
4
4
  "private": false,
5
5
  "description": "SEEK development toolkit for backend applications and packages",
6
6
  "homepage": "https://github.com/seek-oss/skuba#readme",
@@ -101,7 +101,7 @@
101
101
  "typescript": "~5.5.4",
102
102
  "validate-npm-package-name": "^5.0.0",
103
103
  "zod": "^3.22.4",
104
- "eslint-config-skuba": "5.0.0-renovate-eslint-9.x-20240811012135"
104
+ "eslint-config-skuba": "5.0.0-renovate-eslint-9.x-20240811034714"
105
105
  },
106
106
  "devDependencies": {
107
107
  "@changesets/cli": "2.27.7",
@@ -17,7 +17,7 @@
17
17
  },
18
18
  "devDependencies": {
19
19
  "@types/node": "^20.9.0",
20
- "skuba": "9.0.0-renovate-eslint-9.x-20240811012135"
20
+ "skuba": "9.0.0-renovate-eslint-9.x-20240811034714"
21
21
  },
22
22
  "packageManager": "pnpm@9.6.0",
23
23
  "engines": {
@@ -27,7 +27,7 @@
27
27
  "aws-cdk-lib": "^2.109.0",
28
28
  "constructs": "^10.0.17",
29
29
  "pino-pretty": "^11.0.0",
30
- "skuba": "9.0.0-renovate-eslint-9.x-20240811012135"
30
+ "skuba": "9.0.0-renovate-eslint-9.x-20240811034714"
31
31
  },
32
32
  "packageManager": "pnpm@9.6.0",
33
33
  "engines": {