@thejaredwilcurt/csslop 0.0.56 → 0.0.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -276,6 +276,40 @@ function createWrapperDeclarations (run) {
|
|
|
276
276
|
];
|
|
277
277
|
}
|
|
278
278
|
|
|
279
|
+
/**
|
|
280
|
+
* Collects the run of consecutive sibling rules, starting at a given index,
|
|
281
|
+
* whose selectors can all nest under a candidate parent. Comments never affect
|
|
282
|
+
* the cascade, so they are passed over instead of ending the run.
|
|
283
|
+
*
|
|
284
|
+
* @param {Array} rules The sibling AST entries.
|
|
285
|
+
* @param {number} startIndex The index the run starts at.
|
|
286
|
+
* @param {function(string): (string|null)} matchNestedSelector The matcher built for the candidate parent.
|
|
287
|
+
* @return {object} The `run` of rules paired with their nested selectors, and the `end` index just past the run's last rule.
|
|
288
|
+
*/
|
|
289
|
+
function collectSiblingRun (rules, startIndex, matchNestedSelector) {
|
|
290
|
+
const run = [];
|
|
291
|
+
let end = startIndex;
|
|
292
|
+
let lookahead = startIndex;
|
|
293
|
+
while (lookahead < rules.length) {
|
|
294
|
+
const sibling = rules[lookahead];
|
|
295
|
+
if (sibling.type === 'comment') {
|
|
296
|
+
lookahead++;
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
if (sibling.type !== 'rule' || !sibling.selectors?.length) {
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
const nestedSelectors = nestSelectorsUnderParent(sibling, matchNestedSelector);
|
|
303
|
+
if (!nestedSelectors) {
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
run.push({ sibling, nestedSelectors });
|
|
307
|
+
lookahead++;
|
|
308
|
+
end = lookahead;
|
|
309
|
+
}
|
|
310
|
+
return { end, run };
|
|
311
|
+
}
|
|
312
|
+
|
|
279
313
|
/**
|
|
280
314
|
* Groups consecutive sibling rules that share a common leading selector
|
|
281
315
|
* portion (such as `.foo` in `.foo .a`, `.foo .b`, or `.menu .item` in
|
|
@@ -308,20 +342,7 @@ function factorCommonParents (rules, allowTrailingCompound = false) {
|
|
|
308
342
|
}
|
|
309
343
|
const matchNestedSelector = createNestedSelectorMatcher(candidateParent);
|
|
310
344
|
// Collect the run of consecutive rules whose selectors can all nest under the candidate.
|
|
311
|
-
const run =
|
|
312
|
-
let lookahead = index;
|
|
313
|
-
while (lookahead < rules.length) {
|
|
314
|
-
const sibling = rules[lookahead];
|
|
315
|
-
if (sibling.type !== 'rule' || !sibling.selectors?.length) {
|
|
316
|
-
break;
|
|
317
|
-
}
|
|
318
|
-
const nestedSelectors = nestSelectorsUnderParent(sibling, matchNestedSelector);
|
|
319
|
-
if (!nestedSelectors) {
|
|
320
|
-
break;
|
|
321
|
-
}
|
|
322
|
-
run.push({ sibling, nestedSelectors });
|
|
323
|
-
lookahead++;
|
|
324
|
-
}
|
|
345
|
+
const { end, run } = collectSiblingRun(rules, index, matchNestedSelector);
|
|
325
346
|
const selectorCount = run.reduce((total, entry) => {
|
|
326
347
|
return total + entry.nestedSelectors.length;
|
|
327
348
|
}, 0);
|
|
@@ -333,8 +354,11 @@ function factorCommonParents (rules, allowTrailingCompound = false) {
|
|
|
333
354
|
const savings = measureWrapperSavings(run, declarations, candidateParent);
|
|
334
355
|
if (savings > 0 && (!bestGrouping || savings > bestGrouping.savings)) {
|
|
335
356
|
bestGrouping = {
|
|
357
|
+
comments: rules.slice(index, end).filter((entry) => {
|
|
358
|
+
return entry.type === 'comment';
|
|
359
|
+
}),
|
|
336
360
|
declarations,
|
|
337
|
-
|
|
361
|
+
end,
|
|
338
362
|
parent: candidateParent,
|
|
339
363
|
savings
|
|
340
364
|
};
|
|
@@ -349,12 +373,12 @@ function factorCommonParents (rules, allowTrailingCompound = false) {
|
|
|
349
373
|
index++;
|
|
350
374
|
continue;
|
|
351
375
|
}
|
|
352
|
-
result.push({
|
|
376
|
+
result.push(...bestGrouping.comments, {
|
|
353
377
|
type: 'rule',
|
|
354
378
|
selectors: [bestGrouping.parent],
|
|
355
379
|
declarations: bestGrouping.declarations
|
|
356
380
|
});
|
|
357
|
-
index = bestGrouping.
|
|
381
|
+
index = bestGrouping.end;
|
|
358
382
|
}
|
|
359
383
|
return result;
|
|
360
384
|
}
|
|
@@ -28,13 +28,13 @@ function nestSelectorRemainder (remainder) {
|
|
|
28
28
|
if (remainder.startsWith(':')) {
|
|
29
29
|
return '&' + remainder;
|
|
30
30
|
}
|
|
31
|
-
if (remainder.startsWith(' ')) {
|
|
32
|
-
return remainder.slice(1);
|
|
33
|
-
}
|
|
34
31
|
const combinatorMatch = remainder.match(LEADING_COMBINATOR_PATTERN);
|
|
35
32
|
if (combinatorMatch) {
|
|
36
33
|
return combinatorMatch[1] + combinatorMatch[2];
|
|
37
34
|
}
|
|
35
|
+
if (remainder.startsWith(' ')) {
|
|
36
|
+
return remainder.slice(1);
|
|
37
|
+
}
|
|
38
38
|
return null;
|
|
39
39
|
}
|
|
40
40
|
|