feat: docker compose maybe
This commit is contained in:
20
node_modules/postcss-nested/LICENSE
generated
vendored
Normal file
20
node_modules/postcss-nested/LICENSE
generated
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright 2014 Andrey Sitnik <andrey@sitnik.ru>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
86
node_modules/postcss-nested/README.md
generated
vendored
Normal file
86
node_modules/postcss-nested/README.md
generated
vendored
Normal file
@ -0,0 +1,86 @@
|
||||
# PostCSS Nested
|
||||
|
||||
<img align="right" width="135" height="95"
|
||||
title="Philosopher’s stone, logo of PostCSS"
|
||||
src="https://postcss.org/logo-leftp.svg">
|
||||
|
||||
[PostCSS] plugin to unwrap nested rules closer to Sass syntax.
|
||||
|
||||
```css
|
||||
.phone {
|
||||
&_title {
|
||||
width: 500px;
|
||||
@media (max-width: 500px) {
|
||||
width: auto;
|
||||
}
|
||||
body.is_dark & {
|
||||
color: white;
|
||||
}
|
||||
}
|
||||
img {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: var(--font);
|
||||
|
||||
@at-root html {
|
||||
--font: 16px
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
will be processed to:
|
||||
|
||||
```css
|
||||
.phone_title {
|
||||
width: 500px;
|
||||
}
|
||||
@media (max-width: 500px) {
|
||||
.phone_title {
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
body.is_dark .phone_title {
|
||||
color: white;
|
||||
}
|
||||
.phone img {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: var(--font);
|
||||
}
|
||||
html {
|
||||
--font: 16px
|
||||
}
|
||||
```
|
||||
|
||||
Related plugins:
|
||||
|
||||
* Use [`postcss-current-selector`] **after** this plugin if you want
|
||||
to use current selector in properties or variables values.
|
||||
* Use [`postcss-nested-ancestors`] **before** this plugin if you want
|
||||
to reference any ancestor element directly in your selectors with `^&`.
|
||||
|
||||
Alternatives:
|
||||
|
||||
* See also [`postcss-nesting`], which implements [CSSWG draft].
|
||||
* [`postcss-nested-props`] for nested properties like `font-size`.
|
||||
|
||||
<a href="https://evilmartians.com/?utm_source=postcss-nested">
|
||||
<img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg"
|
||||
alt="Sponsored by Evil Martians" width="236" height="54">
|
||||
</a>
|
||||
|
||||
[`postcss-current-selector`]: https://github.com/komlev/postcss-current-selector
|
||||
[`postcss-nested-ancestors`]: https://github.com/toomuchdesign/postcss-nested-ancestors
|
||||
[`postcss-nested-props`]: https://github.com/jedmao/postcss-nested-props
|
||||
[`postcss-nesting`]: https://github.com/csstools/postcss-plugins/tree/main/plugins/postcss-nesting
|
||||
[CSSWG draft]: https://drafts.csswg.org/css-nesting-1/
|
||||
[PostCSS]: https://github.com/postcss/postcss
|
||||
|
||||
|
||||
## Docs
|
||||
Read full docs **[here](https://github.com/postcss/postcss-nested#readme)**.
|
41
node_modules/postcss-nested/index.d.ts
generated
vendored
Normal file
41
node_modules/postcss-nested/index.d.ts
generated
vendored
Normal file
@ -0,0 +1,41 @@
|
||||
// Original definitions (@types/postcss-nested)
|
||||
// by Maxim Vorontsov <https://github.com/VorontsovMaxim>
|
||||
|
||||
import { PluginCreator } from 'postcss'
|
||||
|
||||
declare namespace nested {
|
||||
interface Options {
|
||||
/**
|
||||
* By default, plugin will bubble only `@media`, `@supports` and `@layer`
|
||||
* at-rules. Use this option to add your custom at-rules to this list.
|
||||
*/
|
||||
bubble?: string[]
|
||||
|
||||
/**
|
||||
* By default, plugin will unwrap only `@font-face`, `@keyframes`,
|
||||
* and `@document` at-rules. You can add your custom at-rules
|
||||
* to this list by this option.
|
||||
*/
|
||||
unwrap?: string[]
|
||||
|
||||
/**
|
||||
* By default, plugin will strip out any empty selector generated
|
||||
* by intermediate nesting levels. You can set this option to `true`
|
||||
* to preserve them.
|
||||
*/
|
||||
preserveEmpty?: boolean
|
||||
|
||||
/**
|
||||
* The plugin supports the SCSS custom at-rule `@at-root` which breaks
|
||||
* rule blocks out of their nested position. If you want, you can choose
|
||||
* a new custom name for this rule in your code.
|
||||
*/
|
||||
rootRuleName?: string
|
||||
}
|
||||
|
||||
type Nested = PluginCreator<Options>
|
||||
}
|
||||
|
||||
declare const nested: nested.Nested
|
||||
|
||||
export = nested
|
361
node_modules/postcss-nested/index.js
generated
vendored
Normal file
361
node_modules/postcss-nested/index.js
generated
vendored
Normal file
@ -0,0 +1,361 @@
|
||||
const { Rule, AtRule } = require('postcss')
|
||||
let parser = require('postcss-selector-parser')
|
||||
|
||||
/**
|
||||
* Run a selector string through postcss-selector-parser
|
||||
*/
|
||||
function parse(rawSelector, rule) {
|
||||
let nodes
|
||||
try {
|
||||
parser(parsed => {
|
||||
nodes = parsed
|
||||
}).processSync(rawSelector)
|
||||
} catch (e) {
|
||||
if (rawSelector.includes(':')) {
|
||||
throw rule ? rule.error('Missed semicolon') : e
|
||||
} else {
|
||||
throw rule ? rule.error(e.message) : e
|
||||
}
|
||||
}
|
||||
return nodes.at(0)
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces the "&" token in a node's selector with the parent selector
|
||||
* similar to what SCSS does.
|
||||
*
|
||||
* Mutates the nodes list
|
||||
*/
|
||||
function interpolateAmpInSelector(nodes, parent) {
|
||||
let replaced = false
|
||||
nodes.each(node => {
|
||||
if (node.type === 'nesting') {
|
||||
let clonedParent = parent.clone({})
|
||||
if (node.value !== '&') {
|
||||
node.replaceWith(
|
||||
parse(node.value.replace('&', clonedParent.toString()))
|
||||
)
|
||||
} else {
|
||||
node.replaceWith(clonedParent)
|
||||
}
|
||||
replaced = true
|
||||
} else if ('nodes' in node && node.nodes) {
|
||||
if (interpolateAmpInSelector(node, parent)) {
|
||||
replaced = true
|
||||
}
|
||||
}
|
||||
})
|
||||
return replaced
|
||||
}
|
||||
|
||||
/**
|
||||
* Combines parent and child selectors, in a SCSS-like way
|
||||
*/
|
||||
function mergeSelectors(parent, child) {
|
||||
let merged = []
|
||||
parent.selectors.forEach(sel => {
|
||||
let parentNode = parse(sel, parent)
|
||||
|
||||
child.selectors.forEach(selector => {
|
||||
if (!selector) {
|
||||
return
|
||||
}
|
||||
let node = parse(selector, child)
|
||||
let replaced = interpolateAmpInSelector(node, parentNode)
|
||||
if (!replaced) {
|
||||
node.prepend(parser.combinator({ value: ' ' }))
|
||||
node.prepend(parentNode.clone({}))
|
||||
}
|
||||
merged.push(node.toString())
|
||||
})
|
||||
})
|
||||
return merged
|
||||
}
|
||||
|
||||
/**
|
||||
* Move a child and its preceeding comment(s) to after "after"
|
||||
*/
|
||||
function breakOut(child, after) {
|
||||
let prev = child.prev()
|
||||
after.after(child)
|
||||
while (prev && prev.type === 'comment') {
|
||||
let nextPrev = prev.prev()
|
||||
after.after(prev)
|
||||
prev = nextPrev
|
||||
}
|
||||
return child
|
||||
}
|
||||
|
||||
function createFnAtruleChilds(bubble) {
|
||||
return function atruleChilds(rule, atrule, bubbling, mergeSels = bubbling) {
|
||||
let children = []
|
||||
atrule.each(child => {
|
||||
if (child.type === 'rule' && bubbling) {
|
||||
if (mergeSels) {
|
||||
child.selectors = mergeSelectors(rule, child)
|
||||
}
|
||||
} else if (child.type === 'atrule' && child.nodes) {
|
||||
if (bubble[child.name]) {
|
||||
atruleChilds(rule, child, mergeSels)
|
||||
} else if (atrule[rootRuleMergeSel] !== false) {
|
||||
children.push(child)
|
||||
}
|
||||
} else {
|
||||
children.push(child)
|
||||
}
|
||||
})
|
||||
if (bubbling) {
|
||||
if (children.length) {
|
||||
let clone = rule.clone({ nodes: [] })
|
||||
for (let child of children) {
|
||||
clone.append(child)
|
||||
}
|
||||
atrule.prepend(clone)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function pickDeclarations(selector, declarations, after) {
|
||||
let parent = new Rule({
|
||||
selector,
|
||||
nodes: []
|
||||
})
|
||||
parent.append(declarations)
|
||||
after.after(parent)
|
||||
return parent
|
||||
}
|
||||
|
||||
function atruleNames(defaults, custom) {
|
||||
let list = {}
|
||||
for (let name of defaults) {
|
||||
list[name] = true
|
||||
}
|
||||
if (custom) {
|
||||
for (let name of custom) {
|
||||
list[name.replace(/^@/, '')] = true
|
||||
}
|
||||
}
|
||||
return list
|
||||
}
|
||||
|
||||
function parseRootRuleParams(params) {
|
||||
params = params.trim()
|
||||
let braceBlock = params.match(/^\((.*)\)$/)
|
||||
if (!braceBlock) {
|
||||
return { type: 'basic', selector: params }
|
||||
}
|
||||
let bits = braceBlock[1].match(/^(with(?:out)?):(.+)$/)
|
||||
if (bits) {
|
||||
let allowlist = bits[1] === 'with'
|
||||
let rules = Object.fromEntries(
|
||||
bits[2]
|
||||
.trim()
|
||||
.split(/\s+/)
|
||||
.map(name => [name, true])
|
||||
)
|
||||
if (allowlist && rules.all) {
|
||||
return { type: 'noop' }
|
||||
}
|
||||
let escapes = rule => !!rules[rule]
|
||||
if (rules.all) {
|
||||
escapes = () => true
|
||||
} else if (allowlist) {
|
||||
escapes = rule => (rule === 'all' ? false : !rules[rule])
|
||||
}
|
||||
|
||||
return {
|
||||
type: 'withrules',
|
||||
escapes
|
||||
}
|
||||
}
|
||||
// Unrecognized brace block
|
||||
return { type: 'unknown' }
|
||||
}
|
||||
|
||||
function getAncestorRules(leaf) {
|
||||
let lineage = []
|
||||
let parent = leaf.parent
|
||||
|
||||
while (parent && parent instanceof AtRule) {
|
||||
lineage.push(parent)
|
||||
parent = parent.parent
|
||||
}
|
||||
return lineage
|
||||
}
|
||||
|
||||
function unwrapRootRule(rule) {
|
||||
let escapes = rule[rootRuleEscapes]
|
||||
|
||||
if (!escapes) {
|
||||
rule.after(rule.nodes)
|
||||
} else {
|
||||
let nodes = rule.nodes
|
||||
|
||||
let topEscaped
|
||||
let topEscapedIdx = -1
|
||||
let breakoutLeaf
|
||||
let breakoutRoot
|
||||
let clone
|
||||
|
||||
let lineage = getAncestorRules(rule)
|
||||
lineage.forEach((parent, i) => {
|
||||
if (escapes(parent.name)) {
|
||||
topEscaped = parent
|
||||
topEscapedIdx = i
|
||||
breakoutRoot = clone
|
||||
} else {
|
||||
let oldClone = clone
|
||||
clone = parent.clone({ nodes: [] })
|
||||
oldClone && clone.append(oldClone)
|
||||
breakoutLeaf = breakoutLeaf || clone
|
||||
}
|
||||
})
|
||||
|
||||
if (!topEscaped) {
|
||||
rule.after(nodes)
|
||||
} else if (!breakoutRoot) {
|
||||
topEscaped.after(nodes)
|
||||
} else {
|
||||
let leaf = breakoutLeaf
|
||||
leaf.append(nodes)
|
||||
topEscaped.after(breakoutRoot)
|
||||
}
|
||||
|
||||
if (rule.next() && topEscaped) {
|
||||
let restRoot
|
||||
lineage.slice(0, topEscapedIdx + 1).forEach((parent, i, arr) => {
|
||||
let oldRoot = restRoot
|
||||
restRoot = parent.clone({ nodes: [] })
|
||||
oldRoot && restRoot.append(oldRoot)
|
||||
|
||||
let nextSibs = []
|
||||
let _child = arr[i - 1] || rule
|
||||
let next = _child.next()
|
||||
while (next) {
|
||||
nextSibs.push(next)
|
||||
next = next.next()
|
||||
}
|
||||
restRoot.append(nextSibs)
|
||||
})
|
||||
restRoot && (breakoutRoot || nodes[nodes.length - 1]).after(restRoot)
|
||||
}
|
||||
}
|
||||
|
||||
rule.remove()
|
||||
}
|
||||
|
||||
const rootRuleMergeSel = Symbol('rootRuleMergeSel')
|
||||
const rootRuleEscapes = Symbol('rootRuleEscapes')
|
||||
|
||||
function normalizeRootRule(rule) {
|
||||
let { params } = rule
|
||||
let { type, selector, escapes } = parseRootRuleParams(params)
|
||||
if (type === 'unknown') {
|
||||
throw rule.error(
|
||||
`Unknown @${rule.name} parameter ${JSON.stringify(params)}`
|
||||
)
|
||||
}
|
||||
if (type === 'basic' && selector) {
|
||||
let selectorBlock = new Rule({ selector, nodes: rule.nodes })
|
||||
rule.removeAll()
|
||||
rule.append(selectorBlock)
|
||||
}
|
||||
rule[rootRuleEscapes] = escapes
|
||||
rule[rootRuleMergeSel] = escapes ? !escapes('all') : type === 'noop'
|
||||
}
|
||||
|
||||
const hasRootRule = Symbol('hasRootRule')
|
||||
|
||||
module.exports = (opts = {}) => {
|
||||
let bubble = atruleNames(
|
||||
['media', 'supports', 'layer', 'container'],
|
||||
opts.bubble
|
||||
)
|
||||
let atruleChilds = createFnAtruleChilds(bubble)
|
||||
let unwrap = atruleNames(
|
||||
[
|
||||
'document',
|
||||
'font-face',
|
||||
'keyframes',
|
||||
'-webkit-keyframes',
|
||||
'-moz-keyframes'
|
||||
],
|
||||
opts.unwrap
|
||||
)
|
||||
let rootRuleName = (opts.rootRuleName || 'at-root').replace(/^@/, '')
|
||||
let preserveEmpty = opts.preserveEmpty
|
||||
|
||||
return {
|
||||
postcssPlugin: 'postcss-nested',
|
||||
|
||||
Once(root) {
|
||||
root.walkAtRules(rootRuleName, node => {
|
||||
normalizeRootRule(node)
|
||||
root[hasRootRule] = true
|
||||
})
|
||||
},
|
||||
|
||||
Rule(rule) {
|
||||
let unwrapped = false
|
||||
let after = rule
|
||||
let copyDeclarations = false
|
||||
let declarations = []
|
||||
|
||||
rule.each(child => {
|
||||
if (child.type === 'rule') {
|
||||
if (declarations.length) {
|
||||
after = pickDeclarations(rule.selector, declarations, after)
|
||||
declarations = []
|
||||
}
|
||||
|
||||
copyDeclarations = true
|
||||
unwrapped = true
|
||||
child.selectors = mergeSelectors(rule, child)
|
||||
after = breakOut(child, after)
|
||||
} else if (child.type === 'atrule') {
|
||||
if (declarations.length) {
|
||||
after = pickDeclarations(rule.selector, declarations, after)
|
||||
declarations = []
|
||||
}
|
||||
if (child.name === rootRuleName) {
|
||||
unwrapped = true
|
||||
atruleChilds(rule, child, true, child[rootRuleMergeSel])
|
||||
after = breakOut(child, after)
|
||||
} else if (bubble[child.name]) {
|
||||
copyDeclarations = true
|
||||
unwrapped = true
|
||||
atruleChilds(rule, child, true)
|
||||
after = breakOut(child, after)
|
||||
} else if (unwrap[child.name]) {
|
||||
copyDeclarations = true
|
||||
unwrapped = true
|
||||
atruleChilds(rule, child, false)
|
||||
after = breakOut(child, after)
|
||||
} else if (copyDeclarations) {
|
||||
declarations.push(child)
|
||||
}
|
||||
} else if (child.type === 'decl' && copyDeclarations) {
|
||||
declarations.push(child)
|
||||
}
|
||||
})
|
||||
|
||||
if (declarations.length) {
|
||||
after = pickDeclarations(rule.selector, declarations, after)
|
||||
}
|
||||
|
||||
if (unwrapped && preserveEmpty !== true) {
|
||||
rule.raws.semicolon = true
|
||||
if (rule.nodes.length === 0) rule.remove()
|
||||
}
|
||||
},
|
||||
|
||||
RootExit(root) {
|
||||
if (root[hasRootRule]) {
|
||||
root.walkAtRules(rootRuleName, unwrapRootRule)
|
||||
root[hasRootRule] = false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
module.exports.postcss = true
|
28
node_modules/postcss-nested/package.json
generated
vendored
Normal file
28
node_modules/postcss-nested/package.json
generated
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
{
|
||||
"name": "postcss-nested",
|
||||
"version": "6.0.1",
|
||||
"description": "PostCSS plugin to unwrap nested rules like how Sass does it",
|
||||
"keywords": [
|
||||
"postcss",
|
||||
"css",
|
||||
"postcss-plugin",
|
||||
"sass",
|
||||
"nested"
|
||||
],
|
||||
"author": "Andrey Sitnik <andrey@sitnik.ru>",
|
||||
"license": "MIT",
|
||||
"repository": "postcss/postcss-nested",
|
||||
"engines": {
|
||||
"node": ">=12.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/postcss/"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"postcss": "^8.2.14"
|
||||
},
|
||||
"dependencies": {
|
||||
"postcss-selector-parser": "^6.0.11"
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user