@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
@@ -2,7 +2,7 @@
2
2
  "name": "@thejaredwilcurt/csslop",
3
3
  "main": "index.js",
4
4
  "type": "module",
5
- "version": "0.0.56",
5
+ "version": "0.0.57",
6
6
  "description": "Experimental CSS minification",
7
7
  "scripts": {
8
8
  "prestart": "node ./scripts/pre/start.js",
@@ -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
- lookahead,
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.lookahead;
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