Skip to content

Commit 8903e6d

Browse files
committed
fix: css check
1 parent cf7ff5e commit 8903e6d

File tree

17 files changed

+139
-31
lines changed

17 files changed

+139
-31
lines changed

packages/core/src/config.ts

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1007,18 +1007,6 @@ const composeBundlelessExternalConfig = (
10071007
if (contextInfo.issuer) {
10081008
let resolvedRequest: string = request;
10091009

1010-
const cssExternal = cssExternalHandler(
1011-
resolvedRequest,
1012-
callback,
1013-
jsExtension,
1014-
cssModulesAuto,
1015-
isStyleRedirected,
1016-
);
1017-
1018-
if (cssExternal !== false) {
1019-
return cssExternal;
1020-
}
1021-
10221010
if (jsRedirectPath) {
10231011
try {
10241012
resolvedRequest = await resolver(context, resolvedRequest);
@@ -1043,6 +1031,21 @@ const composeBundlelessExternalConfig = (
10431031
}
10441032
}
10451033

1034+
const cssExternal = cssExternalHandler(
1035+
resolvedRequest,
1036+
callback,
1037+
jsExtension,
1038+
jsRedirectExtension,
1039+
cssModulesAuto,
1040+
isStyleRedirected,
1041+
);
1042+
1043+
console.log(cssExternal, resolvedRequest, 11111);
1044+
1045+
if (cssExternal !== false) {
1046+
return cssExternal;
1047+
}
1048+
10461049
// Node.js ECMAScript module loader does no extension searching.
10471050
// Add a file extension according to autoExtension config
10481051
// when data.request is a relative path and do not have an extension.

packages/core/src/css/cssConfig.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,10 @@ export function cssExternalHandler(
8383
request: string,
8484
callback: ExternalCallback,
8585
jsExtension: string,
86+
jsRedirectExtension: boolean,
8687
auto: CssLoaderOptionsAuto,
8788
isStyleRedirect: boolean,
8889
): void | false {
89-
const isCssModulesRequest = isCssModulesFile(request, auto);
90-
9190
// cssExtract would execute the file handled by css-loader, so we cannot external the "helper import" from css-loader
9291
// do not external @rsbuild/core/compiled/css-loader/noSourceMaps.js, sourceMaps.js, api.mjs etc.
9392
if (/compiled\/css-loader\//.test(request)) {
@@ -101,8 +100,14 @@ export function cssExternalHandler(
101100
if (!isStyleRedirect) {
102101
return callback(undefined, request);
103102
}
103+
const isCssModulesRequest = isCssModulesFile(request, auto);
104104
if (isCssModulesRequest) {
105-
return callback(undefined, request.replace(/\.[^.]+$/, jsExtension));
105+
return callback(
106+
undefined,
107+
jsRedirectExtension
108+
? request.replace(/\.[^.]+$/, jsExtension)
109+
: request,
110+
);
106111
}
107112
return callback(undefined, request.replace(/\.[^.]+$/, '.css'));
108113
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"name": "redirect-js-import-css-test",
3+
"version": "1.0.0",
4+
"private": true,
5+
"type": "module"
6+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { defineConfig } from '@rslib/core';
2+
import { generateBundleCjsConfig, generateBundleEsmConfig } from 'test-helper';
3+
4+
export default defineConfig({
5+
lib: [
6+
generateBundleEsmConfig({
7+
bundle: false,
8+
}),
9+
generateBundleCjsConfig({
10+
bundle: false,
11+
}),
12+
],
13+
source: {
14+
entry: {
15+
index: ['./src/**'],
16+
},
17+
},
18+
output: {
19+
target: 'web',
20+
},
21+
});
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.foo {
2+
color: red;
3+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import '@/css/index.css';
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.foo {
2+
color: red;
3+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// @ts-ignore env.d.ts
2+
import styles from '@/module/index.module.css';
3+
4+
styles;
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"extends": "@rslib/tsconfig/base",
3+
"compilerOptions": {
4+
"baseUrl": "./",
5+
"paths": {
6+
"@/*": ["./src/*"]
7+
}
8+
},
9+
"include": ["src"]
10+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import path from 'node:path';
2+
import { buildAndGetResults, getFileBySuffix } from 'test-helper';
3+
import { expect, test } from 'vitest';
4+
5+
test('should handle the crossing case import "@/css/button.css"', async () => {
6+
const fixturePath = path.resolve(__dirname, './js-import-css');
7+
const { contents } = await buildAndGetResults({ fixturePath });
8+
console.log(contents);
9+
const esmFiles = Object.keys(contents.esm);
10+
expect(esmFiles).toMatchInlineSnapshot(`
11+
[
12+
"<ROOT>/tests/integration/redirect/js-import-css/dist/esm/css/index.js",
13+
"<ROOT>/tests/integration/redirect/js-import-css/dist/esm/module/index.js",
14+
"<ROOT>/tests/integration/redirect/js-import-css/dist/esm/module/index.module.js",
15+
]
16+
`);
17+
const cssIndexJs = getFileBySuffix(contents.esm, 'css/index.js');
18+
expect(cssIndexJs).toMatchInlineSnapshot(`
19+
"import "./index.css";
20+
"
21+
`);
22+
const cssModuleIndexJs = getFileBySuffix(contents.esm, 'module/index.js');
23+
expect(cssModuleIndexJs).toMatchInlineSnapshot(`
24+
"import * as __WEBPACK_EXTERNAL_MODULE__index_module_js_6796f91d__ from "./index.module.js";
25+
__WEBPACK_EXTERNAL_MODULE__index_module_js_6796f91d__["default"];
26+
"
27+
`);
28+
29+
const cjsFiles = Object.keys(contents.cjs);
30+
expect(cjsFiles).toMatchInlineSnapshot(`
31+
[
32+
"<ROOT>/tests/integration/redirect/js-import-css/dist/cjs/css/index.cjs",
33+
"<ROOT>/tests/integration/redirect/js-import-css/dist/cjs/module/index.cjs",
34+
"<ROOT>/tests/integration/redirect/js-import-css/dist/cjs/module/index.module.cjs",
35+
]
36+
`);
37+
const cssIndexCjs = getFileBySuffix(contents.cjs, 'css/index.cjs');
38+
expect(cssIndexCjs).toContain('require("./index.css")');
39+
const cssModuleIndexCjs = getFileBySuffix(contents.cjs, 'module/index.cjs');
40+
expect(cssModuleIndexCjs).toContain('require("./index.module.cjs")');
41+
});

tests/integration/redirect/style-false/rslib.config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ export default defineConfig({
1818
],
1919
source: {
2020
entry: {
21-
index: ['./src/index.ts'],
21+
index: ['./src/less/index.ts', './src/module/index.ts'],
2222
},
2323
},
2424
output: {
2525
target: 'web',
26-
copy: [{ from: './src/index.less' }, { from: './src/style.module.less' }],
26+
copy: [{ from: './**/*.less', context: './src' }],
2727
},
2828
});

tests/integration/redirect/style-false/src/index.ts

Lines changed: 0 additions & 4 deletions
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import './index.less';
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// @ts-ignore env.d.ts
2+
import styles from './index.module.less';
3+
4+
styles;
Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import path from 'node:path';
2-
import { buildAndGetResults } from 'test-helper';
3-
import { expectFileContainContent } from 'test-helper/vitest';
2+
import { buildAndGetResults, getFileBySuffix } from 'test-helper';
43
import { expect, test } from 'vitest';
54

65
test('should extract css successfully when using redirect.style = false', async () => {
@@ -9,20 +8,31 @@ test('should extract css successfully when using redirect.style = false', async
98
const esmFiles = Object.keys(contents.esm);
109
expect(esmFiles).toMatchInlineSnapshot(`
1110
[
12-
"<ROOT>/tests/integration/redirect/style-false/dist/esm/index.js",
11+
"<ROOT>/tests/integration/redirect/style-false/dist/esm/less/index.js",
12+
"<ROOT>/tests/integration/redirect/style-false/dist/esm/module/index.js",
1313
]
1414
`);
15-
expectFileContainContent(contents.esm, 'index.js', 'import "./index.less";');
15+
const lessIndexJs = getFileBySuffix(contents.esm, 'less/index.js');
16+
expect(lessIndexJs).toMatchInlineSnapshot(`
17+
"import "./index.less";
18+
"
19+
`);
20+
const lessModuleIndexJs = getFileBySuffix(contents.esm, 'module/index.js');
21+
expect(lessModuleIndexJs).toMatchInlineSnapshot(`
22+
"import * as __WEBPACK_EXTERNAL_MODULE__index_module_less_d1c6f702__ from "./index.module.less";
23+
__WEBPACK_EXTERNAL_MODULE__index_module_less_d1c6f702__["default"];
24+
"
25+
`);
1626

1727
const cjsFiles = Object.keys(contents.cjs);
1828
expect(cjsFiles).toMatchInlineSnapshot(`
1929
[
20-
"<ROOT>/tests/integration/redirect/style-false/dist/cjs/index.cjs",
30+
"<ROOT>/tests/integration/redirect/style-false/dist/cjs/less/index.cjs",
31+
"<ROOT>/tests/integration/redirect/style-false/dist/cjs/module/index.cjs",
2132
]
2233
`);
23-
expectFileContainContent(
24-
contents.cjs,
25-
'index.cjs',
26-
'require("./index.less")',
27-
);
34+
const lessIndexCjs = getFileBySuffix(contents.cjs, 'less/index.cjs');
35+
expect(lessIndexCjs).toContain('require("./index.less");');
36+
const lessModuleIndexCjs = getFileBySuffix(contents.cjs, 'module/index.cjs');
37+
expect(lessModuleIndexCjs).toContain('require("./index.module.less")');
2838
});

0 commit comments

Comments
 (0)