Socket
Socket
Sign inDemoInstall

sugarss

Package Overview
Dependencies
4
Maintainers
1
Versions
18
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 2.0.0 to 3.0.0

index.mjs

5

CHANGELOG.md
# Change Log
This project adheres to [Semantic Versioning](http://semver.org/).
## 3.0
* Removed support for Node.js 6.x, 8.x, 11.x, and 13.x versions.
* Moved to PostCSS 8.0.
* Added ES modules support.
## 2.0

@@ -5,0 +10,0 @@ * Remove Node.js 9 and Node.js 4 support (by Aleks Hudochenkov).

19

index.js

@@ -1,17 +0,4 @@

'use strict';
let stringify = require('./stringify')
let parse = require('./parse')
exports.__esModule = true;
var _stringify = require('./stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _parse = require('./parse');
var _parse2 = _interopRequireDefault(_parse);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.default = { stringify: _stringify2.default, parse: _parse2.default };
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmVzNiJdLCJuYW1lcyI6WyJzdHJpbmdpZnkiLCJwYXJzZSJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBOzs7O0FBQ0E7Ozs7OztrQkFFZSxFQUFFQSw4QkFBRixFQUFhQyxzQkFBYixFIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeSdcbmltcG9ydCBwYXJzZSBmcm9tICcuL3BhcnNlJ1xuXG5leHBvcnQgZGVmYXVsdCB7IHN0cmluZ2lmeSwgcGFyc2UgfVxuIl19
module.exports = { stringify, parse }

@@ -1,36 +0,17 @@

'use strict';
exports.__esModule = true;
exports.default = liner;
function liner(tokens) {
var line = [];
var result = [line];
var brackets = 0;
for (var _iterator = tokens, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var _ref;
if (_isArray) {
if (_i >= _iterator.length) break;
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
_ref = _i.value;
}
var token = _ref;
line.push(token);
module.exports = function liner (tokens) {
let line = []
let result = [line]
let brackets = 0
for (let token of tokens) {
line.push(token)
if (token[0] === '(') {
brackets += 1;
brackets += 1
} else if (token[0] === ')') {
brackets -= 1;
brackets -= 1
} else if (token[0] === 'newline' && brackets === 0) {
line = [];
result.push(line);
line = []
result.push(line)
}
}
return result;
return result
}
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpbmVyLmVzNiJdLCJuYW1lcyI6WyJsaW5lciIsInRva2VucyIsImxpbmUiLCJyZXN1bHQiLCJicmFja2V0cyIsInRva2VuIiwicHVzaCJdLCJtYXBwaW5ncyI6Ijs7O2tCQUF3QkEsSztBQUFULFNBQVNBLEtBQVQsQ0FBZ0JDLE1BQWhCLEVBQXdCO0FBQ3JDLE1BQUlDLE9BQU8sRUFBWDtBQUNBLE1BQUlDLFNBQVMsQ0FBQ0QsSUFBRCxDQUFiO0FBQ0EsTUFBSUUsV0FBVyxDQUFmO0FBQ0EsdUJBQWtCSCxNQUFsQixrSEFBMEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBLFFBQWpCSSxLQUFpQjs7QUFDeEJILFNBQUtJLElBQUwsQ0FBVUQsS0FBVjtBQUNBLFFBQUlBLE1BQU0sQ0FBTixNQUFhLEdBQWpCLEVBQXNCO0FBQ3BCRCxrQkFBWSxDQUFaO0FBQ0QsS0FGRCxNQUVPLElBQUlDLE1BQU0sQ0FBTixNQUFhLEdBQWpCLEVBQXNCO0FBQzNCRCxrQkFBWSxDQUFaO0FBQ0QsS0FGTSxNQUVBLElBQUlDLE1BQU0sQ0FBTixNQUFhLFNBQWIsSUFBMEJELGFBQWEsQ0FBM0MsRUFBOEM7QUFDbkRGLGFBQU8sRUFBUDtBQUNBQyxhQUFPRyxJQUFQLENBQVlKLElBQVo7QUFDRDtBQUNGO0FBQ0QsU0FBT0MsTUFBUDtBQUNEIiwiZmlsZSI6ImxpbmVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGluZXIgKHRva2Vucykge1xuICBsZXQgbGluZSA9IFtdXG4gIGxldCByZXN1bHQgPSBbbGluZV1cbiAgbGV0IGJyYWNrZXRzID0gMFxuICBmb3IgKGxldCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICBsaW5lLnB1c2godG9rZW4pXG4gICAgaWYgKHRva2VuWzBdID09PSAnKCcpIHtcbiAgICAgIGJyYWNrZXRzICs9IDFcbiAgICB9IGVsc2UgaWYgKHRva2VuWzBdID09PSAnKScpIHtcbiAgICAgIGJyYWNrZXRzIC09IDFcbiAgICB9IGVsc2UgaWYgKHRva2VuWzBdID09PSAnbmV3bGluZScgJiYgYnJhY2tldHMgPT09IDApIHtcbiAgICAgIGxpbmUgPSBbXVxuICAgICAgcmVzdWx0LnB1c2gobGluZSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuIl19
{
"name": "sugarss",
"version": "2.0.0",
"version": "3.0.0",
"description": "Indent-based CSS syntax for PostCSS",

@@ -17,4 +17,14 @@ "keywords": [

"dependencies": {
"postcss": "^7.0.2"
"postcss": "^8.0.2"
},
"engines": {
"node": ">=10.0"
},
"exports": {
".": {
"require": "./index.js",
"import": "./index.mjs"
},
"./": "./"
}
}

@@ -1,39 +0,17 @@

'use strict';
let { Input } = require('postcss')
exports.__esModule = true;
exports.default = parse;
let preprocess = require('./preprocess')
let tokenizer = require('./tokenize')
let Parser = require('./parser')
let liner = require('./liner')
var _input = require('postcss/lib/input');
module.exports = function parse (source, opts) {
let input = new Input(source, opts)
var _input2 = _interopRequireDefault(_input);
let parser = new Parser(input)
parser.tokens = tokenizer(input)
parser.parts = preprocess(input, liner(parser.tokens))
parser.loop()
var _preprocess = require('./preprocess');
var _preprocess2 = _interopRequireDefault(_preprocess);
var _tokenize = require('./tokenize');
var _tokenize2 = _interopRequireDefault(_tokenize);
var _parser = require('./parser');
var _parser2 = _interopRequireDefault(_parser);
var _liner = require('./liner');
var _liner2 = _interopRequireDefault(_liner);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function parse(source, opts) {
var input = new _input2.default(source, opts);
var parser = new _parser2.default(input);
parser.tokens = (0, _tokenize2.default)(input);
parser.parts = (0, _preprocess2.default)(input, (0, _liner2.default)(parser.tokens));
parser.loop();
return parser.root;
return parser.root
}
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBhcnNlLmVzNiJdLCJuYW1lcyI6WyJwYXJzZSIsInNvdXJjZSIsIm9wdHMiLCJpbnB1dCIsIklucHV0IiwicGFyc2VyIiwiUGFyc2VyIiwidG9rZW5zIiwicGFydHMiLCJsb29wIiwicm9vdCJdLCJtYXBwaW5ncyI6Ijs7O2tCQU93QkEsSzs7QUFQeEI7Ozs7QUFFQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRWUsU0FBU0EsS0FBVCxDQUFnQkMsTUFBaEIsRUFBd0JDLElBQXhCLEVBQThCO0FBQzNDLE1BQUlDLFFBQVEsSUFBSUMsZUFBSixDQUFVSCxNQUFWLEVBQWtCQyxJQUFsQixDQUFaOztBQUVBLE1BQUlHLFNBQVMsSUFBSUMsZ0JBQUosQ0FBV0gsS0FBWCxDQUFiO0FBQ0FFLFNBQU9FLE1BQVAsR0FBZ0Isd0JBQVVKLEtBQVYsQ0FBaEI7QUFDQUUsU0FBT0csS0FBUCxHQUFlLDBCQUFXTCxLQUFYLEVBQWtCLHFCQUFNRSxPQUFPRSxNQUFiLENBQWxCLENBQWY7QUFDQUYsU0FBT0ksSUFBUDs7QUFFQSxTQUFPSixPQUFPSyxJQUFkO0FBQ0QiLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgSW5wdXQgZnJvbSAncG9zdGNzcy9saWIvaW5wdXQnXG5cbmltcG9ydCBwcmVwcm9jZXNzIGZyb20gJy4vcHJlcHJvY2VzcydcbmltcG9ydCB0b2tlbml6ZXIgZnJvbSAnLi90b2tlbml6ZSdcbmltcG9ydCBQYXJzZXIgZnJvbSAnLi9wYXJzZXInXG5pbXBvcnQgbGluZXIgZnJvbSAnLi9saW5lcidcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGFyc2UgKHNvdXJjZSwgb3B0cykge1xuICBsZXQgaW5wdXQgPSBuZXcgSW5wdXQoc291cmNlLCBvcHRzKVxuXG4gIGxldCBwYXJzZXIgPSBuZXcgUGFyc2VyKGlucHV0KVxuICBwYXJzZXIudG9rZW5zID0gdG9rZW5pemVyKGlucHV0KVxuICBwYXJzZXIucGFydHMgPSBwcmVwcm9jZXNzKGlucHV0LCBsaW5lcihwYXJzZXIudG9rZW5zKSlcbiAgcGFyc2VyLmxvb3AoKVxuXG4gIHJldHVybiBwYXJzZXIucm9vdFxufVxuIl19

@@ -1,165 +0,142 @@

'use strict';
let { Declaration, Comment, AtRule, Rule, Root } = require('postcss')
exports.__esModule = true;
module.exports = class Parser {
constructor (input) {
this.input = input
var _declaration = require('postcss/lib/declaration');
this.pos = 0
this.root = new Root()
this.current = this.root
this.spaces = ''
var _declaration2 = _interopRequireDefault(_declaration);
this.extraIndent = false
this.prevIndent = undefined
this.step = undefined
var _comment = require('postcss/lib/comment');
var _comment2 = _interopRequireDefault(_comment);
var _atRule = require('postcss/lib/at-rule');
var _atRule2 = _interopRequireDefault(_atRule);
var _rule = require('postcss/lib/rule');
var _rule2 = _interopRequireDefault(_rule);
var _root = require('postcss/lib/root');
var _root2 = _interopRequireDefault(_root);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Parser = function () {
function Parser(input) {
_classCallCheck(this, Parser);
this.input = input;
this.pos = 0;
this.root = new _root2.default();
this.current = this.root;
this.spaces = '';
this.extraIndent = false;
this.prevIndent = undefined;
this.step = undefined;
this.root.source = { input: input, start: { line: 1, column: 1 } };
this.root.source = { input, start: { line: 1, column: 1 } }
}
Parser.prototype.loop = function loop() {
var part = void 0;
loop () {
let part
while (this.pos < this.parts.length) {
part = this.parts[this.pos];
part = this.parts[this.pos]
if (part.comment) {
this.comment(part);
this.comment(part)
} else if (part.atrule) {
this.atrule(part);
this.atrule(part)
} else if (part.colon) {
var next = this.nextNonComment(this.pos);
let next = this.nextNonComment(this.pos)
if (next.end || next.atrule) {
this.decl(part);
this.decl(part)
} else {
var moreIndent = next.indent.length > part.indent.length;
let moreIndent = next.indent.length > part.indent.length
if (!moreIndent) {
this.decl(part);
this.decl(part)
} else if (moreIndent && next.colon) {
this.rule(part);
this.rule(part)
} else if (moreIndent && !next.colon) {
this.decl(part);
this.decl(part)
}
}
} else if (part.end) {
this.root.raws.after = part.before;
this.root.raws.after = part.before
} else {
this.rule(part);
this.rule(part)
}
this.pos += 1;
this.pos += 1
}
for (var i = this.tokens.length - 1; i >= 0; i--) {
for (let i = this.tokens.length - 1; i >= 0; i--) {
if (this.tokens[i].length > 3) {
var last = this.tokens[i];
let last = this.tokens[i]
this.root.source.end = {
line: last[4] || last[2],
column: last[5] || last[3]
};
break;
}
break
}
}
};
}
Parser.prototype.comment = function comment(part) {
var token = part.tokens[0];
var node = new _comment2.default();
this.init(node, part);
node.source.end = { line: token[4], column: token[5] };
this.commentText(node, token);
};
comment (part) {
let token = part.tokens[0]
let node = new Comment()
this.init(node, part)
node.source.end = { line: token[4], column: token[5] }
this.commentText(node, token)
}
Parser.prototype.atrule = function atrule(part) {
var atword = part.tokens[0];
var params = part.tokens.slice(1);
atrule (part) {
let atword = part.tokens[0]
let params = part.tokens.slice(1)
var node = new _atRule2.default();
node.name = atword[1].slice(1);
this.init(node, part);
let node = new AtRule()
node.name = atword[1].slice(1)
this.init(node, part)
if (node.name === '') this.unnamedAtrule(atword);
if (node.name === '') this.unnamedAtrule(atword)
while (!part.end && part.lastComma) {
this.pos += 1;
part = this.parts[this.pos];
params.push(['space', part.before + part.indent]);
params = params.concat(part.tokens);
this.pos += 1
part = this.parts[this.pos]
params.push(['space', part.before + part.indent])
params = params.concat(part.tokens)
}
node.raws.afterName = this.firstSpaces(params);
this.keepTrailingSpace(node, params);
this.checkSemicolon(params);
this.checkCurly(params);
this.raw(node, 'params', params, atword);
};
node.raws.afterName = this.firstSpaces(params)
this.keepTrailingSpace(node, params)
this.checkSemicolon(params)
this.checkCurly(params)
this.raw(node, 'params', params, atword)
}
Parser.prototype.decl = function decl(part) {
var node = new _declaration2.default();
this.init(node, part);
decl (part) {
let node = new Declaration()
this.init(node, part)
var between = '';
var colon = 0;
var value = [];
var prop = '';
for (var i = 0; i < part.tokens.length; i++) {
var token = part.tokens[i];
let between = ''
let colon = 0
let value = []
let prop = ''
for (let i = 0; i < part.tokens.length; i++) {
let token = part.tokens[i]
if (token[0] === ':') {
between += token[1];
colon = token;
value = part.tokens.slice(i + 1);
break;
between += token[1]
colon = token
value = part.tokens.slice(i + 1)
break
} else if (token[0] === 'comment' || token[0] === 'space') {
between += token[1];
between += token[1]
} else if (between !== '') {
this.badProp(token);
this.badProp(token)
} else {
prop += token[1];
prop += token[1]
}
}
if (prop === '') this.unnamedDecl(part.tokens[0]);
node.prop = prop;
if (prop === '') this.unnamedDecl(part.tokens[0])
node.prop = prop
var next = this.parts[this.pos + 1];
let next = this.parts[this.pos + 1]
while (!next.end && !next.atrule && !next.colon && next.indent.length > part.indent.length) {
value.push(['space', next.before + next.indent]);
value = value.concat(next.tokens);
this.pos += 1;
next = this.parts[this.pos + 1];
while (
!next.end &&
!next.atrule &&
!next.colon &&
next.indent.length > part.indent.length
) {
value.push(['space', next.before + next.indent])
value = value.concat(next.tokens)
this.pos += 1
next = this.parts[this.pos + 1]
}
var last = value[value.length - 1];
let last = value[value.length - 1]
if (last && last[0] === 'comment') {
value.pop();
var comment = new _comment2.default();
this.current.push(comment);
value.pop()
let comment = new Comment()
this.current.push(comment)
comment.source = {

@@ -169,84 +146,84 @@ input: this.input,

end: { line: last[4], column: last[5] }
};
var prev = value[value.length - 1];
}
let prev = value[value.length - 1]
if (prev && prev[0] === 'space') {
value.pop();
comment.raws.before = prev[1];
value.pop()
comment.raws.before = prev[1]
}
this.commentText(comment, last);
this.commentText(comment, last)
}
for (var _i = value.length - 1; _i > 0; _i--) {
var t = value[_i][0];
if (t === 'word' && value[_i][1] === '!important') {
node.important = true;
if (_i > 0 && value[_i - 1][0] === 'space') {
node.raws.important = value[_i - 1][1] + '!important';
value.splice(_i - 1, 2);
for (let i = value.length - 1; i > 0; i--) {
let t = value[i][0]
if (t === 'word' && value[i][1] === '!important') {
node.important = true
if (i > 0 && value[i - 1][0] === 'space') {
node.raws.important = value[i - 1][1] + '!important'
value.splice(i - 1, 2)
} else {
node.raws.important = '!important';
value.splice(_i, 1);
node.raws.important = '!important'
value.splice(i, 1)
}
break;
break
} else if (t !== 'space' && t !== 'newline' && t !== 'comment') {
break;
break
}
}
node.raws.between = between + this.firstSpaces(value);
this.checkSemicolon(value);
this.raw(node, 'value', value, colon);
};
node.raws.between = between + this.firstSpaces(value)
this.checkSemicolon(value)
this.raw(node, 'value', value, colon)
}
Parser.prototype.rule = function rule(part) {
var node = new _rule2.default();
this.init(node, part);
rule (part) {
let node = new Rule()
this.init(node, part)
var selector = part.tokens;
var next = this.parts[this.pos + 1];
let selector = part.tokens
let next = this.parts[this.pos + 1]
while (!next.end && next.indent.length === part.indent.length) {
selector.push(['space', next.before + next.indent]);
selector = selector.concat(next.tokens);
this.pos += 1;
next = this.parts[this.pos + 1];
selector.push(['space', next.before + next.indent])
selector = selector.concat(next.tokens)
this.pos += 1
next = this.parts[this.pos + 1]
}
this.keepTrailingSpace(node, selector);
this.checkCurly(selector);
this.raw(node, 'selector', selector);
};
this.keepTrailingSpace(node, selector)
this.checkCurly(selector)
this.raw(node, 'selector', selector)
}
/* Helpers */
Parser.prototype.indent = function indent(part) {
var indent = part.indent.length;
var isPrev = typeof this.prevIndent !== 'undefined';
indent (part) {
let indent = part.indent.length
let isPrev = typeof this.prevIndent !== 'undefined'
if (!isPrev && indent) this.indentedFirstLine(part);
if (!isPrev && indent) this.indentedFirstLine(part)
if (!this.step && indent) {
this.step = indent;
this.root.raws.indent = part.indent;
this.step = indent
this.root.raws.indent = part.indent
}
if (isPrev && this.prevIndent !== indent) {
var diff = indent - this.prevIndent;
let diff = indent - this.prevIndent
if (diff > 0) {
if (diff !== this.step) {
this.wrongIndent(this.prevIndent + this.step, indent, part);
this.wrongIndent(this.prevIndent + this.step, indent, part)
} else if (this.current.last.push) {
this.current = this.current.last;
this.current = this.current.last
} else {
this.extraIndent = '';
for (var i = 0; i < diff; i++) {
this.extraIndent += ' ';
this.extraIndent = ''
for (let i = 0; i < diff; i++) {
this.extraIndent += ' '
}
}
} else if (diff % this.step !== 0) {
var m = indent + diff % this.step;
this.wrongIndent(m + ' or ' + (m + this.step), indent, part);
let m = indent + (diff % this.step)
this.wrongIndent(`${m} or ${m + this.step}`, indent, part)
} else {
for (var _i2 = 0; _i2 < -diff / this.step; _i2++) {
this.current = this.current.parent;
for (let i = 0; i < -diff / this.step; i++) {
this.current = this.current.parent
}

@@ -256,15 +233,15 @@ }

this.prevIndent = indent;
};
this.prevIndent = indent
}
Parser.prototype.init = function init(node, part) {
this.indent(part);
init (node, part) {
this.indent(part)
if (!this.current.nodes) this.current.nodes = [];
this.current.push(node);
if (!this.current.nodes) this.current.nodes = []
this.current.push(node)
node.raws.before = part.before + part.indent;
node.raws.before = part.before + part.indent
if (this.extraIndent) {
node.raws.extraIndent = this.extraIndent;
this.extraIndent = false;
node.raws.extraIndent = this.extraIndent
this.extraIndent = false
}

@@ -274,107 +251,78 @@ node.source = {

input: this.input
};
};
}
}
Parser.prototype.checkCurly = function checkCurly(tokens) {
for (var _iterator = tokens, _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var _ref;
if (_isArray) {
if (_i3 >= _iterator.length) break;
_ref = _iterator[_i3++];
} else {
_i3 = _iterator.next();
if (_i3.done) break;
_ref = _i3.value;
}
var token = _ref;
checkCurly (tokens) {
for (let token of tokens) {
if (token[0] === '{') {
this.error('Unnecessary curly bracket', token[2], token[3]);
this.error('Unnecessary curly bracket', token[2], token[3])
}
}
};
}
Parser.prototype.checkSemicolon = function checkSemicolon(tokens) {
for (var _iterator2 = tokens, _isArray2 = Array.isArray(_iterator2), _i4 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
var _ref2;
if (_isArray2) {
if (_i4 >= _iterator2.length) break;
_ref2 = _iterator2[_i4++];
} else {
_i4 = _iterator2.next();
if (_i4.done) break;
_ref2 = _i4.value;
}
var token = _ref2;
checkSemicolon (tokens) {
for (let token of tokens) {
if (token[0] === ';') {
this.error('Unnecessary semicolon', token[2], token[3]);
this.error('Unnecessary semicolon', token[2], token[3])
}
}
};
}
Parser.prototype.keepTrailingSpace = function keepTrailingSpace(node, tokens) {
var lastSpace = tokens[tokens.length - 1];
keepTrailingSpace (node, tokens) {
let lastSpace = tokens[tokens.length - 1]
if (lastSpace && lastSpace[0] === 'space') {
tokens.pop();
node.raws.sssBetween = lastSpace[1];
tokens.pop()
node.raws.sssBetween = lastSpace[1]
}
};
}
Parser.prototype.firstSpaces = function firstSpaces(tokens) {
var result = '';
for (var i = 0; i < tokens.length; i++) {
firstSpaces (tokens) {
let result = ''
for (let i = 0; i < tokens.length; i++) {
if (tokens[i][0] === 'space' || tokens[i][0] === 'newline') {
result += tokens.shift()[1];
i -= 1;
result += tokens.shift()[1]
i -= 1
} else {
break;
break
}
}
return result;
};
return result
}
Parser.prototype.raw = function raw(node, prop, tokens, altLast) {
var token = void 0,
type = void 0;
var length = tokens.length;
var value = '';
var clean = true;
for (var i = 0; i < length; i += 1) {
token = tokens[i];
type = token[0];
if (type === 'comment' || type === 'space' && i === length - 1) {
clean = false;
raw (node, prop, tokens, altLast) {
let token, type
let length = tokens.length
let value = ''
let clean = true
for (let i = 0; i < length; i += 1) {
token = tokens[i]
type = token[0]
if (type === 'comment' || (type === 'space' && i === length - 1)) {
clean = false
} else {
value += token[1];
value += token[1]
}
}
if (!clean) {
var sss = tokens.reduce(function (all, i) {
return all + i[1];
}, '');
var raw = tokens.reduce(function (all, i) {
let sss = tokens.reduce((all, i) => all + i[1], '')
let raw = tokens.reduce((all, i) => {
if (i[0] === 'comment' && i[6] === 'inline') {
return all + '/* ' + i[1].slice(2).trim() + ' */';
return all + '/* ' + i[1].slice(2).trim() + ' */'
} else {
return all + i[1];
return all + i[1]
}
}, '');
node.raws[prop] = { value: value, raw: raw };
if (sss !== raw) node.raws[prop].sss = sss;
}, '')
node.raws[prop] = { value, raw }
if (sss !== raw) node.raws[prop].sss = sss
}
node[prop] = value;
node[prop] = value
var last = void 0;
for (var _i5 = tokens.length - 1; _i5 >= 0; _i5--) {
if (tokens[_i5].length > 2) {
last = tokens[_i5];
break;
let last
for (let i = tokens.length - 1; i >= 0; i--) {
if (tokens[i].length > 2) {
last = tokens[i]
break
}
}
if (!last) last = altLast;
if (!last) last = altLast

@@ -384,69 +332,63 @@ node.source.end = {

column: last[5] || last[3]
};
};
}
}
Parser.prototype.nextNonComment = function nextNonComment(pos) {
var next = pos;
var part = void 0;
nextNonComment (pos) {
let next = pos
let part
while (next < this.parts.length) {
next += 1;
part = this.parts[next];
if (part.end || !part.comment) break;
next += 1
part = this.parts[next]
if (part.end || !part.comment) break
}
return part;
};
return part
}
Parser.prototype.commentText = function commentText(node, token) {
var text = token[1];
commentText (node, token) {
let text = token[1]
if (token[6] === 'inline') {
node.raws.inline = true;
text = text.slice(2);
node.raws.inline = true
text = text.slice(2)
} else {
text = text.slice(2, -2);
text = text.slice(2, -2)
}
var match = text.match(/^(\s*)([^]*[^\s])(\s*)\n?$/);
let match = text.match(/^(\s*)([^]*\S)(\s*)\n?$/)
if (match) {
node.text = match[2];
node.raws.left = match[1];
node.raws.inlineRight = match[3];
node.text = match[2]
node.raws.left = match[1]
node.raws.inlineRight = match[3]
} else {
node.text = '';
node.raws.left = '';
node.raws.inlineRight = '';
node.text = ''
node.raws.left = ''
node.raws.inlineRight = ''
}
};
}
// Errors
Parser.prototype.error = function error(msg, line, column) {
throw this.input.error(msg, line, column);
};
error (msg, line, column) {
throw this.input.error(msg, line, column)
}
Parser.prototype.unnamedAtrule = function unnamedAtrule(token) {
this.error('At-rule without name', token[2], token[3]);
};
unnamedAtrule (token) {
this.error('At-rule without name', token[2], token[3])
}
Parser.prototype.unnamedDecl = function unnamedDecl(token) {
this.error('Declaration without name', token[2], token[3]);
};
unnamedDecl (token) {
this.error('Declaration without name', token[2], token[3])
}
Parser.prototype.indentedFirstLine = function indentedFirstLine(part) {
this.error('First line should not have indent', part.number, 1);
};
indentedFirstLine (part) {
this.error('First line should not have indent', part.number, 1)
}
Parser.prototype.wrongIndent = function wrongIndent(expected, real, part) {
var msg = 'Expected ' + expected + ' indent, but get ' + real;
this.error(msg, part.number, 1);
};
wrongIndent (expected, real, part) {
let msg = `Expected ${expected} indent, but get ${real}`
this.error(msg, part.number, 1)
}
Parser.prototype.badProp = function badProp(token) {
this.error('Unexpected separator in property', token[2], token[3]);
};
return Parser;
}();
exports.default = Parser;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBhcnNlci5lczYiXSwibmFtZXMiOlsiUGFyc2VyIiwiaW5wdXQiLCJwb3MiLCJyb290IiwiUm9vdCIsImN1cnJlbnQiLCJzcGFjZXMiLCJleHRyYUluZGVudCIsInByZXZJbmRlbnQiLCJ1bmRlZmluZWQiLCJzdGVwIiwic291cmNlIiwic3RhcnQiLCJsaW5lIiwiY29sdW1uIiwibG9vcCIsInBhcnQiLCJwYXJ0cyIsImxlbmd0aCIsImNvbW1lbnQiLCJhdHJ1bGUiLCJjb2xvbiIsIm5leHQiLCJuZXh0Tm9uQ29tbWVudCIsImVuZCIsImRlY2wiLCJtb3JlSW5kZW50IiwiaW5kZW50IiwicnVsZSIsInJhd3MiLCJhZnRlciIsImJlZm9yZSIsImkiLCJ0b2tlbnMiLCJsYXN0IiwidG9rZW4iLCJub2RlIiwiQ29tbWVudCIsImluaXQiLCJjb21tZW50VGV4dCIsImF0d29yZCIsInBhcmFtcyIsInNsaWNlIiwiQXRSdWxlIiwibmFtZSIsInVubmFtZWRBdHJ1bGUiLCJsYXN0Q29tbWEiLCJwdXNoIiwiY29uY2F0IiwiYWZ0ZXJOYW1lIiwiZmlyc3RTcGFjZXMiLCJrZWVwVHJhaWxpbmdTcGFjZSIsImNoZWNrU2VtaWNvbG9uIiwiY2hlY2tDdXJseSIsInJhdyIsIkRlY2xhcmF0aW9uIiwiYmV0d2VlbiIsInZhbHVlIiwicHJvcCIsImJhZFByb3AiLCJ1bm5hbWVkRGVjbCIsInBvcCIsInByZXYiLCJ0IiwiaW1wb3J0YW50Iiwic3BsaWNlIiwiUnVsZSIsInNlbGVjdG9yIiwiaXNQcmV2IiwiaW5kZW50ZWRGaXJzdExpbmUiLCJkaWZmIiwid3JvbmdJbmRlbnQiLCJtIiwicGFyZW50Iiwibm9kZXMiLCJlcnJvciIsImxhc3RTcGFjZSIsInNzc0JldHdlZW4iLCJyZXN1bHQiLCJzaGlmdCIsImFsdExhc3QiLCJ0eXBlIiwiY2xlYW4iLCJzc3MiLCJyZWR1Y2UiLCJhbGwiLCJ0cmltIiwidGV4dCIsImlubGluZSIsIm1hdGNoIiwibGVmdCIsImlubGluZVJpZ2h0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QUFVQyxJLEVBQU0vRSxJLEVBQU07QUFDakMsUUFBSTRFLG9CQUFtQkUsUUFBbkIseUJBQWlEQyxJQUFyRDtBQUNBLFNBQUtwQixLQUFMLENBQVdpQixHQUFYLEVBQWdCNUUsS0FBSzZFLE1BQXJCLEVBQTZCLENBQTdCO0FBQ0QsRzs7bUJBRURsQyxPLG9CQUFTeEIsSyxFQUFPO0FBQ2QsU0FBS3dDLEtBQUwsQ0FBVyxrQ0FBWCxFQUErQ3hDLE1BQU0sQ0FBTixDQUEvQyxFQUF5REEsTUFBTSxDQUFOLENBQXpEO0FBQ0QsRzs7Ozs7a0JBOVhrQm5DLE0iLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERlY2xhcmF0aW9uIGZyb20gJ3Bvc3Rjc3MvbGliL2RlY2xhcmF0aW9uJ1xuaW1wb3J0IENvbW1lbnQgZnJvbSAncG9zdGNzcy9saWIvY29tbWVudCdcbmltcG9ydCBBdFJ1bGUgZnJvbSAncG9zdGNzcy9saWIvYXQtcnVsZSdcbmltcG9ydCBSdWxlIGZyb20gJ3Bvc3Rjc3MvbGliL3J1bGUnXG5pbXBvcnQgUm9vdCBmcm9tICdwb3N0Y3NzL2xpYi9yb290J1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXJzZXIge1xuICBjb25zdHJ1Y3RvciAoaW5wdXQpIHtcbiAgICB0aGlzLmlucHV0ID0gaW5wdXRcblxuICAgIHRoaXMucG9zID0gMFxuICAgIHRoaXMucm9vdCA9IG5ldyBSb290KClcbiAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLnJvb3RcbiAgICB0aGlzLnNwYWNlcyA9ICcnXG5cbiAgICB0aGlzLmV4dHJhSW5kZW50ID0gZmFsc2VcbiAgICB0aGlzLnByZXZJbmRlbnQgPSB1bmRlZmluZWRcbiAgICB0aGlzLnN0ZXAgPSB1bmRlZmluZWRcblxuICAgIHRoaXMucm9vdC5zb3VyY2UgPSB7IGlucHV0LCBzdGFydDogeyBsaW5lOiAxLCBjb2x1bW46IDEgfSB9XG4gIH1cblxuICBsb29wICgpIHtcbiAgICBsZXQgcGFydFxuICAgIHdoaWxlICh0aGlzLnBvcyA8IHRoaXMucGFydHMubGVuZ3RoKSB7XG4gICAgICBwYXJ0ID0gdGhpcy5wYXJ0c1t0aGlzLnBvc11cblxuICAgICAgaWYgKHBhcnQuY29tbWVudCkge1xuICAgICAgICB0aGlzLmNvbW1lbnQocGFydClcbiAgICAgIH0gZWxzZSBpZiAocGFydC5hdHJ1bGUpIHtcbiAgICAgICAgdGhpcy5hdHJ1bGUocGFydClcbiAgICAgIH0gZWxzZSBpZiAocGFydC5jb2xvbikge1xuICAgICAgICBsZXQgbmV4dCA9IHRoaXMubmV4dE5vbkNvbW1lbnQodGhpcy5wb3MpXG5cbiAgICAgICAgaWYgKG5leHQuZW5kIHx8IG5leHQuYXRydWxlKSB7XG4gICAgICAgICAgdGhpcy5kZWNsKHBhcnQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IG1vcmVJbmRlbnQgPSBuZXh0LmluZGVudC5sZW5ndGggPiBwYXJ0LmluZGVudC5sZW5ndGhcbiAgICAgICAgICBpZiAoIW1vcmVJbmRlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVjbChwYXJ0KVxuICAgICAgICAgIH0gZWxzZSBpZiAobW9yZUluZGVudCAmJiBuZXh0LmNvbG9uKSB7XG4gICAgICAgICAgICB0aGlzLnJ1bGUocGFydClcbiAgICAgICAgICB9IGVsc2UgaWYgKG1vcmVJbmRlbnQgJiYgIW5leHQuY29sb24pIHtcbiAgICAgICAgICAgIHRoaXMuZGVjbChwYXJ0KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwYXJ0LmVuZCkge1xuICAgICAgICB0aGlzLnJvb3QucmF3cy5hZnRlciA9IHBhcnQuYmVmb3JlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJ1bGUocGFydClcbiAgICAgIH1cblxuICAgICAgdGhpcy5wb3MgKz0gMVxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSB0aGlzLnRva2Vucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKHRoaXMudG9rZW5zW2ldLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgbGV0IGxhc3QgPSB0aGlzLnRva2Vuc1tpXVxuICAgICAgICB0aGlzLnJvb3Quc291cmNlLmVuZCA9IHtcbiAgICAgICAgICBsaW5lOiBsYXN0WzRdIHx8IGxhc3RbMl0sXG4gICAgICAgICAgY29sdW1uOiBsYXN0WzVdIHx8IGxhc3RbM11cbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbW1lbnQgKHBhcnQpIHtcbiAgICBsZXQgdG9rZW4gPSBwYXJ0LnRva2Vuc1swXVxuICAgIGxldCBub2RlID0gbmV3IENvbW1lbnQoKVxuICAgIHRoaXMuaW5pdChub2RlLCBwYXJ0KVxuICAgIG5vZGUuc291cmNlLmVuZCA9IHsgbGluZTogdG9rZW5bNF0sIGNvbHVtbjogdG9rZW5bNV0gfVxuICAgIHRoaXMuY29tbWVudFRleHQobm9kZSwgdG9rZW4pXG4gIH1cblxuICBhdHJ1bGUgKHBhcnQpIHtcbiAgICBsZXQgYXR3b3JkID0gcGFydC50b2tlbnNbMF1cbiAgICBsZXQgcGFyYW1zID0gcGFydC50b2tlbnMuc2xpY2UoMSlcblxuICAgIGxldCBub2RlID0gbmV3IEF0UnVsZSgpXG4gICAgbm9kZS5uYW1lID0gYXR3b3JkWzFdLnNsaWNlKDEpXG4gICAgdGhpcy5pbml0KG5vZGUsIHBhcnQpXG5cbiAgICBpZiAobm9kZS5uYW1lID09PSAnJykgdGhpcy51bm5hbWVkQXRydWxlKGF0d29yZClcblxuICAgIHdoaWxlICghcGFydC5lbmQgJiYgcGFydC5sYXN0Q29tbWEpIHtcbiAgICAgIHRoaXMucG9zICs9IDFcbiAgICAgIHBhcnQgPSB0aGlzLnBhcnRzW3RoaXMucG9zXVxuICAgICAgcGFyYW1zLnB1c2goWydzcGFjZScsIHBhcnQuYmVmb3JlICsgcGFydC5pbmRlbnRdKVxuICAgICAgcGFyYW1zID0gcGFyYW1zLmNvbmNhdChwYXJ0LnRva2VucylcbiAgICB9XG5cbiAgICBub2RlLnJhd3MuYWZ0ZXJOYW1lID0gdGhpcy5maXJzdFNwYWNlcyhwYXJhbXMpXG4gICAgdGhpcy5rZWVwVHJhaWxpbmdTcGFjZShub2RlLCBwYXJhbXMpXG4gICAgdGhpcy5jaGVja1NlbWljb2xvbihwYXJhbXMpXG4gICAgdGhpcy5jaGVja0N1cmx5KHBhcmFtcylcbiAgICB0aGlzLnJhdyhub2RlLCAncGFyYW1zJywgcGFyYW1zLCBhdHdvcmQpXG4gIH1cblxuICBkZWNsIChwYXJ0KSB7XG4gICAgbGV0IG5vZGUgPSBuZXcgRGVjbGFyYXRpb24oKVxuICAgIHRoaXMuaW5pdChub2RlLCBwYXJ0KVxuXG4gICAgbGV0IGJldHdlZW4gPSAnJ1xuICAgIGxldCBjb2xvbiA9IDBcbiAgICBsZXQgdmFsdWUgPSBbXVxuICAgIGxldCBwcm9wID0gJydcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnQudG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgdG9rZW4gPSBwYXJ0LnRva2Vuc1tpXVxuICAgICAgaWYgKHRva2VuWzBdID09PSAnOicpIHtcbiAgICAgICAgYmV0d2VlbiArPSB0b2tlblsxXVxuICAgICAgICBjb2xvbiA9IHRva2VuXG4gICAgICAgIHZhbHVlID0gcGFydC50b2tlbnMuc2xpY2UoaSArIDEpXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGVsc2UgaWYgKHRva2VuWzBdID09PSAnY29tbWVudCcgfHwgdG9rZW5bMF0gPT09ICdzcGFjZScpIHtcbiAgICAgICAgYmV0d2VlbiArPSB0b2tlblsxXVxuICAgICAgfSBlbHNlIGlmIChiZXR3ZWVuICE9PSAnJykge1xuICAgICAgICB0aGlzLmJhZFByb3AodG9rZW4pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9wICs9IHRva2VuWzFdXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHByb3AgPT09ICcnKSB0aGlzLnVubmFtZWREZWNsKHBhcnQudG9rZW5zWzBdKVxuICAgIG5vZGUucHJvcCA9IHByb3BcblxuICAgIGxldCBuZXh0ID0gdGhpcy5wYXJ0c1t0aGlzLnBvcyArIDFdXG5cbiAgICB3aGlsZSAoIW5leHQuZW5kICYmICFuZXh0LmF0cnVsZSAmJiAhbmV4dC5jb2xvbiAmJlxuICAgICAgICAgICAgICAgIG5leHQuaW5kZW50Lmxlbmd0aCA+IHBhcnQuaW5kZW50Lmxlbmd0aCkge1xuICAgICAgdmFsdWUucHVzaChbJ3NwYWNlJywgbmV4dC5iZWZvcmUgKyBuZXh0LmluZGVudF0pXG4gICAgICB2YWx1ZSA9IHZhbHVlLmNvbmNhdChuZXh0LnRva2VucylcbiAgICAgIHRoaXMucG9zICs9IDFcbiAgICAgIG5leHQgPSB0aGlzLnBhcnRzW3RoaXMucG9zICsgMV1cbiAgICB9XG5cbiAgICBsZXQgbGFzdCA9IHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdXG4gICAgaWYgKGxhc3QgJiYgbGFzdFswXSA9PT0gJ2NvbW1lbnQnKSB7XG4gICAgICB2YWx1ZS5wb3AoKVxuICAgICAgbGV0IGNvbW1lbnQgPSBuZXcgQ29tbWVudCgpXG4gICAgICB0aGlzLmN1cnJlbnQucHVzaChjb21tZW50KVxuICAgICAgY29tbWVudC5zb3VyY2UgPSB7XG4gICAgICAgIGlucHV0OiB0aGlzLmlucHV0LFxuICAgICAgICBzdGFydDogeyBsaW5lOiBsYXN0WzJdLCBjb2x1bW46IGxhc3RbM10gfSxcbiAgICAgICAgZW5kOiB7IGxpbmU6IGxhc3RbNF0sIGNvbHVtbjogbGFzdFs1XSB9XG4gICAgICB9XG4gICAgICBsZXQgcHJldiA9IHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdXG4gICAgICBpZiAocHJldiAmJiBwcmV2WzBdID09PSAnc3BhY2UnKSB7XG4gICAgICAgIHZhbHVlLnBvcCgpXG4gICAgICAgIGNvbW1lbnQucmF3cy5iZWZvcmUgPSBwcmV2WzFdXG4gICAgICB9XG4gICAgICB0aGlzLmNvbW1lbnRUZXh0KGNvbW1lbnQsIGxhc3QpXG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IHZhbHVlLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgIGxldCB0ID0gdmFsdWVbaV1bMF1cbiAgICAgIGlmICh0ID09PSAnd29yZCcgJiYgdmFsdWVbaV1bMV0gPT09ICchaW1wb3J0YW50Jykge1xuICAgICAgICBub2RlLmltcG9ydGFudCA9IHRydWVcbiAgICAgICAgaWYgKGkgPiAwICYmIHZhbHVlW2kgLSAxXVswXSA9PT0gJ3NwYWNlJykge1xuICAgICAgICAgIG5vZGUucmF3cy5pbXBvcnRhbnQgPSB2YWx1ZVtpIC0gMV1bMV0gKyAnIWltcG9ydGFudCdcbiAgICAgICAgICB2YWx1ZS5zcGxpY2UoaSAtIDEsIDIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9kZS5yYXdzLmltcG9ydGFudCA9ICchaW1wb3J0YW50J1xuICAgICAgICAgIHZhbHVlLnNwbGljZShpLCAxKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9IGVsc2UgaWYgKHQgIT09ICdzcGFjZScgJiYgdCAhPT0gJ25ld2xpbmUnICYmIHQgIT09ICdjb21tZW50Jykge1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUucmF3cy5iZXR3ZWVuID0gYmV0d2VlbiArIHRoaXMuZmlyc3RTcGFjZXModmFsdWUpXG4gICAgdGhpcy5jaGVja1NlbWljb2xvbih2YWx1ZSlcbiAgICB0aGlzLnJhdyhub2RlLCAndmFsdWUnLCB2YWx1ZSwgY29sb24pXG4gIH1cblxuICBydWxlIChwYXJ0KSB7XG4gICAgbGV0IG5vZGUgPSBuZXcgUnVsZSgpXG4gICAgdGhpcy5pbml0KG5vZGUsIHBhcnQpXG5cbiAgICBsZXQgc2VsZWN0b3IgPSBwYXJ0LnRva2Vuc1xuICAgIGxldCBuZXh0ID0gdGhpcy5wYXJ0c1t0aGlzLnBvcyArIDFdXG5cbiAgICB3aGlsZSAoIW5leHQuZW5kICYmIG5leHQuaW5kZW50Lmxlbmd0aCA9PT0gcGFydC5pbmRlbnQubGVuZ3RoKSB7XG4gICAgICBzZWxlY3Rvci5wdXNoKFsnc3BhY2UnLCBuZXh0LmJlZm9yZSArIG5leHQuaW5kZW50XSlcbiAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3IuY29uY2F0KG5leHQudG9rZW5zKVxuICAgICAgdGhpcy5wb3MgKz0gMVxuICAgICAgbmV4dCA9IHRoaXMucGFydHNbdGhpcy5wb3MgKyAxXVxuICAgIH1cblxuICAgIHRoaXMua2VlcFRyYWlsaW5nU3BhY2Uobm9kZSwgc2VsZWN0b3IpXG4gICAgdGhpcy5jaGVja0N1cmx5KHNlbGVjdG9yKVxuICAgIHRoaXMucmF3KG5vZGUsICdzZWxlY3RvcicsIHNlbGVjdG9yKVxuICB9XG5cbiAgLyogSGVscGVycyAqL1xuXG4gIGluZGVudCAocGFydCkge1xuICAgIGxldCBpbmRlbnQgPSBwYXJ0LmluZGVudC5sZW5ndGhcbiAgICBsZXQgaXNQcmV2ID0gdHlwZW9mIHRoaXMucHJldkluZGVudCAhPT0gJ3VuZGVmaW5lZCdcblxuICAgIGlmICghaXNQcmV2ICYmIGluZGVudCkgdGhpcy5pbmRlbnRlZEZpcnN0TGluZShwYXJ0KVxuXG4gICAgaWYgKCF0aGlzLnN0ZXAgJiYgaW5kZW50KSB7XG4gICAgICB0aGlzLnN0ZXAgPSBpbmRlbnRcbiAgICAgIHRoaXMucm9vdC5yYXdzLmluZGVudCA9IHBhcnQuaW5kZW50XG4gICAgfVxuXG4gICAgaWYgKGlzUHJldiAmJiB0aGlzLnByZXZJbmRlbnQgIT09IGluZGVudCkge1xuICAgICAgbGV0IGRpZmYgPSBpbmRlbnQgLSB0aGlzLnByZXZJbmRlbnRcbiAgICAgIGlmIChkaWZmID4gMCkge1xuICAgICAgICBpZiAoZGlmZiAhPT0gdGhpcy5zdGVwKSB7XG4gICAgICAgICAgdGhpcy53cm9uZ0luZGVudCh0aGlzLnByZXZJbmRlbnQgKyB0aGlzLnN0ZXAsIGluZGVudCwgcGFydClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnQubGFzdC5wdXNoKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5jdXJyZW50Lmxhc3RcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmV4dHJhSW5kZW50ID0gJydcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpZmY7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5leHRyYUluZGVudCArPSAnICdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGlmZiAlIHRoaXMuc3RlcCAhPT0gMCkge1xuICAgICAgICBsZXQgbSA9IGluZGVudCArIGRpZmYgJSB0aGlzLnN0ZXBcbiAgICAgICAgdGhpcy53cm9uZ0luZGVudChgJHsgbSB9IG9yICR7IG0gKyB0aGlzLnN0ZXAgfWAsIGluZGVudCwgcGFydClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgLWRpZmYgLyB0aGlzLnN0ZXA7IGkrKykge1xuICAgICAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMuY3VycmVudC5wYXJlbnRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucHJldkluZGVudCA9IGluZGVudFxuICB9XG5cbiAgaW5pdCAobm9kZSwgcGFydCkge1xuICAgIHRoaXMuaW5kZW50KHBhcnQpXG5cbiAgICBpZiAoIXRoaXMuY3VycmVudC5ub2RlcykgdGhpcy5jdXJyZW50Lm5vZGVzID0gW11cbiAgICB0aGlzLmN1cnJlbnQucHVzaChub2RlKVxuXG4gICAgbm9kZS5yYXdzLmJlZm9yZSA9IHBhcnQuYmVmb3JlICsgcGFydC5pbmRlbnRcbiAgICBpZiAodGhpcy5leHRyYUluZGVudCkge1xuICAgICAgbm9kZS5yYXdzLmV4dHJhSW5kZW50ID0gdGhpcy5leHRyYUluZGVudFxuICAgICAgdGhpcy5leHRyYUluZGVudCA9IGZhbHNlXG4gICAgfVxuICAgIG5vZGUuc291cmNlID0ge1xuICAgICAgc3RhcnQ6IHsgbGluZTogcGFydC50b2tlbnNbMF1bMl0sIGNvbHVtbjogcGFydC50b2tlbnNbMF1bM10gfSxcbiAgICAgIGlucHV0OiB0aGlzLmlucHV0XG4gICAgfVxuICB9XG5cbiAgY2hlY2tDdXJseSAodG9rZW5zKSB7XG4gICAgZm9yIChsZXQgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgICBpZiAodG9rZW5bMF0gPT09ICd7Jykge1xuICAgICAgICB0aGlzLmVycm9yKCdVbm5lY2Vzc2FyeSBjdXJseSBicmFja2V0JywgdG9rZW5bMl0sIHRva2VuWzNdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNoZWNrU2VtaWNvbG9uICh0b2tlbnMpIHtcbiAgICBmb3IgKGxldCB0b2tlbiBvZiB0b2tlbnMpIHtcbiAgICAgIGlmICh0b2tlblswXSA9PT0gJzsnKSB7XG4gICAgICAgIHRoaXMuZXJyb3IoJ1VubmVjZXNzYXJ5IHNlbWljb2xvbicsIHRva2VuWzJdLCB0b2tlblszXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBrZWVwVHJhaWxpbmdTcGFjZSAobm9kZSwgdG9rZW5zKSB7XG4gICAgbGV0IGxhc3RTcGFjZSA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV1cbiAgICBpZiAobGFzdFNwYWNlICYmIGxhc3RTcGFjZVswXSA9PT0gJ3NwYWNlJykge1xuICAgICAgdG9rZW5zLnBvcCgpXG4gICAgICBub2RlLnJhd3Muc3NzQmV0d2VlbiA9IGxhc3RTcGFjZVsxXVxuICAgIH1cbiAgfVxuXG4gIGZpcnN0U3BhY2VzICh0b2tlbnMpIHtcbiAgICBsZXQgcmVzdWx0ID0gJydcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRva2Vuc1tpXVswXSA9PT0gJ3NwYWNlJyB8fCB0b2tlbnNbaV1bMF0gPT09ICduZXdsaW5lJykge1xuICAgICAgICByZXN1bHQgKz0gdG9rZW5zLnNoaWZ0KClbMV1cbiAgICAgICAgaSAtPSAxXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICByYXcgKG5vZGUsIHByb3AsIHRva2VucywgYWx0TGFzdCkge1xuICAgIGxldCB0b2tlbiwgdHlwZVxuICAgIGxldCBsZW5ndGggPSB0b2tlbnMubGVuZ3RoXG4gICAgbGV0IHZhbHVlID0gJydcbiAgICBsZXQgY2xlYW4gPSB0cnVlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdG9rZW4gPSB0b2tlbnNbaV1cbiAgICAgIHR5cGUgPSB0b2tlblswXVxuICAgICAgaWYgKHR5cGUgPT09ICdjb21tZW50JyB8fCAodHlwZSA9PT0gJ3NwYWNlJyAmJiBpID09PSBsZW5ndGggLSAxKSkge1xuICAgICAgICBjbGVhbiA9IGZhbHNlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSArPSB0b2tlblsxXVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWNsZWFuKSB7XG4gICAgICBsZXQgc3NzID0gdG9rZW5zLnJlZHVjZSgoYWxsLCBpKSA9PiBhbGwgKyBpWzFdLCAnJylcbiAgICAgIGxldCByYXcgPSB0b2tlbnMucmVkdWNlKChhbGwsIGkpID0+IHtcbiAgICAgICAgaWYgKGlbMF0gPT09ICdjb21tZW50JyAmJiBpWzZdID09PSAnaW5saW5lJykge1xuICAgICAgICAgIHJldHVybiBhbGwgKyAnLyogJyArIGlbMV0uc2xpY2UoMikudHJpbSgpICsgJyAqLydcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gYWxsICsgaVsxXVxuICAgICAgICB9XG4gICAgICB9LCAnJylcbiAgICAgIG5vZGUucmF3c1twcm9wXSA9IHsgdmFsdWUsIHJhdyB9XG4gICAgICBpZiAoc3NzICE9PSByYXcpIG5vZGUucmF3c1twcm9wXS5zc3MgPSBzc3NcbiAgICB9XG4gICAgbm9kZVtwcm9wXSA9IHZhbHVlXG5cbiAgICBsZXQgbGFzdFxuICAgIGZvciAobGV0IGkgPSB0b2tlbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmICh0b2tlbnNbaV0ubGVuZ3RoID4gMikge1xuICAgICAgICBsYXN0ID0gdG9rZW5zW2ldXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghbGFzdCkgbGFzdCA9IGFsdExhc3RcblxuICAgIG5vZGUuc291cmNlLmVuZCA9IHtcbiAgICAgIGxpbmU6IGxhc3RbNF0gfHwgbGFzdFsyXSxcbiAgICAgIGNvbHVtbjogbGFzdFs1XSB8fCBsYXN0WzNdXG4gICAgfVxuICB9XG5cbiAgbmV4dE5vbkNvbW1lbnQgKHBvcykge1xuICAgIGxldCBuZXh0ID0gcG9zXG4gICAgbGV0IHBhcnRcbiAgICB3aGlsZSAobmV4dCA8IHRoaXMucGFydHMubGVuZ3RoKSB7XG4gICAgICBuZXh0ICs9IDFcbiAgICAgIHBhcnQgPSB0aGlzLnBhcnRzW25leHRdXG4gICAgICBpZiAocGFydC5lbmQgfHwgIXBhcnQuY29tbWVudCkgYnJlYWtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRcbiAgfVxuXG4gIGNvbW1lbnRUZXh0IChub2RlLCB0b2tlbikge1xuICAgIGxldCB0ZXh0ID0gdG9rZW5bMV1cbiAgICBpZiAodG9rZW5bNl0gPT09ICdpbmxpbmUnKSB7XG4gICAgICBub2RlLnJhd3MuaW5saW5lID0gdHJ1ZVxuICAgICAgdGV4dCA9IHRleHQuc2xpY2UoMilcbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dCA9IHRleHQuc2xpY2UoMiwgLTIpXG4gICAgfVxuXG4gICAgbGV0IG1hdGNoID0gdGV4dC5tYXRjaCgvXihcXHMqKShbXl0qW15cXHNdKShcXHMqKVxcbj8kLylcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIG5vZGUudGV4dCA9IG1hdGNoWzJdXG4gICAgICBub2RlLnJhd3MubGVmdCA9IG1hdGNoWzFdXG4gICAgICBub2RlLnJhd3MuaW5saW5lUmlnaHQgPSBtYXRjaFszXVxuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnRleHQgPSAnJ1xuICAgICAgbm9kZS5yYXdzLmxlZnQgPSAnJ1xuICAgICAgbm9kZS5yYXdzLmlubGluZVJpZ2h0ID0gJydcbiAgICB9XG4gIH1cblxuICAvLyBFcnJvcnNcblxuICBlcnJvciAobXNnLCBsaW5lLCBjb2x1bW4pIHtcbiAgICB0aHJvdyB0aGlzLmlucHV0LmVycm9yKG1zZywgbGluZSwgY29sdW1uKVxuICB9XG5cbiAgdW5uYW1lZEF0cnVsZSAodG9rZW4pIHtcbiAgICB0aGlzLmVycm9yKCdBdC1ydWxlIHdpdGhvdXQgbmFtZScsIHRva2VuWzJdLCB0b2tlblszXSlcbiAgfVxuXG4gIHVubmFtZWREZWNsICh0b2tlbikge1xuICAgIHRoaXMuZXJyb3IoJ0RlY2xhcmF0aW9uIHdpdGhvdXQgbmFtZScsIHRva2VuWzJdLCB0b2tlblszXSlcbiAgfVxuXG4gIGluZGVudGVkRmlyc3RMaW5lIChwYXJ0KSB7XG4gICAgdGhpcy5lcnJvcignRmlyc3QgbGluZSBzaG91bGQgbm90IGhhdmUgaW5kZW50JywgcGFydC5udW1iZXIsIDEpXG4gIH1cblxuICB3cm9uZ0luZGVudCAoZXhwZWN0ZWQsIHJlYWwsIHBhcnQpIHtcbiAgICBsZXQgbXNnID0gYEV4cGVjdGVkICR7IGV4cGVjdGVkIH0gaW5kZW50LCBidXQgZ2V0ICR7IHJlYWwgfWBcbiAgICB0aGlzLmVycm9yKG1zZywgcGFydC5udW1iZXIsIDEpXG4gIH1cblxuICBiYWRQcm9wICh0b2tlbikge1xuICAgIHRoaXMuZXJyb3IoJ1VuZXhwZWN0ZWQgc2VwYXJhdG9yIGluIHByb3BlcnR5JywgdG9rZW5bMl0sIHRva2VuWzNdKVxuICB9XG59XG4iXX0=
badProp (token) {
this.error('Unexpected separator in property', token[2], token[3])
}
}

@@ -1,40 +0,36 @@

'use strict';
exports.__esModule = true;
exports.default = preprocess;
function indentError(input, l, p) {
throw input.error('Mixed tabs and spaces are not allowed', l, p + 1);
function indentError (input, l, p) {
throw input.error('Mixed tabs and spaces are not allowed', l, p + 1)
}
function preprocess(input, lines) {
var indentType = void 0;
var prevNumber = 0;
var parts = lines.map(function (line) {
var lastComma = false;
var comment = false;
var number = prevNumber + 1;
var atrule = false;
var indent = '';
var tokens = [];
var colon = false;
module.exports = function preprocess (input, lines) {
let indentType
let prevNumber = 0
let parts = lines.map(line => {
let lastComma = false
let comment = false
let number = prevNumber + 1
let atrule = false
let indent = ''
let tokens = []
let colon = false
if (line.length > 0) {
if (line[0][0] === 'space') {
indent = line[0][1];
tokens = line.slice(1);
indent = line[0][1]
tokens = line.slice(1)
} else {
indent = '';
tokens = line;
indent = ''
tokens = line
}
if (!indentType && indent.length) {
indentType = indent[0] === ' ' ? 'space' : 'tab';
indentType = indent[0] === ' ' ? 'space' : 'tab'
}
if (indentType === 'space') {
if (indent.indexOf('\t') !== -1) {
indentError(input, number, indent.indexOf('\t'));
if (indent.includes('\t')) {
indentError(input, number, indent.indexOf('\t'))
}
} else if (indentType === 'tab') {
if (indent.indexOf(' ') !== -1) {
indentError(input, number, indent.indexOf(' '));
if (indent.includes(' ')) {
indentError(input, number, indent.indexOf(' '))
}

@@ -44,30 +40,34 @@ }

if (tokens.length) {
for (var i = tokens.length - 1; i >= 0; i--) {
var type = tokens[i][0];
for (let i = tokens.length - 1; i >= 0; i--) {
let type = tokens[i][0]
if (type === ',') {
lastComma = true;
break;
lastComma = true
break
} else if (type === 'space') {
continue;
continue
} else if (type === 'comment') {
continue;
continue
} else if (type === 'newline') {
continue;
continue
} else {
break;
break
}
}
comment = tokens[0][0] === 'comment';
atrule = tokens[0][0] === 'at-word';
comment = tokens[0][0] === 'comment'
atrule = tokens[0][0] === 'at-word'
var brackets = 0;
for (var _i = 0; _i < tokens.length - 1; _i++) {
var _type = tokens[_i][0];
var next = tokens[_i + 1][0];
if (_type === '(') {
brackets += 1;
} else if (_type === ')') {
brackets -= 1;
} else if (_type === ':' && brackets === 0 && (next === 'space' || next === 'newline')) {
colon = true;
let brackets = 0
for (let i = 0; i < tokens.length - 1; i++) {
let type = tokens[i][0]
let next = tokens[i + 1][0]
if (type === '(') {
brackets += 1
} else if (type === ')') {
brackets -= 1
} else if (
type === ':' &&
brackets === 0 &&
(next === 'space' || next === 'newline')
) {
colon = true
}

@@ -77,47 +77,44 @@ }

var last = tokens[tokens.length - 1];
if (last && last[0] === 'newline') prevNumber = last[2];
let last = tokens[tokens.length - 1]
if (last && last[0] === 'newline') prevNumber = last[2]
}
return {
number: number,
indent: indent,
colon: colon,
tokens: tokens,
atrule: atrule,
comment: comment,
lastComma: lastComma,
number,
indent,
colon,
tokens,
atrule,
comment,
lastComma,
before: ''
};
});
parts = parts.reduceRight(function (all, i) {
if (!i.tokens.length || i.tokens.every(function (j) {
return j[0] === 'newline';
})) {
var prev = all[0];
var before = i.indent + i.tokens.map(function (j) {
return j[1];
}).join('');
prev.before = before + prev.before;
} else {
all.unshift(i);
}
return all;
}, [{ end: true, before: '' }]);
})
parts.forEach(function (part, i) {
if (i === 0) return;
parts = parts.reduceRight(
(all, i) => {
if (!i.tokens.length || i.tokens.every(j => j[0] === 'newline')) {
let prev = all[0]
let before = i.indent + i.tokens.map(j => j[1]).join('')
prev.before = before + prev.before
} else {
all.unshift(i)
}
return all
},
[{ end: true, before: '' }]
)
var prev = parts[i - 1];
var last = prev.tokens[prev.tokens.length - 1];
parts.forEach((part, i) => {
if (i === 0) return
let prev = parts[i - 1]
let last = prev.tokens[prev.tokens.length - 1]
if (last && last[0] === 'newline') {
part.before = last[1] + part.before;
prev.tokens.pop();
part.before = last[1] + part.before
prev.tokens.pop()
}
});
})
return parts;
return parts
}
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByZXByb2Nlc3MuZXM2Il0sIm5hbWVzIjpbInByZXByb2Nlc3MiLCJpbmRlbnRFcnJvciIsImlucHV0IiwibCIsInAiLCJlcnJvciIsImxpbmVzIiwiaW5kZW50VHlwZSIsInByZXZOdW1iZXIiLCJwYXJ0cyIsIm1hcCIsImxhc3RDb21tYSIsImNvbW1lbnQiLCJudW1iZXIiLCJhdHJ1bGUiLCJpbmRlbnQiLCJ0b2tlbnMiLCJjb2xvbiIsImxpbmUiLCJsZW5ndGgiLCJzbGljZSIsImluZGV4T2YiLCJpIiwidHlwZSIsImJyYWNrZXRzIiwibmV4dCIsImxhc3QiLCJiZWZvcmUiLCJyZWR1Y2VSaWdodCIsImFsbCIsImV2ZXJ5IiwiaiIsInByZXYiLCJqb2luIiwidW5zaGlmdCIsImVuZCIsImZvckVhY2giLCJwYXJ0IiwicG9wIl0sIm1hcHBpbmdzIjoiOzs7a0JBSXdCQSxVO0FBSnhCLFNBQVNDLFdBQVQsQ0FBc0JDLEtBQXRCLEVBQTZCQyxDQUE3QixFQUFnQ0MsQ0FBaEMsRUFBbUM7QUFDakMsUUFBTUYsTUFBTUcsS0FBTixDQUFZLHVDQUFaLEVBQXFERixDQUFyRCxFQUF3REMsSUFBSSxDQUE1RCxDQUFOO0FBQ0Q7O0FBRWMsU0FBU0osVUFBVCxDQUFxQkUsS0FBckIsRUFBNEJJLEtBQTVCLEVBQW1DO0FBQ2hELE1BQUlDLG1CQUFKO0FBQ0EsTUFBSUMsYUFBYSxDQUFqQjtBQUNBLE1BQUlDLFFBQVFILE1BQU1JLEdBQU4sQ0FBVSxnQkFBUTtBQUM1QixRQUFJQyxZQUFZLEtBQWhCO0FBQ0EsUUFBSUMsVUFBVSxLQUFkO0FBQ0EsUUFBSUMsU0FBU0wsYUFBYSxDQUExQjtBQUNBLFFBQUlNLFNBQVMsS0FBYjtBQUNBLFFBQUlDLFNBQVMsRUFBYjtBQUNBLFFBQUlDLFNBQVMsRUFBYjtBQUNBLFFBQUlDLFFBQVEsS0FBWjs7QUFFQSxRQUFJQyxLQUFLQyxNQUFMLEdBQWMsQ0FBbEIsRUFBcUI7QUFDbkIsVUFBSUQsS0FBSyxDQUFMLEVBQVEsQ0FBUixN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QUVOLE1BQUYsQ0FBU0csTUFBVixJQUFvQkcsRUFBRU4sTUFBRixDQUFTYyxLQUFULENBQWU7QUFBQSxhQUFLQyxFQUFFLENBQUYsTUFBUyxTQUFkO0FBQUEsS0FBZixDQUF4QixFQUFpRTtBQUMvRCxVQUFJQyxPQUFPSCxJQUFJLENBQUosQ0FBWDtBQUNBLFVBQUlGLFNBQVNMLEVBQUVQLE1BQUYsR0FBV08sRUFBRU4sTUFBRixDQUFTTixHQUFULENBQWE7QUFBQSxlQUFLcUIsRUFBRSxDQUFGLENBQUw7QUFBQSxPQUFiLEVBQXdCRSxJQUF4QixDQUE2QixFQUE3QixDQUF4QjtBQUNBRCxXQUFLTCxNQUFMLEdBQWNBLFNBQVNLLEtBQUtMLE1BQTVCO0FBQ0QsS0FKRCxNQUlPO0FBQ0xFLFVBQUlLLE9BQUosQ0FBWVosQ0FBWjtBQUNEO0FBQ0QsV0FBT08sR0FBUDtBQUNELEdBVE8sRUFTTCxDQUFDLEVBQUVNLEtBQUssSUFBUCxFQUFhUixRQUFRLEVBQXJCLEVBQUQsQ0FUSyxDQUFSOztBQVdBbEIsUUFBTTJCLE9BQU4sQ0FBYyxVQUFDQyxJQUFELEVBQU9mLENBQVAsRUFBYTtBQUN6QixRQUFJQSxNQUFNLENBQVYsRUFBYTs7QUFFYixRQUFJVSxPQUFPdkIsTUFBTWEsSUFBSSxDQUFWLENBQVg7QUFDQSxRQUFJSSxPQUFPTSxLQUFLaEIsTUFBTCxDQUFZZ0IsS0FBS2hCLE1BQUwsQ0FBWUcsTUFBWixHQUFxQixDQUFqQyxDQUFYO0FBQ0EsUUFBSU8sUUFBUUEsS0FBSyxDQUFMLE1BQVksU0FBeEIsRUFBbUM7QUFDakNXLFdBQUtWLE1BQUwsR0FBY0QsS0FBSyxDQUFMLElBQVVXLEtBQUtWLE1BQTdCO0FBQ0FLLFdBQUtoQixNQUFMLENBQVlzQixHQUFaO0FBQ0Q7QUFDRixHQVREOztBQVdBLFNBQU83QixLQUFQO0FBQ0QiLCJmaWxlIjoicHJlcHJvY2Vzcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIGluZGVudEVycm9yIChpbnB1dCwgbCwgcCkge1xuICB0aHJvdyBpbnB1dC5lcnJvcignTWl4ZWQgdGFicyBhbmQgc3BhY2VzIGFyZSBub3QgYWxsb3dlZCcsIGwsIHAgKyAxKVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwcmVwcm9jZXNzIChpbnB1dCwgbGluZXMpIHtcbiAgbGV0IGluZGVudFR5cGVcbiAgbGV0IHByZXZOdW1iZXIgPSAwXG4gIGxldCBwYXJ0cyA9IGxpbmVzLm1hcChsaW5lID0+IHtcbiAgICBsZXQgbGFzdENvbW1hID0gZmFsc2VcbiAgICBsZXQgY29tbWVudCA9IGZhbHNlXG4gICAgbGV0IG51bWJlciA9IHByZXZOdW1iZXIgKyAxXG4gICAgbGV0IGF0cnVsZSA9IGZhbHNlXG4gICAgbGV0IGluZGVudCA9ICcnXG4gICAgbGV0IHRva2VucyA9IFtdXG4gICAgbGV0IGNvbG9uID0gZmFsc2VcblxuICAgIGlmIChsaW5lLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChsaW5lWzBdWzBdID09PSAnc3BhY2UnKSB7XG4gICAgICAgIGluZGVudCA9IGxpbmVbMF1bMV1cbiAgICAgICAgdG9rZW5zID0gbGluZS5zbGljZSgxKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5kZW50ID0gJydcbiAgICAgICAgdG9rZW5zID0gbGluZVxuICAgICAgfVxuXG4gICAgICBpZiAoIWluZGVudFR5cGUgJiYgaW5kZW50Lmxlbmd0aCkge1xuICAgICAgICBpbmRlbnRUeXBlID0gaW5kZW50WzBdID09PSAnICcgPyAnc3BhY2UnIDogJ3RhYidcbiAgICAgIH1cbiAgICAgIGlmIChpbmRlbnRUeXBlID09PSAnc3BhY2UnKSB7XG4gICAgICAgIGlmIChpbmRlbnQuaW5kZXhPZignXFx0JykgIT09IC0xKSB7XG4gICAgICAgICAgaW5kZW50RXJyb3IoaW5wdXQsIG51bWJlciwgaW5kZW50LmluZGV4T2YoJ1xcdCcpKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGluZGVudFR5cGUgPT09ICd0YWInKSB7XG4gICAgICAgIGlmIChpbmRlbnQuaW5kZXhPZignICcpICE9PSAtMSkge1xuICAgICAgICAgIGluZGVudEVycm9yKGlucHV0LCBudW1iZXIsIGluZGVudC5pbmRleE9mKCcgJykpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRva2Vucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGxldCB0eXBlID0gdG9rZW5zW2ldWzBdXG4gICAgICAgICAgaWYgKHR5cGUgPT09ICcsJykge1xuICAgICAgICAgICAgbGFzdENvbW1hID0gdHJ1ZVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzcGFjZScpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnY29tbWVudCcpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnbmV3bGluZScpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbW1lbnQgPSB0b2tlbnNbMF1bMF0gPT09ICdjb21tZW50J1xuICAgICAgICBhdHJ1bGUgPSB0b2tlbnNbMF1bMF0gPT09ICdhdC13b3JkJ1xuXG4gICAgICAgIGxldCBicmFja2V0cyA9IDBcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgbGV0IHR5cGUgPSB0b2tlbnNbaV1bMF1cbiAgICAgICAgICBsZXQgbmV4dCA9IHRva2Vuc1tpICsgMV1bMF1cbiAgICAgICAgICBpZiAodHlwZSA9PT0gJygnKSB7XG4gICAgICAgICAgICBicmFja2V0cyArPSAxXG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnKScpIHtcbiAgICAgICAgICAgIGJyYWNrZXRzIC09IDFcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICc6JyAmJiBicmFja2V0cyA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXh0ID09PSAnc3BhY2UnIHx8IG5leHQgPT09ICduZXdsaW5lJykpIHtcbiAgICAgICAgICAgIGNvbG9uID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgbGFzdCA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV1cbiAgICAgIGlmIChsYXN0ICYmIGxhc3RbMF0gPT09ICduZXdsaW5lJykgcHJldk51bWJlciA9IGxhc3RbMl1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbnVtYmVyLFxuICAgICAgaW5kZW50LFxuICAgICAgY29sb24sXG4gICAgICB0b2tlbnMsXG4gICAgICBhdHJ1bGUsXG4gICAgICBjb21tZW50LFxuICAgICAgbGFzdENvbW1hLFxuICAgICAgYmVmb3JlOiAnJ1xuICAgIH1cbiAgfSlcblxuICBwYXJ0cyA9IHBhcnRzLnJlZHVjZVJpZ2h0KChhbGwsIGkpID0+IHtcbiAgICBpZiAoIWkudG9rZW5zLmxlbmd0aCB8fCBpLnRva2Vucy5ldmVyeShqID0+IGpbMF0gPT09ICduZXdsaW5lJykpIHtcbiAgICAgIGxldCBwcmV2ID0gYWxsWzBdXG4gICAgICBsZXQgYmVmb3JlID0gaS5pbmRlbnQgKyBpLnRva2Vucy5tYXAoaiA9PiBqWzFdKS5qb2luKCcnKVxuICAgICAgcHJldi5iZWZvcmUgPSBiZWZvcmUgKyBwcmV2LmJlZm9yZVxuICAgIH0gZWxzZSB7XG4gICAgICBhbGwudW5zaGlmdChpKVxuICAgIH1cbiAgICByZXR1cm4gYWxsXG4gIH0sIFt7IGVuZDogdHJ1ZSwgYmVmb3JlOiAnJyB9XSlcblxuICBwYXJ0cy5mb3JFYWNoKChwYXJ0LCBpKSA9PiB7XG4gICAgaWYgKGkgPT09IDApIHJldHVyblxuXG4gICAgbGV0IHByZXYgPSBwYXJ0c1tpIC0gMV1cbiAgICBsZXQgbGFzdCA9IHByZXYudG9rZW5zW3ByZXYudG9rZW5zLmxlbmd0aCAtIDFdXG4gICAgaWYgKGxhc3QgJiYgbGFzdFswXSA9PT0gJ25ld2xpbmUnKSB7XG4gICAgICBwYXJ0LmJlZm9yZSA9IGxhc3RbMV0gKyBwYXJ0LmJlZm9yZVxuICAgICAgcHJldi50b2tlbnMucG9wKClcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIHBhcnRzXG59XG4iXX0=

@@ -1,2 +0,2 @@

# SugarSS [![Build Status][ci-img]][ci]
# SugarSS

@@ -43,5 +43,4 @@ <img align="right" width="120" height="155"

[PreCSS]: https://github.com/jonathantneal/precss
[ci-img]: https://img.shields.io/travis/postcss/sugarss.svg
[ci]: https://travis-ci.org/postcss/sugarss
## Syntax

@@ -51,2 +50,3 @@

### Indent

@@ -59,2 +59,3 @@

### Multiline

@@ -81,3 +82,3 @@

In selector you can put a new line anywhere. Just keep same indent
In a selector you can put a new line anywhere. Just keep same indent
for every line of selector:

@@ -91,4 +92,4 @@

In declaration value you can put new line anywhere. Just keep bigger indent
for value:
In a declaration value you can put a new line anywhere. Just keep a bigger indent
for the value:

@@ -106,2 +107,3 @@ ```sass

### Comments

@@ -119,3 +121,3 @@

There is no “silent” comments in SugarSS. Output CSS will contain all comments
There is no “silent” comment in SugarSS. Output CSS will contain all comments
from `.sss` source. But you can use [postcss-discard-comments]

@@ -126,2 +128,3 @@ for Sass’s silent/loud comments behaviour.

### Rule and Declarations

@@ -131,5 +134,25 @@

So you must write a space after property name: `color: black` is good,
So you must write a space after the property name: `color: black` is good,
`color:black` is prohibited.
### Other
SugarSS is just a syntax, it change the way how you write CSS,
but do not add preprocessor features build-in.
Here are PostCSS plugins which could add you preprocessor features:
* **[PreCSS]** adds variables, nested rules, extend rules, property lookup
and CSS polyfills.
* **[postcss-easy-import]** adds `@import` directive support with globbing.
* **[postcss-mixins]** add `@mixin` support.
* **[postcss-functions]** allows you to define own CSS functions in JS.
[postcss-easy-import]: https://github.com/TrySound/postcss-easy-import
[postcss-functions]: https://github.com/andyjansson/postcss-functions
[postcss-mixins]: https://github.com/postcss/postcss-mixins
[PreCSS]: https://github.com/jonathantneal/precss
## Text Editors

@@ -151,55 +174,120 @@

## Usage
Install SugarSS via npm:
SugarSS needs PostCSS compiler. Install [`postcss-loader`] for webpack,
[`gulp-postcss`] for Gulp, [`postcss-cli`] for npm scripts.
[Parcel] has build-in support for PostCSS.
```sh
npm install sugarss --save-dev
Then install SugarSS: `npm install --save-dev sugarss` if you use npm
and `yarn add --dev sugarss` if you use Yarn.
You may also install `precss` to have nested rules, variables
and other CSS syntax extensions: `npm install --save-dev precss`
or `yarn add --dev precss` if you use Yarn.
Then create `.postcssrc` file:
```json
{
"parser": "sugarss",
"plugins": {
"precss": {}
}
}
```
### SugarSS to CSS
[`postcss-loader`]: https://github.com/postcss/postcss-loader
[`gulp-postcss`]: https://github.com/postcss/gulp-postcss
[`postcss-cli`]: https://github.com/postcss/postcss-cli
[Parcel]: https://parceljs.org/transforms.html
Just set SugarSS to PostCSS `parser` option and PostCSS will compile
SugarSS to CSS.
[Gulp](https://github.com/postcss/gulp-postcss):
### Imports
```js
var sugarss = require('sugarss');
var postcss = require('gulp-postcss');
var rename = require('gulp-rename');
If you doesn’t use Webpack or Parcel, you need some PostCSS plugin
to process `@import` directives.
gulp.task('style', function () {
return gulp.src('src/**/*.sss')
.pipe(postcss(plugins, { parser: sugarss }))
.pipe(rename({ extname: '.css' }))
.pipe(gulp.dest('build'));
});
[postcss-import] doesn’t support `.sss` file extension, because this plugin
implements W3C specification. If you want smarter `@import`, you should
use [postcss-easy-import] with the `extensions` option.
```diff js
{
"parser": "sugarss",
"plugins": {
+ "postcss-easy-import": {
+ "extensions": [
+ ".sss"
+ ]
+ },
"precss": {},
}
}
```
[Webpack](https://github.com/postcss/postcss-loader):
[postcss-easy-import]: https://github.com/TrySound/postcss-easy-import
[postcss-import]: https://github.com/postcss/postcss-import
```js
module: {
loaders: [
{
test: /\.sss/,
loader: "style-loader!css-loader!postcss-loader?parser=sugarss"
}
]
### Mixins
For mixins support, install [postcss-mixins] and add it to `.postcssrc` file:
```diff js
{
"parser": "sugarss",
"plugins": {
+ "postcss-mixins": {
+ "mixinsDir": "./mixins"
+ },
"precss": {},
}
}
```
[CLI](https://github.com/postcss/postcss-cli):
Now you can define your mixins in `mixins/` dir.
For example create `mixins/circle.sss` with:
```sss
@define-mixin circle $size
border-radius: 50%
width: $size
height: $size
```
postcss -u autoprefixer -p sugarss test.sss -o test.css
### Functions
To define custom functions you need to install [postcss-functions]
and add it to `.postcssrc` file:
```diff js
{
"parser": "sugarss",
"plugins": {
+ "postcss-functions": {
+ "glob": "./functions"
+ },
"precss": {},
}
}
```
Then you can define functions in `functions/` dir. For example,
`functions/foo.js` will define `foo()` function in CSS:
```js
module.exports = function (args) {
return 'foo'
}
```
### SugarSS to SugarSS
Sometimes we use PostCSS not to build CSS, but to fix source file.
Sometimes we use PostCSS not to build CSS, but to fix source files.
For example, to sort properties by [postcss-sorting].
For this cases, use `syntax` option, instead of `parser`:
For this cases use the `syntax` option, instead of `parser`:

@@ -216,5 +304,6 @@ ```js

### CSS to SugarSS
You can even compile existed CSS sources to SugarSS syntax.
You can even compile existing CSS sources to SugarSS syntax.
Just use `stringifier` option instead of `parser`:

@@ -228,19 +317,5 @@

### Imports
[postcss-import] doesn’t support `.sss` file extension, because this plugin
implements W3C specification. If you want smarter `@import`, you should
use [postcss-easy-import] with `extensions` option.
```js
var postcssPlugin = [
easyImport({ extensions: ['.sss'] })
]
```
[postcss-easy-import]: https://github.com/TrySound/postcss-easy-import
[postcss-import]: https://github.com/postcss/postcss-import
## Thanks
Cute project logo was made by [Maria Keller](http://www.mariakellerac.com/).

@@ -1,8 +0,2 @@

'use strict';
exports.__esModule = true;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var defaultRaw = {
const DEFAULT_RAWS = {
colon: ': ',

@@ -12,117 +6,110 @@ indent: ' ',

commentRight: ' '
};
}
var Stringifier = function () {
function Stringifier(builder) {
_classCallCheck(this, Stringifier);
module.exports = class Stringifier {
constructor (builder) {
this.builder = builder
}
this.builder = builder;
stringify (node, semicolon) {
this[node.type](node, semicolon)
}
Stringifier.prototype.stringify = function stringify(node, semicolon) {
this[node.type](node, semicolon);
};
root (node) {
this.body(node)
if (node.raws.after) this.builder(node.raws.after)
}
Stringifier.prototype.root = function root(node) {
this.body(node);
if (node.raws.after) this.builder(node.raws.after);
};
comment (node) {
let left = DEFAULT_RAWS.commentLeft
let right = DEFAULT_RAWS.commentRight
if (this.has(node.raws.left)) left = node.raws.left
Stringifier.prototype.comment = function comment(node) {
var left = defaultRaw.commentLeft;
var right = defaultRaw.commentRight;
if (this.has(node.raws.left)) left = node.raws.left;
if (node.raws.inline) {
if (this.has(node.raws.inlineRight)) {
right = node.raws.inlineRight;
right = node.raws.inlineRight
} else {
right = '';
right = ''
}
if (node.raws.extraIndent) {
this.builder(node.raws.extraIndent);
this.builder(node.raws.extraIndent)
}
this.builder('//' + left + node.text + right, node);
this.builder('//' + left + node.text + right, node)
} else {
if (this.has(node.raws.right)) right = node.raws.right;
this.builder('/*' + left + node.text + right + '*/', node);
if (this.has(node.raws.right)) right = node.raws.right
this.builder('/*' + left + node.text + right + '*/', node)
}
};
}
Stringifier.prototype.decl = function decl(node) {
var between = node.raws.between || defaultRaw.colon;
var string = node.prop + between + this.rawValue(node, 'value');
decl (node) {
let between = node.raws.between || DEFAULT_RAWS.colon
let string = node.prop + between + this.rawValue(node, 'value')
if (node.important) {
string += node.raws.important || ' !important';
string += node.raws.important || ' !important'
}
this.builder(string, node);
};
this.builder(string, node)
}
Stringifier.prototype.rule = function rule(node) {
this.block(node, this.rawValue(node, 'selector'));
};
rule (node) {
this.block(node, this.rawValue(node, 'selector'))
}
Stringifier.prototype.atrule = function atrule(node) {
var name = '@' + node.name;
var params = node.params ? this.rawValue(node, 'params') : '';
atrule (node) {
let name = '@' + node.name
let params = node.params ? this.rawValue(node, 'params') : ''
if (this.has(node.raws.afterName)) {
name += node.raws.afterName;
name += node.raws.afterName
} else if (params) {
name += ' ';
name += ' '
}
this.block(node, name + params);
};
this.block(node, name + params)
}
Stringifier.prototype.body = function body(node) {
var indent = node.root().raws.indent || defaultRaw.indent;
body (node) {
let indent = node.root().raws.indent || DEFAULT_RAWS.indent
for (var i = 0; i < node.nodes.length; i++) {
var child = node.nodes[i];
var before = child.raws.before.replace(/[^\n]*$/, '') + this.indent(node, indent);
if (child.type === 'comment' && child.raws.before.indexOf('\n') === -1) {
before = child.raws.before;
for (let i = 0; i < node.nodes.length; i++) {
let child = node.nodes[i]
let before =
child.raws.before.replace(/[^\n]*$/, '') + this.indent(node, indent)
if (child.type === 'comment' && !child.raws.before.includes('\n')) {
before = child.raws.before
}
if (before) this.builder(before);
this.stringify(child);
if (before) this.builder(before)
this.stringify(child)
}
};
}
Stringifier.prototype.block = function block(node, start) {
var between = node.raws.sssBetween || '';
this.builder(start + between, node, 'start');
if (this.has(node.nodes)) this.body(node);
};
block (node, start) {
let between = node.raws.sssBetween || ''
this.builder(start + between, node, 'start')
if (this.has(node.nodes)) this.body(node)
}
Stringifier.prototype.indent = function indent(node, step) {
var result = '';
indent (node, step) {
let result = ''
while (node.parent) {
result += step;
node = node.parent;
result += step
node = node.parent
}
return result;
};
return result
}
Stringifier.prototype.has = function has(value) {
return typeof value !== 'undefined';
};
has (value) {
return typeof value !== 'undefined'
}
Stringifier.prototype.rawValue = function rawValue(node, prop) {
var value = node[prop];
var raw = node.raws[prop];
rawValue (node, prop) {
let value = node[prop]
let raw = node.raws[prop]
if (raw && raw.value === value) {
return raw.sss || raw.raw;
return raw.sss || raw.raw
} else {
return value;
return value
}
};
return Stringifier;
}();
exports.default = Stringifier;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0cmluZ2lmaWVyLmVzNiJdLCJuYW1lcyI6WyJkZWZhdWx0UmF3IiwiY29sb24iLCJpbmRlbnQiLCJjb21tZW50TGVmdCIsImNvbW1lbnRSaWdodCIsIlN0cmluZ2lmaWVyIiwiYnVpbGRlciIsInN0cmluZ2lmeSIsIm5vZGUiLCJzZW1pY29sb24iLCJ0eXBlIiwicm9vdCIsImJvZHkiLCJyYXdzIiwiYWZ0ZXIiLCJjb21tZW50IiwibGVmdCIsInJpZ2h0IiwiaGFzIiwiaW5saW5lIiwiaW5saW5lUmlnaHQiLCJleHRyYUluZGVudCIsInRleHQiLCJkZWNsIiwiYmV0d2VlbiIsInN0cmluZyIsInByb3AiLCJyYXdWYWx1ZSIsImltcG9ydGFudCIsInJ1bGUiLCJibG9jayIsImF0cnVsZSIsIm5hbWUiLCJwYXJhbXMiLCJhZnRlck5hbWUiLCJpIiwibm9kZXMiLCJsZW5ndGgiLCJjaGlsZCIsImJlZm9yZSIsInJlcGxhY2UiLCJpbmRleE9mIiwic3RhcnQiLCJzc3NCZXR3ZWVuIiwic3RlcCIsInJlc3VsdCIsInBhcmVudCIsInZhbHVlIiwicmF3Iiwic3NzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFNQSxhQUFhO0FBQ2pCQyxTQUFPLElBRFU7QUFFakJDLFVBQVEsSUFGUztBQUdqQkMsZUFBYSxHQUhJO0FBSWpCQyxnQkFBYztBQUpHLENBQW5COztJQU9xQkMsVztBQUNuQix1QkFBYUMsT0FBYixFQUFzQjtBQUFBOztBQUNwQixTQUFLQSxPQUFMLEdBQWVBLE9BQWY7QUFDRDs7d0JBRURDLFMsc0JBQVdDLEksRUFBTUMsUyxFQUFXO0FBQzFCLFNBQUtELEtBQUtFLElBQVYsRUFBZ0JGLElBQWhCLEVBQXNCQyxTQUF0QjtBQUNELEc7O3dCQUVERSxJLGlCQUFNSCxJLEVBQU07QUFDVixTQUFLSSxJQUFMLENBQVVKLElBQVY7QUFDQSxRQUFJQSxLQUFLSyxJQUFMLENBQVVDLEtBQWQsRUFBcUIsS0FBS1IsT0FBTCxDQUFhRSxLQUFLSyxJQUFMLENB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SXNCLE9BQU9BLElBQUlELEtBQUosS0FBY0EsS0FBekIsRUFBZ0M7QUFDOUIsYUFBT0MsSUFBSUMsR0FBSixJQUFXRCxJQUFJQSxHQUF0QjtBQUNELEtBRkQsTUFFTztBQUNMLGFBQU9ELEtBQVA7QUFDRDtBQUNGLEc7Ozs7O2tCQTFHa0IxQyxXIiwiZmlsZSI6InN0cmluZ2lmaWVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgZGVmYXVsdFJhdyA9IHtcbiAgY29sb246ICc6ICcsXG4gIGluZGVudDogJyAgJyxcbiAgY29tbWVudExlZnQ6ICcgJyxcbiAgY29tbWVudFJpZ2h0OiAnICdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RyaW5naWZpZXIge1xuICBjb25zdHJ1Y3RvciAoYnVpbGRlcikge1xuICAgIHRoaXMuYnVpbGRlciA9IGJ1aWxkZXJcbiAgfVxuXG4gIHN0cmluZ2lmeSAobm9kZSwgc2VtaWNvbG9uKSB7XG4gICAgdGhpc1tub2RlLnR5cGVdKG5vZGUsIHNlbWljb2xvbilcbiAgfVxuXG4gIHJvb3QgKG5vZGUpIHtcbiAgICB0aGlzLmJvZHkobm9kZSlcbiAgICBpZiAobm9kZS5yYXdzLmFmdGVyKSB0aGlzLmJ1aWxkZXIobm9kZS5yYXdzLmFmdGVyKVxuICB9XG5cbiAgY29tbWVudCAobm9kZSkge1xuICAgIGxldCBsZWZ0ID0gZGVmYXVsdFJhdy5jb21tZW50TGVmdFxuICAgIGxldCByaWdodCA9IGRlZmF1bHRSYXcuY29tbWVudFJpZ2h0XG4gICAgaWYgKHRoaXMuaGFzKG5vZGUucmF3cy5sZWZ0KSkgbGVmdCA9IG5vZGUucmF3cy5sZWZ0XG5cbiAgICBpZiAobm9kZS5yYXdzLmlubGluZSkge1xuICAgICAgaWYgKHRoaXMuaGFzKG5vZGUucmF3cy5pbmxpbmVSaWdodCkpIHtcbiAgICAgICAgcmlnaHQgPSBub2RlLnJhd3MuaW5saW5lUmlnaHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJpZ2h0ID0gJydcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLnJhd3MuZXh0cmFJbmRlbnQpIHtcbiAgICAgICAgdGhpcy5idWlsZGVyKG5vZGUucmF3cy5leHRyYUluZGVudClcbiAgICAgIH1cbiAgICAgIHRoaXMuYnVpbGRlcignLy8nICsgbGVmdCArIG5vZGUudGV4dCArIHJpZ2h0LCBub2RlKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5oYXMobm9kZS5yYXdzLnJpZ2h0KSkgcmlnaHQgPSBub2RlLnJhd3MucmlnaHRcbiAgICAgIHRoaXMuYnVpbGRlcignLyonICsgbGVmdCArIG5vZGUudGV4dCArIHJpZ2h0ICsgJyovJywgbm9kZSlcbiAgICB9XG4gIH1cblxuICBkZWNsIChub2RlKSB7XG4gICAgbGV0IGJldHdlZW4gPSBub2RlLnJhd3MuYmV0d2VlbiB8fCBkZWZhdWx0UmF3LmNvbG9uXG4gICAgbGV0IHN0cmluZyA9IG5vZGUucHJvcCArIGJldHdlZW4gKyB0aGlzLnJhd1ZhbHVlKG5vZGUsICd2YWx1ZScpXG5cbiAgICBpZiAobm9kZS5pbXBvcnRhbnQpIHtcbiAgICAgIHN0cmluZyArPSBub2RlLnJhd3MuaW1wb3J0YW50IHx8ICcgIWltcG9ydGFudCdcbiAgICB9XG5cbiAgICB0aGlzLmJ1aWxkZXIoc3RyaW5nLCBub2RlKVxuICB9XG5cbiAgcnVsZSAobm9kZSkge1xuICAgIHRoaXMuYmxvY2sobm9kZSwgdGhpcy5yYXdWYWx1ZShub2RlLCAnc2VsZWN0b3InKSlcbiAgfVxuXG4gIGF0cnVsZSAobm9kZSkge1xuICAgIGxldCBuYW1lID0gJ0AnICsgbm9kZS5uYW1lXG4gICAgbGV0IHBhcmFtcyA9IG5vZGUucGFyYW1zID8gdGhpcy5yYXdWYWx1ZShub2RlLCAncGFyYW1zJykgOiAnJ1xuXG4gICAgaWYgKHRoaXMuaGFzKG5vZGUucmF3cy5hZnRlck5hbWUpKSB7XG4gICAgICBuYW1lICs9IG5vZGUucmF3cy5hZnRlck5hbWVcbiAgICB9IGVsc2UgaWYgKHBhcmFtcykge1xuICAgICAgbmFtZSArPSAnICdcbiAgICB9XG5cbiAgICB0aGlzLmJsb2NrKG5vZGUsIG5hbWUgKyBwYXJhbXMpXG4gIH1cblxuICBib2R5IChub2RlKSB7XG4gICAgbGV0IGluZGVudCA9IG5vZGUucm9vdCgpLnJhd3MuaW5kZW50IHx8IGRlZmF1bHRSYXcuaW5kZW50XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUubm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBjaGlsZCA9IG5vZGUubm9kZXNbaV1cbiAgICAgIGxldCBiZWZvcmUgPSBjaGlsZC5yYXdzLmJlZm9yZS5yZXBsYWNlKC9bXlxcbl0qJC8sICcnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRlbnQobm9kZSwgaW5kZW50KVxuICAgICAgaWYgKGNoaWxkLnR5cGUgPT09ICdjb21tZW50JyAmJlxuICAgICAgICAgICAgICAgICBjaGlsZC5yYXdzLmJlZm9yZS5pbmRleE9mKCdcXG4nKSA9PT0gLTEpIHtcbiAgICAgICAgYmVmb3JlID0gY2hpbGQucmF3cy5iZWZvcmVcbiAgICAgIH1cbiAgICAgIGlmIChiZWZvcmUpIHRoaXMuYnVpbGRlcihiZWZvcmUpXG4gICAgICB0aGlzLnN0cmluZ2lmeShjaGlsZClcbiAgICB9XG4gIH1cblxuICBibG9jayAobm9kZSwgc3RhcnQpIHtcbiAgICBsZXQgYmV0d2VlbiA9IG5vZGUucmF3cy5zc3NCZXR3ZWVuIHx8ICcnXG4gICAgdGhpcy5idWlsZGVyKHN0YXJ0ICsgYmV0d2Vlbiwgbm9kZSwgJ3N0YXJ0JylcbiAgICBpZiAodGhpcy5oYXMobm9kZS5ub2RlcykpIHRoaXMuYm9keShub2RlKVxuICB9XG5cbiAgaW5kZW50IChub2RlLCBzdGVwKSB7XG4gICAgbGV0IHJlc3VsdCA9ICcnXG4gICAgd2hpbGUgKG5vZGUucGFyZW50KSB7XG4gICAgICByZXN1bHQgKz0gc3RlcFxuICAgICAgbm9kZSA9IG5vZGUucGFyZW50XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGhhcyAodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJ1xuICB9XG5cbiAgcmF3VmFsdWUgKG5vZGUsIHByb3ApIHtcbiAgICBsZXQgdmFsdWUgPSBub2RlW3Byb3BdXG4gICAgbGV0IHJhdyA9IG5vZGUucmF3c1twcm9wXVxuICAgIGlmIChyYXcgJiYgcmF3LnZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHJhdy5zc3MgfHwgcmF3LnJhd1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG4gIH1cbn1cbiJdfQ==
}
}

@@ -1,17 +0,6 @@

'use strict';
let Stringifier = require('./stringifier')
exports.__esModule = true;
exports.default = stringify;
var _stringifier = require('./stringifier');
var _stringifier2 = _interopRequireDefault(_stringifier);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function stringify(node, builder) {
var str = new _stringifier2.default(builder);
str.stringify(node);
module.exports = function stringify (node, builder) {
let str = new Stringifier(builder)
str.stringify(node)
}
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0cmluZ2lmeS5lczYiXSwibmFtZXMiOlsic3RyaW5naWZ5Iiwibm9kZSIsImJ1aWxkZXIiLCJzdHIiLCJTdHJpbmdpZmllciJdLCJtYXBwaW5ncyI6Ijs7O2tCQUV3QkEsUzs7QUFGeEI7Ozs7OztBQUVlLFNBQVNBLFNBQVQsQ0FBb0JDLElBQXBCLEVBQTBCQyxPQUExQixFQUFtQztBQUNoRCxNQUFJQyxNQUFNLElBQUlDLHFCQUFKLENBQWdCRixPQUFoQixDQUFWO0FBQ0FDLE1BQUlILFNBQUosQ0FBY0MsSUFBZDtBQUNEIiwiZmlsZSI6InN0cmluZ2lmeS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTdHJpbmdpZmllciBmcm9tICcuL3N0cmluZ2lmaWVyJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzdHJpbmdpZnkgKG5vZGUsIGJ1aWxkZXIpIHtcbiAgbGV0IHN0ciA9IG5ldyBTdHJpbmdpZmllcihidWlsZGVyKVxuICBzdHIuc3RyaW5naWZ5KG5vZGUpXG59XG4iXX0=

@@ -1,62 +0,62 @@

'use strict';
const SINGLE_QUOTE = "'".charCodeAt(0)
const DOUBLE_QUOTE = '"'.charCodeAt(0)
const BACKSLASH = '\\'.charCodeAt(0)
const SLASH = '/'.charCodeAt(0)
const NEWLINE = '\n'.charCodeAt(0)
const SPACE = ' '.charCodeAt(0)
const FEED = '\f'.charCodeAt(0)
const TAB = '\t'.charCodeAt(0)
const CR = '\r'.charCodeAt(0)
const OPEN_PARENTHESES = '('.charCodeAt(0)
const CLOSE_PARENTHESES = ')'.charCodeAt(0)
const OPEN_CURLY = '{'.charCodeAt(0)
const CLOSE_CURLY = '}'.charCodeAt(0)
const SEMICOLON = ';'.charCodeAt(0)
const ASTERICK = '*'.charCodeAt(0)
const COLON = ':'.charCodeAt(0)
const AT = '@'.charCodeAt(0)
const COMMA = ','.charCodeAt(0)
exports.__esModule = true;
exports.default = tokenize;
var SINGLE_QUOTE = 39;
var DOUBLE_QUOTE = 34;
var BACKSLASH = 92;
var SLASH = 47;
var NEWLINE = 10;
var SPACE = 32;
var FEED = 12;
var TAB = 9;
var CR = 13;
var OPEN_PARENTHESES = 40;
var CLOSE_PARENTHESES = 41;
var OPEN_CURLY = 123;
var CLOSE_CURLY = 125;
var SEMICOLON = 59;
var ASTERICK = 42;
var COLON = 58;
var AT = 64;
var COMMA = 44;
const RE_AT_END = /[\t\n\f\r "'()/;\\{]/g
const RE_NEW_LINE = /[\n\f\r]/g
const RE_WORD_END = /[\t\n\f\r !"'(),:;@\\{}]|\/(?=\*)/g
const RE_BAD_BRACKET = /.[\n"'(/\\]/
var RE_AT_END = /[ \n\t\r\f{()'"\\;/]/g;
var RE_NEW_LINE = /[\r\f\n]/g;
var RE_WORD_END = /[ \n\t\r\f(){}:;@!'"\\,]|\/(?=\*)/g;
var RE_BAD_BRACKET = /.[\\/("'\n]/;
module.exports = function tokenize (input) {
let tokens = []
let css = input.css.valueOf()
function tokenize(input) {
var tokens = [];
var css = input.css.valueOf();
let code,
next,
quote,
lines,
last,
content,
escape,
nextLine,
nextOffset,
escaped,
escapePos,
prev,
n
var code = void 0,
next = void 0,
quote = void 0,
lines = void 0,
last = void 0,
content = void 0,
escape = void 0,
nextLine = void 0,
nextOffset = void 0,
escaped = void 0,
escapePos = void 0,
prev = void 0,
n = void 0;
let length = css.length
let offset = -1
let line = 1
let pos = 0
var length = css.length;
var offset = -1;
var line = 1;
var pos = 0;
function unclosed(what) {
throw input.error('Unclosed ' + what, line, pos - offset);
function unclosed (what) {
throw input.error('Unclosed ' + what, line, pos - offset)
}
while (pos < length) {
code = css.charCodeAt(pos);
code = css.charCodeAt(pos)
if (code === NEWLINE || code === FEED || code === CR && css.charCodeAt(pos + 1) !== NEWLINE) {
offset = pos;
line += 1;
if (
code === NEWLINE ||
code === FEED ||
(code === CR && css.charCodeAt(pos + 1) !== NEWLINE)
) {
offset = pos
line += 1
}

@@ -67,222 +67,286 @@

if (css.charCodeAt(pos + 1) === NEWLINE) {
offset = pos;
line += 1;
pos += 1;
tokens.push(['newline', '\r\n', line - 1]);
offset = pos
line += 1
pos += 1
tokens.push(['newline', '\r\n', line - 1])
} else {
tokens.push(['newline', '\r', line - 1]);
tokens.push(['newline', '\r', line - 1])
}
break;
break
case FEED:
case NEWLINE:
tokens.push(['newline', css.slice(pos, pos + 1), line - 1]);
break;
tokens.push(['newline', css.slice(pos, pos + 1), line - 1])
break
case SPACE:
case TAB:
next = pos;
next = pos
do {
next += 1;
code = css.charCodeAt(next);
} while (code === SPACE || code === TAB);
next += 1
code = css.charCodeAt(next)
} while (code === SPACE || code === TAB)
tokens.push(['space', css.slice(pos, next)]);
pos = next - 1;
break;
tokens.push(['space', css.slice(pos, next)])
pos = next - 1
break
case OPEN_CURLY:
tokens.push(['{', '{', line, pos - offset]);
break;
tokens.push(['{', '{', line, pos - offset])
break
case CLOSE_CURLY:
tokens.push(['}', '}', line, pos - offset]);
break;
tokens.push(['}', '}', line, pos - offset])
break
case COLON:
tokens.push([':', ':', line, pos - offset]);
break;
tokens.push([':', ':', line, pos - offset])
break
case SEMICOLON:
tokens.push([';', ';', line, pos - offset]);
break;
tokens.push([';', ';', line, pos - offset])
break
case COMMA:
tokens.push([',', ',', line, pos - offset]);
break;
tokens.push([',', ',', line, pos - offset])
break
case OPEN_PARENTHESES:
prev = tokens.length ? tokens[tokens.length - 1][1] : '';
n = css.charCodeAt(pos + 1);
if (prev === 'url' && n !== SINGLE_QUOTE && n !== DOUBLE_QUOTE && n !== SPACE && n !== NEWLINE && n !== TAB && n !== FEED && n !== CR) {
next = pos;
prev = tokens.length ? tokens[tokens.length - 1][1] : ''
n = css.charCodeAt(pos + 1)
if (
prev === 'url' &&
n !== SINGLE_QUOTE &&
n !== DOUBLE_QUOTE &&
n !== SPACE &&
n !== NEWLINE &&
n !== TAB &&
n !== FEED &&
n !== CR
) {
next = pos
do {
escaped = false;
next = css.indexOf(')', next + 1);
if (next === -1) unclosed('bracket');
escapePos = next;
escaped = false
next = css.indexOf(')', next + 1)
if (next === -1) unclosed('bracket')
escapePos = next
while (css.charCodeAt(escapePos - 1) === BACKSLASH) {
escapePos -= 1;
escaped = !escaped;
escapePos -= 1
escaped = !escaped
}
} while (escaped);
} while (escaped)
tokens.push(['brackets', css.slice(pos, next + 1), line, pos - offset, line, next - offset]);
pos = next;
tokens.push([
'brackets',
css.slice(pos, next + 1),
line,
pos - offset,
line,
next - offset
])
pos = next
} else {
next = css.indexOf(')', pos + 1);
content = css.slice(pos, next + 1);
next = css.indexOf(')', pos + 1)
content = css.slice(pos, next + 1)
if (next === -1 || RE_BAD_BRACKET.test(content)) {
tokens.push(['(', '(', line, pos - offset]);
tokens.push(['(', '(', line, pos - offset])
} else {
tokens.push(['brackets', content, line, pos - offset, line, next - offset]);
pos = next;
tokens.push([
'brackets',
content,
line,
pos - offset,
line,
next - offset
])
pos = next
}
}
break;
break
case CLOSE_PARENTHESES:
tokens.push([')', ')', line, pos - offset]);
break;
tokens.push([')', ')', line, pos - offset])
break
case SINGLE_QUOTE:
case DOUBLE_QUOTE:
quote = code === SINGLE_QUOTE ? '\'' : '"';
next = pos;
quote = code === SINGLE_QUOTE ? "'" : '"'
next = pos
do {
escaped = false;
next = css.indexOf(quote, next + 1);
if (next === -1) unclosed('quote');
escapePos = next;
escaped = false
next = css.indexOf(quote, next + 1)
if (next === -1) unclosed('quote')
escapePos = next
while (css.charCodeAt(escapePos - 1) === BACKSLASH) {
escapePos -= 1;
escaped = !escaped;
escapePos -= 1
escaped = !escaped
}
} while (escaped);
} while (escaped)
content = css.slice(pos, next + 1);
lines = content.split('\n');
last = lines.length - 1;
content = css.slice(pos, next + 1)
lines = content.split('\n')
last = lines.length - 1
if (last > 0) {
nextLine = line + last;
nextOffset = next - lines[last].length;
nextLine = line + last
nextOffset = next - lines[last].length
} else {
nextLine = line;
nextOffset = offset;
nextLine = line
nextOffset = offset
}
tokens.push(['string', css.slice(pos, next + 1), line, pos - offset, nextLine, next - nextOffset]);
tokens.push([
'string',
css.slice(pos, next + 1),
line,
pos - offset,
nextLine,
next - nextOffset
])
offset = nextOffset;
line = nextLine;
pos = next;
break;
offset = nextOffset
line = nextLine
pos = next
break
case AT:
RE_AT_END.lastIndex = pos + 1;
RE_AT_END.test(css);
RE_AT_END.lastIndex = pos + 1
RE_AT_END.test(css)
if (RE_AT_END.lastIndex === 0) {
next = css.length - 1;
next = css.length - 1
} else {
next = RE_AT_END.lastIndex - 2;
next = RE_AT_END.lastIndex - 2
}
tokens.push(['at-word', css.slice(pos, next + 1), line, pos - offset, line, next - offset]);
pos = next;
break;
tokens.push([
'at-word',
css.slice(pos, next + 1),
line,
pos - offset,
line,
next - offset
])
pos = next
break
case BACKSLASH:
next = pos;
escape = true;
next = pos
escape = true
nextLine = line;
nextLine = line
while (css.charCodeAt(next + 1) === BACKSLASH) {
next += 1;
escape = !escape;
next += 1
escape = !escape
}
code = css.charCodeAt(next + 1);
code = css.charCodeAt(next + 1)
if (escape) {
if (code === CR && css.charCodeAt(next + 2) === NEWLINE) {
next += 2;
nextLine += 1;
nextOffset = next;
next += 2
nextLine += 1
nextOffset = next
} else if (code === CR || code === NEWLINE || code === FEED) {
next += 1;
nextLine += 1;
nextOffset = next;
next += 1
nextLine += 1
nextOffset = next
} else {
next += 1;
next += 1
}
}
tokens.push(['word', css.slice(pos, next + 1), line, pos - offset, line, next - offset]);
tokens.push([
'word',
css.slice(pos, next + 1),
line,
pos - offset,
line,
next - offset
])
if (nextLine !== line) {
line = nextLine;
offset = nextOffset;
line = nextLine
offset = nextOffset
}
pos = next;
break;
pos = next
break
default:
n = css.charCodeAt(pos + 1);
n = css.charCodeAt(pos + 1)
if (code === SLASH && n === ASTERICK) {
next = css.indexOf('*/', pos + 2) + 1;
if (next === 0) unclosed('comment');
next = css.indexOf('*/', pos + 2) + 1
if (next === 0) unclosed('comment')
content = css.slice(pos, next + 1);
lines = content.split('\n');
last = lines.length - 1;
content = css.slice(pos, next + 1)
lines = content.split('\n')
last = lines.length - 1
if (last > 0) {
nextLine = line + last;
nextOffset = next - lines[last].length;
nextLine = line + last
nextOffset = next - lines[last].length
} else {
nextLine = line;
nextOffset = offset;
nextLine = line
nextOffset = offset
}
tokens.push(['comment', content, line, pos - offset, nextLine, next - nextOffset]);
tokens.push([
'comment',
content,
line,
pos - offset,
nextLine,
next - nextOffset
])
offset = nextOffset;
line = nextLine;
pos = next;
offset = nextOffset
line = nextLine
pos = next
} else if (code === SLASH && n === SLASH) {
RE_NEW_LINE.lastIndex = pos + 1;
RE_NEW_LINE.test(css);
RE_NEW_LINE.lastIndex = pos + 1
RE_NEW_LINE.test(css)
if (RE_NEW_LINE.lastIndex === 0) {
next = css.length - 1;
next = css.length - 1
} else {
next = RE_NEW_LINE.lastIndex - 2;
next = RE_NEW_LINE.lastIndex - 2
}
content = css.slice(pos, next + 1);
content = css.slice(pos, next + 1)
tokens.push(['comment', content, line, pos - offset, line, next - offset, 'inline']);
tokens.push([
'comment',
content,
line,
pos - offset,
line,
next - offset,
'inline'
])
pos = next;
pos = next
} else {
RE_WORD_END.lastIndex = pos + 1;
RE_WORD_END.test(css);
RE_WORD_END.lastIndex = pos + 1
RE_WORD_END.test(css)
if (RE_WORD_END.lastIndex === 0) {
next = css.length - 1;
next = css.length - 1
} else {
next = RE_WORD_END.lastIndex - 2;
next = RE_WORD_END.lastIndex - 2
}
tokens.push(['word', css.slice(pos, next + 1), line, pos - offset, line, next - offset]);
pos = next;
tokens.push([
'word',
css.slice(pos, next + 1),
line,
pos - offset,
line,
next - offset
])
pos = next
}
break;
break
}
pos++;
pos++
}
return tokens;
return tokens
}
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRva2VuaXplLmVzNiJdLCJuYW1lcyI6WyJ0b2tlbml6ZSIsIlNJTkdMRV9RVU9URSIsIkRPVUJMRV9RVU9URSIsIkJBQ0tTTEFTSCIsIlNMQVNIIiwiTkVXTElORSIsIlNQQUNFIiwiRkVFRCIsIlRBQiIsIkNSIiwiT1BFTl9QQVJFTlRIRVNFUyIsIkNMT1NFX1BBUkVOVEhFU0VTIiwiT1BFTl9DVVJMWSIsIkNMT1NFX0NVUkxZIiwiU0VNSUNPTE9OIiwiQVNURVJJQ0siLCJDT0xPTiIsIkFUIiwiQ09NTUEiLCJSRV9BVF9FTkQiLCJSRV9ORVdfTElORSIsIlJFX1dPUkRfRU5EIiwiUkVfQkFEX0JSQUNLRVQiLCJpbnB1dCIsInRva2VucyIsImNzcyIsInZhbHVlT2YiLCJjb2RlIiwibmV4dCIsInF1b3RlIiwibGluZXMiLCJsYXN0IiwiY29udGVudCIsImVzY2FwZSIsIm5leHRMaW5lIiwibmV4dE9mZnNldCIsImVzY2FwZWQiLCJlc2NhcGVQb3MiLCJwcmV2IiwibiIsImxlbmd0aCIsIm9mZnNldCIsImxpbmUiLCJwb3MiLCJ1bmNsb3NlZCIsIndoYXQiLCJlcnJvciIsImNoYXJDb2RlQXQiLCJwdXNoIiwic2xpY2UiLCJpbmRleE9mIiwidGVzdCIsInNwbGl0IiwibGFzdEluZGV4Il0sIm1hcHBpbmdzIjoiOzs7a0JBd0J3QkEsUTtBQXhCeEIsSUFBTUMsaUJBQU47QUFDQSxJQUFNQyxpQkFBTjtBQUNBLElBQU1DLGNBQU47QUFDQSxJQUFNQyxVQUFOO0FBQ0EsSUFBTUMsWUFBTjtBQUNBLElBQU1DLFVBQU47QUFDQSxJQUFNQyxTQUFOO0FBQ0EsSUFBTUMsT0FBTjtBQUNBLElBQU1DLE9BQU47QUFDQSxJQUFNQyxxQkFBTjtBQUNBLElBQU1DLHNCQUFOO0FBQ0EsSUFBTUMsZ0JBQU47QUFDQSxJQUFNQyxpQkFBTjtBQUNBLElBQU1DLGNBQU47QUFDQSxJQUFNQyxhQUFOO0FBQ0EsSUFBTUMsVUFBTjtBQUNBLElBQU1DLE9BQU47QUFDQSxJQUFNQyxV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QVosQ0FBaUIxQixHQUFqQjtBQUNBLGNBQUlMLFlBQVlpQyxTQUFaLEtBQTBCLENBQTlCLEVBQWlDO0FBQy9CekIsbUJBQU9ILElBQUllLE1BQUosR0FBYSxDQUFwQjtBQUNELFdBRkQsTUFFTztBQUNMWixtQkFBT1IsWUFBWWlDLFNBQVosR0FBd0IsQ0FBL0I7QUFDRDs7QUFFRHJCLG9CQUFVUCxJQUFJd0IsS0FBSixDQUFVTixHQUFWLEVBQWVmLE9BQU8sQ0FBdEIsQ0FBVjs7QUFFQUosaUJBQU93QixJQUFQLENBQVksQ0FBQyxTQUFELEVBQVloQixPQUFaLEVBQ1ZVLElBRFUsRUFDSkMsTUFBTUYsTUFERixFQUVWQyxJQUZVLEVBRUpkLE9BQU9hLE1BRkgsRUFHVixRQUhVLENBQVo7O0FBTUFFLGdCQUFNZixJQUFOO0FBQ0QsU0FsQk0sTUFrQkE7QUFDTFAsc0JBQVlnQyxTQUFaLEdBQXdCVixNQUFNLENBQTlCO0FBQ0F0QixzQkFBWThCLElBQVosQ0FBaUIxQixHQUFqQjtBQUNBLGNBQUlKLFlBQVlnQyxTQUFaLEtBQTBCLENBQTlCLEVBQWlDO0FBQy9CekIsbUJBQU9ILElBQUllLE1BQUosR0FBYSxDQUFwQjtBQUNELFdBRkQsTUFFTztBQUNMWixtQkFBT1AsWUFBWWdDLFNBQVosR0FBd0IsQ0FBL0I7QUFDRDs7QUFFRDdCLGlCQUFPd0IsSUFBUCxDQUFZLENBQUMsTUFBRCxFQUFTdkIsSUFBSXdCLEtBQUosQ0FBVU4sR0FBVixFQUFlZixPQUFPLENBQXRCLENBQVQsRUFDVmMsSUFEVSxFQUNKQyxNQUFNRixNQURGLEVBRVZDLElBRlUsRUFFSmQsT0FBT2EsTUFGSCxDQUFaO0FBSUFFLGdCQUFNZixJQUFOO0FBQ0Q7O0FBRUQ7QUFqUEo7O0FBb1BBZTtBQUNEOztBQUVELFNBQU9uQixNQUFQO0FBQ0QiLCJmaWxlIjoidG9rZW5pemUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBTSU5HTEVfUVVPVEUgPSAnXFwnJy5jaGFyQ29kZUF0KDApXG5jb25zdCBET1VCTEVfUVVPVEUgPSAnXCInLmNoYXJDb2RlQXQoMClcbmNvbnN0IEJBQ0tTTEFTSCA9ICdcXFxcJy5jaGFyQ29kZUF0KDApXG5jb25zdCBTTEFTSCA9ICcvJy5jaGFyQ29kZUF0KDApXG5jb25zdCBORVdMSU5FID0gJ1xcbicuY2hhckNvZGVBdCgwKVxuY29uc3QgU1BBQ0UgPSAnICcuY2hhckNvZGVBdCgwKVxuY29uc3QgRkVFRCA9ICdcXGYnLmNoYXJDb2RlQXQoMClcbmNvbnN0IFRBQiA9ICdcXHQnLmNoYXJDb2RlQXQoMClcbmNvbnN0IENSID0gJ1xccicuY2hhckNvZGVBdCgwKVxuY29uc3QgT1BFTl9QQVJFTlRIRVNFUyA9ICcoJy5jaGFyQ29kZUF0KDApXG5jb25zdCBDTE9TRV9QQVJFTlRIRVNFUyA9ICcpJy5jaGFyQ29kZUF0KDApXG5jb25zdCBPUEVOX0NVUkxZID0gJ3snLmNoYXJDb2RlQXQoMClcbmNvbnN0IENMT1NFX0NVUkxZID0gJ30nLmNoYXJDb2RlQXQoMClcbmNvbnN0IFNFTUlDT0xPTiA9ICc7Jy5jaGFyQ29kZUF0KDApXG5jb25zdCBBU1RFUklDSyA9ICcqJy5jaGFyQ29kZUF0KDApXG5jb25zdCBDT0xPTiA9ICc6Jy5jaGFyQ29kZUF0KDApXG5jb25zdCBBVCA9ICdAJy5jaGFyQ29kZUF0KDApXG5jb25zdCBDT01NQSA9ICcsJy5jaGFyQ29kZUF0KDApXG5cbmNvbnN0IFJFX0FUX0VORCA9IC9bIFxcblxcdFxcclxcZnsoKSdcIlxcXFw7L10vZ1xuY29uc3QgUkVfTkVXX0xJTkUgPSAvW1xcclxcZlxcbl0vZ1xuY29uc3QgUkVfV09SRF9FTkQgPSAvWyBcXG5cXHRcXHJcXGYoKXt9OjtAISdcIlxcXFwsXXxcXC8oPz1cXCopL2dcbmNvbnN0IFJFX0JBRF9CUkFDS0VUID0gLy5bXFxcXC8oXCInXFxuXS9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdG9rZW5pemUgKGlucHV0KSB7XG4gIGxldCB0b2tlbnMgPSBbXVxuICBsZXQgY3NzID0gaW5wdXQuY3NzLnZhbHVlT2YoKVxuXG4gIGxldCBjb2RlLCBuZXh0LCBxdW90ZSwgbGluZXMsIGxhc3QsIGNvbnRlbnQsIGVzY2FwZSxcbiAgICBuZXh0TGluZSwgbmV4dE9mZnNldCwgZXNjYXBlZCwgZXNjYXBlUG9zLCBwcmV2LCBuXG5cbiAgbGV0IGxlbmd0aCA9IGNzcy5sZW5ndGhcbiAgbGV0IG9mZnNldCA9IC0xXG4gIGxldCBsaW5lID0gMVxuICBsZXQgcG9zID0gMFxuXG4gIGZ1bmN0aW9uIHVuY2xvc2VkICh3aGF0KSB7XG4gICAgdGhyb3cgaW5wdXQuZXJyb3IoJ1VuY2xvc2VkICcgKyB3aGF0LCBsaW5lLCBwb3MgLSBvZmZzZXQpXG4gIH1cblxuICB3aGlsZSAocG9zIDwgbGVuZ3RoKSB7XG4gICAgY29kZSA9IGNzcy5jaGFyQ29kZUF0KHBvcylcblxuICAgIGlmIChcbiAgICAgIGNvZGUgPT09IE5FV0xJTkUgfHxcbiAgICAgIGNvZGUgPT09IEZFRUQgfHxcbiAgICAgIChjb2RlID09PSBDUiAmJiBjc3MuY2hhckNvZGVBdChwb3MgKyAxKSAhPT0gTkVXTElORSlcbiAgICApIHtcbiAgICAgIG9mZnNldCA9IHBvc1xuICAgICAgbGluZSArPSAxXG4gICAgfVxuXG4gICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICBjYXNlIENSOlxuICAgICAgICBpZiAoY3NzLmNoYXJDb2RlQXQocG9zICsgMSkgPT09IE5FV0xJTkUpIHtcbiAgICAgICAgICBvZmZzZXQgPSBwb3NcbiAgICAgICAgICBsaW5lICs9IDFcbiAgICAgICAgICBwb3MgKz0gMVxuICAgICAgICAgIHRva2Vucy5wdXNoKFsnbmV3bGluZScsICdcXHJcXG4nLCBsaW5lIC0gMV0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2goWyduZXdsaW5lJywgJ1xccicsIGxpbmUgLSAxXSlcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIEZFRUQ6XG4gICAgICBjYXNlIE5FV0xJTkU6XG4gICAgICAgIHRva2Vucy5wdXNoKFsnbmV3bGluZScsIGNzcy5zbGljZShwb3MsIHBvcyArIDEpLCBsaW5lIC0gMV0pXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgU1BBQ0U6XG4gICAgICBjYXNlIFRBQjpcbiAgICAgICAgbmV4dCA9IHBvc1xuICAgICAgICBkbyB7XG4gICAgICAgICAgbmV4dCArPSAxXG4gICAgICAgICAgY29kZSA9IGNzcy5jaGFyQ29kZUF0KG5leHQpXG4gICAgICAgIH0gd2hpbGUgKGNvZGUgPT09IFNQQUNFIHx8IGNvZGUgPT09IFRBQilcblxuICAgICAgICB0b2tlbnMucHVzaChbJ3NwYWNlJywgY3NzLnNsaWNlKHBvcywgbmV4dCldKVxuICAgICAgICBwb3MgPSBuZXh0IC0gMVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIE9QRU5fQ1VSTFk6XG4gICAgICAgIHRva2Vucy5wdXNoKFsneycsICd7JywgbGluZSwgcG9zIC0gb2Zmc2V0XSlcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBDTE9TRV9DVVJMWTpcbiAgICAgICAgdG9rZW5zLnB1c2goWyd9JywgJ30nLCBsaW5lLCBwb3MgLSBvZmZzZXRdKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIENPTE9OOlxuICAgICAgICB0b2tlbnMucHVzaChbJzonLCAnOicsIGxpbmUsIHBvcyAtIG9mZnNldF0pXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgU0VNSUNPTE9OOlxuICAgICAgICB0b2tlbnMucHVzaChbJzsnLCAnOycsIGxpbmUsIHBvcyAtIG9mZnNldF0pXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgQ09NTUE6XG4gICAgICAgIHRva2Vucy5wdXNoKFsnLCcsICcsJywgbGluZSwgcG9zIC0gb2Zmc2V0XSlcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBPUEVOX1BBUkVOVEhFU0VTOlxuICAgICAgICBwcmV2ID0gdG9rZW5zLmxlbmd0aCA/IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV1bMV0gOiAnJ1xuICAgICAgICBuID0gY3NzLmNoYXJDb2RlQXQocG9zICsgMSlcbiAgICAgICAgaWYgKHByZXYgPT09ICd1cmwnICYmIG4gIT09IFNJTkdMRV9RVU9URSAmJiBuICE9PSBET1VCTEVfUVVPVEUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAhPT0gU1BBQ0UgJiYgbiAhPT0gTkVXTElORSAmJiBuICE9PSBUQUIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAhPT0gRkVFRCAmJiBuICE9PSBDUikge1xuICAgICAgICAgIG5leHQgPSBwb3NcbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBlc2NhcGVkID0gZmFsc2VcbiAgICAgICAgICAgIG5leHQgPSBjc3MuaW5kZXhPZignKScsIG5leHQgKyAxKVxuICAgICAgICAgICAgaWYgKG5leHQgPT09IC0xKSB1bmNsb3NlZCgnYnJhY2tldCcpXG4gICAgICAgICAgICBlc2NhcGVQb3MgPSBuZXh0XG4gICAgICAgICAgICB3aGlsZSAoY3NzLmNoYXJDb2RlQXQoZXNjYXBlUG9zIC0gMSkgPT09IEJBQ0tTTEFTSCkge1xuICAgICAgICAgICAgICBlc2NhcGVQb3MgLT0gMVxuICAgICAgICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IHdoaWxlIChlc2NhcGVkKVxuXG4gICAgICAgICAgdG9rZW5zLnB1c2goWydicmFja2V0cycsIGNzcy5zbGljZShwb3MsIG5leHQgKyAxKSxcbiAgICAgICAgICAgIGxpbmUsIHBvcyAtIG9mZnNldCxcbiAgICAgICAgICAgIGxpbmUsIG5leHQgLSBvZmZzZXRcbiAgICAgICAgICBdKVxuICAgICAgICAgIHBvcyA9IG5leHRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0ID0gY3NzLmluZGV4T2YoJyknLCBwb3MgKyAxKVxuICAgICAgICAgIGNvbnRlbnQgPSBjc3Muc2xpY2UocG9zLCBuZXh0ICsgMSlcblxuICAgICAgICAgIGlmIChuZXh0ID09PSAtMSB8fCBSRV9CQURfQlJBQ0tFVC50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICAgICAgICB0b2tlbnMucHVzaChbJygnLCAnKCcsIGxpbmUsIHBvcyAtIG9mZnNldF0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRva2Vucy5wdXNoKFsnYnJhY2tldHMnLCBjb250ZW50LFxuICAgICAgICAgICAgICBsaW5lLCBwb3MgLSBvZmZzZXQsXG4gICAgICAgICAgICAgIGxpbmUsIG5leHQgLSBvZmZzZXRcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgICBwb3MgPSBuZXh0XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBDTE9TRV9QQVJFTlRIRVNFUzpcbiAgICAgICAgdG9rZW5zLnB1c2goWycpJywgJyknLCBsaW5lLCBwb3MgLSBvZmZzZXRdKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFNJTkdMRV9RVU9URTpcbiAgICAgIGNhc2UgRE9VQkxFX1FVT1RFOlxuICAgICAgICBxdW90ZSA9IGNvZGUgPT09IFNJTkdMRV9RVU9URSA/ICdcXCcnIDogJ1wiJ1xuICAgICAgICBuZXh0ID0gcG9zXG4gICAgICAgIGRvIHtcbiAgICAgICAgICBlc2NhcGVkID0gZmFsc2VcbiAgICAgICAgICBuZXh0ID0gY3NzLmluZGV4T2YocXVvdGUsIG5leHQgKyAxKVxuICAgICAgICAgIGlmIChuZXh0ID09PSAtMSkgdW5jbG9zZWQoJ3F1b3RlJylcbiAgICAgICAgICBlc2NhcGVQb3MgPSBuZXh0XG4gICAgICAgICAgd2hpbGUgKGNzcy5jaGFyQ29kZUF0KGVzY2FwZVBvcyAtIDEpID09PSBCQUNLU0xBU0gpIHtcbiAgICAgICAgICAgIGVzY2FwZVBvcyAtPSAxXG4gICAgICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWRcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGVzY2FwZWQpXG5cbiAgICAgICAgY29udGVudCA9IGNzcy5zbGljZShwb3MsIG5leHQgKyAxKVxuICAgICAgICBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpXG4gICAgICAgIGxhc3QgPSBsaW5lcy5sZW5ndGggLSAxXG5cbiAgICAgICAgaWYgKGxhc3QgPiAwKSB7XG4gICAgICAgICAgbmV4dExpbmUgPSBsaW5lICsgbGFzdFxuICAgICAgICAgIG5leHRPZmZzZXQgPSBuZXh0IC0gbGluZXNbbGFzdF0ubGVuZ3RoXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dExpbmUgPSBsaW5lXG4gICAgICAgICAgbmV4dE9mZnNldCA9IG9mZnNldFxuICAgICAgICB9XG5cbiAgICAgICAgdG9rZW5zLnB1c2goWydzdHJpbmcnLCBjc3Muc2xpY2UocG9zLCBuZXh0ICsgMSksXG4gICAgICAgICAgbGluZSwgcG9zIC0gb2Zmc2V0LFxuICAgICAgICAgIG5leHRMaW5lLCBuZXh0IC0gbmV4dE9mZnNldFxuICAgICAgICBdKVxuXG4gICAgICAgIG9mZnNldCA9IG5leHRPZmZzZXRcbiAgICAgICAgbGluZSA9IG5leHRMaW5lXG4gICAgICAgIHBvcyA9IG5leHRcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBBVDpcbiAgICAgICAgUkVfQVRfRU5ELmxhc3RJbmRleCA9IHBvcyArIDFcbiAgICAgICAgUkVfQVRfRU5ELnRlc3QoY3NzKVxuICAgICAgICBpZiAoUkVfQVRfRU5ELmxhc3RJbmRleCA9PT0gMCkge1xuICAgICAgICAgIG5leHQgPSBjc3MubGVuZ3RoIC0gMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHQgPSBSRV9BVF9FTkQubGFzdEluZGV4IC0gMlxuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKFsnYXQtd29yZCcsIGNzcy5zbGljZShwb3MsIG5leHQgKyAxKSxcbiAgICAgICAgICBsaW5lLCBwb3MgLSBvZmZzZXQsXG4gICAgICAgICAgbGluZSwgbmV4dCAtIG9mZnNldFxuICAgICAgICBdKVxuICAgICAgICBwb3MgPSBuZXh0XG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgQkFDS1NMQVNIOlxuICAgICAgICBuZXh0ID0gcG9zXG4gICAgICAgIGVzY2FwZSA9IHRydWVcblxuICAgICAgICBuZXh0TGluZSA9IGxpbmVcblxuICAgICAgICB3aGlsZSAoY3NzLmNoYXJDb2RlQXQobmV4dCArIDEpID09PSBCQUNLU0xBU0gpIHtcbiAgICAgICAgICBuZXh0ICs9IDFcbiAgICAgICAgICBlc2NhcGUgPSAhZXNjYXBlXG4gICAgICAgIH1cbiAgICAgICAgY29kZSA9IGNzcy5jaGFyQ29kZUF0KG5leHQgKyAxKVxuICAgICAgICBpZiAoZXNjYXBlKSB7XG4gICAgICAgICAgaWYgKGNvZGUgPT09IENSICYmIGNzcy5jaGFyQ29kZUF0KG5leHQgKyAyKSA9PT0gTkVXTElORSkge1xuICAgICAgICAgICAgbmV4dCArPSAyXG4gICAgICAgICAgICBuZXh0TGluZSArPSAxXG4gICAgICAgICAgICBuZXh0T2Zmc2V0ID0gbmV4dFxuICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gQ1IgfHwgY29kZSA9PT0gTkVXTElORSB8fCBjb2RlID09PSBGRUVEKSB7XG4gICAgICAgICAgICBuZXh0ICs9IDFcbiAgICAgICAgICAgIG5leHRMaW5lICs9IDFcbiAgICAgICAgICAgIG5leHRPZmZzZXQgPSBuZXh0XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHQgKz0gMVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChbJ3dvcmQnLCBjc3Muc2xpY2UocG9zLCBuZXh0ICsgMSksXG4gICAgICAgICAgbGluZSwgcG9zIC0gb2Zmc2V0LFxuICAgICAgICAgIGxpbmUsIG5leHQgLSBvZmZzZXRcbiAgICAgICAgXSlcbiAgICAgICAgaWYgKG5leHRMaW5lICE9PSBsaW5lKSB7XG4gICAgICAgICAgbGluZSA9IG5leHRMaW5lXG4gICAgICAgICAgb2Zmc2V0ID0gbmV4dE9mZnNldFxuICAgICAgICB9XG4gICAgICAgIHBvcyA9IG5leHRcbiAgICAgICAgYnJlYWtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbiA9IGNzcy5jaGFyQ29kZUF0KHBvcyArIDEpXG5cbiAgICAgICAgaWYgKGNvZGUgPT09IFNMQVNIICYmIG4gPT09IEFTVEVSSUNLKSB7XG4gICAgICAgICAgbmV4dCA9IGNzcy5pbmRleE9mKCcqLycsIHBvcyArIDIpICsgMVxuICAgICAgICAgIGlmIChuZXh0ID09PSAwKSB1bmNsb3NlZCgnY29tbWVudCcpXG5cbiAgICAgICAgICBjb250ZW50ID0gY3NzLnNsaWNlKHBvcywgbmV4dCArIDEpXG4gICAgICAgICAgbGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKVxuICAgICAgICAgIGxhc3QgPSBsaW5lcy5sZW5ndGggLSAxXG5cbiAgICAgICAgICBpZiAobGFzdCA+IDApIHtcbiAgICAgICAgICAgIG5leHRMaW5lID0gbGluZSArIGxhc3RcbiAgICAgICAgICAgIG5leHRPZmZzZXQgPSBuZXh0IC0gbGluZXNbbGFzdF0ubGVuZ3RoXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHRMaW5lID0gbGluZVxuICAgICAgICAgICAgbmV4dE9mZnNldCA9IG9mZnNldFxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRva2Vucy5wdXNoKFsnY29tbWVudCcsIGNvbnRlbnQsXG4gICAgICAgICAgICBsaW5lLCBwb3MgLSBvZmZzZXQsXG4gICAgICAgICAgICBuZXh0TGluZSwgbmV4dCAtIG5leHRPZmZzZXRcbiAgICAgICAgICBdKVxuXG4gICAgICAgICAgb2Zmc2V0ID0gbmV4dE9mZnNldFxuICAgICAgICAgIGxpbmUgPSBuZXh0TGluZVxuICAgICAgICAgIHBvcyA9IG5leHRcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSBTTEFTSCAmJiBuID09PSBTTEFTSCkge1xuICAgICAgICAgIFJFX05FV19MSU5FLmxhc3RJbmRleCA9IHBvcyArIDFcbiAgICAgICAgICBSRV9ORVdfTElORS50ZXN0KGNzcylcbiAgICAgICAgICBpZiAoUkVfTkVXX0xJTkUubGFzdEluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICBuZXh0ID0gY3NzLmxlbmd0aCAtIDFcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dCA9IFJFX05FV19MSU5FLmxhc3RJbmRleCAtIDJcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZW50ID0gY3NzLnNsaWNlKHBvcywgbmV4dCArIDEpXG5cbiAgICAgICAgICB0b2tlbnMucHVzaChbJ2NvbW1lbnQnLCBjb250ZW50LFxuICAgICAgICAgICAgbGluZSwgcG9zIC0gb2Zmc2V0LFxuICAgICAgICAgICAgbGluZSwgbmV4dCAtIG9mZnNldCxcbiAgICAgICAgICAgICdpbmxpbmUnXG4gICAgICAgICAgXSlcblxuICAgICAgICAgIHBvcyA9IG5leHRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBSRV9XT1JEX0VORC5sYXN0SW5kZXggPSBwb3MgKyAxXG4gICAgICAgICAgUkVfV09SRF9FTkQudGVzdChjc3MpXG4gICAgICAgICAgaWYgKFJFX1dPUkRfRU5ELmxhc3RJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgbmV4dCA9IGNzcy5sZW5ndGggLSAxXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHQgPSBSRV9XT1JEX0VORC5sYXN0SW5kZXggLSAyXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdG9rZW5zLnB1c2goWyd3b3JkJywgY3NzLnNsaWNlKHBvcywgbmV4dCArIDEpLFxuICAgICAgICAgICAgbGluZSwgcG9zIC0gb2Zmc2V0LFxuICAgICAgICAgICAgbGluZSwgbmV4dCAtIG9mZnNldFxuICAgICAgICAgIF0pXG4gICAgICAgICAgcG9zID0gbmV4dFxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBwb3MrK1xuICB9XG5cbiAgcmV0dXJuIHRva2Vuc1xufVxuIl19
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc