UNPKG

5.29 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var tslib_1 = require("tslib");
4var comment_1 = tslib_1.__importDefault(require("../tree/comment"));
5var node_1 = tslib_1.__importDefault(require("../tree/node"));
6var dimension_1 = tslib_1.__importDefault(require("../tree/dimension"));
7var declaration_1 = tslib_1.__importDefault(require("../tree/declaration"));
8var expression_1 = tslib_1.__importDefault(require("../tree/expression"));
9var ruleset_1 = tslib_1.__importDefault(require("../tree/ruleset"));
10var selector_1 = tslib_1.__importDefault(require("../tree/selector"));
11var element_1 = tslib_1.__importDefault(require("../tree/element"));
12var quoted_1 = tslib_1.__importDefault(require("../tree/quoted"));
13var value_1 = tslib_1.__importDefault(require("../tree/value"));
14var getItemsFromNode = function (node) {
15 // handle non-array values as an array of length 1
16 // return 'undefined' if index is invalid
17 var items = Array.isArray(node.value) ?
18 node.value : Array(node);
19 return items;
20};
21exports.default = {
22 _SELF: function (n) {
23 return n;
24 },
25 '~': function () {
26 var expr = [];
27 for (var _i = 0; _i < arguments.length; _i++) {
28 expr[_i] = arguments[_i];
29 }
30 if (expr.length === 1) {
31 return expr[0];
32 }
33 return new value_1.default(expr);
34 },
35 extract: function (values, index) {
36 // (1-based index)
37 index = index.value - 1;
38 return getItemsFromNode(values)[index];
39 },
40 length: function (values) {
41 return new dimension_1.default(getItemsFromNode(values).length);
42 },
43 /**
44 * Creates a Less list of incremental values.
45 * Modeled after Lodash's range function, also exists natively in PHP
46 *
47 * @param {Dimension} [start=1]
48 * @param {Dimension} end - e.g. 10 or 10px - unit is added to output
49 * @param {Dimension} [step=1]
50 */
51 range: function (start, end, step) {
52 var from;
53 var to;
54 var stepValue = 1;
55 var list = [];
56 if (end) {
57 to = end;
58 from = start.value;
59 if (step) {
60 stepValue = step.value;
61 }
62 }
63 else {
64 from = 1;
65 to = start;
66 }
67 for (var i = from; i <= to.value; i += stepValue) {
68 list.push(new dimension_1.default(i, to.unit));
69 }
70 return new expression_1.default(list);
71 },
72 each: function (list, rs) {
73 var _this = this;
74 var rules = [];
75 var newRules;
76 var iterator;
77 var tryEval = function (val) {
78 if (val instanceof node_1.default) {
79 return val.eval(_this.context);
80 }
81 return val;
82 };
83 if (list.value && !(list instanceof quoted_1.default)) {
84 if (Array.isArray(list.value)) {
85 iterator = list.value.map(tryEval);
86 }
87 else {
88 iterator = [tryEval(list.value)];
89 }
90 }
91 else if (list.ruleset) {
92 iterator = tryEval(list.ruleset).rules;
93 }
94 else if (list.rules) {
95 iterator = list.rules.map(tryEval);
96 }
97 else if (Array.isArray(list)) {
98 iterator = list.map(tryEval);
99 }
100 else {
101 iterator = [tryEval(list)];
102 }
103 var valueName = '@value';
104 var keyName = '@key';
105 var indexName = '@index';
106 if (rs.params) {
107 valueName = rs.params[0] && rs.params[0].name;
108 keyName = rs.params[1] && rs.params[1].name;
109 indexName = rs.params[2] && rs.params[2].name;
110 rs = rs.rules;
111 }
112 else {
113 rs = rs.ruleset;
114 }
115 for (var i = 0; i < iterator.length; i++) {
116 var key = void 0;
117 var value = void 0;
118 var item = iterator[i];
119 if (item instanceof declaration_1.default) {
120 key = typeof item.name === 'string' ? item.name : item.name[0].value;
121 value = item.value;
122 }
123 else {
124 key = new dimension_1.default(i + 1);
125 value = item;
126 }
127 if (item instanceof comment_1.default) {
128 continue;
129 }
130 newRules = rs.rules.slice(0);
131 if (valueName) {
132 newRules.push(new declaration_1.default(valueName, value, false, false, this.index, this.currentFileInfo));
133 }
134 if (indexName) {
135 newRules.push(new declaration_1.default(indexName, new dimension_1.default(i + 1), false, false, this.index, this.currentFileInfo));
136 }
137 if (keyName) {
138 newRules.push(new declaration_1.default(keyName, key, false, false, this.index, this.currentFileInfo));
139 }
140 rules.push(new ruleset_1.default([new (selector_1.default)([new element_1.default("", '&')])], newRules, rs.strictImports, rs.visibilityInfo()));
141 }
142 return new ruleset_1.default([new (selector_1.default)([new element_1.default("", '&')])], rules, rs.strictImports, rs.visibilityInfo()).eval(this.context);
143 }
144};
145//# sourceMappingURL=list.js.map
\No newline at end of file