Skip to content

Commit a319b6e

Browse files
committed
refactor(config): concatenate lint config layers
1 parent 45c73c8 commit a319b6e

3 files changed

Lines changed: 39 additions & 8 deletions

File tree

‎packages/rstack/src/lintConfig.ts‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import type { RslintConfig } from '@rslint/core';
2+
import type { Configs } from './config.ts';
3+
import { resolveConfigLayers } from './configLayers.ts';
4+
5+
export const resolveRslintConfig = async (
6+
layers: readonly Configs[],
7+
): Promise<RslintConfig | undefined> => {
8+
const configs = await resolveConfigLayers(layers, 'lint');
9+
return configs.length > 1 ? configs.flat() : configs[0];
10+
};

‎packages/rstack/src/rslintConfig.ts‎

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,19 @@ import { join } from 'node:path';
33
import { loadRstackConfig, type LoadedRstackConfig } from './config.ts';
44
import type { RslintConfig } from '@rslint/core';
55
import { color, logger } from 'rslog';
6+
import { resolveRslintConfig } from './lintConfig.ts';
67

78
// Expose the loaded config so `rs check` can pass it to fmt instead of loading
89
// and executing the Rstack config a second time.
910
export const loadedConfig: LoadedRstackConfig = await loadRstackConfig();
1011
const { configs } = loadedConfig;
11-
const lintDefinition = configs.lint;
12+
const lintConfig = await resolveRslintConfig([configs]);
1213

13-
let lintConfig: RslintConfig;
14-
15-
if (lintDefinition === undefined) {
14+
if (lintConfig === undefined) {
1615
logger.error(
1716
`No lint configuration found. Add ${color.cyan('define.lint(...)')} to your Rstack config file.`,
1817
);
1918
process.exit(1);
20-
} else if (typeof lintDefinition === 'function') {
21-
lintConfig = await lintDefinition();
22-
} else {
23-
lintConfig = lintDefinition;
2419
}
2520

2621
const basePath = process.cwd();
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import type { RslintConfig } from '@rslint/core';
2+
import { expect, test } from 'rstack/test';
3+
import { normalizeRstackConfig } from '../../src/config.ts';
4+
import { resolveRslintConfig } from '../../src/lintConfig.ts';
5+
6+
test('concatenates lint layers in order without merging entries', async () => {
7+
const shared: RslintConfig = [
8+
{ ignores: ['dist/**'] },
9+
[{ files: ['**/*.js'], rules: { 'no-debugger': 'error' } }],
10+
];
11+
const project: RslintConfig = [{ rules: { 'no-debugger': 'off' } }];
12+
13+
const config = await resolveRslintConfig([
14+
{ lint: shared },
15+
normalizeRstackConfig({ lint: () => Promise.resolve(project) }),
16+
]);
17+
18+
expect(config).toEqual([...shared, ...project]);
19+
});
20+
21+
test('preserves a single lint config and distinguishes missing from empty', async () => {
22+
const config: RslintConfig = [];
23+
24+
expect(await resolveRslintConfig([{}])).toBeUndefined();
25+
expect(await resolveRslintConfig([{}, { lint: config }])).toBe(config);
26+
});

0 commit comments

Comments
 (0)