Skip to content

Commit d332d62

Browse files
authored
flatten output by default (#82)
Most tools that consume the output from this module convert the output to a flat object, so we might as well do it here. Some thoughts: * Files in the test directory unflatten the results so I don't have to re-write the whole test suite for now (see #81) * There is (IMHO) better error handling for invalid css now closes #50
1 parent 950f329 commit d332d62

File tree

6 files changed

+152
-210
lines changed

6 files changed

+152
-210
lines changed

package-lock.json

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
"css-shorthand-expand": "^1.2.0",
5252
"css-unit-sort": "^1.1.1",
5353
"css-value-browser-h4cks-analyzer": "^1.0.1",
54+
"flat": "^4.1.0",
5455
"is-vendor-prefixed": "^1.0.0",
5556
"path": "^0.12.7",
5657
"postcss": "^7.0.2",

src/analyzer/index.js

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,37 @@
1+
const flat = require('flat')
12
const parser = require('../parser')
23

3-
module.exports = input => {
4+
function flattenObject(obj) {
5+
return flat(obj, {safe: true})
6+
}
7+
8+
module.exports = rawCss => {
49
return new Promise(async (resolve, reject) => {
5-
try {
6-
const css = await parser(input)
10+
const css = await parser(rawCss).catch(error => reject(error))
711

8-
const atrules = require('./atrules')(css.atRules)
9-
const rules = require('./rules')(css.rules)
10-
const selectors = require('./selectors')(css.selectors)
11-
const declarations = require('./declarations')(css.declarations)
12-
const properties = require('./properties')(css.declarations)
13-
const values = require('./values')(css.declarations)
14-
const stylesheets = require('./stylesheets')(
15-
input,
16-
atrules,
17-
rules,
18-
selectors,
19-
declarations,
20-
properties,
21-
values
22-
)
12+
// CSS undefined means that PostCSS encountered an error
13+
if (typeof css === 'undefined') {
14+
return reject(new Error('Invalid CSS found, cannot analyze invalid CSS'))
15+
}
2316

24-
resolve({
17+
const atrules = require('./atrules')(css.atRules)
18+
const rules = require('./rules')(css.rules)
19+
const selectors = require('./selectors')(css.selectors)
20+
const declarations = require('./declarations')(css.declarations)
21+
const properties = require('./properties')(css.declarations)
22+
const values = require('./values')(css.declarations)
23+
const stylesheets = require('./stylesheets')({
24+
rawCss,
25+
atrules,
26+
rules,
27+
selectors,
28+
declarations,
29+
properties,
30+
values
31+
})
32+
33+
return resolve(
34+
flattenObject({
2535
stylesheets,
2636
atrules,
2737
rules,
@@ -30,8 +40,6 @@ module.exports = input => {
3040
properties,
3141
values
3242
})
33-
} catch (error) {
34-
reject(error)
35-
}
43+
)
3644
})
3745
}

src/analyzer/stylesheets/index.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
module.exports = (
2-
raw,
1+
module.exports = ({
2+
rawCss,
33
atrules,
44
rules,
55
selectors,
66
declarations,
77
properties,
88
values
9-
) => {
10-
const size = Buffer.byteLength(raw, 'utf8')
9+
}) => {
10+
const size = Buffer.byteLength(rawCss, 'utf8')
1111
const simplicity = require('./simplicity.js')(rules, selectors)
1212
const cohesion = require('./cohesion.js')(rules, declarations)
1313
const browserhacks = require('./browserhacks.js')(

0 commit comments

Comments
 (0)