Skip to content

Commit 854cf5c

Browse files
authored
feat: add support for processing multiple CSS rules (#27)
1 parent 14954fd commit 854cf5c

File tree

7 files changed

+128
-1
lines changed

7 files changed

+128
-1
lines changed

src/index.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,21 @@ export const pluginTypedCSSModules = (): RsbuildPlugin => ({
1313
order: 'post',
1414
handler: async (chain, { target, CHAIN_ID }) => {
1515
if (target === 'web') {
16-
const ruleIds = [
16+
const ruleIds: string[] = [
1717
CHAIN_ID.RULE.CSS,
1818
CHAIN_ID.RULE.SASS,
1919
CHAIN_ID.RULE.LESS,
2020
CHAIN_ID.RULE.STYLUS,
2121
];
2222

23+
for (const ruleId of ruleIds) {
24+
let index = 1;
25+
while (chain.module.rules.has(`${ruleId}-${index}`)) {
26+
ruleIds.push(`${ruleId}-${index}`);
27+
index++;
28+
}
29+
}
30+
2331
for (const ruleId of ruleIds) {
2432
if (!chain.module.rules.has(ruleId)) {
2533
continue;

test/multiple-rules/index.test.ts

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import fs from 'node:fs';
2+
import { dirname, join, resolve } from 'node:path';
3+
import { fileURLToPath } from 'node:url';
4+
import { expect, test } from '@playwright/test';
5+
import { createRsbuild } from '@rsbuild/core';
6+
import { pluginLess } from '@rsbuild/plugin-less';
7+
import { pluginSass } from '@rsbuild/plugin-sass';
8+
import { pluginTypedCSSModules } from '../../dist';
9+
10+
const __dirname = dirname(fileURLToPath(import.meta.url));
11+
12+
const generatorTempDir = async (testDir: string) => {
13+
fs.rmSync(testDir, { recursive: true, force: true });
14+
await fs.promises.cp(join(__dirname, 'src'), testDir, { recursive: true });
15+
16+
return () => fs.promises.rm(testDir, { force: true, recursive: true });
17+
};
18+
19+
test('generator TS declaration for multiple Less or Sass plugins', async () => {
20+
const testDir = join(__dirname, 'test-temp-src-1');
21+
const clear = await generatorTempDir(testDir);
22+
23+
const rsbuild = await createRsbuild({
24+
cwd: __dirname,
25+
rsbuildConfig: {
26+
plugins: [
27+
pluginSass({
28+
include: [/a\.module/],
29+
}),
30+
pluginSass({
31+
include: [/b\.module/],
32+
}),
33+
pluginLess({
34+
include: [/c\.module/],
35+
}),
36+
pluginLess({
37+
include: [/d\.module/],
38+
}),
39+
pluginTypedCSSModules(),
40+
],
41+
source: {
42+
entry: { index: resolve(testDir, 'index.js') },
43+
},
44+
},
45+
});
46+
47+
await rsbuild.build();
48+
49+
expect(fs.existsSync(join(testDir, './a.module.scss.d.ts'))).toBeTruthy();
50+
expect(fs.existsSync(join(testDir, './b.module.scss.d.ts'))).toBeTruthy();
51+
expect(fs.existsSync(join(testDir, './c.module.less.d.ts'))).toBeTruthy();
52+
expect(fs.existsSync(join(testDir, './d.module.less.d.ts'))).toBeTruthy();
53+
54+
const aContent = fs.readFileSync(join(testDir, './a.module.scss.d.ts'), {
55+
encoding: 'utf-8',
56+
});
57+
expect(aContent).toEqual(`// This file is automatically generated.
58+
// Please do not change this file!
59+
interface CssExports {
60+
a: string;
61+
}
62+
declare const cssExports: CssExports;
63+
export default cssExports;
64+
`);
65+
66+
const bContent = fs.readFileSync(join(testDir, './b.module.scss.d.ts'), {
67+
encoding: 'utf-8',
68+
});
69+
expect(bContent).toEqual(`// This file is automatically generated.
70+
// Please do not change this file!
71+
interface CssExports {
72+
b: string;
73+
}
74+
declare const cssExports: CssExports;
75+
export default cssExports;
76+
`);
77+
78+
const cContent = fs.readFileSync(join(testDir, './c.module.less.d.ts'), {
79+
encoding: 'utf-8',
80+
});
81+
expect(cContent).toEqual(`// This file is automatically generated.
82+
// Please do not change this file!
83+
interface CssExports {
84+
c: string;
85+
}
86+
declare const cssExports: CssExports;
87+
export default cssExports;
88+
`);
89+
90+
const dContent = fs.readFileSync(join(testDir, './d.module.less.d.ts'), {
91+
encoding: 'utf-8',
92+
});
93+
expect(dContent).toEqual(`// This file is automatically generated.
94+
// Please do not change this file!
95+
interface CssExports {
96+
d: string;
97+
}
98+
declare const cssExports: CssExports;
99+
export default cssExports;
100+
`);
101+
102+
await clear();
103+
});
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.a {
2+
font-size: 14px;
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.b {
2+
font-size: 14px;
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.c {
2+
color: yellow;
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.d {
2+
color: yellow;
3+
}

test/multiple-rules/src/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import './a.module.scss';
2+
import './b.module.scss';
3+
import './c.module.less';
4+
import './d.module.less';

0 commit comments

Comments
 (0)