|
| 1 | +const _ = require('lodash') |
1 | 2 | const esprima = require('esprima') |
| 3 | +const traverse = require('ast-traverse') |
2 | 4 | const ParsedSource = require('./parsed-source') |
3 | 5 |
|
4 | 6 | class JsSource extends ParsedSource { |
5 | 7 | get type() { |
6 | 8 | return 'js' |
7 | 9 | } |
8 | 10 |
|
9 | | - _findWholeSelectorInTokens(selector) { |
10 | | - return this._tokensArray.find(token => ParsedSource.textContains(token, selector)) |
11 | | - } |
12 | | - |
13 | | - _findSelectorPartsInTokens(selector) { |
14 | | - if (selector.length === 0) { |
15 | | - return true |
16 | | - } |
17 | | - |
18 | | - for (let i = 1; i <= selector.length; i++) { |
19 | | - const part = selector.substr(0, i) |
20 | | - const rest = selector.substr(i) |
21 | | - if (this._tokens.has(part) && this._findSelectorPartsInTokens(rest)) { |
22 | | - return true |
23 | | - } |
24 | | - } |
25 | | - |
26 | | - return false |
27 | | - } |
28 | | - |
29 | | - contains(selector) { |
30 | | - return Boolean(this._tokens.has(selector) || |
31 | | - this._findWholeSelectorInTokens(selector) || |
32 | | - this._findSelectorPartsInTokens(selector)) |
33 | | - } |
34 | | - |
35 | 11 | static get joiner() { |
36 | 12 | return ';\n/* joined by nukecss */\n' |
37 | 13 | } |
38 | 14 |
|
39 | 15 | static parse(text) { |
40 | | - const jsStrings = esprima.tokenize(text) |
41 | | - .filter(token => token.type === 'String') |
42 | | - .map(token => token.value.substr(1, token.value.length - 2).toLowerCase()) |
43 | | - return new Set(jsStrings) |
| 16 | + const ancestry = [] |
| 17 | + const tokens = new Set() |
| 18 | + traverse(esprima.parse(text), { |
| 19 | + pre(node) { |
| 20 | + ancestry.push(node) |
| 21 | + if (node.type === 'Literal' && typeof node.value === 'string') { |
| 22 | + tokens.add(node.value) |
| 23 | + } else if (node.type === 'AssignmentExpression') { |
| 24 | + const identifierName = _.get(node, 'left.property.name') |
| 25 | + if (identifierName) { |
| 26 | + tokens.add(identifierName) |
| 27 | + } |
| 28 | + } else if (node.type === 'ObjectExpression') { |
| 29 | + node.properties.forEach(property => { |
| 30 | + if (property.key.type === 'Identifier') { |
| 31 | + tokens.add(property.key.name) |
| 32 | + } |
| 33 | + }) |
| 34 | + } |
| 35 | + }, |
| 36 | + post() { |
| 37 | + ancestry.pop() |
| 38 | + }, |
| 39 | + }) |
| 40 | + return tokens |
44 | 41 | } |
45 | 42 | } |
46 | 43 |
|
|
0 commit comments