diorama-js 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +188 -0
- package/dist/index.cjs +2283 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +186 -0
- package/dist/index.d.ts +186 -0
- package/dist/index.js +2269 -0
- package/dist/index.js.map +1 -0
- package/dist/react.cjs +2330 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +145 -0
- package/dist/react.d.ts +145 -0
- package/dist/react.js +2327 -0
- package/dist/react.js.map +1 -0
- package/dist/svelte.cjs +2297 -0
- package/dist/svelte.cjs.map +1 -0
- package/dist/svelte.d.cts +152 -0
- package/dist/svelte.d.ts +152 -0
- package/dist/svelte.js +2294 -0
- package/dist/svelte.js.map +1 -0
- package/dist/vue.cjs +2327 -0
- package/dist/vue.cjs.map +1 -0
- package/dist/vue.d.cts +146 -0
- package/dist/vue.d.ts +146 -0
- package/dist/vue.js +2324 -0
- package/dist/vue.js.map +1 -0
- package/package.json +120 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/core/resolver.ts","../src/core/cache.ts","../src/core/analyzer.ts","../src/core/sandbox.ts","../src/transform/rewriter.ts","../src/transform/transpiler.ts","../src/transform/assembler.ts","../src/index.ts"],"names":["hasBareImports","frame","extensionOf","repoName","html","usesESM"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Base error class for all Diorama errors.\r\n * Every error has a `code` property for programmatic handling.\r\n */\r\nexport class DioramaError extends Error {\r\n public readonly code: string;\r\n\r\n constructor(code: string, message: string) {\r\n super(message);\r\n this.name = 'DioramaError';\r\n this.code = code;\r\n // Fix prototype chain for instanceof checks\r\n Object.setPrototypeOf(this, new.target.prototype);\r\n }\r\n}\r\n\r\n/** GitHub returns 404 for the repository. */\r\nexport class RepoNotFoundError extends DioramaError {\r\n constructor(owner: string, repo: string) {\r\n super(\r\n 'REPO_NOT_FOUND',\r\n `Repository ${owner}/${repo} not found. Make sure it's a public repository.`,\r\n );\r\n this.name = 'RepoNotFoundError';\r\n }\r\n}\r\n\r\n/** The specified branch doesn't exist. */\r\nexport class BranchNotFoundError extends DioramaError {\r\n constructor(owner: string, repo: string, branch: string) {\r\n super(\r\n 'BRANCH_NOT_FOUND',\r\n `Branch '${branch}' not found in ${owner}/${repo}.`,\r\n );\r\n this.name = 'BranchNotFoundError';\r\n }\r\n}\r\n\r\n/** GitHub API rate limit exceeded. */\r\nexport class RateLimitError extends DioramaError {\r\n public readonly resetAt: Date | null;\r\n\r\n constructor(resetTimestamp?: number) {\r\n const resetAt = resetTimestamp ? new Date(resetTimestamp * 1000) : null;\r\n const resetMsg = resetAt\r\n ? ` Wait until ${resetAt.toLocaleTimeString()} or pass a GitHub token to increase the limit.`\r\n : ' Pass a GitHub token to increase the limit, or wait and try again.';\r\n super('RATE_LIMIT', `GitHub API rate limit exceeded.${resetMsg}`);\r\n this.name = 'RateLimitError';\r\n this.resetAt = resetAt;\r\n }\r\n}\r\n\r\n/** Fetch failures, CORS issues, timeouts. */\r\nexport class NetworkError extends DioramaError {\r\n constructor(message = 'A network error occurred. Check your connection and try again.') {\r\n super('NETWORK_ERROR', message);\r\n this.name = 'NetworkError';\r\n }\r\n}\r\n\r\n/** Can't detect a supported project type. */\r\nexport class ProjectTypeError extends DioramaError {\r\n constructor(message = 'Could not detect a supported project type. Diorama supports static HTML, ESM, React, Preact, and TypeScript projects.') {\r\n super('UNSUPPORTED_PROJECT', message);\r\n this.name = 'ProjectTypeError';\r\n }\r\n}\r\n\r\n/** Project imports a Node.js built-in module. */\r\nexport class NodeBuiltinError extends DioramaError {\r\n public readonly moduleName: string;\r\n\r\n constructor(moduleName: string) {\r\n super(\r\n 'NODE_BUILTIN',\r\n `This project imports '${moduleName}' which is a Node.js built-in. Diorama only supports browser-compatible projects.`,\r\n );\r\n this.name = 'NodeBuiltinError';\r\n this.moduleName = moduleName;\r\n }\r\n}\r\n\r\n/** esbuild reports a syntax error during transpilation. */\r\nexport class TranspileError extends DioramaError {\r\n public readonly file: string;\r\n public readonly line?: number;\r\n public readonly column?: number;\r\n\r\n constructor(message: string, file: string, line?: number, column?: number) {\r\n super('TRANSPILE_FAILED', message);\r\n this.name = 'TranspileError';\r\n this.file = file;\r\n this.line = line;\r\n this.column = column;\r\n }\r\n}\r\n\r\n/** esbuild-wasm binary fails to download or initialize. */\r\nexport class TranspilerLoadError extends DioramaError {\r\n constructor(message = 'Failed to load the transpiler. Check your network connection.') {\r\n super('TRANSPILER_LOAD_FAILED', message);\r\n this.name = 'TranspilerLoadError';\r\n }\r\n}\r\n\r\n/** HTML assembly hits an unresolvable state. */\r\nexport class AssemblyError extends DioramaError {\r\n constructor(message: string) {\r\n super('ASSEMBLY_FAILED', message);\r\n this.name = 'AssemblyError';\r\n }\r\n}\r\n\r\n/** A dependency can't be resolved on the CDN. */\r\nexport class PackageNotFoundError extends DioramaError {\r\n public readonly packageName: string;\r\n\r\n constructor(packageName: string) {\r\n super(\r\n 'PACKAGE_NOT_FOUND',\r\n `Package '${packageName}' could not be resolved on the CDN.`,\r\n );\r\n this.name = 'PackageNotFoundError';\r\n this.packageName = packageName;\r\n }\r\n}\r\n\r\n/** No index.html or JS entry point found. */\r\nexport class EntryPointError extends DioramaError {\r\n constructor(message = 'No entry point found. Diorama looks for index.html, src/index.jsx, src/index.tsx, or src/index.js.') {\r\n super('NO_ENTRY_POINT', message);\r\n this.name = 'EntryPointError';\r\n }\r\n}\r\n","import {\r\n RepoNotFoundError,\r\n BranchNotFoundError,\r\n RateLimitError,\r\n NetworkError,\r\n} from '../errors';\r\nimport type { ResolvedProject } from '../types';\r\n\r\n// ─── Constants ─────────────────────────────────────────────────\r\n\r\nconst GITHUB_API = 'https://api.github.com';\r\nconst RAW_BASE = 'https://raw.githubusercontent.com';\r\n\r\n/** File extensions treated as binary. */\r\nconst BINARY_EXTENSIONS = new Set([\r\n '.png', '.jpg', '.jpeg', '.gif', '.ico', '.webp',\r\n '.woff', '.woff2', '.ttf', '.eot', '.otf',\r\n '.mp3', '.mp4', '.ogg', '.wav', '.webm',\r\n '.pdf', '.zip',\r\n]);\r\n\r\n/** Paths that are always skipped. */\r\nconst DEFAULT_SKIP_DIRS = [\r\n 'node_modules/',\r\n '.git/',\r\n '.github/',\r\n '__tests__/',\r\n];\r\n\r\nconst DEFAULT_SKIP_FILES = [\r\n 'README.md',\r\n 'LICENSE',\r\n 'LICENSE.md',\r\n '.gitignore',\r\n '.env',\r\n '.env.local',\r\n '.env.production',\r\n 'package-lock.json',\r\n 'yarn.lock',\r\n 'pnpm-lock.yaml',\r\n];\r\n\r\nconst DEFAULT_SKIP_PATTERNS = [\r\n /\\.test\\.\\w+$/,\r\n /\\.spec\\.\\w+$/,\r\n];\r\n\r\n// ─── URL parsing ───────────────────────────────────────────────\r\n\r\nexport interface ParsedURL {\r\n owner: string;\r\n repo: string;\r\n branch?: string;\r\n subdirectory?: string;\r\n}\r\n\r\n/**\r\n * Parse a GitHub URL (or shorthand) into its components.\r\n *\r\n * Supported formats:\r\n * - `https://github.com/owner/repo`\r\n * - `https://github.com/owner/repo/tree/branch`\r\n * - `https://github.com/owner/repo/tree/branch/sub/dir`\r\n * - `github.com/owner/repo`\r\n * - `owner/repo`\r\n */\r\nexport function parseGitHubURL(input: string): ParsedURL {\r\n let cleaned = input.trim();\r\n\r\n // Strip protocol + optional www\r\n cleaned = cleaned\r\n .replace(/^https?:\\/\\//, '')\r\n .replace(/^www\\./, '');\r\n\r\n // Strip leading github.com/\r\n cleaned = cleaned.replace(/^github\\.com\\//, '');\r\n\r\n // Remove trailing slash\r\n cleaned = cleaned.replace(/\\/+$/, '');\r\n\r\n const parts = cleaned.split('/');\r\n\r\n if (parts.length < 2 || !parts[0] || !parts[1]) {\r\n throw new RepoNotFoundError(parts[0] ?? '', parts[1] ?? '');\r\n }\r\n\r\n const owner = parts[0];\r\n const repo = parts[1];\r\n\r\n // No /tree/ segment → no branch specified\r\n if (parts.length === 2) {\r\n return { owner, repo };\r\n }\r\n\r\n // parts[2] should be 'tree'\r\n if (parts[2] === 'tree' && parts.length >= 4) {\r\n const branch = parts[3];\r\n const subdirectory = parts.length > 4 ? parts.slice(4).join('/') : undefined;\r\n return { owner, repo, branch, subdirectory };\r\n }\r\n\r\n // Could be owner/repo/something else – treat as repo with no branch\r\n return { owner, repo };\r\n}\r\n\r\n// ─── Semaphore for concurrency limiting ────────────────────────\r\n\r\nclass Semaphore {\r\n private queue: Array<() => void> = [];\r\n private active = 0;\r\n\r\n constructor(private readonly concurrency: number) {}\r\n\r\n async acquire(): Promise<void> {\r\n if (this.active < this.concurrency) {\r\n this.active++;\r\n return;\r\n }\r\n return new Promise<void>((resolve) => {\r\n this.queue.push(() => {\r\n this.active++;\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n release(): void {\r\n this.active--;\r\n const next = this.queue.shift();\r\n if (next) next();\r\n }\r\n}\r\n\r\n// ─── Helpers ───────────────────────────────────────────────────\r\n\r\nfunction extensionOf(path: string): string {\r\n const dot = path.lastIndexOf('.');\r\n return dot === -1 ? '' : path.slice(dot).toLowerCase();\r\n}\r\n\r\nfunction isBinary(path: string): boolean {\r\n return BINARY_EXTENSIONS.has(extensionOf(path));\r\n}\r\n\r\nfunction shouldSkip(\r\n path: string,\r\n extraExclude?: string[],\r\n): boolean {\r\n for (const dir of DEFAULT_SKIP_DIRS) {\r\n if (path.startsWith(dir) || path.includes(`/${dir}`)) return true;\r\n }\r\n for (const file of DEFAULT_SKIP_FILES) {\r\n if (path === file) return true;\r\n }\r\n for (const pattern of DEFAULT_SKIP_PATTERNS) {\r\n if (pattern.test(path)) return true;\r\n }\r\n if (extraExclude) {\r\n for (const ex of extraExclude) {\r\n if (path.includes(ex)) return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction authHeaders(token?: string): Record<string, string> {\r\n const headers: Record<string, string> = {\r\n Accept: 'application/vnd.github.v3+json',\r\n };\r\n if (token) {\r\n headers['Authorization'] = `token ${token}`;\r\n }\r\n return headers;\r\n}\r\n\r\n// ─── Main resolver ─────────────────────────────────────────────\r\n\r\nexport interface ResolverOptions {\r\n githubToken?: string;\r\n maxConcurrentFetches?: number;\r\n exclude?: string[];\r\n /** Override branch (takes priority over the URL-parsed branch). */\r\n branch?: string;\r\n /** Subdirectory within the repo. */\r\n subdirectory?: string;\r\n}\r\n\r\n/**\r\n * Fetch all project files from a GitHub repository.\r\n */\r\nexport async function resolveProject(\r\n urlOrShorthand: string,\r\n options: ResolverOptions = {},\r\n): Promise<ResolvedProject> {\r\n const parsed = parseGitHubURL(urlOrShorthand);\r\n const { owner, repo } = parsed;\r\n const branch = options.branch ?? parsed.branch;\r\n const subdirectory = options.subdirectory ?? parsed.subdirectory;\r\n const token = options.githubToken;\r\n const concurrency = options.maxConcurrentFetches ?? 6;\r\n\r\n // 1) Resolve default branch if not provided\r\n const resolvedBranch = branch ?? (await resolveDefaultBranch(owner, repo, token));\r\n\r\n // 2) Fetch tree (always — needed for cache SHA comparison)\r\n const tree = await fetchTree(owner, repo, resolvedBranch, token);\r\n\r\n // 3) Filter paths\r\n let paths = tree.paths.filter((p) => !shouldSkip(p, options.exclude));\r\n\r\n // If subdirectory specified, scope down and rewrite paths\r\n if (subdirectory) {\r\n const prefix = subdirectory.endsWith('/') ? subdirectory : `${subdirectory}/`;\r\n paths = paths\r\n .filter((p) => p.startsWith(prefix))\r\n .map((p) => p.slice(prefix.length));\r\n }\r\n\r\n // 4) Fetch file contents in parallel\r\n const sem = new Semaphore(concurrency);\r\n const files = new Map<string, string>();\r\n const binaryFiles = new Map<string, Blob>();\r\n\r\n const fetchJobs = paths.map(async (relativePath) => {\r\n await sem.acquire();\r\n try {\r\n const rawPath = subdirectory\r\n ? `${subdirectory}/${relativePath}`\r\n : relativePath;\r\n const url = `${RAW_BASE}/${owner}/${repo}/${resolvedBranch}/${rawPath}`;\r\n\r\n if (isBinary(relativePath)) {\r\n const res = await fetch(url);\r\n if (!res.ok) return; // skip missing files silently\r\n const blob = await res.blob();\r\n binaryFiles.set(relativePath, blob);\r\n } else {\r\n const res = await fetch(url);\r\n if (!res.ok) return;\r\n const text = await res.text();\r\n files.set(relativePath, text);\r\n }\r\n } catch {\r\n // Skip individual file failures — don't abort the whole resolve\r\n } finally {\r\n sem.release();\r\n }\r\n });\r\n\r\n await Promise.all(fetchJobs);\r\n\r\n return {\r\n owner,\r\n repo,\r\n branch: resolvedBranch,\r\n sha: tree.sha,\r\n files,\r\n binaryFiles,\r\n };\r\n}\r\n\r\n// ─── GitHub API helpers ────────────────────────────────────────\r\n\r\nasync function resolveDefaultBranch(\r\n owner: string,\r\n repo: string,\r\n token?: string,\r\n): Promise<string> {\r\n const url = `${GITHUB_API}/repos/${owner}/${repo}`;\r\n const res = await safeFetch(url, authHeaders(token));\r\n\r\n if (res.status === 404) {\r\n throw new RepoNotFoundError(owner, repo);\r\n }\r\n handleRateLimit(res);\r\n if (!res.ok) {\r\n throw new NetworkError(`GitHub API returned ${res.status} for ${url}`);\r\n }\r\n\r\n const data = (await res.json()) as { default_branch: string };\r\n return data.default_branch;\r\n}\r\n\r\ninterface TreeResponse {\r\n sha: string;\r\n paths: string[];\r\n}\r\n\r\nasync function fetchTree(\r\n owner: string,\r\n repo: string,\r\n branch: string,\r\n token?: string,\r\n): Promise<TreeResponse> {\r\n const url = `${GITHUB_API}/repos/${owner}/${repo}/git/trees/${branch}?recursive=1`;\r\n const res = await safeFetch(url, authHeaders(token));\r\n\r\n if (res.status === 404) {\r\n throw new BranchNotFoundError(owner, repo, branch);\r\n }\r\n handleRateLimit(res);\r\n if (!res.ok) {\r\n throw new NetworkError(`GitHub API returned ${res.status} fetching tree for ${owner}/${repo}`);\r\n }\r\n\r\n const data = (await res.json()) as {\r\n sha: string;\r\n tree: Array<{ path: string; type: string }>;\r\n };\r\n\r\n const paths = data.tree\r\n .filter((entry) => entry.type === 'blob')\r\n .map((entry) => entry.path);\r\n\r\n return { sha: data.sha, paths };\r\n}\r\n\r\nfunction handleRateLimit(res: Response): void {\r\n if (res.status === 403 || res.status === 429) {\r\n const resetHeader = res.headers.get('x-ratelimit-reset');\r\n const remaining = res.headers.get('x-ratelimit-remaining');\r\n if (remaining === '0' || res.status === 429) {\r\n throw new RateLimitError(\r\n resetHeader ? parseInt(resetHeader, 10) : undefined,\r\n );\r\n }\r\n }\r\n}\r\n\r\nasync function safeFetch(\r\n url: string,\r\n headers: Record<string, string>,\r\n): Promise<Response> {\r\n try {\r\n return await fetch(url, { headers });\r\n } catch (err) {\r\n throw new NetworkError(\r\n `Network request failed for ${url}: ${err instanceof Error ? err.message : String(err)}`,\r\n );\r\n }\r\n}\r\n","import type { ResolvedProject, CacheStrategy } from '../types';\r\n\r\n// ─── Constants ─────────────────────────────────────────────────\r\n\r\nconst CACHE_PREFIX = 'diorama:';\r\nconst CACHE_META_KEY = 'diorama:__meta__';\r\n\r\ninterface CacheMeta {\r\n /** owner/repo → timestamp of last write. */\r\n entries: Record<string, number>;\r\n}\r\n\r\ninterface CacheEntry {\r\n sha: string;\r\n owner: string;\r\n repo: string;\r\n branch: string;\r\n /** Serialised text files: { relativePath: content } */\r\n files: Record<string, string>;\r\n /** Serialised binary files: { relativePath: base64DataURL } */\r\n binaryFiles: Record<string, string>;\r\n /** Timestamp of when the entry was written. */\r\n timestamp: number;\r\n}\r\n\r\n// ─── Cache Manager ─────────────────────────────────────────────\r\n\r\nexport interface CacheManagerOptions {\r\n /** Enable caching. Default: `true`. */\r\n enabled?: boolean;\r\n /** TTL in seconds. Default: `3600` (1 hour). */\r\n ttl?: number;\r\n /** Cache strategy. Default: `'normal'`. */\r\n strategy?: CacheStrategy;\r\n}\r\n\r\nexport class CacheManager {\r\n private enabled: boolean;\r\n private ttl: number;\r\n private _strategy: CacheStrategy;\r\n\r\n constructor(options: CacheManagerOptions = {}) {\r\n this.enabled = options.enabled ?? true;\r\n this.ttl = (options.ttl ?? 3600) * 1000; // convert to ms\r\n this._strategy = options.strategy ?? 'normal';\r\n }\r\n\r\n // ─── Public API ────────────────────────────────────────────\r\n\r\n /**\r\n * Try to read a cached project.\r\n * Returns `null` on miss, expiry, or if caching is disabled.\r\n */\r\n get(owner: string, repo: string, sha: string): ResolvedProject | null {\r\n if (!this.enabled) return null;\r\n try {\r\n const key = this.cacheKey(owner, repo);\r\n const raw = localStorage.getItem(key);\r\n if (!raw) return null;\r\n\r\n const entry: CacheEntry = JSON.parse(raw);\r\n\r\n // SHA mismatch → stale\r\n if (entry.sha !== sha) return null;\r\n\r\n // TTL check\r\n if (Date.now() - entry.timestamp > this.ttl) return null;\r\n\r\n return this.deserialize(entry);\r\n } catch {\r\n return null; // corrupted cache — treat as miss\r\n }\r\n }\r\n\r\n /**\r\n * For aggressive strategy: check if we have a recently-cached SHA\r\n * so we can skip even the tree API call.\r\n */\r\n getCachedSHA(owner: string, repo: string): string | null {\r\n if (!this.enabled || this._strategy !== 'aggressive') return null;\r\n try {\r\n const key = this.cacheKey(owner, repo);\r\n const raw = localStorage.getItem(key);\r\n if (!raw) return null;\r\n\r\n const entry: CacheEntry = JSON.parse(raw);\r\n // For aggressive strategy, use a shorter TTL (5 minutes)\r\n const aggressiveTTL = 5 * 60 * 1000;\r\n if (Date.now() - entry.timestamp > aggressiveTTL) return null;\r\n\r\n return entry.sha;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Store a resolved project in cache.\r\n * Silently handles quota errors by evicting old entries.\r\n */\r\n async set(project: ResolvedProject): Promise<void> {\r\n if (!this.enabled) return;\r\n\r\n const entry = await this.serialize(project);\r\n const key = this.cacheKey(project.owner, project.repo);\r\n\r\n try {\r\n this.writeEntry(key, entry, project.owner, project.repo);\r\n } catch (err) {\r\n if (isQuotaError(err)) {\r\n // Evict oldest entry and retry once\r\n this.evictOldest();\r\n try {\r\n this.writeEntry(key, entry, project.owner, project.repo);\r\n } catch {\r\n // Quota still exceeded — skip caching, don't error\r\n console.warn('[Diorama] Cache quota exceeded; skipping cache write.');\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Clear cache for a specific repo or all cached projects. */\r\n clear(repoSlug?: string): void {\r\n if (repoSlug) {\r\n const key = `${CACHE_PREFIX}${repoSlug}`;\r\n localStorage.removeItem(key);\r\n this.removeFromMeta(repoSlug);\r\n } else {\r\n // Clear all Diorama entries\r\n const meta = this.getMeta();\r\n for (const slug of Object.keys(meta.entries)) {\r\n localStorage.removeItem(`${CACHE_PREFIX}${slug}`);\r\n }\r\n localStorage.removeItem(CACHE_META_KEY);\r\n }\r\n }\r\n\r\n // ─── Internal helpers ──────────────────────────────────────\r\n\r\n private cacheKey(owner: string, repo: string): string {\r\n return `${CACHE_PREFIX}${owner}/${repo}`;\r\n }\r\n\r\n private async serialize(project: ResolvedProject): Promise<CacheEntry> {\r\n const files: Record<string, string> = {};\r\n for (const [path, content] of project.files) {\r\n files[path] = content;\r\n }\r\n\r\n const binaryFiles: Record<string, string> = {};\r\n for (const [path, blob] of project.binaryFiles) {\r\n binaryFiles[path] = await blobToBase64(blob);\r\n }\r\n\r\n return {\r\n sha: project.sha,\r\n owner: project.owner,\r\n repo: project.repo,\r\n branch: project.branch,\r\n files,\r\n binaryFiles,\r\n timestamp: Date.now(),\r\n };\r\n }\r\n\r\n private deserialize(entry: CacheEntry): ResolvedProject {\r\n const files = new Map<string, string>();\r\n for (const [path, content] of Object.entries(entry.files)) {\r\n files.set(path, content);\r\n }\r\n\r\n const binaryFiles = new Map<string, Blob>();\r\n for (const [path, dataURL] of Object.entries(entry.binaryFiles)) {\r\n binaryFiles.set(path, base64ToBlob(dataURL));\r\n }\r\n\r\n return {\r\n owner: entry.owner,\r\n repo: entry.repo,\r\n branch: entry.branch,\r\n sha: entry.sha,\r\n files,\r\n binaryFiles,\r\n };\r\n }\r\n\r\n private writeEntry(\r\n key: string,\r\n entry: CacheEntry,\r\n owner: string,\r\n repo: string,\r\n ): void {\r\n localStorage.setItem(key, JSON.stringify(entry));\r\n this.updateMeta(`${owner}/${repo}`);\r\n }\r\n\r\n private getMeta(): CacheMeta {\r\n try {\r\n const raw = localStorage.getItem(CACHE_META_KEY);\r\n return raw ? JSON.parse(raw) : { entries: {} };\r\n } catch {\r\n return { entries: {} };\r\n }\r\n }\r\n\r\n private updateMeta(slug: string): void {\r\n const meta = this.getMeta();\r\n meta.entries[slug] = Date.now();\r\n localStorage.setItem(CACHE_META_KEY, JSON.stringify(meta));\r\n }\r\n\r\n private removeFromMeta(slug: string): void {\r\n const meta = this.getMeta();\r\n delete meta.entries[slug];\r\n localStorage.setItem(CACHE_META_KEY, JSON.stringify(meta));\r\n }\r\n\r\n private evictOldest(): void {\r\n const meta = this.getMeta();\r\n const entries = Object.entries(meta.entries);\r\n if (entries.length === 0) return;\r\n\r\n // Sort ascending by timestamp, evict the oldest\r\n entries.sort((a, b) => a[1] - b[1]);\r\n const [oldestSlug] = entries[0];\r\n localStorage.removeItem(`${CACHE_PREFIX}${oldestSlug}`);\r\n delete meta.entries[oldestSlug];\r\n localStorage.setItem(CACHE_META_KEY, JSON.stringify(meta));\r\n }\r\n}\r\n\r\n// ─── Utility ───────────────────────────────────────────────────\r\n\r\nfunction blobToBase64(blob: Blob): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onloadend = () => resolve(reader.result as string);\r\n reader.onerror = reject;\r\n reader.readAsDataURL(blob);\r\n });\r\n}\r\n\r\nfunction base64ToBlob(dataURL: string): Blob {\r\n const [header, data] = dataURL.split(',');\r\n const mime = header.match(/:(.*?);/)?.[1] ?? 'application/octet-stream';\r\n const binary = atob(data);\r\n const bytes = new Uint8Array(binary.length);\r\n for (let i = 0; i < binary.length; i++) {\r\n bytes[i] = binary.charCodeAt(i);\r\n }\r\n return new Blob([bytes], { type: mime });\r\n}\r\n\r\nfunction isQuotaError(err: unknown): boolean {\r\n return (\r\n err instanceof DOMException &&\r\n (err.name === 'QuotaExceededError' ||\r\n err.code === 22 ||\r\n err.code === 1014)\r\n );\r\n}\r\n","import type {\r\n ProjectConfig,\r\n ProjectType,\r\n Framework,\r\n ResolvedProject,\r\n} from '../types';\r\nimport { EntryPointError } from '../errors';\r\n\r\n// ─── Constants ─────────────────────────────────────────────────\r\n\r\n/** HTML entry points checked in order of priority. */\r\nconst HTML_ENTRY_CANDIDATES = [\r\n 'index.html',\r\n 'public/index.html',\r\n 'src/index.html',\r\n];\r\n\r\n/** JS/TS entry points checked in order of priority (for shell generation). */\r\nconst JS_ENTRY_CANDIDATES = [\r\n 'src/main.jsx',\r\n 'src/main.tsx',\r\n 'src/main.js',\r\n 'src/main.ts',\r\n 'src/index.jsx',\r\n 'src/index.tsx',\r\n 'src/index.js',\r\n 'src/index.ts',\r\n 'src/App.jsx',\r\n 'src/App.tsx',\r\n 'src/App.js',\r\n 'src/App.ts',\r\n 'index.js',\r\n 'index.ts',\r\n 'index.jsx',\r\n 'index.tsx',\r\n];\r\n\r\n/** Regex to detect bare (non-relative, non-URL) import specifiers. */\r\nconst BARE_IMPORT_RE = /(?:^|\\n)\\s*import\\s+[\\s\\S]*?from\\s*['\"]([^./'\"][^'\"]*)['\"]/;\r\n\r\n/** Node built-in modules (top-level names). */\r\nconst NODE_BUILTINS = new Set([\r\n 'assert', 'buffer', 'child_process', 'cluster', 'crypto', 'dgram',\r\n 'dns', 'events', 'fs', 'http', 'http2', 'https', 'net', 'os',\r\n 'path', 'perf_hooks', 'process', 'querystring', 'readline',\r\n 'stream', 'string_decoder', 'tls', 'tty', 'url', 'util', 'v8',\r\n 'vm', 'worker_threads', 'zlib',\r\n]);\r\n\r\n// ─── Analyzer ──────────────────────────────────────────────────\r\n\r\n/**\r\n * Analyse a resolved project and determine its type, entry point,\r\n * framework, and other metadata.\r\n *\r\n * If `overrideType` or `overrideEntry` are provided they take\r\n * priority over automatic detection.\r\n */\r\nexport function analyzeProject(\r\n project: ResolvedProject,\r\n overrideType?: ProjectType,\r\n overrideEntry?: string,\r\n): ProjectConfig {\r\n const { files } = project;\r\n\r\n // ─── Parse package.json (if present) ─────────────────────\r\n let dependencies: Record<string, string> = {};\r\n let devDependencies: Record<string, string> = {};\r\n const pkgRaw = files.get('package.json');\r\n\r\n if (pkgRaw) {\r\n try {\r\n const pkg = JSON.parse(pkgRaw);\r\n dependencies = pkg.dependencies ?? {};\r\n devDependencies = pkg.devDependencies ?? {};\r\n } catch {\r\n // malformed package.json — continue with empty deps\r\n }\r\n }\r\n\r\n const allDeps = { ...devDependencies, ...dependencies };\r\n\r\n // ─── Detect framework ────────────────────────────────────\r\n let framework: Framework = 'none';\r\n if ('react' in dependencies || 'react-dom' in dependencies) {\r\n framework = 'react';\r\n } else if ('preact' in dependencies) {\r\n framework = 'preact';\r\n } else if ('solid-js' in dependencies) {\r\n framework = 'solid';\r\n }\r\n\r\n // ─── Detect JSX / TypeScript presence ────────────────────\r\n const paths = Array.from(files.keys());\r\n const hasJSX = paths.some((p) => p.endsWith('.jsx') || p.endsWith('.tsx'));\r\n const hasTypeScript =\r\n paths.some((p) => p.endsWith('.ts') || p.endsWith('.tsx')) ||\r\n 'typescript' in allDeps;\r\n\r\n // ─── Detect Vite ─────────────────────────────────────────\r\n const hasViteConfig = paths.some((p) =>\r\n /^vite\\.config\\.(js|ts|mjs|mts)$/.test(p),\r\n );\r\n const hasViteDep = 'vite' in allDeps;\r\n const isVite = hasViteConfig || hasViteDep;\r\n\r\n // ─── Find HTML entry point ───────────────────────────────\r\n let htmlEntry: string | null = overrideEntry ?? null;\r\n\r\n if (!htmlEntry) {\r\n for (const candidate of HTML_ENTRY_CANDIDATES) {\r\n if (files.has(candidate)) {\r\n htmlEntry = candidate;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // If no standard candidate, look for any lone .html file at root\r\n if (!htmlEntry) {\r\n const rootHtmlFiles = paths.filter(\r\n (p) => !p.includes('/') && p.endsWith('.html'),\r\n );\r\n if (rootHtmlFiles.length === 1) {\r\n htmlEntry = rootHtmlFiles[0];\r\n }\r\n }\r\n\r\n // ─── Find JS entry point (for shell generation) ──────────\r\n let jsEntry: string | undefined;\r\n for (const candidate of JS_ENTRY_CANDIDATES) {\r\n if (files.has(candidate)) {\r\n jsEntry = candidate;\r\n break;\r\n }\r\n }\r\n\r\n // If we have an HTML entry, try extracting the <script src> from it\r\n if (htmlEntry && !jsEntry) {\r\n const htmlContent = files.get(htmlEntry);\r\n if (htmlContent) {\r\n const scriptMatch = htmlContent.match(\r\n /<script[^>]+src=[\"']([^\"']+)[\"']/,\r\n );\r\n if (scriptMatch) {\r\n let src = scriptMatch[1];\r\n // Vite uses root-relative paths like /src/main.tsx — strip leading /\r\n if (src.startsWith('/')) {\r\n src = src.slice(1);\r\n }\r\n jsEntry = src;\r\n }\r\n }\r\n }\r\n\r\n // No entry point at all → error\r\n if (!htmlEntry && !jsEntry) {\r\n throw new EntryPointError();\r\n }\r\n\r\n // If no HTML entry but we have a JS entry, we'll generate a shell\r\n // Use a synthetic path that the assembler will recognise\r\n if (!htmlEntry) {\r\n htmlEntry = '__generated__/index.html';\r\n }\r\n\r\n // ─── Classify project type ───────────────────────────────\r\n let type: ProjectType = overrideType ?? detectProjectType({\r\n hasPkg: !!pkgRaw,\r\n hasJSX,\r\n hasTypeScript,\r\n hasBareImports: hasBareImports(files),\r\n isVite,\r\n });\r\n\r\n return {\r\n type,\r\n entryPoint: htmlEntry,\r\n dependencies,\r\n framework,\r\n hasJSX,\r\n hasTypeScript,\r\n jsEntryPoint: jsEntry,\r\n isVite,\r\n };\r\n}\r\n\r\n// ─── Helpers ───────────────────────────────────────────────────\r\n\r\ninterface DetectInput {\r\n hasPkg: boolean;\r\n hasJSX: boolean;\r\n hasTypeScript: boolean;\r\n hasBareImports: boolean;\r\n isVite: boolean;\r\n}\r\n\r\nfunction detectProjectType(input: DetectInput): ProjectType {\r\n const { hasPkg, hasJSX, hasTypeScript, hasBareImports, isVite } = input;\r\n\r\n // Vite projects are always treated as 'vite' type regardless of JSX/TS\r\n if (isVite) return 'vite';\r\n\r\n if (hasJSX && hasTypeScript) return 'jsx-typescript';\r\n if (hasJSX) return 'jsx';\r\n if (hasTypeScript) return 'typescript';\r\n if (hasPkg || hasBareImports) return 'static-esm';\r\n return 'static';\r\n}\r\n\r\n/**\r\n * Scan all JS/TS files for bare import specifiers\r\n * (not starting with `.` or `/` or `http`).\r\n */\r\nfunction hasBareImports(files: Map<string, string>): boolean {\r\n for (const [path, content] of files) {\r\n if (/\\.(js|ts|jsx|tsx|mjs)$/.test(path)) {\r\n if (BARE_IMPORT_RE.test(content)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nexport { NODE_BUILTINS };\r\n","import type { DioramaError } from '../errors';\r\nimport type { FrameStyle, LoadingStrategy } from '../types';\r\n\r\n// ─── Types ─────────────────────────────────────────────────────\r\n\r\nexport interface SandboxOptions {\r\n /** CSS selector or DOM element to render into. */\r\n container: string | HTMLElement;\r\n /** Assembled HTML string. */\r\n html: string;\r\n /** CSS height for the iframe. Default: `'500px'`. */\r\n height?: string;\r\n /** Iframe sandbox flags. Default: `['allow-scripts']`. */\r\n sandboxFlags?: string[];\r\n /** Loading strategy. Default: `'eager'`. */\r\n loading?: LoadingStrategy;\r\n /** Decorative frame style wrapping the iframe. Default: `'none'`. */\r\n frame?: FrameStyle;\r\n /** Enable click-to-expand fullscreen lightbox. Default: `false`. */\r\n expand?: boolean;\r\n /** Placeholder image URL for click/viewport loading. */\r\n placeholder?: string;\r\n /** Repository display name (used in default placeholder card). */\r\n repoName?: string;\r\n /** Whether the project uses ES modules (use Blob URL instead of srcdoc). */\r\n useBlobURL?: boolean;\r\n /** Called when the iframe has loaded. */\r\n onLoad?: () => void;\r\n /** Called on error. */\r\n onError?: (error: DioramaError) => void;\r\n}\r\n\r\nexport interface SandboxInstance {\r\n /** Remove iframe, revoke Blob URLs, detach observers. */\r\n destroy(): void;\r\n /** Replace content with new HTML and re-render. */\r\n update(html: string): void;\r\n}\r\n\r\n// ─── Error HTML template ───────────────────────────────────────\r\n\r\nexport function buildErrorHTML(message: string): string {\r\n return `<!DOCTYPE html>\r\n<html>\r\n<head><meta charset=\"UTF-8\"></head>\r\n<body style=\"margin:0;font-family:system-ui,-apple-system,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;background:#fef2f2;\">\r\n <div style=\"max-width:540px;padding:32px;text-align:center;\">\r\n <h2 style=\"margin:0 0 12px;color:#dc2626;font-size:20px;\">Diorama: Render error</h2>\r\n <p style=\"margin:0 0 16px;color:#333;font-size:15px;line-height:1.5;\">${escapeHTML(message)}</p>\r\n <p style=\"margin:0;color:#888;font-size:13px;\">\r\n This project may use features not supported by Diorama.\r\n <a href=\"https://github.com/becca/diorama#supported-projects\" target=\"_blank\" rel=\"noopener\" style=\"color:#2563eb;\">Learn more</a>\r\n </p>\r\n </div>\r\n</body>\r\n</html>`;\r\n}\r\n\r\n// ─── Sandbox Manager ───────────────────────────────────────────\r\n\r\n/**\r\n * Create a sandboxed iframe and inject the assembled HTML.\r\n * Returns a handle for cleanup / updates.\r\n */\r\nexport function createSandbox(options: SandboxOptions): SandboxInstance {\r\n const {\r\n container,\r\n html,\r\n height = '500px',\r\n sandboxFlags = ['allow-scripts'],\r\n loading = 'eager',\r\n frame = 'none',\r\n expand = false,\r\n placeholder,\r\n repoName,\r\n useBlobURL = false,\r\n onLoad,\r\n onError,\r\n } = options;\r\n\r\n // Resolve container element\r\n const maybeEl =\r\n typeof container === 'string'\r\n ? document.querySelector<HTMLElement>(container)\r\n : container;\r\n\r\n if (!maybeEl) {\r\n throw new Error(\r\n `Diorama: container \"${typeof container === 'string' ? container : 'element'}\" not found in the DOM.`,\r\n );\r\n }\r\n\r\n // Guaranteed non-null after the check above\r\n const el: HTMLElement = maybeEl;\r\n\r\n // State\r\n let blobURL: string | null = null;\r\n let iframe: HTMLIFrameElement | null = null;\r\n let observer: IntersectionObserver | null = null;\r\n let destroyed = false;\r\n\r\n // Expand state\r\n let isExpanded = false;\r\n let backdrop: HTMLElement | null = null;\r\n let expandBtn: HTMLButtonElement | null = null;\r\n let expandEscHandler: ((e: KeyboardEvent) => void) | null = null;\r\n\r\n // ─── Build the iframe ──────────────────────────────────────\r\n\r\n function buildIframe(content: string): HTMLIFrameElement {\r\n const frame = document.createElement('iframe');\r\n frame.setAttribute('sandbox', sandboxFlags.join(' '));\r\n frame.setAttribute('loading', 'lazy');\r\n frame.setAttribute('aria-label', repoName ? `Preview of ${repoName}` : 'Diorama project preview');\r\n frame.style.width = '100%';\r\n frame.style.height = height;\r\n frame.style.border = 'none';\r\n frame.style.display = 'block';\r\n\r\n if (useBlobURL) {\r\n const blob = new Blob([content], { type: 'text/html' });\r\n blobURL = URL.createObjectURL(blob);\r\n frame.src = blobURL;\r\n } else {\r\n frame.srcdoc = content;\r\n }\r\n\r\n frame.addEventListener('load', () => {\r\n onLoad?.();\r\n });\r\n\r\n return frame;\r\n }\r\n\r\n // ─── Placeholder ───────────────────────────────────────────\r\n\r\n function buildPlaceholder(onClick: () => void): HTMLElement {\r\n const wrapper = document.createElement('div');\r\n wrapper.style.position = 'relative';\r\n wrapper.style.width = '100%';\r\n wrapper.style.height = height;\r\n wrapper.style.cursor = 'pointer';\r\n wrapper.style.overflow = 'hidden';\r\n wrapper.style.borderRadius = '8px';\r\n wrapper.style.background = '#f3f4f6';\r\n wrapper.style.display = 'flex';\r\n wrapper.style.alignItems = 'center';\r\n wrapper.style.justifyContent = 'center';\r\n wrapper.setAttribute('role', 'button');\r\n wrapper.setAttribute('tabindex', '0');\r\n wrapper.setAttribute('aria-label', 'Launch project preview');\r\n\r\n if (placeholder) {\r\n const img = document.createElement('img');\r\n img.src = placeholder;\r\n img.alt = repoName ? `Preview of ${repoName}` : 'Project preview';\r\n img.style.width = '100%';\r\n img.style.height = '100%';\r\n img.style.objectFit = 'cover';\r\n wrapper.appendChild(img);\r\n }\r\n\r\n // Overlay play button\r\n const overlay = document.createElement('div');\r\n overlay.style.position = 'absolute';\r\n overlay.style.inset = '0';\r\n overlay.style.display = 'flex';\r\n overlay.style.flexDirection = 'column';\r\n overlay.style.alignItems = 'center';\r\n overlay.style.justifyContent = 'center';\r\n overlay.style.background = placeholder ? 'rgba(0,0,0,0.35)' : 'transparent';\r\n\r\n const playBtn = document.createElement('div');\r\n playBtn.innerHTML = `<svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\"><circle cx=\"24\" cy=\"24\" r=\"24\" fill=\"rgba(0,0,0,0.5)\"/><polygon points=\"19,14 19,34 36,24\" fill=\"white\"/></svg>`;\r\n overlay.appendChild(playBtn);\r\n\r\n if (repoName && !placeholder) {\r\n const label = document.createElement('div');\r\n label.textContent = repoName;\r\n label.style.marginTop = '12px';\r\n label.style.fontSize = '15px';\r\n label.style.fontFamily = 'system-ui, sans-serif';\r\n label.style.color = '#374151';\r\n label.style.fontWeight = '500';\r\n overlay.appendChild(label);\r\n }\r\n\r\n const hint = document.createElement('div');\r\n hint.textContent = 'Click to launch preview';\r\n hint.style.marginTop = '8px';\r\n hint.style.fontSize = '13px';\r\n hint.style.fontFamily = 'system-ui, sans-serif';\r\n hint.style.color = placeholder ? 'rgba(255,255,255,0.85)' : '#6b7280';\r\n overlay.appendChild(hint);\r\n\r\n wrapper.appendChild(overlay);\r\n\r\n wrapper.addEventListener('click', onClick);\r\n wrapper.addEventListener('keydown', (e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n onClick();\r\n }\r\n });\r\n\r\n return wrapper;\r\n }\r\n\r\n // ─── Loading strategies ────────────────────────────────────\r\n\r\n function renderIframe(content: string): void {\r\n if (destroyed) return;\r\n el.innerHTML = '';\r\n iframe = buildIframe(content);\r\n\r\n if (frame !== 'none') {\r\n const wrapper = buildFrame(iframe, frame, repoName);\r\n el.appendChild(wrapper);\r\n } else {\r\n el.appendChild(iframe);\r\n }\r\n\r\n if (expand) attachExpandButton();\r\n }\r\n\r\n function setupEager(): void {\r\n renderIframe(html);\r\n }\r\n\r\n function setupClick(): void {\r\n const placeholderEl = buildPlaceholder(() => {\r\n renderIframe(html);\r\n });\r\n el.innerHTML = '';\r\n el.appendChild(placeholderEl);\r\n }\r\n\r\n function setupViewport(): void {\r\n // Show placeholder immediately\r\n const placeholderEl = buildPlaceholder(() => {\r\n renderIframe(html);\r\n observer?.disconnect();\r\n observer = null;\r\n });\r\n el.innerHTML = '';\r\n el.appendChild(placeholderEl);\r\n\r\n // Also auto-trigger when scrolled into view\r\n observer = new IntersectionObserver(\r\n (entries) => {\r\n for (const entry of entries) {\r\n if (entry.isIntersecting) {\r\n renderIframe(html);\r\n observer?.disconnect();\r\n observer = null;\r\n break;\r\n }\r\n }\r\n },\r\n { threshold: 0.1 },\r\n );\r\n observer.observe(el);\r\n }\r\n\r\n // ─── Expand ────────────────────────────────────────────────\r\n\r\n function expandDiorama(): void {\r\n if (isExpanded || destroyed) return;\r\n isExpanded = true;\r\n injectExpandStyles();\r\n\r\n backdrop = document.createElement('div');\r\n backdrop.className = 'diorama-expand-backdrop';\r\n backdrop.setAttribute('aria-label', 'Close expanded preview');\r\n backdrop.addEventListener('click', collapseDiorama);\r\n document.body.appendChild(backdrop);\r\n\r\n el.classList.add('diorama-expanded');\r\n\r\n expandEscHandler = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') collapseDiorama();\r\n };\r\n document.addEventListener('keydown', expandEscHandler);\r\n }\r\n\r\n function collapseDiorama(): void {\r\n if (!isExpanded) return;\r\n isExpanded = false;\r\n\r\n backdrop?.remove();\r\n backdrop = null;\r\n\r\n el.classList.remove('diorama-expanded');\r\n\r\n if (expandEscHandler) {\r\n document.removeEventListener('keydown', expandEscHandler);\r\n expandEscHandler = null;\r\n }\r\n }\r\n\r\n function attachExpandButton(): void {\r\n injectExpandStyles();\r\n el.classList.add('diorama-expandable');\r\n\r\n expandBtn?.remove();\r\n expandBtn = document.createElement('button');\r\n expandBtn.className = 'diorama-expand-btn';\r\n expandBtn.setAttribute('aria-label', 'Expand preview');\r\n expandBtn.innerHTML = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"><polyline points=\"10,2 14,2 14,6\"/><polyline points=\"6,14 2,14 2,10\"/><line x1=\"14\" y1=\"2\" x2=\"9\" y2=\"7\"/><line x1=\"2\" y1=\"14\" x2=\"7\" y2=\"9\"/></svg>';\r\n expandBtn.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n if (!isExpanded) expandDiorama();\r\n });\r\n el.appendChild(expandBtn);\r\n }\r\n\r\n // ─── Init ──────────────────────────────────────────────────\r\n\r\n try {\r\n switch (loading) {\r\n case 'click':\r\n setupClick();\r\n break;\r\n case 'viewport':\r\n setupViewport();\r\n break;\r\n case 'eager':\r\n default:\r\n setupEager();\r\n break;\r\n }\r\n } catch (err) {\r\n onError?.(err as DioramaError);\r\n }\r\n\r\n // ─── Instance ──────────────────────────────────────────────\r\n\r\n return {\r\n destroy() {\r\n destroyed = true;\r\n collapseDiorama();\r\n expandBtn?.remove();\r\n expandBtn = null;\r\n if (blobURL) {\r\n URL.revokeObjectURL(blobURL);\r\n blobURL = null;\r\n }\r\n observer?.disconnect();\r\n observer = null;\r\n el.innerHTML = '';\r\n iframe = null;\r\n },\r\n\r\n update(newHTML: string) {\r\n if (destroyed) return;\r\n if (blobURL) {\r\n URL.revokeObjectURL(blobURL);\r\n blobURL = null;\r\n }\r\n if (iframe) {\r\n if (useBlobURL) {\r\n const blob = new Blob([newHTML], { type: 'text/html' });\r\n blobURL = URL.createObjectURL(blob);\r\n iframe.src = blobURL;\r\n } else {\r\n iframe.srcdoc = newHTML;\r\n }\r\n } else {\r\n // Iframe hasn't been created yet (click/viewport), render now\r\n renderIframe(newHTML);\r\n }\r\n },\r\n };\r\n}\r\n\r\n// ─── Frame builder ─────────────────────────────────────────────\r\n\r\n/**\r\n * Wrap an iframe element inside a decorative frame.\r\n * Returns the outer wrapper element with the iframe already appended.\r\n */\r\nfunction buildFrame(\r\n iframe: HTMLIFrameElement,\r\n style: Exclude<FrameStyle, 'none'>,\r\n repoName?: string,\r\n): HTMLElement {\r\n const wrapper = document.createElement('div');\r\n wrapper.className = `diorama-frame diorama-frame--${style}`;\r\n\r\n // Inject scoped styles (idempotent — only once per page)\r\n injectFrameStyles();\r\n\r\n switch (style) {\r\n case 'polaroid':\r\n return buildPolaroidFrame(wrapper, iframe, repoName);\r\n case 'museum':\r\n return buildMuseumFrame(wrapper, iframe);\r\n case 'standard':\r\n return buildStandardFrame(wrapper, iframe);\r\n case 'terminal':\r\n return buildTerminalFrame(wrapper, iframe, repoName);\r\n case 'postcard':\r\n return buildPostcardFrame(wrapper, iframe, repoName);\r\n case 'blueprint':\r\n return buildBlueprintFrame(wrapper, iframe, repoName);\r\n case 'browser':\r\n return buildBrowserFrame(wrapper, iframe, repoName);\r\n default:\r\n wrapper.appendChild(iframe);\r\n return wrapper;\r\n }\r\n}\r\n\r\n// ── Polaroid ────────────────────────────────────────────────────\r\n\r\nfunction buildPolaroidFrame(\r\n wrapper: HTMLElement,\r\n iframe: HTMLIFrameElement,\r\n repoName?: string,\r\n): HTMLElement {\r\n wrapper.appendChild(iframe);\r\n const caption = document.createElement('div');\r\n caption.className = 'diorama-polaroid-caption';\r\n caption.textContent = repoName || '';\r\n wrapper.appendChild(caption);\r\n return wrapper;\r\n}\r\n\r\n// ── Museum ──────────────────────────────────────────────────────\r\n\r\nfunction buildMuseumFrame(\r\n wrapper: HTMLElement,\r\n iframe: HTMLIFrameElement,\r\n): HTMLElement {\r\n // Inner mat\r\n const mat = document.createElement('div');\r\n mat.className = 'diorama-museum-mat';\r\n mat.appendChild(iframe);\r\n wrapper.appendChild(mat);\r\n return wrapper;\r\n}\r\n\r\n// ── Standard ────────────────────────────────────────────────────\r\n\r\nfunction buildStandardFrame(\r\n wrapper: HTMLElement,\r\n iframe: HTMLIFrameElement,\r\n): HTMLElement {\r\n wrapper.appendChild(iframe);\r\n return wrapper;\r\n}\r\n\r\n// ── Terminal ────────────────────────────────────────────────────\r\n\r\nfunction buildTerminalFrame(\r\n wrapper: HTMLElement,\r\n iframe: HTMLIFrameElement,\r\n repoName?: string,\r\n): HTMLElement {\r\n const titlebar = document.createElement('div');\r\n titlebar.className = 'diorama-terminal-bar';\r\n\r\n const dots = document.createElement('div');\r\n dots.className = 'diorama-terminal-dots';\r\n dots.innerHTML = '<i></i><i></i><i></i>';\r\n titlebar.appendChild(dots);\r\n\r\n const title = document.createElement('span');\r\n title.className = 'diorama-terminal-title';\r\n title.textContent = repoName || 'diorama';\r\n titlebar.appendChild(title);\r\n\r\n wrapper.appendChild(titlebar);\r\n wrapper.appendChild(iframe);\r\n return wrapper;\r\n}\r\n\r\n// ── Postcard ────────────────────────────────────────────────────\r\n\r\nfunction buildPostcardFrame(\r\n wrapper: HTMLElement,\r\n iframe: HTMLIFrameElement,\r\n repoName?: string,\r\n): HTMLElement {\r\n wrapper.appendChild(iframe);\r\n\r\n const stamp = document.createElement('div');\r\n stamp.className = 'diorama-postcard-stamp';\r\n stamp.innerHTML = `<span class=\"diorama-postcard-stamp-text\">📮</span>`;\r\n wrapper.appendChild(stamp);\r\n\r\n const postmark = document.createElement('div');\r\n postmark.className = 'diorama-postcard-mark';\r\n postmark.textContent = repoName || 'DIORAMA';\r\n wrapper.appendChild(postmark);\r\n\r\n return wrapper;\r\n}\r\n\r\n// ── Blueprint ───────────────────────────────────────────────────\r\n\r\nfunction buildBlueprintFrame(\r\n wrapper: HTMLElement,\r\n iframe: HTMLIFrameElement,\r\n repoName?: string,\r\n): HTMLElement {\r\n wrapper.appendChild(iframe);\r\n\r\n const label = document.createElement('div');\r\n label.className = 'diorama-blueprint-label';\r\n label.textContent = repoName ? `DRAWING: ${repoName.toUpperCase()}` : 'DRAWING: UNTITLED';\r\n wrapper.appendChild(label);\r\n\r\n return wrapper;\r\n}\r\n\r\n// ── Browser ─────────────────────────────────────────────────────\r\n\r\nfunction buildBrowserFrame(\r\n wrapper: HTMLElement,\r\n iframe: HTMLIFrameElement,\r\n repoName?: string,\r\n): HTMLElement {\r\n const bar = document.createElement('div');\r\n bar.className = 'diorama-browser-bar';\r\n\r\n const dots = document.createElement('div');\r\n dots.className = 'diorama-browser-dots';\r\n dots.innerHTML = '<i></i><i></i><i></i>';\r\n bar.appendChild(dots);\r\n\r\n const url = document.createElement('div');\r\n url.className = 'diorama-browser-url';\r\n url.textContent = repoName\r\n ? `https://${repoName.replace(/\\//g, '.').toLowerCase()}.github.io`\r\n : 'https://example.github.io';\r\n bar.appendChild(url);\r\n\r\n wrapper.appendChild(bar);\r\n wrapper.appendChild(iframe);\r\n return wrapper;\r\n}\r\n\r\n// ─── Frame CSS injection ───────────────────────────────────────\r\n\r\nlet stylesInjected = false;\r\n\r\nfunction injectFrameStyles(): void {\r\n if (stylesInjected) return;\r\n stylesInjected = true;\r\n\r\n const css = `\r\n/* ── Diorama Frame Styles ──────────────────────────────── */\r\n\r\n.diorama-frame {\r\n position: relative;\r\n display: inline-block;\r\n width: 100%;\r\n box-sizing: border-box;\r\n}\r\n.diorama-frame iframe {\r\n display: block;\r\n width: 100%;\r\n}\r\n\r\n/* ── Standard ─────────────────────────────────────────── */\r\n.diorama-frame--standard {\r\n border: 1px solid #d1d5db;\r\n border-radius: 8px;\r\n overflow: hidden;\r\n box-shadow:\r\n 0 1px 3px rgba(0,0,0,.06),\r\n 0 4px 12px rgba(0,0,0,.04);\r\n}\r\n\r\n/* ── Polaroid ─────────────────────────────────────────── */\r\n.diorama-frame--polaroid {\r\n background: #fff;\r\n padding: 12px 12px 0 12px;\r\n border-radius: 2px;\r\n box-shadow:\r\n 0 2px 8px rgba(0,0,0,.10),\r\n 0 8px 30px rgba(0,0,0,.08);\r\n transform: rotate(-1.2deg);\r\n}\r\n.diorama-frame--polaroid iframe {\r\n border-radius: 0;\r\n}\r\n.diorama-polaroid-caption {\r\n padding: 16px 4px 20px;\r\n text-align: center;\r\n font-family: 'Caveat', 'Segoe Print', 'Comic Sans MS', cursive;\r\n font-size: 1.05rem;\r\n color: #4b5563;\r\n letter-spacing: .3px;\r\n min-height: 24px;\r\n}\r\n\r\n/* ── Museum ───────────────────────────────────────────── */\r\n.diorama-frame--museum {\r\n --gold-light: #e8c96e;\r\n --gold-mid: #c9a23a;\r\n --gold-dark: #9e7a22;\r\n --gold-shadow: #7a5c18;\r\n\r\n padding: 18px;\r\n background:\r\n linear-gradient(145deg, var(--gold-light) 0%, var(--gold-mid) 30%, var(--gold-dark) 70%, var(--gold-shadow) 100%);\r\n border-radius: 3px;\r\n box-shadow:\r\n inset 0 2px 4px rgba(255,255,255,.35),\r\n inset 0 -2px 4px rgba(0,0,0,.25),\r\n 0 4px 20px rgba(0,0,0,.25),\r\n 0 8px 40px rgba(0,0,0,.15);\r\n border: 2px solid var(--gold-dark);\r\n}\r\n.diorama-frame--museum::before {\r\n content: '';\r\n position: absolute;\r\n inset: 6px;\r\n border: 1px solid rgba(255,255,255,.2);\r\n border-radius: 2px;\r\n pointer-events: none;\r\n}\r\n.diorama-frame--museum::after {\r\n content: '';\r\n position: absolute;\r\n inset: 10px;\r\n border: 1px solid rgba(0,0,0,.15);\r\n border-radius: 1px;\r\n pointer-events: none;\r\n}\r\n.diorama-museum-mat {\r\n background: #f5f0e8;\r\n padding: 10px;\r\n box-shadow: inset 0 1px 4px rgba(0,0,0,.1);\r\n}\r\n.diorama-museum-mat iframe {\r\n border-radius: 0;\r\n}\r\n\r\n/* ── Terminal ─────────────────────────────────────────── */\r\n.diorama-frame--terminal {\r\n background: #1e1e2e;\r\n border-radius: 10px;\r\n overflow: hidden;\r\n box-shadow:\r\n 0 4px 20px rgba(0,0,0,.3),\r\n 0 0 0 1px rgba(255,255,255,.06);\r\n}\r\n.diorama-terminal-bar {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 10px 14px;\r\n background: linear-gradient(180deg, #2a2a3d, #232336);\r\n border-bottom: 1px solid rgba(255,255,255,.06);\r\n user-select: none;\r\n}\r\n.diorama-terminal-dots {\r\n display: flex;\r\n gap: 6px;\r\n}\r\n.diorama-terminal-dots i {\r\n display: block;\r\n width: 12px;\r\n height: 12px;\r\n border-radius: 50%;\r\n}\r\n.diorama-terminal-dots i:nth-child(1) { background: #ff5f56; }\r\n.diorama-terminal-dots i:nth-child(2) { background: #ffbd2e; }\r\n.diorama-terminal-dots i:nth-child(3) { background: #27c93f; }\r\n.diorama-terminal-title {\r\n flex: 1;\r\n text-align: center;\r\n font-family: ui-monospace, 'SF Mono', 'Cascadia Code', Consolas, monospace;\r\n font-size: .75rem;\r\n color: rgba(255,255,255,.45);\r\n padding-right: 52px; /* offset for dots so title is visually centered */\r\n}\r\n\r\n/* ── Postcard ─────────────────────────────────────────── */\r\n.diorama-frame--postcard {\r\n background: #fdf8f0;\r\n padding: 14px;\r\n border-radius: 3px;\r\n box-shadow:\r\n 0 2px 6px rgba(0,0,0,.08),\r\n 0 6px 24px rgba(0,0,0,.06);\r\n border: 1px dashed #d4c5a9;\r\n transform: rotate(0.6deg);\r\n}\r\n.diorama-frame--postcard iframe {\r\n border-radius: 2px;\r\n}\r\n.diorama-postcard-stamp {\r\n position: absolute;\r\n top: 4px;\r\n right: 4px;\r\n width: 40px;\r\n height: 48px;\r\n background: #fff;\r\n border: 2px dashed #c9b894;\r\n border-radius: 2px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n transform: rotate(3deg);\r\n pointer-events: none;\r\n}\r\n.diorama-postcard-stamp-text {\r\n font-size: 22px;\r\n line-height: 1;\r\n}\r\n.diorama-postcard-mark {\r\n position: absolute;\r\n top: 18px;\r\n right: 52px;\r\n font-family: ui-monospace, 'Courier New', monospace;\r\n font-size: .55rem;\r\n font-weight: 700;\r\n letter-spacing: .1em;\r\n text-transform: uppercase;\r\n color: rgba(180,80,60,.35);\r\n border: 2px solid rgba(180,80,60,.25);\r\n border-radius: 50%;\r\n padding: 6px 8px;\r\n transform: rotate(-12deg);\r\n pointer-events: none;\r\n white-space: nowrap;\r\n max-width: 120px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n/* ── Blueprint ────────────────────────────────────────── */\r\n.diorama-frame--blueprint {\r\n background: #1a3a5c;\r\n padding: 16px;\r\n border-radius: 2px;\r\n box-shadow: 0 2px 12px rgba(0,0,0,.2);\r\n background-image:\r\n linear-gradient(rgba(255,255,255,.04) 1px, transparent 1px),\r\n linear-gradient(90deg, rgba(255,255,255,.04) 1px, transparent 1px);\r\n background-size: 20px 20px;\r\n}\r\n.diorama-frame--blueprint::before {\r\n content: '';\r\n position: absolute;\r\n inset: 8px;\r\n border: 1px solid rgba(255,255,255,.12);\r\n pointer-events: none;\r\n}\r\n.diorama-frame--blueprint iframe {\r\n border: 1px solid rgba(255,255,255,.15);\r\n}\r\n.diorama-blueprint-label {\r\n margin-top: 8px;\r\n font-family: ui-monospace, 'Courier New', monospace;\r\n font-size: .65rem;\r\n font-weight: 600;\r\n letter-spacing: .15em;\r\n text-transform: uppercase;\r\n color: rgba(255,255,255,.35);\r\n text-align: right;\r\n padding-right: 4px;\r\n}\r\n\r\n/* ── Browser ──────────────────────────────────────────── */\r\n.diorama-frame--browser {\r\n background: #f0ebe6;\r\n border-radius: 10px;\r\n overflow: hidden;\r\n box-shadow:\r\n 0 2px 8px rgba(0,0,0,.08),\r\n 0 8px 30px rgba(0,0,0,.06);\r\n border: 1px solid #d5ccc3;\r\n}\r\n.diorama-browser-bar {\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n padding: 8px 12px;\r\n background: linear-gradient(180deg, #f5f0eb, #ece7e1);\r\n border-bottom: 1px solid #d5ccc3;\r\n user-select: none;\r\n}\r\n.diorama-browser-dots {\r\n display: flex;\r\n gap: 6px;\r\n}\r\n.diorama-browser-dots i {\r\n display: block;\r\n width: 11px;\r\n height: 11px;\r\n border-radius: 50%;\r\n}\r\n.diorama-browser-dots i:nth-child(1) { background: #ed6a5e; }\r\n.diorama-browser-dots i:nth-child(2) { background: #f4bf4f; }\r\n.diorama-browser-dots i:nth-child(3) { background: #61c554; }\r\n.diorama-browser-url {\r\n flex: 1;\r\n font-family: ui-monospace, 'SF Mono', 'Cascadia Code', Consolas, monospace;\r\n font-size: .72rem;\r\n color: #7a7067;\r\n background: #fff;\r\n border: 1px solid #d5ccc3;\r\n border-radius: 5px;\r\n padding: 4px 12px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n`;\r\n\r\n const styleEl = document.createElement('style');\r\n styleEl.setAttribute('data-diorama-frames', '');\r\n styleEl.textContent = css;\r\n document.head.appendChild(styleEl);\r\n}\r\n\r\n// ─── Utility ───────────────────────────────────────────────────\r\n\r\nfunction escapeHTML(str: string): string {\r\n return str\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"');\r\n}\r\n\r\n// ─── Expand CSS injection ──────────────────────────────────────\r\n\r\nlet expandStylesInjected = false;\r\n\r\nfunction injectExpandStyles(): void {\r\n if (expandStylesInjected) return;\r\n expandStylesInjected = true;\r\n\r\n const css = `\r\n/* ── Diorama Expand Styles ─────────────────────────────── */\r\n\r\n.diorama-expandable {\r\n position: relative;\r\n}\r\n\r\n.diorama-expand-btn {\r\n position: absolute;\r\n top: 8px;\r\n right: 8px;\r\n width: 32px;\r\n height: 32px;\r\n border-radius: 6px;\r\n background: rgba(0, 0, 0, 0.55);\r\n border: 1px solid rgba(255, 255, 255, 0.15);\r\n cursor: zoom-in;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n opacity: 0;\r\n transition: opacity 0.15s ease, background 0.15s ease;\r\n z-index: 10;\r\n color: #fff;\r\n padding: 0;\r\n line-height: 1;\r\n}\r\n.diorama-expandable:hover .diorama-expand-btn,\r\n.diorama-expand-btn:focus-visible {\r\n opacity: 1;\r\n}\r\n.diorama-expand-btn:hover {\r\n background: rgba(0, 0, 0, 0.75);\r\n}\r\n\r\n.diorama-expand-backdrop {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 9998;\r\n background: rgba(0, 0, 0, 0.45);\r\n backdrop-filter: blur(8px);\r\n -webkit-backdrop-filter: blur(8px);\r\n cursor: zoom-out;\r\n animation: diorama-fade-in 0.2s ease;\r\n}\r\n\r\n@keyframes diorama-fade-in {\r\n from { opacity: 0; }\r\n to { opacity: 1; }\r\n}\r\n\r\n.diorama-expanded {\r\n position: fixed !important;\r\n top: 3vh !important;\r\n left: 3vw !important;\r\n width: 94vw !important;\r\n height: 94vh !important;\r\n z-index: 9999 !important;\r\n display: flex !important;\r\n flex-direction: column !important;\r\n animation: diorama-expand-in 0.25s ease;\r\n}\r\n\r\n@keyframes diorama-expand-in {\r\n from { opacity: 0.85; transform: scale(0.97); }\r\n to { opacity: 1; transform: scale(1); }\r\n}\r\n\r\n.diorama-expanded .diorama-expand-btn {\r\n display: none;\r\n}\r\n\r\n.diorama-expanded > .diorama-frame {\r\n flex: 1 1 0 !important;\r\n width: 100% !important;\r\n display: flex !important;\r\n flex-direction: column !important;\r\n max-height: 100% !important;\r\n}\r\n\r\n.diorama-expanded > iframe,\r\n.diorama-expanded .diorama-frame iframe {\r\n flex: 1 1 0 !important;\r\n height: auto !important;\r\n min-height: 0 !important;\r\n}\r\n\r\n/* ── Slim down frames when expanded (keep identity, reduce bulk) */\r\n\r\n.diorama-expanded > .diorama-frame {\r\n overflow: hidden !important;\r\n}\r\n\r\n/* Museum: thin gold border instead of chunky gilded frame */\r\n.diorama-expanded > .diorama-frame--museum {\r\n padding: 5px !important;\r\n border-radius: 6px !important;\r\n box-shadow:\r\n inset 0 1px 2px rgba(255,255,255,.25),\r\n 0 4px 24px rgba(0,0,0,.18) !important;\r\n}\r\n.diorama-expanded > .diorama-frame--museum::before {\r\n inset: 2px !important;\r\n}\r\n.diorama-expanded > .diorama-frame--museum::after {\r\n display: none !important;\r\n}\r\n.diorama-expanded .diorama-museum-mat {\r\n padding: 3px !important;\r\n flex: 1 1 0;\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n.diorama-expanded .diorama-museum-mat iframe {\r\n flex: 1 1 0 !important;\r\n}\r\n\r\n/* Polaroid: slim white border, compact caption */\r\n.diorama-expanded > .diorama-frame--polaroid {\r\n padding: 6px 6px 0 6px !important;\r\n border-radius: 6px !important;\r\n box-shadow: 0 4px 24px rgba(0,0,0,.14) !important;\r\n}\r\n.diorama-expanded .diorama-polaroid-caption {\r\n padding: 6px 10px !important;\r\n font-size: .8rem !important;\r\n min-height: auto !important;\r\n}\r\n\r\n/* Standard: just tighten padding */\r\n.diorama-expanded > .diorama-frame--standard {\r\n padding: 5px !important;\r\n border-radius: 6px !important;\r\n}\r\n\r\n/* Postcard: slim border, shrink stamp + postmark */\r\n.diorama-expanded > .diorama-frame--postcard {\r\n padding: 5px !important;\r\n border-radius: 6px !important;\r\n box-shadow: 0 4px 24px rgba(0,0,0,.14) !important;\r\n}\r\n.diorama-expanded .diorama-postcard-stamp {\r\n width: 28px !important;\r\n height: 34px !important;\r\n top: -2px !important;\r\n right: 2px !important;\r\n}\r\n.diorama-expanded .diorama-postcard-mark {\r\n font-size: .45rem !important;\r\n padding: 4px 5px !important;\r\n top: 8px !important;\r\n right: 36px !important;\r\n}\r\n\r\n/* Blueprint: slim border, shrink label */\r\n.diorama-expanded > .diorama-frame--blueprint {\r\n padding: 5px !important;\r\n border-radius: 6px !important;\r\n box-shadow: 0 4px 24px rgba(0,0,0,.18) !important;\r\n}\r\n.diorama-expanded > .diorama-frame--blueprint::before {\r\n inset: 2px !important;\r\n}\r\n.diorama-expanded .diorama-blueprint-label {\r\n margin-top: 4px !important;\r\n font-size: .55rem !important;\r\n}\r\n\r\n/* Terminal / Browser: already slim — just round corners */\r\n.diorama-expanded > .diorama-frame--terminal,\r\n.diorama-expanded > .diorama-frame--browser {\r\n border-radius: 10px !important;\r\n box-shadow: 0 4px 24px rgba(0,0,0,.2) !important;\r\n}\r\n`;\r\n\r\n const styleEl = document.createElement('style');\r\n styleEl.setAttribute('data-diorama-expand', '');\r\n styleEl.textContent = css;\r\n document.head.appendChild(styleEl);\r\n}\r\n","import type { CDNProvider, CDNProviderName } from '../types';\r\nimport { NodeBuiltinError } from '../errors';\r\nimport { NODE_BUILTINS } from '../core/analyzer';\r\n\r\n// ─── CDN Providers ─────────────────────────────────────────────\r\n\r\nconst esmShProvider: CDNProvider = {\r\n buildURL(name, version, subpath) {\r\n const ver = version ? `@${version}` : '';\r\n const sub = subpath ? `/${subpath}` : '';\r\n return `https://esm.sh/${name}${ver}${sub}`;\r\n },\r\n};\r\n\r\nconst skypackProvider: CDNProvider = {\r\n buildURL(name, version, subpath) {\r\n const ver = version ? `@${version}` : '';\r\n const sub = subpath ? `/${subpath}` : '';\r\n return `https://cdn.skypack.dev/${name}${ver}${sub}`;\r\n },\r\n};\r\n\r\nconst unpkgProvider: CDNProvider = {\r\n buildURL(name, version, subpath) {\r\n const ver = version ? `@${version}` : '';\r\n const sub = subpath ? `/${subpath}` : '';\r\n return `https://unpkg.com/${name}${ver}${sub}?module`;\r\n },\r\n};\r\n\r\nexport function getCDNProvider(name: CDNProviderName): CDNProvider {\r\n switch (name) {\r\n case 'skypack': return skypackProvider;\r\n case 'unpkg': return unpkgProvider;\r\n case 'esm.sh':\r\n default: return esmShProvider;\r\n }\r\n}\r\n\r\n// ─── Import rewriting ──────────────────────────────────────────\r\n\r\n/** Options for import rewriting. */\r\nexport interface RewriteOptions {\r\n /** Package name → version from package.json. */\r\n dependencies?: Record<string, string>;\r\n /** CDN provider to use. Default: `'esm.sh'`. */\r\n cdnProvider?: CDNProviderName;\r\n /** Framework for esm.sh-specific `?deps` hints. */\r\n framework?: 'react' | 'preact' | 'solid' | 'none';\r\n /** React version (for `?deps` hint). */\r\n reactVersion?: string;\r\n /** Whether the project uses Vite (enables import.meta.env rewriting). */\r\n isVite?: boolean;\r\n}\r\n\r\n/**\r\n * Rewrite bare npm imports in source code to CDN URLs.\r\n *\r\n * **What gets rewritten:**\r\n * - `import x from 'pkg'`\r\n * - `import { x } from 'pkg/sub'`\r\n * - `import * as x from 'pkg'`\r\n * - `export { x } from 'pkg'`\r\n * - `export * from 'pkg'`\r\n * - `import('pkg')`\r\n *\r\n * **What is left alone:**\r\n * - Relative: `'./foo'`, `'../bar'`\r\n * - Absolute URLs: `'https://...'`\r\n */\r\nexport function rewriteImports(\r\n source: string,\r\n options: RewriteOptions = {},\r\n): string {\r\n const {\r\n dependencies = {},\r\n cdnProvider = 'esm.sh',\r\n framework = 'none',\r\n reactVersion,\r\n isVite = false,\r\n } = options;\r\n\r\n const provider = getCDNProvider(cdnProvider);\r\n\r\n function rewriteSpecifier(raw: string): string {\r\n // Skip relative and absolute-URL specifiers\r\n if (raw.startsWith('.') || raw.startsWith('/') || /^https?:\\/\\//.test(raw)) {\r\n return raw;\r\n }\r\n\r\n // Parse scoped and deep imports\r\n const { packageName, subpath } = parseSpecifier(raw);\r\n\r\n // Node built-in check\r\n if (NODE_BUILTINS.has(packageName) || NODE_BUILTINS.has(packageName.replace('node:', ''))) {\r\n throw new NodeBuiltinError(packageName);\r\n }\r\n\r\n const version = dependencies[packageName];\r\n let url = provider.buildURL(packageName, version, subpath);\r\n\r\n // esm.sh-specific hints for React ecosystem\r\n if (cdnProvider === 'esm.sh' && reactVersion && (framework === 'react')) {\r\n // Append ?deps hint so all packages use the same React version\r\n if (packageName !== 'react' && packageName !== 'react-dom') {\r\n const sep = url.includes('?') ? '&' : '?';\r\n url += `${sep}deps=react@${reactVersion},react-dom@${reactVersion}`;\r\n }\r\n }\r\n\r\n return url;\r\n }\r\n\r\n let result = source;\r\n\r\n // Static imports: import ... from 'specifier'\r\n result = result.replace(\r\n /(import\\s+(?:[\\s\\S]*?)\\s+from\\s*['\"])([^'\"]+)(['\"])/g,\r\n (_match, pre: string, specifier: string, post: string) => {\r\n return `${pre}${rewriteSpecifier(specifier)}${post}`;\r\n },\r\n );\r\n\r\n // Side-effect imports: import 'specifier'\r\n // (Only rewrites imports NOT preceded by `from`, which are already handled)\r\n result = result.replace(\r\n /(?<!\\bfrom\\s*)(import\\s*['\"])([^'\"]+)(['\"])/g,\r\n (_m, pre: string, specifier: string, post: string) => {\r\n return `${pre}${rewriteSpecifier(specifier)}${post}`;\r\n },\r\n );\r\n\r\n // Dynamic imports: import('specifier')\r\n result = result.replace(\r\n /(import\\s*\\(\\s*['\"])([^'\"]+)(['\"]\\s*\\))/g,\r\n (_match, pre: string, specifier: string, post: string) => {\r\n return `${pre}${rewriteSpecifier(specifier)}${post}`;\r\n },\r\n );\r\n\r\n // Re-exports: export { ... } from 'specifier' / export * from 'specifier'\r\n result = result.replace(\r\n /(export\\s+(?:\\{[^}]*\\}|\\*)\\s+from\\s*['\"])([^'\"]+)(['\"])/g,\r\n (_match, pre: string, specifier: string, post: string) => {\r\n return `${pre}${rewriteSpecifier(specifier)}${post}`;\r\n },\r\n );\r\n\r\n // Vite import.meta.env inline replacements\r\n if (isVite) {\r\n result = result.replace(/\\bimport\\.meta\\.env\\.MODE\\b/g, '\"production\"');\r\n result = result.replace(/\\bimport\\.meta\\.env\\.BASE_URL\\b/g, '\"/\"');\r\n result = result.replace(/\\bimport\\.meta\\.env\\.PROD\\b/g, 'true');\r\n result = result.replace(/\\bimport\\.meta\\.env\\.DEV\\b/g, 'false');\r\n result = result.replace(/\\bimport\\.meta\\.env\\.SSR\\b/g, 'false');\r\n // Replace any remaining VITE_* env vars with empty string\r\n result = result.replace(/\\bimport\\.meta\\.env\\.VITE_\\w+\\b/g, '\"\"');\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// ─── Helpers ───────────────────────────────────────────────────\r\n\r\ninterface ParsedSpecifier {\r\n packageName: string;\r\n subpath?: string;\r\n}\r\n\r\n/**\r\n * Parse a bare specifier into package name + optional subpath.\r\n * Handles scoped packages (`@scope/name/sub`).\r\n */\r\nfunction parseSpecifier(raw: string): ParsedSpecifier {\r\n if (raw.startsWith('@')) {\r\n // Scoped: @scope/name or @scope/name/sub/path\r\n const parts = raw.split('/');\r\n const packageName = `${parts[0]}/${parts[1]}`;\r\n const subpath = parts.length > 2 ? parts.slice(2).join('/') : undefined;\r\n return { packageName, subpath };\r\n }\r\n\r\n const slashIndex = raw.indexOf('/');\r\n if (slashIndex === -1) {\r\n return { packageName: raw };\r\n }\r\n\r\n return {\r\n packageName: raw.slice(0, slashIndex),\r\n subpath: raw.slice(slashIndex + 1),\r\n };\r\n}\r\n","import { TranspileError, TranspilerLoadError } from '../errors';\r\nimport type { Framework } from '../types';\r\n\r\n// ─── Lazy-loaded esbuild reference ─────────────────────────────\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nlet esbuildModule: any = null;\r\nlet esbuildReady: Promise<void> | null = null;\r\n\r\n/** Default CDN base for esbuild-wasm (JS + WASM binary). */\r\nconst ESBUILD_CDN = 'https://esm.sh/esbuild-wasm@0.24.0';\r\n\r\n/**\r\n * Ensure esbuild-wasm is downloaded and initialized.\r\n * Only fetches the ~8 MB WASM binary on first call.\r\n *\r\n * The JS module is loaded from a CDN URL (not a bare specifier) so that\r\n * it works in every browser context — including Vite / Webpack dev\r\n * servers that would otherwise try to resolve `esbuild-wasm` through\r\n * their own module graphs and fail.\r\n */\r\nasync function ensureEsbuild(wasmURL?: string): Promise<void> {\r\n if (!esbuildReady) {\r\n esbuildReady = (async () => {\r\n try {\r\n // Dynamic import from CDN — avoids bundler/dev-server interception\r\n const mod = await import(/* @vite-ignore */ ESBUILD_CDN);\r\n // esm.sh may wrap the module — handle both `mod.default` and `mod`\r\n esbuildModule = mod.default ?? mod;\r\n\r\n const resolvedURL =\r\n wasmURL && wasmURL !== 'auto'\r\n ? wasmURL\r\n : `${ESBUILD_CDN}/esbuild.wasm`;\r\n\r\n await esbuildModule.initialize({ wasmURL: resolvedURL });\r\n } catch (err) {\r\n // Reset so a subsequent call can retry\r\n esbuildReady = null;\r\n esbuildModule = null;\r\n throw new TranspilerLoadError(\r\n err instanceof Error ? err.message : 'Failed to load esbuild-wasm.',\r\n );\r\n }\r\n })();\r\n }\r\n return esbuildReady;\r\n}\r\n\r\n// ─── Public API ────────────────────────────────────────────────\r\n\r\nexport interface TranspileOptions {\r\n /** File path (used for error messages and loader detection). */\r\n filePath: string;\r\n /** Source code to transform. */\r\n source: string;\r\n /** Detected framework — determines JSX transform settings. */\r\n framework?: Framework;\r\n /** Custom esbuild-wasm URL (or `'auto'`). */\r\n esbuildWasmURL?: string;\r\n}\r\n\r\nexport interface TranspileResult {\r\n /** Transpiled JavaScript code. */\r\n code: string;\r\n}\r\n\r\n/**\r\n * Transpile a single JSX / TSX / TS file to plain JavaScript\r\n * using esbuild-wasm.\r\n */\r\nexport async function transpileFile(options: TranspileOptions): Promise<TranspileResult> {\r\n const { filePath, source, framework = 'none', esbuildWasmURL } = options;\r\n\r\n await ensureEsbuild(esbuildWasmURL);\r\n\r\n const loader = loaderFor(filePath);\r\n const jsxConfig = jsxConfigFor(framework, loader);\r\n\r\n try {\r\n const result = await esbuildModule.transform(source, {\r\n loader,\r\n ...jsxConfig,\r\n target: 'es2022',\r\n format: 'esm',\r\n charset: 'utf8',\r\n });\r\n\r\n return { code: result.code as string };\r\n } catch (err: unknown) {\r\n // Extract structured error info from esbuild\r\n const msg = err instanceof Error ? err.message : String(err);\r\n // esbuild errors often contain \"ERROR: <message>\" with optional line/col info\r\n const lineMatch = msg.match(/:(\\d+):(\\d+):/);\r\n throw new TranspileError(\r\n msg,\r\n filePath,\r\n lineMatch ? parseInt(lineMatch[1], 10) : undefined,\r\n lineMatch ? parseInt(lineMatch[2], 10) : undefined,\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Transpile all files that need transpilation in a file map.\r\n * Returns a new Map with transpiled content replacing the originals.\r\n */\r\nexport async function transpileAll(\r\n files: Map<string, string>,\r\n framework: Framework = 'none',\r\n esbuildWasmURL?: string,\r\n): Promise<Map<string, string>> {\r\n const result = new Map(files);\r\n const toTranspile: Array<[string, string]> = [];\r\n\r\n for (const [path, content] of files) {\r\n if (needsTranspilation(path)) {\r\n toTranspile.push([path, content]);\r\n }\r\n }\r\n\r\n if (toTranspile.length === 0) return result;\r\n\r\n // Ensure esbuild is ready before starting parallel transforms\r\n await ensureEsbuild(esbuildWasmURL);\r\n\r\n // Transform all files in parallel\r\n const jobs = toTranspile.map(async ([path, content]) => {\r\n const transpiled = await transpileFile({\r\n filePath: path,\r\n source: content,\r\n framework,\r\n esbuildWasmURL,\r\n });\r\n return [path, transpiled.code] as const;\r\n });\r\n\r\n const results = await Promise.all(jobs);\r\n for (const [path, code] of results) {\r\n result.set(path, code);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// ─── Helpers ───────────────────────────────────────────────────\r\n\r\ntype Loader = 'tsx' | 'ts' | 'jsx' | 'js';\r\n\r\nfunction loaderFor(filePath: string): Loader {\r\n if (filePath.endsWith('.tsx')) return 'tsx';\r\n if (filePath.endsWith('.ts')) return 'ts';\r\n if (filePath.endsWith('.jsx')) return 'jsx';\r\n return 'js';\r\n}\r\n\r\nfunction jsxConfigFor(\r\n framework: Framework,\r\n loader: Loader,\r\n): Record<string, unknown> {\r\n // Only apply JSX config when the file may contain JSX\r\n if (loader !== 'tsx' && loader !== 'jsx') {\r\n return {};\r\n }\r\n\r\n switch (framework) {\r\n case 'react':\r\n return { jsx: 'automatic', jsxImportSource: 'react' };\r\n case 'preact':\r\n return { jsx: 'automatic', jsxImportSource: 'preact' };\r\n case 'solid':\r\n // Solid requires Babel plugin — esbuild can't do fine-grained reactivity.\r\n // Preserve JSX for now; in v2 we could pipe through Babel.\r\n return { jsx: 'automatic', jsxImportSource: 'react' };\r\n default:\r\n // Unknown framework — default to React-style automatic transform\r\n return { jsx: 'automatic', jsxImportSource: 'react' };\r\n }\r\n}\r\n\r\n/** Does this file path need to run through the transpiler? */\r\nexport function needsTranspilation(path: string): boolean {\r\n return /\\.(tsx?|jsx)$/.test(path);\r\n}\r\n\r\n/**\r\n * Returns the `process.env` shim that should be prepended to the\r\n * entry point of projects that may reference `process.env.NODE_ENV`.\r\n */\r\nexport function processEnvShim(): string {\r\n return `if(typeof globalThis.process==='undefined'){globalThis.process={env:{NODE_ENV:'production'}};}`;\r\n}\r\n\r\n/**\r\n * Returns an `import.meta.env` shim for Vite projects.\r\n * Provides the standard Vite env variables so that code referencing\r\n * `import.meta.env.MODE`, `import.meta.env.PROD`, etc. works at runtime.\r\n */\r\nexport function importMetaEnvShim(): string {\r\n return [\r\n `if(!import.meta.env){`,\r\n `Object.defineProperty(import.meta,'env',{value:{`,\r\n `MODE:'production',`,\r\n `BASE_URL:'/',`,\r\n `PROD:true,`,\r\n `DEV:false,`,\r\n `SSR:false`,\r\n `}});`,\r\n `}`,\r\n ].join('');\r\n}\r\n","import type { ProjectConfig, ResolvedProject } from '../types';\r\nimport { AssemblyError } from '../errors';\r\nimport { processEnvShim } from './transpiler';\r\n\r\n// ─── Constants ─────────────────────────────────────────────────\r\n\r\nconst SMALL_ASSET_LIMIT = 100_000; // 100 KB\r\n\r\n/** Extensions that can be base64-inlined. */\r\nconst INLINEABLE_EXTENSIONS = new Set([\r\n '.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico', '.webp',\r\n '.woff', '.woff2', '.ttf', '.eot', '.otf',\r\n]);\r\n\r\n/**\r\n * Prefix used for import-map keys.\r\n *\r\n * We use bare-specifier keys (`__diorama__/src/main.ts`) instead of\r\n * relative paths (`./src/main.ts`) so that imports between blob-URL\r\n * modules still resolve through the import map. Relative specifiers\r\n * inside a blob are resolved against the blob's opaque URL, which\r\n * never matches the page-relative import-map keys. Bare specifiers\r\n * are always looked up in the import map regardless of referrer.\r\n */\r\nconst IMPORT_MAP_PREFIX = '__diorama__/';\r\n\r\n/** Asset extensions that Vite supports as imports (import x from './img.png'). */\r\nconst ASSET_IMPORT_EXTENSIONS: Record<string, string> = {\r\n '.svg': 'image/svg+xml',\r\n '.png': 'image/png',\r\n '.jpg': 'image/jpeg',\r\n '.jpeg': 'image/jpeg',\r\n '.gif': 'image/gif',\r\n '.webp': 'image/webp',\r\n '.ico': 'image/x-icon',\r\n '.woff': 'font/woff',\r\n '.woff2': 'font/woff2',\r\n '.ttf': 'font/ttf',\r\n '.eot': 'application/vnd.ms-fontobject',\r\n '.otf': 'font/otf',\r\n};\r\n\r\n// ─── Public API ────────────────────────────────────────────────\r\n\r\nexport interface AssembleOptions {\r\n project: ResolvedProject;\r\n config: ProjectConfig;\r\n /**\r\n * The file map to use — may contain already-transpiled / rewritten content.\r\n * Falls back to `project.files` if not provided.\r\n */\r\n transformedFiles?: Map<string, string>;\r\n}\r\n\r\nexport interface AssembleResult {\r\n /** The fully assembled HTML string. */\r\n html: string;\r\n /** Whether the HTML uses import maps / Blob URL references. */\r\n usesESM: boolean;\r\n}\r\n\r\n/**\r\n * Build the final HTML document to be injected into the sandbox.\r\n */\r\nexport function assembleHTML(options: AssembleOptions): AssembleResult {\r\n const { project, config, transformedFiles } = options;\r\n const files = transformedFiles ?? project.files;\r\n\r\n switch (config.type) {\r\n case 'static':\r\n return assembleStatic(files, project, config);\r\n case 'static-esm':\r\n case 'jsx':\r\n case 'typescript':\r\n case 'jsx-typescript':\r\n case 'vite':\r\n return assembleESM(files, project, config);\r\n default:\r\n throw new AssemblyError(`Unsupported project type: ${config.type}`);\r\n }\r\n}\r\n\r\n// ─── Static assembly (Tier 1) ──────────────────────────────────\r\n\r\nfunction assembleStatic(\r\n files: Map<string, string>,\r\n project: ResolvedProject,\r\n config: ProjectConfig,\r\n): AssembleResult {\r\n let html = files.get(config.entryPoint);\r\n if (!html) {\r\n throw new AssemblyError(\r\n `Entry point \"${config.entryPoint}\" not found in the project files.`,\r\n );\r\n }\r\n\r\n // Inline local CSS (<link rel=\"stylesheet\" href=\"...\">)\r\n html = inlineLocalCSS(html, files, config.entryPoint);\r\n\r\n // Inline local JS (<script src=\"...\">)\r\n html = inlineLocalJS(html, files, config.entryPoint);\r\n\r\n // Rewrite local asset paths to data URLs\r\n html = inlineAssets(html, project, config.entryPoint);\r\n\r\n return { html, usesESM: false };\r\n}\r\n\r\n// ─── ESM assembly (Tier 2 & 3) ────────────────────────────────\r\n\r\nfunction assembleESM(\r\n files: Map<string, string>,\r\n project: ResolvedProject,\r\n config: ProjectConfig,\r\n): AssembleResult {\r\n const isGenerated = config.entryPoint === '__generated__/index.html';\r\n\r\n // ── Pre-process JS files before touching HTML ────────────\r\n // Rewrite asset imports (import logo from './assets/logo.svg') → inline data URLs\r\n rewriteAssetImports(files, project);\r\n\r\n // Collect all CSS imports from JS/TS files and inject as <style>\r\n const cssFromJS = extractCSSImports(files);\r\n\r\n // Inject import.meta.env shim into each JS module for Vite projects.\r\n // This must happen per-module because `import.meta` is scoped to\r\n // each module — a global `<script>` shim can't set it (and would\r\n // cause a SyntaxError since `import.meta` is only valid in modules).\r\n if (config.isVite) {\r\n injectImportMetaEnv(files);\r\n }\r\n\r\n // Build import map for relative imports between project files.\r\n // This must happen after asset/CSS rewrites so the blob URLs contain\r\n // the final code.\r\n const importMap = buildImportMap(files, config);\r\n\r\n // ── Build the HTML document ──────────────────────────────\r\n let html: string;\r\n\r\n if (isGenerated) {\r\n html = generateHTMLShell(files, config);\r\n } else {\r\n html = files.get(config.entryPoint) ?? '';\r\n if (!html) {\r\n throw new AssemblyError(\r\n `Entry point \"${config.entryPoint}\" not found in the project files.`,\r\n );\r\n }\r\n // Inline local CSS links\r\n html = inlineLocalCSS(html, files, config.entryPoint);\r\n // Replace <script src=\"...\"> with import-map-aware module loaders\r\n html = rewriteScriptSrcsToImportMap(html, config.entryPoint);\r\n // Inline local assets\r\n html = inlineAssets(html, project, config.entryPoint);\r\n }\r\n\r\n // Inject collected CSS from JS imports\r\n if (cssFromJS) {\r\n html = injectIntoHead(html, `<style>\\n${cssFromJS}\\n</style>`);\r\n }\r\n\r\n // Inject import map\r\n if (Object.keys(importMap).length > 0) {\r\n const importMapJSON = JSON.stringify({ imports: importMap }, null, 2);\r\n html = injectIntoHead(\r\n html,\r\n `<script type=\"importmap\">\\n${importMapJSON}\\n</script>`,\r\n );\r\n }\r\n\r\n // Inject process.env shim if this is a framework project\r\n if (config.framework !== 'none' || config.hasTypeScript || config.hasJSX) {\r\n html = injectIntoHead(\r\n html,\r\n `<script>${processEnvShim()}</script>`,\r\n );\r\n }\r\n\r\n // Inject process.env shim for Vite projects if not already done\r\n if (config.isVite) {\r\n if (config.framework === 'none' && !config.hasTypeScript && !config.hasJSX) {\r\n html = injectIntoHead(\r\n html,\r\n `<script>${processEnvShim()}</script>`,\r\n );\r\n }\r\n }\r\n\r\n return { html, usesESM: true };\r\n}\r\n\r\n// ─── HTML shell generation ─────────────────────────────────────\r\n\r\nfunction generateHTMLShell(\r\n files: Map<string, string>,\r\n config: ProjectConfig,\r\n): string {\r\n const jsEntry = config.jsEntryPoint;\r\n\r\n let mountScript = '';\r\n\r\n if (config.framework === 'react' && jsEntry) {\r\n // Generate React mount code — use bare specifier prefix so the\r\n // import map resolves correctly from the blob URL page.\r\n mountScript = `\r\nimport { createRoot } from 'react-dom/client';\r\nimport App from '${IMPORT_MAP_PREFIX}${jsEntry}';\r\nconst root = createRoot(document.getElementById('root'));\r\nroot.render(typeof App === 'function' ? App() : App);`;\r\n } else if (config.framework === 'preact' && jsEntry) {\r\n mountScript = `\r\nimport { render } from 'preact';\r\nimport App from '${IMPORT_MAP_PREFIX}${jsEntry}';\r\nrender(typeof App === 'function' ? App() : App, document.getElementById('root'));`;\r\n } else if (jsEntry) {\r\n mountScript = `import '${IMPORT_MAP_PREFIX}${jsEntry}';`;\r\n }\r\n\r\n // Collect any global CSS files\r\n const cssFiles: string[] = [];\r\n for (const [path, content] of files) {\r\n if (path.endsWith('.css') && !path.includes('module.css')) {\r\n cssFiles.push(content);\r\n }\r\n }\r\n\r\n return `<!DOCTYPE html>\r\n<html>\r\n<head>\r\n <meta charset=\"UTF-8\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n <style>* { margin: 0; box-sizing: border-box; }</style>\r\n${cssFiles.map((css) => ` <style>\\n${css}\\n </style>`).join('\\n')}\r\n</head>\r\n<body>\r\n <div id=\"root\"></div>\r\n <script type=\"module\">${mountScript}\r\n </script>\r\n</body>\r\n</html>`;\r\n}\r\n\r\n// ─── Import map builder ────────────────────────────────────────\r\n\r\n/**\r\n * Build a mapping of project file paths → blob URLs.\r\n *\r\n * Rather than using a browser import map (which doesn't help for\r\n * inter-module imports within blob URLs), we rewrite every\r\n * relative import between project files to point directly at the\r\n * blob URL of the target file. This requires two passes:\r\n *\r\n * 1. Collect all JS/TS file paths and their full `./dir/file` keys.\r\n * 2. For each file, rewrite relative `import … from './sibling'`\r\n * to reference the other file's blob URL, then create the blob.\r\n */\r\nfunction buildImportMap(\r\n files: Map<string, string>,\r\n _config: ProjectConfig,\r\n): Record<string, string> {\r\n // 1) Build a lookup: absolute project path → content\r\n const jsFiles = new Map<string, string>();\r\n for (const [path, content] of files) {\r\n if (/\\.(js|ts|jsx|tsx|mjs)$/.test(path)) {\r\n jsFiles.set(path, content);\r\n }\r\n }\r\n\r\n // 2) First pass — create all blob URLs with *rewritten* relative imports.\r\n // We resolve all relative imports between project files by\r\n // rewriting them to blob URLs. Because each file may depend on\r\n // another, we pre-compute the blob URL for each file once we've\r\n // rewritten its content.\r\n\r\n // Pre-compute the target blob URL for each file.\r\n // We'll do this in one pass: for each file, scan its imports,\r\n // resolve targets, and replace with blob URLs built on the fly.\r\n // To avoid circular dependency issues, we use a two-pass approach:\r\n // Pass 1: create blob URLs without rewriting (just content as-is)\r\n // Pass 2: for the entry point (inlined), we don't need rewrites\r\n // because it's inlined directly.\r\n //\r\n // Actually the simplest correct approach: create blob URLs for each\r\n // file after rewriting its relative imports to full `./path` form,\r\n // then let the import map handle `./path` → blob URL resolution.\r\n\r\n const map: Record<string, string> = {};\r\n\r\n for (const [path, content] of jsFiles) {\r\n // Rewrite relative imports within this file to use bare specifiers\r\n // (e.g. `import './counter.ts'` → `import '__diorama__/src/counter.ts'`)\r\n // so they resolve through the import map even from blob URL modules.\r\n const dir = directoryOf(path);\r\n const rewritten = rewriteRelativeImportsToBareSpecifiers(content, dir, jsFiles);\r\n const blobURL = createBlobURL(rewritten, 'application/javascript');\r\n map[`${IMPORT_MAP_PREFIX}${path}`] = blobURL;\r\n }\r\n\r\n return map;\r\n}\r\n\r\n/**\r\n * Rewrite relative import specifiers in `source` so that they use\r\n * bare-specifier keys prefixed with `__diorama__/`.\r\n *\r\n * For example, if `dir` is `src` and the code has `import './counter.ts'`,\r\n * this rewrites it to `import '__diorama__/src/counter.ts'`. Bare\r\n * specifiers are always resolved through the import map, even when the\r\n * importing module is loaded from a blob URL (where relative paths\r\n * would resolve against the opaque blob origin instead).\r\n */\r\nfunction rewriteRelativeImportsToBareSpecifiers(\r\n source: string,\r\n dir: string,\r\n allFiles: Map<string, string>,\r\n): string {\r\n // Match import/export specifiers that are relative\r\n return source.replace(\r\n /((?:import|export)\\s+(?:[\\s\\S]*?\\s+from\\s*|)['\"])(\\.[^'\"]+)(['\"])/g,\r\n (_match, pre: string, specifier: string, post: string) => {\r\n // Resolve the specifier relative to the file's directory\r\n const resolved = dir\r\n ? resolvePath(dir, specifier)\r\n : specifier.replace(/^\\.\\//, '');\r\n\r\n // Only rewrite if the resolved path exists in the project\r\n if (allFiles.has(resolved)) {\r\n return `${pre}${IMPORT_MAP_PREFIX}${resolved}${post}`;\r\n }\r\n // Try common extension fallbacks (.ts → .js, etc.)\r\n const withoutExt = resolved.replace(/\\.[^.]+$/, '');\r\n for (const ext of ['.js', '.ts', '.jsx', '.tsx', '.mjs']) {\r\n if (allFiles.has(withoutExt + ext)) {\r\n return `${pre}${IMPORT_MAP_PREFIX}${withoutExt + ext}${post}`;\r\n }\r\n }\r\n return _match; // leave as-is if not a project file\r\n },\r\n );\r\n}\r\n\r\nfunction createBlobURL(content: string, mime: string): string {\r\n // Always use data URIs instead of blob URLs.\r\n //\r\n // The import-map entries are embedded in an HTML page that is itself\r\n // loaded via blob URL inside a sandboxed iframe (sandbox=\"allow-scripts\").\r\n // Without `allow-same-origin` the iframe has an opaque (`null`) origin,\r\n // so blob URLs created by the parent page are cross-origin and silently\r\n // fail to load as ES modules. Data URIs are self-contained and have\r\n // no origin restrictions, so they work universally.\r\n return `data:${mime};base64,${btoa(unescape(encodeURIComponent(content)))}`;\r\n}\r\n\r\n// ─── CSS inlining ──────────────────────────────────────────────\r\n\r\nfunction inlineLocalCSS(\r\n html: string,\r\n files: Map<string, string>,\r\n htmlPath: string,\r\n): string {\r\n const dir = directoryOf(htmlPath);\r\n\r\n return html.replace(\r\n /<link\\s+[^>]*(?:rel=[\"']stylesheet[\"'][^>]*href=[\"']([^\"']+)[\"']|href=[\"']([^\"']+)[\"'][^>]*rel=[\"']stylesheet[\"'])[^>]*\\/?>/gi,\r\n (match, href1: string | undefined, href2: string | undefined) => {\r\n const href = href1 ?? href2;\r\n if (!href) return match;\r\n // Skip external URLs\r\n if (/^https?:\\/\\//.test(href)) return match;\r\n\r\n // Handle root-relative paths (Vite convention)\r\n let resolved: string;\r\n if (href.startsWith('/')) {\r\n resolved = href.slice(1);\r\n } else {\r\n resolved = resolvePath(dir, href);\r\n }\r\n\r\n const css = files.get(resolved);\r\n if (css) {\r\n return `<style>\\n${css}\\n</style>`;\r\n }\r\n return match; // leave as-is if file not found\r\n },\r\n );\r\n}\r\n\r\n// ─── JS inlining ──────────────────────────────────────────────\r\n\r\nfunction inlineLocalJS(\r\n html: string,\r\n files: Map<string, string>,\r\n htmlPath: string,\r\n): string {\r\n const dir = directoryOf(htmlPath);\r\n\r\n return html.replace(\r\n /<script\\s+[^>]*src=[\"']([^\"']+)[\"'][^>]*><\\/script>/gi,\r\n (match, src: string) => {\r\n // Skip external URLs\r\n if (/^https?:\\/\\//.test(src)) return match;\r\n\r\n // Handle root-relative paths (Vite convention: /src/main.tsx)\r\n let resolved: string;\r\n if (src.startsWith('/')) {\r\n resolved = src.slice(1);\r\n } else {\r\n resolved = resolvePath(dir, src);\r\n }\r\n\r\n const js = files.get(resolved);\r\n if (js) {\r\n // Preserve type=\"module\" if present\r\n const typeMatch = match.match(/type=[\"']([^\"']+)[\"']/);\r\n const typeAttr = typeMatch ? ` type=\"${typeMatch[1]}\"` : '';\r\n return `<script${typeAttr}>\\n${js}\\n</script>`;\r\n }\r\n return match;\r\n },\r\n );\r\n}\r\n\r\n// ─── Script src → import map redirect ─────────────────────────\r\n\r\n/**\r\n * Replace `<script type=\"module\" src=\"/src/main.ts\"></script>` with\r\n * `<script type=\"module\">import './src/main.ts';</script>` so that the\r\n * browser's import map resolves the entry point to its blob URL.\r\n *\r\n * This avoids inlining the script content directly (which would break\r\n * relative imports between project files, since inlined scripts resolve\r\n * imports relative to the page URL, not the original file location).\r\n */\r\nfunction rewriteScriptSrcsToImportMap(\r\n html: string,\r\n htmlPath: string,\r\n): string {\r\n const dir = directoryOf(htmlPath);\r\n\r\n return html.replace(\r\n /<script\\s+[^>]*src=[\"']([^\"']+)[\"'][^>]*><\\/script>/gi,\r\n (match, src: string) => {\r\n // Skip external URLs\r\n if (/^https?:\\/\\//.test(src)) return match;\r\n\r\n // Resolve to project-root-relative path\r\n let resolved: string;\r\n if (src.startsWith('/')) {\r\n resolved = src.slice(1);\r\n } else {\r\n resolved = resolvePath(dir, src);\r\n }\r\n\r\n // Emit an inline import using the bare-specifier prefix so the\r\n // import map can resolve it (relative paths don't work from blob URLs).\r\n return `<script type=\"module\">import '${IMPORT_MAP_PREFIX}${resolved}';</script>`;\r\n },\r\n );\r\n}\r\n\r\n// ─── Asset inlining ───────────────────────────────────────────\r\n\r\nfunction inlineAssets(\r\n html: string,\r\n project: ResolvedProject,\r\n htmlPath: string,\r\n): string {\r\n const dir = directoryOf(htmlPath);\r\n\r\n // Rewrite src=\"...\" and href=\"...\" that point to local binary files\r\n return html.replace(\r\n /(src|href)=[\"']([^\"']+)[\"']/gi,\r\n (match, attr: string, ref: string) => {\r\n if (/^(https?:\\/\\/|data:|blob:|#)/.test(ref)) return match;\r\n\r\n // Handle root-relative paths (Vite convention)\r\n let resolved: string;\r\n if (ref.startsWith('/')) {\r\n resolved = ref.slice(1);\r\n } else {\r\n resolved = resolvePath(dir, ref);\r\n }\r\n const ext = extensionOf(resolved);\r\n\r\n if (!INLINEABLE_EXTENSIONS.has(ext)) return match;\r\n\r\n // Check binary files first\r\n const blob = project.binaryFiles.get(resolved);\r\n if (blob && blob.size <= SMALL_ASSET_LIMIT) {\r\n // We can't synchronously read the blob, so for SVGs in text files\r\n // use the text content directly\r\n if (ext === '.svg') {\r\n const svgText = project.files.get(resolved);\r\n if (svgText) {\r\n const encoded = `data:image/svg+xml;base64,${btoa(svgText)}`;\r\n return `${attr}=\"${encoded}\"`;\r\n }\r\n }\r\n // For other binary files, we'd need async — skip for now\r\n return match;\r\n }\r\n\r\n // Check if SVG is in text files\r\n if (ext === '.svg') {\r\n const svgText = project.files.get(resolved);\r\n if (svgText) {\r\n const encoded = `data:image/svg+xml;base64,${btoa(unescape(encodeURIComponent(svgText)))}`;\r\n return `${attr}=\"${encoded}\"`;\r\n }\r\n }\r\n\r\n return match;\r\n },\r\n );\r\n}\r\n\r\n// ─── Asset import rewriting ────────────────────────────────────\r\n\r\n/**\r\n * Rewrite JS/TS asset imports like `import logo from './assets/logo.svg'`\r\n * into inline data-URL assignments: `const logo = \"data:image/svg+xml;base64,...\"`.\r\n *\r\n * This handles Vite-style asset imports that the browser can't resolve\r\n * at runtime. Mutates the `files` map in place.\r\n */\r\nfunction rewriteAssetImports(\r\n files: Map<string, string>,\r\n project: ResolvedProject,\r\n): void {\r\n // Matches: import <binding> from '<specifier>'\r\n // where the specifier ends with an asset extension\r\n const assetImportRe = /import\\s+(\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]\\s*;?/g;\r\n\r\n for (const [filePath, content] of files) {\r\n if (!/\\.(js|ts|jsx|tsx|mjs)$/.test(filePath)) continue;\r\n\r\n let modified = content;\r\n let didModify = false;\r\n let match: RegExpExecArray | null;\r\n\r\n // Reset lastIndex since we reuse the regex\r\n assetImportRe.lastIndex = 0;\r\n\r\n while ((match = assetImportRe.exec(content)) !== null) {\r\n const binding = match[1];\r\n const specifier = match[2];\r\n const ext = extensionOf(specifier);\r\n\r\n if (!(ext in ASSET_IMPORT_EXTENSIONS)) continue;\r\n\r\n // Resolve the specifier relative to the importing file\r\n let resolved: string;\r\n if (specifier.startsWith('/')) {\r\n resolved = specifier.slice(1);\r\n } else {\r\n resolved = resolvePath(directoryOf(filePath), specifier);\r\n }\r\n\r\n const mime = ASSET_IMPORT_EXTENSIONS[ext];\r\n let dataURL: string | null = null;\r\n\r\n // Try text files first (SVGs are stored as text after resolver change)\r\n const textContent = project.files.get(resolved);\r\n if (textContent) {\r\n dataURL = `data:${mime};base64,${btoa(unescape(encodeURIComponent(textContent)))}`;\r\n }\r\n\r\n // Try binary files\r\n if (!dataURL) {\r\n const blob = project.binaryFiles.get(resolved);\r\n if (blob) {\r\n // We can't synchronously read blobs — use a blank data URL placeholder\r\n dataURL = `data:${mime};base64,`;\r\n }\r\n }\r\n\r\n // Always replace asset imports to avoid runtime module resolution errors.\r\n // If we couldn't resolve the asset, use an empty placeholder.\r\n if (!dataURL) {\r\n dataURL = `data:${mime};base64,`;\r\n }\r\n\r\n modified = modified.replace(match[0], `const ${binding} = \"${dataURL}\";`);\r\n didModify = true;\r\n }\r\n\r\n if (didModify) {\r\n files.set(filePath, modified);\r\n }\r\n }\r\n}\r\n\r\n// ─── CSS-in-JS imports ─────────────────────────────────────────\r\n\r\n/**\r\n * Extract CSS imported from JS files (`import './styles.css'`)\r\n * and return the combined CSS content. Also strips the import\r\n * statement from the JS source (mutates the map).\r\n */\r\nfunction extractCSSImports(files: Map<string, string>): string {\r\n const cssChunks: string[] = [];\r\n const cssImportRe = /import\\s+['\"]([^'\"]+\\.css)['\"]\\s*;?/g;\r\n\r\n for (const [path, content] of files) {\r\n if (!/\\.(js|ts|jsx|tsx|mjs)$/.test(path)) continue;\r\n\r\n let modified = content;\r\n let match: RegExpExecArray | null;\r\n\r\n while ((match = cssImportRe.exec(content)) !== null) {\r\n const cssPath = match[1];\r\n const resolved = resolvePath(directoryOf(path), cssPath);\r\n const css = files.get(resolved);\r\n if (css) {\r\n cssChunks.push(`/* ${resolved} */\\n${css}`);\r\n }\r\n // Strip the import from the JS\r\n modified = modified.replace(match[0], '');\r\n }\r\n\r\n if (modified !== content) {\r\n files.set(path, modified);\r\n }\r\n }\r\n\r\n return cssChunks.join('\\n\\n');\r\n}\r\n\r\n// ─── import.meta.env injection ─────────────────────────────────\r\n\r\n/**\r\n * Inject an `import.meta.env` polyfill at the top of every JS/TS file\r\n * in the map. `import.meta` is per-module — a classic `<script>` in\r\n * `<head>` can't set it (and would throw a SyntaxError). By injecting\r\n * the definition directly into each module, the polyfill runs in the\r\n * correct module scope.\r\n *\r\n * Note: the import rewriter already statically replaces individual\r\n * properties (`import.meta.env.MODE`, `.PROD`, `.DEV`, `.BASE_URL`,\r\n * `.SSR`, `.VITE_*`). This polyfill covers edge cases where code\r\n * references `import.meta.env` as a whole object, or accesses\r\n * properties not caught by the static pass.\r\n */\r\nfunction injectImportMetaEnv(files: Map<string, string>): void {\r\n const shim = `if(!import.meta.env){Object.defineProperty(import.meta,'env',{value:{MODE:'production',BASE_URL:'/',PROD:true,DEV:false,SSR:false}});}`;\r\n\r\n for (const [path, content] of files) {\r\n if (!/\\.(js|ts|jsx|tsx|mjs)$/.test(path)) continue;\r\n files.set(path, shim + '\\n' + content);\r\n }\r\n}\r\n\r\n// ─── Utility ───────────────────────────────────────────────────\r\n\r\nfunction directoryOf(filePath: string): string {\r\n const lastSlash = filePath.lastIndexOf('/');\r\n return lastSlash === -1 ? '' : filePath.slice(0, lastSlash);\r\n}\r\n\r\nfunction resolvePath(dir: string, relative: string): string {\r\n // Strip leading ./\r\n let cleaned = relative.replace(/^\\.\\//, '');\r\n\r\n if (!dir) return cleaned;\r\n\r\n // Handle ../\r\n const parts = dir.split('/');\r\n const segments = cleaned.split('/');\r\n\r\n for (const seg of segments) {\r\n if (seg === '..') {\r\n parts.pop();\r\n } else if (seg !== '.') {\r\n parts.push(seg);\r\n }\r\n }\r\n\r\n return parts.join('/');\r\n}\r\n\r\nfunction extensionOf(path: string): string {\r\n const dot = path.lastIndexOf('.');\r\n return dot === -1 ? '' : path.slice(dot).toLowerCase();\r\n}\r\n\r\nfunction injectIntoHead(html: string, tag: string): string {\r\n // Insert right before </head>, or before <body>, or at the top\r\n if (html.includes('</head>')) {\r\n return html.replace('</head>', ` ${tag}\\n</head>`);\r\n }\r\n if (html.includes('<body')) {\r\n return html.replace(/<body/, `${tag}\\n<body`);\r\n }\r\n return `${tag}\\n${html}`;\r\n}\r\n","import type {\r\n DioramaOptions,\r\n DioramaInstance,\r\n RenderOptions,\r\n ResolvedProject,\r\n} from './types';\r\nimport { DioramaError } from './errors';\r\nimport { resolveProject } from './core/resolver';\r\nimport { CacheManager } from './core/cache';\r\nimport { analyzeProject } from './core/analyzer';\r\nimport { createSandbox, buildErrorHTML } from './core/sandbox';\r\nimport { rewriteImports } from './transform/rewriter';\r\nimport { transpileAll } from './transform/transpiler';\r\nimport { assembleHTML } from './transform/assembler';\r\n\r\n// ─── Re-exports ────────────────────────────────────────────────\r\n\r\nexport { DioramaError } from './errors';\r\nexport {\r\n RepoNotFoundError,\r\n BranchNotFoundError,\r\n RateLimitError,\r\n NetworkError,\r\n ProjectTypeError,\r\n NodeBuiltinError,\r\n TranspileError,\r\n TranspilerLoadError,\r\n AssemblyError,\r\n PackageNotFoundError,\r\n EntryPointError,\r\n} from './errors';\r\n\r\nexport type {\r\n DioramaOptions,\r\n DioramaInstance,\r\n RenderOptions,\r\n ResolvedProject,\r\n ProjectConfig,\r\n ProjectType,\r\n Framework,\r\n CDNProviderName,\r\n CacheStrategy,\r\n LoadingStrategy,\r\n FrameStyle,\r\n} from './types';\r\n\r\n// ─── Diorama class ─────────────────────────────────────────────\r\n\r\nexport class Diorama {\r\n private options: Required<DioramaOptions>;\r\n private cache: CacheManager;\r\n\r\n constructor(options: DioramaOptions = {}) {\r\n this.options = {\r\n cache: options.cache ?? true,\r\n cacheTTL: options.cacheTTL ?? 3600,\r\n cacheStrategy: options.cacheStrategy ?? 'normal',\r\n cdnProvider: options.cdnProvider ?? 'esm.sh',\r\n githubToken: options.githubToken ?? '',\r\n esbuildWasmURL: options.esbuildWasmURL ?? 'auto',\r\n maxConcurrentFetches: options.maxConcurrentFetches ?? 6,\r\n timeout: options.timeout ?? 30_000,\r\n };\r\n\r\n this.cache = new CacheManager({\r\n enabled: this.options.cache,\r\n ttl: this.options.cacheTTL,\r\n strategy: this.options.cacheStrategy,\r\n });\r\n }\r\n\r\n // ─── Render ────────────────────────────────────────────────\r\n\r\n /**\r\n * Fetch, transform, and render a GitHub project inside a\r\n * sandboxed iframe.\r\n *\r\n * @param container CSS selector or DOM element.\r\n * @param repoURL GitHub URL or `owner/repo` shorthand.\r\n * @param options Per-render options.\r\n * @returns A handle for reloading or destroying the instance.\r\n */\r\n async render(\r\n container: string | HTMLElement,\r\n repoURL: string,\r\n options: RenderOptions = {},\r\n ): Promise<DioramaInstance> {\r\n const renderImpl = async (): Promise<{\r\n html: string;\r\n usesESM: boolean;\r\n repoName: string;\r\n }> => {\r\n // 1) Resolve project from GitHub (with cache)\r\n const project = await this.fetchProject(repoURL, options);\r\n const repoName = `${project.owner}/${project.repo}`;\r\n\r\n // 2) Analyse project\r\n const config = analyzeProject(\r\n project,\r\n options.projectType,\r\n options.entryPoint,\r\n );\r\n\r\n // 3) Transpile if needed (JSX / TypeScript / Vite)\r\n let files = project.files;\r\n const needsTranspile =\r\n config.type === 'jsx' ||\r\n config.type === 'typescript' ||\r\n config.type === 'jsx-typescript' ||\r\n (config.type === 'vite' && (config.hasJSX || config.hasTypeScript));\r\n\r\n if (needsTranspile) {\r\n files = await transpileAll(\r\n files,\r\n config.framework,\r\n this.options.esbuildWasmURL,\r\n );\r\n }\r\n\r\n // 4) Rewrite imports (ESM / JSX / TS / Vite projects)\r\n if (config.type !== 'static') {\r\n const reactVersion =\r\n config.framework === 'react'\r\n ? config.dependencies['react']\r\n : undefined;\r\n\r\n for (const [path, content] of files) {\r\n if (/\\.(js|ts|jsx|tsx|mjs)$/.test(path)) {\r\n const rewritten = rewriteImports(content, {\r\n dependencies: config.dependencies,\r\n cdnProvider: this.options.cdnProvider,\r\n framework: config.framework,\r\n reactVersion,\r\n isVite: config.isVite,\r\n });\r\n files.set(path, rewritten);\r\n }\r\n }\r\n }\r\n\r\n // 5) Assemble final HTML\r\n const { html, usesESM } = assembleHTML({\r\n project,\r\n config,\r\n transformedFiles: files,\r\n });\r\n\r\n return { html, usesESM, repoName };\r\n };\r\n\r\n // Run pipeline with timeout\r\n let html: string;\r\n let usesESM: boolean;\r\n let repoName: string;\r\n\r\n try {\r\n const result = await withTimeout(\r\n renderImpl(),\r\n this.options.timeout,\r\n );\r\n html = result.html;\r\n usesESM = result.usesESM;\r\n repoName = result.repoName;\r\n } catch (err) {\r\n const dioErr =\r\n err instanceof DioramaError\r\n ? err\r\n : new DioramaError('UNKNOWN', String(err));\r\n options.onError?.(dioErr);\r\n html = buildErrorHTML(dioErr.message);\r\n usesESM = false;\r\n repoName = repoURL;\r\n }\r\n\r\n // 6) Inject into sandbox\r\n const sandbox = createSandbox({\r\n container,\r\n html,\r\n height: options.height,\r\n sandboxFlags: options.sandbox,\r\n loading: options.loading,\r\n frame: options.frame,\r\n expand: options.expand,\r\n placeholder: options.placeholder,\r\n repoName,\r\n useBlobURL: usesESM,\r\n onLoad: options.onLoad,\r\n onError: options.onError,\r\n });\r\n\r\n // Return instance\r\n const instance: DioramaInstance = {\r\n reload: async () => {\r\n try {\r\n const result = await renderImpl();\r\n sandbox.update(result.html);\r\n options.onLoad?.();\r\n } catch (err) {\r\n const dioErr =\r\n err instanceof DioramaError\r\n ? err\r\n : new DioramaError('UNKNOWN', String(err));\r\n options.onError?.(dioErr);\r\n sandbox.update(buildErrorHTML(dioErr.message));\r\n }\r\n },\r\n destroy: () => {\r\n sandbox.destroy();\r\n },\r\n };\r\n\r\n return instance;\r\n }\r\n\r\n // ─── Utilities ─────────────────────────────────────────────\r\n\r\n /**\r\n * Pre-fetch a project (resolve + cache) without rendering.\r\n */\r\n async prefetch(\r\n repoURL: string,\r\n options: Pick<RenderOptions, 'branch' | 'subdirectory'> = {},\r\n ): Promise<void> {\r\n await this.fetchProject(repoURL, options);\r\n }\r\n\r\n /**\r\n * Clear cached data.\r\n * @param repoSlug Optional `owner/repo` to clear a specific entry.\r\n */\r\n clearCache(repoSlug?: string): void {\r\n this.cache.clear(repoSlug);\r\n }\r\n\r\n // ─── Internal ──────────────────────────────────────────────\r\n\r\n private async fetchProject(\r\n repoURL: string,\r\n options: Pick<RenderOptions, 'branch' | 'subdirectory' | 'include' | 'exclude'>,\r\n ): Promise<ResolvedProject> {\r\n const project = await resolveProject(repoURL, {\r\n githubToken: this.options.githubToken || undefined,\r\n maxConcurrentFetches: this.options.maxConcurrentFetches,\r\n branch: options.branch,\r\n subdirectory: options.subdirectory,\r\n exclude: options.exclude,\r\n });\r\n\r\n // Cache the result\r\n await this.cache.set(project);\r\n\r\n return project;\r\n }\r\n}\r\n\r\n// ─── Helpers ───────────────────────────────────────────────────\r\n\r\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\r\n return new Promise<T>((resolve, reject) => {\r\n const timer = setTimeout(\r\n () => reject(new DioramaError('TIMEOUT', `Render timed out after ${ms}ms`)),\r\n ms,\r\n );\r\n promise\r\n .then((val) => {\r\n clearTimeout(timer);\r\n resolve(val);\r\n })\r\n .catch((err) => {\r\n clearTimeout(timer);\r\n reject(err);\r\n });\r\n });\r\n}\r\n"]}
|