Skip to content

Commit c8848bd

Browse files
author
evilebottnawi
committed
refactor: improved loading algorithm of options and configs.
1 parent f7aa9a8 commit c8848bd

File tree

4 files changed

+56
-52
lines changed

4 files changed

+56
-52
lines changed

lib/index.js

Lines changed: 49 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -47,53 +47,57 @@ module.exports = function loader (css, map) {
4747

4848
validateOptions(require('./options.json'), options, 'PostCSS Loader')
4949

50-
const rc = {
51-
path: path.dirname(file),
52-
ctx: {
53-
file: {
54-
extname: path.extname(file),
55-
dirname: path.dirname(file),
56-
basename: path.basename(file)
57-
},
58-
options: {}
59-
}
60-
}
61-
62-
if (options.config) {
63-
if (options.config.path) {
64-
rc.path = path.resolve(options.config.path)
50+
Promise.resolve().then(() => {
51+
if (!options.config) {
52+
return parseOptions.call(this, options)
6553
}
6654

67-
if (options.config.ctx) {
68-
rc.ctx.options = options.config.ctx
55+
const rc = {
56+
path: path.dirname(file),
57+
ctx: {
58+
file: {
59+
extname: path.extname(file),
60+
dirname: path.dirname(file),
61+
basename: path.basename(file)
62+
},
63+
options: {}
64+
}
6965
}
70-
}
7166

72-
const sourceMap = options.sourceMap
73-
74-
Promise.resolve().then(() => {
75-
const length = Object.keys(options).length
76-
77-
// TODO
78-
// Refactor
79-
if (!options.config && !sourceMap && length) {
80-
return parseOptions.call(this, options)
81-
} else if (options.config && !sourceMap && length > 1) {
82-
return parseOptions.call(this, options)
83-
} else if (!options.config && sourceMap && length > 1) {
84-
return parseOptions.call(this, options)
85-
} else if (options.config && sourceMap && length > 2) {
86-
return parseOptions.call(this, options)
67+
// Read options from options.config only when options.config is object
68+
if (typeof options.config === 'object' &&
69+
options.config !== null &&
70+
Object.prototype.toString.call(options.config) === '[object Object]'
71+
) {
72+
if (options.config.path) {
73+
rc.path = path.resolve(options.config.path)
74+
}
75+
76+
if (options.config.ctx) {
77+
rc.ctx.options = options.config.ctx
78+
}
8779
}
8880

8981
return postcssrc(rc.ctx, rc.path, { argv: false })
90-
}).then((config) => {
91-
if (!config) config = {}
82+
.then((config) => {
83+
config.options.map = options.sourceMap
9284

85+
return config
86+
})
87+
}).then((config) => {
9388
if (config.file) this.addDependency(config.file)
9489

90+
let sourceMap = config.options.map
9591
let plugins = config.plugins || []
96-
let options = Object.assign({
92+
93+
// Disable override `to` option
94+
if (config.options.to) delete config.options.to
95+
// Disable override `from` option
96+
if (config.options.from) delete config.options.from
97+
// Disable override `map` option
98+
if (config.options.map) delete config.options.map
99+
100+
let postcssOption = Object.assign({
97101
to: file,
98102
from: file,
99103
map: sourceMap
@@ -105,20 +109,20 @@ module.exports = function loader (css, map) {
105109

106110
// Loader Exec (Deprecated)
107111
// https://webpack.js.org/api/loaders/#deprecated-context-properties
108-
if (options.parser === 'postcss-js') {
112+
if (postcssOption.parser === 'postcss-js') {
109113
css = this.exec(css, this.resource)
110114
}
111115

112-
if (typeof options.parser === 'string') {
113-
options.parser = require(options.parser)
116+
if (typeof postcssOption.parser === 'string') {
117+
postcssOption.parser = require(postcssOption.parser)
114118
}
115119

116-
if (typeof options.syntax === 'string') {
117-
options.syntax = require(options.syntax)
120+
if (typeof postcssOption.syntax === 'string') {
121+
postcssOption.syntax = require(postcssOption.syntax)
118122
}
119123

120-
if (typeof options.stringifier === 'string') {
121-
options.stringifier = require(options.stringifier)
124+
if (typeof postcssOption.stringifier === 'string') {
125+
postcssOption.stringifier = require(postcssOption.stringifier)
122126
}
123127

124128
// Loader API Exec (Deprecated)
@@ -132,10 +136,10 @@ module.exports = function loader (css, map) {
132136
}
133137

134138
if (sourceMap && typeof map === 'string') map = JSON.parse(map)
135-
if (sourceMap && map) options.map.prev = map
139+
if (sourceMap && map) postcssOption.map.prev = map
136140

137141
return postcss(plugins)
138-
.process(css, options)
142+
.process(css, postcssOption)
139143
.then((result) => {
140144
result.warnings().forEach((msg) => this.emitWarning(msg.toString()))
141145

lib/options.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,11 @@ module.exports = function parseOptions (params) {
1111
else if (Array.isArray(params.plugins)) plugins = params.plugins
1212
else plugins = params.plugins
1313

14-
const options = {}
15-
16-
if (typeof params !== 'undefined') {
17-
options.parser = params.parser
18-
options.syntax = params.syntax
19-
options.stringifier = params.stringifier
14+
const options = {
15+
parser: params.parser,
16+
syntax: params.syntax,
17+
stringifier: params.stringifier,
18+
map: params.sourceMap
2019
}
2120

2221
const exec = params && params.exec

lib/options.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"type": "object",
33
"properties": {
44
"config": {
5-
"type": "object",
5+
"type": ["object", "boolean"],
66
"properties": {
77
"path": {
88
"type": "string"

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
"docs": "jsdoc2md lib/index.js > LOADER.md",
3434
"pretest": "npm run lint && npm run test:build",
3535
"test": "jest",
36+
"test-only": "npm run test:build && jest && npm run clean",
3637
"test:build": "node test/webpack.build.js",
3738
"posttest": "npm run clean",
3839
"release": "standard-version"

0 commit comments

Comments
 (0)