rxjs-leak-finder 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/HOW_IT_WORKS.md +214 -0
  2. package/LICENSE +21 -0
  3. package/README.md +190 -0
  4. package/dist/cli/dashboard-server.d.ts +11 -0
  5. package/dist/cli/dashboard-server.js +241 -0
  6. package/dist/cli/dashboard-server.js.map +1 -0
  7. package/dist/cli/index.d.ts +2 -0
  8. package/dist/cli/index.js +67 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/dashboard/assets/index-BqI1esY6.js +350 -0
  11. package/dist/dashboard/assets/mappings-Dhu04MXZ.wasm +0 -0
  12. package/dist/dashboard/index.html +25 -0
  13. package/dist/runtime/enable.d.ts +29 -0
  14. package/dist/runtime/enable.js +60 -0
  15. package/dist/runtime/enable.js.map +1 -0
  16. package/dist/runtime/index.d.ts +2 -0
  17. package/dist/runtime/index.js +2 -0
  18. package/dist/runtime/index.js.map +1 -0
  19. package/dist/runtime/patch.d.ts +11 -0
  20. package/dist/runtime/patch.js +42 -0
  21. package/dist/runtime/patch.js.map +1 -0
  22. package/dist/runtime/recorder.d.ts +15 -0
  23. package/dist/runtime/recorder.js +94 -0
  24. package/dist/runtime/recorder.js.map +1 -0
  25. package/dist/runtime/route-tracker.d.ts +8 -0
  26. package/dist/runtime/route-tracker.js +130 -0
  27. package/dist/runtime/route-tracker.js.map +1 -0
  28. package/dist/runtime/transport.d.ts +12 -0
  29. package/dist/runtime/transport.js +85 -0
  30. package/dist/runtime/transport.js.map +1 -0
  31. package/dist/runtime/types.d.ts +96 -0
  32. package/dist/runtime/types.js +7 -0
  33. package/dist/runtime/types.js.map +1 -0
  34. package/dist/runtime/widget.d.ts +11 -0
  35. package/dist/runtime/widget.js +61 -0
  36. package/dist/runtime/widget.js.map +1 -0
  37. package/package.json +61 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-server.js","sourceRoot":"","sources":["../../src/cli/dashboard-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env node
2
+ import { startServer } from './dashboard-server.js';
3
+ import { resolve } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { existsSync } from 'node:fs';
6
+ const args = process.argv.slice(2);
7
+ const command = args[0];
8
+ if (command === 'dashboard') {
9
+ const portArg = args.find(a => a.startsWith('--port='))?.slice('--port='.length);
10
+ const port = portArg ? Number(portArg) : 7654;
11
+ const noOpen = args.includes('--no-open');
12
+ const cwdArg = args.find(a => a.startsWith('--cwd='))?.slice('--cwd='.length);
13
+ const cwd = cwdArg ? resolve(cwdArg) : process.cwd();
14
+ void runDashboard({ port, noOpen, cwd });
15
+ }
16
+ else if (command === '--help' || command === '-h' || !command) {
17
+ printHelp();
18
+ }
19
+ else {
20
+ console.error(`Unknown command: ${command}`);
21
+ printHelp();
22
+ process.exit(1);
23
+ }
24
+ async function runDashboard({ port, noOpen, cwd }) {
25
+ const here = fileURLToPath(import.meta.url);
26
+ const staticDir = resolve(here, '../../dashboard');
27
+ const handle = await startServer({ port, cwd, staticDir: existsSync(staticDir) ? staticDir : undefined });
28
+ console.log(`rxjs-leak-finder dashboard listening at ${handle.url}`);
29
+ console.log(`Reports will be saved to ${cwd}/.rld/`);
30
+ if (!noOpen) {
31
+ await openInBrowser(handle.url);
32
+ }
33
+ // Keep alive
34
+ process.on('SIGINT', async () => {
35
+ console.log('\nShutting down…');
36
+ await handle.close();
37
+ process.exit(0);
38
+ });
39
+ }
40
+ async function openInBrowser(url) {
41
+ const { spawn } = await import('node:child_process');
42
+ const cmd = process.platform === 'darwin' ? 'open'
43
+ : process.platform === 'win32' ? 'start'
44
+ : 'xdg-open';
45
+ spawn(cmd, [url], { stdio: 'ignore', detached: true }).unref();
46
+ }
47
+ function printHelp() {
48
+ console.log(`
49
+ rxjs-leak-finder — local dashboard for RxJS subscription leaks
50
+
51
+ Usage:
52
+ npx rxjs-leak-finder dashboard [options]
53
+
54
+ Options:
55
+ --port=<n> Port to listen on (default 7654)
56
+ --cwd=<path> Where to write .rld/ session files (default cwd)
57
+ --no-open Don't auto-open the browser
58
+ --help, -h Show this help
59
+
60
+ Environment:
61
+ RLD_EDITOR Editor launcher for "open in editor" links.
62
+ Recognized: code, cursor, idea, webstorm, pycharm,
63
+ phpstorm, goland, rubymine, subl, vim, nvim, emacs.
64
+ Defaults to 'code'.
65
+ `.trim());
66
+ }
67
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,350 @@
1
+ (function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))n(s);new MutationObserver(s=>{for(const r of s)if(r.type==="childList")for(const i of r.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&n(i)}).observe(document,{childList:!0,subtree:!0});function t(s){const r={};return s.integrity&&(r.integrity=s.integrity),s.referrerPolicy&&(r.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?r.credentials="include":s.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function n(s){if(s.ep)return;s.ep=!0;const r=t(s);fetch(s.href,r)}})();/**
2
+ * @license
3
+ * Copyright 2019 Google LLC
4
+ * SPDX-License-Identifier: BSD-3-Clause
5
+ */const pe=globalThis,Me=pe.ShadowRoot&&(pe.ShadyCSS===void 0||pe.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,Ne=Symbol(),Ke=new WeakMap;let ct=class{constructor(e,t,n){if(this._$cssResult$=!0,n!==Ne)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=e,this.t=t}get styleSheet(){let e=this.o;const t=this.t;if(Me&&e===void 0){const n=t!==void 0&&t.length===1;n&&(e=Ke.get(t)),e===void 0&&((this.o=e=new CSSStyleSheet).replaceSync(this.cssText),n&&Ke.set(t,e))}return e}toString(){return this.cssText}};const Tt=o=>new ct(typeof o=="string"?o:o+"",void 0,Ne),w=(o,...e)=>{const t=o.length===1?o[0]:e.reduce((n,s,r)=>n+(i=>{if(i._$cssResult$===!0)return i.cssText;if(typeof i=="number")return i;throw Error("Value passed to 'css' function must be a 'css' function result: "+i+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(s)+o[r+1],o[0]);return new ct(t,o,Ne)},Ut=(o,e)=>{if(Me)o.adoptedStyleSheets=e.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const t of e){const n=document.createElement("style"),s=pe.litNonce;s!==void 0&&n.setAttribute("nonce",s),n.textContent=t.cssText,o.appendChild(n)}},Ve=Me?o=>o:o=>o instanceof CSSStyleSheet?(e=>{let t="";for(const n of e.cssRules)t+=n.cssText;return Tt(t)})(o):o;/**
6
+ * @license
7
+ * Copyright 2017 Google LLC
8
+ * SPDX-License-Identifier: BSD-3-Clause
9
+ */const{is:It,defineProperty:Ft,getOwnPropertyDescriptor:Dt,getOwnPropertyNames:zt,getOwnPropertySymbols:Bt,getPrototypeOf:Ht}=Object,C=globalThis,Je=C.trustedTypes,Wt=Je?Je.emptyScript:"",$e=C.reactiveElementPolyfillSupport,ee=(o,e)=>o,he={toAttribute(o,e){switch(e){case Boolean:o=o?Wt:null;break;case Object:case Array:o=o==null?o:JSON.stringify(o)}return o},fromAttribute(o,e){let t=o;switch(e){case Boolean:t=o!==null;break;case Number:t=o===null?null:Number(o);break;case Object:case Array:try{t=JSON.parse(o)}catch{t=null}}return t}},je=(o,e)=>!It(o,e),Qe={attribute:!0,type:String,converter:he,reflect:!1,useDefault:!1,hasChanged:je};Symbol.metadata??(Symbol.metadata=Symbol("metadata")),C.litPropertyMetadata??(C.litPropertyMetadata=new WeakMap);let M=class extends HTMLElement{static addInitializer(e){this._$Ei(),(this.l??(this.l=[])).push(e)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(e,t=Qe){if(t.state&&(t.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(e)&&((t=Object.create(t)).wrapped=!0),this.elementProperties.set(e,t),!t.noAccessor){const n=Symbol(),s=this.getPropertyDescriptor(e,n,t);s!==void 0&&Ft(this.prototype,e,s)}}static getPropertyDescriptor(e,t,n){const{get:s,set:r}=Dt(this.prototype,e)??{get(){return this[t]},set(i){this[t]=i}};return{get:s,set(i){const l=s==null?void 0:s.call(this);r==null||r.call(this,i),this.requestUpdate(e,l,n)},configurable:!0,enumerable:!0}}static getPropertyOptions(e){return this.elementProperties.get(e)??Qe}static _$Ei(){if(this.hasOwnProperty(ee("elementProperties")))return;const e=Ht(this);e.finalize(),e.l!==void 0&&(this.l=[...e.l]),this.elementProperties=new Map(e.elementProperties)}static finalize(){if(this.hasOwnProperty(ee("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(ee("properties"))){const t=this.properties,n=[...zt(t),...Bt(t)];for(const s of n)this.createProperty(s,t[s])}const e=this[Symbol.metadata];if(e!==null){const t=litPropertyMetadata.get(e);if(t!==void 0)for(const[n,s]of t)this.elementProperties.set(n,s)}this._$Eh=new Map;for(const[t,n]of this.elementProperties){const s=this._$Eu(t,n);s!==void 0&&this._$Eh.set(s,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(e){const t=[];if(Array.isArray(e)){const n=new Set(e.flat(1/0).reverse());for(const s of n)t.unshift(Ve(s))}else e!==void 0&&t.push(Ve(e));return t}static _$Eu(e,t){const n=t.attribute;return n===!1?void 0:typeof n=="string"?n:typeof e=="string"?e.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){var e;this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),(e=this.constructor.l)==null||e.forEach(t=>t(this))}addController(e){var t;(this._$EO??(this._$EO=new Set)).add(e),this.renderRoot!==void 0&&this.isConnected&&((t=e.hostConnected)==null||t.call(e))}removeController(e){var t;(t=this._$EO)==null||t.delete(e)}_$E_(){const e=new Map,t=this.constructor.elementProperties;for(const n of t.keys())this.hasOwnProperty(n)&&(e.set(n,this[n]),delete this[n]);e.size>0&&(this._$Ep=e)}createRenderRoot(){const e=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return Ut(e,this.constructor.elementStyles),e}connectedCallback(){var e;this.renderRoot??(this.renderRoot=this.createRenderRoot()),this.enableUpdating(!0),(e=this._$EO)==null||e.forEach(t=>{var n;return(n=t.hostConnected)==null?void 0:n.call(t)})}enableUpdating(e){}disconnectedCallback(){var e;(e=this._$EO)==null||e.forEach(t=>{var n;return(n=t.hostDisconnected)==null?void 0:n.call(t)})}attributeChangedCallback(e,t,n){this._$AK(e,n)}_$ET(e,t){var r;const n=this.constructor.elementProperties.get(e),s=this.constructor._$Eu(e,n);if(s!==void 0&&n.reflect===!0){const i=(((r=n.converter)==null?void 0:r.toAttribute)!==void 0?n.converter:he).toAttribute(t,n.type);this._$Em=e,i==null?this.removeAttribute(s):this.setAttribute(s,i),this._$Em=null}}_$AK(e,t){var r,i;const n=this.constructor,s=n._$Eh.get(e);if(s!==void 0&&this._$Em!==s){const l=n.getPropertyOptions(s),a=typeof l.converter=="function"?{fromAttribute:l.converter}:((r=l.converter)==null?void 0:r.fromAttribute)!==void 0?l.converter:he;this._$Em=s;const c=a.fromAttribute(t,l.type);this[s]=c??((i=this._$Ej)==null?void 0:i.get(s))??c,this._$Em=null}}requestUpdate(e,t,n,s=!1,r){var i;if(e!==void 0){const l=this.constructor;if(s===!1&&(r=this[e]),n??(n=l.getPropertyOptions(e)),!((n.hasChanged??je)(r,t)||n.useDefault&&n.reflect&&r===((i=this._$Ej)==null?void 0:i.get(e))&&!this.hasAttribute(l._$Eu(e,n))))return;this.C(e,t,n)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(e,t,{useDefault:n,reflect:s,wrapped:r},i){n&&!(this._$Ej??(this._$Ej=new Map)).has(e)&&(this._$Ej.set(e,i??t??this[e]),r!==!0||i!==void 0)||(this._$AL.has(e)||(this.hasUpdated||n||(t=void 0),this._$AL.set(e,t)),s===!0&&this._$Em!==e&&(this._$Eq??(this._$Eq=new Set)).add(e))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const e=this.scheduleUpdate();return e!=null&&await e,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){var n;if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??(this.renderRoot=this.createRenderRoot()),this._$Ep){for(const[r,i]of this._$Ep)this[r]=i;this._$Ep=void 0}const s=this.constructor.elementProperties;if(s.size>0)for(const[r,i]of s){const{wrapped:l}=i,a=this[r];l!==!0||this._$AL.has(r)||a===void 0||this.C(r,void 0,i,a)}}let e=!1;const t=this._$AL;try{e=this.shouldUpdate(t),e?(this.willUpdate(t),(n=this._$EO)==null||n.forEach(s=>{var r;return(r=s.hostUpdate)==null?void 0:r.call(s)}),this.update(t)):this._$EM()}catch(s){throw e=!1,this._$EM(),s}e&&this._$AE(t)}willUpdate(e){}_$AE(e){var t;(t=this._$EO)==null||t.forEach(n=>{var s;return(s=n.hostUpdated)==null?void 0:s.call(n)}),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(e)),this.updated(e)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(e){return!0}update(e){this._$Eq&&(this._$Eq=this._$Eq.forEach(t=>this._$ET(t,this[t]))),this._$EM()}updated(e){}firstUpdated(e){}};M.elementStyles=[],M.shadowRootOptions={mode:"open"},M[ee("elementProperties")]=new Map,M[ee("finalized")]=new Map,$e==null||$e({ReactiveElement:M}),(C.reactiveElementVersions??(C.reactiveElementVersions=[])).push("2.1.2");/**
10
+ * @license
11
+ * Copyright 2017 Google LLC
12
+ * SPDX-License-Identifier: BSD-3-Clause
13
+ */const te=globalThis,Ze=o=>o,fe=te.trustedTypes,Xe=fe?fe.createPolicy("lit-html",{createHTML:o=>o}):void 0,ut="$lit$",S=`lit$${Math.random().toFixed(9).slice(2)}$`,dt="?"+S,qt=`<${dt}>`,L=document,se=()=>L.createComment(""),re=o=>o===null||typeof o!="object"&&typeof o!="function",Te=Array.isArray,Gt=o=>Te(o)||typeof(o==null?void 0:o[Symbol.iterator])=="function",we=`[
14
+ \f\r]`,J=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,Ye=/-->/g,et=/>/g,O=RegExp(`>|${we}(?:([^\\s"'>=/]+)(${we}*=${we}*(?:[^
15
+ \f\r"'\`<>=]|("|')|))|$)`,"g"),tt=/'/g,nt=/"/g,pt=/^(?:script|style|textarea|title)$/i,Kt=o=>(e,...t)=>({_$litType$:o,strings:e,values:t}),m=Kt(1),H=Symbol.for("lit-noChange"),_=Symbol.for("lit-nothing"),st=new WeakMap,R=L.createTreeWalker(L,129);function ht(o,e){if(!Te(o)||!o.hasOwnProperty("raw"))throw Error("invalid template strings array");return Xe!==void 0?Xe.createHTML(e):e}const Vt=(o,e)=>{const t=o.length-1,n=[];let s,r=e===2?"<svg>":e===3?"<math>":"",i=J;for(let l=0;l<t;l++){const a=o[l];let c,d,u=-1,p=0;for(;p<a.length&&(i.lastIndex=p,d=i.exec(a),d!==null);)p=i.lastIndex,i===J?d[1]==="!--"?i=Ye:d[1]!==void 0?i=et:d[2]!==void 0?(pt.test(d[2])&&(s=RegExp("</"+d[2],"g")),i=O):d[3]!==void 0&&(i=O):i===O?d[0]===">"?(i=s??J,u=-1):d[1]===void 0?u=-2:(u=i.lastIndex-d[2].length,c=d[1],i=d[3]===void 0?O:d[3]==='"'?nt:tt):i===nt||i===tt?i=O:i===Ye||i===et?i=J:(i=O,s=void 0);const f=i===O&&o[l+1].startsWith("/>")?" ":"";r+=i===J?a+qt:u>=0?(n.push(c),a.slice(0,u)+ut+a.slice(u)+S+f):a+S+(u===-2?l:f)}return[ht(o,r+(o[t]||"<?>")+(e===2?"</svg>":e===3?"</math>":"")),n]};class oe{constructor({strings:e,_$litType$:t},n){let s;this.parts=[];let r=0,i=0;const l=e.length-1,a=this.parts,[c,d]=Vt(e,t);if(this.el=oe.createElement(c,n),R.currentNode=this.el.content,t===2||t===3){const u=this.el.content.firstChild;u.replaceWith(...u.childNodes)}for(;(s=R.nextNode())!==null&&a.length<l;){if(s.nodeType===1){if(s.hasAttributes())for(const u of s.getAttributeNames())if(u.endsWith(ut)){const p=d[i++],f=s.getAttribute(u).split(S),k=/([.?@])?(.*)/.exec(p);a.push({type:1,index:r,name:k[2],strings:f,ctor:k[1]==="."?Qt:k[1]==="?"?Zt:k[1]==="@"?Xt:_e}),s.removeAttribute(u)}else u.startsWith(S)&&(a.push({type:6,index:r}),s.removeAttribute(u));if(pt.test(s.tagName)){const u=s.textContent.split(S),p=u.length-1;if(p>0){s.textContent=fe?fe.emptyScript:"";for(let f=0;f<p;f++)s.append(u[f],se()),R.nextNode(),a.push({type:2,index:++r});s.append(u[p],se())}}}else if(s.nodeType===8)if(s.data===dt)a.push({type:2,index:r});else{let u=-1;for(;(u=s.data.indexOf(S,u+1))!==-1;)a.push({type:7,index:r}),u+=S.length-1}r++}}static createElement(e,t){const n=L.createElement("template");return n.innerHTML=e,n}}function W(o,e,t=o,n){var i,l;if(e===H)return e;let s=n!==void 0?(i=t._$Co)==null?void 0:i[n]:t._$Cl;const r=re(e)?void 0:e._$litDirective$;return(s==null?void 0:s.constructor)!==r&&((l=s==null?void 0:s._$AO)==null||l.call(s,!1),r===void 0?s=void 0:(s=new r(o),s._$AT(o,t,n)),n!==void 0?(t._$Co??(t._$Co=[]))[n]=s:t._$Cl=s),s!==void 0&&(e=W(o,s._$AS(o,e.values),s,n)),e}class Jt{constructor(e,t){this._$AV=[],this._$AN=void 0,this._$AD=e,this._$AM=t}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(e){const{el:{content:t},parts:n}=this._$AD,s=((e==null?void 0:e.creationScope)??L).importNode(t,!0);R.currentNode=s;let r=R.nextNode(),i=0,l=0,a=n[0];for(;a!==void 0;){if(i===a.index){let c;a.type===2?c=new le(r,r.nextSibling,this,e):a.type===1?c=new a.ctor(r,a.name,a.strings,this,e):a.type===6&&(c=new Yt(r,this,e)),this._$AV.push(c),a=n[++l]}i!==(a==null?void 0:a.index)&&(r=R.nextNode(),i++)}return R.currentNode=L,s}p(e){let t=0;for(const n of this._$AV)n!==void 0&&(n.strings!==void 0?(n._$AI(e,n,t),t+=n.strings.length-2):n._$AI(e[t])),t++}}class le{get _$AU(){var e;return((e=this._$AM)==null?void 0:e._$AU)??this._$Cv}constructor(e,t,n,s){this.type=2,this._$AH=_,this._$AN=void 0,this._$AA=e,this._$AB=t,this._$AM=n,this.options=s,this._$Cv=(s==null?void 0:s.isConnected)??!0}get parentNode(){let e=this._$AA.parentNode;const t=this._$AM;return t!==void 0&&(e==null?void 0:e.nodeType)===11&&(e=t.parentNode),e}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(e,t=this){e=W(this,e,t),re(e)?e===_||e==null||e===""?(this._$AH!==_&&this._$AR(),this._$AH=_):e!==this._$AH&&e!==H&&this._(e):e._$litType$!==void 0?this.$(e):e.nodeType!==void 0?this.T(e):Gt(e)?this.k(e):this._(e)}O(e){return this._$AA.parentNode.insertBefore(e,this._$AB)}T(e){this._$AH!==e&&(this._$AR(),this._$AH=this.O(e))}_(e){this._$AH!==_&&re(this._$AH)?this._$AA.nextSibling.data=e:this.T(L.createTextNode(e)),this._$AH=e}$(e){var r;const{values:t,_$litType$:n}=e,s=typeof n=="number"?this._$AC(e):(n.el===void 0&&(n.el=oe.createElement(ht(n.h,n.h[0]),this.options)),n);if(((r=this._$AH)==null?void 0:r._$AD)===s)this._$AH.p(t);else{const i=new Jt(s,this),l=i.u(this.options);i.p(t),this.T(l),this._$AH=i}}_$AC(e){let t=st.get(e.strings);return t===void 0&&st.set(e.strings,t=new oe(e)),t}k(e){Te(this._$AH)||(this._$AH=[],this._$AR());const t=this._$AH;let n,s=0;for(const r of e)s===t.length?t.push(n=new le(this.O(se()),this.O(se()),this,this.options)):n=t[s],n._$AI(r),s++;s<t.length&&(this._$AR(n&&n._$AB.nextSibling,s),t.length=s)}_$AR(e=this._$AA.nextSibling,t){var n;for((n=this._$AP)==null?void 0:n.call(this,!1,!0,t);e!==this._$AB;){const s=Ze(e).nextSibling;Ze(e).remove(),e=s}}setConnected(e){var t;this._$AM===void 0&&(this._$Cv=e,(t=this._$AP)==null||t.call(this,e))}}class _e{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(e,t,n,s,r){this.type=1,this._$AH=_,this._$AN=void 0,this.element=e,this.name=t,this._$AM=s,this.options=r,n.length>2||n[0]!==""||n[1]!==""?(this._$AH=Array(n.length-1).fill(new String),this.strings=n):this._$AH=_}_$AI(e,t=this,n,s){const r=this.strings;let i=!1;if(r===void 0)e=W(this,e,t,0),i=!re(e)||e!==this._$AH&&e!==H,i&&(this._$AH=e);else{const l=e;let a,c;for(e=r[0],a=0;a<r.length-1;a++)c=W(this,l[n+a],t,a),c===H&&(c=this._$AH[a]),i||(i=!re(c)||c!==this._$AH[a]),c===_?e=_:e!==_&&(e+=(c??"")+r[a+1]),this._$AH[a]=c}i&&!s&&this.j(e)}j(e){e===_?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,e??"")}}class Qt extends _e{constructor(){super(...arguments),this.type=3}j(e){this.element[this.name]=e===_?void 0:e}}class Zt extends _e{constructor(){super(...arguments),this.type=4}j(e){this.element.toggleAttribute(this.name,!!e&&e!==_)}}class Xt extends _e{constructor(e,t,n,s,r){super(e,t,n,s,r),this.type=5}_$AI(e,t=this){if((e=W(this,e,t,0)??_)===H)return;const n=this._$AH,s=e===_&&n!==_||e.capture!==n.capture||e.once!==n.once||e.passive!==n.passive,r=e!==_&&(n===_||s);s&&this.element.removeEventListener(this.name,this,n),r&&this.element.addEventListener(this.name,this,e),this._$AH=e}handleEvent(e){var t;typeof this._$AH=="function"?this._$AH.call(((t=this.options)==null?void 0:t.host)??this.element,e):this._$AH.handleEvent(e)}}class Yt{constructor(e,t,n){this.element=e,this.type=6,this._$AN=void 0,this._$AM=t,this.options=n}get _$AU(){return this._$AM._$AU}_$AI(e){W(this,e)}}const xe=te.litHtmlPolyfillSupport;xe==null||xe(oe,le),(te.litHtmlVersions??(te.litHtmlVersions=[])).push("3.3.3");const en=(o,e,t)=>{const n=(t==null?void 0:t.renderBefore)??e;let s=n._$litPart$;if(s===void 0){const r=(t==null?void 0:t.renderBefore)??null;n._$litPart$=s=new le(e.insertBefore(se(),r),r,void 0,t??{})}return s._$AI(o),s};/**
16
+ * @license
17
+ * Copyright 2017 Google LLC
18
+ * SPDX-License-Identifier: BSD-3-Clause
19
+ */const P=globalThis;class y extends M{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){var t;const e=super.createRenderRoot();return(t=this.renderOptions).renderBefore??(t.renderBefore=e.firstChild),e}update(e){const t=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(e),this._$Do=en(t,this.renderRoot,this.renderOptions)}connectedCallback(){var e;super.connectedCallback(),(e=this._$Do)==null||e.setConnected(!0)}disconnectedCallback(){var e;super.disconnectedCallback(),(e=this._$Do)==null||e.setConnected(!1)}render(){return H}}var at;y._$litElement$=!0,y.finalized=!0,(at=P.litElementHydrateSupport)==null||at.call(P,{LitElement:y});const Ae=P.litElementPolyfillSupport;Ae==null||Ae({LitElement:y});(P.litElementVersions??(P.litElementVersions=[])).push("4.2.2");/**
20
+ * @license
21
+ * Copyright 2017 Google LLC
22
+ * SPDX-License-Identifier: BSD-3-Clause
23
+ */const x=o=>(e,t)=>{t!==void 0?t.addInitializer(()=>{customElements.define(o,e)}):customElements.define(o,e)};/**
24
+ * @license
25
+ * Copyright 2017 Google LLC
26
+ * SPDX-License-Identifier: BSD-3-Clause
27
+ */const tn={attribute:!0,type:String,converter:he,reflect:!1,hasChanged:je},nn=(o=tn,e,t)=>{const{kind:n,metadata:s}=t;let r=globalThis.litPropertyMetadata.get(s);if(r===void 0&&globalThis.litPropertyMetadata.set(s,r=new Map),n==="setter"&&((o=Object.create(o)).wrapped=!0),r.set(t.name,o),n==="accessor"){const{name:i}=t;return{set(l){const a=e.get.call(this);e.set.call(this,l),this.requestUpdate(i,a,o,!0,l)},init(l){return l!==void 0&&this.C(i,void 0,o,l),l}}}if(n==="setter"){const{name:i}=t;return function(l){const a=this[i];e.call(this,l),this.requestUpdate(i,a,o,!0,l)}}throw Error("Unsupported decorator location: "+n)};function v(o){return(e,t)=>typeof t=="object"?nn(o,e,t):((n,s,r)=>{const i=s.hasOwnProperty(r);return s.constructor.createProperty(r,n),i?Object.getOwnPropertyDescriptor(s,r):void 0})(o,e,t)}/**
28
+ * @license
29
+ * Copyright 2017 Google LLC
30
+ * SPDX-License-Identifier: BSD-3-Clause
31
+ */function ae(o){return v({...o,state:!0,attribute:!1})}var ft=function(o,e,t,n){var s=arguments.length,r=s<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,i;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var l=o.length-1;l>=0;l--)(i=o[l])&&(r=(s<3?i(r):s>3?i(e,t,r):i(e,t))||r);return s>3&&r&&Object.defineProperty(e,t,r),r},N;let Ee=(N=class extends y{constructor(){super(...arguments),this.isRecording=!1,this.start=()=>this.dispatchEvent(new CustomEvent("rld-start",{bubbles:!0,composed:!0})),this.stop=()=>this.dispatchEvent(new CustomEvent("rld-stop",{bubbles:!0,composed:!0})),this.mark=()=>this.dispatchEvent(new CustomEvent("rld-mark",{bubbles:!0,composed:!0}))}render(){return this.isRecording?m`
32
+ <button data-action="stop" data-recording @click=${this.stop}>■ Stop</button>
33
+ <button data-action="mark" @click=${this.mark}>Mark Navigation</button>
34
+ `:m`<button data-action="start" @click=${this.start}>● Record</button>`}},N.styles=w`
35
+ :host { display: flex; gap: 6px; align-items: center; padding: 4px 0; }
36
+ button { background: #3c4043; color: #e8eaed; border: 1px solid #5f6368; padding: 4px 10px; cursor: pointer; font: inherit; }
37
+ button[data-recording] { background: #f28b82; color: #202124; }
38
+ `,N);ft([v({type:Boolean})],Ee.prototype,"isRecording",void 0);Ee=ft([x("record-controls")],Ee);var mt=function(o,e,t,n){var s=arguments.length,r=s<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,i;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var l=o.length-1;l>=0;l--)(i=o[l])&&(r=(s<3?i(r):s>3?i(e,t,r):i(e,t))||r);return s>3&&r&&Object.defineProperty(e,t,r),r},j;let ke=(j=class extends y{constructor(){super(...arguments),this.open=e=>{e.stopPropagation(),this.dispatchEvent(new CustomEvent("rld-open-source",{detail:{file:this.frame.file,line:this.frame.line,column:this.frame.column},bubbles:!0,composed:!0}))}}render(){const e=this.frame.functionName??"<anon>";return m`<div class=${this.frame.isFramework?"framework":""}>
39
+ ${e} @ <a @click=${this.open}>${sn(this.frame.file)}:${this.frame.line}</a>
40
+ </div>`}},j.styles=w`
41
+ :host { display: block; padding: 2px 6px; font-family: inherit; }
42
+ .framework { color: #9aa0a6; }
43
+ a { color: #8ab4f8; cursor: pointer; text-decoration: none; }
44
+ a:hover { text-decoration: underline; }
45
+ `,j);mt([v({type:Object})],ke.prototype,"frame",void 0);ke=mt([x("stack-frame")],ke);function sn(o){return o.split("/").pop()??o}var gt=function(o,e,t,n){var s=arguments.length,r=s<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,i;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var l=o.length-1;l>=0;l--)(i=o[l])&&(r=(s<3?i(r):s>3?i(e,t,r):i(e,t))||r);return s>3&&r&&Object.defineProperty(e,t,r),r},T;let Oe=(T=class extends y{render(){return m`
46
+ <div class="section">
47
+ <h4>Observable</h4>
48
+ ${this.leak.observableKind}
49
+ </div>
50
+ <div class="section">
51
+ <h4>Stack</h4>
52
+ ${this.leak.stack.map(e=>m`<stack-frame .frame=${e}></stack-frame>`)}
53
+ </div>
54
+ ${this.leak.retainerChain.length>0?m`
55
+ <div class="section">
56
+ <h4>Retainer chain</h4>
57
+ <div class="retainer">
58
+ ${this.leak.retainerChain.map(e=>m`<span>${e.constructorName}</span>`)}
59
+ </div>
60
+ </div>
61
+ `:""}
62
+ `}},T.styles=w`
63
+ :host { display: block; padding: 8px; background: #1f1f1f; border-left: 2px solid #8ab4f8; }
64
+ h4 { margin: 0 0 4px; font-size: 11px; color: #9aa0a6; text-transform: uppercase; }
65
+ .section { margin-bottom: 10px; }
66
+ .retainer { color: #e8eaed; }
67
+ .retainer span + span::before { content: ' → '; color: #9aa0a6; }
68
+ `,T);gt([v({type:Object})],Oe.prototype,"leak",void 0);Oe=gt([x("leak-detail")],Oe);var Ue=function(o,e,t,n){var s=arguments.length,r=s<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,i;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var l=o.length-1;l>=0;l--)(i=o[l])&&(r=(s<3?i(r):s>3?i(e,t,r):i(e,t))||r);return s>3&&r&&Object.defineProperty(e,t,r),r},U;let me=(U=class extends y{constructor(){super(...arguments),this.expanded=!1,this.toggle=()=>{this.expanded=!this.expanded},this.openSource=e=>{e.stopPropagation();const t=this.leak.sourceLocation;this.dispatchEvent(new CustomEvent("rld-open-source",{detail:{file:t.file,line:t.line,column:t.column},bubbles:!0,composed:!0}))}}render(){const e=this.leak.sourceLocation,t=e.file.split("/").pop(),n=this.leak.leakKind??"unknown";return m`
69
+ <div>
70
+ <div class="summary" @click=${this.toggle}>
71
+ <span class="caret">${this.expanded?"▼":"▶"}</span>
72
+ <div class="main">
73
+ <div class="top">
74
+ ${this.leak.componentName?m`<span class="component">${this.leak.componentName}</span>`:m`<span class="no-component">(no component)</span>`}
75
+ <span class="obs-kind">${this.leak.observableKind}</span>
76
+ </div>
77
+ <div class="file" title="Open ${e.file}:${e.line} in editor" @click=${this.openSource}>${t}:${e.line}:${e.column}</div>
78
+ </div>
79
+ <span class="badge route" title="Route at subscribe time">${this.leak.route||"/"}</span>
80
+ <span class="badge leak-kind ${n}">${n}</span>
81
+ </div>
82
+ ${this.expanded?m`<leak-detail .leak=${this.leak}></leak-detail>`:""}
83
+ </div>
84
+ `}},U.styles=w`
85
+ :host { display: block; border-bottom: 1px solid #3c4043; }
86
+ .summary {
87
+ padding: 8px 10px;
88
+ cursor: pointer;
89
+ display: grid;
90
+ grid-template-columns: auto 1fr auto auto auto;
91
+ gap: 10px;
92
+ align-items: center;
93
+ }
94
+ .summary:hover { background: #3c4043; }
95
+ .caret { color: #9aa0a6; font-size: 10px; width: 10px; }
96
+ .main { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
97
+ .top { display: flex; gap: 8px; align-items: center; min-width: 0; }
98
+ .component { color: #e8eaed; font-weight: 600; white-space: nowrap; }
99
+ .no-component { color: #9aa0a6; font-style: italic; }
100
+ .file { color: #8ab4f8; font-size: 11px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; }
101
+ .file:hover { text-decoration: underline; }
102
+ .obs-kind { color: #9aa0a6; font-style: italic; font-size: 11px; }
103
+ .badge {
104
+ font-size: 10px;
105
+ padding: 1px 7px;
106
+ border-radius: 8px;
107
+ background: #5f6368;
108
+ color: #fff;
109
+ white-space: nowrap;
110
+ }
111
+ .route { background: #3c4043; color: #aecbfa; border: 1px solid #5f6368; }
112
+ .leak-kind { font-weight: 600; }
113
+ .leak-kind.nested-subscribe { background: #c5221f; }
114
+ .leak-kind.async-init { background: #b06000; }
115
+ .leak-kind.ng-init { background: #1a73e8; }
116
+ .leak-kind.global-event { background: #9334e6; }
117
+ .leak-kind.timer { background: #188038; }
118
+ .leak-kind.subject { background: #0b8043; }
119
+ .leak-kind.unknown { background: #5f6368; }
120
+ `,U);Ue([v({type:Object})],me.prototype,"leak",void 0);Ue([ae()],me.prototype,"expanded",void 0);me=Ue([x("leak-row")],me);var ce=function(o,e,t,n){var s=arguments.length,r=s<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,i;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var l=o.length-1;l>=0;l--)(i=o[l])&&(r=(s<3?i(r):s>3?i(e,t,r):i(e,t))||r);return s>3&&r&&Object.defineProperty(e,t,r),r},I;let q=(I=class extends y{constructor(){super(...arguments),this.leaks=[],this.query="",this.kindFilter=null,this.routeFilter=null,this.onSearch=e=>{this.query=e.target.value.trim().toLowerCase()},this.clear=()=>{this.query="",this.kindFilter=null,this.routeFilter=null}}tally(e){const t=new Map;for(const n of this.leaks){const s=e(n);s&&t.set(s,(t.get(s)??0)+1)}return[...t.entries()].sort((n,s)=>s[1]-n[1])}toggleKind(e){this.kindFilter=this.kindFilter===e?null:e}toggleRoute(e){this.routeFilter=this.routeFilter===e?null:e}filtered(){const e=this.query;return this.leaks.filter(t=>this.kindFilter&&(t.leakKind??"unknown")!==this.kindFilter||this.routeFilter&&t.route!==this.routeFilter?!1:e?[t.componentName??"",t.observableKind,t.route,t.sourceLocation.file,t.leakKind??""].join(" ").toLowerCase().includes(e):!0)}render(){const e=this.tally(r=>r.leakKind??"unknown"),t=this.tally(r=>r.route),n=this.filtered(),s=this.query!==""||this.kindFilter!==null||this.routeFilter!==null;return m`
121
+ <div class="toolbar">
122
+ <input
123
+ class="search"
124
+ type="search"
125
+ placeholder="Search component, file, route, kind…"
126
+ .value=${this.query}
127
+ @input=${this.onSearch}
128
+ />
129
+ ${s?m`<span class="chip" @click=${this.clear} title="Clear filters">✕ clear</span>`:""}
130
+ </div>
131
+ ${e.length>1?m`
132
+ <div class="toolbar">
133
+ <span style="color:#9aa0a6;font-size:11px">Kind:</span>
134
+ <div class="chips">
135
+ ${e.map(([r,i])=>m`
136
+ <span
137
+ class="chip ${this.kindFilter===r?"active":""}"
138
+ @click=${()=>this.toggleKind(r)}
139
+ >${r}<span class="n">${i}</span></span>
140
+ `)}
141
+ </div>
142
+ </div>
143
+ `:""}
144
+ ${t.length>1?m`
145
+ <div class="toolbar">
146
+ <span style="color:#9aa0a6;font-size:11px">Route:</span>
147
+ <div class="chips">
148
+ ${t.map(([r,i])=>m`
149
+ <span
150
+ class="chip ${this.routeFilter===r?"active":""}"
151
+ @click=${()=>this.toggleRoute(r)}
152
+ >${r||"/"}<span class="n">${i}</span></span>
153
+ `)}
154
+ </div>
155
+ </div>
156
+ `:""}
157
+ <div class="results-meta">
158
+ Showing ${n.length} of ${this.leaks.length}
159
+ </div>
160
+ ${n.length===0?m`<div class="none">No matches.</div>`:m`<div>${n.map(r=>m`<leak-row .leak=${r}></leak-row>`)}</div>`}
161
+ `}},I.styles=w`
162
+ :host { display: block; margin-top: 4px; }
163
+ .toolbar {
164
+ display: flex;
165
+ flex-wrap: wrap;
166
+ gap: 6px;
167
+ align-items: center;
168
+ padding: 6px 0;
169
+ border-bottom: 1px solid #3c4043;
170
+ }
171
+ input.search {
172
+ flex: 1 1 220px;
173
+ min-width: 200px;
174
+ background: #2d2e30;
175
+ color: #e8eaed;
176
+ border: 1px solid #3c4043;
177
+ border-radius: 4px;
178
+ padding: 4px 8px;
179
+ font: inherit;
180
+ outline: none;
181
+ }
182
+ input.search:focus { border-color: #8ab4f8; }
183
+ .chips { display: flex; gap: 4px; flex-wrap: wrap; }
184
+ .chip {
185
+ background: #3c4043;
186
+ color: #e8eaed;
187
+ border-radius: 12px;
188
+ padding: 2px 9px;
189
+ font-size: 11px;
190
+ cursor: pointer;
191
+ user-select: none;
192
+ border: 1px solid transparent;
193
+ }
194
+ .chip:hover { background: #4a4d51; }
195
+ .chip.active {
196
+ background: #8ab4f8;
197
+ color: #202124;
198
+ border-color: #8ab4f8;
199
+ }
200
+ .chip .n { opacity: 0.8; margin-left: 4px; }
201
+ .results-meta {
202
+ color: #9aa0a6;
203
+ font-size: 11px;
204
+ padding: 6px 0;
205
+ }
206
+ .group { margin-top: 10px; }
207
+ .group-header {
208
+ font-size: 11px;
209
+ color: #9aa0a6;
210
+ text-transform: uppercase;
211
+ letter-spacing: 0.5px;
212
+ padding: 6px 8px;
213
+ background: #2d2e30;
214
+ border-radius: 4px 4px 0 0;
215
+ }
216
+ .none { color: #5f6368; padding: 12px 8px; font-style: italic; }
217
+ `,I);ce([v({type:Array})],q.prototype,"leaks",void 0);ce([ae()],q.prototype,"query",void 0);ce([ae()],q.prototype,"kindFilter",void 0);ce([ae()],q.prototype,"routeFilter",void 0);q=ce([x("leak-list")],q);var _t=function(o,e,t,n){var s=arguments.length,r=s<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,i;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var l=o.length-1;l>=0;l--)(i=o[l])&&(r=(s<3?i(r):s>3?i(e,t,r):i(e,t))||r);return s>3&&r&&Object.defineProperty(e,t,r),r};function Se(o,e){const t=new Map;for(const n of o){const s=e(n);s&&t.set(s,(t.get(s)??0)+1)}return[...t.entries()].sort((n,s)=>s[1]-n[1])}var F;let Re=(F=class extends y{constructor(){super(...arguments),this.report=null}renderBreakdown(e,t){return m`
218
+ <div class="block">
219
+ <h4>${e}</h4>
220
+ ${t.length===0?m`<div class="empty">none</div>`:t.slice(0,6).map(([n,s])=>m`
221
+ <div class="row">
222
+ <span class="name" title="${n}">${n}</span>
223
+ <span class="count">${s}</span>
224
+ </div>
225
+ `)}
226
+ </div>
227
+ `}render(){if(!this.report)return m``;const e=this.report,t=Se(e.leaks,i=>i.leakKind??"unknown"),n=Se(e.leaks,i=>i.route),s=Se(e.leaks,i=>i.componentName),r=e.leaks.length===0;return m`
228
+ <div class="kpis">
229
+ <div class="kpi ${r?"clean":"leaks"}">
230
+ <span class="value">${e.leaks.length}</span>
231
+ <span class="label">${r?"no leaks":e.leaks.length===1?"leak":"leaks"}</span>
232
+ </div>
233
+ <div class="kpi">
234
+ <span class="value">${e.totalSubscriptionsScanned}</span>
235
+ <span class="label">scanned</span>
236
+ </div>
237
+ <div class="kpi">
238
+ <span class="value">${e.ignoredFrameworkSubscriptions}</span>
239
+ <span class="label">framework</span>
240
+ </div>
241
+ <div class="kpi">
242
+ <span class="value">${e.longLivedServiceSubscriptions.length}</span>
243
+ <span class="label">long-lived</span>
244
+ </div>
245
+ </div>
246
+ <div class="breakdowns">
247
+ ${this.renderBreakdown("By kind",t)}
248
+ ${this.renderBreakdown("By route",n)}
249
+ ${this.renderBreakdown("By component",s)}
250
+ </div>
251
+ `}},F.styles=w`
252
+ :host {
253
+ display: block;
254
+ padding: 8px 0 12px;
255
+ color: #e8eaed;
256
+ }
257
+ .kpis {
258
+ display: grid;
259
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
260
+ gap: 8px;
261
+ margin-bottom: 10px;
262
+ }
263
+ .kpi {
264
+ background: #3c4043;
265
+ border-radius: 6px;
266
+ padding: 8px 10px;
267
+ display: flex;
268
+ flex-direction: column;
269
+ gap: 2px;
270
+ }
271
+ .kpi .value { font-size: 20px; font-weight: 600; }
272
+ .kpi .label { font-size: 11px; color: #9aa0a6; text-transform: uppercase; letter-spacing: 0.5px; }
273
+ .kpi.leaks .value { color: #f28b82; }
274
+ .kpi.clean .value { color: #81c995; }
275
+
276
+ .breakdowns {
277
+ display: grid;
278
+ grid-template-columns: 1fr 1fr 1fr;
279
+ gap: 10px;
280
+ }
281
+ @media (max-width: 720px) {
282
+ .breakdowns { grid-template-columns: 1fr; }
283
+ }
284
+ .block {
285
+ background: #2d2e30;
286
+ border: 1px solid #3c4043;
287
+ border-radius: 6px;
288
+ padding: 8px;
289
+ }
290
+ .block h4 {
291
+ margin: 0 0 6px;
292
+ font-size: 11px;
293
+ color: #9aa0a6;
294
+ text-transform: uppercase;
295
+ letter-spacing: 0.5px;
296
+ }
297
+ .row {
298
+ display: flex;
299
+ justify-content: space-between;
300
+ align-items: center;
301
+ padding: 3px 0;
302
+ font-size: 12px;
303
+ }
304
+ .name { color: #e8eaed; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
305
+ .count {
306
+ background: #5f6368;
307
+ color: #fff;
308
+ border-radius: 9px;
309
+ padding: 1px 8px;
310
+ font-size: 11px;
311
+ font-weight: 600;
312
+ min-width: 22px;
313
+ text-align: center;
314
+ }
315
+ .empty { color: #5f6368; font-style: italic; font-size: 12px; }
316
+ `,F);_t([v({type:Object})],Re.prototype,"report",void 0);Re=_t([x("leak-summary")],Re);var Ie=function(o,e,t,n){var s=arguments.length,r=s<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,i;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var l=o.length-1;l>=0;l--)(i=o[l])&&(r=(s<3?i(r):s>3?i(e,t,r):i(e,t))||r);return s>3&&r&&Object.defineProperty(e,t,r),r},D;let ge=(D=class extends y{constructor(){super(...arguments),this.entries=[],this.expanded=!1}render(){return this.entries.length===0?m``:m`
317
+ <div>
318
+ <h3 @click=${()=>{this.expanded=!this.expanded}}>
319
+ ${this.expanded?"▼":"▶"} ${this.entries.length} long-lived (not leaks)
320
+ </h3>
321
+ ${this.expanded?m`<div>${this.entries.map(e=>m`
322
+ <div class="row">${e.componentName??"(unknown)"} · ${e.observableKind}</div>
323
+ `)}</div>`:""}
324
+ </div>
325
+ `}},D.styles=w`
326
+ :host { display: block; margin-top: 16px; border-top: 1px solid #3c4043; }
327
+ h3 { font-size: 11px; color: #9aa0a6; cursor: pointer; padding: 6px 0; margin: 0; }
328
+ .row { padding: 4px 8px; color: #e8eaed; }
329
+ `,D);Ie([v({type:Array})],ge.prototype,"entries",void 0);Ie([ae()],ge.prototype,"expanded",void 0);ge=Ie([x("long-lived-section")],ge);var bt=function(o,e,t,n){var s=arguments.length,r=s<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,i;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var l=o.length-1;l>=0;l--)(i=o[l])&&(r=(s<3?i(r):s>3?i(e,t,r):i(e,t))||r);return s>3&&r&&Object.defineProperty(e,t,r),r},z;let Pe=(z=class extends y{constructor(){super(...arguments),this.message="Click Record, navigate to a different page in your app, then Stop."}render(){return m`<div>${this.message}</div>`}},z.styles=w`
330
+ :host { display: block; padding: 40px 20px; text-align: center; color: #9aa0a6; }
331
+ `,z);bt([v()],Pe.prototype,"message",void 0);Pe=bt([x("empty-state")],Pe);var ue=function(o,e,t,n){var s=arguments.length,r=s<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,i;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var l=o.length-1;l>=0;l--)(i=o[l])&&(r=(s<3?i(r):s>3?i(e,t,r):i(e,t))||r);return s>3&&r&&Object.defineProperty(e,t,r),r},B;let G=(B=class extends y{constructor(){super(...arguments),this.report=null,this.isRecording=!1,this.error=null,this.progressPhase=null}renderProgress(){return this.progressPhase?m`<div class="progress">${{capturing:"Capturing heap snapshot…","fetching-maps":"Fetching source maps…",analyzing:"Analyzing…"}[this.progressPhase]}</div>`:""}render(){return m`
332
+ <div>
333
+ <record-controls .isRecording=${this.isRecording}></record-controls>
334
+ ${this.error?m`<div class="error">${this.error}</div>`:""}
335
+ ${this.renderProgress()}
336
+ ${this.report?m`
337
+ <div>
338
+ <leak-summary .report=${this.report}></leak-summary>
339
+ ${this.report.leaks.length===0?m`<empty-state message="No leaks detected ✓"></empty-state>`:m`<leak-list .leaks=${this.report.leaks}></leak-list>`}
340
+ <long-lived-section .entries=${this.report.longLivedServiceSubscriptions}></long-lived-section>
341
+ </div>
342
+ `:m`<empty-state></empty-state>`}
343
+ </div>
344
+ `}},B.styles=w`
345
+ :host { display: block; padding: 8px; font: 12px monospace; color: #e8eaed; background: #2b2b2b; min-height: 100vh; }
346
+ .error { color: #f28b82; padding: 8px; border: 1px solid #f28b82; margin: 8px 0; }
347
+ .progress { color: #8ab4f8; padding: 8px; }
348
+ `,B);ue([v({type:Object})],G.prototype,"report",void 0);ue([v({type:Boolean})],G.prototype,"isRecording",void 0);ue([v()],G.prototype,"error",void 0);ue([v()],G.prototype,"progressPhase",void 0);G=ue([x("leak-detector-root")],G);function rn(o){if(o.__esModule)return o;var e=o.default;if(typeof e=="function"){var t=function n(){return this instanceof n?Reflect.construct(e,arguments,this.constructor):e.apply(this,arguments)};t.prototype=e.prototype}else t={};return Object.defineProperty(t,"__esModule",{value:!0}),Object.keys(o).forEach(function(n){var s=Object.getOwnPropertyDescriptor(o,n);Object.defineProperty(t,n,s.get?s:{enumerable:!0,get:function(){return o[n]}})}),t}var yt={},vt={};const rt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");vt.encode=function(o){if(0<=o&&o<rt.length)return rt[o];throw new TypeError("Must be between 0 and 63: "+o)};const on=vt,$t=5,wt=1<<$t,ln=wt-1,an=wt;function cn(o){return o<0?(-o<<1)+1:(o<<1)+0}yt.encode=function(e){let t="",n,s=cn(e);do n=s&ln,s>>>=$t,s>0&&(n|=an),t+=on.encode(n);while(s>0);return t};var $={};const un={},dn=Object.freeze(Object.defineProperty({__proto__:null,default:un},Symbol.toStringTag,{value:"Module"})),pn=rn(dn);var hn=typeof URL=="function"?URL:pn.URL;const E=hn;function fn(o,e,t){if(e in o)return o[e];if(arguments.length===3)return t;throw new Error('"'+e+'" is a required argument.')}$.getArg=fn;const xt=function(){return!("__proto__"in Object.create(null))}();function At(o){return o}function mn(o){return St(o)?"$"+o:o}$.toSetString=xt?At:mn;function gn(o){return St(o)?o.slice(1):o}$.fromSetString=xt?At:gn;function St(o){if(!o)return!1;const e=o.length;if(e<9||o.charCodeAt(e-1)!==95||o.charCodeAt(e-2)!==95||o.charCodeAt(e-3)!==111||o.charCodeAt(e-4)!==116||o.charCodeAt(e-5)!==111||o.charCodeAt(e-6)!==114||o.charCodeAt(e-7)!==112||o.charCodeAt(e-8)!==95||o.charCodeAt(e-9)!==95)return!1;for(let t=e-10;t>=0;t--)if(o.charCodeAt(t)!==36)return!1;return!0}function ot(o,e){return o===e?0:o===null?1:e===null?-1:o>e?1:-1}function _n(o,e){let t=o.generatedLine-e.generatedLine;return t!==0||(t=o.generatedColumn-e.generatedColumn,t!==0)||(t=ot(o.source,e.source),t!==0)||(t=o.originalLine-e.originalLine,t!==0)||(t=o.originalColumn-e.originalColumn,t!==0)?t:ot(o.name,e.name)}$.compareByGeneratedPositionsInflated=_n;function bn(o){return JSON.parse(o.replace(/^\)]}'[^\n]*\n/,""))}$.parseSourceMapInput=bn;const Fe="http:",ne=`${Fe}//host`;function De(o){return e=>{const t=K(e),n=ze(e),s=new E(e,n);o(s);const r=s.toString();return t==="absolute"?r:t==="scheme-relative"?r.slice(Fe.length):t==="path-absolute"?r.slice(ne.length):Be(n,r)}}function A(o,e){return new E(o,e).toString()}function yn(o,e){let t=0;do{const n=o+t++;if(e.indexOf(n)===-1)return n}while(!0)}function ze(o){const e=o.split("..").length-1,t=yn("p",o);let n=`${ne}/`;for(let s=0;s<e;s++)n+=`${t}/`;return n}const vn=/^[A-Za-z0-9\+\-\.]+:/;function K(o){return o[0]==="/"?o[1]==="/"?"scheme-relative":"path-absolute":vn.test(o)?"absolute":"path-relative"}function Be(o,e){typeof o=="string"&&(o=new E(o)),typeof e=="string"&&(e=new E(e));const t=e.pathname.split("/"),n=o.pathname.split("/");for(n.length>0&&!n[n.length-1]&&n.pop();t.length>0&&n.length>0&&t[0]===n[0];)t.shift(),n.shift();return n.map(()=>"..").concat(t).join("/")+e.search+e.hash}const $n=De(o=>{o.pathname=o.pathname.replace(/\/?$/,"/")}),wn=De(o=>{o.href=new E(".",o.toString()).toString()}),ie=De(o=>{});$.normalize=ie;function Le(o,e){const t=K(e),n=K(o);if(o=$n(o),t==="absolute")return A(e,void 0);if(n==="absolute")return A(e,o);if(t==="scheme-relative")return ie(e);if(n==="scheme-relative")return A(e,A(o,ne)).slice(Fe.length);if(t==="path-absolute")return ie(e);if(n==="path-absolute")return A(e,A(o,ne)).slice(ne.length);const s=ze(e+o),r=A(e,A(o,s));return Be(s,r)}$.join=Le;function xn(o,e){const t=An(o,e);return typeof t=="string"?t:ie(e)}$.relative=xn;function An(o,e){if(K(o)!==K(e))return null;const n=ze(o+e),s=new E(o,n),r=new E(e,n);try{new E("",r.toString())}catch{return null}return r.protocol!==s.protocol||r.user!==s.user||r.password!==s.password||r.hostname!==s.hostname||r.port!==s.port?null:Be(s,r)}function Sn(o,e,t){o&&K(e)==="path-absolute"&&(e=e.replace(/^\//,""));let n=ie(e||"");return o&&(n=Le(o,n)),t&&(n=Le(wn(t),n)),n}$.computeSourceURL=Sn;var He={};let Cn=class Ct{constructor(){this._array=[],this._set=new Map}static fromArray(e,t){const n=new Ct;for(let s=0,r=e.length;s<r;s++)n.add(e[s],t);return n}size(){return this._set.size}add(e,t){const n=this.has(e),s=this._array.length;(!n||t)&&this._array.push(e),n||this._set.set(e,s)}has(e){return this._set.has(e)}indexOf(e){const t=this._set.get(e);if(t>=0)return t;throw new Error('"'+e+'" is not in the set.')}at(e){if(e>=0&&e<this._array.length)return this._array[e];throw new Error("No element indexed by "+e)}toArray(){return this._array.slice()}};He.ArraySet=Cn;var Et={};const kt=$;function En(o,e){const t=o.generatedLine,n=e.generatedLine,s=o.generatedColumn,r=e.generatedColumn;return n>t||n==t&&r>=s||kt.compareByGeneratedPositionsInflated(o,e)<=0}let kn=class{constructor(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0}}unsortedForEach(e,t){this._array.forEach(e,t)}add(e){En(this._last,e)?(this._last=e,this._array.push(e)):(this._sorted=!1,this._array.push(e))}toArray(){return this._sorted||(this._array.sort(kt.compareByGeneratedPositionsInflated),this._sorted=!0),this._array}};Et.MappingList=kn;const Q=yt,g=$,de=He.ArraySet,On=Et.MappingList;class We{constructor(e){e||(e={}),this._file=g.getArg(e,"file",null),this._sourceRoot=g.getArg(e,"sourceRoot",null),this._skipValidation=g.getArg(e,"skipValidation",!1),this._sources=new de,this._names=new de,this._mappings=new On,this._sourcesContents=null}static fromSourceMap(e){const t=e.sourceRoot,n=new We({file:e.file,sourceRoot:t});return e.eachMapping(function(s){const r={generated:{line:s.generatedLine,column:s.generatedColumn}};s.source!=null&&(r.source=s.source,t!=null&&(r.source=g.relative(t,r.source)),r.original={line:s.originalLine,column:s.originalColumn},s.name!=null&&(r.name=s.name)),n.addMapping(r)}),e.sources.forEach(function(s){let r=s;t!=null&&(r=g.relative(t,s)),n._sources.has(r)||n._sources.add(r);const i=e.sourceContentFor(s);i!=null&&n.setSourceContent(s,i)}),n}addMapping(e){const t=g.getArg(e,"generated"),n=g.getArg(e,"original",null);let s=g.getArg(e,"source",null),r=g.getArg(e,"name",null);this._skipValidation||this._validateMapping(t,n,s,r),s!=null&&(s=String(s),this._sources.has(s)||this._sources.add(s)),r!=null&&(r=String(r),this._names.has(r)||this._names.add(r)),this._mappings.add({generatedLine:t.line,generatedColumn:t.column,originalLine:n&&n.line,originalColumn:n&&n.column,source:s,name:r})}setSourceContent(e,t){let n=e;this._sourceRoot!=null&&(n=g.relative(this._sourceRoot,n)),t!=null?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[g.toSetString(n)]=t):this._sourcesContents&&(delete this._sourcesContents[g.toSetString(n)],Object.keys(this._sourcesContents).length===0&&(this._sourcesContents=null))}applySourceMap(e,t,n){let s=t;if(t==null){if(e.file==null)throw new Error(`SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map's "file" property. Both were omitted.`);s=e.file}const r=this._sourceRoot;r!=null&&(s=g.relative(r,s));const i=this._mappings.toArray().length>0?new de:this._sources,l=new de;this._mappings.unsortedForEach(function(a){if(a.source===s&&a.originalLine!=null){const u=e.originalPositionFor({line:a.originalLine,column:a.originalColumn});u.source!=null&&(a.source=u.source,n!=null&&(a.source=g.join(n,a.source)),r!=null&&(a.source=g.relative(r,a.source)),a.originalLine=u.line,a.originalColumn=u.column,u.name!=null&&(a.name=u.name))}const c=a.source;c!=null&&!i.has(c)&&i.add(c);const d=a.name;d!=null&&!l.has(d)&&l.add(d)},this),this._sources=i,this._names=l,e.sources.forEach(function(a){const c=e.sourceContentFor(a);c!=null&&(n!=null&&(a=g.join(n,a)),r!=null&&(a=g.relative(r,a)),this.setSourceContent(a,c))},this)}_validateMapping(e,t,n,s){if(t&&typeof t.line!="number"&&typeof t.column!="number")throw new Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if(!(e&&"line"in e&&"column"in e&&e.line>0&&e.column>=0&&!t&&!n&&!s)){if(!(e&&"line"in e&&"column"in e&&t&&"line"in t&&"column"in t&&e.line>0&&e.column>=0&&t.line>0&&t.column>=0&&n))throw new Error("Invalid mapping: "+JSON.stringify({generated:e,source:n,original:t,name:s}))}}_serializeMappings(){let e=0,t=1,n=0,s=0,r=0,i=0,l="",a,c,d,u;const p=this._mappings.toArray();for(let f=0,k=p.length;f<k;f++){if(c=p[f],a="",c.generatedLine!==t)for(e=0;c.generatedLine!==t;)a+=";",t++;else if(f>0){if(!g.compareByGeneratedPositionsInflated(c,p[f-1]))continue;a+=","}a+=Q.encode(c.generatedColumn-e),e=c.generatedColumn,c.source!=null&&(u=this._sources.indexOf(c.source),a+=Q.encode(u-i),i=u,a+=Q.encode(c.originalLine-1-s),s=c.originalLine-1,a+=Q.encode(c.originalColumn-n),n=c.originalColumn,c.name!=null&&(d=this._names.indexOf(c.name),a+=Q.encode(d-r),r=d)),l+=a}return l}_generateSourcesContent(e,t){return e.map(function(n){if(!this._sourcesContents)return null;t!=null&&(n=g.relative(t,n));const s=g.toSetString(n);return Object.prototype.hasOwnProperty.call(this._sourcesContents,s)?this._sourcesContents[s]:null},this)}toJSON(){const e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return this._file!=null&&(e.file=this._file),this._sourceRoot!=null&&(e.sourceRoot=this._sourceRoot),this._sourcesContents&&(e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)),e}toString(){return JSON.stringify(this.toJSON())}}We.prototype._version=3;var be={},Ot={};(function(o){o.GREATEST_LOWER_BOUND=1,o.LEAST_UPPER_BOUND=2;function e(t,n,s,r,i,l){const a=Math.floor((n-t)/2)+t,c=i(s,r[a],!0);return c===0?a:c>0?n-a>1?e(a,n,s,r,i,l):l===o.LEAST_UPPER_BOUND?n<r.length?n:-1:a:a-t>1?e(t,a,s,r,i,l):l==o.LEAST_UPPER_BOUND?a:t<0?-1:t}o.search=function(n,s,r,i){if(s.length===0)return-1;let l=e(-1,s.length,n,s,r,i||o.GREATEST_LOWER_BOUND);if(l<0)return-1;for(;l-1>=0&&r(s[l],s[l-1],!0)===0;)--l;return l}})(Ot);var qe={exports:{}};let Y=null;qe.exports=function(){if(typeof Y=="string")return fetch(Y).then(e=>e.arrayBuffer());if(Y instanceof ArrayBuffer)return Promise.resolve(Y);throw new Error("You must provide the string URL or ArrayBuffer contents of lib/mappings.wasm by calling SourceMapConsumer.initialize({ 'lib/mappings.wasm': ... }) before using SourceMapConsumer")};qe.exports.initialize=o=>{Y=o};var Rt=qe.exports;const Rn=Rt;function Pn(){this.generatedLine=0,this.generatedColumn=0,this.lastGeneratedColumn=null,this.source=null,this.originalLine=null,this.originalColumn=null,this.name=null}let Z=null;var Ln=function(){if(Z)return Z;const e=[];return Z=Rn().then(t=>WebAssembly.instantiate(t,{env:{mapping_callback(n,s,r,i,l,a,c,d,u,p){const f=new Pn;f.generatedLine=n+1,f.generatedColumn=s,r&&(f.lastGeneratedColumn=i-1),l&&(f.source=a,f.originalLine=c+1,f.originalColumn=d,u&&(f.name=p)),e[e.length-1](f)},start_all_generated_locations_for(){console.time("all_generated_locations_for")},end_all_generated_locations_for(){console.timeEnd("all_generated_locations_for")},start_compute_column_spans(){console.time("compute_column_spans")},end_compute_column_spans(){console.timeEnd("compute_column_spans")},start_generated_location_for(){console.time("generated_location_for")},end_generated_location_for(){console.timeEnd("generated_location_for")},start_original_location_for(){console.time("original_location_for")},end_original_location_for(){console.timeEnd("original_location_for")},start_parse_mappings(){console.time("parse_mappings")},end_parse_mappings(){console.timeEnd("parse_mappings")},start_sort_by_generated_location(){console.time("sort_by_generated_location")},end_sort_by_generated_location(){console.timeEnd("sort_by_generated_location")},start_sort_by_original_location(){console.time("sort_by_original_location")},end_sort_by_original_location(){console.timeEnd("sort_by_original_location")}}})).then(t=>({exports:t.instance.exports,withMappingCallback:(n,s)=>{e.push(n);try{s()}finally{e.pop()}}})).then(null,t=>{throw Z=null,t}),Z};const h=$,Mn=Ot,Ce=He.ArraySet,Nn=Rt,jn=Ln,Ge=Symbol("smcInternal");let b=class Pt{constructor(e,t){return e==Ge?Promise.resolve(this):Tn(e,t)}static initialize(e){Nn.initialize(e["lib/mappings.wasm"])}static fromSourceMap(e,t){return Un(e,t)}static async with(e,t,n){const s=await new Pt(e,t);try{return await n(s)}finally{s.destroy()}}eachMapping(e,t,n){throw new Error("Subclasses must implement eachMapping")}allGeneratedPositionsFor(e){throw new Error("Subclasses must implement allGeneratedPositionsFor")}destroy(){throw new Error("Subclasses must implement destroy")}};b.prototype._version=3;b.GENERATED_ORDER=1;b.ORIGINAL_ORDER=2;b.GREATEST_LOWER_BOUND=1;b.LEAST_UPPER_BOUND=2;be.SourceMapConsumer=b;class V extends b{constructor(e,t){return super(Ge).then(n=>{let s=e;typeof e=="string"&&(s=h.parseSourceMapInput(e));const r=h.getArg(s,"version"),i=h.getArg(s,"sources").map(String),l=h.getArg(s,"names",[]),a=h.getArg(s,"sourceRoot",null),c=h.getArg(s,"sourcesContent",null),d=h.getArg(s,"mappings"),u=h.getArg(s,"file",null),p=h.getArg(s,"x_google_ignoreList",null);if(r!=n._version)throw new Error("Unsupported version: "+r);return n._sourceLookupCache=new Map,n._names=Ce.fromArray(l.map(String),!0),n._sources=Ce.fromArray(i,!0),n._absoluteSources=Ce.fromArray(n._sources.toArray().map(function(f){return h.computeSourceURL(a,f,t)}),!0),n.sourceRoot=a,n.sourcesContent=c,n._mappings=d,n._sourceMapURL=t,n.file=u,n.x_google_ignoreList=p,n._computedColumnSpans=!1,n._mappingsPtr=0,n._wasm=null,jn().then(f=>(n._wasm=f,n))})}_findSourceIndex(e){const t=this._sourceLookupCache.get(e);if(typeof t=="number")return t;const n=h.computeSourceURL(null,e,this._sourceMapURL);if(this._absoluteSources.has(n)){const r=this._absoluteSources.indexOf(n);return this._sourceLookupCache.set(e,r),r}const s=h.computeSourceURL(this.sourceRoot,e,this._sourceMapURL);if(this._absoluteSources.has(s)){const r=this._absoluteSources.indexOf(s);return this._sourceLookupCache.set(e,r),r}return-1}static fromSourceMap(e,t){return new V(e.toString())}get sources(){return this._absoluteSources.toArray()}_getMappingsPtr(){return this._mappingsPtr===0&&this._parseMappings(),this._mappingsPtr}_parseMappings(){const e=this._mappings,t=e.length,n=this._wasm.exports.allocate_mappings(t)>>>0,s=new Uint8Array(this._wasm.exports.memory.buffer,n,t);for(let i=0;i<t;i++)s[i]=e.charCodeAt(i);const r=this._wasm.exports.parse_mappings(n);if(!r){const i=this._wasm.exports.get_last_error();let l=`Error parsing mappings (code ${i}): `;switch(i){case 1:l+="the mappings contained a negative line, column, source index, or name index";break;case 2:l+="the mappings contained a number larger than 2**32";break;case 3:l+="reached EOF while in the middle of parsing a VLQ";break;case 4:l+="invalid base 64 character while parsing a VLQ";break;default:l+="unknown error code";break}throw new Error(l)}this._mappingsPtr=r}eachMapping(e,t,n){const s=t||null,r=n||b.GENERATED_ORDER;this._wasm.withMappingCallback(i=>{i.source!==null&&(i.source=this._absoluteSources.at(i.source),i.name!==null&&(i.name=this._names.at(i.name))),this._computedColumnSpans&&i.lastGeneratedColumn===null&&(i.lastGeneratedColumn=1/0),e.call(s,i)},()=>{switch(r){case b.GENERATED_ORDER:this._wasm.exports.by_generated_location(this._getMappingsPtr());break;case b.ORIGINAL_ORDER:this._wasm.exports.by_original_location(this._getMappingsPtr());break;default:throw new Error("Unknown order of iteration.")}})}allGeneratedPositionsFor(e){let t=h.getArg(e,"source");const n=h.getArg(e,"line"),s=e.column||0;if(t=this._findSourceIndex(t),t<0)return[];if(n<1)throw new Error("Line numbers must be >= 1");if(s<0)throw new Error("Column numbers must be >= 0");const r=[];return this._wasm.withMappingCallback(i=>{let l=i.lastGeneratedColumn;this._computedColumnSpans&&l===null&&(l=1/0),r.push({line:i.generatedLine,column:i.generatedColumn,lastColumn:l})},()=>{this._wasm.exports.all_generated_locations_for(this._getMappingsPtr(),t,n-1,"column"in e,s)}),r}destroy(){this._mappingsPtr!==0&&(this._wasm.exports.free_mappings(this._mappingsPtr),this._mappingsPtr=0)}computeColumnSpans(){this._computedColumnSpans||(this._wasm.exports.compute_column_spans(this._getMappingsPtr()),this._computedColumnSpans=!0)}originalPositionFor(e){const t={generatedLine:h.getArg(e,"line"),generatedColumn:h.getArg(e,"column")};if(t.generatedLine<1)throw new Error("Line numbers must be >= 1");if(t.generatedColumn<0)throw new Error("Column numbers must be >= 0");let n=h.getArg(e,"bias",b.GREATEST_LOWER_BOUND);n==null&&(n=b.GREATEST_LOWER_BOUND);let s;if(this._wasm.withMappingCallback(r=>s=r,()=>{this._wasm.exports.original_location_for(this._getMappingsPtr(),t.generatedLine-1,t.generatedColumn,n)}),s&&s.generatedLine===t.generatedLine){let r=h.getArg(s,"source",null);r!==null&&(r=this._absoluteSources.at(r));let i=h.getArg(s,"name",null);return i!==null&&(i=this._names.at(i)),{source:r,line:h.getArg(s,"originalLine",null),column:h.getArg(s,"originalColumn",null),name:i}}return{source:null,line:null,column:null,name:null}}hasContentsOfAllSources(){return this.sourcesContent?this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some(function(e){return e==null}):!1}sourceContentFor(e,t){if(!this.sourcesContent)return null;const n=this._findSourceIndex(e);if(n>=0)return this.sourcesContent[n];if(t)return null;throw new Error('"'+e+'" is not in the SourceMap.')}generatedPositionFor(e){let t=h.getArg(e,"source");if(t=this._findSourceIndex(t),t<0)return{line:null,column:null,lastColumn:null};const n={source:t,originalLine:h.getArg(e,"line"),originalColumn:h.getArg(e,"column")};if(n.originalLine<1)throw new Error("Line numbers must be >= 1");if(n.originalColumn<0)throw new Error("Column numbers must be >= 0");let s=h.getArg(e,"bias",b.GREATEST_LOWER_BOUND);s==null&&(s=b.GREATEST_LOWER_BOUND);let r;if(this._wasm.withMappingCallback(i=>r=i,()=>{this._wasm.exports.generated_location_for(this._getMappingsPtr(),n.source,n.originalLine-1,n.originalColumn,s)}),r&&r.source===n.source){let i=r.lastGeneratedColumn;return this._computedColumnSpans&&i===null&&(i=1/0),{line:h.getArg(r,"generatedLine",null),column:h.getArg(r,"generatedColumn",null),lastColumn:i}}return{line:null,column:null,lastColumn:null}}}V.prototype.consumer=b;be.BasicSourceMapConsumer=V;class Lt extends b{constructor(e,t){return super(Ge).then(n=>{let s=e;typeof e=="string"&&(s=h.parseSourceMapInput(e));const r=h.getArg(s,"version"),i=h.getArg(s,"sections");if(r!=n._version)throw new Error("Unsupported version: "+r);let l={line:-1,column:0};return Promise.all(i.map(a=>{if(a.url)throw new Error("Support for url field in sections not implemented.");const c=h.getArg(a,"offset"),d=h.getArg(c,"line"),u=h.getArg(c,"column");if(d<l.line||d===l.line&&u<l.column)throw new Error("Section offsets must be ordered and non-overlapping.");return l=c,new b(h.getArg(a,"map"),t).then(f=>({generatedOffset:{generatedLine:d+1,generatedColumn:u+1},consumer:f}))})).then(a=>(n._sections=a,n))})}get sources(){const e=[];for(let t=0;t<this._sections.length;t++)for(let n=0;n<this._sections[t].consumer.sources.length;n++)e.push(this._sections[t].consumer.sources[n]);return e}originalPositionFor(e){const t={generatedLine:h.getArg(e,"line"),generatedColumn:h.getArg(e,"column")},n=Mn.search(t,this._sections,function(r,i){const l=r.generatedLine-i.generatedOffset.generatedLine;return l||r.generatedColumn-(i.generatedOffset.generatedColumn-1)}),s=this._sections[n];return s?s.consumer.originalPositionFor({line:t.generatedLine-(s.generatedOffset.generatedLine-1),column:t.generatedColumn-(s.generatedOffset.generatedLine===t.generatedLine?s.generatedOffset.generatedColumn-1:0),bias:e.bias}):{source:null,line:null,column:null,name:null}}hasContentsOfAllSources(){return this._sections.every(function(e){return e.consumer.hasContentsOfAllSources()})}sourceContentFor(e,t){for(let n=0;n<this._sections.length;n++){const r=this._sections[n].consumer.sourceContentFor(e,!0);if(r)return r}if(t)return null;throw new Error('"'+e+'" is not in the SourceMap.')}_findSectionIndex(e){for(let t=0;t<this._sections.length;t++){const{consumer:n}=this._sections[t];if(n._findSourceIndex(e)!==-1)return t}return-1}generatedPositionFor(e){const t=this._findSectionIndex(h.getArg(e,"source")),n=t>=0?this._sections[t]:null,s=t>=0&&t+1<this._sections.length?this._sections[t+1]:null,r=n&&n.consumer.generatedPositionFor(e);if(r&&r.line!==null){const i=n.generatedOffset.generatedLine-1,l=n.generatedOffset.generatedColumn-1;return r.line===1&&(r.column+=l,typeof r.lastColumn=="number"&&(r.lastColumn+=l)),r.lastColumn===1/0&&s&&r.line===s.generatedOffset.generatedLine&&(r.lastColumn=s.generatedOffset.generatedColumn-2),r.line+=i,r}return{line:null,column:null,lastColumn:null}}allGeneratedPositionsFor(e){const t=this._findSectionIndex(h.getArg(e,"source")),n=t>=0?this._sections[t]:null,s=t>=0&&t+1<this._sections.length?this._sections[t+1]:null;return n?n.consumer.allGeneratedPositionsFor(e).map(r=>{const i=n.generatedOffset.generatedLine-1,l=n.generatedOffset.generatedColumn-1;return r.line===1&&(r.column+=l,typeof r.lastColumn=="number"&&(r.lastColumn+=l)),r.lastColumn===1/0&&s&&r.line===s.generatedOffset.generatedLine&&(r.lastColumn=s.generatedOffset.generatedColumn-2),r.line+=i,r}):[]}eachMapping(e,t,n){this._sections.forEach((s,r)=>{const i=r+1<this._sections.length?this._sections[r+1]:null,{generatedOffset:l}=s,a=l.generatedLine-1,c=l.generatedColumn-1;s.consumer.eachMapping(function(d){d.generatedLine===1&&(d.generatedColumn+=c,typeof d.lastGeneratedColumn=="number"&&(d.lastGeneratedColumn+=c)),d.lastGeneratedColumn===1/0&&i&&d.generatedLine===i.generatedOffset.generatedLine&&(d.lastGeneratedColumn=i.generatedOffset.generatedColumn-2),d.generatedLine+=a,e.call(this,d)},t,n)})}computeColumnSpans(){for(let e=0;e<this._sections.length;e++)this._sections[e].consumer.computeColumnSpans()}destroy(){for(let e=0;e<this._sections.length;e++)this._sections[e].consumer.destroy()}}be.IndexedSourceMapConsumer=Lt;function Tn(o,e){let t=o;typeof o=="string"&&(t=h.parseSourceMapInput(o));const n=t.sections!=null?new Lt(t,e):new V(t,e);return Promise.resolve(n)}function Un(o,e){return V.fromSourceMap(o,e)}var Mt=be.SourceMapConsumer;const In=/\b_?([A-Z]\w*?(?:Component|Directive|Page|Dialog))\b/;function Fn(o){for(const e of o){if(e.isFramework)continue;const t=[e.functionName,e.rawFrame];for(const n of t){if(!n)continue;const s=n.match(In);if(s)return s[1]}}return null}function Dn(o,e,t){if((o.match(/patchedSubscribe/g)??[]).length>=2)return"nested-subscribe";if(/\b__async\b|\bZoneAwarePromise\b|\basync_/.test(o)&&/ngOnInit/.test(o))return"async-init";const r=e.find(l=>!l.isFramework),i=`${(r==null?void 0:r.functionName)??""} ${(r==null?void 0:r.rawFrame)??""}`;return/\.ngOnInit\b/.test(i)?"ng-init":/fromEvent|addEventListener/.test(o)?"global-event":t.includes("Subject")?"subject":/\binterval\b|\btimer\b/.test(o)||t==="Observable"?"timer":"unknown"}function zn(o){return o.filter(e=>!/runtime\/patch/.test(e.file)&&e.functionName!=="patchedSubscribe")}const Bn="/assets/mappings-Dhu04MXZ.wasm";Mt.initialize({"lib/mappings.wasm":Bn});const Hn=[/(?:^|\/)node_modules\//,/webpack[-/]runtime/,/^webpack:\/\/\/runtime\//],Wn=[/\/vite\/deps\//,/\/polyfills[-.]/,/\/runtime[-.]/,/\/zone\.js/,/^webpack:/],qn=/at\s+(?:(.+?)\s+\()?(.+?):(\d+):(\d+)\)?$/;function Gn(o){return Hn.some(e=>e.test(o))}function it(o){return Wn.some(e=>e.test(o))}async function Kn(){return(await fetch("/sessions")).json()}async function Vn(o){return(await fetch(`/sessions/${o}`)).json()}async function Jn(o){try{const n=await fetch(`/source-maps?url=${encodeURIComponent(o)}&raw=1`);if(n.ok){const i=(await n.text()).slice(-4096).match(/\/\/[#@]\s*sourceMappingURL=([^\s]+)/);if(i){const l=i[1].trim();if(l.startsWith("data:application/json")){const a=l.match(/base64,([A-Za-z0-9+/=]+)/);if(a)return JSON.parse(atob(a[1]))}else{const a=new URL(l,o).href,c=await fetch(`/source-maps?url=${encodeURIComponent(a)}`);if(c.ok)return await c.json()}}}}catch{}const e=[o+".map"],t=o.indexOf("?");if(t!==-1){const n=o.slice(0,t),s=o.slice(t);e.push(n+".map"),e.push(n+".map"+s)}for(const n of e)try{const s=await fetch(`/source-maps?url=${encodeURIComponent(n)}`);if(!s.ok)continue;return await s.json()}catch{}return null}function Qn(o,e){const t=[];for(const n of o.split(`
349
+ `)){const s=n.trim();if(!s.startsWith("at "))continue;const r=s.match(qn);if(!r)continue;const i=r[1]??null,l=r[2],a=Number(r[3]),c=Number(r[4]),d=l.split("?")[0],u=e.get(l)??e.get(d);if(!u){t.push({rawFrame:s,file:l,line:a,column:c,isFramework:it(l),functionName:i});continue}let p;try{p=u.originalPositionFor({line:a,column:c})}catch{p={source:null,line:null,column:null,name:null}}const f=p.source??l;t.push({rawFrame:s,file:f,line:p.line??a,column:p.column??c,isFramework:p.source?Gn(p.source):it(l),functionName:p.name??i})}return t}async function Zn(o){var r;const e=new Set;for(const i of o.subscriptions)for(const l of i.stackRaw.matchAll(/(https?:\/\/[^\s)]+?):\d+:\d+/g))e.add(l[1]);const t=new Map;await Promise.all([...e].map(async i=>{const l=await Jn(i);if(!l)return;t.set(i,l);const a=i.split("?")[0];a!==i&&t.set(a,l)}));const n=new Map,s=[];for(const[i,l]of t)try{n.set(i,await new Mt(l))}catch(a){s.push(`${i}: ${a instanceof Error?a.message:String(a)}`)}try{const i=new Set;for(const p of o.meta.navigations)i.add(p.fromRoute);const l=[];let a=0,c=0,d=0,u=0;for(const p of o.subscriptions){if(p.recordingId!==o.meta.recordingId)continue;if(c++,p.closed){d++;continue}if(!i.has(p.route)){u++;continue}const f=Qn(p.stackRaw,n);if(!f.some(ve=>!ve.isFramework)){a++;continue}if((r=f[1])!=null&&r.isFramework){a++;continue}const ye=f.find(ve=>!ve.isFramework),jt=zn(f);l.push({id:p.id,route:p.route,observableKind:p.observableKind,sourceLocation:{file:ye.file,line:ye.line,column:ye.column},componentName:Fn(f),leakKind:Dn(p.stackRaw,f,p.observableKind),stack:jt,retainerChain:[]})}return console.log("[rxjs-leak-finder] build report:",{scanned:c,leaks:l.length,ignored:a,skippedClosed:d,skippedCurrentRoute:u,leftRoutes:[...i],sourceMapsResolved:t.size,sourceMapsAttempted:e.size,consumersBuilt:n.size,consumerFailures:s.length}),s.length>0&&console.warn("[rxjs-leak-finder] consumer build failures:",s.slice(0,5)),{leaks:l,ignoredFrameworkSubscriptions:a,longLivedServiceSubscriptions:[],totalSubscriptionsScanned:c}}finally{for(const i of n.values())try{i.destroy()}catch{}}}const X=document.getElementById("root"),lt=document.getElementById("sessions");async function Nt(){const o=await Kn();o.sort((e,t)=>t.createdAt-e.createdAt),lt.innerHTML="";for(const e of o){const t=document.createElement("div");t.className="session",t.innerHTML=`<div>${new Date(e.createdAt).toLocaleString()}</div><div class="when">${e.subscriptionCount} subs · ${e.recordingId}</div>`,t.addEventListener("click",async()=>{document.querySelectorAll(".session").forEach(n=>n.classList.remove("active")),t.classList.add("active"),X.error=null,X.progressPhase="analyzing";try{const n=await Vn(e.id);X.report=await Zn(n)}catch(n){const s=n instanceof Error?`${n.message}
350
+ ${n.stack??""}`:String(n);console.error("[rxjs-leak-finder] buildReport failed:",n),X.error=s}finally{X.progressPhase=null}}),lt.appendChild(t)}}document.addEventListener("rld-open-source",async o=>{const e=o.detail;try{const t=await fetch("/open",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)});if(!t.ok){const n=await t.json().catch(()=>({}));console.warn("[rxjs-leak-finder] open failed:",n)}}catch(t){console.warn("[rxjs-leak-finder] open error:",t)}});Nt();setInterval(Nt,3e3);
@@ -0,0 +1,25 @@
1
+ <!doctype html>
2
+ <html><head><meta charset="utf-8"><title>RxJS Leak Detector</title>
3
+ <style>
4
+ body { margin: 0; font-family: 'SF Mono', Monaco, Consolas, monospace; font-size: 13px;
5
+ background: #2b2b2b; color: #e8eaed; display: grid;
6
+ grid-template-columns: 240px 1fr; min-height: 100vh; }
7
+ aside { background: #1f1f1f; border-right: 1px solid #3c4043; padding: 12px; }
8
+ aside h1 { font-size: 13px; margin: 0 0 12px; color: #9aa0a6; text-transform: uppercase; letter-spacing: 1px; }
9
+ .session { padding: 8px; cursor: pointer; border-radius: 4px; }
10
+ .session:hover { background: #3c4043; }
11
+ .session.active { background: #1a73e8; color: white; }
12
+ .session .when { color: #9aa0a6; font-size: 11px; }
13
+ main { padding: 12px; }
14
+ </style>
15
+ <script type="module" crossorigin src="/assets/index-BqI1esY6.js"></script>
16
+ </head>
17
+ <body>
18
+ <aside>
19
+ <h1>Sessions</h1>
20
+ <div id="sessions"></div>
21
+ </aside>
22
+ <main>
23
+ <leak-detector-root id="root"></leak-detector-root>
24
+ </main>
25
+ </body></html>
@@ -0,0 +1,29 @@
1
+ import type { EnableConfig, PatchableObservable } from './types.js';
2
+ export type LeakDetectorController = {
3
+ /** Begin a recording session. Captured subscriptions are tracked until {@link stop}. */
4
+ start(): void;
5
+ /** End the current session and POST the report to the dashboard. */
6
+ stop(): Promise<void>;
7
+ /**
8
+ * Force a route boundary in the recorder. The detector tracks navigations
9
+ * automatically via the History API; call this if your router bypasses it
10
+ * (rare).
11
+ */
12
+ markNavigation(): void;
13
+ /** Whether {@link start} has been called and {@link stop} has not. */
14
+ readonly isRecording: boolean;
15
+ /**
16
+ * Tear down the patch and the widget. After this the page must reload before
17
+ * `enableRxjsLeakDetector` will work again. Useful in tests; rarely needed in apps.
18
+ */
19
+ teardown(): void;
20
+ };
21
+ /**
22
+ * Patch `Observable.prototype.subscribe`, mount the floating widget, and return
23
+ * a controller. Calling twice in the same page is a no-op (the original
24
+ * controller is returned).
25
+ *
26
+ * Pass your application's `Observable` class — the one from your `rxjs` import.
27
+ * Do **not** call this in production builds.
28
+ */
29
+ export declare function enableRxjsLeakDetector(ObservableCtor: PatchableObservable, config?: EnableConfig): LeakDetectorController | null;