@csstools/postcss-trigonometric-functions 1.0.1 → 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,13 @@
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
+
7
+ ### 1.0.2 (July 8, 2022)
8
+
9
+ - Fix case insensitive matching.
10
+
3
11
  ### 1.0.1 (May 31, 2022)
4
12
 
5
13
  - Ensure that the plugin works in node 14
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 l;function c(t){return!Number.isNaN(t)&&Number.isFinite(t)}function f(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=f(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)?(v(t),t.value=u[0].value):n=!1})),!n)return t;const a=t.filter((t=>"word"===t.type||s.includes(t.value)));let d=l.Number;const m=[];let h;const N=(t,e,r)=>{if(d===e){if(e===l.Number){const e=r||"";m.includes(e)||m.push({number:t,unit:e,index:i.length})}i.push(t),d=e===l.Number?l.Operation:l.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,l.Operation);continue}if("pi"===u.value){N(Math.PI.toString(),l.Number);continue}if("e"===u.value){N(Math.E.toString(),l.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,l.Operation)}else i.unit?"rad"!==i.unit&&"function"!=typeof o[i.unit]?n=!1:N(i.number,l.Number,i.unit):N(u.value,l.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 v(t){delete t.nodes;const e=t;return e.type="word",e}function d(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=f(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[v(t),i]}!function(t){t[t.Number=0]="Number",t[t.Operation=1]="Operation"}(l||(l={}));const N=[{check:"asin(",transform:function(t){const e=r.default(t.value);return e.walk((t=>{if("function"!==t.type||"asin"!==t.value)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=`${d(i(u),2)}deg`),n.value=u+""})),e.toString()}},{check:"acos(",transform:function(t){const e=r.default(t.value);return e.walk((t=>{if("function"!==t.type||"acos"!==t.value)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=`${d(i(u),2)}deg`),n.value=u+""})),e.toString()}},{check:"atan(",transform:function(t){const e=r.default(t.value);return e.walk((t=>{if("function"!==t.type||"atan"!==t.value)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=`${d(i(u),2)}deg`),n.value=u+""})),e.toString()}},{check:"atan2(",transform:function(t){const e=r.default(t.value);return e.walk((t=>{if("function"!==t.type||"atan2"!==t.value)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=f(n,!0)),r.length>1&&(r=f(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=`${d(i(s),2)}deg`);v(t).value=s+""})),e.toString()}},{check:"sin(",transform:function(t){const e=r.default(t.value);return e.walk((t=>{if("function"!==t.type||"sin"!==t.value)return;const e=h(t);if(!e)return;const[n,r]=e;n.value=d(Math.sin(r),5)})),e.toString()}},{check:"cos(",transform:function(t){const e=r.default(t.value);return e.walk((t=>{if("function"!==t.type||"cos"!==t.value)return;const e=h(t);if(!e)return;const[n,r]=e;n.value=d(Math.cos(r),5)})),e.toString()}},{check:"tan(",transform:function(t){const e=r.default(t.value);return e.walk((t=>{if("function"!==t.type||"tan"!==t.value)return;const e=h(t);if(!e)return;const[n,r]=e,u=Number(d(i(r),2)),o=u/90;n.value=u%90==0&&o%2!=0?o>0?"infinity":"-infinity":d(Math.tan(r),5)})),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.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&&(e.preserve?t.cloneBefore({value:r.value}):t.value=r.value)}}};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 n from"vm";function e(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(e,u=!1){let l=!0;const f=[];if(e.filter((t=>"function"===t.type)).forEach((t=>{var n;if(!l)return;if(""!==t.value)return void(l=!1);const e=s(t.nodes.slice(0),u),r=1===e.length,i=Number((null==(n=e[0])?void 0:n.value)||"");r&&"word"===e[0].type&&!Number.isNaN(i)?(c(t),t.value=e[0].value):l=!1})),!l)return e;const v=e.filter((t=>"word"===t.type||i.includes(t.value)));let m=o.Number;const h=[];let N;const b=(t,n,e)=>{if(m===n){if(n===o.Number){const n=e||"";h.includes(n)||h.push({number:t,unit:n,index:f.length})}f.push(t),m=n===o.Number?o.Operation:o.Number}else l=!1};for(let n=0,e=v.length;n<e&&l;n++){const e=v[n];if(i.includes(e.value)){b(e.value,o.Operation);continue}if("pi"===e.value){b(Math.PI.toString(),o.Number);continue}if("e"===e.value){b(Math.E.toString(),o.Number);continue}const a=t.unit(e.value);if(!a){l=!1;break}if(u){if(N||(N=a.unit),N!==a.unit){l=!1;break}b(e.value,o.Operation)}else a.unit?"rad"!==a.unit&&"function"!=typeof r[a.unit]?l=!1:b(a.number,o.Number,a.unit):b(e.value,o.Number)}if(!l)return e;if(f.length%2==0||f.length<3)return e;let d;try{let t="";const e=new Set(h.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 h.forEach((t=>{if("rad"!==t.unit){const n=r[t.unit](Number(t.number));if(!a(n))throw new Error;f[t.index]=n.toString()}}));const u=n.createContext({result:NaN});new n.Script(`result = ${f.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 n=e[0].sourceIndex,r=t.length;e.length=0,e.push({type:"word",value:t,sourceIndex:n,sourceEndIndex:r})}return e}function c(t){delete t.nodes;const n=t;return n.type="word",n}function l(t,n){if(!Number.isNaN(t)){if(t>Number.MAX_SAFE_INTEGER)return"infinity";if(t<Number.MIN_SAFE_INTEGER)return"-infinity"}return Number(t.toFixed(n)).toString()}function f(n){let e,r="";if("infinity"===n.toLowerCase()?e=1/0:"-infinity"===n.toLowerCase()?e=-1/0:"pi"===n?e=Math.PI:"e"===n&&(e=Math.E),!e){const u=t.unit(n);if(!u)return!1;e=Number(u.number),Number.isNaN(e)||(r=u.unit)}return{number:e,unit:r}}function v(t,n=!0){t.nodes=s(t.nodes);const e=t.nodes.filter(u);if(1!==t.nodes.length||1!==e.length)return;const{value:i}=e[0],o=f(i);if(!o)return;let a=o.number;if(n){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 m=[{check:"asin(",transform:function(n){const r=t(n.value);return r.walk((t=>{if("function"!==t.type||"asin"!==t.value)return;const n=v(t,!1);if(!n)return;const[r,u]=n;let i=Math.asin(u);Number.isNaN(i)||"number"!=typeof i||(i=`${l(e(i),2)}deg`),r.value=i+""})),r.toString()}},{check:"acos(",transform:function(n){const r=t(n.value);return r.walk((t=>{if("function"!==t.type||"acos"!==t.value)return;const n=v(t,!1);if(!n)return;const[r,u]=n;let i=Math.acos(u);Number.isNaN(i)||"number"!=typeof i||(i=`${l(e(i),2)}deg`),r.value=i+""})),r.toString()}},{check:"atan(",transform:function(n){const r=t(n.value);return r.walk((t=>{if("function"!==t.type||"atan"!==t.value)return;const n=v(t,!1);if(!n)return;const[r,u]=n;let i=Math.atan(u);Number.isNaN(i)||"number"!=typeof i||(i=`${l(e(i),2)}deg`),r.value=i+""})),r.toString()}},{check:"atan2(",transform:function(n){const r=t(n.value);return r.walk((t=>{if("function"!==t.type||"atan2"!==t.value)return;const n=t.nodes.findIndex((t=>"div"===t.type&&","===t.value));if(n<0)return;let r=t.nodes.slice(0,n).filter(u),i=t.nodes.slice(n+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=f(r[0].value),a=f(i[0].value);if(!o||!a)return;if(o.unit!==a.unit)return;let v=Math.atan2(o.number,a.number);Number.isNaN(v)||"number"!=typeof v||(v=`${l(e(v),2)}deg`);c(t).value=v+""})),r.toString()}},{check:"sin(",transform:function(n){const e=t(n.value);return e.walk((t=>{if("function"!==t.type||"sin"!==t.value)return;const n=v(t);if(!n)return;const[e,r]=n;e.value=l(Math.sin(r),5)})),e.toString()}},{check:"cos(",transform:function(n){const e=t(n.value);return e.walk((t=>{if("function"!==t.type||"cos"!==t.value)return;const n=v(t);if(!n)return;const[e,r]=n;e.value=l(Math.cos(r),5)})),e.toString()}},{check:"tan(",transform:function(n){const r=t(n.value);return r.walk((t=>{if("function"!==t.type||"tan"!==t.value)return;const n=v(t);if(!n)return;const[r,u]=n,i=Number(l(e(u),2)),o=i/90;r.value=i%90==0&&o%2!=0?o>0?"infinity":"-infinity":l(Math.tan(u),5)})),r.toString()}}],h=t=>{const n=Object.assign({preserve:!1},t);return{postcssPlugin:"postcss-trigonometric-functions",Declaration(t){const e=m.filter((n=>t.value.includes(n.check)));if(!t||0===e.length)return;const r=t.clone();e.forEach((t=>{const n=t.transform(r);n&&(r.value=n)})),t.value!==r.value&&(n.preserve?t.cloneBefore({value:r.value}):t.value=r.value)}}};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.1",
4
+ "version": "2.0.0",
5
5
  "contributors": [
6
6
  {
7
7
  "name": "Antonio Laguna",
@@ -9,7 +9,7 @@
9
9
  "url": "https://antonio.laguna.es"
10
10
  },
11
11
  {
12
- "name": "Romain Menke ",
12
+ "name": "Romain Menke",
13
13
  "email": "romainmenke@gmail.com"
14
14
  }
15
15
  ],
@@ -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",
@@ -44,8 +44,9 @@
44
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",