Skip to content

Commit dca0266

Browse files
committed
fix(plugin-eslint): pass arguments via config file instead of argv
1 parent 0d5b0f6 commit dca0266

File tree

6 files changed

+49
-52
lines changed

6 files changed

+49
-52
lines changed

packages/plugin-coverage/src/lib/runner/index.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
} from '@code-pushup/utils';
1111
import { FinalCoveragePluginConfig } from '../config';
1212
import { applyMaxScoreAboveThreshold } from '../utils';
13-
import { PLUGIN_CONFIG_PATH, RUNNER_OUTPUT_PATH, WORKDIR } from './constants';
13+
import { PLUGIN_CONFIG_PATH, RUNNER_OUTPUT_PATH } from './constants';
1414
import { lcovResultsToAuditOutputs } from './lcov/lcov-runner';
1515

1616
export async function executeRunner(): Promise<void> {
@@ -48,7 +48,7 @@ export async function createRunnerConfig(
4848
config: FinalCoveragePluginConfig,
4949
): Promise<RunnerConfig> {
5050
// Create JSON config for executeRunner
51-
await ensureDirectoryExists(WORKDIR);
51+
await ensureDirectoryExists(dirname(PLUGIN_CONFIG_PATH));
5252
await writeFile(PLUGIN_CONFIG_PATH, JSON.stringify(config));
5353

5454
const threshold = config.perfectScoreThreshold;

packages/plugin-eslint/src/lib/__snapshots__/eslint-plugin.integration.test.ts.snap

-4
Original file line numberDiff line numberDiff line change
@@ -509,10 +509,6 @@ exports[`eslintPlugin > should initialize ESLint plugin for React application 1`
509509
"runner": {
510510
"args": [
511511
"<dirname>/bin.js",
512-
"no-cond-assign,no-const-assign,no-debugger,no-invalid-regexp,no-undef,no-unreachable-loop,no-unsafe-negation,no-unsafe-optional-chaining,no-unused-vars,use-isnan,valid-typeof,arrow-body-style,camelcase,curly,eqeqeq,max-lines-per-function,max-lines,no-shadow,no-var,object-shorthand,prefer-arrow-callback,prefer-const,prefer-object-spread,yoda,react-jsx-key,react-prop-types,react-react-in-jsx-scope,react-hooks-rules-of-hooks,react-hooks-exhaustive-deps,react-display-name,react-jsx-no-comment-textnodes,react-jsx-no-duplicate-props,react-jsx-no-target-blank,react-jsx-no-undef,react-jsx-uses-react,react-jsx-uses-vars,react-no-children-prop,react-no-danger-with-children,react-no-deprecated,react-no-direct-mutation-state,react-no-find-dom-node,react-no-is-mounted,react-no-render-return-value,react-no-string-refs,react-no-unescaped-entities,react-no-unknown-property,react-require-render-return",
513-
".eslintrc.js",
514-
"'src/**/*.js'",
515-
"'src/**/*.jsx'",
516512
],
517513
"command": "node",
518514
"outputFile": "node_modules/.code-pushup/eslint/runner-output.json",

packages/plugin-eslint/src/lib/config.ts

+6
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,9 @@ export const eslintPluginConfigSchema = z.object({
1818
});
1919

2020
export type ESLintPluginConfig = z.infer<typeof eslintPluginConfigSchema>;
21+
22+
export type ESLintPluginRunnerConfig = {
23+
eslintrc: string;
24+
slugs: string[];
25+
patterns: string[];
26+
};

packages/plugin-eslint/src/lib/eslint-plugin.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export async function eslintPlugin(
6161
audits,
6262
groups,
6363

64-
runner: createRunnerConfig(
64+
runner: await createRunnerConfig(
6565
runnerScriptPath,
6666
audits,
6767
eslintrcPath,

packages/plugin-eslint/src/lib/runner.integration.test.ts

+11-17
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import { ESLint } from 'eslint';
2-
import { mkdir, rm, writeFile } from 'node:fs/promises';
2+
import { rm, writeFile } from 'node:fs/promises';
33
import os from 'node:os';
44
import { dirname, join } from 'node:path';
55
import { fileURLToPath } from 'node:url';
66
import { MockInstance, describe, expect, it } from 'vitest';
77
import type { AuditOutput, AuditOutputs, Issue } from '@code-pushup/models';
88
import { osAgnosticAuditOutputs } from '@code-pushup/test-utils';
9-
import { readJsonFile } from '@code-pushup/utils';
9+
import { ensureDirectoryExists, readJsonFile } from '@code-pushup/utils';
1010
import { listAuditsAndGroups } from './meta';
1111
import {
1212
ESLINTRC_PATH,
13+
PLUGIN_CONFIG_PATH,
1314
RUNNER_OUTPUT_PATH,
1415
createRunnerConfig,
1516
executeRunner,
@@ -22,17 +23,11 @@ describe.skip('executeRunner', () => {
2223
let cwdSpy: MockInstance<[], string>;
2324
let platformSpy: MockInstance<[], NodeJS.Platform>;
2425

25-
const createArgv = async (eslintrc: string) => {
26+
const createPluginConfig = async (eslintrc: string) => {
2627
const patterns = ['src/**/*.js', 'src/**/*.jsx'];
2728
const eslint = setupESLint(eslintrc);
2829
const { audits } = await listAuditsAndGroups(eslint, patterns);
29-
const runnerConfig = createRunnerConfig(
30-
'bin.js',
31-
audits,
32-
eslintrc,
33-
patterns,
34-
);
35-
return [runnerConfig.command, ...(runnerConfig.args ?? [])];
30+
await createRunnerConfig('bin.js', audits, eslintrc, patterns);
3631
};
3732

3833
const appDir = join(
@@ -52,7 +47,7 @@ describe.skip('executeRunner', () => {
5247
const config: ESLint.ConfigData = {
5348
extends: '@code-pushup',
5449
};
55-
await mkdir(dirname(ESLINTRC_PATH), { recursive: true });
50+
await ensureDirectoryExists(dirname(ESLINTRC_PATH));
5651
await writeFile(ESLINTRC_PATH, JSON.stringify(config));
5752
});
5853

@@ -61,21 +56,20 @@ describe.skip('executeRunner', () => {
6156
platformSpy.mockRestore();
6257

6358
await rm(ESLINTRC_PATH, { force: true });
59+
await rm(PLUGIN_CONFIG_PATH, { force: true });
6460
});
6561

6662
it('should execute ESLint and create audit results for React application', async () => {
67-
const argv = await createArgv('.eslintrc.js');
68-
69-
await executeRunner(argv);
63+
await createPluginConfig('.eslintrc.js');
64+
await executeRunner();
7065

7166
const json = await readJsonFile<AuditOutputs>(RUNNER_OUTPUT_PATH);
7267
expect(osAgnosticAuditOutputs(json)).toMatchSnapshot();
7368
});
7469

7570
it('should execute runner with inline config using @code-pushup/eslint-config', async () => {
76-
const argv = await createArgv(ESLINTRC_PATH);
77-
78-
await executeRunner(argv);
71+
await createPluginConfig(ESLINTRC_PATH);
72+
await executeRunner();
7973

8074
const json = await readJsonFile<AuditOutput[]>(RUNNER_OUTPUT_PATH);
8175
// expect warnings from unicorn/filename-case rule from default config
+29-28
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
1-
import { mkdir, writeFile } from 'node:fs/promises';
2-
import { platform } from 'node:os';
1+
import { writeFile } from 'node:fs/promises';
32
import { dirname, join } from 'node:path';
43
import type { Audit, AuditOutput, RunnerConfig } from '@code-pushup/models';
5-
import { pluginWorkDir, readJsonFile, toArray } from '@code-pushup/utils';
4+
import {
5+
ensureDirectoryExists,
6+
pluginWorkDir,
7+
readJsonFile,
8+
toArray,
9+
} from '@code-pushup/utils';
10+
import { ESLintPluginRunnerConfig } from '../config';
611
import { lint } from './lint';
712
import { lintResultsToAudits } from './transform';
813

914
export const WORKDIR = pluginWorkDir('eslint');
1015
export const RUNNER_OUTPUT_PATH = join(WORKDIR, 'runner-output.json');
1116
export const ESLINTRC_PATH = join(process.cwd(), WORKDIR, '.eslintrc.json');
17+
export const PLUGIN_CONFIG_PATH = join(
18+
process.cwd(),
19+
WORKDIR,
20+
'plugin-config.json',
21+
);
1222

13-
const AUDIT_SLUGS_SEP = ',';
14-
15-
export async function executeRunner(argv = process.argv): Promise<void> {
16-
const [slugs, eslintrc, ...patterns] = argv.slice(2);
17-
if (!slugs) {
18-
throw new Error('Invalid runner args - missing slugs argument');
19-
}
20-
if (!eslintrc) {
21-
throw new Error('Invalid runner args - missing eslintrc argument');
22-
}
23-
if (patterns.length === 0) {
24-
throw new Error('Invalid runner args - missing patterns argument');
25-
}
23+
export async function executeRunner(): Promise<void> {
24+
const { slugs, eslintrc, patterns } =
25+
await readJsonFile<ESLintPluginRunnerConfig>(PLUGIN_CONFIG_PATH);
2626

2727
const lintResults = await lint({
2828
// if file created from inline object, provide inline to preserve relative links
@@ -32,7 +32,7 @@ export async function executeRunner(argv = process.argv): Promise<void> {
3232
});
3333
const failedAudits = lintResultsToAudits(lintResults);
3434

35-
const audits = slugs.split(AUDIT_SLUGS_SEP).map(
35+
const audits = slugs.map(
3636
(slug): AuditOutput =>
3737
failedAudits.find(audit => audit.slug === slug) ?? {
3838
slug,
@@ -43,26 +43,27 @@ export async function executeRunner(argv = process.argv): Promise<void> {
4343
},
4444
);
4545

46-
await mkdir(dirname(RUNNER_OUTPUT_PATH), { recursive: true });
46+
await ensureDirectoryExists(dirname(RUNNER_OUTPUT_PATH));
4747
await writeFile(RUNNER_OUTPUT_PATH, JSON.stringify(audits));
4848
}
4949

50-
export function createRunnerConfig(
50+
export async function createRunnerConfig(
5151
scriptPath: string,
5252
audits: Audit[],
5353
eslintrc: string,
5454
patterns: string | string[],
55-
): RunnerConfig {
55+
): Promise<RunnerConfig> {
56+
const config: ESLintPluginRunnerConfig = {
57+
eslintrc,
58+
slugs: audits.map(audit => audit.slug),
59+
patterns: toArray(patterns),
60+
};
61+
await ensureDirectoryExists(dirname(PLUGIN_CONFIG_PATH));
62+
await writeFile(PLUGIN_CONFIG_PATH, JSON.stringify(config));
63+
5664
return {
5765
command: 'node',
58-
args: [
59-
scriptPath,
60-
audits.map(audit => audit.slug).join(AUDIT_SLUGS_SEP),
61-
eslintrc,
62-
...toArray(patterns).map(pattern =>
63-
platform() === 'win32' ? pattern : `'${pattern}'`,
64-
),
65-
],
66+
args: [scriptPath],
6667
outputFile: RUNNER_OUTPUT_PATH,
6768
};
6869
}

0 commit comments

Comments
 (0)