Skip to content

Commit bd8c957

Browse files
committed
perf(fmt): load plugin resolver on demand
1 parent 6827284 commit bd8c957

2 files changed

Lines changed: 52 additions & 8 deletions

File tree

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
11
import { resolveFmtOptions } from './config.ts';
22
import { discoverFmtPaths } from './discoverPaths.ts';
33
import { createFmtIgnoreMatcher } from './ignore.ts';
4-
import { createFmtPluginResolver, type FmtPluginResolver } from './plugins.ts';
54
import type { DiscoverFmtFilesOptions, FmtFileRequest, ResolvedFmtConfig } from './types.ts';
65

7-
const createFileRequest = (
8-
filePath: string,
9-
config: ResolvedFmtConfig,
10-
resolvePlugins: FmtPluginResolver,
11-
): FmtFileRequest => ({
6+
const createFileRequest = (filePath: string, config: ResolvedFmtConfig): FmtFileRequest => ({
127
path: filePath,
13-
options: resolvePlugins(resolveFmtOptions(filePath, config)),
8+
options: resolveFmtOptions(filePath, config),
149
});
1510

1611
/** Discovers worker-ready files without reading Prettier config files or `.prettierignore`. */
@@ -26,9 +21,18 @@ const discoverFmtFiles = async ({
2621

2722
const isFmtIgnored = createFmtIgnoreMatcher(config);
2823
const filePaths = candidates.filter((filePath) => !isFmtIgnored(filePath));
24+
const files = filePaths.map((filePath) => createFileRequest(filePath, config));
25+
if (!files.some((file) => file.options.plugins?.length)) {
26+
return files;
27+
}
28+
29+
const { createFmtPluginResolver } = await import(
30+
/* rspackChunkName: 'fmtPlugins' */
31+
'./plugins.ts'
32+
);
2933
const resolvePlugins = createFmtPluginResolver(config.rootPath);
3034

31-
return filePaths.map((filePath) => createFileRequest(filePath, config, resolvePlugins));
35+
return files.map((file) => ({ ...file, options: resolvePlugins(file.options) }));
3236
};
3337

3438
export { discoverFmtFiles };
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { expect, rs, test } from 'rstack/test';
2+
import { normalizeFmtConfig } from '../../src/fmt/config.ts';
3+
import { discoverFmtFiles } from '../../src/fmt/discovery.ts';
4+
import type { FmtConfig } from '../../src/fmt/types.ts';
5+
import { withTempProject, writeProjectFile } from './helpers.ts';
6+
7+
const mocks = rs.hoisted(() => ({
8+
pluginResolverRoots: [] as string[],
9+
}));
10+
11+
rs.mock('../../src/fmt/plugins.ts', () => ({
12+
createFmtPluginResolver: (rootPath: string) => {
13+
mocks.pluginResolverRoots.push(rootPath);
14+
return <T>(options: T): T => options;
15+
},
16+
}));
17+
18+
const discover = (cwd: string, config: FmtConfig) =>
19+
discoverFmtFiles({
20+
cwd,
21+
patterns: ['index.ts'],
22+
config: normalizeFmtConfig(config, cwd),
23+
});
24+
25+
test('loads the plugin resolver only when a discovered file uses plugins', async () => {
26+
await withTempProject(async (rootPath) => {
27+
writeProjectFile(rootPath, 'index.ts');
28+
29+
await discover(rootPath, {
30+
overrides: [{ files: '*.md', options: { plugins: ['missing-plugin'] } }],
31+
});
32+
expect(mocks.pluginResolverRoots).toEqual([]);
33+
34+
const files = await discover(rootPath, {
35+
overrides: [{ files: '*.ts', options: { plugins: ['prettier-plugin-fixture'] } }],
36+
});
37+
expect(mocks.pluginResolverRoots).toEqual([rootPath]);
38+
expect(files[0].options.plugins).toEqual(['prettier-plugin-fixture']);
39+
});
40+
});

0 commit comments

Comments
 (0)