UNPKG

postcss-preset-env

Version:
2 lines (1 loc) 16.1 kB
import s from"autoprefixer";import o from"cssdb";import e from"@csstools/postcss-progressive-custom-properties";import t from"fs";import r from"path";import i from"browserslist";import n from"postcss-attribute-case-insensitive";import c from"css-blank-pseudo";import p from"postcss-color-functional-notation";import a from"postcss-color-hex-alpha";import u from"postcss-color-rebeccapurple";import l from"postcss-custom-media";import m from"postcss-custom-properties";import f from"postcss-custom-selectors";import d from"postcss-dir-pseudo-class";import g from"postcss-double-position-gradients";import b from"postcss-env-function";import h from"postcss-focus-visible";import y from"postcss-focus-within";import w from"postcss-font-variant";import v from"postcss-gap-properties";import $ from"css-has-pseudo";import k from"postcss-image-set-function";import O from"postcss-initial";import S from"postcss-lab-function";import j from"postcss-logical";import x from"postcss-media-minmax";import P from"postcss-nesting";import E from"postcss-overflow-shorthand";import M from"postcss-page-break";import _ from"postcss-place";import q from"css-prefers-color-scheme";import R from"postcss-pseudo-class-any-link";import A from"postcss-replace-overflow-wrap";import F from"postcss-selector-not";import N from"@csstools/postcss-is-pseudo-class";import T from"@csstools/postcss-hwb-function";import B from"postcss-opacity-percentage";import U from"postcss-clamp";import W from"@csstools/postcss-font-format-keywords";import C from"@csstools/postcss-normalize-display-values";import I from"@csstools/postcss-color-function";import V from"@csstools/postcss-oklab-function";import D from"@csstools/postcss-ic-unit";const L={"blank-pseudo-class":"https://github.com/csstools/postcss-plugins/blob/main/plugins/css-blank-pseudo/README-BROWSER.md","focus-visible-pseudo-class":"https://github.com/WICG/focus-visible","focus-within-pseudo-class":"https://github.com/jsxtools/focus-within/blob/master/README-BROWSER.md","has-pseudo-class":"https://github.com/csstools/postcss-plugins/blob/main/plugins/css-has-pseudo/README-BROWSER.md","prefers-color-scheme-query":"https://github.com/csstools/postcss-plugins/blob/main/plugins/css-prefers-color-scheme/README-BROWSER.md"},J=["blank-pseudo-class","focus-visible-pseudo-class","focus-within-pseudo-class","has-pseudo-class","prefers-color-scheme-query"];async function z(s,o,e,t){const r=function(s){return`:root {\n${Object.keys(s).reduce(((o,e)=>(o.push(`\t${e}: ${s[e]};`),o)),[]).join("\n")}\n}\n`}(e),i=function(s){return`${Object.keys(s).reduce(((o,e)=>(o.push(`@custom-media ${e} ${s[e]};`),o)),[]).join("\n")}\n`}(o),n=function(s){return`${Object.keys(s).reduce(((o,e)=>(o.push(`@custom-selector ${e} ${s[e]};`),o)),[]).join("\n")}\n`}(t),c=`${i}\n${n}\n${r}`;await X(s,c)}function G(s,o){return`\n\t${s}: {\n${Object.keys(o).reduce(((s,e)=>(s.push(`\t\t'${Y(e)}': '${Y(o[e])}'`),s)),[]).join(",\n")}\n\t}`}function H(s,o){return`export const ${s} = {\n${Object.keys(o).reduce(((s,e)=>(s.push(`\t'${Y(e)}': '${Y(o[e])}'`),s)),[]).join(",\n")}\n};\n`}function K(s,o){return Promise.all([].concat(o).map((async o=>{if(o instanceof Function)await o({customMedia:Q(s.customMedia),customProperties:Q(s.customProperties),customSelectors:Q(s.customSelectors)});else{const e=o===Object(o)?o:{to:String(o)},t=e.toJSON||Q;if("customMedia"in e||"customProperties"in e||"customSelectors"in e)e.customMedia=t(s.customMedia),e.customProperties=t(s.customProperties),e.customSelectors=t(s.customSelectors);else if("custom-media"in e||"custom-properties"in e||"custom-selectors"in e)e["custom-media"]=t(s.customMedia),e["custom-properties"]=t(s.customProperties),e["custom-selectors"]=t(s.customSelectors);else{const o=String(e.to||""),i=(e.type||r.extname(e.to).slice(1)).toLowerCase(),n=t(s.customMedia),c=t(s.customProperties),p=t(s.customSelectors);"css"===i&&await z(o,n,c,p),"js"===i&&await async function(s,o,e,t){const r=`module.exports = {${G("customMedia",o)},${G("customProperties",e)},${G("customSelectors",t)}\n};\n`;await X(s,r)}(o,n,c,p),"json"===i&&await async function(s,o,e,t){const r=`${JSON.stringify({"custom-media":o,"custom-properties":e,"custom-selectors":t},null," ")}\n`;await X(s,r)}(o,n,c,p),"mjs"===i&&await async function(s,o,e,t){const r=`${H("customMedia",o)}\n${H("customProperties",e)}\n${H("customSelectors",t)}`;await X(s,r)}(o,n,c,p)}}})))}function Q(s){return Object.keys(s).reduce(((o,e)=>(o[e]=String(s[e]),o)),{})}function X(s,o){return new Promise(((e,r)=>{t.writeFile(s,o,(s=>{s?r(s):e()}))}))}function Y(s){return s.replace(/\\([\s\S])|(')/g,"\\$1$2").replace(/\n/g,"\\n").replace(/\r/g,"\\r")}function Z(s,o){if(!s)return!1;if("string"==typeof s)return!0;if(Array.isArray(s)){for(let e=0;e<s.length;e++){if("string"==typeof s[e])return!0;if(s[e]&&o in Object(s[e]))return!0}return!1}return o in Object(s)}function ss(s,o,e){return Math.max(s,Math.min(o,e))}const os=Symbol("insertBefore"),es=Symbol("insertAfter"),ts=Symbol("insertOrder"),rs=Symbol("plugin");function is(s,o,e){if("insertBefore"!==e&&"insertAfter"!==e)return[];const t="insertBefore"===e?os:es,r=[];for(const e in o){if(!Object.hasOwnProperty.call(o,e))continue;if(!s.find((s=>s.id===e)))continue;let i=o[e];Array.isArray(i)||(i=[i]);for(let s=0;s<i.length;s++)r.push({id:e,[rs]:i[s],[ts]:s,[t]:!0})}return r}var ns=["custom-media-queries","custom-properties","environment-variables","image-set-function","media-query-ranges","prefers-color-scheme-query","nesting-rules","custom-selectors","any-link-pseudo-class","case-insensitive-attributes","focus-visible-pseudo-class","focus-within-pseudo-class","not-pseudo-class","logical-properties-and-values","dir-pseudo-class","all-property","color-functional-notation","double-position-gradients","hexadecimal-alpha-notation","hwb-function","lab-function","rebeccapurple-color","blank-pseudo-class","break-properties","font-variant-property","is-pseudo-class","has-pseudo-class","gap-properties","overflow-property","overflow-wrap-property","place-properties","system-ui-font-family"];function cs(){return{postcssPlugin:"postcss-system-ui-font",Declaration(s){ps.test(s.prop)&&(s.value.includes(us.join(", "))||(s.value=s.value.replace(ls,ms)))}}}cs.postcss=!0;const ps=/(?:^(?:-|\\002d){2})|(?:^font(?:-family)?$)/i,as="[\\f\\n\\r\\x09\\x20]",us=["system-ui","-apple-system","Segoe UI","Roboto","Ubuntu","Cantarell","Noto Sans","sans-serif"],ls=new RegExp(`(^|,|${as}+)(?:system-ui${as}*)(?:,${as}*(?:${us.join("|")})${as}*)?(,|$)`,"i"),ms=`$1${us.join(", ")}$2`,fs=new Map([["all-property",O],["any-link-pseudo-class",R],["blank-pseudo-class",c],["break-properties",M],["case-insensitive-attributes",n],["clamp",U],["color-function",I],["color-functional-notation",p],["custom-media-queries",l],["custom-properties",m],["custom-selectors",f],["dir-pseudo-class",d],["display-two-values",C],["double-position-gradients",g],["environment-variables",b],["focus-visible-pseudo-class",h],["focus-within-pseudo-class",y],["font-format-keywords",W],["font-variant-property",w],["gap-properties",v],["hwb-function",T],["has-pseudo-class",$],["hexadecimal-alpha-notation",a],["ic-unit",D],["image-set-function",k],["is-pseudo-class",N],["lab-function",S],["logical-properties-and-values",j],["media-query-ranges",x],["nesting-rules",P],["not-pseudo-class",F],["oklab-function",V],["opacity-percentage",B],["overflow-property",E],["overflow-wrap-property",A],["place-properties",_],["prefers-color-scheme-query",q],["rebeccapurple-color",u],["system-ui-font-family",cs]]);function ds(s,o,e){return s.concat(is(s,o,"insertBefore"),is(s,e,"insertAfter")).filter((s=>function(s){return!!s[os]||!!s[es]||!!fs.has(s.id)}(s))).sort(((s,o)=>function(s,o){return s.id===o.id?s[os]&&o[os]||s[es]&&o[es]?ss(-1,s[ts]-o[ts],1):s[os]||o[es]?-1:s[es]||o[os]?1:0:ss(-1,ns.indexOf(s.id)-ns.indexOf(o.id),1)}(s,o)))}const gs=["ie","edge","firefox","chrome","safari","opera","ios_saf","android","op_mob","and_chr","and_ff","and_uc","samsung","and_qq","baidu","kaios"];function bs(s){if(!s)return[];if(!("browser_support"in s))return["> 0%"];const o=[];return gs.forEach((e=>{const t=s.browser_support[e];"string"==typeof t&&/^[0-9|.]+$/.test(t)?o.push(`${e} < ${s.browser_support[e]}`):o.push(`${e} >= 1`)})),o}function hs(s,o,e,t){const r=i(s,{ignoreUnknownVersions:!0});switch(o.id){case"is-pseudo-class":return{onComplexSelector:"warning"};case"nesting-rules":if(function(s,o){const e=bs(s);if(o.some((s=>i(e,{ignoreUnknownVersions:!0}).some((o=>o===s)))))return!0;return!1}(e.find((s=>"is-pseudo-class"===s.id)),r))return t.log('Disabling :is on "nesting-rules" due to lack of browser support.'),{noIsPseudoSelector:!0};return{};case"any-link-pseudo-class":if(r.find((s=>s.startsWith("ie ")||s.startsWith("edge "))))return t.log('Adding area[href] fallbacks for ":any-link" support in Edge and IE.'),{subFeatures:{areaHrefNeedsFixing:!0}};return{};default:return{}}}function ys(s,o,e,t){const r=Object(o.features),n=!("enableClientSidePolyfills"in o)||o.enableClientSidePolyfills,c=Object(o.insertBefore),p=Object(o.insertAfter),a=o.browsers,u=ss(0,function(s){const o=parseInt(s,10);return Number.isNaN(o)?0:o}(o.minimumVendorImplementations),3);u>0&&t.log(`Using features with ${u} or more vendor implementations`);const l=function(s,o){let e=2;if(void 0===s.stage)return o.log(`Using features from Stage ${e} (default)`),e;if(!1===s.stage)e=5;else{let o=parseInt(s.stage,10);Number.isNaN(o)&&(o=0),e=ss(0,o,5)}return 5===e?o.log('Stage has been disabled, features will be handled via the "features" option.'):o.log(`Using features from Stage ${e}`),e}(o,t);2===l&&e&&!1===e.preserve&&(s=JSON.parse(JSON.stringify(s))).forEach((s=>{("blank-pseudo-class"===s.id||"prefers-color-scheme-query"===s.id)&&(s.stage=1)}));const m=ds(s,c,p).map((s=>function(s){const o=bs(s);if(s[os]||s[es]){let e=s.id;return e=s.insertBefore?`before-${e}`:`after-${e}`,{browsers:o,vendors_implementations:s.vendors_implementations,plugin:s[rs],id:e,stage:6}}return{browsers:o,vendors_implementations:s.vendors_implementations,plugin:fs.get(s.id),id:s.id,stage:s.stage}}(s))).filter((s=>0===u||(!(!s[os]&&!s[es])||(u<=s.vendors_implementations||(t.log(` ${s.id} with ${s.vendors_implementations} vendor implementations has been disabled`),!1))))).filter((s=>{const o=s.stage>=l,e=n||!J.includes(s.id),i=!1===r[s.id],c=r[s.id]?r[s.id]:o&&e;return i?t.log(` ${s.id} has been disabled by options`):o?e||t.log(` ${s.id} has been disabled by "enableClientSidePolyfills: false".`):c?t.log(` ${s.id} has been enabled by options`):t.log(` ${s.id} with stage ${s.stage} has been disabled`),c})).map((o=>function(s,o,e,t,r,i){let n,c;return n=hs(o,t,s,i),!0===e[t.id]?r&&(n=Object.assign({},n,r)):n=r?Object.assign({},n,r,e[t.id]):Object.assign({},n,e[t.id]),n.enableProgressiveCustomProperties=!1,c=t.plugin.postcss&&"function"==typeof t.plugin?t.plugin(n):t.plugin&&t.plugin.default&&"function"==typeof t.plugin.default&&t.plugin.default.postcss?t.plugin.default(n):t.plugin,{browsers:t.browsers,vendors_implementations:t.vendors_implementations,plugin:c,pluginOptions:n,id:t.id}}(s,a,r,o,e,t))),f=i(a,{ignoreUnknownVersions:!0});return m.filter((s=>{if(s.id in r)return r[s.id];if(function(s){if("importFrom"in Object(s.pluginOptions))switch(s.id){case"custom-media-queries":if(Z(s.pluginOptions.importFrom,"customMedia"))return!0;break;case"custom-properties":if(Z(s.pluginOptions.importFrom,"customProperties"))return!0;break;case"environment-variables":if(Z(s.pluginOptions.importFrom,"environmentVariables"))return!0;break;case"custom-selectors":if(Z(s.pluginOptions.importFrom,"customSelectors"))return!0}if("exportTo"in Object(s.pluginOptions))switch(s.id){case"custom-media-queries":if(Z(s.pluginOptions.exportTo,"customMedia"))return!0;break;case"custom-properties":if(Z(s.pluginOptions.exportTo,"customProperties"))return!0;break;case"environment-variables":if(Z(s.pluginOptions.exportTo,"environmentVariables"))return!0;break;case"custom-selectors":if(Z(s.pluginOptions.exportTo,"customSelectors"))return!0}return!1}(s))return!0;const o=i(s.browsers,{ignoreUnknownVersions:!0}),e=f.some((s=>o.some((o=>o===s))));return e||t.log(`${s.id} disabled due to browser support`),e}))}class ws{constructor(){this.logs=[]}log(s){this.logs.push(s)}resetLogger(){this.logs.length=0}dumpLogs(s){s&&this.logs.forEach((o=>s.warn(o))),this.resetLogger()}}const vs={"css-blank-pseudo":"blank-pseudo-class","css-has-pseudo":"has-pseudo-class","css-prefers-color-scheme":"prefers-color-scheme-query","postcss-attribute-case-insensitive":"case-insensitive-attributes","postcss-clamp":"clamp","postcss-color-function":"color-function","postcss-color-functional-notation":"color-functional-notation","postcss-color-hex-alpha":"hexadecimal-alpha-notation","postcss-color-rebeccapurple":"rebeccapurple-color","postcss-custom-media":"custom-media-queries","postcss-custom-properties":"custom-properties","postcss-custom-selectors":"custom-selectors","postcss-dir-pseudo-class":"dir-pseudo-class","postcss-double-position-gradients":"double-position-gradients","postcss-env-function":"environment-variables","postcss-focus-visible":"focus-visible-pseudo-class","postcss-focus-within":"focus-within-pseudo-class","postcss-font-format-keywords":"font-format-keywords","postcss-font-variant":"font-variant-property","postcss-gap-properties":"gap-properties","postcss-hwb-function":"hwb-function","postcss-ic-unit":"ic-unit","postcss-image-set-function":"image-set-function","postcss-initial":"all-property","postcss-is-pseudo-class":"is-pseudo-class","postcss-lab-function":"lab-function","postcss-logical":"logical-properties-and-values","postcss-media-minmax":"media-query-ranges","postcss-nesting":"nesting-rules","postcss-normalize-display-values":"display-two-values","postcss-oklab-function":"oklab-function","postcss-opacity-percentage":"opacity-percentage","postcss-overflow-shorthand":"overflow-property","postcss-page-break":"break-properties","postcss-place":"place-properties","postcss-pseudo-class-any-link":"any-link-pseudo-class","postcss-replace-overflow-wrap":"overflow-wrap-property","postcss-selector-not":"not-pseudo-class","postcss-system-ui-font-family":"system-ui-font-family"},$s=(()=>{const s={};for(const[o,e]of Object.entries(vs))s[e]=o;return s})();function ks(s,o){let e="unknown",t=1/0;for(let r=0;r<o.length;r++){const i=Os(s,o[r]);i<t&&(t=i,e=o[r])}return{mostSimilar:e,distance:t}}function Os(s,o){if(!s.length)return o.length;if(!o.length)return s.length;const e=[];for(let t=0;t<=o.length;t++){e[t]=[t];for(let r=1;r<=s.length;r++)e[t][r]=0===t?r:Math.min(e[t-1][r]+1,e[t][r-1]+1,e[t-1][r-1]+(s[r-1]===o[t-1]?0:1))}return e[o.length][s.length]}const Ss=t=>{const r=new ws,i=Object(t),n=Object.keys(Object(i.features)),c=i.browsers,p=function(s){if("importFrom"in s||"exportTo"in s||"preserve"in s){const o={};return"importFrom"in s&&(o.importFrom=s.importFrom),"exportTo"in s&&(o.exportTo={customMedia:{},customProperties:{},customSelectors:{}}),"preserve"in s&&(o.preserve=s.preserve),o}return!1}(i),a=ys(o,i,p,r),u=a.map((s=>s.plugin));!1!==i.autoprefixer&&u.push(s(Object.assign({overrideBrowserslist:c},i.autoprefixer))),u.push(e()),function(s,o,e){if(o.debug){e.log("Enabling the following feature(s):");const o=[];s.forEach((s=>{s.id.startsWith("before")||s.id.startsWith("after")?e.log(` ${s.id} (injected via options)`):e.log(` ${s.id}`),void 0!==L[s.id]&&o.push(s.id)})),o.length&&(e.log("These feature(s) need a browser library to work:"),o.forEach((s=>e.log(` ${s}: ${L[s]}`))))}}(a,i,r);const l=()=>({postcssPlugin:"postcss-preset-env",OnceExit:function(s,{result:o}){!function(s,o,e){const t=Object.keys($s),r=Object.keys(vs);s.forEach((s=>{if(t.includes(s))return;const i=ks(s,t),n=ks(s,r);i.distance<n.distance?o.warn(e,`Unknown feature: "${s}" did you mean: "${i.mostSimilar}"`):o.warn(e,`Unknown feature: "${s}" did you mean: "${vs[n.mostSimilar]}"`)}))}(n,s,o),i.debug&&r.dumpLogs(o),r.resetLogger(),i.exportTo&&K(p.exportTo,t.exportTo)}});return l.postcss=!0,{postcssPlugin:"postcss-preset-env",plugins:[...u,l()]}};Ss.postcss=!0;export{Ss as default};