@zeecoder/postcss-container-query
Advanced tools
Comparing version 2.5.0 to 2.6.0-alpha.97fec537
@@ -1,12 +0,5 @@ | ||
'use strict';function _interopDefault(a){return a&&'object'==typeof a&&'default'in a?a['default']:a}var _trim=_interopDefault(require('lodash/trim')),fs=require('fs'),postcss=_interopDefault(require('postcss'));// | ||
'use strict';function _interopDefault(a){return a&&'object'==typeof a&&'default'in a?a['default']:a}var fs=require('fs'),postcss=_interopDefault(require('postcss')),MetaBuilder=_interopDefault(require('@zeecoder/container-query-meta-builder'));// | ||
/** | ||
* Returns the container's selector, or null if no @define-container was found. | ||
*/function detectContainerDefinition(a){var b=1<arguments.length&&void 0!==arguments[1]?arguments[1]:!0,c=null,d=a.nodes.length,e=0;for(e;e<d;e++)if('atrule'===a.nodes[e].type&&'define-container'===a.nodes[e].name){c=a.selector;break}return b&&a.nodes.splice(e,1),c}/** | ||
* Extracts conditions as arrays from a single "param" string PostCSS provides | ||
* for at-rules. | ||
* | ||
* @param {string} params | ||
* | ||
* @returns {string[]} | ||
*/function getConditionsFromQueryParams(a){return a.split(',').map(function(a){return a.match(/\(([^\)]*)\)/g).map(function(a){var b=_trim(a,'()');return b=b.match(/([a-z-]*)([ :><=]*)([a-z0-9\.]*)/i),b.shift(),b=b.map(_trim),-1===['landscape','portrait'].indexOf(b[2])&&(b[2]=parseFloat(b[2])),b})})}// | ||
* Checks whether a `@define-container` declaration is present or not. | ||
*/function hasContainerDefinition(a){var b=1<arguments.length&&arguments[1]!==void 0?arguments[1]:!0;if(!a.nodes)return!1;var c=a.nodes.length,d=0;for(d;d<c;d++)if('atrule'===a.nodes[d].type&&'define-container'===a.nodes[d].name)return b&&a.nodes.splice(d,1),!0;return!1}// | ||
function isValueUsingContainerUnits(a){if('string'!=typeof a)return!1;// Matching numbers followed by characters from the r-units | ||
@@ -30,15 +23,3 @@ var b=a.toLowerCase().match(/(\d+(\.\d+)?)([rwhminax]+)/i);if(!Array.isArray(b)||'string'!=typeof b[3])return!1;var c=b[3];return'rh'===c||'rw'===c||'rmin'===c||'rmax'===c}/** | ||
function extractPropsFromNode(a){var b=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{isContainer:!1,onlyContainerUnits:!1,stripContainerUnits:!1};if('rule'!==a.type)throw new Error('`ruleNode` must be of type "rule".');if(!1===Array.isArray(a.nodes))return{};for(var c={styles:{},values:{}},d=a.nodes.length,e=0;e<d;e++){var f=a.nodes[e],g=isValueUsingContainerUnits(f.value);if('decl'===f.type&&(!b.onlyContainerUnits||g)){if(b.isContainer&&g){if(('width'===f.prop||'height'===f.prop)&&(-1!==f.value.indexOf('rmin')||-1!==f.value.indexOf('rmax')))throw f.error('Width and height properties on containers cannot use rmin or rmax units.');if('width'===f.prop&&-1!==f.value.indexOf('rw'))throw f.error('Containers cannot use rw for the width property.');if('height'===f.prop&&-1!==f.value.indexOf('rh'))throw f.error('Containers cannot use rh for the height property.')}g?c.values[f.prop]=f.value:c.styles[f.prop]=f.value,b.stripContainerUnits&&g&&(a.nodes.splice(e,1),e--,d--)}}// Getting rid of empty objects | ||
return 0===Object.keys(c.styles).length&&delete c.styles,0===Object.keys(c.values).length&&delete c.values,c}var saveJSON=function(a,b){return new Promise(function(c){var d=JSON.stringify(b),e=a+'.json',f=function(){return fs.writeFile(e,d,function(a){a&&console.error('Failed to save container query json file: '+a),c()})};fs.readFile(e,'utf8',function(a,b){a||b!==d?f():c()})})};/** | ||
* Decides if a node should be processed or not. | ||
* Only processing root-level rules and @container at-rules. | ||
* | ||
* @param {Node} node | ||
* @returns {boolean} | ||
*/function shouldProcessNode(a){return'rule'===a.type&&'root'===a.parent.type||'atrule'===a.type&&'container'===a.name}/** | ||
* Extracts container units with their props from an object. | ||
* | ||
* @param {Node} node | ||
* @param {boolean} isContainer | ||
* @return {Object} | ||
*/function extractContainerUnits(a){var b=1<arguments.length&&arguments[1]!==void 0&&arguments[1];return extractPropsFromNode(a,{isContainer:b,onlyContainerUnits:!0,stripContainerUnits:!0}).values||null}/** | ||
return 0===Object.keys(c.styles).length&&delete c.styles,0===Object.keys(c.values).length&&delete c.values,c}var saveJSON=function(a,b){return new Promise(function(c){var d=JSON.stringify(b),e=a+'.json',f=function(){return fs.writeFile(e,d,function(a){a&&console.error('Failed to save container query json file: '+a),c()})};fs.readFile(e,'utf8',function(a,b){a||b!==d?f():c()})})},isContainerQuery=function(a){return'atrule'===a.type&&'container'===a.name},walkRules=function(a,b,c){var d=[],e=function(a){return-1!==d.indexOf(a)},f=function(a,f){var g=hasContainerDefinition(a)||e(a.selector)||':self'===a.selector||b.singleContainer&&0===d.length,h={rule:a,isContainer:g};g&&!e(a.selector)&&d.push(a.selector),f&&(h.parentCQAtRule=f),c(h)};a.walk(function(a){if('rule'===a.type)f(a);else if('atrule'===a.type){if(!isContainerQuery(a))return;a.nodes.forEach(function(b){'rule'!==b.type||f(b,a)}),a.remove()}})};/** | ||
* @param {{ | ||
@@ -48,27 +29,7 @@ * getJSON: function, | ||
* }} options | ||
*/function containerQuery(){var a=0<arguments.length&&arguments[0]!==void 0?arguments[0]:{},b=a.getJSON||saveJSON,c=!1!==a.singleContainer;return function(a){var d={},e=null,f=function(a){if(null==e)throw a.error('Missing @define-container declaration before the processed node.')},g=function(a){var b=j(a),c=extractContainerUnits(a,b);// First check if container unites are used or not | ||
if(null!==c){f(a),(!d[e].queries[0]||d[e].queries[0].conditions)&&d[e].queries.unshift({elements:[]});for(var g=null,h=d[e].queries[0].elements.length,k=0;k<h;k++)if(d[e].queries[0].elements[k].selector===a.selector){g=d[e].queries[0].elements[k];break}null===g&&(g={selector:a.selector,values:{}},d[e].queries[0].elements.push(g)),Object.assign(g.values,c)}// The query at the 0 index is the default query, without conditions | ||
// Fetch a previously added element data based on the selector, or | ||
// create a new one | ||
},h=function(a){var b=j(a),c={selector:a.selector},d=extractPropsFromNode(a,{isContainer:b});return d.styles||d.values?(Object.assign(c,d),c):null},j=function(a){return e===a.selector},i=function(a){e=a,d[a]={selector:a,queries:[]}};/** | ||
* Any node under "root" could potentially have container units in them. | ||
* Add such nodes to the default query. (One without conditions which | ||
* means it'll always apply) | ||
* | ||
* @return {Node} | ||
*//** | ||
* Processing a rule node under a container query. | ||
* | ||
* @param {Node} node | ||
* @returns {null|Object} | ||
*//** | ||
* Returns true if the node's selector is the same as the currently | ||
* processed container's. | ||
* | ||
* @param {Node} node | ||
* @return {boolean} | ||
*/a.walk(function(/** Node */a){if(shouldProcessNode(a))if('rule'===a.type){!e&&c&&i(a.selector);// Check if there's a new container declared in the rule node | ||
var b=detectContainerDefinition(a);if(null!==b)// Throw if in singleContainer mode this container is | ||
// defined with a different selector | ||
if(!c)i(b);else if(e!==b)throw a.error('define-container declaration detected in singleContainer mode. Tried to override "'+e+'" with "'+b+'".');// Process potential container unit usages to the default query | ||
g(a)}else{f(a);var j={conditions:getConditionsFromQueryParams(a.params),elements:[]};a.nodes.forEach(function(a){if('rule'===a.type){var b=h(a);null!==b&&j.elements.push(b)}}),0<j.elements.length&&d[e].queries.push(j),a.remove()}});var k=d;c&&(e?k=d[e]:k={}),b(a.source.input.file,k)}}var containerQuery$1=postcss.plugin('postcss-container-query',containerQuery);module.exports=containerQuery$1; | ||
*/function containerQuery(){var a=0<arguments.length&&arguments[0]!==void 0?arguments[0]:{},b=a.getJSON||saveJSON,c=!1!==a.singleContainer;return function(a){var d={},e=null;// Map builders to metadata | ||
for(var f in walkRules(a,{singleContainer:c},function(a){var b=a.rule,f=a.isContainer,g=a.parentCQAtRule;if(f&&':self'!==b.selector&&!d[b.selector]){var h=b.selector;if(c&&e)throw b.error('define-container declaration detected in singleContainer mode. Tried to override "'+e+'" with "'+h+'".');// Register new container's meta builder | ||
e=h,d[h]=new MetaBuilder(h)}var i=extractPropsFromNode(b,{isContainer:f,stripContainerUnits:!0});// Only proceed if there are container units to be extracted, or if there | ||
// are styles under a container query at-rule | ||
if(i.values||g&&i.styles){if(!e)throw b.error('Missing @define-container declaration before the processed node.');var j=d[e];if(j.resetQuery().resetDescendant(),g&&j.setQuery(g.params),f||j.setDescendant(b.selector),i.values)// store values only | ||
for(var k in i.values){var l=i.values[k];j.addStyle({prop:k,value:l})}if(g&&i.styles)for(var m in i.styles){var n=i.styles[m];j.addStyle({prop:m,value:n})}}}),d)d[f]=d[f].build();var g=c?e?d[e]:{}:d;b(a.source.input.file,g)}}var containerQuery$1=postcss.plugin('postcss-container-query',containerQuery);module.exports=containerQuery$1; |
@@ -6,3 +6,3 @@ { | ||
"license": "MIT", | ||
"version": "2.5.0", | ||
"version": "2.6.0-alpha.97fec537", | ||
"author": "Viktor Hubert <rpgmorpheus@gmail.com>", | ||
@@ -36,2 +36,3 @@ "engines": { | ||
"dependencies": { | ||
"@zeecoder/container-query-meta-builder": "^2.6.0-alpha.97fec537", | ||
"lodash": "^4.17.4", | ||
@@ -38,0 +39,0 @@ "postcss": "^6.0.1" |
@@ -6,1 +6,5 @@ # postcss-container-query | ||
Detailed documentation can be found there. | ||
## License | ||
MIT |
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
253634
7
10
3
53
2
+ Added@zeecoder/container-query-meta-builder@^2.6.0-alpha.97fec537
+ Added@zeecoder/container-query-meta-builder@2.7.4(transitive)
+ Addedobject-assign@4.1.1(transitive)