Skip to content
This repository was archived by the owner on Jan 15, 2019. It is now read-only.

Commit 36f4a6e

Browse files
committed
Add default loaders for SASS
1 parent b5dfb85 commit 36f4a6e

File tree

3 files changed

+63
-21
lines changed

3 files changed

+63
-21
lines changed

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ Use the following file extensions for any CSS Modules styles:
2626
- `*.module.sass`
2727
- `*.module.scss`
2828

29-
Files with just a `*.css` file extension will load normally, without the CSS Modules loader.
29+
Files with the following file extensions will load normally, without the CSS Modules loader:
30+
31+
- `*.css`
32+
- `*.sass`
33+
- `*.scss`
3034

3135
### Example
3236

index.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,23 @@ const addBeforeRule = (rulesSource, ruleMatcher, value) => {
3333

3434
module.exports = function (config, env) {
3535
const cssRule = findRule(config.module.rules, cssRuleMatcher)
36+
const sassRule = cloneDeep(cssRule)
3637
const cssModulesRule = cloneDeep(cssRule)
38+
3739
cssRule.exclude = /\.module\.css$/
38-
const cssModulesRuleCssLoader = findRule(cssModulesRule, cssLoaderMatcher)
3940

41+
const cssModulesRuleCssLoader = findRule(cssModulesRule, cssLoaderMatcher)
4042
cssModulesRuleCssLoader.options = Object.assign({modules: true, localIdentName: '[local]___[hash:base64:5]'}, cssModulesRuleCssLoader.options)
43+
addBeforeRule(config.module.rules, fileLoaderMatcher, cssModulesRule)
44+
45+
sassRule.test = /\.s[ac]ss$/
46+
sassRule.exclude = /\.module\.s[ac]ss$/
47+
addAfterRule(sassRule, postcssLoaderMatcher, require.resolve('sass-loader'))
48+
addBeforeRule(config.module.rules, fileLoaderMatcher, sassRule)
4149

4250
const sassModulesRule = cloneDeep(cssModulesRule)
4351
sassModulesRule.test = /\.module\.s[ac]ss$/
4452
addAfterRule(sassModulesRule, postcssLoaderMatcher, require.resolve('sass-loader'))
45-
46-
addBeforeRule(config.module.rules, fileLoaderMatcher, cssModulesRule)
4753
addBeforeRule(config.module.rules, fileLoaderMatcher, sassModulesRule)
4854

4955
return config

index.test.js

Lines changed: 49 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -171,37 +171,69 @@ describe('CSS Modules rewire', () => {
171171
describe('development', () => {
172172

173173
const result = subject(mockDevelopmentConfig)
174+
const cssLoader = result.module.rules[1].oneOf[2]
174175
const cssModulesLoader = result.module.rules[1].oneOf[3]
175-
const sassModulesLoader = result.module.rules[1].oneOf[4]
176-
177-
it('should configure the test regex', () => {
178-
expect(sassModulesLoader.test).toEqual(/\.module\.s[ac]ss$/)
179-
})
176+
const sassLoader = result.module.rules[1].oneOf[4]
177+
const sassModulesLoader = result.module.rules[1].oneOf[5]
180178

181-
it('should build upon the CSS loader', () => {
182-
expect(sassModulesLoader.use.slice(0, 3)).toEqual(cssModulesLoader.use)
179+
describe('regular loader', () => {
180+
it('should configure a regular loader', () => {
181+
expect(sassLoader.test).toEqual(/\.s[ac]ss$/)
182+
expect(sassLoader.exclude).toEqual(/\.module\.s[ac]ss$/)
183+
})
184+
it('should build upon the CSS loader', () => {
185+
expect(sassLoader.use.slice(0, 3)).toEqual(cssLoader.use)
186+
})
187+
it('should append the sass-loader', () => {
188+
expect(sassLoader.use[3]).toContain('/sass-loader/')
189+
})
183190
})
184191

185-
it('should append the sass-loader', () => {
186-
expect(sassModulesLoader.use[3]).toContain('/sass-loader/')
192+
describe('modules loader', () => {
193+
it('should configure a modules loader', () => {
194+
expect(sassModulesLoader.test).toEqual(/\.module\.s[ac]ss$/)
195+
})
196+
it('should build upon the CSS loader', () => {
197+
expect(sassModulesLoader.use.slice(0, 3)).toEqual(cssModulesLoader.use)
198+
})
199+
it('should append the sass-loader', () => {
200+
expect(sassModulesLoader.use[3]).toContain('/sass-loader/')
201+
})
187202
})
188203
})
189204

190205
describe('production', () => {
191206
const result = subject(mockProductionConfig)
207+
const cssLoader = result.module.rules[1].oneOf[2]
192208
const cssModulesLoader = result.module.rules[1].oneOf[3]
193-
const sassModulesLoader = result.module.rules[1].oneOf[4]
209+
const sassLoader = result.module.rules[1].oneOf[4]
210+
const sassModulesLoader = result.module.rules[1].oneOf[5]
194211

195-
it('should configure the test regex', () => {
196-
expect(sassModulesLoader.test).toEqual(/\.module\.s[ac]ss$/)
212+
describe('regular loader', () => {
213+
it('should configure a regular loader', () => {
214+
expect(sassLoader.test).toEqual(/\.s[ac]ss$/)
215+
expect(sassLoader.exclude).toEqual(/\.module\.s[ac]ss$/)
216+
})
217+
it('should build upon the CSS loader', () => {
218+
expect(sassLoader.loader.slice(0, 4)).toEqual(cssLoader.loader)
219+
})
220+
it('should append the sass-loader', () => {
221+
expect(sassLoader.loader[4]).toContain('/sass-loader/')
222+
})
197223
})
198224

199-
it('should build upon the CSS loader', () => {
200-
expect(sassModulesLoader.loader.slice(0, 4)).toEqual(cssModulesLoader.loader)
201-
})
225+
describe('modules loader', () => {
226+
it('should configure the test regex', () => {
227+
expect(sassModulesLoader.test).toEqual(/\.module\.s[ac]ss$/)
228+
})
229+
230+
it('should build upon the CSS loader', () => {
231+
expect(sassModulesLoader.loader.slice(0, 4)).toEqual(cssModulesLoader.loader)
232+
})
202233

203-
it('should append the sass-loader', () => {
204-
expect(sassModulesLoader.loader[4]).toContain('/sass-loader/')
234+
it('should append the sass-loader', () => {
235+
expect(sassModulesLoader.loader[4]).toContain('/sass-loader/')
236+
})
205237
})
206238
})
207239
})

0 commit comments

Comments
 (0)