3 const fill = require('fill-range');
4 const stringify = require('./stringify');
5 const utils = require('./utils');
7 const append = (queue = '', stash = '', enclose = false) => {
10 queue = [].concat(queue);
11 stash = [].concat(stash);
13 if (!stash.length) return queue;
15 return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash;
18 for (let item of queue) {
19 if (Array.isArray(item)) {
20 for (let value of item) {
21 result.push(append(value, stash, enclose));
24 for (let ele of stash) {
25 if (enclose === true && typeof ele === 'string') ele = `{${ele}}`;
26 result.push(Array.isArray(ele) ? append(item, ele, enclose) : (item + ele));
30 return utils.flatten(result);
33 const expand = (ast, options = {}) => {
34 let rangeLimit = options.rangeLimit === void 0 ? 1000 : options.rangeLimit;
36 let walk = (node, parent = {}) => {
42 while (p.type !== 'brace' && p.type !== 'root' && p.parent) {
47 if (node.invalid || node.dollar) {
48 q.push(append(q.pop(), stringify(node, options)));
52 if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) {
53 q.push(append(q.pop(), ['{}']));
57 if (node.nodes && node.ranges > 0) {
58 let args = utils.reduce(node.nodes);
60 if (utils.exceedsLimit(...args, options.step, rangeLimit)) {
61 throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.');
64 let range = fill(...args, options);
65 if (range.length === 0) {
66 range = stringify(node, options);
69 q.push(append(q.pop(), range));
74 let enclose = utils.encloseBrace(node);
75 let queue = node.queue;
78 while (block.type !== 'brace' && block.type !== 'root' && block.parent) {
83 for (let i = 0; i < node.nodes.length; i++) {
84 let child = node.nodes[i];
86 if (child.type === 'comma' && node.type === 'brace') {
87 if (i === 1) queue.push('');
92 if (child.type === 'close') {
93 q.push(append(q.pop(), queue, enclose));
97 if (child.value && child.type !== 'open') {
98 queue.push(append(queue.pop(), child.value));
110 return utils.flatten(walk(ast));
113 module.exports = expand;