@csstools/postcss-trigonometric-functions 1.0.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changes to PostCSS Trigonometric Functions
2
2
 
3
+ ### 2.0.0 (January 24, 2023)
4
+
5
+ - Updated: Support for Node v14+ (major).
6
+
3
7
  ### 1.0.2 (July 8, 2022)
4
8
 
5
9
  - Fix case insensitive matching.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # PostCSS Trigonometric Functions [<img src="https://postcss.github.io/postcss/logo.svg" alt="PostCSS Logo" width="90" height="90" align="right">][postcss]
1
+ # PostCSS Trigonometric Functions [<img src="https://postcss.github.io/postcss/logo.svg" alt="PostCSS Logo" width="90" height="90" align="right">][PostCSS]
2
2
 
3
3
  [<img alt="npm version" src="https://img.shields.io/npm/v/@csstools/postcss-trigonometric-functions.svg" height="20">][npm-url] [<img alt="CSS Standard Status" src="https://cssdb.org/images/badges/trigonometric-functions.svg" height="20">][css-url] [<img alt="Build Status" src="https://github.com/csstools/postcss-plugins/workflows/test/badge.svg" height="20">][cli-url] [<img alt="Discord" src="https://shields.io/badge/Discord-5865F2?logo=discord&logoColor=white">][discord]
4
4
 
@@ -62,8 +62,13 @@ postcss([
62
62
  [PostCSS Trigonometric Functions] runs in all Node environments, with special
63
63
  instructions for:
64
64
 
65
- | [Node](INSTALL.md#node) | [PostCSS CLI](INSTALL.md#postcss-cli) | [Webpack](INSTALL.md#webpack) | [Create React App](INSTALL.md#create-react-app) | [Gulp](INSTALL.md#gulp) | [Grunt](INSTALL.md#grunt) |
66
- | --- | --- | --- | --- | --- | --- |
65
+ - [Node](INSTALL.md#node)
66
+ - [PostCSS CLI](INSTALL.md#postcss-cli)
67
+ - [PostCSS Load Config](INSTALL.md#postcss-load-config)
68
+ - [Webpack](INSTALL.md#webpack)
69
+ - [Next.js](INSTALL.md#nextjs)
70
+ - [Gulp](INSTALL.md#gulp)
71
+ - [Grunt](INSTALL.md#grunt)
67
72
 
68
73
  ## ⚠️ About custom properties
69
74
 
@@ -150,9 +155,6 @@ postcssTrigonometricFunctions({ preserve: true })
150
155
  [discord]: https://discord.gg/bUadyRwkJS
151
156
  [npm-url]: https://www.npmjs.com/package/@csstools/postcss-trigonometric-functions
152
157
 
153
- [Gulp PostCSS]: https://github.com/postcss/gulp-postcss
154
- [Grunt PostCSS]: https://github.com/nDmitry/grunt-postcss
155
158
  [PostCSS]: https://github.com/postcss/postcss
156
- [PostCSS Loader]: https://github.com/postcss/postcss-loader
157
159
  [PostCSS Trigonometric Functions]: https://github.com/csstools/postcss-plugins/tree/main/plugins/postcss-trigonometric-functions
158
160
  [CSS Values 4]: https://www.w3.org/TR/css-values-4/#trig-funcs
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var t=require("postcss-value-parser"),e=require("vm");function n(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var r=n(t),u=n(e);function i(t){return t*(180/Math.PI)}const o={turn:function(t){return 2*t*Math.PI},deg:function(t){return t*(Math.PI/180)},grad:function(t){return t*(Math.PI/200)}};function a(t){return"word"===t.type}const s=["+","-","*","/"];var f;function c(t){return!Number.isNaN(t)&&Number.isFinite(t)}function l(t,e=!1){let n=!0;const i=[];if(t.filter((t=>"function"===t.type)).forEach((t=>{var r;if(!n)return;if(""!==t.value)return void(n=!1);const u=l(t.nodes.slice(0),e),i=1===u.length,o=Number((null==(r=u[0])?void 0:r.value)||"");i&&"word"===u[0].type&&!Number.isNaN(o)?(d(t),t.value=u[0].value):n=!1})),!n)return t;const a=t.filter((t=>"word"===t.type||s.includes(t.value)));let v=f.Number;const m=[];let h;const N=(t,e,r)=>{if(v===e){if(e===f.Number){const e=r||"";m.includes(e)||m.push({number:t,unit:e,index:i.length})}i.push(t),v=e===f.Number?f.Operation:f.Number}else n=!1};for(let t=0,u=a.length;t<u&&n;t++){const u=a[t];if(s.includes(u.value)){N(u.value,f.Operation);continue}if("pi"===u.value){N(Math.PI.toString(),f.Number);continue}if("e"===u.value){N(Math.E.toString(),f.Number);continue}const i=r.default.unit(u.value);if(!i){n=!1;break}if(e){if(h||(h=i.unit),h!==i.unit){n=!1;break}N(u.value,f.Operation)}else i.unit?"rad"!==i.unit&&"function"!=typeof o[i.unit]?n=!1:N(i.number,f.Number,i.unit):N(u.value,f.Number)}if(!n)return t;if(i.length%2==0||i.length<3)return t;let b;try{let t="";const e=new Set(m.map((t=>t.unit)));if(e.size>1)if(e.has("")){if(2!==e.size)throw new Error;[t]=Array.from(e).filter((t=>""!==t))}else m.forEach((t=>{if("rad"!==t.unit){const e=o[t.unit](Number(t.number));if(!c(e))throw new Error;i[t.index]=e.toString()}}));const n=u.default.createContext({result:NaN});new u.default.Script(`result = ${i.join(" ")}`).runInContext(n),"number"==typeof n.result&&c(n.result)&&(t&&(n.result=o[t](n.result)),c(n.result)&&(b=n.result))}catch(t){}if(void 0!==b){let e=b.toString();h&&(e+=h);const n=t[0].sourceIndex,r=e.length;t.length=0,t.push({type:"word",value:e,sourceIndex:n,sourceEndIndex:r})}return t}function d(t){delete t.nodes;const e=t;return e.type="word",e}function v(t,e){if(!Number.isNaN(t)){if(t>Number.MAX_SAFE_INTEGER)return"infinity";if(t<Number.MIN_SAFE_INTEGER)return"-infinity"}return Number(t.toFixed(e)).toString()}function m(t){let e,n="";if("infinity"===t.toLowerCase()?e=1/0:"-infinity"===t.toLowerCase()?e=-1/0:"pi"===t?e=Math.PI:"e"===t&&(e=Math.E),!e){const u=r.default.unit(t);if(!u)return!1;e=Number(u.number),Number.isNaN(e)||(n=u.unit)}return{number:e,unit:n}}function h(t,e=!0){t.nodes=l(t.nodes);const n=t.nodes.filter(a);if(1!==t.nodes.length||1!==n.length)return;const{value:r}=n[0],u=m(r);if(!u)return;let i=u.number;if(e){if(u.unit&&"rad"!==u.unit){if(!o[u.unit])return;i=o[u.unit](i)}}else if(u.unit)return;return[d(t),i]}!function(t){t[t.Number=0]="Number",t[t.Operation=1]="Operation"}(f||(f={}));const N=[{check:"asin(",transform:function(t){const e=r.default(t.value);return e.walk((t=>{if("function"!==t.type||"asin"!==t.value.toLowerCase())return;const e=h(t,!1);if(!e)return;const[n,r]=e;let u=Math.asin(r);Number.isNaN(u)||"number"!=typeof u||(u=`${v(i(u),2)}deg`),n.value=u+""}),!0),e.toString()}},{check:"acos(",transform:function(t){const e=r.default(t.value);return e.walk((t=>{if("function"!==t.type||"acos"!==t.value.toLowerCase())return;const e=h(t,!1);if(!e)return;const[n,r]=e;let u=Math.acos(r);Number.isNaN(u)||"number"!=typeof u||(u=`${v(i(u),2)}deg`),n.value=u+""}),!0),e.toString()}},{check:"atan(",transform:function(t){const e=r.default(t.value);return e.walk((t=>{if("function"!==t.type||"atan"!==t.value.toLowerCase())return;const e=h(t,!1);if(!e)return;const[n,r]=e;let u=Math.atan(r);Number.isNaN(u)||"number"!=typeof u||(u=`${v(i(u),2)}deg`),n.value=u+""}),!0),e.toString()}},{check:"atan2(",transform:function(t){const e=r.default(t.value);return e.walk((t=>{if("function"!==t.type||"atan2"!==t.value.toLowerCase())return;const e=t.nodes.findIndex((t=>"div"===t.type&&","===t.value));if(e<0)return;let n=t.nodes.slice(0,e).filter(a),r=t.nodes.slice(e+1).filter(a);if(0===n.length||0===r.length)return;if(n.length>1&&(n=l(n,!0)),r.length>1&&(r=l(r,!0)),1!==n.length||1!==r.length)return;const u=m(n[0].value),o=m(r[0].value);if(!u||!o)return;if(u.unit!==o.unit)return;let s=Math.atan2(u.number,o.number);Number.isNaN(s)||"number"!=typeof s||(s=`${v(i(s),2)}deg`);d(t).value=s+""}),!0),e.toString()}},{check:"sin(",transform:function(t){const e=r.default(t.value);return e.walk((t=>{if("function"!==t.type||"sin"!==t.value.toLowerCase())return;const e=h(t);if(!e)return;const[n,r]=e;n.value=v(Math.sin(r),5)}),!0),e.toString()}},{check:"cos(",transform:function(t){const e=r.default(t.value);return e.walk((t=>{if("function"!==t.type||"cos"!==t.value.toLowerCase())return;const e=h(t);if(!e)return;const[n,r]=e;n.value=v(Math.cos(r),5)}),!0),e.toString()}},{check:"tan(",transform:function(t){const e=r.default(t.value);return e.walk((t=>{if("function"!==t.type||"tan"!==t.value.toLowerCase())return;const e=h(t);if(!e)return;const[n,r]=e,u=Number(v(i(r),2)),o=u/90;n.value=u%90==0&&o%2!=0?o>0?"infinity":"-infinity":v(Math.tan(r),5)}),!0),e.toString()}}],b=t=>{const e=Object.assign({preserve:!1},t);return{postcssPlugin:"postcss-trigonometric-functions",Declaration(t){const n=N.filter((e=>t.value.toLowerCase().includes(e.check)));if(!t||0===n.length)return;const r=t.clone();n.forEach((t=>{const e=t.transform(r);e&&(r.value=e)})),t.value!==r.value&&(t.before(r),e.preserve||t.remove())}}};b.postcss=!0,module.exports=b;
1
+ "use strict";var e=require("postcss-value-parser"),t=require("vm");function radToDeg(e){return e*(180/Math.PI)}const n={turn:function turnToRad(e){return 2*e*Math.PI},deg:function degToRad(e){return e*(Math.PI/180)},grad:function gradToRad(e){return e*(Math.PI/200)}};function filterOnlyWords(e){return"word"===e.type}const r=["+","-","*","/"];var u;function isFiniteNumber(e){return!Number.isNaN(e)&&Number.isFinite(e)}function computeCalculation(o,i=!1){let a=!0;const s=[];if(o.filter((e=>"function"===e.type)).forEach((e=>{var t;if(!a)return;if(""!==e.value)return void(a=!1);const n=computeCalculation(e.nodes.slice(0),i),r=1===n.length,u=Number((null==(t=n[0])?void 0:t.value)||"");r&&"word"===n[0].type&&!Number.isNaN(u)?(functionNodeToWordNode(e),e.value=n[0].value):a=!1})),!a)return o;const l=o.filter((e=>"word"===e.type||r.includes(e.value)));let c=u.Number;const f=[];let m;const addToExpression=(e,t,n)=>{if(c===t){if(t===u.Number){const t=n||"";f.includes(t)||f.push({number:e,unit:t,index:s.length})}s.push(e),c=t===u.Number?u.Operation:u.Number}else a=!1};for(let t=0,o=l.length;t<o&&a;t++){const o=l[t];if(r.includes(o.value)){addToExpression(o.value,u.Operation);continue}if("pi"===o.value){addToExpression(Math.PI.toString(),u.Number);continue}if("e"===o.value){addToExpression(Math.E.toString(),u.Number);continue}const s=e.unit(o.value);if(!s){a=!1;break}if(i){if(m||(m=s.unit),m!==s.unit){a=!1;break}addToExpression(o.value,u.Operation)}else s.unit?"rad"!==s.unit&&"function"!=typeof n[s.unit]?a=!1:addToExpression(s.number,u.Number,s.unit):addToExpression(o.value,u.Number)}if(!a)return o;if(s.length%2==0||s.length<3)return o;let d;try{let e="";const r=new Set(f.map((e=>e.unit)));if(r.size>1)if(r.has("")){if(2!==r.size)throw new Error;[e]=Array.from(r).filter((e=>""!==e))}else f.forEach((e=>{if("rad"!==e.unit){const t=n[e.unit](Number(e.number));if(!isFiniteNumber(t))throw new Error;s[e.index]=t.toString()}}));const u=t.createContext({result:NaN});new t.Script(`result = ${s.join(" ")}`).runInContext(u),"number"==typeof u.result&&isFiniteNumber(u.result)&&(e&&(u.result=n[e](u.result)),isFiniteNumber(u.result)&&(d=u.result))}catch(e){}if(void 0!==d){let e=d.toString();m&&(e+=m);const t=o[0].sourceIndex,n=e.length;o.length=0,o.push({type:"word",value:e,sourceIndex:t,sourceEndIndex:n})}return o}function functionNodeToWordNode(e){delete e.nodes;const t=e;return t.type="word",t}function formatResultingNumber(e,t){if(!Number.isNaN(e)){if(e>Number.MAX_SAFE_INTEGER)return"infinity";if(e<Number.MIN_SAFE_INTEGER)return"-infinity"}return Number(e.toFixed(t)).toString()}function parseNumber(t){let n,r="";if("infinity"===t.toLowerCase()?n=1/0:"-infinity"===t.toLowerCase()?n=-1/0:"pi"===t?n=Math.PI:"e"===t&&(n=Math.E),!n){const u=e.unit(t);if(!u)return!1;n=Number(u.number),Number.isNaN(n)||(r=u.unit)}return{number:n,unit:r}}function validateNode(e,t=!0){e.nodes=computeCalculation(e.nodes);const r=e.nodes.filter(filterOnlyWords);if(1!==e.nodes.length||1!==r.length)return;const{value:u}=r[0],o=parseNumber(u);if(!o)return;let i=o.number;if(t){if(o.unit&&"rad"!==o.unit){if(!n[o.unit])return;i=n[o.unit](i)}}else if(o.unit)return;return[functionNodeToWordNode(e),i]}!function(e){e[e.Number=0]="Number",e[e.Operation=1]="Operation"}(u||(u={}));const o=[{check:"asin(",transform:function transformAsinFunction(t){const n=e(t.value);return n.walk((e=>{if("function"!==e.type||"asin"!==e.value.toLowerCase())return;const t=validateNode(e,!1);if(!t)return;const[n,r]=t;let u=Math.asin(r);Number.isNaN(u)||"number"!=typeof u||(u=`${formatResultingNumber(radToDeg(u),2)}deg`),n.value=u+""}),!0),n.toString()}},{check:"acos(",transform:function transformAcosFunction(t){const n=e(t.value);return n.walk((e=>{if("function"!==e.type||"acos"!==e.value.toLowerCase())return;const t=validateNode(e,!1);if(!t)return;const[n,r]=t;let u=Math.acos(r);Number.isNaN(u)||"number"!=typeof u||(u=`${formatResultingNumber(radToDeg(u),2)}deg`),n.value=u+""}),!0),n.toString()}},{check:"atan(",transform:function transformAtanFunction(t){const n=e(t.value);return n.walk((e=>{if("function"!==e.type||"atan"!==e.value.toLowerCase())return;const t=validateNode(e,!1);if(!t)return;const[n,r]=t;let u=Math.atan(r);Number.isNaN(u)||"number"!=typeof u||(u=`${formatResultingNumber(radToDeg(u),2)}deg`),n.value=u+""}),!0),n.toString()}},{check:"atan2(",transform:function transformAtan2Function(t){const n=e(t.value);return n.walk((e=>{if("function"!==e.type||"atan2"!==e.value.toLowerCase())return;const t=e.nodes.findIndex((e=>"div"===e.type&&","===e.value));if(t<0)return;let n=e.nodes.slice(0,t).filter(filterOnlyWords),r=e.nodes.slice(t+1).filter(filterOnlyWords);if(0===n.length||0===r.length)return;if(n.length>1&&(n=computeCalculation(n,!0)),r.length>1&&(r=computeCalculation(r,!0)),1!==n.length||1!==r.length)return;const u=parseNumber(n[0].value),o=parseNumber(r[0].value);if(!u||!o)return;if(u.unit!==o.unit)return;let i=Math.atan2(u.number,o.number);Number.isNaN(i)||"number"!=typeof i||(i=`${formatResultingNumber(radToDeg(i),2)}deg`);functionNodeToWordNode(e).value=i+""}),!0),n.toString()}},{check:"sin(",transform:function transformSinFunction(t){const n=e(t.value);return n.walk((e=>{if("function"!==e.type||"sin"!==e.value.toLowerCase())return;const t=validateNode(e);if(!t)return;const[n,r]=t;n.value=formatResultingNumber(Math.sin(r),5)}),!0),n.toString()}},{check:"cos(",transform:function transformCosFunction(t){const n=e(t.value);return n.walk((e=>{if("function"!==e.type||"cos"!==e.value.toLowerCase())return;const t=validateNode(e);if(!t)return;const[n,r]=t;n.value=formatResultingNumber(Math.cos(r),5)}),!0),n.toString()}},{check:"tan(",transform:function transformTanFunction(t){const n=e(t.value);return n.walk((e=>{if("function"!==e.type||"tan"!==e.value.toLowerCase())return;const t=validateNode(e);if(!t)return;const[n,r]=t,u=Number(formatResultingNumber(radToDeg(r),2)),o=u/90;n.value=u%90==0&&o%2!=0?o>0?"infinity":"-infinity":formatResultingNumber(Math.tan(r),5)}),!0),n.toString()}}],creator=e=>{const t=Object.assign({preserve:!1},e);return{postcssPlugin:"postcss-trigonometric-functions",Declaration(e){const n=o.filter((t=>e.value.toLowerCase().includes(t.check)));if(!e||0===n.length)return;const r=e.clone();n.forEach((e=>{const t=e.transform(r);t&&(r.value=t)})),e.value!==r.value&&(e.before(r),t.preserve||e.remove())}}};creator.postcss=!0,module.exports=creator;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  import type { PluginCreator } from 'postcss';
2
- declare type pluginOptions = {
2
+ /** postcss-trigonometric-functions plugin options */
3
+ export type pluginOptions = {
4
+ /** Preserve the original notation. default: false */
3
5
  preserve?: boolean;
4
6
  };
5
7
  declare const creator: PluginCreator<pluginOptions>;
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import t from"postcss-value-parser";import e from"vm";function n(t){return t*(180/Math.PI)}const r={turn:function(t){return 2*t*Math.PI},deg:function(t){return t*(Math.PI/180)},grad:function(t){return t*(Math.PI/200)}};function u(t){return"word"===t.type}const i=["+","-","*","/"];var o;function a(t){return!Number.isNaN(t)&&Number.isFinite(t)}function s(n,u=!1){let f=!0;const l=[];if(n.filter((t=>"function"===t.type)).forEach((t=>{var e;if(!f)return;if(""!==t.value)return void(f=!1);const n=s(t.nodes.slice(0),u),r=1===n.length,i=Number((null==(e=n[0])?void 0:e.value)||"");r&&"word"===n[0].type&&!Number.isNaN(i)?(c(t),t.value=n[0].value):f=!1})),!f)return n;const m=n.filter((t=>"word"===t.type||i.includes(t.value)));let v=o.Number;const h=[];let N;const b=(t,e,n)=>{if(v===e){if(e===o.Number){const e=n||"";h.includes(e)||h.push({number:t,unit:e,index:l.length})}l.push(t),v=e===o.Number?o.Operation:o.Number}else f=!1};for(let e=0,n=m.length;e<n&&f;e++){const n=m[e];if(i.includes(n.value)){b(n.value,o.Operation);continue}if("pi"===n.value){b(Math.PI.toString(),o.Number);continue}if("e"===n.value){b(Math.E.toString(),o.Number);continue}const a=t.unit(n.value);if(!a){f=!1;break}if(u){if(N||(N=a.unit),N!==a.unit){f=!1;break}b(n.value,o.Operation)}else a.unit?"rad"!==a.unit&&"function"!=typeof r[a.unit]?f=!1:b(a.number,o.Number,a.unit):b(n.value,o.Number)}if(!f)return n;if(l.length%2==0||l.length<3)return n;let d;try{let t="";const n=new Set(h.map((t=>t.unit)));if(n.size>1)if(n.has("")){if(2!==n.size)throw new Error;[t]=Array.from(n).filter((t=>""!==t))}else h.forEach((t=>{if("rad"!==t.unit){const e=r[t.unit](Number(t.number));if(!a(e))throw new Error;l[t.index]=e.toString()}}));const u=e.createContext({result:NaN});new e.Script(`result = ${l.join(" ")}`).runInContext(u),"number"==typeof u.result&&a(u.result)&&(t&&(u.result=r[t](u.result)),a(u.result)&&(d=u.result))}catch(t){}if(void 0!==d){let t=d.toString();N&&(t+=N);const e=n[0].sourceIndex,r=t.length;n.length=0,n.push({type:"word",value:t,sourceIndex:e,sourceEndIndex:r})}return n}function c(t){delete t.nodes;const e=t;return e.type="word",e}function f(t,e){if(!Number.isNaN(t)){if(t>Number.MAX_SAFE_INTEGER)return"infinity";if(t<Number.MIN_SAFE_INTEGER)return"-infinity"}return Number(t.toFixed(e)).toString()}function l(e){let n,r="";if("infinity"===e.toLowerCase()?n=1/0:"-infinity"===e.toLowerCase()?n=-1/0:"pi"===e?n=Math.PI:"e"===e&&(n=Math.E),!n){const u=t.unit(e);if(!u)return!1;n=Number(u.number),Number.isNaN(n)||(r=u.unit)}return{number:n,unit:r}}function m(t,e=!0){t.nodes=s(t.nodes);const n=t.nodes.filter(u);if(1!==t.nodes.length||1!==n.length)return;const{value:i}=n[0],o=l(i);if(!o)return;let a=o.number;if(e){if(o.unit&&"rad"!==o.unit){if(!r[o.unit])return;a=r[o.unit](a)}}else if(o.unit)return;return[c(t),a]}!function(t){t[t.Number=0]="Number",t[t.Operation=1]="Operation"}(o||(o={}));const v=[{check:"asin(",transform:function(e){const r=t(e.value);return r.walk((t=>{if("function"!==t.type||"asin"!==t.value.toLowerCase())return;const e=m(t,!1);if(!e)return;const[r,u]=e;let i=Math.asin(u);Number.isNaN(i)||"number"!=typeof i||(i=`${f(n(i),2)}deg`),r.value=i+""}),!0),r.toString()}},{check:"acos(",transform:function(e){const r=t(e.value);return r.walk((t=>{if("function"!==t.type||"acos"!==t.value.toLowerCase())return;const e=m(t,!1);if(!e)return;const[r,u]=e;let i=Math.acos(u);Number.isNaN(i)||"number"!=typeof i||(i=`${f(n(i),2)}deg`),r.value=i+""}),!0),r.toString()}},{check:"atan(",transform:function(e){const r=t(e.value);return r.walk((t=>{if("function"!==t.type||"atan"!==t.value.toLowerCase())return;const e=m(t,!1);if(!e)return;const[r,u]=e;let i=Math.atan(u);Number.isNaN(i)||"number"!=typeof i||(i=`${f(n(i),2)}deg`),r.value=i+""}),!0),r.toString()}},{check:"atan2(",transform:function(e){const r=t(e.value);return r.walk((t=>{if("function"!==t.type||"atan2"!==t.value.toLowerCase())return;const e=t.nodes.findIndex((t=>"div"===t.type&&","===t.value));if(e<0)return;let r=t.nodes.slice(0,e).filter(u),i=t.nodes.slice(e+1).filter(u);if(0===r.length||0===i.length)return;if(r.length>1&&(r=s(r,!0)),i.length>1&&(i=s(i,!0)),1!==r.length||1!==i.length)return;const o=l(r[0].value),a=l(i[0].value);if(!o||!a)return;if(o.unit!==a.unit)return;let m=Math.atan2(o.number,a.number);Number.isNaN(m)||"number"!=typeof m||(m=`${f(n(m),2)}deg`);c(t).value=m+""}),!0),r.toString()}},{check:"sin(",transform:function(e){const n=t(e.value);return n.walk((t=>{if("function"!==t.type||"sin"!==t.value.toLowerCase())return;const e=m(t);if(!e)return;const[n,r]=e;n.value=f(Math.sin(r),5)}),!0),n.toString()}},{check:"cos(",transform:function(e){const n=t(e.value);return n.walk((t=>{if("function"!==t.type||"cos"!==t.value.toLowerCase())return;const e=m(t);if(!e)return;const[n,r]=e;n.value=f(Math.cos(r),5)}),!0),n.toString()}},{check:"tan(",transform:function(e){const r=t(e.value);return r.walk((t=>{if("function"!==t.type||"tan"!==t.value.toLowerCase())return;const e=m(t);if(!e)return;const[r,u]=e,i=Number(f(n(u),2)),o=i/90;r.value=i%90==0&&o%2!=0?o>0?"infinity":"-infinity":f(Math.tan(u),5)}),!0),r.toString()}}],h=t=>{const e=Object.assign({preserve:!1},t);return{postcssPlugin:"postcss-trigonometric-functions",Declaration(t){const n=v.filter((e=>t.value.toLowerCase().includes(e.check)));if(!t||0===n.length)return;const r=t.clone();n.forEach((t=>{const e=t.transform(r);e&&(r.value=e)})),t.value!==r.value&&(t.before(r),e.preserve||t.remove())}}};h.postcss=!0;export{h as default};
1
+ import e from"postcss-value-parser";import t from"vm";function radToDeg(e){return e*(180/Math.PI)}const n={turn:function turnToRad(e){return 2*e*Math.PI},deg:function degToRad(e){return e*(Math.PI/180)},grad:function gradToRad(e){return e*(Math.PI/200)}};function filterOnlyWords(e){return"word"===e.type}const r=["+","-","*","/"];var o;function isFiniteNumber(e){return!Number.isNaN(e)&&Number.isFinite(e)}function computeCalculation(u,i=!1){let a=!0;const s=[];if(u.filter((e=>"function"===e.type)).forEach((e=>{var t;if(!a)return;if(""!==e.value)return void(a=!1);const n=computeCalculation(e.nodes.slice(0),i),r=1===n.length,o=Number((null==(t=n[0])?void 0:t.value)||"");r&&"word"===n[0].type&&!Number.isNaN(o)?(functionNodeToWordNode(e),e.value=n[0].value):a=!1})),!a)return u;const l=u.filter((e=>"word"===e.type||r.includes(e.value)));let c=o.Number;const f=[];let m;const addToExpression=(e,t,n)=>{if(c===t){if(t===o.Number){const t=n||"";f.includes(t)||f.push({number:e,unit:t,index:s.length})}s.push(e),c=t===o.Number?o.Operation:o.Number}else a=!1};for(let t=0,u=l.length;t<u&&a;t++){const u=l[t];if(r.includes(u.value)){addToExpression(u.value,o.Operation);continue}if("pi"===u.value){addToExpression(Math.PI.toString(),o.Number);continue}if("e"===u.value){addToExpression(Math.E.toString(),o.Number);continue}const s=e.unit(u.value);if(!s){a=!1;break}if(i){if(m||(m=s.unit),m!==s.unit){a=!1;break}addToExpression(u.value,o.Operation)}else s.unit?"rad"!==s.unit&&"function"!=typeof n[s.unit]?a=!1:addToExpression(s.number,o.Number,s.unit):addToExpression(u.value,o.Number)}if(!a)return u;if(s.length%2==0||s.length<3)return u;let d;try{let e="";const r=new Set(f.map((e=>e.unit)));if(r.size>1)if(r.has("")){if(2!==r.size)throw new Error;[e]=Array.from(r).filter((e=>""!==e))}else f.forEach((e=>{if("rad"!==e.unit){const t=n[e.unit](Number(e.number));if(!isFiniteNumber(t))throw new Error;s[e.index]=t.toString()}}));const o=t.createContext({result:NaN});new t.Script(`result = ${s.join(" ")}`).runInContext(o),"number"==typeof o.result&&isFiniteNumber(o.result)&&(e&&(o.result=n[e](o.result)),isFiniteNumber(o.result)&&(d=o.result))}catch(e){}if(void 0!==d){let e=d.toString();m&&(e+=m);const t=u[0].sourceIndex,n=e.length;u.length=0,u.push({type:"word",value:e,sourceIndex:t,sourceEndIndex:n})}return u}function functionNodeToWordNode(e){delete e.nodes;const t=e;return t.type="word",t}function formatResultingNumber(e,t){if(!Number.isNaN(e)){if(e>Number.MAX_SAFE_INTEGER)return"infinity";if(e<Number.MIN_SAFE_INTEGER)return"-infinity"}return Number(e.toFixed(t)).toString()}function parseNumber(t){let n,r="";if("infinity"===t.toLowerCase()?n=1/0:"-infinity"===t.toLowerCase()?n=-1/0:"pi"===t?n=Math.PI:"e"===t&&(n=Math.E),!n){const o=e.unit(t);if(!o)return!1;n=Number(o.number),Number.isNaN(n)||(r=o.unit)}return{number:n,unit:r}}function validateNode(e,t=!0){e.nodes=computeCalculation(e.nodes);const r=e.nodes.filter(filterOnlyWords);if(1!==e.nodes.length||1!==r.length)return;const{value:o}=r[0],u=parseNumber(o);if(!u)return;let i=u.number;if(t){if(u.unit&&"rad"!==u.unit){if(!n[u.unit])return;i=n[u.unit](i)}}else if(u.unit)return;return[functionNodeToWordNode(e),i]}!function(e){e[e.Number=0]="Number",e[e.Operation=1]="Operation"}(o||(o={}));const u=[{check:"asin(",transform:function transformAsinFunction(t){const n=e(t.value);return n.walk((e=>{if("function"!==e.type||"asin"!==e.value.toLowerCase())return;const t=validateNode(e,!1);if(!t)return;const[n,r]=t;let o=Math.asin(r);Number.isNaN(o)||"number"!=typeof o||(o=`${formatResultingNumber(radToDeg(o),2)}deg`),n.value=o+""}),!0),n.toString()}},{check:"acos(",transform:function transformAcosFunction(t){const n=e(t.value);return n.walk((e=>{if("function"!==e.type||"acos"!==e.value.toLowerCase())return;const t=validateNode(e,!1);if(!t)return;const[n,r]=t;let o=Math.acos(r);Number.isNaN(o)||"number"!=typeof o||(o=`${formatResultingNumber(radToDeg(o),2)}deg`),n.value=o+""}),!0),n.toString()}},{check:"atan(",transform:function transformAtanFunction(t){const n=e(t.value);return n.walk((e=>{if("function"!==e.type||"atan"!==e.value.toLowerCase())return;const t=validateNode(e,!1);if(!t)return;const[n,r]=t;let o=Math.atan(r);Number.isNaN(o)||"number"!=typeof o||(o=`${formatResultingNumber(radToDeg(o),2)}deg`),n.value=o+""}),!0),n.toString()}},{check:"atan2(",transform:function transformAtan2Function(t){const n=e(t.value);return n.walk((e=>{if("function"!==e.type||"atan2"!==e.value.toLowerCase())return;const t=e.nodes.findIndex((e=>"div"===e.type&&","===e.value));if(t<0)return;let n=e.nodes.slice(0,t).filter(filterOnlyWords),r=e.nodes.slice(t+1).filter(filterOnlyWords);if(0===n.length||0===r.length)return;if(n.length>1&&(n=computeCalculation(n,!0)),r.length>1&&(r=computeCalculation(r,!0)),1!==n.length||1!==r.length)return;const o=parseNumber(n[0].value),u=parseNumber(r[0].value);if(!o||!u)return;if(o.unit!==u.unit)return;let i=Math.atan2(o.number,u.number);Number.isNaN(i)||"number"!=typeof i||(i=`${formatResultingNumber(radToDeg(i),2)}deg`);functionNodeToWordNode(e).value=i+""}),!0),n.toString()}},{check:"sin(",transform:function transformSinFunction(t){const n=e(t.value);return n.walk((e=>{if("function"!==e.type||"sin"!==e.value.toLowerCase())return;const t=validateNode(e);if(!t)return;const[n,r]=t;n.value=formatResultingNumber(Math.sin(r),5)}),!0),n.toString()}},{check:"cos(",transform:function transformCosFunction(t){const n=e(t.value);return n.walk((e=>{if("function"!==e.type||"cos"!==e.value.toLowerCase())return;const t=validateNode(e);if(!t)return;const[n,r]=t;n.value=formatResultingNumber(Math.cos(r),5)}),!0),n.toString()}},{check:"tan(",transform:function transformTanFunction(t){const n=e(t.value);return n.walk((e=>{if("function"!==e.type||"tan"!==e.value.toLowerCase())return;const t=validateNode(e);if(!t)return;const[n,r]=t,o=Number(formatResultingNumber(radToDeg(r),2)),u=o/90;n.value=o%90==0&&u%2!=0?u>0?"infinity":"-infinity":formatResultingNumber(Math.tan(r),5)}),!0),n.toString()}}],creator=e=>{const t=Object.assign({preserve:!1},e);return{postcssPlugin:"postcss-trigonometric-functions",Declaration(e){const n=u.filter((t=>e.value.toLowerCase().includes(t.check)));if(!e||0===n.length)return;const r=e.clone();n.forEach((e=>{const t=e.transform(r);t&&(r.value=t)})),e.value!==r.value&&(e.before(r),t.preserve||e.remove())}}};creator.postcss=!0;export{creator as default};
package/dist/utils.d.ts CHANGED
@@ -56,6 +56,6 @@ export declare function parseNumber(value: string): false | {
56
56
  number: any;
57
57
  unit: string;
58
58
  };
59
- declare type validateNodeReturn = [WordNode, number] | undefined;
59
+ type validateNodeReturn = [WordNode, number] | undefined;
60
60
  export declare function validateNode(node: FunctionNode, parseUnit?: boolean): validateNodeReturn;
61
61
  export { toRad, toDeg };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@csstools/postcss-trigonometric-functions",
3
3
  "description": "Use sin(), cos(), tan(), acos(), atan(), and atan2() to compute trigonometric relationships",
4
- "version": "1.0.2",
4
+ "version": "2.0.0",
5
5
  "contributors": [
6
6
  {
7
7
  "name": "Antonio Laguna",
@@ -19,7 +19,7 @@
19
19
  "url": "https://opencollective.com/csstools"
20
20
  },
21
21
  "engines": {
22
- "node": "^14 || >=16"
22
+ "node": "^14 || ^16 || >=18"
23
23
  },
24
24
  "main": "dist/index.cjs",
25
25
  "module": "dist/index.mjs",
@@ -41,11 +41,12 @@
41
41
  "postcss-value-parser": "^4.2.0"
42
42
  },
43
43
  "peerDependencies": {
44
- "postcss": "^8.2"
44
+ "postcss": "^8.4"
45
45
  },
46
46
  "scripts": {
47
- "build": "rollup -c ../../rollup/default.js",
48
- "clean": "node -e \"fs.rmSync('./dist', { recursive: true, force: true });\"",
47
+ "prebuild": "npm run clean",
48
+ "build": "rollup -c ../../rollup/default.mjs",
49
+ "clean": "node -e \"fs.rmSync('./dist', { recursive: true, force: true }); fs.mkdirSync('./dist');\"",
49
50
  "docs": "node ../../.github/bin/generate-docs/install.mjs && node ../../.github/bin/generate-docs/readme.mjs",
50
51
  "lint": "npm run lint:eslint && npm run lint:package-json",
51
52
  "lint:eslint": "eslint ./src --ext .js --ext .ts --ext .mjs --no-error-on-unmatched-pattern",