Skip to content

Commit 831cabd

Browse files
zhanbasorrycc
andauthored
feat: add css-modules-typescript-loader option (umijs#4373)
* feat: add css-modules-typescript-loader option * docs: update doc * fix: delete unused * test: add typecheck test * docs: update option order * fix: change option * Update packages/bundler-webpack/src/fixtures/css-modules-typescript-loader/config.ts * Update packages/bundler-webpack/src/fixtures/css-modules-typescript-loader/expect.ts * Update docs/config/README.md * Update docs/config/README.zh-CN.md * Update docs/config/README.zh-CN.md Co-authored-by: chencheng (云谦) <sorrycc@gmail.com>
1 parent 7992f2f commit 831cabd

File tree

12 files changed

+113
-0
lines changed

12 files changed

+113
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,5 @@
1212
.umi-test
1313
**/fixtures/**/dist
1414
.now
15+
**/*.less.d.ts
16+
**/*.css.d.ts

docs/config/README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,21 @@ export default {
162162

163163
设置 [css-loader 配置项](https://github.com/webpack-contrib/css-loader#options)
164164

165+
## cssModulesTypescriptLoader
166+
167+
* type: `{ mode: 'verify' | 'emit' }`
168+
* Default: `undefined`
169+
170+
Emits TypeScript declaration files matching your CSS Modules in the same location as your source files, e.g. src/Component.css will generate src/Component.css.d.ts.
171+
172+
```js
173+
export default {
174+
cssModulesTypescriptLoader: {},
175+
}
176+
}
177+
}
178+
```
179+
165180
## cssnano
166181

167182
* Type: `{ mergeRules: false, minifyFontValues: { removeQuotes: false } }`

docs/config/README.zh-CN.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,32 @@ export default {
160160

161161
设置 [css-loader 配置项](https://github.com/webpack-contrib/css-loader#options)
162162

163+
164+
## cssModulesTypescriptLoader
165+
166+
* type: `{ mode: 'verify' | 'emit' }`
167+
* Default: `undefined`
168+
169+
对按照css modules方式引入的css/less等样式文件,自动生成对应的ts类型定义文件。
170+
171+
比如:
172+
173+
```js
174+
export default {
175+
cssModulesTypescriptLoader: {},
176+
}
177+
```
178+
179+
等同于,
180+
181+
```js
182+
export default {
183+
cssModulesTypescriptLoader: {
184+
mode: 'emit',
185+
},
186+
}
187+
```
188+
163189
## cssnano
164190

165191
* Type: `{ mergeRules: false, minifyFontValues: { removeQuotes: false } }`

packages/bundler-webpack/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
"babel-loader": "8.1.0",
3636
"copy-webpack-plugin": "5.1.1",
3737
"css-loader": "3.4.2",
38+
"css-modules-typescript-loader": "4.0.0",
3839
"file-loader": "6.0.0",
3940
"friendly-errors-webpack-plugin": "1.7.0",
4041
"less": "3.11.1",
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default {
2+
cssModulesTypescriptLoader: {}
3+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { IExpectOpts } from '../types';
2+
import * as ts from 'typescript';
3+
import {resolve} from 'path';
4+
import { createDebug } from '@umijs/utils';
5+
6+
const debug = createDebug('umi:dtstest');
7+
8+
const typeCheckFile = (files: string[]): boolean => {
9+
let program = ts.createProgram(files, {});
10+
11+
let diagnostic: readonly ts.Diagnostic[] = [];
12+
for (const sourceFile of program.getSourceFiles()) {
13+
if (!sourceFile.isDeclarationFile) {
14+
diagnostic = [...diagnostic, ...program.getSemanticDiagnostics(sourceFile)];
15+
}
16+
}
17+
18+
debug('diagnostic: ', diagnostic);
19+
return diagnostic.length === 0;
20+
}
21+
22+
export default ({ indexCSS, files, cwd }: IExpectOpts) => {
23+
expect(indexCSS).toContain(`.a___`);
24+
expect(indexCSS).toContain(`.test___`);
25+
expect(typeCheckFile([resolve(cwd, 'index.ts')])).toBe(true);
26+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import styles from './style.less'
2+
import styles2 from './style2.css'
3+
4+
const classname = styles.a
5+
6+
const classname2 = styles2.test
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.a {
2+
color: white;
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.test {
2+
display: inline;
3+
}

packages/bundler-webpack/src/getConfig/css.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,13 @@ export function createCSSRule({
6363
});
6464
}
6565

66+
if (isDev && isCSSModules && config.cssModulesTypescriptLoader) {
67+
rule
68+
.use('css-modules-typescript-loader')
69+
.loader(require.resolve('css-modules-typescript-loader'))
70+
.options(config.cssModulesTypescriptLoader);
71+
}
72+
6673
rule
6774
.use('css-loader')
6875
.loader(require.resolve('css-loader'))

0 commit comments

Comments
 (0)