You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
3.0 KiB
84 lines
3.0 KiB
"use strict"; |
|
Object.defineProperty(exports, "__esModule", { |
|
value: true |
|
}); |
|
exports.nesting = nesting; |
|
var _postcss = _interopRequireDefault(require("postcss")); |
|
var _postcssNested = _interopRequireDefault(require("postcss-nested")); |
|
function _interopRequireDefault(obj) { |
|
return obj && obj.__esModule ? obj : { |
|
default: obj |
|
}; |
|
} |
|
function nesting(opts = _postcssNested.default) { |
|
return (root, result)=>{ |
|
root.walkAtRules("screen", (rule)=>{ |
|
rule.name = "media"; |
|
rule.params = `screen(${rule.params})`; |
|
}); |
|
root.walkAtRules("apply", (rule)=>{ |
|
rule.before(_postcss.default.decl({ |
|
prop: "__apply", |
|
value: rule.params, |
|
source: rule.source |
|
})); |
|
rule.remove(); |
|
}); |
|
let plugin = (()=>{ |
|
var ref; |
|
if (typeof opts === "function" || typeof opts === "object" && (opts === null || opts === void 0 ? void 0 : (ref = opts.hasOwnProperty) === null || ref === void 0 ? void 0 : ref.call(opts, "postcssPlugin"))) { |
|
return opts; |
|
} |
|
if (typeof opts === "string") { |
|
return require(opts); |
|
} |
|
if (Object.keys(opts).length <= 0) { |
|
return _postcssNested.default; |
|
} |
|
throw new Error("tailwindcss/nesting should be loaded with a nesting plugin."); |
|
})(); |
|
(0, _postcss).default([ |
|
plugin |
|
]).process(root, result.opts).sync(); |
|
root.walkDecls("__apply", (decl)=>{ |
|
decl.before(_postcss.default.atRule({ |
|
name: "apply", |
|
params: decl.value, |
|
source: decl.source |
|
})); |
|
decl.remove(); |
|
}); |
|
/** |
|
* Use a private PostCSS API to remove the "clean" flag from the entire AST. |
|
* This is done because running process() on the AST will set the "clean" |
|
* flag on all nodes, which we don't want. |
|
* |
|
* This causes downstream plugins using the visitor API to be skipped. |
|
* |
|
* This is guarded because the PostCSS API is not public |
|
* and may change in future versions of PostCSS. |
|
* |
|
* See https://github.com/postcss/postcss/issues/1712 for more details |
|
* |
|
* @param {import('postcss').Node} node |
|
*/ function markDirty(node) { |
|
if (!("markDirty" in node)) { |
|
return; |
|
} |
|
// Traverse the tree down to the leaf nodes |
|
if (node.nodes) { |
|
node.nodes.forEach((n)=>markDirty(n)); |
|
} |
|
// If it's a leaf node mark it as dirty |
|
// We do this here because marking a node as dirty |
|
// will walk up the tree and mark all parents as dirty |
|
// resulting in a lot of unnecessary work if we did this |
|
// for every single node |
|
if (!node.nodes) { |
|
node.markDirty(); |
|
} |
|
} |
|
markDirty(root); |
|
return root; |
|
}; |
|
}
|
|
|