Skip to content

Commit e794dab

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

File tree

3 files changed

+59
-49
lines changed

3 files changed

+59
-49
lines changed

lib/index.js

Lines changed: 53 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -47,53 +47,63 @@ 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-
}
71-
72-
const sourceMap = options.sourceMap
7366

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 })
9082
}).then((config) => {
9183
if (!config) config = {}
84+
if (!config.options) config.options = {}
9285

9386
if (config.file) this.addDependency(config.file)
9487

88+
let sourceMap = options.sourceMap || config.options.map
9589
let plugins = config.plugins || []
96-
let options = Object.assign({
90+
91+
// Disable override `to` option
92+
if (config.options.to) {
93+
delete config.options.to;
94+
}
95+
96+
// Disable override `from` option
97+
if (config.options.from) {
98+
delete config.options.from;
99+
}
100+
101+
// Disable override `map` option
102+
if (config.options.map) {
103+
delete config.options.map;
104+
}
105+
106+
let postcssOption = Object.assign({
97107
to: file,
98108
from: file,
99109
map: sourceMap
@@ -105,20 +115,20 @@ module.exports = function loader (css, map) {
105115

106116
// Loader Exec (Deprecated)
107117
// https://webpack.js.org/api/loaders/#deprecated-context-properties
108-
if (options.parser === 'postcss-js') {
118+
if (postcssOption.parser === 'postcss-js') {
109119
css = this.exec(css, this.resource)
110120
}
111121

112-
if (typeof options.parser === 'string') {
113-
options.parser = require(options.parser)
122+
if (typeof postcssOption.parser === 'string') {
123+
postcssOption.parser = require(postcssOption.parser)
114124
}
115125

116-
if (typeof options.syntax === 'string') {
117-
options.syntax = require(options.syntax)
126+
if (typeof postcssOption.syntax === 'string') {
127+
postcssOption.syntax = require(postcssOption.syntax)
118128
}
119129

120-
if (typeof options.stringifier === 'string') {
121-
options.stringifier = require(options.stringifier)
130+
if (typeof postcssOption.stringifier === 'string') {
131+
postcssOption.stringifier = require(postcssOption.stringifier)
122132
}
123133

124134
// Loader API Exec (Deprecated)
@@ -132,10 +142,10 @@ module.exports = function loader (css, map) {
132142
}
133143

134144
if (sourceMap && typeof map === 'string') map = JSON.parse(map)
135-
if (sourceMap && map) options.map.prev = map
145+
if (sourceMap && map) postcssOption.map.prev = map
136146

137147
return postcss(plugins)
138-
.process(css, options)
148+
.process(css, postcssOption)
139149
.then((result) => {
140150
result.warnings().forEach((msg) => this.emitWarning(msg.toString()))
141151

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

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)