| import { type ClassValue, clsx } from 'clsx' | |
| import { twMerge } from 'tailwind-merge' | |
| import { SpecialModule } from './types' | |
| import { NetworkError } from './errors' | |
| import { AnalyzeData, SourceIndex } from './analyze-data' | |
| export function cn(...inputs: ClassValue[]) { | |
| return twMerge(clsx(inputs)) | |
| } | |
| export async function fetchStrict(url: string): Promise<Response> { | |
| let res: Response | |
| try { | |
| res = await fetch(url) | |
| } catch (err) { | |
| throw new NetworkError(`Failed to fetch ${url}`, { cause: err }) | |
| } | |
| if (!res.ok) { | |
| throw new Error(`Failed to fetch ${url}: ${res.status} ${res.statusText}`) | |
| } | |
| return res | |
| } | |
| export async function jsonFetcher<T>(url: string): Promise<T> { | |
| const res = await fetchStrict(url) | |
| return res.json() as Promise<T> | |
| } | |
| export function getSpecialModuleType( | |
| analyzeData: AnalyzeData | undefined, | |
| sourceIndex: SourceIndex | null | |
| ): SpecialModule | null { | |
| if (!analyzeData || sourceIndex == null) return null | |
| const path = analyzeData.source(sourceIndex)?.path || '' | |
| if (path.endsWith('polyfill-module.js')) { | |
| return SpecialModule.POLYFILL_MODULE | |
| } else if (path.endsWith('polyfill-nomodule.js')) { | |
| return SpecialModule.POLYFILL_NOMODULE | |
| } | |
| return null | |
| } | |
| export function formatBytes(bytes: number): string { | |
| if (bytes === 0) return '0 B' | |
| if (bytes < 1024) return `${bytes} B` | |
| if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KB` | |
| if (bytes < 1024 * 1024 * 1024) | |
| return `${(bytes / (1024 * 1024)).toFixed(2)} MB` | |
| return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB` | |
| } | |
| let IDENT_ATTRIBUTES_REGEXP = | |
| /^(.+?)(?: \{(.*)\})?(?: \[(.*)\])?(?: \((.*?)\))?(?: <(.*?)>)?$/ | |
| export function splitIdent(ident: string): { | |
| fullPath: string | |
| templateArgs: string | |
| layer: string | |
| moduleType: string | |
| treeShaking: string | |
| } { | |
| let [match, fullPath, templateArgs, layer, moduleType, treeShaking] = | |
| IDENT_ATTRIBUTES_REGEXP.exec(ident) || [''] | |
| ident = ident.substring(0, ident.length - match.length) | |
| return { fullPath, templateArgs, layer, moduleType, treeShaking } | |
| } | |