import { WrappedData } from './types.js'; // Declare global window property for embedded data declare global { interface Window { __GIT_WRAPPED_DATA__?: WrappedData; } } export class DataLoader { private data: WrappedData | null = null; async load(): Promise { try { // Priority 1: Check for embedded data (from --host flag) if (window.__GIT_WRAPPED_DATA__) { console.log('Loading data from embedded source'); this.data = window.__GIT_WRAPPED_DATA__; return this.data; } // Priority 2: Check for external data URL parameter const urlParams = new URLSearchParams(window.location.search); const dataUrl = urlParams.get('dataUrl'); let response: Response; if (dataUrl) { // Load from external URL console.log('Loading data from external URL:', dataUrl); response = await fetch(dataUrl); } else { // Priority 3: Fetch from local API endpoint (default for CLI usage) response = await fetch('/api/data'); } if (!response.ok) { throw new Error(`Failed to load data: ${response.statusText}`); } const loadedData = await response.json() as WrappedData; this.data = loadedData; return loadedData; } catch (error) { console.error('Error loading data:', error); throw error; } } getData(): WrappedData { if (!this.data) { throw new Error('Data not loaded. Call load() first.'); } return this.data; } getAuthors(): string[] { if (!this.data) { throw new Error('Data not loaded. Call load() first.'); } return Object.keys(this.data.commitsByAuthor || {}); } }