Sha256: 786a67d3439ac8fdc945e5bc378e88bbc78d275bf1008b497a039804fa900995

Contents?: true

Size: 1.49 KB

Versions: 24

Compression:

Stored size: 1.49 KB

Contents

'use strict';

const { isRoot, isAtRule, isRule } = require('./typeGuards');

/** @typedef {import('postcss').Root} Root */
/** @typedef {import('postcss').Root} Document */
/** @typedef {import('postcss').Node} PostcssNode */
/** @typedef {import('postcss').ContainerBase} PostcssContainerNode */

/**
 * @param {PostcssNode} node
 * @returns {node is PostcssContainerNode}
 */
function isContainerNode(node) {
	return isRule(node) || isAtRule(node) || isRoot(node);
}

/**
 * In order to accommodate nested blocks (postcss-nested),
 * we need to run a shallow loop (instead of eachDecl() or eachRule(),
 * which loop recursively) and allow each nested block to accumulate
 * its own list of properties -- so that a property in a nested rule
 * does not conflict with the same property in the parent rule
 * executes a provided function once for each declaration block.
 *
 * @param {Root | Document} root - root element of file.
 * @param {function} cb - Function to execute for each declaration block
 *
 * @returns {void}
 */
module.exports = function (root, cb) {
	/**
	 * @param {PostcssNode} statement
	 *
	 * @returns {void}
	 */
	function each(statement) {
		if (!isContainerNode(statement)) return;

		if (statement.nodes && statement.nodes.length) {
			/** @type {PostcssNode[]} */
			const decls = [];

			statement.nodes.forEach((node) => {
				if (node.type === 'decl') {
					decls.push(node);
				}

				each(node);
			});

			if (decls.length) {
				cb(decls.forEach.bind(decls));
			}
		}
	}

	each(root);
};

Version data entries

24 entries across 24 versions & 1 rubygems

Version Path
trusty-cms-6.3.1 node_modules/stylelint/lib/utils/eachDeclarationBlock.js
trusty-cms-5.0.7 node_modules/stylelint/lib/utils/eachDeclarationBlock.js
trusty-cms-5.0.6 node_modules/stylelint/lib/utils/eachDeclarationBlock.js
trusty-cms-5.0.5 node_modules/stylelint/lib/utils/eachDeclarationBlock.js
trusty-cms-5.0.4 node_modules/stylelint/lib/utils/eachDeclarationBlock.js
trusty-cms-5.0.3 node_modules/stylelint/lib/utils/eachDeclarationBlock.js
trusty-cms-5.0.2 node_modules/stylelint/lib/utils/eachDeclarationBlock.js
trusty-cms-5.0.1 node_modules/stylelint/lib/utils/eachDeclarationBlock.js
trusty-cms-4.3.5 node_modules/stylelint/lib/utils/eachDeclarationBlock.js
trusty-cms-5.0.0 node_modules/stylelint/lib/utils/eachDeclarationBlock.js
trusty-cms-4.3.4 node_modules/stylelint/lib/utils/eachDeclarationBlock.js
trusty-cms-4.3.3 node_modules/stylelint/lib/utils/eachDeclarationBlock.js
trusty-cms-4.3.2 node_modules/stylelint/lib/utils/eachDeclarationBlock.js
trusty-cms-4.3.1 node_modules/stylelint/lib/utils/eachDeclarationBlock.js
trusty-cms-4.3 node_modules/stylelint/lib/utils/eachDeclarationBlock.js
trusty-cms-4.2.3 node_modules/stylelint/lib/utils/eachDeclarationBlock.js
trusty-cms-4.2.2 node_modules/stylelint/lib/utils/eachDeclarationBlock.js
trusty-cms-4.2.1 node_modules/stylelint/lib/utils/eachDeclarationBlock.js
trusty-cms-4.2 node_modules/stylelint/lib/utils/eachDeclarationBlock.js
trusty-cms-4.1.9 node_modules/stylelint/lib/utils/eachDeclarationBlock.js