1
0
Fork 0
mirror of https://github.com/imjasonh/apkviz synced 2026-07-08 01:45:15 +00:00
apkviz/demo-impressive.js
Jason Hall c9fe336400
Add Wolfi APK dependency visualizer with advanced analytics
This web application visualizes package dependencies in the Wolfi Linux distribution,
providing powerful insights into the package ecosystem.

Features:
- Interactive force-directed dependency graph visualization
- Shows both forward dependencies (what a package depends on) and reverse dependencies (what depends on it)
- Click any node to re-center the visualization on that package
- Transitive dependency analysis with toggle control
- Advanced package analytics including:
  - Criticality scores showing how many packages depend on each package
  - Total size impact analysis (package + all dependencies)
  - Dependency depth metrics
  - Bus factor warnings for critical infrastructure packages
- "Most Critical Packages" dashboard showing system-wide statistics
- Real-time search with auto-complete
- Different visual styles for direct vs transitive dependencies
- Playwright-based testing infrastructure for automated UI testing

Technical implementation:
- TypeScript + D3.js for visualization
- Webpack build system
- Analyzes Wolfi's APKINDEX for package metadata
- Efficient dependency graph algorithms
- Responsive design with detailed package information panel

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-13 15:41:49 -04:00

62 lines
No EOL
2.3 KiB
JavaScript

const { chromium } = require('playwright');
async function demoImpressive() {
const browser = await chromium.launch({ headless: false, slowMo: 300 });
const page = await browser.newPage();
console.log('🚀 Welcome to the Wolfi APK Dependency Visualizer Demo!');
console.log(' Prepare to be impressed...\n');
await page.goto('http://localhost:8081', { waitUntil: 'networkidle' });
await page.waitForTimeout(2000);
// 1. Show the most critical packages
console.log('1. Let\'s see the most critical packages in Wolfi...');
await page.click('#show-top-packages');
await page.waitForTimeout(3000);
await page.screenshot({ path: 'playwright-output/demo-critical-packages.png' });
// Click on the top package
const topPackage = await page.$('.critical-package');
if (topPackage) {
console.log('2. Clicking on the most critical package...');
await topPackage.click();
await page.waitForTimeout(3000);
// Check the stats
const stats = await page.$eval('#package-stats', el => el.textContent);
console.log(' Impressive stats found!');
await page.screenshot({ path: 'playwright-output/demo-critical-stats.png' });
}
// 3. Search for a heavy package
console.log('\n3. Let\'s look at a package with deep dependencies...');
await page.fill('#search', '');
await page.type('#search', 'gcc', { delay: 100 });
await page.waitForTimeout(3000);
await page.screenshot({ path: 'playwright-output/demo-gcc-deps.png' });
// 4. Navigate through dependencies
console.log('\n4. Click on nodes to explore the dependency graph...');
const nodes = await page.$$('circle');
if (nodes.length > 5) {
await nodes[5].click();
await page.waitForTimeout(2000);
console.log(' Navigated to a dependency!');
}
console.log('\n✨ Demo complete! The browser will stay open for exploration.');
console.log('\nThings to try:');
console.log('- Search for "python", "nodejs", "rust" to see their ecosystems');
console.log('- Click any node to re-center and see its dependencies');
console.log('- Check out the stats panel for impressive metrics');
console.log('- Toggle "Show transitive dependencies" to see different views');
// Keep browser open
await new Promise(() => {});
}
demoImpressive().catch(console.error);