From 820c3de1480e13cbf6fd5767ec5d5db1d80273f9 Mon Sep 17 00:00:00 2001 From: fanich37 Date: Sun, 13 Oct 2019 14:30:35 +0300 Subject: [PATCH] Make solution more proper and easier to reason about --- lib/selector.js | 47 +++++++++++++++---------------------------- test/selector.test.js | 32 ++++++----------------------- 2 files changed, 22 insertions(+), 57 deletions(-) diff --git a/lib/selector.js b/lib/selector.js index 45c90561b..702b5f3ec 100644 --- a/lib/selector.js +++ b/lib/selector.js @@ -1,4 +1,4 @@ -let list = require('postcss').list +let { list } = require('postcss') let OldSelector = require('./old-selector') let Prefixer = require('./prefixer') @@ -55,42 +55,27 @@ class Selector extends Prefixer { */ prefixeds (rule) { if (rule._autoprefixerPrefixeds) { - return rule._autoprefixerPrefixeds + if (rule._autoprefixerPrefixeds[this.name]) { + return rule._autoprefixerPrefixeds + } + } else { + rule._autoprefixerPrefixeds = {} } let prefixeds = {} - - if (rule.selector.includes(',')) { - let separatedRule = list.comma(rule.selector) - - this.all.add.selectors.forEach(selector => { - let name = selector.name - let selToProc = separatedRule.filter(el => el.includes(name)) - - if (selToProc.length) { - let possible = selector.possible() - prefixeds[name] = {} - - possible.forEach(prefix => { - if (selToProc.length > 1) { - prefixeds[name][prefix] = selToProc - .map(sel => selector.replace(sel, prefix)) - .join(', ') - } else { - prefixeds[name][prefix] = selector.replace(selToProc[0], prefix) - } - }) - } - }) - } else { - prefixeds[this.name] = {} - - for (let prefix of this.possible()) { - prefixeds[this.name][prefix] = this.replace(rule.selector, prefix) + for (let prefix of this.possible()) { + if (rule.selector.includes(',')) { + let ruleParts = list.comma(rule.selector) + let toProcess = ruleParts.filter(el => el.includes(this.name)) + prefixeds[prefix] = toProcess + .map(el => this.replace(el, prefix)) + .join(', ') + } else { + prefixeds[prefix] = this.replace(rule.selector, prefix) } } - rule._autoprefixerPrefixeds = prefixeds + rule._autoprefixerPrefixeds[this.name] = prefixeds return rule._autoprefixerPrefixeds } diff --git a/test/selector.test.js b/test/selector.test.js index add8df5b2..afe4109b9 100644 --- a/test/selector.test.js +++ b/test/selector.test.js @@ -1,32 +1,10 @@ -let agents = require('caniuse-lite').agents let parse = require('postcss').parse -let Browsers = require('../lib/browsers') -let Prefixes = require('../lib/prefixes') let Selector = require('../lib/selector') -let data = { - browsers: agents, - prefixes: { - '::selection': { - selector: true, - browsers: ['firefox 21', 'firefox 20 old', 'chrome 30', 'ie 6'] - }, - ':read-only': { - selector: true, - browsers: ['ie 7', 'firefox 20'] - } - } -} - -let fill = new Prefixes( - data.prefixes, - new Browsers(data.browsers, ['firefox 21', 'ie 7']) -) - let selector beforeEach(() => { - selector = new Selector('::selection', ['-moz-', '-ms-'], fill) + selector = new Selector('::selection', ['-moz-', '-ms-']) }) describe('prefixed()', () => { @@ -60,10 +38,12 @@ describe('check()', () => { }) describe('prefixeds()', () => { - it('returns all available prefixed selectors for grouping rule', () => { + it('grouping rule gets correct _autoprefixerPrefixeds property', () => { let css = parse('.c::selection, .d:read-only {}') - let rSel = new Selector(':read-only', ['-moz-'], fill) - expect(rSel.prefixeds(css.first)).toEqual({ + let rSel = new Selector(':read-only', ['-moz-']) + selector.prefixeds(css.first) + rSel.prefixeds(css.first) + expect(css.first._autoprefixerPrefixeds).toEqual({ '::selection': { '-webkit-': '.c::-webkit-selection', '-moz-': '.c::-moz-selection',