From b1f26b5b1c8eb79110fbcd1390a6de7159955403 Mon Sep 17 00:00:00 2001 From: Philipp Mandler Date: Fri, 13 Oct 2017 19:12:42 +0200 Subject: [PATCH] feat(parse): replace scss-extract with gonzales-pe fixes #18 --- package.json | 5 +++-- src/parse.js | 30 ++++++++++++++++++++++-------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index fb58835..3b5f302 100644 --- a/package.json +++ b/package.json @@ -30,9 +30,10 @@ }, "dependencies": { "bluebird": "^3.4.7", + "gonzales-pe": "^4.2.2", + "node-sass": "^4.5.3", "parse-color": "^1.0.0", - "query-ast": "^1.0.1", - "scss-parser": "^1.0.0" + "query-ast": "^1.0.1" }, "devDependencies": { "babel-cli": "^6.22.2", diff --git a/src/parse.js b/src/parse.js index ddcee80..5c087f7 100644 --- a/src/parse.js +++ b/src/parse.js @@ -1,5 +1,6 @@ -import { parse, stringify } from 'scss-parser'; +import { stringify } from 'scss-parser'; import createQueryWrapper from 'query-ast'; +import gonzales from 'gonzales-pe'; const SCOPE_IMPICIT = 'implicit'; const SCOPE_EXPLICIT = 'explicit'; @@ -39,7 +40,7 @@ function isDefaultDeclaration($ast, node) { */ function parseExpression($ast, declaration) { let flagsReached = false; - + return stringify($ast(declaration) .children('value') .get(0)) @@ -75,7 +76,7 @@ function getDeclarationDeps($ast, declaration, scope) { const requiredArgsCount = argumentsNode.children('variable').length(); const optionalArgsCount = argumentsNode.children('declaration').length(); const totalArgsCount = requiredArgsCount + optionalArgsCount; - + if(!DEP_KEYWORDS[atKeyword]) { return {}; } @@ -89,7 +90,7 @@ function getDeclarationDeps($ast, declaration, scope) { optional: optionalArgsCount, }, }, - }; + }; } /** @@ -97,7 +98,7 @@ function getDeclarationDeps($ast, declaration, scope) { */ function parseDeclaration($ast, declaration, scope) { const variable = {}; - + const propertyNode = $ast(declaration) .children('property'); @@ -121,15 +122,28 @@ function parseDeclaration($ast, declaration, scope) { * Parse variable declarations from a chunk of sass source */ export function parseDeclarations(data) { - const ast = parse(data); - const $ast = createQueryWrapper(ast); + const ast = JSON.parse(gonzales.parse(data, {syntax: 'scss'}).toJson()); + + let options = { + hasChildren: (node) => Array.isArray(node.content), + getChildren: (node) => node.content, + toJSON: (node, children) => { + return Object.assign({}, node, { + content: children ? children : node.content + }) + }, + toString: (node) => { + return typeof node.content === 'string' ? node.content : '' + } + } + const $ast = createQueryWrapper(ast, options); const implicitGlobalDeclarations = $ast('declaration').hasParent('stylesheet'); const explicitGlobalDeclarations = $ast('declaration').hasParent('block') .filter(node => isExplicitGlobalDeclaration($ast, node)); let implicitGlobals = implicitGlobalDeclarations.map(declaration => parseDeclaration($ast, declaration, SCOPE_IMPICIT)); - let explicitGlobals = explicitGlobalDeclarations.map(declaration => parseDeclaration($ast, declaration, SCOPE_EXPLICIT)); + let explicitGlobals = explicitGlobalDeclarations.map(declaration => parseDeclaration($ast, declaration, SCOPE_EXPLICIT)); return { explicitGlobals, implicitGlobals }; }