@rushstack/lockfile-explorer 2.2.17 → 2.2.19

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.
Files changed (56) hide show
  1. package/CHANGELOG.json +35 -0
  2. package/CHANGELOG.md +13 -1
  3. package/dist/{app.0b644e08b36979b58936.js → app.3fe86541880858baf783.js} +1 -1
  4. package/dist/index.html +1 -1
  5. package/dist/rush-themed-ui.js +2 -2
  6. package/lib-commonjs/cli/explorer/ExplorerCommandLineParser.js +27 -25
  7. package/lib-commonjs/cli/explorer/ExplorerCommandLineParser.js.map +1 -1
  8. package/lib-commonjs/cli/lint/LintCommandLineParser.js +7 -10
  9. package/lib-commonjs/cli/lint/LintCommandLineParser.js.map +1 -1
  10. package/lib-commonjs/cli/lint/actions/CheckAction.js +2 -2
  11. package/lib-commonjs/cli/lint/actions/CheckAction.js.map +1 -1
  12. package/lib-commonjs/cli/lint/actions/InitAction.js +2 -2
  13. package/lib-commonjs/cli/lint/actions/InitAction.js.map +1 -1
  14. package/lib-commonjs/start-explorer.js +3 -1
  15. package/lib-commonjs/start-explorer.js.map +1 -1
  16. package/lib-commonjs/start-lint.js +3 -1
  17. package/lib-commonjs/start-lint.js.map +1 -1
  18. package/lib-commonjs/utils/PackageUpdateChecker.js +120 -0
  19. package/lib-commonjs/utils/PackageUpdateChecker.js.map +1 -0
  20. package/lib-commonjs/utils/constants.js +15 -0
  21. package/lib-commonjs/utils/constants.js.map +1 -0
  22. package/lib-commonjs/utils/init.js +4 -3
  23. package/lib-commonjs/utils/init.js.map +1 -1
  24. package/lib-dts/cli/explorer/ExplorerCommandLineParser.d.ts +1 -2
  25. package/lib-dts/cli/explorer/ExplorerCommandLineParser.d.ts.map +1 -1
  26. package/lib-dts/cli/lint/LintCommandLineParser.d.ts +1 -2
  27. package/lib-dts/cli/lint/LintCommandLineParser.d.ts.map +1 -1
  28. package/lib-dts/cli/lint/actions/CheckAction.d.ts +2 -2
  29. package/lib-dts/cli/lint/actions/CheckAction.d.ts.map +1 -1
  30. package/lib-dts/cli/lint/actions/InitAction.d.ts +2 -2
  31. package/lib-dts/cli/lint/actions/InitAction.d.ts.map +1 -1
  32. package/lib-dts/utils/PackageUpdateChecker.d.ts +77 -0
  33. package/lib-dts/utils/PackageUpdateChecker.d.ts.map +1 -0
  34. package/lib-dts/utils/constants.d.ts +3 -0
  35. package/lib-dts/utils/constants.d.ts.map +1 -0
  36. package/lib-dts/utils/init.d.ts +3 -3
  37. package/lib-dts/utils/init.d.ts.map +1 -1
  38. package/lib-esm/cli/explorer/ExplorerCommandLineParser.js +29 -27
  39. package/lib-esm/cli/explorer/ExplorerCommandLineParser.js.map +1 -1
  40. package/lib-esm/cli/lint/LintCommandLineParser.js +8 -11
  41. package/lib-esm/cli/lint/LintCommandLineParser.js.map +1 -1
  42. package/lib-esm/cli/lint/actions/CheckAction.js +2 -2
  43. package/lib-esm/cli/lint/actions/CheckAction.js.map +1 -1
  44. package/lib-esm/cli/lint/actions/InitAction.js +2 -2
  45. package/lib-esm/cli/lint/actions/InitAction.js.map +1 -1
  46. package/lib-esm/start-explorer.js +3 -1
  47. package/lib-esm/start-explorer.js.map +1 -1
  48. package/lib-esm/start-lint.js +3 -1
  49. package/lib-esm/start-lint.js.map +1 -1
  50. package/lib-esm/utils/PackageUpdateChecker.js +113 -0
  51. package/lib-esm/utils/PackageUpdateChecker.js.map +1 -0
  52. package/lib-esm/utils/constants.js +9 -0
  53. package/lib-esm/utils/constants.js.map +1 -0
  54. package/lib-esm/utils/init.js +4 -3
  55. package/lib-esm/utils/init.js.map +1 -1
  56. package/package.json +8 -10
@@ -1,3 +1,3 @@
1
1
  /*! For license information please see rush-themed-ui.js.LICENSE.txt */
2
- !function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("react"),require("react-dom"));else if("function"==typeof define&&define.amd)define("@rushstack/rush-themed-ui",["react","react-dom"],t);else{var n="object"==typeof exports?t(require("react"),require("react-dom")):t(e.react,e["react-dom"]);for(var r in n)("object"==typeof exports?exports:e)[r]=n[r]}}(this,function(e,t){return function(){"use strict";var n,r,o={629:function(e,t,n){var r=n(797),o=n.n(r),a=n(446),i=n.n(a)()(o());i.push([e.id,".Xcbor_Pb0v00loQ79vaQ{padding:4px 8px;border:1px solid #107c10;border-radius:2px}.Xcbor_Pb0v00loQ79vaQ:hover{cursor:pointer;background-color:#dff6dd}.Xcbor_Pb0v00loQ79vaQ:disabled{cursor:default;background-color:#fff;color:#666;border-color:#ab9e8e}",""]),i.locals={ButtonWrapper:"Xcbor_Pb0v00loQ79vaQ"},t.A=i},706:function(e,t,n){var r=n(797),o=n.n(r),a=n(446),i=n.n(a)()(o());i.push([e.id,"button{all:unset}.kPGSzfa3vbuphUeBBPZ2{background-color:#fff;width:25px;min-width:25px;height:25px;border-radius:4px;display:flex;align-items:center;justify-content:center;border:1px solid #000;cursor:pointer}.kPGSzfa3vbuphUeBBPZ2:hover{background-color:#dff6dd}.YMoUqB0qcltlZx_BULiD{color:#107c10}.XwHQf6wcWklaq8_1lyYC{padding-left:15px;font-size:15px;line-height:1;-webkit-user-select:none;-moz-user-select:none;user-select:none}",""]),i.locals={CheckboxRoot:"kPGSzfa3vbuphUeBBPZ2",CheckboxIndicator:"YMoUqB0qcltlZx_BULiD",Label:"XwHQf6wcWklaq8_1lyYC"},t.A=i},301:function(e,t,n){var r=n(797),o=n.n(r),a=n(446),i=n.n(a)()(o());i.push([e.id,".G8XdaQkveVtto23FX0oN{border:solid 1px #666;border-radius:4px;padding:.4em}",""]),i.locals={InputWrapper:"G8XdaQkveVtto23FX0oN"},t.A=i},409:function(e,t,n){var r=n(797),o=n.n(r),a=n(446),i=n.n(a)()(o());i.push([e.id,'.EzlHIrxoN7TWEXcBECaV{border-radius:4px;overflow:hidden;--scrollbar-size: 6px;height:100%}.cfK3f0P_sHwmidizCkKo{width:100%;height:100%;border-radius:inherit}.cfK3f0P_sHwmidizCkKo>*{padding-right:8px}.eqDaw9mz7dcZ6Pbl5OgQ{display:flex;-webkit-user-select:none;-moz-user-select:none;user-select:none;touch-action:none;padding:2px;background:#f3f2f1;transition:background 160ms ease-out}.eqDaw9mz7dcZ6Pbl5OgQ:hover{background:#f3f2f1}.eqDaw9mz7dcZ6Pbl5OgQ[data-orientation=vertical]{width:var(--scrollbar-size)}.eqDaw9mz7dcZ6Pbl5OgQ[data-orientation=horizontal]{flex-direction:column;height:var(--scrollbar-size)}.lQ6QXIesn5jzaMsUBreK{flex:1;background:#107c10;border-radius:var(--scrollbar-size);position:relative}.lQ6QXIesn5jzaMsUBreK::before{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:100%;height:100%;min-width:44px;min-height:44px}.rubXHPiFB8jL2DAATJpx{background:#f3f2f1}',""]),i.locals={ScrollAreaRoot:"EzlHIrxoN7TWEXcBECaV",ScrollAreaViewport:"cfK3f0P_sHwmidizCkKo",ScrollAreaScrollbar:"eqDaw9mz7dcZ6Pbl5OgQ",ScrollAreaThumb:"lQ6QXIesn5jzaMsUBreK",ScrollAreaCorner:"rubXHPiFB8jL2DAATJpx"},t.A=i},725:function(e,t,n){var r=n(797),o=n.n(r),a=n(446),i=n.n(a)()(o());i.push([e.id,"button,fieldset,input{all:unset}.MkI4RReTctAuQGaVhBNN{display:flex;flex-direction:column;width:100%}.O8NXMrDnUkaO2hndK6XU{flex-shrink:0;display:flex;border-bottom:1px solid #107c10}.LceWGPplzk9w7zfA8BnW{font-family:inherit;padding:0 20px;height:45px;flex:1;display:flex;align-items:center;justify-content:center;font-size:15px;line-height:1;color:#000;-webkit-user-select:none;-moz-user-select:none;user-select:none}.LceWGPplzk9w7zfA8BnW:hover{color:#107c10;cursor:pointer}.LceWGPplzk9w7zfA8BnW[data-state=active]{color:#107c10;box-shadow:inset 0 -1px 0 0 currentColor,0 1px 0 0 currentColor}.LceWGPplzk9w7zfA8BnW:focus{position:relative;box-shadow:0 0 0 2px #107c10}.u3yzNdthceb3vdwa4Z9g{flex-grow:1;padding:12px;border-bottom-left-radius:6px;border-bottom-right-radius:6px;outline:none}.u3yzNdthceb3vdwa4Z9g:focus{box-shadow:0 0 0 2px #000}",""]),i.locals={TabsRoot:"MkI4RReTctAuQGaVhBNN",TabsList:"O8NXMrDnUkaO2hndK6XU",TabsTrigger:"LceWGPplzk9w7zfA8BnW",TabsContent:"u3yzNdthceb3vdwa4Z9g"},t.A=i},868:function(e,t,n){var r=n(797),o=n.n(r),a=n(446),i=n.n(a)()(o());i.push([e.id,'.tum5Llxr5FqXT9j4qKpt{font-weight:bold;line-height:1.2;margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif;font-size:24px}.BjhGDgMytkiuyo7KhcCv{font-weight:bold;line-height:1.2;margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif;font-size:21px}.Kx1ScAbR0Aizkk9aoHEM{font-weight:bold;line-height:1.2;margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif;font-size:19px}.nElic5GIFFhhK0eP49O2{font-weight:bold;line-height:1.2;margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif;font-size:16px}.OLbKQ2TQKbxtP1_BoCC4{font-weight:bold;line-height:1.2;margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif;font-size:14px}.M87snUouSL1JmF2BQJXi{font-weight:bold;line-height:1.2;margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif;font-size:12px}.xSIkXtgkvwTIgstwtpBv{font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif;margin:0;font-weight:normal;line-height:1.5;font-size:14px}.ERJRX5TLRqRK0dy59aFn{font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif;font-size:12px}',""]),i.locals={H1:"tum5Llxr5FqXT9j4qKpt",H2:"BjhGDgMytkiuyo7KhcCv",H3:"Kx1ScAbR0Aizkk9aoHEM",H4:"nElic5GIFFhhK0eP49O2",H5:"OLbKQ2TQKbxtP1_BoCC4",H6:"M87snUouSL1JmF2BQJXi",ParagraphStyles:"xSIkXtgkvwTIgstwtpBv",SpanStyles:"ERJRX5TLRqRK0dy59aFn"},t.A=i},446:function(e){e.exports=function(e){var t=[];return t.toString=function(){return this.map(function(t){var n="",r=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),r&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),r&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n}).join("")},t.i=function(e,n,r,o,a){"string"==typeof e&&(e=[[null,e,void 0]]);var i={};if(r)for(var l=0;l<this.length;l++){var s=this[l][0];null!=s&&(i[s]=!0)}for(var c=0;c<e.length;c++){var u=[].concat(e[c]);r&&i[u[0]]||(void 0!==a&&(void 0===u[5]||(u[1]="@layer".concat(u[5].length>0?" ".concat(u[5]):""," {").concat(u[1],"}")),u[5]=a),n&&(u[2]?(u[1]="@media ".concat(u[2]," {").concat(u[1],"}"),u[2]=n):u[2]=n),o&&(u[4]?(u[1]="@supports (".concat(u[4],") {").concat(u[1],"}"),u[4]=o):u[4]="".concat(o)),t.push(u))}},t}},797:function(e){e.exports=function(e){return e[1]}},405:function(e,t){var n=Symbol.for("react.transitional.element"),r=Symbol.for("react.fragment");function o(e,t,r){var o=null;if(void 0!==r&&(o=""+r),void 0!==t.key&&(o=""+t.key),"key"in t)for(var a in r={},t)"key"!==a&&(r[a]=t[a]);else r=t;return t=r.ref,{$$typeof:n,type:e,key:o,ref:void 0!==t?t:null,props:r}}t.Fragment=r,t.jsx=o,t.jsxs=o},37:function(e,t,n){e.exports=n(405)},626:function(e){var t=[];function n(e){for(var n=-1,r=0;r<t.length;r++)if(t[r].identifier===e){n=r;break}return n}function r(e,r){for(var a={},i=[],l=0;l<e.length;l++){var s=e[l],c=r.base?s[0]+r.base:s[0],u=a[c]||0,d="".concat(c," ").concat(u);a[c]=u+1;var f=n(d),p={css:s[1],media:s[2],sourceMap:s[3],supports:s[4],layer:s[5]};if(-1!==f)t[f].references++,t[f].updater(p);else{var h=o(p,r);r.byIndex=l,t.splice(l,0,{identifier:d,updater:h,references:1})}i.push(d)}return i}function o(e,t){var n=t.domAPI(t);return n.update(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap&&t.supports===e.supports&&t.layer===e.layer)return;n.update(e=t)}else n.remove()}}e.exports=function(e,o){var a=r(e=e||[],o=o||{});return function(e){e=e||[];for(var i=0;i<a.length;i++){var l=n(a[i]);t[l].references--}for(var s=r(e,o),c=0;c<a.length;c++){var u=n(a[c]);0===t[u].references&&(t[u].updater(),t.splice(u,1))}a=s}}},601:function(e){var t={};e.exports=function(e,n){var r=function(e){if(void 0===t[e]){var n=document.querySelector(e);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}t[e]=n}return t[e]}(e);if(!r)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");r.appendChild(n)}},526:function(e){e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},434:function(e,t,n){e.exports=function(e){var t=n.nc;t&&e.setAttribute("nonce",t)}},835:function(e){e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(n){!function(e,t,n){var r="";n.supports&&(r+="@supports (".concat(n.supports,") {")),n.media&&(r+="@media ".concat(n.media," {"));var o=void 0!==n.layer;o&&(r+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),r+=n.css,o&&(r+="}"),n.media&&(r+="}"),n.supports&&(r+="}");var a=n.sourceMap;a&&"undefined"!=typeof btoa&&(r+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a))))," */")),t.styleTagTransform(r,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},243:function(e){e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},155:function(t){t.exports=e},514:function(e){e.exports=t}},a={};function i(e){var t=a[e];if(void 0!==t)return t.exports;var n=a[e]={id:e,exports:{}};return o[e](n,n.exports,i),n.exports}i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,{a:t}),t},r=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},i.t=function(e,t){if(1&t&&(e=this(e)),8&t)return e;if("object"==typeof e&&e){if(4&t&&e.__esModule)return e;if(16&t&&"function"==typeof e.then)return e}var o=Object.create(null);i.r(o);var a={};n=n||[null,r({}),r([]),r(r)];for(var l=2&t&&e;("object"==typeof l||"function"==typeof l)&&!~n.indexOf(l);l=r(l))Object.getOwnPropertyNames(l).forEach(function(t){a[t]=function(){return e[t]}});return a.default=function(){return e},i.d(o,a),o},i.d=function(e,t){for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.nc=void 0;var l={};i.r(l),i.d(l,{Button:function(){return P},Checkbox:function(){return Yt},Input:function(){return tn},ScrollArea:function(){return Le},Tabs:function(){return Nt},Text:function(){return R}});var s=i(155),c=i.t(s,2),u=i.n(s),d=i(626),f=i.n(d),p=i(835),h=i.n(p),m=i(601),v=i.n(m),b=i(434),g=i.n(b),y=i(526),w=i.n(y),x=i(243),S=i.n(x),C=i(868),E={};E.styleTagTransform=S(),E.setAttributes=g(),E.insert=v().bind(null,"head"),E.domAPI=h(),E.insertStyleElement=w(),f()(C.A,E);var T=C.A&&C.A.locals?C.A.locals:void 0;const R=({type:e,bold:t=!1,children:n,className:r,size:o})=>{const a=Object.assign({fontWeight:t?"bold":"normal"},o?{fontSize:o}:{});switch(e){case"h1":return u().createElement("h1",{className:`${T.H1} ${r||""}`,style:a},n);case"h2":return u().createElement("h2",{className:`${T.H2} ${r||""}`,style:a},n);case"h3":return u().createElement("h3",{className:`${T.H3} ${r||""}`,style:a},n);case"h4":return u().createElement("h4",{className:`${T.H4} ${r||""}`,style:a},n);case"h5":return u().createElement("h5",{className:`${T.H5} ${r||""}`,style:a},n);case"h6":return u().createElement("h6",{className:`${T.H6} ${r||""}`,style:a},n);case"p":default:return u().createElement("p",{className:`${T.ParagraphStyles} ${r||""}`,style:a},n);case"span":return u().createElement("span",{className:`${T.SpanStyles} ${r||""}`,style:a},n)}};var A=i(629),k={};k.styleTagTransform=S(),k.setAttributes=g(),k.insert=v().bind(null,"head"),k.domAPI=h(),k.insertStyleElement=w(),f()(A.A,k);var N=A.A&&A.A.locals?A.A.locals:void 0;const P=({children:e,disabled:t=!1,onClick:n})=>u().createElement("button",{disabled:t,className:N.ButtonWrapper,onClick:n},u().createElement(R,{type:"span",size:14},e));function _(e,t){if("function"==typeof e)return e(t);null!=e&&(e.current=t)}function I(...e){return t=>{let n=!1;const r=e.map(e=>{const r=_(e,t);return n||"function"!=typeof r||(n=!0),r});if(n)return()=>{for(let t=0;t<r.length;t++){const n=r[t];"function"==typeof n?n():_(e[t],null)}}}}function j(...e){return s.useCallback(I(...e),e)}i(514);var M=i(37);function O(e){const t=z(e),n=s.forwardRef((e,n)=>{const{children:r,...o}=e,a=s.Children.toArray(r),i=a.find(D);if(i){const e=i.props.children,r=a.map(t=>t===i?s.Children.count(e)>1?s.Children.only(null):s.isValidElement(e)?e.props.children:null:t);return(0,M.jsx)(t,{...o,ref:n,children:s.isValidElement(e)?s.cloneElement(e,void 0,r):null})}return(0,M.jsx)(t,{...o,ref:n,children:r})});return n.displayName=`${e}.Slot`,n}function z(e){const t=s.forwardRef((e,t)=>{const{children:n,...r}=e;if(s.isValidElement(n)){const e=function(e){let t=Object.getOwnPropertyDescriptor(e.props,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}(n),o=function(e,t){const n={...t};for(const r in t){const o=e[r],a=t[r];/^on[A-Z]/.test(r)?o&&a?n[r]=(...e)=>{const t=a(...e);return o(...e),t}:o&&(n[r]=o):"style"===r?n[r]={...o,...a}:"className"===r&&(n[r]=[o,a].filter(Boolean).join(" "))}return{...e,...n}}(r,n.props);return n.type!==s.Fragment&&(o.ref=t?I(t,e):e),s.cloneElement(n,o)}return s.Children.count(n)>1?s.Children.only(null):null});return t.displayName=`${e}.SlotClone`,t}var L=Symbol("radix.slottable");function D(e){return s.isValidElement(e)&&"function"==typeof e.type&&"__radixId"in e.type&&e.type.__radixId===L}var F=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"].reduce((e,t)=>{const n=O(`Primitive.${t}`),r=s.forwardRef((e,r)=>{const{asChild:o,...a}=e,i=o?n:t;return"undefined"!=typeof window&&(window[Symbol.for("radix-ui")]=!0),(0,M.jsx)(i,{...a,ref:r})});return r.displayName=`Primitive.${t}`,{...e,[t]:r}},{}),B=globalThis?.document?s.useLayoutEffect:()=>{},U=e=>{const{present:t,children:n}=e,r=function(e){const[t,n]=s.useState(),r=s.useRef(null),o=s.useRef(e),a=s.useRef("none"),i=e?"mounted":"unmounted",[l,c]=function(e,t){return s.useReducer((e,n)=>t[e][n]??e,e)}(i,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return s.useEffect(()=>{const e=H(r.current);a.current="mounted"===l?e:"none"},[l]),B(()=>{const t=r.current,n=o.current;if(n!==e){const r=a.current,i=H(t);c(e?"MOUNT":"none"===i||"none"===t?.display?"UNMOUNT":n&&r!==i?"ANIMATION_OUT":"UNMOUNT"),o.current=e}},[e,c]),B(()=>{if(t){let e;const n=t.ownerDocument.defaultView??window,i=a=>{const i=H(r.current).includes(CSS.escape(a.animationName));if(a.target===t&&i&&(c("ANIMATION_END"),!o.current)){const r=t.style.animationFillMode;t.style.animationFillMode="forwards",e=n.setTimeout(()=>{"forwards"===t.style.animationFillMode&&(t.style.animationFillMode=r)})}},l=e=>{e.target===t&&(a.current=H(r.current))};return t.addEventListener("animationstart",l),t.addEventListener("animationcancel",i),t.addEventListener("animationend",i),()=>{n.clearTimeout(e),t.removeEventListener("animationstart",l),t.removeEventListener("animationcancel",i),t.removeEventListener("animationend",i)}}c("ANIMATION_END")},[t,c]),{isPresent:["mounted","unmountSuspended"].includes(l),ref:s.useCallback(e=>{r.current=e?getComputedStyle(e):null,n(e)},[])}}(t),o="function"==typeof n?n({present:r.isPresent}):s.Children.only(n),a=j(r.ref,function(e){let t=Object.getOwnPropertyDescriptor(e.props,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}(o));return"function"==typeof n||r.isPresent?s.cloneElement(o,{ref:a}):null};function H(e){return e?.animationName||"none"}function W(e,t=[]){let n=[];const r=()=>{const t=n.map(e=>s.createContext(e));return function(n){const r=n?.[e]||t;return s.useMemo(()=>({[`__scope${e}`]:{...n,[e]:r}}),[n,r])}};return r.scopeName=e,[function(t,r){const o=s.createContext(r),a=n.length;n=[...n,r];const i=t=>{const{scope:n,children:r,...i}=t,l=n?.[e]?.[a]||o,c=s.useMemo(()=>i,Object.values(i));return(0,M.jsx)(l.Provider,{value:c,children:r})};return i.displayName=t+"Provider",[i,function(n,i){const l=i?.[e]?.[a]||o,c=s.useContext(l);if(c)return c;if(void 0!==r)return r;throw new Error(`\`${n}\` must be used within \`${t}\``)}]},X(r,...t)]}function X(...e){const t=e[0];if(1===e.length)return t;const n=()=>{const n=e.map(e=>({useScope:e(),scopeName:e.scopeName}));return function(e){const r=n.reduce((t,{useScope:n,scopeName:r})=>({...t,...n(e)[`__scope${r}`]}),{});return s.useMemo(()=>({[`__scope${t.scopeName}`]:r}),[r])}};return n.scopeName=t.scopeName,n}function $(e){const t=s.useRef(e);return s.useEffect(()=>{t.current=e}),s.useMemo(()=>(...e)=>t.current?.(...e),[])}U.displayName="Presence";var K=s.createContext(void 0);function q(e){const t=s.useContext(K);return e||t||"ltr"}function Q(e,t,{checkForDefaultPrevented:n=!0}={}){return function(r){if(e?.(r),!1===n||!r.defaultPrevented)return t?.(r)}}"undefined"==typeof window||!window.document||window.document.createElement;var V="ScrollArea",[G,Y]=W(V),[Z,J]=G(V),ee=s.forwardRef((e,t)=>{const{__scopeScrollArea:n,type:r="hover",dir:o,scrollHideDelay:a=600,...i}=e,[l,c]=s.useState(null),[u,d]=s.useState(null),[f,p]=s.useState(null),[h,m]=s.useState(null),[v,b]=s.useState(null),[g,y]=s.useState(0),[w,x]=s.useState(0),[S,C]=s.useState(!1),[E,T]=s.useState(!1),R=j(t,e=>c(e)),A=q(o);return(0,M.jsx)(Z,{scope:n,type:r,dir:A,scrollHideDelay:a,scrollArea:l,viewport:u,onViewportChange:d,content:f,onContentChange:p,scrollbarX:h,onScrollbarXChange:m,scrollbarXEnabled:S,onScrollbarXEnabledChange:C,scrollbarY:v,onScrollbarYChange:b,scrollbarYEnabled:E,onScrollbarYEnabledChange:T,onCornerWidthChange:y,onCornerHeightChange:x,children:(0,M.jsx)(F.div,{dir:A,...i,ref:R,style:{position:"relative","--radix-scroll-area-corner-width":g+"px","--radix-scroll-area-corner-height":w+"px",...e.style}})})});ee.displayName=V;var te="ScrollAreaViewport",ne=s.forwardRef((e,t)=>{const{__scopeScrollArea:n,children:r,nonce:o,...a}=e,i=J(te,n),l=j(t,s.useRef(null),i.onViewportChange);return(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)("style",{dangerouslySetInnerHTML:{__html:"[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}"},nonce:o}),(0,M.jsx)(F.div,{"data-radix-scroll-area-viewport":"",...a,ref:l,style:{overflowX:i.scrollbarXEnabled?"scroll":"hidden",overflowY:i.scrollbarYEnabled?"scroll":"hidden",...e.style},children:(0,M.jsx)("div",{ref:i.onContentChange,style:{minWidth:"100%",display:"table"},children:r})})]})});ne.displayName=te;var re="ScrollAreaScrollbar",oe=s.forwardRef((e,t)=>{const{forceMount:n,...r}=e,o=J(re,e.__scopeScrollArea),{onScrollbarXEnabledChange:a,onScrollbarYEnabledChange:i}=o,l="horizontal"===e.orientation;return s.useEffect(()=>(l?a(!0):i(!0),()=>{l?a(!1):i(!1)}),[l,a,i]),"hover"===o.type?(0,M.jsx)(ae,{...r,ref:t,forceMount:n}):"scroll"===o.type?(0,M.jsx)(ie,{...r,ref:t,forceMount:n}):"auto"===o.type?(0,M.jsx)(le,{...r,ref:t,forceMount:n}):"always"===o.type?(0,M.jsx)(se,{...r,ref:t}):null});oe.displayName=re;var ae=s.forwardRef((e,t)=>{const{forceMount:n,...r}=e,o=J(re,e.__scopeScrollArea),[a,i]=s.useState(!1);return s.useEffect(()=>{const e=o.scrollArea;let t=0;if(e){const n=()=>{window.clearTimeout(t),i(!0)},r=()=>{t=window.setTimeout(()=>i(!1),o.scrollHideDelay)};return e.addEventListener("pointerenter",n),e.addEventListener("pointerleave",r),()=>{window.clearTimeout(t),e.removeEventListener("pointerenter",n),e.removeEventListener("pointerleave",r)}}},[o.scrollArea,o.scrollHideDelay]),(0,M.jsx)(U,{present:n||a,children:(0,M.jsx)(le,{"data-state":a?"visible":"hidden",...r,ref:t})})}),ie=s.forwardRef((e,t)=>{const{forceMount:n,...r}=e,o=J(re,e.__scopeScrollArea),a="horizontal"===e.orientation,i=Ae(()=>c("SCROLL_END"),100),[l,c]=(u={hidden:{SCROLL:"scrolling"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}},s.useReducer((e,t)=>u[e][t]??e,"hidden"));var u;return s.useEffect(()=>{if("idle"===l){const e=window.setTimeout(()=>c("HIDE"),o.scrollHideDelay);return()=>window.clearTimeout(e)}},[l,o.scrollHideDelay,c]),s.useEffect(()=>{const e=o.viewport,t=a?"scrollLeft":"scrollTop";if(e){let n=e[t];const r=()=>{const r=e[t];n!==r&&(c("SCROLL"),i()),n=r};return e.addEventListener("scroll",r),()=>e.removeEventListener("scroll",r)}},[o.viewport,a,c,i]),(0,M.jsx)(U,{present:n||"hidden"!==l,children:(0,M.jsx)(se,{"data-state":"hidden"===l?"hidden":"visible",...r,ref:t,onPointerEnter:Q(e.onPointerEnter,()=>c("POINTER_ENTER")),onPointerLeave:Q(e.onPointerLeave,()=>c("POINTER_LEAVE"))})})}),le=s.forwardRef((e,t)=>{const n=J(re,e.__scopeScrollArea),{forceMount:r,...o}=e,[a,i]=s.useState(!1),l="horizontal"===e.orientation,c=Ae(()=>{if(n.viewport){const e=n.viewport.offsetWidth<n.viewport.scrollWidth,t=n.viewport.offsetHeight<n.viewport.scrollHeight;i(l?e:t)}},10);return ke(n.viewport,c),ke(n.content,c),(0,M.jsx)(U,{present:r||a,children:(0,M.jsx)(se,{"data-state":a?"visible":"hidden",...o,ref:t})})}),se=s.forwardRef((e,t)=>{const{orientation:n="vertical",...r}=e,o=J(re,e.__scopeScrollArea),a=s.useRef(null),i=s.useRef(0),[l,c]=s.useState({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),u=xe(l.viewport,l.content),d={...r,sizes:l,onSizesChange:c,hasThumb:Boolean(u>0&&u<1),onThumbChange:e=>a.current=e,onThumbPointerUp:()=>i.current=0,onThumbPointerDown:e=>i.current=e};function f(e,t){return function(e,t,n,r="ltr"){const o=Se(n),a=t||o/2,i=o-a,l=n.scrollbar.paddingStart+a,s=n.scrollbar.size-n.scrollbar.paddingEnd-i,c=n.content-n.viewport;return Ee([l,s],"ltr"===r?[0,c]:[-1*c,0])(e)}(e,i.current,l,t)}return"horizontal"===n?(0,M.jsx)(ce,{...d,ref:t,onThumbPositionChange:()=>{if(o.viewport&&a.current){const e=Ce(o.viewport.scrollLeft,l,o.dir);a.current.style.transform=`translate3d(${e}px, 0, 0)`}},onWheelScroll:e=>{o.viewport&&(o.viewport.scrollLeft=e)},onDragScroll:e=>{o.viewport&&(o.viewport.scrollLeft=f(e,o.dir))}}):"vertical"===n?(0,M.jsx)(ue,{...d,ref:t,onThumbPositionChange:()=>{if(o.viewport&&a.current){const e=Ce(o.viewport.scrollTop,l);a.current.style.transform=`translate3d(0, ${e}px, 0)`}},onWheelScroll:e=>{o.viewport&&(o.viewport.scrollTop=e)},onDragScroll:e=>{o.viewport&&(o.viewport.scrollTop=f(e))}}):null}),ce=s.forwardRef((e,t)=>{const{sizes:n,onSizesChange:r,...o}=e,a=J(re,e.__scopeScrollArea),[i,l]=s.useState(),c=s.useRef(null),u=j(t,c,a.onScrollbarXChange);return s.useEffect(()=>{c.current&&l(getComputedStyle(c.current))},[c]),(0,M.jsx)(pe,{"data-orientation":"horizontal",...o,ref:u,sizes:n,style:{bottom:0,left:"rtl"===a.dir?"var(--radix-scroll-area-corner-width)":0,right:"ltr"===a.dir?"var(--radix-scroll-area-corner-width)":0,"--radix-scroll-area-thumb-width":Se(n)+"px",...e.style},onThumbPointerDown:t=>e.onThumbPointerDown(t.x),onDragScroll:t=>e.onDragScroll(t.x),onWheelScroll:(t,n)=>{if(a.viewport){const r=a.viewport.scrollLeft+t.deltaX;e.onWheelScroll(r),Te(r,n)&&t.preventDefault()}},onResize:()=>{c.current&&a.viewport&&i&&r({content:a.viewport.scrollWidth,viewport:a.viewport.offsetWidth,scrollbar:{size:c.current.clientWidth,paddingStart:we(i.paddingLeft),paddingEnd:we(i.paddingRight)}})}})}),ue=s.forwardRef((e,t)=>{const{sizes:n,onSizesChange:r,...o}=e,a=J(re,e.__scopeScrollArea),[i,l]=s.useState(),c=s.useRef(null),u=j(t,c,a.onScrollbarYChange);return s.useEffect(()=>{c.current&&l(getComputedStyle(c.current))},[c]),(0,M.jsx)(pe,{"data-orientation":"vertical",...o,ref:u,sizes:n,style:{top:0,right:"ltr"===a.dir?0:void 0,left:"rtl"===a.dir?0:void 0,bottom:"var(--radix-scroll-area-corner-height)","--radix-scroll-area-thumb-height":Se(n)+"px",...e.style},onThumbPointerDown:t=>e.onThumbPointerDown(t.y),onDragScroll:t=>e.onDragScroll(t.y),onWheelScroll:(t,n)=>{if(a.viewport){const r=a.viewport.scrollTop+t.deltaY;e.onWheelScroll(r),Te(r,n)&&t.preventDefault()}},onResize:()=>{c.current&&a.viewport&&i&&r({content:a.viewport.scrollHeight,viewport:a.viewport.offsetHeight,scrollbar:{size:c.current.clientHeight,paddingStart:we(i.paddingTop),paddingEnd:we(i.paddingBottom)}})}})}),[de,fe]=G(re),pe=s.forwardRef((e,t)=>{const{__scopeScrollArea:n,sizes:r,hasThumb:o,onThumbChange:a,onThumbPointerUp:i,onThumbPointerDown:l,onThumbPositionChange:c,onDragScroll:u,onWheelScroll:d,onResize:f,...p}=e,h=J(re,n),[m,v]=s.useState(null),b=j(t,e=>v(e)),g=s.useRef(null),y=s.useRef(""),w=h.viewport,x=r.content-r.viewport,S=$(d),C=$(c),E=Ae(f,10);function T(e){if(g.current){const t=e.clientX-g.current.left,n=e.clientY-g.current.top;u({x:t,y:n})}}return s.useEffect(()=>{const e=e=>{const t=e.target,n=m?.contains(t);n&&S(e,x)};return document.addEventListener("wheel",e,{passive:!1}),()=>document.removeEventListener("wheel",e,{passive:!1})},[w,m,x,S]),s.useEffect(C,[r,C]),ke(m,E),ke(h.content,E),(0,M.jsx)(de,{scope:n,scrollbar:m,hasThumb:o,onThumbChange:$(a),onThumbPointerUp:$(i),onThumbPositionChange:C,onThumbPointerDown:$(l),children:(0,M.jsx)(F.div,{...p,ref:b,style:{position:"absolute",...p.style},onPointerDown:Q(e.onPointerDown,e=>{0===e.button&&(e.target.setPointerCapture(e.pointerId),g.current=m.getBoundingClientRect(),y.current=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect="none",h.viewport&&(h.viewport.style.scrollBehavior="auto"),T(e))}),onPointerMove:Q(e.onPointerMove,T),onPointerUp:Q(e.onPointerUp,e=>{const t=e.target;t.hasPointerCapture(e.pointerId)&&t.releasePointerCapture(e.pointerId),document.body.style.webkitUserSelect=y.current,h.viewport&&(h.viewport.style.scrollBehavior=""),g.current=null})})})}),he="ScrollAreaThumb",me=s.forwardRef((e,t)=>{const{forceMount:n,...r}=e,o=fe(he,e.__scopeScrollArea);return(0,M.jsx)(U,{present:n||o.hasThumb,children:(0,M.jsx)(ve,{ref:t,...r})})}),ve=s.forwardRef((e,t)=>{const{__scopeScrollArea:n,style:r,...o}=e,a=J(he,n),i=fe(he,n),{onThumbPositionChange:l}=i,c=j(t,e=>i.onThumbChange(e)),u=s.useRef(void 0),d=Ae(()=>{u.current&&(u.current(),u.current=void 0)},100);return s.useEffect(()=>{const e=a.viewport;if(e){const t=()=>{if(d(),!u.current){const t=Re(e,l);u.current=t,l()}};return l(),e.addEventListener("scroll",t),()=>e.removeEventListener("scroll",t)}},[a.viewport,d,l]),(0,M.jsx)(F.div,{"data-state":i.hasThumb?"visible":"hidden",...o,ref:c,style:{width:"var(--radix-scroll-area-thumb-width)",height:"var(--radix-scroll-area-thumb-height)",...r},onPointerDownCapture:Q(e.onPointerDownCapture,e=>{const t=e.target.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top;i.onThumbPointerDown({x:n,y:r})}),onPointerUp:Q(e.onPointerUp,i.onThumbPointerUp)})});me.displayName=he;var be="ScrollAreaCorner",ge=s.forwardRef((e,t)=>{const n=J(be,e.__scopeScrollArea),r=Boolean(n.scrollbarX&&n.scrollbarY);return"scroll"!==n.type&&r?(0,M.jsx)(ye,{...e,ref:t}):null});ge.displayName=be;var ye=s.forwardRef((e,t)=>{const{__scopeScrollArea:n,...r}=e,o=J(be,n),[a,i]=s.useState(0),[l,c]=s.useState(0),u=Boolean(a&&l);return ke(o.scrollbarX,()=>{const e=o.scrollbarX?.offsetHeight||0;o.onCornerHeightChange(e),c(e)}),ke(o.scrollbarY,()=>{const e=o.scrollbarY?.offsetWidth||0;o.onCornerWidthChange(e),i(e)}),u?(0,M.jsx)(F.div,{...r,ref:t,style:{width:a,height:l,position:"absolute",right:"ltr"===o.dir?0:void 0,left:"rtl"===o.dir?0:void 0,bottom:0,...e.style}}):null});function we(e){return e?parseInt(e,10):0}function xe(e,t){const n=e/t;return isNaN(n)?0:n}function Se(e){const t=xe(e.viewport,e.content),n=e.scrollbar.paddingStart+e.scrollbar.paddingEnd,r=(e.scrollbar.size-n)*t;return Math.max(r,18)}function Ce(e,t,n="ltr"){const r=Se(t),o=t.scrollbar.paddingStart+t.scrollbar.paddingEnd,a=t.scrollbar.size-o,i=t.content-t.viewport,l=a-r,s=function(e,[t,n]){return Math.min(n,Math.max(t,e))}(e,"ltr"===n?[0,i]:[-1*i,0]);return Ee([0,i],[0,l])(s)}function Ee(e,t){return n=>{if(e[0]===e[1]||t[0]===t[1])return t[0];const r=(t[1]-t[0])/(e[1]-e[0]);return t[0]+r*(n-e[0])}}function Te(e,t){return e>0&&e<t}var Re=(e,t=()=>{})=>{let n={left:e.scrollLeft,top:e.scrollTop},r=0;return function o(){const a={left:e.scrollLeft,top:e.scrollTop},i=n.left!==a.left,l=n.top!==a.top;(i||l)&&t(),n=a,r=window.requestAnimationFrame(o)}(),()=>window.cancelAnimationFrame(r)};function Ae(e,t){const n=$(e),r=s.useRef(0);return s.useEffect(()=>()=>window.clearTimeout(r.current),[]),s.useCallback(()=>{window.clearTimeout(r.current),r.current=window.setTimeout(n,t)},[n,t])}function ke(e,t){const n=$(t);B(()=>{let t=0;if(e){const r=new ResizeObserver(()=>{cancelAnimationFrame(t),t=window.requestAnimationFrame(n)});return r.observe(e),()=>{window.cancelAnimationFrame(t),r.unobserve(e)}}},[e,n])}var Ne=ee,Pe=ne,_e=oe,Ie=me,je=ge,Me=i(409),Oe={};Oe.styleTagTransform=S(),Oe.setAttributes=g(),Oe.insert=v().bind(null,"head"),Oe.domAPI=h(),Oe.insertStyleElement=w(),f()(Me.A,Oe);var ze=Me.A&&Me.A.locals?Me.A.locals:void 0;const Le=({children:e})=>u().createElement(Ne,{className:ze.ScrollAreaRoot},u().createElement(Pe,{className:ze.ScrollAreaViewport},e),u().createElement(_e,{className:ze.ScrollAreaScrollbar,orientation:"vertical"},u().createElement(Ie,{className:ze.ScrollAreaThumb})),u().createElement(_e,{className:ze.ScrollAreaScrollbar,orientation:"horizontal"},u().createElement(Ie,{className:ze.ScrollAreaThumb})),u().createElement(je,{className:ze.ScrollAreaCorner}));Map;var De=c[" useId ".trim().toString()]||(()=>{}),Fe=0;function Be(e){const[t,n]=s.useState(De());return B(()=>{e||n(e=>e??String(Fe++))},[e]),e||(t?`radix-${t}`:"")}var Ue=c[" useInsertionEffect ".trim().toString()]||B;function He({prop:e,defaultProp:t,onChange:n=()=>{},caller:r}){const[o,a,i]=function({defaultProp:e,onChange:t}){const[n,r]=s.useState(e),o=s.useRef(n),a=s.useRef(t);return Ue(()=>{a.current=t},[t]),s.useEffect(()=>{o.current!==n&&(a.current?.(n),o.current=n)},[n,o]),[n,r,a]}({defaultProp:t,onChange:n}),l=void 0!==e,c=l?e:o;{const t=s.useRef(void 0!==e);s.useEffect(()=>{const e=t.current;if(e!==l){const t=e?"controlled":"uncontrolled",n=l?"controlled":"uncontrolled";console.warn(`${r} is changing from ${t} to ${n}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`)}t.current=l},[l,r])}const u=s.useCallback(t=>{if(l){const n=function(e){return"function"==typeof e}(t)?t(e):t;n!==e&&i.current?.(n)}else a(t)},[l,e,a,i]);return[c,u]}Symbol("RADIX:SYNC_STATE");var We="rovingFocusGroup.onEntryFocus",Xe={bubbles:!1,cancelable:!0},$e="RovingFocusGroup",[Ke,qe,Qe]=function(e){const t=e+"CollectionProvider",[n,r]=W(t),[o,a]=n(t,{collectionRef:{current:null},itemMap:new Map}),i=e=>{const{scope:t,children:n}=e,r=s.useRef(null),a=s.useRef(new Map).current;return(0,M.jsx)(o,{scope:t,itemMap:a,collectionRef:r,children:n})};i.displayName=t;const l=e+"CollectionSlot",c=O(l),u=s.forwardRef((e,t)=>{const{scope:n,children:r}=e,o=j(t,a(l,n).collectionRef);return(0,M.jsx)(c,{ref:o,children:r})});u.displayName=l;const d=e+"CollectionItemSlot",f="data-radix-collection-item",p=O(d),h=s.forwardRef((e,t)=>{const{scope:n,children:r,...o}=e,i=s.useRef(null),l=j(t,i),c=a(d,n);return s.useEffect(()=>(c.itemMap.set(i,{ref:i,...o}),()=>{c.itemMap.delete(i)})),(0,M.jsx)(p,{[f]:"",ref:l,children:r})});return h.displayName=d,[{Provider:i,Slot:u,ItemSlot:h},function(t){const n=a(e+"CollectionConsumer",t);return s.useCallback(()=>{const e=n.collectionRef.current;if(!e)return[];const t=Array.from(e.querySelectorAll(`[${f}]`));return Array.from(n.itemMap.values()).sort((e,n)=>t.indexOf(e.ref.current)-t.indexOf(n.ref.current))},[n.collectionRef,n.itemMap])},r]}($e),[Ve,Ge]=W($e,[Qe]),[Ye,Ze]=Ve($e),Je=s.forwardRef((e,t)=>(0,M.jsx)(Ke.Provider,{scope:e.__scopeRovingFocusGroup,children:(0,M.jsx)(Ke.Slot,{scope:e.__scopeRovingFocusGroup,children:(0,M.jsx)(et,{...e,ref:t})})}));Je.displayName=$e;var et=s.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:n,orientation:r,loop:o=!1,dir:a,currentTabStopId:i,defaultCurrentTabStopId:l,onCurrentTabStopIdChange:c,onEntryFocus:u,preventScrollOnEntryFocus:d=!1,...f}=e,p=s.useRef(null),h=j(t,p),m=q(a),[v,b]=He({prop:i,defaultProp:l??null,onChange:c,caller:$e}),[g,y]=s.useState(!1),w=$(u),x=qe(n),S=s.useRef(!1),[C,E]=s.useState(0);return s.useEffect(()=>{const e=p.current;if(e)return e.addEventListener(We,w),()=>e.removeEventListener(We,w)},[w]),(0,M.jsx)(Ye,{scope:n,orientation:r,dir:m,loop:o,currentTabStopId:v,onItemFocus:s.useCallback(e=>b(e),[b]),onItemShiftTab:s.useCallback(()=>y(!0),[]),onFocusableItemAdd:s.useCallback(()=>E(e=>e+1),[]),onFocusableItemRemove:s.useCallback(()=>E(e=>e-1),[]),children:(0,M.jsx)(F.div,{tabIndex:g||0===C?-1:0,"data-orientation":r,...f,ref:h,style:{outline:"none",...e.style},onMouseDown:Q(e.onMouseDown,()=>{S.current=!0}),onFocus:Q(e.onFocus,e=>{const t=!S.current;if(e.target===e.currentTarget&&t&&!g){const t=new CustomEvent(We,Xe);if(e.currentTarget.dispatchEvent(t),!t.defaultPrevented){const e=x().filter(e=>e.focusable);ot([e.find(e=>e.active),e.find(e=>e.id===v),...e].filter(Boolean).map(e=>e.ref.current),d)}}S.current=!1}),onBlur:Q(e.onBlur,()=>y(!1))})})}),tt="RovingFocusGroupItem",nt=s.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:n,focusable:r=!0,active:o=!1,tabStopId:a,children:i,...l}=e,c=Be(),u=a||c,d=Ze(tt,n),f=d.currentTabStopId===u,p=qe(n),{onFocusableItemAdd:h,onFocusableItemRemove:m,currentTabStopId:v}=d;return s.useEffect(()=>{if(r)return h(),()=>m()},[r,h,m]),(0,M.jsx)(Ke.ItemSlot,{scope:n,id:u,focusable:r,active:o,children:(0,M.jsx)(F.span,{tabIndex:f?0:-1,"data-orientation":d.orientation,...l,ref:t,onMouseDown:Q(e.onMouseDown,e=>{r?d.onItemFocus(u):e.preventDefault()}),onFocus:Q(e.onFocus,()=>d.onItemFocus(u)),onKeyDown:Q(e.onKeyDown,e=>{if("Tab"===e.key&&e.shiftKey)return void d.onItemShiftTab();if(e.target!==e.currentTarget)return;const t=function(e,t,n){const r=function(e,t){return"rtl"!==t?e:"ArrowLeft"===e?"ArrowRight":"ArrowRight"===e?"ArrowLeft":e}(e.key,n);return"vertical"===t&&["ArrowLeft","ArrowRight"].includes(r)||"horizontal"===t&&["ArrowUp","ArrowDown"].includes(r)?void 0:rt[r]}(e,d.orientation,d.dir);if(void 0!==t){if(e.metaKey||e.ctrlKey||e.altKey||e.shiftKey)return;e.preventDefault();let o=p().filter(e=>e.focusable).map(e=>e.ref.current);if("last"===t)o.reverse();else if("prev"===t||"next"===t){"prev"===t&&o.reverse();const a=o.indexOf(e.currentTarget);o=d.loop?(r=a+1,(n=o).map((e,t)=>n[(r+t)%n.length])):o.slice(a+1)}setTimeout(()=>ot(o))}var n,r}),children:"function"==typeof i?i({isCurrentTabStop:f,hasTabStop:null!=v}):i})})});nt.displayName=tt;var rt={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function ot(e,t=!1){const n=document.activeElement;for(const r of e){if(r===n)return;if(r.focus({preventScroll:t}),document.activeElement!==n)return}}var at=Je,it=nt,lt="Tabs",[st,ct]=W(lt,[Ge]),ut=Ge(),[dt,ft]=st(lt),pt=s.forwardRef((e,t)=>{const{__scopeTabs:n,value:r,onValueChange:o,defaultValue:a,orientation:i="horizontal",dir:l,activationMode:s="automatic",...c}=e,u=q(l),[d,f]=He({prop:r,onChange:o,defaultProp:a??"",caller:lt});return(0,M.jsx)(dt,{scope:n,baseId:Be(),value:d,onValueChange:f,orientation:i,dir:u,activationMode:s,children:(0,M.jsx)(F.div,{dir:u,"data-orientation":i,...c,ref:t})})});pt.displayName=lt;var ht="TabsList",mt=s.forwardRef((e,t)=>{const{__scopeTabs:n,loop:r=!0,...o}=e,a=ft(ht,n),i=ut(n);return(0,M.jsx)(at,{asChild:!0,...i,orientation:a.orientation,dir:a.dir,loop:r,children:(0,M.jsx)(F.div,{role:"tablist","aria-orientation":a.orientation,...o,ref:t})})});mt.displayName=ht;var vt="TabsTrigger",bt=s.forwardRef((e,t)=>{const{__scopeTabs:n,value:r,disabled:o=!1,...a}=e,i=ft(vt,n),l=ut(n),s=wt(i.baseId,r),c=xt(i.baseId,r),u=r===i.value;return(0,M.jsx)(it,{asChild:!0,...l,focusable:!o,active:u,children:(0,M.jsx)(F.button,{type:"button",role:"tab","aria-selected":u,"aria-controls":c,"data-state":u?"active":"inactive","data-disabled":o?"":void 0,disabled:o,id:s,...a,ref:t,onMouseDown:Q(e.onMouseDown,e=>{o||0!==e.button||!1!==e.ctrlKey?e.preventDefault():i.onValueChange(r)}),onKeyDown:Q(e.onKeyDown,e=>{[" ","Enter"].includes(e.key)&&i.onValueChange(r)}),onFocus:Q(e.onFocus,()=>{const e="manual"!==i.activationMode;u||o||!e||i.onValueChange(r)})})})});bt.displayName=vt;var gt="TabsContent",yt=s.forwardRef((e,t)=>{const{__scopeTabs:n,value:r,forceMount:o,children:a,...i}=e,l=ft(gt,n),c=wt(l.baseId,r),u=xt(l.baseId,r),d=r===l.value,f=s.useRef(d);return s.useEffect(()=>{const e=requestAnimationFrame(()=>f.current=!1);return()=>cancelAnimationFrame(e)},[]),(0,M.jsx)(U,{present:o||d,children:({present:n})=>(0,M.jsx)(F.div,{"data-state":d?"active":"inactive","data-orientation":l.orientation,role:"tabpanel","aria-labelledby":c,hidden:!n,id:u,tabIndex:0,...i,ref:t,style:{...e.style,animationDuration:f.current?"0s":void 0},children:n&&a})})});function wt(e,t){return`${e}-trigger-${t}`}function xt(e,t){return`${e}-content-${t}`}yt.displayName=gt;var St=pt,Ct=mt,Et=bt,Tt=yt,Rt=i(725),At={};At.styleTagTransform=S(),At.setAttributes=g(),At.insert=v().bind(null,"head"),At.domAPI=h(),At.insertStyleElement=w(),f()(Rt.A,At);var kt=Rt.A&&Rt.A.locals?Rt.A.locals:void 0;const Nt=({items:e,def:t,value:n,onChange:r,renderChildren:o})=>{const a=e=>void 0===e.value?e.header:e.value;return u().createElement(St,{className:kt.TabsRoot,defaultValue:t||e[0].header,value:n,onValueChange:r},u().createElement(Ct,{className:kt.TabsList,"aria-label":"Manage your account"},e.map(e=>u().createElement(Et,{key:e.header,className:kt.TabsTrigger,value:a(e)},e.header))),o?o():e.map((e,t)=>e.body?u().createElement(Tt,{key:`${t}`,className:kt.TabsContent,value:a(e)},e.body):null))};var Pt="Checkbox",[_t,It]=W(Pt),[jt,Mt]=_t(Pt);function Ot(e){const{__scopeCheckbox:t,checked:n,children:r,defaultChecked:o,disabled:a,form:i,name:l,onCheckedChange:c,required:u,value:d="on",internal_do_not_use_render:f}=e,[p,h]=He({prop:n,defaultProp:o??!1,onChange:c,caller:Pt}),[m,v]=s.useState(null),[b,g]=s.useState(null),y=s.useRef(!1),w=!m||!!i||!!m.closest("form"),x={checked:p,disabled:a,setChecked:h,control:m,setControl:v,name:l,form:i,value:d,hasConsumerStoppedPropagationRef:y,required:u,defaultChecked:!Xt(o)&&o,isFormControl:w,bubbleInput:b,setBubbleInput:g};return(0,M.jsx)(jt,{scope:t,...x,children:Wt(f)?f(x):r})}var zt="CheckboxTrigger",Lt=s.forwardRef(({__scopeCheckbox:e,onKeyDown:t,onClick:n,...r},o)=>{const{control:a,value:i,disabled:l,checked:c,required:u,setControl:d,setChecked:f,hasConsumerStoppedPropagationRef:p,isFormControl:h,bubbleInput:m}=Mt(zt,e),v=j(o,d),b=s.useRef(c);return s.useEffect(()=>{const e=a?.form;if(e){const t=()=>f(b.current);return e.addEventListener("reset",t),()=>e.removeEventListener("reset",t)}},[a,f]),(0,M.jsx)(F.button,{type:"button",role:"checkbox","aria-checked":Xt(c)?"mixed":c,"aria-required":u,"data-state":$t(c),"data-disabled":l?"":void 0,disabled:l,value:i,...r,ref:v,onKeyDown:Q(t,e=>{"Enter"===e.key&&e.preventDefault()}),onClick:Q(n,e=>{f(e=>!!Xt(e)||!e),m&&h&&(p.current=e.isPropagationStopped(),p.current||e.stopPropagation())})})});Lt.displayName=zt;var Dt=s.forwardRef((e,t)=>{const{__scopeCheckbox:n,name:r,checked:o,defaultChecked:a,required:i,disabled:l,value:s,onCheckedChange:c,form:u,...d}=e;return(0,M.jsx)(Ot,{__scopeCheckbox:n,checked:o,defaultChecked:a,disabled:l,required:i,onCheckedChange:c,name:r,form:u,value:s,internal_do_not_use_render:({isFormControl:e})=>(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(Lt,{...d,ref:t,__scopeCheckbox:n}),e&&(0,M.jsx)(Ht,{__scopeCheckbox:n})]})})});Dt.displayName=Pt;var Ft="CheckboxIndicator",Bt=s.forwardRef((e,t)=>{const{__scopeCheckbox:n,forceMount:r,...o}=e,a=Mt(Ft,n);return(0,M.jsx)(U,{present:r||Xt(a.checked)||!0===a.checked,children:(0,M.jsx)(F.span,{"data-state":$t(a.checked),"data-disabled":a.disabled?"":void 0,...o,ref:t,style:{pointerEvents:"none",...e.style}})})});Bt.displayName=Ft;var Ut="CheckboxBubbleInput",Ht=s.forwardRef(({__scopeCheckbox:e,...t},n)=>{const{control:r,hasConsumerStoppedPropagationRef:o,checked:a,defaultChecked:i,required:l,disabled:c,name:u,value:d,form:f,bubbleInput:p,setBubbleInput:h}=Mt(Ut,e),m=j(n,h),v=function(e){const t=s.useRef({value:e,previous:e});return s.useMemo(()=>(t.current.value!==e&&(t.current.previous=t.current.value,t.current.value=e),t.current.previous),[e])}(a),b=function(e){const[t,n]=s.useState(void 0);return B(()=>{if(e){n({width:e.offsetWidth,height:e.offsetHeight});const t=new ResizeObserver(t=>{if(!Array.isArray(t))return;if(!t.length)return;const r=t[0];let o,a;if("borderBoxSize"in r){const e=r.borderBoxSize,t=Array.isArray(e)?e[0]:e;o=t.inlineSize,a=t.blockSize}else o=e.offsetWidth,a=e.offsetHeight;n({width:o,height:a})});return t.observe(e,{box:"border-box"}),()=>t.unobserve(e)}n(void 0)},[e]),t}(r);s.useEffect(()=>{const e=p;if(!e)return;const t=window.HTMLInputElement.prototype,n=Object.getOwnPropertyDescriptor(t,"checked").set,r=!o.current;if(v!==a&&n){const t=new Event("click",{bubbles:r});e.indeterminate=Xt(a),n.call(e,!Xt(a)&&a),e.dispatchEvent(t)}},[p,v,a,o]);const g=s.useRef(!Xt(a)&&a);return(0,M.jsx)(F.input,{type:"checkbox","aria-hidden":!0,defaultChecked:i??g.current,required:l,disabled:c,name:u,value:d,form:f,...t,tabIndex:-1,ref:m,style:{...t.style,...b,position:"absolute",pointerEvents:"none",opacity:0,margin:0,transform:"translateX(-100%)"}})});function Wt(e){return"function"==typeof e}function Xt(e){return"indeterminate"===e}function $t(e){return Xt(e)?"indeterminate":e?"checked":"unchecked"}Ht.displayName=Ut;var Kt=["color"],qt=(0,s.forwardRef)(function(e,t){var n=e.color,r=void 0===n?"currentColor":n,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,Kt);return(0,s.createElement)("svg",Object.assign({width:"15",height:"15",viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg"},o,{ref:t}),(0,s.createElement)("path",{d:"M11.4669 3.72684C11.7558 3.91574 11.8369 4.30308 11.648 4.59198L7.39799 11.092C7.29783 11.2452 7.13556 11.3467 6.95402 11.3699C6.77247 11.3931 6.58989 11.3355 6.45446 11.2124L3.70446 8.71241C3.44905 8.48022 3.43023 8.08494 3.66242 7.82953C3.89461 7.57412 4.28989 7.55529 4.5453 7.78749L6.75292 9.79441L10.6018 3.90792C10.7907 3.61902 11.178 3.53795 11.4669 3.72684Z",fill:r,fillRule:"evenodd",clipRule:"evenodd"}))}),Qt=i(706),Vt={};Vt.styleTagTransform=S(),Vt.setAttributes=g(),Vt.insert=v().bind(null,"head"),Vt.domAPI=h(),Vt.insertStyleElement=w(),f()(Qt.A,Vt);var Gt=Qt.A&&Qt.A.locals?Qt.A.locals:void 0;const Yt=({label:e,isChecked:t,onChecked:n})=>u().createElement("form",null,u().createElement("div",{style:{display:"flex",alignItems:"center"}},u().createElement(Dt,{className:Gt.CheckboxRoot,defaultChecked:!0,checked:t,onCheckedChange:n,id:e},u().createElement(Bt,{className:Gt.CheckboxIndicator},u().createElement(qt,null))),u().createElement("label",{className:Gt.Label,htmlFor:e},e)));var Zt=i(301),Jt={};Jt.styleTagTransform=S(),Jt.setAttributes=g(),Jt.insert=v().bind(null,"head"),Jt.domAPI=h(),Jt.insertStyleElement=w(),f()(Zt.A,Jt);var en=Zt.A&&Zt.A.locals?Zt.A.locals:void 0;const tn=({value:e,placeholder:t,onChange:n,type:r="text"})=>u().createElement("input",{type:r,value:e,placeholder:t,onChange:n,className:en.InputWrapper});return l}()});
3
- //# sourceMappingURL=rush-themed-ui.ea8d3da3ae444dbb80deaa8b103d9b1b.js.map
2
+ !function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("react"),require("react-dom"));else if("function"==typeof define&&define.amd)define("@rushstack/rush-themed-ui",["react","react-dom"],t);else{var n="object"==typeof exports?t(require("react"),require("react-dom")):t(e.react,e["react-dom"]);for(var r in n)("object"==typeof exports?exports:e)[r]=n[r]}}(this,function(e,t){return function(){"use strict";var n,r,o={966:function(e,t,n){var r=n(797),o=n.n(r),a=n(446),i=n.n(a)()(o());i.push([e.id,".Xcbor_Pb0v00loQ79vaQ{padding:4px 8px;border:1px solid #107c10;border-radius:2px}.Xcbor_Pb0v00loQ79vaQ:hover{cursor:pointer;background-color:#dff6dd}.Xcbor_Pb0v00loQ79vaQ:disabled{cursor:default;background-color:#fff;color:#666;border-color:#ab9e8e}",""]),i.locals={ButtonWrapper:"Xcbor_Pb0v00loQ79vaQ"},t.A=i},701:function(e,t,n){var r=n(797),o=n.n(r),a=n(446),i=n.n(a)()(o());i.push([e.id,"button{all:unset}.kPGSzfa3vbuphUeBBPZ2{background-color:#fff;width:25px;min-width:25px;height:25px;border-radius:4px;display:flex;align-items:center;justify-content:center;border:1px solid #000;cursor:pointer}.kPGSzfa3vbuphUeBBPZ2:hover{background-color:#dff6dd}.YMoUqB0qcltlZx_BULiD{color:#107c10}.XwHQf6wcWklaq8_1lyYC{padding-left:15px;font-size:15px;line-height:1;-webkit-user-select:none;-moz-user-select:none;user-select:none}",""]),i.locals={CheckboxRoot:"kPGSzfa3vbuphUeBBPZ2",CheckboxIndicator:"YMoUqB0qcltlZx_BULiD",Label:"XwHQf6wcWklaq8_1lyYC"},t.A=i},540:function(e,t,n){var r=n(797),o=n.n(r),a=n(446),i=n.n(a)()(o());i.push([e.id,".G8XdaQkveVtto23FX0oN{border:solid 1px #666;border-radius:4px;padding:.4em}",""]),i.locals={InputWrapper:"G8XdaQkveVtto23FX0oN"},t.A=i},306:function(e,t,n){var r=n(797),o=n.n(r),a=n(446),i=n.n(a)()(o());i.push([e.id,'.EzlHIrxoN7TWEXcBECaV{border-radius:4px;overflow:hidden;--scrollbar-size: 6px;height:100%}.cfK3f0P_sHwmidizCkKo{width:100%;height:100%;border-radius:inherit}.cfK3f0P_sHwmidizCkKo>*{padding-right:8px}.eqDaw9mz7dcZ6Pbl5OgQ{display:flex;-webkit-user-select:none;-moz-user-select:none;user-select:none;touch-action:none;padding:2px;background:#f3f2f1;transition:background 160ms ease-out}.eqDaw9mz7dcZ6Pbl5OgQ:hover{background:#f3f2f1}.eqDaw9mz7dcZ6Pbl5OgQ[data-orientation=vertical]{width:var(--scrollbar-size)}.eqDaw9mz7dcZ6Pbl5OgQ[data-orientation=horizontal]{flex-direction:column;height:var(--scrollbar-size)}.lQ6QXIesn5jzaMsUBreK{flex:1;background:#107c10;border-radius:var(--scrollbar-size);position:relative}.lQ6QXIesn5jzaMsUBreK::before{content:"";position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:100%;height:100%;min-width:44px;min-height:44px}.rubXHPiFB8jL2DAATJpx{background:#f3f2f1}',""]),i.locals={ScrollAreaRoot:"EzlHIrxoN7TWEXcBECaV",ScrollAreaViewport:"cfK3f0P_sHwmidizCkKo",ScrollAreaScrollbar:"eqDaw9mz7dcZ6Pbl5OgQ",ScrollAreaThumb:"lQ6QXIesn5jzaMsUBreK",ScrollAreaCorner:"rubXHPiFB8jL2DAATJpx"},t.A=i},986:function(e,t,n){var r=n(797),o=n.n(r),a=n(446),i=n.n(a)()(o());i.push([e.id,"button,fieldset,input{all:unset}.MkI4RReTctAuQGaVhBNN{display:flex;flex-direction:column;width:100%}.O8NXMrDnUkaO2hndK6XU{flex-shrink:0;display:flex;border-bottom:1px solid #107c10}.LceWGPplzk9w7zfA8BnW{font-family:inherit;padding:0 20px;height:45px;flex:1;display:flex;align-items:center;justify-content:center;font-size:15px;line-height:1;color:#000;-webkit-user-select:none;-moz-user-select:none;user-select:none}.LceWGPplzk9w7zfA8BnW:hover{color:#107c10;cursor:pointer}.LceWGPplzk9w7zfA8BnW[data-state=active]{color:#107c10;box-shadow:inset 0 -1px 0 0 currentColor,0 1px 0 0 currentColor}.LceWGPplzk9w7zfA8BnW:focus{position:relative;box-shadow:0 0 0 2px #107c10}.u3yzNdthceb3vdwa4Z9g{flex-grow:1;padding:12px;border-bottom-left-radius:6px;border-bottom-right-radius:6px;outline:none}.u3yzNdthceb3vdwa4Z9g:focus{box-shadow:0 0 0 2px #000}",""]),i.locals={TabsRoot:"MkI4RReTctAuQGaVhBNN",TabsList:"O8NXMrDnUkaO2hndK6XU",TabsTrigger:"LceWGPplzk9w7zfA8BnW",TabsContent:"u3yzNdthceb3vdwa4Z9g"},t.A=i},223:function(e,t,n){var r=n(797),o=n.n(r),a=n(446),i=n.n(a)()(o());i.push([e.id,'.tum5Llxr5FqXT9j4qKpt{font-weight:bold;line-height:1.2;margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif;font-size:24px}.BjhGDgMytkiuyo7KhcCv{font-weight:bold;line-height:1.2;margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif;font-size:21px}.Kx1ScAbR0Aizkk9aoHEM{font-weight:bold;line-height:1.2;margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif;font-size:19px}.nElic5GIFFhhK0eP49O2{font-weight:bold;line-height:1.2;margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif;font-size:16px}.OLbKQ2TQKbxtP1_BoCC4{font-weight:bold;line-height:1.2;margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif;font-size:14px}.M87snUouSL1JmF2BQJXi{font-weight:bold;line-height:1.2;margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif;font-size:12px}.xSIkXtgkvwTIgstwtpBv{font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif;margin:0;font-weight:normal;line-height:1.5;font-size:14px}.ERJRX5TLRqRK0dy59aFn{font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif;font-size:12px}',""]),i.locals={H1:"tum5Llxr5FqXT9j4qKpt",H2:"BjhGDgMytkiuyo7KhcCv",H3:"Kx1ScAbR0Aizkk9aoHEM",H4:"nElic5GIFFhhK0eP49O2",H5:"OLbKQ2TQKbxtP1_BoCC4",H6:"M87snUouSL1JmF2BQJXi",ParagraphStyles:"xSIkXtgkvwTIgstwtpBv",SpanStyles:"ERJRX5TLRqRK0dy59aFn"},t.A=i},446:function(e){e.exports=function(e){var t=[];return t.toString=function(){return this.map(function(t){var n="",r=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),r&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),r&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n}).join("")},t.i=function(e,n,r,o,a){"string"==typeof e&&(e=[[null,e,void 0]]);var i={};if(r)for(var l=0;l<this.length;l++){var s=this[l][0];null!=s&&(i[s]=!0)}for(var c=0;c<e.length;c++){var u=[].concat(e[c]);r&&i[u[0]]||(void 0!==a&&(void 0===u[5]||(u[1]="@layer".concat(u[5].length>0?" ".concat(u[5]):""," {").concat(u[1],"}")),u[5]=a),n&&(u[2]?(u[1]="@media ".concat(u[2]," {").concat(u[1],"}"),u[2]=n):u[2]=n),o&&(u[4]?(u[1]="@supports (".concat(u[4],") {").concat(u[1],"}"),u[4]=o):u[4]="".concat(o)),t.push(u))}},t}},797:function(e){e.exports=function(e){return e[1]}},405:function(e,t){var n=Symbol.for("react.transitional.element"),r=Symbol.for("react.fragment");function o(e,t,r){var o=null;if(void 0!==r&&(o=""+r),void 0!==t.key&&(o=""+t.key),"key"in t)for(var a in r={},t)"key"!==a&&(r[a]=t[a]);else r=t;return t=r.ref,{$$typeof:n,type:e,key:o,ref:void 0!==t?t:null,props:r}}t.Fragment=r,t.jsx=o,t.jsxs=o},37:function(e,t,n){e.exports=n(405)},626:function(e){var t=[];function n(e){for(var n=-1,r=0;r<t.length;r++)if(t[r].identifier===e){n=r;break}return n}function r(e,r){for(var a={},i=[],l=0;l<e.length;l++){var s=e[l],c=r.base?s[0]+r.base:s[0],u=a[c]||0,d="".concat(c," ").concat(u);a[c]=u+1;var f=n(d),p={css:s[1],media:s[2],sourceMap:s[3],supports:s[4],layer:s[5]};if(-1!==f)t[f].references++,t[f].updater(p);else{var h=o(p,r);r.byIndex=l,t.splice(l,0,{identifier:d,updater:h,references:1})}i.push(d)}return i}function o(e,t){var n=t.domAPI(t);return n.update(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap&&t.supports===e.supports&&t.layer===e.layer)return;n.update(e=t)}else n.remove()}}e.exports=function(e,o){var a=r(e=e||[],o=o||{});return function(e){e=e||[];for(var i=0;i<a.length;i++){var l=n(a[i]);t[l].references--}for(var s=r(e,o),c=0;c<a.length;c++){var u=n(a[c]);0===t[u].references&&(t[u].updater(),t.splice(u,1))}a=s}}},601:function(e){var t={};e.exports=function(e,n){var r=function(e){if(void 0===t[e]){var n=document.querySelector(e);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}t[e]=n}return t[e]}(e);if(!r)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");r.appendChild(n)}},526:function(e){e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},434:function(e,t,n){e.exports=function(e){var t=n.nc;t&&e.setAttribute("nonce",t)}},835:function(e){e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(n){!function(e,t,n){var r="";n.supports&&(r+="@supports (".concat(n.supports,") {")),n.media&&(r+="@media ".concat(n.media," {"));var o=void 0!==n.layer;o&&(r+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),r+=n.css,o&&(r+="}"),n.media&&(r+="}"),n.supports&&(r+="}");var a=n.sourceMap;a&&"undefined"!=typeof btoa&&(r+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(a))))," */")),t.styleTagTransform(r,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},243:function(e){e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},155:function(t){t.exports=e},514:function(e){e.exports=t}},a={};function i(e){var t=a[e];if(void 0!==t)return t.exports;var n=a[e]={id:e,exports:{}};return o[e](n,n.exports,i),n.exports}i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,{a:t}),t},r=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},i.t=function(e,t){if(1&t&&(e=this(e)),8&t)return e;if("object"==typeof e&&e){if(4&t&&e.__esModule)return e;if(16&t&&"function"==typeof e.then)return e}var o=Object.create(null);i.r(o);var a={};n=n||[null,r({}),r([]),r(r)];for(var l=2&t&&e;("object"==typeof l||"function"==typeof l)&&!~n.indexOf(l);l=r(l))Object.getOwnPropertyNames(l).forEach(function(t){a[t]=function(){return e[t]}});return a.default=function(){return e},i.d(o,a),o},i.d=function(e,t){for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.nc=void 0;var l={};i.r(l),i.d(l,{Button:function(){return P},Checkbox:function(){return Yt},Input:function(){return tn},ScrollArea:function(){return Le},Tabs:function(){return Nt},Text:function(){return R}});var s=i(155),c=i.t(s,2),u=i.n(s),d=i(626),f=i.n(d),p=i(835),h=i.n(p),m=i(601),v=i.n(m),b=i(434),g=i.n(b),y=i(526),w=i.n(y),x=i(243),S=i.n(x),C=i(223),E={};E.styleTagTransform=S(),E.setAttributes=g(),E.insert=v().bind(null,"head"),E.domAPI=h(),E.insertStyleElement=w(),f()(C.A,E);var T=C.A&&C.A.locals?C.A.locals:void 0;const R=({type:e,bold:t=!1,children:n,className:r,size:o})=>{const a=Object.assign({fontWeight:t?"bold":"normal"},o?{fontSize:o}:{});switch(e){case"h1":return u().createElement("h1",{className:`${T.H1} ${r||""}`,style:a},n);case"h2":return u().createElement("h2",{className:`${T.H2} ${r||""}`,style:a},n);case"h3":return u().createElement("h3",{className:`${T.H3} ${r||""}`,style:a},n);case"h4":return u().createElement("h4",{className:`${T.H4} ${r||""}`,style:a},n);case"h5":return u().createElement("h5",{className:`${T.H5} ${r||""}`,style:a},n);case"h6":return u().createElement("h6",{className:`${T.H6} ${r||""}`,style:a},n);case"p":default:return u().createElement("p",{className:`${T.ParagraphStyles} ${r||""}`,style:a},n);case"span":return u().createElement("span",{className:`${T.SpanStyles} ${r||""}`,style:a},n)}};var A=i(966),k={};k.styleTagTransform=S(),k.setAttributes=g(),k.insert=v().bind(null,"head"),k.domAPI=h(),k.insertStyleElement=w(),f()(A.A,k);var N=A.A&&A.A.locals?A.A.locals:void 0;const P=({children:e,disabled:t=!1,onClick:n})=>u().createElement("button",{disabled:t,className:N.ButtonWrapper,onClick:n},u().createElement(R,{type:"span",size:14},e));function _(e,t){if("function"==typeof e)return e(t);null!=e&&(e.current=t)}function I(...e){return t=>{let n=!1;const r=e.map(e=>{const r=_(e,t);return n||"function"!=typeof r||(n=!0),r});if(n)return()=>{for(let t=0;t<r.length;t++){const n=r[t];"function"==typeof n?n():_(e[t],null)}}}}function j(...e){return s.useCallback(I(...e),e)}i(514);var M=i(37);function O(e){const t=z(e),n=s.forwardRef((e,n)=>{const{children:r,...o}=e,a=s.Children.toArray(r),i=a.find(D);if(i){const e=i.props.children,r=a.map(t=>t===i?s.Children.count(e)>1?s.Children.only(null):s.isValidElement(e)?e.props.children:null:t);return(0,M.jsx)(t,{...o,ref:n,children:s.isValidElement(e)?s.cloneElement(e,void 0,r):null})}return(0,M.jsx)(t,{...o,ref:n,children:r})});return n.displayName=`${e}.Slot`,n}function z(e){const t=s.forwardRef((e,t)=>{const{children:n,...r}=e;if(s.isValidElement(n)){const e=function(e){let t=Object.getOwnPropertyDescriptor(e.props,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}(n),o=function(e,t){const n={...t};for(const r in t){const o=e[r],a=t[r];/^on[A-Z]/.test(r)?o&&a?n[r]=(...e)=>{const t=a(...e);return o(...e),t}:o&&(n[r]=o):"style"===r?n[r]={...o,...a}:"className"===r&&(n[r]=[o,a].filter(Boolean).join(" "))}return{...e,...n}}(r,n.props);return n.type!==s.Fragment&&(o.ref=t?I(t,e):e),s.cloneElement(n,o)}return s.Children.count(n)>1?s.Children.only(null):null});return t.displayName=`${e}.SlotClone`,t}var L=Symbol("radix.slottable");function D(e){return s.isValidElement(e)&&"function"==typeof e.type&&"__radixId"in e.type&&e.type.__radixId===L}var F=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"].reduce((e,t)=>{const n=O(`Primitive.${t}`),r=s.forwardRef((e,r)=>{const{asChild:o,...a}=e,i=o?n:t;return"undefined"!=typeof window&&(window[Symbol.for("radix-ui")]=!0),(0,M.jsx)(i,{...a,ref:r})});return r.displayName=`Primitive.${t}`,{...e,[t]:r}},{}),B=globalThis?.document?s.useLayoutEffect:()=>{},U=e=>{const{present:t,children:n}=e,r=function(e){const[t,n]=s.useState(),r=s.useRef(null),o=s.useRef(e),a=s.useRef("none"),i=e?"mounted":"unmounted",[l,c]=function(e,t){return s.useReducer((e,n)=>t[e][n]??e,e)}(i,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return s.useEffect(()=>{const e=H(r.current);a.current="mounted"===l?e:"none"},[l]),B(()=>{const t=r.current,n=o.current;if(n!==e){const r=a.current,i=H(t);c(e?"MOUNT":"none"===i||"none"===t?.display?"UNMOUNT":n&&r!==i?"ANIMATION_OUT":"UNMOUNT"),o.current=e}},[e,c]),B(()=>{if(t){let e;const n=t.ownerDocument.defaultView??window,i=a=>{const i=H(r.current).includes(CSS.escape(a.animationName));if(a.target===t&&i&&(c("ANIMATION_END"),!o.current)){const r=t.style.animationFillMode;t.style.animationFillMode="forwards",e=n.setTimeout(()=>{"forwards"===t.style.animationFillMode&&(t.style.animationFillMode=r)})}},l=e=>{e.target===t&&(a.current=H(r.current))};return t.addEventListener("animationstart",l),t.addEventListener("animationcancel",i),t.addEventListener("animationend",i),()=>{n.clearTimeout(e),t.removeEventListener("animationstart",l),t.removeEventListener("animationcancel",i),t.removeEventListener("animationend",i)}}c("ANIMATION_END")},[t,c]),{isPresent:["mounted","unmountSuspended"].includes(l),ref:s.useCallback(e=>{r.current=e?getComputedStyle(e):null,n(e)},[])}}(t),o="function"==typeof n?n({present:r.isPresent}):s.Children.only(n),a=j(r.ref,function(e){let t=Object.getOwnPropertyDescriptor(e.props,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,"ref")?.get,n=t&&"isReactWarning"in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}(o));return"function"==typeof n||r.isPresent?s.cloneElement(o,{ref:a}):null};function H(e){return e?.animationName||"none"}function W(e,t=[]){let n=[];const r=()=>{const t=n.map(e=>s.createContext(e));return function(n){const r=n?.[e]||t;return s.useMemo(()=>({[`__scope${e}`]:{...n,[e]:r}}),[n,r])}};return r.scopeName=e,[function(t,r){const o=s.createContext(r),a=n.length;n=[...n,r];const i=t=>{const{scope:n,children:r,...i}=t,l=n?.[e]?.[a]||o,c=s.useMemo(()=>i,Object.values(i));return(0,M.jsx)(l.Provider,{value:c,children:r})};return i.displayName=t+"Provider",[i,function(n,i){const l=i?.[e]?.[a]||o,c=s.useContext(l);if(c)return c;if(void 0!==r)return r;throw new Error(`\`${n}\` must be used within \`${t}\``)}]},X(r,...t)]}function X(...e){const t=e[0];if(1===e.length)return t;const n=()=>{const n=e.map(e=>({useScope:e(),scopeName:e.scopeName}));return function(e){const r=n.reduce((t,{useScope:n,scopeName:r})=>({...t,...n(e)[`__scope${r}`]}),{});return s.useMemo(()=>({[`__scope${t.scopeName}`]:r}),[r])}};return n.scopeName=t.scopeName,n}function $(e){const t=s.useRef(e);return s.useEffect(()=>{t.current=e}),s.useMemo(()=>(...e)=>t.current?.(...e),[])}U.displayName="Presence";var K=s.createContext(void 0);function q(e){const t=s.useContext(K);return e||t||"ltr"}function Q(e,t,{checkForDefaultPrevented:n=!0}={}){return function(r){if(e?.(r),!1===n||!r.defaultPrevented)return t?.(r)}}"undefined"==typeof window||!window.document||window.document.createElement;var V="ScrollArea",[G,Y]=W(V),[Z,J]=G(V),ee=s.forwardRef((e,t)=>{const{__scopeScrollArea:n,type:r="hover",dir:o,scrollHideDelay:a=600,...i}=e,[l,c]=s.useState(null),[u,d]=s.useState(null),[f,p]=s.useState(null),[h,m]=s.useState(null),[v,b]=s.useState(null),[g,y]=s.useState(0),[w,x]=s.useState(0),[S,C]=s.useState(!1),[E,T]=s.useState(!1),R=j(t,e=>c(e)),A=q(o);return(0,M.jsx)(Z,{scope:n,type:r,dir:A,scrollHideDelay:a,scrollArea:l,viewport:u,onViewportChange:d,content:f,onContentChange:p,scrollbarX:h,onScrollbarXChange:m,scrollbarXEnabled:S,onScrollbarXEnabledChange:C,scrollbarY:v,onScrollbarYChange:b,scrollbarYEnabled:E,onScrollbarYEnabledChange:T,onCornerWidthChange:y,onCornerHeightChange:x,children:(0,M.jsx)(F.div,{dir:A,...i,ref:R,style:{position:"relative","--radix-scroll-area-corner-width":g+"px","--radix-scroll-area-corner-height":w+"px",...e.style}})})});ee.displayName=V;var te="ScrollAreaViewport",ne=s.forwardRef((e,t)=>{const{__scopeScrollArea:n,children:r,nonce:o,...a}=e,i=J(te,n),l=j(t,s.useRef(null),i.onViewportChange);return(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)("style",{dangerouslySetInnerHTML:{__html:"[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}"},nonce:o}),(0,M.jsx)(F.div,{"data-radix-scroll-area-viewport":"",...a,ref:l,style:{overflowX:i.scrollbarXEnabled?"scroll":"hidden",overflowY:i.scrollbarYEnabled?"scroll":"hidden",...e.style},children:(0,M.jsx)("div",{ref:i.onContentChange,style:{minWidth:"100%",display:"table"},children:r})})]})});ne.displayName=te;var re="ScrollAreaScrollbar",oe=s.forwardRef((e,t)=>{const{forceMount:n,...r}=e,o=J(re,e.__scopeScrollArea),{onScrollbarXEnabledChange:a,onScrollbarYEnabledChange:i}=o,l="horizontal"===e.orientation;return s.useEffect(()=>(l?a(!0):i(!0),()=>{l?a(!1):i(!1)}),[l,a,i]),"hover"===o.type?(0,M.jsx)(ae,{...r,ref:t,forceMount:n}):"scroll"===o.type?(0,M.jsx)(ie,{...r,ref:t,forceMount:n}):"auto"===o.type?(0,M.jsx)(le,{...r,ref:t,forceMount:n}):"always"===o.type?(0,M.jsx)(se,{...r,ref:t}):null});oe.displayName=re;var ae=s.forwardRef((e,t)=>{const{forceMount:n,...r}=e,o=J(re,e.__scopeScrollArea),[a,i]=s.useState(!1);return s.useEffect(()=>{const e=o.scrollArea;let t=0;if(e){const n=()=>{window.clearTimeout(t),i(!0)},r=()=>{t=window.setTimeout(()=>i(!1),o.scrollHideDelay)};return e.addEventListener("pointerenter",n),e.addEventListener("pointerleave",r),()=>{window.clearTimeout(t),e.removeEventListener("pointerenter",n),e.removeEventListener("pointerleave",r)}}},[o.scrollArea,o.scrollHideDelay]),(0,M.jsx)(U,{present:n||a,children:(0,M.jsx)(le,{"data-state":a?"visible":"hidden",...r,ref:t})})}),ie=s.forwardRef((e,t)=>{const{forceMount:n,...r}=e,o=J(re,e.__scopeScrollArea),a="horizontal"===e.orientation,i=Ae(()=>c("SCROLL_END"),100),[l,c]=(u={hidden:{SCROLL:"scrolling"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}},s.useReducer((e,t)=>u[e][t]??e,"hidden"));var u;return s.useEffect(()=>{if("idle"===l){const e=window.setTimeout(()=>c("HIDE"),o.scrollHideDelay);return()=>window.clearTimeout(e)}},[l,o.scrollHideDelay,c]),s.useEffect(()=>{const e=o.viewport,t=a?"scrollLeft":"scrollTop";if(e){let n=e[t];const r=()=>{const r=e[t];n!==r&&(c("SCROLL"),i()),n=r};return e.addEventListener("scroll",r),()=>e.removeEventListener("scroll",r)}},[o.viewport,a,c,i]),(0,M.jsx)(U,{present:n||"hidden"!==l,children:(0,M.jsx)(se,{"data-state":"hidden"===l?"hidden":"visible",...r,ref:t,onPointerEnter:Q(e.onPointerEnter,()=>c("POINTER_ENTER")),onPointerLeave:Q(e.onPointerLeave,()=>c("POINTER_LEAVE"))})})}),le=s.forwardRef((e,t)=>{const n=J(re,e.__scopeScrollArea),{forceMount:r,...o}=e,[a,i]=s.useState(!1),l="horizontal"===e.orientation,c=Ae(()=>{if(n.viewport){const e=n.viewport.offsetWidth<n.viewport.scrollWidth,t=n.viewport.offsetHeight<n.viewport.scrollHeight;i(l?e:t)}},10);return ke(n.viewport,c),ke(n.content,c),(0,M.jsx)(U,{present:r||a,children:(0,M.jsx)(se,{"data-state":a?"visible":"hidden",...o,ref:t})})}),se=s.forwardRef((e,t)=>{const{orientation:n="vertical",...r}=e,o=J(re,e.__scopeScrollArea),a=s.useRef(null),i=s.useRef(0),[l,c]=s.useState({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),u=xe(l.viewport,l.content),d={...r,sizes:l,onSizesChange:c,hasThumb:Boolean(u>0&&u<1),onThumbChange:e=>a.current=e,onThumbPointerUp:()=>i.current=0,onThumbPointerDown:e=>i.current=e};function f(e,t){return function(e,t,n,r="ltr"){const o=Se(n),a=t||o/2,i=o-a,l=n.scrollbar.paddingStart+a,s=n.scrollbar.size-n.scrollbar.paddingEnd-i,c=n.content-n.viewport;return Ee([l,s],"ltr"===r?[0,c]:[-1*c,0])(e)}(e,i.current,l,t)}return"horizontal"===n?(0,M.jsx)(ce,{...d,ref:t,onThumbPositionChange:()=>{if(o.viewport&&a.current){const e=Ce(o.viewport.scrollLeft,l,o.dir);a.current.style.transform=`translate3d(${e}px, 0, 0)`}},onWheelScroll:e=>{o.viewport&&(o.viewport.scrollLeft=e)},onDragScroll:e=>{o.viewport&&(o.viewport.scrollLeft=f(e,o.dir))}}):"vertical"===n?(0,M.jsx)(ue,{...d,ref:t,onThumbPositionChange:()=>{if(o.viewport&&a.current){const e=Ce(o.viewport.scrollTop,l);a.current.style.transform=`translate3d(0, ${e}px, 0)`}},onWheelScroll:e=>{o.viewport&&(o.viewport.scrollTop=e)},onDragScroll:e=>{o.viewport&&(o.viewport.scrollTop=f(e))}}):null}),ce=s.forwardRef((e,t)=>{const{sizes:n,onSizesChange:r,...o}=e,a=J(re,e.__scopeScrollArea),[i,l]=s.useState(),c=s.useRef(null),u=j(t,c,a.onScrollbarXChange);return s.useEffect(()=>{c.current&&l(getComputedStyle(c.current))},[c]),(0,M.jsx)(pe,{"data-orientation":"horizontal",...o,ref:u,sizes:n,style:{bottom:0,left:"rtl"===a.dir?"var(--radix-scroll-area-corner-width)":0,right:"ltr"===a.dir?"var(--radix-scroll-area-corner-width)":0,"--radix-scroll-area-thumb-width":Se(n)+"px",...e.style},onThumbPointerDown:t=>e.onThumbPointerDown(t.x),onDragScroll:t=>e.onDragScroll(t.x),onWheelScroll:(t,n)=>{if(a.viewport){const r=a.viewport.scrollLeft+t.deltaX;e.onWheelScroll(r),Te(r,n)&&t.preventDefault()}},onResize:()=>{c.current&&a.viewport&&i&&r({content:a.viewport.scrollWidth,viewport:a.viewport.offsetWidth,scrollbar:{size:c.current.clientWidth,paddingStart:we(i.paddingLeft),paddingEnd:we(i.paddingRight)}})}})}),ue=s.forwardRef((e,t)=>{const{sizes:n,onSizesChange:r,...o}=e,a=J(re,e.__scopeScrollArea),[i,l]=s.useState(),c=s.useRef(null),u=j(t,c,a.onScrollbarYChange);return s.useEffect(()=>{c.current&&l(getComputedStyle(c.current))},[c]),(0,M.jsx)(pe,{"data-orientation":"vertical",...o,ref:u,sizes:n,style:{top:0,right:"ltr"===a.dir?0:void 0,left:"rtl"===a.dir?0:void 0,bottom:"var(--radix-scroll-area-corner-height)","--radix-scroll-area-thumb-height":Se(n)+"px",...e.style},onThumbPointerDown:t=>e.onThumbPointerDown(t.y),onDragScroll:t=>e.onDragScroll(t.y),onWheelScroll:(t,n)=>{if(a.viewport){const r=a.viewport.scrollTop+t.deltaY;e.onWheelScroll(r),Te(r,n)&&t.preventDefault()}},onResize:()=>{c.current&&a.viewport&&i&&r({content:a.viewport.scrollHeight,viewport:a.viewport.offsetHeight,scrollbar:{size:c.current.clientHeight,paddingStart:we(i.paddingTop),paddingEnd:we(i.paddingBottom)}})}})}),[de,fe]=G(re),pe=s.forwardRef((e,t)=>{const{__scopeScrollArea:n,sizes:r,hasThumb:o,onThumbChange:a,onThumbPointerUp:i,onThumbPointerDown:l,onThumbPositionChange:c,onDragScroll:u,onWheelScroll:d,onResize:f,...p}=e,h=J(re,n),[m,v]=s.useState(null),b=j(t,e=>v(e)),g=s.useRef(null),y=s.useRef(""),w=h.viewport,x=r.content-r.viewport,S=$(d),C=$(c),E=Ae(f,10);function T(e){if(g.current){const t=e.clientX-g.current.left,n=e.clientY-g.current.top;u({x:t,y:n})}}return s.useEffect(()=>{const e=e=>{const t=e.target,n=m?.contains(t);n&&S(e,x)};return document.addEventListener("wheel",e,{passive:!1}),()=>document.removeEventListener("wheel",e,{passive:!1})},[w,m,x,S]),s.useEffect(C,[r,C]),ke(m,E),ke(h.content,E),(0,M.jsx)(de,{scope:n,scrollbar:m,hasThumb:o,onThumbChange:$(a),onThumbPointerUp:$(i),onThumbPositionChange:C,onThumbPointerDown:$(l),children:(0,M.jsx)(F.div,{...p,ref:b,style:{position:"absolute",...p.style},onPointerDown:Q(e.onPointerDown,e=>{0===e.button&&(e.target.setPointerCapture(e.pointerId),g.current=m.getBoundingClientRect(),y.current=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect="none",h.viewport&&(h.viewport.style.scrollBehavior="auto"),T(e))}),onPointerMove:Q(e.onPointerMove,T),onPointerUp:Q(e.onPointerUp,e=>{const t=e.target;t.hasPointerCapture(e.pointerId)&&t.releasePointerCapture(e.pointerId),document.body.style.webkitUserSelect=y.current,h.viewport&&(h.viewport.style.scrollBehavior=""),g.current=null})})})}),he="ScrollAreaThumb",me=s.forwardRef((e,t)=>{const{forceMount:n,...r}=e,o=fe(he,e.__scopeScrollArea);return(0,M.jsx)(U,{present:n||o.hasThumb,children:(0,M.jsx)(ve,{ref:t,...r})})}),ve=s.forwardRef((e,t)=>{const{__scopeScrollArea:n,style:r,...o}=e,a=J(he,n),i=fe(he,n),{onThumbPositionChange:l}=i,c=j(t,e=>i.onThumbChange(e)),u=s.useRef(void 0),d=Ae(()=>{u.current&&(u.current(),u.current=void 0)},100);return s.useEffect(()=>{const e=a.viewport;if(e){const t=()=>{if(d(),!u.current){const t=Re(e,l);u.current=t,l()}};return l(),e.addEventListener("scroll",t),()=>e.removeEventListener("scroll",t)}},[a.viewport,d,l]),(0,M.jsx)(F.div,{"data-state":i.hasThumb?"visible":"hidden",...o,ref:c,style:{width:"var(--radix-scroll-area-thumb-width)",height:"var(--radix-scroll-area-thumb-height)",...r},onPointerDownCapture:Q(e.onPointerDownCapture,e=>{const t=e.target.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top;i.onThumbPointerDown({x:n,y:r})}),onPointerUp:Q(e.onPointerUp,i.onThumbPointerUp)})});me.displayName=he;var be="ScrollAreaCorner",ge=s.forwardRef((e,t)=>{const n=J(be,e.__scopeScrollArea),r=Boolean(n.scrollbarX&&n.scrollbarY);return"scroll"!==n.type&&r?(0,M.jsx)(ye,{...e,ref:t}):null});ge.displayName=be;var ye=s.forwardRef((e,t)=>{const{__scopeScrollArea:n,...r}=e,o=J(be,n),[a,i]=s.useState(0),[l,c]=s.useState(0),u=Boolean(a&&l);return ke(o.scrollbarX,()=>{const e=o.scrollbarX?.offsetHeight||0;o.onCornerHeightChange(e),c(e)}),ke(o.scrollbarY,()=>{const e=o.scrollbarY?.offsetWidth||0;o.onCornerWidthChange(e),i(e)}),u?(0,M.jsx)(F.div,{...r,ref:t,style:{width:a,height:l,position:"absolute",right:"ltr"===o.dir?0:void 0,left:"rtl"===o.dir?0:void 0,bottom:0,...e.style}}):null});function we(e){return e?parseInt(e,10):0}function xe(e,t){const n=e/t;return isNaN(n)?0:n}function Se(e){const t=xe(e.viewport,e.content),n=e.scrollbar.paddingStart+e.scrollbar.paddingEnd,r=(e.scrollbar.size-n)*t;return Math.max(r,18)}function Ce(e,t,n="ltr"){const r=Se(t),o=t.scrollbar.paddingStart+t.scrollbar.paddingEnd,a=t.scrollbar.size-o,i=t.content-t.viewport,l=a-r,s=function(e,[t,n]){return Math.min(n,Math.max(t,e))}(e,"ltr"===n?[0,i]:[-1*i,0]);return Ee([0,i],[0,l])(s)}function Ee(e,t){return n=>{if(e[0]===e[1]||t[0]===t[1])return t[0];const r=(t[1]-t[0])/(e[1]-e[0]);return t[0]+r*(n-e[0])}}function Te(e,t){return e>0&&e<t}var Re=(e,t=()=>{})=>{let n={left:e.scrollLeft,top:e.scrollTop},r=0;return function o(){const a={left:e.scrollLeft,top:e.scrollTop},i=n.left!==a.left,l=n.top!==a.top;(i||l)&&t(),n=a,r=window.requestAnimationFrame(o)}(),()=>window.cancelAnimationFrame(r)};function Ae(e,t){const n=$(e),r=s.useRef(0);return s.useEffect(()=>()=>window.clearTimeout(r.current),[]),s.useCallback(()=>{window.clearTimeout(r.current),r.current=window.setTimeout(n,t)},[n,t])}function ke(e,t){const n=$(t);B(()=>{let t=0;if(e){const r=new ResizeObserver(()=>{cancelAnimationFrame(t),t=window.requestAnimationFrame(n)});return r.observe(e),()=>{window.cancelAnimationFrame(t),r.unobserve(e)}}},[e,n])}var Ne=ee,Pe=ne,_e=oe,Ie=me,je=ge,Me=i(306),Oe={};Oe.styleTagTransform=S(),Oe.setAttributes=g(),Oe.insert=v().bind(null,"head"),Oe.domAPI=h(),Oe.insertStyleElement=w(),f()(Me.A,Oe);var ze=Me.A&&Me.A.locals?Me.A.locals:void 0;const Le=({children:e})=>u().createElement(Ne,{className:ze.ScrollAreaRoot},u().createElement(Pe,{className:ze.ScrollAreaViewport},e),u().createElement(_e,{className:ze.ScrollAreaScrollbar,orientation:"vertical"},u().createElement(Ie,{className:ze.ScrollAreaThumb})),u().createElement(_e,{className:ze.ScrollAreaScrollbar,orientation:"horizontal"},u().createElement(Ie,{className:ze.ScrollAreaThumb})),u().createElement(je,{className:ze.ScrollAreaCorner}));Map;var De=c[" useId ".trim().toString()]||(()=>{}),Fe=0;function Be(e){const[t,n]=s.useState(De());return B(()=>{e||n(e=>e??String(Fe++))},[e]),e||(t?`radix-${t}`:"")}var Ue=c[" useInsertionEffect ".trim().toString()]||B;function He({prop:e,defaultProp:t,onChange:n=()=>{},caller:r}){const[o,a,i]=function({defaultProp:e,onChange:t}){const[n,r]=s.useState(e),o=s.useRef(n),a=s.useRef(t);return Ue(()=>{a.current=t},[t]),s.useEffect(()=>{o.current!==n&&(a.current?.(n),o.current=n)},[n,o]),[n,r,a]}({defaultProp:t,onChange:n}),l=void 0!==e,c=l?e:o;{const t=s.useRef(void 0!==e);s.useEffect(()=>{const e=t.current;if(e!==l){const t=e?"controlled":"uncontrolled",n=l?"controlled":"uncontrolled";console.warn(`${r} is changing from ${t} to ${n}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`)}t.current=l},[l,r])}const u=s.useCallback(t=>{if(l){const n=function(e){return"function"==typeof e}(t)?t(e):t;n!==e&&i.current?.(n)}else a(t)},[l,e,a,i]);return[c,u]}Symbol("RADIX:SYNC_STATE");var We="rovingFocusGroup.onEntryFocus",Xe={bubbles:!1,cancelable:!0},$e="RovingFocusGroup",[Ke,qe,Qe]=function(e){const t=e+"CollectionProvider",[n,r]=W(t),[o,a]=n(t,{collectionRef:{current:null},itemMap:new Map}),i=e=>{const{scope:t,children:n}=e,r=s.useRef(null),a=s.useRef(new Map).current;return(0,M.jsx)(o,{scope:t,itemMap:a,collectionRef:r,children:n})};i.displayName=t;const l=e+"CollectionSlot",c=O(l),u=s.forwardRef((e,t)=>{const{scope:n,children:r}=e,o=j(t,a(l,n).collectionRef);return(0,M.jsx)(c,{ref:o,children:r})});u.displayName=l;const d=e+"CollectionItemSlot",f="data-radix-collection-item",p=O(d),h=s.forwardRef((e,t)=>{const{scope:n,children:r,...o}=e,i=s.useRef(null),l=j(t,i),c=a(d,n);return s.useEffect(()=>(c.itemMap.set(i,{ref:i,...o}),()=>{c.itemMap.delete(i)})),(0,M.jsx)(p,{[f]:"",ref:l,children:r})});return h.displayName=d,[{Provider:i,Slot:u,ItemSlot:h},function(t){const n=a(e+"CollectionConsumer",t);return s.useCallback(()=>{const e=n.collectionRef.current;if(!e)return[];const t=Array.from(e.querySelectorAll(`[${f}]`));return Array.from(n.itemMap.values()).sort((e,n)=>t.indexOf(e.ref.current)-t.indexOf(n.ref.current))},[n.collectionRef,n.itemMap])},r]}($e),[Ve,Ge]=W($e,[Qe]),[Ye,Ze]=Ve($e),Je=s.forwardRef((e,t)=>(0,M.jsx)(Ke.Provider,{scope:e.__scopeRovingFocusGroup,children:(0,M.jsx)(Ke.Slot,{scope:e.__scopeRovingFocusGroup,children:(0,M.jsx)(et,{...e,ref:t})})}));Je.displayName=$e;var et=s.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:n,orientation:r,loop:o=!1,dir:a,currentTabStopId:i,defaultCurrentTabStopId:l,onCurrentTabStopIdChange:c,onEntryFocus:u,preventScrollOnEntryFocus:d=!1,...f}=e,p=s.useRef(null),h=j(t,p),m=q(a),[v,b]=He({prop:i,defaultProp:l??null,onChange:c,caller:$e}),[g,y]=s.useState(!1),w=$(u),x=qe(n),S=s.useRef(!1),[C,E]=s.useState(0);return s.useEffect(()=>{const e=p.current;if(e)return e.addEventListener(We,w),()=>e.removeEventListener(We,w)},[w]),(0,M.jsx)(Ye,{scope:n,orientation:r,dir:m,loop:o,currentTabStopId:v,onItemFocus:s.useCallback(e=>b(e),[b]),onItemShiftTab:s.useCallback(()=>y(!0),[]),onFocusableItemAdd:s.useCallback(()=>E(e=>e+1),[]),onFocusableItemRemove:s.useCallback(()=>E(e=>e-1),[]),children:(0,M.jsx)(F.div,{tabIndex:g||0===C?-1:0,"data-orientation":r,...f,ref:h,style:{outline:"none",...e.style},onMouseDown:Q(e.onMouseDown,()=>{S.current=!0}),onFocus:Q(e.onFocus,e=>{const t=!S.current;if(e.target===e.currentTarget&&t&&!g){const t=new CustomEvent(We,Xe);if(e.currentTarget.dispatchEvent(t),!t.defaultPrevented){const e=x().filter(e=>e.focusable);ot([e.find(e=>e.active),e.find(e=>e.id===v),...e].filter(Boolean).map(e=>e.ref.current),d)}}S.current=!1}),onBlur:Q(e.onBlur,()=>y(!1))})})}),tt="RovingFocusGroupItem",nt=s.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:n,focusable:r=!0,active:o=!1,tabStopId:a,children:i,...l}=e,c=Be(),u=a||c,d=Ze(tt,n),f=d.currentTabStopId===u,p=qe(n),{onFocusableItemAdd:h,onFocusableItemRemove:m,currentTabStopId:v}=d;return s.useEffect(()=>{if(r)return h(),()=>m()},[r,h,m]),(0,M.jsx)(Ke.ItemSlot,{scope:n,id:u,focusable:r,active:o,children:(0,M.jsx)(F.span,{tabIndex:f?0:-1,"data-orientation":d.orientation,...l,ref:t,onMouseDown:Q(e.onMouseDown,e=>{r?d.onItemFocus(u):e.preventDefault()}),onFocus:Q(e.onFocus,()=>d.onItemFocus(u)),onKeyDown:Q(e.onKeyDown,e=>{if("Tab"===e.key&&e.shiftKey)return void d.onItemShiftTab();if(e.target!==e.currentTarget)return;const t=function(e,t,n){const r=function(e,t){return"rtl"!==t?e:"ArrowLeft"===e?"ArrowRight":"ArrowRight"===e?"ArrowLeft":e}(e.key,n);return"vertical"===t&&["ArrowLeft","ArrowRight"].includes(r)||"horizontal"===t&&["ArrowUp","ArrowDown"].includes(r)?void 0:rt[r]}(e,d.orientation,d.dir);if(void 0!==t){if(e.metaKey||e.ctrlKey||e.altKey||e.shiftKey)return;e.preventDefault();let o=p().filter(e=>e.focusable).map(e=>e.ref.current);if("last"===t)o.reverse();else if("prev"===t||"next"===t){"prev"===t&&o.reverse();const a=o.indexOf(e.currentTarget);o=d.loop?(r=a+1,(n=o).map((e,t)=>n[(r+t)%n.length])):o.slice(a+1)}setTimeout(()=>ot(o))}var n,r}),children:"function"==typeof i?i({isCurrentTabStop:f,hasTabStop:null!=v}):i})})});nt.displayName=tt;var rt={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function ot(e,t=!1){const n=document.activeElement;for(const r of e){if(r===n)return;if(r.focus({preventScroll:t}),document.activeElement!==n)return}}var at=Je,it=nt,lt="Tabs",[st,ct]=W(lt,[Ge]),ut=Ge(),[dt,ft]=st(lt),pt=s.forwardRef((e,t)=>{const{__scopeTabs:n,value:r,onValueChange:o,defaultValue:a,orientation:i="horizontal",dir:l,activationMode:s="automatic",...c}=e,u=q(l),[d,f]=He({prop:r,onChange:o,defaultProp:a??"",caller:lt});return(0,M.jsx)(dt,{scope:n,baseId:Be(),value:d,onValueChange:f,orientation:i,dir:u,activationMode:s,children:(0,M.jsx)(F.div,{dir:u,"data-orientation":i,...c,ref:t})})});pt.displayName=lt;var ht="TabsList",mt=s.forwardRef((e,t)=>{const{__scopeTabs:n,loop:r=!0,...o}=e,a=ft(ht,n),i=ut(n);return(0,M.jsx)(at,{asChild:!0,...i,orientation:a.orientation,dir:a.dir,loop:r,children:(0,M.jsx)(F.div,{role:"tablist","aria-orientation":a.orientation,...o,ref:t})})});mt.displayName=ht;var vt="TabsTrigger",bt=s.forwardRef((e,t)=>{const{__scopeTabs:n,value:r,disabled:o=!1,...a}=e,i=ft(vt,n),l=ut(n),s=wt(i.baseId,r),c=xt(i.baseId,r),u=r===i.value;return(0,M.jsx)(it,{asChild:!0,...l,focusable:!o,active:u,children:(0,M.jsx)(F.button,{type:"button",role:"tab","aria-selected":u,"aria-controls":c,"data-state":u?"active":"inactive","data-disabled":o?"":void 0,disabled:o,id:s,...a,ref:t,onMouseDown:Q(e.onMouseDown,e=>{o||0!==e.button||!1!==e.ctrlKey?e.preventDefault():i.onValueChange(r)}),onKeyDown:Q(e.onKeyDown,e=>{[" ","Enter"].includes(e.key)&&i.onValueChange(r)}),onFocus:Q(e.onFocus,()=>{const e="manual"!==i.activationMode;u||o||!e||i.onValueChange(r)})})})});bt.displayName=vt;var gt="TabsContent",yt=s.forwardRef((e,t)=>{const{__scopeTabs:n,value:r,forceMount:o,children:a,...i}=e,l=ft(gt,n),c=wt(l.baseId,r),u=xt(l.baseId,r),d=r===l.value,f=s.useRef(d);return s.useEffect(()=>{const e=requestAnimationFrame(()=>f.current=!1);return()=>cancelAnimationFrame(e)},[]),(0,M.jsx)(U,{present:o||d,children:({present:n})=>(0,M.jsx)(F.div,{"data-state":d?"active":"inactive","data-orientation":l.orientation,role:"tabpanel","aria-labelledby":c,hidden:!n,id:u,tabIndex:0,...i,ref:t,style:{...e.style,animationDuration:f.current?"0s":void 0},children:n&&a})})});function wt(e,t){return`${e}-trigger-${t}`}function xt(e,t){return`${e}-content-${t}`}yt.displayName=gt;var St=pt,Ct=mt,Et=bt,Tt=yt,Rt=i(986),At={};At.styleTagTransform=S(),At.setAttributes=g(),At.insert=v().bind(null,"head"),At.domAPI=h(),At.insertStyleElement=w(),f()(Rt.A,At);var kt=Rt.A&&Rt.A.locals?Rt.A.locals:void 0;const Nt=({items:e,def:t,value:n,onChange:r,renderChildren:o})=>{const a=e=>void 0===e.value?e.header:e.value;return u().createElement(St,{className:kt.TabsRoot,defaultValue:t||e[0].header,value:n,onValueChange:r},u().createElement(Ct,{className:kt.TabsList,"aria-label":"Manage your account"},e.map(e=>u().createElement(Et,{key:e.header,className:kt.TabsTrigger,value:a(e)},e.header))),o?o():e.map((e,t)=>e.body?u().createElement(Tt,{key:`${t}`,className:kt.TabsContent,value:a(e)},e.body):null))};var Pt="Checkbox",[_t,It]=W(Pt),[jt,Mt]=_t(Pt);function Ot(e){const{__scopeCheckbox:t,checked:n,children:r,defaultChecked:o,disabled:a,form:i,name:l,onCheckedChange:c,required:u,value:d="on",internal_do_not_use_render:f}=e,[p,h]=He({prop:n,defaultProp:o??!1,onChange:c,caller:Pt}),[m,v]=s.useState(null),[b,g]=s.useState(null),y=s.useRef(!1),w=!m||!!i||!!m.closest("form"),x={checked:p,disabled:a,setChecked:h,control:m,setControl:v,name:l,form:i,value:d,hasConsumerStoppedPropagationRef:y,required:u,defaultChecked:!Xt(o)&&o,isFormControl:w,bubbleInput:b,setBubbleInput:g};return(0,M.jsx)(jt,{scope:t,...x,children:Wt(f)?f(x):r})}var zt="CheckboxTrigger",Lt=s.forwardRef(({__scopeCheckbox:e,onKeyDown:t,onClick:n,...r},o)=>{const{control:a,value:i,disabled:l,checked:c,required:u,setControl:d,setChecked:f,hasConsumerStoppedPropagationRef:p,isFormControl:h,bubbleInput:m}=Mt(zt,e),v=j(o,d),b=s.useRef(c);return s.useEffect(()=>{const e=a?.form;if(e){const t=()=>f(b.current);return e.addEventListener("reset",t),()=>e.removeEventListener("reset",t)}},[a,f]),(0,M.jsx)(F.button,{type:"button",role:"checkbox","aria-checked":Xt(c)?"mixed":c,"aria-required":u,"data-state":$t(c),"data-disabled":l?"":void 0,disabled:l,value:i,...r,ref:v,onKeyDown:Q(t,e=>{"Enter"===e.key&&e.preventDefault()}),onClick:Q(n,e=>{f(e=>!!Xt(e)||!e),m&&h&&(p.current=e.isPropagationStopped(),p.current||e.stopPropagation())})})});Lt.displayName=zt;var Dt=s.forwardRef((e,t)=>{const{__scopeCheckbox:n,name:r,checked:o,defaultChecked:a,required:i,disabled:l,value:s,onCheckedChange:c,form:u,...d}=e;return(0,M.jsx)(Ot,{__scopeCheckbox:n,checked:o,defaultChecked:a,disabled:l,required:i,onCheckedChange:c,name:r,form:u,value:s,internal_do_not_use_render:({isFormControl:e})=>(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(Lt,{...d,ref:t,__scopeCheckbox:n}),e&&(0,M.jsx)(Ht,{__scopeCheckbox:n})]})})});Dt.displayName=Pt;var Ft="CheckboxIndicator",Bt=s.forwardRef((e,t)=>{const{__scopeCheckbox:n,forceMount:r,...o}=e,a=Mt(Ft,n);return(0,M.jsx)(U,{present:r||Xt(a.checked)||!0===a.checked,children:(0,M.jsx)(F.span,{"data-state":$t(a.checked),"data-disabled":a.disabled?"":void 0,...o,ref:t,style:{pointerEvents:"none",...e.style}})})});Bt.displayName=Ft;var Ut="CheckboxBubbleInput",Ht=s.forwardRef(({__scopeCheckbox:e,...t},n)=>{const{control:r,hasConsumerStoppedPropagationRef:o,checked:a,defaultChecked:i,required:l,disabled:c,name:u,value:d,form:f,bubbleInput:p,setBubbleInput:h}=Mt(Ut,e),m=j(n,h),v=function(e){const t=s.useRef({value:e,previous:e});return s.useMemo(()=>(t.current.value!==e&&(t.current.previous=t.current.value,t.current.value=e),t.current.previous),[e])}(a),b=function(e){const[t,n]=s.useState(void 0);return B(()=>{if(e){n({width:e.offsetWidth,height:e.offsetHeight});const t=new ResizeObserver(t=>{if(!Array.isArray(t))return;if(!t.length)return;const r=t[0];let o,a;if("borderBoxSize"in r){const e=r.borderBoxSize,t=Array.isArray(e)?e[0]:e;o=t.inlineSize,a=t.blockSize}else o=e.offsetWidth,a=e.offsetHeight;n({width:o,height:a})});return t.observe(e,{box:"border-box"}),()=>t.unobserve(e)}n(void 0)},[e]),t}(r);s.useEffect(()=>{const e=p;if(!e)return;const t=window.HTMLInputElement.prototype,n=Object.getOwnPropertyDescriptor(t,"checked").set,r=!o.current;if(v!==a&&n){const t=new Event("click",{bubbles:r});e.indeterminate=Xt(a),n.call(e,!Xt(a)&&a),e.dispatchEvent(t)}},[p,v,a,o]);const g=s.useRef(!Xt(a)&&a);return(0,M.jsx)(F.input,{type:"checkbox","aria-hidden":!0,defaultChecked:i??g.current,required:l,disabled:c,name:u,value:d,form:f,...t,tabIndex:-1,ref:m,style:{...t.style,...b,position:"absolute",pointerEvents:"none",opacity:0,margin:0,transform:"translateX(-100%)"}})});function Wt(e){return"function"==typeof e}function Xt(e){return"indeterminate"===e}function $t(e){return Xt(e)?"indeterminate":e?"checked":"unchecked"}Ht.displayName=Ut;var Kt=["color"],qt=(0,s.forwardRef)(function(e,t){var n=e.color,r=void 0===n?"currentColor":n,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,Kt);return(0,s.createElement)("svg",Object.assign({width:"15",height:"15",viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg"},o,{ref:t}),(0,s.createElement)("path",{d:"M11.4669 3.72684C11.7558 3.91574 11.8369 4.30308 11.648 4.59198L7.39799 11.092C7.29783 11.2452 7.13556 11.3467 6.95402 11.3699C6.77247 11.3931 6.58989 11.3355 6.45446 11.2124L3.70446 8.71241C3.44905 8.48022 3.43023 8.08494 3.66242 7.82953C3.89461 7.57412 4.28989 7.55529 4.5453 7.78749L6.75292 9.79441L10.6018 3.90792C10.7907 3.61902 11.178 3.53795 11.4669 3.72684Z",fill:r,fillRule:"evenodd",clipRule:"evenodd"}))}),Qt=i(701),Vt={};Vt.styleTagTransform=S(),Vt.setAttributes=g(),Vt.insert=v().bind(null,"head"),Vt.domAPI=h(),Vt.insertStyleElement=w(),f()(Qt.A,Vt);var Gt=Qt.A&&Qt.A.locals?Qt.A.locals:void 0;const Yt=({label:e,isChecked:t,onChecked:n})=>u().createElement("form",null,u().createElement("div",{style:{display:"flex",alignItems:"center"}},u().createElement(Dt,{className:Gt.CheckboxRoot,defaultChecked:!0,checked:t,onCheckedChange:n,id:e},u().createElement(Bt,{className:Gt.CheckboxIndicator},u().createElement(qt,null))),u().createElement("label",{className:Gt.Label,htmlFor:e},e)));var Zt=i(540),Jt={};Jt.styleTagTransform=S(),Jt.setAttributes=g(),Jt.insert=v().bind(null,"head"),Jt.domAPI=h(),Jt.insertStyleElement=w(),f()(Zt.A,Jt);var en=Zt.A&&Zt.A.locals?Zt.A.locals:void 0;const tn=({value:e,placeholder:t,onChange:n,type:r="text"})=>u().createElement("input",{type:r,value:e,placeholder:t,onChange:n,className:en.InputWrapper});return l}()});
3
+ //# sourceMappingURL=rush-themed-ui.71ef3839f8cba5ff651eb809d840d202.js.map
@@ -44,7 +44,6 @@ const path = __importStar(require("node:path"));
44
44
  const express_1 = __importDefault(require("express"));
45
45
  const js_yaml_1 = __importDefault(require("js-yaml"));
46
46
  const cors_1 = __importDefault(require("cors"));
47
- const update_notifier_1 = __importDefault(require("update-notifier"));
48
47
  const node_core_library_1 = require("@rushstack/node-core-library");
49
48
  const terminal_1 = require("@rushstack/terminal");
50
49
  const ts_command_line_1 = require("@rushstack/ts-command-line");
@@ -53,9 +52,17 @@ const lockfilePath = __importStar(require("../../graph/lockfilePath"));
53
52
  const init_1 = require("../../utils/init");
54
53
  const PnpmfileRunner_1 = require("../../graph/PnpmfileRunner");
55
54
  const lfxGraphLoader = __importStar(require("../../graph/lfxGraphLoader"));
55
+ const constants_1 = require("../../utils/constants");
56
+ const PackageUpdateChecker_1 = require("../../utils/PackageUpdateChecker");
56
57
  const EXPLORER_TOOL_FILENAME = 'lockfile-explorer';
58
+ function printUpdateNotification(result, terminal) {
59
+ if (result === null || result === void 0 ? void 0 : result.isOutdated) {
60
+ terminal.writeLine(terminal_1.Colorize.yellow(`\nUpdate available: ${constants_1.LFX_VERSION} → ${result.latestVersion}\n` +
61
+ `Run: npm install -g ${constants_1.LFX_PACKAGE_NAME}\n`));
62
+ }
63
+ }
57
64
  class ExplorerCommandLineParser extends ts_command_line_1.CommandLineParser {
58
- constructor() {
65
+ constructor(terminal) {
59
66
  super({
60
67
  toolFilename: EXPLORER_TOOL_FILENAME,
61
68
  toolDescription: 'Lockfile Explorer is a desktop app for investigating and solving version conflicts in a PNPM workspace.'
@@ -71,35 +78,29 @@ class ExplorerCommandLineParser extends ts_command_line_1.CommandLineParser {
71
78
  description: 'Specifies an individual Rush subspace to check.',
72
79
  defaultValue: 'default'
73
80
  });
74
- this._terminalProvider = new terminal_1.ConsoleTerminalProvider();
75
- this.globalTerminal = new terminal_1.Terminal(this._terminalProvider);
81
+ this.globalTerminal = terminal;
76
82
  }
77
83
  get isDebug() {
78
84
  return this._debugParameter.value;
79
85
  }
80
86
  async onExecuteAsync() {
81
- const lockfileExplorerProjectRoot = node_core_library_1.PackageJsonLookup.instance.tryGetPackageFolderFor(__dirname);
82
- const lockfileExplorerPackageJson = node_core_library_1.JsonFile.load(`${lockfileExplorerProjectRoot}/package.json`);
83
- const appVersion = lockfileExplorerPackageJson.version;
84
- this.globalTerminal.writeLine(terminal_1.Colorize.bold(`\nRush Lockfile Explorer ${appVersion}`) +
87
+ const terminal = this.globalTerminal;
88
+ terminal.writeLine(terminal_1.Colorize.bold(`\nRush Lockfile Explorer ${constants_1.LFX_VERSION}`) +
85
89
  terminal_1.Colorize.cyan(' - https://lfx.rushstack.io/\n'));
86
- (0, update_notifier_1.default)({
87
- pkg: lockfileExplorerPackageJson,
88
- // Normally update-notifier waits a day or so before it starts displaying upgrade notices.
89
- // In debug mode, show the notice right away.
90
- updateCheckInterval: this.isDebug ? 0 : undefined
91
- }).notify({
92
- // Make sure it says "-g" in the "npm install" example command line
93
- isGlobal: true,
94
- // Show the notice immediately, rather than waiting for process.onExit()
95
- defer: false
90
+ // Start the update check now so it runs concurrently with server setup.
91
+ // The result is awaited and displayed inside app.listen once the server is ready.
92
+ const updateChecker = new PackageUpdateChecker_1.PackageUpdateChecker({
93
+ packageName: constants_1.LFX_PACKAGE_NAME,
94
+ currentVersion: constants_1.LFX_VERSION,
95
+ // In debug mode, bypass the cache so the notice appears immediately.
96
+ forceCheck: this.isDebug
96
97
  });
98
+ const updateCheckPromise = updateChecker.tryGetUpdateAsync();
97
99
  const PORT = 8091;
98
100
  // Must not have a trailing slash
99
101
  const SERVICE_URL = `http://localhost:${PORT}`;
100
102
  const appState = (0, init_1.init)({
101
- lockfileExplorerProjectRoot,
102
- appVersion,
103
+ appVersion: constants_1.LFX_VERSION,
103
104
  debugMode: this.isDebug,
104
105
  subspaceName: this._subspaceParameter.value
105
106
  });
@@ -116,8 +117,8 @@ class ExplorerCommandLineParser extends ts_command_line_1.CommandLineParser {
116
117
  let disconnected = false;
117
118
  setInterval(() => {
118
119
  if (!isClientConnected && !awaitingFirstConnect && !disconnected) {
119
- console.log(terminal_1.Colorize.red('The client has disconnected!'));
120
- console.log(`Please open a browser window at http://localhost:${PORT}/app`);
120
+ terminal.writeLine(terminal_1.Colorize.red('The client has disconnected!'));
121
+ terminal.writeLine(`Please open a browser window at http://localhost:${PORT}/app`);
121
122
  disconnected = true;
122
123
  }
123
124
  else if (!awaitingFirstConnect) {
@@ -144,7 +145,7 @@ class ExplorerCommandLineParser extends ts_command_line_1.CommandLineParser {
144
145
  isClientConnected = true;
145
146
  if (disconnected) {
146
147
  disconnected = false;
147
- console.log(terminal_1.Colorize.green('The client has reconnected!'));
148
+ terminal.writeLine(terminal_1.Colorize.green('The client has reconnected!'));
148
149
  }
149
150
  res.status(200).send();
150
151
  });
@@ -226,7 +227,8 @@ class ExplorerCommandLineParser extends ts_command_line_1.CommandLineParser {
226
227
  res.send(parsedPackage);
227
228
  });
228
229
  app.listen(PORT, async () => {
229
- console.log(`App launched on ${SERVICE_URL}`);
230
+ terminal.writeLine(`App launched on ${SERVICE_URL}`);
231
+ printUpdateNotification(await updateCheckPromise, terminal);
230
232
  if (!appState.debugMode) {
231
233
  try {
232
234
  // Launch the default web browser using the platform-native open command.
@@ -258,7 +260,7 @@ class ExplorerCommandLineParser extends ts_command_line_1.CommandLineParser {
258
260
  browserProcess.unref();
259
261
  }
260
262
  catch (e) {
261
- this.globalTerminal.writeError('Error launching browser: ' + e.toString());
263
+ terminal.writeError('Error launching browser: ' + e.toString());
262
264
  }
263
265
  }
264
266
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ExplorerCommandLineParser.js","sourceRoot":"","sources":["../../../src/cli/explorer/ExplorerCommandLineParser.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport process from 'node:process';\nimport * as path from 'node:path';\nimport type { ChildProcess } from 'node:child_process';\n\nimport express from 'express';\nimport yaml from 'js-yaml';\nimport cors from 'cors';\nimport updateNotifier from 'update-notifier';\n\nimport {\n Executable,\n FileSystem,\n type IPackageJson,\n JsonFile,\n PackageJsonLookup\n} from '@rushstack/node-core-library';\nimport { ConsoleTerminalProvider, type ITerminal, Terminal, Colorize } from '@rushstack/terminal';\nimport {\n type CommandLineFlagParameter,\n CommandLineParser,\n type IRequiredCommandLineStringParameter\n} from '@rushstack/ts-command-line';\n\nimport {\n type LfxGraph,\n lfxGraphSerializer,\n type IAppContext,\n type IJsonLfxGraph,\n type IJsonLfxWorkspace\n} from '../../../build/lfx-shared';\nimport * as lockfilePath from '../../graph/lockfilePath';\nimport type { IAppState } from '../../state';\nimport { init } from '../../utils/init';\nimport { PnpmfileRunner } from '../../graph/PnpmfileRunner';\nimport * as lfxGraphLoader from '../../graph/lfxGraphLoader';\n\nconst EXPLORER_TOOL_FILENAME: 'lockfile-explorer' = 'lockfile-explorer';\n\nexport class ExplorerCommandLineParser extends CommandLineParser {\n public readonly globalTerminal: ITerminal;\n private readonly _terminalProvider: ConsoleTerminalProvider;\n private readonly _debugParameter: CommandLineFlagParameter;\n\n private readonly _subspaceParameter: IRequiredCommandLineStringParameter;\n\n public constructor() {\n super({\n toolFilename: EXPLORER_TOOL_FILENAME,\n toolDescription:\n 'Lockfile Explorer is a desktop app for investigating and solving version conflicts in a PNPM workspace.'\n });\n\n this._debugParameter = this.defineFlagParameter({\n parameterLongName: '--debug',\n parameterShortName: '-d',\n description: 'Show the full call stack if an error occurs while executing the tool'\n });\n\n this._subspaceParameter = this.defineStringParameter({\n parameterLongName: '--subspace',\n argumentName: 'SUBSPACE_NAME',\n description: 'Specifies an individual Rush subspace to check.',\n defaultValue: 'default'\n });\n\n this._terminalProvider = new ConsoleTerminalProvider();\n this.globalTerminal = new Terminal(this._terminalProvider);\n }\n\n public get isDebug(): boolean {\n return this._debugParameter.value;\n }\n\n protected override async onExecuteAsync(): Promise<void> {\n const lockfileExplorerProjectRoot: string = PackageJsonLookup.instance.tryGetPackageFolderFor(__dirname)!;\n const lockfileExplorerPackageJson: IPackageJson = JsonFile.load(\n `${lockfileExplorerProjectRoot}/package.json`\n );\n const appVersion: string = lockfileExplorerPackageJson.version;\n\n this.globalTerminal.writeLine(\n Colorize.bold(`\\nRush Lockfile Explorer ${appVersion}`) +\n Colorize.cyan(' - https://lfx.rushstack.io/\\n')\n );\n\n updateNotifier({\n pkg: lockfileExplorerPackageJson,\n // Normally update-notifier waits a day or so before it starts displaying upgrade notices.\n // In debug mode, show the notice right away.\n updateCheckInterval: this.isDebug ? 0 : undefined\n }).notify({\n // Make sure it says \"-g\" in the \"npm install\" example command line\n isGlobal: true,\n // Show the notice immediately, rather than waiting for process.onExit()\n defer: false\n });\n\n const PORT: number = 8091;\n // Must not have a trailing slash\n const SERVICE_URL: string = `http://localhost:${PORT}`;\n\n const appState: IAppState = init({\n lockfileExplorerProjectRoot,\n appVersion,\n debugMode: this.isDebug,\n subspaceName: this._subspaceParameter.value\n });\n\n const lfxWorkspace: IJsonLfxWorkspace = appState.lfxWorkspace;\n\n // Important: This must happen after init() reads the current working directory\n process.chdir(appState.lockfileExplorerProjectRoot);\n\n const distFolderPath: string = `${appState.lockfileExplorerProjectRoot}/dist`;\n const app: express.Application = express();\n app.use(express.json());\n app.use(cors());\n\n // Variable used to check if the front-end client is still connected\n let awaitingFirstConnect: boolean = true;\n let isClientConnected: boolean = false;\n let disconnected: boolean = false;\n setInterval(() => {\n if (!isClientConnected && !awaitingFirstConnect && !disconnected) {\n console.log(Colorize.red('The client has disconnected!'));\n console.log(`Please open a browser window at http://localhost:${PORT}/app`);\n disconnected = true;\n } else if (!awaitingFirstConnect) {\n isClientConnected = false;\n }\n }, 4000);\n\n // This takes precedence over the `/app` static route, which also has an `initappcontext.js` file.\n app.get('/initappcontext.js', (req: express.Request, res: express.Response) => {\n const appContext: IAppContext = {\n serviceUrl: SERVICE_URL,\n appVersion: appState.appVersion,\n debugMode: this.isDebug\n };\n const sourceCode: string = [\n `console.log('Loaded initappcontext.js');`,\n `appContext = ${JSON.stringify(appContext)}`\n ].join('\\n');\n\n res.type('application/javascript').send(sourceCode);\n });\n\n app.use('/', express.static(distFolderPath));\n\n app.use('/favicon.ico', express.static(distFolderPath, { index: 'favicon.ico' }));\n\n app.get('/api/health', (req: express.Request, res: express.Response) => {\n awaitingFirstConnect = false;\n isClientConnected = true;\n if (disconnected) {\n disconnected = false;\n console.log(Colorize.green('The client has reconnected!'));\n }\n res.status(200).send();\n });\n\n app.get('/api/graph', async (req: express.Request, res: express.Response) => {\n const pnpmLockfileText: string = await FileSystem.readFileAsync(appState.pnpmLockfileLocation);\n const lockfile: unknown = yaml.load(pnpmLockfileText) as unknown;\n\n const graph: LfxGraph = lfxGraphLoader.generateLockfileGraph(lockfile, lfxWorkspace);\n\n const jsonGraph: IJsonLfxGraph = lfxGraphSerializer.serializeToJson(graph);\n res.type('application/json').send(jsonGraph);\n });\n\n app.post(\n '/api/package-json',\n async (req: express.Request<{}, {}, { projectPath: string }, {}>, res: express.Response) => {\n const { projectPath } = req.body;\n const fileLocation: string = `${appState.projectRoot}/${projectPath}/package.json`;\n let packageJsonText: string;\n try {\n packageJsonText = await FileSystem.readFileAsync(fileLocation);\n } catch (e) {\n if (FileSystem.isNotExistError(e)) {\n return res.status(404).send({\n message: `Could not load package.json file for this package. Have you installed all the dependencies for this workspace?`,\n error: `No package.json in location: ${projectPath}`\n });\n } else {\n throw e;\n }\n }\n\n res.send(packageJsonText);\n }\n );\n\n app.get('/api/pnpmfile', async (req: express.Request, res: express.Response) => {\n const pnpmfilePath: string = lockfilePath.join(\n lfxWorkspace.workspaceRootFullPath,\n lfxWorkspace.rushConfig?.rushPnpmfilePath ?? lfxWorkspace.pnpmfilePath\n );\n\n let pnpmfile: string;\n try {\n pnpmfile = await FileSystem.readFileAsync(pnpmfilePath);\n } catch (e) {\n if (FileSystem.isNotExistError(e)) {\n return res.status(404).send({\n message: `Could not load .pnpmfile.cjs file in this repo: \"${pnpmfilePath}\"`,\n error: `No .pnpmifile.cjs found.`\n });\n } else {\n throw e;\n }\n }\n\n res.send(pnpmfile);\n });\n\n app.post(\n '/api/package-spec',\n async (req: express.Request<{}, {}, { projectPath: string }, {}>, res: express.Response) => {\n const { projectPath } = req.body;\n const fileLocation: string = `${appState.projectRoot}/${projectPath}/package.json`;\n let packageJson: IPackageJson;\n try {\n packageJson = await JsonFile.loadAsync(fileLocation);\n } catch (e) {\n if (FileSystem.isNotExistError(e)) {\n return res.status(404).send({\n message: `Could not load package.json file in location: ${projectPath}`\n });\n } else {\n throw e;\n }\n }\n\n let parsedPackage: IPackageJson = packageJson;\n\n const pnpmfilePath: string = path.join(lfxWorkspace.workspaceRootFullPath, lfxWorkspace.pnpmfilePath);\n if (await FileSystem.existsAsync(pnpmfilePath)) {\n const pnpmFileRunner: PnpmfileRunner = new PnpmfileRunner(pnpmfilePath);\n try {\n parsedPackage = await pnpmFileRunner.transformPackageAsync(packageJson, fileLocation);\n } finally {\n await pnpmFileRunner.disposeAsync();\n }\n }\n\n res.send(parsedPackage);\n }\n );\n\n app.listen(PORT, async () => {\n console.log(`App launched on ${SERVICE_URL}`);\n\n if (!appState.debugMode) {\n try {\n // Launch the default web browser using the platform-native open command.\n let browserCmd: string;\n let browserArgs: string[];\n switch (process.platform) {\n case 'win32': {\n // \"start\" is a cmd.exe built-in, not a standalone executable.\n // The empty string is the required [title] argument; without it,\n // cmd interprets the URL as the title and ignores it.\n browserCmd = 'cmd';\n browserArgs = ['/c', 'start', '', SERVICE_URL];\n break;\n }\n\n case 'darwin': {\n browserCmd = 'open';\n browserArgs = [SERVICE_URL];\n break;\n }\n\n default: {\n // Linux and other Unix-like systems\n browserCmd = 'xdg-open';\n browserArgs = [SERVICE_URL];\n break;\n }\n }\n\n const browserProcess: ChildProcess = Executable.spawn(browserCmd, browserArgs, { stdio: 'ignore' });\n // Detach from our Node.js process so the browser stays open after we exit\n browserProcess.unref();\n } catch (e) {\n this.globalTerminal.writeError('Error launching browser: ' + e.toString());\n }\n }\n });\n }\n}\n"]}
1
+ {"version":3,"file":"ExplorerCommandLineParser.js","sourceRoot":"","sources":["../../../src/cli/explorer/ExplorerCommandLineParser.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport process from 'node:process';\nimport * as path from 'node:path';\nimport type { ChildProcess } from 'node:child_process';\n\nimport express from 'express';\nimport yaml from 'js-yaml';\nimport cors from 'cors';\n\nimport { Executable, FileSystem, type IPackageJson, JsonFile } from '@rushstack/node-core-library';\nimport { type ITerminal, Colorize } from '@rushstack/terminal';\nimport {\n type CommandLineFlagParameter,\n CommandLineParser,\n type IRequiredCommandLineStringParameter\n} from '@rushstack/ts-command-line';\n\nimport {\n type LfxGraph,\n lfxGraphSerializer,\n type IAppContext,\n type IJsonLfxGraph,\n type IJsonLfxWorkspace\n} from '../../../build/lfx-shared';\nimport * as lockfilePath from '../../graph/lockfilePath';\nimport type { IAppState } from '../../state';\nimport { init } from '../../utils/init';\nimport { PnpmfileRunner } from '../../graph/PnpmfileRunner';\nimport * as lfxGraphLoader from '../../graph/lfxGraphLoader';\nimport { LFX_PACKAGE_NAME, LFX_VERSION } from '../../utils/constants';\nimport { type IPackageUpdateResult, PackageUpdateChecker } from '../../utils/PackageUpdateChecker';\n\nconst EXPLORER_TOOL_FILENAME: 'lockfile-explorer' = 'lockfile-explorer';\n\nfunction printUpdateNotification(\n result: { latestVersion: string; isOutdated: boolean } | undefined,\n terminal: ITerminal\n): void {\n if (result?.isOutdated) {\n terminal.writeLine(\n Colorize.yellow(\n `\\nUpdate available: ${LFX_VERSION} → ${result.latestVersion}\\n` +\n `Run: npm install -g ${LFX_PACKAGE_NAME}\\n`\n )\n );\n }\n}\n\nexport class ExplorerCommandLineParser extends CommandLineParser {\n public readonly globalTerminal: ITerminal;\n\n private readonly _debugParameter: CommandLineFlagParameter;\n private readonly _subspaceParameter: IRequiredCommandLineStringParameter;\n\n public constructor(terminal: ITerminal) {\n super({\n toolFilename: EXPLORER_TOOL_FILENAME,\n toolDescription:\n 'Lockfile Explorer is a desktop app for investigating and solving version conflicts in a PNPM workspace.'\n });\n\n this._debugParameter = this.defineFlagParameter({\n parameterLongName: '--debug',\n parameterShortName: '-d',\n description: 'Show the full call stack if an error occurs while executing the tool'\n });\n\n this._subspaceParameter = this.defineStringParameter({\n parameterLongName: '--subspace',\n argumentName: 'SUBSPACE_NAME',\n description: 'Specifies an individual Rush subspace to check.',\n defaultValue: 'default'\n });\n\n this.globalTerminal = terminal;\n }\n\n public get isDebug(): boolean {\n return this._debugParameter.value;\n }\n\n protected override async onExecuteAsync(): Promise<void> {\n const terminal: ITerminal = this.globalTerminal;\n\n terminal.writeLine(\n Colorize.bold(`\\nRush Lockfile Explorer ${LFX_VERSION}`) +\n Colorize.cyan(' - https://lfx.rushstack.io/\\n')\n );\n\n // Start the update check now so it runs concurrently with server setup.\n // The result is awaited and displayed inside app.listen once the server is ready.\n const updateChecker: PackageUpdateChecker = new PackageUpdateChecker({\n packageName: LFX_PACKAGE_NAME,\n currentVersion: LFX_VERSION,\n // In debug mode, bypass the cache so the notice appears immediately.\n forceCheck: this.isDebug\n });\n const updateCheckPromise: Promise<IPackageUpdateResult | undefined> = updateChecker.tryGetUpdateAsync();\n\n const PORT: number = 8091;\n // Must not have a trailing slash\n const SERVICE_URL: string = `http://localhost:${PORT}`;\n\n const appState: IAppState = init({\n appVersion: LFX_VERSION,\n debugMode: this.isDebug,\n subspaceName: this._subspaceParameter.value\n });\n\n const lfxWorkspace: IJsonLfxWorkspace = appState.lfxWorkspace;\n\n // Important: This must happen after init() reads the current working directory\n process.chdir(appState.lockfileExplorerProjectRoot);\n\n const distFolderPath: string = `${appState.lockfileExplorerProjectRoot}/dist`;\n const app: express.Application = express();\n app.use(express.json());\n app.use(cors());\n\n // Variable used to check if the front-end client is still connected\n let awaitingFirstConnect: boolean = true;\n let isClientConnected: boolean = false;\n let disconnected: boolean = false;\n setInterval(() => {\n if (!isClientConnected && !awaitingFirstConnect && !disconnected) {\n terminal.writeLine(Colorize.red('The client has disconnected!'));\n terminal.writeLine(`Please open a browser window at http://localhost:${PORT}/app`);\n disconnected = true;\n } else if (!awaitingFirstConnect) {\n isClientConnected = false;\n }\n }, 4000);\n\n // This takes precedence over the `/app` static route, which also has an `initappcontext.js` file.\n app.get('/initappcontext.js', (req: express.Request, res: express.Response) => {\n const appContext: IAppContext = {\n serviceUrl: SERVICE_URL,\n appVersion: appState.appVersion,\n debugMode: this.isDebug\n };\n const sourceCode: string = [\n `console.log('Loaded initappcontext.js');`,\n `appContext = ${JSON.stringify(appContext)}`\n ].join('\\n');\n\n res.type('application/javascript').send(sourceCode);\n });\n\n app.use('/', express.static(distFolderPath));\n\n app.use('/favicon.ico', express.static(distFolderPath, { index: 'favicon.ico' }));\n\n app.get('/api/health', (req: express.Request, res: express.Response) => {\n awaitingFirstConnect = false;\n isClientConnected = true;\n if (disconnected) {\n disconnected = false;\n terminal.writeLine(Colorize.green('The client has reconnected!'));\n }\n res.status(200).send();\n });\n\n app.get('/api/graph', async (req: express.Request, res: express.Response) => {\n const pnpmLockfileText: string = await FileSystem.readFileAsync(appState.pnpmLockfileLocation);\n const lockfile: unknown = yaml.load(pnpmLockfileText) as unknown;\n\n const graph: LfxGraph = lfxGraphLoader.generateLockfileGraph(lockfile, lfxWorkspace);\n\n const jsonGraph: IJsonLfxGraph = lfxGraphSerializer.serializeToJson(graph);\n res.type('application/json').send(jsonGraph);\n });\n\n app.post(\n '/api/package-json',\n async (req: express.Request<{}, {}, { projectPath: string }, {}>, res: express.Response) => {\n const { projectPath } = req.body;\n const fileLocation: string = `${appState.projectRoot}/${projectPath}/package.json`;\n let packageJsonText: string;\n try {\n packageJsonText = await FileSystem.readFileAsync(fileLocation);\n } catch (e) {\n if (FileSystem.isNotExistError(e)) {\n return res.status(404).send({\n message: `Could not load package.json file for this package. Have you installed all the dependencies for this workspace?`,\n error: `No package.json in location: ${projectPath}`\n });\n } else {\n throw e;\n }\n }\n\n res.send(packageJsonText);\n }\n );\n\n app.get('/api/pnpmfile', async (req: express.Request, res: express.Response) => {\n const pnpmfilePath: string = lockfilePath.join(\n lfxWorkspace.workspaceRootFullPath,\n lfxWorkspace.rushConfig?.rushPnpmfilePath ?? lfxWorkspace.pnpmfilePath\n );\n\n let pnpmfile: string;\n try {\n pnpmfile = await FileSystem.readFileAsync(pnpmfilePath);\n } catch (e) {\n if (FileSystem.isNotExistError(e)) {\n return res.status(404).send({\n message: `Could not load .pnpmfile.cjs file in this repo: \"${pnpmfilePath}\"`,\n error: `No .pnpmifile.cjs found.`\n });\n } else {\n throw e;\n }\n }\n\n res.send(pnpmfile);\n });\n\n app.post(\n '/api/package-spec',\n async (req: express.Request<{}, {}, { projectPath: string }, {}>, res: express.Response) => {\n const { projectPath } = req.body;\n const fileLocation: string = `${appState.projectRoot}/${projectPath}/package.json`;\n let packageJson: IPackageJson;\n try {\n packageJson = await JsonFile.loadAsync(fileLocation);\n } catch (e) {\n if (FileSystem.isNotExistError(e)) {\n return res.status(404).send({\n message: `Could not load package.json file in location: ${projectPath}`\n });\n } else {\n throw e;\n }\n }\n\n let parsedPackage: IPackageJson = packageJson;\n\n const pnpmfilePath: string = path.join(lfxWorkspace.workspaceRootFullPath, lfxWorkspace.pnpmfilePath);\n if (await FileSystem.existsAsync(pnpmfilePath)) {\n const pnpmFileRunner: PnpmfileRunner = new PnpmfileRunner(pnpmfilePath);\n try {\n parsedPackage = await pnpmFileRunner.transformPackageAsync(packageJson, fileLocation);\n } finally {\n await pnpmFileRunner.disposeAsync();\n }\n }\n\n res.send(parsedPackage);\n }\n );\n\n app.listen(PORT, async () => {\n terminal.writeLine(`App launched on ${SERVICE_URL}`);\n\n printUpdateNotification(await updateCheckPromise, terminal);\n\n if (!appState.debugMode) {\n try {\n // Launch the default web browser using the platform-native open command.\n let browserCmd: string;\n let browserArgs: string[];\n switch (process.platform) {\n case 'win32': {\n // \"start\" is a cmd.exe built-in, not a standalone executable.\n // The empty string is the required [title] argument; without it,\n // cmd interprets the URL as the title and ignores it.\n browserCmd = 'cmd';\n browserArgs = ['/c', 'start', '', SERVICE_URL];\n break;\n }\n\n case 'darwin': {\n browserCmd = 'open';\n browserArgs = [SERVICE_URL];\n break;\n }\n\n default: {\n // Linux and other Unix-like systems\n browserCmd = 'xdg-open';\n browserArgs = [SERVICE_URL];\n break;\n }\n }\n\n const browserProcess: ChildProcess = Executable.spawn(browserCmd, browserArgs, { stdio: 'ignore' });\n // Detach from our Node.js process so the browser stays open after we exit\n browserProcess.unref();\n } catch (e) {\n terminal.writeError('Error launching browser: ' + e.toString());\n }\n }\n });\n }\n}\n"]}
@@ -5,30 +5,27 @@ Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.LintCommandLineParser = void 0;
6
6
  const terminal_1 = require("@rushstack/terminal");
7
7
  const ts_command_line_1 = require("@rushstack/ts-command-line");
8
- const node_core_library_1 = require("@rushstack/node-core-library");
9
8
  const InitAction_1 = require("./actions/InitAction");
10
9
  const CheckAction_1 = require("./actions/CheckAction");
10
+ const constants_1 = require("../../utils/constants");
11
11
  const LINT_TOOL_FILENAME = 'lockfile-lint';
12
12
  class LintCommandLineParser extends ts_command_line_1.CommandLineParser {
13
- constructor() {
13
+ constructor(terminal) {
14
14
  super({
15
15
  toolFilename: LINT_TOOL_FILENAME,
16
16
  toolDescription: 'Lockfile Lint applies configured policies to find and report dependency issues in your PNPM workspace.'
17
17
  });
18
- this._terminalProvider = new terminal_1.ConsoleTerminalProvider();
19
- this.globalTerminal = new terminal_1.Terminal(this._terminalProvider);
18
+ this.globalTerminal = terminal;
20
19
  this._populateActions();
21
20
  }
22
21
  async onExecuteAsync() {
23
- const lockfileExplorerProjectRoot = node_core_library_1.PackageJsonLookup.instance.tryGetPackageFolderFor(__dirname);
24
- const lockfileExplorerPackageJson = node_core_library_1.JsonFile.load(`${lockfileExplorerProjectRoot}/package.json`);
25
- const appVersion = lockfileExplorerPackageJson.version;
26
- this.globalTerminal.writeLine(terminal_1.Colorize.bold(`\nRush Lockfile Lint ${appVersion}`) + terminal_1.Colorize.cyan(' - https://lfx.rushstack.io/\n'));
22
+ this.globalTerminal.writeLine(terminal_1.Colorize.bold(`\nRush Lockfile Lint ${constants_1.LFX_VERSION}`) + terminal_1.Colorize.cyan(' - https://lfx.rushstack.io/\n'));
27
23
  await super.onExecuteAsync();
28
24
  }
29
25
  _populateActions() {
30
- this.addAction(new InitAction_1.InitAction(this));
31
- this.addAction(new CheckAction_1.CheckAction(this));
26
+ const terminal = this.globalTerminal;
27
+ this.addAction(new InitAction_1.InitAction(terminal));
28
+ this.addAction(new CheckAction_1.CheckAction(terminal));
32
29
  }
33
30
  }
34
31
  exports.LintCommandLineParser = LintCommandLineParser;
@@ -1 +1 @@
1
- {"version":3,"file":"LintCommandLineParser.js","sourceRoot":"","sources":["../../../src/cli/lint/LintCommandLineParser.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,kDAAkG;AAClG,gEAA+D;AAC/D,oEAA8F;AAE9F,qDAAkD;AAClD,uDAAoD;AAEpD,MAAM,kBAAkB,GAAoB,eAAe,CAAC;AAE5D,MAAa,qBAAsB,SAAQ,mCAAiB;IAI1D;QACE,KAAK,CAAC;YACJ,YAAY,EAAE,kBAAkB;YAChC,eAAe,EACb,wGAAwG;SAC3G,CAAC,CAAC;QAEH,IAAI,CAAC,iBAAiB,GAAG,IAAI,kCAAuB,EAAE,CAAC;QACvD,IAAI,CAAC,cAAc,GAAG,IAAI,mBAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAE3D,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAEkB,KAAK,CAAC,cAAc;QACrC,MAAM,2BAA2B,GAAW,qCAAiB,CAAC,QAAQ,CAAC,sBAAsB,CAAC,SAAS,CAAE,CAAC;QAC1G,MAAM,2BAA2B,GAAiB,4BAAQ,CAAC,IAAI,CAC7D,GAAG,2BAA2B,eAAe,CAC9C,CAAC;QACF,MAAM,UAAU,GAAW,2BAA2B,CAAC,OAAO,CAAC;QAE/D,IAAI,CAAC,cAAc,CAAC,SAAS,CAC3B,mBAAQ,CAAC,IAAI,CAAC,wBAAwB,UAAU,EAAE,CAAC,GAAG,mBAAQ,CAAC,IAAI,CAAC,gCAAgC,CAAC,CACtG,CAAC;QAEF,MAAM,KAAK,CAAC,cAAc,EAAE,CAAC;IAC/B,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,SAAS,CAAC,IAAI,uBAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,CAAC,IAAI,yBAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,CAAC;CACF;AAnCD,sDAmCC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport { ConsoleTerminalProvider, type ITerminal, Terminal, Colorize } from '@rushstack/terminal';\nimport { CommandLineParser } from '@rushstack/ts-command-line';\nimport { type IPackageJson, JsonFile, PackageJsonLookup } from '@rushstack/node-core-library';\n\nimport { InitAction } from './actions/InitAction';\nimport { CheckAction } from './actions/CheckAction';\n\nconst LINT_TOOL_FILENAME: 'lockfile-lint' = 'lockfile-lint';\n\nexport class LintCommandLineParser extends CommandLineParser {\n public readonly globalTerminal: ITerminal;\n private readonly _terminalProvider: ConsoleTerminalProvider;\n\n public constructor() {\n super({\n toolFilename: LINT_TOOL_FILENAME,\n toolDescription:\n 'Lockfile Lint applies configured policies to find and report dependency issues in your PNPM workspace.'\n });\n\n this._terminalProvider = new ConsoleTerminalProvider();\n this.globalTerminal = new Terminal(this._terminalProvider);\n\n this._populateActions();\n }\n\n protected override async onExecuteAsync(): Promise<void> {\n const lockfileExplorerProjectRoot: string = PackageJsonLookup.instance.tryGetPackageFolderFor(__dirname)!;\n const lockfileExplorerPackageJson: IPackageJson = JsonFile.load(\n `${lockfileExplorerProjectRoot}/package.json`\n );\n const appVersion: string = lockfileExplorerPackageJson.version;\n\n this.globalTerminal.writeLine(\n Colorize.bold(`\\nRush Lockfile Lint ${appVersion}`) + Colorize.cyan(' - https://lfx.rushstack.io/\\n')\n );\n\n await super.onExecuteAsync();\n }\n\n private _populateActions(): void {\n this.addAction(new InitAction(this));\n this.addAction(new CheckAction(this));\n }\n}\n"]}
1
+ {"version":3,"file":"LintCommandLineParser.js","sourceRoot":"","sources":["../../../src/cli/lint/LintCommandLineParser.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,kDAA+D;AAC/D,gEAA+D;AAE/D,qDAAkD;AAClD,uDAAoD;AACpD,qDAAoD;AAEpD,MAAM,kBAAkB,GAAoB,eAAe,CAAC;AAE5D,MAAa,qBAAsB,SAAQ,mCAAiB;IAG1D,YAAmB,QAAmB;QACpC,KAAK,CAAC;YACJ,YAAY,EAAE,kBAAkB;YAChC,eAAe,EACb,wGAAwG;SAC3G,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;QAE/B,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAEkB,KAAK,CAAC,cAAc;QACrC,IAAI,CAAC,cAAc,CAAC,SAAS,CAC3B,mBAAQ,CAAC,IAAI,CAAC,wBAAwB,uBAAW,EAAE,CAAC,GAAG,mBAAQ,CAAC,IAAI,CAAC,gCAAgC,CAAC,CACvG,CAAC;QAEF,MAAM,KAAK,CAAC,cAAc,EAAE,CAAC;IAC/B,CAAC;IAEO,gBAAgB;QACtB,MAAM,QAAQ,GAAc,IAAI,CAAC,cAAc,CAAC;QAChD,IAAI,CAAC,SAAS,CAAC,IAAI,uBAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS,CAAC,IAAI,yBAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5C,CAAC;CACF;AA5BD,sDA4BC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport { type ITerminal, Colorize } from '@rushstack/terminal';\nimport { CommandLineParser } from '@rushstack/ts-command-line';\n\nimport { InitAction } from './actions/InitAction';\nimport { CheckAction } from './actions/CheckAction';\nimport { LFX_VERSION } from '../../utils/constants';\n\nconst LINT_TOOL_FILENAME: 'lockfile-lint' = 'lockfile-lint';\n\nexport class LintCommandLineParser extends CommandLineParser {\n public readonly globalTerminal: ITerminal;\n\n public constructor(terminal: ITerminal) {\n super({\n toolFilename: LINT_TOOL_FILENAME,\n toolDescription:\n 'Lockfile Lint applies configured policies to find and report dependency issues in your PNPM workspace.'\n });\n\n this.globalTerminal = terminal;\n\n this._populateActions();\n }\n\n protected override async onExecuteAsync(): Promise<void> {\n this.globalTerminal.writeLine(\n Colorize.bold(`\\nRush Lockfile Lint ${LFX_VERSION}`) + Colorize.cyan(' - https://lfx.rushstack.io/\\n')\n );\n\n await super.onExecuteAsync();\n }\n\n private _populateActions(): void {\n const terminal: ITerminal = this.globalTerminal;\n this.addAction(new InitAction(terminal));\n this.addAction(new CheckAction(terminal));\n }\n}\n"]}
@@ -17,7 +17,7 @@ const lockfile_lint_schema_json_1 = __importDefault(require("../../../schemas/lo
17
17
  const common_1 = require("../../../constants/common");
18
18
  const shrinkwrap_1 = require("../../../utils/shrinkwrap");
19
19
  class CheckAction extends ts_command_line_1.CommandLineAction {
20
- constructor(parser) {
20
+ constructor(terminal) {
21
21
  super({
22
22
  actionName: 'check',
23
23
  summary: 'Check and report dependency issues in your workspace',
@@ -25,7 +25,7 @@ class CheckAction extends ts_command_line_1.CommandLineAction {
25
25
  common_1.LOCKFILE_LINT_JSON_FILENAME +
26
26
  ', reporting any problems found in your PNPM workspace.'
27
27
  });
28
- this._terminal = parser.globalTerminal;
28
+ this._terminal = terminal;
29
29
  this._checkedProjects = new Set();
30
30
  this._docMap = new Map();
31
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CheckAction.js","sourceRoot":"","sources":["../../../../src/cli/lint/actions/CheckAction.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport path from 'node:path';\n\nimport yaml from 'js-yaml';\nimport semver from 'semver';\nimport type * as lockfileTypes from '@pnpm/lockfile.types';\nimport type * as pnpmTypes from '@pnpm/types';\n\nimport { RushConfiguration, type RushConfigurationProject, type Subspace } from '@rushstack/rush-sdk';\nimport { CommandLineAction } from '@rushstack/ts-command-line';\nimport { Colorize, type ITerminal } from '@rushstack/terminal';\nimport { AlreadyReportedError, Async, FileSystem, JsonFile, JsonSchema } from '@rushstack/node-core-library';\n\nimport lockfileLintSchema from '../../../schemas/lockfile-lint.schema.json';\nimport { LOCKFILE_EXPLORER_FOLDERNAME, LOCKFILE_LINT_JSON_FILENAME } from '../../../constants/common';\nimport type { LintCommandLineParser } from '../LintCommandLineParser';\nimport {\n getShrinkwrapFileMajorVersion,\n parseDependencyPath,\n splicePackageWithVersion\n} from '../../../utils/shrinkwrap';\n\nexport interface ILintRule {\n rule: 'restrict-versions';\n project: string;\n requiredVersions: Record<string, string>;\n}\n\nexport interface ILockfileLint {\n rules: ILintRule[];\n}\n\nexport interface ILintIssue {\n project: string;\n rule: string;\n message: string;\n}\n\nexport class CheckAction extends CommandLineAction {\n private readonly _terminal: ITerminal;\n\n private _rushConfiguration!: RushConfiguration;\n private _checkedProjects: Set<RushConfigurationProject>;\n private _docMap: Map<string, lockfileTypes.LockfileObject>;\n\n public constructor(parser: LintCommandLineParser) {\n super({\n actionName: 'check',\n summary: 'Check and report dependency issues in your workspace',\n documentation:\n 'This command applies the policies that are configured in ' +\n LOCKFILE_LINT_JSON_FILENAME +\n ', reporting any problems found in your PNPM workspace.'\n });\n\n this._terminal = parser.globalTerminal;\n this._checkedProjects = new Set();\n this._docMap = new Map();\n }\n\n private async _checkVersionCompatibilityAsync(\n shrinkwrapFileMajorVersion: number,\n packages: lockfileTypes.PackageSnapshots | undefined,\n dependencyPath: pnpmTypes.DepPath,\n requiredVersions: Record<string, string>,\n checkedDependencyPaths: Set<string>\n ): Promise<void> {\n if (packages && packages[dependencyPath] && !checkedDependencyPaths.has(dependencyPath)) {\n checkedDependencyPaths.add(dependencyPath);\n const { name, version } = parseDependencyPath(shrinkwrapFileMajorVersion, dependencyPath);\n if (name in requiredVersions && !semver.satisfies(version, requiredVersions[name])) {\n throw new Error(\n `The version of \"${name}\" should match \"${requiredVersions[name]}\";` +\n ` actual version is \"${version}\"`\n );\n }\n\n await Promise.all(\n Object.entries(packages[dependencyPath].dependencies ?? {}).map(\n async ([dependencyPackageName, dependencyPackageVersion]) => {\n await this._checkVersionCompatibilityAsync(\n shrinkwrapFileMajorVersion,\n packages,\n splicePackageWithVersion(\n shrinkwrapFileMajorVersion,\n dependencyPackageName,\n dependencyPackageVersion\n ) as pnpmTypes.DepPath,\n requiredVersions,\n checkedDependencyPaths\n );\n }\n )\n );\n }\n }\n\n private async _searchAndValidateDependenciesAsync(\n project: RushConfigurationProject,\n requiredVersions: Record<string, string>\n ): Promise<void> {\n this._terminal.writeLine(`Checking project \"${project.packageName}\"`);\n\n const projectFolder: string = project.projectFolder;\n const subspace: Subspace = project.subspace;\n const shrinkwrapFilename: string = subspace.getCommittedShrinkwrapFilePath();\n let doc: lockfileTypes.LockfileObject;\n if (this._docMap.has(shrinkwrapFilename)) {\n doc = this._docMap.get(shrinkwrapFilename)!;\n } else {\n const pnpmLockfileText: string = await FileSystem.readFileAsync(shrinkwrapFilename);\n doc = yaml.load(pnpmLockfileText) as lockfileTypes.LockfileObject;\n this._docMap.set(shrinkwrapFilename, doc);\n }\n const { importers, lockfileVersion, packages } = doc;\n const shrinkwrapFileMajorVersion: number = getShrinkwrapFileMajorVersion(lockfileVersion);\n const checkedDependencyPaths: Set<string> = new Set<string>();\n\n await Promise.all(\n Object.entries(importers).map(async ([relativePath, { dependencies }]) => {\n if (path.resolve(projectFolder, relativePath) === projectFolder) {\n const dependenciesEntries: [string, unknown][] = Object.entries(dependencies ?? {});\n for (const [dependencyName, dependencyValue] of dependenciesEntries) {\n const fullDependencyPath: pnpmTypes.DepPath = splicePackageWithVersion(\n shrinkwrapFileMajorVersion,\n dependencyName,\n typeof dependencyValue === 'string'\n ? dependencyValue\n : (\n dependencyValue as {\n version: string;\n specifier: string;\n }\n ).version\n ) as pnpmTypes.DepPath;\n if (fullDependencyPath.includes('link:')) {\n const dependencyProject: RushConfigurationProject | undefined =\n this._rushConfiguration.getProjectByName(dependencyName);\n if (dependencyProject && !this._checkedProjects?.has(dependencyProject)) {\n this._checkedProjects!.add(project);\n await this._searchAndValidateDependenciesAsync(dependencyProject, requiredVersions);\n }\n } else {\n await this._checkVersionCompatibilityAsync(\n shrinkwrapFileMajorVersion,\n packages,\n fullDependencyPath,\n requiredVersions,\n checkedDependencyPaths\n );\n }\n }\n }\n })\n );\n }\n\n private async _performVersionRestrictionCheckAsync(\n requiredVersions: Record<string, string>,\n projectName: string\n ): Promise<string | undefined> {\n try {\n const project: RushConfigurationProject | undefined =\n this._rushConfiguration?.getProjectByName(projectName);\n if (!project) {\n throw new Error(\n `Specified project \"${projectName}\" does not exist in ${LOCKFILE_LINT_JSON_FILENAME}`\n );\n }\n this._checkedProjects.add(project);\n await this._searchAndValidateDependenciesAsync(project, requiredVersions);\n return undefined;\n } catch (e) {\n return e.message;\n }\n }\n\n protected override async onExecuteAsync(): Promise<void> {\n const rushConfiguration: RushConfiguration | undefined = RushConfiguration.tryLoadFromDefaultLocation();\n if (!rushConfiguration) {\n throw new Error(\n 'The \"lockfile-explorer check\" must be executed in a folder that is under a Rush workspace folder'\n );\n }\n this._rushConfiguration = rushConfiguration!;\n\n const lintingFile: string = path.resolve(\n this._rushConfiguration.commonFolder,\n 'config',\n LOCKFILE_EXPLORER_FOLDERNAME,\n LOCKFILE_LINT_JSON_FILENAME\n );\n const { rules }: ILockfileLint = await JsonFile.loadAndValidateAsync(\n lintingFile,\n JsonSchema.fromLoadedObject(lockfileLintSchema)\n );\n const issues: ILintIssue[] = [];\n await Async.forEachAsync(\n rules,\n async ({ requiredVersions, project, rule }) => {\n switch (rule) {\n case 'restrict-versions': {\n const message: string | undefined = await this._performVersionRestrictionCheckAsync(\n requiredVersions,\n project\n );\n if (message) {\n issues.push({ project, rule, message });\n }\n break;\n }\n\n default: {\n throw new Error('Unsupported rule name: ' + rule);\n }\n }\n },\n { concurrency: 50 }\n );\n if (issues.length > 0) {\n this._terminal.writeLine();\n\n // Deterministic order\n for (const issue of issues.sort((a, b): number => {\n let diff: number = a.project.localeCompare(b.project);\n if (diff !== 0) {\n return diff;\n }\n diff = a.rule.localeCompare(b.rule);\n if (diff !== 0) {\n return diff;\n }\n return a.message.localeCompare(b.message);\n })) {\n this._terminal.writeLine(\n Colorize.red('PROBLEM: ') + Colorize.cyan(`[${issue.rule}] `) + issue.message + '\\n'\n );\n }\n\n throw new AlreadyReportedError();\n }\n this._terminal.writeLine(Colorize.green('SUCCESS: ') + 'All checks passed.');\n }\n}\n"]}
1
+ {"version":3,"file":"CheckAction.js","sourceRoot":"","sources":["../../../../src/cli/lint/actions/CheckAction.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport path from 'node:path';\n\nimport yaml from 'js-yaml';\nimport semver from 'semver';\nimport type * as lockfileTypes from '@pnpm/lockfile.types';\nimport type * as pnpmTypes from '@pnpm/types';\n\nimport { RushConfiguration, type RushConfigurationProject, type Subspace } from '@rushstack/rush-sdk';\nimport { CommandLineAction } from '@rushstack/ts-command-line';\nimport { Colorize, type ITerminal } from '@rushstack/terminal';\nimport { AlreadyReportedError, Async, FileSystem, JsonFile, JsonSchema } from '@rushstack/node-core-library';\n\nimport lockfileLintSchema from '../../../schemas/lockfile-lint.schema.json';\nimport { LOCKFILE_EXPLORER_FOLDERNAME, LOCKFILE_LINT_JSON_FILENAME } from '../../../constants/common';\nimport {\n getShrinkwrapFileMajorVersion,\n parseDependencyPath,\n splicePackageWithVersion\n} from '../../../utils/shrinkwrap';\n\nexport interface ILintRule {\n rule: 'restrict-versions';\n project: string;\n requiredVersions: Record<string, string>;\n}\n\nexport interface ILockfileLint {\n rules: ILintRule[];\n}\n\nexport interface ILintIssue {\n project: string;\n rule: string;\n message: string;\n}\n\nexport class CheckAction extends CommandLineAction {\n private readonly _terminal: ITerminal;\n\n private _rushConfiguration!: RushConfiguration;\n private _checkedProjects: Set<RushConfigurationProject>;\n private _docMap: Map<string, lockfileTypes.LockfileObject>;\n\n public constructor(terminal: ITerminal) {\n super({\n actionName: 'check',\n summary: 'Check and report dependency issues in your workspace',\n documentation:\n 'This command applies the policies that are configured in ' +\n LOCKFILE_LINT_JSON_FILENAME +\n ', reporting any problems found in your PNPM workspace.'\n });\n\n this._terminal = terminal;\n this._checkedProjects = new Set();\n this._docMap = new Map();\n }\n\n private async _checkVersionCompatibilityAsync(\n shrinkwrapFileMajorVersion: number,\n packages: lockfileTypes.PackageSnapshots | undefined,\n dependencyPath: pnpmTypes.DepPath,\n requiredVersions: Record<string, string>,\n checkedDependencyPaths: Set<string>\n ): Promise<void> {\n if (packages && packages[dependencyPath] && !checkedDependencyPaths.has(dependencyPath)) {\n checkedDependencyPaths.add(dependencyPath);\n const { name, version } = parseDependencyPath(shrinkwrapFileMajorVersion, dependencyPath);\n if (name in requiredVersions && !semver.satisfies(version, requiredVersions[name])) {\n throw new Error(\n `The version of \"${name}\" should match \"${requiredVersions[name]}\";` +\n ` actual version is \"${version}\"`\n );\n }\n\n await Promise.all(\n Object.entries(packages[dependencyPath].dependencies ?? {}).map(\n async ([dependencyPackageName, dependencyPackageVersion]) => {\n await this._checkVersionCompatibilityAsync(\n shrinkwrapFileMajorVersion,\n packages,\n splicePackageWithVersion(\n shrinkwrapFileMajorVersion,\n dependencyPackageName,\n dependencyPackageVersion\n ) as pnpmTypes.DepPath,\n requiredVersions,\n checkedDependencyPaths\n );\n }\n )\n );\n }\n }\n\n private async _searchAndValidateDependenciesAsync(\n project: RushConfigurationProject,\n requiredVersions: Record<string, string>\n ): Promise<void> {\n this._terminal.writeLine(`Checking project \"${project.packageName}\"`);\n\n const projectFolder: string = project.projectFolder;\n const subspace: Subspace = project.subspace;\n const shrinkwrapFilename: string = subspace.getCommittedShrinkwrapFilePath();\n let doc: lockfileTypes.LockfileObject;\n if (this._docMap.has(shrinkwrapFilename)) {\n doc = this._docMap.get(shrinkwrapFilename)!;\n } else {\n const pnpmLockfileText: string = await FileSystem.readFileAsync(shrinkwrapFilename);\n doc = yaml.load(pnpmLockfileText) as lockfileTypes.LockfileObject;\n this._docMap.set(shrinkwrapFilename, doc);\n }\n const { importers, lockfileVersion, packages } = doc;\n const shrinkwrapFileMajorVersion: number = getShrinkwrapFileMajorVersion(lockfileVersion);\n const checkedDependencyPaths: Set<string> = new Set<string>();\n\n await Promise.all(\n Object.entries(importers).map(async ([relativePath, { dependencies }]) => {\n if (path.resolve(projectFolder, relativePath) === projectFolder) {\n const dependenciesEntries: [string, unknown][] = Object.entries(dependencies ?? {});\n for (const [dependencyName, dependencyValue] of dependenciesEntries) {\n const fullDependencyPath: pnpmTypes.DepPath = splicePackageWithVersion(\n shrinkwrapFileMajorVersion,\n dependencyName,\n typeof dependencyValue === 'string'\n ? dependencyValue\n : (\n dependencyValue as {\n version: string;\n specifier: string;\n }\n ).version\n ) as pnpmTypes.DepPath;\n if (fullDependencyPath.includes('link:')) {\n const dependencyProject: RushConfigurationProject | undefined =\n this._rushConfiguration.getProjectByName(dependencyName);\n if (dependencyProject && !this._checkedProjects?.has(dependencyProject)) {\n this._checkedProjects!.add(project);\n await this._searchAndValidateDependenciesAsync(dependencyProject, requiredVersions);\n }\n } else {\n await this._checkVersionCompatibilityAsync(\n shrinkwrapFileMajorVersion,\n packages,\n fullDependencyPath,\n requiredVersions,\n checkedDependencyPaths\n );\n }\n }\n }\n })\n );\n }\n\n private async _performVersionRestrictionCheckAsync(\n requiredVersions: Record<string, string>,\n projectName: string\n ): Promise<string | undefined> {\n try {\n const project: RushConfigurationProject | undefined =\n this._rushConfiguration?.getProjectByName(projectName);\n if (!project) {\n throw new Error(\n `Specified project \"${projectName}\" does not exist in ${LOCKFILE_LINT_JSON_FILENAME}`\n );\n }\n this._checkedProjects.add(project);\n await this._searchAndValidateDependenciesAsync(project, requiredVersions);\n return undefined;\n } catch (e) {\n return e.message;\n }\n }\n\n protected override async onExecuteAsync(): Promise<void> {\n const rushConfiguration: RushConfiguration | undefined = RushConfiguration.tryLoadFromDefaultLocation();\n if (!rushConfiguration) {\n throw new Error(\n 'The \"lockfile-explorer check\" must be executed in a folder that is under a Rush workspace folder'\n );\n }\n this._rushConfiguration = rushConfiguration!;\n\n const lintingFile: string = path.resolve(\n this._rushConfiguration.commonFolder,\n 'config',\n LOCKFILE_EXPLORER_FOLDERNAME,\n LOCKFILE_LINT_JSON_FILENAME\n );\n const { rules }: ILockfileLint = await JsonFile.loadAndValidateAsync(\n lintingFile,\n JsonSchema.fromLoadedObject(lockfileLintSchema)\n );\n const issues: ILintIssue[] = [];\n await Async.forEachAsync(\n rules,\n async ({ requiredVersions, project, rule }) => {\n switch (rule) {\n case 'restrict-versions': {\n const message: string | undefined = await this._performVersionRestrictionCheckAsync(\n requiredVersions,\n project\n );\n if (message) {\n issues.push({ project, rule, message });\n }\n break;\n }\n\n default: {\n throw new Error('Unsupported rule name: ' + rule);\n }\n }\n },\n { concurrency: 50 }\n );\n if (issues.length > 0) {\n this._terminal.writeLine();\n\n // Deterministic order\n for (const issue of issues.sort((a, b): number => {\n let diff: number = a.project.localeCompare(b.project);\n if (diff !== 0) {\n return diff;\n }\n diff = a.rule.localeCompare(b.rule);\n if (diff !== 0) {\n return diff;\n }\n return a.message.localeCompare(b.message);\n })) {\n this._terminal.writeLine(\n Colorize.red('PROBLEM: ') + Colorize.cyan(`[${issue.rule}] `) + issue.message + '\\n'\n );\n }\n\n throw new AlreadyReportedError();\n }\n this._terminal.writeLine(Colorize.green('SUCCESS: ') + 'All checks passed.');\n }\n}\n"]}