Skip to content

Commit 5078b1a

Browse files
authored
refactor: move transform to @rsdoctor/graph (#1293)
1 parent 2f6e71a commit 5078b1a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+469
-423
lines changed

e2e/cases/doctor-rsbuild/test-utils.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { RsdoctorWebpackPluginOptions } from '@rsdoctor/core/types';
1+
import type { Plugin } from '@rsdoctor/types';
22
import {
33
RsdoctorWebpackPlugin,
44
RsdoctorWebpackMultiplePlugin,
@@ -9,7 +9,7 @@ import { tmpdir } from 'os';
99
import path from 'path';
1010

1111
export function createRsdoctorPlugin<T extends Linter.ExtendRuleData[]>(
12-
options: RsdoctorWebpackPluginOptions<T> = {},
12+
options: Plugin.RsdoctorWebpackPluginOptions<T> = {},
1313
) {
1414
const plugin = new RsdoctorWebpackPlugin({
1515
...options,
@@ -40,7 +40,7 @@ export function createRsdoctorPlugin<T extends Linter.ExtendRuleData[]>(
4040
}
4141

4242
export function createRsdoctorMultiPlugin<T extends Linter.ExtendRuleData[]>(
43-
options: RsdoctorWebpackPluginOptions<T> = {},
43+
options: Plugin.RsdoctorWebpackPluginOptions<T> = {},
4444
) {
4545
const plugin = new RsdoctorWebpackMultiplePlugin({
4646
...options,

e2e/cases/doctor-webpack/plugins/brief-mode-json-generation.test.ts

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ test('brief mode with JSON type should generate JSON data files', async () => {
8181
if (jsonDataExists) {
8282
const jsonData = await File.fse.readJson(jsonDataPath);
8383
expect(jsonData).toBeDefined();
84-
expect(jsonData.moduleGraph).toBeDefined();
85-
expect(jsonData.chunkGraph).toBeDefined();
84+
expect(jsonData.data.moduleGraph).toBeDefined();
85+
expect(jsonData.data.chunkGraph).toBeDefined();
8686
}
8787

8888
// Cleanup
@@ -123,17 +123,17 @@ test('brief mode with JSON type should respect sections configuration', async ()
123123
expect(jsonData).toBeDefined();
124124

125125
// moduleGraph is disabled, should return empty structure
126-
expect(jsonData.moduleGraph).toBeDefined();
127-
expect(jsonData.moduleGraph.modules).toEqual([]);
128-
expect(jsonData.moduleGraph.dependencies).toEqual([]);
126+
expect(jsonData.data.moduleGraph).toBeDefined();
127+
expect(jsonData.data.moduleGraph.modules).toEqual([]);
128+
expect(jsonData.data.moduleGraph.dependencies).toEqual([]);
129129

130130
// chunkGraph is enabled, should have data
131-
expect(jsonData.chunkGraph).toBeDefined();
132-
expect(jsonData.chunkGraph.chunks.length).toBeGreaterThan(0);
131+
expect(jsonData.data.chunkGraph).toBeDefined();
132+
expect(jsonData.data.chunkGraph.chunks.length).toBeGreaterThan(0);
133133

134134
// rules (errors) is disabled, should be empty
135-
expect(jsonData.errors).toBeDefined();
136-
expect(jsonData.errors).toEqual([]);
135+
expect(jsonData.data.errors).toBeDefined();
136+
expect(jsonData.data.errors).toEqual([]);
137137
}
138138

139139
// Cleanup
@@ -175,17 +175,17 @@ test('brief mode with JSON type and custom sections should generate selective da
175175
if (jsonDataExists) {
176176
const jsonData = await File.fse.readJson(jsonDataPath);
177177
expect(jsonData).toBeDefined();
178-
178+
const data = jsonData.data;
179179
// Since chunkGraph is disabled in sections, it should return empty arrays
180-
expect(jsonData.moduleGraph).toBeDefined();
181-
expect(jsonData.moduleGraph.modules.length).toBeGreaterThan(0); // moduleGraph is enabled
180+
expect(data.moduleGraph).toBeDefined();
181+
expect(data.moduleGraph.modules.length).toBeGreaterThan(0); // moduleGraph is enabled
182182

183-
expect(jsonData.chunkGraph).toBeDefined();
184-
expect(jsonData.chunkGraph.chunks).toEqual([]); // chunkGraph is disabled, should be empty
185-
expect(jsonData.chunkGraph.assets).toEqual([]); // chunkGraph is disabled, should be empty
183+
expect(data.chunkGraph).toBeDefined();
184+
expect(data.chunkGraph.chunks).toEqual([]); // chunkGraph is disabled, should be empty
185+
expect(data.chunkGraph.assets).toEqual([]); // chunkGraph is disabled, should be empty
186186

187-
expect(jsonData.errors).toBeDefined();
188-
expect(Array.isArray(jsonData.errors)).toBe(true); // rules is enabled
187+
expect(data.errors).toBeDefined();
188+
expect(Array.isArray(data.errors)).toBe(true); // rules is enabled
189189
}
190190

191191
// Cleanup

packages/cli/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"@rsdoctor/sdk": "workspace:*",
3232
"@rsdoctor/types": "workspace:*",
3333
"@rsdoctor/utils": "workspace:*",
34+
"@rsdoctor/graph": "workspace:*",
3435
"axios": "^1.11.0",
3536
"ora": "^5.4.1",
3637
"picocolors": "^1.1.1",

packages/cli/src/commands/stats-analyze.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { Commands } from '../constants';
66
import { Command } from '../types';
77
import { enhanceCommand, readFile } from '../utils';
88
import { StatsCompilation } from '@rsdoctor/types/src/plugin';
9-
import { TransUtils } from '@rsdoctor/core/common-utils';
9+
import { TransUtils } from '@rsdoctor/graph';
1010

1111
interface Options {
1212
profile: string;

packages/core/package.json

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,6 @@
2424
"import": "./dist/build-utils/build/index.js",
2525
"default": "./dist/build-utils/build/index.cjs"
2626
},
27-
"./common-utils": {
28-
"types": "./dist/build-utils/common/index.d.ts",
29-
"import": "./dist/build-utils/common/index.js",
30-
"default": "./dist/build-utils/common/index.cjs"
31-
},
3227
"./plugins": {
3328
"types": "./dist/inner-plugins/index.d.ts",
3429
"import": "./dist/inner-plugins/index.js",
@@ -53,9 +48,6 @@
5348
"build-utils": [
5449
"./dist/build-utils/build/index.d.ts"
5550
],
56-
"common-utils": [
57-
"./dist/build-utils/common/index.d.ts"
58-
],
5951
"plugins": [
6052
"./dist/inner-plugins/index.d.ts"
6153
],
@@ -88,7 +80,6 @@
8880
"devDependencies": {
8981
"@rsbuild/plugin-check-syntax": "1.3.0",
9082
"axios": "^1.11.0",
91-
"path-browserify": "1.0.1",
9283
"enhanced-resolve": "5.12.0",
9384
"filesize": "^10.1.6",
9485
"@rspack/core": "1.5.1",
@@ -97,7 +88,6 @@
9788
"@types/lodash-es": "^4.17.12",
9889
"@types/node": "^22.8.1",
9990
"@types/node-fetch": "^2.6.12",
100-
"@types/path-browserify": "1.0.3",
10191
"@types/semver": "^7.7.0",
10292
"@types/tapable": "2.2.7",
10393
"babel-loader": "10.0.0",

packages/core/src/build-utils/build/chunks/assetsModules.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { getAssetsModulesData as transform } from '@/build-utils/common/chunks';
1+
import { Chunks } from '@rsdoctor/graph';
22
import { parseBundle } from '../utils';
33
import { SDK } from '@rsdoctor/types';
44

@@ -9,7 +9,7 @@ export async function getAssetsModulesData(
99
sourceMapSets: Map<string, string>,
1010
hasParseBundle = true,
1111
) {
12-
return transform(
12+
return Chunks.getAssetsModulesData(
1313
moduleGraph,
1414
chunkGraph,
1515
bundleDir,
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Plugin } from '@rsdoctor/types';
2-
import { chunkTransform as transform } from '@/build-utils/common/chunks';
2+
import { Chunks } from '@rsdoctor/graph';
33

44
export function chunkTransform(
55
assetMap: Map<string, { content: string }>,
66
bundleStats: Plugin.StatsCompilation,
77
) {
8-
return transform(assetMap, bundleStats);
8+
return Chunks.chunkTransform(assetMap, bundleStats);
99
}

packages/core/src/build-utils/build/module-graph/transform.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Plugin } from '@rsdoctor/types';
2-
import { getModuleGraphByStats as transform } from '@/build-utils/common/module-graph';
2+
import { ModuleGraphTrans } from '@rsdoctor/graph';
33
import { TransformContext, appendModuleGraphByCompilation } from '.';
44
import { SDK } from '@rsdoctor/types';
55

@@ -13,7 +13,7 @@ export function getModuleGraphByStats(
1313
) {
1414
return appendModuleGraphByCompilation(
1515
compilation,
16-
transform(stats, root, chunkGraph),
16+
ModuleGraphTrans.getModuleGraphByStats(stats, root, chunkGraph),
1717
features,
1818
context,
1919
);

packages/core/src/build-utils/build/module-graph/treeShaking.ts

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import {
44
SideEffect,
55
ModuleGraphModule,
66
Statement,
7+
Webpack,
8+
ModuleGraphTrans,
79
} from '@rsdoctor/graph';
810
import type { SDK, Plugin } from '@rsdoctor/types';
911
import type {
@@ -12,21 +14,12 @@ import type {
1214
Compilation,
1315
} from 'webpack';
1416

15-
import type {
16-
HarmonyImportSpecifierDependency,
17-
ExportInfo as WebExportInfo,
18-
} from '@/types';
19-
import {
20-
getAllModules,
21-
getLastExportInfo,
22-
} from '@/build-utils/common/webpack/compatible';
2317
import {
2418
getDeclarationIdentifier,
2519
getExportIdentifierStatement,
2620
} from './utils';
27-
import { isWebpack5orRspack } from '@/build-utils/common/module-graph';
2821

29-
type ExportData = Map<WebExportInfo, SDK.ExportInstance>;
22+
type ExportData = Map<Plugin.ExportInfo, SDK.ExportInstance>;
3023

3124
function transformMgm(
3225
origin: WebpackNormalModule,
@@ -75,7 +68,7 @@ function transformMgm(
7568
continue;
7669
}
7770

78-
const HISDep = dep as HarmonyImportSpecifierDependency;
71+
const HISDep = dep as Plugin.HarmonyImportSpecifierDependency;
7972
const { name, userRequest } = HISDep;
8073
const originName =
8174
HISDep.getIds(webpackGraph)[0] ?? SideEffect.NamespaceSymbol;
@@ -112,7 +105,7 @@ function appendExportConnection(
112105
continue;
113106
}
114107

115-
const lastExport = getLastExportInfo(info, webpackGraph);
108+
const lastExport = Webpack.getLastExportInfo(info, webpackGraph);
116109
const lastSdkExport = cache.get(lastExport!);
117110
const sdkExport = cache.get(info);
118111

@@ -160,15 +153,15 @@ export function appendTreeShaking(
160153
moduleGraph: SDK.ModuleGraphInstance,
161154
compilation: Plugin.BaseCompilation,
162155
) {
163-
if (!isWebpack5orRspack(compilation)) {
156+
if (!ModuleGraphTrans.isWebpack5orRspack(compilation)) {
164157
return moduleGraph;
165158
}
166159

167160
if ('moduleGraph' in compilation) {
168-
const exportData = new Map<WebExportInfo, SDK.ExportInstance>();
161+
const exportData = new Map<Plugin.ExportInfo, SDK.ExportInstance>();
169162
const webpackCompilation = compilation as unknown as Compilation;
170163
const { moduleGraph: webpackGraph } = webpackCompilation;
171-
const allModules = getAllModules(webpackCompilation);
164+
const allModules = Webpack.getAllModules(webpackCompilation);
172165

173166
allModules.forEach((origin) =>
174167
transformMgm(origin, webpackGraph, moduleGraph, exportData),

packages/core/src/build-utils/build/module-graph/webpack/transform.ts

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,7 @@ import * as Webpack from 'webpack';
44
import * as Rspack from '@rspack/core';
55
import { Node } from '@rsdoctor/utils/ruleUtils';
66
import { Plugin, SDK } from '@rsdoctor/types';
7-
import {
8-
getAllModules,
9-
getDependencyPosition,
10-
getWebpackDependencyRequest,
11-
getWebpackModuleId,
12-
getWebpackModulePath,
13-
isExternalModule,
14-
} from '@/build-utils/common/webpack/compatible';
15-
import {
16-
getImportKind,
17-
isImportDependency,
18-
removeNoImportStyle,
19-
} from '@/build-utils/common/module-graph';
7+
import { ModuleGraphTrans, Webpack as WebpackGraph } from '@rsdoctor/graph';
208
import { hasSetEsModuleStatement } from '../parser';
219
import { isFunction } from 'lodash-es';
2210
import { logger } from '@rsdoctor/utils/logger';
@@ -93,11 +81,13 @@ function appendDependency(
9381
return;
9482
}
9583

96-
const rawRequest = getWebpackDependencyRequest(
84+
const rawRequest = WebpackGraph.getWebpackDependencyRequest(
9785
webpackDep,
9886
resolvedWebpackModule,
9987
);
100-
const resolveRequest = getWebpackModulePath(resolvedWebpackModule);
88+
const resolveRequest = WebpackGraph.getWebpackModulePath(
89+
resolvedWebpackModule,
90+
);
10191
const request = rawRequest ?? resolveRequest;
10292

10393
if (!module.getDependencyByRequest(request)) {
@@ -107,7 +97,7 @@ function appendDependency(
10797
const dep = module.addDependency(
10898
request,
10999
depModule,
110-
getImportKind(webpackDep),
100+
ModuleGraphTrans.getImportKind(webpackDep),
111101
);
112102

113103
if (dep) {
@@ -127,7 +117,11 @@ function appendDependency(
127117
),
128118
});
129119

130-
const statement = getDependencyPosition(webpackDep, module, false);
120+
const statement = WebpackGraph.getDependencyPosition(
121+
webpackDep,
122+
module,
123+
false,
124+
);
131125

132126
if (statement) {
133127
dependency.addStatement(statement);
@@ -171,7 +165,9 @@ async function appendModuleData(
171165
features?: Plugin.RsdoctorWebpackPluginFeatures,
172166
context?: TransformContext,
173167
) {
174-
const module = graph.getModuleByWebpackId(getWebpackModuleId(origin));
168+
const module = graph.getModuleByWebpackId(
169+
WebpackGraph.getWebpackModuleId(origin),
170+
);
175171

176172
if (!origin || !module) {
177173
return;
@@ -194,14 +190,14 @@ async function appendModuleData(
194190
module.meta.hasSetEsModuleStatement = hasSetEsModuleStatement(program);
195191
}
196192

197-
const transformed = isExternalModule(origin)
193+
const transformed = WebpackGraph.isExternalModule(origin)
198194
? ''
199195
: module.getSource().transformed.length > 0
200196
? module.getSource().transformed
201197
: isFunction(origin?.originalSource)
202198
? (origin.originalSource()?.source()?.toString() ?? '')
203199
: '';
204-
const transformedSize = isExternalModule(origin)
200+
const transformedSize = WebpackGraph.isExternalModule(origin)
205201
? 0
206202
: module.getSize().transformedSize > 0
207203
? module.getSize().transformedSize
@@ -250,7 +246,7 @@ async function appendModuleData(
250246
// Record dependent data.
251247
Array.from(origin.dependencies)
252248
// Filter self-dependence and empty dependencies.
253-
.filter((item) => isImportDependency(item))
249+
.filter((item) => ModuleGraphTrans.isImportDependency(item))
254250
// Merge asynchronous dependencies.
255251
.concat(
256252
origin.blocks.reduce(
@@ -276,7 +272,7 @@ export async function appendModuleGraphByCompilation(
276272
// Only webpack will execute the following logic.
277273
const webpackCompilation = compilation as unknown as Webpack.Compilation;
278274
const { moduleGraph: webpackGraph, fileSystemInfo } = webpackCompilation;
279-
const allModules = getAllModules(webpackCompilation);
275+
const allModules = WebpackGraph.getAllModules(webpackCompilation);
280276

281277
await Promise.all(
282278
allModules.map((module: Webpack.NormalModule) => {
@@ -291,7 +287,7 @@ export async function appendModuleGraphByCompilation(
291287
}),
292288
);
293289

294-
removeNoImportStyle(graph);
290+
ModuleGraphTrans.removeNoImportStyle(graph);
295291
return graph;
296292
} catch (e) {
297293
return graph;

0 commit comments

Comments
 (0)