@preventive/triage 1.0.0-alpha.5 → 1.0.0-alpha.51
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/LICENSE-APACHE +202 -0
- package/README.md +16 -0
- package/api/reap.ts +17 -0
- package/cli.js +6 -0
- package/client/dependency-paths.d.ts +3 -0
- package/client/dependency-paths.js +36 -0
- package/client/finding-link.js +305 -0
- package/client/linked-findings.d.ts +1 -0
- package/client/linked-findings.js +115 -0
- package/common/bundle-commit.d.ts +1 -0
- package/common/bundle-commit.js +4 -0
- package/common/bundle-compare-diff.d.ts +3 -0
- package/common/bundle-compare-diff.js +357 -0
- package/common/bundle-compare-inputs.d.ts +2 -0
- package/common/bundle-compare-inputs.js +65 -0
- package/common/bundle-compare-versions.js +172 -0
- package/common/bundle-comparison.d.ts +8 -0
- package/common/bundle-comparison.js +62 -0
- package/common/bundle-metadata.d.ts +15 -0
- package/common/bundle-metadata.js +226 -0
- package/common/bundle-pkg-of.d.ts +1 -0
- package/common/bundle-pkg-of.js +90 -0
- package/common/bundle-reasons.d.ts +2 -0
- package/common/bundle-reasons.js +21 -0
- package/common/bundle-source-links.d.ts +6 -0
- package/common/bundle-source-links.js +216 -0
- package/common/bundle-sourcemap.d.ts +10 -0
- package/common/bundle-sourcemap.js +100 -0
- package/common/bundle-sources.d.ts +7 -0
- package/common/bundle-sources.js +333 -0
- package/common/bundle-stats.js +41 -0
- package/common/bundle-tabs.js +1 -0
- package/common/code-language.js +65 -0
- package/common/default-scan-models.ts +31 -0
- package/common/dependency-reviews.d.ts +18 -0
- package/common/dependency-reviews.js +64 -0
- package/common/finding-duplicates.js +58 -0
- package/common/finding-filters.js +274 -0
- package/common/finding-id.js +47 -0
- package/common/github-issue-labels.d.ts +1 -0
- package/common/github-issue-labels.js +11 -0
- package/common/github-pr.ts +56 -0
- package/common/gzip.js +59 -0
- package/common/line-diff.d.ts +8 -0
- package/common/line-diff.js +57 -0
- package/common/linked-workspace-groups.js +63 -0
- package/common/managed/agent-tasks.ts +292 -0
- package/common/managed/comments.ts +34 -0
- package/common/managed/finding-detail.d.ts +3 -0
- package/common/managed/finding-detail.js +66 -0
- package/common/managed/github-agents.ts +114 -0
- package/common/managed/github-logins.ts +49 -0
- package/common/managed/npm-packages.d.ts +7 -0
- package/common/managed/npm-packages.js +51 -0
- package/common/managed/permissions.ts +31 -0
- package/common/managed/report-content.ts +72 -0
- package/common/managed/report-filter.ts +109 -0
- package/common/managed/repository-alias.ts +65 -0
- package/common/managed/roles.ts +35 -0
- package/common/managed/routes.d.ts +2 -0
- package/common/managed/routes.js +359 -0
- package/common/managed/scan-models.ts +6 -0
- package/common/managed/team-app.d.ts +6 -0
- package/common/managed/team-app.js +47 -0
- package/common/managed/triage.ts +83 -0
- package/common/managed/upload-seal.ts +126 -0
- package/common/pretty-print.d.ts +5 -0
- package/common/pretty-print.js +24 -0
- package/common/revalidation-conflicts.js +48 -0
- package/common/revalidation-input-groups.js +56 -0
- package/common/save-error-reason.ts +20 -7
- package/common/scan-server.ts +13 -0
- package/common/security-links.d.ts +5 -0
- package/common/security-links.js +33 -0
- package/common/server-info.ts +46 -0
- package/common/utf8.d.ts +3 -0
- package/common/utf8.js +45 -0
- package/common/workspace-app.js +39 -0
- package/common/workspace-groups.js +176 -0
- package/out/activity.js +4 -0
- package/out/brotli-fallback.js +3 -3
- package/out/chunk-2K6UN3PC.js +3 -0
- package/out/chunk-2XUEZHIP.js +28 -0
- package/out/chunk-2ZDZWLFY.js +1 -0
- package/out/chunk-4HI2MSAV.js +17 -0
- package/out/chunk-6LNQTKAV.js +52 -0
- package/out/chunk-7BKKYVWR.js +7 -0
- package/out/chunk-7C7DWL7I.js +1 -0
- package/out/chunk-7JBSSRD7.js +3 -0
- package/out/chunk-7VAWINQF.js +6 -0
- package/out/chunk-C4Z6ZBXV.js +10 -0
- package/out/chunk-FMXWXDR4.js +36 -0
- package/out/chunk-GDPCLSOS.js +2 -0
- package/out/chunk-GO7FT4OD.js +1 -0
- package/out/chunk-HT2SSA3V.js +1 -0
- package/out/chunk-IPAH4LKF.js +232 -0
- package/out/chunk-IYPY47MC.js +1 -0
- package/out/chunk-IZ7POWI3.js +18 -0
- package/out/chunk-JCIIBLKR.js +1 -0
- package/out/chunk-KOGNQDSJ.js +1 -0
- package/out/chunk-NRPC74AM.js +1 -0
- package/out/chunk-OOJM4CTU.js +1 -0
- package/out/chunk-PBZPYIG7.js +1 -0
- package/out/chunk-PNHBZGDD.js +1 -0
- package/out/chunk-PWFUOLZK.js +17 -0
- package/out/chunk-PXK7EU4V.js +1 -0
- package/out/chunk-QB4CBOX2.js +1 -0
- package/out/chunk-R3NZFXVR.js +1 -0
- package/out/chunk-R5O6FAW4.js +2 -0
- package/out/chunk-SXV2T5C4.js +80 -0
- package/out/chunk-TQJDYHVE.js +2 -0
- package/out/chunk-TUII34K2.js +1 -0
- package/out/chunk-VDRXHIHN.js +3 -0
- package/out/chunk-VFWMQ3LG.js +2 -0
- package/out/chunk-VH4XMZIW.js +2 -0
- package/out/chunk-WCPJDAYA.js +10 -0
- package/out/chunk-WFYLMF6Z.js +10 -0
- package/out/chunk-WRAJVD35.js +1 -0
- package/out/chunk-WYLQWYLA.js +1 -0
- package/out/client-managed-import.js +4 -0
- package/out/client-managed.js +33 -0
- package/out/client-sync.js +11 -17
- package/out/compare.js +35 -0
- package/out/dialogs.js +55 -0
- package/out/github-issue-authorized.html +3 -0
- package/out/github-issue-authorized.js +1 -0
- package/out/graph.js +17 -4
- package/out/index.html +90 -8
- package/out/prism.js +14 -10
- package/out/scan.js +2 -0
- package/out/stasis.svg +20 -0
- package/out/terminal.js +366 -39
- package/out/view.css +1 -1
- package/out/view.js +19 -144
- package/package.json +364 -59
- package/risk/actions/findings.js +161 -0
- package/risk/actions/resolve.js +219 -0
- package/risk/actions/scripts/commands.js +182 -0
- package/risk/actions/scripts/grade.js +113 -0
- package/risk/actions/scripts/packages.js +123 -0
- package/risk/actions/scripts/shell.js +169 -0
- package/risk/actions/uses.js +76 -0
- package/risk/actions/workflow.js +110 -0
- package/risk/files/characters.js +196 -0
- package/risk/files/hosts.js +205 -0
- package/risk/files/readability.js +177 -0
- package/risk/files/runs-code.js +615 -0
- package/risk/files/script.js +118 -0
- package/risk/files/stamps.js +47 -0
- package/risk/index.d.ts +254 -0
- package/risk/index.js +11 -0
- package/risk/npm/assess.js +285 -0
- package/risk/npm/combined.js +68 -0
- package/risk/npm/compare.js +257 -0
- package/risk/npm/dependencies.js +172 -0
- package/risk/npm/diff.js +79 -0
- package/risk/npm/downloads.js +84 -0
- package/risk/npm/files.js +445 -0
- package/risk/npm/held.js +63 -0
- package/risk/npm/install-scripts.js +34 -0
- package/risk/npm/malware.js +36 -0
- package/risk/npm/manifest.js +65 -0
- package/risk/npm/new-dependency.js +60 -0
- package/risk/npm/old-version.js +108 -0
- package/risk/npm/registry.js +388 -0
- package/risk/npm/release.js +85 -0
- package/risk/npm/score.js +59 -0
- package/risk/npm/specs.js +124 -0
- package/risk/npm/tarball.js +96 -0
- package/server-common/database-config.ts +16 -0
- package/server-common/initialize.ts +18 -0
- package/server-common/npm-advisories.ts +101 -0
- package/{server → server-common}/origin.ts +5 -5
- package/server-common/reap.ts +48 -0
- package/server-common/scan-config.ts +19 -0
- package/server-common/standalone.ts +29 -0
- package/server-common/storage-crypto.ts +182 -0
- package/server-common/storage-log.ts +38 -0
- package/server-common/vercel-blob.ts +103 -0
- package/server-e2e/app.ts +487 -0
- package/{server → server-e2e}/bus-receiver.ts +2 -1
- package/{server → server-e2e}/cli.js +9 -4
- package/{server → server-e2e}/config.ts +50 -42
- package/{server → server-e2e}/db-neon.ts +2 -2
- package/{server → server-e2e}/db-revision-sql.ts +1 -1
- package/{server → server-e2e}/db-stmt.ts +2 -2
- package/{server → server-e2e}/db.ts +7 -7
- package/{server → server-e2e}/http.ts +44 -13
- package/{server → server-e2e}/hub.ts +40 -9
- package/server-e2e/index.ts +17 -0
- package/server-e2e/lifecycle.ts +95 -0
- package/{server → server-e2e}/neon-driver.ts +2 -2
- package/{server → server-e2e}/npm-proxy.ts +12 -145
- package/{server → server-e2e}/objstore/blob-vercel.ts +10 -114
- package/{server → server-e2e}/objstore/blob.ts +1 -1
- package/server-e2e/objstore/fetch-mint-guard.ts +74 -0
- package/{server → server-e2e}/objstore/handlers.ts +9 -8
- package/{server → server-e2e}/objstore/init.ts +19 -27
- package/{server → server-e2e}/objstore/reaper.ts +1 -1
- package/server-e2e/objstore/rest-deny.ts +28 -0
- package/server-e2e/objstore/rest-mint.ts +224 -0
- package/{server → server-e2e}/objstore/rest.ts +3 -3
- package/{server → server-e2e}/objstore/store-neon.ts +6 -10
- package/{server → server-e2e}/objstore/store.ts +7 -7
- package/{server → server-e2e}/objstore/tokens.ts +2 -2
- package/{server → server-e2e}/pubsub.ts +12 -9
- package/{server → server-e2e}/sign.ts +4 -4
- package/{server → server-e2e}/sse-server.ts +60 -33
- package/{server → server-e2e}/static.ts +31 -21
- package/{server → server-e2e}/sync-handlers.ts +64 -30
- package/{server → server-e2e}/ws-server.ts +20 -9
- package/server-managed/activity.ts +258 -0
- package/server-managed/agent-merges.ts +109 -0
- package/server-managed/app-agents.ts +23 -0
- package/server-managed/avatar-store.ts +13 -0
- package/server-managed/blob-store.ts +17 -0
- package/server-managed/brotli.ts +10 -0
- package/server-managed/bundle-advisories.ts +120 -0
- package/server-managed/bundle-advisory-inventory.ts +77 -0
- package/server-managed/bundle-build-diagnostics.d.ts +10 -0
- package/server-managed/bundle-build-diagnostics.js +23 -0
- package/server-managed/bundle-build-leases.ts +41 -0
- package/server-managed/bundle-build-worker.js +115 -0
- package/server-managed/bundle-build.ts +200 -0
- package/server-managed/bundle-cache.ts +211 -0
- package/server-managed/bundle-catalog.ts +29 -0
- package/server-managed/bundle-commits.ts +140 -0
- package/server-managed/bundle-store.ts +24 -0
- package/server-managed/bundle-summary-cache.ts +130 -0
- package/server-managed/bundle.ts +119 -0
- package/server-managed/cache-storage.ts +20 -0
- package/server-managed/cli.js +21 -0
- package/server-managed/combined.ts +47 -0
- package/server-managed/comments.ts +151 -0
- package/server-managed/commit-coauthors.ts +106 -0
- package/server-managed/commit-lockfiles.ts +76 -0
- package/server-managed/comparison.ts +52 -0
- package/server-managed/config.ts +164 -0
- package/server-managed/content-access.ts +15 -0
- package/server-managed/crypto.ts +25 -0
- package/server-managed/db-methods.ts +1923 -0
- package/server-managed/db-neon.ts +468 -0
- package/server-managed/db-schema.ts +238 -0
- package/server-managed/db-table-names.ts +22 -0
- package/server-managed/db.ts +143 -0
- package/server-managed/dependabot-access.ts +60 -0
- package/server-managed/dependabot-alerts.ts +185 -0
- package/server-managed/dependency-review-comments.ts +98 -0
- package/server-managed/dependency-reviews.ts +364 -0
- package/server-managed/github-accounts.ts +60 -0
- package/server-managed/github-actions.ts +71 -0
- package/server-managed/github-app.ts +376 -0
- package/server-managed/github-errors.ts +70 -0
- package/server-managed/github-graphql.ts +39 -0
- package/server-managed/github-issue-links.ts +140 -0
- package/server-managed/github-issue-oauth.ts +47 -0
- package/server-managed/github-issues.ts +152 -0
- package/server-managed/github-link-oauth.ts +69 -0
- package/server-managed/github-links.ts +204 -0
- package/server-managed/github-metadata.ts +213 -0
- package/server-managed/github-oauth.ts +238 -0
- package/server-managed/github-pulls.ts +227 -0
- package/server-managed/github-requests.ts +136 -0
- package/server-managed/github-users.ts +30 -0
- package/server-managed/http-response.ts +76 -0
- package/server-managed/http.ts +5503 -0
- package/server-managed/import-triage.ts +51 -0
- package/server-managed/index.ts +192 -0
- package/server-managed/kept-briefly.ts +37 -0
- package/server-managed/kept.ts +28 -0
- package/server-managed/link-reports.ts +162 -0
- package/server-managed/listed-activity.ts +39 -0
- package/server-managed/locked-packages.ts +152 -0
- package/server-managed/lockfile-scope.ts +49 -0
- package/server-managed/lru.ts +30 -0
- package/server-managed/managed-issues.ts +78 -0
- package/server-managed/management-catalog.ts +45 -0
- package/server-managed/management.ts +99 -0
- package/server-managed/npm-delta-worker.js +23 -0
- package/server-managed/npm-delta.ts +194 -0
- package/server-managed/npm-insights.ts +449 -0
- package/server-managed/npm-kept.ts +225 -0
- package/server-managed/npm-loads.ts +264 -0
- package/server-managed/npm-manifest.ts +115 -0
- package/server-managed/npm-packages.ts +454 -0
- package/server-managed/npm-patch.ts +325 -0
- package/server-managed/npm-provenance.ts +123 -0
- package/server-managed/npm-risk.ts +285 -0
- package/server-managed/object-storage-disk.ts +148 -0
- package/server-managed/object-storage-vercel.ts +67 -0
- package/server-managed/object-storage.ts +75 -0
- package/server-managed/package-entry-points.ts +51 -0
- package/server-managed/pretty-print.ts +434 -0
- package/server-managed/public-workspace.ts +238 -0
- package/server-managed/pull-comment-reviews.ts +161 -0
- package/server-managed/pull-dependencies.ts +351 -0
- package/server-managed/pull-dependency-reviews.ts +334 -0
- package/server-managed/pull-reviews.ts +205 -0
- package/server-managed/queue.ts +39 -0
- package/server-managed/release-commits.ts +84 -0
- package/server-managed/rename-diff-worker.js +26 -0
- package/server-managed/rename-diff.ts +279 -0
- package/server-managed/repo-path.ts +21 -0
- package/server-managed/report-migration.ts +35 -0
- package/server-managed/report-query.ts +10 -0
- package/server-managed/report-response.ts +16 -0
- package/server-managed/report-sources.ts +178 -0
- package/server-managed/report-store.ts +85 -0
- package/server-managed/repository-actions.ts +218 -0
- package/server-managed/repository-agents.ts +448 -0
- package/server-managed/repository-aliases.ts +91 -0
- package/server-managed/repository-browser.ts +294 -0
- package/server-managed/repository-changes.ts +284 -0
- package/server-managed/repository-code.ts +215 -0
- package/server-managed/repository-dependency-reviews.ts +166 -0
- package/server-managed/repository-discovery.ts +82 -0
- package/server-managed/repository-history.ts +432 -0
- package/server-managed/repository-issues.ts +195 -0
- package/server-managed/repository-policy.ts +27 -0
- package/server-managed/repository-pulls.ts +212 -0
- package/server-managed/repository-pulse.ts +460 -0
- package/server-managed/repository-risk-assess.ts +105 -0
- package/server-managed/repository-risk-audit.ts +79 -0
- package/server-managed/repository-risk-read.ts +170 -0
- package/server-managed/repository-risk.ts +491 -0
- package/server-managed/repository-squashes.ts +168 -0
- package/server-managed/request-timing.ts +63 -0
- package/server-managed/reviewed-dependencies.ts +149 -0
- package/server-managed/revisions.ts +35 -0
- package/server-managed/scan-downloads.ts +87 -0
- package/server-managed/session.ts +132 -0
- package/server-managed/slugs.ts +38 -0
- package/server-managed/solidity-entry-points.ts +71 -0
- package/server-managed/sql-postgres.ts +34 -0
- package/server-managed/sql.ts +88 -0
- package/server-managed/static.ts +28 -0
- package/server-managed/storage-command.ts +16 -0
- package/server-managed/storage-db.ts +183 -0
- package/server-managed/storage-encryption.ts +290 -0
- package/server-managed/storage-maintenance.ts +259 -0
- package/server-managed/storage-payload.ts +121 -0
- package/server-managed/storage-stores.ts +91 -0
- package/server-managed/storage.ts +82 -0
- package/server-managed/team-app.ts +134 -0
- package/server-managed/team-catalog.ts +7 -0
- package/server-managed/team-feed.ts +180 -0
- package/server-managed/team-npm-scopes.ts +106 -0
- package/server-managed/team-reports.ts +319 -0
- package/server-managed/triage-response.ts +16 -0
- package/server-managed/type-only-worker.js +19 -0
- package/server-managed/type-only.ts +105 -0
- package/server-managed/uploads.ts +106 -0
- package/server-managed/upstream-cache.ts +243 -0
- package/server-managed/view-as.ts +58 -0
- package/server-managed/workspace-shares.ts +169 -0
- package/server.ts +70 -0
- package/server/index.ts +0 -480
- package/server/lifecycle.ts +0 -208
- /package/{LICENSE → LICENSE-MIT} +0 -0
- /package/{server → server-e2e}/auth.ts +0 -0
- /package/{server → server-e2e}/config.example.json +0 -0
- /package/{server → server-e2e}/objstore/blob-fs.ts +0 -0
- /package/{server → server-e2e}/objstore/fs.ts +0 -0
- /package/{server → server-e2e}/objstore/sign.ts +0 -0
- /package/{server → server-e2e}/peer.ts +0 -0
- /package/{server → server-e2e}/sse-session.ts +0 -0
- /package/{server → server-e2e}/util.ts +0 -0
- /package/{server → server-e2e}/validation.ts +0 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en"><head><meta charset="utf-8"><meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'self'; require-trusted-types-for 'script'; trusted-types 'none'; base-uri 'none'; form-action 'none'"><meta name="viewport" content="width=device-width,initial-scale=1"><title>GitHub authorized — DeepView</title></head>
|
|
3
|
+
<body><p>GitHub is authorized. You can close this tab and return to DeepView to create your issue.</p><script type="module" src="./github-issue-authorized.js"></script></body></html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
window.close();
|
package/out/graph.js
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
|
-
var mt=globalThis[Symbol.for("@rray/frontend")];if(!mt)throw new Error("@rray/frontend global not installed; view.js must run before lazy bundles import this wrapper");var{LitElement:xt,html:E,nothing:Ot,unsafeCSS:Ve,render:Me,StateElement:ao,classMap:Se,repeat:vt,styleMap:$e}=mt;var yt=`*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}:host{display:grid;grid-template-columns:1fr 300px;grid-template-rows:auto 1fr;grid-template-areas:"topbar right" "stage right";min-height:0;border:1px solid var(--border);border-radius:8px;overflow:hidden;background:var(--graph-canvas-bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,sans-serif;font-size:12px}.graph2-layout{display:contents}.graph2-topbar{grid-area:topbar;display:flex;flex-direction:column;gap:.5rem;padding:.6rem .75rem;font-size:.825rem;background:var(--surface);backdrop-filter:var(--glass-blur);border-bottom:1px solid var(--graph-divider)}.graph2-topbar-row{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem;padding:0}.graph2-topbar .g2-spacer{flex:1}.graph2-topbar triage-selector{margin-left:auto}.g2-icon-btn{width:28px;height:28px;border-radius:5px;background:var(--graph-hover-bg);border:1px solid var(--border);color:var(--muted);display:grid;place-items:center;font-family:inherit;&:hover{color:var(--accent);border-color:var(--accent)}& svg{display:block}}.g2-path-filter-wrap{position:relative;flex:0 0 14rem;padding-right:22px}.g2-path-filter-wrap .g2-path-filter-clear{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:grid;place-items:center;width:18px;height:18px;background:transparent;border:0;border-radius:50%;color:var(--muted);font:400 10px/1 inherit;font-family:inherit;&:hover{color:var(--text);background:var(--surface-active)}}.g2-path-filter:placeholder-shown~.g2-path-filter-clear{display:none}.g2-topbar-toggle{display:inline-flex;align-items:center;height:30px;box-sizing:border-box;gap:8px;padding:5px 10px;background:var(--graph-hover-bg);border:1px solid var(--border);border-radius:6px;color:var(--muted);font:500 11px/1 inherit;font-family:inherit;white-space:nowrap;&:hover{color:var(--text);border-color:var(--accent)}&.on{color:var(--text)}&.on .g2-switch{background:color-mix(in srgb,var(--accent) 22%,transparent)}&.on .g2-switch:after{transform:translate(12px);background:var(--accent)}}.g2-trash-btn.on{background:color-mix(in srgb,var(--accent) 16%,transparent);border-color:var(--accent);color:var(--accent)}.graph2-right{grid-area:right;border-left:1px solid var(--graph-divider);background:var(--surface);backdrop-filter:var(--glass-blur);display:flex;flex-direction:column;overflow:hidden;padding:14px}.g2-panel-title{font-family:inherit;font-weight:600;font-size:11px;line-height:1;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);opacity:.85;margin:14px 0 8px;display:flex;align-items:baseline;gap:6px;&:first-child{margin-top:0}}.g2-count{color:var(--muted);opacity:.6;font-weight:400;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;text-transform:none;letter-spacing:0;font-size:10px}.g2-panel-title-row{justify-content:space-between;gap:8px}#g2-top-pkgs-block{margin-top:14px;flex:1 1 0;min-height:0;display:flex;flex-direction:column}.g2-mini-tabs{display:flex;gap:1px;background:var(--graph-divider);border-radius:4px;overflow:hidden}.g2-mini-tab{background:transparent;border:0;color:var(--muted);font-family:inherit;font-weight:500;font-size:11px;line-height:1.4;text-transform:none;letter-spacing:0;padding:2px 7px;&:hover{color:var(--text);background:var(--graph-hover-bg)}&.on{background:var(--surface-active);color:var(--accent)}}.g2-switch{width:26px;height:14px;background:var(--border);border-radius:8px;position:relative;transition:background .15s;flex-shrink:0;&:after{content:"";position:absolute;top:2px;left:2px;width:10px;height:10px;border-radius:50%;background:var(--muted);transition:transform .15s,background .15s}}.graph2-stage{grid-area:stage;position:relative;background:var(--graph-canvas-bg);overflow:hidden;cursor:grab;&:active{cursor:grabbing}& canvas{position:absolute;inset:0;width:100%;height:100%;display:block}}.g2-stage-overlay{position:absolute;top:12px;left:12px;z-index:3;display:flex;flex-direction:column;gap:4px;pointer-events:none;max-width:calc(100% - 60px)}.g2-stage-overlay>*{pointer-events:auto}.g2-stage-stats{position:absolute;bottom:10px;left:12px;z-index:2;display:flex;flex-wrap:wrap;gap:2px 14px;font:500 10px/1.4 ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;color:var(--muted);opacity:.7;text-transform:uppercase;letter-spacing:.06em;pointer-events:none;max-width:calc(100% - 80px);& b{font-weight:600;color:var(--text);opacity:1}}.g2-stage-overlay-tr{position:absolute;top:12px;right:12px;z-index:3;pointer-events:auto}.g2-focus-pkg-btn{width:28px;height:28px;display:grid;place-items:center;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:6px;color:var(--accent);box-shadow:var(--shadow-glass);&:hover{border-color:var(--accent);background:var(--surface-active)}& svg{display:block}}.g2-back-btn{display:inline-flex;align-items:center;gap:4px;padding:6px 11px;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:6px;color:var(--accent);font:500 11px/1 inherit;font-family:inherit;box-shadow:var(--shadow-glass);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;align-self:flex-start;&:hover{border-color:var(--accent);background:var(--surface-active)}}.g2-zoom-ctrl{position:absolute;right:12px;bottom:12px;display:flex;flex-direction:column;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:6px;overflow:hidden;z-index:3;box-shadow:var(--shadow-glass);& button{width:28px;height:28px;background:transparent;border:0;color:var(--muted);border-bottom:1px solid var(--graph-divider);display:grid;place-items:center;font-family:inherit;font-size:13px;&:last-child{border-bottom:0}&:hover{color:var(--accent);background:var(--surface-active)}}}.g2-zoom-pct{font:500 9px/1 ui-monospace,monospace;color:var(--muted);padding:5px 0;text-align:center;border-bottom:1px solid var(--graph-divider)}.g2-zoom-ctrl .g2-zoom-fit-btn{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;font-weight:600;font-size:9px;line-height:1;letter-spacing:-.02em;text-transform:lowercase}.g2-tooltip{position:absolute;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:7px;padding:9px 11px;pointer-events:none;min-width:170px;max-width:260px;opacity:0;transition:opacity .12s;z-index:10;box-shadow:var(--shadow-glass);&.show{opacity:1}}.g2-tt-path{font:500 11px/1.3 ui-monospace,monospace;color:var(--text);word-break:break-all;margin-bottom:4px}.g2-tt-head{display:flex;align-items:center;gap:6px;margin-bottom:6px;flex-wrap:wrap}.g2-tt-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.g2-tt-pkg{font-size:10px;color:var(--muted);word-break:break-all}.g2-tt-badge{display:inline-block;font-size:8px;padding:2px 4px;background:color-mix(in srgb,var(--accent) 22%,transparent);color:var(--accent);border-radius:3px;text-transform:uppercase;letter-spacing:.08em;font-weight:600}.g2-tooltip .tree-count-chips{margin-top:6px}:host-context(body.theme-light) .graph2-right .tree-count-chip.medium,:host-context(body.theme-light) .g2-tooltip .tree-count-chip.medium{color:#fff}.g2-selection-card{background:var(--graph-hover-bg);border:1px solid var(--border);border-radius:8px;overflow:hidden}.g2-sel-head{padding:11px 13px;border-bottom:1px solid var(--graph-divider);display:flex;align-items:center;gap:8px}.g2-sel-file-head{padding:11px 13px;border-bottom:1px solid var(--graph-divider);display:flex;flex-direction:column;gap:6px}.g2-sel-path{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;font-weight:600;font-size:12px;line-height:1.3;color:var(--text);word-break:break-all}.g2-sel-pkg-row{display:flex;align-items:center;gap:6px;min-width:0}.g2-sel-pkg{font-size:11px;color:var(--muted);word-break:break-all;min-width:0}.g2-sel-fullpath{padding:7px 13px;border-bottom:1px solid var(--graph-divider);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;font-size:10px;line-height:1.3;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.g2-sel-size{padding:5px 13px 7px;border-bottom:1px solid var(--graph-divider);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;font-size:10px;line-height:1.3;color:var(--muted);font-variant-numeric:tabular-nums}.g2-sel-dot{width:11px;height:11px;border-radius:50%;box-shadow:0 0 0 3px color-mix(in srgb,var(--dot) 22%,transparent);flex-shrink:0}.g2-sel-id{font:600 12px/1 ui-monospace,monospace;color:var(--text);word-break:break-all;flex:1;min-width:0}.g2-sel-grp{font:500 9px/1 ui-monospace,monospace;color:var(--muted);text-transform:uppercase;letter-spacing:.08em;flex-shrink:0}.g2-sel-body{padding:11px 13px}.g2-sel-row{display:flex;justify-content:space-between;gap:12px;font-size:11px;padding:5px 0;border-bottom:1px solid var(--graph-divider);&:last-child{border-bottom:0}.k{color:var(--muted);flex-shrink:0}.v{color:var(--text);font-family:ui-monospace,monospace;word-break:break-all;text-align:right;min-width:0}}.g2-sel-section{padding:9px 13px;border-top:1px solid var(--graph-divider)}.g2-sel-section-label{font-family:inherit;font-weight:600;font-size:11px;line-height:1;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);opacity:.85;margin-bottom:5px}.g2-sel-section-empty{color:var(--muted);opacity:.55;font-size:11px;font-style:italic}.g2-sel-jumps{padding:11px 13px;display:flex;gap:5px;flex-wrap:wrap;border-top:1px solid var(--graph-divider)}.g2-sel-jump{background:var(--surface-active);border:1px solid var(--border);color:var(--accent);border-radius:4px;padding:2px 8px;font-family:inherit;font-weight:500;font-size:11px;line-height:1.3;&:hover{border-color:var(--accent)}}.g2-sel-file-list{list-style:none;margin:0;padding:0;max-height:110px;overflow:hidden auto;-webkit-app-region:no-drag;app-region:no-drag;&::-webkit-scrollbar{width:4px}&::-webkit-scrollbar-thumb{background:var(--border);border-radius:2px}& li{padding:0}}.g2-sel-file-link{display:flex;align-items:center;gap:6px;width:100%;background:transparent;border:0;border-radius:3px;padding:3px 6px;font:400 11px/1.4 ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;color:var(--accent);text-align:left;&:hover{background:var(--graph-hover-bg)}.g2-sel-file-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.g2-sel-file-path{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}.g2-empty-state{background:var(--graph-hover-bg);border:1px dashed var(--border);border-radius:8px;padding:18px 14px;text-align:center;color:var(--muted);font-size:11px;line-height:1.5;& strong{color:var(--text);display:block;margin-bottom:4px;font-weight:500}}.g2-dist-bar{width:100%;height:5px;border-radius:3px;overflow:hidden;display:flex;background:var(--surface-active);margin-bottom:8px;>span{display:block;height:100%}}.g2-dist-list{display:flex;flex-direction:column;gap:2px;flex:1 1 0;min-height:0;overflow-y:auto;overscroll-behavior:none;-webkit-app-region:no-drag;app-region:no-drag;scrollbar-gutter:stable;scrollbar-width:thin;scrollbar-color:var(--border) transparent;&::-webkit-scrollbar{width:5px}&::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}}.g2-dist-empty{color:var(--muted);opacity:.55;font-size:10px;font-style:italic;padding:6px 0;text-align:center}.g2-dist-item{display:grid;grid-template-columns:8px 1fr auto auto;gap:8px;align-items:center;font-size:10px;padding:4px 6px;margin:0 -6px;background:transparent;border:0;border-radius:4px;font-family:inherit;text-align:left;width:calc(100% + 12px);&:hover{background:var(--graph-hover-bg)}&.on{background:var(--surface-active);.g2-dist-name{color:var(--accent)}}.g2-dist-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.g2-dist-name{color:var(--muted);font-family:ui-monospace,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.g2-dist-count{font-family:ui-monospace,monospace;color:var(--text)}.g2-dist-pct{font-family:ui-monospace,monospace;color:var(--muted);width:36px;text-align:right;opacity:.85}}@media print{:host{display:none!important}}
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
`;var ce=["critical","high","medium","low","high_bug","bug","informational"],Nt="node_modules";function Ue(){return Nt}function Ye(e){return typeof e!="number"||!Number.isFinite(e)?null:`${e.toLocaleString()} B`}function Wt(){return{showAll:!1,selected:null,focusedPkg:null,topPkgsTab:"issues",edgeOpacity:.22,nodeSize:1,showLabels:!1,selectedSeverities:new Set,selectedColors:new Set,pathFilter:"",hidden:new Set,solo:null,graphState:null,layoutCache:null}}var ue=Wt(),M=new Proxy(ue,{get(e,t){return ue[t]},set(e,t,r){return ue[t]=r,!0},has(e,t){return t in ue},deleteProperty(e,t){return delete ue[t]},ownKeys(){return Reflect.ownKeys(ue)},getOwnPropertyDescriptor(e,t){return Object.getOwnPropertyDescriptor(ue,t)}});function Mt(){M.graphState?._cleanup&&M.graphState._cleanup(),M.graphState=null}function Gt(e){e&&(ue=e)}function Ke(e){if(!e)return null;let t=Ue()==="node_modules"?/^(?:.*\/)?node_modules\/(@[^/]+\/[^/]+|[^/]+)/u:/^(?:.*\/)?dependencies\/(@[^/]+\/[^/]+|[^/]+)/u,r=e.match(t);if(r)return r[1];let c=e.indexOf("/");return c>0?e.slice(0,c):"/"}var Vt=["#4e9af1","#f28e2b","#59a14f","#e15759","#76b7b2","#edc948","#b07aa1","#ff9da7","#9c755f","#5cd1e5","#f1ce63","#d37295","#a0cbe8","#86bcb6","#8cd17d","#b6992d","#499894","#e15759","#e879c7","#d4a6c8"],St=["#2f8aef","#d2691e","#2ea043","#e63946","#2e9a92","#b88817","#9560e8","#d24a9c","#8a5d40","#0891b2","#a07a14","#c14e8e","#1f7ad0","#549b94","#3fb95f","#a07a14","#2a8278","#cb2c40","#c026d3","#965f93"];function Ut(){if(typeof document>"u")return!1;let e=document.body?.classList;return!!e&&(e.contains("theme-light")||e.contains("theme-pink"))}var it=new Map;function se(e){let t=Ut()?St:Vt,c=`${t===St?"l":"d"}:${e??"__own__"}`;if(it.has(c))return it.get(c);let f=e??"__own__",x=0;for(let o of f)x=x*37+o.codePointAt(0)|0;let S=((x%t.length+t.length)%t.length*7+3)%t.length,R=t[S];return it.set(c,R),R}function $t(e){if(!e)return 0;let t=0;for(let r of ce)t+=e[r]??0;return t}function Yt(e){if(!e)return null;for(let t of ce)if((e[t]??0)>0)return t;return null}function zt(e,t,r,c,f,x,p,S={}){let R=S.pkgOf??Ke,o=new Set(t),y=new Map,b=new Map;for(let d of t){let $=(e[d].imports??[]).filter(N=>o.has(N));y.set(d,$);for(let N of $)b.has(N)||b.set(N,[]),b.get(N).push(d)}let C=t.map(d=>{let $=r.get(d),N=c?.get(d)??null,h=$t($),G=R(d)??"__own__",j=Yt($);return{id:d,file:d,pkg:G,x:0,y:0,deg:0,issue:j,totalIssues:h,own:$,subtree:N,size:typeof e[d]?.size=="number"?e[d].size:null,severitySet:f?.get(d)??null,colorSet:x?.get(d)??null,findings:p?.get(d)??null,isHub:!1,label:d.split("/").pop()??d}}),n=new Map(C.map(d=>[d.file,d])),I=new Map;for(let d of t)for(let $ of y.get(d)??[]){let[N,h]=d<$?[d,$]:[$,d],G=`${N}\0${h}`,j=I.get(G);if(!j){let D=n.get(N),A=n.get(h);if(!D||!A)continue;j={a:N,b:h,cross:D.pkg!==A.pkg,fromLo:!1,fromHi:!1},I.set(G,j),D.deg++,A.deg++}d===N?j.fromLo=!0:j.fromHi=!0}let Z=[...I.values()],u=new Map;for(let d=0;d<Z.length;d++){let $=Z[d];u.has($.a)||u.set($.a,[]),u.has($.b)||u.set($.b,[]),u.get($.a).push(d),u.get($.b).push(d)}let k=new Map;for(let d of C)k.set(d.pkg,(k.get(d.pkg)??0)+1);let L=[...k.entries()].toSorted((d,$)=>$[1]-d[1]).map(([d])=>d),P=new Map;for(let d of C)P.has(d.pkg)||P.set(d.pkg,[]),P.get(d.pkg).push(d);let _={files:t,nodes:C,nodeByFile:n,edges:Z,adj:u,importsOf:y,importedBy:b,packages:L,pkgCount:k,byPkg:P};return Kt(_),_}function Kt(e){for(let t of e.nodes)t.isHub=!1;for(let t of e.edges)t.cross&&(t.fromLo&&(e.nodeByFile.get(t.b).isHub=!0),t.fromHi&&(e.nodeByFile.get(t.a).isHub=!0));for(let t of e.nodes){let r=e.importedBy.get(t.file);(!r||r.length===0)&&(t.isHub=!0)}}function Xe(e,t){if(!t||t==="/"||t==="__own__")return e;for(let r of["node_modules","dependencies",Ue()]){let c=r+"/"+t+"/",f=e.indexOf(c);if(f>=0)return e.slice(f+c.length)}return e.startsWith(t+"/")?e.slice(t.length+1):e}function Ct(e,t){let r=t.extraTopRow,c=t.hideAllFiles??!1,f=t.triageCounts??{fixed:0,invalid:0,deleted:0},x=t.triageStates??["fixed","invalid","deleted"],p={};for(let n of ce)p[n]=0;for(let n of e.nodes)if(n.severitySet)for(let I of n.severitySet)p[I]!==void 0&&p[I]++;let S=ce.some(n=>p[n]>0||M.selectedSeverities.has(n)),R=["none","red","blue","green","gray"],o={none:0,red:0,blue:0,green:0,gray:0};for(let n of e.nodes)if(n.colorSet)for(let I of n.colorSet)o[I]!==void 0&&o[I]++;let y=R.some(n=>o[n]>0||M.selectedColors.has(n)),b=E`<triage-selector variant="graph" .counts="${f}" .states="${x}"></triage-selector>`,C=c?null:E`<button type="button" class="${Se({"g2-topbar-toggle":!0,on:M.showAll})}" data-g2-show-all aria-pressed="${String(M.showAll)}"><span>All files</span><span class="g2-switch"></span></button>`;return E`<div class="graph2-topbar">${r?E`<div class="graph2-topbar-row graph2-topbar-row-extra toolbar-row">${r} ${C}<div class="g2-spacer"></div>${b}</div>`:null}<div class="graph2-topbar-row graph2-topbar-row-main toolbar-row sev-row">${S?E`<severity-chips .counts="${p}" .selected="${[...M.selectedSeverities]}" kind="graph"></severity-chips>`:null} ${y?E`<triage-filter .counts="${o}" .selected="${[...M.selectedColors]}" kind="graph"></triage-filter>`:null}<div class="toolbar-search g2-path-filter-wrap"><svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="m20 20-3.5-3.5"/></svg> <input type="text" class="g2-path-filter" id="g2-path-filter" placeholder="filter path/package…" .value="${M.pathFilter}"> <button type="button" class="g2-path-filter-clear" id="g2-path-filter-clear" title="Clear filter" aria-label="Clear filter">✕</button></div>${r?null:C}<div class="g2-spacer"></div>${r?null:b} <button type="button" class="g2-icon-btn" id="g2-fullscreen" title="Toggle fullscreen">⛶</button></div></div>`}function Xt(e,t){let r=e.split("/").filter(Boolean),c=t.split("/").filter(Boolean),f=0;for(;f<r.length&&f<c.length&&r[f]===c[f];)f++;let x=r.length-f,p=c.slice(f).join("/");return x===0?"./"+p:"../".repeat(x)+p}function Zt(e,t){if(!t&&t!=="")return e;let r=Xt(t,e);return r.length<e.length?r:e}function at(e,t,r,c){let f=r.length;if(f===0)return E`<div class="g2-sel-section"><div class="g2-sel-section-label">${t} (${f})</div><div class="g2-sel-section-empty">none</div></div>`;let x=r.map(p=>({file:p,display:Zt(p,c)}));return x.sort((p,S)=>p.display.localeCompare(S.display)),E`<div class="g2-sel-section"><div class="g2-sel-section-label">${t} (${f})</div><ul class="g2-sel-file-list">${x.map(({file:p,display:S})=>{let R=e.nodeByFile.get(p),o=R?se(R.pkg):"#666";return E`<li><button type="button" class="g2-sel-file-link" data-g2-select="${p}" title="${p}"><span class="g2-sel-file-dot" style="${$e({background:o})}"></span> <span class="g2-sel-file-path">${S}</span></button></li>`})}</ul></div>`}function Ie(e){if(!e)return E`<div class="g2-sel-section-empty">none</div>`;let r=["critical","high","medium","low","high_bug","bug","informational"].filter(c=>(e[c]??0)>0);return r.length===0?E`<div class="g2-sel-section-empty">none</div>`:E`<div class="tree-count-chips">${r.map(c=>E`<span class="${`tree-count-chip ${c}`}">${e[c]} ${c.replaceAll("_"," ")}</span>`)}</div>`}function Pt(e){let t=0;for(let p of e.edges)p.cross&&t++;let r=e.edges.length-t,c=0;for(let p of e.nodes)c+=p.totalIssues;let f=e.nodes.length===0?"0.0":(e.edges.length*2/e.nodes.length).toFixed(1),x=M.focusedPkg==="__own__"?"own source":M.focusedPkg;return E`<main class="graph2-stage"><canvas id="g2-canvas"></canvas>${M.focusedPkg?E`<div class="g2-stage-overlay"><button type="button" class="g2-back-btn" id="g2-back-to-full" title="Back to the full graph">← ${x}</button></div>`:null}<div id="g2-focus-overlay-slot" class="g2-stage-overlay-tr"></div><div class="g2-stage-stats"><span><b>${e.nodes.length}</b> files</span> <span><b>${e.packages.length}</b> packages</span> <span><b>${e.edges.length}</b> edges (${r} intra · ${t} cross)</span> <span><b>${c}</b> issues</span> <span>avg degree <b>${f}</b></span></div><div class="g2-zoom-ctrl"><button id="g2-zoom-in" title="Zoom in">+</button><div class="g2-zoom-pct" id="g2-zoom-pct">100%</div><button id="g2-zoom-out" title="Zoom out">−</button> <button id="g2-zoom-fit" class="g2-zoom-fit-btn" title="Fit to view">fit</button></div><div class="g2-tooltip" id="g2-tooltip"></div></main>`}function _t(e){let t=null;if(M.selected){let c=e.nodeByFile.get(M.selected);c&&(t=c.pkg)}else M.solo&&(t=M.solo);return!t||(e.pkgCount.get(t)??0)<=1||M.focusedPkg===t?null:E`<button type="button" class="g2-focus-pkg-btn" data-g2-focus-pkg="${t}" title="${`Focus on ${t==="__own__"?"own source":t}'s graph`}"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M8 4.6 L4 11 M8 4.6 L12 11 M5 11.4 L11 11.4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/><circle cx="8" cy="3.6" r="2" fill="currentColor"/><circle cx="3.6" cy="11.4" r="2" fill="currentColor"/><circle cx="12.4" cy="11.4" r="2" fill="currentColor"/></svg></button>`}function Ft(){return E`<aside class="graph2-right"><div class="g2-panel-title">Selection</div><div id="g2-selection-area"></div><div id="g2-top-pkgs-block"></div></aside>`}function Lt(e){let t=M.showAll&&e.nodes.length>0&&e.nodes.every(f=>typeof f.size=="number"),r=e.nodes.some(f=>f.totalIssues>0),c=M.topPkgsTab;return c==="size"&&!t&&(c="files"),c==="issues"&&!r&&(c="files"),E`<div class="g2-panel-title g2-panel-title-row"><span>Packages</span><div class="g2-mini-tabs">${r?E`<button type="button" class="${Se({"g2-mini-tab":!0,on:c==="issues"})}" data-g2-top-pkgs="issues">Issues</button>`:null} <button type="button" class="${Se({"g2-mini-tab":!0,on:c==="files"})}" data-g2-top-pkgs="files">Files</button> ${t?E`<button type="button" class="${Se({"g2-mini-tab":!0,on:c==="size"})}" data-g2-top-pkgs="size">Size</button>`:null}</div></div>${eo(e,c)}`}function Rt(e,t={}){let r=M.selected;if(r){let c=e.nodeByFile.get(r);return c?Jt(e,c,r,t):E`<div class="g2-empty-state"><strong>File not in current view</strong>Adjust filters or pick another file.</div>`}return M.solo?Qt(e,M.solo):E`<div class="g2-empty-state">Click a node or a package row to inspect.</div>`}function Jt(e,t,r,c){let f=se(t.pkg),x=t.pkg==="__own__"?"own source":t.pkg,p=Xe(r,t.pkg),S=e.importedBy.get(r)??[],R=e.importsOf.get(r)??[],o=r.lastIndexOf("/"),y=o>=0?r.slice(0,o):"";return E`<div class="g2-selection-card"><div class="g2-sel-file-head"><div class="g2-sel-path">${p}</div><div class="g2-sel-pkg-row"><span class="g2-sel-dot" style="${$e({"--dot":f,background:f})}"></span> <span class="g2-sel-pkg">${x}</span></div></div><div class="g2-sel-fullpath" title="${r}">${r}</div>${Ye(t.size)?E`<div class="g2-sel-size">${Ye(t.size)}</div>`:null}<div class="g2-sel-section"><div class="g2-sel-section-label">Own findings</div>${Ie(t.own)}</div><div class="g2-sel-section"><div class="g2-sel-section-label">Subtree findings</div>${Ie(t.subtree)}</div><div class="g2-sel-jumps">${t.totalIssues>0?E`<button type="button" class="g2-sel-jump" data-g2-jump-findings="${r}">Findings →</button>`:null} ${c.isBundleContext?t.origFile?E`<button type="button" class="g2-sel-jump" data-bundle-view-source="${t.origFile}">View source →</button>`:null:E`<button type="button" class="g2-sel-jump" data-g2-jump-file="${r}">Files →</button>`}</div>${at(e,"Imported by",S,y)} ${at(e,"Imports",R,y)}</div>`}function Qt(e,t){let r=e.nodes.filter(b=>b.pkg===t),c=r.length;if(c===0)return E`<div class="g2-empty-state"><strong>Package has no files in view</strong> Toggle "All files" to widen the file set, or pick another package.</div>`;let f=se(t),x=t==="__own__"?"own source":t,p={};for(let b of ce)p[b]=0;for(let b of r)if(b.own)for(let C of ce)p[C]+=b.own[C]??0;let S=0,R=0;for(let b of e.edges){let C=e.nodeByFile.get(b.a),n=e.nodeByFile.get(b.b);!C||!n||(C.pkg===t&&n.pkg===t?R++:(C.pkg===t||n.pkg===t)&&S++)}let o=0;for(let b of r)b.isHub&&o++;let y=new Set;for(let b of r)for(let C of e.importedBy.get(b.file)??[]){let n=e.nodeByFile.get(C);n&&n.pkg!==t&&y.add(C)}return E`<div class="g2-selection-card"><div class="g2-sel-head"><span class="g2-sel-dot" style="${$e({"--dot":f,background:f})}"></span> <span class="g2-sel-id">${x}</span> <span class="g2-sel-grp">package</span></div><div class="g2-sel-body"><div class="g2-sel-row"><span class="k">Files</span><span class="v">${c}</span></div><div class="g2-sel-row"><span class="k">Hubs</span><span class="v">${o}</span></div><div class="g2-sel-row"><span class="k">Intra edges</span><span class="v">${R}</span></div><div class="g2-sel-row"><span class="k">Cross edges</span><span class="v">${S}</span></div></div><div class="g2-sel-section"><div class="g2-sel-section-label">Findings</div>${Ie(p)}</div>${at(e,"Imported by",[...y])}</div>`}function eo(e,t){let r=e.nodes.length||1,c=t??M.topPkgsTab,f=M.selectedSeverities,x=M.selectedColors,p=f.size>0,S=x.size>0,R=p||S,o=new Map,y=new Map,b=0,C=0;for(let u of e.nodes){let k;if(R){if(k=0,u.findings)for(let L of u.findings)p&&!f.has(L.severity)||S&&!x.has(L.color)||k++}else k=u.totalIssues;o.set(u.pkg,(o.get(u.pkg)??0)+k),b+=k,typeof u.size=="number"&&(y.set(u.pkg,(y.get(u.pkg)??0)+u.size),C+=u.size)}let n;c==="issues"?n=e.packages.filter(u=>(o.get(u)??0)>0).toSorted((u,k)=>{let L=o.get(u)??0,P=o.get(k)??0;return P!==L?P-L:(e.pkgCount.get(k)??0)-(e.pkgCount.get(u)??0)}):c==="size"?n=e.packages.filter(u=>(y.get(u)??0)>0).toSorted((u,k)=>{let L=y.get(u)??0,P=y.get(k)??0;return P!==L?P-L:(e.pkgCount.get(k)??0)-(e.pkgCount.get(u)??0)}):n=[...e.packages].toSorted((u,k)=>{let L=e.pkgCount.get(u)??0,P=e.pkgCount.get(k)??0;return P!==L?P-L:(o.get(k)??0)-(o.get(u)??0)});let I=u=>c==="issues"?b>0?((o.get(u)??0)/b*100).toFixed(2):"0":c==="size"?C>0?((y.get(u)??0)/C*100).toFixed(2):"0":(e.pkgCount.get(u)/r*100).toFixed(2),Z=c==="issues"?"No packages with issues":c==="size"?"No packages with size":"No packages";return E`<div class="g2-dist-bar">${e.packages.map(u=>{let k=se(u);return E`<span style="${$e({background:k,width:`${I(u)}%`})}"></span>`})}</div><div class="g2-dist-list">${n.length===0?E`<div class="g2-dist-empty">${Z}</div>`:null} ${vt(n,u=>u,u=>{let k=se(u),L=e.pkgCount.get(u)??0,P=o.get(u)??0,_=y.get(u)??0,d=c==="issues"?P:c==="size"?Ye(_):L,$=c==="issues"?b>0?(P/b*100).toFixed(1):"0.0":c==="size"?C>0?(_/C*100).toFixed(1):"0.0":(L/r*100).toFixed(1),N=u==="__own__"?"own source":u,h=M.solo===u;return E`<button type="button" class="${Se({"g2-dist-item":!0,on:h})}" data-g2-pkg="${u}" title="${N}"><span class="g2-dist-dot" style="${$e({background:k})}"></span><span class="g2-dist-name">${N}</span><span class="g2-dist-count">${d}</span><span class="g2-dist-pct">${$}%</span></button>`})}</div>`}var lt=class extends xt{static properties={graph:{attribute:!1},options:{attribute:!1}};static styles=[Ve(wt),Ve(kt),Ve(yt)];constructor(){super(),this.graph=null,this.options={}}render(){return this.graph?E`<div class="graph2-layout">${Ct(this.graph,this.options)} ${Pt(this.graph)} ${Ft()}</div>`:E``}};customElements.define("graph-layout",lt);function to(e){let t=new Map;for(let[r,c]of e.importsOf){let f=e.nodeByFile.get(r);if(f)for(let x of c){let p=e.nodeByFile.get(x);p&&f.pkg!==p.pkg&&(t.set(f.pkg,(t.get(f.pkg)??0)+1),t.set(p.pkg,(t.get(p.pkg)??0)+1))}}return t}function oo(e){if(e.packages.length===0)return null;let t=new Set;for(let[r,c]of e.importedBy){let f=e.nodeByFile.get(r);if(f)for(let x of c){let p=e.nodeByFile.get(x);if(p&&p.pkg!==f.pkg){t.add(f.pkg);break}}}for(let r of e.packages)if(!t.has(r))return r;return null}var no=5;function It(e,t){let r=new Map;for(let x of e.nodes)t.has(x.pkg)&&(r.has(x.pkg)||r.set(x.pkg,[]),r.get(x.pkg).push(x));for(let x of r.values())x.sort((p,S)=>p.isHub!==S.isHub?p.isHub?-1:1:S.deg-p.deg);let c=new Map,f=new Map;for(let[x,p]of t){let S=r.get(x);if(!S||S.length===0)continue;let R=S.length,o=0;for(let k of S)if(k.isHub)o++;else break;let y=o>0&&o<=no,b=y?o:0,C=R-b,n=p.groupR,I=Array.from({length:R}),Z=Array.from({length:R});for(let k=0;k<R;k++){let L=k*137.508*Math.PI/180,P;if(k<b)P=b<=1?0:Math.sqrt(k/(b-1))*.3*n;else{let _=k-b;P=C<=1?.4*n:(.4+Math.sqrt(_/(C-1))*.6)*n}I[k]=p.x+Math.cos(L)*P,Z[k]=p.y+Math.sin(L)*P}let u=Array.from({length:R},()=>!1);for(let k=0;k<R;k++){let L=S[k],P,_;y&&L.isHub?(_=0,P=b):y?(_=b,P=R):(_=0,P=R);let d=0,$=0,N=0,h=e.importsOf.get(L.file);if(h)for(let A of h){let q=c.get(A);q!==void 0&&(d+=q,$+=f.get(A),N++)}let G=e.importedBy.get(L.file);if(G)for(let A of G){let q=c.get(A);q!==void 0&&(d+=q,$+=f.get(A),N++)}let j=!1;if(N>0){d/=N,$/=N;let A=d-p.x,q=$-p.y;A*A+q*q>1&&(j=!0)}let D=-1;if(j){let A=1/0;for(let q=_;q<P;q++){if(u[q])continue;let l=I[q]-d,F=Z[q]-$,O=l*l+F*F;O<A&&(A=O,D=q)}}else for(let A=_;A<P;A++)if(!u[A]){D=A;break}u[D]=!0,L.x=I[D],L.y=Z[D],c.set(L.file,L.x),f.set(L.file,L.y)}}}function At(e,t,r){let c=t/2,f=r/2,x=Math.min(t,r)/2;if(e.packages.length===0)return;let S=oo(e),R=to(e),o=(S?e.packages.filter(l=>l!==S):[...e.packages]).toSorted((l,F)=>{let O=(R.get(F)??0)-(R.get(l)??0);return O!==0?O:(e.pkgCount.get(F)??0)-(e.pkgCount.get(l)??0)}),y=o.length,b;y<=0?b=0:y<=6?b=.65:y<=20?b=.82:b=.95;let C=Math.max(1,Math.sqrt(50/Math.max(1,y))),n=.22,I=.12,Z=.04,u=new Map,k;if(S){let l=e.pkgCount.get(S)??0,F=Math.min(n,(.012+Math.sqrt(l)*.004)*C);k=Math.max(y<=6?.4:y<=20?.36:.34,F+I+Z),u.set(S,{x:c,y:f,size:l,groupR:F*x})}else y<=1?k=0:y<=6?k=.4:y<=20?k=.32:k=.3;if(y===0){It(e,u);return}let L=new Map;for(let l of e.edges){if(!l.cross)continue;let F=e.nodeByFile.get(l.a)?.pkg,O=e.nodeByFile.get(l.b)?.pkg;if(!F||!O||F===O)continue;L.has(F)||L.set(F,new Map),L.has(O)||L.set(O,new Map);let ee=L.get(F),J=L.get(O);ee.set(O,(ee.get(O)??0)+1),J.set(F,(J.get(F)??0)+1)}let P=Math.max(1,Math.min(10,Math.round(Math.sqrt(y)/1.2))),_=Array.from({length:P+1});for(let l=0;l<=P;l++)_[l]=Math.floor(l*l/(P*P)*y);_[P]=y;let d=.2,$=Array.from({length:P}),N=Array.from({length:P});for(let l=0;l<P;l++){let F=_[l],O=_[l+1];$[l]=O-F;let ee=0;for(let J=F;J<O;J++)ee+=e.pkgCount.get(o[J])??0;N[l]=ee}let h=Array.from({length:P});for(let l=0;l<P;l++){let F=(_[l]+_[l+1]-1)/2/Math.max(1,y-1);h[l]=Math.sqrt(Math.max(0,F))}let G=Array.from({length:P});G[0]=h[0];for(let l=1;l<P;l++){let F=$[l-1],O=N[l-1],ee=F>0?O/F:1,J=1+d*Math.sqrt(Math.max(0,ee-1));G[l]=G[l-1]+(h[l]-h[l-1])*J}let j=Array.from({length:P});for(let l=0;l<P;l++)j[l]=G[l]-h[l];let D=Array.from({length:y}),A=Array.from({length:y}),q=0;for(let l=0;l<y;l++){for(;q<P-1&&l>=_[q+1];)q++;let F=l*137.508%360*Math.PI/180,ee=(y<=1?0:Math.sqrt(l/(y-1)))+j[q],J=y===1?S?k:0:k+ee*(b-k);D[l]=c+Math.cos(F)*J*x,A[l]=f+Math.sin(F)*J*x}for(let l=0;l<P;l++){let F=_[l],O=_[l+1],ee=O-F;if(ee===0)continue;let J=Array.from({length:ee},()=>!1);for(let Ce=F;Ce<O;Ce++){let ve=o[Ce],Ae=L.get(ve),de=0,ae=0,ie=0;if(Ae)for(let[te,oe]of Ae){let fe=u.get(te);fe&&(de+=fe.x*oe,ae+=fe.y*oe,ie+=oe)}let ye=!1;if(ie>0){de/=ie,ae/=ie;let te=de-c,oe=ae-f;te*te+oe*oe>1&&(ye=!0)}let ge=-1;if(ye){let te=1/0;for(let oe=0;oe<ee;oe++){if(J[oe])continue;let fe=F+oe,He=D[fe]-de,Ee=A[fe]-ae,Fe=He*He+Ee*Ee;Fe<te&&(te=Fe,ge=oe)}}else for(let te=0;te<ee;te++)if(!J[te]){ge=te;break}J[ge]=!0;let Pe=F+ge,_e=e.pkgCount.get(ve)??0,Be=Math.min(I,(.012+Math.sqrt(_e)*.004)*C);u.set(ve,{x:D[Pe],y:A[Pe],size:_e,groupR:Be*x})}}It(e,u)}function Bt(e,t,r){let c=t/2,f=r/2,x=Math.min(t,r)/2,p=e.nodes.length;if(p===0)return;let S=[...e.nodes].toSorted((R,o)=>o.deg-R.deg);for(let R=0;R<p;R++){let o=S[R],y=R*137.508%360*Math.PI/180,b=p<=1?0:Math.sqrt(R/(p-1));o.x=c+Math.cos(y)*b*.85*x,o.y=f+Math.sin(y)*b*.85*x}}function Ht(e,t,r,c){let f=e.length,x=c||760,p=r||1100,S=Math.sqrt(p*x/Math.max(f,1))*1.1,R=_=>{let d=0;for(let $ of _)d=d*31+$.codePointAt(0)|0;return d},o=Math.ceil(Math.sqrt(f*p/x)),y=Math.ceil(f/o),b=x/(y+1),C=p/(o+1),n=e.map((_,d)=>{let $=d%o,N=Math.floor(d/o),h=R(_);return{file:_,x:($+1)*C+(h%100-50)*C*.4,y:(N+1)*b+((h>>7)%100-50)*b*.4,dx:0,dy:0}}),I=new Map(n.map((_,d)=>[_.file,d])),Z=[];for(let _ of e)for(let d of t.get(_)??[])I.has(d)&&Z.push([I.get(_),I.get(d)]);let u=new Map;for(let _=0;_<f;_++){let d=Ke(n[_].file)??"__own__";u.has(d)||u.set(d,[]),u.get(d).push(_)}let k=Math.min(500,Math.max(180,100+f*3)),L=Math.min(p,x)/6,P=.3;for(let _=0;_<k;_++){let d=L*Math.pow(P/L,_/k);for(let h of n)h.dx=0,h.dy=0;for(let h=0;h<f;h++)for(let G=h+1;G<f;G++){let j=n[h],D=n[G],A=j.x-D.x,q=j.y-D.y,l=Math.sqrt(A*A+q*q);if(l<.01){let O=R(j.file+D.file);A=(O%100-50)*.01||.5,q=((O>>7)%100-50)*.01||.5,l=Math.sqrt(A*A+q*q)}let F=S*S/l;j.dx+=A/l*F,j.dy+=q/l*F,D.dx-=A/l*F,D.dy-=q/l*F}for(let[h,G]of Z){let j=n[h],D=n[G],A=j.x-D.x,q=j.y-D.y,l=Math.sqrt(A*A+q*q)||.01,F=l*l/S;j.dx-=A/l*F,j.dy-=q/l*F,D.dx+=A/l*F,D.dy+=q/l*F}let $=.055*Math.min(1,d/(L*.3));for(let[,h]of u){if(h.length<2)continue;let G=0,j=0;for(let D of h)G+=n[D].x,j+=n[D].y;G/=h.length,j/=h.length;for(let D of h)n[D].dx+=(G-n[D].x)*$,n[D].dy+=(j-n[D].y)*$}let N=50;for(let h of n){let G=Math.sqrt(h.dx*h.dx+h.dy*h.dy)||.01;h.x+=h.dx/G*Math.min(G,d),h.y+=h.dy/G*Math.min(G,d),h.x=Math.max(N,Math.min(p-N,h.x)),h.y=Math.max(N,Math.min(x-N,h.y))}}return n}var Et={critical:"#ff5470",high:"#ff9d4a",medium:"#f4d35e",low:"#67c2ff",high_bug:"#a06c3f",bug:"#7a6d62",informational:"#218bff"},ct={dark:{bg:"#0c0c0c",grid:"rgba(255, 255, 255, 0.022)",selectRing:"#ffffff",edgeIntra:"rgba(180, 195, 215, ALPHA)",hubRing:"rgba(255, 255, 255, ALPHA)",labelFill:"rgba(230, 233, 238, 0.78)",labelShadow:"rgba(12, 12, 12, 0.98)",labelOutline:"rgba(12, 12, 12, 0.9)",labelDefault:"rgba(200, 210, 225, 0.78)",labelHover:"rgba(230, 237, 243, 0.95)",labelSelected:"#fff"},light:{bg:"#f6f8fa",grid:"rgba(0, 0, 0, 0.04)",selectRing:"#0969da",edgeIntra:"rgba(50, 70, 100, ALPHA)",hubRing:"rgba(0, 0, 0, ALPHA)",labelFill:"rgba(40, 50, 70, 0.85)",labelShadow:"rgba(255, 255, 255, 0.95)",labelOutline:"rgba(255, 255, 255, 0.9)",labelDefault:"rgba(50, 60, 80, 0.85)",labelHover:"rgba(20, 25, 35, 0.95)",labelSelected:"#000"},pink:{bg:"#fff0f7",grid:"rgba(0, 0, 0, 0.04)",selectRing:"#0969da",edgeIntra:"rgba(50, 70, 100, ALPHA)",hubRing:"rgba(0, 0, 0, ALPHA)",labelFill:"rgba(40, 50, 70, 0.85)",labelShadow:"rgba(255, 255, 255, 0.95)",labelOutline:"rgba(255, 255, 255, 0.9)",labelDefault:"rgba(50, 60, 80, 0.85)",labelHover:"rgba(20, 25, 35, 0.95)",labelSelected:"#000"}};function ro(){let e=document.body.classList;return e.contains("theme-pink")?ct.pink:e.contains("theme-light")?ct.light:ct.dark}function ze(e){return Math.max(0,Math.min(255,Math.round(e*255))).toString(16).padStart(2,"0")}function so(e,t,r){let f=e.querySelector("graph-layout")?.shadowRoot;if(!f)return;let x=f.querySelector("#g2-canvas"),p=f.querySelector("#g2-tooltip"),S=f.querySelector(".graph2-stage"),R=f.querySelector("#g2-zoom-pct");if(!x)return;Mt();let o=x.getContext("2d"),y=window.devicePixelRatio||1,b=0,C=0,n={tx:0,ty:0,k:1},I=null,Z=0,u=0,k=!0,L=!0;function P(){if(!k)return;let i=M.layoutCache,g=M.focusedPkg;if(i&&i.files===t.files&&i.w===u&&i.h===Z&&i.focused===g)for(let v of t.nodes){let s=i.pos.get(v.file);s&&(v.x=s.x,v.y=s.y)}else{if(g)if(t.nodes.length>50)Bt(t,u,Z);else{let s=Ht(t.files,t.importsOf,u,Z),m=new Map(s.map(z=>[z.file,z]));for(let z of t.nodes){let T=m.get(z.file);T&&(z.x=T.x,z.y=T.y)}}else At(t,u,Z);let v=new Map;for(let s of t.nodes)v.set(s.file,{x:s.x,y:s.y});M.layoutCache={files:t.files,w:u,h:Z,pos:v,focused:g}}k=!1}function _(){if(t.nodes.length===0)return{k:1,tx:C/2,ty:b/2};let i=-1/0,g=-1/0,v=1/0,s=1/0;for(let a of t.nodes)a.x<v&&(v=a.x),a.y<s&&(s=a.y),a.x>i&&(i=a.x),a.y>g&&(g=a.y);let m=Math.max(20,g-s),z=Math.max(20,i-v),T=(v+i)/2,W=(s+g)/2,V=Math.min(C,b)*.1,Y=Math.min((C-V*2)/z,(b-V*2)/m,4),K=Math.max(.05,Y);return{k:K,tx:C/2-T*K,ty:b/2-W*K}}function d(){let i=_();n.k=i.k,n.tx=i.tx,n.ty=i.ty}function $(i,g){return[i*n.k+n.tx,g*n.k+n.ty]}function N(i,g){return[(i-n.tx)/n.k,(g-n.ty)/n.k]}function h(i){return!M.hidden.has(i.pkg)}function G(i){if(M.selectedSeverities.size>0){let v=i.severitySet;if(!v)return!0;let s=!1;for(let m of M.selectedSeverities)if(v.has(m)){s=!0;break}if(!s)return!0}if(M.selectedColors.size>0){let v=i.colorSet;if(!v)return!0;let s=!1;for(let m of M.selectedColors)if(v.has(m)){s=!0;break}if(!s)return!0}if(M.solo&&i.pkg!==M.solo)return!0;let g=M.pathFilter;if(g){let v=g.toLowerCase(),s=i.file.toLowerCase().includes(v),m=i.pkg&&i.pkg.toLowerCase().includes(v);if(!s&&!m)return!0}return!1}function j(i){let g=(i.isHub?4.9:3.5)*M.nodeSize,v=Math.max(.6,Math.min(1.6,n.k));return g*v}function D(){let i=S.getBoundingClientRect(),g=b,v=C;C=Math.max(80,i.width),b=Math.max(80,i.height),y=window.devicePixelRatio||1,x.width=C*y,x.height=b*y,x.style.width=C+"px",x.style.height=b+"px",o.setTransform(y,0,0,y,0,0),(u===0||Z===0)&&(u=C,Z=b,k=!0),P();let s=v>0&&(Math.abs(C-v)/v>.15||Math.abs(b-g)/g>.15);(L||s)&&(d(),L=!1),O()}let A=null,q=!0,l=!1,F=!1;function O(){q=!0,!(l||F)&&(l=!0,A=requestAnimationFrame(()=>{l=!1,q&&!F&&(q=!1,ee())}))}function ee(){let i=ro();o.fillStyle=i.bg,o.fillRect(0,0,C,b),J(i);let g=M.selected,v=g?t.nodeByFile.get(g):null;if(M.focusedPkg&&t.nodes.length<=50){Ce(i,g,v);return}for(let s of t.edges){let m=t.nodeByFile.get(s.a),z=t.nodeByFile.get(s.b);if(!m||!z||!h(m)||!h(z))continue;let T=M.edgeOpacity;g?T=s.a===g||s.b===g?.85:M.edgeOpacity*.25:I&&(s.a===I||s.b===I)&&(T=Math.min(.9,T+.5)),G(m)&&G(z)&&(T=Math.min(T,.04));let[W,V]=$(m.x,m.y),[Y,K]=$(z.x,z.y);if(s.cross){let a=o.createLinearGradient(W,V,Y,K);a.addColorStop(0,se(m.pkg)+ze(T)),a.addColorStop(1,se(z.pkg)+ze(T)),o.strokeStyle=a,o.lineWidth=.85}else o.strokeStyle=i.edgeIntra.replace("ALPHA",String(T*.7)),o.lineWidth=.55;o.beginPath(),o.moveTo(W,V),o.lineTo(Y,K),o.stroke()}for(let s of t.nodes){if(!h(s))continue;let m=s.file===I,z=s.file===g;if(!s.isHub&&!m&&!z||G(s)&&!m&&!z)continue;let[T,W]=$(s.x,s.y),Y=j(s)*(z?6:m?4.5:3),K=o.createRadialGradient(T,W,0,T,W,Y),a=se(s.pkg);K.addColorStop(0,a+"55"),K.addColorStop(1,a+"00"),o.fillStyle=K,o.beginPath(),o.arc(T,W,Y,0,Math.PI*2),o.fill()}for(let s of t.nodes){if(!h(s))continue;let[m,z]=$(s.x,s.y),T=j(s),W=1,V=g&&s.file===g;if(g&&!V&&(W=(t.adj.get(g)??[]).some(K=>{let a=t.edges[K];return a.a===s.file||a.b===s.file})?1:.25),!V&&G(s)&&(W=Math.min(W,.1)),o.fillStyle=se(s.pkg)+ze(W),o.beginPath(),o.arc(m,z,T,0,Math.PI*2),o.fill(),s.isHub&&(o.strokeStyle=i.hubRing.replace("ALPHA",String(.55*W)),o.lineWidth=.8,o.stroke()),s.issue){let Y=Et[s.issue],K=T+(s.issue==="critical"?4.2:s.issue==="high"?3.4:2.8),a=s.issue==="critical"?1.8:s.issue==="high"?1.5:s.issue==="medium"?1.3:1.1;o.strokeStyle=Y,o.globalAlpha=W,o.lineWidth=a,o.beginPath(),o.arc(m,z,K,0,Math.PI*2),o.stroke(),o.globalAlpha=1}}if(n.k>1.4){let m=0;if(n.k<9&&!M.showLabels)for(let T of t.nodes){if(!h(T))continue;let[W,V]=$(T.x,T.y);if(!(W<0||W>C||V<0||V>b)&&(m++,m>=50))break}let z=n.k>=9||m<50;if(M.showLabels||z){o.font="10px ui-monospace, SFMono-Regular, Menlo, Monaco, monospace",o.fillStyle=i.labelFill,o.textAlign="left",o.textBaseline="middle";let T=11,W=2,V=250,Y=(w,H)=>w>-V&&w<C+V&&H>-V&&H<b+V,K=[];for(let w of t.nodes){if(!h(w))continue;let[H,X]=$(w.x,w.y);if(!Y(H,X))continue;let Q=j(w);K.push({file:w.file,x0:H-Q,x1:H+Q,y0:X-Q,y1:X+Q})}let a=[];for(let w of t.nodes){if(!h(w)||!w.isHub&&n.k<2.4)continue;let[H,X]=$(w.x,w.y);if(!Y(H,X))continue;let Q=j(w),ne=H+Q+4,re=X+1,ke=o.measureText(w.label).width+W,Te=w.file===M.selected,Oe=w.file===I,qe=Te?3:Oe?2:w.isHub?1:0;a.push({file:w.file,n:w,tx:ne,ty:re,prio:qe,x0:ne-W,x1:ne+ke,y0:re-T/2,y1:re+T/2})}a.sort((w,H)=>H.prio-w.prio);let B=[],U=(w,H)=>w.x0<H.x1&&H.x0<w.x1&&w.y0<H.y1&&H.y0<w.y1;for(let w of a){let H=!1;for(let X of K)if(X.file!==w.file&&U(w,X)){H=!0;break}if(!H){for(let X of B)if(U(w,X)){H=!0;break}}H||B.push(w)}for(let w of B)o.fillText(w.n.label,w.tx,w.ty)}}if(v&&h(v)){let[s,m]=$(v.x,v.y),z=j(v);o.strokeStyle=i.selectRing,o.lineWidth=1.5,o.beginPath(),o.arc(s,m,z+5,0,Math.PI*2),o.stroke()}R&&(R.textContent=`${Math.round(n.k*100)}%`)}function J(i){if(n.k<.4)return;let g=80,v=(n.tx%g+g)%g,s=(n.ty%g+g)%g;o.strokeStyle=i.grid,o.lineWidth=1,o.beginPath();for(let m=v;m<C;m+=g)o.moveTo(m,0),o.lineTo(m,b);for(let m=s;m<b;m+=g)o.moveTo(0,m),o.lineTo(C,m);o.stroke()}function Ce(i,g,v){let s=se(M.focusedPkg),m=new Set;if(I){m.add(I);for(let a of t.adj.get(I)??[]){let B=t.edges[a];m.add(B.a),m.add(B.b)}}let z=a=>(a.isHub?6:4)*M.nodeSize;for(let a of t.edges){let B=t.nodeByFile.get(a.a),U=t.nodeByFile.get(a.b);if(!B||!U||!h(B)||!h(U))continue;let w=a.fromLo&&a.fromHi,H=!w&&a.fromHi,X=H?U:B,Q=H?B:U,ne=I&&(a.a===I||a.b===I),re=g&&(a.a===g||a.b===g),ke=(g||I)&&!ne&&!re,Te=z(X),Oe=z(Q),[qe,ft]=$(X.x,X.y),[pt,ut]=$(Q.x,Q.y),Ze=pt-qe,Je=ut-ft,Qe=Math.sqrt(Ze*Ze+Je*Je)||1,et=Ze/Qe,tt=Je/Qe,be=qe+et*(Te+1.5),he=ft+tt*(Te+1.5),me=pt-et*(Oe+3.5),xe=ut-tt*(Oe+3.5),gt=Math.min(Qe*.15,30),Le=(be+me)/2-tt*gt,Re=(he+xe)/2+et*gt;o.beginPath(),o.moveTo(be,he),o.quadraticCurveTo(Le,Re,me,xe);let we;if(re?we=.9:ne?we=.85:ke?we=.05:we=Math.min(.85,M.edgeOpacity*3),o.strokeStyle=s+ze(we),o.lineWidth=re||ne?1.5:.85,o.stroke(),ke)continue;let le=Math.max(5,7),pe=le*.42,De=.9,ot=2*(1-De)*(Le-be)+2*De*(me-Le),nt=2*(1-De)*(Re-he)+2*De*(xe-Re),bt=Math.sqrt(ot*ot+nt*nt)||1,je=ot/bt,Ne=nt/bt;if(o.beginPath(),o.moveTo(me,xe),o.lineTo(me-je*le+Ne*pe,xe-Ne*le-je*pe),o.lineTo(me-je*le-Ne*pe,xe-Ne*le+je*pe),o.closePath(),o.fillStyle=s+ze(Math.min(1,we+.15)),o.fill(),w){let rt=1.8*(Le-be)+.2*(me-Le),st=2*(1-.1)*(Re-he)+2*.1*(xe-Re),ht=Math.sqrt(rt*rt+st*st)||1,We=rt/ht,Ge=st/ht;o.beginPath(),o.moveTo(be,he),o.lineTo(be+We*le-Ge*pe,he+Ge*le+We*pe),o.lineTo(be+We*le+Ge*pe,he+Ge*le-We*pe),o.closePath(),o.fill()}}for(let a of t.nodes){if(!h(a))continue;let[B,U]=$(a.x,a.y),w=z(a),H=a.file===I,X=a.file===g,Q=(g||I)&&!m.has(a.file)&&!X?.15:1;if(o.globalAlpha=Q,X||H||a.isHub){let ne=w*(X?4:H?3:2.4),re=o.createRadialGradient(B,U,w*.6,B,U,ne);re.addColorStop(0,s+ze(X?.4:.25)),re.addColorStop(1,s+"00"),o.fillStyle=re,o.beginPath(),o.arc(B,U,ne,0,Math.PI*2),o.fill()}if(o.fillStyle=s,o.beginPath(),o.arc(B,U,w,0,Math.PI*2),o.fill(),a.isHub&&(o.strokeStyle=i.hubRing.replace("ALPHA","0.55"),o.lineWidth=.9,o.stroke()),a.issue){let ne=Et[a.issue],re=w+(a.issue==="critical"?4.2:a.issue==="high"?3.4:2.8),ke=a.issue==="critical"?1.8:a.issue==="high"?1.5:a.issue==="medium"?1.3:1.1;o.strokeStyle=ne,o.lineWidth=ke,o.beginPath(),o.arc(B,U,re,0,Math.PI*2),o.stroke()}o.globalAlpha=1}o.font="600 11px ui-monospace, SFMono-Regular, Menlo, Monaco, monospace",o.textAlign="center",o.textBaseline="top",o.lineJoin="round";let T=13,W=2,V=[];for(let a of t.nodes){if(!h(a))continue;let[B,U]=$(a.x,a.y),w=z(a),H=U+w+4,X=o.measureText(a.label).width/2+W,Q=a.file===g,ne=a.file===I,re=Q?3:ne?2:a.isHub?1:0;V.push({n:a,sx:B,ty:H,halfW:X,isSel:Q,isHov:ne,prio:re,x0:B-X,x1:B+X,y0:H,y1:H+T})}V.sort((a,B)=>B.prio-a.prio);let Y=[],K=(a,B)=>a.x0<B.x1&&B.x0<a.x1&&a.y0<B.y1&&B.y0<a.y1;for(let a of V){let B=!1;for(let U of Y)if(K(a,U)){B=!0;break}B||Y.push(a)}for(let a of Y){let{n:B,sx:U,ty:w,isSel:H,isHov:X}=a,Q=(g||I)&&!m.has(B.file)&&!H?.2:1;o.globalAlpha=Q,o.shadowColor=i.labelShadow,o.shadowBlur=4,o.strokeStyle=i.labelOutline,o.lineWidth=3,o.strokeText(B.label,U,w),o.shadowBlur=0,o.fillStyle=H?i.labelSelected:X?i.labelHover:i.labelDefault,o.fillText(B.label,U,w),o.globalAlpha=1}if(v&&h(v)){let[a,B]=$(v.x,v.y),U=z(v);o.strokeStyle=i.selectRing,o.lineWidth=1.8,o.beginPath(),o.arc(a,B,U+4,0,Math.PI*2),o.stroke()}R&&(R.textContent=`${Math.round(n.k*100)}%`)}function ve(i,g){let v=null,s=1/0,m=6;for(let z of t.nodes){if(!h(z))continue;let[T,W]=$(z.x,z.y),V=T-i,Y=W-g,K=V*V+Y*Y,a=j(z)+m;K<a*a&&K<s&&(s=K,v=z)}return v}function Ae(i,g,v){if(!p)return;let s=S.getBoundingClientRect(),m=se(i.pkg),z=i.pkg==="__own__"?"own source":i.pkg,T=Xe(i.file,i.pkg);Me(E`<div class="g2-tt-path">${T}</div><div class="g2-tt-head"><span class="g2-tt-dot" style="${`background:${m}`}"></span> <span class="g2-tt-pkg">${z}</span></div>${i.totalIssues>0?Ie(i.own):null}`,p),p.classList.add("show");let W=p.offsetWidth,V=p.offsetHeight,Y=g-s.left,K=v-s.top,a=s.width,B=s.height,U=12,w=Y+U;w+W>a-4&&(w=Y-W-U),w<4&&(w=4);let H=K+U;H+V>B-4&&(H=K-V-U),H<4&&(H=4),p.style.left=`${w}px`,p.style.top=`${H}px`}function de(){p&&p.classList.remove("show")}let ae=!1,ie=null,ye=!1,ge=i=>{i.button===0&&(i.target.closest(".g2-stage-overlay, .g2-stage-overlay-tr, .g2-zoom-ctrl")||(ae=!0,ye=!1,ie={x:i.clientX,y:i.clientY,tx:n.tx,ty:n.ty}))},Pe=i=>{let g=S.getBoundingClientRect(),v=i.clientX-g.left,s=i.clientY-g.top;if(ae){let T=i.clientX-ie.x,W=i.clientY-ie.y;Math.abs(T)+Math.abs(W)>3&&(ye=!0),n.tx=ie.tx+T,n.ty=ie.ty+W,de(),O();return}let m=ve(v,s),z=I;I=m?.file??null,x.style.cursor=m?"default":"grab",m?Ae(m,i.clientX,i.clientY):z&&de(),I!==z&&O()},_e=i=>{if(ae&&!ye){let g=S.getBoundingClientRect(),v=i.clientX-g.left,s=i.clientY-g.top,m=ve(v,s);M.selected=m?.file??null,r(),O()}ae=!1},Be=()=>{let i=I!==null;I=null,de(),i&&O()},te=i=>{i.preventDefault();let g=S.getBoundingClientRect(),v=i.clientX-g.left,s=i.clientY-g.top,m=Math.exp(-i.deltaY*.0015),z=_();if(m<1&&n.k<=z.k*1.0001){n.k=z.k;let Y=Math.min(.4,(1-m)*3);n.tx+=(z.tx-n.tx)*Y,n.ty+=(z.ty-n.ty)*Y,O();return}let[T,W]=N(v,s),V=Math.max(z.k,Math.min(9.99,n.k*m));n.k=V,n.tx=v-T*n.k,n.ty=s-W*n.k,O()};S.addEventListener("mousedown",ge),window.addEventListener("mousemove",Pe),window.addEventListener("mouseup",_e),S.addEventListener("mouseleave",Be),S.addEventListener("wheel",te,{passive:!1});function oe(i){let g=_().k;i=Math.max(g,Math.min(9.99,i));let v=C/2,s=b/2,[m,z]=N(v,s);n.k=i,n.tx=v-m*n.k,n.ty=s-z*n.k,O()}let fe=f.querySelector("#g2-zoom-in"),He=f.querySelector("#g2-zoom-out"),Ee=f.querySelector("#g2-zoom-fit");fe?.addEventListener("click",()=>oe(n.k*1.4)),He?.addEventListener("click",()=>oe(n.k/1.4)),Ee?.addEventListener("click",()=>{d(),O()}),D();let Fe=new ResizeObserver(()=>D());Fe.observe(S);let dt=new MutationObserver(i=>{for(let g of i){let v=(g.oldValue||"").includes("report-fullscreen"),s=document.body.classList.contains("report-fullscreen");if(v!==s){u=0,Z=0,k=!0,L=!0,M.layoutCache=null,setTimeout(()=>D(),80);return}O()}});dt.observe(document.body,{attributes:!0,attributeFilter:["class"],attributeOldValue:!0}),O(),M.graphState={requestDraw:O,_cleanup:()=>{F=!0,cancelAnimationFrame(A),Fe.disconnect(),dt.disconnect(),S.removeEventListener("mousedown",ge),window.removeEventListener("mousemove",Pe),window.removeEventListener("mouseup",_e),S.removeEventListener("mouseleave",Be),S.removeEventListener("wheel",te)}}}function Xo(e,t){let r=document.querySelector("graph-layout")?.shadowRoot;if(!r)return;let c=Tt(e),f=r.querySelector("#g2-selection-area");f&&Me(Rt(c,t),f);let x=r.querySelector("#g2-focus-overlay-slot");x&&Me(_t(c),x)}function Zo(e){let t=document.querySelector("graph-layout")?.shadowRoot;if(!t)return;let r=t.querySelector("#g2-top-pkgs-block");r&&Me(Lt(Tt(e)),r)}function Tt(e){let t=zt(e.treeData,e.files,e.ownCounts,e.transitiveCounts,e.severitySets,e.colorSets,e.fileFindings,e.options);if(e.strippedToOrig)for(let r of t.nodes)r.origFile=e.strippedToOrig.get(r.file);return t}export{Gt as _swapGraph2Impl,so as attachGraph2Interaction,Tt as buildGraphFromPrep,Xo as refreshSidebar,Zo as refreshTopPkgs};
|
|
1
|
+
import"./chunk-VFWMQ3LG.js";import{a as e}from"./chunk-R5O6FAW4.js";import{C as t,F as n,a as r,d as i,e as a,fa as o,ga as s,ha as c,oa as l,pa as u,ta as d,va as f,wa as p,xa as m,ya as h}from"./chunk-FMXWXDR4.js";import"./chunk-2K6UN3PC.js";import{e as g}from"./chunk-WCPJDAYA.js";import{e as _}from"./chunk-IYPY47MC.js";import{a as v,d as y}from"./chunk-PWFUOLZK.js";import"./chunk-HT2SSA3V.js";import{j as b}from"./chunk-SXV2T5C4.js";import{d as x,l as S,m as C,n as w,o as T}from"./chunk-WFYLMF6Z.js";import"./chunk-C4Z6ZBXV.js";import{a as E,c as D,i as O,j as k}from"./chunk-2XUEZHIP.js";import"./chunk-TUII34K2.js";import"./chunk-OOJM4CTU.js";var A=`*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}:host{display:grid;grid-template-columns:1fr 300px;grid-template-rows:auto 1fr;grid-template-areas:"topbar right" "stage right";min-height:0;border:1px solid var(--border);border-radius:var(--ui-radius, 8px);overflow:hidden;background:var(--graph-canvas-bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,sans-serif;font-size:12px}.graph2-layout{display:contents}:host([matrix]){grid-template-columns:minmax(0,1fr) 300px}.graph2-topbar{grid-area:topbar;display:flex;flex-direction:column;gap:.5rem;padding:var(--graph-topbar-padding, .6rem .75rem .6rem var(--graph-topbar-left-padding, .75rem));font-size:.825rem;background:var(--surface);backdrop-filter:var(--glass-blur);border-bottom:1px solid var(--graph-divider)}.graph2-topbar-row{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem;padding:0}.graph2-topbar .g2-spacer{flex:1}.graph2-topbar-row-pinned{flex-wrap:nowrap;align-items:flex-start}.graph2-topbar-row-pinned>#g2-fullscreen{margin-top:2px}.g2-topbar-controls{display:flex;flex:1;flex-wrap:wrap;align-items:center;gap:.75rem;min-width:0}.g2-topbar-controls>.g2-reason-scope,.g2-topbar-controls>.g2-issues-switch{margin-left:auto}.g2-topbar-controls>.g2-reason-scope+.g2-issues-switch{margin-left:0}.g2-topbar-controls .g2-path-filter-wrap{flex:1 1 8rem;min-width:0;max-width:12rem}.g2-matrix-controls{display:flex;align-items:center;flex-wrap:wrap;gap:8px;font-size:11px;& button{height:30px;padding:4px 7px;border:1px solid var(--border);border-radius:var(--ui-radius, 4px);background:var(--surface);color:var(--text);font:inherit}& button:hover,button[aria-pressed=true]{background:var(--graph-hover-bg);border-color:var(--muted)}}.graph2-topbar triage-selector{margin-left:auto}.g2-icon-btn{width:28px;height:28px;border-radius:var(--ui-radius, 5px);background:var(--graph-hover-bg);border:1px solid var(--border);color:var(--muted);display:grid;place-items:center;font-family:inherit;&:hover{color:var(--accent);border-color:var(--accent)}}.g2-path-filter-wrap{position:relative;flex:0 0 12rem;padding-right:22px}.g2-path-filter-wrap .g2-path-filter-clear{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:grid;place-items:center;width:18px;height:18px;background:transparent;border:0;border-radius:var(--ui-radius, 50%);color:var(--muted);font:400 10px/1 inherit;font-family:inherit;&:hover{color:var(--text);background:var(--surface-active)}}.g2-path-filter:placeholder-shown~.g2-path-filter-clear{display:none}.g2-layout-tabs{display:inline-flex;flex-shrink:0;border:1px solid var(--border);border-radius:var(--ui-radius, 6px);padding:2px;gap:2px;& button{position:relative;display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:var(--ui-radius, 4px);background:transparent;color:var(--muted);font:inherit;font-size:11px;padding:5px 7px}& button[aria-pressed=true]{background:var(--graph-hover-bg);color:var(--text);box-shadow:var(--graph-layout-active-shadow, inset 0 0 0 1px var(--border))}}.g2-reason-scope{--scope-height: 30px}.graph2-right{grid-area:right;border-left:1px solid var(--graph-divider);background:var(--surface);backdrop-filter:var(--glass-blur);display:flex;flex-direction:column;overflow:hidden;padding:14px}.g2-panel-title{font-family:inherit;font-weight:600;font-size:11px;line-height:1;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);opacity:.85;margin:14px 0 8px;display:flex;align-items:baseline;gap:6px;&:first-child{margin-top:0}}.g2-panel-title-row{justify-content:space-between;gap:8px}#g2-top-pkgs-block{margin-top:14px;flex:1 1 0;min-height:0;display:flex;flex-direction:column}.g2-mini-tabs{display:flex;gap:1px;background:var(--graph-mini-tabs-bg, var(--graph-divider));border-radius:var(--ui-radius, 4px);overflow:hidden}.g2-mini-tab{background:transparent;border:0;color:var(--muted);font-family:inherit;font-weight:500;font-size:11px;line-height:1.4;text-transform:none;letter-spacing:0;padding:2px 7px;&:hover{color:var(--text);background:var(--graph-hover-bg)}&.on{background:var(--surface-active);color:var(--accent);text-decoration:var(--graph-mini-tab-active-decoration, none);text-underline-offset:.2em}}.graph2-stage{grid-area:stage;position:relative;background:var(--graph-canvas-bg);overflow:hidden;cursor:default;&:active{cursor:default}& canvas{position:absolute;inset:0;width:100%;height:100%;display:block}}.g2-stage-overlay{position:absolute;top:12px;left:12px;z-index:3;display:flex;flex-direction:column;gap:4px;pointer-events:none;max-width:calc(100% - 60px)}.g2-stage-overlay>*{pointer-events:auto}.g2-stage-stats{position:absolute;bottom:10px;left:12px;z-index:2;display:flex;flex-wrap:wrap;gap:2px 14px;font:500 10px/1.4 ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;color:var(--muted);opacity:.7;text-transform:uppercase;letter-spacing:.06em;pointer-events:none;max-width:calc(100% - 80px);& b{font-weight:600;color:var(--text);opacity:1}}.g2-stage-overlay-tr{position:absolute;top:12px;right:12px;z-index:3;pointer-events:auto}.g2-focus-pkg-btn{width:28px;height:28px;display:grid;place-items:center;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:var(--ui-radius, 6px);color:var(--accent);box-shadow:var(--shadow-glass);&:hover{border-color:var(--accent);background:var(--surface-active)}& svg{display:block}}.g2-back-btn{display:inline-flex;align-items:center;gap:4px;padding:6px 11px;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:var(--ui-radius, 6px);color:var(--accent);font:500 11px/1 inherit;font-family:inherit;box-shadow:var(--shadow-glass);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;align-self:flex-start;&:hover{border-color:var(--accent);background:var(--surface-active)}}.g2-tooltip{position:absolute;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:var(--ui-radius, 7px);padding:9px 11px;pointer-events:none;min-width:170px;max-width:260px;opacity:0;transition:opacity .12s;z-index:10;box-shadow:var(--shadow-glass);&.show{opacity:1}}.g2-tt-path{font:500 11px/1.3 ui-monospace,monospace;color:var(--text);word-break:break-all;margin-bottom:4px}.g2-tt-head{display:flex;align-items:center;gap:6px;margin-bottom:6px;flex-wrap:wrap}.g2-tt-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.g2-tt-pkg{font-size:10px;color:var(--muted);word-break:break-all}.g2-tooltip .tree-count-chips{margin-top:6px}:host-context(body.theme-light) .graph2-right .tree-count-chip.medium,:host-context(body.theme-light) .g2-tooltip .tree-count-chip.medium{color:#fff}.g2-selection-card{background:var(--graph-hover-bg);border:1px solid var(--border);border-radius:var(--ui-radius, 8px);overflow:hidden}.g2-sel-head{padding:11px 13px;border-bottom:1px solid var(--graph-divider);display:flex;align-items:center;gap:8px}.g2-sel-file-head{padding:11px 13px;border-bottom:1px solid var(--graph-divider);display:flex;flex-direction:column;gap:6px}.g2-sel-path{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;font-weight:600;font-size:12px;line-height:1.3;color:var(--text);word-break:break-all}.g2-sel-pkg-row{display:flex;align-items:center;gap:6px;min-width:0}.g2-sel-pkg{font-size:11px;color:var(--muted);word-break:break-all;min-width:0}.g2-sel-fullpath{padding:7px 13px;border-bottom:1px solid var(--graph-divider);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;font-size:10px;line-height:1.3;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.g2-sel-size{padding:5px 13px 7px;border-bottom:1px solid var(--graph-divider);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;font-size:10px;line-height:1.3;color:var(--muted);font-variant-numeric:tabular-nums}.g2-sel-dot{width:11px;height:11px;border-radius:50%;box-shadow:0 0 0 3px color-mix(in srgb,var(--dot) 22%,transparent);flex-shrink:0}.g2-sel-id{font:600 12px/1 ui-monospace,monospace;color:var(--text);word-break:break-all;flex:1;min-width:0}.g2-sel-grp{font:500 9px/1 ui-monospace,monospace;color:var(--muted);text-transform:uppercase;letter-spacing:.08em;flex-shrink:0}.g2-sel-body{padding:11px 13px}.g2-sel-row{display:flex;justify-content:space-between;gap:12px;font-size:11px;padding:5px 0;border-bottom:1px solid var(--graph-divider);&:last-child{border-bottom:0}.k{color:var(--muted);flex-shrink:0}.v{color:var(--text);font-family:ui-monospace,monospace;word-break:break-all;text-align:right;min-width:0}}.g2-sel-section{padding:9px 13px;border-top:1px solid var(--graph-divider)}.g2-sel-section-label{font-family:inherit;font-weight:600;font-size:11px;line-height:1;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);opacity:.85;margin-bottom:5px}.g2-sel-section-empty{color:var(--muted);opacity:.55;font-size:11px;font-style:italic}.g2-sel-versions{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;font-size:11px;line-height:1.4;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.g2-sel-jumps{padding:11px 13px;display:flex;gap:5px;flex-wrap:wrap;border-top:1px solid var(--graph-divider)}.g2-sel-jump{background:var(--surface-active);border:1px solid var(--border);color:var(--accent);border-radius:var(--ui-radius, 4px);padding:2px 8px;font-family:inherit;font-weight:500;font-size:11px;line-height:1.3;&:hover{border-color:var(--accent)}}.g2-sel-file-list{list-style:none;margin:0;padding:0;max-height:110px;overflow:hidden auto;-webkit-app-region:no-drag;app-region:no-drag;&::-webkit-scrollbar{width:4px}&::-webkit-scrollbar-thumb{background:var(--border);border-radius:2px}& li{padding:0}}.g2-sel-file-link{display:flex;align-items:center;gap:6px;width:100%;background:transparent;border:0;border-radius:var(--ui-radius, 3px);padding:2px 6px;min-height:20.5px;font:400 11px/1.4 ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;color:var(--accent);text-align:left;&:hover{background:var(--graph-hover-bg)}.g2-sel-file-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.g2-sel-file-path{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}.g2-empty-state,.g2-sel-section-empty,.g2-dist-empty{cursor:default;user-select:none;-webkit-user-select:none}.g2-empty-state{background:var(--graph-hover-bg);border:1px dashed var(--border);border-radius:var(--ui-radius, 8px);padding:18px 14px;text-align:center;color:var(--muted);font-size:11px;line-height:1.5;& strong{color:var(--text);display:block;margin-bottom:4px;font-weight:500}}.g2-dist-bar{width:100%;height:5px;border-radius:3px;overflow:hidden;display:flex;background:var(--surface-active);margin-bottom:8px;>span{display:block;height:100%}}.g2-dist-list{display:flex;flex-direction:column;gap:0;flex:1 1 0;min-height:0;overflow-y:auto;overscroll-behavior:none;-webkit-app-region:no-drag;app-region:no-drag;scrollbar-gutter:stable;scrollbar-width:thin;scrollbar-color:var(--border) transparent;&::-webkit-scrollbar{width:5px}&::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}}.g2-dist-empty{color:var(--muted);opacity:.55;font-size:10px;font-style:italic;padding:6px 0;text-align:center}@media print{:host{display:none!important}}
|
|
2
|
+
`,j=`.g2-dist-item{display:grid;grid-template-columns:8px 1fr auto auto;gap:8px;align-items:center;font-size:10px;padding:2px 6px;min-height:20.5px;margin:0 -6px;background:transparent;border:0;border-radius:var(--ui-radius, 4px);font-family:inherit;text-align:left;width:calc(100% + 12px);&:hover{background:var(--graph-hover-bg)}&.on{background:var(--surface-active);.g2-dist-name{color:var(--accent)}}.g2-dist-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.g2-dist-name{color:var(--muted);font-family:ui-monospace,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.g2-dist-count{font-family:ui-monospace,monospace;color:var(--text)}.g2-dist-pct{font-family:ui-monospace,monospace;color:var(--muted);width:36px;text-align:right;opacity:.85}}:host-context(body.theme-w95) *{overscroll-behavior:none}
|
|
3
|
+
`,M=`.g2-zoom-ctrl{position:absolute;right:12px;bottom:12px;display:flex;flex-direction:column;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:var(--ui-radius, 6px);overflow:hidden;z-index:3;box-shadow:var(--shadow-glass);& button{width:28px;height:28px;margin:0;padding:0;background:transparent;border:0;border-radius:0;color:var(--muted);border-bottom:1px solid var(--graph-divider);display:grid;place-items:center;font-family:inherit;font-size:13px;&:last-child{border-bottom:0}&:hover:not(:disabled){color:var(--accent);background:var(--surface-active)}&:disabled{opacity:.35}}}.g2-zoom-pct{font:500 9px/1 ui-monospace,monospace;color:var(--muted);padding:5px 0;text-align:center;border-bottom:1px solid var(--graph-divider)}.g2-zoom-ctrl .g2-zoom-fit-btn{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,monospace;font-weight:600;font-size:9px;line-height:1;letter-spacing:-.02em;text-transform:lowercase}
|
|
4
|
+
`,N=`.tree-count-chips{display:inline-flex;gap:.25rem;flex-wrap:wrap}.tree-count-chip{display:inline-block;font-size:.65rem;font-weight:600;text-transform:uppercase;letter-spacing:.03em;padding:.1rem .4rem;border-radius:3px;line-height:1.3;&.critical{background:var(--critical);color:#fff}&.high{background:var(--high);color:#fff}&.medium{background:var(--medium);color:#000}&.low{background:var(--low);color:var(--badge-low-text)}&.high_bug{background:var(--high-bug);color:#fff}&.bug{background:var(--bug);color:#fff}&.informational{background:var(--info);color:#fff}}
|
|
5
|
+
`,P=`.toolbar{display:flex;flex-direction:column;gap:.5rem;margin-bottom:1rem;padding:.6rem .75rem;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:var(--ui-radius, 10px);box-shadow:var(--shadow-glass);font-size:.825rem;& select{height:30px;box-sizing:border-box;background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:var(--ui-radius, 4px);padding:.25rem .4rem;font-size:.8rem;&:focus{border-color:var(--accent);outline:none}}& select.sort-select{padding:.3rem 1.7rem .3rem .55rem;min-width:8.5rem;font-weight:500;appearance:none;-webkit-appearance:none;background:transparent}:is(revalidate-filter,findings-sort){position:relative;display:inline-block;&:after{content:"";position:absolute;right:.7rem;top:50%;width:.35rem;height:.35rem;border-right:1.5px solid var(--muted);border-bottom:1.5px solid var(--muted);transform:translateY(-70%) rotate(45deg);pointer-events:none}}& repo-filter{display:inline-block;min-width:0;max-width:100%}& analyzer-select{position:relative;display:inline-block}.analyzer-btn{display:inline-flex;align-items:center;gap:.45rem;height:30px;box-sizing:border-box;padding:.3rem .55rem;min-width:8.5rem;background:transparent;color:var(--text);border:1px solid var(--border);border-radius:var(--ui-radius, 4px);font-family:inherit;font-size:.8rem;font-weight:500;&:hover{border-color:var(--accent)}&:focus-visible{border-color:var(--accent);outline:none}&.active{color:var(--accent)}.analyzer-btn-label{flex:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:18rem}& svg{color:var(--muted);flex-shrink:0}}& range-slider{color:var(--accent);margin:0 .25rem}.conf-vals{color:var(--text);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.72rem;font-variant-numeric:tabular-nums;.dash{color:var(--muted);margin:0 .15rem}}& conf-filter{position:relative;display:inline-flex;align-items:center;height:30px;box-sizing:border-box;padding:0 .55rem;gap:.5rem;background:transparent;border:1px solid var(--border);border-radius:var(--ui-radius, 4px);.conf-range-label{color:var(--muted);font-size:.7rem;font-weight:500;letter-spacing:.04em}& range-slider{margin:0}.conf-range{display:inline-flex;align-items:center;gap:.5rem}:is(.conf-range,.conf-range-label).replaced{visibility:hidden}:is(.conf-range,.conf-range-label).disabled{opacity:.35}& revalidate-filter{position:relative;display:inline-flex;align-items:center;flex:none;width:1.4rem;.sort-select{width:100%;border:0;height:auto;min-width:0;padding:0 .95rem 0 .2rem;font-size:.72rem;color:var(--muted);cursor:default;&:hover{color:var(--text)}}&:after{right:.25rem}&.replaces{position:static;.sort-select{position:absolute;inset:0 .55rem;width:auto;padding-left:0;color:var(--text)}&:after{right:.8rem}}.partial-cycle{position:absolute;right:1.75rem;top:50%;transform:translateY(-50%);z-index:1;padding:.1rem .3rem;border-radius:var(--ui-radius, 3px);font:inherit;font-size:.66rem;line-height:1.4;white-space:nowrap;cursor:default;--chip: var(--muted);color:var(--chip);border:1px solid rgb(from var(--chip) r g b / .45);background:rgb(from var(--chip) r g b / .1);&.included{--chip: var(--green)}&.excluded{--chip: var(--critical)}&.only{--chip: var(--yellow)}&:hover{background:rgb(from var(--chip) r g b / .22)}&:focus-visible{outline:1px solid var(--accent);outline-offset:1px}}}}& input[type=text]{background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:var(--ui-radius, 4px);padding:.25rem .4rem;font-size:.8rem;flex:1;min-width:8rem;&:focus{border-color:var(--accent);outline:none}}.result-count{color:var(--muted);margin-left:auto}}.analyzer-menu[popover]{position:fixed;inset:auto;margin:0;align-items:stretch;gap:.35rem;padding:.3rem;background:var(--bg);border:1px solid var(--border);border-radius:var(--ui-radius, 6px);box-shadow:0 4px 12px #00000040;font-size:.825rem;-webkit-app-region:no-drag;app-region:no-drag}.analyzer-menu[popover]:not(:popover-open){display:none}.analyzer-menu[popover]:popover-open{display:flex}.analyzer-menu-sep{border-left:1px solid var(--border)}.analyzer-menu-col{display:flex;flex-direction:column;gap:1px;min-width:9rem;max-height:60vh;overflow-y:auto}.analyzer-menu-head{padding:.25rem .5rem .2rem;color:var(--muted);font-size:.68rem;font-weight:600;letter-spacing:.05em;text-transform:uppercase}.analyzer-menu-item{display:flex;align-items:center;gap:.45rem;background:transparent;border:0;border-radius:var(--ui-radius, 3px);padding:.3rem .5rem;color:var(--text);text-align:left;font-family:inherit;font-size:.78rem;&:before{content:"";width:.8rem;flex-shrink:0}&.active:before{content:"\\2713";color:var(--accent)}&:hover{background:var(--surface)}&.zero{opacity:.45}.analyzer-menu-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:16rem}.analyzer-menu-count{color:var(--muted);font-size:.7rem;font-weight:600;font-variant-numeric:tabular-nums}}download-button{display:contents}.toolbar-export-btn{height:30px;box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;padding:0 .55rem;background:transparent;color:var(--muted);border:1px solid var(--border);border-radius:var(--ui-radius, 4px);font-family:inherit;transition:background .12s,color .12s;&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}& svg{display:block}}triage-selector,slide-triage-tabs{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:var(--ui-radius, 4px);overflow:hidden}.toolbar triage-selector{margin-left:auto}.toolbar-end{display:flex;align-items:center;gap:.75rem;margin-left:auto;&:not(:has(.toolbar-export-btn,annotation-filter,revalidation-switch)){display:none}}revalidation-switch{display:inline-flex;align-items:center;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:var(--ui-radius, 4px);overflow:hidden}.revalidation-toggle{height:100%;&:has(+.revalidation-detail){border-right:1px solid var(--border)}}.revalidation-conflicts{padding:0 .6rem;background:transparent;border:none;color:var(--text);font:inherit;font-size:.78rem;cursor:default;&:focus-visible{outline:1px solid var(--accent);outline-offset:-2px}}.revalidation-detail{display:inline-flex;align-items:center;justify-content:center;width:30px;height:100%;box-sizing:border-box;padding:0;background:transparent;border:none;color:var(--muted);cursor:default;transition:background .12s,color .12s,opacity .12s;&:hover:not(:disabled){color:var(--text);background:rgb(from var(--text) r g b / .06)}&.on{color:var(--accent);background:var(--surface-active)}&:disabled{opacity:.4;cursor:default}&:focus-visible{outline:1px solid var(--accent);outline-offset:-2px}}.revalidation-upstream{display:inline-flex;align-items:center;justify-content:center;width:30px;height:100%;box-sizing:border-box;padding:0;background:transparent;border:none;color:var(--muted);cursor:default;transition:background .12s,color .12s;&:not(:first-child){border-left:1px solid var(--border)}&:hover:not(:disabled){color:var(--text);background:rgb(from var(--text) r g b / .06)}&.on{color:var(--accent);background:var(--surface-active)}&:disabled{opacity:.4;cursor:default}&:focus-visible{outline:1px solid var(--accent);outline-offset:-2px}}triage-selector.is-empty{display:none}.triage-state-btn{background:transparent;border:none;color:var(--muted);padding:0 .55rem;display:inline-flex;align-items:center;gap:.35rem;transition:background .12s,color .12s;font-family:inherit;font-size:.8rem;cursor:default;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.active{background:var(--surface-active)}}.triage-state-btn.active.triage-state-deleted{color:var(--critical)}.triage-state-btn.active.triage-state-fixed{color:var(--green, #4ade80)}.triage-state-btn.active.triage-state-inprogress{color:var(--warning, #d97706)}.triage-state-btn.active.triage-state-invalid{color:var(--muted)}.triage-state-btn.active.triage-state-ignored{color:var(--accent, #2563eb)}entity-search{display:contents}view-mode-buttons{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:var(--ui-radius, 4px);overflow:hidden;.view-mode-btn{background:transparent;border:none;color:var(--muted);padding:.28rem .5rem;display:inline-flex;align-items:center;justify-content:center;transition:background .12s,color .12s;font-family:inherit;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.active{color:var(--accent);background:var(--surface-active)}& svg{display:block}}}:is(.revalidation-detail,.revalidation-upstream,.view-mode-btn){position:relative}:is(.revalidation-detail.on,.revalidation-upstream.on,.view-mode-btn.active,.g2-layout-tabs button[aria-pressed=true],.activity-views button[aria-pressed=true]):before{content:var(--selected-icon-ring-content, none);position:absolute;left:50%;top:50%;width:22px;height:22px;box-sizing:border-box;border:1px solid currentcolor;border-radius:50%;transform:translate(-50%,-50%);pointer-events:none}source-filter{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:var(--ui-radius, 4px);overflow:hidden;.source-chip{background:transparent;border:none;color:var(--muted);padding:0 .55rem;display:inline-flex;align-items:center;transition:background .12s,color .12s;font-family:inherit;font-size:.75rem;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.active{color:var(--accent);background:var(--surface-active)}}}severity-mode-switch{display:inline-flex;align-items:center;gap:.4rem;height:30px;box-sizing:border-box;.severity-mode-label{color:var(--muted);font-size:.7rem;font-weight:500;letter-spacing:.04em}.severity-mode-chips{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:var(--ui-radius, 4px);overflow:hidden}.severity-mode-chip{background:transparent;border:none;color:var(--muted);padding:0 .55rem;display:inline-flex;align-items:center;transition:background .12s,color .12s;font-family:inherit;font-size:.75rem;cursor:default;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.active{color:var(--accent);background:var(--surface-active)}}}annotation-filter{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:var(--ui-radius, 4px);overflow:hidden;.annotation-chip{position:relative;background:transparent;border:none;color:var(--muted);padding:0 .45rem;display:inline-flex;align-items:center;transition:background .12s,color .12s;cursor:default;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.sel-with,&.sel-without{color:var(--accent);background:var(--surface-active)}&.sel-with .flag-cloth{fill:var(--accent)}&.sel-without:after{content:"";position:absolute;left:18%;right:18%;top:50%;height:1.5px;background:currentcolor;border-radius:1px;transform:rotate(-20deg);transform-origin:center;pointer-events:none}& svg{display:block}}}.toolbar-row{display:flex;gap:.75rem;flex-wrap:wrap;align-items:center}.search-row{display:inline-flex;align-items:center;gap:.65rem;flex:1 1 14rem;min-width:12rem}toolbar-search,.toolbar-search{display:inline-flex;align-items:center;gap:.5rem;flex:1;min-width:0;height:30px;box-sizing:border-box;padding:0 .65rem;background:var(--bg);border:1px solid var(--border);border-radius:var(--ui-radius, 6px);&:has(input:focus){border-color:var(--accent)}>svg{color:var(--muted);flex-shrink:0}&[kind] input[type=text],&.toolbar-search input[type=text]{flex:1;min-width:0;background:transparent;border:0;outline:none;color:var(--text);font:inherit;font-size:.8rem;padding:0;&:focus{border:0}&::placeholder{color:var(--muted)}&:focus::placeholder{color:transparent}&::-webkit-search-cancel-button{display:none}}}.search-negate-btn{flex-shrink:0;width:20px;height:20px;display:grid;place-items:center;background:transparent;color:var(--muted);border:0;border-radius:var(--ui-radius, 3px);padding:0;transition:background .12s,color .12s;& svg{width:13px;height:13px}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .08)}&.active{color:var(--accent);background:rgb(from var(--text) r g b / .1)}}@media(width<=1200px){.toolbar-row.sev-row .search-row{flex-basis:100%}}severity-chips{display:inline-flex;height:30px;box-sizing:border-box;border:1px solid var(--border);border-radius:var(--ui-radius, 4px);overflow:hidden}severity-chips>.sev-chip{display:inline-flex;align-items:center;gap:.35rem;background:transparent;border:0;padding:0 .4rem;color:var(--muted);font-family:inherit;font-size:.8rem;transition:background .12s,color .12s;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}.sd{width:8px;height:8px;border-radius:2px;flex-shrink:0;background:currentcolor}}:is(.sev-chip,.triage-state-btn,.team-slide-tab){.n{align-self:flex-start;margin:1px -5px 0;color:var(--muted);font-variant-numeric:tabular-nums;font-size:8.5px;font-weight:600;background:var(--bg);border-radius:999px;padding:0 3px;min-width:11px;text-align:center;line-height:11px}&.active .n{color:var(--text)}}.team-slide-tab .n{margin-top:calc(1px - .35rem)}severity-chips>button.sev-chip{&.active{color:var(--text)}&.critical .sd{background:var(--critical)}&.high .sd{background:var(--high)}&.medium .sd{background:var(--medium)}&.low .sd{background:var(--low)}&.high_bug .sd{background:var(--high-bug)}&.bug .sd{background:var(--bug)}&.informational .sd{background:var(--info)}&.critical.active{background:rgb(from var(--critical) r g b / .25)}&.high.active{background:rgb(from var(--high) r g b / .25)}&.medium.active{background:rgb(from var(--medium) r g b / .25)}&.low.active{background:rgb(from var(--low) r g b / .25)}&.high_bug.active{background:rgb(from var(--high-bug) r g b / .25)}&.bug.active{background:rgb(from var(--bug) r g b / .25)}&.informational.active{background:rgb(from var(--info) r g b / .25)}}triage-filter{display:inline-flex;align-items:center;background:var(--surface);border:1px solid var(--border);border-radius:var(--ui-radius, 6px);padding:3px;height:30px;gap:1px;& button{width:22px;height:22px;background:transparent;border:0;border-radius:var(--ui-radius, 4px);padding:0;display:grid;place-items:center;position:relative;transition:background .12s;&:hover{background:rgb(from var(--text) r g b / .06)}&.active{background:rgb(from var(--text) r g b / .08);box-shadow:0 0 0 1px var(--border)}}.td{width:12px;height:12px;border-radius:50%;border:1.5px solid currentcolor;background:transparent;transition:background .12s}& button.active .td{background:currentcolor}.td.none{border-style:dashed;color:var(--muted)}.td.r{color:#fc5855}.td.b{color:#30aff8}.td.g{color:#68c36d}.td.x{color:#6e7278}.count{position:absolute;top:-2px;right:-2px;background:var(--bg);color:var(--muted);font-size:8.5px;font-weight:600;border-radius:999px;padding:0 3px;min-width:11px;text-align:center;line-height:11px;font-variant-numeric:tabular-nums}}
|
|
6
|
+
`;function F(e){let t=new Map;for(let n=0;n<e.length;n++){let r=e[n];t.has(r.a)||t.set(r.a,[]),t.has(r.b)||t.set(r.b,[]),t.get(r.a).push(n),t.get(r.b).push(n)}return t}function I(e){if(!e)return null;for(let t of b)if((e[t]??0)>0)return t;return null}function L(e,t,n,r,i,a,o,s={}){let c=s.pkgOf??u,d=new Set(t),f=new Map,p=new Map;for(let n of t){let t=(e[n].imports??[]).filter(e=>d.has(e));f.set(n,t);for(let e of t)p.has(e)||p.set(e,[]),p.get(e).push(n)}let m=t.map(t=>{let u=n.get(t),d=r?.get(t)??null,f=l(u),p=c(t)??`__own__`,m=I(u);return{id:t,file:t,pkg:p,packageInfo:s.packageInfoOf?.(t),x:0,y:0,deg:0,issue:m,totalIssues:f,own:u,subtree:d,size:typeof e[t]?.size==`number`?e[t].size:null,severitySet:i?.get(t)??null,colorSet:a?.get(t)??null,findings:o?.get(t)??null,isHub:!1,label:t.split(`/`).pop()??t}}),h=new Map(m.map(e=>[e.file,e])),g=new Map;for(let e of t)for(let t of f.get(e)??[]){let[n,r]=e<t?[e,t]:[t,e],i=`${n}\0${r}`,a=g.get(i);if(!a){let e=h.get(n),t=h.get(r);if(!e||!t)continue;a={a:n,b:r,cross:e.pkg!==t.pkg,fromLo:!1,fromHi:!1},g.set(i,a),e.deg++,t.deg++}e===n?a.fromLo=!0:a.fromHi=!0}let _=[...g.values()],v=F(_),y=new Map;for(let e of m)y.set(e.pkg,(y.get(e.pkg)??0)+1);let b=[...y.entries()].toSorted((e,t)=>t[1]-e[1]).map(([e])=>e),x=new Map;for(let e of m)x.has(e.pkg)||x.set(e.pkg,[]),x.get(e.pkg).push(e);let S={files:t,nodes:m,nodeByFile:h,edges:_,adj:v,importsOf:f,importedBy:p,packages:b,pkgCount:y,byPkg:x};return R(S),S}function R(e){for(let t of e.nodes)t.isHub=!1;for(let t of e.edges)t.cross&&(t.fromLo&&(e.nodeByFile.get(t.b).isHub=!0),t.fromHi&&(e.nodeByFile.get(t.a).isHub=!0));for(let t of e.nodes){let n=e.importedBy.get(t.file);(!n||n.length===0)&&(t.isHub=!0)}}function ee(e){let t=e.packages.map(t=>{let n=e.byPkg.get(t)??[],r={};for(let e of b)r[e]=0;let i=new Set,a=new Set,o=[],s=0,c=0,l=!1;for(let e of n){if(s+=e.totalIssues,e.own)for(let t of b)r[t]+=e.own[t]??0;if(e.severitySet)for(let t of e.severitySet)i.add(t);if(e.colorSet)for(let t of e.colorSet)a.add(t);typeof e.size==`number`&&(c+=e.size,l=!0),o.push(e.file)}return{file:t,pkg:t,label:z(t),fileCount:n.length,size:l?c:null,own:r,totalIssues:s,issue:I(r),severitySet:i.size>0?i:null,colorSet:a.size>0?a:null,pathText:o.join(`
|
|
7
|
+
`).toLowerCase(),isHub:!0,x:0,y:0,deg:0}}),n=new Map(t.map(e=>[e.pkg,e])),r=new Map;for(let t of e.edges){if(!t.cross)continue;let i=e.nodeByFile.get(t.a)?.pkg,a=e.nodeByFile.get(t.b)?.pkg;if(!i||!a||i===a)continue;let[o,s]=i<a?[i,a]:[a,i],c=`${o}\0${s}`,l=r.get(c);l||(l={a:o,b:s,cross:!0,count:0,fromLo:!1,fromHi:!1},r.set(c,l),n.get(o).deg++,n.get(s).deg++),l.count++;let u=i===o;t.fromLo&&(u?l.fromLo=!0:l.fromHi=!0),t.fromHi&&(u?l.fromHi=!0:l.fromLo=!0)}let i=[...r.values()],a=F(i),o=new Map(t.map(e=>[e.pkg,[]]));for(let e of i)e.fromLo&&o.get(e.a).push(e.b),e.fromHi&&o.get(e.b).push(e.a);return{nodes:t,byPkg:n,nodeByFile:n,edges:i,adj:a,importsOf:o,ownSourcePackages:e.ownSourcePackages,entryPackages:e.entryPackages}}function te(e,t){if(t.size===0)return e;let n=e.nodes.filter(e=>!t.has(e.pkg)),r=new Map(n.map(e=>[e.file,e])),i=e=>r.has(e),a=e.edges.filter(e=>i(e.a)&&i(e.b)),o=e=>new Map([...e].filter(([e])=>i(e)).map(([e,t])=>[e,t.filter(i)])),s=e.packages.filter(e=>!t.has(e));return{...e,files:e.files.filter(i),nodes:n,nodeByFile:r,edges:a,adj:F(a),importsOf:o(e.importsOf),importedBy:o(e.importedBy),packages:s,pkgCount:new Map(s.map(t=>[t,e.pkgCount.get(t)])),byPkg:new Map(s.map(t=>[t,e.byPkg.get(t)]))}}function z(e){return _(e)}var B={links:`imports`,cellLinks:`file imports`,link:`Import`,linked:`imports`,members:`files`,mostImported:`Most imported`,outgoing:`Imports`,incoming:`Imported by`,importers:`importers`,cellHeading:`File imports`},V={links:`dependencies`,cellLinks:`dependencies`,link:`Dependency`,linked:`depends on`,members:`versions`,mostImported:`Most depended on`,outgoing:`Dependencies`,incoming:`Dependents`,importers:`dependents`,cellHeading:`Copies`},ne=e=>e.packagesOnly?V:B;function re(e,t){let n=new Set;for(let r of e.byPkg.get(t)??[])r.packageInfo?.version!==void 0&&n.add(r.packageInfo.version);return[...n].toSorted((e,t)=>e.localeCompare(t,`en`,{numeric:!0}))}function ie(e,n){if(!n||n===`/`||n===`__own__`)return e;for(let r of[`node_modules`,`dependencies`,t()]){let t=r+`/`+n+`/`,i=e.indexOf(t);if(i>=0)return e.slice(i+t.length)}return e.startsWith(n+`/`)?e.slice(n.length+1):e}var H=new Set([`@babel/runtime`,`minimalistic-assert`,`react`,`reselect`]),ae=300,oe=100;function U(e,t){return new Set([...e].filter(([,e])=>e>t).map(([e])=>e))}function W(e,t){let n=new Map;for(let[t,r]of e)t!==r&&H.has(r)&&n.set(r,(n.get(r)??0)+1);return U(n,t)}function se(e,t){let n=new Map,r=(t,r)=>{let i=e.nodeByFile.get(r)?.pkg;e.nodeByFile.get(t)?.pkg!==i&&H.has(i)&&n.set(i,(n.get(i)??0)+1)};for(let t of e.edges)t.fromLo&&r(t.a,t.b),t.fromHi&&r(t.b,t.a);return U(n,t)}var ce=new WeakMap,le=new WeakMap;function ue(e,t){return!e.packagesOnly&&e.nodes.length<=100&&!t}function de(e,t,n){let r=W([...e.importsOf].flatMap(([e,t])=>t.map(t=>[n(e),n(t)])),t);if(r.size===0)return e;let i=e=>!r.has(n(e)),a=e.nodes.filter(e=>i(e.file));return{...e,nodes:a,nodeByFile:new Map(a.map(e=>[e.file,e])),importsOf:new Map([...e.importsOf].filter(([e])=>i(e)).map(([e,t])=>[e,t.filter(i)])),cycleImportsOf:new Map([...e.cycleImportsOf].filter(([e])=>i(e)).map(([e,t])=>[e,new Set([...t].filter(i))]))}}function fe(e,t){if(!ue(e,t))return pe(e);if(le.has(e))return le.get(e);let n=new Map(e.nodes.map(t=>[t.file,[...new Set(e.importsOf.get(t.file)??[])]])),r=de({...e,importsOf:n,cycleImportsOf:p(e),fileLevel:!0},ae,t=>e.nodeByFile.get(t)?.pkg);r.directedEdges=[];for(let[e,t]of r.importsOf)for(let n of t)r.directedEdges.push({from:e,to:n});return le.set(e,r),r}function pe(e){if(ce.has(e))return ce.get(e);let t=ee(e);if(t.cycleImportsOf=p(e,e=>e.pkg),e.layerRoots?.appImports?.length>0){if(!t.byPkg.has(`__own__`)){let e={file:`__own__`,pkg:`__own__`,label:`own source`,fileCount:0,size:null,totalIssues:0,deg:0,x:0,y:0};t.nodes.push(e),t.byPkg.set(e.pkg,e)}t.importsOf.set(`__own__`,[...new Set([...t.importsOf.get(`__own__`)??[],...e.layerRoots.appImports])].filter(e=>e!==`__own__`&&t.byPkg.has(e))),t.cycleImportsOf.set(`__own__`,new Set([...t.cycleImportsOf.get(`__own__`)??[],...e.layerRoots.appImports].filter(e=>e!==`__own__`&&t.byPkg.has(e))))}t=de(t,oe,e=>e),t.byPkg=t.nodeByFile,t.importedBy=new Map(t.nodes.map(e=>[e.pkg,[]])),t.directedEdges=[];for(let[e,n]of t.importsOf)for(let r of n)t.importedBy.get(r).push(e),t.directedEdges.push({from:e,to:r});for(let e of t.nodes)e.deg=(t.importsOf.get(e.pkg)?.length??0)+t.importedBy.get(e.pkg).length;return ce.set(e,t),t}var me=[[`graph`,`Graph`,x(S)],[`layers`,`Layers`,x(C)],[`matrix`,`Matrix`,x(w)],[`dependencies`,`Dependencies`,x(T)],[`flow`,`Size flow`,D`<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><path d="M3 3h18M3 10h7m4 0h7M3 20h6m3 0h9M5 3v7m13-7v7M6 10c0 5 10 5 10 10m2-10c0 5-12 5-12 10"/></svg>`]];function he(e,t,n=null,r={}){let a=t.showBundleLayouts&&i.bundleLayout===`layers`,o=t.showBundleLayouts&&i.bundleLayout===`matrix`,s=t.showBundleLayouts&&i.bundleLayout===`dependencies`,c=t.showBundleLayouts&&i.bundleLayout===`flow`,l=a?`layers`:o?`matrix`:s?`dependencies`:c?`flow`:`graph`,u=t.showBundleLayouts?D`<div class="g2-layout-tabs" role="group" aria-label="Bundle layout">${me.filter(([e])=>t.layouts?.includes(e)??!0).map(([e,t,n])=>D`<button type="button" data-g2-layout="${e}" aria-label="${t}" aria-pressed="${String(e===l)}">${n}</button>`)}</div>`:null,d=t.extraTopRow,f=t.hideAllFiles??!1,p=t.triageCounts??{inprogress:0,fixed:0,invalid:0,deleted:0,ignored:0},m=t.triageStates??[`inprogress`,`fixed`,`invalid`,`deleted`,`ignored`],h={};for(let e of b)h[e]=0;for(let t of e.nodes)if(t.severitySet)for(let e of t.severitySet)h[e]!==void 0&&h[e]++;let g=b.some(e=>h[e]>0||i.selectedSeverities.has(e)),_=[`none`,`red`,`blue`,`green`,`gray`],v={none:0,red:0,blue:0,green:0,gray:0};for(let t of e.nodes)if(t.colorSet)for(let e of t.colorSet)v[e]!==void 0&&v[e]++;let y=_.some(e=>v[e]>0||i.selectedColors.has(e)),x=D`<triage-selector variant="graph" .counts="${p}" .states="${m}"></triage-selector>`,S=f?null:D`<mode-switch label="All files" .checked="${i.showAll}" data-g2-show-all></mode-switch>`,C=!e.packagesOnly&&(c||(s?e.nodes.length<=100:!a&&!o&&(t.showPackagesView??!1)))?D`<mode-switch label="Packages" .checked="${c?i.flowPackagesView:s?i.dependencyPackagesView:i.packagesView}" data-g2-packages-view></mode-switch>`:null,w=e.reasons?.length>0?D`<bundle-scope-selector class="g2-reason-scope" .reasons="${e.reasons.map(e=>({id:`reason:${e}`,label:e}))}" .value="${i.bundleReason?`reason:${i.bundleReason}`:``}" label="Filter files" @scope-change="${e=>e.currentTarget.dispatchEvent(new CustomEvent(`bundle-graph-reason-change`,{detail:{reason:e.detail.value.replace(/^reason:/u,``)||null},bubbles:!0,composed:!0}))}"></bundle-scope-selector>`:null,T=g?D`<severity-chips .counts="${h}" .selected="${[...i.selectedSeverities]}" kind="graph"></severity-chips>`:null,E=y?D`<triage-filter .counts="${v}" .selected="${[...i.selectedColors]}" kind="graph"></triage-filter>`:null,O=D`<div class="toolbar-search g2-path-filter-wrap"><svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="m20 20-3.5-3.5"/></svg> <input type="text" class="g2-path-filter" id="g2-path-filter" placeholder="filter path/package…" .value="${i.pathFilter}"> <button type="button" class="g2-path-filter-clear" id="g2-path-filter-clear" aria-label="Clear filter">✕</button></div>`,k=D`<button type="button" class="g2-icon-btn" id="g2-fullscreen" aria-label="Toggle fullscreen">⛶</button>`;if(t.showBundleLayouts){let e=(t.hasIssues??!1)&&i.bundleIssues,a=t.hasIssues?D`<mode-switch class="g2-issues-switch" label="Issues" .checked="${i.bundleIssues}" data-g2-bundle-issues></mode-switch>`:null,o=a&&r.issuesWrapped;return D`<div class="graph2-topbar"><div class="graph2-topbar-row graph2-topbar-row-main graph2-topbar-row-pinned toolbar-row"><div class="g2-topbar-controls">${u} ${O} ${C} ${n} ${w} ${o?null:a}</div>${k}</div>${e||o?D`<div class="graph2-topbar-row graph2-topbar-row-issues toolbar-row sev-row">${o?a:null} ${e?D`${T}${E}${x}`:null}</div>`:null}</div>`}return D`<div class="graph2-topbar">${d?D`<div class="graph2-topbar-row graph2-topbar-row-extra toolbar-row">${d} ${S} ${C}<div class="g2-spacer"></div>${x}</div>`:null}<div class="graph2-topbar-row graph2-topbar-row-main toolbar-row sev-row">${u} ${w} ${T} ${E} ${O} ${d?null:S} ${d?null:C} ${n}<div class="g2-spacer"></div>${d?null:x} ${k}</div></div>`}function ge(e,t){let n=e.split(`/`).filter(Boolean),r=t.split(`/`).filter(Boolean),i=0;for(;i<n.length&&i<r.length&&n[i]===r[i];)i++;let a=n.length-i,o=r.slice(i).join(`/`);return a===0?`./`+o:`../`.repeat(a)+o}function G(e,t){if(!t&&t!==``)return e;let n=ge(t,e);return n.length<e.length?n:e}function _e(e,t,n,r){let i=n.length;if(i===0)return D`<div class="g2-sel-section"><div class="g2-sel-section-label">${t} (${i})</div><div class="g2-sel-section-empty">none</div></div>`;let a=n.map(e=>({file:e,display:G(e,r)}));return a.sort((e,t)=>e.display.localeCompare(t.display)),D`<div class="g2-sel-section"><div class="g2-sel-section-label">${t} (${i})</div><ul class="g2-sel-file-list">${a.map(({file:t,display:n})=>{let r=e.nodeByFile.get(t),i=r?d(r.pkg):`#666`;return D`<li><button type="button" class="g2-sel-file-link" data-g2-select="${t}"><span class="g2-sel-file-dot" style="${v({background:i})}"></span> <span class="g2-sel-file-path" data-tooltip-truncated data-tooltip="${t}">${n}</span></button></li>`})}</ul></div>`}function ve(e){if(!e)return D`<div class="g2-sel-section-empty">none</div>`;let t=[`critical`,`high`,`medium`,`low`,`high_bug`,`bug`,`informational`].filter(t=>(e[t]??0)>0);return t.length===0?D`<div class="g2-sel-section-empty">none</div>`:D`<div class="tree-count-chips">${t.map(t=>D`<span class="${`tree-count-chip ${t}`}">${e[t]} ${t.replaceAll(`_`,` `)}</span>`)}</div>`}function K(e){let t=0;for(let n of e.edges)n.cross&&t++;let n=e.edges.length-t,r=0;for(let t of e.nodes)r+=t.totalIssues;let a=e.supportsLayers&&(e.packagesOnly||i.bundleLayout===`dependencies`)&&!i.focusedPkg?fe(e,i.dependencyPackagesView):null,o=a?.nodes.length??e.nodes.length,s=a?.directedEdges.length??e.edges.length,c=o===0?`0.0`:(s*2/o).toFixed(1),l=z(i.focusedPkg);return D`<main class="graph2-stage"><canvas id="g2-canvas"></canvas>${i.focusedPkg?D`<div class="g2-stage-overlay"><button type="button" class="g2-back-btn" id="g2-back-to-full">← ${l}</button></div>`:null}<div id="g2-focus-overlay-slot" class="g2-stage-overlay-tr"></div><div class="g2-stage-stats">${!a||a.fileLevel?D`<span><b>${e.nodes.length}</b> files</span>`:null} <span><b>${a&&!a.fileLevel?a.nodes.length:e.packages.length}</b> packages</span> <span><b>${s}</b> ${a?`dependencies`:D`edges (${n} intra · ${t} cross)`}</span> ${e.issuesHidden?null:D`<span><b>${r}</b> issues</span>`} <span>avg degree <b>${c}</b></span></div><div class="g2-zoom-ctrl"><button id="g2-zoom-in" aria-label="Zoom in">+</button><div class="g2-zoom-pct" id="g2-zoom-pct">100%</div><button id="g2-zoom-out" aria-label="Zoom out">−</button> <button id="g2-zoom-fit" class="g2-zoom-fit-btn" aria-label="Fit to view">fit</button></div><div class="g2-tooltip" id="g2-tooltip"></div></main>`}function ye(e){if(e.packagesOnly||e.supportsLayers&&i.bundleLayout===`dependencies`)return null;let t=null;if(i.selected){let n=e.nodeByFile.get(i.selected);n&&(t=n.pkg)}else i.solo&&(t=i.solo);if(!t||(e.pkgCount.get(t)??0)<=1||i.focusedPkg===t)return null;let n=z(t);return D`<button type="button" class="g2-focus-pkg-btn" data-g2-focus-pkg="${t}" aria-label="${`Focus on ${n}'s graph`}" data-tooltip="${`Focus on ${n}'s graph`}"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M8 4.6 L4 11 M8 4.6 L12 11 M5 11.4 L11 11.4" stroke="currentColor" stroke-width="1.2" stroke-linecap="round"/><circle cx="8" cy="3.6" r="2" fill="currentColor"/><circle cx="3.6" cy="11.4" r="2" fill="currentColor"/><circle cx="12.4" cy="11.4" r="2" fill="currentColor"/></svg></button>`}function be(){return D`<aside class="graph2-right"><div class="g2-panel-title">Selection</div><div id="g2-selection-area"></div><div id="g2-top-pkgs-block"></div></aside>`}function xe(e){if(Te(e)){let t=pe(e),n=t.nodes.toSorted((e,n)=>t.importedBy.get(n.pkg).length-t.importedBy.get(e.pkg).length||e.pkg.localeCompare(n.pkg)).map(e=>e.pkg);return D`<div class="g2-panel-title">Packages · ${ne(e).importers}</div>${Ee(t,n,!0)}`}let t=i.showAll&&e.nodes.length>0&&e.nodes.every(e=>typeof e.size==`number`),n=e.nodes.some(e=>e.totalIssues>0),a=i.topPkgsTab;return a===`size`&&!t&&(a=`files`),a===`issues`&&!n&&(a=`files`),D`<div class="g2-panel-title g2-panel-title-row"><span>Packages</span><div class="g2-mini-tabs">${n?D`<button type="button" class="${r({"g2-mini-tab":!0,on:a===`issues`})}" data-g2-top-pkgs="issues">Issues</button>`:null} <button type="button" class="${r({"g2-mini-tab":!0,on:a===`files`})}" data-g2-top-pkgs="files">Files</button> ${t?D`<button type="button" class="${r({"g2-mini-tab":!0,on:a===`size`})}" data-g2-top-pkgs="size">Size</button>`:null}</div></div>${we(e,a)}`}function q(e,t={}){if(Te(e))return J(e,pe(e),i.solo);let n=i.selected;if(n){let r=e.nodeByFile.get(n);return r?Se(e,r,n,t):D`<div class="g2-empty-state"><strong>File not in current view</strong>Adjust filters or pick another file.</div>`}return i.solo?i.solo===`__own__`&&!e.pkgCount.has(`__own__`)&&e.layerRoots?.appImports.length>0?D`<div class="g2-empty-state"><strong>App</strong>App source is not included in this view. Connections come from its recorded imports.</div>`:Ce(e,i.solo):D`<div class="g2-empty-state">Click a node or a package row to inspect.</div>`}function Se(e,t,r,i){let a=d(t.pkg),o=z(t.pkg),s=ie(r,t.pkg),c=e.importedBy.get(r)??[],l=e.importsOf.get(r)??[],u=r.lastIndexOf(`/`),f=u>=0?r.slice(0,u):``;return D`<div class="g2-selection-card"><div class="g2-sel-file-head"><div class="g2-sel-path">${s}</div><div class="g2-sel-pkg-row"><span class="g2-sel-dot" style="${v({"--dot":a,background:a})}"></span> <span class="g2-sel-pkg">${o}</span></div></div><div class="g2-sel-fullpath" data-tooltip-truncated data-tooltip="${r}">${r}</div>${n(t.size)?D`<div class="g2-sel-size">${n(t.size)}</div>`:null}<div class="g2-sel-section"><div class="g2-sel-section-label">Own findings</div>${ve(t.own)}</div><div class="g2-sel-section"><div class="g2-sel-section-label">Subtree findings</div>${ve(t.subtree)}</div><div class="g2-sel-jumps">${t.totalIssues>0&&i.findingsJump!==!1?D`<button type="button" class="g2-sel-jump" data-g2-jump-findings="${r}">Findings →</button>`:null} ${i.isBundleContext?t.origFile?D`<button type="button" class="g2-sel-jump" data-bundle-view-source="${t.origFile}">View source →</button>`:null:D`<button type="button" class="g2-sel-jump" data-g2-jump-file="${r}">Files →</button>`}</div>${_e(e,`Imported by`,c,f)} ${_e(e,`Imports`,l,f)}</div>`}function Ce(e,t){let n=e.nodes.filter(e=>e.pkg===t),r=n.length;if(r===0)return D`<div class="g2-empty-state"><strong>Package has no files in view</strong> Toggle "All files" to widen the file set, or pick another package.</div>`;let i=d(t),a=z(t),o={};for(let e of b)o[e]=0;for(let e of n)if(e.own)for(let t of b)o[t]+=e.own[t]??0;let s=0,c=0;for(let n of e.edges){let r=e.nodeByFile.get(n.a),i=e.nodeByFile.get(n.b);!r||!i||(r.pkg===t&&i.pkg===t?c++:(r.pkg===t||i.pkg===t)&&s++)}let l=0;for(let e of n)e.isHub&&l++;let u=new Set;for(let r of n)for(let n of e.importedBy.get(r.file)??[]){let r=e.nodeByFile.get(n);r&&r.pkg!==t&&u.add(n)}return D`<div class="g2-selection-card"><div class="g2-sel-head"><span class="g2-sel-dot" style="${v({"--dot":i,background:i})}"></span> <span class="g2-sel-id">${a}</span> <span class="g2-sel-grp">package</span></div><div class="g2-sel-body"><div class="g2-sel-row"><span class="k">Files</span><span class="v">${r}</span></div><div class="g2-sel-row"><span class="k">Hubs</span><span class="v">${l}</span></div><div class="g2-sel-row"><span class="k">Intra edges</span><span class="v">${c}</span></div><div class="g2-sel-row"><span class="k">Cross edges</span><span class="v">${s}</span></div></div><div class="g2-sel-section"><div class="g2-sel-section-label">Findings</div>${ve(o)}</div>${_e(e,`Imported by`,[...u])}</div>`}function we(e,t){let a=e.nodes.length||1,o=t??i.topPkgsTab,s=i.selectedSeverities,c=i.selectedColors,l=!e.issuesHidden&&s.size>0,u=!e.issuesHidden&&c.size>0,f=l||u,p=new Map,m=new Map,h=0,g=0;for(let t of e.nodes){let e;if(f){if(e=0,t.findings)for(let n of t.findings)l&&!s.has(n.severity)||u&&!c.has(n.color)||e++}else e=t.totalIssues;p.set(t.pkg,(p.get(t.pkg)??0)+e),h+=e,typeof t.size==`number`&&(m.set(t.pkg,(m.get(t.pkg)??0)+t.size),g+=t.size)}let _;_=o===`issues`?e.packages.filter(e=>(p.get(e)??0)>0).toSorted((t,n)=>{let r=p.get(t)??0,i=p.get(n)??0;return i===r?(e.pkgCount.get(n)??0)-(e.pkgCount.get(t)??0):i-r}):o===`size`?e.packages.filter(e=>(m.get(e)??0)>0).toSorted((t,n)=>{let r=m.get(t)??0,i=m.get(n)??0;return i===r?(e.pkgCount.get(n)??0)-(e.pkgCount.get(t)??0):i-r}):[...e.packages].toSorted((t,n)=>{let r=e.pkgCount.get(t)??0,i=e.pkgCount.get(n)??0;return i===r?(p.get(n)??0)-(p.get(t)??0):i-r});let b=t=>o===`issues`?h>0?((p.get(t)??0)/h*100).toFixed(2):`0`:o===`size`?g>0?((m.get(t)??0)/g*100).toFixed(2):`0`:(e.pkgCount.get(t)/a*100).toFixed(2),x=o===`issues`?`No packages with issues`:o===`size`?`No packages with size`:`No packages`;return D`<div class="g2-dist-bar">${e.packages.map(e=>{let t=d(e);return D`<span style="${v({background:t,width:`${b(e)}%`})}"></span>`})}</div><div class="g2-dist-list">${_.length===0?D`<div class="g2-dist-empty">${x}</div>`:null} ${y(_,e=>e,t=>{let s=d(t),c=e.pkgCount.get(t)??0,l=p.get(t)??0,u=m.get(t)??0,f=o===`issues`?l:o===`size`?n(u):c,_=o===`issues`?h>0?(l/h*100).toFixed(1):`0.0`:o===`size`?g>0?(u/g*100).toFixed(1):`0.0`:(c/a*100).toFixed(1),y=z(t),b=i.solo===t;return D`<button type="button" class="${r({"g2-dist-item":!0,on:b})}" data-g2-pkg="${t}"><span class="g2-dist-dot" style="${v({background:s})}"></span><span class="g2-dist-name" data-tooltip-truncated data-tooltip="${y}">${y}</span><span class="g2-dist-count">${f}</span><span class="g2-dist-pct">${_}%</span></button>`})}</div>`}function Te(e){return(e.packagesOnly||e.supportsLayers&&i.bundleLayout===`dependencies`&&!i.focusedPkg)&&!ue(e,i.dependencyPackagesView)}function Ee(e,t,n=!1){return D`<div class="g2-dist-list">${y(t,e=>e,t=>D`<button type="button" class="${r({"g2-dist-item":!0,on:i.solo===t})}" data-g2-pkg="${t}"><span class="g2-dist-dot" style="${v({background:d(t)})}"></span> <span class="g2-dist-name">${z(t)}</span> ${n?D`<span class="g2-dist-count">${e.importedBy.get(t).length}</span>`:null}</button>`)}</div>`}function J(e,t,n){let r=t.byPkg.get(n),i=ne(e);if(!r)return D`<div class="g2-empty-state">Select a package to trace its ${i.links}.</div>`;let a=t.importedBy.get(n)??[],o=t.importsOf.get(n)??[],s=e.packagesOnly?re(e,n):[];return D`<div class="g2-selection-card"><div class="g2-sel-head"><span class="g2-sel-dot" style="${v({background:d(n)})}"></span> <span class="g2-sel-id">${r.label}</span></div>${r.totalIssues?D`<div class="g2-sel-section">${ve(r.own)}</div>`:null} ${s.length>0?D`<div class="g2-sel-section"><div class="g2-sel-section-label">${s.length===1?`Version`:`Versions (${s.length})`}</div><div class="g2-sel-versions">${s.join(`, `)}</div></div>`:null}<div class="g2-sel-section"><div class="g2-sel-section-label">${i.incoming} (${a.length})</div>${Ee(t,a.toSorted())}</div><div class="g2-sel-section"><div class="g2-sel-section-label">Dependencies (${o.length})</div>${Ee(t,o.toSorted())}</div></div>`}function De(e,t,n){return Math.min(24,Math.max(1,t-196-12)/Math.max(1,e),Math.max(1,n-118-12)/Math.max(1,e))}function Oe(e,t,n,r){return Math.max(Math.min(18,De(t,n,r)),Math.min(27,e))}function ke(e,t,n,r){let i=Math.floor((e-196+r.x)/r.cell),a=Math.floor((t-118+r.y)/r.cell);return e<196&&t>=118&&a>=0&&a<n.rows.length?{row:a,col:null}:t<118&&e>=196&&i>=0&&i<n.rows.length?{row:i,col:null}:e>=196&&t>=118&&a>=0&&i>=0&&a<n.rows.length&&i<n.rows.length?{row:a,col:i}:null}function Ae(e){if(!e.file)return e.label;let t=`node_modules/${e.pkg}/`;return e.file.includes(t)?e.file.slice(e.file.indexOf(t)+t.length):e.file}function je(e,t,n,{width:r,height:i,theme:a,colorOf:o,hover:s,selected:c,dimmed:l,rows:u=`importers`}){let{cell:d,x:f,y:p}=n,{rows:m}=t,h=e=>196+e*d-f,g=e=>118+e*d-p,_=Math.max(0,Math.floor(p/d)),v=Math.min(m.length,Math.ceil((i-118+p)/d)),y=Math.max(0,Math.floor(f/d)),b=Math.min(m.length,Math.ceil((r-196+f)/d)),x=s??c;e.clearRect(0,0,r,i),e.fillStyle=a.bg,e.fillRect(0,0,r,i),e.save(),e.beginPath(),e.rect(196,118,r-196,i-118),e.clip();let S=[];for(let e=0;e<m.length;e++){let t=S.at(-1),n=m[e];t&&t.component===n.component?t.end=e+1:S.push({component:n.component,start:e,end:e+1,cyclic:n.cyclic})}for(let t of S)t.cyclic&&(e.strokeStyle=a.cycle+`85`,e.lineWidth=1,e.strokeRect(h(t.start),g(t.start),(t.end-t.start)*d,(t.end-t.start)*d));if(x&&(e.fillStyle=a.highlight,e.fillRect(196,g(x.row),r-196,d),e.fillRect(h(x.col??x.row),118,d,i-118)),e.strokeStyle=a.grid,e.lineWidth=1,d>=9){e.beginPath();for(let t=_;t<=v;t++)e.moveTo(196,g(t)+.5),e.lineTo(r,g(t)+.5);for(let t=y;t<=b;t++)e.moveTo(h(t)+.5,118),e.lineTo(h(t)+.5,i);e.stroke()}let C=t.visibleCells.reduce((e,t)=>Math.max(e,t.count),1),w=d>=8?2:.25;for(let n of t.visibleCells)n.row<_||n.row>=v||n.col<y||n.col>=b||(e.globalAlpha=l(m[n.row])&&l(m[n.col])?.12:.35+.65*Math.log1p(n.count)/Math.log1p(C),e.fillStyle=n.cyclic&&d<10?a.cycle:o(m[n.row].pkg),e.fillRect(h(n.col)+w,g(n.row)+w,Math.max(1,d-2*w),Math.max(1,d-2*w)),n.cyclic&&n.from!==n.to&&d>=10&&(e.fillStyle=a.cycle,e.fillRect(h(n.col)+d-5,g(n.row)+2,3,3)));e.globalAlpha=1,c&&(e.strokeStyle=a.text,e.lineWidth=2,c.col===null?e.strokeRect(197,g(c.row)+1,r-196-2,d-2):e.strokeRect(h(c.col)+1,g(c.row)+1,d-2,d-2)),e.restore(),e.fillStyle=a.surface,e.fillRect(0,0,r,118),e.fillRect(0,0,196,i),e.font=`11px ui-monospace, monospace`,e.textBaseline=`middle`;let T=Math.max(1,Math.ceil(14/d));for(let n=_;n<v;n++){if(n%T&&n!==x?.row)continue;e.save(),e.beginPath(),e.rect(5,111,186,i-118+7),e.clip();let r=g(n)+d/2;n===x?.row&&(e.fillStyle=a.highlight,e.fillRect(0,g(n),196,Math.max(d,14))),e.fillStyle=o(m[n].pkg),e.fillRect(8,r-3,5,6),e.fillStyle=n===x?.row||t.matches.size<t.totalRows&&t.matches.has(m[n].id)?a.text:a.muted,e.fillText(`${m[n].file?` `:``}${Ae(m[n])}`,20,r),e.restore()}let E=Math.max(1,Math.ceil(17/d));for(let t=y;t<b;t++)t%E&&t!==(x?.col??x?.row)||(e.save(),e.beginPath(),e.rect(189,22,r-196+7,96),e.clip(),e.translate(h(t)+d/2,108),e.rotate(-Math.PI/4),e.fillStyle=t===(x?.col??x?.row)?a.text:a.muted,e.fillText(Ae(m[t]),0,0,115),e.restore(),e.fillStyle=o(m[t].pkg),e.fillRect(h(t)+1,114,Math.max(1,d-2),3));e.fillStyle=a.muted,e.font=`10px ui-monospace, monospace`,e.fillText(`${u.toUpperCase()} \u2193`,14,104),e.fillText(`DEPENDENCIES →`,204,12),e.strokeStyle=a.border,e.beginPath(),e.moveTo(195.5,118),e.lineTo(195.5,i),e.moveTo(196,117.5),e.lineTo(r,117.5),e.stroke(),m.length===0&&(e.fillStyle=a.muted,e.fillText(`No matching dependencies`,216,148))}var Y=e=>e.toLocaleString(`en-US`);function Me(e,t,n){return D`<button class="g2-dist-item matrix-row-link" @click="${()=>n(e.id)}"><span class="g2-dist-dot" style="${v({background:d(e.pkg)})}"></span><span class="g2-dist-name" data-tooltip-truncated data-tooltip="${e.label}">${e.label}</span><span class="g2-dist-count">${Y(t)}</span></button>`}function Ne(e,t){return e.packagesOnly?re(e,t.pkg).length:t.files.length}function Pe(e,t,r,{select:i,expand:a,expanded:o,neighborhood:s,focus:c,clear:l}){let u=e.byId.get(r?.from),d=e.byId.get(r?.to),p=t.packagesOnly,m=ne(t),h=e=>t.nodeByFile.get(e)?.origFile??e;if(!u){let n=[...e.rows].toSorted((e,t)=>t.importers-e.importers).slice(0,15),r=p?[...e.byId.values()].reduce((e,t)=>e+t.dependencies,0):e.importCount;return D`<div class="matrix-metrics">${p?null:D`<span><b>${Y(t.nodes.length)}</b>files</span>`}<span><b>${Y(t.packages.length)}</b>packages</span><span><b>${Y(r)}</b>${m.links}</span></div><p class="matrix-empty">Select a row to inspect a package.<br>Select a cell to see the ${m.members} behind a dependency.</p><h4>${m.mostImported}</h4>${n.map(e=>Me(e,e.importers,i))} ${e.cycleCount?D`<h4>Cyclic groups <b>${e.cycleCount}</b></h4>${e.rows.filter(e=>e.cyclic).slice(0,12).map(e=>Me(e,e.outgoing,i))}`:null}`}let g=d?e.cells.get(u.id)?.get(d.id):null,_=g?.cycleCount<g?.count?`${Y(g.cycleCount)} of ${Y(g.count)} ${m.cellLinks} participate in a cycle`:`${m.link} participates in a cycle`,v=Map.groupBy(g?.examples??[],([,e])=>e),y=u.cyclic?[...e.byId.values()].filter(e=>e.component===u.component).length:0,b=[...e.cells.get(u.id)?.values()??[]].filter(e=>e.to!==u.id).toSorted((e,t)=>t.count-e.count),x=[...e.cells.values()].map(e=>e.get(u.id)).filter(e=>e&&e.from!==u.id).toSorted((e,t)=>t.count-e.count),S=(e,t)=>p?D`<span class="matrix-import-copy">${t}</span>`:D`<button data-bundle-view-source="${h(e)}">${t}</button>`,C=p?null:u.file?D`<button @click="${()=>a(u.pkg)}">Collapse package</button><button data-bundle-view-source="${h(u.file)}">View source</button>`:D`<button @click="${()=>a(u.pkg)}">${o.has(u.pkg)?`Collapse files`:`Expand files`}</button>`;return D`<div class="matrix-panel-head"><button class="matrix-selected-name" @click="${()=>i(u.id)}">${u.label}</button><button type="button" class="detail-action" @click="${l}" aria-label="Clear matrix selection">×</button></div>${d?D`<div class="matrix-direction">${m.linked} →</div><button class="matrix-selected-name" @click="${()=>i(d.id)}">${d.label}</button>`:null} ${(d?g?.cyclic:u.cyclic)?D`<span class="matrix-cycle-label">${d?_:`Cyclic group \xB7 ${y} members`}</span>`:null}<div class="matrix-metrics"><span><b>${Y(d?g?.count??0:Ne(t,u))}</b>${d?m.cellLinks:m.members}</span>${p?null:D`<span><b>${n(u.size)}</b>source size</span>`}</div><div class="matrix-actions">${C} <button aria-pressed="${String(s===u.id)}" @click="${()=>c(u.id)}">Neighborhood</button></div>${d?D`<h4>${m.cellHeading}</h4>${v.size>0?[...v].map(([e,n])=>D`<div class="matrix-import-group">${p?D`<span class="matrix-import-copy matrix-import-target" data-tooltip-truncated data-tooltip="${e}">${e}</span>`:D`<button class="matrix-import-target" data-bundle-view-source="${h(e)}" data-tooltip-truncated data-tooltip="${e}">${e}</button>`}<ul class="matrix-import-sources" aria-label="${m.incoming}">${n.map(([n])=>D`<li>${S(n,D`<span aria-hidden="true">←</span><span data-tooltip-truncated data-tooltip="${n}">${n}</span>`)} ${f(h(n),h(e),t.ownSourceFiles?.has(e),t.ownSourceFiles?.has(n))?null:D`<span class="matrix-import-excluded">Excluded from cycles</span>`}</li>`)}</ul></div>`):D`<p class="matrix-empty">No direct ${m.links} in this direction.</p>`} ${g&&g.count>g.examples.length?D`<p class="matrix-empty">Showing ${g.examples.length} of ${Y(g.count)} ${m.links}.</p>`:null} ${d.id!==u.id&&e.cells.get(d.id)?.has(u.id)?D`<h4>Reverse direction</h4><button class="g2-dist-item matrix-reverse-link" @click="${()=>i(d.id,u.id)}">← ${Y(e.cells.get(d.id).get(u.id).count)} ${m.cellLinks}</button>`:null}`:D`<h4>${m.outgoing} <b>${b.length}</b></h4>${b.slice(0,60).map(t=>Me(e.byId.get(t.to),t.count,e=>i(u.id,e)))} ${b.length>60?D`<p class="matrix-empty">Showing the 60 strongest of ${b.length} dependencies.</p>`:null}<h4>${m.incoming} <b>${x.length}</b></h4>${x.slice(0,60).map(t=>Me(e.byId.get(t.from),t.count,e=>i(e,u.id)))} ${x.length>60?D`<p class="matrix-empty">Showing the 60 strongest of ${x.length} ${m.importers}.</p>`:null}`}`}var Fe=`:host{display:contents}*{box-sizing:border-box}button,select{font:inherit;color:var(--text);border:1px solid var(--border);background:var(--surface);border-radius:var(--ui-radius, 4px);padding:4px 7px;cursor:default}button:hover,button[aria-pressed=true]{background:var(--graph-hover-bg);border-color:var(--muted)}button:focus-visible,select:focus-visible,canvas:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.matrix-layout{display:contents;color:var(--text);font-size:12px}.matrix-stage{grid-area:stage;position:relative;overflow:hidden;min-width:0;min-height:0;background:var(--graph-canvas-bg)}.matrix-order{position:absolute;top:12px;left:14px;max-width:calc(var(--matrix-label-width) - 28px);height:30px;padding:3px 6px;border-radius:var(--ui-radius, 6px);font-size:11px}canvas{display:block;width:100%;height:100%;touch-action:none}.matrix-hover{position:absolute;bottom:10px;left:calc(var(--matrix-label-width) + 10px);max-width:max(0px,calc(100% - var(--matrix-label-width) - 160px));padding:5px 8px;border:1px solid var(--border);border-radius:var(--ui-radius, 4px);background:var(--surface);pointer-events:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px}.matrix-panel{grid-area:right;min-height:0;overflow:auto;padding:12px;border-left:1px solid var(--border);background:var(--surface)}.matrix-panel-head{display:flex;align-items:center;justify-content:space-between;gap:8px;padding-right:var(--graph-fullscreen-inset, 0)}h4{margin:20px 0 7px;font-size:10px;color:var(--muted);text-transform:uppercase;letter-spacing:.08em;display:flex;justify-content:space-between}.matrix-metrics{display:flex;gap:14px;margin:15px 0;color:var(--muted);font-size:10px}.matrix-metrics:first-child{margin-top:0;padding-right:var(--graph-fullscreen-inset, 0)}.matrix-metrics b{display:block;font-size:16px;font-weight:500;color:var(--text);font-variant-numeric:tabular-nums;margin-bottom:3px}.matrix-empty{color:var(--muted);font-size:11px;line-height:1.6;cursor:default;user-select:none;-webkit-user-select:none}.matrix-row-link{grid-template-columns:6px minmax(0,1fr) auto}.matrix-row-link .g2-dist-dot{width:6px;height:6px;border-radius:2px}.matrix-row-link .g2-dist-name{color:var(--text)}.matrix-row-link .g2-dist-count{color:var(--muted)}.matrix-reverse-link{grid-template-columns:1fr}.matrix-selected-name{display:block;background:transparent;border:0;text-align:left;padding:0;margin:14px 0 6px;font:12px/1.6 ui-monospace,monospace;overflow-wrap:anywhere}.matrix-panel-head .matrix-selected-name{min-width:0;margin:0}.matrix-panel-head button:last-child{flex-shrink:0}.matrix-direction{color:var(--muted);font-size:10px}.matrix-cycle-label{display:block;color:var(--matrix-cycle, #e879c7);font-size:10px;margin-top:10px}.matrix-actions{display:flex;gap:5px;margin:12px 0;font-size:11px}.matrix-actions button{white-space:nowrap}.matrix-import-group{padding:6px 0;border-bottom:1px solid var(--border)}.matrix-import-group :is(button,.matrix-import-copy){display:flex;align-items:baseline;gap:6px;width:100%;min-height:20.5px;background:transparent;border:0;padding:2px 0;font:10px/1.6 ui-monospace,monospace;text-align:left;overflow-wrap:anywhere;color:var(--text)}.matrix-import-group .matrix-import-target{font-weight:600}.matrix-import-sources{margin:0 0 0 10px;padding:0;list-style:none}.matrix-import-sources :is(button,.matrix-import-copy){color:var(--muted)}.matrix-import-sources span:last-child{min-width:0}.matrix-import-excluded{display:block;margin-left:12px;color:var(--muted);font-size:10px}
|
|
8
|
+
`,Ie=class extends k{static properties={graph:{attribute:!1}};static styles=[E(j),E(Fe),E(e),E(M)];constructor(){super(),this.expanded=new Set,this.order=`structure`,this.cyclesOnly=!1,this.neighborhood=null,this.selection=null,this.hover=null,this.view={cell:18,x:0,y:0},this.width=0,this.height=0,this.dirty=!0,this.needsFit=!0,this.bridge={requestDraw:()=>this.requestUpdate(),_cleanup:()=>{}}}willUpdate(e){if(this.graph&&(e.has(`graph`)||this.query!==i.pathFilter||this.dirty)){let e=this.model?.rows;this.query=i.pathFilter,this.model=h(this.graph,{expanded:this.expanded,order:this.order,query:this.query,neighborhood:this.neighborhood,cyclesOnly:this.cyclesOnly}),this.neighborhood&&!this.model.byId.has(this.neighborhood)&&(this.neighborhood=null,this.model=h(this.graph,{expanded:this.expanded,order:this.order,query:this.query,cyclesOnly:this.cyclesOnly})),this.selection&&(!this.model.index.has(this.selection.from)||this.selection.to&&(!this.model.index.has(this.selection.to)||this.cyclesOnly&&!this.model.cells.get(this.selection.from)?.has(this.selection.to)))&&(this.selection=null),this.hover=null,this.dirty=!1,this.needsFit||=!e||e.length!==this.model.rows.length||this.model.rows.some((t,n)=>t.id!==e[n].id)}}firstUpdated(){let e=this.renderRoot.querySelector(`canvas`);this.canvas=e,this.resizeObserver=new ResizeObserver(()=>{let t=e.parentElement.getBoundingClientRect();this.width=t.width,this.height=t.height;let n=window.devicePixelRatio||1;e.width=Math.round(this.width*n),e.height=Math.round(this.height*n),this.clamp(),this.paint()}),this.resizeObserver.observe(e.parentElement),this.themeObserver=new MutationObserver(()=>this.requestUpdate()),this.themeObserver.observe(document.body,{attributes:!0,attributeFilter:[`class`]}),this.events=new AbortController,e.addEventListener(`wheel`,e=>{e.preventDefault(),e.ctrlKey||e.metaKey?this.zoom(Math.exp(-e.deltaY*.005),e.offsetX,e.offsetY):(this.view.x+=e.shiftKey?e.deltaY:e.deltaX,this.view.y+=e.shiftKey?0:e.deltaY,this.clamp(),this.hover=null,this.paint())},{passive:!1,signal:this.events.signal})}updated(){i.graphState=this.bridge;let e=JSON.stringify([this.cyclesOnly,this.model.cycleCount,this.expanded.size,!!this.neighborhood]);e!==this.controlsKey&&(this.controlsKey=e,this.dispatchEvent(new CustomEvent(`matrix-controls-change`,{detail:this.renderControls(),bubbles:!0,composed:!0}))),cancelAnimationFrame(this.frame),this.frame=requestAnimationFrame(()=>this.paint())}disconnectedCallback(){super.disconnectedCallback(),this.resizeObserver?.disconnect(),this.themeObserver?.disconnect(),this.events?.abort(),cancelAnimationFrame(this.frame),i.graphState===this.bridge&&(i.graphState=null)}clamp(){this.view.cell=Oe(this.view.cell,this.model.rows.length,this.width,this.height);let e=this.model.rows.length*this.view.cell;this.view.x=Math.max(0,Math.min(this.view.x,Math.max(0,e-this.width+196+12))),this.view.y=Math.max(0,Math.min(this.view.y,Math.max(0,e-this.height+118+12)))}fit(){this.view={cell:De(this.model.rows.length,this.width,this.height),x:0,y:0},this.needsFit=!1,this.requestUpdate()}zoom(e,t=(this.width+196)/2,n=(this.height+118)/2){let r=this.view.cell,i=Oe(r*e,this.model.rows.length,this.width,this.height);this.view.x=(this.view.x+t-196)*i/r-t+196,this.view.y=(this.view.y+n-118)*i/r-n+118,this.view.cell=i,this.clamp(),this.hover=null,this.requestUpdate()}select(e,t=null,n=!0){this.selection={from:e,to:t},n&&this.model.index.has(e)&&(this.view.cell=Math.max(16,this.view.cell),this.view.y=this.model.index.get(e)*this.view.cell-(this.height-118)/2,this.view.x=(this.model.index.get(t??e)??0)*this.view.cell-(this.width-196)/2,this.clamp()),this.requestUpdate()}expand(e){this.graph.packagesOnly||(this.expanded.has(e)?this.expanded.delete(e):this.expanded.add(e),this.revealPkg=e,this.selection=null,this.neighborhood=null,this.dirty=!0,this.requestUpdate())}pointer(e){let t=this.canvas.getBoundingClientRect();return ke(e.clientX-t.left,e.clientY-t.top,this.model,this.view)}move(e){if(this.drag){let t=e.clientX-this.drag.x,n=e.clientY-this.drag.y;if(Math.abs(t)+Math.abs(n)>3&&(this.drag.moved=!0),this.drag.moved){this.view.x=this.drag.ox-t,this.view.y=this.drag.oy-n,this.clamp(),this.hover=null,this.paint();return}}let t=this.pointer(e);(t?.row!==this.hover?.row||t?.col!==this.hover?.col)&&(this.hover=t,this.requestUpdate())}key(e){if(e.key===`Escape`){this.selection=null,this.hover=null,this.requestUpdate();return}if(![`ArrowDown`,`ArrowUp`,`ArrowLeft`,`ArrowRight`,`Enter`].includes(e.key)||this.model.rows.length===0)return;e.preventDefault();let t=this.model.index.get(this.selection?.from)??0,n=this.model.index.get(this.selection?.to)??t;if(e.key===`Enter`){this.expand(this.model.rows[t].pkg);return}e.key===`ArrowDown`&&t++,e.key===`ArrowUp`&&t--,e.key===`ArrowRight`&&n++,e.key===`ArrowLeft`&&n--;let r=e=>Math.max(0,Math.min(this.model.rows.length-1,e));this.select(this.model.rows[r(t)].id,this.model.rows[r(n)].id)}paint(){if(!this.canvas||!this.model||this.width<=196||this.height<=118)return;if(this.needsFit&&this.fit(),this.revealPkg){let e=this.model.rows.find(e=>e.pkg===this.revealPkg);this.revealPkg=null,e&&this.select(e.id)}let e=this.canvas.getContext(`2d`),t=window.devicePixelRatio||1;e.setTransform(t,0,0,t,0,0);let n=getComputedStyle(this),r=e=>n.getPropertyValue(e).trim(),a=document.body.classList.contains(`theme-paper`),o=a||[`theme-light`,`theme-pink`,`theme-w95`].some(e=>document.body.classList.contains(e)),s={bg:r(`--graph-canvas-bg`)||`#0c0c0c`,surface:r(`--surface`),text:r(`--text`),muted:r(`--muted`),border:r(`--border`),grid:o?`#0000000b`:`#ffffff0b`,highlight:a?`#fff`:o?`#0969da18`:`#ffffff12`,cycle:a?`#000`:o?`#a21caf`:`#e879c7`};this.style.setProperty(`--matrix-cycle`,s.cycle);let c=this.model.index.get(this.selection?.to),l=this.model.index.get(this.selection?.from);je(e,this.model,this.view,{width:this.width,height:this.height,theme:s,colorOf:d,rows:ne(this.graph).importers,hover:this.hover,selected:l===void 0?null:{row:l,col:c??null},dimmed:e=>!this.graph.issuesHidden&&!e.files.some(e=>{let t=this.graph.nodeByFile.get(e);return(i.selectedSeverities.size===0||[...i.selectedSeverities].some(e=>t.severitySet?.has(e)))&&(i.selectedColors.size===0||[...i.selectedColors].some(e=>t.colorSet?.has(e)))})})}renderControls(){let e=this.model.cycleCount>0||this.cyclesOnly;return!e&&this.expanded.size===0&&!this.neighborhood?null:D`<div class="g2-matrix-controls">${e?D`<mode-switch label="${`${this.model.cycleCount} ${this.model.cycleCount===1?`cycle`:`cycles`}`}" .checked="${this.cyclesOnly}" @click="${()=>{this.cyclesOnly=!this.cyclesOnly,this.dirty=!0,this.requestUpdate()}}"></mode-switch>`:null} ${this.expanded.size>0?D`<button @click="${()=>{this.expanded.clear(),this.selection=null,this.dirty=!0,this.requestUpdate()}}">Collapse all</button>`:null} ${this.neighborhood?D`<button @click="${()=>{this.neighborhood=null,this.dirty=!0,this.requestUpdate()}}">All dependencies</button>`:null}</div>`}render(){if(!this.model)return null;let e=this.model.rows[this.hover?.col],t=this.model.rows[this.hover?.row],n=e&&t?this.model.cells.get(t.id)?.get(e.id)?.count??0:0,r=this.graph.packagesOnly,i=ne(this.graph);return D`<div class="matrix-layout"><div class="matrix-stage" style="${v({"--matrix-label-width":`196px`})}"><select class="matrix-order" aria-label="Matrix order" @change="${e=>{this.order=e.target.value,this.dirty=!0,this.requestUpdate()}}"><option value="structure" ?selected="${this.order===`structure`}">Structure ↓</option><option value="name" ?selected="${this.order===`name`}">Name ↓</option><option value="importers" ?selected="${this.order===`importers`}">${i.mostImported} ↓</option><option value="imports" ?selected="${this.order===`imports`}">Most ${i.links} ↓</option></select><canvas tabindex="0" role="img" aria-label="${r?`Dependency matrix. Rows depend on columns. Arrow keys select cells.`:`Dependency matrix. Rows import columns. Arrow keys select cells; Enter expands a package.`}" @keydown="${e=>this.key(e)}" @pointermove="${e=>this.move(e)}" @pointerleave="${()=>{this.drag||(this.hover=null,this.requestUpdate())}}" @pointerdown="${e=>{e.button===0&&(this.canvas.setPointerCapture(e.pointerId),this.drag={x:e.clientX,y:e.clientY,ox:this.view.x,oy:this.view.y,moved:!1})}}" @pointercancel="${()=>{this.drag=null}}" @pointerup="${e=>{if(this.drag){if(!this.drag.moved){let t=this.pointer(e);t&&this.select(this.model.rows[t.row].id,t.col===null?null:this.model.rows[t.col].id,!1)}this.drag=null}}}" @dblclick="${e=>{let t=this.pointer(e);t&&this.expand(this.model.rows[t.row].pkg)}}"></canvas>${t&&(!e||n>0)?D`<div class="matrix-hover">${t.label}${e?` \u2192 ${e.label} \xB7 ${n} ${i.links}`:` \xB7 ${Ne(this.graph,t)} ${i.members}`}</div>`:null}<div class="g2-zoom-ctrl" role="group" aria-label="Matrix zoom"><button aria-label="Zoom in" @click="${()=>this.zoom(1.5)}">+</button><div class="g2-zoom-pct">${Math.round(this.view.cell/18*100)}%</div><button aria-label="Zoom out" @click="${()=>this.zoom(1/1.5)}">−</button> <button class="g2-zoom-fit-btn" aria-label="Fit to view" @click="${()=>this.fit()}">fit</button></div></div><aside class="matrix-panel" aria-label="Matrix details" aria-live="polite">${Pe(this.model,this.graph,this.selection,{select:(e,t)=>this.select(e,t),expand:e=>this.expand(e),expanded:this.expanded,neighborhood:this.neighborhood,focus:e=>{this.neighborhood=this.neighborhood===e?null:e,this.dirty=!0,this.requestUpdate()},clear:()=>{this.selection=null,this.requestUpdate()}})}</aside></div>`}};customElements.define(`dependency-matrix`,Ie);var X={dark:`#0c0c0c`,light:`#f6f8fa`,pink:`#fff0f7`,w95:`#fff`,paper:`#fff`};function Le(){let e=typeof document>`u`?null:document.body?.classList;return e?.contains(`theme-paper`)?X.paper:e?.contains(`theme-pink`)?X.pink:e?.contains(`theme-w95`)?X.w95:e?.contains(`theme-light`)?X.light:X.dark}function Re(e){let t=[1,3,5].map(t=>{let n=parseInt(e.slice(t,t+2),16)/255;return n<=.04045?n/12.92:((n+.055)/1.055)**2.4});return t[0]*.2126+t[1]*.7152+t[2]*.0722>.18?`#000`:`#fff`}function ze(e,t,n,r){let i=[...r.keys()],a=new Map;i.forEach((e,t)=>{for(let n of r.get(e).files)a.set(n,t)});let o=[...a.keys()],s=new Map(o.map((e,t)=>[e,t])),c=o.map(e=>a.get(e)),l=o.map(e=>[...t.get(e)].map(e=>s.get(e))),u=n.map(e=>s.get(e)),d=o.map(t=>{let n=e.get(t);return{size:Number.isFinite(n.size)&&n.size>=0?n.size:0,missing:+(!n.virtual&&n.size==null)}}),f=i.map(()=>({removable:0,removableMissing:0})),p=new Int32Array(o.length),m=new Int32Array(o.length),h=new Int32Array(o.length),g=new Uint8Array(o.length);for(let e=0;e<i.length;e+=32){let t=Math.min(32,i.length-e),n=t===32?-1:(1<<t)-1;m.fill(0),g.fill(0);for(let r=0;r<o.length;r++){let i=c[r]-e;p[r]=i>=0&&i<t?n&~(1<<i):n}let r=0,a=0,s=0,_=e=>{g[e]||(g[e]=1,h[s]=e,s=(s+1)%h.length,a++)};for(let e of u)m[e]=p[e],m[e]&&_(e);for(;a>0;){let e=h[r];r=(r+1)%h.length,a--,g[e]=0;for(let t of l[e]){let n=m[e]&p[t]&~m[t];n&&(m[t]|=n,_(t))}}let v=new Map;for(let e=0;e<o.length;e++){let t=n&~m[e];if(!t)continue;let r=v.get(t);r||(r={size:0,missing:0},v.set(t,r)),r.size+=d[e].size,r.missing+=d[e].missing}for(let[t,n]of v)for(let r=t;r;r&=r-1){let t=e+31-Math.clz32(r&-r);f[t].removable+=n.size,f[t].removableMissing+=n.missing}}i.forEach((e,t)=>Object.assign(r.get(e),f[t]))}function Be(e,t,n){let r=new Map([...e.keys()].map(e=>[e,new Set]));for(let[e,i]of t){let t=n(e),a=n(i);t!==a&&r.get(t).add(a)}let{groups:i,componentOf:a}=m([...e.keys()],r),o=i.map(t=>t.reduce((t,n)=>{let r=e.get(n);return Math.max(t,r.own,r.removable)},0)),s=i.map(()=>0),c=i.map(()=>new Set);for(let[e,t]of r)for(let n of t){let t=a.get(e),r=a.get(n);t!==r&&!c[t].has(r)&&(c[t].add(r),s[r]++)}let l=[];s.forEach((e,t)=>{e||l.push(t)});for(let e of l)for(let t of c[e])o[t]=Math.max(o[t],o[e]),--s[t]===0&&l.push(t);for(let[t,n]of e)n.filterSize=o[a.get(t)]}function Ve(e,t,n,r,i){let a=new Int32Array(e.length),o=i.map(()=>({size:0,missing:0}));for(let s=0;s<e.length;s+=32){let c=Math.min(32,e.length-s);for(let n=t.length-1;n>=0;n--){let r=t[n],i=r-s,o=i>=0&&i<c?1<<i:0;for(let t of e[r])o|=a[t];a[r]=o}let l=new Map;for(let e=0;e<i.length;e++){let t=a[i[e]];if(!t)continue;let c=l.get(t);if(!c){c={size:0,missing:0};for(let e=t;e;e&=e-1){let t=s+31-Math.clz32(e&-e);c.size+=n[t],c.missing+=r[t]}l.set(t,c)}o[e].size+=c.size,o[e].missing+=c.missing}}return i.map((e,t)=>[e,o[t]])}var He=e=>Number.isFinite(e)&&e>=0?e:0,Ue=e=>e.filterSize,We=(e,t)=>Math.max(e.removable,e.own)<t&&e.filterSize>=t;function Ge(e){if(e.byId.size<=100)return 0;let t=[0,1,4,10,20,50,100,200].map(e=>e*1024),n=t.map(()=>0);for(let r of e.byId.values())for(let e=0;e<t.length&&!(Ue(r)<t[e]);e++)n[e]++;let r=0;for(;r<t.length-1&&n[r]>100&&n[r+1]>=50;)r++;return t[r]}function Ke(e,t){let{groups:n,componentOf:r}=m([...e.keys()],t),i=n.map(t=>t.reduce((t,n)=>t+He(e.get(n).size),0)),a=n.map(t=>t.filter(t=>!e.get(t).virtual&&e.get(t).size==null).length),o=n.map(()=>0),s=n.map(()=>new Set);for(let[e,n]of t)for(let t of n){let n=r.get(e),i=r.get(t);n!==i&&!s[n].has(i)&&(s[n].add(i),o[i]++)}let c=[...o],l=[];c.forEach((e,t)=>{e||l.push(t)});for(let e of l)for(let t of s[e])--c[t]===0&&l.push(t);let u=new Uint32Array(n.length),d=new Map,f=8*(n.length+s.reduce((e,t)=>e+t.size,0)),p=0,h=0,g=(e,t=!1)=>{++p===4294967295&&(u.fill(0),p=1);let n=0,r=0,o=[...e];for(;o.length>0;){let e=o.pop();if(u[e]!==p){if(t&&(h+=1+s[e].size)>f)return null;u[e]=p,r+=i[e],n+=a[e];for(let t of s[e])u[t]!==p&&o.push(t)}}return{size:r,missing:n}},_=l.toReversed();for(let e=0;e<_.length;e++){let t=_[e],n=s[t].size===1?d.get([...s[t]][0]):null,r=n?{size:i[t]+n.size,missing:a[t]+n.missing}:g([t],!0);if(r)d.set(t,r);else{for(let[t,n]of Ve(s,l,i,a,_.slice(e)))d.set(t,n);break}}return{inferred:n.filter((e,t)=>o[t]===0).map(e=>e[0]),sum(e){let t=new Set(e.map(e=>r.get(e)));return t.size===1?d.get([...t][0]):g(t)}}}function qe(e){let t=new Map(e.nodes.map(e=>[e.file,e])),n=e.flowEntries??[];for(let e of n)e.virtual&&!t.has(e.file)&&t.set(e.file,{...e,size:0});let r=new Map([...t.keys()].map(e=>[e,new Set])),i=0;for(let[n,a]of t)for(let o of a.virtual?a.imports:e.importsOf.get(n)??[]){let s=t.get(o);if(!s||r.get(n).has(o))continue;let c=t=>t.virtual?t.pkg===`__own__`:e.ownSourceFiles?.has(t.file);if(!f(a.origFile??n,s.origFile??o,c(s),c(a))){i++;continue}r.get(n).add(o)}return{files:t,links:r,entries:n.filter(e=>e.entry!==!1).map(e=>e.file).filter(e=>t.has(e)),weakEdges:i}}function Je(e,t){let n=new Map;for(let r of e){let e=t.get(r),i=e.packageInfo;if(!i)continue;n.has(i.directory)||n.set(i.directory,{...i,size:0,missing:0});let a=n.get(i.directory);a.size+=He(e.size),!e.virtual&&e.size==null&&a.missing++}return[...n.values()].toSorted((e,t)=>t.size-e.size||e.directory.localeCompare(t.directory))}function Ye(e,{packages:t=!1}={}){let{files:n,links:r,entries:i,weakEdges:a}=qe(e),o=Ke(n,r),s=i.length>0?[...new Set(i)]:o.inferred,c=new Set(s),l=new Map,u=[...s];for(let e of u)for(let t of r.get(e))c.has(t)||(c.add(t),u.push(t),l.set(t,e));let d=new Map,f=e=>`${t?`p`:`f`}:${t?n.get(e).pkg:e}`;for(let e of c){let r=f(e),i=n.get(e);d.has(r)||d.set(r,{id:r,pkg:i.pkg,label:t?_(i.pkg):e,version:t?void 0:i.packageInfo?.version,files:[],own:0,virtual:!0,incoming:[],outgoing:[]});let a=d.get(r);a.files.push(e),a.own+=He(i.size),a.virtual&&=!!i.virtual}for(let e of d.values())Object.assign(e,o.sum(e.files)),t&&(e.instances=Je(e.files,n));ze(n,r,s,d),Be(d,l,f);let p=new Map;for(let e of c)for(let n of r.get(e)){let r=f(e),i=f(n);if(t&&r===i)continue;let a=JSON.stringify([r,i]);p.has(a)||p.set(a,{id:a,from:r,to:i,targets:new Set,count:0});let o=p.get(a);o.targets.add(n),o.count++}let m=[...p.values()];for(let e of m)Object.assign(e,o.sum([...e.targets])),d.get(e.from).outgoing.push(e),d.get(e.to).incoming.push(e);return{byId:d,edges:m,edgeById:p,roots:[...new Set(s.map(f))],files:n,packages:t,weakEdges:a,inferred:i.length===0,total:o.sum(s),omittedFiles:n.size-c.size}}function Xe(e,t,n){let r=new Set(t),i=[...t],a=new Set(t);for(let t of i)for(let a of e.byId.get(t).outgoing)!r.has(a.to)&&n(a.to)&&(r.add(a.to),i.push(a.to));let o=new Map(i.map(t=>[t,new Set(e.byId.get(t).outgoing.map(e=>e.to).filter(e=>r.has(e)&&!a.has(e)))])),{componentOf:s,groups:c}=m(i,o),l=c.map(()=>0),u=c.map(()=>new Set),d=c.map(()=>0);for(let[e,t]of o)for(let n of t){let t=s.get(e),r=s.get(n);t!==r&&!u[t].has(r)&&(u[t].add(r),l[r]++)}let f=[];l.forEach((e,t)=>{e||f.push(t)});for(let e of f)for(let t of u[e])d[t]=Math.max(d[t],d[e]+1),--l[t]===0&&f.push(t);return new Map(i.map(e=>[e,d[s.get(e)]]))}function Ze(e,t,n){let r=new Map(e.map(e=>[e.id,{from:[],to:[]}]));for(let e of t)r.get(e.from).from.push(e),r.get(e.to).to.push(e);for(let t of e)for(let e of[`from`,`to`]){let i=e===`to`,a=i?`x2`:`x1`,o=i?`width2`:`width1`,s=e=>{let t=n.get(i?e.from:e.to);return t.x+t.width/2},c=r.get(t.id)[e].toSorted((e,t)=>s(e)-s(t)||e.id.localeCompare(t.id));if(c.length===0)continue;let l=c.reduce((e,t)=>e+t[o],0),u=0;if(l<=t.width){for(let e of c)e[a]=t.x+u,u+=e[o];continue}let d=c[0][o]/2,f=c.at(-1)[o]/2,p=l-d-f,m=new Float64Array(c.length),h=t.width,g=0;for(let e=c.length-1;e>=0;e--)h=Math.min(h,t.width-c[e][o]/2),m[e]=h;for(let e=0;e<c.length;e++){let n=c[e],r=n[o]/2,i=d+(u+r-d)/p*(t.width-d-f),s=Math.min(m[e],Math.max(g,r,i));n[a]=t.x+s-r,g=s,u+=n[o]}}}function Qe(e,t){let n=0,r=0;for(let r=0,i=0;r<e.length;r++){for(;i<t.length&&t[i]<e[r];)i++;n+=i}for(let n=0,i=0;i<t.length;i++){for(;n<e.length&&e[n]<t[i];)n++;r+=n}return[n,r]}function $e(e,t,n){let r=new Map;for(let e of t){let t=n.get(e.from),i=n.get(e.to);if(t.level===i.level)continue;let[a,o]=t.level<i.level?[t,i]:[i,t];r.has(o)||r.set(o,[]),r.get(o).push(a)}let i=1e6;for(let t of e.values()){let e=new Map(t.map(e=>[e,(r.get(e)??[]).map(e=>e.x+e.width/2).toSorted((e,t)=>e-t)]));for(let n=0;n<t.length&&i>0;n++){let n=!1;for(let r=0;r+1<t.length;r++){let a=e.get(t[r]),o=e.get(t[r+1]);i-=1+a.length+o.length;let[s,c]=Qe(a,o);c<s&&([t[r],t[r+1]]=[t[r+1],t[r]],n=!0)}if(!n)break}let n=0;for(let e of t)e.x=n,n+=e.width}}function et(e){let t=t=>e.byId.get(t).pkg;return W(e.edges.map(e=>[t(e.from),t(e.to)]),e.packages?oe:ae)}function tt(e,{focus:t=null,minSize:n=0,width:r=1100}={}){let i=et(e),a=t=>Ue(e.byId.get(t))>=n&&!i.has(e.byId.get(t).pkg),o=(t&&e.byId.has(t)?[t]:e.roots).filter(a),s=Xe(e,o,a),c=[...s.keys()].filter(a).toSorted((t,n)=>s.get(t)-s.get(n)||e.byId.get(n).removable-e.byId.get(t).removable||t.localeCompare(n)),l=new Set(c),u=e.edges.filter(e=>l.has(e.from)&&l.has(e.to)).toSorted((e,t)=>t.size-e.size||e.id.localeCompare(t.id)).map(e=>({...e})),d=[...l].map(t=>({...e.byId.get(t),level:s.get(t)})),f=Map.groupBy(d,e=>e.level),p=new Map(d.map(e=>[e.id,e])),m=d.reduce((e,t)=>Math.max(e,t.removable),1),h=e=>Math.max(e,m/4e3),g=[...f.values()].reduce((e,t)=>Math.max(e,t.reduce((e,t)=>e+t.removable,0)),1),_=Math.max(1,r)/g,v=0,y=0;for(let e of d)e.y=12+e.level*88,e.width=Math.max(.1,e.removable*_),y=Math.max(y,e.y+26);$e(f,u,p);for(let e of f.values())v=Math.max(v,e.reduce((e,t)=>e+t.width,0)),e.forEach((t,n)=>{t.rowStart=n===0,t.rowEnd=n===e.length-1});let b=[...f.values()].flat();for(let e of u){let t=p.get(e.from),n=p.get(e.to),r=h(e.size)*_;e.width1=Math.min(r,t.width),e.width2=Math.min(r,n.width),e.x1=t.x+(t.width-e.width1)/2,e.x2=n.x+(n.width-e.width2)/2,e.y1=t.y+26,e.y2=n.y,e.returning=n.level<=t.level,e.returning&&(y=Math.max(y,Math.max(e.y1,e.y2)+35))}return Ze(b,u,p),{nodes:b,byId:p,edges:u,roots:o,hiddenPackages:i,width:Math.max(1,v),height:y+12}}function nt(e,t,n){if(!(t>0&&n>0))return e;let r=t/Math.min(t/1100,n/e.height,9.99);if(Math.abs(r-e.width)<1e-7)return e;let i=r/e.width,a=e.nodes.map(e=>({...e,x:e.x*i,width:e.width*i})),o=e.edges.map(e=>({...e,x1:e.x1*i,x2:e.x2*i,width1:e.width1*i,width2:e.width2*i}));return{...e,nodes:a,edges:o,byId:new Map(a.map(e=>[e.id,e])),width:r}}function rt(e){let{x1:t,x2:n,y1:r,y2:i,width1:a,width2:o}=e,s=e.returning?Math.max(r,i)+35:(r+i)/2;return`M${t},${r} C${t},${s} ${n},${s} ${n},${i} L${n+o},${i} C${n+o},${s} ${t+a},${s} ${t+a},${r} Z`}function it(e){let t=e.returning?Math.max(e.y1,e.y2)+35:(e.y1+e.y2)/2;return{left:Math.min(e.x1,e.x2),right:Math.max(e.x1+e.width1,e.x2+e.width2),top:Math.min(e.y1,e.y2,t),bottom:Math.max(e.y1,e.y2,t)}}function Z(e,t){return e.right<t.left||e.left>t.right||e.bottom<t.top||e.top>t.bottom}function at(e){if(e.length===0)return null;let t={left:1/0,right:-1/0,top:1/0,bottom:-1/0};for(let n of e)t.left=Math.min(t.left,n.left),t.right=Math.max(t.right,n.right),t.top=Math.min(t.top,n.top),t.bottom=Math.max(t.bottom,n.bottom);if(e.length<=12)return{...t,entries:e};let n=t.right-t.left>t.bottom-t.top,r=e=>n?e.left+e.right:e.top+e.bottom,i=e.toSorted((e,t)=>r(e)-r(t)),a=i.length>>>1;return{...t,children:[at(i.slice(0,a)),at(i.slice(a))]}}function ot(e,t,n){let r=[],i={left:t,right:t,top:n,bottom:n},a=e?[e]:[];for(;a.length>0;){let e=a.pop();if(!Z(e,i)){if(e.entries)for(let t of e.entries)Z(t,i)||r.push(t);else a.push(...e.children)}}return r.toSorted((e,t)=>t.order-e.order)}function st(e,t,n){let r=[],i=e?[e]:[];for(;i.length>0;){let e=i.pop();if(!Z(e,t)){if(e.entries){for(let i of e.entries)if(i.edge&&!Z(i,t)&&(r.push(i),r.length>n))return null}else i.push(...e.children)}}return r.toSorted((e,t)=>e.order-t.order)}var Q=n;function ct(e){if(!e.instances?.length)return e.version?`
|
|
9
|
+
Version: ${e.version}`:``;if(e.instances.length===1)return`
|
|
10
|
+
Version: ${e.instances[0].version||`Unknown`}`;let t=new Map;for(let n of e.instances){let e=n.version||`Unknown version`;t.has(e)||t.set(e,{version:e,size:0,count:0,missing:0});let r=t.get(e);r.size+=n.size,r.count++,r.missing+=n.missing}return`
|
|
11
|
+
Versions · own source size
|
|
12
|
+
`+[...t.values()].toSorted((e,t)=>t.size-e.size||e.version.localeCompare(t.version)).map(e=>`${e.version} \xB7 ${n(e.size)}${e.missing?`+`:``} \xB7 ${e.count} ${e.count===1?`copy`:`copies`}`).join(`
|
|
13
|
+
`)}function lt(e,t){return`${e.label}
|
|
14
|
+
${n(e.removable)} unique \xB7 ${n(e.size)} reachable \xB7 ${n(e.own)} own${e.removableMissing?` \xB7 ${e.removableMissing} removed file sizes unknown`:``}${ct(e)}${We(e,t)?`
|
|
15
|
+
Kept by Large to preserve an entry-point path`:``}`}function ut(e,t){return`${t.byId.get(e.from).label} \u2192 ${t.byId.get(e.to).label}
|
|
16
|
+
${n(e.size)} reachable${e.returning?` · return / cycle edge`:``}`}var dt=e=>Math.min(.5/e,13);function ft(e,t){let n=e.width/2;if(e.rowStart===e.rowEnd){let e=Math.min(t,n/2);return{left:e,right:e}}let r=Math.min(t,n),i=Math.min(t,n-r);return e.rowStart?{left:r,right:i}:{left:i,right:r}}var pt=`Import paths. Use arrow keys to explore bars, Enter to select, or the sidebar search to find a file or package.`,mt=1500,ht=class{constructor(e){this.host=e}render(){return D`<canvas class="flow-canvas flow-base" aria-hidden="true"></canvas><canvas class="flow-canvas flow-bars" aria-hidden="true"></canvas><canvas class="flow-canvas flow-overlay" tabindex="0" role="group" aria-label="${pt}" @pointermove="${e=>this.pointer(e)}" @pointerleave="${()=>this.clearHover()}" @click="${e=>this.click(e)}" @dblclick="${e=>this.click(e,!0)}" @keydown="${e=>this.key(e)}"></canvas>`}prepare(){this.layout=this.host.layout,this.model=this.host.model,this.paths=this.layout.edges.map((e,t)=>({edge:e,order:t,path:new Path2D(rt(e)),...it(e)})),this.pathById=new Map(this.paths.map(e=>[e.edge.id,e])),this.rows=[...Map.groupBy(this.layout.nodes,e=>e.y).values()];let e=this.layout.nodes.map((e,t)=>({node:e,order:this.paths.length+t,left:e.x,right:e.x+e.width,top:e.y,bottom:e.y+26}));this.index=at([...this.paths,...e]),this.clearHover(),this.focused=null,this.invalidateRaster()}matchingNodes(){let e=this.host.model,t=JSON.stringify([this.host.minSize,this.host.graph.issuesHidden,i.pathFilter,[...i.selectedSeverities].toSorted(),[...i.selectedColors].toSorted()]);return(this.matchModel!==e||this.filterKey!==t)&&(this.matches=new Set([...e.byId.values()].filter(e=>this.host.matchesNode(e)).map(e=>e.id)),this.matchModel=e,this.filterKey=t,this.searchResult=null),this.matches}searchMatches(){let e=this.matchingNodes();return this.searchResult??=[...e].map(e=>this.host.model.byId.get(e)).toSorted((e,t)=>t.removable-e.removable)}update(e){if(this.base=e.querySelector(`.flow-base`),this.bars=e.querySelector(`.flow-bars`),this.overlay=e.querySelector(`.flow-overlay`),!this.base||!this.bars||!this.overlay)return;this.layout!==this.host.layout&&this.prepare();let t=Le(),n=this.matchingNodes(),r=d(`__own__`);(n!==this.paintedMatches||r!==this.palette||t!==this.background)&&(this.paintedMatches=n,this.palette=r,this.background=t,this.colors=new Map([...this.model.byId.values()].map(e=>[e.pkg,d(e.pkg)])),this.foreground=getComputedStyle(this.host).getPropertyValue(`--text`).trim()||`#fff`,this.invalidateRaster()),this.requestDraw()}requestDraw(){this.frame!=null||!this.overlay||(this.frame=requestAnimationFrame(()=>{this.frame=null,this.draw()}))}dispose(){this.clearHover(),this.frame!=null&&cancelAnimationFrame(this.frame),this.frame=null,this.base=null,this.bars=null,this.overlay=null,this.invalidateRaster()}stopPreview(){clearTimeout(this.previewTimer),this.settleFrame!=null&&cancelAnimationFrame(this.settleFrame),this.settleFrame=null,this.previewTimer=null,this.preview=!1}invalidateRaster(){this.stopPreview(),this.baseKey=null,this.barsKey=null,this.overview=null,this.paintedViewport=null}viewportChanged(){let{width:e,height:t,zoom:n,pan:r}=this.host,i=`${e}:${t}:${n}:${r.x}:${r.y}`;if(i===this.viewportKey){this.preview&&this.host.fitted&&(this.stopPreview(),this.requestDraw());return}this.viewportKey=i,this.stopPreview();let a=this.paintedViewport;this.host.fitted===!1&&this.overview&&a?.width===e&&a.height===t&&a.dpr===(globalThis.devicePixelRatio||1)&&(this.preview=!0,this.previewTimer=setTimeout(()=>{this.previewTimer=null,this.settleFrame=requestAnimationFrame(()=>{this.settleFrame=requestAnimationFrame(()=>{this.stopPreview(),this.requestDraw()})})},100)),this.clearHover(),this.requestDraw()}context(e,t,n=!0){let r=Math.ceil(this.host.height*t),i=Math.ceil(this.host.width*t);(e.width!==i||e.height!==r)&&(e.width=i,e.height=r);let a=e.getContext(`2d`);a.setTransform(1,0,0,1,0,0),n&&a.clearRect(0,0,i,r);let{pan:o,zoom:s}=this.host;return a.setTransform(t*s,0,0,t*s,t*o.x,t*o.y),a}draw(){if(!this.overlay||!this.host.width||!this.host.height)return;let{pan:e,zoom:t,width:n,height:r}=this.host,i=globalThis.devicePixelRatio||1,a=`${this.viewportKey}:${i}`;this.view={left:-e.x/t,right:(n-e.x)/t,top:-e.y/t,bottom:(r-e.y)/t};let o=this.preview?st(this.index,this.view,mt):null;if(o&&this.stopPreview(),this.preview){this.drawPreview(i),this.drawBars(i,a,!0);let e=this.context(this.overlay,i),n=this.layout.byId.get(this.host.selection?.node);n&&(e.globalAlpha=1,e.strokeStyle=this.foreground,e.lineWidth=Math.min(1.5/t,n.width/2),e.strokeRect(n.x,n.y,n.width,26)),this.previewVisible=!0;return}let s=this.baseKey!==a;if(s){let s=this.context(this.base,i);s.globalAlpha=1,s.fillStyle=this.background,s.fillRect(this.view.left,this.view.top,n/t,r/t),this.visiblePaths=o??this.paths.filter(e=>!Z(e,this.view));for(let e of this.visiblePaths)this.paintPath(s,e,this.edgeAlpha(e.edge));if(this.baseKey=a,this.paintedViewport={width:n,height:r,zoom:t,pan:{...e},dpr:i},this.view.left<=0&&this.view.top<=0&&this.view.right>=this.layout.width-1e-6&&this.view.bottom>=this.layout.height-1e-6){let e=this.overview?.canvas??document.createElement(`canvas`);e.width=this.base.width,e.height=this.base.height,e.getContext(`2d`).drawImage(this.base,0,0),this.overview={...this.paintedViewport,canvas:e}}}this.drawBars(i,a),this.drawHighlight(i,s||this.previewVisible),this.previewVisible=!1}drawPreview(e){let{width:t,height:n,pan:r,zoom:i}=this.host,a=this.context(this.bars,e,!1);a.setTransform(e,0,0,e,0,0),a.globalAlpha=1,a.imageSmoothingEnabled=!1;let o={...this.paintedViewport,canvas:this.base},s=i/o.zoom,c=r.x-o.pan.x*s,l=r.y-o.pan.y*s,u=c<=0&&l<=0&&c+o.width*s>=t&&l+o.height*s>=n;u||(a.fillStyle=this.background,a.fillRect(0,0,t,n));for(let e of u?[o]:[this.overview,o]){let o=i/e.zoom,s=r.x-e.pan.x*o,c=r.y-e.pan.y*o,l=Math.max(0,s),u=Math.max(0,c),d=Math.min(n,c+e.height*o),f=Math.min(t,s+e.width*o);if(f<=l||d<=u)continue;let p=e.dpr/o;a.drawImage(e.canvas,(l-s)*p,(u-c)*p,(f-l)*p,(d-u)*p,l,u,f-l,d-u)}}drawBars(e,t,n=!1){if(!n&&this.barsKey===t&&!this.previewVisible)return;this.barsKey!==t&&(this.visibleNodes=this.layout.nodes.filter(e=>!Z({left:e.x,right:e.x+e.width,top:e.y,bottom:e.y+26},this.view)));let r=this.context(this.bars,e,!n);for(let e of this.visibleNodes)this.paintNode(r,e);this.paintRowBorders(r),this.barsKey=t}paintRowBorders(e){let t=dt(this.host.zoom);e.globalAlpha=1,e.fillStyle=this.background;for(let n of this.rows){let r=n[0],i=n.at(-1),a=i.x+i.width;if(Z({left:r.x,right:a,top:r.y,bottom:r.y+26},this.view))continue;e.fillRect(r.x,r.y,a-r.x,t),e.fillRect(r.x,r.y+26-t,a-r.x,t),e.fillRect(r.x,r.y,ft(r,t).left,26);let o=ft(i,t).right;e.fillRect(a-o,r.y,o,26)}}edgeAlpha(e){return!this.matches.has(e.from)&&!this.matches.has(e.to)?.04:.22}paintPath(e,t,n){e.globalAlpha=n,e.fillStyle=this.colors.get(this.model.byId.get(t.edge.to).pkg),e.fill(t.path),t.edge.returning&&(e.strokeStyle=this.foreground,e.lineWidth=.7/this.host.zoom,e.setLineDash([3,3]),e.stroke(t.path),e.setLineDash([]))}paintNode(e,t){if(Z({left:t.x,right:t.x+t.width,top:t.y,bottom:t.y+26},this.view))return;let{zoom:n}=this.host,r=this.colors.get(t.pkg);e.globalAlpha=this.matches.has(t.id)?1:.15,e.fillStyle=r,e.fillRect(t.x,t.y,t.width,26);let{left:i,right:a}=ft(t,dt(n));e.fillStyle=this.background,!t.rowStart&&i>0&&e.fillRect(t.x,t.y,i,26),!t.rowEnd&&a>0&&e.fillRect(t.x+t.width-a,t.y,a,26),t.width>=40&&t.width*n>=24&&14*n>=6&&(e.save(),e.beginPath(),e.rect(t.x+5,t.y,Math.max(0,t.width-10),26),e.clip(),e.font=`14px -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif`,e.fillStyle=Re(r),e.fillText(`${t.label.replace(/^node_modules\//u,``)} \xB7 ${Q(t.removable)}`,t.x+5,t.y+18),e.restore())}drawHighlight(e,t){let n=this.host.selection,r=new Set([n?.edge,this.host.hover]);for(let e of[n?.node,this.focused]){let t=this.model.byId.get(e);if(t)for(let e of[...t.incoming,...t.outgoing])r.add(e.id)}let i=[];for(let e of r){let t=this.pathById.get(e);if(!t||Z(t,this.view)||this.edgeAlpha(t.edge)===.04)continue;let r=e===n?.edge||e===this.host.hover?.8:.6;i.push({entry:t,alpha:(r-.22)/.78})}let a=[...new Set([n?.node,this.focused])].map(e=>this.layout.byId.get(e)).filter(Boolean),o=i.map(({entry:e})=>e).concat(a.map(e=>({left:e.x,right:e.x+e.width,top:e.y,bottom:e.y+26}))),s=e=>e.reduce((e,t)=>({left:Math.min(e.left,t.left),right:Math.max(e.right,t.right),top:Math.min(e.top,t.top),bottom:Math.max(e.bottom,t.bottom)}),{left:1/0,right:-1/0,top:1/0,bottom:-1/0}),c=s(o),l=t?this.view:s([c,this.highlightBounds??c]);this.highlightBounds=c;let u=this.context(this.overlay,e,t),d=2/this.host.zoom,f=Math.max(this.view.left,l.left-d),p=Math.max(this.view.top,l.top-d),m=Math.min(this.view.bottom,l.bottom+d)-p,h=Math.min(this.view.right,l.right+d)-f;if(h>0&&m>0){t||u.clearRect(f,p,h,m),u.save(),u.beginPath(),u.rect(f,p,h,m),u.clip();for(let{entry:e,alpha:t}of i)this.paintPath(u,e,t);if(i.length>0){u.save(),u.beginPath();let e={left:f,right:f+h,top:p,bottom:p+m};for(let t of this.visibleNodes)Z({left:t.x,right:t.x+t.width,top:t.y,bottom:t.y+26},e)||u.rect(t.x,t.y,t.width,26);u.clip(),u.clearRect(f,p,h,m),u.restore()}u.globalAlpha=1,u.strokeStyle=this.foreground;for(let e of a)u.lineWidth=Math.min(1.5/this.host.zoom,e.width/2),u.strokeRect(e.x,e.y,e.width,26);u.restore()}}hit(e){if(!this.overlay||!this.index)return null;let t=this.overlay.getBoundingClientRect(),{pan:n,zoom:r}=this.host,i=(e.clientX-t.left-n.x)/r,a=(e.clientY-t.top-n.y)/r,o=this.overlay.getContext(`2d`);o.save(),o.setTransform(1,0,0,1,0,0);let s=ot(this.index,i,a).find(e=>e.node||o.isPointInPath(e.path,i,a));return o.restore(),s??null}pointer(e){if(this.host.drag)return;let t=this.hit(e),n=t?.node?.id??t?.edge.id??null;n!==this.hoverId&&(this.clearHover(),this.hoverId=n,this.focused=t?.node?.id??null,this.host.hover=t?.edge?.id??null,t&&(this.overlay.dataset.tooltip=t.node?lt(t.node,this.host.minSize):ut(t.edge,this.model),this.overlay.setAttribute(`aria-label`,this.overlay.dataset.tooltip),this.overlay.style.cursor=`default`),this.requestDraw()),t&&s(this.overlay,{gate:()=>!this.host.drag&&this.hoverId===n})}clearHover(){o(this.host.renderRoot),this.hoverId=null,this.focused=null,this.host.hover=null,this.overlay&&(delete this.overlay.dataset.tooltip,this.overlay.style.cursor=`default`,this.overlay.setAttribute(`aria-label`,pt)),this.requestDraw()}setHover(e){e==null?this.clearHover():(this.host.hover=e,this.requestDraw())}click(e,t=!1){if(e.defaultPrevented)return;let n=this.hit(e);if(t){n?.node&&this.host.follow(n.node.id);return}this.host.select(n?.node?.id??n?.edge.to??null,n?.edge?.id??null)}key(e){let t=this.layout.nodes;if(t.length===0)return;let n=t.findIndex(e=>e.id===(this.focused??this.host.selection?.node));if([`ArrowRight`,`ArrowDown`].includes(e.key))n=Math.min(t.length-1,n+1);else if([`ArrowLeft`,`ArrowUp`].includes(e.key))n=Math.max(0,n-1);else if(e.key===`Home`)n=0;else if(e.key===`End`)n=t.length-1;else if(e.key===`Enter`||e.key===` `){e.preventDefault(),this.host.select(t[Math.max(0,n)].id);return}else if(e.key===`Escape`){this.clearHover(),this.host.select(null);return}else return;e.preventDefault();let r=t[n],{pan:i,zoom:a,width:o,height:s}=this.host;(r.x*a+i.x<0||(r.x+r.width)*a+i.x>o||r.y*a+i.y<0||(r.y+26)*a+i.y>s)&&(this.host.pan={x:o/2-(r.x+r.width/2)*a,y:s/2-(r.y+13)*a},this.host.fitted=!1,this.host.drawViewport()),this.focused=r.id,this.overlay.setAttribute(`aria-label`,lt(r,this.host.minSize)),this.requestDraw()}};function gt(e,t,n=!1){let r=n?t:1;return{min:t,max:r*9.99,percent:Math.round(e/r*100)}}var _t=`:host{display:contents}*{box-sizing:border-box}button{font:inherit;color:var(--text);border:1px solid var(--border);background:var(--surface);border-radius:var(--ui-radius, 4px);padding:4px 7px;cursor:default}button:hover{background:var(--graph-hover-bg)}button:disabled{opacity:.4;cursor:default}button:focus-visible{outline:2px solid var(--accent)}.flow-stage{grid-area:stage;position:relative;min-width:0;min-height:0;display:flex;flex-direction:column;background:var(--flow-background)}.flow-viewport{flex:1;position:relative;overflow:hidden;min-height:0;touch-action:none;cursor:default;user-select:none;-webkit-user-select:none}.flow-count{position:absolute;bottom:12px;right:50px;padding:6px 8px;color:var(--muted);font-size:11px;z-index:3;pointer-events:none}.flow-canvas{display:block;position:absolute;inset:0;width:100%;height:100%}.flow-base,.flow-bars{pointer-events:none}.flow-overlay:focus-visible{outline:1px solid var(--accent);outline-offset:-1px}.flow-panel{grid-area:right;overflow:auto;min-height:0;padding:14px;border-left:1px solid var(--border);background:var(--surface)}.flow-panel h3{font-size:13px;margin:0;overflow-wrap:anywhere}.flow-panel h4{margin:20px 0 8px;color:var(--muted);font-size:11px}.flow-panel p{color:var(--muted);font-size:12px;line-height:1.6}.flow-panel-heading{display:flex;align-items:start;gap:10px;justify-content:space-between}.flow-metrics{display:grid;gap:5px;margin:18px 0}.flow-metrics b{font-size:20px;font-weight:500}.flow-metrics span{color:var(--muted);font-size:11px;margin-bottom:8px}.flow-versions{list-style:none;padding:0;margin:0 0 18px;font-size:12px}.flow-versions-details{margin:18px 0}.flow-versions-details summary{color:var(--muted);font-size:11px;cursor:default}.flow-versions li+li{margin-top:10px}.flow-versions li>div{display:flex;justify-content:space-between;gap:8px}.flow-versions small{display:block;color:var(--muted);overflow-wrap:anywhere;margin-top:3px}.flow-direction{overflow-wrap:anywhere}.flow-actions{display:flex;gap:6px;flex-wrap:wrap}.flow-link{grid-template-columns:8px minmax(0,1fr) auto}
|
|
17
|
+
`,vt=10,yt=e=>Math.max(1,e-2*vt);function bt(e,t,n){return D`<button class="g2-dist-item flow-link" data-tooltip="${e.label}" @click="${n}"><span class="g2-dist-dot" style="${v({background:d(e.pkg)})}"></span> <span class="g2-dist-name">${e.label}</span><span class="g2-dist-count">${Q(t)}</span></button>`}var xt=class extends k{static properties={graph:{attribute:!1},packages:{type:Boolean}};static styles=[E(j),E(_t),E(M),E(e)];constructor(){super(),this.packages=!1,this.zoom=1,this.pan={x:0,y:0},this.width=0,this.height=0,this.needsFit=!0,this.fitted=!0,this.largeOnly=!0,this.largeSuppressed=!1,this.largeThreshold=0,this.models=new Map,this.chart=new ht(this),this.focus=null,this.selection=null,this.hover=null,this.bridge={requestDraw:()=>this.requestUpdate(),_cleanup:()=>{}}}willUpdate(e){if(!this.graph)return;let t=!1;e.has(`graph`)&&this.models.clear(),e.has(`packages`)&&(this.needsFit=!0),(!this.model||e.has(`graph`)||e.has(`packages`))&&(this.models.has(this.packages)||this.models.set(this.packages,Ye(this.graph,{packages:this.packages})),this.model=this.models.get(this.packages),this.largeThreshold=Ge(this.model),t=!0,this.model.byId.has(this.focus)||(this.focus=null),this.selection&&!this.model.byId.has(this.selection.node)&&(this.selection=null),this.hover=null),(t||this.layoutFocus!==this.focus)&&(this.largeSuppressed=this.isSmallFocus()),this.focus&&Ue(this.model.byId.get(this.focus))<this.minSize&&(this.focus=null),(t||this.layoutFocus!==this.focus||this.layoutMinSize!==this.minSize)&&(this.renderRoot&&o(this.renderRoot),this.layout=nt(tt(this.model,{focus:this.focus,minSize:this.minSize}),yt(this.width),this.height),this.layoutFocus=this.focus,this.layoutMinSize=this.minSize,this.selection&&!this.layout.byId.has(this.selection.node)&&(this.selection=null))}get minSize(){return this.largeOnly&&!this.largeSuppressed?this.largeThreshold:0}toggleLarge(){this.largeOnly=!this.largeOnly,this.needsFit=!0,this.requestUpdate()}renderControls(){return this.largeThreshold&&!this.largeSuppressed?D`<mode-switch label="${`Large \xB7 ${this.largeThreshold/1024}+ KiB`}" .checked="${this.largeOnly}" @click="${()=>this.toggleLarge()}"></mode-switch>`:null}updated(){i.graphState=this.bridge;let e=`${this.largeThreshold}:${this.largeOnly}:${this.largeSuppressed}`;e!==this.controlsKey&&(this.controlsKey=e,this.dispatchEvent(new CustomEvent(`flow-controls-change`,{detail:this.renderControls(),bubbles:!0,composed:!0}))),this.connectViewport(),this.syncViewport(),this.chart.update(this.renderRoot)}connectViewport(){let e=this.renderRoot.querySelector(`.flow-viewport`);if(!e||this.events)return;c(this.renderRoot,{gate:()=>!this.drag}),this.events=new AbortController;let{signal:t}=this.events;e.addEventListener(`wheel`,e=>this.wheel(e),{passive:!1,signal:t}),e.addEventListener(`pointerdown`,e=>this.startPan(e),{signal:t}),window.addEventListener(`pointermove`,e=>this.movePan(e),{signal:t}),window.addEventListener(`pointerup`,e=>this.endPan(e),{signal:t}),window.addEventListener(`pointercancel`,e=>this.endPan(e),{signal:t}),window.addEventListener(`deepview-theme-changed`,()=>this.requestUpdate(),{signal:t}),e.addEventListener(`click`,e=>{let t=this.suppressClick&&e.detail>0;if(this.suppressClick=!1,t){e.preventDefault(),e.stopPropagation();return}e.target.closest?.(`.flow-canvas`)||this.select(null)},{capture:!0,signal:t}),this.resizeObserver=new ResizeObserver(()=>this.syncViewport()),this.resizeObserver.observe(e)}disconnectedCallback(){super.disconnectedCallback(),o(this.renderRoot),this.resizeObserver?.disconnect(),this.resizeObserver=null,this.events?.abort(),this.events=null,this.chart.dispose(),this.viewportElements=null,this.drag=null,i.graphState===this.bridge&&(i.graphState=null)}select(e,t=null){if(!e&&this.focus){this.follow(null);return}this.selection=e?{node:e,edge:t}:null,this.requestUpdate()}follow(e){this.focus=e,this.selection=e?{node:e,edge:null}:null,this.needsFit=!0,this.requestUpdate()}isSmallFocus(){if(!this.focus)return!1;let e=[this.focus],t=new Set(e);for(let n of e){if(t.size>=200)break;for(let{to:r}of this.model.byId.get(n).outgoing)if(t.has(r)||(t.add(r),e.push(r)),t.size>=200)break}return t.size<200}fitScale(){return this.layout&&this.width>0&&this.height>0?Math.min(yt(this.width)/this.layout.width,this.height/this.layout.height,9.99):1}zoomMetrics(){return gt(this.zoom,Math.min(this.fitScale(),1))}align(){this.pan={x:vt,y:(this.height-this.layout.height*this.zoom)/2}}syncViewport(){let e=this.renderRoot.querySelector(`.flow-viewport`)?.getBoundingClientRect();if(!this.layout||!e||e.width<=0||e.height<=0)return;let t=nt(this.layout,yt(e.width),e.height);if(this.width>0&&this.height>0&&(this.pan.x=e.width/2-(this.width/2-this.pan.x)*t.width/this.layout.width,this.pan.y+=(e.height-this.height)/2),t!==this.layout&&(o(this.renderRoot),this.layout=t,this.requestUpdate()),this.width=e.width,this.height=e.height,this.needsFit||this.fitted){this.fit();return}let{min:n,max:r}=this.zoomMetrics(),i=Math.max(n,Math.min(r,this.zoom));i!==this.zoom&&(this.zoom=i,this.align()),this.drawViewport()}fit(){let e=this.renderRoot.querySelector(`.flow-viewport`)?.getBoundingClientRect();if(!this.layout||!e||e.width<=0||e.height<=0)return;let t=nt(this.layout,yt(e.width),e.height);t!==this.layout&&(o(this.renderRoot),this.layout=t,this.requestUpdate()),this.width=e.width,this.height=e.height,this.zoom=this.fitScale(),this.needsFit=!1,this.fitted=!0,this.align(),this.drawViewport()}zoomBy(e,t=this.width/2,n=this.height/2){let{min:r,max:i}=this.zoomMetrics(),a=Math.max(r,Math.min(i,this.zoom*e)),o=a/this.zoom;a!==this.zoom&&(this.fitted=!1),this.pan.x=t-(t-this.pan.x)*o,this.pan.y=n-(n-this.pan.y)*o,this.zoom=a,this.drawViewport()}wheel(e){e.preventDefault();let t=this.renderRoot.querySelector(`.flow-viewport`).getBoundingClientRect(),n=Math.exp(-e.deltaY*.0015),{min:r}=this.zoomMetrics();if(n<1&&this.zoom<=r*1.0001){this.zoom=r;let e=Math.min(.4,(1-n)*3);this.pan.x+=(vt-this.pan.x)*e,this.pan.y+=((this.height-this.layout.height*r)/2-this.pan.y)*e,this.drawViewport()}else this.zoomBy(n,e.clientX-t.left,e.clientY-t.top)}startPan(e){e.button===0&&(this.suppressClick=!1,this.drag={id:e.pointerId,x:e.clientX,y:e.clientY,pan:{...this.pan},moved:!1})}movePan(e){if(!this.drag||e.pointerId!==this.drag.id)return;let t=e.clientX-this.drag.x,n=e.clientY-this.drag.y;Math.abs(t)+Math.abs(n)>3&&(this.drag.moved=!0),this.drag.moved&&(this.fitted=!1,this.suppressClick=!0,this.chart.setHover(null),this.pan={x:this.drag.pan.x+t,y:this.drag.pan.y+n},this.drawViewport())}endPan(e){e.pointerId===this.drag?.id&&(this.drag=null)}drawViewport(){this.chart.viewportChanged(),this.viewportElements??={label:this.renderRoot.querySelector(`.g2-zoom-pct`),zoomIn:this.renderRoot.querySelector(`[aria-label="Zoom in"]`),zoomOut:this.renderRoot.querySelector(`[aria-label="Zoom out"]`)};let{label:e,zoomIn:t,zoomOut:n}=this.viewportElements,{min:r,max:i,percent:a}=this.zoomMetrics();e&&(e.textContent=`${a}%`),t&&(t.disabled=this.zoom>=i*.9999),n&&(n.disabled=this.zoom<=r*1.0001)}matchesNode(e){if(Ue(e)<this.minSize||this.layout?.hiddenPackages?.has(e.pkg))return!1;let t=i.pathFilter.trim().toLowerCase();if(t&&!`${e.label} ${e.pkg}`.toLowerCase().includes(t))return!1;if(this.graph.issuesHidden)return!0;let n=t=>e.files.some(e=>[...this.model.files.get(e)[t]??[]].some(e=>(t===`severitySet`?i.selectedSeverities:i.selectedColors).has(e)));return(i.selectedSeverities.size===0||n(`severitySet`))&&(i.selectedColors.size===0||n(`colorSet`))}renderLinks(e,t=!1){return e.toSorted((e,t)=>t.size-e.size).slice(0,100).map(e=>{let n=this.model.byId.get(t?e.from:e.to);return bt(n,e.size,()=>this.select(n.id,e.id))})}renderSearch(){if(!i.pathFilter.trim())return null;let e=this.chart.searchMatches();return D`<h4>Matches · ${e.length}</h4>${e.slice(0,100).map(e=>bt(e,e.removable,()=>this.follow(e.id)))} ${e.length>100?D`<p>Showing the 100 largest matches. Refine the search to find any file or package, including those beyond the visible graph.</p>`:null}`}renderPanel(){let e=this.model.byId.get(this.selection?.node),t=this.model.edgeById.get(this.selection?.edge);return e?D`<div class="flow-panel-heading"><h3>${e.label}</h3><button type="button" class="detail-action" aria-label="Clear flow selection" @click="${()=>this.select(null)}">×</button></div>${t?D`<p class="flow-direction">${this.model.byId.get(t.from).label}<br>↓ imports<br>${this.model.byId.get(t.to).label}</p><div class="flow-metrics"><b>${Q(t.size)}</b><span>reachable through this edge · ${t.count} ${t.count===1?`file import`:`file imports`}</span></div>`:null}<div class="flow-metrics"><b>${Q(e.removable)}</b><span>unique size · removed if deleted · bar width</span><b>${Q(e.size)}</b><span>reachable size</span><b>${Q(e.own)}</b><span>own source size · ${e.files.length} ${e.files.length===1?`file`:`files`}</span></div>${this.renderVersions(e)} ${We(e,this.minSize)?D`<p>Kept by Large so retained dependencies remain connected to an entry point.</p>`:null} ${e.removableMissing?D`<p>${e.removableMissing} removed files have unknown sizes; removal totals include known bytes only.</p>`:null} ${e.missing?D`<p>${e.missing} reachable file sizes are unknown.</p>`:null} ${e.virtual?D`<p>Entry source is absent from this bundle; only its recorded imports are counted.</p>`:null}<div class="flow-actions"><button aria-pressed="${!!this.focus}" @click="${()=>this.follow(this.focus?null:e.id)}">Follow imports</button> ${!this.packages&&!e.virtual?D`<button data-bundle-view-source="${this.model.files.get(e.files[0]).origFile??e.files[0]}">View source</button>`:null}</div><h4>Imports · ${e.outgoing.length}</h4>${this.renderLinks(e.outgoing)}<h4>Imported by · ${e.incoming.length}</h4>${this.renderLinks(e.incoming,!0)} ${Math.max(e.incoming.length,e.outgoing.length)>100?D`<p>Showing the 100 largest flows in each direction.</p>`:null}`:D`<h3>Size flow</h3><div class="flow-metrics"><b>${Q(this.model.total.size)}</b><span>unique reachable source</span></div><p>Bar width shows how much source leaves the bundle when a file or package is removed.</p><p>Select a bar or ribbon for details.<br>Double-click a bar to follow its imports.</p>${this.model.total.missing?D`<p>${this.model.total.missing} files have unknown sizes; totals include known bytes only.</p>`:null} ${this.model.weakEdges?D`<p>${this.model.weakEdges} weak config/metadata loads excluded.</p>`:null} ${this.model.omittedFiles?D`<p>${this.model.omittedFiles} files are not reachable from these entry points.</p>`:null}<h4>${this.model.inferred?`Inferred roots (no entry points in this view)`:`Entry points`}</h4>${this.model.roots.slice(0,100).map(e=>{let t=this.model.byId.get(e);return bt(t,t.removable,()=>this.select(e))})} ${this.model.roots.length>100?D`<p>Showing the first 100 entry points. Search to find another.</p>`:null}`}renderVersions(e){if(!e.instances?.length)return null;if(e.instances.length===1){let t=e.instances[0];return D`<div class="flow-versions"><div>${t.version||`Unknown version`}</div><small>${t.directory}</small></div>`}let t=D`<ul class="flow-versions">${e.instances.map(e=>D`<li><div><span>${e.version||`Unknown version`}</span><span>${Q(e.size)}${e.missing?`+`:``}</span></div><small>${e.directory}</small> ${e.missing?D`<small>${e.missing} files have unknown sizes</small>`:null}</li>`)}</ul>`;return g(e.id,D`<details class="flow-versions-details"><summary>Versions: ${e.instances.length}</summary><h4>Own source size</h4>${t}</details>`)}render(){if(!this.layout)return null;let{nodes:e}=this.layout;return D`<section class="flow-stage" aria-label="Dependency size flow" style="${v({"--flow-background":Le()})}"><div class="flow-viewport">${this.chart.render()}${e.length>0?null:D`<p>${this.minSize?`No nodes reach ${Q(this.minSize)}. Turn off Large to show all nodes.`:`No recorded dependency paths in this view.`}</p>`}</div><div class="flow-count">${e.length} ${this.packages?e.length===1?`package`:`packages`:e.length===1?`file`:`files`}</div><div class="g2-zoom-ctrl" role="group" aria-label="Flow zoom"><button aria-label="Zoom in" ?disabled="${this.zoom>=this.zoomMetrics().max*.9999}" @click="${()=>this.zoomBy(1.4)}">+</button><div class="g2-zoom-pct"></div><button aria-label="Zoom out" ?disabled="${this.zoom<=this.zoomMetrics().min*1.0001}" @click="${()=>this.zoomBy(1/1.4)}">−</button> <button class="g2-zoom-fit-btn" aria-label="Fit to view" @click="${()=>this.fit()}">fit</button></div></section><aside class="flow-panel" aria-label="Size flow details" aria-live="polite">${this.renderSearch()}${this.renderPanel()}</aside>`}};customElements.define(`size-flow`,xt);var St=class extends k{static properties={graph:{attribute:!1},options:{attribute:!1},matrixControls:{state:!0},flowControls:{state:!0},issuesWrapped:{state:!0}};static styles=[E(P),E(N),E(A),E(j),E(M)];constructor(){super(),this.graph=null,this.options={},this.matrixControls=null,this.flowControls=null,this.issuesWrapped=!1,this._topbarObserver=null,this._observedControls=null,this._issuesWrapWidth=0}disconnectedCallback(){super.disconnectedCallback(),this._topbarObserver?.disconnect(),this._observedControls=null}connectedCallback(){super.connectedCallback(),c(this.renderRoot)}willUpdate(e){(!this.options.showBundleLayouts||i.bundleLayout!==`matrix`)&&(this.matrixControls=null),(!this.options.showBundleLayouts||i.bundleLayout!==`flow`)&&(this.flowControls=null),(e.has(`graph`)||e.has(`options`)||e.has(`matrixControls`)||e.has(`flowControls`))&&(this._issuesWrapWidth=0)}updated(){this.toggleAttribute(`matrix`,!!this.options.showBundleLayouts&&i.bundleLayout===`matrix`);let e=this.renderRoot.querySelector(`.g2-topbar-controls`);e!==this._observedControls&&typeof ResizeObserver==`function`&&(this._topbarObserver??=new ResizeObserver(()=>this._placeIssues()),this._topbarObserver.disconnect(),e&&this._topbarObserver.observe(e),this._observedControls=e),this._placeIssues()}_placeIssues(){let e=this.renderRoot.querySelector(`.g2-topbar-controls`),t=this.renderRoot.querySelector(`.g2-issues-switch`);if(!e||!t)return;let n=e.clientWidth;this.issuesWrapped?n>this._issuesWrapWidth&&wt(e,t)&&(this.issuesWrapped=!1):Ct(e,t)&&(this._issuesWrapWidth=n,this.issuesWrapped=!0)}render(){return this.graph?this.options.showBundleLayouts&&i.bundleLayout===`flow`?D`<div class="graph2-layout">${he(this.graph,this.options,this.flowControls,{issuesWrapped:this.issuesWrapped})}<size-flow .graph="${this.graph}" .packages="${i.flowPackagesView}" @flow-controls-change="${e=>{this.flowControls=e.detail}}"></size-flow></div>`:this.options.showBundleLayouts&&i.bundleLayout===`matrix`?D`<div class="graph2-layout g2-matrix-layout">${he(this.graph,this.options,this.matrixControls,{issuesWrapped:this.issuesWrapped})}<dependency-matrix .graph="${this.graph}" @matrix-controls-change="${e=>{this.matrixControls=e.detail}}"></dependency-matrix></div>`:D`<div class="graph2-layout">${he(this.graph,this.options,null,{issuesWrapped:this.issuesWrapped})} ${K(this.graph)} ${be()}</div>`:D``}};function Ct(e,t){let n=e.firstElementChild;if(!n||n===t)return!1;let r=t.getBoundingClientRect(),i=n.getBoundingClientRect();return r.height>0&&i.height>0&&r.top>=i.bottom-1}function wt(e,t){let n=[...e.children];if(n.length===0)return!0;let r=n[0].getBoundingClientRect().bottom,i=parseFloat(getComputedStyle(e).columnGap)||0,a=0;for(let e of n){let t=e.getBoundingClientRect();if(t.top>=r-1)return!1;let n=getComputedStyle(e),o=parseFloat(n.flexBasis),s=parseFloat(n.flexGrow)>0&&Number.isFinite(o)?Math.max(parseFloat(n.minWidth)||0,Math.min(t.width,o)):t.width;a+=s+i}return a+t.getBoundingClientRect().width<=e.clientWidth}customElements.define(`graph-layout`,St);function Tt(e,t,n,r){let i=0;for(let e of n)i=Math.max(i,e);if(i===0)return()=>!0;let a=2*i,o=new Map,s=Int32Array.from(e,e=>Math.floor(e/a)),c=Int32Array.from(t,e=>Math.floor(e/a));for(let t=0;t<e.length;t++){let e=`${s[t]}:${c[t]}`;o.has(e)||o.set(e,[]),o.get(e).push(t)}let l=0;return(i,a,u,d)=>{if(n[i]===n[a])return!0;let f=n[i]>n[a]?i:a,p=f===i?d:u;for(let u=s[p]-1;u<=s[p]+1;u++)for(let s=c[p]-1;s<=c[p]+1;s++)for(let c of o.get(`${u}:${s}`)??[]){if(++l>8e6)return!1;let o=r[c];if(o===i||o===a)continue;let s=n[f]+n[o],u=e[p]-e[c],d=t[p]-t[c];if(u*u+d*d<s*s-1e-7)return!1}return!0}}var Et=12,Dt=8,Ot=12,kt=8e6,At=8e6;function jt(e,t,{radiusOf:n}={}){let r=e.nodes;if(r.length<2||e.edges.length===0)return;let i=new Map(r.map((e,t)=>[e.file,t])),a=Float64Array.from(r,e=>e.x),o=Float64Array.from(r,e=>e.y),s=Int32Array.from(r,(e,t)=>t),c=s.slice(),l=n?Tt(a,o,Float64Array.from(r,n),s):null,u=Array.from(r,()=>[]);for(let t of e.edges){let e=i.get(t.a),n=i.get(t.b);e===void 0||n===void 0||e===n||(u[e].push(n),u[n].push(e))}let d=t.map(e=>e.map(e=>i.get(e.file))).filter(e=>e.length>1),f=new Int32Array(Et+Ot),p=new Float64Array(Et),m=0,h=1831565813,g=0,_=()=>(h^=h<<13,h^=h>>>17,h^=h<<5,h>>>0),v=(e,t)=>{let n=a[e]-a[t],r=o[e]-o[t];return Math.sqrt(n*n+r*r)};t:for(let e=0;e<Dt;e++){let t=!1;for(let n of d)for(let r=0;r<n.length;r++){let i=n[e%2?n.length-r-1:r];if(u[i].length===0)continue;if(g+n.length>At)break t;g+=n.length;let d=c[i],h=0,y=0;for(let e of u[i])h+=a[c[e]],y+=o[c[e]];h/=u[i].length,y/=u[i].length;let b=0;if(n.length<=f.length)for(let e of n)f[b++]=e;else{for(let e of n){let t=a[e]-h,n=o[e]-y,r=t*t+n*n;if(b===Et&&r>=p[b-1])continue;let i=Math.min(b,Et-1);for(;i>0&&r<p[i-1];)f[i]=f[i-1],p[i]=p[i-1],i--;f[i]=e,p[i]=r,b<Et&&b++}for(let e=0;e<Ot;e++)f[b++]=n[_()%n.length]}let x=-1,S=-1e-7,C=!1;for(let e=0;e<b;e++){let t=f[e],n=s[t];if(i===n)continue;let r=u[i].length+u[n].length;if(m+r>kt){C=!0;break}m+=r;let a=0;for(let e of u[i])e!==n&&(a+=v(t,c[e])-v(d,c[e]));for(let e of u[n])e!==i&&(a+=v(d,c[e])-v(t,c[e]));a<S&&(!l||l(i,n,d,t))&&(x=n,S=a)}if(x!==-1){let e=c[x];c[i]=e,c[x]=d,s[d]=x,s[e]=i,t=!0}if(C)break t}if(!t)break}for(let e=0;e<r.length;e++)r[e].x=a[c[e]],r[e].y=o[c[e]]}function Mt(e,t,n){let r=[...e].map(([e,t])=>({file:e,...t})),i=new Map(r.map(e=>[e.file,e])),a=[];for(let[e,n]of t)for(let t of n.keys())e<t&&a.push({a:e,b:t});let o=n.map(e=>e.map(e=>i.get(e)));jt({nodes:r,edges:a},o,{radiusOf:e=>e.groupR});for(let t of r){let n=e.get(t.file);n.x=t.x,n.y=t.y}}function Nt(e){let t=new Map;for(let[n,r]of e.importsOf){let i=e.nodeByFile.get(n);if(i)for(let n of r){let r=e.nodeByFile.get(n);r&&i.pkg!==r.pkg&&(t.set(i.pkg,(t.get(i.pkg)??0)+1),t.set(r.pkg,(t.get(r.pkg)??0)+1))}}return t}function Pt(e){if(e.packages.length===0)return null;let t=t=>t===`__own__`||e.ownSourcePackages?.has(t),n=e.packages.find(n=>t(n)&&e.entryPackages?.has(n))??e.packages.find(t);if(n)return n;let r=new Set;for(let[t,n]of e.importedBy){let i=e.nodeByFile.get(t);if(i)for(let t of n){let n=e.nodeByFile.get(t);if(n&&n.pkg!==i.pkg){r.add(i.pkg);break}}}for(let t of e.packages)if(!r.has(t))return t;return null}var Ft=5;function It(e){let t=new Map,n=(t,n)=>[Math.floor(t/e),Math.floor(n/e)];return{add(e,r,i){let a=n(e,r).join(`:`);t.has(a)||t.set(a,[]),t.get(a).push({x:e,y:r,r:i})},fits(e,r,i){let[a,o]=n(e,r);for(let n=a-1;n<=a+1;n++)for(let a=o-1;a<=o+1;a++)for(let o of t.get(`${n}:${a}`)??[])if((o.x-e)**2+(o.y-r)**2<(o.r+i)**2-1e-7)return!1;return!0}}}function Lt(e){return[e.filter(e=>e.isHub),e.filter(e=>!e.isHub)]}function Rt(e,t){let n=new Map;for(let r of e.nodes)t.has(r.pkg)&&(n.has(r.pkg)||n.set(r.pkg,[]),n.get(r.pkg).push(r));for(let e of n.values())e.sort((e,t)=>e.isHub===t.isHub?t.deg-e.deg:e.isHub?-1:1);let r=new Map,i=new Map;for(let[a,o]of t){let t=n.get(a);if(!t||t.length===0)continue;let s=t.length,c=0;for(let e of t)if(e.isHub)c++;else break;let l=c>0&&c<=Ft?c:0,u=s-l,d=o.groupR,f=Array.from({length:s}),p=Array.from({length:s});for(let e=0;e<s;e++){let t=e*137.508*Math.PI/180,n;if(e<l)n=l<=1?0:Math.sqrt(e/(l-1))*.3*d;else{let t=e-l;n=u<=1?.4*d:(.4+Math.sqrt(t/(u-1))*.6)*d}f[e]=o.x+Math.cos(t)*n,p[e]=o.y+Math.sin(t)*n}let m=Array.from({length:s},()=>!1);for(let n=0;n<s;n++){let a=t[n],l=a.isHub?0:c,u=a.isHub?c:s,d=0,h=0,g=0,_=e.importsOf.get(a.file);if(_)for(let e of _){let t=r.get(e);t!==void 0&&(d+=t,h+=i.get(e),g++)}let v=e.importedBy.get(a.file);if(v)for(let e of v){let t=r.get(e);t!==void 0&&(d+=t,h+=i.get(e),g++)}let y=!1;if(g>0){d/=g,h/=g;let e=d-o.x,t=h-o.y;e*e+t*t>1&&(y=!0)}let b=-1;if(y){let e=1/0;for(let t=l;t<u;t++){if(m[t])continue;let n=f[t]-d,r=p[t]-h,i=n*n+r*r;i<e&&(e=i,b=t)}}else for(let e=l;e<u;e++)if(!m[e]){b=e;break}m[b]=!0,a.x=f[b],a.y=p[b],r.set(a.file,a.x),i.set(a.file,a.y)}}jt(e,[...n.values()].flatMap(Lt))}function zt(e,t,n){let r=t/2,i=n/2,a=Math.min(t,n)/2;if(e.packages.length===0)return;let o=Pt(e),s=Nt(e),c=(o?e.packages.filter(e=>e!==o):[...e.packages]).toSorted((t,n)=>{let r=(s.get(n)??0)-(s.get(t)??0);return r===0?(e.pkgCount.get(n)??0)-(e.pkgCount.get(t)??0):r}),l=c.length,u;u=l<=0?0:l<=6?.65:l<=20?.82:.95;let d=Math.max(1,Math.sqrt(50/Math.max(1,l))),f=.12,p=new Map,m;if(o){let t=e.pkgCount.get(o)??0,n=Math.min(.22,(.012+Math.sqrt(t)*.004)*d);m=Math.max(l<=6?.4:l<=20?.36:.34,n+f+.04),p.set(o,{x:r,y:i,size:t,groupR:n*a})}else m=l<=1?0:l<=6?.4:l<=20?.32:.3;if(l===0){Rt(e,p);return}let h=new Map;for(let t of e.edges){if(!t.cross)continue;let n=e.nodeByFile.get(t.a)?.pkg,r=e.nodeByFile.get(t.b)?.pkg;if(!n||!r||n===r)continue;h.has(n)||h.set(n,new Map),h.has(r)||h.set(r,new Map);let i=h.get(n),a=h.get(r);i.set(r,(i.get(r)??0)+1),a.set(n,(a.get(n)??0)+1)}let g=Math.max(1,Math.min(10,Math.round(Math.sqrt(l)/1.2))),_=Array.from({length:g+1});for(let e=0;e<=g;e++)_[e]=Math.floor(e*e/(g*g)*l);_[g]=l;let v=Array.from({length:g}),y=Array.from({length:g});for(let t=0;t<g;t++){let n=_[t],r=_[t+1];v[t]=r-n;let i=0;for(let t=n;t<r;t++)i+=e.pkgCount.get(c[t])??0;y[t]=i}let b=Array.from({length:g});for(let e=0;e<g;e++){let t=(_[e]+_[e+1]-1)/2/Math.max(1,l-1);b[e]=Math.sqrt(Math.max(0,t))}let x=Array.from({length:g});x[0]=b[0];for(let e=1;e<g;e++){let t=v[e-1],n=y[e-1],r=t>0?n/t:1,i=1+.2*Math.sqrt(Math.max(0,r-1));x[e]=x[e-1]+(b[e]-b[e-1])*i}let S=Array.from({length:g});for(let e=0;e<g;e++)S[e]=x[e]-b[e];let C=Array.from({length:l}),w=Array.from({length:l}),T=0;for(let e=0;e<l;e++){for(;T<g-1&&e>=_[T+1];)T++;let t=e*137.508%360*Math.PI/180,n=(l<=1?0:Math.sqrt(e/(l-1)))+S[T],s=l===1?o?m:0:m+n*(u-m);C[e]=r+Math.cos(t)*s*a,w[e]=i+Math.sin(t)*s*a}let E=It(2*f*a);for(let t=0;t<g;t++){let n=_[t],o=_[t+1],s=o-n;if(s===0)continue;let l=Array.from({length:s},()=>!1);for(let t=n;t<o;t++){let o=c[t],u=e.pkgCount.get(o)??0,m=Math.min(f,(.012+Math.sqrt(u)*.004)*d)*a,g=e=>E.fits(C[n+e],w[n+e],m),_=h.get(o),v=0,y=0,b=0;if(_)for(let[e,t]of _){let n=p.get(e);n&&(v+=n.x*t,y+=n.y*t,b+=t)}let x=!1;if(b>0){v/=b,y/=b;let e=v-r,t=y-i;e*e+t*t>1&&(x=!0)}let S=e=>{let t=-1;if(x){let r=1/0;for(let i=0;i<s;i++){if(l[i]||!e(i))continue;let a=n+i,o=C[a]-v,s=w[a]-y,c=o*o+s*s;c<r&&(r=c,t=i)}}else for(let n=0;n<s;n++)if(!l[n]&&e(n)){t=n;break}return t},T=S(()=>!0);if(!g(T)){let e=S(g);e>=0&&(T=e)}l[T]=!0;let D=n+T;p.set(o,{x:C[D],y:w[D],size:u,groupR:m}),E.add(C[D],w[D],m)}}Mt(p,h,Array.from({length:g},(e,t)=>c.slice(_[t],_[t+1]))),Bt(p,o),Rt(e,p)}function Bt(e,t){let n=[...e].map(([e,n])=>({info:n,pinned:e===t}));for(let e=0;e<100;e++){n.sort((e,t)=>e.info.x-e.info.groupR-(t.info.x-t.info.groupR));let e=!1;for(let t=0;t<n.length;t++){let r=n[t].info;for(let i=t+1;i<n.length;i++){let a=n[i].info;if(a.x-a.groupR>r.x+r.groupR)break;let o=a.x-r.x,s=a.y-r.y,c=Math.hypot(o,s),l=r.groupR+a.groupR;if(c>=l-.5)continue;let u=n[t].pinned?0:a.groupR**2,d=n[i].pinned?0:r.groupR**2;if(u+d===0)continue;let f=(l-c)/(u+d),p=c>1e-9?o/c:1,m=c>1e-9?s/c:0;r.x-=p*f*u,r.y-=m*f*u,a.x+=p*f*d,a.y+=m*f*d,e=!0}}if(!e)return}}function Vt(e,t,n){let r=t/2,i=n/2,a=Math.min(t,n)/2,o=e.nodes.length;if(o===0)return;let s=[],c=[],l=[];for(let t of e.nodes)t.pkg===`__own__`||e.ownSourcePackages?.has(t.pkg)?e.entryPackages?.has(t.pkg)?c.push(t):l.push(t):s.push(t);let u=(e,t)=>t.deg-e.deg,d=[c,l,s].flatMap(Lt),f=d.flatMap(e=>e.toSorted(u));for(let e=0;e<o;e++){let t=f[e],n=e*137.508%360*Math.PI/180,s=o<=1?0:Math.sqrt(e/(o-1));t.x=r+Math.cos(n)*s*.85*a,t.y=i+Math.sin(n)*s*.85*a}jt(e,d)}function Ht(e,t,n,r,{groupOf:i=u}={}){let a=e.length,o=r||760,s=n||1100,c=Math.sqrt(s*o/Math.max(a,1))*1.1,l=e=>{let t=0;for(let n of e)t=t*31+n.codePointAt(0)|0;return t},d=Math.ceil(Math.sqrt(a*s/o)),f=o/(Math.ceil(a/d)+1),p=s/(d+1),m=e.map((e,t)=>{let n=t%d,r=Math.floor(t/d),i=l(e);return{file:e,x:(n+1)*p+(i%100-50)*p*.4,y:(r+1)*f+((i>>7)%100-50)*f*.4,dx:0,dy:0}}),h=new Map(m.map((e,t)=>[e.file,t])),g=[];for(let n of e)for(let e of t.get(n)??[])h.has(e)&&g.push([h.get(n),h.get(e)]);let _=new Map;for(let e=0;e<a;e++){let t=i(m[e].file)??`__own__`;_.has(t)||_.set(t,[]),_.get(t).push(e)}let v=Math.min(500,Math.max(180,100+a*3)),y=Math.min(s,o)/6;for(let e=0;e<v;e++){let t=y*(.3/y)**(e/v);for(let e of m)e.dx=0,e.dy=0;for(let e=0;e<a;e++)for(let t=e+1;t<a;t++){let n=m[e],r=m[t],i=n.x-r.x,a=n.y-r.y,o=Math.sqrt(i*i+a*a);if(o<.01){let e=l(n.file+r.file);i=(e%100-50)*.01||.5,a=((e>>7)%100-50)*.01||.5,o=Math.sqrt(i*i+a*a)}let s=c*c/o;n.dx+=i/o*s,n.dy+=a/o*s,r.dx-=i/o*s,r.dy-=a/o*s}for(let[e,t]of g){let n=m[e],r=m[t],i=n.x-r.x,a=n.y-r.y,o=Math.sqrt(i*i+a*a)||.01,s=o*o/c;n.dx-=i/o*s,n.dy-=a/o*s,r.dx+=i/o*s,r.dy+=a/o*s}let n=.055*Math.min(1,t/(y*.3));for(let[,e]of _){if(e.length<2)continue;let t=0,r=0;for(let n of e)t+=m[n].x,r+=m[n].y;t/=e.length,r/=e.length;for(let i of e)m[i].dx+=(t-m[i].x)*n,m[i].dy+=(r-m[i].y)*n}for(let e of m){let n=Math.sqrt(e.dx*e.dx+e.dy*e.dy)||.01;e.x+=e.dx/n*Math.min(n,t),e.y+=e.dy/n*Math.min(n,t),e.x=Math.max(50,Math.min(s-50,e.x)),e.y=Math.max(50,Math.min(o-50,e.y))}}return m}function Ut(e,t,n,{statsHeight:r=0,left:i=0,right:a=i,top:o=0,bottom:s=o}={}){let c=Math.max(20,t*.04),l=Math.max(20,n*.04),u=Math.max(1,t-c*2-i-a),d=Math.max(1,n-l*2-r-o-s),f=-1/0,p=-1/0,m=1/0,h=1/0;for(let t of e)m=Math.min(m,t.x),f=Math.max(f,t.x),h=Math.min(h,t.y),p=Math.max(p,t.y);if(e.length===0)return{k:1,tx:t/2,ty:(n-r)/2};let g=Math.min(4,u/Math.max(20,f-m),d/Math.max(20,p-h));return{k:g,tx:c+i+u/2-(m+f)/2*g,ty:l+o+d/2-(h+p)/2*g}}function Wt(e,t,n,{width:r=900,rowHeight:i=52,gap:a=42}={}){let o=new Map(e.map(e=>[e.id,e])),s=new Map,c=[];for(let e of n)o.has(e)&&!s.has(e)&&(s.set(e,0),c.push(e));for(let e=0;e<c.length;e++){let n=c[e];for(let e of t.get(n)??[])!o.has(e)||s.has(e)||(s.set(e,s.get(n)+1),c.push(e))}let l=new Map;for(let t of e){let e=s.get(t.id)??null;l.has(e)||l.set(e,[]),l.get(e).push(t)}let u=new Map(e.map(e=>[e.id,[]]));for(let[e,n]of t)if(o.has(e))for(let t of new Set(n))u.get(t)?.push(e);let d=[],f=new Map,p=[...l.keys()].toSorted((e,t)=>(e??1/0)-(t??1/0)),m=e=>Number.isFinite(e.size)&&e.size>0?e.size:0;for(let e of p){let t=l.get(e).slice(),n=new Map(t.map(t=>{let n=u.get(t.id).map(e=>f.get(e)).filter(t=>t&&e!==null&&t.level===e-1);return[t.id,n.length>0?n.reduce((e,t)=>e+t.x+t.width/2,0)/n.length:r/2]}));t.sort((e,t)=>n.get(e.id)-n.get(t.id)||String(e.id).localeCompare(String(t.id)));let o=0;for(let e=1;e<t.length;e++)m(t[e])>m(t[o])&&(o=e);o>0&&t.unshift(t.splice(o,1)[0]);let s=t.reduce((e,t)=>e+m(t),0),c=d.length*(i+a),p=0;for(let n of t){let a=r*(s>0?m(n)/s:1/t.length);f.set(n.id,{id:n.id,level:e,x:p,y:c,width:a,height:i}),p+=a}d.push({level:e,y:c,size:s,proportional:s>0,ids:t.map(e=>e.id)})}let h=[];for(let[e,n]of t)if(f.has(e))for(let t of new Set(n))e!==t&&f.has(t)&&h.push({from:e,to:t});h.sort((e,t)=>String(e.from).localeCompare(String(t.from))||String(e.to).localeCompare(String(t.to)));let g=new Map,_=new Map;for(let e of h)_.has(e.from)||_.set(e.from,[]),g.has(e.to)||g.set(e.to,[]),_.get(e.from).push(e),g.get(e.to).push(e);for(let e of _.values())e.sort((e,t)=>f.get(e.to).x-f.get(t.to).x);for(let e of g.values())e.sort((e,t)=>f.get(e.from).x-f.get(t.from).x);for(let e of _.values())e.forEach((t,n)=>{t.sourcePort=(n+1)/(e.length+1)});for(let e of g.values())e.forEach((t,n)=>{t.targetPort=(n+1)/(e.length+1)});let v=d.reduce((e,t)=>e+t.size,0);for(let e of d)e.share=v>0?e.size/v:null;return{levels:d,rects:f,edges:h,depth:s,totalSize:v,width:r,height:d.length>0?d.length*(i+a)-a:0,gap:a}}function Gt(e,t,{theme:n,scale:r,colorOf:i,labelOf:a,sizeLabel:o,dimmed:s,selected:c,hovered:l}){let u=l??c,d=new Set([u]);for(let e of t.edges)e.from===u&&d.add(e.to),e.to===u&&d.add(e.from);let f=e=>e===u||e===c?1:s(e)?.13:u&&!d.has(e)?.22:1;e.save(),e.lineJoin=`round`;for(let n of t.edges){let a=t.rects.get(n.from),o=t.rects.get(n.to),s=n.from===u||n.to===u;e.globalAlpha=Math.min(f(n.from),f(n.to))*(s?.9:.5),e.strokeStyle=i(n.from),e.fillStyle=i(n.from),e.lineWidth=(s?1.6:1)/r;let c=a.x+a.width*n.sourcePort,l=a.y+a.height,d=o.x+o.width*n.targetPort,p=o.y,m=0,h=1;if(e.beginPath(),e.moveTo(c,l),o.y>a.y){let t=(l+p)/2;e.bezierCurveTo(c,t,d,t,d,p)}else if(o.y===a.y){p=o.y+o.height;let n=l+t.gap*.65;e.bezierCurveTo(c,n,d,n,d,p),h=-1}else{d=o.x+o.width,p=o.y+o.height*n.targetPort;let r=t.width+16+n.sourcePort*20;e.bezierCurveTo(c,l+t.gap/2,r,l+t.gap/2,r,l),e.lineTo(r,p+8),e.quadraticCurveTo(r,p,d,p),m=-1,h=0}e.stroke();let g=3/r;e.beginPath(),e.moveTo(d,p),e.lineTo(d-m*g-h*g,p-h*g+m*g),e.lineTo(d-m*g+h*g,p-h*g-m*g),e.closePath(),e.fill()}e.globalAlpha=1,e.textBaseline=`middle`,e.textAlign=`right`,e.fillStyle=n.labelDefault,e.font=`11px system-ui, sans-serif`;let p=n.edgeIntra(.16);for(let r of t.levels){let t=r.y+26;e.strokeStyle=p,e.lineWidth=3,e.beginPath(),e.arc(-112,t,18,0,Math.PI*2),e.stroke(),r.share!==null&&r.share>0&&(e.strokeStyle=n.labelDefault,e.beginPath(),e.arc(-112,t,18,-Math.PI/2,-Math.PI/2+r.share*Math.PI*2),e.stroke()),e.textAlign=`center`,e.font=`9px system-ui, sans-serif`;let i=r.share===null?`—`:r.share>0&&r.share<.001?`<0.1%`:`${Number((r.share*100).toFixed(1))}%`;e.fillText(i,-112,t),e.textAlign=`right`,e.font=`11px system-ui, sans-serif`,e.fillText(r.level===null?`Unreached`:r.level===0?`App`:`Level ${r.level}`,-12,r.y+19),e.font=`10px system-ui, sans-serif`,e.fillText(r.proportional?o(r.size):`No size data`,-12,r.y+35),e.font=`11px system-ui, sans-serif`}e.textAlign=`left`;for(let s of t.rects.values()){let{id:t,x:u,y:d,width:p,height:m}=s;if(p<=0)continue;let h=i(t),g=Re(h);if(e.globalAlpha=f(t),e.fillStyle=h,e.fillRect(u,d,p,m),e.save(),e.beginPath(),e.rect(u,d,p,m),e.clip(),e.strokeStyle=n.bg,e.lineWidth=1/r,p*r>=2?e.strokeRect(u,d,p,m):(e.beginPath(),e.moveTo(u,d),e.lineTo(u+p,d),e.moveTo(u,d+m),e.lineTo(u+p,d+m),e.stroke()),t===c||t===l){e.strokeStyle=n.selectRing,e.lineWidth=Math.min(1.5/r,p/4);let t=e.lineWidth/2;e.strokeRect(u+t,d+t,Math.max(0,p-t*2),m-t*2)}if(p*r<28){e.restore();continue}e.beginPath(),e.rect(u+7,d+4,Math.max(0,p-14),m-8),e.clip(),e.fillStyle=g,e.font=`500 12px system-ui, sans-serif`,e.fillText(a(t),u+9,d+21),e.fillStyle=g,e.font=`10px system-ui, sans-serif`,e.fillText(o(t),u+9,d+38),e.restore()}e.restore()}function Kt(e,t,n=[],{width:r=1200,height:i=800,cycleImportsOf:a=t}={}){e=[...new Set(e)].toSorted();let o=new Set(e),s=new Map(e.map(e=>[e,[...new Set(t.get(e)??[])].filter(t=>t!==e&&o.has(t)).toSorted()])),c=new Map(e.map(e=>[e,new Set(a.get(e)??[])])),l=new Map(e.map(e=>[e,[]]));for(let[e,t]of s)for(let n of t)l.get(n).push(e);let{groups:u,componentOf:d}=m(e,c),f=u.filter(e=>e.length>1),p=new Set(f.flat()),h=u.map(()=>new Set),g=u.map(()=>0);for(let[e,t]of s)for(let n of t){if(!c.get(e).has(n))continue;let t=d.get(e),r=d.get(n);t!==r&&!h[t].has(r)&&(h[t].add(r),g[r]++)}let _=new Set(n.map(e=>d.get(e)).filter(e=>e!==void 0)),v=u.map(()=>0),y=[],b=new Set,x=e=>{b.has(e)||(b.add(e),y.push(e))};_.forEach(x),g.forEach((e,t)=>{e||x(t)});for(let e=0;e<y.length;e++){let t=y[e];for(let e of h[t])_.has(e)||(v[e]=Math.max(v[e],v[t]+1)),--g[e]===0&&x(e)}let S=new Map(e.map(e=>[e,v[d.get(e)]])),C=new Map;for(let t of e){let e=S.get(t);C.has(e)||C.set(e,[]),C.get(e).push(t)}let w=[...C.keys()].toSorted((e,t)=>e-t),T=new Map,E=e=>e.forEach((t,n)=>T.set(t,(n+.5)/e.length));for(let e of C.values())E(e);for(let e=0;e<12;e++)for(let t of e%2?w.toReversed():w){let n=C.get(t),r=new Map(n.map(t=>{let n=(e%2?s:l).get(t);return[t,n.length>0?n.reduce((e,t)=>e+T.get(t),0)/n.length:T.get(t)]}));n.sort((e,t)=>r.get(e)-r.get(t)||T.get(e)-T.get(t)||e.localeCompare(t)),E(n)}let D=Math.max(.6,Math.min(2.4,r/Math.max(1,i))),O=Math.max(160,Math.sqrt(e.length*1100*D)),k=Math.max(120,O/D),A=w.at(-1)??0,j=new Map;for(let[e,t]of C)t.forEach((t,n)=>{let r=T.get(t)*O,i=(e+.5)/(A+1)*k;j.set(t,{id:t,x:r,y:i+(n%5-2)*9,anchorY:i,vx:0,vy:0,level:e,cycle:p.has(t),degree:s.get(t).length+l.get(t).length})});let M=[];for(let[e,t]of s)for(let n of t)M.push({from:e,to:n,cycle:c.get(e).has(n)&&p.has(e)&&d.get(e)===d.get(n)});let N=M.map(e=>{let t=j.get(e.from),n=j.get(e.to);return{a:t,b:n,length:26+Math.sqrt(Math.max(t.degree,n.degree))*5,strength:.065/Math.sqrt(Math.min(t.degree,n.degree)||1),cycle:e.cycle}}),P=[...j.values()];for(let e=0;e<240;e++){let t=new Map,n=7*(1-e/240)+.15;for(let e=0;e<P.length;e++){let n=P[e];n.fx=(O/2-n.x)*.002,n.fy=(n.anchorY-n.y)*.018,n.gx=Math.floor(n.x/80),n.gy=Math.floor(n.y/80);let r=`${n.gx},${n.gy}`;t.has(r)||t.set(r,[]),t.get(r).push(e)}for(let e=0;e<P.length;e++){let n=P[e];for(let r=n.gx-1;r<=n.gx+1;r++)for(let i=n.gy-1;i<=n.gy+1;i++)for(let a of t.get(`${r},${i}`)??[]){if(a<=e)continue;let t=P[a],r=n.x-t.x,i=n.y-t.y,o=r*r+i*i;if(o>6400)continue;o<.01&&(r=e%2?.1:-.1,i=.1);let s=Math.hypot(r,i),c=Math.min(18,100/s-100/80+Math.max(0,22-s)*.6),l=r/s*c,u=i/s*c;n.fx+=l,n.fy+=u,t.fx-=l,t.fy-=u}}for(let{a:e,b:t,length:n,strength:r,cycle:i}of N){let a=t.x-e.x,o=t.y-e.y,s=Math.hypot(a,o)||1,c=(s-n)*r,l=a/s*c,u=o/s*c;if(e.fx+=l,e.fy+=u,t.fx-=l,t.fy-=u,!i&&o<22){let n=(22-o)*.018;e.fy-=n,t.fy+=n}}for(let e of P){e.vx=(e.vx+e.fx)*.55,e.vy=(e.vy+e.fy)*.55;let t=Math.hypot(e.vx,e.vy)||1,r=Math.min(1,n/t);e.x+=e.vx*r,e.y+=e.vy*r}}let F=-1/0,I=-1/0,L=1/0,R=1/0;for(let e of P)L=Math.min(L,e.x),R=Math.min(R,e.y),F=Math.max(F,e.x),I=Math.max(I,e.y);for(let e of P)e.x+=16-L,e.y+=16-R;return{nodes:j,edges:M,depth:S,incoming:l,links:s,cycles:f,roots:new Set(n.filter(e=>o.has(e))),width:P.length>0?F-L+32:32,height:P.length>0?I-R+32:32}}function qt(e){return Math.max(2.5,Math.min(6,4.5*Math.sqrt(e)))}function Jt(e,t,n,{theme:r,viewport:i,width:a,height:o,colorOf:s,dimmed:c,selected:l,hovered:u,query:d}){let{k:f,tx:p,ty:m}=i,h=qt(f),g=u??l,_=new Set([g,...t.links.get(g)??[],...t.incoming.get(g)??[]]),v=new Map;for(let[e,r]of t.nodes){let t=n.nodeByFile.get(e);v.set(e,{x:r.x*f+p,y:r.y*f+m,color:s(t.pkg),n:t,p:r,dim:e===g||e===l?1:c(t)?.12:g&&!_.has(e)?.16:1})}e.save();let y=(t,i)=>{let s=v.get(t.from),c=v.get(t.to);if(Math.max(s.x,c.x)<-40||Math.min(s.x,c.x)>a+40||Math.max(s.y,c.y)<-80||Math.min(s.y,c.y)>o+80)return;e.globalAlpha=i?.85:Math.min(s.dim,c.dim)*(g?.12:.22),e.strokeStyle=i?s.color:r.labelDefault,e.lineWidth=i?1.4:.7,e.setLineDash(t.cycle?[3,3]:[]);let l=c.x-s.x,u=c.y-s.y,d=Math.hypot(l,u)||1,p=l/d,m=u/d,_=s.x+p*(h+1),y=s.y+m*(h+1),b=c.x-p*(h+3),x=c.y-m*(h+3),S=t.cycle?Math.min(18,d*.15):0,C=(_+b)/2-m*S,w=(y+x)/2+p*S;if(e.beginPath(),e.moveTo(_,y),e.quadraticCurveTo(C,w,b,x),e.stroke(),i||f>=.85||n.nodes.length<=50){let t=Math.atan2(x-w,b-C),n=i?5:3.5;e.setLineDash([]),e.fillStyle=e.strokeStyle,e.beginPath(),e.moveTo(b,x),e.lineTo(b-Math.cos(t-.5)*n,x-Math.sin(t-.5)*n),e.lineTo(b-Math.cos(t+.5)*n,x-Math.sin(t+.5)*n),e.closePath(),e.fill()}};for(let e of t.edges)e.from!==g&&e.to!==g&&y(e,!1);for(let e of t.edges)(e.from===g||e.to===g)&&y(e,!0);e.setLineDash([]);let b=new Map,x=e=>{let t=[];for(let n=Math.floor(e.x/64);n<=Math.floor((e.x+e.w)/64);n++)for(let r=Math.floor(e.y/24);r<=Math.floor((e.y+e.h)/24);r++)t.push(`${n},${r}`);return t},S=e=>{for(let t of x(e))b.has(t)||b.set(t,[]),b.get(t).push(e)},C=(e,t)=>e.x<t.x+t.w&&t.x<e.x+e.w&&e.y<t.y+t.h&&t.y<e.y+e.h,w=[...v.values()].filter(e=>e.x>=-10&&e.x<=a+10&&e.y>=-10&&e.y<=o+10);for(let t of w)e.globalAlpha=t.dim,e.fillStyle=t.color,e.beginPath(),e.arc(t.x,t.y,h,0,Math.PI*2),e.fill(),(t.p.cycle||t.n.totalIssues>0)&&(e.strokeStyle=t.p.cycle?`#c47ad7`:t.color,e.lineWidth=1,e.beginPath(),e.arc(t.x,t.y,h+2.5,0,Math.PI*2),e.stroke()),(t.n.file===l||t.n.file===u)&&(e.strokeStyle=r.selectRing,e.lineWidth=1.5,e.beginPath(),e.arc(t.x,t.y,h+4,0,Math.PI*2),e.stroke()),S({x:t.x-h-2,y:t.y-h-2,w:h*2+4,h:h*2+4});e.font=`11px SFMono-Regular, Consolas, "Liberation Mono", monospace`,e.textBaseline=`top`,e.textAlign=`center`,w.sort((e,n)=>{let r=e=>e.n.file===g?1e9:e.n.file===l?1e8:d&&e.dim===1?1e7:g&&_.has(e.n.file)?1e6:t.roots.has(e.n.file)?1e5:e.n.deg;return r(n)-r(e)});let T=0;for(let t of w){let n=t.n.file===g||t.n.file===l;if(!n&&t.dim<.5||!n&&!d&&!g&&f<1&&T>=24)continue;let i=t.n.label.length>38?`${t.n.label.slice(0,36)}\u2026`:t.n.label,s=e.measureText(i).width+8,c={x:t.x-s/2,y:t.y+h+5,w:s,h:16};c.x<4||c.x+c.w>a-4||c.y+c.h>o-24||!n&&x(c).some(e=>b.get(e)?.some(e=>C(c,e)))||(S(c),T++,e.globalAlpha=.94,e.fillStyle=r.bg,e.fillRect(c.x,c.y-1,c.w,c.h),e.globalAlpha=1,e.fillStyle=n?r.labelSelected:r.labelDefault,e.fillText(i,t.x,c.y))}e.restore()}function Yt(e){let t=e.nodes.map(e=>({node:e})),n=new Map(t.map(e=>[e.node.file,e]));return{nodes:t,edges:e.edges.flatMap(e=>{let t=n.get(e.a),r=n.get(e.b);return t&&r?[{edge:e,a:t,b:r}]:[]}),graph:e,selected:void 0,neighbors:new Set}}function Xt(e,{viewport:t,selected:n,visible:r,dimmed:i,radius:a,color:o,paintKey:s}){if(s===void 0||e.paintKey!==s){let n=new Map;for(let s of e.nodes){let e=s.node;s.visible=r(e),s.visible&&(s.x=e.x*t.k+t.tx,s.y=e.y*t.k+t.ty,s.radius=a(e),s.dimmed=i(e),n.has(e.pkg)||n.set(e.pkg,o(e.pkg)),s.color=n.get(e.pkg))}e.paintKey=s}if(e.selected!==n){e.selected=n,e.neighbors.clear();for(let t of e.graph.adj.get(n)??[]){let n=e.graph.edges[t];e.neighbors.add(n.a),e.neighbors.add(n.b)}}}function Zt(e,t,n,r){if(e.paints&&e.edgeOpacity===t&&e.neutral===n&&e.edgeSelected===r)return e.paints;let i=e=>({opacity:Math.max(0,Math.min(255,Math.round(e*255)))/255,neutral:n(e*.7)}),a=r?t*.25:t,o=r?.85:Math.min(.9,t+.5);return e.paints={base:i(a),emphasis:i(o),baseDim:i(Math.min(a,.04)),emphasisDim:i(Math.min(o,.04))},e.edgeOpacity=t,e.neutral=n,e.edgeSelected=r,e.paints}function Qt(e,t){let{a:n,b:r}=e;return(!e.gradient||e.ax!==n.node.x||e.ay!==n.node.y||e.bx!==r.node.x||e.by!==r.node.y||e.colorA!==n.color||e.colorB!==r.color)&&(e.gradient=t.createLinearGradient(n.node.x,n.node.y,r.node.x,r.node.y),e.gradient.addColorStop(0,n.color),e.gradient.addColorStop(1,r.color),e.ax=n.node.x,e.ay=n.node.y,e.bx=r.node.x,e.by=r.node.y,e.colorA=n.color,e.colorB=r.color),e.gradient}function $t(e,t,n){return(!e.halo||e.haloX!==e.x||e.haloY!==e.y||e.haloRadius!==t||e.haloColor!==e.color)&&(e.halo=n.createRadialGradient(e.x,e.y,0,e.x,e.y,t),e.halo.addColorStop(0,e.color+`55`),e.halo.addColorStop(1,e.color+`00`),e.haloX=e.x,e.haloY=e.y,e.haloRadius=t,e.haloColor=e.color),e.halo}function en(e,t,n,r){return e.x<-2&&t.x<-2||e.x>n+2&&t.x>n+2||e.y<-2&&t.y<-2||e.y>r+2&&t.y>r+2}function tn(e,t,n,r,i){return e+n<-2||e-n>r+2||t+n<-2||t-n>i+2}function nn(e){let t=2166136261;for(let n of e.files){for(let e=0;e<n.length;e++)t=Math.imul(t^n.codePointAt(e),16777619);t=Math.imul(t^10,16777619)}return[e.viewId??``,t>>>0,e.files.length,e.edges.length,i.bundleLayout,i.packagesView,i.dependencyPackagesView,i.focusedPkg,i.showAll].join(`|`)}function rn(e){let t=new Map;for(let[n,r]of e.entries()){let e=Math.floor(r.x/32),i=Math.floor(r.y/32);t.has(e)||t.set(e,new Map);let a=t.get(e);a.has(i)||a.set(i,[]),a.get(i).push({node:r,index:n})}return(e,n,r,i,a,o)=>{let{k:s,tx:c,ty:l}=r,u=(i+6)/s+1e-7,d=(e-c)/s,f=(n-l)/s,p=Math.floor((d-u)/32),m=Math.floor((d+u)/32),h=Math.floor((f-u)/32),g=Math.floor((f+u)/32),_=null,v=1/0,y=1/0;for(let r=p;r<=m;r++){let i=t.get(r);if(i)for(let t=h;t<=g;t++)for(let{node:r,index:u}of i.get(t)??[]){if(!o(r))continue;let t=r.x*s+c-e,i=r.y*s+l-n,d=t*t+i*i,f=a(r)+6;d<f*f&&(d<v||d===v&&u<y)&&(_=r,v=d,y=u)}}return _}}function an(e,t,n,r,i){if(!e||e.key!==t.key)return null;let a=(t.tx-e.tx)*i,o=(t.ty-e.ty)*i;if(!Number.isInteger(a)||!Number.isInteger(o)||!Number.isInteger(a/i)||!Number.isInteger(o/i)||!a&&!o||Math.abs(a)>=n*i||Math.abs(o)>=r*i)return null;let s=a/i,c=o/i,l=[];return s>0&&l.push({x:0,y:0,w:Math.min(n,s+2),h:r}),s<0&&l.push({x:Math.max(0,n+s-2),y:0,w:Math.min(n,-s+2),h:r}),c>0&&l.push({x:0,y:0,w:n,h:Math.min(r,c+2)}),c<0&&l.push({x:0,y:Math.max(0,r+c-2),w:n,h:Math.min(r,-c+2)}),{dx:a,dy:o,rects:l}}function on(e,t,n,r,i){return e&&e.rects.every(e=>r<e.x||t>e.x+e.w||i<e.y||n>e.y+e.h)}var sn={critical:`#ff5470`,high:`#ff9d4a`,medium:`#f4d35e`,low:`#67c2ff`,high_bug:`#a06c3f`,bug:`#7a6d62`,informational:`#218bff`},cn={dark:{bg:X.dark,grid:`rgba(255, 255, 255, 0.022)`,selectRing:`#ffffff`,edgeIntra:e=>`rgba(180, 195, 215, ${e})`,hubRing:e=>`rgba(255, 255, 255, ${e})`,labelFill:`rgba(230, 233, 238, 0.78)`,labelShadow:`rgba(12, 12, 12, 0.98)`,labelOutline:`rgba(12, 12, 12, 0.9)`,labelDefault:`rgba(200, 210, 225, 0.78)`,labelHover:`rgba(230, 237, 243, 0.95)`,labelSelected:`#fff`},light:{bg:X.light,grid:`rgba(0, 0, 0, 0.04)`,selectRing:`#0969da`,edgeIntra:e=>`rgba(50, 70, 100, ${e})`,hubRing:e=>`rgba(0, 0, 0, ${e})`,labelFill:`rgba(40, 50, 70, 0.85)`,labelShadow:`rgba(255, 255, 255, 0.95)`,labelOutline:`rgba(255, 255, 255, 0.9)`,labelDefault:`rgba(50, 60, 80, 0.85)`,labelHover:`rgba(20, 25, 35, 0.95)`,labelSelected:`#000`},pink:{bg:X.pink,grid:`rgba(0, 0, 0, 0.04)`,selectRing:`#0969da`,edgeIntra:e=>`rgba(50, 70, 100, ${e})`,hubRing:e=>`rgba(0, 0, 0, ${e})`,labelFill:`rgba(40, 50, 70, 0.85)`,labelShadow:`rgba(255, 255, 255, 0.95)`,labelOutline:`rgba(255, 255, 255, 0.9)`,labelDefault:`rgba(50, 60, 80, 0.85)`,labelHover:`rgba(20, 25, 35, 0.95)`,labelSelected:`#000`}},ln={...cn.light,bg:X.paper,selectRing:`#000`,edgeIntra:e=>`rgba(0, 0, 0, ${e})`,labelFill:`#000`,labelShadow:`#fff`,labelOutline:`#fff`,labelDefault:`#000`,labelHover:`#000`},un={...cn.light,bg:X.w95,selectRing:`#000080`};function dn(){let e=document.body.classList;return e.contains(`theme-paper`)?ln:e.contains(`theme-pink`)?cn.pink:e.contains(`theme-w95`)?un:e.contains(`theme-light`)?cn.light:cn.dark}var fn=(e,t)=>e.x0<t.x1&&t.x0<e.x1&&e.y0<t.y1&&t.y0<e.y1;function pn(e){e.sort((e,t)=>t.prio-e.prio);let t=[];for(let n of e){let e=!1;for(let r of t)if(fn(n,r)){e=!0;break}e||t.push(n)}return t}var mn=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,`0`));function $(e){return mn[Math.max(0,Math.min(255,Math.round(e*255)))]}function hn(e,t,r,o){let s=e.querySelector(`graph-layout`)?.shadowRoot;if(!s)return;let c=s.querySelector(`#g2-canvas`),l=s.querySelector(`#g2-tooltip`),u=s.querySelector(`.graph2-stage`),f=s.querySelector(`.g2-stage-stats`),p=s.querySelector(`#g2-zoom-pct`);if(!c)return;a({keepViewport:!0});let m=nn(t),h=i.keptViewport?.key===m?i.keptViewport:null;i.keptViewport=null;let g=c.getContext(`2d`),_=window.devicePixelRatio||1,y=0,b=0,x=0,S={tx:0,ty:0,k:1},C=null,w=h?.layoutH??0,T=h?.layoutW??0,E=!0,k=!h,A=new WeakMap,j=null,M=null,N=null,P=()=>t.supportsLayers&&i.bundleLayout===`layers`&&!i.focusedPkg,F=()=>t.supportsLayers&&i.bundleLayout===`dependencies`&&!i.focusedPkg,I=()=>F()&&!ue(t,i.dependencyPackagesView),L=()=>P()||i.bundleLayout===`graph`&&(t.packagesOnly||i.packagesView&&(t.canPackagesView??!1))&&!i.focusedPkg,R=null,B=null,V=te(t,se(t,ae)),H=null;function U(){if(!H){let e=se(ee(t),oe);if(H=ee(te(t,e)),P()&&t.layerRoots?.appImports.length>0){if(!H.byPkg.has(`__own__`)){let e={file:`__own__`,pkg:`__own__`,label:`App (source not bundled)`,size:null,fileCount:0,totalIssues:0};H.nodes.push(e),H.byPkg.set(`__own__`,e)}H.importsOf.set(`__own__`,[...new Set([...H.importsOf.get(`__own__`)??[],...t.layerRoots.appImports.filter(t=>!e.has(t))])])}}return H}function W(){return fe(t,i.dependencyPackagesView)}let ce=e=>e===`__own__`?`App`:R?.depth.get(e)===0?`App \xB7 ${z(e)}`:z(e);function le(e,t,n){if(e.nodes.length>50){Vt(e,t,n);return}let r=Ht(e.nodes.map(e=>e.pkg),e.importsOf,t,n,{groupOf:e=>e});de(e.nodes,new Map(r.map(e=>[e.file,e])))}function de(e,t){for(let n of e){let e=t.get(n.file);e&&(n.x=e.x,n.y=e.y)}}function pe(){if(!E)return;if(M=null,N=null,j=null,P()){let e=U();R=Wt(e.nodes.map(e=>({id:e.pkg,size:e.size})),e.importsOf,t.layerRoots?.roots??[`__own__`],{width:Math.max(360,T-190)}),E=!1;return}if(F()){let e=W();B=Kt(e.nodes.map(e=>e.file),e.importsOf,e.fileLevel?[]:t.layerRoots?.roots??[],{width:T,height:w,cycleImportsOf:e.cycleImportsOf}),E=!1;return}let e=i.layoutCache,n=i.focusedPkg,r=L(),a=r?U().nodes:V.nodes;if(e&&e.files===t.files&&e.w===T&&e.h===w&&e.focused===n&&(e.pkgView??!1)===r)de(a,e.pos);else{if(r)le(U(),T,w);else if(n){if(V.nodes.length>50)Vt(V,T,w);else{let e=Ht(V.files,V.importsOf,T,w);de(V.nodes,new Map(e.map(e=>[e.file,e])))}}else zt(V,T,w);let e=new Map;for(let t of a)e.set(t.file,{x:t.x,y:t.y});i.layoutCache={files:t.files,w:T,h:w,pos:e,focused:n,pkgView:r}}E=!1}function me(){if(F()&&B){if(W().nodes.length<=100){let e=12;g.save(),g.font=`11px SFMono-Regular, Consolas, "Liberation Mono", monospace`;for(let t of W().nodes){let n=t.label.length>38?`${t.label.slice(0,36)}\u2026`:t.label;e=Math.max(e,g.measureText(n).width/2+4)}return g.restore(),Ut([...B.nodes.values()],b,y,{statsHeight:x,left:e,top:12,bottom:27})}let e=Math.max(20,Math.min(b,y)*.04),t=Math.min((b-e*2)/B.width,(y-e*2-x)/B.height,2.5),n=Math.max(.05,t);return{k:n,tx:(b-B.width*n)/2,ty:(y-x-B.height*n)/2}}if(P()&&R){let e=Math.min((b-24)/(R.width+185),(y-70)/(R.height+R.gap),1.5),t=Math.max(.05,e);return{k:t,tx:(b-(R.width+185)*t)/2+145*t,ty:24+Math.max(0,(y-70-(R.height+R.gap)*t)/2)}}let e=L()?U().nodes:V.nodes;if(e.length<=50){let t=0,n=0,r=0;g.save(),g.font=`600 11px ui-monospace, SFMono-Regular, Menlo, Monaco, monospace`;for(let a of e){let e=L()?je(a):(a.isHub?6:4)*i.nodeSize,o=e*1.85+5;n=Math.max(n,o,g.measureText(a.label).width/2+6),r=Math.max(r,o),t=Math.max(t,o,e+4+13+4)}return g.restore(),Ut(e,b,y,{statsHeight:x,left:n,top:r,bottom:t})}if(e.length===0)return{k:1,tx:b/2,ty:(y-x)/2};let t=-1/0,n=-1/0,r=1/0,a=1/0;for(let i of e)i.x<r&&(r=i.x),i.y<a&&(a=i.y),i.x>t&&(t=i.x),i.y>n&&(n=i.y);let o=Math.max(20,n-a),s=Math.max(20,t-r),c=(r+t)/2,l=(a+n)/2,u=Math.max(20,Math.min(b,y)*(i.focusedPkg?.04:.03)),d=Math.min((b-u*2)/s,(y-u*2-x)/o,4),f=Math.max(.05,d);return{k:f,tx:b/2-c*f,ty:(y-x)/2-l*f}}function he(){let e=me();S.k=e.k,S.tx=e.tx,S.ty=e.ty}function ge(){if(!F()){p&&(p.textContent=`${Math.round(S.k*100)}%`);return}let e=gt(S.k,me().k,!0);p&&(p.textContent=`${e.percent}%`),Ke&&(Ke.disabled=S.k<=e.min*1.0001),Ge&&(Ge.disabled=S.k>=e.max*.9999)}function G(e,t){return[e*S.k+S.tx,t*S.k+S.ty]}function _e(e,t){return[(e-S.tx)/S.k,(t-S.ty)/S.k]}function K(e){return!i.hidden.has(e.pkg)}function ye(e,t,n,r,i){let a=n+(r===`critical`?4.2:r===`high`?3.4:2.8),o=r===`critical`?1.8:r===`high`?1.5:r===`medium`?1.3:1.1;g.strokeStyle=sn[r],g.globalAlpha=i,g.lineWidth=o,g.beginPath(),g.arc(e,t,a,0,Math.PI*2),g.stroke(),g.globalAlpha=1}function be(e,t,n,r,i,a,o){let s=o?.1:.9,c=2*(1-s)*(n-e)+2*s*(i-n),l=2*(1-s)*(r-t)+2*s*(a-r),u=Math.sqrt(c*c+l*l)||1,d=c/u,f=l/u;g.beginPath(),o?(g.moveTo(e,t),g.lineTo(e+d*7-f*2.94,t+f*7+d*2.94),g.lineTo(e+d*7+f*2.94,t+f*7-d*2.94)):(g.moveTo(i,a),g.lineTo(i-d*7+f*2.94,a-f*7-d*2.94),g.lineTo(i-d*7-f*2.94,a-f*7+d*2.94)),g.closePath()}function xe(e){if(!t.issuesHidden&&i.selectedSeverities.size>0){let t=e.severitySet;if(!t)return!0;let n=!1;for(let e of i.selectedSeverities)if(t.has(e)){n=!0;break}if(!n)return!0}if(!t.issuesHidden&&i.selectedColors.size>0){let t=e.colorSet;if(!t)return!0;let n=!1;for(let e of i.selectedColors)if(t.has(e)){n=!0;break}if(!n)return!0}if(i.solo&&e.pkg!==i.solo&&!L()&&!I())return!0;let n=i.pathFilter;if(n){let t=n.toLowerCase(),r=e.pathText?e.pathText.includes(t):e.file.toLowerCase().includes(t),i=e.pkg&&e.pkg.toLowerCase().includes(t),a=e.label&&e.label.toLowerCase().includes(t);if(!r&&!i&&!a)return!0}return!1}function q(e){return(e.isHub?4.9:3.5)*i.nodeSize*Math.max(.6,Math.min(1.6,S.k))}function Se(){let e=u.getBoundingClientRect(),t=y,n=b;b=Math.max(80,e.width),y=Math.max(80,e.height),x=f?(parseFloat(getComputedStyle(f).lineHeight)||0)+8:0,_=window.devicePixelRatio||1,c.width=b*_,c.height=y*_,M=null,A.delete(V),H&&A.delete(H),c.style.width=b+`px`,c.style.height=y+`px`,g.setTransform(_,0,0,_,0,0),(T===0||w===0)&&(T=b,w=y,E=!0),pe();let r=n>0&&(Math.abs(b-n)/n>.15||Math.abs(y-t)/t>.15);h?(S.k=h.k,S.tx=h.tx+(b-h.W)/2,S.ty=h.ty+(y-h.H)/2,h=null):(k||r)&&(he(),k=!1),J()}let Ce=null,we=!0,Te=!1,Ee=!1;function J(){we=!0,!(Te||Ee)&&(Te=!0,Ce=requestAnimationFrame(()=>{Te=!1,we&&!Ee&&(we=!1,De())}))}function De(){let e=L()?U():V;if(N?.graph!==e){N={graph:e,x0:1/0,y0:1/0,x1:-1/0,y1:-1/0};for(let t of e.nodes)N.x0=Math.min(N.x0,t.x),N.x1=Math.max(N.x1,t.x),N.y0=Math.min(N.y0,t.y),N.y1=Math.max(N.y1,t.y)}let t=q({isHub:!0})*6+8,n=N.x0*S.k+S.tx>t&&N.y0*S.k+S.ty>t&&N.x1*S.k+S.tx<b-t&&N.y1*S.k+S.ty<y-t&&S.k<=1.4&&e.nodes.length>50&&!P()&&!F(),r={tx:S.tx,ty:S.ty,key:JSON.stringify([S.k,dn().bg,i.nodeSize,i.edgeOpacity,C,i.selected,i.solo,i.focusedPkg,L(),i.showAll,i.pathFilter,[...i.selectedSeverities],[...i.selectedColors],[...i.hidden]])},a=n?an(M,r,b,y,_):null;g.save();try{if(a){g.save(),g.setTransform(1,0,0,1,0,0),g.globalCompositeOperation=`copy`,g.drawImage(c,a.dx,a.dy),g.restore(),g.beginPath();for(let e of a.rects)g.rect(e.x,e.y,e.w,e.h);g.clip()}Oe(a),M=n?r:null}finally{g.restore()}}function Oe(e){let t=dn();g.fillStyle=t.bg,g.fillRect(0,0,b,y),ke(t);let r=F(),a=L(),o=r?W():a?U():V,s=I()||a?i.solo:i.selected,c=s?o.nodeByFile.get(s):null,l=c?s:null;if(r){Jt(g,B,o,{theme:t,viewport:S,width:b,height:y,colorOf:d,selected:l,hovered:C,query:i.pathFilter,dimmed:e=>xe(e)}),ge();return}if(P()){g.save(),g.translate(S.tx,S.ty),g.scale(S.k,S.k),Gt(g,R,{theme:t,scale:S.k,selected:l,hovered:C,colorOf:d,labelOf:ce,sizeLabel:e=>n(typeof e==`number`?e:o.byPkg.get(e).size)||`Size unknown`,dimmed:e=>xe(o.byPkg.get(e))}),g.restore(),ge();return}if(a&&o.nodes.length<=50){Y(t);return}if(i.focusedPkg&&o.nodes.length<=50){Ae(t,l,c);return}A.has(o)||A.set(o,Yt(o));let u=A.get(o),f=JSON.stringify([S.k,S.tx,S.ty,i.nodeSize,t.bg,i.solo,i.pathFilter,[...i.selectedSeverities],[...i.selectedColors],[...i.hidden]]);Xt(u,{viewport:S,selected:l,paintKey:f,visible:K,dimmed:xe,radius:q,color:d});let p=Zt(u,i.edgeOpacity,t.edgeIntra,!!l),m=l||C,h=.85/S.k,_=.55/S.k,v=null,x=null,w=null;g.save(),g.translate(S.tx,S.ty),g.scale(S.k,S.k);for(let t of u.edges){let{edge:n,a:r,b:i}=t;if(!r.visible||!i.visible||en(r,i,b,y)||on(e,Math.min(r.x,i.x)-2,Math.min(r.y,i.y)-2,Math.max(r.x,i.x)+2,Math.max(r.y,i.y)+2))continue;let a=m&&(n.a===m||n.b===m),o=r.dimmed&&i.dimmed?a?p.emphasisDim:p.baseDim:a?p.emphasis:p.base,s=n.cross?Qt(t,g):o.neutral,c=n.cross?o.opacity:1,l=n.cross?h:_;s!==x&&(g.strokeStyle=s,x=s),c!==v&&(g.globalAlpha=c,v=c),l!==w&&(g.lineWidth=l,w=l),g.beginPath(),g.moveTo(r.node.x,r.node.y),g.lineTo(i.node.x,i.node.y),g.stroke()}g.restore();for(let t of u.nodes){if(!t.visible)continue;let n=t.node,r=n.file===C,i=n.file===l;if(!n.isHub&&!r&&!i||t.dimmed&&!r&&!i)continue;let a=t.radius,o=t.x,s=t.y,c=a*(i?6:r?4.5:3);tn(o,s,c,b,y)||on(e,o-c-2,s-c-2,o+c+2,s+c+2)||(g.fillStyle=$t(t,c,g),g.beginPath(),g.arc(o,s,c,0,Math.PI*2),g.fill())}for(let n of u.nodes){if(!n.visible)continue;let r=n.node,i=n.radius,a=n.x,o=n.y;if(tn(a,o,i+6,b,y)||on(e,a-i-8,o-i-8,a+i+8,o+i+8))continue;let s=1,c=l&&r.file===l;l&&!c&&(s=u.neighbors.has(r.file)?1:.25),!c&&n.dimmed&&(s=Math.min(s,.1)),g.fillStyle=n.color+$(s),g.beginPath(),g.arc(a,o,i,0,Math.PI*2),g.fill(),r.isHub&&(g.strokeStyle=t.hubRing(.55*s),g.lineWidth=.8,g.stroke()),r.issue&&ye(a,o,i,r.issue,s)}if(S.k>1.4){let e=0;if(S.k<9&&!i.showLabels)for(let t of o.nodes){if(!K(t))continue;let[n,r]=G(t.x,t.y);if(!(n<0||n>b||r<0||r>y)&&(e++,e>=50))break}let n=S.k>=9||e<50;if(i.showLabels||n){g.font=`10px ui-monospace, SFMono-Regular, Menlo, Monaco, monospace`,g.fillStyle=t.labelFill,g.textAlign=`left`,g.textBaseline=`middle`;let e=(e,t)=>e>-250&&e<b+250&&t>-250&&t<y+250,n=[];for(let t of o.nodes){if(!K(t))continue;let[r,i]=G(t.x,t.y);if(!e(r,i))continue;let a=q(t);n.push({file:t.file,x0:r-a,x1:r+a,y0:i-a,y1:i+a})}let r=[];for(let t of o.nodes){if(!K(t)||!t.isHub&&S.k<2.4)continue;let[n,i]=G(t.x,t.y);if(!e(n,i))continue;let a=n+q(t)+4,o=i+1,s=g.measureText(t.label).width+2,c=t.file===l,u=t.file===C,d=c?3:u?2:+!!t.isHub;r.push({file:t.file,n:t,tx:a,ty:o,prio:d,x0:a-2,x1:a+s,y0:o-11/2,y1:o+11/2})}let i=pn(r.filter(e=>!n.some(t=>t.file!==e.file&&fn(e,t))));for(let e of i)g.fillText(e.n.label,e.tx,e.ty)}}if(c&&K(c)){let[e,n]=G(c.x,c.y),r=q(c);g.strokeStyle=t.selectRing,g.lineWidth=1.5,g.beginPath(),g.arc(e,n,r+5,0,Math.PI*2),g.stroke()}ge()}function ke(e){if(S.k<.4)return;let t=(S.tx%80+80)%80,n=(S.ty%80+80)%80;g.strokeStyle=e.grid,g.lineWidth=1,g.beginPath();for(let e=t;e<b;e+=80)g.moveTo(e,0),g.lineTo(e,y);for(let e=n;e<y;e+=80)g.moveTo(0,e),g.lineTo(b,e);g.stroke()}function Ae(e,t,n){let r=d(i.focusedPkg),a=e.hubRing(.55),o=new Set;if(C){o.add(C);for(let e of V.adj.get(C)??[]){let t=V.edges[e];o.add(t.a),o.add(t.b)}}let s=e=>(e.isHub?6:4)*i.nodeSize;for(let e of V.edges){let n=V.nodeByFile.get(e.a),a=V.nodeByFile.get(e.b);if(!n||!a||!K(n)||!K(a))continue;let o=e.fromLo&&e.fromHi,c=!o&&e.fromHi,l=c?a:n,u=c?n:a,d=C&&(e.a===C||e.b===C),f=t&&(e.a===t||e.b===t),p=(t||C)&&!d&&!f,m=s(l),h=s(u),[_,v]=G(l.x,l.y),[y,b]=G(u.x,u.y),x=y-_,S=b-v,w=Math.sqrt(x*x+S*S)||1,T=x/w,E=S/w,D=_+T*(m+1.5),O=v+E*(m+1.5),k=y-T*(h+3.5),A=b-E*(h+3.5),j=Math.min(w*.15,30),M=(D+k)/2-E*j,N=(O+A)/2+T*j;g.beginPath(),g.moveTo(D,O),g.quadraticCurveTo(M,N,k,A);let P;P=f?.9:d?.85:p?.05:Math.min(.85,i.edgeOpacity*3),g.strokeStyle=r+$(P),g.lineWidth=f||d?1.5:.85,g.stroke(),!p&&(be(D,O,M,N,k,A,!1),g.fillStyle=r+$(Math.min(1,P+.15)),g.fill(),o&&(be(D,O,M,N,k,A,!0),g.fill()))}for(let e of V.nodes){if(!K(e))continue;let[n,i]=G(e.x,e.y),c=s(e),l=e.file===C,u=e.file===t,d=(t||C)&&!o.has(e.file)&&!u?.15:1;if(g.globalAlpha=d,u||l||e.isHub){let e=c*(u?4:l?3:2.4),t=g.createRadialGradient(n,i,c*.6,n,i,e);t.addColorStop(0,r+$(u?.4:.25)),t.addColorStop(1,r+`00`),g.fillStyle=t,g.beginPath(),g.arc(n,i,e,0,Math.PI*2),g.fill()}g.fillStyle=r,g.beginPath(),g.arc(n,i,c,0,Math.PI*2),g.fill(),e.isHub&&(g.strokeStyle=a,g.lineWidth=.9,g.stroke()),e.issue&&ye(n,i,c,e.issue,d),g.globalAlpha=1}g.font=`600 11px ui-monospace, SFMono-Regular, Menlo, Monaco, monospace`,g.textAlign=`center`,g.textBaseline=`top`,g.lineJoin=`round`;let c=[];for(let e of V.nodes){if(!K(e))continue;let[n,r]=G(e.x,e.y),i=r+s(e)+4,a=g.measureText(e.label).width/2+2,o=e.file===t,l=e.file===C,u=o?3:l?2:+!!e.isHub;c.push({n:e,sx:n,ty:i,halfW:a,isSel:o,isHov:l,prio:u,x0:n-a,x1:n+a,y0:i,y1:i+13})}let l=pn(c);for(let n of l){let{n:r,sx:i,ty:a,isSel:s,isHov:c}=n,l=(t||C)&&!o.has(r.file)&&!s?.2:1;g.globalAlpha=l,g.shadowColor=e.labelShadow,g.shadowBlur=4,g.strokeStyle=e.labelOutline,g.lineWidth=3,g.strokeText(r.label,i,a),g.shadowBlur=0,g.fillStyle=s?e.labelSelected:c?e.labelHover:e.labelDefault,g.fillText(r.label,i,a),g.globalAlpha=1}if(n&&K(n)){let[t,r]=G(n.x,n.y),i=s(n);g.strokeStyle=e.selectRing,g.lineWidth=1.8,g.beginPath(),g.arc(t,r,i+4,0,Math.PI*2),g.stroke()}ge()}function je(e){return Math.min(26,5+Math.sqrt(e.fileCount)*1.7)*i.nodeSize}function Y(e){let t=U(),n=i.solo&&t.byPkg.has(i.solo)?i.solo:null,r=C??n,a=new Set;if(r){a.add(r);for(let e of t.edges)e.a===r?a.add(e.b):e.b===r&&a.add(e.a)}let o=e=>{if(e.pkg===n||e.pkg===C)return 1;let t=1;return r&&!a.has(e.pkg)&&(t=.2),xe(e)&&(t=Math.min(t,.1)),t};for(let e of t.edges){let n=t.byPkg.get(e.a),i=t.byPkg.get(e.b);if(!n||!i||!K(n)||!K(i))continue;let a=e.fromLo&&e.fromHi,o=!a&&e.fromHi,s=o?i:n,c=o?n:i,l=r!==null&&(e.a===r||e.b===r),u=xe(n)&&xe(i),f=r!==null&&!l||u,p=je(s),m=je(c),[h,_]=G(s.x,s.y),[v,y]=G(c.x,c.y),b=v-h,x=y-_,S=Math.sqrt(b*b+x*x)||1,C=b/S,w=x/S,T=h+C*(p+1.5),E=_+w*(p+1.5),D=v-C*(m+3.5),O=y-w*(m+3.5),k=Math.min(S*.15,30),A=(T+D)/2-w*k,j=(E+O)/2+C*k,M;M=u?.05:l?.9:f?.06:.5;let N=g.createLinearGradient(T,E,D,O);N.addColorStop(0,d(s.pkg)+$(M)),N.addColorStop(1,d(c.pkg)+$(M)),g.beginPath(),g.moveTo(T,E),g.quadraticCurveTo(A,j,D,O),g.strokeStyle=N,g.lineWidth=Math.min(3.5,.8+Math.sqrt(e.count)*.3)*(l?1.3:1),g.stroke(),!f&&(be(T,E,A,j,D,O,!1),g.fillStyle=d(c.pkg)+$(Math.min(1,M+.15)),g.fill(),a&&(be(T,E,A,j,D,O,!0),g.fillStyle=d(s.pkg)+$(Math.min(1,M+.15)),g.fill()))}for(let e of t.nodes){if(!K(e))continue;let[t,r]=G(e.x,e.y),i=je(e),a=e.pkg===C,s=e.pkg===n,c=d(e.pkg),l=o(e);if(s||a){let e=i*(s?2.6:2.2),n=g.createRadialGradient(t,r,i*.6,t,r,e);n.addColorStop(0,c+$(s?.4:.25)),n.addColorStop(1,c+`00`),g.fillStyle=n,g.beginPath(),g.arc(t,r,e,0,Math.PI*2),g.fill()}g.fillStyle=c+$(l),g.beginPath(),g.arc(t,r,i,0,Math.PI*2),g.fill(),e.issue&&ye(t,r,i,e.issue,l)}g.font=`600 11px ui-monospace, SFMono-Regular, Menlo, Monaco, monospace`,g.textAlign=`center`,g.textBaseline=`top`,g.lineJoin=`round`;let s=[];for(let e of t.nodes){if(!K(e))continue;let[t,r]=G(e.x,e.y),i=r+je(e)+4,a=g.measureText(e.label).width/2+2,o=e.pkg===n,c=e.pkg===C,l=o?1/0:c?1e9:e.fileCount;s.push({p:e,sx:t,ty:i,isSel:o,isHov:c,prio:l,x0:t-a,x1:t+a,y0:i,y1:i+13})}let c=pn(s);for(let t of c){let{p:n,sx:r,ty:i,isSel:a,isHov:s}=t;g.globalAlpha=Math.max(.25,o(n)),g.shadowColor=e.labelShadow,g.shadowBlur=4,g.strokeStyle=e.labelOutline,g.lineWidth=3,g.strokeText(n.label,r,i),g.shadowBlur=0,g.fillStyle=a?e.labelSelected:s?e.labelHover:e.labelDefault,g.fillText(n.label,r,i),g.globalAlpha=1}if(n){let r=t.byPkg.get(n),[i,a]=G(r.x,r.y);g.strokeStyle=e.selectRing,g.lineWidth=1.8,g.beginPath(),g.arc(i,a,je(r)+4,0,Math.PI*2),g.stroke()}ge()}function Me(e,t){if(F()){let[n,r]=_e(e,t),i=null,a=1/0;for(let[e,t]of B.nodes){let o=(t.x-n)**2+(t.y-r)**2;o<a&&o<(14/Math.max(S.k,.1))**2&&(a=o,i=W().nodeByFile.get(e))}return i}if(P()){let[n,r]=_e(e,t);for(let e of R.rects.values())if(e.width>0&&n>=e.x&&n<e.x+e.width&&r>=e.y&&r<=e.y+e.height)return U().byPkg.get(e.id);return null}let n=L(),r=n?U():V,a=n&&r.nodes.length<=50;if(r.nodes.length>50){j??=rn(r.nodes);let n=4.9*i.nodeSize*Math.max(.6,Math.min(1.6,S.k));return j(e,t,S,n,q,K)}let o=null,s=1/0;for(let n of r.nodes){if(!K(n))continue;let[r,i]=G(n.x,n.y),c=r-e,l=i-t,u=c*c+l*l,d=(a?je(n):q(n))+6;u<d*d&&u<s&&(s=u,o=n)}return o}function Ne(e,t,n){if(!l)return;let r=d(e.pkg),i=z(e.pkg),a=ie(e.file,e.pkg);O(D`<div class="g2-tt-path">${a}</div><div class="g2-tt-head"><span class="g2-tt-dot" style="${v({background:r})}"></span> <span class="g2-tt-pkg">${i}</span></div>${e.totalIssues>0?ve(e.own):null}`,l),Fe(t,n)}function Pe(e,r,i){if(!l)return;let a=d(e.pkg),o=n(e.size),s=t.packagesOnly?re(t,e.pkg):[],c=t.packagesOnly?s.length>1?`${s.length} versions`:s[0]??``:`${e.fileCount} ${e.fileCount===1?`file`:`files`}${o?` \xB7 ${o}`:``}`;O(D`<div class="g2-tt-path">${P()?ce(e.pkg):e.label}</div>${F()||t.packagesOnly?D`<div class="g2-tt-pkg">${W().importedBy.get(e.pkg)?.length??0} ${ne(t).importers} · ${W().importsOf.get(e.pkg)?.length??0} dependencies</div>`:null} ${P()?D`<div class="g2-tt-pkg">${R.depth.has(e.pkg)?`Level ${R.depth.get(e.pkg)} \xB7 shortest import distance from App`:`No known import path from App`}</div>`:null}<div class="g2-tt-head"><span class="g2-tt-dot" style="${v({background:a})}"></span> <span class="g2-tt-pkg">${c}</span></div>${e.totalIssues>0?ve(e.own):null}`,l),Fe(r,i)}function Fe(e,t){let n=u.getBoundingClientRect();l.classList.add(`show`);let r=l.offsetWidth,i=l.offsetHeight,a=e-n.left,o=t-n.top,s=n.width,c=n.height,d=a+12;d+r>s-4&&(d=a-r-12),d<4&&(d=4);let f=o+12;f+i>c-4&&(f=o-i-12),f<4&&(f=4),l.style.left=`${d}px`,l.style.top=`${f}px`}function Ie(){l&&l.classList.remove(`show`)}let X=!1,Le=null,Re=!1,ze=e=>{e.button===0&&(e.target.closest(`.g2-stage-overlay, .g2-stage-overlay-tr, .g2-zoom-ctrl`)||(X=!0,Re=!1,Le={x:e.clientX,y:e.clientY,tx:S.tx,ty:S.ty}))},Be=e=>{let t=u.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top;if(X){let t=e.clientX-Le.x,n=e.clientY-Le.y;Math.abs(t)+Math.abs(n)>3&&(Re=!0),S.tx=Le.tx+t,S.ty=Le.ty+n,Ie(),J();return}let i=Me(n,r),a=C;C=i?.file??null,c.style.cursor=`default`,i?L()||I()?Pe(i,e.clientX,e.clientY):Ne(i,e.clientX,e.clientY):a&&Ie(),C!==a&&J()},Ve=e=>{if(X&&!Re){let t=u.getBoundingClientRect(),n=Me(e.clientX-t.left,e.clientY-t.top);L()||I()?(i.solo=n&&i.solo!==n.pkg?n.pkg:null,i.selected=null,r(),o?.()):(i.selected=n?.file??null,r()),J()}X=!1},He=()=>{let e=C!==null;C=null,Ie(),e&&J()},Ue=e=>{e.preventDefault();let t=u.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top,i=Math.exp(-e.deltaY*.0015),a=me();if(i<1&&S.k<=a.k*1.0001){S.k=a.k;let e=Math.min(.4,(1-i)*3);S.tx+=(a.tx-S.tx)*e,S.ty+=(a.ty-S.ty)*e,J();return}let[o,s]=_e(n,r),c=gt(S.k,a.k,F()),l=Math.max(c.min,Math.min(c.max,S.k*i));S.k=l,S.tx=n-o*S.k,S.ty=r-s*S.k,J()};u.addEventListener(`mousedown`,ze),window.addEventListener(`mousemove`,Be),window.addEventListener(`mouseup`,Ve),u.addEventListener(`mouseleave`,He),u.addEventListener(`wheel`,Ue,{passive:!1});function We(e){let t=gt(S.k,me().k,F());e=Math.max(t.min,Math.min(t.max,e));let n=b/2,r=y/2,[i,a]=_e(n,r);S.k=e,S.tx=n-i*S.k,S.ty=r-a*S.k,J()}let Ge=s.querySelector(`#g2-zoom-in`),Ke=s.querySelector(`#g2-zoom-out`),qe=s.querySelector(`#g2-zoom-fit`);Ge?.addEventListener(`click`,()=>We(S.k*1.4)),Ke?.addEventListener(`click`,()=>We(S.k/1.4)),qe?.addEventListener(`click`,()=>{he(),J()}),Se();let Je=new ResizeObserver(()=>Se());Je.observe(u);let Ye=new MutationObserver(e=>{for(let t of e){if((t.oldValue||``).includes(`report-fullscreen`)!==document.body.classList.contains(`report-fullscreen`)){T=0,w=0,E=!0,k=!0,i.layoutCache=null,setTimeout(()=>Se(),80);return}J()}});Ye.observe(document.body,{attributes:!0,attributeFilter:[`class`],attributeOldValue:!0}),J(),i.graphState={requestDraw:J,_cleanup:({keepViewport:e=!1}={})=>{let t=u.getBoundingClientRect();i.keptViewport=e&&t.width>0&&t.height>0?{key:m,k:S.k,tx:S.tx,ty:S.ty,W:b,H:y,layoutW:T,layoutH:w}:null,Ee=!0,cancelAnimationFrame(Ce),Je.disconnect(),Ye.disconnect(),u.removeEventListener(`mousedown`,ze),window.removeEventListener(`mousemove`,Be),window.removeEventListener(`mouseup`,Ve),u.removeEventListener(`mouseleave`,He),u.removeEventListener(`wheel`,Ue)}}}function gn(e,t,n=document.querySelector(`graph-layout`)){let r=n?.shadowRoot;if(!r)return;let i=vn(e),a=r.querySelector(`#g2-selection-area`);a&&O(q(i,t),a);let o=r.querySelector(`#g2-focus-overlay-slot`);o&&O(ye(i),o)}function _n(e,t=document.querySelector(`graph-layout`)){let n=t?.shadowRoot;if(!n)return;let r=n.querySelector(`#g2-top-pkgs-block`);r&&O(xe(vn(e)),r)}function vn(e){let t=L(e.treeData,e.files,e.ownCounts,e.transitiveCounts,e.severitySets,e.colorSets,e.fileFindings,e.options);if(e.strippedToOrig)for(let n of t.nodes)n.origFile=e.strippedToOrig.get(n.file);return t.canPackagesView=e.canPackagesView??!1,t.packagesOnly=e.packagesOnly??!1,t.supportsLayers=e.supportsLayers??!1,t.layerRoots=e.layerRoots,t.flowEntries=e.flowEntries,t.ownSourcePackages=e.ownSourcePackages,t.entryPackages=e.entryPackages,t.ownSourceFiles=e.ownSourceFiles,t.reasons=e.reasons??[],t.issuesHidden=e.issuesShown===!1,t.viewId=e.viewId??null,t}export{hn as attachGraph2Interaction,vn as buildGraphFromPrep,gn as refreshSidebar,_n as refreshTopPkgs};
|