UNPKG

6.65 kBJavaScriptView Raw
1import e from"postcss-value-parser";import t from"path";import{pathToFileURL as o}from"url";import{parse as r}from"postcss";import{promises as s}from"fs";function n(e){const t=e.selector?e:e.parent;return/(!\s*)?postcss-custom-properties:\s*off\b/i.test(t.toString())}function i(t,o){const r=new Map,s=new Map,i=new Map;t.nodes.slice().forEach((t=>{const i=l(t)?r:p(t)?s:null;i&&(t.nodes.slice().forEach((t=>{if(t.variable&&!n(t)){const{prop:r}=t;i.set(r,e(t.value)),o.preserve||t.remove()}})),o.preserve||!u(t)||n(t)||t.remove())}));for(const[e,t]of r.entries())i.set(e,t);for(const[e,t]of s.entries())i.set(e,t);return i}const a=/^html$/i,c=/^:root$/i,l=e=>"rule"===e.type&&e.selector.split(",").some((e=>a.test(e)))&&Object(e.nodes).length,p=e=>"rule"===e.type&&e.selector.split(",").some((e=>c.test(e)))&&Object(e.nodes).length,u=e=>0===Object(e.nodes).length;function f(t){const o=new Map;if("customProperties"in t)for(const[r,s]of Object.entries(t.customProperties))o.set(r,e(s.toString()));if("custom-properties"in t)for(const[r,s]of Object.entries(t["custom-properties"]))o.set(r,e(s.toString()));return o}async function m(e){let t;try{t=await import(e)}catch(r){t=await import(o(e).href)}return f("default"in t?t.default:t)}async function w(e){const o=(await Promise.all(e.map((async e=>{if(e instanceof Promise?e=await e:e instanceof Function&&(e=await e()),"string"==typeof e){const o=t.resolve(e);return{type:t.extname(o).slice(1).toLowerCase(),from:o}}if("customProperties"in e&&Object(e.customProperties)===e.customProperties)return e;if("custom-properties"in e&&Object(e["custom-properties"])===e["custom-properties"])return e;if("from"in e){const o=t.resolve(e.from);let r=e.type;return r||(r=t.extname(o).slice(1).toLowerCase()),{type:r,from:o}}return Object.keys(e).length,null})))).filter((e=>!!e)),n=await Promise.all(o.map((async e=>{if("type"in e&&"from"in e){if("css"===e.type||"pcss"===e.type)return await async function(e){const t=await s.readFile(e);return i(r(t,{from:e.toString()}),{preserve:!0})}(e.from);if("js"===e.type||"cjs"===e.type)return await m(e.from);if("mjs"===e.type)return await m(e.from);if("json"===e.type)return await async function(e){return f(await v(e))}(e.from);throw new Error("Invalid source type: "+e.type)}return f(e)}))),a=new Map;return n.forEach((e=>{for(const[t,o]of e.entries())a.set(t,o)})),a}const v=async e=>JSON.parse((await s.readFile(e)).toString());function d(e,t){return e.nodes&&e.nodes.length&&e.nodes.slice().forEach((o=>{if(h(o)){const[r,...s]=o.nodes.filter((e=>"div"!==e.type)),{value:n}=r,i=e.nodes.indexOf(o);if(t.has(n)){const o=t.get(n).nodes;!function(e,t,o){const r=new Map(t);r.delete(o),d(e,r)}({nodes:o},t,n),i>-1&&e.nodes.splice(i,1,...o)}else s.length&&(i>-1&&e.nodes.splice(i,1,...s),d(e,t))}else d(o,t)})),e.toString()}const y=/^var$/i,h=e=>"function"===e.type&&y.test(e.value)&&Object(e.nodes).length>0;var g=(t,o,r)=>{if(O(t)&&!function(e){const t=e.prev();return Boolean(n(e)||t&&"comment"===t.type&&/(!\s*)?postcss-custom-properties:\s*ignore\s+next\b/i.test(t.text))}(t)){const s=t.value;let n=d(e(s),o);const i=new Set;for(;b.test(n)&&!i.has(n);){i.add(n);n=d(e(n),o)}if(n!==s)if(r.preserve){const e=t.cloneBefore({value:n});$(e)&&(e.raws.value.value=e.value.replace(x,"$1"),e.raws.value.raw=e.raws.value.value+e.raws.value.raw.replace(x,"$2"))}else t.value=n,$(t)&&(t.raws.value.value=t.value.replace(x,"$1"),t.raws.value.raw=t.raws.value.value+t.raws.value.raw.replace(x,"$2"))}};const j=/^--[A-z][\w-]*$/,b=/(^|[^\w-])var\([\W\w]+\)/,O=e=>!j.test(e.prop)&&b.test(e.value),$=e=>"value"in Object(Object(e.raws).value)&&"raw"in e.raws.value&&x.test(e.raws.value.raw),x=/^([\W\w]+)(\s*\/\*[\W\w]+?\*\/)$/;async function F(e,t,o){"css"===t&&await async function(e,t){const o=`:root {\n${Object.keys(t).reduce(((e,o)=>(e.push(`\t${o}: ${t[o]};`),e)),[]).join("\n")}\n}\n`;await s.writeFile(e,o)}(e,o),"scss"===t&&await async function(e,t){const o=`${Object.keys(t).reduce(((e,o)=>{const r=o.replace("--","$");return e.push(`${r}: ${t[o]};`),e}),[]).join("\n")}\n`;await s.writeFile(e,o)}(e,o),"js"===t&&await async function(e,t){const o=`module.exports = {\n\tcustomProperties: {\n${Object.keys(t).reduce(((e,o)=>(e.push(`\t\t'${S(o)}': '${S(t[o])}'`),e)),[]).join(",\n")}\n\t}\n};\n`;await s.writeFile(e,o)}(e,o),"json"===t&&await async function(e,t){const o=`${JSON.stringify({"custom-properties":t},null," ")}\n`;await s.writeFile(e,o)}(e,o),"mjs"===t&&await async function(e,t){const o=`export const customProperties = {\n${Object.keys(t).reduce(((e,o)=>(e.push(`\t'${S(o)}': '${S(t[o])}'`),e)),[]).join(",\n")}\n};\n`;await s.writeFile(e,o)}(e,o)}function P(e){const t={};for(const[o,r]of e.entries())t[o]=r.toString();return t}const S=e=>e.replace(/\\([\s\S])|(')/g,"\\$1$2").replace(/\n/g,"\\n").replace(/\r/g,"\\r"),k=e=>{const o=!("preserve"in Object(e))||Boolean(e.preserve),r="overrideImportFromWithRoot"in Object(e)&&Boolean(e.overrideImportFromWithRoot),s="disableDeprecationNotice"in Object(e)&&Boolean(e.disableDeprecationNotice);let n=[];Array.isArray(null==e?void 0:e.importFrom)?n=e.importFrom:null!=e&&e.importFrom&&(n=[e.importFrom]);let a=[];Array.isArray(null==e?void 0:e.exportTo)?a=e.exportTo:null!=e&&e.exportTo&&(a=[e.exportTo]);const c=w(n);let l=new Map;const p=0===n.length&&0===a.length;return{postcssPlugin:"postcss-custom-properties",prepare:()=>p?{Once:e=>{l=i(e,{preserve:o})},Declaration:e=>{g(e,l,{preserve:o})},OnceExit:()=>{l.clear()}}:{Once:async e=>{const s=(await c).entries(),n=i(e,{preserve:o}).entries();if(r)for(const[e,t]of[...s,...n])l.set(e,t);else for(const[e,t]of[...n,...s])l.set(e,t);await function(e,o){return Promise.all(o.map((async o=>{if(o instanceof Function)return void await o(P(e));if("string"==typeof o){const r=t.resolve(o),s=t.extname(r).slice(1).toLowerCase();return void await F(r,s,P(e))}let r={};if(r="toJSON"in o?o.toJSON(P(e)):P(e),"to"in o){const e=t.resolve(o.to);let s=o.type;return s||(s=t.extname(e).slice(1).toLowerCase()),void await F(e,s,r)}"customProperties"in o?o.customProperties=r:"custom-properties"in o&&(o["custom-properties"]=r)})))}(l,a)},Declaration:e=>{g(e,l,{preserve:o})},OnceExit:(e,{result:t})=>{!s&&(n.length>0||a.length>0)&&e.warn(t,'"importFrom" and "exportTo" will be removed in a future version of postcss-custom-properties.\nWe are looking for insights and anecdotes on how these features are used so that we can design the best alternative.\nPlease let us know if our proposal will work for you.\nVisit the discussion on github for more details. https://github.com/csstools/postcss-plugins/discussions/192'),l.clear()}}}};k.postcss=!0;export{k as default};