/** * Count Jane stores by state * Usage: npx ts-node scripts/count-jane-stores.ts */ import puppeteer from 'puppeteer-extra'; import StealthPlugin from 'puppeteer-extra-plugin-stealth'; puppeteer.use(StealthPlugin()); async function main() { console.log('Counting Jane stores...\n'); const browser = await puppeteer.launch({ headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox'], }); const page = await browser.newPage(); // Capture store data from API const stores: any[] = []; await page.setRequestInterception(true); page.on('request', (req) => { const type = req.resourceType(); if (['image', 'font', 'media', 'stylesheet'].includes(type)) { req.abort(); } else { req.continue(); } }); page.on('response', async (response) => { const url = response.url(); if (url.includes('iheartjane.com') && url.includes('stores')) { try { const json = await response.json(); if (json.stores && Array.isArray(json.stores)) { stores.push(...json.stores); } } catch {} } }); // Visit the store directory console.log('Loading Jane store directory...'); await page.goto('https://www.iheartjane.com/stores', { waitUntil: 'networkidle2', timeout: 60000, }); // Wait for stores to load await new Promise(r => setTimeout(r, 5000)); // Also try to get store count from page content const pageStoreCount = await page.evaluate(() => { // Look for store count in page text const text = document.body.innerText; const match = text.match(/(\d+)\s*stores?/i); return match ? parseInt(match[1]) : null; }); await browser.close(); // Count by state const byState: Record = {}; for (const store of stores) { const state = store.state || 'Unknown'; byState[state] = (byState[state] || 0) + 1; } console.log('\n=== JANE STORE COUNTS ===\n'); console.log(`Total stores captured from API: ${stores.length}`); if (pageStoreCount) { console.log(`Page claims: ${pageStoreCount} stores`); } console.log('\nBy State:'); const sorted = Object.entries(byState).sort((a, b) => b[1] - a[1]); for (const [state, count] of sorted) { console.log(` ${state}: ${count}`); } // Check Arizona specifically const azStores = stores.filter(s => s.state === 'Arizona' || s.state === 'AZ' ); console.log(`\nArizona stores: ${azStores.length}`); if (azStores.length > 0) { console.log('Sample AZ stores:'); for (const s of azStores.slice(0, 5)) { console.log(` - ${s.name} (ID: ${s.id}) - ${s.city}`); } } } main().catch(console.error);