Skip to content

Commit 4ab406d

Browse files
committed
fix: correct use contextDependencies
1 parent be8a4b0 commit 4ab406d

File tree

3 files changed

+59
-27
lines changed

3 files changed

+59
-27
lines changed

packages/core/src/plugins/EntryChunkPlugin.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ class EntryChunkPlugin {
4646

4747
private enabledImportMetaUrlShim: boolean;
4848
private contextToWatch: string | null = null;
49-
private contextWatched = false;
5049

5150
constructor({
5251
enabledImportMetaUrlShim = true,
@@ -60,12 +59,21 @@ class EntryChunkPlugin {
6059
}
6160

6261
apply(compiler: Rspack.Compiler) {
63-
compiler.hooks.afterCompile.tap(PLUGIN_NAME, (compilation) => {
64-
if (this.contextWatched || this.contextToWatch === null) return;
62+
// TODO: contextDependencies now can only be added in `tapPromise` hook.
63+
// Change to `.tap` when it's supported.
64+
compiler.hooks.afterCompile.tapPromise(PLUGIN_NAME, (compilation) => {
65+
return new Promise((resolve) => {
66+
if (this.contextToWatch === null) {
67+
resolve();
68+
return;
69+
}
6570

66-
const contextDep = compilation.contextDependencies;
67-
contextDep.add(this.contextToWatch);
68-
this.contextWatched = true;
71+
const contextDep = compilation.contextDependencies;
72+
if (!contextDep.has(this.contextToWatch)) {
73+
contextDep.add(this.contextToWatch);
74+
}
75+
resolve();
76+
});
6977
});
7078

7179
compiler.hooks.make.tap(PLUGIN_NAME, (compilation) => {

tests/integration/cli/build-watch/build.test.ts

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { exec } from 'node:child_process';
1+
import { exec, spawn } from 'node:child_process';
22
import path from 'node:path';
3+
import { after } from 'node:test';
34
import fse from 'fs-extra';
45
import { awaitFileChanges, awaitFileExists } from 'test-helper';
56
import { describe, expect, test } from 'vitest';
@@ -59,46 +60,64 @@ describe('build --watch should handle add / change / unlink', async () => {
5960
const tempSrcPath = path.join(__dirname, 'test-temp-src');
6061
await fse.remove(tempSrcPath);
6162
await fse.remove(path.join(__dirname, 'dist'));
62-
await fse.copy(path.join(__dirname, 'src'), tempSrcPath);
63+
await fse.copy(path.join(__dirname, 'src'), path.resolve(tempSrcPath));
6364
const tempConfigFile = path.join(__dirname, 'test-temp-rslib.config.mjs');
6465
await fse.remove(tempConfigFile);
6566
fse.outputFileSync(
6667
tempConfigFile,
6768
`import { defineConfig } from '@rslib/core';
68-
import { generateBundleEsmConfig } from 'test-helper';
69+
import { generateBundleEsmConfig, generateBundleCjsConfig } from 'test-helper';
6970
7071
export default defineConfig({
7172
lib: [
7273
generateBundleEsmConfig({
73-
source: {
74-
entry: {
75-
index: 'test-temp-src',
76-
},
77-
},
74+
bundle: false,
75+
}),
76+
generateBundleCjsConfig({
7877
bundle: false,
7978
}),
8079
],
80+
source: {
81+
entry: {
82+
index: ['./test-temp-src/**'],
83+
},
84+
},
8185
});
8286
`,
8387
);
8488

8589
const srcIndexFile = path.join(tempSrcPath, 'index.ts');
86-
const srcFooFile = path.join(tempSrcPath, 'foo.js');
90+
const srcFooFile = path.join(tempSrcPath, 'foo.ts');
91+
const srcFoo2File = path.join(tempSrcPath, 'foo2.ts');
92+
const distIndexFile = path.join(__dirname, 'dist/esm/index.js');
8793
const distFooFile = path.join(__dirname, 'dist/esm/foo.js');
94+
const distFoo2File = path.join(__dirname, 'dist/esm/foo2.js');
8895

89-
const process = exec(`npx rslib build --watch -c ${tempConfigFile}`, {
96+
const command = 'npx';
97+
const args = ['rslib', 'build', '--watch', '-c', tempConfigFile];
98+
const child = spawn(command, args, {
9099
cwd: __dirname,
100+
stdio: 'inherit', // 将子进程的 stdin、stdout、stderr 直接绑定到父进程
101+
shell: true, // 使用 shell 执行,方便处理复杂的命令
91102
});
92103

93-
// add
104+
await awaitFileExists(distIndexFile);
105+
94106
fse.outputFileSync(srcFooFile, `export const foo = 'foo';`);
95-
await awaitFileExists(distFooFile);
107+
fse.outputFileSync(srcFoo2File, `export const foo2 = 'foo2';`);
108+
await awaitFileExists(distFoo2File);
96109
const content1 = await fse.readFile(distFooFile, 'utf-8');
97110
expect(content1!).toMatchInlineSnapshot(`
98111
"const foo = 'foo';
99112
export { foo };
100113
"
101114
`);
115+
const content2 = await fse.readFile(distFoo2File, 'utf-8');
116+
expect(content2!).toMatchInlineSnapshot(`
117+
"const foo2 = 'foo2';
118+
export { foo2 };
119+
"
120+
`);
102121

103122
// unlink
104123
// Following "change" cases won't succeed if error is thrown in this step.
@@ -108,13 +127,15 @@ describe('build --watch should handle add / change / unlink', async () => {
108127
const wait = await awaitFileChanges(distFooFile);
109128
fse.outputFileSync(srcFooFile, `export const foo = 'foo1';`);
110129
await wait();
111-
const content2 = await fse.readFile(distFooFile, 'utf-8');
112-
expect(content2!).toMatchInlineSnapshot(`
130+
const content3 = await fse.readFile(distFooFile, 'utf-8');
131+
expect(content3!).toMatchInlineSnapshot(`
113132
"const foo = 'foo1';
114133
export { foo };
115134
"
116135
`);
117136

118-
process.kill();
137+
after(() => {
138+
child.kill();
139+
});
119140
});
120141
});
Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
import { defineConfig } from '@rslib/core';
2-
import { generateBundleEsmConfig } from 'test-helper';
2+
import { generateBundleCjsConfig, generateBundleEsmConfig } from 'test-helper';
33

44
export default defineConfig({
55
lib: [
6+
generateBundleCjsConfig({
7+
bundle: false,
8+
}),
69
generateBundleEsmConfig({
7-
source: {
8-
entry: {
9-
index: 'src',
10-
},
11-
},
1210
bundle: false,
1311
}),
1412
],
13+
source: {
14+
entry: {
15+
index: ['./src/**'],
16+
},
17+
},
1518
});

0 commit comments

Comments
 (0)