diff --git a/lib/stylePlugins/scoped.ts b/lib/stylePlugins/scoped.ts index 14e1a2d..4c5bb89 100644 --- a/lib/stylePlugins/scoped.ts +++ b/lib/stylePlugins/scoped.ts @@ -1,101 +1,106 @@ -import { Root } from 'postcss' -import * as postcss from 'postcss' +import { Root, PluginCreator } from 'postcss' // postcss-selector-parser does have typings but it's problematic to work with. const selectorParser = require('postcss-selector-parser') -export default postcss.plugin('add-id', (options: any) => (root: Root) => { - const id: string = options - const keyframes = Object.create(null) +const pluginFn: PluginCreator = options => ({ + postcssPlugin: 'add-id', + Once(root: Root) { + const id: string = options + const keyframes = Object.create(null) - root.each(function rewriteSelector(node: any) { - if (!node.selector) { - // handle media queries - if (node.type === 'atrule') { - if (node.name === 'media' || node.name === 'supports') { - node.each(rewriteSelector) - } else if (/-?keyframes$/.test(node.name)) { - // register keyframes - keyframes[node.params] = node.params = node.params + '-' + id + root.each(function rewriteSelector(node: any) { + if (!node.selector) { + // handle media queries + if (node.type === 'atrule') { + if (node.name === 'media' || node.name === 'supports') { + node.each(rewriteSelector) + } else if (/-?keyframes$/.test(node.name)) { + // register keyframes + keyframes[node.params] = node.params = node.params + '-' + id + } } + return } - return - } - node.selector = selectorParser((selectors: any) => { - selectors.each((selector: any) => { - let node: any = null + node.selector = selectorParser((selectors: any) => { + selectors.each((selector: any) => { + let node: any = null - // find the last child node to insert attribute selector - selector.each((n: any) => { - // ">>>" combinator - // and /deep/ alias for >>>, since >>> doesn't work in SASS - if ( - n.type === 'combinator' && - (n.value === '>>>' || n.value === '/deep/') - ) { - n.value = ' ' - n.spaces.before = n.spaces.after = '' - return false - } + // find the last child node to insert attribute selector + selector.each((n: any) => { + // ">>>" combinator + // and /deep/ alias for >>>, since >>> doesn't work in SASS + if ( + n.type === 'combinator' && + (n.value === '>>>' || n.value === '/deep/') + ) { + n.value = ' ' + n.spaces.before = n.spaces.after = '' + return false + } - // in newer versions of sass, /deep/ support is also dropped, so add a ::v-deep alias - if (n.type === 'pseudo' && n.value === '::v-deep') { - n.value = n.spaces.before = n.spaces.after = '' - return false - } + // in newer versions of sass, /deep/ support is also dropped, so add a ::v-deep alias + if (n.type === 'pseudo' && n.value === '::v-deep') { + n.value = n.spaces.before = n.spaces.after = '' + return false + } - if (n.type !== 'pseudo' && n.type !== 'combinator') { - node = n + if (n.type !== 'pseudo' && n.type !== 'combinator') { + node = n + } + }) + + if (node) { + node.spaces.after = '' + } else { + // For deep selectors & standalone pseudo selectors, + // the attribute selectors are prepended rather than appended. + // So all leading spaces must be eliminated to avoid problems. + selector.first.spaces.before = '' } + + selector.insertAfter( + node, + selectorParser.attribute({ + attribute: id + }) + ) }) + }).processSync(node.selector) + }) - if (node) { - node.spaces.after = '' - } else { - // For deep selectors & standalone pseudo selectors, - // the attribute selectors are prepended rather than appended. - // So all leading spaces must be eliminated to avoid problems. - selector.first.spaces.before = '' + // If keyframes are found in this