import { parseProject } from '../src/core/project'; import type { Sample } from './sample-explorer'; const resources=new Map}>>(); /** One immutable resource per sample URL, shared by preview and existing app-file loader. */ export function sampleResource(sample:Pick){ if(!resources.has(sample.url))resources.set(sample.url,(async()=>{ const response=await fetch(sample.url);if(!response.ok)throw new Error(`샘플 파일 읽기 실패: HTTP ${response.status}`); const text=await response.text(),project=parseProject(text); if(project.project.bridge!==sample.bridge)throw new Error(`교량 ID 불일치: 선택 ${sample.bridge} / 파일 ${project.project.bridge}`); if(project.piers.length!==sample.pierCount)throw new Error(`교각 수 불일치: 목록 ${sample.pierCount} / 파일 ${project.piers.length}`); return {text,project}; })().catch(error=>{resources.delete(sample.url);throw error;})); return resources.get(sample.url)!; }