@preventive/triage 1.0.0-alpha.51 → 1.0.0-alpha.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/common/managed/finding-detail.d.ts +4 -2
- package/common/managed/finding-detail.js +29 -20
- package/common/managed/finding-values.d.ts +2 -0
- package/common/managed/finding-values.js +44 -0
- package/common/managed/lite-name.d.ts +2 -0
- package/common/managed/lite-name.js +20 -0
- package/common/managed/team-app.d.ts +2 -0
- package/common/managed/team-app.js +32 -3
- package/common/workspace-app.js +26 -6
- package/out/activity.js +4 -4
- package/out/chunk-JEFZTVNX.js +3 -0
- package/out/chunk-LJ7XRXFU.js +52 -0
- package/out/{chunk-PBZPYIG7.js → chunk-MYGJBYYJ.js} +1 -1
- package/out/{chunk-7JBSSRD7.js → chunk-NE2UGKRJ.js} +1 -1
- package/out/chunk-TSIFIFBX.js +232 -0
- package/out/{chunk-WRAJVD35.js → chunk-YA4ETCFU.js} +1 -1
- package/out/client-managed.js +26 -26
- package/out/compare.js +5 -5
- package/out/dialogs.js +41 -41
- package/out/index.html +3 -3
- package/out/scan.js +2 -2
- package/out/view.js +11 -11
- package/package.json +7 -1
- package/server-managed/github-requests.ts +54 -24
- package/server-managed/history-windows.ts +172 -0
- package/server-managed/http.ts +192 -62
- package/server-managed/npm-kept.ts +4 -0
- package/server-managed/repository-history.ts +2 -2
- package/server-managed/repository-pulse.ts +15 -4
- package/server-managed/repository-stamp.ts +41 -0
- package/server-managed/team-app.ts +3 -1
- package/server-managed/team-reports.ts +21 -13
- package/out/chunk-6LNQTKAV.js +0 -52
- package/out/chunk-IPAH4LKF.js +0 -232
- package/out/chunk-VDRXHIHN.js +0 -3
package/out/compare.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as e,b as t,f as n,g as r,j as i,k as a,l as o}from"./chunk-TQJDYHVE.js";import{f as s}from"./chunk-4HI2MSAV.js";import"./chunk-PXK7EU4V.js";import"./chunk-R3NZFXVR.js";import{$a as c,$d as l,Ad as u,Bd as d,
|
|
1
|
+
import{a as e,b as t,f as n,g as r,j as i,k as a,l as o}from"./chunk-TQJDYHVE.js";import{f as s}from"./chunk-4HI2MSAV.js";import"./chunk-PXK7EU4V.js";import"./chunk-R3NZFXVR.js";import{$a as c,$d as l,Ad as u,Bd as d,De as f,Ee as p,Gd as m,Hd as h,Id as g,Jd as _,Ma as v,Md as y,Na as b,Nd as x,Oa as ee,Od as S,Pa as te,Pc as C,Pd as ne,Qa as re,Qc as ie,Ra as ae,Rc as w,Sa as oe,Sc as se,Ta as ce,Tc as le,Uc as ue,Wd as de,Xd as fe,Yd as pe,Za as me,Zd as he,_a as ge,_c as _e,_d as ve,ab as ye,ae as be,bb as xe,be as Se,cd as Ce,ce as we,dd as Te,de as Ee,ed as De,ee as Oe,fd as ke,fe as Ae,gd as je,hd as Me,he as Ne,id as Pe,ja as Fe,jd as Ie,kd as Le,ld as Re,md as ze,od as Be,pd as Ve,qd as He,rd as Ue,sd as We,td as Ge,tf as Ke,uc as qe,ud as Je,uf as Ye,va as Xe,vc as Ze,vd as Qe,w as T,wc as $e,wd as et,xd as tt,yd as nt,zd as rt}from"./chunk-TSIFIFBX.js";import"./chunk-JCIIBLKR.js";import"./chunk-VH4XMZIW.js";import"./chunk-KOGNQDSJ.js";import{$ as it,_ as E,aa as at,ba as ot,ea as st,qa as ct,s as lt,ta as ut}from"./chunk-LJ7XRXFU.js";import{b as dt,c as ft,j as D,k as O}from"./chunk-7VAWINQF.js";import"./chunk-NRPC74AM.js";import"./chunk-7BKKYVWR.js";import"./chunk-7C7DWL7I.js";import"./chunk-PNHBZGDD.js";import"./chunk-VFWMQ3LG.js";import{F as k,G as pt,a as A,ta as mt}from"./chunk-FMXWXDR4.js";import"./chunk-2K6UN3PC.js";import"./chunk-WCPJDAYA.js";import{e as ht}from"./chunk-IYPY47MC.js";import{a as j,d as M}from"./chunk-PWFUOLZK.js";import{i as gt,m as _t}from"./chunk-HT2SSA3V.js";import{a as vt}from"./chunk-SXV2T5C4.js";import{C as yt,d as bt}from"./chunk-WFYLMF6Z.js";import"./chunk-C4Z6ZBXV.js";import{c as N,g as P,j as xt}from"./chunk-2XUEZHIP.js";import{b as St}from"./chunk-TUII34K2.js";import"./chunk-OOJM4CTU.js";function Ct(e){return e===0?`±0`:`${e>0?`+`:`−`}${Math.abs(e).toLocaleString()}`}function wt(e){return e===0?`±0 B`:`${e>0?`+`:`−`}${k(Math.abs(e))}`}function Tt(e){return e>0?`up`:e<0?`down`:``}function Et(e,t){if(!t)return``;let n=e/t*100;return`${n>0?`+`:n<0?`−`:`±`}${Math.abs(n).toFixed(1)}%`}function Dt(e){let t=e.totals,n=e.versionUpdates?.totals??{baseDeps:0,otherDeps:0},r=n.baseDeps>0||n.otherDeps>0,i=n.otherDeps-n.baseDeps,a=Et(t.byteDelta,t.baseBytes);return N`<div class="bundle-compare-stats">${r?N`<div class="bundle-compare-metric"><span class="bundle-compare-metric-label">Deps</span> <span class="bundle-compare-metric-value">${n.baseDeps.toLocaleString()} → ${n.otherDeps.toLocaleString()}</span> <span class="${`bundle-compare-metric-delta ${Tt(i)}`}">${Ct(i)}</span></div>`:P}<div class="bundle-compare-metric"><span class="bundle-compare-metric-label">Size</span> <span class="bundle-compare-metric-value">${k(t.baseBytes)} → ${k(t.otherBytes)}</span> <span class="${`bundle-compare-metric-delta ${Tt(t.byteDelta)}`}">${wt(t.byteDelta)}${a?N`${` `}<span class="bundle-compare-pct">(${a})</span>`:P}</span></div>${t.baseLines>0||t.otherLines>0?N`<div class="bundle-compare-metric"><span class="bundle-compare-metric-label">LoC</span> <span class="bundle-compare-metric-value">${t.baseLines.toLocaleString()} → ${t.otherLines.toLocaleString()}</span> <span class="${`bundle-compare-metric-delta ${Tt(t.otherLines-t.baseLines)}`}">${Ct(t.otherLines-t.baseLines)}</span></div>`:P}<div class="bundle-compare-files"><div class="bundle-compare-metric"><span class="bundle-compare-metric-label">Files</span> <span class="bundle-compare-metric-value">${t.baseFiles.toLocaleString()} → ${t.otherFiles.toLocaleString()}</span> <span class="${`bundle-compare-metric-delta ${Tt(t.fileDelta)}`}">${Ct(t.fileDelta)}</span></div><div class="bundle-compare-chips">${t.onlyBaseFiles>0?N`<span class="bundle-compare-chip removed">−${t.onlyBaseFiles.toLocaleString()} removed</span>`:P} ${t.onlyOtherFiles>0?N`<span class="bundle-compare-chip added">+${t.onlyOtherFiles.toLocaleString()} added</span>`:P} ${t.changedFiles>0?N`<span class="bundle-compare-chip changed">${t.changedFiles.toLocaleString()} changed${t.renamedFiles>0?` (${t.renamedFiles.toLocaleString()} renamed)`:``}</span>`:P} <span class="bundle-compare-chip unchanged">${t.unchangedFiles.toLocaleString()} unchanged</span> ${e.resolutions?.totalChanges>0?N`<span class="bundle-compare-chip changed">${e.resolutions.totalChanges.toLocaleString()} repointed ${e.resolutions.totalChanges===1?`resolution`:`resolutions`}</span>`:P}</div></div></div>`}var Ot=24;function F(e,t=e=>e.id){return e.map(e=>({id:t(e),integrity:t(e),kind:e.format,format:e.format,detail:e.detail,...e.date&&{date:e.date},...e.dateWarning&&{dateWarning:e.dateWarning},filename:e.name,displayLabel:e.displayLabel,size:`—`,summary:null}))}function kt(e){if(!e)return P;let t=({name:e=``,detail:t=``}={})=>e.length+Math.min(t.length,Ot)*.87+1,n=(e.choices??[]).reduce((e,n)=>Math.max(e,t(n)),Math.max(`Choose a ${e.noun??`bundle`}\u2026`.length,t(e.widest)));return j({"--compare-select-chars":`${Math.ceil(n)}`})}function At({source:e,label:t=`Compare`,from:n,to:r,clear:i,swap:a,extras:o=P,comparison:s=null,disabled:c=!1,openLine:l}){let u=e?.noun??`bundle`,d=`${u[0].toUpperCase()}${u.slice(1)}`,f=(t,n)=>e?.select?e.select(t,t.label??n):N`<bundle-selector .bundles="${t.options}" .value="${t.value}" .noun="${u}" .versions="${!!e}" label="${t.label??n}" placeholder="${t.placeholder??`Choose a ${u}\u2026`}" ?disabled="${c}" @bundle-change="${e=>{e.stopPropagation(),t.pick(e.detail.value)}}"></bundle-selector>`;return N`<div class="${e?`bundle-compare-picker is-versions`:`bundle-compare-picker`}" style="${kt(e)}" @compare-open-line="${e=>l?.(e.detail)}"><div class="bundle-compare-select-wrap"><span class="bundle-compare-select-hint">${t}</span> ${f(n,`${d} to compare with`)} ${i?N`<button type="button" class="bundle-compare-clear" aria-label="${i.label??`Clear comparison`}" ?disabled="${c}" @click="${i.run}">×</button>`:P}</div><span class="bundle-compare-arrow" aria-hidden="true">→</span><div class="bundle-compare-select-wrap">${f(r,`${d} to compare`)} ${a?N`<button type="button" class="bundle-compare-swap" ?disabled="${c}" @click="${a}" aria-label="${`Swap the two ${u}s`}"><span class="bundle-compare-swap-icon" aria-hidden="true">↔</span>Swap</button>`:P}</div>${o}${s?e?.badges?.(s.base,s.other,s.files)??P:P}</div>`}function jt(e,t=P){return N`<div class="bundle-compare-summary">${Dt(e)}${t}</div>`}function Mt(e,t=P){return N`<header class="bundle-compare-head">${e}${t}</header>`}var Nt=4,Pt=5e3,Ft=3e5,It=e=>!(e>=400&&e<500&&e!==429),Lt=e=>e?.integrity===`(empty)`,I=new Map;function Rt(){for(let[e,t]of I){if(I.size<=Nt)break;t.state.status!==`loading`&&I.delete(e)}}function zt(e){e.notify?.();for(let t of e.waiting.splice(0))t()}var Bt=null,Vt=(e,t)=>!!(e.managedId&&t.managedId)||!(!t.npm&&!t.npmPatch||!e.npm&&!Lt(e));function Ht(e,t,n){if(e.managedId&&t.managedId)return oe(e.managedId,t.managedId,{scope:n});if(Vt(e,t)){let{name:n,version:r,patch:i}=t.npm??t.npmPatch;return ce(n,r,e.npm?.version??`(empty)`,{otherName:e.npm?.name??n,...i?{patch:i}:{}})}return import(`./chunk-WYLQWYLA.js`).then(r=>(Bt=r,r.prepareComparison(e,t,n)))}async function Ut(e,t,n,r,i){let a;try{a={status:`ready`,diff:await Ht(n,r,i)}}catch(n){if(n?.name===`AbortError`){I.get(e)===t&&I.delete(e),zt(t);return}if(a={status:`error`,message:n?.message??String(n)},It(n?.status)){let e=Math.min(Pt*2**t.failures,Ft);Object.assign(t,{retryAt:Date.now()+e,failures:t.failures+1}),setTimeout(()=>{t.notify?.()},e)?.unref?.()}}a.status===`ready`&&(t.failures=0),t.state=a,zt(t),Rt()}var Wt=new WeakMap,Gt=0,Kt=e=>(Wt.has(e)||Wt.set(e,++Gt),Wt.get(e));function qt(e,t,n,r=!1){let i=Vt(e,t)?`${e.integrity}\0${t.integrity}\0${n??``}`:`${Kt(e)}\0${Kt(t)}\0${n??``}\0here`,a=I.get(i);return I.delete(i),(!a||r&&a.state.status===`error`||a.retryAt!==void 0&&Date.now()>=a.retryAt)&&(a={state:{status:`loading`},notify:a?.notify??null,waiting:[],failures:a?.failures??0},Bt&&!Vt(e,t)?a.state={status:`ready`,diff:Bt.prepareComparison(e,t,n??``)}:Ut(i,a,e,t,n??``)),I.set(i,a),Rt(),a}function Jt(e,t,n,r){let i=qt(e,t,n);return i.notify=r,i.state}function Yt(e,t,n=null){return new Promise((r,i)=>{let a=(o=!1)=>{let s=qt(e,t,n,o),{state:c}=s;c.status===`loading`?s.waiting.push(()=>a()):c.status===`ready`?r(c.diff):i(Error(c.message))};a(!0)})}function Xt(e,t){let{head:n,from:i,to:a,tail:o}=r(e,t);return N`${n}{<span class="bundle-compare-rename-from">${i}</span> → <span class="bundle-compare-rename-to">${a}</span>}${o}`}function Zt({from:e,to:t}){return N`<span class="bundle-compare-rename-from">${e}</span> → <span class="bundle-compare-rename-to">${t}</span>`}function Qt(e){let t=new Map;if(!e)return t;for(let n of e.onlyBase)t.set(n.path,{kind:`removed`,basePath:n.basePath,baseBytes:n.bytes,otherBytes:null});for(let n of e.onlyOther)t.set(n.path,{kind:`added`,baseBytes:null,otherBytes:n.bytes});for(let n of e.changed){let e={...n.meta?{meta:n.meta}:{}};t.set(n.path,n.renamedFrom==null?{kind:`changed`,basePath:n.basePath,baseBytes:n.baseBytes,otherBytes:n.otherBytes,...n.modified===!1?{modified:!1}:{},...e}:{kind:`renamed`,basePath:n.basePath,renamedFrom:n.renamedFrom,modified:n.modified,baseBytes:n.baseBytes,otherBytes:n.otherBytes,...e})}return t}function L(e,t,n,{kind:r,basePath:i=n}){let a=r===`added`?``:D(e).get(i),o=r===`removed`?``:D(t).get(n);return r===`repointed`&&(a=o??=a),{before:a,after:o}}function $t(e,t,n,r=[]){let i=Qt(n);if(!n)return i;for(let n of r){if(!i.has(n.parent)){let r=O(D(t).get(n.parent)??D(e).get(n.parent));i.set(n.parent,{kind:`repointed`,baseBytes:r,otherBytes:r})}let r=i.get(n.parent);r.repointed=[...r.repointed??[],n]}return i}function en(e,t,n){return[...$t(e,t,n.files,n.resolutions?.changed)].map(([n,r])=>({path:n,...r,...L(e,t,n,r)}))}function tn(e,{maxBytes:t,maxLines:n}){let r=0,i=0;for(let{before:a,after:o}of e)for(let e of[a,o])if(r+=O(e)??0,r>=t||(typeof e==`string`&&e!==``&&(i+=(e.match(/\n/gu)?.length??0)+ +!e.endsWith(`
|
|
2
2
|
`)),i>=n))return!1;return!0}function R(e){if(e===``)return[];let t=e.split(`
|
|
3
3
|
`);return t.at(-1)===``&&t.pop(),t}var nn=e=>e===``||e.endsWith(`
|
|
4
4
|
`),rn=e=>e.replace(/[ \t\n\v\f\r]+$/u,``).replaceAll(/[ \t\n\v\f\r]+/gu,` `);function z(e,t,n=!1){return s(e,t,{horizon:0,whitespace:n?`change`:`none`}).map(({a0:e,a1:t,b0:n,b1:r})=>({a0:e,a1:t,b0:n,b1:r}))}function an(e,t,n,r=!1){if(!Array.isArray(n))return!1;let i=R(e),a=R(t),o=r?(e,t)=>rn(e)===rn(t):(e,t)=>e===t,s=0,c=0;for(let l of[...n,{a0:i.length,a1:i.length,b0:a.length,b1:a.length,last:!0}]){let{a0:n,a1:u,b0:d,b1:f}=l??{};if(![n,u,d,f].every(Number.isInteger)||n<s||d<c||u<n||f<d||u>i.length||f>a.length||!l.last&&u===n&&f===d||n-s!==d-c||l.last&&n>s&&!r&&nn(e)!==nn(t))return!1;for(;s<n;s++,c++)if(!o(i[s],a[c]))return!1;s=u,c=f}return!0}var on=3,B=20,sn=4;function cn(e,t,{ignoreWhitespace:n=!1,changes:r=null,marks:i=null}={}){let a=R(e),o=R(t),s=r?.blocks??z(e,t,n),c={a:e!==``&&!e.endsWith(`
|
|
@@ -13,17 +13,17 @@ import{a as e,b as t,f as n,g as r,j as i,k as a,l as o}from"./chunk-TQJDYHVE.js
|
|
|
13
13
|
Affects files: ${e.length.toLocaleString()}`:`
|
|
14
14
|
Affects files:
|
|
15
15
|
${e.join(`
|
|
16
|
-
`)}`:``,ni=(e,t)=>N`<span class="bundle-compare-code-counts" aria-label="${`${e} added, ${t} removed lines`}"><span class="add">+${e.toLocaleString()}</span><span class="del">−${t.toLocaleString()}</span></span>`,ri=(e,t,n)=>e.hideable??=mn(t,n,e.blocks),K=(e,t)=>e.length+t.length>_r||Zr(e)+Zr(t)>gr,ii=e=>e.kind===`repointed`||e.kind===`renamed`&&!e.modified&&!!e.repointed&&!e.meta,ai=e=>Array.isArray(e)?e.some(ai):e?.strings?e.strings.some(e=>e.trim()!==``)||e.values.some(ai):e!=null&&e!==P&&e!==!1&&e!==``,oi=new WeakMap;function si(e,t){if(oi.has(e))return oi.get(e);let n=new Set;for(let e of t)for(let t=e.lastIndexOf(`/`);t>0&&!n.has(e.slice(0,t));t=e.lastIndexOf(`/`,t-1))n.add(e.slice(0,t));return oi.set(e,n),n}function ci(e){let t=D(e);return si(t,t.keys())}function li(e,t){for(let n of e.files.values())if(n===t)return!0;for(let n of e.dirs.values())if(li(n,t))return!0;return!1}var ui=class extends xt{static properties={base:{attribute:!1},other:{attribute:!1},files:{attribute:!1},scope:{attribute:!1},resolutions:{attribute:!1},baseAlerts:{attribute:!1},otherAlerts:{attribute:!1},alertTags:{attribute:!1},newHosts:{attribute:!1},newHostTag:{attribute:!1},dependencies:{attribute:!1},openDependency:{attribute:!1},dependencyTags:{attribute:!1},extensions:{attribute:!1},baseName:{},otherName:{},path:{},seek:{attribute:!1},_query:{state:!0},_kinds:{state:!0},_mode:{state:!0}};createRenderRoot(){return this}constructor(){super(),this.base=null,this.other=null,this.files=null,this.scope=``,this.resolutions=[],this.baseAlerts=null,this.otherAlerts=null,this.alertTags=null,this.newHosts=null,this.newHostTag=null,this.extensions=null,this._treeLimit=300,this._treeRemaining=1/0,this.path=null,this._query=``,this._kinds=new Set(mr.map(e=>e.kind)),this._mode=`files`,this._blocks=new Map,this._found=null,this._rowless=new Map,this._rowlessCount=0,this._aligned=new WeakMap,this._sought=null,this._soughtRow=null,this._open=new Map,this._models=new Map,this._modelCap=vr,this._counted=new Map,this._countModels=new Map,this._drawnCounts=new Map,this._drawnTotals=new Map,this._spaced=new Map,this._shorter=new Map,this._larges=new Map,this._expansions=new Map,this._limits=new Map,this._forced=new Set,this._shownPath=null}willUpdate(e){let t=`${this.base?.integrity}|${this.other?.integrity}`;if((t!==this._pair||e.has(`files`))&&(this._pair=t,this._models.clear(),this._spaced.clear(),this._shorter.clear(),this._larges.clear(),this._expansions.clear(),this._limits.clear(),this._forced.clear()),[`files`,`resolutions`,`base`,`other`].some(t=>e.has(t))&&(this._entries=$t(this.base,this.other,this.files,this.resolutions??[]),this._counted=new Map,this._countModels=new Map,this._drawnCounts=new Map,this._drawnTotals=new Map,this._treeLimit=this.extensions?.treePageSize??1/0,this._blocks.clear(),this._rowless.clear(),this._sought=this._soughtRow=null,this._soughtSettling=!1),e.has(`seek`)&&this.seek&&!Tr.has(this.seek)){Tr.add(this.seek);let{path:e,line:t,query:n}=this.seek,r=this._entries?.get(e),i=r?L(this.base,this.other,e,r).after:null,a=typeof i==`string`?R(i)[t]?.toLowerCase().indexOf(n.toLowerCase())??-1:-1;this._sought={path:e,side:`b`,line:t,at:Math.max(a,0),query:n},this._soughtRow=null,this._soughtSettling=!1}}updated(){if(this._current!==this._shownPath){this._shownPath=this._current;let e=this.querySelector(`.bundle-compare-diff`);e&&(e.scrollTop=0),this.querySelector(`.bundle-compare-code-tree .bundle-code-tree-link.current`)?.scrollIntoView({block:`nearest`})}this._scrollSought()}_scrollSought(){if(this._sought?.path===this._current&&!this._soughtSettling&&(this._sought=null),!this._soughtRow)return;let{path:e,index:t}=this._soughtRow;this._soughtRow=null;let n=[...this.querySelectorAll(`.bundle-compare-diff-table`)].find(t=>t.dataset.path===e)?.children[t];if(!n)return;let r=n.closest(`.bundle-compare-diff`);n.scrollIntoView({block:r&&n.offsetHeight>r.clientHeight/2?`start`:`center`}),n.classList.remove(`is-sought`),n.offsetWidth,n.classList.add(`is-sought`),n.addEventListener(`animationend`,()=>n.classList.remove(`is-sought`),{once:!0})}_shown(e){return this._kinds.has(e.kind)||!!e.modified&&this._kinds.has(`changed`)||!!e.repointed&&this._kinds.has(`repointed`)}_modules(){let e=this.base?.kind===`stasis`?this.base.bundle?.modules:null,t=this.other?.kind===`stasis`?this.other.bundle?.modules:null,n={root:this.files?.root,paths:this.files?.basePaths??new Map};return e||t?new Map([...[...e??[]].map(([e,t])=>[i(n,e,Object.keys(t.files??{})),t]),...t??[]]):null}_baseDirs(){let e=this.files?.root?this.files.basePaths:null;return e?si(e,e.values()):ci(this.base)}_format(e){let t=this._entries.get(e),n=at(this.base,t?.basePath??e),r=at(this.other,e);return[n,r].find(it)??(t?.kind===`removed`?n:r)}_tree(){let e=[this._entries,`${[...this._kinds].join()}:${!!this.extensions?.fullPaths}`];if(this._treeKey?.[0]===e[0]&&this._treeKey[1]===e[1])return this._treeMemo;let t=[...this._entries.keys()],n=this._modules(),r=a(this.files?.root,this.extensions?.fullPaths?``:Ae(pt(t).prefix,n,t)),{prefix:i}=r,o=t.filter(e=>this._shown(this._entries.get(e))),s=ke(o.map(e=>i&&e.startsWith(i)?e.slice(i.length):e),o,n);return this._treeKey=e,this._treeMemo={prefix:i,root:r,tree:s,shown:o.length,allOrder:Le(s)},this._treeMemo}_select(e){!e||e===this._current||this.extensions?.canSelect?.()===!1||this.dispatchEvent(new CustomEvent(`compare-code-select`,{detail:{path:e},bubbles:!0,composed:!0}))}_reveal(e,t){let n=(t&&e.startsWith(t)?e.slice(t.length):e).split(`/`);for(let e=1;e<n.length;e++)this._open.set(n.slice(0,e).join(`/`),!0)}_railState(){let{prefix:e,root:t,tree:n,shown:r,allOrder:i}=this._tree(),a=Me(n,this._mode===`files`?this._query:``,e,this.extensions?.fileFilter);return{prefix:e,root:t,tree:n,shown:r,filtered:a,order:a===n?i:a?Le(a):[],allOrder:i}}_renderRail({prefix:e,root:t,tree:n,shown:r,filtered:i,order:a},o){this._countUntil=null,this._treeRemaining=this.extensions?.treePageSize?this._treeLimit:1/0,this._treeTruncated=!1;let s=this._mode===`code`?P:i?this._renderTree(i,o,0,!!this._query||r<=(this.extensions?.openAllMax??br)):N`<div class="bundle-code-search-empty">No changed files match.</div>`,c=Object.fromEntries(mr.map(({kind:e})=>[e,0]));for(let e of this._entries.values())e.kind!==`repointed`&&c[e.kind]++,e.modified&&c.changed++,e.repointed&&c.repointed++;let l=Sr.find(({mode:e})=>e===this._mode);return N`<aside class="bundle-code-rail"><div class="bundle-code-rail-head"><span class="bundle-code-rail-label">${this.extensions?.railLabel??`Changes`}</span> <span class="bundle-code-rail-count">${this._entries.size.toLocaleString()}</span> <span class="bundle-code-rail-actions"><button type="button" class="bundle-code-rail-action" aria-label="${this.extensions?.collapseLabel??`Collapse directories`}" data-tooltip="Collapse directories" ?disabled="${this._mode!==`files`||!!this._query&&!this.extensions?.collapseClearsSearch||n.dirs.size===0}" @click="${()=>this._collapseAll(n)}">${se}</button></span></div>${t.from?N`<div class="bundle-code-rail-prefix mono" data-tooltip="${`Root moved: ${t.from} \u2192 ${t.to}`}">${Zt(t)}</div>`:e?N`<div class="bundle-code-rail-prefix mono" data-tooltip-truncated data-tooltip="${e}">${e}</div>`:P}<div class="bundle-compare-code-filter"><label class="bundle-compare-code-search"><svg viewBox="0 0 16 16" width="12" height="12" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" aria-hidden="true"><circle cx="7" cy="7" r="4.5"/><path d="m10.5 10.5 3.5 3.5"/></svg> <input type="search" placeholder="${this._mode===`files`?this.extensions?.searchPlaceholder??l.placeholder:l.placeholder}" aria-label="${this._mode===`files`?this.extensions?.searchLabel??l.placeholder:l.placeholder}" spellcheck="false" autocomplete="off" .value="${E(this._query)}" @input="${e=>{this._query=e.target.value,this._treeLimit=this.extensions?.treePageSize??1/0}}"> <span class="bundle-code-search-modes" role="tablist">${Sr.map(({mode:e,label:t,icon:n})=>N`<button type="button" class="${A({"bundle-code-search-mode":!0,active:e===this._mode})}" role="tab" aria-selected="${String(e===this._mode)}" aria-label="${t}" data-tooltip="${t}" @click="${()=>{this._mode=e}}">${n}</button>`)}</span></label> ${this.extensions?.filters??N`<div class="bundle-compare-code-kinds" role="group" aria-label="Show changes">${mr.filter(({kind:e})=>c[e]>0).map(({kind:e,label:t})=>N`<button type="button" class="${`bundle-compare-code-kind ${e}`}" aria-pressed="${String(this._kinds.has(e))}" data-tooltip="${`${this._kinds.has(e)?`Hide`:`Show`} ${t.toLowerCase()} files`}" @click="${()=>this._toggleKind(e)}">${t.toLowerCase()}</button>`)}</div>`}</div><div class="bundle-code-rail-body bundle-compare-code-tree">${this._mode===`code`?this._renderSearch(a,o,e):s} ${this._mode===`files`&&this._treeTruncated?N`<button type="button" class="bundle-compare-code-action" @click="${()=>{this._treeLimit+=this.extensions.treePageSize,this.requestUpdate()}}">Show more files</button>`:P}</div>${this.extensions?.footer?.(e=>{this._query=``,this._select(e)})??P}</aside><bundle-code-splitter role="separator" tabindex="0" aria-orientation="vertical" aria-label="Resize file tree" data-tooltip="Drag to resize · double-click to reset"></bundle-code-splitter>`}_arrived=0;_renamesAlone=!0;_repaint=()=>{this._arrived++,this.isConnected&&this.requestUpdate()};disconnectedCallback(){super.disconnectedCallback(),clearTimeout(this._countLater),clearTimeout(this._searchLater),this._countLater=this._searchLater=null}render(){let e=this._railState(),t=this._entries.has(this.path)?this.path:e.order[0]??null;t&&t!==this._current&&this._reveal(t,e.prefix),this._current=t,this._order=this.extensions?.filterContent===!1?e.allOrder:e.order;let n=t?N`${this._renderFile(t,this.extensions?.fullPaths?``:e.prefix)}${this.extensions?.fileActions?.(t,!1)??P}`:N`<div class="bundle-code-placeholder">No files differ in this comparison.</div>`;return N`<div class="bundle-code-view bundle-compare-code">${this._renderRail(e,t)}<div class="bundle-code-main">${n}</div></div>`}_toggleKind(e){let t=new Set(this._kinds);t.has(e)?t.delete(e):t.add(e),this._kinds=t}_collapseAll(e){this.extensions?.collapseClearsSearch&&(this._query=``),this._treeLimit=this.extensions?.treePageSize??1/0;let t=e=>{for(let n of e.dirs.values())this._open.set(n.path,!1),t(n)};t(e),this.requestUpdate()}_renderSearch(e,t,n){if(!this._query)return N`<div class="bundle-code-search-hint">Type to search the code of the changed files.</div>`;let{files:r,hits:i,truncated:a,unsigned:o}=this._searchResults(e);if(r.length===0)return N`<div class="bundle-code-search-empty">No matches.</div>`;let s=e=>n&&e.startsWith(n)?e.slice(n.length):e;return N`<div class="bundle-code-search-results bundle-compare-search"><div class="bundle-code-search-summary">${i.toLocaleString()} ${i===1?`hit`:`hits`} in ${r.length.toLocaleString()} ${r.length===1?`file`:`files`}${a?`, the first ${En}`:``}</div>${M(r,e=>e.path,({path:e,hits:n})=>N`<div class="${A({"bundle-code-search-file":!0,current:e===t})}"><button type="button" class="${`bundle-code-search-file-name bundle-compare-code-name ${this._entries.get(e).kind}`}" data-tooltip-truncated data-tooltip="${e}" @click="${()=>this._select(e)}">${s(e)}</button> ${o.has(e)?N`<p class="bundle-compare-search-note">${Er[o.get(e)]}</p>`:P}<ul class="bundle-code-search-hits">${n.map(t=>N`<li class="bundle-code-search-hit"><button type="button" class="bundle-code-search-hit-link" aria-label="${`${Dr[t.sign]?.label??`Line`} ${t.line+1}${t.side===`a`?` of the old text`:``}: ${t.text.trim().slice(0,80)}`}" @click="${()=>this._seek(e,t)}"><span class="bundle-code-search-hit-ln">${t.line+1}</span> <span class="${`bundle-compare-search-sign ${Dr[t.sign]?.name??``}`}" aria-hidden="true">${t.sign??``}</span> <span class="bundle-code-search-hit-text mono">${p(t.text,t.ranges)}</span></button></li>`)}</ul></div>`)}</div>`}_searchResults(e){let t=Or(),r=`${this._query}\0${this._forced.size}\0${t}\0${G.layout}\0${!!T.bundleSourcePretty}\0${nt()}\0${this._rowlessCount}\0${e.join(`\0`)}`;if(this._found?.key===r&&this._found.entries===this._entries)return this._found.result;let i=null,a=!0,o=new Map,s={...jn(e.flatMap(e=>{let n=this._entries.get(e);if(!this._searchable(n))return[];let r=L(this.base,this.other,e,n),{before:i,after:a}=r;if(this._prettyShown(e,n,r)){if(!/\S/u.test(this._query))return[];let n=i!==``&&a!==``&&i!==a;if(n&&this._rowless.get(e)===t)return[];o.set(e,n?`printed`:`numbered`)}return[{path:e,...r}]}),f(this._query,!1,!1),(e,t,r)=>{if(o.get(e)===`printed`)return null;let s=`${G.ignoreWhitespace}\0${e}`;if(this._blocks.has(s))return this._blocks.get(s);if(!this._forced.has(e)&&K(t,r))return o.set(e,`large`),null;let c=performance.now();if(i??=c+xr,c>i)return a=!1,null;let l=G.ignoreWhitespace&&!this._unlisted(e,this._entries.get(e),{before:t,after:r}),u=z(t,r,l);return l&&n(t,r,u)&&(u=z(t,r)),this._blocks.set(s,u),u},{split:G.layout===`split`,align:(e,t,n,r)=>{let i=this._aligned.get(n);return i||this._aligned.set(n,i={a:e,b:t,blocks:n}),Cn(i,n.indexOf(r))}}),unsigned:o};return a?this._found={key:r,entries:this._entries,result:s}:this._searchLater??=setTimeout(()=>{this._searchLater=null,this.requestUpdate()}),s}_searchable(e){return e.modified!==!1||ii(e)}_prettyShown(e,t,n){if(!T.bundleSourcePretty)return!1;let r=this._printing(e,t,n);return!!r?.applies&&r.copies.status!==`error`}_noteRowless(e,t){let n=t?Or():void 0;this._rowless.get(e)!==n&&(n===void 0?this._rowless.delete(e):this._rowless.set(e,n),this._rowlessCount++)}_seek(e,t){this._sought={path:e,side:t.side,line:t.line,at:t.ranges[0]?.[0]??0,query:this._query},e===this._current?this.requestUpdate():this._select(e,!1)}_soughtLine(e,t,n,r){let{side:i,line:a,at:o,query:s}=this._sought;if(n?.status!==`ready`)return{side:i,line:a};let c=e=>e.replaceAll(/\s+/gu,``),l=R(L(this.base,this.other,e,t)[i===`a`?`before`:`after`]??``),u=l.slice(0,a).reduce((e,t)=>e+c(t).length,0)+c(l[a]?.slice(0,o)??``).length,d=c(s).toLowerCase(),f=(e,t)=>{if(!d)return null;let n=0,r=0,i=0,a=``;for(let o of e)for(let e=0;e<o.length;e+=wr){a+=c(o.slice(e,e+wr)).toLowerCase();for(let e=a.indexOf(d,n);e!==-1;e=a.indexOf(d,n),r++){if(t(r,i+e))return{index:r,start:i+e};n=e+d.length}let s=Math.max(n,a.length-d.length+1);a=a.slice(s),i+=s,n=Math.max(0,n-s)}return null},p=f(l,(e,t)=>t>=u),m=(p&&f(r[i],e=>e===p.index)?.start)??u;for(let e=0;e<r[i].length;e++)if(m-=c(r[i][e]).length,m<0)return{side:i,line:e};return null}_seekRows(e,t,{side:n,line:r},i){let a=e=>n===`b`?(e.kind===`ctx`||e.kind===`add`)&&e.b===r||e.kind===`change`&&e.right===r:(e.kind===`ctx`||e.kind===`del`)&&e.a===r||e.kind===`change`&&e.left===r,o=this._expansions.get(e)??new Map,s=bn(t,o,{split:i}),c=s.findIndex(a);if(c===-1){let l=s.find(e=>e.kind===`fold`&&r>=e[n]&&r<e[n]+e.count);if(l){let u=o.get(l.run)??{},d=r-l[n];o=new Map(o).set(l.run,l.down?{...u,top:(u.top??0)+d+1+Cr}:l.up?{...u,bottom:(u.bottom??0)+l.count-d+Cr}:{all:!0}),this._expansions.set(e,o),s=bn(t,o,{split:i}),c=s.findIndex(a)}}let l=this._limits.get(e)??W;return c>=l&&this._limits.set(e,Math.ceil((c+1)/W)*W),{rows:s,index:c}}_takeTreeRow(e=!1){return this._treeRemaining-->0||(this._treeTruncated=!0,e)}_renderTree(e,t,n,i){let a=[...e.dirs.entries()].toSorted(Ie),o=[...e.files.entries()].toSorted(([e],[t])=>e.localeCompare(t)),s=a.flatMap(([e,r])=>{let a=Ne(e,r,n),o=r.package,s=o?.ecosystem===`cargo`||o?.ecosystem===`composer`||o?.ecosystem===`soldeer`,c=this._query?!0:this._open.get(r.path)??(i||n===0||li(r,t)),l=this._baseDirs().has(r.sourcePath)?ci(this.other).has(r.sourcePath)?null:`removed`:`added`;if(!this._takeTreeRow(li(r,t)))return[];let u=N`<li class="bundle-code-tree-dir"><details .open="${E(c)}" @toggle="${e=>{let t=e.currentTarget.open;this._open.get(r.path)!==t&&(this._open.set(r.path,t),this.extensions?.treePageSize&&this.requestUpdate())}}"><summary aria-label="${this.extensions?.directoryLabel?.(a.node)??P}"><span class="bundle-code-tree-chevron" aria-hidden="true"></span> ${o?st(o.ecosystem):P} <span class="${A({"bundle-code-tree-dirname":!0,"bundle-code-tree-package":!!o,"bundle-code-tree-package-vendored":s,"bundle-compare-code-name":!0,removed:l===`removed`})}" data-tooltip-truncated data-tooltip="${a.node.sourcePath}">${o?N`<span class="bundle-code-tree-package-name">${o.name}</span>${o.version?N`<span class="bundle-code-tree-package-version">${s?`- `:`@`}${o.version}</span>`:P}`:a.names.map((e,t)=>N`${t>0?N`<span class="bundle-code-tree-separator">/</span>`:P}${e}`)} </span>${o?.variant?N`<span class="bundle-code-tree-variant">variant ${o.variant}</span>`:P} <span class="bundle-compare-code-dir-count" data-tooltip="${`${r.fileCount} changed ${r.fileCount===1?`file`:`files`}`}">${this.extensions?.directorySummary?.(a.node)??r.fileCount}</span> ${l?N`<span class="${`bundle-compare-code-letter ${l}`}" data-tooltip="${`${o?`Package`:`Directory`} ${l}`}">${hr[l].letter}</span>`:P}</summary>${c||!this.extensions?.treePageSize?this._renderTree(a.node,t,n+1,i):P}</details></li>`;return[{key:r.path,content:u}]}),c=o.flatMap(([e,n])=>{if(!this._takeTreeRow(n===t))return[];let{kind:i,repointed:a,renamedFrom:o,modified:s}=this._entries.get(n),c=a?`${a.length} repointed ${a.length===1?`import`:`imports`}`:``;return[{key:n,content:N`<li class="bundle-code-tree-file"><button type="button" class="${A({"bundle-code-tree-link":!0,current:n===t})}" aria-label="${this.extensions?.fileLabel?.(n)??P}" aria-current="${n===t?`true`:P}" @click="${()=>this._select(n)}">${this.extensions?.filePrefix?.(n)??P}${ot(n,this._format(n))}<span class="${`bundle-code-tree-name bundle-compare-code-name ${i}`}" data-tooltip-truncated data-tooltip="${n}">${e}</span> ${this.extensions?.fileSuffix?.(n)??P} ${o?N`<span class="bundle-compare-code-oldname" data-tooltip-truncated data-tooltip="${`Renamed from ${o}`}">← ${r(o,n,{extension:!1}).from}</span>`:P} ${this._fileTags(n,this._entries.get(n),!0)} ${this._treeCounts(n,this._entries.get(n))} ${a&&i!==`repointed`?N`<span class="bundle-compare-code-letter repointed" data-tooltip="${c}">R</span>`:P} <span class="${A({"bundle-compare-code-letter":!0,[i]:!0,pure:i===`renamed`&&!s})}" data-tooltip="${i===`repointed`?c:o?`Renamed${s?` and modified`:``} from ${o}`:hr[i].label}">${hr[i].letter}</span></button></li>`}]});return N`<ul class="${A({"bundle-code-tree":!0,root:n===0})}" aria-label="${n===0?this.extensions?.treeLabel??`Changed files`:P}" @keydown="${n===0?Pe:P}">${M(s,e=>e.key,e=>e.content)}${M(c,e=>e.key,e=>e.content)}</ul>`}_treeCounts(e,t){if(t.kind===`repointed`)return P;let n=this._lineCounts(e,t),r;if(n===null&&this._counted.has(e)?{published:n,shown:r}=this._largeCounts(e,t):r=n&&this._shownCounts(e,t),!(n||r)||r===void 0)return P;let{additions:i,deletions:a}=r??n,o=!n||n.additions>0||n.deletions>0,s=t.kind===`renamed`,c=r?.renamed>0?`
|
|
16
|
+
`)}`:``,ni=(e,t)=>N`<span class="bundle-compare-code-counts" aria-label="${`${e} added, ${t} removed lines`}"><span class="add">+${e.toLocaleString()}</span><span class="del">−${t.toLocaleString()}</span></span>`,ri=(e,t,n)=>e.hideable??=mn(t,n,e.blocks),K=(e,t)=>e.length+t.length>_r||Zr(e)+Zr(t)>gr,ii=e=>e.kind===`repointed`||e.kind===`renamed`&&!e.modified&&!!e.repointed&&!e.meta,ai=e=>Array.isArray(e)?e.some(ai):e?.strings?e.strings.some(e=>e.trim()!==``)||e.values.some(ai):e!=null&&e!==P&&e!==!1&&e!==``,oi=new WeakMap;function si(e,t){if(oi.has(e))return oi.get(e);let n=new Set;for(let e of t)for(let t=e.lastIndexOf(`/`);t>0&&!n.has(e.slice(0,t));t=e.lastIndexOf(`/`,t-1))n.add(e.slice(0,t));return oi.set(e,n),n}function ci(e){let t=D(e);return si(t,t.keys())}function li(e,t){for(let n of e.files.values())if(n===t)return!0;for(let n of e.dirs.values())if(li(n,t))return!0;return!1}var ui=class extends xt{static properties={base:{attribute:!1},other:{attribute:!1},files:{attribute:!1},scope:{attribute:!1},resolutions:{attribute:!1},baseAlerts:{attribute:!1},otherAlerts:{attribute:!1},alertTags:{attribute:!1},newHosts:{attribute:!1},newHostTag:{attribute:!1},dependencies:{attribute:!1},openDependency:{attribute:!1},dependencyTags:{attribute:!1},extensions:{attribute:!1},baseName:{},otherName:{},path:{},seek:{attribute:!1},_query:{state:!0},_kinds:{state:!0},_mode:{state:!0}};createRenderRoot(){return this}constructor(){super(),this.base=null,this.other=null,this.files=null,this.scope=``,this.resolutions=[],this.baseAlerts=null,this.otherAlerts=null,this.alertTags=null,this.newHosts=null,this.newHostTag=null,this.extensions=null,this._treeLimit=300,this._treeRemaining=1/0,this.path=null,this._query=``,this._kinds=new Set(mr.map(e=>e.kind)),this._mode=`files`,this._blocks=new Map,this._found=null,this._rowless=new Map,this._rowlessCount=0,this._aligned=new WeakMap,this._sought=null,this._soughtRow=null,this._open=new Map,this._models=new Map,this._modelCap=vr,this._counted=new Map,this._countModels=new Map,this._drawnCounts=new Map,this._drawnTotals=new Map,this._spaced=new Map,this._shorter=new Map,this._larges=new Map,this._expansions=new Map,this._limits=new Map,this._forced=new Set,this._shownPath=null}willUpdate(e){let t=`${this.base?.integrity}|${this.other?.integrity}`;if((t!==this._pair||e.has(`files`))&&(this._pair=t,this._models.clear(),this._spaced.clear(),this._shorter.clear(),this._larges.clear(),this._expansions.clear(),this._limits.clear(),this._forced.clear()),[`files`,`resolutions`,`base`,`other`].some(t=>e.has(t))&&(this._entries=$t(this.base,this.other,this.files,this.resolutions??[]),this._counted=new Map,this._countModels=new Map,this._drawnCounts=new Map,this._drawnTotals=new Map,this._treeLimit=this.extensions?.treePageSize??1/0,this._blocks.clear(),this._rowless.clear(),this._sought=this._soughtRow=null,this._soughtSettling=!1),e.has(`seek`)&&this.seek&&!Tr.has(this.seek)){Tr.add(this.seek);let{path:e,line:t,query:n}=this.seek,r=this._entries?.get(e),i=r?L(this.base,this.other,e,r).after:null,a=typeof i==`string`?R(i)[t]?.toLowerCase().indexOf(n.toLowerCase())??-1:-1;this._sought={path:e,side:`b`,line:t,at:Math.max(a,0),query:n},this._soughtRow=null,this._soughtSettling=!1}}updated(){if(this._current!==this._shownPath){this._shownPath=this._current;let e=this.querySelector(`.bundle-compare-diff`);e&&(e.scrollTop=0),this.querySelector(`.bundle-compare-code-tree .bundle-code-tree-link.current`)?.scrollIntoView({block:`nearest`})}this._scrollSought()}_scrollSought(){if(this._sought?.path===this._current&&!this._soughtSettling&&(this._sought=null),!this._soughtRow)return;let{path:e,index:t}=this._soughtRow;this._soughtRow=null;let n=[...this.querySelectorAll(`.bundle-compare-diff-table`)].find(t=>t.dataset.path===e)?.children[t];if(!n)return;let r=n.closest(`.bundle-compare-diff`);n.scrollIntoView({block:r&&n.offsetHeight>r.clientHeight/2?`start`:`center`}),n.classList.remove(`is-sought`),n.offsetWidth,n.classList.add(`is-sought`),n.addEventListener(`animationend`,()=>n.classList.remove(`is-sought`),{once:!0})}_shown(e){return this._kinds.has(e.kind)||!!e.modified&&this._kinds.has(`changed`)||!!e.repointed&&this._kinds.has(`repointed`)}_modules(){let e=this.base?.kind===`stasis`?this.base.bundle?.modules:null,t=this.other?.kind===`stasis`?this.other.bundle?.modules:null,n={root:this.files?.root,paths:this.files?.basePaths??new Map};return e||t?new Map([...[...e??[]].map(([e,t])=>[i(n,e,Object.keys(t.files??{})),t]),...t??[]]):null}_baseDirs(){let e=this.files?.root?this.files.basePaths:null;return e?si(e,e.values()):ci(this.base)}_format(e){let t=this._entries.get(e),n=at(this.base,t?.basePath??e),r=at(this.other,e);return[n,r].find(it)??(t?.kind===`removed`?n:r)}_tree(){let e=[this._entries,`${[...this._kinds].join()}:${!!this.extensions?.fullPaths}`];if(this._treeKey?.[0]===e[0]&&this._treeKey[1]===e[1])return this._treeMemo;let t=[...this._entries.keys()],n=this._modules(),r=a(this.files?.root,this.extensions?.fullPaths?``:ke(pt(t).prefix,n,t)),{prefix:i}=r,o=t.filter(e=>this._shown(this._entries.get(e))),s=De(o.map(e=>i&&e.startsWith(i)?e.slice(i.length):e),o,n);return this._treeKey=e,this._treeMemo={prefix:i,root:r,tree:s,shown:o.length,allOrder:Le(s)},this._treeMemo}_select(e){!e||e===this._current||this.extensions?.canSelect?.()===!1||this.dispatchEvent(new CustomEvent(`compare-code-select`,{detail:{path:e},bubbles:!0,composed:!0}))}_reveal(e,t){let n=(t&&e.startsWith(t)?e.slice(t.length):e).split(`/`);for(let e=1;e<n.length;e++)this._open.set(n.slice(0,e).join(`/`),!0)}_railState(){let{prefix:e,root:t,tree:n,shown:r,allOrder:i}=this._tree(),a=je(n,this._mode===`files`?this._query:``,e,this.extensions?.fileFilter);return{prefix:e,root:t,tree:n,shown:r,filtered:a,order:a===n?i:a?Le(a):[],allOrder:i}}_renderRail({prefix:e,root:t,tree:n,shown:r,filtered:i,order:a},o){this._countUntil=null,this._treeRemaining=this.extensions?.treePageSize?this._treeLimit:1/0,this._treeTruncated=!1;let s=this._mode===`code`?P:i?this._renderTree(i,o,0,!!this._query||r<=(this.extensions?.openAllMax??br)):N`<div class="bundle-code-search-empty">No changed files match.</div>`,c=Object.fromEntries(mr.map(({kind:e})=>[e,0]));for(let e of this._entries.values())e.kind!==`repointed`&&c[e.kind]++,e.modified&&c.changed++,e.repointed&&c.repointed++;let l=Sr.find(({mode:e})=>e===this._mode);return N`<aside class="bundle-code-rail"><div class="bundle-code-rail-head"><span class="bundle-code-rail-label">${this.extensions?.railLabel??`Changes`}</span> <span class="bundle-code-rail-count">${this._entries.size.toLocaleString()}</span> <span class="bundle-code-rail-actions"><button type="button" class="bundle-code-rail-action" aria-label="${this.extensions?.collapseLabel??`Collapse directories`}" data-tooltip="Collapse directories" ?disabled="${this._mode!==`files`||!!this._query&&!this.extensions?.collapseClearsSearch||n.dirs.size===0}" @click="${()=>this._collapseAll(n)}">${se}</button></span></div>${t.from?N`<div class="bundle-code-rail-prefix mono" data-tooltip="${`Root moved: ${t.from} \u2192 ${t.to}`}">${Zt(t)}</div>`:e?N`<div class="bundle-code-rail-prefix mono" data-tooltip-truncated data-tooltip="${e}">${e}</div>`:P}<div class="bundle-compare-code-filter"><label class="bundle-compare-code-search"><svg viewBox="0 0 16 16" width="12" height="12" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" aria-hidden="true"><circle cx="7" cy="7" r="4.5"/><path d="m10.5 10.5 3.5 3.5"/></svg> <input type="search" placeholder="${this._mode===`files`?this.extensions?.searchPlaceholder??l.placeholder:l.placeholder}" aria-label="${this._mode===`files`?this.extensions?.searchLabel??l.placeholder:l.placeholder}" spellcheck="false" autocomplete="off" .value="${E(this._query)}" @input="${e=>{this._query=e.target.value,this._treeLimit=this.extensions?.treePageSize??1/0}}"> <span class="bundle-code-search-modes" role="tablist">${Sr.map(({mode:e,label:t,icon:n})=>N`<button type="button" class="${A({"bundle-code-search-mode":!0,active:e===this._mode})}" role="tab" aria-selected="${String(e===this._mode)}" aria-label="${t}" data-tooltip="${t}" @click="${()=>{this._mode=e}}">${n}</button>`)}</span></label> ${this.extensions?.filters??N`<div class="bundle-compare-code-kinds" role="group" aria-label="Show changes">${mr.filter(({kind:e})=>c[e]>0).map(({kind:e,label:t})=>N`<button type="button" class="${`bundle-compare-code-kind ${e}`}" aria-pressed="${String(this._kinds.has(e))}" data-tooltip="${`${this._kinds.has(e)?`Hide`:`Show`} ${t.toLowerCase()} files`}" @click="${()=>this._toggleKind(e)}">${t.toLowerCase()}</button>`)}</div>`}</div><div class="bundle-code-rail-body bundle-compare-code-tree">${this._mode===`code`?this._renderSearch(a,o,e):s} ${this._mode===`files`&&this._treeTruncated?N`<button type="button" class="bundle-compare-code-action" @click="${()=>{this._treeLimit+=this.extensions.treePageSize,this.requestUpdate()}}">Show more files</button>`:P}</div>${this.extensions?.footer?.(e=>{this._query=``,this._select(e)})??P}</aside><bundle-code-splitter role="separator" tabindex="0" aria-orientation="vertical" aria-label="Resize file tree" data-tooltip="Drag to resize · double-click to reset"></bundle-code-splitter>`}_arrived=0;_renamesAlone=!0;_repaint=()=>{this._arrived++,this.isConnected&&this.requestUpdate()};disconnectedCallback(){super.disconnectedCallback(),clearTimeout(this._countLater),clearTimeout(this._searchLater),this._countLater=this._searchLater=null}render(){let e=this._railState(),t=this._entries.has(this.path)?this.path:e.order[0]??null;t&&t!==this._current&&this._reveal(t,e.prefix),this._current=t,this._order=this.extensions?.filterContent===!1?e.allOrder:e.order;let n=t?N`${this._renderFile(t,this.extensions?.fullPaths?``:e.prefix)}${this.extensions?.fileActions?.(t,!1)??P}`:N`<div class="bundle-code-placeholder">No files differ in this comparison.</div>`;return N`<div class="bundle-code-view bundle-compare-code">${this._renderRail(e,t)}<div class="bundle-code-main">${n}</div></div>`}_toggleKind(e){let t=new Set(this._kinds);t.has(e)?t.delete(e):t.add(e),this._kinds=t}_collapseAll(e){this.extensions?.collapseClearsSearch&&(this._query=``),this._treeLimit=this.extensions?.treePageSize??1/0;let t=e=>{for(let n of e.dirs.values())this._open.set(n.path,!1),t(n)};t(e),this.requestUpdate()}_renderSearch(e,t,n){if(!this._query)return N`<div class="bundle-code-search-hint">Type to search the code of the changed files.</div>`;let{files:r,hits:i,truncated:a,unsigned:o}=this._searchResults(e);if(r.length===0)return N`<div class="bundle-code-search-empty">No matches.</div>`;let s=e=>n&&e.startsWith(n)?e.slice(n.length):e;return N`<div class="bundle-code-search-results bundle-compare-search"><div class="bundle-code-search-summary">${i.toLocaleString()} ${i===1?`hit`:`hits`} in ${r.length.toLocaleString()} ${r.length===1?`file`:`files`}${a?`, the first ${En}`:``}</div>${M(r,e=>e.path,({path:e,hits:n})=>N`<div class="${A({"bundle-code-search-file":!0,current:e===t})}"><button type="button" class="${`bundle-code-search-file-name bundle-compare-code-name ${this._entries.get(e).kind}`}" data-tooltip-truncated data-tooltip="${e}" @click="${()=>this._select(e)}">${s(e)}</button> ${o.has(e)?N`<p class="bundle-compare-search-note">${Er[o.get(e)]}</p>`:P}<ul class="bundle-code-search-hits">${n.map(t=>N`<li class="bundle-code-search-hit"><button type="button" class="bundle-code-search-hit-link" aria-label="${`${Dr[t.sign]?.label??`Line`} ${t.line+1}${t.side===`a`?` of the old text`:``}: ${t.text.trim().slice(0,80)}`}" @click="${()=>this._seek(e,t)}"><span class="bundle-code-search-hit-ln">${t.line+1}</span> <span class="${`bundle-compare-search-sign ${Dr[t.sign]?.name??``}`}" aria-hidden="true">${t.sign??``}</span> <span class="bundle-code-search-hit-text mono">${p(t.text,t.ranges)}</span></button></li>`)}</ul></div>`)}</div>`}_searchResults(e){let t=Or(),r=`${this._query}\0${this._forced.size}\0${t}\0${G.layout}\0${!!T.bundleSourcePretty}\0${nt()}\0${this._rowlessCount}\0${e.join(`\0`)}`;if(this._found?.key===r&&this._found.entries===this._entries)return this._found.result;let i=null,a=!0,o=new Map,s={...jn(e.flatMap(e=>{let n=this._entries.get(e);if(!this._searchable(n))return[];let r=L(this.base,this.other,e,n),{before:i,after:a}=r;if(this._prettyShown(e,n,r)){if(!/\S/u.test(this._query))return[];let n=i!==``&&a!==``&&i!==a;if(n&&this._rowless.get(e)===t)return[];o.set(e,n?`printed`:`numbered`)}return[{path:e,...r}]}),f(this._query,!1,!1),(e,t,r)=>{if(o.get(e)===`printed`)return null;let s=`${G.ignoreWhitespace}\0${e}`;if(this._blocks.has(s))return this._blocks.get(s);if(!this._forced.has(e)&&K(t,r))return o.set(e,`large`),null;let c=performance.now();if(i??=c+xr,c>i)return a=!1,null;let l=G.ignoreWhitespace&&!this._unlisted(e,this._entries.get(e),{before:t,after:r}),u=z(t,r,l);return l&&n(t,r,u)&&(u=z(t,r)),this._blocks.set(s,u),u},{split:G.layout===`split`,align:(e,t,n,r)=>{let i=this._aligned.get(n);return i||this._aligned.set(n,i={a:e,b:t,blocks:n}),Cn(i,n.indexOf(r))}}),unsigned:o};return a?this._found={key:r,entries:this._entries,result:s}:this._searchLater??=setTimeout(()=>{this._searchLater=null,this.requestUpdate()}),s}_searchable(e){return e.modified!==!1||ii(e)}_prettyShown(e,t,n){if(!T.bundleSourcePretty)return!1;let r=this._printing(e,t,n);return!!r?.applies&&r.copies.status!==`error`}_noteRowless(e,t){let n=t?Or():void 0;this._rowless.get(e)!==n&&(n===void 0?this._rowless.delete(e):this._rowless.set(e,n),this._rowlessCount++)}_seek(e,t){this._sought={path:e,side:t.side,line:t.line,at:t.ranges[0]?.[0]??0,query:this._query},e===this._current?this.requestUpdate():this._select(e,!1)}_soughtLine(e,t,n,r){let{side:i,line:a,at:o,query:s}=this._sought;if(n?.status!==`ready`)return{side:i,line:a};let c=e=>e.replaceAll(/\s+/gu,``),l=R(L(this.base,this.other,e,t)[i===`a`?`before`:`after`]??``),u=l.slice(0,a).reduce((e,t)=>e+c(t).length,0)+c(l[a]?.slice(0,o)??``).length,d=c(s).toLowerCase(),f=(e,t)=>{if(!d)return null;let n=0,r=0,i=0,a=``;for(let o of e)for(let e=0;e<o.length;e+=wr){a+=c(o.slice(e,e+wr)).toLowerCase();for(let e=a.indexOf(d,n);e!==-1;e=a.indexOf(d,n),r++){if(t(r,i+e))return{index:r,start:i+e};n=e+d.length}let s=Math.max(n,a.length-d.length+1);a=a.slice(s),i+=s,n=Math.max(0,n-s)}return null},p=f(l,(e,t)=>t>=u),m=(p&&f(r[i],e=>e===p.index)?.start)??u;for(let e=0;e<r[i].length;e++)if(m-=c(r[i][e]).length,m<0)return{side:i,line:e};return null}_seekRows(e,t,{side:n,line:r},i){let a=e=>n===`b`?(e.kind===`ctx`||e.kind===`add`)&&e.b===r||e.kind===`change`&&e.right===r:(e.kind===`ctx`||e.kind===`del`)&&e.a===r||e.kind===`change`&&e.left===r,o=this._expansions.get(e)??new Map,s=bn(t,o,{split:i}),c=s.findIndex(a);if(c===-1){let l=s.find(e=>e.kind===`fold`&&r>=e[n]&&r<e[n]+e.count);if(l){let u=o.get(l.run)??{},d=r-l[n];o=new Map(o).set(l.run,l.down?{...u,top:(u.top??0)+d+1+Cr}:l.up?{...u,bottom:(u.bottom??0)+l.count-d+Cr}:{all:!0}),this._expansions.set(e,o),s=bn(t,o,{split:i}),c=s.findIndex(a)}}let l=this._limits.get(e)??W;return c>=l&&this._limits.set(e,Math.ceil((c+1)/W)*W),{rows:s,index:c}}_takeTreeRow(e=!1){return this._treeRemaining-->0||(this._treeTruncated=!0,e)}_renderTree(e,t,n,i){let a=[...e.dirs.entries()].toSorted(Ie),o=[...e.files.entries()].toSorted(([e],[t])=>e.localeCompare(t)),s=a.flatMap(([e,r])=>{let a=Me(e,r,n),o=r.package,s=o?.ecosystem===`cargo`||o?.ecosystem===`composer`||o?.ecosystem===`soldeer`,c=this._query?!0:this._open.get(r.path)??(i||n===0||li(r,t)),l=this._baseDirs().has(r.sourcePath)?ci(this.other).has(r.sourcePath)?null:`removed`:`added`;if(!this._takeTreeRow(li(r,t)))return[];let u=N`<li class="bundle-code-tree-dir"><details .open="${E(c)}" @toggle="${e=>{let t=e.currentTarget.open;this._open.get(r.path)!==t&&(this._open.set(r.path,t),this.extensions?.treePageSize&&this.requestUpdate())}}"><summary aria-label="${this.extensions?.directoryLabel?.(a.node)??P}"><span class="bundle-code-tree-chevron" aria-hidden="true"></span> ${o?st(o.ecosystem):P} <span class="${A({"bundle-code-tree-dirname":!0,"bundle-code-tree-package":!!o,"bundle-code-tree-package-vendored":s,"bundle-compare-code-name":!0,removed:l===`removed`})}" data-tooltip-truncated data-tooltip="${a.node.sourcePath}">${o?N`<span class="bundle-code-tree-package-name">${o.name}</span>${o.version?N`<span class="bundle-code-tree-package-version">${s?`- `:`@`}${o.version}</span>`:P}`:a.names.map((e,t)=>N`${t>0?N`<span class="bundle-code-tree-separator">/</span>`:P}${e}`)} </span>${o?.variant?N`<span class="bundle-code-tree-variant">variant ${o.variant}</span>`:P} <span class="bundle-compare-code-dir-count" data-tooltip="${`${r.fileCount} changed ${r.fileCount===1?`file`:`files`}`}">${this.extensions?.directorySummary?.(a.node)??r.fileCount}</span> ${l?N`<span class="${`bundle-compare-code-letter ${l}`}" data-tooltip="${`${o?`Package`:`Directory`} ${l}`}">${hr[l].letter}</span>`:P}</summary>${c||!this.extensions?.treePageSize?this._renderTree(a.node,t,n+1,i):P}</details></li>`;return[{key:r.path,content:u}]}),c=o.flatMap(([e,n])=>{if(!this._takeTreeRow(n===t))return[];let{kind:i,repointed:a,renamedFrom:o,modified:s}=this._entries.get(n),c=a?`${a.length} repointed ${a.length===1?`import`:`imports`}`:``;return[{key:n,content:N`<li class="bundle-code-tree-file"><button type="button" class="${A({"bundle-code-tree-link":!0,current:n===t})}" aria-label="${this.extensions?.fileLabel?.(n)??P}" aria-current="${n===t?`true`:P}" @click="${()=>this._select(n)}">${this.extensions?.filePrefix?.(n)??P}${ot(n,this._format(n))}<span class="${`bundle-code-tree-name bundle-compare-code-name ${i}`}" data-tooltip-truncated data-tooltip="${n}">${e}</span> ${this.extensions?.fileSuffix?.(n)??P} ${o?N`<span class="bundle-compare-code-oldname" data-tooltip-truncated data-tooltip="${`Renamed from ${o}`}">← ${r(o,n,{extension:!1}).from}</span>`:P} ${this._fileTags(n,this._entries.get(n),!0)} ${this._treeCounts(n,this._entries.get(n))} ${a&&i!==`repointed`?N`<span class="bundle-compare-code-letter repointed" data-tooltip="${c}">R</span>`:P} <span class="${A({"bundle-compare-code-letter":!0,[i]:!0,pure:i===`renamed`&&!s})}" data-tooltip="${i===`repointed`?c:o?`Renamed${s?` and modified`:``} from ${o}`:hr[i].label}">${hr[i].letter}</span></button></li>`}]});return N`<ul class="${A({"bundle-code-tree":!0,root:n===0})}" aria-label="${n===0?this.extensions?.treeLabel??`Changed files`:P}" @keydown="${n===0?Pe:P}">${M(s,e=>e.key,e=>e.content)}${M(c,e=>e.key,e=>e.content)}</ul>`}_treeCounts(e,t){if(t.kind===`repointed`)return P;let n=this._lineCounts(e,t),r;if(n===null&&this._counted.has(e)?{published:n,shown:r}=this._largeCounts(e,t):r=n&&this._shownCounts(e,t),!(n||r)||r===void 0)return P;let{additions:i,deletions:a}=r??n,o=!n||n.additions>0||n.deletions>0,s=t.kind===`renamed`,c=r?.renamed>0?`
|
|
17
17
|
\u2248${r.renamed.toLocaleString()} lines differing in renamed names alone, marked`:``,l=n?`
|
|
18
|
-
As published: +${n.additions.toLocaleString()} \u2212${n.deletions.toLocaleString()}`:``,u=r?`${r.aside.join(`, `)}${c}${l}`:null;if(i===0&&a===0){if((s||t.modified===!1)&&!o)return N`<span class="bundle-compare-code-line-counts unchanged" aria-label="No line changes">=</span>`;if(r&&o)return N`<span class="bundle-compare-code-line-counts unchanged" aria-label="${`No line changes with ${r.aside.join(`, `)}`}" data-tooltip="${`No line changes with ${u}`}">≈</span>`}let d=r&&(!n||i!==n.additions||a!==n.deletions);return N`<span class="bundle-compare-code-line-counts" aria-label="${`${i} added, ${a} removed lines`}" data-tooltip="${d?`With ${u}`:P}"><span class="${A({add:!0,empty:s&&i===0})}">+${i.toLocaleString()}</span> <span class="${A({del:!0,empty:t.kind===`added`||s&&a===0})}">−${a.toLocaleString()}</span></span>`}_countingState(e,t){return this._fileState(e,t,!0)}_shownCounts(e,t){if(!(T.bundleSourcePretty||G.ignoreWhitespace||G.ignoreRenames||G.ignoreTypes))return null;let n=`${Mr()}\0${this._arrived}\0${this._forced.size}`,r=this._drawnCounts.get(e);if(r?.settings===n)return r.counts;let i=performance.now();if(this._countUntil??=i+xr,i>this._countUntil){this._countLater??=setTimeout(()=>{this._countLater=null,this.requestUpdate()});return}let a=this._countingState(e,t),{model:o}=a,s=Nr(a),c=o&&s.length>0?{additions:o.additions,deletions:o.deletions,renamed:o.renamed,aside:s}:null;return this._drawnCounts.set(e,{settings:n,counts:c}),c}_lineCounts(e,t){if(this._counted.has(e))return this._counted.get(e);let n=performance.now();if(this._countUntil??=n+xr,n>this._countUntil)return this._countLater??=setTimeout(()=>{this._countLater=null,this.requestUpdate()}),null;let{before:r,after:i}=L(this.base,this.other,e,t),a=pn(r,i);return this._counted.set(e,a),a}_noteDrawn(e,t){let{model:n}=t;return n&&this._drawnTotals.set(e,{settings:Mr(),counts:{additions:n.additions,deletions:n.deletions,renamed:n.renamed,aside:Nr(t)}}),t}_largeCounts(e,t){let n=this._drawnTotals.get(e);if(n?.settings===Mr())return n.counts.aside.length===0?{published:n.counts,shown:null}:{published:null,shown:n.counts};let r=G.ignoreTypes?L(this.base,this.other,e,t):null;return{published:null,shown:typeof r?.before==`string`&&typeof r.after==`string`&&lr(this.base,this.other,e,t,r,this._repaint,this.scope)?{additions:0,deletions:0,renamed:0,aside:[Ar]}:null}}_model(e,t,n,r={},i=G.ignoreWhitespace){let a=r.changes?.blocks??r.marks??null,o=this._models.get(e);return this._models.delete(e),o?.before===t&&o.after===n&&o.given===a||(o={model:cn(t,n,{...r,ignoreWhitespace:i}),before:t,after:n,given:a}),this._models.set(e,o),this._models.size>this._modelCap&&this._models.delete(this._models.keys().next().value),o.model}_counts(e,t,n,r,i){let a=r.changes?.blocks??r.marks??null,o=this._countModels.get(e);if(o?.before===t&&o.after===n&&o.given===a)return o.model;let s=r.changes?.blocks??z(t,n,i),c={blocks:s,...ln(s,r.marks)};return this._countModels.set(e,{model:c,before:t,after:n,given:a}),c}_fileState(e,t,r=!1){let i=L(this.base,this.other,e,t),a=typeof i.before==`string`&&typeof i.after==`string`,o=a&&lr(this.base,this.other,e,t,i,this._repaint,this.scope);if(o&&G.ignoreTypes){let t={a:[],b:[],blocks:[],additions:0,deletions:0,renamed:0,marked:new Set,noEol:{a:!1,b:!1},words:new Map};return r?{pretty:null,hiding:!1,model:t,spacesHidden:!1,typesHidden:!0}:this._noteDrawn(e,{...i,textual:a,large:!1,printing:null,pretty:null,key:null,generated:!1,renamed:!1,warned:[],hiding:!1,changes:null,model:t,whitespace:null,spacesHidden:!1,types:o,typesHidden:!0})}let s=a&&(!r||T.bundleSourcePretty)?this._printing(e,t,i):null,c=T.bundleSourcePretty&&s?.applies?s.copies:null,{before:l,after:u}=c?.status===`ready`?c:i,d=a&&Ir(e)&&Ir(t.basePath??e)&&[`ready`,`loading`,`error`].includes(c?.status)&&this._generated(e,t,i),f=d&&c.status===`ready`;!r&&a&&this._sought?.path===e&&!this._forced.has(e)&&this._large(e,l,u)&&this._forced.add(e);let p=a&&!this._forced.has(e)&&this._large(e,l,u),{basePath:m=e}=t,h=t=>{let n=f&&!p?Zn(this.base,m,i.before,this.other,e,i.after,t,this._repaint,c.hashes,!r&&this._renamesAlone,this.scope):null,o=n?.status===`ready`,s=o&&G.ignoreRenames,h=o&&!s,g=s&&n.reason===null?n.reads:[],_=o&&n.reason===null?n.marks.length>0||G.ignoreRenames&&n.before!==l:G.ignoreRenames&&d,v=qr(e,c?.status===`ready`,{...G,ignoreWhitespace:t,ignoreRenames:s,markRenames:h}),y=s?n.before:l,b=s?{changes:{blocks:n.blocks}}:h?{marks:n.marks}:{};return{key:v,changes:n,warned:g,renamed:_,hiding:s,shown:y,model:a&&!p&&(!n||o||!G.ignoreRenames)?r?this._counts(v,y,u,b,t):this._model(v,y,u,b,t):null,ignoreWhitespace:t}},g=this._unlisted(e,t,i),_=h(G.ignoreWhitespace&&!g),v=G.ignoreWhitespace&&!g&&!!_.model&&(_.model.mixed??=n(_.shown,u,_.model.blocks));v&&(_=h(!1));let{key:y,changes:b,warned:x,renamed:ee,hiding:S,shown:te,model:C}=_;if(r)return{pretty:c,hiding:S,model:C,spacesHidden:_.ignoreWhitespace};c?.status===`ready`&&C?this._noteRowless(e,C.blocks.length===0):C&&(this._blocks.set(`${G.ignoreWhitespace}\0${e}`,C.blocks),this._aligned.set(C.blocks,C));let ne=C&&!g&&!G.ignoreWhitespace?this._whitespaceHidden(`${e}\0${c?.status===`ready`}\0${S}`,te,u):null,re=C===null||g?null:v?`mixed`:G.ignoreWhitespace?ri(C,te,u)?`hideable`:null:ne.hides&&!ne.mixed?`hideable`:null;return this._sought?.path===e&&(this._soughtSettling=c?.status===`loading`||G.ignoreRenames&&(b?.status===`loading`||b?.status===`error`)),this._noteDrawn(e,{before:te,after:u,textual:a,large:p,printing:s,pretty:c,key:y,generated:d,renamed:ee,warned:x,hiding:S,changes:b,model:C,whitespace:re,spacesHidden:_.ignoreWhitespace,types:o})}_unlisted(e,{basePath:t=e},{before:n,after:r}){return!yn(e,r,Fr(this.other,e))||!yn(t,n,Fr(this.base,t))}_whitespaceHidden(e,t,n){let r=this._spaced.get(e);return r?.before===t&&r.after===n||(r={before:t,after:n,hidden:hn(t,n)}),this._spaced.delete(e),this._spaced.set(e,r),this._spaced.size>this._modelCap&&this._spaced.delete(this._spaced.keys().next().value),r.hidden}_generated(e,{kind:t,basePath:n=e},{before:r,after:i}){return t!==`repointed`&&Rn(this.base,this.other)&&Rr(this.base,n,r)&&Rr(this.other,e,i)}_printing(e,t,n){let{kind:r,basePath:i=e,modified:a}=t,{before:o,after:s}=n;if(r===`repointed`||a===!1||typeof o!=`string`||typeof s!=`string`||o===s||!Rn(this.base,this.other))return null;let c=[[`base`,this.base,i,o],[`other`,this.other,e,s]];if(!c.every(([,,e,t])=>t===``||Ve(e)!==null&&Qr(t)))return null;let l=c.some(([,e,t,n])=>n!==``&&rt(e,e,t,n)),d=c.map(([e,,t,n])=>n===``?{status:`ready`,text:n}:u(this.base,this.other,e,t,n,this._repaint)),f=d.find(e=>e.status===`error`)??d.find(e=>e.status===`loading`)??{status:`ready`,before:d[0].text,after:d[1].text,hashes:d.map(e=>e.hash)},p=!l&&o!==``&&s!==``&&f.status===`ready`&&this._smaller(e,n,f);return{copies:f,minified:l,smaller:p,applies:l||p}}_large(e,t,n){let r=this._larges.get(e);if(r?.before===t&&r.after===n)return r.large;let i=K(t,n);return this._larges.set(e,{before:t,after:n,large:i}),i}_smaller(e,{before:t,after:n},r){let i=this._shorter.get(e);if(i?.before===t&&i.after===n&&i.printed===r.before&&i.printedAfter===r.after)return i.smaller;let a=(e,t)=>z(e,t).reduce((e,{a0:t,a1:n,b0:r,b1:i})=>e+n-t+i-r,0),o=!K(t,n)&&!K(r.before,r.after)&&a(r.before,r.after)<a(t,n);return this._shorter.set(e,{before:t,after:n,printed:r.before,printedAfter:r.after,smaller:o}),o}_fileMessage(e,{kind:t,modified:n,meta:r},{before:i,after:a,textual:o,large:s,model:c,pretty:l,hiding:u,warned:f=[],changes:p,whitespace:m,typesHidden:h=!1}){let g=e=>k(e??0),_=pr(r),v=`${t===`renamed`?_?`Renamed, its contents the same.`:`Renamed without changes.`:`The contents are the same.`}${_?` ${_}`:``}`;if(o&&n===!1)return N`<div class="bundle-compare-code-message"><p>${v}</p></div>`;if(!o){if(t===`changed`&&n===!1)return N`<div class="bundle-compare-code-message">Binary file, its bytes the same · ${g(O(a))}. ${_}</div>`;let e=t===`added`?g(O(a)):t===`removed`?g(O(i)):`${g(O(i))} \u2192 ${g(O(a))}`;return N`<div class="bundle-compare-code-message">Binary file ${t} · ${e}. A text diff is not available.${_?` ${_}`:``}</div>`}if(s)return N`<div class="bundle-compare-code-message"><p>This diff is large (${(Zr(i)+Zr(a)).toLocaleString()} lines across both sides) and may take a few seconds to compute.</p><button type="button" class="bundle-compare-code-action" @click="${()=>{this._forced.add(e),this.requestUpdate()}}">Show diff</button></div>`;if(h)return N`<div class="bundle-compare-code-message"><p>Only types changed in this file.${_?` ${_}`:``}</p><button type="button" class="bundle-compare-code-action" @click="${()=>this._setTypes(!1)}">Show type-only changes</button></div>`;if(p?.status===`loading`&&G.ignoreRenames)return N`<div class="bundle-compare-code-message" aria-busy="true">Hiding renamed names…</div>`;if(p?.status===`error`&&G.ignoreRenames)return N`<div class="bundle-compare-code-message"><p>Couldn't hide renamed names: ${p.message}</p><button type="button" class="bundle-compare-code-action" @click="${()=>this._setRenames(!1)}">Show renamed names</button></div>`;if(c.blocks.length>0)return null;let y=l?.status===`ready`&&l.before===l.after,b=!y&&G.ignoreWhitespace&&m===`hideable`,x=!y&&u,ee=[b&&`whitespace`,x&&`renamed names`].filter(Boolean),S=y?`No actual code changes in this file.`:ee.length>0?`Only ${ee.join(` and `)} changed in this file.`:null;return N`<div class="bundle-compare-code-message"><p>${S?`${S}${_?` ${_}`:``}`:v}</p>${f.length>0?N`<p>${Kr(f)}</p>`:P} ${y?N`<button type="button" class="bundle-compare-code-action" @click="${()=>{d(),this.requestUpdate()}}">Show as published</button>`:P} ${b?N`<button type="button" class="bundle-compare-code-action" @click="${()=>this._setWhitespace(!1)}">Show whitespace changes</button>`:P} ${x?N`<button type="button" class="bundle-compare-code-action" @click="${()=>this._setRenames(!1)}">Show renamed names</button>`:P}</div>`}_fileName(e,t,n){let r=e=>n&&e.startsWith(n)?e.slice(n.length):e;return N`<span class="${A({"bundle-compare-code-pill":!0,[t.kind]:!0,pure:t.kind===`renamed`&&!t.modified})}">${hr[t.kind].label}</span> ${ot(e,this._format(e))} <span class="bundle-code-main-path mono" data-tooltip-truncated data-tooltip="${t.renamedFrom?`${t.renamedFrom} \u2192 ${e}`:e}">${t.renamedFrom?Xt(r(t.renamedFrom),r(e)):r(e)}</span> ${this._fileTags(e,t)}${this._githubLink(e,t)}`}_fileTags(e,t,n=!1){if(!n)return N`${this._entryTags(e,t)}${this._alertTags(e,t)}${this._runsTags(e,t)}${this._newHostTags(e,t)}${this._flagTags(e,t)}${this._readability(e,t)}${this._installTags(e,t)}${dr(t.meta)}`;let r=[this._alertTags(e,t),this._runsTags(e,t),this._newHostTags(e,t),this._flagTags(e,t,!1),this._treeTag(e,t),this._installTags(e,t,!0),dr(t.meta,!0)];return ai(r)?r:this._flagTags(e,t)}_githubLink(e,{kind:t,basePath:n=e}){let r=t===`removed`?Re(this.base,n):Re(this.other,e);return r?ze(r):P}_alertTags(e,{kind:t,basePath:n=e}){let r=t===`removed`?this.baseAlerts?.get(n):this.otherAlerts?.get(e);return r?.length>0&&this.alertTags?this.alertTags(r):P}_newHostTags(e,{kind:t}){let n=t===`removed`?null:this.newHosts?.get(e);return n&&this.newHostTag?this.newHostTag(n):P}_runsTags(e,t){return[[de,fe],[pe,me]].map(([n,r])=>{let{was:i,now:a}=this._reads(e,t,n);return t.kind===`removed`?r(i):r(a,i)})}_entryTags(e,{kind:t,basePath:n=e}){let r=Vr(t===`removed`?this.base:this.other).get(t===`removed`?n:e)??[];return[...Map.groupBy(r,({label:e})=>e)].map(([e,t])=>N`<span class="${`bundle-compare-code-entry${e===`license`?` is-license`:``}`}" data-tooltip="${t.map(({note:e})=>e).join(` · `)}">${e}</span>`)}_installTags(e,t,n=!1){if(!Hr.test(e))return P;let{kind:r,basePath:i=e}=t,{before:a,after:o}=L(this.base,this.other,e,t),s=new Map(r===`added`||a===void 0?[]:Wr(this.base,i,a)),c=new Map(r===`removed`||o===void 0?[]:Wr(this.other,e,o)),l=[...r===`removed`?s:c].map(([e,t])=>{let n=r===`removed`?t:s.get(e),i=n===void 0?`, new`:n===t?``:`, was: ${n}`;return N`<span class="bundle-compare-code-install" data-tooltip="${`${t}${i}`}">${e}</span>`});if(!n&&r!==`removed`)for(let[e,t]of s)c.has(e)||l.push(N`<span class="bundle-compare-code-install is-dropped" data-tooltip="${`No longer run on install: ${t}`}">${e}</span>`);return l}_reads(e,t,n=He){let{kind:r,basePath:i=e}=t,{before:a,after:o}=L(this.base,this.other,e,t);return{was:r===`added`?null:a===void 0?void 0:n(this.base,i,a),now:r===`removed`||o===void 0?null:n(this.other,e,o)}}_readability(e,t){let{was:n,now:r}=this._reads(e,t),i=e=>N`${Ge(e)}${qe(e)}`,a=!n||!r||ct(n)===ct(r)&&n.kind===r.kind?i(r??n):N`<span class="bundle-compare-code-readability">${i(n)}<span aria-hidden="true">→</span>${i(r)}</span>`;return N`${Ye(r??n)}${a}`}_flagTags(e,t,n=!0){return t.kind===`removed`?Qe(this.base,t.basePath??e,t.baseBytes,n):Qe(this.other,e,t.otherBytes,n)}_treeTag(e,t){let{was:n,now:r}=this._reads(e,t),i=r??n;if(!i)return P;let a=i.category!==`map`&&ut.get(ct(i)).mark;return N`${Ye(i,[`warn`])}${a?Ge(i,!0):P}`}_fileFigures({kind:e,baseBytes:t,otherBytes:n},r){let i=e=>k(e??0);return N`${r?.blocks.length>(r?.marked?.size??0)?ni(r.additions,r.deletions):P} ${r?.renamed>0?N`<span class="bundle-compare-code-renamed" aria-label="${`${r.renamed} lines differing in renamed names alone`}" data-tooltip="Lines differing in renamed names alone, marked">≈${r.renamed}</span>`:P} <span class="bundle-code-main-stats">${e===`added`?i(n):e===`removed`?i(t):`${i(t)} \u2192 ${i(n)}`}</span>`}_highlighted(e,t,n,r=``){if(!n)return null;let i=ft(t,Fr(e,t),n);if(!i)return null;let a=`${e.integrity}\0${t}${r?`\0${r}`:``}`,o=Jr.get(a);return o?.text===n?o.lines:(Yr.has(a)||(Yr.add(a),(async()=>{let e=await Je(n,i),t=typeof e==`string`?Ze(e):null;Jr.set(a,{text:n,lines:t?.length===n.split(`
|
|
18
|
+
As published: +${n.additions.toLocaleString()} \u2212${n.deletions.toLocaleString()}`:``,u=r?`${r.aside.join(`, `)}${c}${l}`:null;if(i===0&&a===0){if((s||t.modified===!1)&&!o)return N`<span class="bundle-compare-code-line-counts unchanged" aria-label="No line changes">=</span>`;if(r&&o)return N`<span class="bundle-compare-code-line-counts unchanged" aria-label="${`No line changes with ${r.aside.join(`, `)}`}" data-tooltip="${`No line changes with ${u}`}">≈</span>`}let d=r&&(!n||i!==n.additions||a!==n.deletions);return N`<span class="bundle-compare-code-line-counts" aria-label="${`${i} added, ${a} removed lines`}" data-tooltip="${d?`With ${u}`:P}"><span class="${A({add:!0,empty:s&&i===0})}">+${i.toLocaleString()}</span> <span class="${A({del:!0,empty:t.kind===`added`||s&&a===0})}">−${a.toLocaleString()}</span></span>`}_countingState(e,t){return this._fileState(e,t,!0)}_shownCounts(e,t){if(!(T.bundleSourcePretty||G.ignoreWhitespace||G.ignoreRenames||G.ignoreTypes))return null;let n=`${Mr()}\0${this._arrived}\0${this._forced.size}`,r=this._drawnCounts.get(e);if(r?.settings===n)return r.counts;let i=performance.now();if(this._countUntil??=i+xr,i>this._countUntil){this._countLater??=setTimeout(()=>{this._countLater=null,this.requestUpdate()});return}let a=this._countingState(e,t),{model:o}=a,s=Nr(a),c=o&&s.length>0?{additions:o.additions,deletions:o.deletions,renamed:o.renamed,aside:s}:null;return this._drawnCounts.set(e,{settings:n,counts:c}),c}_lineCounts(e,t){if(this._counted.has(e))return this._counted.get(e);let n=performance.now();if(this._countUntil??=n+xr,n>this._countUntil)return this._countLater??=setTimeout(()=>{this._countLater=null,this.requestUpdate()}),null;let{before:r,after:i}=L(this.base,this.other,e,t),a=pn(r,i);return this._counted.set(e,a),a}_noteDrawn(e,t){let{model:n}=t;return n&&this._drawnTotals.set(e,{settings:Mr(),counts:{additions:n.additions,deletions:n.deletions,renamed:n.renamed,aside:Nr(t)}}),t}_largeCounts(e,t){let n=this._drawnTotals.get(e);if(n?.settings===Mr())return n.counts.aside.length===0?{published:n.counts,shown:null}:{published:null,shown:n.counts};let r=G.ignoreTypes?L(this.base,this.other,e,t):null;return{published:null,shown:typeof r?.before==`string`&&typeof r.after==`string`&&lr(this.base,this.other,e,t,r,this._repaint,this.scope)?{additions:0,deletions:0,renamed:0,aside:[Ar]}:null}}_model(e,t,n,r={},i=G.ignoreWhitespace){let a=r.changes?.blocks??r.marks??null,o=this._models.get(e);return this._models.delete(e),o?.before===t&&o.after===n&&o.given===a||(o={model:cn(t,n,{...r,ignoreWhitespace:i}),before:t,after:n,given:a}),this._models.set(e,o),this._models.size>this._modelCap&&this._models.delete(this._models.keys().next().value),o.model}_counts(e,t,n,r,i){let a=r.changes?.blocks??r.marks??null,o=this._countModels.get(e);if(o?.before===t&&o.after===n&&o.given===a)return o.model;let s=r.changes?.blocks??z(t,n,i),c={blocks:s,...ln(s,r.marks)};return this._countModels.set(e,{model:c,before:t,after:n,given:a}),c}_fileState(e,t,r=!1){let i=L(this.base,this.other,e,t),a=typeof i.before==`string`&&typeof i.after==`string`,o=a&&lr(this.base,this.other,e,t,i,this._repaint,this.scope);if(o&&G.ignoreTypes){let t={a:[],b:[],blocks:[],additions:0,deletions:0,renamed:0,marked:new Set,noEol:{a:!1,b:!1},words:new Map};return r?{pretty:null,hiding:!1,model:t,spacesHidden:!1,typesHidden:!0}:this._noteDrawn(e,{...i,textual:a,large:!1,printing:null,pretty:null,key:null,generated:!1,renamed:!1,warned:[],hiding:!1,changes:null,model:t,whitespace:null,spacesHidden:!1,types:o,typesHidden:!0})}let s=a&&(!r||T.bundleSourcePretty)?this._printing(e,t,i):null,c=T.bundleSourcePretty&&s?.applies?s.copies:null,{before:l,after:u}=c?.status===`ready`?c:i,d=a&&Ir(e)&&Ir(t.basePath??e)&&[`ready`,`loading`,`error`].includes(c?.status)&&this._generated(e,t,i),f=d&&c.status===`ready`;!r&&a&&this._sought?.path===e&&!this._forced.has(e)&&this._large(e,l,u)&&this._forced.add(e);let p=a&&!this._forced.has(e)&&this._large(e,l,u),{basePath:m=e}=t,h=t=>{let n=f&&!p?Zn(this.base,m,i.before,this.other,e,i.after,t,this._repaint,c.hashes,!r&&this._renamesAlone,this.scope):null,o=n?.status===`ready`,s=o&&G.ignoreRenames,h=o&&!s,g=s&&n.reason===null?n.reads:[],_=o&&n.reason===null?n.marks.length>0||G.ignoreRenames&&n.before!==l:G.ignoreRenames&&d,v=qr(e,c?.status===`ready`,{...G,ignoreWhitespace:t,ignoreRenames:s,markRenames:h}),y=s?n.before:l,b=s?{changes:{blocks:n.blocks}}:h?{marks:n.marks}:{};return{key:v,changes:n,warned:g,renamed:_,hiding:s,shown:y,model:a&&!p&&(!n||o||!G.ignoreRenames)?r?this._counts(v,y,u,b,t):this._model(v,y,u,b,t):null,ignoreWhitespace:t}},g=this._unlisted(e,t,i),_=h(G.ignoreWhitespace&&!g),v=G.ignoreWhitespace&&!g&&!!_.model&&(_.model.mixed??=n(_.shown,u,_.model.blocks));v&&(_=h(!1));let{key:y,changes:b,warned:x,renamed:ee,hiding:S,shown:te,model:C}=_;if(r)return{pretty:c,hiding:S,model:C,spacesHidden:_.ignoreWhitespace};c?.status===`ready`&&C?this._noteRowless(e,C.blocks.length===0):C&&(this._blocks.set(`${G.ignoreWhitespace}\0${e}`,C.blocks),this._aligned.set(C.blocks,C));let ne=C&&!g&&!G.ignoreWhitespace?this._whitespaceHidden(`${e}\0${c?.status===`ready`}\0${S}`,te,u):null,re=C===null||g?null:v?`mixed`:G.ignoreWhitespace?ri(C,te,u)?`hideable`:null:ne.hides&&!ne.mixed?`hideable`:null;return this._sought?.path===e&&(this._soughtSettling=c?.status===`loading`||G.ignoreRenames&&(b?.status===`loading`||b?.status===`error`)),this._noteDrawn(e,{before:te,after:u,textual:a,large:p,printing:s,pretty:c,key:y,generated:d,renamed:ee,warned:x,hiding:S,changes:b,model:C,whitespace:re,spacesHidden:_.ignoreWhitespace,types:o})}_unlisted(e,{basePath:t=e},{before:n,after:r}){return!yn(e,r,Fr(this.other,e))||!yn(t,n,Fr(this.base,t))}_whitespaceHidden(e,t,n){let r=this._spaced.get(e);return r?.before===t&&r.after===n||(r={before:t,after:n,hidden:hn(t,n)}),this._spaced.delete(e),this._spaced.set(e,r),this._spaced.size>this._modelCap&&this._spaced.delete(this._spaced.keys().next().value),r.hidden}_generated(e,{kind:t,basePath:n=e},{before:r,after:i}){return t!==`repointed`&&Rn(this.base,this.other)&&Rr(this.base,n,r)&&Rr(this.other,e,i)}_printing(e,t,n){let{kind:r,basePath:i=e,modified:a}=t,{before:o,after:s}=n;if(r===`repointed`||a===!1||typeof o!=`string`||typeof s!=`string`||o===s||!Rn(this.base,this.other))return null;let c=[[`base`,this.base,i,o],[`other`,this.other,e,s]];if(!c.every(([,,e,t])=>t===``||Ve(e)!==null&&Qr(t)))return null;let l=c.some(([,e,t,n])=>n!==``&&rt(e,e,t,n)),d=c.map(([e,,t,n])=>n===``?{status:`ready`,text:n}:u(this.base,this.other,e,t,n,this._repaint)),f=d.find(e=>e.status===`error`)??d.find(e=>e.status===`loading`)??{status:`ready`,before:d[0].text,after:d[1].text,hashes:d.map(e=>e.hash)},p=!l&&o!==``&&s!==``&&f.status===`ready`&&this._smaller(e,n,f);return{copies:f,minified:l,smaller:p,applies:l||p}}_large(e,t,n){let r=this._larges.get(e);if(r?.before===t&&r.after===n)return r.large;let i=K(t,n);return this._larges.set(e,{before:t,after:n,large:i}),i}_smaller(e,{before:t,after:n},r){let i=this._shorter.get(e);if(i?.before===t&&i.after===n&&i.printed===r.before&&i.printedAfter===r.after)return i.smaller;let a=(e,t)=>z(e,t).reduce((e,{a0:t,a1:n,b0:r,b1:i})=>e+n-t+i-r,0),o=!K(t,n)&&!K(r.before,r.after)&&a(r.before,r.after)<a(t,n);return this._shorter.set(e,{before:t,after:n,printed:r.before,printedAfter:r.after,smaller:o}),o}_fileMessage(e,{kind:t,modified:n,meta:r},{before:i,after:a,textual:o,large:s,model:c,pretty:l,hiding:u,warned:f=[],changes:p,whitespace:m,typesHidden:h=!1}){let g=e=>k(e??0),_=pr(r),v=`${t===`renamed`?_?`Renamed, its contents the same.`:`Renamed without changes.`:`The contents are the same.`}${_?` ${_}`:``}`;if(o&&n===!1)return N`<div class="bundle-compare-code-message"><p>${v}</p></div>`;if(!o){if(t===`changed`&&n===!1)return N`<div class="bundle-compare-code-message">Binary file, its bytes the same · ${g(O(a))}. ${_}</div>`;let e=t===`added`?g(O(a)):t===`removed`?g(O(i)):`${g(O(i))} \u2192 ${g(O(a))}`;return N`<div class="bundle-compare-code-message">Binary file ${t} · ${e}. A text diff is not available.${_?` ${_}`:``}</div>`}if(s)return N`<div class="bundle-compare-code-message"><p>This diff is large (${(Zr(i)+Zr(a)).toLocaleString()} lines across both sides) and may take a few seconds to compute.</p><button type="button" class="bundle-compare-code-action" @click="${()=>{this._forced.add(e),this.requestUpdate()}}">Show diff</button></div>`;if(h)return N`<div class="bundle-compare-code-message"><p>Only types changed in this file.${_?` ${_}`:``}</p><button type="button" class="bundle-compare-code-action" @click="${()=>this._setTypes(!1)}">Show type-only changes</button></div>`;if(p?.status===`loading`&&G.ignoreRenames)return N`<div class="bundle-compare-code-message" aria-busy="true">Hiding renamed names…</div>`;if(p?.status===`error`&&G.ignoreRenames)return N`<div class="bundle-compare-code-message"><p>Couldn't hide renamed names: ${p.message}</p><button type="button" class="bundle-compare-code-action" @click="${()=>this._setRenames(!1)}">Show renamed names</button></div>`;if(c.blocks.length>0)return null;let y=l?.status===`ready`&&l.before===l.after,b=!y&&G.ignoreWhitespace&&m===`hideable`,x=!y&&u,ee=[b&&`whitespace`,x&&`renamed names`].filter(Boolean),S=y?`No actual code changes in this file.`:ee.length>0?`Only ${ee.join(` and `)} changed in this file.`:null;return N`<div class="bundle-compare-code-message"><p>${S?`${S}${_?` ${_}`:``}`:v}</p>${f.length>0?N`<p>${Kr(f)}</p>`:P} ${y?N`<button type="button" class="bundle-compare-code-action" @click="${()=>{d(),this.requestUpdate()}}">Show as published</button>`:P} ${b?N`<button type="button" class="bundle-compare-code-action" @click="${()=>this._setWhitespace(!1)}">Show whitespace changes</button>`:P} ${x?N`<button type="button" class="bundle-compare-code-action" @click="${()=>this._setRenames(!1)}">Show renamed names</button>`:P}</div>`}_fileName(e,t,n){let r=e=>n&&e.startsWith(n)?e.slice(n.length):e;return N`<span class="${A({"bundle-compare-code-pill":!0,[t.kind]:!0,pure:t.kind===`renamed`&&!t.modified})}">${hr[t.kind].label}</span> ${ot(e,this._format(e))} <span class="bundle-code-main-path mono" data-tooltip-truncated data-tooltip="${t.renamedFrom?`${t.renamedFrom} \u2192 ${e}`:e}">${t.renamedFrom?Xt(r(t.renamedFrom),r(e)):r(e)}</span> ${this._fileTags(e,t)}${this._githubLink(e,t)}`}_fileTags(e,t,n=!1){if(!n)return N`${this._entryTags(e,t)}${this._alertTags(e,t)}${this._runsTags(e,t)}${this._newHostTags(e,t)}${this._flagTags(e,t)}${this._readability(e,t)}${this._installTags(e,t)}${dr(t.meta)}`;let r=[this._alertTags(e,t),this._runsTags(e,t),this._newHostTags(e,t),this._flagTags(e,t,!1),this._treeTag(e,t),this._installTags(e,t,!0),dr(t.meta,!0)];return ai(r)?r:this._flagTags(e,t)}_githubLink(e,{kind:t,basePath:n=e}){let r=t===`removed`?Re(this.base,n):Re(this.other,e);return r?ze(r):P}_alertTags(e,{kind:t,basePath:n=e}){let r=t===`removed`?this.baseAlerts?.get(n):this.otherAlerts?.get(e);return r?.length>0&&this.alertTags?this.alertTags(r):P}_newHostTags(e,{kind:t}){let n=t===`removed`?null:this.newHosts?.get(e);return n&&this.newHostTag?this.newHostTag(n):P}_runsTags(e,t){return[[de,fe],[pe,he]].map(([n,r])=>{let{was:i,now:a}=this._reads(e,t,n);return t.kind===`removed`?r(i):r(a,i)})}_entryTags(e,{kind:t,basePath:n=e}){let r=Vr(t===`removed`?this.base:this.other).get(t===`removed`?n:e)??[];return[...Map.groupBy(r,({label:e})=>e)].map(([e,t])=>N`<span class="${`bundle-compare-code-entry${e===`license`?` is-license`:``}`}" data-tooltip="${t.map(({note:e})=>e).join(` · `)}">${e}</span>`)}_installTags(e,t,n=!1){if(!Hr.test(e))return P;let{kind:r,basePath:i=e}=t,{before:a,after:o}=L(this.base,this.other,e,t),s=new Map(r===`added`||a===void 0?[]:Wr(this.base,i,a)),c=new Map(r===`removed`||o===void 0?[]:Wr(this.other,e,o)),l=[...r===`removed`?s:c].map(([e,t])=>{let n=r===`removed`?t:s.get(e),i=n===void 0?`, new`:n===t?``:`, was: ${n}`;return N`<span class="bundle-compare-code-install" data-tooltip="${`${t}${i}`}">${e}</span>`});if(!n&&r!==`removed`)for(let[e,t]of s)c.has(e)||l.push(N`<span class="bundle-compare-code-install is-dropped" data-tooltip="${`No longer run on install: ${t}`}">${e}</span>`);return l}_reads(e,t,n=He){let{kind:r,basePath:i=e}=t,{before:a,after:o}=L(this.base,this.other,e,t);return{was:r===`added`?null:a===void 0?void 0:n(this.base,i,a),now:r===`removed`||o===void 0?null:n(this.other,e,o)}}_readability(e,t){let{was:n,now:r}=this._reads(e,t),i=e=>N`${We(e)}${Ge(e)}`,a=!n||!r||ct(n)===ct(r)&&n.kind===r.kind?i(r??n):N`<span class="bundle-compare-code-readability">${i(n)}<span aria-hidden="true">→</span>${i(r)}</span>`;return N`${Je(r??n)}${a}`}_flagTags(e,t,n=!0){return t.kind===`removed`?Qe(this.base,t.basePath??e,t.baseBytes,n):Qe(this.other,e,t.otherBytes,n)}_treeTag(e,t){let{was:n,now:r}=this._reads(e,t),i=r??n;if(!i)return P;let a=i.category!==`map`&&ut.get(ct(i)).mark;return N`${Je(i,[`warn`])}${a?We(i,!0):P}`}_fileFigures({kind:e,baseBytes:t,otherBytes:n},r){let i=e=>k(e??0);return N`${r?.blocks.length>(r?.marked?.size??0)?ni(r.additions,r.deletions):P} ${r?.renamed>0?N`<span class="bundle-compare-code-renamed" aria-label="${`${r.renamed} lines differing in renamed names alone`}" data-tooltip="Lines differing in renamed names alone, marked">≈${r.renamed}</span>`:P} <span class="bundle-code-main-stats">${e===`added`?i(n):e===`removed`?i(t):`${i(t)} \u2192 ${i(n)}`}</span>`}_highlighted(e,t,n,r=``){if(!n)return null;let i=ft(t,Fr(e,t),n);if(!i)return null;let a=`${e.integrity}\0${t}${r?`\0${r}`:``}`,o=Jr.get(a);return o?.text===n?o.lines:(Yr.has(a)||(Yr.add(a),(async()=>{let e=await qe(n,i),t=typeof e==`string`?Ze(e):null;Jr.set(a,{text:n,lines:t?.length===n.split(`
|
|
19
19
|
`).length?t:null}),Yr.delete(a),this.isConnected&&this.requestUpdate()})()),null)}_renderFile(e,t){let n=this._entries.get(e),{kind:r}=n,i=this._fileState(e,n),{after:a,before:o,textual:s,model:c}=i,l=ii(n),u=s&&(!l||c?.blocks.length>0),d=this._order.indexOf(e),f=t&&e.startsWith(t)?e.slice(t.length):e,p=r===`repointed`&&o===void 0?N`<div class="bundle-compare-code-message">Neither bundle carries this importer's source.</div>`:l&&c?.blocks.length===0?this._renderSource(e,a,n.repointed,i):this._fileMessage(e,n,i)??this._renderDiff(e,n,i);return N`<header class="bundle-code-main-bar bundle-compare-code-bar"><span class="bundle-code-file-nav"><button type="button" class="focus-code-nav-btn" aria-label="Previous file" data-tooltip="Previous file" ?disabled="${d<=0}" @click="${()=>this._select(this._order[d-1])}">${ie}</button> <button type="button" class="focus-code-nav-btn" aria-label="Next file" data-tooltip="Next file" ?disabled="${d===-1?this._order.length===0:d>=this._order.length-1}" @click="${()=>this._select(this._order[d+1])}">${w}</button> </span>${this._fileName(e,n,t)} <button type="button" class="bundle-code-copy-path" data-copy-path="${e}" aria-label="Copy file path">${C}</button> <span class="bundle-code-main-spacer"></span> ${this._fileFigures(n,c)} ${this._toggles(u,$r(i),i.renamed,i.whitespace===`hideable`,i.types)}</header><div class="bundle-compare-diff" tabindex="0" aria-label="${`Changes in ${f}`}">${this._dependencyChanges(e)} ${n.repointed?this._renderRepointed(e,n.repointed,[a,o].find(e=>typeof e==`string`&&e!==``)??null,s&&!u):P} ${p}</div>`}_toggles(e,t=null,n=!1,r=!1,i=!1){return N`${e?this._hides(n,r,i):P} ${t?N`<button type="button" class="${A({"bundle-compare-code-toggle":!0,"is-loading":t.status===`loading`,"is-error":t.status===`error`})}" aria-pressed="${String(!!T.bundleSourcePretty)}" aria-busy="${t.status===`loading`?`true`:P}" aria-label="Pretty-print" data-tooltip="${`${tt(t)}${ti(t.affects)}`}" @click="${()=>{d(),this.requestUpdate()}}">${et}</button>`:P} ${e?N`<span class="bundles-overview-sort bundle-compare-code-layout" role="group" aria-label="Diff layout">${[[`unified`,`Unified`],[`split`,`Split`]].map(([e,t])=>N`<button type="button" aria-pressed="${String(G.layout===e)}" @click="${()=>{G.layout=e,this.requestUpdate()}}">${t}</button>`)}</span>`:P}`}_importLines(e,t){let n=new Map;for(let{specifier:r}of e){if(n.has(r))continue;let e=[`'`,`"`,"`"].map(e=>`${e}${r}${e}`);n.set(r,t.flatMap((t,n)=>e.some(e=>t.includes(e))?[n]:[]))}return n}_textSide(e){return D(this.other).has(e)?this.other:this.base}_dependencyChanges(e){if(e!==`package.json`||!this.dependencies)return P;let{added:t,changed:n,removed:r}=this.dependencies,i=[...t.map(e=>[`added`,e]),...n.map(e=>[`changed`,e]),...r.map(e=>[`removed`,e])];if(i.length===0)return P;let a=[[t,`new`],[n,`updated`],[r,`removed`]].filter(([e])=>e.length>0).map(([e,t])=>`${e.length} ${t}`),o=Map.groupBy(i.flatMap(([,e])=>e.flags??[]),({label:e})=>e),s=this.openDependency;return N`<section class="bundle-compare-code-deps" aria-label="Dependency changes"><h4>Dependencies <span>${a.join(` · `)}</span>${[...o].map(([e,t])=>N`<span class="bundle-compare-code-deps-flagged">${t.length} ${e}</span>`)}</h4><ul>${i.map(([e,t])=>{let n=e===`changed`?N`<span class="bundle-compare-code-dep-range">${t.from} → <b>${t.to}</b></span>`:N`<span class="bundle-compare-code-dep-range">${t.range}</span>`,r=N`<span class="bundle-compare-code-dep-name">${t.name}</span>${t.kind?N`<span class="npm-dependency-kind">${t.kind}</span>`:P}${n}${this.dependencyTags?.(t,e)??P}`,i=`${{added:`New`,changed:`Updated`,removed:`Removed`}[e]}: ${t.name}`;return N`<li>${s&&t.opens?N`<button type="button" class="${`bundle-compare-code-dep is-${e}`}" aria-label="${i}" @click="${()=>s(t)}">${r}</button>`:N`<span class="${`bundle-compare-code-dep is-${e}`}" aria-label="${i}">${r}</span>`}</li>`})}</ul></section>`}_renderRepointed(e,t,n,r){let i=n?n.split(`
|
|
20
|
-
`):[],a=n?this._highlighted(this._textSide(e),e,n):null,o=this._importLines(t,i),s=e=>e||`(empty target)`;return N`<section class="bundle-compare-code-repointed" aria-label="Repointed imports"><h4>Repointed ${t.length===1?`import`:`imports`} <b>${t.length}</b></h4><ul>${t.map(e=>{let t=o.get(e.specifier),n=`${e.conditions}${e.platform===null?``:` \xB7 Platform: ${e.platform}`}`;return N`<li><div class="bundle-compare-code-repointed-spec"><code data-tooltip-truncated data-tooltip="${e.specifier}">${e.specifier}</code> <span data-tooltip-truncated data-tooltip="${n}">${n}</span></div><div class="bundle-compare-code-repointed-targets"><span class="before"><span>Before</span><code data-tooltip-truncated data-tooltip="${s(e.baseTarget)}">${s(e.baseTarget)}</code></span> <span aria-hidden="true">→</span> <span class="after"><span>After</span><code data-tooltip-truncated data-tooltip="${s(e.otherTarget)}">${s(e.otherTarget)}</code></span></div>${t.slice(0,yr).map(t=>this._importLine(t,i[t],a?.[t],e.specifier,r))} ${t.length>yr?N`<span class="bundle-compare-code-repointed-more">and ${t.length-yr} more ${t.length-yr===1?`line`:`lines`}</span>`:P}</li>`})}</ul></section>`}_importLine(e,t,n,r,i){let a=t.length>240?Math.max(0,t.indexOf(r)-80):0;return N`<button type="button" class="bundle-compare-code-repointed-line bundle-compare-diff-table" ?disabled="${!i}" aria-label="${`Go to line ${e+1}`}" @click="${()=>this._goToLine(e+1)}"><span class="diff-num">${e+1}</span> <code>${t.length<=240&&typeof n==`string`?bt($e(n,!0)):De(`${a>0?`…`:``}${t.slice(a,a+240)}${t.length>a+240?`…`:``}`,!0)}</code></button>`}_goToLine(e){let t=`${this._current}\0source`;e>(this._limits.get(t)??W)&&(this._limits.set(t,Math.ceil(e/W)*W),this.requestUpdate()),this.updateComplete.then(()=>this.querySelector(`.bundle-compare-diff [data-line="${e}"]`)?.scrollIntoView({block:`center`}))}_renderSource(e,t,n,{key:r,pretty:i}){let a=this._model(r,t,t),o={model:a,b:this._highlighted(this._textSide(e),e,t,i?.status===`ready`?`pretty`:``)},s=new Set([...this._importLines(n,a.b).values()].flat()),c=`${e}\0source`,l=this._sought?.path===e&&this._sought.key!==r?this._soughtLine(e,this._entries.get(e),i,a):null;this._sought?.path===e&&(this._sought.key=r),l&&l.line<a.b.length&&(l.line>=(this._limits.get(c)??W)&&this._limits.set(c,Math.ceil((l.line+1)/W)*W),this._soughtRow={path:e,index:l.line});let u=this._limits.get(c)??W,d=a.b.length>u?a.b.slice(0,u):a.b;return N`<div class="bundle-compare-diff-table single" data-path="${e}" style="${j({"--diff-num-width":`${String(a.b.length).length+1}ch`})}" role="table" aria-label="Source">${M(d,(e,t)=>t,(e,t)=>N`<div class="${A({"diff-row":!0,ctx:!0,"is-import":s.has(t)})}" role="row" data-line="${t+1}"><span class="diff-num">${t+1}</span>${this._codeCell(o,`b`,t,null)}</div>`)}</div>${a.b.length>d.length?N`<div class="bundle-compare-code-more"><button type="button" class="bundle-compare-code-action" @click="${()=>{this._limits.set(c,u+W),this.requestUpdate()}}">Show ${Math.min(W,a.b.length-d.length).toLocaleString()} more lines</button> <span>${(a.b.length-d.length).toLocaleString()} not shown</span></div>`:P}`}_hides(e,t,n){let r=[e&&[`Renames`,kr,G.ignoreRenames,()=>this._setRenames(!G.ignoreRenames)],t&&[`Whitespace`,jr,G.ignoreWhitespace,()=>this._setWhitespace(!G.ignoreWhitespace)],n&&[`Type-only`,Ar,G.ignoreTypes,()=>this._setTypes(!G.ignoreTypes)]].filter(Boolean);return r.length===0?P:N`<span class="bundle-compare-code-hide" role="group" aria-label="Hide"><span class="bundle-compare-code-hide-label" aria-hidden="true">Hide:</span>${r.map(([e,t,n,r])=>N`<mode-switch compact="compact" borderless .checked="${n}" accessible-label="${t}" label="${e}" @click="${r}"></mode-switch>`)}</span>`}_setWhitespace(e){G.ignoreWhitespace=e,this.requestUpdate()}_setTypes(e){G.ignoreTypes=e,this.requestUpdate()}_setRenames(e){G.ignoreRenames=e,e&&Qn(),this.requestUpdate()}_renderDiff(e,t,{after:n,before:r,key:i,model:a,pretty:o,changes:s,hiding:c,warned:l=[],whitespace:u=null}){let{kind:d,basePath:f=e}=t,p=G.layout===`split`,m=this._sought?.path===e&&this._sought.key!==i?this._soughtLine(e,t,o,a):null;this._sought?.path===e&&(this._sought.key=i);let h=m?this._seekRows(i,a,m,p):null;h?.index>=0&&(this._soughtRow={path:e,index:h.index+ +!!p});let g=this._expansions.get(i)??new Map,_=h?.rows??bn(a,g,{split:p}),v=this._limits.get(i)??W,y=_.length>v?_.slice(0,v):_,b={model:a,a:d===`added`?null:this._highlighted(this.base,f,r,c?`renamed\0${this.other.integrity}\0${e}`:o?.status===`ready`?`pretty`:``),b:d===`removed`?null:this._highlighted(this.other,e,n,o?.status===`ready`?`pretty`:``),expand:(e,t)=>{let n=new Map(g);n.set(e,t===`all`?{all:!0}:{...n.get(e),[t]:(n.get(e)?.[t]??0)+B}),this._expansions.set(i,n),this.requestUpdate()}},x=String(Math.max(a.a.length,a.b.length,1)).length;return N`${G.ignoreRenames&&s?.reason?N`<p class="bundle-compare-code-note">Renamed names are shown: ${Gr[s.reason]??s.reason}.</p>`:P} ${Pr[u]?N`<p class="bundle-compare-code-note">${Pr[u]}</p>`:P} ${l.length>0?N`<p class="bundle-compare-code-note">${Kr(l)} <button type="button" @click="${()=>this._setRenames(!1)}">Show them marked</button></p>`:P}<div class="${A({"bundle-compare-diff-table":!0,split:p,unified:!p})}" data-path="${e}" style="${j({"--diff-num-width":`${x+1}ch`})}" role="table" aria-label="Diff">${p?N`<div class="diff-row diff-split-head" role="row"><span class="diff-half">Before<strong data-tooltip-truncated data-tooltip="${this.baseName}">${this.baseName}</strong></span> <span class="diff-half">After<strong data-tooltip-truncated data-tooltip="${this.otherName}">${this.otherName}</strong></span></div>`:P} ${M(y,e=>this._rowKey(e),e=>p?this._splitRow(e,b):this._unifiedRow(e,b))}</div>${_.length>y.length?N`<div class="bundle-compare-code-more"><button type="button" class="bundle-compare-code-action" @click="${()=>{this._limits.set(i,v+W),this.requestUpdate()}}">Show ${Math.min(W,_.length-y.length).toLocaleString()} more rows</button> <span>${(_.length-y.length).toLocaleString()} not shown</span></div>`:P}`}_rowKey(e){return e.kind===`fold`?`f${e.run}:${e.a}`:e.kind===`change`?`c${e.left??``}:${e.right??``}`:`${e.kind}${e.a??``}:${e.b??``}`}_words(t,n,r){if(n==null||r==null)return null;let i=`${n}:${r}`;return t.words.has(i)||t.words.set(i,e(t.a[n],t.b[r])),t.words.get(i)}_code(e,t,n,r){let i=r&&!(e.endsWith(`\r`)&&n?.at(-1)?.[1]===e.length);if(typeof t==`string`)return bt($e(wn(t,n),i));if(n){let t=Tn(e,n);return t.map((e,n)=>{let r=De(e.text,i&&n===t.length-1);return e.marked?N`<mark class="diff-word">${r}</mark>`:r})}return De(e,i)}_cell(e,t,n,r,i){return n==null?N`<span class="diff-num"></span><span class="diff-sign"></span><span class="diff-code diff-empty"></span>`:N`<span class="diff-num">${n+1}</span><span class="diff-sign">${r}</span>${this._codeCell(e,t,n,i)}`}_noEol(e,t,n){return n!=null&&e.noEol[t]&&n===e[t].length-1}_fold(e,t){let n=e.count<=B;return N`<div class="diff-row diff-fold" role="row"><span class="diff-fold-actions">${!n&&e.down?N`<button type="button" aria-label="${`Show ${B} more lines below`}" data-tooltip="${`Show ${B} more lines`}" @click="${()=>t.expand(e.run,`top`)}"><svg viewBox="0 0 16 16" width="12" height="12" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 3v9m-4-4 4 4 4-4"/></svg></button>`:P} ${!n&&e.up?N`<button type="button" aria-label="${`Show ${B} more lines above`}" data-tooltip="${`Show ${B} more lines`}" @click="${()=>t.expand(e.run,`bottom`)}"><svg viewBox="0 0 16 16" width="12" height="12" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 13V4M4 8l4-4 4 4"/></svg></button>`:P} <button type="button" aria-label="${`Show all ${e.count} unchanged lines`}" data-tooltip="Show all" @click="${()=>t.expand(e.run,`all`)}"><svg viewBox="0 0 16 16" width="12" height="12" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m4 6 4-4 4 4M4 10l4 4 4-4"/></svg></button> </span><span class="diff-fold-label">${e.count.toLocaleString()} unchanged ${e.count===1?`line`:`lines`} · ${e.b+1}–${e.b+e.count}</span></div>`}_unifiedRow(e,t){let{model:n}=t;if(e.kind===`fold`)return this._fold(e,t);if(e.kind===`ctx`)return N`<div class="diff-row ctx" role="row"><span class="diff-num">${e.a+1}</span>${this._cell(t,`b`,e.b,` `,null)}</div>`;let r=e.kind===`del`,i=r?this._words(n,e.a,e.pair)?.a:this._words(n,e.pair,e.b)?.b,a=n.marked?.has(e.change);return N`<div class="${`diff-row ${e.kind}${a?` renamed`:``}`}" role="row" data-tooltip="${a?`Renamed names alone`:P}">${r?N`<span class="diff-num">${e.a+1}</span><span class="diff-num"></span><span class="diff-sign">−</span>${this._codeCell(t,`a`,e.a,i)}`:N`<span class="diff-num"></span><span class="diff-num">${e.b+1}</span><span class="diff-sign">+</span>${this._codeCell(t,`b`,e.b,i)}`}</div>`}_codeCell(e,t,n,r){let i=e.model[t],a=e[t]?.[n],o=i[n],s=this._noEol(e.model,t,n),c=Xr.get(i);c||Xr.set(i,c=new Map);let l=c.get(n);return(!l||l.markup!==a||l.ranges!==r||l.noEol!==s)&&c.set(n,l={markup:a,ranges:r,noEol:s,drawn:this._code(o,a,r,!s)}),N`<span class="${A({"diff-code":!0,"diff-long":o.length>Te})}">${l.drawn}${s?N`<span class="diff-no-eol" data-tooltip="No newline at end of file" aria-label="No newline at end of file">⊘</span>`:P}</span>`}_splitRow(e,t){let{model:n}=t;if(e.kind===`fold`)return this._fold(e,t);if(e.kind===`ctx`)return N`<div class="diff-row ctx" role="row"><span class="diff-half">${this._cell(t,`a`,e.a,` `,null)}</span> <span class="diff-half">${this._cell(t,`b`,e.b,` `,null)}</span></div>`;let r=e.paired?this._words(n,e.left,e.right):null,i=n.marked?.has(e.change);return N`<div class="${`diff-row change${i?` renamed`:``}`}" role="row" data-tooltip="${i?`Renamed names alone`:P}"><span class="${A({"diff-half":!0,del:e.left!==null,blank:e.left===null})}">${this._cell(t,`a`,e.left,`−`,r?.a)}</span> <span class="${A({"diff-half":!0,add:e.right!==null,blank:e.right===null})}">${this._cell(t,`b`,e.right,`+`,r?.b)}</span></div>`}};customElements.define(`bundle-compare-code`,ui);var di=Symbol.for(``),fi=e=>{if(e?.r===di)return e?._$litStatic$},pi=(e,...t)=>({_$litStatic$:t.reduce((t,n,r)=>t+(e=>{if(e._$litStatic$!==void 0)return e._$litStatic$;throw Error(`Value passed to 'literal' function must be a 'literal' result: ${e}. Use 'unsafeStatic' to pass non-literal values, but
|
|
20
|
+
`):[],a=n?this._highlighted(this._textSide(e),e,n):null,o=this._importLines(t,i),s=e=>e||`(empty target)`;return N`<section class="bundle-compare-code-repointed" aria-label="Repointed imports"><h4>Repointed ${t.length===1?`import`:`imports`} <b>${t.length}</b></h4><ul>${t.map(e=>{let t=o.get(e.specifier),n=`${e.conditions}${e.platform===null?``:` \xB7 Platform: ${e.platform}`}`;return N`<li><div class="bundle-compare-code-repointed-spec"><code data-tooltip-truncated data-tooltip="${e.specifier}">${e.specifier}</code> <span data-tooltip-truncated data-tooltip="${n}">${n}</span></div><div class="bundle-compare-code-repointed-targets"><span class="before"><span>Before</span><code data-tooltip-truncated data-tooltip="${s(e.baseTarget)}">${s(e.baseTarget)}</code></span> <span aria-hidden="true">→</span> <span class="after"><span>After</span><code data-tooltip-truncated data-tooltip="${s(e.otherTarget)}">${s(e.otherTarget)}</code></span></div>${t.slice(0,yr).map(t=>this._importLine(t,i[t],a?.[t],e.specifier,r))} ${t.length>yr?N`<span class="bundle-compare-code-repointed-more">and ${t.length-yr} more ${t.length-yr===1?`line`:`lines`}</span>`:P}</li>`})}</ul></section>`}_importLine(e,t,n,r,i){let a=t.length>240?Math.max(0,t.indexOf(r)-80):0;return N`<button type="button" class="bundle-compare-code-repointed-line bundle-compare-diff-table" ?disabled="${!i}" aria-label="${`Go to line ${e+1}`}" @click="${()=>this._goToLine(e+1)}"><span class="diff-num">${e+1}</span> <code>${t.length<=240&&typeof n==`string`?bt($e(n,!0)):Te(`${a>0?`…`:``}${t.slice(a,a+240)}${t.length>a+240?`…`:``}`,!0)}</code></button>`}_goToLine(e){let t=`${this._current}\0source`;e>(this._limits.get(t)??W)&&(this._limits.set(t,Math.ceil(e/W)*W),this.requestUpdate()),this.updateComplete.then(()=>this.querySelector(`.bundle-compare-diff [data-line="${e}"]`)?.scrollIntoView({block:`center`}))}_renderSource(e,t,n,{key:r,pretty:i}){let a=this._model(r,t,t),o={model:a,b:this._highlighted(this._textSide(e),e,t,i?.status===`ready`?`pretty`:``)},s=new Set([...this._importLines(n,a.b).values()].flat()),c=`${e}\0source`,l=this._sought?.path===e&&this._sought.key!==r?this._soughtLine(e,this._entries.get(e),i,a):null;this._sought?.path===e&&(this._sought.key=r),l&&l.line<a.b.length&&(l.line>=(this._limits.get(c)??W)&&this._limits.set(c,Math.ceil((l.line+1)/W)*W),this._soughtRow={path:e,index:l.line});let u=this._limits.get(c)??W,d=a.b.length>u?a.b.slice(0,u):a.b;return N`<div class="bundle-compare-diff-table single" data-path="${e}" style="${j({"--diff-num-width":`${String(a.b.length).length+1}ch`})}" role="table" aria-label="Source">${M(d,(e,t)=>t,(e,t)=>N`<div class="${A({"diff-row":!0,ctx:!0,"is-import":s.has(t)})}" role="row" data-line="${t+1}"><span class="diff-num">${t+1}</span>${this._codeCell(o,`b`,t,null)}</div>`)}</div>${a.b.length>d.length?N`<div class="bundle-compare-code-more"><button type="button" class="bundle-compare-code-action" @click="${()=>{this._limits.set(c,u+W),this.requestUpdate()}}">Show ${Math.min(W,a.b.length-d.length).toLocaleString()} more lines</button> <span>${(a.b.length-d.length).toLocaleString()} not shown</span></div>`:P}`}_hides(e,t,n){let r=[e&&[`Renames`,kr,G.ignoreRenames,()=>this._setRenames(!G.ignoreRenames)],t&&[`Whitespace`,jr,G.ignoreWhitespace,()=>this._setWhitespace(!G.ignoreWhitespace)],n&&[`Type-only`,Ar,G.ignoreTypes,()=>this._setTypes(!G.ignoreTypes)]].filter(Boolean);return r.length===0?P:N`<span class="bundle-compare-code-hide" role="group" aria-label="Hide"><span class="bundle-compare-code-hide-label" aria-hidden="true">Hide:</span>${r.map(([e,t,n,r])=>N`<mode-switch compact="compact" borderless .checked="${n}" accessible-label="${t}" label="${e}" @click="${r}"></mode-switch>`)}</span>`}_setWhitespace(e){G.ignoreWhitespace=e,this.requestUpdate()}_setTypes(e){G.ignoreTypes=e,this.requestUpdate()}_setRenames(e){G.ignoreRenames=e,e&&Qn(),this.requestUpdate()}_renderDiff(e,t,{after:n,before:r,key:i,model:a,pretty:o,changes:s,hiding:c,warned:l=[],whitespace:u=null}){let{kind:d,basePath:f=e}=t,p=G.layout===`split`,m=this._sought?.path===e&&this._sought.key!==i?this._soughtLine(e,t,o,a):null;this._sought?.path===e&&(this._sought.key=i);let h=m?this._seekRows(i,a,m,p):null;h?.index>=0&&(this._soughtRow={path:e,index:h.index+ +!!p});let g=this._expansions.get(i)??new Map,_=h?.rows??bn(a,g,{split:p}),v=this._limits.get(i)??W,y=_.length>v?_.slice(0,v):_,b={model:a,a:d===`added`?null:this._highlighted(this.base,f,r,c?`renamed\0${this.other.integrity}\0${e}`:o?.status===`ready`?`pretty`:``),b:d===`removed`?null:this._highlighted(this.other,e,n,o?.status===`ready`?`pretty`:``),expand:(e,t)=>{let n=new Map(g);n.set(e,t===`all`?{all:!0}:{...n.get(e),[t]:(n.get(e)?.[t]??0)+B}),this._expansions.set(i,n),this.requestUpdate()}},x=String(Math.max(a.a.length,a.b.length,1)).length;return N`${G.ignoreRenames&&s?.reason?N`<p class="bundle-compare-code-note">Renamed names are shown: ${Gr[s.reason]??s.reason}.</p>`:P} ${Pr[u]?N`<p class="bundle-compare-code-note">${Pr[u]}</p>`:P} ${l.length>0?N`<p class="bundle-compare-code-note">${Kr(l)} <button type="button" @click="${()=>this._setRenames(!1)}">Show them marked</button></p>`:P}<div class="${A({"bundle-compare-diff-table":!0,split:p,unified:!p})}" data-path="${e}" style="${j({"--diff-num-width":`${x+1}ch`})}" role="table" aria-label="Diff">${p?N`<div class="diff-row diff-split-head" role="row"><span class="diff-half">Before<strong data-tooltip-truncated data-tooltip="${this.baseName}">${this.baseName}</strong></span> <span class="diff-half">After<strong data-tooltip-truncated data-tooltip="${this.otherName}">${this.otherName}</strong></span></div>`:P} ${M(y,e=>this._rowKey(e),e=>p?this._splitRow(e,b):this._unifiedRow(e,b))}</div>${_.length>y.length?N`<div class="bundle-compare-code-more"><button type="button" class="bundle-compare-code-action" @click="${()=>{this._limits.set(i,v+W),this.requestUpdate()}}">Show ${Math.min(W,_.length-y.length).toLocaleString()} more rows</button> <span>${(_.length-y.length).toLocaleString()} not shown</span></div>`:P}`}_rowKey(e){return e.kind===`fold`?`f${e.run}:${e.a}`:e.kind===`change`?`c${e.left??``}:${e.right??``}`:`${e.kind}${e.a??``}:${e.b??``}`}_words(t,n,r){if(n==null||r==null)return null;let i=`${n}:${r}`;return t.words.has(i)||t.words.set(i,e(t.a[n],t.b[r])),t.words.get(i)}_code(e,t,n,r){let i=r&&!(e.endsWith(`\r`)&&n?.at(-1)?.[1]===e.length);if(typeof t==`string`)return bt($e(wn(t,n),i));if(n){let t=Tn(e,n);return t.map((e,n)=>{let r=Te(e.text,i&&n===t.length-1);return e.marked?N`<mark class="diff-word">${r}</mark>`:r})}return Te(e,i)}_cell(e,t,n,r,i){return n==null?N`<span class="diff-num"></span><span class="diff-sign"></span><span class="diff-code diff-empty"></span>`:N`<span class="diff-num">${n+1}</span><span class="diff-sign">${r}</span>${this._codeCell(e,t,n,i)}`}_noEol(e,t,n){return n!=null&&e.noEol[t]&&n===e[t].length-1}_fold(e,t){let n=e.count<=B;return N`<div class="diff-row diff-fold" role="row"><span class="diff-fold-actions">${!n&&e.down?N`<button type="button" aria-label="${`Show ${B} more lines below`}" data-tooltip="${`Show ${B} more lines`}" @click="${()=>t.expand(e.run,`top`)}"><svg viewBox="0 0 16 16" width="12" height="12" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 3v9m-4-4 4 4 4-4"/></svg></button>`:P} ${!n&&e.up?N`<button type="button" aria-label="${`Show ${B} more lines above`}" data-tooltip="${`Show ${B} more lines`}" @click="${()=>t.expand(e.run,`bottom`)}"><svg viewBox="0 0 16 16" width="12" height="12" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 13V4M4 8l4-4 4 4"/></svg></button>`:P} <button type="button" aria-label="${`Show all ${e.count} unchanged lines`}" data-tooltip="Show all" @click="${()=>t.expand(e.run,`all`)}"><svg viewBox="0 0 16 16" width="12" height="12" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m4 6 4-4 4 4M4 10l4 4 4-4"/></svg></button> </span><span class="diff-fold-label">${e.count.toLocaleString()} unchanged ${e.count===1?`line`:`lines`} · ${e.b+1}–${e.b+e.count}</span></div>`}_unifiedRow(e,t){let{model:n}=t;if(e.kind===`fold`)return this._fold(e,t);if(e.kind===`ctx`)return N`<div class="diff-row ctx" role="row"><span class="diff-num">${e.a+1}</span>${this._cell(t,`b`,e.b,` `,null)}</div>`;let r=e.kind===`del`,i=r?this._words(n,e.a,e.pair)?.a:this._words(n,e.pair,e.b)?.b,a=n.marked?.has(e.change);return N`<div class="${`diff-row ${e.kind}${a?` renamed`:``}`}" role="row" data-tooltip="${a?`Renamed names alone`:P}">${r?N`<span class="diff-num">${e.a+1}</span><span class="diff-num"></span><span class="diff-sign">−</span>${this._codeCell(t,`a`,e.a,i)}`:N`<span class="diff-num"></span><span class="diff-num">${e.b+1}</span><span class="diff-sign">+</span>${this._codeCell(t,`b`,e.b,i)}`}</div>`}_codeCell(e,t,n,r){let i=e.model[t],a=e[t]?.[n],o=i[n],s=this._noEol(e.model,t,n),c=Xr.get(i);c||Xr.set(i,c=new Map);let l=c.get(n);return(!l||l.markup!==a||l.ranges!==r||l.noEol!==s)&&c.set(n,l={markup:a,ranges:r,noEol:s,drawn:this._code(o,a,r,!s)}),N`<span class="${A({"diff-code":!0,"diff-long":o.length>Ce})}">${l.drawn}${s?N`<span class="diff-no-eol" data-tooltip="No newline at end of file" aria-label="No newline at end of file">⊘</span>`:P}</span>`}_splitRow(e,t){let{model:n}=t;if(e.kind===`fold`)return this._fold(e,t);if(e.kind===`ctx`)return N`<div class="diff-row ctx" role="row"><span class="diff-half">${this._cell(t,`a`,e.a,` `,null)}</span> <span class="diff-half">${this._cell(t,`b`,e.b,` `,null)}</span></div>`;let r=e.paired?this._words(n,e.left,e.right):null,i=n.marked?.has(e.change);return N`<div class="${`diff-row change${i?` renamed`:``}`}" role="row" data-tooltip="${i?`Renamed names alone`:P}"><span class="${A({"diff-half":!0,del:e.left!==null,blank:e.left===null})}">${this._cell(t,`a`,e.left,`−`,r?.a)}</span> <span class="${A({"diff-half":!0,add:e.right!==null,blank:e.right===null})}">${this._cell(t,`b`,e.right,`+`,r?.b)}</span></div>`}};customElements.define(`bundle-compare-code`,ui);var di=Symbol.for(``),fi=e=>{if(e?.r===di)return e?._$litStatic$},pi=(e,...t)=>({_$litStatic$:t.reduce((t,n,r)=>t+(e=>{if(e._$litStatic$!==void 0)return e._$litStatic$;throw Error(`Value passed to 'literal' function must be a 'literal' result: ${e}. Use 'unsafeStatic' to pass non-literal values, but
|
|
21
21
|
take care to ensure page security.`)})(n)+e[r+1],e[0]),r:di}),mi=new Map,hi=(e=>(t,...n)=>{let r=n.length,i,a,o=[],s=[],c,l=0,u=!1;for(;l<r;){for(c=t[l];l<r&&(a=n[l],(i=fi(a))!==void 0);)c+=i+t[++l],u=!0;l!==r&&s.push(a),o.push(c),l++}if(l===r&&o.push(t[r]),u){let e=o.join(`$$lit$$`);(t=mi.get(e))===void 0&&(o.raw=o,mi.set(e,t=o)),n=s}return e(t,...n)})(N),gi=25e3,q=40,_i=e=>[...e].toSorted(([e],[t])=>e.localeCompare(t));function vi(e,t,n,{resolutions:r=[],max:i=gi}={}){let a=new Map,o=Qt(n);if(o.size*2>=i)return{rows:1/0,models:a};let s=new Set(r.map(e=>e.parent).filter(e=>!o.has(e))),c=r.length*2+s.size;for(let[n,r]of _i(o)){c++;let{before:o,after:s}=L(e,t,n,r);if(r.modified===!1)c++;else if(typeof o==`string`&&typeof s==`string`){if(K(o,s))return{rows:1/0,models:a};let e=cn(o,s);a.set(n,e),c+=Math.max(bn(e).length,1)}else c++;if(c>=i)break}return{rows:c,models:a}}var yi=class extends ui{static properties={...ui.properties,models:{attribute:!1}};constructor(){super(),this.models=null,this._modelCap=1/0,this._fileLimit=q}_renamesAlone=!1;willUpdate(e){if(super.willUpdate(e),e.has(`models`))for(let[e,t]of this.models??[]){let n=this._entries.get(e);if(!n)continue;let{before:r,after:i}=L(this.base,this.other,e,n);this._models.set(qr(e,!1,{ignoreWhitespace:!1,ignoreRenames:!1}),{model:t,before:r,after:i,given:null})}e.has(`files`)&&(this._fileLimit=q,this._current=this._picked=null),(e.has(`path`)||e.has(`files`))&&this.path&&this.path!==this._current&&(this._goTo=this.path),e.has(`files`)&&(this._toTop=!0)}updated(){let e=this._goTo&&this._section(this._goTo);if(e)this._picked=this._goTo,e.scrollIntoView({block:`start`});else if(this._toTop){let e=this.querySelector(`.bundle-compare-diff`);e&&(e.scrollTop=0)}this._goTo=null,this._toTop=!1,this._current!==this._shownPath&&(this._shownPath=this._current,this.querySelector(`.bundle-compare-code-tree .bundle-code-tree-link.current`)?.scrollIntoView({block:`nearest`})),this._scrollSought()}_select(e,t=!0){!e||this.extensions?.canSelect?.()===!1||(this._current=this._picked=e,this.requestUpdate(),t&&this.updateComplete.then(()=>this._section(e)?.scrollIntoView({block:`start`})),this.dispatchEvent(new CustomEvent(`compare-code-select`,{detail:{path:e},bubbles:!0,composed:!0})))}_more(){this._fileLimit+=q,this.requestUpdate()}_searchable(e){return e.modified!==!1&&e.kind!==`repointed`}_countingState(e,t){return this._states?.get(e)??super._countingState(e,t)}_section(e){return[...this.querySelectorAll(`.bundle-compare-all-file`)].find(t=>t.dataset.path===e)??null}_spy(){this._spying||this.extensions?.canSelect?.()===!1||(this._spying=requestAnimationFrame(()=>{this._spying=0;let e=this.querySelector(`.bundle-compare-diff`);if(!e||this.extensions?.canSelect?.()===!1)return;this._fileLimit<this._order.length&&e.scrollTop+2*e.clientHeight>=e.scrollHeight&&this._more();let{top:t,bottom:n}=e.getBoundingClientRect(),r=this._picked&&this._section(this._picked)?.getBoundingClientRect();if(r&&r.bottom>t&&r.top<n)return;this._picked=null;let i=null;for(let n of e.querySelectorAll(`:scope > .bundle-compare-all-file`)){if(n.getBoundingClientRect().top>t+4)break;i=n}let a=i?.dataset.path??this._order[0]??null;a!==this._current&&(this._current=a,this.requestUpdate(),this.dispatchEvent(new CustomEvent(`compare-code-select`,{detail:{path:a},bubbles:!0,composed:!0})))}))}_fileBody(e,t,n){let r=t.repointed?this._renderRepointed(e,t.repointed,[n.after,n.before].find(e=>typeof e==`string`&&e!==``)??null,!1):P,i=t.kind===`repointed`||t.kind===`renamed`&&!t.modified&&!!t.repointed&&!t.meta&&!(n.model?.blocks.length>0);return N`${this._dependencyChanges(e)}${r}${i?P:this._fileMessage(e,t,n)??this._renderDiff(e,t,n)}`}_fileContent(e,t,n,r){return N`<header class="bundle-code-main-bar bundle-compare-all-file-head">${this._fileName(e,t,r)} <span class="bundle-code-main-spacer"></span> ${this._fileFigures(t,n.model)}</header>${this._fileBody(e,t,n)}`}_layout(e,t){return N`<div class="bundle-code-view bundle-compare-code">${this._renderRail(e,this._current)}<div class="bundle-code-main">${t}</div></div>`}render(){let e=this._railState(),t=this.extensions?.fullPaths?``:e.prefix,n=this.extensions?.filterContent===!1?e.allOrder:e.order;this._order=n,this._goTo&&n.includes(this._goTo)&&(this._current=this._goTo),n.includes(this._current)||(this._current=n[0]??null),this._current&&(this._goTo||this._current!==this._shownPath)&&this._reveal(this._current,e.prefix);let r=n.indexOf(this._current);r>=this._fileLimit&&(this._fileLimit=Math.ceil((r+1)/q)*q);let i=n.map(e=>[e,this._entries.get(e)]),a=i.map(([e,t])=>({path:e,entry:t,file:this._fileState(e,t)})),o=a.reduce((e,{file:t})=>e+(t.model?.additions??0),0),s=a.reduce((e,{file:t})=>e+(t.model?.deletions??0),0);this._states=new Map(a.map(({path:e,file:t})=>[e,t]));let c=a.filter(({file:e})=>$r(e)),l=c.map(({file:e})=>$r(e)),u=l.filter(e=>e.status===`error`),d=u.length>0?{...u[0],failed:u.length,of:l.length}:l.find(e=>e.status===`loading`)??l[0]??null,f=d&&{...d,affects:c.map(({path:e})=>e)},p=a.some(({file:e})=>e.model?.blocks.length>0||e.whitespace||e.hiding||e.types);return this._layout(e,N`<header class="bundle-code-main-bar bundle-compare-code-bar"><span class="bundle-compare-all-title">${i.length.toLocaleString()} ${i.length===1?`file`:`files`} changed</span> ${o+s>0?ni(o,s):P} <span class="bundle-code-main-spacer"></span> ${this._toggles(p,f,a.some(({file:e})=>e.renamed),a.some(({file:e})=>e.whitespace===`hideable`),a.some(({file:e})=>e.types))}</header><div class="bundle-compare-diff" tabindex="0" aria-label="Every change" @scroll="${()=>this._spy()}">${i.length===0?N`<div class="bundle-code-placeholder">${this._entries.size===0?`No files differ in this comparison.`:`No changed files match.`}</div>`:M(a.slice(0,this._fileLimit),({path:e})=>e,({path:e,entry:n,file:r})=>N`<section class="bundle-compare-all-file" aria-label="${e}" data-path="${e}">${this.extensions?.fileActions?N`<div class="bundle-compare-file-content">${this._fileContent(e,n,r,t)}</div>${this.extensions.fileActions(e,!0)}`:this._fileContent(e,n,r,t)}</section>`)} ${a.length>this._fileLimit?N`<button type="button" class="bundle-compare-code-action bundle-compare-all-more" @click="${()=>this._more()}">Show more files (${(a.length-this._fileLimit).toLocaleString()} remaining)</button>`:P}</div>`)}};customElements.define(`bundle-compare-all`,yi);function bi({base:e,other:t,diff:n,source:r,path:i,seek:a,baseName:o,otherName:s,select:c,extensions:l=null,mode:u}){let d=u?null:n.combined??=vi(e,t,n.files,{resolutions:n.resolutions?.changed??[]});u??=d.rows<gi?`diff`:`code`;let f=u===`diff`?pi`bundle-compare-all`:pi`bundle-compare-code`;return hi`<${f} .base=${e} .other=${t} .files=${n.files} .scope=${n.scope??``} .resolutions=${n.resolutions?.changed??[]}
|
|
22
22
|
.baseAlerts=${r?.files?.alerts?.(e)??null} .otherAlerts=${r?.files?.alerts?.(t)??null} .alertTags=${r?.files?.alertTags??null}
|
|
23
23
|
.newHosts=${r?.files?.newHosts?.(e,t)??null} .newHostTag=${r?.files?.newHostTag??null}
|
|
24
24
|
.dependencies=${r?.dependencies?.(e,t)??null} .openDependency=${r?.openDependency??null} .dependencyTags=${r?.dependencyTags??null}
|
|
25
25
|
.models=${d?.models??null} .path=${i} .seek=${a} .extensions=${l} baseName=${o} otherName=${s}
|
|
26
|
-
@compare-code-select=${e=>{e.stopPropagation(),c(e.detail.path)}}></${f}>`}var xi=400,Si=24,Ci=[`removed`,`added`,`changed`],J=null;function Y(e){return e.join(`, `)}var wi=class extends xt{static properties={details:{attribute:!1},integrity:{attribute:!1},request:{attribute:!1},source:{attribute:!1},review:{attribute:!1},_targetIntegrity:{state:!0},_otherDetails:{state:!0},_status:{state:!0},_scope:{state:!0},_fileSort:{state:!0},_pkgSort:{state:!0},_openSections:{state:!0},_mode:{state:!0},_codePath:{state:!0},_codeSeek:{state:!0}};createRenderRoot(){return this}constructor(){super(),this.details=null,this.integrity=null,this.request=null,this.source=null,this._targetIntegrity=null,this._otherDetails=null,this._status=`idle`,this._scope=``,this._fileSort={removed:`name`,added:`name`,changed:`name`},this._pkgSort={removed:`size`,added:`size`,changed:`size`},this._openSections=new Set,this._mode=`overview`,this._codePath=null,this._codeSeek=null,this._repaint=()=>this.requestUpdate(),this._fitBody=null,this._fitObserver=null}connectedCallback(){super.connectedCallback(),this._fitBody&&this._fitObserver?.observe(this._fitBody)}disconnectedCallback(){super.disconnectedCallback(),this._fitObserver?.disconnect()}willUpdate(e){e.has(`source`)&&this.source&&!e.get(`source`)&&(this._openSections=new Set([...this._openSections,`files`])),(e.has(`_otherDetails`)||e.has(`details`))&&this._status===`ready`&&!o(this.details,this._otherDetails).some(e=>e.id===this._scope)&&(this._scope=``),e.has(`integrity`)&&this._rebase(),(e.has(`request`)||e.has(`integrity`))&&this.integrity&&this.request?.bundle===this.integrity?(this.request.target!==this._targetIntegrity&&this._choose(this.request.target),this._mode=gt(this.request.mode)):e.has(`request`)&&!e.has(`integrity`)&&e.get(`request`)?.bundle===this.integrity&&(this._targetIntegrity&&this._choose(null),this._mode=`overview`)}updated(){let e=this.querySelector(`.bundle-compare-body`);e!==this._fitBody&&typeof ResizeObserver==`function`&&(this._fitObserver??=new ResizeObserver(()=>this._fitLists()),this._fitObserver.disconnect(),e&&this._fitObserver.observe(e),this._fitBody=e),this._fitLists()}_fitLists(){let e=this._fitBody;if(!e)return;let t=getComputedStyle(e),n=e.getBoundingClientRect().top+e.clientTop+parseFloat(t.paddingTop)-e.scrollTop,r=e=>{let t=e.getBoundingClientRect();return t.top-n+e.parentElement.getBoundingClientRect().bottom-t.bottom},i=e.querySelector(`.bundle-compare-rows--fill`);if(i){let t=r(i),n=i.closest(`.bundle-compare-section`);for(let e=n;e;e=e.nextElementSibling){let r=e.matches(`details[open]`)&&e.querySelector(`:scope > summary`),i=e===n?0:r?r.getBoundingClientRect().bottom+parseFloat(getComputedStyle(r).marginBottom)-e.getBoundingClientRect().top:e.getBoundingClientRect().height;t+=i+parseFloat(getComputedStyle(e).marginBottom)}e.style.setProperty(`--compare-fill-around`,`${t}px`)}let a=[...e.querySelectorAll(`.bundle-compare-rows--scroll:not(.bundle-compare-rows--fill)`)];if(a.length===0)return;let o=e.lastElementChild,s=new Map(a.filter(e=>o.contains(e)).map(e=>[e,e.parentElement.getBoundingClientRect().top])),c=Math.max(...s.values()),l=e.clientHeight-parseFloat(t.paddingTop)-parseFloat(t.paddingBottom),u=parseFloat(getComputedStyle(o).marginBottom);for(let e of a)s.get(e)>=c-1?e.style.setProperty(`--compare-rest`,`${l-r(e)-u}px`):e.style.removeProperty(`--compare-rest`)}_rebase(){let e=this._baseKey;if(J&&e&&e!==J.base&&(J=null),J&&e===J.base){let{target:e}=J;if(this._scope=J.scope,this._mode=J.mode,this._codePath=J.codePath,J=null,!e){this._targetIntegrity=null,this._otherDetails=null,this._status=`idle`;return}this._targetIntegrity=e;let t=this.source?null:We(e,e=>!!(e.json||e.bundle));t?(this._otherDetails=t,this._status=`ready`):(this._otherDetails=null,this._status=`loading`,this._loadOther(e));return}this._targetIntegrity=null,this._otherDetails=null,this._status=`idle`,this._scope=``,this._codePath=null}get _baseKey(){return this.source?this.source.base:this.integrity}_swap(){let e=this._targetIntegrity;e&&e!==this._baseKey&&this._reopen(e,this._baseKey)}_pickBase(e){!e||e===this._baseKey||(e===this._targetIntegrity?this._swap():this._reopen(e,this._targetIntegrity))}_reopen(e,t){if(this.source){J={base:e,target:t,scope:this._scope,mode:this._mode,codePath:this._codePath},this.source.open(e,t,this._mode);return}if(!ye(T.bundles??[],this.integrity).some(t=>t.integrity===e))return;J={base:e,target:t,scope:this._scope,mode:this._mode,codePath:this._codePath};let n=[this._otherDetails,this._baseReady?this.details:null].filter(n=>n&&!n.error&&(n.json||n.bundle)&&[e,t].includes(n.integrity));this.dispatchEvent(new CustomEvent(`bundle-swap`,{bubbles:!0,composed:!0,detail:{integrity:e,target:t,bundles:n,mode:this._mode}}))}_nameFor(e){return this.source?this.source.name(e):(T.bundles??[]).find(t=>t.integrity===e)?.name??`${e.slice(0,15)}\u2026`}_pick(e){this._choose(e),this._notify()}_notify(){this.dispatchEvent(new CustomEvent(`bundle-compare-change`,{bubbles:!0,composed:!0,detail:{base:this.integrity,target:this._targetIntegrity,mode:this._mode}}))}_choose(e){let t=e||null;if(this._targetIntegrity=t,this._otherDetails=null,this._codePath=null,!t){this._status=`idle`,this._scope=``;return}this._status=`loading`,this._loadOther(t)}async _loadOther(e){if(this.source){let t;try{t=await this.source.load(e)}catch(e){if(e.name===`AbortError`)return;t={error:e.message}}if(this._targetIntegrity!==e)return;this._otherDetails=t,this._status=`ready`,t?.compareId&&t.compareId!==e&&(this._targetIntegrity=t.compareId,this._notify());return}let t=ye(T.bundles??[],this.integrity).find(t=>t.integrity===e);if(!t){this._status=`idle`,this._targetIntegrity=null,this._notify();return}let n;try{n=await Ke(e,t)}catch(e){if(e.name===`AbortError`)return;throw e}this._targetIntegrity===e&&(this._otherDetails=n,this._status=`ready`)}get _baseReady(){return!!(this.details&&this.details.integrity===this.integrity&&(this.details.json||this.details.bundle))}_openFile(e){this._codePath=e,this._mode=`code`,this._notify()}_openLine({path:e,line:t,query:n}){this._codeSeek={path:e,line:t-1,query:n},this._openFile(e)}_fileRow(e,t,n,r=e,i=!1,a=void 0,o=e,s=void 0){let c=this.source?.files;return N`<li><button type="button" class="bundle-compare-row bundle-compare-row-link" @click="${()=>this._openFile(e)}">${c?c.icon(e,[[this._otherDetails,o],[this.details,e]]):P}<span class="bundle-compare-row-path mono" data-tooltip-truncated data-tooltip="${r}">${t}</span>${i?c?.tag?.(this.details,e,s)??P:P}${dr(a)}${n}</button></li>`}_group(e,t,n,r,i,a=P,{fill:o=!1,lanes:s=Ci,style:c={}}={}){return t.length===0?P:N`<section class="${`bundle-compare-group bundle-compare-${n}`}" style="${j({"--compare-lane":String(s.indexOf(n)+1),...c})}"><header class="bundle-compare-group-head"><span class="bundle-compare-dot" aria-hidden="true"></span> <span class="bundle-compare-group-title" data-tooltip-truncated data-tooltip="${e}">${e}</span> <span class="bundle-compare-group-count">${t.length}</span> ${a}</header><ul class="${o?`bundle-compare-rows bundle-compare-rows--scroll bundle-compare-rows--fill`:`bundle-compare-rows bundle-compare-rows--scroll`}">${M(t,r,i)}</ul></section>`}_sizeCells(e){let t=e=>e==null?`—`:k(e),n=e=>`${e.toLocaleString()} LoC`;return e.delta===void 0?N`<span class="bundle-compare-row-size" data-tooltip="${e.lines>0?n(e.lines):P}">${t(e.bytes)}</span>`:N`<span class="${`bundle-compare-row-delta ${e.delta===null?``:Tt(e.delta)}`}" data-tooltip="${`${t(e.baseBytes)} \u2192 ${t(e.otherBytes)}${e.baseLines>0||e.otherLines>0?` \xB7 ${e.baseLines.toLocaleString()} \u2192 ${n(e.otherLines)}`:``}`}">${e.delta===null?`—`:wt(e.delta)}</span>`}_sortActions(e,t,n,r=!1,i=this[e][t]){return N`<span class="bundles-overview-sort" role="group" aria-label="${`${t} ${n} order`}">${[[`name`,`Name`],[`size`,`Size`],...r?[[`flags`,`Flags`]]:[]].map(([n,r])=>N`<button type="button" aria-pressed="${String(i===n)}" @click="${()=>{this[e]={...this[e],[t]:n}}}">${r}</button>`)}</span>`}_fileGroup(e,t,n,r,i){let a=this.source?.files,o=n!==`removed`,s=e=>n===`added`?null:{details:this._otherDetails,path:e.basePath??e.path},c=e=>[...o&&a?.flags?a.flags(this.details,e.path,s(e)):[],...fr(e.meta)],l=t.some(e=>c(e).length>0),u=this._fileSort[n]===`flags`&&!l?`name`:this._fileSort[n],d=e=>n===`changed`?Math.abs(e.delta):e.bytes,f=u===`flags`?Ee(t,c,e=>e.path):t.toSorted((e,t)=>(u===`size`?d(t)-d(e):0)||e.path.localeCompare(t.path));return this._group(e,f,n,e=>e.path,e=>e.renamedFrom==null?this._fileRow(e.path,r(e.path),this._sizeCells(e),e.path,o,e.meta,e.basePath??e.path,s(e)):this._fileRow(e.path,Xt(r(e.renamedFrom),r(e.path)),this._sizeCells(e),`${e.renamedFrom} \u2192 ${e.path}`,o,e.meta,e.basePath??e.path,s(e)),this._sortActions(`_fileSort`,n,`file`,l,u),{lanes:i})}_pkgGroup(e,t,n,r){let i=this._pkgSort[n],a=e=>{let t=n===`changed`?e.delta:e.bytes;return t==null?-1:Math.abs(t)},o=t.toSorted((e,t)=>(i===`size`?a(t)-a(e):0)||ht(e.pkg).localeCompare(ht(t.pkg))),s=n===`changed`?0:Math.min(Si,Math.max(0,...t.map(e=>Y(e.versions).length)));return this._group(e,o,n,e=>e.pkg,e=>N`<li><div class="bundle-compare-row"><span class="bundle-compare-pkg-dot" style="${j({background:mt(e.pkg)})}"></span> <span class="bundle-compare-row-path" data-tooltip-truncated data-tooltip="${ht(e.pkg)}">${ht(e.pkg)}</span> ${n===`changed`?this._versionCell(e):s>0?N`<span class="bundle-compare-dep-ver" data-tooltip-truncated data-tooltip="${Y(e.versions)}">${Y(e.versions)}</span>`:P} ${this._sizeCells(n===`changed`?e:{bytes:e.bytes})}</div></li>`,this._sortActions(`_pkgSort`,n,`package`),{fill:!0,lanes:r,style:s>0?{"--compare-version-width":`${s}ch`}:{}})}_versionCell(e){let t=e.otherVersions,n=e.baseVersions;if(n.join()===t.join())return n.length>0?N`<span class="bundle-compare-dep-ver">${Y(n)}</span>`:P;let r=e.direction??`changed`,i=r===`up`?`↑`:r===`down`?`↓`:`±`;return N`<span class="bundle-compare-ver" aria-label="${`${r===`up`?`Upgraded`:r===`down`?`Downgraded`:`Changed`}: ${Y(n)||`none`} to ${Y(t)||`none`}`}"><span class="bundle-compare-ver-from">${Y(n)||`—`}</span> <span class="bundle-compare-ver-arrow" aria-hidden="true">→</span> <span class="${`bundle-compare-ver-to ${r}`}">${Y(t)||`—`}</span> <span class="${`bundle-compare-ver-dir ${r}`}" aria-hidden="true">${i}</span></span>`}_depGroup(e,t,n,r){let i=n===`changed`?0:Math.min(Si,Math.max(0,...t.map(e=>e.range.length))),a=e=>N`<span class="bundle-compare-row-path" data-tooltip-truncated data-tooltip="${e.name}">${e.name}</span> ${this.source?.dependencyTags?.(e,n)??P}${e.kind?N`<span class="npm-dependency-kind">${e.kind}</span>`:P} ${n===`changed`?N`<span class="bundle-compare-ver" aria-label="${`Changed: ${e.from} to ${e.to}`}"><span class="bundle-compare-ver-from">${e.from}</span> <span class="bundle-compare-ver-arrow" aria-hidden="true">→</span> <span class="bundle-compare-ver-to changed">${e.to}</span></span>`:N`<span class="bundle-compare-dep-ver" data-tooltip-truncated data-tooltip="${e.range}">${e.range}</span>`}`,o=this.source?.openDependency;return this._group(e,t,n,e=>e.key,e=>N`<li>${o&&e.opens?N`<button type="button" class="bundle-compare-row bundle-compare-row-link" @click="${()=>o(e)}">${a(e)}</button>`:N`<div class="bundle-compare-row">${a(e)}</div>`}</li>`,P,{fill:!0,lanes:r,style:i>0?{"--compare-version-width":`${i}ch`}:{}})}_renderDependencies(e,t,n,r){return r.length===0?P:N`<section class="bundle-compare-section"><h3 class="bundle-compare-section-head">Dependencies</h3>${this._cols(r,N`${this._depGroup(`Removed \xB7 only in ${t}`,e.removed,`removed`,r)} ${this._depGroup(`Added \xB7 only in ${n}`,e.added,`added`,r)} ${this._depGroup(`Changed`,e.changed,`changed`,r)}`,`dependencies`)}</section>`}_renderPackages(e,t,n,r=Ci){return e.removed.length===0&&e.added.length===0&&e.changed.length===0?P:N`<section class="bundle-compare-section"><h3 class="bundle-compare-section-head">Packages</h3>${this._cols(r,N`${this._pkgGroup(`Removed \xB7 only in ${t}`,e.removed,`removed`,r)} ${this._pkgGroup(`Added \xB7 only in ${n}`,e.added,`added`,r)} ${this._pkgGroup(`Changed`,e.changed,`changed`,r)}`,`packages`)}</section>`}_cols(e,t,n){let r=e.map(e=>e===`changed`?`minmax(0, 5fr)`:`minmax(0, 4fr)`).join(` `);return N`<div class="bundle-compare-cols" data-lanes="${e.length}" data-section="${n}" style="${j({"--compare-lanes":r})}">${t}</div>`}_collapsible(e,t,n,r,i=``){let a=this._openSections.has(e);return N`<details class="bundle-compare-section bundle-compare-collapsible" .open="${E(a)}" @toggle="${t=>this._setSection(e,t.currentTarget.open)}"><summary class="bundle-compare-section-head" @click="${t=>{t.preventDefault(),this._setSection(e,!a)}}">${t} <span class="bundle-compare-section-count">${n.toLocaleString()}</span>${i?N`<span class="bundle-compare-section-note" data-tooltip-truncated data-tooltip="${i}">${i}</span>`:P}</summary>${a?r():P}</details>`}_setSection(e,t){if(t===this._openSections.has(e))return;let n=new Set(this._openSections);t?n.add(e):n.delete(e),this._openSections=n}_renderResolutions(e){if(e.totalChanges===0)return P;let t=e.changed,n=t.slice(0,xi),r=t.length-n.length,i=(e,t=``)=>N`<td class="${t}"><code data-tooltip-truncated data-tooltip="${e}">${e}</code></td>`,a=e=>`${e.conditions}${e.platform===null?``:` \xB7 Platform: ${e.platform}`}`,o=n.some(e=>a(e)!==`*`);return this._collapsible(`resolutions`,`Import resolutions`,t.length,()=>N`<section class="bundle-compare-group bundle-compare-changed bundle-compare-resolutions"><header class="bundle-compare-group-head"><span class="bundle-compare-dot" aria-hidden="true"></span> <span class="bundle-compare-group-title">Repointed</span> <span class="bundle-compare-group-count">${t.length}</span></header><table class="${o?``:`bundle-compare-resolutions--no-context`}"><thead><tr><th>File</th><th>Import</th><th>Before</th><th>After</th>${o?N`<th>Conditions</th>`:P}</tr></thead><tbody>${M(n,e=>e.key,e=>{let t=a(e);return N`<tr><td><button type="button" class="bundle-compare-resolution-parent" data-tooltip-truncated data-tooltip="${e.parent}" @click="${()=>this._openFile(e.parent)}">${e.parent}</button></td>${i(e.specifier)} ${i(e.baseTarget||`(empty target)`,`bundle-compare-resolution-before`)} ${i(e.otherTarget||`(empty target)`,`bundle-compare-resolution-after`)} ${o?N`<td class="bundle-compare-resolution-context"><span data-tooltip-truncated data-tooltip="${t}">${t}</span></td>`:P}</tr>`})}</tbody></table>${r>0?N`<div class="bundle-compare-more">and ${r.toLocaleString()} more…</div>`:P}</section>`)}_comparison(){return Jt(this._otherDetails,this.details,this._scope,this._repaint)}_renderSummary(e){return jt(e,N`<div class="bundle-compare-modes" role="tablist" aria-label="Comparison view">${[[`overview`,`Overview`],[`code`,`Code`]].map(([e,t])=>N`<button type="button" role="tab" aria-selected="${String(this._mode===e)}" @click="${()=>{this._mode=e,this._notify()}}">${t}</button>`)}</div>`)}_renderPicker(e,t,n,r){return At({source:this.source,from:{options:e,value:this._targetIntegrity,pick:e=>this._pick(e)},to:{options:this._baseOptions(),value:this._baseKey,placeholder:this._nameFor(this.integrity),pick:e=>this._pickBase(e)},clear:t?{run:()=>this._pick(null)}:null,swap:t&&this.source?.canSwap?.(this._targetIntegrity)!==!1?()=>this._swap():null,extras:n,comparison:r,openLine:e=>this._openLine(e)})}_baseOptions(){if(this.source)return F(this.source.choices??[]);let e=(T.bundles??[]).find(e=>e.integrity===this.integrity),t=ye(T.bundles??[],this.integrity);return this._bundleOptions(e?[e,...t]:t)}_otherOptions(){return this.source?F(this.source.options):this._bundleOptions(ye(T.bundles??[],this.integrity))}_bundleOptions(e){let t=new Map;for(let n of e)t.set(n.name,(t.get(n.name)??0)+1);return e.map(e=>({id:e.integrity,integrity:e.integrity,kind:e.kind??(e.name.toLowerCase().endsWith(`.map`)?`sourcemap`:`stasis`),summary:e.summary,size:typeof e.size==`number`?k(e.size):`—`,filename:t.get(e.name)>1?`${e.name} \xB7 ${e.integrity.slice(7,13)}\u2026`:e.name}))}render(){let e=this._otherOptions(),t=!!this._targetIntegrity&&(!!this.source||e.some(e=>e.integrity===this._targetIntegrity)),n=this._baseReady?o(this.details,t?this._otherDetails:null):[],r=n.length>0?N`<bundle-scope-selector .reasons="${n}" .value="${this._scope}" label="Compare scope" @scope-change="${e=>{this._scope=e.detail.value}}"></bundle-scope-selector>`:P,i=this.source?.noun??`bundle`,a=t&&this._status===`ready`&&this._otherDetails&&(this._otherDetails.json||this._otherDetails.bundle)&&!this._otherDetails.error,s=this._baseReady&&a?this._comparison():null,c=s?.status===`ready`?s.diff:null,l=c?{base:this._otherDetails,other:this.details,files:c.files}:null,u=e.length>0||this.source?this._renderPicker(e,t,r,l):r,d=c?this._mode:`overview`,f;return this._baseReady?this.source&&!t&&(this.source.pending||this.source.error||!this.source.select&&e.length===0)?f=N`<div class="${`bundle-compare-empty${this.source.error?` is-error`:``}`}">${this.source.pending?`Loading ${i}s\u2026`:this.source.error??N`No other ${i}s to compare <strong>${this._nameFor(this.integrity)}</strong> with.`}</div>`:e.length===0&&!this.source?f=N`<div class="bundle-compare-empty">No other bundles to compare with. Drop a second <code>.map</code> or <code>.stasis.code.br</code> bundle to diff against this one.</div>`:t?this._status===`loading`||!this._otherDetails?f=N`<div class="bundle-compare-empty">Comparing…</div>`:this._otherDetails.error?f=N`<div class="bundle-compare-empty is-error">Couldn't read the selected ${i}: ${this._otherDetails.error}</div>`:!this._otherDetails.json&&!this._otherDetails.bundle?f=N`<div class="bundle-compare-empty is-error">The selected ${i} couldn't be parsed.</div>`:s?.status===`error`?f=N`<div class="bundle-compare-empty is-error">Couldn't compare the ${i}s: ${s.message}</div>`:c?d!==`code`&&(f=this._renderDiff(c)):f=N`<div class="bundle-compare-empty">Comparing…</div>`:f=N`<div class="bundle-compare-empty">Pick a ${i} above to compare <strong>${this._nameFor(this.integrity)}</strong> against.</div>`:f=N`<div class="bundle-compare-empty">Loading bundle…</div>`,N`<div class="bundle-compare">${Mt(u,c?this._renderSummary(c):P)} ${d===`code`?bi({base:this._otherDetails,other:this.details,diff:c,source:this.source,path:this._codePath,seek:this._codeSeek,baseName:this._nameFor(this._targetIntegrity),otherName:this._nameFor(this.integrity),select:e=>{this._codePath=e}}):N`<div class="bundle-compare-body">${f}</div>`}</div>`}_renderDiff(e){let t=this._nameFor(this._targetIntegrity),n=this._nameFor(this.integrity),r=[...e.files.onlyBase.map(e=>e.path),...e.files.onlyOther.map(e=>e.path),...e.files.changed.flatMap(e=>e.renamedFrom==null?[e.path]:[e.path,e.renamedFrom])],i=a(e.files.root,pt(r).prefix),{prefix:o}=i,s=e=>o&&e.startsWith(o)?e.slice(o.length):e,c=e.files.onlyBase.length+e.files.onlyOther.length+e.files.changed.length,l={removed:e.files.onlyBase,added:e.files.onlyOther,changed:e.files.changed},u=!e.totals.identical,d=this.source?.dependencies?.(this._otherDetails,this.details)??null,f=Ci.filter(t=>(d??e.packageRows)[t].length>0),p=u?Ci.filter(e=>l[e].length>0):[],m=p.every(e=>f.includes(e))?f:p,h=u?this.source?.files?.warning?.(this.details,[...l.added,...l.changed].map(e=>e.path)):P;return N`${d?this._renderDependencies(d,t,n,f):this._renderPackages(e.packageRows,t,n,f)} ${h??P} ${e.totals.identical?e.resolutions.totalChanges>0?N`<div class="bundle-compare-caption">File contents are unchanged; import resolutions differ.</div>`:N`<div class="bundle-compare-identical">These two ${this.source?.noun??`bundle`}s carry identical files (${e.totals.unchangedFiles.toLocaleString()} ${e.totals.unchangedFiles===1?`file`:`files`})${i.from?N`, moved <span class="mono">${Zt(i)}</span>`:``}.</div>`:this._collapsible(`files`,`Files`,c,()=>this._cols(m,N`${this._fileGroup(`Removed \xB7 only in ${t}`,l.removed,`removed`,s,m)} ${this._fileGroup(`Added \xB7 only in ${n}`,l.added,`added`,s,m)} ${this._fileGroup(`Changed`,l.changed,`changed`,s,m)}`,`files`),i.from?`${i.from} \u2192 ${i.to}`:o)} ${this._renderResolutions(e.resolutions)}`}};customElements.define(`bundle-compare`,wi);var Ti={...he,"accept-with-nits":`Accept with nits`},Ei=e=>e.revokedAt===null?e.publishedAt===null?`Draft`:`Published`:`Revoked`,Di={accept:`✓`,"accept-with-nits":`·`,"request-changes":`!`,reject:`×`},Oi=e=>N`<span class="${`npm-review-verdict-icon ${e??`unchecked`}`}" aria-hidden="true">${Di[e]??``}</span>`,ki=e=>N`<span class="npm-review-verdict">${Oi(e)}${Ti[e]??`Not reviewed`}</span>`,Ai=e=>N`<span class="${`npm-review-badge ${e.revokedAt===null?e.publishedAt===null?``:`published`:`revoked`}`}">${Ei(e)}</span>`,ji=e=>e.user?Xe({id:e.user,login:e.userLogin,name:e.userName?.trim()||null}):e.userLogin,Mi=e=>N`<time datetime="${new Date(e).toISOString()}">${new Date(e).toLocaleString()}</time>`,Ni=(e,t)=>N`<div class="npm-review-progress" role="progressbar" aria-label="Files checked" aria-valuemin="0" aria-valuemax="${t||1}" aria-valuenow="${e}"><span style="${j({width:`${t?e/t*100:0}%`})}"></span></div>`;function Pi(e=[],t=[]){let n=new Set(t);return new Map(e.filter(e=>e.status&&!n.has(e.file)).map(e=>[e.file,{status:e.status,notes:+!!e.comment.trim()}]))}function Fi(e){let t=we(e);if(t.length===0)return P;let n=t.filter(e=>e.bullet);return N`${t.filter(e=>!e.bullet).map(e=>N`<p class="npm-review-note">${e.text}</p>`)} ${n.length>0?N`<ul class="npm-review-note npm-review-note-list">${n.map(e=>N`<li>${e.text}</li>`)}</ul>`:P}`}var X=null,Z=(e,t)=>[`ecosystem`,`package`,`version`,`integrity`,`patchHash`,`basePackage`,`baseVersion`,`baseIntegrity`].every(n=>(e[n]??null)===(t[n]??null));function Ii(e,t=!1){X={review:e,continueReview:t}}function Li(e){if(!X||!Z(X.review,e))return null;let t=X;return X=null,t}function Q(e){let t=e.patchHash?` (patched)`:``,n=`${e.package} ${e.version}${t}`;return e.basePackage?e.basePackage===e.package?`${e.package} ${e.baseVersion} -> ${e.version}${t}`:`${e.basePackage} ${e.baseVersion} -> ${n}`:n}var $=e=>e._blocked||e._loading,Ri=e=>e._shownReview?.publishedAt!=null,zi=e=>e.coverage===`full`?`Full`:`Partial`,Bi=e=>e._error?N`<p class="npm-review-error" role="alert">${e._error}</p>`:P,Vi=e=>e._saveBlocked?N`<div class="npm-review-saving" role="status">Saving changes…</div>`:P,Hi=e=>[e._continuation?.review,...e._reviews].filter(Boolean).toSorted((e,t)=>+(e.publishedAt!==null)-(t.publishedAt!==null)||(t.publishedAt??t.time)-(e.publishedAt??e.time)),Ui=e=>`npm-review-button npm-review-primary npm-review-finalize ${e._allowedVerdicts[0]}`,Wi=(e,t,n,r,i=Object.keys(Ti),a=!1)=>N`<div class="npm-review-verdict-options" role="group" aria-label="Verdict">${Object.entries(a?{"":`Not checked`,...Ti}:Ti).map(([a,o])=>N`<label class="${`npm-review-verdict-choice ${a||`unchecked`}`}"><input type="radio" name="${e}" aria-label="${o}" value="${a}" .checked="${E(t===a)}" ?disabled="${r||a!==``&&!i.includes(a)}" @change="${()=>n(a)}">${o}</label>`)}</div>`;function Gi(e){let t=Ri(e),n=e._shownReview,r=e._summary,i=e._canEdit?{label:`Finalize review`,run:()=>e._beginPublish(),disabled:!r.checkedFiles}:!t||!e._writable?null:e._activeReview||e._ownPublished.length===0?{label:`Resume your review`,run:()=>e._resume()}:n.user===e.session?.id?{label:`Revise review`,run:()=>e._change({action:`continue`,reviewId:n.id,revision:n.revision})}:null;return N`<div class="npm-review-summary-actions">${t||e._draftStarted?Ai(n??{publishedAt:null,revokedAt:null}):P}<div class="npm-review-progress-block"><span>${e._unsaved&&(e._saveBlocked||e._error)?N`<button type="button" class="npm-review-button npm-review-text-button" @click="${()=>e._openPanel(`unsaved`)}">Unsaved changes</button>`:N`<strong>${r.checkedFiles} of ${r.totalFiles}</strong> files checked`}</span> ${Ni(r.checkedFiles,r.totalFiles)}</div>${i?N`<button type="button" class="${e._canEdit?Ui(e):`npm-review-button`}" ?disabled="${$(e)||i.disabled}" @click="${i.run}">${i.label} ${w}</button>`:P}</div>`}function Ki(e){let t=e.source??Oe(e.entry),n=!!(e._target&&e._target!==`(empty)`),r=F(t.options,t=>`${e.entry.npm.name}@${t.id}`);n&&!r.some(t=>t.id===e._target)&&r.push(...F([{id:e._target,name:e._target,format:`npm`}]));let i=F(t.choices);return i.some(t=>t.id===e.entry.npm.version)||i.push(...F([{id:e.entry.npm.version,name:e.entry.npm.version,format:`npm`}])),Mt(At({source:t,label:`Review`,disabled:$(e),from:{options:r,value:n?e._target:null,label:`Review base`,pick:t=>{e._navigate(t)}},to:{options:i,value:e.entry.npm.version,label:`Version to review`,pick:t=>{e._navigateTo({view:`npm`,packageName:e.entry.npm.name,packageSpec:t,bundleTab:`review`,...e._location(e._target,t===e.entry.npm.version)})}},clear:n?{label:`Clear review base`,run:()=>{e._navigate(`(empty)`)}}:null,openLine:t=>e._openLine(t),comparison:{base:e._base,other:e._other,files:e._diff.files}}),jt(e._diff))}var qi=e=>e._patch?N`<span class="npm-review-patched" data-tooltip="${`As pnpm\u2019s patch ${e._patch.path} changes it, read at ${e._patch.commit.slice(0,7)}`}">patched</span>`:P;function Ji(e){return N`<div class="npm-review-toolbar"><nav class="npm-review-toolbar-group" aria-label="Review breadcrumbs"><button type="button" class="npm-review-button npm-review-text-button" ?disabled="${$(e)}" @click="${()=>{e._navigateTo({view:`reviews`})}}">My reviews</button> ${w}<button type="button" class="npm-review-button npm-review-text-button npm-review-package" aria-haspopup="dialog" ?disabled="${e._blocked}" @click="${()=>e._openPanel(`reviews`)}"><span>${e.entry.npm.name}@${e.entry.npm.version}</span><span class="npm-review-count">${Hi(e).length}</span></button> ${qi(e)}</nav>${Gi(e)}</div>`}function Yi(e,t=e._file,n=!1){let r=e._editorState(t),i=e._shownReview?.entries.find(e=>e.file===t),a=e._nonTextFiles.includes(t),o=!a&&[`accept-with-nits`,`request-changes`,`reject`].includes(r.status);return N`<section class="${`npm-review-decision${n?` npm-review-inline-decision`:``}`}" aria-label="File decision">${e._canEdit?N`${Wi(`file:${t}`,a?``:r.status,n=>{e._setFileStatus(t,n)},$(e)||a,void 0,!0)} ${a?N`<p class="npm-review-help">Non-text file. Verdicts are not supported yet; this file remains unchecked.</p>`:P} ${o?N`<textarea aria-label="File note" rows="2" maxlength="20000" placeholder="Add a note (optional)…" .value="${E(r.comment)}" ?disabled="${$(e)}" @input="${n=>e._editFile(t,{comment:n.target.value})}" @blur="${()=>{e._saveFile(t)}}"></textarea>`:P}`:N`${n?P:N`<header><strong>File review</strong><span class="npm-review-muted">${Ri(e)?`Frozen`:`Read only`}</span></header>`} ${i?.status&&!a?N`${ki(i.status)}${Fi(i.comment)}`:N`<p class="npm-review-muted">This file was not reviewed.</p>`} ${e._reviewer||e._loading?P:N`<p class="npm-review-help">${e._writable?`Reviewing needs a team that reviews dependencies, where you manage or have Dependencies.`:`Triage access is required to add a review.`}</p>`}`}</section>`}function Xi(e,t,n,r,i,a){return N`<fieldset class="npm-review-team-options"><legend>${t}</legend>${n.map(t=>N`<mode-switch label="${t.name}" .checked="${r.has(t.id)}" .disabled="${$(e)}" @click="${()=>{if($(e))return;let n=new Set(r);n.has(t.id)?n.delete(t.id):n.add(t.id),i(n)}}"></mode-switch>`)}${a}</fieldset>`}function Zi(e,t){let n=e._allowedVerdicts,r=be(t.entries,e._files,e._nonTextFiles),i=t.entries.filter(t=>t.status&&t.comment.trim()&&!e._nonTextFiles.includes(t.file));return N`<form class="npm-review-publish-form" @submit="${t=>{t.preventDefault(),e._publish()}}"><div class="npm-review-dialog-body"><section class="npm-review-coverage"><div><strong>${zi(r)} review</strong><span>${r.checkedFiles} of ${r.totalFiles} files checked</span></div>${Ni(r.checkedFiles,r.totalFiles)}<p>${r.totalFiles>r.checkedFiles?N`${r.totalFiles-r.checkedFiles} files not checked. <button type="button" class="npm-review-button npm-review-text-button" @click="${()=>{e._unchecked=!0,e._closePanel()}}">View files</button>`:`Every file has a verdict.`}</p>${e._needsPackageJson?N`<p class="npm-review-error">Review ${e._files.includes(`package.json`)?N`<button type="button" class="npm-review-button npm-review-text-button" @click="${()=>{e._closePanel(),e._selectFile(`package.json`)}}">package.json</button>`:`package.json`} before publishing a partial review.</p>`:P}</section>${i.length>0?N`<section aria-label="File notes"><strong>File notes</strong><ul class="npm-review-publish-notes" tabindex="0" aria-label="Saved file notes">${i.map(e=>N`<li><span class="dependency-review-entry-file">${ot(e.file)}<span>${e.file}</span></span> ${Fi(e.comment)}</li>`)}</ul></section>`:P}<div><strong>Final verdict</strong>${Wi(`final-verdict`,e._finalStatus,t=>{e._finalStatus=t},$(e),n)}</div>${e._securityLimit===`reject`?N`<p class="npm-review-help">Malware detected. Only Reject is available.</p>`:e._securityLimit===`request-changes`?N`<p class="npm-review-help">Critical vulnerabilities detected.</p>`:P} <label>Final note <span class="npm-review-muted">· optional</span><textarea aria-label="Final comment" rows="3" maxlength="20000" .value="${E(e._finalComment)}" placeholder="Summarize your findings or explain what remains…" ?disabled="${$(e)}" @input="${t=>{e._finalComment=t.target.value}}"></textarea></label> ${e._unchangedContinuation?N`<p class="npm-review-help">Change a verdict or note to publish a new review.</p>`:P} ${Xi(e,`Publish to teams`,e._teams,e._selectedTeams,t=>{e._selectedTeams=t},e._selectedTeams.size>0?P:N`<p class="npm-review-error">${e._teams.length===0?`No teams you belong to have dependency review enabled.`:`Select at least one team to publish.`}</p>`)} ${Bi(e)}</div><footer class="npm-review-dialog-footer"><p>Publishing freezes your verdicts and notes.<br>You can continue in a new review to make changes.</p><button type="submit" class="${Ui(e)}" ?disabled="${$(e)||!e._canPublish}">Publish to ${e._selectedTeams.size} ${e._selectedTeams.size===1?`team`:`teams`} ${w}</button></footer></form>`}function Qi(e,t){let n=t===e._shownReview,r=t.publishedAt!==null,i=r?t:Z(t,e._context)?be(t.entries,e._files,e._nonTextFiles):{checkedFiles:t.entries.filter(e=>e.status).length,totalFiles:null},a=[e._continuation?.review,...e._reviews].some(n=>n?.publishedAt===null&&n.user===e.session?.id&&Z(n,t)),o=t.user===e.session?.id,s=e._teams.filter(e=>!t.teams.some(t=>t.id===e.id)),c=e._additionalTeams.get(t.id)??new Set(s.length===1?s.map(e=>e.id):[]),l=s.filter(e=>c.has(e.id)).map(e=>e.id);return N`<section class="npm-review-entry" aria-current="${String(n)}"><div class="npm-review-history-heading"><strong>${ji(t)}</strong>${n?N`<span class="npm-review-current">Current</span>`:P}${Ai(t)}</div><p class="npm-review-help">${t.basePackage?`${t.basePackage===t.package?t.baseVersion:`${t.basePackage}@${t.baseVersion}`} \u2192 ${t.version}`:`All package files`}</p><div class="npm-review-entry-result">${r?ki(t.status):P}<span class="dependency-review-coverage"> ${r?N`${i.coverage===`full`?`Full`:N`<span class="dependency-review-partial">Partial</span>`} · `:P}${i.checkedFiles}${i.totalFiles===null?P:`/${i.totalFiles}`} files checked</span></div><p class="npm-review-help">${t.teams.length>0?`${t.teams.map(e=>e.name).join(`, `)} \xB7 `:``}${Mi(t.publishedAt??t.time)}</p>${Fi(t.comment)}<div class="npm-review-entry-actions"><button type="button" class="npm-review-button" ?disabled="${$(e)}" @click="${()=>{e._openReview(t)}}">Open ${w}</button> ${r&&o&&!a&&e._reviewer?N`<button type="button" class="npm-review-button" aria-label="Revise in a new draft" ?disabled="${$(e)}" @click="${()=>{e._openReview(t,!0)}}">Revise</button>`:P} ${r&&o&&e._writable&&t.revokedAt===null?N`<button type="button" class="npm-review-button npm-review-danger" ?disabled="${$(e)}" @click="${()=>e._change({action:`revoke`,reviewId:t.id,revision:t.revision})}">Revoke</button>`:P} ${o?N`<dependency-review-copy .text="${t.formatted}"></dependency-review-copy>`:P} ${!r&&o&&e._writable?N`<button type="button" class="dependency-review-discard" aria-label="Discard review" ?disabled="${$(e)}" @click="${()=>{e._discard(t)}}">${bt(yt)}</button>`:P}</div>${r&&o&&e._writable&&t.revokedAt===null&&s.length>0?N`<details class="npm-review-share"><summary>Publish to more teams</summary>${Xi(e,`Teams`,s,c,n=>{e._additionalTeams=new Map(e._additionalTeams).set(t.id,n)},N`<button type="button" class="npm-review-button" ?disabled="${$(e)||l.length===0}" @click="${()=>e._change({action:`publish`,reviewId:t.id,revision:t.revision,teamIds:l})}">Publish to more teams</button>`)}</details>`:P} ${t.revokedAt===null?P:N`<p class="npm-review-help">Revoked ${Mi(t.revokedAt)}. Content and team links remain frozen.</p>`}</section>`}function $i(e){if(!e._panel)return P;let t={publish:`Publish review`,reviews:`Reviews`,unsaved:`Unsaved changes`};return N`<dialog class="npm-review-dialog" aria-label="${t[e._panel]}" @cancel="${t=>{t.preventDefault(),e._closePanel()}}"><button type="button" class="detail-action npm-review-close" aria-label="Close panel" ?disabled="${e._blocked}" @click="${()=>e._closePanel()}">×</button><header class="npm-review-dialog-head"><h2>${t[e._panel]}</h2><p>${e._panel===`reviews`?`${e.entry.npm.name}@${e.entry.npm.version}${e._patch?` (patched)`:``}`:Q(e._context)}</p></header>${e._panel===`publish`?Zi(e,e._activeReview):N`<div class="${`npm-review-dialog-body${e._panel===`reviews`?` npm-review-entries`:``}`}">${e._panel===`unsaved`?N`${e._dirtyFiles.map(t=>N`<button type="button" class="npm-review-button" @click="${()=>{e._closePanel(),e._selectFile(t)}}">${t} ${w}</button>`)}`:Hi(e).map(t=>Qi(e,t))} ${e._panel===`reviews`&&Hi(e).length===0?N`<p class="npm-review-muted">No reviews yet.</p>`:P}${Bi(e)}</div>`} ${Vi(e)}</dialog>`}function ea(e){let t=e._shownReview?.entries,n=e._files,r=e._nonTextFiles;if(e._treeProgress?.entries!==t||e._treeProgress?.files!==n||e._treeProgress?.nonTextFiles!==r){let i=Pi(t,r),a=new Map,o=0;for(let t of e._files){let e=t.split(`/`),n=+!!i.get(t)?.status;o+=n;for(let t=1;t<e.length;t++){let r=e.slice(0,t).join(`/`),i=a.get(r)??{total:0,checked:0};i.total++,i.checked+=n,a.set(r,i)}}e._treeProgress={entries:t,files:n,nonTextFiles:r,states:i,directories:a,checked:o}}let{states:i,directories:a,checked:o}=e._treeProgress;return{railLabel:`Files`,treeLabel:`Review files`,collapseLabel:`Collapse folders`,searchLabel:`Find a file`,searchPlaceholder:`Find a file…`,treePageSize:300,filterContent:!1,fullPaths:!0,collapseClearsSearch:!0,canSelect:()=>!e._blocked&&!e._panel,fileFilter:e._unchecked?e=>!i.get(e)?.status:null,fileLabel:e=>`${e}, ${Ti[i.get(e)?.status]??`Not reviewed`}`,filePrefix:e=>Oi(i.get(e)?.status),fileSuffix:e=>i.get(e)?.notes?N`<span class="npm-review-note-dot" aria-label="Has notes">•</span>`:P,directoryLabel:e=>{let t=a.get(e.sourcePath);return`${e.sourcePath}, ${t?.checked??0} of ${t?.total??0} checked`},directorySummary:e=>{let t=a.get(e.sourcePath);return`${t?.checked??0}/${t?.total??0}`},filters:N`<div class="npm-review-filters" aria-label="Filter review files"><button type="button" class="npm-review-button" aria-pressed="${String(!e._unchecked)}" @click="${()=>{e._unchecked=!1}}">All ${e._files.length}</button> <button type="button" class="npm-review-button" aria-pressed="${String(!!e._unchecked)}" @click="${()=>{e._unchecked=!0}}">Unchecked ${e._files.length-o}</button></div>`,fileActions:(t,n)=>Yi(e,t,n)}}function ta(e){return e._base?N`${Ki(e)}${Ji(e)}${e._panel?P:Bi(e)} ${bi({base:e._base,other:e._other,diff:e._diff,source:e.source,path:e._path,seek:e._seek,baseName:e._base.npm?`${e._base.npm.name}@${e._base.npm.version}`:`Empty package`,otherName:`${e.entry.npm.name}@${e.entry.npm.version}${e._patch?` (patched)`:``}`,select:t=>e._selectFile(t),extensions:ea(e),mode:e._mode})} <span class="npm-review-announcement" role="status">${e._notice??``}</span>${e._panel?P:Vi(e)}${$i(e)}`:N`<div class="npm-review-empty" role="${e._baseError?`alert`:`status`}">${e._baseError??`Loading comparison…`} ${e._baseError?N`<button type="button" class="npm-review-button" @click="${()=>{e._baseKey=null,e._loadBase(e._target,e.request?.resume)}}">Retry</button>`:P}</div>`}var na={maxLines:5e4,maxBytes:2097152},ra={integrity:`(empty)`,kind:`sourcemap`,json:{version:3,sources:[],sourcesContent:[]},fileSizes:new Map},ia=(e,t,n=null)=>({ecosystem:`npm`,package:e.npm.name,version:e.npm.version,integrity:e.integrity,patchHash:n?.hash??null,basePackage:t?.npm?.name??null,baseVersion:t?.npm?.version??null,baseIntegrity:t?.npm?t.integrity:null}),aa=(e,t)=>`${e}@${t??`latest`}`,oa=class extends xt{static properties={entry:{attribute:!1},details:{attribute:!1},request:{attribute:!1},session:{attribute:!1},source:{attribute:!1},_teams:{state:!0},_selectedTeams:{state:!0},_additionalTeams:{state:!0},_reviews:{state:!0},_loading:{state:!0},_error:{state:!0},_saving:{state:!0},_saveBlocked:{state:!0},_file:{state:!0},_seek:{state:!0},_finalStatus:{state:!0},_finalComment:{state:!0},_base:{state:!0},_baseError:{state:!0},_panel:{state:!0},_path:{state:!0},_selectedReview:{state:!0},_unchecked:{state:!0},_notice:{state:!0},_continuation:{state:!0}};createRenderRoot(){return this}constructor(){super(),this._teams=[],this._reviews=[],this._files=[],this._nonTextFiles=[],this._selectedTeams=new Set,this._additionalTeams=new Map,this._editors=new Map,this._file=null,this._path=null,this._patch=null,this._patched=null,this._loading=!1,this._saving=!1,this._error=null,this._context=null,this._key=null,this._controller=new AbortController,this._mode=`code`,this._panel=null,this._selectedReview=null,this._unchecked=!1,this._pendingSaves=[],this._saveBlocked=!1}disconnectedCallback(){super.disconnectedCallback(),this._controller.abort(),this._cancelSaves(),this._dismissLoading?.(),this._key=null,this._baseKey=null}updated(){let e=this.querySelector(`dialog`);e&&!e.open&&e.showModal(),this._rememberBase()}_rememberBase(){T.bundleDetailsTab!==`review`||T.selectedBundle!==this.entry?.integrity||!this._context||!this._activeReview&&this._ownPublished.length===0&&!this._unsaved||(T.npmReview={bundle:this.entry.integrity,...this._context.basePackage?{reviewPackage:this._context.basePackage,reviewSpec:this._context.baseVersion}:{},...this._patch?{patch:this._patch}:{},started:!0,user:this.session?.id})}get _writable(){return[`triage`,`manage`,`admin`].includes(this.session?.role)&&!this.session?.viewer}get _other(){return this._patched??this.details}get _reviewer(){return this._writable&&this._teams.length>0}get _activeReview(){return this._reviews.find(e=>e.user===this.session?.id&&e.publishedAt===null&&Z(e,this._context))??(this._continuation&&this._continuation.review.user===this.session?.id?this._continuation.review:null)}get _ownPublished(){return this._reviews.filter(e=>e.user===this.session?.id&&e.publishedAt!==null&&Z(e,this._context)).toSorted((e,t)=>t.publishedAt-e.publishedAt)}get _shownReview(){return this._selectedReview?this._reviews.find(e=>e.id===this._selectedReview):this._activeReview??this._ownPublished[0]??null}get _canEdit(){return this._reviewer&&!this._selectedReview&&(this._activeReview!==null||this._ownPublished.length===0)}_isDirty(e,t){return!this._nonTextFiles.includes(e)&&(t.comment!==(t.edit?.comment??``)||t.status!==(t.edit?.status??``))}get _dirtyFiles(){return[...this._editors].filter(([e,t])=>this._isDirty(e,t)).map(([e])=>e)}get _blocked(){return this._saving||this._saveBlocked}get _unsaved(){return this._pendingSaves.length>0||this._dirtyFiles.length>0}get _draftStarted(){return this._canEdit&&(this._unsaved||this._activeReview&&!this._continuation||this._continuation&&this._publishRevision!=null&&!this._unchangedContinuation)}get _summary(){return be(this._shownReview?.entries??[],this._files,this._nonTextFiles)}get _securityLimit(){return this.source?.reviewVerdictLimit?.(this.entry,this._base)??`accept`}get _allowedVerdicts(){let e=new Map((this._shownReview?.entries??[]).map(e=>[e.file,e]));if(this._canEdit)for(let[t,n]of this._editors)e.set(t,{file:t,status:n.status||null});return l([...e.values()].filter(e=>!this._nonTextFiles.includes(e.file)),this._securityLimit)}get _needsPackageJson(){return Se(this._activeReview?.entries??[],this._files,this._nonTextFiles)}get _unchangedContinuation(){let e=this._continuation?.source;return!!(e&&this._finalStatus===e.status&&this._finalComment===e.comment)}get _canPublish(){return this._canEdit&&this._panel===`publish`&&this._activeReview?.revision===this._publishRevision&&this._summary.checkedFiles>0&&!this._needsPackageJson&&!this._unchangedContinuation&&this._selectedTeams.size>0&&!this._unsaved&&this._allowedVerdicts.includes(this._finalStatus)}_location(e,t=!0){let n=e&&e!==`(empty)`?y(e):null;return{...n?{reviewPackage:n.name,reviewSpec:n.spec}:{},...t&&this._patch?{patch:this._patch}:{}}}_asked(e=this._context){let t=Object.fromEntries(Object.keys(this._context).map(t=>[t,e[t]??null])),n=(e===this._context?null:e.patchSource)??this._patch;return t.patchHash&&n?{...t,patchRepoId:n.repoId,patchCommit:n.commit,patchPath:n.path}:t}_navigate(e){return this._navigateTo(x(this.entry,`review`,this._location(e)))}async _navigateTo(e){if(this._blocked||this._loading)return;let t=this._key,n=this._navigation={};this._unsaved&&!await this._saveAll()||t===this._key&&n===this._navigation&&!this._unsaved&&await Fe?.navigate(e)}async _loadBase(e,t=!1){let n=JSON.stringify([this.entry.integrity,e,this._patch,this.session?.id,this.session?.role]);if(this._baseKey!==n){this._baseKey=n,this._base=null,this._baseError=null,this._controller.abort(),this._cancelSaves(),this._key=null,this._controller=new AbortController;try{let r=this._controller.signal,i=this._patch?ne(this.entry,this._patch,{signal:r}):Promise.resolve(this.details);i.catch(()=>{});let a=t?await Ce(ia(this.entry,null,this._patch),r):null;if(this._baseKey!==n)return;a&&(e=a.basePackage?aa(a.basePackage,a.baseVersion):`(empty)`);let o=e===`(empty)`?null:y(e),s=o?(await S(o.name,o.spec??`latest`)).details:ra,c=await i;if(this._baseKey!==n)return;let l=await Yt(s,c);if(this._baseKey!==n)return;t&&(a&&Ii(a),this._target=e,this.request={bundle:this.entry.integrity,...this._location(e)},this._baseKey=JSON.stringify([this.entry.integrity,e,this._patch,this.session?.id,this.session?.role])),this._patched=this._patch?c:null,this._base=s,this._ensureContext(s,l)}catch(e){this._baseKey===n&&(this._baseError=e.message)}}}_ensureContext(e,t){let n=ia(this.entry,e,this._patch),r=JSON.stringify([this.session?.id,this.session?.role,n]);if(r===this._key)return;this._controller.abort(),this._cancelSaves(),this._controller=new AbortController,this._context=n,this._diff=t;let i=en(e,this._other,this._diff);this._files=Le(ke(i.map(e=>e.path)));let a=new Set(i.filter(e=>!_e(e.before,e.after)).map(e=>e.path));if(this._nonTextFiles=this._files.filter(e=>a.has(e)),this._mode=tn(i,na)?`diff`:`code`,this._key=r,this._teams=[],this._reviews=[],this._selectedTeams=new Set,this._additionalTeams=new Map,this._selectedReview=null,this._continuation=null,this._editors.clear(),this._path=this._files[0]??null,this._panel=null,this._notice=``,this._resetEditor(this._path),this._saving=!1,this._refresh(!0),T.bundleDetailsTab===`review`&&T.selectedBundle===this.entry.integrity){let t=this._location(e.npm?aa(e.npm.name,e.npm.version):`(empty)`);T.npmReview={bundle:this.entry.integrity,...t},this._baseKey=JSON.stringify([this.entry.integrity,e.npm?aa(e.npm.name,e.npm.version):`(empty)`,this._patch,this.session?.id,this.session?.role]),Fe?.replaceRoute(x(this.entry,`review`,t))}}async _refresh(e=!1){let t=this._key;for(;t===this._key&&this._pendingSaves.length>0;)if((await Promise.all(this._pendingSaves.map(e=>e.promise))).some(e=>!e))return;if(t!==this._key)return;this._dismissLoading?.();let n=this._dismissLoading=je(`Loading reviews…`,{duration:0});this._loading=!0,this._error=null;try{let{reviews:n,teams:r}=await ge({...this._context,allBases:!0},null,null,this._controller.signal);if(t===this._key){let t=this._unsaved;this._reviews=n,this._teams=r,n.some(e=>e.user===this.session?.id&&e.publishedAt===null&&Z(e,this._context))&&(this._continuation=null),this._rememberBase();let i=Li(this._context),a=i&&n.find(e=>e.id===i.review.id);a?.publishedAt!=null&&(i.continueReview?this._continue(a.id,a.revision):this._selectedReview=a.id),this._selectedTeams=new Set(r.filter(t=>e?r.length===1:this._selectedTeams.has(t.id)).map(e=>e.id)),t||(this._editors.clear(),this._resetEditor(this._file))}}catch(e){t===this._key&&e.name!==`AbortError`&&(this._error=e.message)}finally{n(),t===this._key&&(this._loading=!1)}}_resetEditor(e=null){this._publishRevision=null,this._file=e,this._editorState(e)}_editorState(e){let t=this._canEdit?this._editors.get(e):null;if(!t){let n=this._shownReview?.entries.find(t=>t.file===e&&t.status)??null;t={edit:n,revision:this._activeReview?.revision??null,comment:this._nonTextFiles.includes(e)?``:n?.comment??``,status:this._nonTextFiles.includes(e)?``:n?.status??``},this._canEdit&&this._editors.set(e,t)}return{...t,dirty:this._isDirty(e,t)}}_editFile(e,t){!this._canEdit||this._blocked||(this._resetEditor(e),Object.assign(this._editors.get(e),t),this.requestUpdate())}_setFileStatus(e,t){if(!(this._blocked||this._nonTextFiles.includes(e)))return this._editFile(e,{status:t,...t?{}:{comment:``}}),this._saveFile(e)}_selectFile(e){this._blocked||!this._files.includes(e)||(this._path=e,this._resetEditor(e))}_openLine({path:e,line:t,query:n}){this._blocked||!this._files.includes(e)||(this._seek={path:e,line:t-1,query:n},this._selectFile(e))}_openPanel(e){this._panel=e}async _openReview(e,t=!1){if(this._blocked||this._loading)return;if(Z(e,this._context)){t?this._continue(e.id,e.revision):e.publishedAt===null?this._resume():this._showPublished(e);return}let n=this._key;this._unsaved&&!await this._saveAll()||n!==this._key||(Ii(e,t),await this._navigate(e.basePackage?aa(e.basePackage,e.baseVersion):`(empty)`))}_closePanel(){this._blocked||(this.querySelector(`dialog`)?.close(),this._panel=null)}_showPublished(e){this._selectedReview=e.id,this._panel=null,this._file=this._path}_resume(){this._selectedReview=null,this._panel=null,this._resetEditor(this._path)}async _discard(e){if(this._blocked||this._loading||!this._writable||e.user!==this.session.id||e.publishedAt!==null)return;let t=e===this._activeReview,n=this._key,r=this._controller.signal;this._saving=!0,this._error=null;try{let{confirmed:i}=await lt({reviewTitle:Q(e),signal:r});if(!i||r.aborted||n!==this._key||(await Promise.all(this._pendingSaves.map(e=>e.promise)),r.aborted||n!==this._key||!this._writable)||(e=t?this._activeReview:this._reviews.find(t=>t.id===e.id),!e||e.user!==this.session.id||e.publishedAt!==null))return;let a=e===this._continuation?.review;if(a||await xe(e.id,e.revision,this.session.csrfToken,r),r.aborted||n!==this._key)return;a||(this._reviews=this._reviews.filter(t=>t.id!==e.id)),Z(e,this._context)&&(this._continuation=null,this._selectedReview=null,this._editors.clear(),this._resetEditor(this._path),this._finalStatus=null,this._finalComment=``,this._panel=null,this._ownPublished.length===0&&T.npmReview?.bundle===this.entry.integrity&&delete T.npmReview.started),this._notice=`Draft discarded.`}catch(e){n===this._key&&e.name!==`AbortError`&&(this._error=e.message)}finally{n===this._key&&(this._saving=!1)}}_continue(e,t){let n=this._reviews.find(n=>n.id===e&&n.revision===t&&n.user===this.session?.id&&n.publishedAt!==null&&Z(n,this._context));return!n||this._activeReview||!this._reviewer?null:(this._continuation={source:n,review:{...n,publishedAt:null,revokedAt:null,status:null,teams:[]}},this._selectedTeams=new Set(this._teams.length===1?this._teams.map(e=>e.id):[]),this._selectedReview=null,this._panel=null,this._editors.clear(),this._resetEditor(this._path),this._notice=`A new draft will be saved when you make a change.`,this._activeReview)}async _persistContinuation(e){let t=this._continuation,n=this._key,{review:r}=await ge(this._asked(),{action:`continue`,reviewId:t.source.id,revision:t.source.revision},this.session.csrfToken,this._controller.signal);return n!==this._key||this._continuation!==t||e&&this._pendingSaves[0]!==e?null:(this._acceptSave(r,{revision:t.source.revision}),r)}_cancelSaves(){for(let e of this._pendingSaves)clearTimeout(e.timer),e.resolve(null);this._pendingSaves=[],this._saveBlocked=!1}_queueSave(e){let t=this._pendingSaves.findLast(t=>t.change.file===e.file);if(t&&t.change.comment===e.comment&&t.change.status===e.status)return t.promise;let n={change:e,slow:!1};return n.promise=new Promise(e=>{n.resolve=e}),n.timer=setTimeout(()=>{n.slow=!0,this._saveBlocked=!0},3e3),this._pendingSaves.push(n),this.requestUpdate(),this._pendingSaves.length===1&&this._flushSaves(),n.promise}_acceptSave(e,t){this._reviews=[...this._reviews.filter(t=>t.id!==e.id),e],this._continuation=null;for(let[n,r]of this._editors)r.revision===t.revision&&(r.revision=e.revision,r.edit=e.entries.find(e=>e.file===n&&e.status)??null);for(let{change:n}of this._pendingSaves.slice(1))n.revision===t.revision&&(n.revision=e.revision,n.reviewId=e.id,n.entryId=e.entries.find(e=>e.file===n.file)?.id??null);this._canEdit&&this._resetEditor(this._file),this._notice=`Saved privately.`,this._rememberBase()}async _flushSaves(){for(;this._pendingSaves.length>0;){let e=this._pendingSaves[0];this._error=null;try{if(this._continuation){let t=await this._persistContinuation(e);if(!t||this._pendingSaves[0]!==e)return;Object.assign(e.change,{reviewId:t.id,revision:t.revision,entryId:t.entries.find(t=>t.file===e.change.file)?.id??null})}let{review:t}=await ge(this._asked(),e.change,this.session.csrfToken,this._controller.signal);if(this._pendingSaves[0]!==e)return;this._acceptSave(t,e.change),clearTimeout(e.timer),this._pendingSaves.shift(),e.resolve(t),this._saveBlocked=this._pendingSaves.some(e=>e.slow),this.requestUpdate()}catch(t){if(this._pendingSaves[0]!==e)return;this._cancelSaves(),t.name!==`AbortError`&&(this._error=t.message),this.requestUpdate();return}}}async _change(e){if(this._blocked||this._pendingSaves.length>0||this._loading||!this._writable)return null;if(e.action===`continue`)return this._continue(e.reviewId,e.revision);let t=this._key;this._saving=!0,this._error=null;try{if(e.action===`publish`&&e.finalStatus&&this._continuation){let t=await this._persistContinuation();if(!t)return null;e={...e,reviewId:t.id,revision:t.revision}}let n=this._reviews.find(t=>t.id===e.reviewId)??this._context,{review:r}=await ge(this._asked(n),e,this.session.csrfToken,this._controller.signal);return t===this._key?(this._reviews=[...this._reviews.filter(e=>e.id!==r.id),r],e.action===`publish`&&e.finalStatus&&Z(r,this._context)&&(this._selectedReview=r.id,this._panel=null,this._editors.clear(),this._notice=`Published. Verdicts and notes are now frozen.`),this._rememberBase(),r):null}catch(e){return t===this._key&&e.name!==`AbortError`&&(this._error=e.message),null}finally{t===this._key&&(this._saving=!1)}}_saveFile(e){if(!this._canEdit||this._saving||this._loading)return null;let t=this._editorState(e),n=this._pendingSaves.some(t=>t.change.file===e),r=this._activeReview;return!t.dirty&&!n?r:!t.status&&!t.comment.trim()&&!t.edit?.id&&!n?(this._editors.delete(e),e===this._file&&this._resetEditor(e),r):this._queueSave({action:`save`,reviewId:r?.id??null,revision:t.revision,entryId:t.edit?.id??null,file:e,comment:t.comment,status:this._nonTextFiles.includes(e)?null:t.status||null})}async _saveAll(){let e=this._key;for(;e===this._key&&this._canEdit;){if(this._pendingSaves.length>0){if((await Promise.all(this._pendingSaves.map(e=>e.promise))).some(e=>!e))return!1;continue}let e=this._dirtyFiles;if(e.length===0)return!0;if(!await this._saveFile(e[0]))return!1}return!1}async _beginPublish(){if(!this._canEdit||this._saving||this._loading||this._finalizing||!this._summary.checkedFiles)return;let e=this._key;this._finalizing=!0;try{if(this._unsaved&&!await this._saveAll()||e!==this._key||!this._canEdit||this._unsaved||!this._summary.checkedFiles)return;let t=this._activeReview;if(!t)return;let n=this._allowedVerdicts,r=this._continuation?.source.status;this._finalStatus=n.includes(r)?r:n[0],this._finalComment=t.comment??``,this._publishRevision=t.revision,this._panel=`publish`}finally{this._finalizing=!1}}_publish(){if(this._canPublish)return this._change({action:`publish`,reviewId:this._activeReview.id,revision:this._publishRevision,teamIds:[...this._selectedTeams],finalStatus:this._finalStatus,finalComment:this._finalComment})}render(){if(!this.entry?.npm||!this.details)return P;let e=this.request?.bundle===this.entry.integrity?this.request:{};return this._target=e.reviewPackage?aa(e.reviewPackage,e.reviewSpec):`(empty)`,JSON.stringify(e.patch??null)!==JSON.stringify(this._patch)&&(this._patch=e.patch??null),this._loadBase(this._target,e.resume),ta(this)}};customElements.define(`npm-review`,oa);var sa=e=>({view:`npm`,packageName:e.package,packageSpec:e.version,bundleTab:`review`,...e.basePackage===null?{}:{reviewPackage:e.basePackage,reviewSpec:e.baseVersion},...e.patchHash&&e.patchSource?{patch:{hash:e.patchHash,...e.patchSource}}:{}}),ca=e=>{let t=new Date(e);return N`<time datetime="${t.toISOString()}" data-tooltip="${t.toLocaleString()}">${t.toLocaleDateString(void 0,{month:`short`,day:`numeric`,...t.getFullYear()===new Date().getFullYear()?{}:{year:`numeric`}})} <span>${t.toLocaleTimeString(void 0,{hour:`2-digit`,minute:`2-digit`})}</span></time>`},la=class extends xt{static properties={session:{attribute:!1},team:{attribute:!1},_reviews:{state:!0},_loading:{state:!0},_error:{state:!0},_next:{state:!0},_discarding:{state:!0},_expanded:{state:!0}};constructor(){super(),this._reviews=[],this._next=null,this._expanded=new Set,this._controller=new AbortController}createRenderRoot(){return this}disconnectedCallback(){super.disconnectedCallback(),this._controller.abort(),this._dismissLoading?.(),this._key=null}_canDiscard(e){return e.publishedAt===null&&e.user===this.session?.id&&[`triage`,`manage`,`admin`].includes(this.session?.role)}async _discard(e){if(!this._canDiscard(e)||this._discarding||this._loading)return;let t=this._key,n=this._controller.signal;this._discarding=e.id,this._error=null;try{let{confirmed:r}=await lt({reviewTitle:Q(e),signal:n});if(!r||n.aborted||t!==this._key||!this._canDiscard(e)||(await xe(e.id,e.revision,this.session.csrfToken,n),t!==this._key||n.aborted))return;this._reviews=this._reviews.filter(t=>t.id!==e.id)}catch(e){t===this._key&&e.name!==`AbortError`&&(this._error=e.message)}finally{t===this._key&&(this._discarding=null)}}async _load(e=!1){let t=this._key;this._dismissLoading?.();let n=this._dismissLoading=je(`Loading reviews…`,{duration:0});this._loading=!0,this._error=null;try{let n=e?this._next:null,{reviews:r,next:i}=await(this.team?c(this.team,n,this._controller.signal):ve(n,this._controller.signal));if(t!==this._key)return;this._reviews=[...new Map([...e?this._reviews:[],...r].map(e=>[e.id,e])).values()],this._next=i}catch(e){t===this._key&&e.name!==`AbortError`&&(this._error=e.message)}finally{n(),t===this._key&&(this._loading=!1)}}_toggleDetails(e){let t=new Set(this._expanded);t.has(e)?t.delete(e):t.add(e),this._expanded=t}_details(e){let t=e.entries.filter(e=>e.status);return N`<section id="${`review-details-${e.id}`}" class="dependency-review-details" aria-label="${`Details for ${Q(e)}`}">${e.comment?N`<div class="dependency-review-final-note" role="note" aria-label="Final note">${Fi(e.comment)}</div>`:P} ${t.length>0?N`<ul class="dependency-review-entries">${t.map(e=>N`<li><span class="dependency-review-entry-file">${ot(e.file)}<span>${e.file}</span></span> ${ki(e.status)}<div>${Fi(e.comment)}</div></li>`)}</ul>`:N`<p class="npm-review-muted">No file reviews yet.</p>`}</section>`}_row(e){let t=sa(e),n=this._expanded.has(e.id),r=e.publishedAt!==null,i=new Set(e.entries.filter(e=>e.status).map(e=>e.file)).size,a=e.entries.filter(e=>e.status&&e.comment.trim()).length+ +!!e.comment.trim(),o=n=>{n.button===0&&!n.metaKey&&!n.ctrlKey&&!n.shiftKey&&!n.altKey&&Fe?.active&&(n.preventDefault(),Ii(e),Fe.navigate(t))};return N`<li class="${`dependency-review-row${n?` is-expanded`:``}${e.revokedAt===null?``:` is-revoked`}`}"><div class="dependency-review-row-main"><button type="button" class="dependency-review-expand" aria-expanded="${n}" aria-controls="${`review-details-${e.id}`}" aria-label="${`${n?`Hide`:`Show`} details for ${Q(e)}`}" @click="${()=>this._toggleDetails(e.id)}">${w}</button><div class="dependency-review-identity"><a class="dependency-review-title" href="${_t(t)}" @click="${o}">${e.basePackage!==null&&e.basePackage!==e.package?N`<span>${e.basePackage} ${e.baseVersion} →</span>`:P} <strong>${e.package}</strong> <span>${e.basePackage===e.package?`${e.baseVersion} \u2192 `:``}${e.version}${e.patchHash?N`<span class="dependency-review-patched">patched</span>`:P}</span></a><div class="dependency-review-meta">${ca(e.publishedAt??e.time)} ${this.team?N`<span class="dependency-review-author">${ji(e)}</span>`:P} ${r&&e.teams.length>0?N`<span class="dependency-review-teams">${e.teams.map(e=>e.name).join(`, `)}</span>`:P} ${r&&a>0?N`<span class="dependency-review-note-count">${a} ${a===1?`note`:`notes`}</span>`:P} ${e.revokedAt===null?P:Ai(e)}</div></div><div class="dependency-review-result">${r?ki(e.status):N`<span class="dependency-review-checked">${i} ${i===1?`file`:`files`} checked</span>`} <span class="dependency-review-coverage">${r?N`${e.coverage===`full`?`Full`:N`<span class="dependency-review-partial">Partial</span>`} · ${e.checkedFiles}/${e.totalFiles} files checked`:a?`${a} ${a===1?`note`:`notes`}`:`No notes`}</span></div><div class="dependency-review-row-actions">${this.team?P:N`<dependency-review-copy .text="${e.formatted}"></dependency-review-copy>`} ${this._canDiscard(e)?N`<button type="button" class="dependency-review-discard" aria-label="Discard review" ?disabled="${this._loading||!!this._discarding}" @click="${()=>this._discard(e)}">${bt(yt)}</button>`:P} <a class="dependency-review-open" href="${_t(t)}" @click="${o}" aria-label="${`${r?`Open`:`Continue`} review for ${Q(e)}`}"><span aria-hidden="true">→</span></a></div></div>${n?this._details(e):P}</li>`}render(){let e=JSON.stringify([this.session?.id,this.session?.role,this.team??null]);return e!==this._key&&(this._controller.abort(),this._controller=new AbortController,this._key=e,this._reviews=[],this._next=null,this._discarding=null,this._expanded=new Set,this._load()),this.team?N`<section class="dependency-review-list is-team">${this._error?N`<p role="alert">${this._error}</p>`:P} ${!this._loading&&!this._error&&this._reviews.length===0?N`<p class="npm-review-muted">No reviews are published to this team yet.</p>`:P}<ol>${this._reviews.map(e=>this._row(e))}</ol>${this._next?N`<button type="button" class="npm-review-button" ?disabled="${this._loading}" @click="${()=>this._load(!0)}">Load more</button>`:P}</section>`:N`<section class="dependency-review-list"><header><h1>My reviews</h1></header><p>Your private work and the reviews you’ve shared with teams.</p>${this._error?N`<p role="alert">${this._error}</p>`:P} ${!this._loading&&!this._error&&this._reviews.length===0?N`<p>No reviews yet. Open a package’s Review tab to begin.</p>`:P} ${[[`Drafts`,!1],[`Published reviews`,!0]].map(([e,t])=>{let n=this._reviews.filter(e=>e.publishedAt!==null===t);return N`<section class="dependency-review-section"><h2>${e}<span class="npm-review-count">${n.length}</span></h2><ol>${n.map(e=>this._row(e))}</ol>${n.length===0&&!this._loading?N`<p class="npm-review-muted">${t?`No published reviews yet.`:`No drafts.`}</p>`:P}</section>`})} ${this._next?N`<button type="button" class="npm-review-button" ?disabled="${this._loading||!!this._discarding}" @click="${()=>this._load(!0)}">Load more</button>`:P}</section>`}};customElements.define(`dependency-review-list`,la);
|
|
26
|
+
@compare-code-select=${e=>{e.stopPropagation(),c(e.detail.path)}}></${f}>`}var xi=400,Si=24,Ci=[`removed`,`added`,`changed`],J=null;function Y(e){return e.join(`, `)}var wi=class extends xt{static properties={details:{attribute:!1},integrity:{attribute:!1},request:{attribute:!1},source:{attribute:!1},review:{attribute:!1},_targetIntegrity:{state:!0},_otherDetails:{state:!0},_status:{state:!0},_scope:{state:!0},_fileSort:{state:!0},_pkgSort:{state:!0},_openSections:{state:!0},_mode:{state:!0},_codePath:{state:!0},_codeSeek:{state:!0}};createRenderRoot(){return this}constructor(){super(),this.details=null,this.integrity=null,this.request=null,this.source=null,this._targetIntegrity=null,this._otherDetails=null,this._status=`idle`,this._scope=``,this._fileSort={removed:`name`,added:`name`,changed:`name`},this._pkgSort={removed:`size`,added:`size`,changed:`size`},this._openSections=new Set,this._mode=`overview`,this._codePath=null,this._codeSeek=null,this._repaint=()=>this.requestUpdate(),this._fitBody=null,this._fitObserver=null}connectedCallback(){super.connectedCallback(),this._fitBody&&this._fitObserver?.observe(this._fitBody)}disconnectedCallback(){super.disconnectedCallback(),this._fitObserver?.disconnect()}willUpdate(e){e.has(`source`)&&this.source&&!e.get(`source`)&&(this._openSections=new Set([...this._openSections,`files`])),(e.has(`_otherDetails`)||e.has(`details`))&&this._status===`ready`&&!o(this.details,this._otherDetails).some(e=>e.id===this._scope)&&(this._scope=``),e.has(`integrity`)&&this._rebase(),(e.has(`request`)||e.has(`integrity`))&&this.integrity&&this.request?.bundle===this.integrity?(this.request.target!==this._targetIntegrity&&this._choose(this.request.target),this._mode=gt(this.request.mode)):e.has(`request`)&&!e.has(`integrity`)&&e.get(`request`)?.bundle===this.integrity&&(this._targetIntegrity&&this._choose(null),this._mode=`overview`)}updated(){let e=this.querySelector(`.bundle-compare-body`);e!==this._fitBody&&typeof ResizeObserver==`function`&&(this._fitObserver??=new ResizeObserver(()=>this._fitLists()),this._fitObserver.disconnect(),e&&this._fitObserver.observe(e),this._fitBody=e),this._fitLists()}_fitLists(){let e=this._fitBody;if(!e)return;let t=getComputedStyle(e),n=e.getBoundingClientRect().top+e.clientTop+parseFloat(t.paddingTop)-e.scrollTop,r=e=>{let t=e.getBoundingClientRect();return t.top-n+e.parentElement.getBoundingClientRect().bottom-t.bottom},i=e.querySelector(`.bundle-compare-rows--fill`);if(i){let t=r(i),n=i.closest(`.bundle-compare-section`);for(let e=n;e;e=e.nextElementSibling){let r=e.matches(`details[open]`)&&e.querySelector(`:scope > summary`),i=e===n?0:r?r.getBoundingClientRect().bottom+parseFloat(getComputedStyle(r).marginBottom)-e.getBoundingClientRect().top:e.getBoundingClientRect().height;t+=i+parseFloat(getComputedStyle(e).marginBottom)}e.style.setProperty(`--compare-fill-around`,`${t}px`)}let a=[...e.querySelectorAll(`.bundle-compare-rows--scroll:not(.bundle-compare-rows--fill)`)];if(a.length===0)return;let o=e.lastElementChild,s=new Map(a.filter(e=>o.contains(e)).map(e=>[e,e.parentElement.getBoundingClientRect().top])),c=Math.max(...s.values()),l=e.clientHeight-parseFloat(t.paddingTop)-parseFloat(t.paddingBottom),u=parseFloat(getComputedStyle(o).marginBottom);for(let e of a)s.get(e)>=c-1?e.style.setProperty(`--compare-rest`,`${l-r(e)-u}px`):e.style.removeProperty(`--compare-rest`)}_rebase(){let e=this._baseKey;if(J&&e&&e!==J.base&&(J=null),J&&e===J.base){let{target:e}=J;if(this._scope=J.scope,this._mode=J.mode,this._codePath=J.codePath,J=null,!e){this._targetIntegrity=null,this._otherDetails=null,this._status=`idle`;return}this._targetIntegrity=e;let t=this.source?null:Ke(e,e=>!!(e.json||e.bundle));t?(this._otherDetails=t,this._status=`ready`):(this._otherDetails=null,this._status=`loading`,this._loadOther(e));return}this._targetIntegrity=null,this._otherDetails=null,this._status=`idle`,this._scope=``,this._codePath=null}get _baseKey(){return this.source?this.source.base:this.integrity}_swap(){let e=this._targetIntegrity;e&&e!==this._baseKey&&this._reopen(e,this._baseKey)}_pickBase(e){!e||e===this._baseKey||(e===this._targetIntegrity?this._swap():this._reopen(e,this._targetIntegrity))}_reopen(e,t){if(this.source){J={base:e,target:t,scope:this._scope,mode:this._mode,codePath:this._codePath},this.source.open(e,t,this._mode);return}if(!_e(T.bundles??[],this.integrity).some(t=>t.integrity===e))return;J={base:e,target:t,scope:this._scope,mode:this._mode,codePath:this._codePath};let n=[this._otherDetails,this._baseReady?this.details:null].filter(n=>n&&!n.error&&(n.json||n.bundle)&&[e,t].includes(n.integrity));this.dispatchEvent(new CustomEvent(`bundle-swap`,{bubbles:!0,composed:!0,detail:{integrity:e,target:t,bundles:n,mode:this._mode}}))}_nameFor(e){return this.source?this.source.name(e):(T.bundles??[]).find(t=>t.integrity===e)?.name??`${e.slice(0,15)}\u2026`}_pick(e){this._choose(e),this._notify()}_notify(){this.dispatchEvent(new CustomEvent(`bundle-compare-change`,{bubbles:!0,composed:!0,detail:{base:this.integrity,target:this._targetIntegrity,mode:this._mode}}))}_choose(e){let t=e||null;if(this._targetIntegrity=t,this._otherDetails=null,this._codePath=null,!t){this._status=`idle`,this._scope=``;return}this._status=`loading`,this._loadOther(t)}async _loadOther(e){if(this.source){let t;try{t=await this.source.load(e)}catch(e){if(e.name===`AbortError`)return;t={error:e.message}}if(this._targetIntegrity!==e)return;this._otherDetails=t,this._status=`ready`,t?.compareId&&t.compareId!==e&&(this._targetIntegrity=t.compareId,this._notify());return}let t=_e(T.bundles??[],this.integrity).find(t=>t.integrity===e);if(!t){this._status=`idle`,this._targetIntegrity=null,this._notify();return}let n;try{n=await Ye(e,t)}catch(e){if(e.name===`AbortError`)return;throw e}this._targetIntegrity===e&&(this._otherDetails=n,this._status=`ready`)}get _baseReady(){return!!(this.details&&this.details.integrity===this.integrity&&(this.details.json||this.details.bundle))}_openFile(e){this._codePath=e,this._mode=`code`,this._notify()}_openLine({path:e,line:t,query:n}){this._codeSeek={path:e,line:t-1,query:n},this._openFile(e)}_fileRow(e,t,n,r=e,i=!1,a=void 0,o=e,s=void 0){let c=this.source?.files;return N`<li><button type="button" class="bundle-compare-row bundle-compare-row-link" @click="${()=>this._openFile(e)}">${c?c.icon(e,[[this._otherDetails,o],[this.details,e]]):P}<span class="bundle-compare-row-path mono" data-tooltip-truncated data-tooltip="${r}">${t}</span>${i?c?.tag?.(this.details,e,s)??P:P}${dr(a)}${n}</button></li>`}_group(e,t,n,r,i,a=P,{fill:o=!1,lanes:s=Ci,style:c={}}={}){return t.length===0?P:N`<section class="${`bundle-compare-group bundle-compare-${n}`}" style="${j({"--compare-lane":String(s.indexOf(n)+1),...c})}"><header class="bundle-compare-group-head"><span class="bundle-compare-dot" aria-hidden="true"></span> <span class="bundle-compare-group-title" data-tooltip-truncated data-tooltip="${e}">${e}</span> <span class="bundle-compare-group-count">${t.length}</span> ${a}</header><ul class="${o?`bundle-compare-rows bundle-compare-rows--scroll bundle-compare-rows--fill`:`bundle-compare-rows bundle-compare-rows--scroll`}">${M(t,r,i)}</ul></section>`}_sizeCells(e){let t=e=>e==null?`—`:k(e),n=e=>`${e.toLocaleString()} LoC`;return e.delta===void 0?N`<span class="bundle-compare-row-size" data-tooltip="${e.lines>0?n(e.lines):P}">${t(e.bytes)}</span>`:N`<span class="${`bundle-compare-row-delta ${e.delta===null?``:Tt(e.delta)}`}" data-tooltip="${`${t(e.baseBytes)} \u2192 ${t(e.otherBytes)}${e.baseLines>0||e.otherLines>0?` \xB7 ${e.baseLines.toLocaleString()} \u2192 ${n(e.otherLines)}`:``}`}">${e.delta===null?`—`:wt(e.delta)}</span>`}_sortActions(e,t,n,r=!1,i=this[e][t]){return N`<span class="bundles-overview-sort" role="group" aria-label="${`${t} ${n} order`}">${[[`name`,`Name`],[`size`,`Size`],...r?[[`flags`,`Flags`]]:[]].map(([n,r])=>N`<button type="button" aria-pressed="${String(i===n)}" @click="${()=>{this[e]={...this[e],[t]:n}}}">${r}</button>`)}</span>`}_fileGroup(e,t,n,r,i){let a=this.source?.files,o=n!==`removed`,s=e=>n===`added`?null:{details:this._otherDetails,path:e.basePath??e.path},c=e=>[...o&&a?.flags?a.flags(this.details,e.path,s(e)):[],...fr(e.meta)],l=t.some(e=>c(e).length>0),u=this._fileSort[n]===`flags`&&!l?`name`:this._fileSort[n],d=e=>n===`changed`?Math.abs(e.delta):e.bytes,f=u===`flags`?Oe(t,c,e=>e.path):t.toSorted((e,t)=>(u===`size`?d(t)-d(e):0)||e.path.localeCompare(t.path));return this._group(e,f,n,e=>e.path,e=>e.renamedFrom==null?this._fileRow(e.path,r(e.path),this._sizeCells(e),e.path,o,e.meta,e.basePath??e.path,s(e)):this._fileRow(e.path,Xt(r(e.renamedFrom),r(e.path)),this._sizeCells(e),`${e.renamedFrom} \u2192 ${e.path}`,o,e.meta,e.basePath??e.path,s(e)),this._sortActions(`_fileSort`,n,`file`,l,u),{lanes:i})}_pkgGroup(e,t,n,r){let i=this._pkgSort[n],a=e=>{let t=n===`changed`?e.delta:e.bytes;return t==null?-1:Math.abs(t)},o=t.toSorted((e,t)=>(i===`size`?a(t)-a(e):0)||ht(e.pkg).localeCompare(ht(t.pkg))),s=n===`changed`?0:Math.min(Si,Math.max(0,...t.map(e=>Y(e.versions).length)));return this._group(e,o,n,e=>e.pkg,e=>N`<li><div class="bundle-compare-row"><span class="bundle-compare-pkg-dot" style="${j({background:mt(e.pkg)})}"></span> <span class="bundle-compare-row-path" data-tooltip-truncated data-tooltip="${ht(e.pkg)}">${ht(e.pkg)}</span> ${n===`changed`?this._versionCell(e):s>0?N`<span class="bundle-compare-dep-ver" data-tooltip-truncated data-tooltip="${Y(e.versions)}">${Y(e.versions)}</span>`:P} ${this._sizeCells(n===`changed`?e:{bytes:e.bytes})}</div></li>`,this._sortActions(`_pkgSort`,n,`package`),{fill:!0,lanes:r,style:s>0?{"--compare-version-width":`${s}ch`}:{}})}_versionCell(e){let t=e.otherVersions,n=e.baseVersions;if(n.join()===t.join())return n.length>0?N`<span class="bundle-compare-dep-ver">${Y(n)}</span>`:P;let r=e.direction??`changed`,i=r===`up`?`↑`:r===`down`?`↓`:`±`;return N`<span class="bundle-compare-ver" aria-label="${`${r===`up`?`Upgraded`:r===`down`?`Downgraded`:`Changed`}: ${Y(n)||`none`} to ${Y(t)||`none`}`}"><span class="bundle-compare-ver-from">${Y(n)||`—`}</span> <span class="bundle-compare-ver-arrow" aria-hidden="true">→</span> <span class="${`bundle-compare-ver-to ${r}`}">${Y(t)||`—`}</span> <span class="${`bundle-compare-ver-dir ${r}`}" aria-hidden="true">${i}</span></span>`}_depGroup(e,t,n,r){let i=n===`changed`?0:Math.min(Si,Math.max(0,...t.map(e=>e.range.length))),a=e=>N`<span class="bundle-compare-row-path" data-tooltip-truncated data-tooltip="${e.name}">${e.name}</span> ${this.source?.dependencyTags?.(e,n)??P}${e.kind?N`<span class="npm-dependency-kind">${e.kind}</span>`:P} ${n===`changed`?N`<span class="bundle-compare-ver" aria-label="${`Changed: ${e.from} to ${e.to}`}"><span class="bundle-compare-ver-from">${e.from}</span> <span class="bundle-compare-ver-arrow" aria-hidden="true">→</span> <span class="bundle-compare-ver-to changed">${e.to}</span></span>`:N`<span class="bundle-compare-dep-ver" data-tooltip-truncated data-tooltip="${e.range}">${e.range}</span>`}`,o=this.source?.openDependency;return this._group(e,t,n,e=>e.key,e=>N`<li>${o&&e.opens?N`<button type="button" class="bundle-compare-row bundle-compare-row-link" @click="${()=>o(e)}">${a(e)}</button>`:N`<div class="bundle-compare-row">${a(e)}</div>`}</li>`,P,{fill:!0,lanes:r,style:i>0?{"--compare-version-width":`${i}ch`}:{}})}_renderDependencies(e,t,n,r){return r.length===0?P:N`<section class="bundle-compare-section"><h3 class="bundle-compare-section-head">Dependencies</h3>${this._cols(r,N`${this._depGroup(`Removed \xB7 only in ${t}`,e.removed,`removed`,r)} ${this._depGroup(`Added \xB7 only in ${n}`,e.added,`added`,r)} ${this._depGroup(`Changed`,e.changed,`changed`,r)}`,`dependencies`)}</section>`}_renderPackages(e,t,n,r=Ci){return e.removed.length===0&&e.added.length===0&&e.changed.length===0?P:N`<section class="bundle-compare-section"><h3 class="bundle-compare-section-head">Packages</h3>${this._cols(r,N`${this._pkgGroup(`Removed \xB7 only in ${t}`,e.removed,`removed`,r)} ${this._pkgGroup(`Added \xB7 only in ${n}`,e.added,`added`,r)} ${this._pkgGroup(`Changed`,e.changed,`changed`,r)}`,`packages`)}</section>`}_cols(e,t,n){let r=e.map(e=>e===`changed`?`minmax(0, 5fr)`:`minmax(0, 4fr)`).join(` `);return N`<div class="bundle-compare-cols" data-lanes="${e.length}" data-section="${n}" style="${j({"--compare-lanes":r})}">${t}</div>`}_collapsible(e,t,n,r,i=``){let a=this._openSections.has(e);return N`<details class="bundle-compare-section bundle-compare-collapsible" .open="${E(a)}" @toggle="${t=>this._setSection(e,t.currentTarget.open)}"><summary class="bundle-compare-section-head" @click="${t=>{t.preventDefault(),this._setSection(e,!a)}}">${t} <span class="bundle-compare-section-count">${n.toLocaleString()}</span>${i?N`<span class="bundle-compare-section-note" data-tooltip-truncated data-tooltip="${i}">${i}</span>`:P}</summary>${a?r():P}</details>`}_setSection(e,t){if(t===this._openSections.has(e))return;let n=new Set(this._openSections);t?n.add(e):n.delete(e),this._openSections=n}_renderResolutions(e){if(e.totalChanges===0)return P;let t=e.changed,n=t.slice(0,xi),r=t.length-n.length,i=(e,t=``)=>N`<td class="${t}"><code data-tooltip-truncated data-tooltip="${e}">${e}</code></td>`,a=e=>`${e.conditions}${e.platform===null?``:` \xB7 Platform: ${e.platform}`}`,o=n.some(e=>a(e)!==`*`);return this._collapsible(`resolutions`,`Import resolutions`,t.length,()=>N`<section class="bundle-compare-group bundle-compare-changed bundle-compare-resolutions"><header class="bundle-compare-group-head"><span class="bundle-compare-dot" aria-hidden="true"></span> <span class="bundle-compare-group-title">Repointed</span> <span class="bundle-compare-group-count">${t.length}</span></header><table class="${o?``:`bundle-compare-resolutions--no-context`}"><thead><tr><th>File</th><th>Import</th><th>Before</th><th>After</th>${o?N`<th>Conditions</th>`:P}</tr></thead><tbody>${M(n,e=>e.key,e=>{let t=a(e);return N`<tr><td><button type="button" class="bundle-compare-resolution-parent" data-tooltip-truncated data-tooltip="${e.parent}" @click="${()=>this._openFile(e.parent)}">${e.parent}</button></td>${i(e.specifier)} ${i(e.baseTarget||`(empty target)`,`bundle-compare-resolution-before`)} ${i(e.otherTarget||`(empty target)`,`bundle-compare-resolution-after`)} ${o?N`<td class="bundle-compare-resolution-context"><span data-tooltip-truncated data-tooltip="${t}">${t}</span></td>`:P}</tr>`})}</tbody></table>${r>0?N`<div class="bundle-compare-more">and ${r.toLocaleString()} more…</div>`:P}</section>`)}_comparison(){return Jt(this._otherDetails,this.details,this._scope,this._repaint)}_renderSummary(e){return jt(e,N`<div class="bundle-compare-modes" role="tablist" aria-label="Comparison view">${[[`overview`,`Overview`],[`code`,`Code`]].map(([e,t])=>N`<button type="button" role="tab" aria-selected="${String(this._mode===e)}" @click="${()=>{this._mode=e,this._notify()}}">${t}</button>`)}</div>`)}_renderPicker(e,t,n,r){return At({source:this.source,from:{options:e,value:this._targetIntegrity,pick:e=>this._pick(e)},to:{options:this._baseOptions(),value:this._baseKey,placeholder:this._nameFor(this.integrity),pick:e=>this._pickBase(e)},clear:t?{run:()=>this._pick(null)}:null,swap:t&&this.source?.canSwap?.(this._targetIntegrity)!==!1?()=>this._swap():null,extras:n,comparison:r,openLine:e=>this._openLine(e)})}_baseOptions(){if(this.source)return F(this.source.choices??[]);let e=(T.bundles??[]).find(e=>e.integrity===this.integrity),t=_e(T.bundles??[],this.integrity);return this._bundleOptions(e?[e,...t]:t)}_otherOptions(){return this.source?F(this.source.options):this._bundleOptions(_e(T.bundles??[],this.integrity))}_bundleOptions(e){let t=new Map;for(let n of e)t.set(n.name,(t.get(n.name)??0)+1);return e.map(e=>({id:e.integrity,integrity:e.integrity,kind:e.kind??(e.name.toLowerCase().endsWith(`.map`)?`sourcemap`:`stasis`),summary:e.summary,size:typeof e.size==`number`?k(e.size):`—`,filename:t.get(e.name)>1?`${e.name} \xB7 ${e.integrity.slice(7,13)}\u2026`:e.name}))}render(){let e=this._otherOptions(),t=!!this._targetIntegrity&&(!!this.source||e.some(e=>e.integrity===this._targetIntegrity)),n=this._baseReady?o(this.details,t?this._otherDetails:null):[],r=n.length>0?N`<bundle-scope-selector .reasons="${n}" .value="${this._scope}" label="Compare scope" @scope-change="${e=>{this._scope=e.detail.value}}"></bundle-scope-selector>`:P,i=this.source?.noun??`bundle`,a=t&&this._status===`ready`&&this._otherDetails&&(this._otherDetails.json||this._otherDetails.bundle)&&!this._otherDetails.error,s=this._baseReady&&a?this._comparison():null,c=s?.status===`ready`?s.diff:null,l=c?{base:this._otherDetails,other:this.details,files:c.files}:null,u=e.length>0||this.source?this._renderPicker(e,t,r,l):r,d=c?this._mode:`overview`,f;return this._baseReady?this.source&&!t&&(this.source.pending||this.source.error||!this.source.select&&e.length===0)?f=N`<div class="${`bundle-compare-empty${this.source.error?` is-error`:``}`}">${this.source.pending?`Loading ${i}s\u2026`:this.source.error??N`No other ${i}s to compare <strong>${this._nameFor(this.integrity)}</strong> with.`}</div>`:e.length===0&&!this.source?f=N`<div class="bundle-compare-empty">No other bundles to compare with. Drop a second <code>.map</code> or <code>.stasis.code.br</code> bundle to diff against this one.</div>`:t?this._status===`loading`||!this._otherDetails?f=N`<div class="bundle-compare-empty">Comparing…</div>`:this._otherDetails.error?f=N`<div class="bundle-compare-empty is-error">Couldn't read the selected ${i}: ${this._otherDetails.error}</div>`:!this._otherDetails.json&&!this._otherDetails.bundle?f=N`<div class="bundle-compare-empty is-error">The selected ${i} couldn't be parsed.</div>`:s?.status===`error`?f=N`<div class="bundle-compare-empty is-error">Couldn't compare the ${i}s: ${s.message}</div>`:c?d!==`code`&&(f=this._renderDiff(c)):f=N`<div class="bundle-compare-empty">Comparing…</div>`:f=N`<div class="bundle-compare-empty">Pick a ${i} above to compare <strong>${this._nameFor(this.integrity)}</strong> against.</div>`:f=N`<div class="bundle-compare-empty">Loading bundle…</div>`,N`<div class="bundle-compare">${Mt(u,c?this._renderSummary(c):P)} ${d===`code`?bi({base:this._otherDetails,other:this.details,diff:c,source:this.source,path:this._codePath,seek:this._codeSeek,baseName:this._nameFor(this._targetIntegrity),otherName:this._nameFor(this.integrity),select:e=>{this._codePath=e}}):N`<div class="bundle-compare-body">${f}</div>`}</div>`}_renderDiff(e){let t=this._nameFor(this._targetIntegrity),n=this._nameFor(this.integrity),r=[...e.files.onlyBase.map(e=>e.path),...e.files.onlyOther.map(e=>e.path),...e.files.changed.flatMap(e=>e.renamedFrom==null?[e.path]:[e.path,e.renamedFrom])],i=a(e.files.root,pt(r).prefix),{prefix:o}=i,s=e=>o&&e.startsWith(o)?e.slice(o.length):e,c=e.files.onlyBase.length+e.files.onlyOther.length+e.files.changed.length,l={removed:e.files.onlyBase,added:e.files.onlyOther,changed:e.files.changed},u=!e.totals.identical,d=this.source?.dependencies?.(this._otherDetails,this.details)??null,f=Ci.filter(t=>(d??e.packageRows)[t].length>0),p=u?Ci.filter(e=>l[e].length>0):[],m=p.every(e=>f.includes(e))?f:p,h=u?this.source?.files?.warning?.(this.details,[...l.added,...l.changed].map(e=>e.path)):P;return N`${d?this._renderDependencies(d,t,n,f):this._renderPackages(e.packageRows,t,n,f)} ${h??P} ${e.totals.identical?e.resolutions.totalChanges>0?N`<div class="bundle-compare-caption">File contents are unchanged; import resolutions differ.</div>`:N`<div class="bundle-compare-identical">These two ${this.source?.noun??`bundle`}s carry identical files (${e.totals.unchangedFiles.toLocaleString()} ${e.totals.unchangedFiles===1?`file`:`files`})${i.from?N`, moved <span class="mono">${Zt(i)}</span>`:``}.</div>`:this._collapsible(`files`,`Files`,c,()=>this._cols(m,N`${this._fileGroup(`Removed \xB7 only in ${t}`,l.removed,`removed`,s,m)} ${this._fileGroup(`Added \xB7 only in ${n}`,l.added,`added`,s,m)} ${this._fileGroup(`Changed`,l.changed,`changed`,s,m)}`,`files`),i.from?`${i.from} \u2192 ${i.to}`:o)} ${this._renderResolutions(e.resolutions)}`}};customElements.define(`bundle-compare`,wi);var Ti={...ve,"accept-with-nits":`Accept with nits`},Ei=e=>e.revokedAt===null?e.publishedAt===null?`Draft`:`Published`:`Revoked`,Di={accept:`✓`,"accept-with-nits":`·`,"request-changes":`!`,reject:`×`},Oi=e=>N`<span class="${`npm-review-verdict-icon ${e??`unchecked`}`}" aria-hidden="true">${Di[e]??``}</span>`,ki=e=>N`<span class="npm-review-verdict">${Oi(e)}${Ti[e]??`Not reviewed`}</span>`,Ai=e=>N`<span class="${`npm-review-badge ${e.revokedAt===null?e.publishedAt===null?``:`published`:`revoked`}`}">${Ei(e)}</span>`,ji=e=>e.user?Xe({id:e.user,login:e.userLogin,name:e.userName?.trim()||null}):e.userLogin,Mi=e=>N`<time datetime="${new Date(e).toISOString()}">${new Date(e).toLocaleString()}</time>`,Ni=(e,t)=>N`<div class="npm-review-progress" role="progressbar" aria-label="Files checked" aria-valuemin="0" aria-valuemax="${t||1}" aria-valuenow="${e}"><span style="${j({width:`${t?e/t*100:0}%`})}"></span></div>`;function Pi(e=[],t=[]){let n=new Set(t);return new Map(e.filter(e=>e.status&&!n.has(e.file)).map(e=>[e.file,{status:e.status,notes:+!!e.comment.trim()}]))}function Fi(e){let t=Ee(e);if(t.length===0)return P;let n=t.filter(e=>e.bullet);return N`${t.filter(e=>!e.bullet).map(e=>N`<p class="npm-review-note">${e.text}</p>`)} ${n.length>0?N`<ul class="npm-review-note npm-review-note-list">${n.map(e=>N`<li>${e.text}</li>`)}</ul>`:P}`}var X=null,Z=(e,t)=>[`ecosystem`,`package`,`version`,`integrity`,`patchHash`,`basePackage`,`baseVersion`,`baseIntegrity`].every(n=>(e[n]??null)===(t[n]??null));function Ii(e,t=!1){X={review:e,continueReview:t}}function Li(e){if(!X||!Z(X.review,e))return null;let t=X;return X=null,t}function Q(e){let t=e.patchHash?` (patched)`:``,n=`${e.package} ${e.version}${t}`;return e.basePackage?e.basePackage===e.package?`${e.package} ${e.baseVersion} -> ${e.version}${t}`:`${e.basePackage} ${e.baseVersion} -> ${n}`:n}var $=e=>e._blocked||e._loading,Ri=e=>e._shownReview?.publishedAt!=null,zi=e=>e.coverage===`full`?`Full`:`Partial`,Bi=e=>e._error?N`<p class="npm-review-error" role="alert">${e._error}</p>`:P,Vi=e=>e._saveBlocked?N`<div class="npm-review-saving" role="status">Saving changes…</div>`:P,Hi=e=>[e._continuation?.review,...e._reviews].filter(Boolean).toSorted((e,t)=>+(e.publishedAt!==null)-(t.publishedAt!==null)||(t.publishedAt??t.time)-(e.publishedAt??e.time)),Ui=e=>`npm-review-button npm-review-primary npm-review-finalize ${e._allowedVerdicts[0]}`,Wi=(e,t,n,r,i=Object.keys(Ti),a=!1)=>N`<div class="npm-review-verdict-options" role="group" aria-label="Verdict">${Object.entries(a?{"":`Not checked`,...Ti}:Ti).map(([a,o])=>N`<label class="${`npm-review-verdict-choice ${a||`unchecked`}`}"><input type="radio" name="${e}" aria-label="${o}" value="${a}" .checked="${E(t===a)}" ?disabled="${r||a!==``&&!i.includes(a)}" @change="${()=>n(a)}">${o}</label>`)}</div>`;function Gi(e){let t=Ri(e),n=e._shownReview,r=e._summary,i=e._canEdit?{label:`Finalize review`,run:()=>e._beginPublish(),disabled:!r.checkedFiles}:!t||!e._writable?null:e._activeReview||e._ownPublished.length===0?{label:`Resume your review`,run:()=>e._resume()}:n.user===e.session?.id?{label:`Revise review`,run:()=>e._change({action:`continue`,reviewId:n.id,revision:n.revision})}:null;return N`<div class="npm-review-summary-actions">${t||e._draftStarted?Ai(n??{publishedAt:null,revokedAt:null}):P}<div class="npm-review-progress-block"><span>${e._unsaved&&(e._saveBlocked||e._error)?N`<button type="button" class="npm-review-button npm-review-text-button" @click="${()=>e._openPanel(`unsaved`)}">Unsaved changes</button>`:N`<strong>${r.checkedFiles} of ${r.totalFiles}</strong> files checked`}</span> ${Ni(r.checkedFiles,r.totalFiles)}</div>${i?N`<button type="button" class="${e._canEdit?Ui(e):`npm-review-button`}" ?disabled="${$(e)||i.disabled}" @click="${i.run}">${i.label} ${w}</button>`:P}</div>`}function Ki(e){let t=e.source??Ae(e.entry),n=!!(e._target&&e._target!==`(empty)`),r=F(t.options,t=>`${e.entry.npm.name}@${t.id}`);n&&!r.some(t=>t.id===e._target)&&r.push(...F([{id:e._target,name:e._target,format:`npm`}]));let i=F(t.choices);return i.some(t=>t.id===e.entry.npm.version)||i.push(...F([{id:e.entry.npm.version,name:e.entry.npm.version,format:`npm`}])),Mt(At({source:t,label:`Review`,disabled:$(e),from:{options:r,value:n?e._target:null,label:`Review base`,pick:t=>{e._navigate(t)}},to:{options:i,value:e.entry.npm.version,label:`Version to review`,pick:t=>{e._navigateTo({view:`npm`,packageName:e.entry.npm.name,packageSpec:t,bundleTab:`review`,...e._location(e._target,t===e.entry.npm.version)})}},clear:n?{label:`Clear review base`,run:()=>{e._navigate(`(empty)`)}}:null,openLine:t=>e._openLine(t),comparison:{base:e._base,other:e._other,files:e._diff.files}}),jt(e._diff))}var qi=e=>e._patch?N`<span class="npm-review-patched" data-tooltip="${`As pnpm\u2019s patch ${e._patch.path} changes it, read at ${e._patch.commit.slice(0,7)}`}">patched</span>`:P;function Ji(e){return N`<div class="npm-review-toolbar"><nav class="npm-review-toolbar-group" aria-label="Review breadcrumbs"><button type="button" class="npm-review-button npm-review-text-button" ?disabled="${$(e)}" @click="${()=>{e._navigateTo({view:`reviews`})}}">My reviews</button> ${w}<button type="button" class="npm-review-button npm-review-text-button npm-review-package" aria-haspopup="dialog" ?disabled="${e._blocked}" @click="${()=>e._openPanel(`reviews`)}"><span>${e.entry.npm.name}@${e.entry.npm.version}</span><span class="npm-review-count">${Hi(e).length}</span></button> ${qi(e)}</nav>${Gi(e)}</div>`}function Yi(e,t=e._file,n=!1){let r=e._editorState(t),i=e._shownReview?.entries.find(e=>e.file===t),a=e._nonTextFiles.includes(t),o=!a&&[`accept-with-nits`,`request-changes`,`reject`].includes(r.status);return N`<section class="${`npm-review-decision${n?` npm-review-inline-decision`:``}`}" aria-label="File decision">${e._canEdit?N`${Wi(`file:${t}`,a?``:r.status,n=>{e._setFileStatus(t,n)},$(e)||a,void 0,!0)} ${a?N`<p class="npm-review-help">Non-text file. Verdicts are not supported yet; this file remains unchecked.</p>`:P} ${o?N`<textarea aria-label="File note" rows="2" maxlength="20000" placeholder="Add a note (optional)…" .value="${E(r.comment)}" ?disabled="${$(e)}" @input="${n=>e._editFile(t,{comment:n.target.value})}" @blur="${()=>{e._saveFile(t)}}"></textarea>`:P}`:N`${n?P:N`<header><strong>File review</strong><span class="npm-review-muted">${Ri(e)?`Frozen`:`Read only`}</span></header>`} ${i?.status&&!a?N`${ki(i.status)}${Fi(i.comment)}`:N`<p class="npm-review-muted">This file was not reviewed.</p>`} ${e._reviewer||e._loading?P:N`<p class="npm-review-help">${e._writable?`Reviewing needs a team that reviews dependencies, where you manage or have Dependencies.`:`Triage access is required to add a review.`}</p>`}`}</section>`}function Xi(e,t,n,r,i,a){return N`<fieldset class="npm-review-team-options"><legend>${t}</legend>${n.map(t=>N`<mode-switch label="${t.name}" .checked="${r.has(t.id)}" .disabled="${$(e)}" @click="${()=>{if($(e))return;let n=new Set(r);n.has(t.id)?n.delete(t.id):n.add(t.id),i(n)}}"></mode-switch>`)}${a}</fieldset>`}function Zi(e,t){let n=e._allowedVerdicts,r=be(t.entries,e._files,e._nonTextFiles),i=t.entries.filter(t=>t.status&&t.comment.trim()&&!e._nonTextFiles.includes(t.file));return N`<form class="npm-review-publish-form" @submit="${t=>{t.preventDefault(),e._publish()}}"><div class="npm-review-dialog-body"><section class="npm-review-coverage"><div><strong>${zi(r)} review</strong><span>${r.checkedFiles} of ${r.totalFiles} files checked</span></div>${Ni(r.checkedFiles,r.totalFiles)}<p>${r.totalFiles>r.checkedFiles?N`${r.totalFiles-r.checkedFiles} files not checked. <button type="button" class="npm-review-button npm-review-text-button" @click="${()=>{e._unchecked=!0,e._closePanel()}}">View files</button>`:`Every file has a verdict.`}</p>${e._needsPackageJson?N`<p class="npm-review-error">Review ${e._files.includes(`package.json`)?N`<button type="button" class="npm-review-button npm-review-text-button" @click="${()=>{e._closePanel(),e._selectFile(`package.json`)}}">package.json</button>`:`package.json`} before publishing a partial review.</p>`:P}</section>${i.length>0?N`<section aria-label="File notes"><strong>File notes</strong><ul class="npm-review-publish-notes" tabindex="0" aria-label="Saved file notes">${i.map(e=>N`<li><span class="dependency-review-entry-file">${ot(e.file)}<span>${e.file}</span></span> ${Fi(e.comment)}</li>`)}</ul></section>`:P}<div><strong>Final verdict</strong>${Wi(`final-verdict`,e._finalStatus,t=>{e._finalStatus=t},$(e),n)}</div>${e._securityLimit===`reject`?N`<p class="npm-review-help">Malware detected. Only Reject is available.</p>`:e._securityLimit===`request-changes`?N`<p class="npm-review-help">Critical vulnerabilities detected.</p>`:P} <label>Final note <span class="npm-review-muted">· optional</span><textarea aria-label="Final comment" rows="3" maxlength="20000" .value="${E(e._finalComment)}" placeholder="Summarize your findings or explain what remains…" ?disabled="${$(e)}" @input="${t=>{e._finalComment=t.target.value}}"></textarea></label> ${e._unchangedContinuation?N`<p class="npm-review-help">Change a verdict or note to publish a new review.</p>`:P} ${Xi(e,`Publish to teams`,e._teams,e._selectedTeams,t=>{e._selectedTeams=t},e._selectedTeams.size>0?P:N`<p class="npm-review-error">${e._teams.length===0?`No teams you belong to have dependency review enabled.`:`Select at least one team to publish.`}</p>`)} ${Bi(e)}</div><footer class="npm-review-dialog-footer"><p>Publishing freezes your verdicts and notes.<br>You can continue in a new review to make changes.</p><button type="submit" class="${Ui(e)}" ?disabled="${$(e)||!e._canPublish}">Publish to ${e._selectedTeams.size} ${e._selectedTeams.size===1?`team`:`teams`} ${w}</button></footer></form>`}function Qi(e,t){let n=t===e._shownReview,r=t.publishedAt!==null,i=r?t:Z(t,e._context)?be(t.entries,e._files,e._nonTextFiles):{checkedFiles:t.entries.filter(e=>e.status).length,totalFiles:null},a=[e._continuation?.review,...e._reviews].some(n=>n?.publishedAt===null&&n.user===e.session?.id&&Z(n,t)),o=t.user===e.session?.id,s=e._teams.filter(e=>!t.teams.some(t=>t.id===e.id)),c=e._additionalTeams.get(t.id)??new Set(s.length===1?s.map(e=>e.id):[]),l=s.filter(e=>c.has(e.id)).map(e=>e.id);return N`<section class="npm-review-entry" aria-current="${String(n)}"><div class="npm-review-history-heading"><strong>${ji(t)}</strong>${n?N`<span class="npm-review-current">Current</span>`:P}${Ai(t)}</div><p class="npm-review-help">${t.basePackage?`${t.basePackage===t.package?t.baseVersion:`${t.basePackage}@${t.baseVersion}`} \u2192 ${t.version}`:`All package files`}</p><div class="npm-review-entry-result">${r?ki(t.status):P}<span class="dependency-review-coverage"> ${r?N`${i.coverage===`full`?`Full`:N`<span class="dependency-review-partial">Partial</span>`} · `:P}${i.checkedFiles}${i.totalFiles===null?P:`/${i.totalFiles}`} files checked</span></div><p class="npm-review-help">${t.teams.length>0?`${t.teams.map(e=>e.name).join(`, `)} \xB7 `:``}${Mi(t.publishedAt??t.time)}</p>${Fi(t.comment)}<div class="npm-review-entry-actions"><button type="button" class="npm-review-button" ?disabled="${$(e)}" @click="${()=>{e._openReview(t)}}">Open ${w}</button> ${r&&o&&!a&&e._reviewer?N`<button type="button" class="npm-review-button" aria-label="Revise in a new draft" ?disabled="${$(e)}" @click="${()=>{e._openReview(t,!0)}}">Revise</button>`:P} ${r&&o&&e._writable&&t.revokedAt===null?N`<button type="button" class="npm-review-button npm-review-danger" ?disabled="${$(e)}" @click="${()=>e._change({action:`revoke`,reviewId:t.id,revision:t.revision})}">Revoke</button>`:P} ${o?N`<dependency-review-copy .text="${t.formatted}"></dependency-review-copy>`:P} ${!r&&o&&e._writable?N`<button type="button" class="dependency-review-discard" aria-label="Discard review" ?disabled="${$(e)}" @click="${()=>{e._discard(t)}}">${bt(yt)}</button>`:P}</div>${r&&o&&e._writable&&t.revokedAt===null&&s.length>0?N`<details class="npm-review-share"><summary>Publish to more teams</summary>${Xi(e,`Teams`,s,c,n=>{e._additionalTeams=new Map(e._additionalTeams).set(t.id,n)},N`<button type="button" class="npm-review-button" ?disabled="${$(e)||l.length===0}" @click="${()=>e._change({action:`publish`,reviewId:t.id,revision:t.revision,teamIds:l})}">Publish to more teams</button>`)}</details>`:P} ${t.revokedAt===null?P:N`<p class="npm-review-help">Revoked ${Mi(t.revokedAt)}. Content and team links remain frozen.</p>`}</section>`}function $i(e){if(!e._panel)return P;let t={publish:`Publish review`,reviews:`Reviews`,unsaved:`Unsaved changes`};return N`<dialog class="npm-review-dialog" aria-label="${t[e._panel]}" @cancel="${t=>{t.preventDefault(),e._closePanel()}}"><button type="button" class="detail-action npm-review-close" aria-label="Close panel" ?disabled="${e._blocked}" @click="${()=>e._closePanel()}">×</button><header class="npm-review-dialog-head"><h2>${t[e._panel]}</h2><p>${e._panel===`reviews`?`${e.entry.npm.name}@${e.entry.npm.version}${e._patch?` (patched)`:``}`:Q(e._context)}</p></header>${e._panel===`publish`?Zi(e,e._activeReview):N`<div class="${`npm-review-dialog-body${e._panel===`reviews`?` npm-review-entries`:``}`}">${e._panel===`unsaved`?N`${e._dirtyFiles.map(t=>N`<button type="button" class="npm-review-button" @click="${()=>{e._closePanel(),e._selectFile(t)}}">${t} ${w}</button>`)}`:Hi(e).map(t=>Qi(e,t))} ${e._panel===`reviews`&&Hi(e).length===0?N`<p class="npm-review-muted">No reviews yet.</p>`:P}${Bi(e)}</div>`} ${Vi(e)}</dialog>`}function ea(e){let t=e._shownReview?.entries,n=e._files,r=e._nonTextFiles;if(e._treeProgress?.entries!==t||e._treeProgress?.files!==n||e._treeProgress?.nonTextFiles!==r){let i=Pi(t,r),a=new Map,o=0;for(let t of e._files){let e=t.split(`/`),n=+!!i.get(t)?.status;o+=n;for(let t=1;t<e.length;t++){let r=e.slice(0,t).join(`/`),i=a.get(r)??{total:0,checked:0};i.total++,i.checked+=n,a.set(r,i)}}e._treeProgress={entries:t,files:n,nonTextFiles:r,states:i,directories:a,checked:o}}let{states:i,directories:a,checked:o}=e._treeProgress;return{railLabel:`Files`,treeLabel:`Review files`,collapseLabel:`Collapse folders`,searchLabel:`Find a file`,searchPlaceholder:`Find a file…`,treePageSize:300,filterContent:!1,fullPaths:!0,collapseClearsSearch:!0,canSelect:()=>!e._blocked&&!e._panel,fileFilter:e._unchecked?e=>!i.get(e)?.status:null,fileLabel:e=>`${e}, ${Ti[i.get(e)?.status]??`Not reviewed`}`,filePrefix:e=>Oi(i.get(e)?.status),fileSuffix:e=>i.get(e)?.notes?N`<span class="npm-review-note-dot" aria-label="Has notes">•</span>`:P,directoryLabel:e=>{let t=a.get(e.sourcePath);return`${e.sourcePath}, ${t?.checked??0} of ${t?.total??0} checked`},directorySummary:e=>{let t=a.get(e.sourcePath);return`${t?.checked??0}/${t?.total??0}`},filters:N`<div class="npm-review-filters" aria-label="Filter review files"><button type="button" class="npm-review-button" aria-pressed="${String(!e._unchecked)}" @click="${()=>{e._unchecked=!1}}">All ${e._files.length}</button> <button type="button" class="npm-review-button" aria-pressed="${String(!!e._unchecked)}" @click="${()=>{e._unchecked=!0}}">Unchecked ${e._files.length-o}</button></div>`,fileActions:(t,n)=>Yi(e,t,n)}}function ta(e){return e._base?N`${Ki(e)}${Ji(e)}${e._panel?P:Bi(e)} ${bi({base:e._base,other:e._other,diff:e._diff,source:e.source,path:e._path,seek:e._seek,baseName:e._base.npm?`${e._base.npm.name}@${e._base.npm.version}`:`Empty package`,otherName:`${e.entry.npm.name}@${e.entry.npm.version}${e._patch?` (patched)`:``}`,select:t=>e._selectFile(t),extensions:ea(e),mode:e._mode})} <span class="npm-review-announcement" role="status">${e._notice??``}</span>${e._panel?P:Vi(e)}${$i(e)}`:N`<div class="npm-review-empty" role="${e._baseError?`alert`:`status`}">${e._baseError??`Loading comparison…`} ${e._baseError?N`<button type="button" class="npm-review-button" @click="${()=>{e._baseKey=null,e._loadBase(e._target,e.request?.resume)}}">Retry</button>`:P}</div>`}var na={maxLines:5e4,maxBytes:2097152},ra={integrity:`(empty)`,kind:`sourcemap`,json:{version:3,sources:[],sourcesContent:[]},fileSizes:new Map},ia=(e,t,n=null)=>({ecosystem:`npm`,package:e.npm.name,version:e.npm.version,integrity:e.integrity,patchHash:n?.hash??null,basePackage:t?.npm?.name??null,baseVersion:t?.npm?.version??null,baseIntegrity:t?.npm?t.integrity:null}),aa=(e,t)=>`${e}@${t??`latest`}`,oa=class extends xt{static properties={entry:{attribute:!1},details:{attribute:!1},request:{attribute:!1},session:{attribute:!1},source:{attribute:!1},_teams:{state:!0},_selectedTeams:{state:!0},_additionalTeams:{state:!0},_reviews:{state:!0},_loading:{state:!0},_error:{state:!0},_saving:{state:!0},_saveBlocked:{state:!0},_file:{state:!0},_seek:{state:!0},_finalStatus:{state:!0},_finalComment:{state:!0},_base:{state:!0},_baseError:{state:!0},_panel:{state:!0},_path:{state:!0},_selectedReview:{state:!0},_unchecked:{state:!0},_notice:{state:!0},_continuation:{state:!0}};createRenderRoot(){return this}constructor(){super(),this._teams=[],this._reviews=[],this._files=[],this._nonTextFiles=[],this._selectedTeams=new Set,this._additionalTeams=new Map,this._editors=new Map,this._file=null,this._path=null,this._patch=null,this._patched=null,this._loading=!1,this._saving=!1,this._error=null,this._context=null,this._key=null,this._controller=new AbortController,this._mode=`code`,this._panel=null,this._selectedReview=null,this._unchecked=!1,this._pendingSaves=[],this._saveBlocked=!1}disconnectedCallback(){super.disconnectedCallback(),this._controller.abort(),this._cancelSaves(),this._dismissLoading?.(),this._key=null,this._baseKey=null}updated(){let e=this.querySelector(`dialog`);e&&!e.open&&e.showModal(),this._rememberBase()}_rememberBase(){T.bundleDetailsTab!==`review`||T.selectedBundle!==this.entry?.integrity||!this._context||!this._activeReview&&this._ownPublished.length===0&&!this._unsaved||(T.npmReview={bundle:this.entry.integrity,...this._context.basePackage?{reviewPackage:this._context.basePackage,reviewSpec:this._context.baseVersion}:{},...this._patch?{patch:this._patch}:{},started:!0,user:this.session?.id})}get _writable(){return[`triage`,`manage`,`admin`].includes(this.session?.role)&&!this.session?.viewer}get _other(){return this._patched??this.details}get _reviewer(){return this._writable&&this._teams.length>0}get _activeReview(){return this._reviews.find(e=>e.user===this.session?.id&&e.publishedAt===null&&Z(e,this._context))??(this._continuation&&this._continuation.review.user===this.session?.id?this._continuation.review:null)}get _ownPublished(){return this._reviews.filter(e=>e.user===this.session?.id&&e.publishedAt!==null&&Z(e,this._context)).toSorted((e,t)=>t.publishedAt-e.publishedAt)}get _shownReview(){return this._selectedReview?this._reviews.find(e=>e.id===this._selectedReview):this._activeReview??this._ownPublished[0]??null}get _canEdit(){return this._reviewer&&!this._selectedReview&&(this._activeReview!==null||this._ownPublished.length===0)}_isDirty(e,t){return!this._nonTextFiles.includes(e)&&(t.comment!==(t.edit?.comment??``)||t.status!==(t.edit?.status??``))}get _dirtyFiles(){return[...this._editors].filter(([e,t])=>this._isDirty(e,t)).map(([e])=>e)}get _blocked(){return this._saving||this._saveBlocked}get _unsaved(){return this._pendingSaves.length>0||this._dirtyFiles.length>0}get _draftStarted(){return this._canEdit&&(this._unsaved||this._activeReview&&!this._continuation||this._continuation&&this._publishRevision!=null&&!this._unchangedContinuation)}get _summary(){return be(this._shownReview?.entries??[],this._files,this._nonTextFiles)}get _securityLimit(){return this.source?.reviewVerdictLimit?.(this.entry,this._base)??`accept`}get _allowedVerdicts(){let e=new Map((this._shownReview?.entries??[]).map(e=>[e.file,e]));if(this._canEdit)for(let[t,n]of this._editors)e.set(t,{file:t,status:n.status||null});return Se([...e.values()].filter(e=>!this._nonTextFiles.includes(e.file)),this._securityLimit)}get _needsPackageJson(){return we(this._activeReview?.entries??[],this._files,this._nonTextFiles)}get _unchangedContinuation(){let e=this._continuation?.source;return!!(e&&this._finalStatus===e.status&&this._finalComment===e.comment)}get _canPublish(){return this._canEdit&&this._panel===`publish`&&this._activeReview?.revision===this._publishRevision&&this._summary.checkedFiles>0&&!this._needsPackageJson&&!this._unchangedContinuation&&this._selectedTeams.size>0&&!this._unsaved&&this._allowedVerdicts.includes(this._finalStatus)}_location(e,t=!0){let n=e&&e!==`(empty)`?y(e):null;return{...n?{reviewPackage:n.name,reviewSpec:n.spec}:{},...t&&this._patch?{patch:this._patch}:{}}}_asked(e=this._context){let t=Object.fromEntries(Object.keys(this._context).map(t=>[t,e[t]??null])),n=(e===this._context?null:e.patchSource)??this._patch;return t.patchHash&&n?{...t,patchRepoId:n.repoId,patchCommit:n.commit,patchPath:n.path}:t}_navigate(e){return this._navigateTo(x(this.entry,`review`,this._location(e)))}async _navigateTo(e){if(this._blocked||this._loading)return;let t=this._key,n=this._navigation={};this._unsaved&&!await this._saveAll()||t===this._key&&n===this._navigation&&!this._unsaved&&await Fe?.navigate(e)}async _loadBase(e,t=!1){let n=JSON.stringify([this.entry.integrity,e,this._patch,this.session?.id,this.session?.role]);if(this._baseKey!==n){this._baseKey=n,this._base=null,this._baseError=null,this._controller.abort(),this._cancelSaves(),this._key=null,this._controller=new AbortController;try{let r=this._controller.signal,i=this._patch?ne(this.entry,this._patch,{signal:r}):Promise.resolve(this.details);i.catch(()=>{});let a=t?await xe(ia(this.entry,null,this._patch),r):null;if(this._baseKey!==n)return;a&&(e=a.basePackage?aa(a.basePackage,a.baseVersion):`(empty)`);let o=e===`(empty)`?null:y(e),s=o?(await S(o.name,o.spec??`latest`)).details:ra,c=await i;if(this._baseKey!==n)return;let l=await Yt(s,c);if(this._baseKey!==n)return;t&&(a&&Ii(a),this._target=e,this.request={bundle:this.entry.integrity,...this._location(e)},this._baseKey=JSON.stringify([this.entry.integrity,e,this._patch,this.session?.id,this.session?.role])),this._patched=this._patch?c:null,this._base=s,this._ensureContext(s,l)}catch(e){this._baseKey===n&&(this._baseError=e.message)}}}_ensureContext(e,t){let n=ia(this.entry,e,this._patch),r=JSON.stringify([this.session?.id,this.session?.role,n]);if(r===this._key)return;this._controller.abort(),this._cancelSaves(),this._controller=new AbortController,this._context=n,this._diff=t;let i=en(e,this._other,this._diff);this._files=Le(De(i.map(e=>e.path)));let a=new Set(i.filter(e=>!l(e.before,e.after)).map(e=>e.path));if(this._nonTextFiles=this._files.filter(e=>a.has(e)),this._mode=tn(i,na)?`diff`:`code`,this._key=r,this._teams=[],this._reviews=[],this._selectedTeams=new Set,this._additionalTeams=new Map,this._selectedReview=null,this._continuation=null,this._editors.clear(),this._path=this._files[0]??null,this._panel=null,this._notice=``,this._resetEditor(this._path),this._saving=!1,this._refresh(!0),T.bundleDetailsTab===`review`&&T.selectedBundle===this.entry.integrity){let t=this._location(e.npm?aa(e.npm.name,e.npm.version):`(empty)`);T.npmReview={bundle:this.entry.integrity,...t},this._baseKey=JSON.stringify([this.entry.integrity,e.npm?aa(e.npm.name,e.npm.version):`(empty)`,this._patch,this.session?.id,this.session?.role]),Fe?.replaceRoute(x(this.entry,`review`,t))}}async _refresh(e=!1){let t=this._key;for(;t===this._key&&this._pendingSaves.length>0;)if((await Promise.all(this._pendingSaves.map(e=>e.promise))).some(e=>!e))return;if(t!==this._key)return;this._dismissLoading?.();let n=this._dismissLoading=Ne(`Loading reviews…`,{duration:0});this._loading=!0,this._error=null;try{let{reviews:n,teams:r}=await me({...this._context,allBases:!0},null,null,this._controller.signal);if(t===this._key){let t=this._unsaved;this._reviews=n,this._teams=r,n.some(e=>e.user===this.session?.id&&e.publishedAt===null&&Z(e,this._context))&&(this._continuation=null),this._rememberBase();let i=Li(this._context),a=i&&n.find(e=>e.id===i.review.id);a?.publishedAt!=null&&(i.continueReview?this._continue(a.id,a.revision):this._selectedReview=a.id),this._selectedTeams=new Set(r.filter(t=>e?r.length===1:this._selectedTeams.has(t.id)).map(e=>e.id)),t||(this._editors.clear(),this._resetEditor(this._file))}}catch(e){t===this._key&&e.name!==`AbortError`&&(this._error=e.message)}finally{n(),t===this._key&&(this._loading=!1)}}_resetEditor(e=null){this._publishRevision=null,this._file=e,this._editorState(e)}_editorState(e){let t=this._canEdit?this._editors.get(e):null;if(!t){let n=this._shownReview?.entries.find(t=>t.file===e&&t.status)??null;t={edit:n,revision:this._activeReview?.revision??null,comment:this._nonTextFiles.includes(e)?``:n?.comment??``,status:this._nonTextFiles.includes(e)?``:n?.status??``},this._canEdit&&this._editors.set(e,t)}return{...t,dirty:this._isDirty(e,t)}}_editFile(e,t){!this._canEdit||this._blocked||(this._resetEditor(e),Object.assign(this._editors.get(e),t),this.requestUpdate())}_setFileStatus(e,t){if(!(this._blocked||this._nonTextFiles.includes(e)))return this._editFile(e,{status:t,...t?{}:{comment:``}}),this._saveFile(e)}_selectFile(e){this._blocked||!this._files.includes(e)||(this._path=e,this._resetEditor(e))}_openLine({path:e,line:t,query:n}){this._blocked||!this._files.includes(e)||(this._seek={path:e,line:t-1,query:n},this._selectFile(e))}_openPanel(e){this._panel=e}async _openReview(e,t=!1){if(this._blocked||this._loading)return;if(Z(e,this._context)){t?this._continue(e.id,e.revision):e.publishedAt===null?this._resume():this._showPublished(e);return}let n=this._key;this._unsaved&&!await this._saveAll()||n!==this._key||(Ii(e,t),await this._navigate(e.basePackage?aa(e.basePackage,e.baseVersion):`(empty)`))}_closePanel(){this._blocked||(this.querySelector(`dialog`)?.close(),this._panel=null)}_showPublished(e){this._selectedReview=e.id,this._panel=null,this._file=this._path}_resume(){this._selectedReview=null,this._panel=null,this._resetEditor(this._path)}async _discard(e){if(this._blocked||this._loading||!this._writable||e.user!==this.session.id||e.publishedAt!==null)return;let t=e===this._activeReview,n=this._key,r=this._controller.signal;this._saving=!0,this._error=null;try{let{confirmed:i}=await lt({reviewTitle:Q(e),signal:r});if(!i||r.aborted||n!==this._key||(await Promise.all(this._pendingSaves.map(e=>e.promise)),r.aborted||n!==this._key||!this._writable)||(e=t?this._activeReview:this._reviews.find(t=>t.id===e.id),!e||e.user!==this.session.id||e.publishedAt!==null))return;let a=e===this._continuation?.review;if(a||await ye(e.id,e.revision,this.session.csrfToken,r),r.aborted||n!==this._key)return;a||(this._reviews=this._reviews.filter(t=>t.id!==e.id)),Z(e,this._context)&&(this._continuation=null,this._selectedReview=null,this._editors.clear(),this._resetEditor(this._path),this._finalStatus=null,this._finalComment=``,this._panel=null,this._ownPublished.length===0&&T.npmReview?.bundle===this.entry.integrity&&delete T.npmReview.started),this._notice=`Draft discarded.`}catch(e){n===this._key&&e.name!==`AbortError`&&(this._error=e.message)}finally{n===this._key&&(this._saving=!1)}}_continue(e,t){let n=this._reviews.find(n=>n.id===e&&n.revision===t&&n.user===this.session?.id&&n.publishedAt!==null&&Z(n,this._context));return!n||this._activeReview||!this._reviewer?null:(this._continuation={source:n,review:{...n,publishedAt:null,revokedAt:null,status:null,teams:[]}},this._selectedTeams=new Set(this._teams.length===1?this._teams.map(e=>e.id):[]),this._selectedReview=null,this._panel=null,this._editors.clear(),this._resetEditor(this._path),this._notice=`A new draft will be saved when you make a change.`,this._activeReview)}async _persistContinuation(e){let t=this._continuation,n=this._key,{review:r}=await me(this._asked(),{action:`continue`,reviewId:t.source.id,revision:t.source.revision},this.session.csrfToken,this._controller.signal);return n!==this._key||this._continuation!==t||e&&this._pendingSaves[0]!==e?null:(this._acceptSave(r,{revision:t.source.revision}),r)}_cancelSaves(){for(let e of this._pendingSaves)clearTimeout(e.timer),e.resolve(null);this._pendingSaves=[],this._saveBlocked=!1}_queueSave(e){let t=this._pendingSaves.findLast(t=>t.change.file===e.file);if(t&&t.change.comment===e.comment&&t.change.status===e.status)return t.promise;let n={change:e,slow:!1};return n.promise=new Promise(e=>{n.resolve=e}),n.timer=setTimeout(()=>{n.slow=!0,this._saveBlocked=!0},3e3),this._pendingSaves.push(n),this.requestUpdate(),this._pendingSaves.length===1&&this._flushSaves(),n.promise}_acceptSave(e,t){this._reviews=[...this._reviews.filter(t=>t.id!==e.id),e],this._continuation=null;for(let[n,r]of this._editors)r.revision===t.revision&&(r.revision=e.revision,r.edit=e.entries.find(e=>e.file===n&&e.status)??null);for(let{change:n}of this._pendingSaves.slice(1))n.revision===t.revision&&(n.revision=e.revision,n.reviewId=e.id,n.entryId=e.entries.find(e=>e.file===n.file)?.id??null);this._canEdit&&this._resetEditor(this._file),this._notice=`Saved privately.`,this._rememberBase()}async _flushSaves(){for(;this._pendingSaves.length>0;){let e=this._pendingSaves[0];this._error=null;try{if(this._continuation){let t=await this._persistContinuation(e);if(!t||this._pendingSaves[0]!==e)return;Object.assign(e.change,{reviewId:t.id,revision:t.revision,entryId:t.entries.find(t=>t.file===e.change.file)?.id??null})}let{review:t}=await me(this._asked(),e.change,this.session.csrfToken,this._controller.signal);if(this._pendingSaves[0]!==e)return;this._acceptSave(t,e.change),clearTimeout(e.timer),this._pendingSaves.shift(),e.resolve(t),this._saveBlocked=this._pendingSaves.some(e=>e.slow),this.requestUpdate()}catch(t){if(this._pendingSaves[0]!==e)return;this._cancelSaves(),t.name!==`AbortError`&&(this._error=t.message),this.requestUpdate();return}}}async _change(e){if(this._blocked||this._pendingSaves.length>0||this._loading||!this._writable)return null;if(e.action===`continue`)return this._continue(e.reviewId,e.revision);let t=this._key;this._saving=!0,this._error=null;try{if(e.action===`publish`&&e.finalStatus&&this._continuation){let t=await this._persistContinuation();if(!t)return null;e={...e,reviewId:t.id,revision:t.revision}}let n=this._reviews.find(t=>t.id===e.reviewId)??this._context,{review:r}=await me(this._asked(n),e,this.session.csrfToken,this._controller.signal);return t===this._key?(this._reviews=[...this._reviews.filter(e=>e.id!==r.id),r],e.action===`publish`&&e.finalStatus&&Z(r,this._context)&&(this._selectedReview=r.id,this._panel=null,this._editors.clear(),this._notice=`Published. Verdicts and notes are now frozen.`),this._rememberBase(),r):null}catch(e){return t===this._key&&e.name!==`AbortError`&&(this._error=e.message),null}finally{t===this._key&&(this._saving=!1)}}_saveFile(e){if(!this._canEdit||this._saving||this._loading)return null;let t=this._editorState(e),n=this._pendingSaves.some(t=>t.change.file===e),r=this._activeReview;return!t.dirty&&!n?r:!t.status&&!t.comment.trim()&&!t.edit?.id&&!n?(this._editors.delete(e),e===this._file&&this._resetEditor(e),r):this._queueSave({action:`save`,reviewId:r?.id??null,revision:t.revision,entryId:t.edit?.id??null,file:e,comment:t.comment,status:this._nonTextFiles.includes(e)?null:t.status||null})}async _saveAll(){let e=this._key;for(;e===this._key&&this._canEdit;){if(this._pendingSaves.length>0){if((await Promise.all(this._pendingSaves.map(e=>e.promise))).some(e=>!e))return!1;continue}let e=this._dirtyFiles;if(e.length===0)return!0;if(!await this._saveFile(e[0]))return!1}return!1}async _beginPublish(){if(!this._canEdit||this._saving||this._loading||this._finalizing||!this._summary.checkedFiles)return;let e=this._key;this._finalizing=!0;try{if(this._unsaved&&!await this._saveAll()||e!==this._key||!this._canEdit||this._unsaved||!this._summary.checkedFiles)return;let t=this._activeReview;if(!t)return;let n=this._allowedVerdicts,r=this._continuation?.source.status;this._finalStatus=n.includes(r)?r:n[0],this._finalComment=t.comment??``,this._publishRevision=t.revision,this._panel=`publish`}finally{this._finalizing=!1}}_publish(){if(this._canPublish)return this._change({action:`publish`,reviewId:this._activeReview.id,revision:this._publishRevision,teamIds:[...this._selectedTeams],finalStatus:this._finalStatus,finalComment:this._finalComment})}render(){if(!this.entry?.npm||!this.details)return P;let e=this.request?.bundle===this.entry.integrity?this.request:{};return this._target=e.reviewPackage?aa(e.reviewPackage,e.reviewSpec):`(empty)`,JSON.stringify(e.patch??null)!==JSON.stringify(this._patch)&&(this._patch=e.patch??null),this._loadBase(this._target,e.resume),ta(this)}};customElements.define(`npm-review`,oa);var sa=e=>({view:`npm`,packageName:e.package,packageSpec:e.version,bundleTab:`review`,...e.basePackage===null?{}:{reviewPackage:e.basePackage,reviewSpec:e.baseVersion},...e.patchHash&&e.patchSource?{patch:{hash:e.patchHash,...e.patchSource}}:{}}),ca=e=>{let t=new Date(e);return N`<time datetime="${t.toISOString()}" data-tooltip="${t.toLocaleString()}">${t.toLocaleDateString(void 0,{month:`short`,day:`numeric`,...t.getFullYear()===new Date().getFullYear()?{}:{year:`numeric`}})} <span>${t.toLocaleTimeString(void 0,{hour:`2-digit`,minute:`2-digit`})}</span></time>`},la=class extends xt{static properties={session:{attribute:!1},team:{attribute:!1},_reviews:{state:!0},_loading:{state:!0},_error:{state:!0},_next:{state:!0},_discarding:{state:!0},_expanded:{state:!0}};constructor(){super(),this._reviews=[],this._next=null,this._expanded=new Set,this._controller=new AbortController}createRenderRoot(){return this}disconnectedCallback(){super.disconnectedCallback(),this._controller.abort(),this._dismissLoading?.(),this._key=null}_canDiscard(e){return e.publishedAt===null&&e.user===this.session?.id&&[`triage`,`manage`,`admin`].includes(this.session?.role)}async _discard(e){if(!this._canDiscard(e)||this._discarding||this._loading)return;let t=this._key,n=this._controller.signal;this._discarding=e.id,this._error=null;try{let{confirmed:r}=await lt({reviewTitle:Q(e),signal:n});if(!r||n.aborted||t!==this._key||!this._canDiscard(e)||(await ye(e.id,e.revision,this.session.csrfToken,n),t!==this._key||n.aborted))return;this._reviews=this._reviews.filter(t=>t.id!==e.id)}catch(e){t===this._key&&e.name!==`AbortError`&&(this._error=e.message)}finally{t===this._key&&(this._discarding=null)}}async _load(e=!1){let t=this._key;this._dismissLoading?.();let n=this._dismissLoading=Ne(`Loading reviews…`,{duration:0});this._loading=!0,this._error=null;try{let n=e?this._next:null,{reviews:r,next:i}=await(this.team?c(this.team,n,this._controller.signal):ge(n,this._controller.signal));if(t!==this._key)return;this._reviews=[...new Map([...e?this._reviews:[],...r].map(e=>[e.id,e])).values()],this._next=i}catch(e){t===this._key&&e.name!==`AbortError`&&(this._error=e.message)}finally{n(),t===this._key&&(this._loading=!1)}}_toggleDetails(e){let t=new Set(this._expanded);t.has(e)?t.delete(e):t.add(e),this._expanded=t}_details(e){let t=e.entries.filter(e=>e.status);return N`<section id="${`review-details-${e.id}`}" class="dependency-review-details" aria-label="${`Details for ${Q(e)}`}">${e.comment?N`<div class="dependency-review-final-note" role="note" aria-label="Final note">${Fi(e.comment)}</div>`:P} ${t.length>0?N`<ul class="dependency-review-entries">${t.map(e=>N`<li><span class="dependency-review-entry-file">${ot(e.file)}<span>${e.file}</span></span> ${ki(e.status)}<div>${Fi(e.comment)}</div></li>`)}</ul>`:N`<p class="npm-review-muted">No file reviews yet.</p>`}</section>`}_row(e){let t=sa(e),n=this._expanded.has(e.id),r=e.publishedAt!==null,i=new Set(e.entries.filter(e=>e.status).map(e=>e.file)).size,a=e.entries.filter(e=>e.status&&e.comment.trim()).length+ +!!e.comment.trim(),o=n=>{n.button===0&&!n.metaKey&&!n.ctrlKey&&!n.shiftKey&&!n.altKey&&Fe?.active&&(n.preventDefault(),Ii(e),Fe.navigate(t))};return N`<li class="${`dependency-review-row${n?` is-expanded`:``}${e.revokedAt===null?``:` is-revoked`}`}"><div class="dependency-review-row-main"><button type="button" class="dependency-review-expand" aria-expanded="${n}" aria-controls="${`review-details-${e.id}`}" aria-label="${`${n?`Hide`:`Show`} details for ${Q(e)}`}" @click="${()=>this._toggleDetails(e.id)}">${w}</button><div class="dependency-review-identity"><a class="dependency-review-title" href="${_t(t)}" @click="${o}">${e.basePackage!==null&&e.basePackage!==e.package?N`<span>${e.basePackage} ${e.baseVersion} →</span>`:P} <strong>${e.package}</strong> <span>${e.basePackage===e.package?`${e.baseVersion} \u2192 `:``}${e.version}${e.patchHash?N`<span class="dependency-review-patched">patched</span>`:P}</span></a><div class="dependency-review-meta">${ca(e.publishedAt??e.time)} ${this.team?N`<span class="dependency-review-author">${ji(e)}</span>`:P} ${r&&e.teams.length>0?N`<span class="dependency-review-teams">${e.teams.map(e=>e.name).join(`, `)}</span>`:P} ${r&&a>0?N`<span class="dependency-review-note-count">${a} ${a===1?`note`:`notes`}</span>`:P} ${e.revokedAt===null?P:Ai(e)}</div></div><div class="dependency-review-result">${r?ki(e.status):N`<span class="dependency-review-checked">${i} ${i===1?`file`:`files`} checked</span>`} <span class="dependency-review-coverage">${r?N`${e.coverage===`full`?`Full`:N`<span class="dependency-review-partial">Partial</span>`} · ${e.checkedFiles}/${e.totalFiles} files checked`:a?`${a} ${a===1?`note`:`notes`}`:`No notes`}</span></div><div class="dependency-review-row-actions">${this.team?P:N`<dependency-review-copy .text="${e.formatted}"></dependency-review-copy>`} ${this._canDiscard(e)?N`<button type="button" class="dependency-review-discard" aria-label="Discard review" ?disabled="${this._loading||!!this._discarding}" @click="${()=>this._discard(e)}">${bt(yt)}</button>`:P} <a class="dependency-review-open" href="${_t(t)}" @click="${o}" aria-label="${`${r?`Open`:`Continue`} review for ${Q(e)}`}"><span aria-hidden="true">→</span></a></div></div>${n?this._details(e):P}</li>`}render(){let e=JSON.stringify([this.session?.id,this.session?.role,this.team??null]);return e!==this._key&&(this._controller.abort(),this._controller=new AbortController,this._key=e,this._reviews=[],this._next=null,this._discarding=null,this._expanded=new Set,this._load()),this.team?N`<section class="dependency-review-list is-team">${this._error?N`<p role="alert">${this._error}</p>`:P} ${!this._loading&&!this._error&&this._reviews.length===0?N`<p class="npm-review-muted">No reviews are published to this team yet.</p>`:P}<ol>${this._reviews.map(e=>this._row(e))}</ol>${this._next?N`<button type="button" class="npm-review-button" ?disabled="${this._loading}" @click="${()=>this._load(!0)}">Load more</button>`:P}</section>`:N`<section class="dependency-review-list"><header><h1>My reviews</h1></header><p>Your private work and the reviews you’ve shared with teams.</p>${this._error?N`<p role="alert">${this._error}</p>`:P} ${!this._loading&&!this._error&&this._reviews.length===0?N`<p>No reviews yet. Open a package’s Review tab to begin.</p>`:P} ${[[`Drafts`,!1],[`Published reviews`,!0]].map(([e,t])=>{let n=this._reviews.filter(e=>e.publishedAt!==null===t);return N`<section class="dependency-review-section"><h2>${e}<span class="npm-review-count">${n.length}</span></h2><ol>${n.map(e=>this._row(e))}</ol>${n.length===0&&!this._loading?N`<p class="npm-review-muted">${t?`No published reviews yet.`:`No drafts.`}</p>`:P}</section>`})} ${this._next?N`<button type="button" class="npm-review-button" ?disabled="${this._loading||!!this._discarding}" @click="${()=>this._load(!0)}">Load more</button>`:P}</section>`}};customElements.define(`dependency-review-list`,la);
|
|
27
27
|
/*! Bundled license information:
|
|
28
28
|
|
|
29
29
|
lit-html/static.js:
|