@aprovan/patchwork-compiler 0.1.2-dev.03aaf5b → 0.1.2-dev.ba8f277

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../../../node_modules/.pnpm/tsup@8.5.1_jiti@1.21.7_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js","../src/compiler.ts","../src/vfs/project.ts","../src/schemas.ts","../src/images/loader.ts","../src/images/registry.ts","../src/transforms/cdn.ts","../src/transforms/vfs.ts","../src/mount/bridge.ts","../src/mount/embedded.ts","../src/mount/iframe.ts","../src/vfs/core/utils.ts","../src/vfs/backends/memory.ts","../src/vfs/core/virtual-fs.ts","../src/vfs/sync/differ.ts","../src/vfs/sync/resolver.ts","../src/vfs/sync/engine.ts","../src/vfs/backends/indexeddb.ts","../src/vfs/backends/http.ts","../src/vfs/store.ts"],"sourcesContent":["/**\n * @aprovan/patchwork-compiler\n *\n * JSX→ESM compilation, image loading, and DOM mounting for Patchwork widgets.\n *\n * @example\n * ```typescript\n * import { createCompiler } from '@aprovan/patchwork-compiler';\n *\n * const compiler = await createCompiler({\n * image: '@aprovan/patchwork-image-shadcn',\n * proxyUrl: 'http://localhost:3000/api/proxy'\n * });\n *\n * const widget = await compiler.compile(source, manifest);\n * const mounted = await compiler.mount(widget, {\n * target: document.getElementById('root'),\n * mode: 'embedded'\n * });\n *\n * // Later...\n * compiler.unmount(mounted);\n * ```\n */\n\n// Core compiler\nexport { createCompiler } from \"./compiler.js\";\n\n// Schemas (Zod validation)\nexport {\n // Schemas\n PlatformSchema,\n EsbuildConfigSchema,\n ImageConfigSchema,\n InputSpecSchema,\n ManifestSchema,\n CompileOptionsSchema,\n MountModeSchema,\n MountOptionsSchema,\n // Parsers\n parseImageConfig,\n safeParseImageConfig,\n parseManifest,\n safeParseManifest,\n // Defaults\n DEFAULT_IMAGE_CONFIG,\n DEFAULT_CLI_IMAGE_CONFIG,\n} from \"./schemas.js\";\n\n// Types\nexport type {\n // Core types\n Platform,\n Manifest,\n InputSpec,\n CompileOptions,\n CompiledWidget,\n MountMode,\n MountOptions,\n MountedWidget,\n Compiler,\n CompilerOptions,\n // Image types\n ImageConfig,\n ImageMountFn,\n LoadedImage,\n // Service types\n ServiceProxy,\n ServiceCallHandler,\n GlobalInterfaceDefinition,\n BridgeMessage,\n BridgeMessageType,\n ServiceCallPayload,\n ServiceResultPayload,\n} from \"./types.js\";\n\n// Images\nexport {\n // Registry\n ImageRegistry,\n getImageRegistry,\n createImageRegistry,\n // Loader\n loadImage,\n parseImageSpec,\n fetchPackageJson,\n setCdnBaseUrl,\n getCdnBaseUrl,\n} from \"./images/index.js\";\n\n// Transforms\nexport {\n cdnTransformPlugin,\n generateImportMap,\n vfsPlugin,\n} from \"./transforms/index.js\";\nexport type {\n CdnTransformOptions,\n VFSPluginOptions,\n} from \"./transforms/index.js\";\n\n// VFS\nexport {\n VFSStore,\n createProjectFromFiles,\n createSingleFileProject,\n resolveEntry,\n detectMainFile,\n IndexedDBBackend,\n HttpBackend,\n} from \"./vfs/index.js\";\nexport type {\n VirtualFile,\n VirtualProject,\n ChangeRecord,\n HttpBackendConfig,\n VFSStoreOptions,\n} from \"./vfs/index.js\";\n\n// Mount utilities\nexport {\n // Embedded\n mountEmbedded,\n reloadEmbedded,\n // Iframe\n mountIframe,\n reloadIframe,\n disposeIframeBridge,\n DEV_SANDBOX,\n // Bridge\n createHttpServiceProxy,\n createFieldAccessProxy,\n generateNamespaceGlobals,\n injectNamespaceGlobals,\n removeNamespaceGlobals,\n extractNamespaces,\n ParentBridge,\n createIframeServiceProxy,\n generateIframeBridgeScript,\n} from \"./mount/index.js\";\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import * as esbuild from \"esbuild-wasm\";\nimport type {\n Compiler,\n CompilerOptions,\n CompileOptions,\n CompiledWidget,\n Manifest,\n MountedWidget,\n MountOptions,\n ServiceProxy,\n} from \"./types.js\";\nimport type { VirtualProject } from \"./vfs/types.js\";\nimport { createSingleFileProject } from \"./vfs/project.js\";\nimport { getImageRegistry } from \"./images/registry.js\";\nimport { setCdnBaseUrl as setImageCdnBaseUrl } from \"./images/loader.js\";\nimport { setCdnBaseUrl as setTransformCdnBaseUrl } from \"./transforms/cdn.js\";\nimport { cdnTransformPlugin } from \"./transforms/cdn.js\";\nimport { vfsPlugin } from \"./transforms/vfs.js\";\nimport { createHttpServiceProxy } from \"./mount/bridge.js\";\nimport { mountEmbedded, reloadEmbedded } from \"./mount/embedded.js\";\nimport { mountIframe, reloadIframe } from \"./mount/iframe.js\";\n\n// Track esbuild initialization\nlet esbuildInitialized = false;\nlet esbuildInitPromise: Promise<void> | null = null;\n\n/**\n * Initialize esbuild-wasm (must be called before using esbuild)\n */\nasync function initEsbuild(): Promise<void> {\n if (esbuildInitialized) return;\n if (esbuildInitPromise) return esbuildInitPromise;\n\n esbuildInitPromise = (async () => {\n try {\n await esbuild.initialize({\n wasmURL: \"https://unpkg.com/esbuild-wasm/esbuild.wasm\",\n });\n esbuildInitialized = true;\n } catch (error) {\n // If already initialized (e.g., HMR or multiple compiler instances), that's fine\n if (error instanceof Error && error.message.includes(\"initialize\")) {\n esbuildInitialized = true;\n } else {\n throw error;\n }\n }\n })();\n\n return esbuildInitPromise;\n}\n\n/**\n * Generate a content hash for caching\n */\nfunction hashContent(content: string): string {\n // Use Web Crypto API for browser compatibility\n const encoder = new TextEncoder();\n const data = encoder.encode(content);\n // Simple hash for cache key (not cryptographic)\n let hash = 0;\n for (let i = 0; i < data.length; i++) {\n hash = ((hash << 5) - hash + (data[i] ?? 0)) | 0;\n }\n return Math.abs(hash).toString(16).padStart(8, \"0\");\n}\n\n/**\n * Create a compiler instance\n */\nexport async function createCompiler(\n options: CompilerOptions,\n): Promise<Compiler> {\n // Initialize esbuild-wasm\n await initEsbuild();\n\n const { image: imageSpec, proxyUrl, cdnBaseUrl, widgetCdnBaseUrl } = options;\n\n // Set CDN base URLs (can be different for image loading vs widget imports)\n if (cdnBaseUrl) {\n setImageCdnBaseUrl(cdnBaseUrl);\n }\n // Widget imports use widgetCdnBaseUrl if provided, otherwise fall back to cdnBaseUrl or default\n if (widgetCdnBaseUrl) {\n setTransformCdnBaseUrl(widgetCdnBaseUrl);\n } else if (cdnBaseUrl) {\n setTransformCdnBaseUrl(cdnBaseUrl);\n }\n\n const registry = getImageRegistry();\n\n // Pre-load the initial image\n await registry.preload(imageSpec);\n\n // Create service proxy\n const proxy: ServiceProxy = createHttpServiceProxy(proxyUrl);\n\n return new PatchworkCompiler(proxy, registry);\n}\n\n/**\n * Patchwork compiler implementation\n */\nclass PatchworkCompiler implements Compiler {\n private proxy: ServiceProxy;\n private registry: ReturnType<typeof getImageRegistry>;\n\n constructor(\n proxy: ServiceProxy,\n registry: ReturnType<typeof getImageRegistry>,\n ) {\n this.proxy = proxy;\n this.registry = registry;\n }\n\n /**\n * Pre-load an image package\n */\n async preloadImage(spec: string): Promise<void> {\n await this.registry.preload(spec);\n }\n\n /**\n * Check if an image is loaded\n */\n isImageLoaded(spec: string): boolean {\n return this.registry.has(spec);\n }\n\n /**\n * Compile widget source to ESM\n */\n async compile(\n source: string | VirtualProject,\n manifest: Manifest,\n _options: CompileOptions = {},\n ): Promise<CompiledWidget> {\n // Normalize input to VirtualProject (entry defined by project, defaults to main.tsx)\n const project =\n typeof source === \"string\" ? createSingleFileProject(source) : source;\n\n // Infer loader from entry file extension\n const entryExt = project.entry.split(\".\").pop();\n const loader = entryExt === \"ts\" || entryExt === \"tsx\" ? \"tsx\" : \"jsx\";\n\n // Get image from registry based on manifest\n const image = this.registry.get(manifest.image) || null;\n\n // Get config from image (with proper typing)\n const esbuildConfig = image?.config.esbuild || {};\n const frameworkConfig = image?.config.framework || {};\n\n const target = esbuildConfig.target || \"es2020\";\n const format = esbuildConfig.format || \"esm\";\n const jsx = esbuildConfig.jsx ?? \"automatic\";\n\n // Collect all packages (image deps + manifest packages)\n const packages: Record<string, string> = {\n ...(image?.dependencies || {}),\n ...(manifest.packages || {}),\n };\n\n const globals = frameworkConfig.globals || {};\n\n // Get dependency version overrides from image config (e.g., { react: '18' })\n const deps = frameworkConfig.deps || {};\n\n // Get import path aliases from image config (e.g., { '@/components/ui/*': '@packagedcn/react' })\n const aliases = image?.config.aliases || {};\n\n // Get entry file content\n const entryFile = project.files.get(project.entry);\n if (!entryFile) {\n throw new Error(`Entry file not found: ${project.entry}`);\n }\n\n // Build with esbuild using image-provided configuration\n const result = await esbuild.build({\n stdin: {\n contents: entryFile.content,\n loader,\n sourcefile: project.entry,\n },\n bundle: true,\n format,\n target,\n platform: manifest.platform === \"cli\" ? \"node\" : \"browser\",\n jsx,\n ...(esbuildConfig.jsxFactory\n ? { jsxFactory: esbuildConfig.jsxFactory }\n : {}),\n ...(esbuildConfig.jsxFragment\n ? { jsxFragment: esbuildConfig.jsxFragment }\n : {}),\n write: false,\n sourcemap: \"inline\",\n plugins: [\n vfsPlugin(project, { aliases }),\n cdnTransformPlugin({\n packages,\n globals,\n deps,\n aliases,\n }),\n ],\n });\n\n const code = result.outputFiles?.[0]?.text || \"\";\n const hash = hashContent(code);\n\n return {\n code,\n hash,\n manifest,\n };\n }\n\n /**\n * Mount a compiled widget to the DOM\n */\n async mount(\n widget: CompiledWidget,\n options: MountOptions,\n ): Promise<MountedWidget> {\n const image = this.registry.get(widget.manifest.image) || null;\n if (options.mode === \"iframe\") {\n return mountIframe(widget, options, image, this.proxy);\n }\n return mountEmbedded(widget, options, image, this.proxy);\n }\n\n /**\n * Unmount a mounted widget\n */\n unmount(mounted: MountedWidget): void {\n mounted.unmount();\n }\n\n /**\n * Hot reload a mounted widget\n */\n async reload(\n mounted: MountedWidget,\n source: string | VirtualProject,\n manifest: Manifest,\n ): Promise<void> {\n // Compile new version\n const widget = await this.compile(source, manifest);\n const image = this.registry.get(widget.manifest.image) || null;\n\n // Reload based on mode\n if (mounted.mode === \"iframe\") {\n await reloadIframe(mounted, widget, image, this.proxy);\n } else {\n await reloadEmbedded(mounted, widget, image, this.proxy);\n }\n }\n}\n","import type { VirtualFile, VirtualProject } from \"./types.js\";\n\nexport function createProjectFromFiles(\n files: VirtualFile[],\n id: string = crypto.randomUUID(),\n): VirtualProject {\n const fileMap = new Map<string, VirtualFile>();\n for (const file of files) {\n fileMap.set(file.path, file);\n }\n return { id, entry: resolveEntry(fileMap), files: fileMap };\n}\n\nexport function resolveEntry(files: Map<string, VirtualFile>): string {\n const paths = Array.from(files.keys());\n\n const mainFile = paths.find((p) => /\\bmain\\.(tsx?|jsx?)$/.test(p));\n if (mainFile) return mainFile;\n\n const indexFile = paths.find((p) => /\\bindex\\.(tsx?|jsx?)$/.test(p));\n if (indexFile) return indexFile;\n\n const firstTsx = paths.find((p) => /\\.(tsx|jsx)$/.test(p));\n if (firstTsx) return firstTsx;\n\n return paths[0] || \"main.tsx\";\n}\n\nexport function detectMainFile(language?: string): string {\n switch (language) {\n case \"tsx\":\n case \"typescript\":\n return \"main.tsx\";\n case \"jsx\":\n case \"javascript\":\n return \"main.jsx\";\n case \"ts\":\n return \"main.ts\";\n case \"js\":\n return \"main.js\";\n default:\n return \"main.tsx\";\n }\n}\n\nexport function createSingleFileProject(\n content: string,\n entry = \"main.tsx\",\n id = \"inline\",\n): VirtualProject {\n return {\n id,\n entry,\n files: new Map([[entry, { path: entry, content }]]),\n };\n}\n","/**\n * Zod schemas for Patchwork compiler types\n *\n * These schemas validate:\n * - ImageConfig from package.json patchwork field\n * - Widget manifests\n * - Input specifications\n */\n\nimport { z } from 'zod';\n\n// Platform schema\nexport const PlatformSchema = z.enum(['browser', 'cli']);\nexport type Platform = z.infer<typeof PlatformSchema>;\n\n// esbuild configuration schema\nexport const EsbuildConfigSchema = z\n .object({\n target: z.string().optional(),\n format: z.enum(['esm', 'cjs', 'iife']).optional(),\n jsx: z.enum(['automatic', 'transform', 'preserve']).optional(),\n jsxFactory: z.string().optional(),\n jsxFragment: z.string().optional(),\n })\n .strict()\n .optional();\n\nexport type EsbuildConfig = z.infer<typeof EsbuildConfigSchema>;\n\n// Framework configuration - specifies globals and CDN URLs for framework deps\nexport const FrameworkConfigSchema = z\n .object({\n // Map of package names to window global names (e.g., { react: 'React' })\n globals: z.record(z.string(), z.string()).optional(),\n // CDN URLs to preload before widget execution\n preload: z.array(z.string()).optional(),\n // Dependency version overrides for CDN packages (e.g., { react: '18' })\n deps: z.record(z.string(), z.string()).optional(),\n })\n .strict()\n .optional();\n\nexport type FrameworkConfig = z.infer<typeof FrameworkConfigSchema>;\n\n// Aliases schema - maps path patterns to target packages\nexport const AliasesSchema = z.record(z.string(), z.string()).optional();\n\nexport type Aliases = z.infer<typeof AliasesSchema>;\n\n// Dependencies schema - maps package names to version specifiers\nexport const DependenciesSchema = z.record(z.string(), z.string()).optional();\n\n// ImageConfig schema - validates package.json patchwork field\nexport const ImageConfigSchema = z\n .object({\n platform: PlatformSchema,\n dependencies: DependenciesSchema,\n esbuild: EsbuildConfigSchema,\n framework: FrameworkConfigSchema,\n aliases: AliasesSchema,\n })\n .strict();\n\nexport type ImageConfig = z.infer<typeof ImageConfigSchema>;\n\n// Input specification schema\nexport const InputSpecSchema = z.object({\n type: z.enum(['string', 'number', 'boolean', 'object', 'array']),\n default: z.unknown().optional(),\n required: z.boolean().optional(),\n description: z.string().optional(),\n});\n\nexport type InputSpec = z.infer<typeof InputSpecSchema>;\n\n// Widget manifest schema\nexport const ManifestSchema = z.object({\n name: z.string(),\n version: z.string(),\n description: z.string().optional(),\n platform: PlatformSchema,\n image: z.string(),\n inputs: z.record(z.string(), InputSpecSchema).optional(),\n services: z.array(z.string()).optional(),\n packages: z.record(z.string(), z.string()).optional(),\n});\n\nexport type Manifest = z.infer<typeof ManifestSchema>;\n\n// Compile options schema\nexport const CompileOptionsSchema = z\n .object({\n typescript: z.boolean().optional(),\n })\n .strict()\n .optional();\n\nexport type CompileOptions = z.infer<typeof CompileOptionsSchema>;\n\n// Mount mode schema\nexport const MountModeSchema = z.enum(['embedded', 'iframe']);\nexport type MountMode = z.infer<typeof MountModeSchema>;\n\n// Mount options schema\nexport const MountOptionsSchema = z.object({\n target: z.custom<HTMLElement>((v) => v instanceof HTMLElement, {\n message: 'Expected HTMLElement',\n }),\n mode: MountModeSchema,\n sandbox: z.array(z.string()).optional(),\n inputs: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type MountOptions = z.infer<typeof MountOptionsSchema>;\n\n/**\n * Parse and validate ImageConfig from package.json patchwork field\n *\n * @param data - Raw data from package.json patchwork field\n * @returns Validated ImageConfig\n * @throws z.ZodError if validation fails\n */\nexport function parseImageConfig(data: unknown): ImageConfig {\n return ImageConfigSchema.parse(data);\n}\n\n/**\n * Safely parse ImageConfig, returning null on failure\n */\nexport function safeParseImageConfig(data: unknown): ImageConfig | null {\n const result = ImageConfigSchema.safeParse(data);\n return result.success ? result.data : null;\n}\n\n/**\n * Parse and validate widget manifest\n */\nexport function parseManifest(data: unknown): Manifest {\n return ManifestSchema.parse(data);\n}\n\n/**\n * Safely parse manifest, returning null on failure\n */\nexport function safeParseManifest(data: unknown): Manifest | null {\n const result = ManifestSchema.safeParse(data);\n return result.success ? result.data : null;\n}\n\n// Default ImageConfig for fallback\nexport const DEFAULT_IMAGE_CONFIG: ImageConfig = {\n platform: 'browser',\n esbuild: {\n target: 'es2020',\n format: 'esm',\n jsx: 'automatic',\n },\n framework: {},\n};\n\n// Default CLI ImageConfig for fallback\nexport const DEFAULT_CLI_IMAGE_CONFIG: ImageConfig = {\n platform: 'cli',\n esbuild: {\n target: 'node20',\n format: 'esm',\n jsx: 'automatic',\n },\n};\n","/**\n * Image loader - fetches and loads image packages from CDN or local\n *\n * Images must be installed as npm packages or available on CDN.\n */\n\nimport type { LoadedImage } from '../types.js';\nimport { safeParseImageConfig, DEFAULT_IMAGE_CONFIG } from '../schemas.js';\n\nconst DEFAULT_CDN_BASE = 'https://esm.sh';\n\n// Module-level CDN base URL (can be overridden)\nlet cdnBaseUrl = DEFAULT_CDN_BASE;\n\n/**\n * Set the CDN base URL for image loading\n */\nexport function setCdnBaseUrl(url: string): void {\n cdnBaseUrl = url;\n}\n\n/**\n * Get the current CDN base URL\n */\nexport function getCdnBaseUrl(): string {\n return cdnBaseUrl;\n}\n\nexport interface ImagePackageJson {\n name: string;\n version: string;\n main?: string;\n dependencies?: Record<string, string>;\n patchwork?: unknown;\n}\n\n/**\n * Parse image specifier into name and version\n */\nexport function parseImageSpec(spec: string): {\n name: string;\n version?: string;\n} {\n // Handle scoped packages (@scope/name@version)\n if (spec.startsWith('@')) {\n const parts = spec.split('/');\n if (parts.length >= 2) {\n const scope = parts[0];\n const nameAndVersion = parts.slice(1).join('/');\n const atIndex = nameAndVersion.lastIndexOf('@');\n if (atIndex > 0) {\n return {\n name: `${scope}/${nameAndVersion.slice(0, atIndex)}`,\n version: nameAndVersion.slice(atIndex + 1),\n };\n }\n return { name: `${scope}/${nameAndVersion}` };\n }\n }\n\n // Handle non-scoped packages\n const atIndex = spec.lastIndexOf('@');\n if (atIndex > 0) {\n return {\n name: spec.slice(0, atIndex),\n version: spec.slice(atIndex + 1),\n };\n }\n return { name: spec };\n}\n\n/**\n * Fetch package.json from CDN\n */\nexport async function fetchPackageJson(\n packageName: string,\n version?: string,\n): Promise<ImagePackageJson> {\n const versionSuffix = version ? `@${version}` : '';\n const url = `${cdnBaseUrl}/${packageName}${versionSuffix}/package.json`;\n\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(\n `Failed to fetch package.json for ${packageName}: ${response.statusText}`,\n );\n }\n\n return response.json() as Promise<ImagePackageJson>;\n}\n\n/**\n * Try to load an image package from local node_modules\n *\n * Uses dynamic require.resolve to find the package.json,\n * then loads the setup function from the main entry.\n */\nasync function loadLocalImage(name: string): Promise<LoadedImage | null> {\n // Only works in Node.js environment\n if (\n typeof globalThis.require === 'undefined' &&\n typeof process === 'undefined'\n ) {\n return null;\n }\n\n try {\n // Use createRequire to get require.resolve in ESM context\n const { createRequire } = await import('node:module');\n const { readFile } = await import('node:fs/promises');\n const { dirname, join } = await import('node:path');\n\n // Create require from current file for resolution\n const require = createRequire(import.meta.url);\n\n // Resolve package.json path\n let packageJsonPath: string;\n try {\n packageJsonPath = require.resolve(`${name}/package.json`);\n } catch {\n // Package not installed locally\n return null;\n }\n\n // Read and parse package.json\n const packageJsonContent = await readFile(packageJsonPath, 'utf-8');\n const packageJson: ImagePackageJson = JSON.parse(packageJsonContent);\n\n // Validate and extract patchwork config\n const config =\n safeParseImageConfig(packageJson.patchwork) || DEFAULT_IMAGE_CONFIG;\n\n // Try to load setup and mount functions\n let setup: LoadedImage['setup'];\n let mount: LoadedImage['mount'];\n const packageDir = dirname(packageJsonPath);\n\n if (packageJson.main) {\n try {\n const mainPath = join(packageDir, packageJson.main);\n const imageModule = await import(\n /* webpackIgnore: true */ /* @vite-ignore */ mainPath\n );\n if (typeof imageModule.setup === 'function') {\n setup = imageModule.setup;\n }\n if (typeof imageModule.mount === 'function') {\n mount = imageModule.mount;\n }\n } catch {\n // Setup/mount are optional\n }\n }\n\n return {\n name: packageJson.name,\n version: packageJson.version,\n config,\n dependencies: packageJson.dependencies || {},\n setup,\n mount,\n };\n } catch {\n // Fall back to other methods\n return null;\n }\n}\n\n/**\n * Load an image package\n *\n * Priority:\n * 1. Try to resolve locally (require.resolve for installed packages)\n * 2. Fetch from CDN\n *\n * Images must be explicitly installed or available on CDN.\n */\nexport async function loadImage(spec: string): Promise<LoadedImage> {\n const { name, version } = parseImageSpec(spec);\n\n // Try local resolution first (for installed packages)\n const localImage = await loadLocalImage(name);\n if (localImage) {\n return localImage;\n }\n\n // Fetch from CDN\n const packageJson = await fetchPackageJson(name, version);\n\n // Validate and extract patchwork config\n const config =\n safeParseImageConfig(packageJson.patchwork) || DEFAULT_IMAGE_CONFIG;\n\n // Try to load setup/mount functions if main is specified\n let setup: LoadedImage['setup'];\n let mount: LoadedImage['mount'];\n let moduleUrl: string | undefined;\n if (packageJson.main && typeof window !== 'undefined') {\n try {\n const versionSuffix = version ? `@${version}` : '';\n // Import with explicit main entry path so relative imports resolve correctly\n // Without this, the browser treats the package name as a file and resolves\n // relative imports to the wrong directory\n const mainEntry = packageJson.main.startsWith('./')\n ? packageJson.main.slice(2)\n : packageJson.main;\n const importUrl = `${cdnBaseUrl}/${name}${versionSuffix}/${mainEntry}`;\n moduleUrl = importUrl;\n const imageModule = await import(\n /* @vite-ignore */\n importUrl\n );\n if (typeof imageModule.setup === 'function') {\n setup = imageModule.setup;\n }\n if (typeof imageModule.mount === 'function') {\n mount = imageModule.mount;\n }\n } catch (err) {\n // Setup/mount are optional, but log the error for debugging\n console.error('[patchwork-compiler] Failed to load image module:', err);\n }\n }\n\n return {\n name: packageJson.name,\n version: packageJson.version,\n moduleUrl,\n config,\n dependencies: packageJson.dependencies || {},\n setup,\n mount,\n };\n}\n","/**\n * Image registry - manages loaded images\n */\n\nimport type { LoadedImage } from '../types.js';\nimport { loadImage, parseImageSpec } from './loader.js';\n\n/**\n * Registry of loaded images\n */\nclass ImageRegistry {\n private images = new Map<string, LoadedImage>();\n private loading = new Map<string, Promise<LoadedImage>>();\n\n /**\n * Get a loaded image by spec\n */\n get(spec: string): LoadedImage | undefined {\n const { name } = parseImageSpec(spec);\n return this.images.get(name);\n }\n\n /**\n * Check if an image is loaded\n */\n has(spec: string): boolean {\n const { name } = parseImageSpec(spec);\n return this.images.has(name);\n }\n\n /**\n * Load an image (or return cached)\n */\n async load(spec: string): Promise<LoadedImage> {\n const { name } = parseImageSpec(spec);\n\n // Return cached\n const cached = this.images.get(name);\n if (cached) {\n return cached;\n }\n\n // Return in-progress load\n const inProgress = this.loading.get(name);\n if (inProgress) {\n return inProgress;\n }\n\n // Start loading\n const loadPromise = loadImage(spec).then((image) => {\n this.images.set(name, image);\n this.loading.delete(name);\n return image;\n });\n\n this.loading.set(name, loadPromise);\n return loadPromise;\n }\n\n /**\n * Preload an image\n */\n async preload(spec: string): Promise<void> {\n await this.load(spec);\n }\n\n /**\n * Clear a specific image from cache\n */\n clear(spec: string): void {\n const { name } = parseImageSpec(spec);\n this.images.delete(name);\n this.loading.delete(name);\n }\n\n /**\n * Clear all cached images\n */\n clearAll(): void {\n this.images.clear();\n this.loading.clear();\n }\n\n /**\n * Get all loaded image names\n */\n getLoadedNames(): string[] {\n return Array.from(this.images.keys());\n }\n}\n\n// Global singleton registry\nlet globalRegistry: ImageRegistry | null = null;\n\n/**\n * Get the global image registry\n */\nexport function getImageRegistry(): ImageRegistry {\n if (!globalRegistry) {\n globalRegistry = new ImageRegistry();\n }\n return globalRegistry;\n}\n\n/**\n * Create a new isolated image registry\n */\nexport function createImageRegistry(): ImageRegistry {\n return new ImageRegistry();\n}\n\nexport { ImageRegistry };\n","/**\n * CDN transform - converts bare imports to CDN URLs (esm.sh)\n */\n\nimport type { Plugin } from 'esbuild-wasm';\n\nconst DEFAULT_CDN_BASE = 'https://esm.sh';\nlet cdnBaseUrl = DEFAULT_CDN_BASE;\n\nexport function setCdnBaseUrl(url: string): void {\n cdnBaseUrl = url;\n}\n\nexport function getCdnBaseUrl(): string {\n return cdnBaseUrl;\n}\n\n// Packages that should be externalized (not bundled from CDN)\nconst EXTERNAL_PACKAGES = new Set(['react', 'react-dom', 'ink']);\n\n// Built-in Node.js modules that should remain external\nconst NODE_BUILTINS = new Set([\n 'assert',\n 'buffer',\n 'child_process',\n 'cluster',\n 'crypto',\n 'dgram',\n 'dns',\n 'events',\n 'fs',\n 'http',\n 'http2',\n 'https',\n 'net',\n 'os',\n 'path',\n 'perf_hooks',\n 'process',\n 'querystring',\n 'readline',\n 'stream',\n 'string_decoder',\n 'timers',\n 'tls',\n 'tty',\n 'url',\n 'util',\n 'v8',\n 'vm',\n 'worker_threads',\n 'zlib',\n]);\n\n/**\n * Parse a package specifier into name and version\n */\nexport function parsePackageSpec(spec: string): {\n name: string;\n version?: string;\n} {\n // Handle scoped packages (@scope/name)\n if (spec.startsWith('@')) {\n const parts = spec.split('/');\n if (parts.length >= 2) {\n const scope = parts[0];\n const nameAndVersion = parts.slice(1).join('/');\n const atIndex = nameAndVersion.lastIndexOf('@');\n if (atIndex > 0) {\n return {\n name: `${scope}/${nameAndVersion.slice(0, atIndex)}`,\n version: nameAndVersion.slice(atIndex + 1),\n };\n }\n return { name: `${scope}/${nameAndVersion}` };\n }\n }\n\n // Handle non-scoped packages\n const atIndex = spec.lastIndexOf('@');\n if (atIndex > 0) {\n return {\n name: spec.slice(0, atIndex),\n version: spec.slice(atIndex + 1),\n };\n }\n return { name: spec };\n}\n\n/**\n * Convert a package specifier to an esm.sh URL\n *\n * @param packageName - The npm package name\n * @param version - Optional version specifier\n * @param subpath - Optional subpath (e.g., '/client' for 'react-dom/client')\n * @param deps - Optional dependency version overrides (use ?deps=react@18)\n */\nexport function toEsmShUrl(\n packageName: string,\n version?: string,\n subpath?: string,\n deps?: Record<string, string>,\n): string {\n let url = `${cdnBaseUrl}/${packageName}`;\n\n if (version) {\n url += `@${version}`;\n }\n\n if (subpath) {\n url += `/${subpath}`;\n }\n\n // Add deps flag to ensure consistent dependency versions across all packages\n // This makes all packages use the same React version, avoiding version mismatches\n if (deps && Object.keys(deps).length > 0) {\n const depsStr = Object.entries(deps)\n .map(([name, ver]) => `${name}@${ver}`)\n .join(',');\n url += `?deps=${depsStr}`;\n }\n\n return url;\n}\n\n/**\n * Check if an import path is a bare module specifier\n */\nexport function isBareImport(path: string): boolean {\n // Not bare if starts with ., /, or is a URL\n if (\n path.startsWith('.') ||\n path.startsWith('/') ||\n path.startsWith('http://') ||\n path.startsWith('https://')\n ) {\n return false;\n }\n return true;\n}\n\n/**\n * Extract package name and subpath from an import\n */\nexport function parseImportPath(importPath: string): {\n packageName: string;\n subpath?: string;\n} {\n // Handle scoped packages\n if (importPath.startsWith('@')) {\n const parts = importPath.split('/');\n if (parts.length >= 2) {\n const packageName = `${parts[0]}/${parts[1]}`;\n const subpath = parts.slice(2).join('/');\n return { packageName, subpath: subpath || undefined };\n }\n }\n\n // Handle non-scoped packages\n const parts = importPath.split('/');\n const packageName = parts[0] as string;\n const subpath = parts.slice(1).join('/');\n return { packageName, subpath: subpath || undefined };\n}\n\nexport interface CdnTransformOptions {\n /** Map of package names to versions */\n packages?: Record<string, string>;\n /** Additional external packages */\n external?: string[];\n /** Use bundled versions from esm.sh (adds ?bundle) */\n bundle?: boolean;\n /** Packages to inject from window globals instead of CDN */\n globals?: Record<string, string>;\n /** Dependency version overrides for CDN URLs (e.g., { react: '18' }) */\n deps?: Record<string, string>;\n /** Import path aliases (e.g., { '@/components/ui/*': '@packagedcn/react' }) */\n aliases?: Record<string, string>;\n}\n\n/**\n * Match an import path against alias patterns\n * Supports glob patterns like '@/components/ui/*'\n */\nfunction matchAlias(\n importPath: string,\n aliases: Record<string, string>,\n): string | null {\n for (const [pattern, target] of Object.entries(aliases)) {\n // Handle glob patterns ending with /*\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2); // Remove /*\n if (importPath === prefix || importPath.startsWith(prefix + '/')) {\n return target;\n }\n }\n // Exact match\n if (importPath === pattern) {\n return target;\n }\n }\n return null;\n}\n\n/**\n * Create an esbuild plugin that transforms bare imports to CDN URLs\n * and injects globals for specified packages (like React)\n */\nexport function cdnTransformPlugin(options: CdnTransformOptions = {}): Plugin {\n const {\n packages = {},\n external = [],\n bundle = false,\n globals = {},\n deps = {},\n aliases = {},\n } = options;\n\n const externalSet = new Set([...EXTERNAL_PACKAGES, ...external]);\n const globalsSet = new Set(Object.keys(globals));\n\n return {\n name: 'cdn-transform',\n setup(build) {\n // Handle import aliases first (e.g., @/components/ui/* -> @packagedcn/react)\n // This must resolve directly to CDN URL or global-inject\n build.onResolve({ filter: /.*/ }, (args) => {\n const aliasTarget = matchAlias(args.path, aliases);\n if (aliasTarget) {\n const { packageName, subpath } = parseImportPath(aliasTarget);\n\n // Check if aliased target should use globals\n if (globalsSet.has(packageName)) {\n return {\n path: aliasTarget,\n namespace: 'global-inject',\n };\n }\n\n // Convert aliased import directly to CDN URL\n const version = packages[packageName];\n let url = toEsmShUrl(\n packageName,\n version,\n subpath,\n Object.keys(deps).length > 0 ? deps : undefined,\n );\n if (bundle) {\n url += url.includes('?') ? '&bundle' : '?bundle';\n }\n\n return {\n path: url,\n external: true,\n };\n }\n return null;\n });\n\n // Handle packages that should come from window globals\n build.onResolve({ filter: /.*/ }, (args) => {\n if (!isBareImport(args.path)) {\n return null;\n }\n\n const { packageName } = parseImportPath(args.path);\n\n // Check if this package should be injected from globals\n if (globalsSet.has(packageName)) {\n return {\n path: args.path,\n namespace: 'global-inject',\n };\n }\n\n return null;\n });\n\n // Provide virtual modules that export window globals\n build.onLoad({ filter: /.*/, namespace: 'global-inject' }, (args) => {\n const { packageName, subpath } = parseImportPath(args.path);\n const globalName = globals[packageName];\n\n if (!globalName) return null;\n\n // Handle subpath imports like 'react-dom/client'\n if (subpath) {\n // For react-dom/client, we need to access window.ReactDOM (which is already the client)\n return {\n contents: `export * from '${packageName}'; export { default } from '${packageName}';`,\n loader: 'js',\n };\n }\n\n // Generate a module that exports the global\n // This handles both default and named exports\n const contents = `\nconst mod = window.${globalName};\nexport default mod;\n// Re-export all properties as named exports\nconst { ${getCommonExports(packageName).join(', ')} } = mod;\nexport { ${getCommonExports(packageName).join(', ')} };\n`;\n return {\n contents,\n loader: 'js',\n };\n });\n\n // Mark external packages and transform to CDN URLs\n build.onResolve({ filter: /.*/ }, (args) => {\n if (!isBareImport(args.path)) {\n return null; // Let esbuild handle relative/absolute imports\n }\n\n // Check if it's a Node.js builtin\n if (NODE_BUILTINS.has(args.path)) {\n return { external: true };\n }\n\n const { packageName, subpath } = parseImportPath(args.path);\n\n // Skip if handled by globals\n if (globalsSet.has(packageName)) {\n return null;\n }\n\n // Check if it should be external (but not converted to CDN)\n if (externalSet.has(packageName)) {\n return { external: true };\n }\n\n // Get version from packages map\n const version = packages[packageName];\n\n // Use deps from options for consistent dependency versions across CDN packages\n // This prevents multiple React instances which cause element serialization errors\n let url = toEsmShUrl(\n packageName,\n version,\n subpath,\n Object.keys(deps).length > 0 ? deps : undefined,\n );\n if (bundle) {\n url += url.includes('?') ? '&bundle' : '?bundle';\n }\n\n return {\n path: url,\n external: true,\n };\n });\n },\n };\n}\n\n/**\n * Get common named exports for known packages\n */\nfunction getCommonExports(packageName: string): string[] {\n const exports: Record<string, string[]> = {\n react: [\n 'useState',\n 'useEffect',\n 'useCallback',\n 'useMemo',\n 'useRef',\n 'useContext',\n 'useReducer',\n 'useLayoutEffect',\n 'useId',\n 'createContext',\n 'createElement',\n 'cloneElement',\n 'createRef',\n 'forwardRef',\n 'lazy',\n 'memo',\n 'Fragment',\n 'Suspense',\n 'StrictMode',\n 'Component',\n 'PureComponent',\n 'Children',\n 'isValidElement',\n ],\n 'react-dom': [\n 'createPortal',\n 'flushSync',\n 'render',\n 'hydrate',\n 'unmountComponentAtNode',\n ],\n };\n return exports[packageName] || [];\n}\n\n/**\n * Generate import map for CDN dependencies\n */\nexport function generateImportMap(\n packages: Record<string, string>,\n): Record<string, string> {\n const imports: Record<string, string> = {};\n\n for (const [name, version] of Object.entries(packages)) {\n imports[name] = toEsmShUrl(name, version);\n }\n\n return imports;\n}\n","import type { Plugin, Loader } from 'esbuild-wasm';\nimport type { VirtualProject } from '../vfs/types.js';\n\nfunction dirname(path: string): string {\n const idx = path.lastIndexOf('/');\n return idx === -1 ? '.' : path.slice(0, idx) || '.';\n}\n\nfunction normalizePath(path: string): string {\n const parts: string[] = [];\n for (const segment of path.split('/')) {\n if (segment === '..') parts.pop();\n else if (segment && segment !== '.') parts.push(segment);\n }\n return parts.join('/');\n}\n\nfunction inferLoader(path: string, language?: string): Loader {\n if (language) {\n switch (language) {\n case 'typescript':\n case 'ts':\n return 'ts';\n case 'tsx':\n return 'tsx';\n case 'javascript':\n case 'js':\n return 'js';\n case 'jsx':\n return 'jsx';\n case 'json':\n return 'json';\n case 'css':\n return 'css';\n }\n }\n const ext = path.split('.').pop();\n switch (ext) {\n case 'ts':\n return 'ts';\n case 'tsx':\n return 'tsx';\n case 'js':\n return 'js';\n case 'jsx':\n return 'jsx';\n case 'json':\n return 'json';\n case 'css':\n return 'css';\n default:\n return 'tsx';\n }\n}\n\nfunction normalizeVFSPath(path: string): string {\n if (path.startsWith('@/')) {\n return path.slice(2);\n }\n return path;\n}\n\nfunction resolveRelativePath(importer: string, target: string): string {\n const importerDir = dirname(normalizeVFSPath(importer));\n const combined = importerDir === '.' ? target : `${importerDir}/${target}`;\n return normalizePath(combined);\n}\n\nfunction matchAlias(\n importPath: string,\n aliases?: Record<string, string>,\n): string | null {\n if (!aliases) return null;\n for (const [pattern, target] of Object.entries(aliases)) {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2);\n if (importPath === prefix || importPath.startsWith(prefix + '/')) {\n return target;\n }\n }\n if (importPath === pattern) {\n return target;\n }\n }\n return null;\n}\n\nfunction findFile(project: VirtualProject, path: string): string | null {\n if (project.files.has(path)) return path;\n const extensions = ['.tsx', '.ts', '.jsx', '.js', '.json'];\n for (const ext of extensions) {\n if (project.files.has(path + ext)) return path + ext;\n }\n for (const ext of extensions) {\n const indexPath = `${path}/index${ext}`;\n if (project.files.has(indexPath)) return indexPath;\n }\n return null;\n}\n\nexport interface VFSPluginOptions {\n aliases?: Record<string, string>;\n}\n\nexport function vfsPlugin(\n project: VirtualProject,\n options: VFSPluginOptions = {},\n): Plugin {\n return {\n name: 'patchwork-vfs',\n setup(build) {\n build.onResolve({ filter: /^@\\// }, (args) => {\n const aliased = matchAlias(args.path, options.aliases);\n if (aliased) return null;\n return { path: args.path, namespace: 'vfs' };\n });\n\n build.onResolve({ filter: /^\\./ }, (args) => {\n if (args.namespace !== 'vfs') return null;\n const resolved = resolveRelativePath(args.importer, args.path);\n return { path: resolved, namespace: 'vfs' };\n });\n\n build.onLoad({ filter: /.*/, namespace: 'vfs' }, (args) => {\n const normalPath = normalizeVFSPath(args.path);\n const filePath = findFile(project, normalPath);\n if (!filePath) {\n throw new Error(`File not found in VFS: ${args.path}`);\n }\n const file = project.files.get(filePath)!;\n return {\n contents: file.content,\n loader: inferLoader(filePath, file.language),\n };\n });\n },\n };\n}\n","/**\n * Service bridge - handles communication between widgets and service proxy\n */\n\nimport type {\n BridgeMessage,\n ServiceCallPayload,\n ServiceResultPayload,\n ServiceProxy,\n} from '../types.js';\n\n/**\n * Generate a unique message ID\n */\nfunction generateMessageId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * Create a service proxy that calls the backend via HTTP\n */\nexport function createHttpServiceProxy(proxyUrl: string): ServiceProxy {\n return {\n async call(\n namespace: string,\n procedure: string,\n args: unknown[],\n ): Promise<unknown> {\n const url = `${proxyUrl}/${namespace}/${procedure}`;\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ args: args[0] ?? {} }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Service call failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = await response.json();\n return result;\n },\n };\n}\n\n/**\n * Creates a proxy that enables fluent method chaining for dynamic field access.\n *\n * This allows arbitrary nested property access that resolves to a callable function,\n * supporting patterns like `proxy.foo()`, `proxy.foo.bar()`, `proxy.bar.baz.qux()`.\n *\n * Used to create global namespace objects that proxy calls to a service backend.\n */\nexport function createFieldAccessProxy<T = unknown>(\n namespace: string,\n handler: (\n namespace: string,\n methodPath: string,\n ...args: T[]\n ) => Promise<unknown>,\n): Record<string, (...args: T[]) => Promise<unknown>> {\n function createNestedProxy(path: string): (...args: T[]) => Promise<unknown> {\n const fn = (...args: T[]) => handler(namespace, path, ...args);\n\n return new Proxy(fn, {\n get(_, nestedName: string) {\n if (typeof nestedName === 'symbol') return undefined;\n const newPath = path ? `${path}.${nestedName}` : nestedName;\n return createNestedProxy(newPath);\n },\n }) as (...args: T[]) => Promise<unknown>;\n }\n\n return new Proxy(\n {},\n {\n get(_, fieldName: string) {\n if (typeof fieldName === 'symbol') return undefined;\n return createNestedProxy(fieldName);\n },\n },\n );\n}\n\n/**\n * Create namespace globals that proxy calls to a service proxy\n *\n * Creates dynamic proxy objects for each namespace that support arbitrary\n * nested method calls. This replaces the old static method registration.\n *\n * @param services - Array of service names (e.g., ['git', 'github'])\n * @param proxy - The service proxy to forward calls to\n * @returns Record of namespace names to proxy objects\n *\n * @example\n * ```typescript\n * const namespaces = generateNamespaceGlobals(['git', 'github'], proxy);\n * // namespaces.git.status() calls proxy.call('git', 'status', [])\n * // namespaces.github.repos.list_for_user({ username: 'x' })\n * // calls proxy.call('github', 'repos.list_for_user', [{ username: 'x' }])\n * ```\n */\nexport function generateNamespaceGlobals(\n services: string[],\n proxy: ServiceProxy,\n): Record<string, unknown> {\n const namespaces: Record<string, unknown> = {};\n const uniqueNamespaces = extractNamespaces(services);\n\n for (const namespace of uniqueNamespaces) {\n namespaces[namespace] = createFieldAccessProxy(\n namespace,\n (ns, method, ...args) => proxy.call(ns, method, args),\n );\n }\n\n return namespaces;\n}\n\n/**\n * Inject namespace globals into a window object\n */\nexport function injectNamespaceGlobals(\n target: Window | typeof globalThis,\n namespaces: Record<string, unknown>,\n): void {\n for (const [name, value] of Object.entries(namespaces)) {\n (target as Record<string, unknown>)[name] = value;\n }\n}\n\n/**\n * Remove namespace globals from a window object\n */\nexport function removeNamespaceGlobals(\n target: Window | typeof globalThis,\n namespaceNames: string[],\n): void {\n for (const name of namespaceNames) {\n delete (target as Record<string, unknown>)[name];\n }\n}\n\n/**\n * Extract unique namespace names from services array\n */\nexport function extractNamespaces(services: string[]): string[] {\n const namespaces = new Set<string>();\n for (const service of services) {\n const parts = service.split('.');\n if (parts[0]) {\n namespaces.add(parts[0]);\n }\n }\n return Array.from(namespaces);\n}\n\n/**\n * Parent-side bridge for iframe communication\n *\n * Listens for postMessage events from iframes and proxies service calls.\n */\nexport class ParentBridge {\n private proxy: ServiceProxy;\n private pendingCalls = new Map<\n string,\n { resolve: (value: unknown) => void; reject: (error: Error) => void }\n >();\n private iframes = new Set<HTMLIFrameElement>();\n private messageHandler: (event: MessageEvent) => void;\n\n constructor(proxy: ServiceProxy) {\n this.proxy = proxy;\n this.messageHandler = this.handleMessage.bind(this);\n if (typeof window !== 'undefined') {\n window.addEventListener('message', this.messageHandler);\n }\n }\n\n /**\n * Register an iframe to receive messages from\n */\n registerIframe(iframe: HTMLIFrameElement): void {\n this.iframes.add(iframe);\n }\n\n /**\n * Unregister an iframe\n */\n unregisterIframe(iframe: HTMLIFrameElement): void {\n this.iframes.delete(iframe);\n }\n\n /**\n * Handle incoming messages from iframes\n */\n private async handleMessage(event: MessageEvent): Promise<void> {\n // Verify source is a registered iframe\n const sourceIframe = Array.from(this.iframes).find(\n (iframe) => iframe.contentWindow === event.source,\n );\n\n if (!sourceIframe) {\n return; // Ignore messages from unknown sources\n }\n\n const message = event.data as BridgeMessage;\n if (!message || typeof message !== 'object') return;\n\n if (message.type === 'service-call') {\n const payload = message.payload as ServiceCallPayload;\n try {\n const result = await this.proxy.call(\n payload.namespace,\n payload.procedure,\n payload.args,\n );\n\n const response: BridgeMessage = {\n type: 'service-result',\n id: message.id,\n payload: { result } as ServiceResultPayload,\n };\n\n sourceIframe.contentWindow?.postMessage(response, '*');\n } catch (error) {\n const response: BridgeMessage = {\n type: 'service-result',\n id: message.id,\n payload: {\n error: error instanceof Error ? error.message : String(error),\n } as ServiceResultPayload,\n };\n\n sourceIframe.contentWindow?.postMessage(response, '*');\n }\n }\n }\n\n /**\n * Dispose the bridge\n */\n dispose(): void {\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', this.messageHandler);\n }\n this.iframes.clear();\n this.pendingCalls.clear();\n }\n}\n\n/**\n * Child-side bridge for iframe communication\n *\n * Creates a service proxy that sends postMessage to parent.\n */\nexport function createIframeServiceProxy(): ServiceProxy {\n const pendingCalls = new Map<\n string,\n { resolve: (value: unknown) => void; reject: (error: Error) => void }\n >();\n\n // Listen for results from parent\n if (typeof window !== 'undefined') {\n window.addEventListener('message', (event: MessageEvent) => {\n const message = event.data as BridgeMessage;\n if (!message || typeof message !== 'object') return;\n\n if (message.type === 'service-result') {\n const pending = pendingCalls.get(message.id);\n if (pending) {\n pendingCalls.delete(message.id);\n const payload = message.payload as ServiceResultPayload;\n if (payload.error) {\n pending.reject(new Error(payload.error));\n } else {\n pending.resolve(payload.result);\n }\n }\n }\n });\n }\n\n return {\n call(\n namespace: string,\n procedure: string,\n args: unknown[],\n ): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const id = generateMessageId();\n pendingCalls.set(id, { resolve, reject });\n\n const message: BridgeMessage = {\n type: 'service-call',\n id,\n payload: { namespace, procedure, args } as ServiceCallPayload,\n };\n\n window.parent.postMessage(message, '*');\n\n // Timeout after 30 seconds\n setTimeout(() => {\n if (pendingCalls.has(id)) {\n pendingCalls.delete(id);\n reject(\n new Error(`Service call timeout: ${namespace}.${procedure}`),\n );\n }\n }, 30000);\n });\n },\n };\n}\n\n/**\n * Generate the bridge script to inject into iframes\n *\n * Creates a self-contained script that sets up:\n * 1. Message handling for service results from parent\n * 2. Dynamic proxy objects for each namespace that support arbitrary nested calls\n */\nexport function generateIframeBridgeScript(services: string[]): string {\n const uniqueNamespaces = extractNamespaces(services);\n const namespaceAssignments = uniqueNamespaces\n .map((ns) => `window.${ns} = createNamespaceProxy('${ns}');`)\n .join('\\n ');\n\n return `\n(function() {\n const pendingCalls = new Map();\n\n window.addEventListener('message', function(event) {\n const message = event.data;\n if (!message || typeof message !== 'object') return;\n\n if (message.type === 'service-result') {\n const pending = pendingCalls.get(message.id);\n if (pending) {\n pendingCalls.delete(message.id);\n if (message.payload.error) {\n pending.reject(new Error(message.payload.error));\n } else {\n pending.resolve(message.payload.result);\n }\n }\n }\n });\n\n function proxyCall(namespace, procedure, args) {\n return new Promise(function(resolve, reject) {\n const id = Date.now() + '-' + Math.random().toString(36).slice(2, 11);\n pendingCalls.set(id, { resolve: resolve, reject: reject });\n\n window.parent.postMessage({\n type: 'service-call',\n id: id,\n payload: { namespace: namespace, procedure: procedure, args: args }\n }, '*');\n\n setTimeout(function() {\n if (pendingCalls.has(id)) {\n pendingCalls.delete(id);\n reject(new Error('Service call timeout: ' + namespace + '.' + procedure));\n }\n }, 30000);\n });\n }\n\n // Create a dynamic proxy for a namespace that supports arbitrary nested method calls\n function createNamespaceProxy(namespace) {\n function createNestedProxy(path) {\n var fn = function() {\n return proxyCall(namespace, path, Array.prototype.slice.call(arguments));\n };\n\n return new Proxy(fn, {\n get: function(_, nestedName) {\n if (typeof nestedName === 'symbol') return undefined;\n var newPath = path ? path + '.' + nestedName : nestedName;\n return createNestedProxy(newPath);\n }\n });\n }\n\n return new Proxy({}, {\n get: function(_, fieldName) {\n if (typeof fieldName === 'symbol') return undefined;\n return createNestedProxy(fieldName);\n }\n });\n }\n\n ${namespaceAssignments}\n})();\n`;\n}\n","/**\n * Embedded mount mode - mounts widgets directly in the DOM\n *\n * For trusted widgets that need full window access.\n */\n\nimport type {\n CompiledWidget,\n LoadedImage,\n MountedWidget,\n MountOptions,\n ServiceProxy,\n} from '../types.js';\nimport {\n generateNamespaceGlobals,\n injectNamespaceGlobals,\n removeNamespaceGlobals,\n extractNamespaces,\n} from './bridge.js';\n\nlet mountCounter = 0;\nlet importMapInjected = false;\n\n/**\n * Inject an import map for bare module specifiers.\n * Maps package names to their CDN URLs so browsers can resolve them.\n * Must be called before any ES module imports happen.\n */\nfunction injectImportMap(\n globals: Record<string, string>,\n preloadUrls: string[],\n deps?: Record<string, string>,\n): void {\n // Only inject once per page (browser limitation)\n if (importMapInjected) return;\n\n // Check if there's already an import map\n const existingMap = document.querySelector('script[type=\"importmap\"]');\n if (existingMap) {\n // Cannot modify existing import maps in standard browsers\n importMapInjected = true;\n return;\n }\n\n // Build import map from globals + preload URLs\n // Convention: globals keys are package names, preload URLs are in matching order\n const imports: Record<string, string> = {};\n const packageNames = Object.keys(globals);\n\n packageNames.forEach((pkgName, index) => {\n // Use the preload URL if available, otherwise construct CDN URL\n if (preloadUrls[index]) {\n imports[pkgName] = preloadUrls[index];\n } else if (deps?.[pkgName]) {\n imports[pkgName] = `https://esm.sh/${pkgName}@${deps[pkgName]}`;\n } else {\n imports[pkgName] = `https://esm.sh/${pkgName}`;\n }\n });\n\n // Also add common subpaths (e.g., react-dom/client)\n if (imports['react-dom']) {\n imports['react-dom/client'] = imports['react-dom'];\n }\n\n // Inject new import map\n const script = document.createElement('script');\n script.type = 'importmap';\n script.textContent = JSON.stringify({ imports }, null, 2);\n document.head.insertBefore(script, document.head.firstChild);\n\n importMapInjected = true;\n}\n\n/**\n * Generate a unique mount ID\n */\nfunction generateMountId(): string {\n return `pw-mount-${Date.now()}-${++mountCounter}`;\n}\n\ntype CreateElementFn = (...args: unknown[]) => unknown;\ntype CreateRootFn = (el: HTMLElement) => {\n render: (el: unknown) => void;\n unmount?: () => void;\n};\ntype RenderFn = (el: unknown, container: HTMLElement) => void;\n\ntype Renderer =\n | { kind: 'root'; createRoot: CreateRootFn }\n | { kind: 'render'; render: RenderFn };\n\nfunction pickCreateElement(\n globals: Array<Record<string, unknown>>,\n): CreateElementFn | null {\n for (const obj of globals) {\n const ce = obj?.createElement;\n if (typeof ce === 'function') return ce as CreateElementFn;\n const def = obj?.default as Record<string, unknown> | undefined;\n if (def && typeof def.createElement === 'function') {\n return def.createElement as CreateElementFn;\n }\n }\n return null;\n}\n\nfunction pickRenderer(\n globals: Array<Record<string, unknown>>,\n): Renderer | null {\n for (const obj of globals) {\n if (obj && typeof obj.createRoot === 'function') {\n return { kind: 'root', createRoot: obj.createRoot as CreateRootFn };\n }\n if (obj && typeof obj.render === 'function') {\n return { kind: 'render', render: obj.render as RenderFn };\n }\n const def = obj?.default as Record<string, unknown> | undefined;\n if (def && typeof def.createRoot === 'function') {\n return { kind: 'root', createRoot: def.createRoot as CreateRootFn };\n }\n if (def && typeof def.render === 'function') {\n return { kind: 'render', render: def.render as RenderFn };\n }\n }\n return null;\n}\n\n/**\n * Mount a widget in embedded mode (direct DOM injection)\n */\nexport async function mountEmbedded(\n widget: CompiledWidget,\n options: MountOptions,\n image: LoadedImage | null,\n proxy: ServiceProxy,\n): Promise<MountedWidget> {\n const { target, inputs = {} } = options;\n const mountId = generateMountId();\n\n // Create container\n const container = document.createElement('div');\n container.id = mountId;\n container.className = 'patchwork-widget patchwork-embedded';\n target.appendChild(container);\n\n // Run image setup if available\n if (image?.setup) {\n await image.setup(container);\n }\n\n // Inject CSS if available\n if (image?.css) {\n const style = document.createElement('style');\n style.id = `${mountId}-style`;\n style.textContent = image.css;\n document.head.appendChild(style);\n }\n\n // Generate and inject service namespace globals\n const services = widget.manifest.services || [];\n const namespaceNames = extractNamespaces(services);\n const namespaces = generateNamespaceGlobals(services, proxy);\n injectNamespaceGlobals(window, namespaces);\n\n // Get framework config from image\n const frameworkConfig = image?.config?.framework || {};\n const preloadUrls = frameworkConfig.preload || [];\n const globalMapping = frameworkConfig.globals || {};\n const deps = frameworkConfig.deps || {};\n\n // Inject import map for bare module specifiers (must happen before ES module imports)\n // This allows the browser to resolve imports like 'react' to CDN URLs\n injectImportMap(globalMapping, preloadUrls, deps);\n\n // Pre-load framework modules from image config\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const preloadedModules: any[] = await Promise.all(\n preloadUrls.map(\n (url: string) => import(/* webpackIgnore: true */ /* @vite-ignore */ url),\n ),\n );\n\n // Set framework globals on window based on image config\n const win = window as unknown as Record<string, unknown>;\n const globalNames = Object.values(globalMapping) as string[];\n\n // Map preloaded modules to their global names\n // Convention: preload order matches globals order (react -> React, react-dom -> ReactDOM)\n preloadedModules.forEach((mod, index) => {\n if (globalNames[index]) {\n const name = globalNames[index];\n win[name] = mod;\n }\n });\n\n // Create a blob with the widget code\n const blob = new Blob([widget.code], { type: 'application/javascript' });\n const scriptUrl = URL.createObjectURL(blob);\n\n // Import the module\n let moduleCleanup: (() => void) | undefined;\n\n const globalObjects = globalNames\n .map((n) => win[n] as unknown)\n .filter(Boolean) as Array<Record<string, unknown>>;\n\n try {\n const module = await import(/* webpackIgnore: true */ scriptUrl);\n\n // Image-provided mount handler takes priority\n if (image?.mount) {\n const result = await image.mount(module, container, inputs);\n if (typeof result === 'function') {\n moduleCleanup = result;\n }\n } else if (typeof module.mount === 'function') {\n // Widget exports its own mount function\n const result = await module.mount(container, inputs);\n if (typeof result === 'function') {\n moduleCleanup = result;\n }\n } else if (typeof module.render === 'function') {\n // Custom render function\n const result = await module.render(container, inputs);\n if (typeof result === 'function') {\n moduleCleanup = result;\n }\n } else if (typeof module.default === 'function') {\n // Default export component - render using framework\n const Component = module.default;\n\n const createElement = pickCreateElement(globalObjects);\n const renderer = pickRenderer(globalObjects);\n\n if (createElement && renderer?.kind === 'root') {\n const root = renderer.createRoot(container);\n root.render(createElement(Component, inputs));\n if (typeof root.unmount === 'function') {\n moduleCleanup = () => root.unmount!();\n }\n } else if (createElement && renderer?.kind === 'render') {\n renderer.render(createElement(Component, inputs), container);\n } else {\n // No framework renderer - try calling as plain function\n const result = Component(inputs);\n if (result instanceof HTMLElement) {\n container.appendChild(result);\n } else if (typeof result === 'string') {\n container.innerHTML = result;\n }\n }\n }\n } finally {\n URL.revokeObjectURL(scriptUrl);\n }\n\n // Create unmount function\n const unmount = () => {\n // Call module cleanup if available\n if (moduleCleanup) {\n moduleCleanup();\n }\n\n // Remove namespace globals\n removeNamespaceGlobals(window, namespaceNames);\n\n // Remove style\n const style = document.getElementById(`${mountId}-style`);\n if (style) {\n style.remove();\n }\n\n // Remove container\n container.remove();\n };\n\n return {\n id: mountId,\n widget,\n mode: 'embedded',\n target,\n inputs,\n unmount,\n };\n}\n\n/**\n * Hot reload an embedded widget\n */\nexport async function reloadEmbedded(\n mounted: MountedWidget,\n widget: CompiledWidget,\n image: LoadedImage | null,\n proxy: ServiceProxy,\n): Promise<MountedWidget> {\n // Unmount existing\n mounted.unmount();\n\n // Remount with new widget\n return mountEmbedded(\n widget,\n { target: mounted.target, mode: 'embedded', inputs: mounted.inputs },\n image,\n proxy,\n );\n}\n","/**\n * Iframe mount mode - mounts widgets in sandboxed iframes\n *\n * For untrusted widgets that need isolation.\n */\n\nimport type {\n CompiledWidget,\n LoadedImage,\n MountedWidget,\n MountOptions,\n ServiceProxy,\n} from '../types.js';\nimport { ParentBridge, generateIframeBridgeScript } from './bridge.js';\nimport { generateImportMap } from '../transforms/cdn.js';\n\nlet mountCounter = 0;\n\n// Shared bridge for all iframes\nlet sharedBridge: ParentBridge | null = null;\n\n/**\n * Get or create the shared parent bridge\n */\nfunction getParentBridge(proxy: ServiceProxy): ParentBridge {\n if (!sharedBridge) {\n sharedBridge = new ParentBridge(proxy);\n }\n return sharedBridge;\n}\n\n/**\n * Generate a unique mount ID\n */\nfunction generateMountId(): string {\n return `pw-iframe-${Date.now()}-${++mountCounter}`;\n}\n\n/**\n * Default sandbox attributes for iframes (production)\n *\n * By default, iframes are strictly sandboxed without same-origin access.\n * This is the safest option when widgets load all dependencies from external CDNs.\n */\nconst DEFAULT_SANDBOX = ['allow-scripts'];\n\n/**\n * Development sandbox attributes - includes allow-same-origin\n *\n * allow-same-origin is required when:\n * - Fetching modules from the parent origin (e.g., /_local-packages/ in dev)\n * - Using import maps that reference parent-relative URLs\n * - Accessing the parent's CDN proxy\n *\n * Note: This does NOT allow the iframe to access parent's DOM or cookies,\n * but it does allow same-origin network requests.\n *\n * WARNING: Combining allow-scripts + allow-same-origin allows the iframe to\n * escape its sandbox. Only use in development or when hosting on a separate subdomain.\n */\nexport const DEV_SANDBOX = ['allow-scripts', 'allow-same-origin'];\n\n/**\n * Generate the HTML content for the iframe\n */\nfunction generateIframeContent(\n image: LoadedImage | null,\n inputs: Record<string, unknown>,\n services: string[],\n baseUrl: string,\n): string {\n const bridgeScript = generateIframeBridgeScript(services);\n\n // Generate import map from image dependencies and manifest packages\n const packages = {\n ...(image?.dependencies || {}),\n };\n const importMap = generateImportMap(packages);\n\n // CSS from image\n const css = image?.css || '';\n\n const frameworkConfig = image?.config?.framework || {};\n const preloadUrls = frameworkConfig.preload || [];\n const globals = frameworkConfig.globals || {};\n const globalNames = Object.values(globals);\n const imageModuleUrl = image?.moduleUrl || '';\n\n const mountScript = `\n // Run image setup inside the iframe (styling/runtime)\n const imageModuleUrl = ${JSON.stringify(imageModuleUrl)};\n\n // Preload framework modules declared by the image (if any)\n const preloadUrls = ${JSON.stringify(preloadUrls)};\n const globalNames = ${JSON.stringify(globalNames)};\n for (let i = 0; i < preloadUrls.length; i++) {\n const url = preloadUrls[i];\n const name = globalNames[i];\n if (!url || !name) continue;\n try {\n const mod = await import(/* webpackIgnore: true */ url);\n window[name] = mod;\n } catch (e) {\n console.error('[patchwork-iframe] Failed to preload:', url, e);\n }\n }\n\n const root = document.getElementById('root');\n const inputs = window.__PATCHWORK_INPUTS__ || {};\n\n if (imageModuleUrl && root) {\n try {\n const img = await import(/* webpackIgnore: true */ imageModuleUrl);\n if (typeof img?.setup === 'function') {\n await img.setup(root);\n }\n } catch (e) {\n console.error('[patchwork-iframe] Failed to run image setup:', e);\n }\n }\n\n function pickCreateElement(globals) {\n for (const obj of globals) {\n if (obj && typeof obj.createElement === 'function') return obj.createElement.bind(obj);\n if (obj?.default && typeof obj.default.createElement === 'function') return obj.default.createElement.bind(obj.default);\n }\n return null;\n }\n\n function pickRenderer(globals) {\n for (const obj of globals) {\n if (obj && typeof obj.createRoot === 'function') {\n return {\n kind: 'root',\n createRoot: obj.createRoot.bind(obj),\n };\n }\n if (obj && typeof obj.render === 'function') {\n return {\n kind: 'render',\n render: obj.render.bind(obj),\n };\n }\n if (obj?.default && typeof obj.default.createRoot === 'function') {\n return {\n kind: 'root',\n createRoot: obj.default.createRoot.bind(obj.default),\n };\n }\n if (obj?.default && typeof obj.default.render === 'function') {\n return {\n kind: 'render',\n render: obj.default.render.bind(obj.default),\n };\n }\n }\n return null;\n }\n\n function getGlobalsFromConfig() {\n const names = ${JSON.stringify(globalNames)};\n return names.map((n) => window[n]).filter(Boolean);\n }\n\n async function mountModule(mod) {\n if (!root) throw new Error('No #root element');\n\n if (typeof mod?.mount === 'function') {\n const cleanup = await mod.mount(root, inputs);\n if (typeof cleanup === 'function') window.__PATCHWORK_CLEANUP__ = cleanup;\n return;\n }\n\n if (typeof mod?.render === 'function') {\n const cleanup = await mod.render(root, inputs);\n if (typeof cleanup === 'function') window.__PATCHWORK_CLEANUP__ = cleanup;\n return;\n }\n\n const Component = mod?.default;\n if (typeof Component !== 'function') {\n root.textContent = 'Widget did not export a default component.';\n return;\n }\n\n const globals = getGlobalsFromConfig();\n const createElement = pickCreateElement(globals);\n const renderer = pickRenderer(globals);\n\n if (createElement && renderer?.kind === 'root') {\n const r = renderer.createRoot(root);\n r.render(createElement(Component, inputs));\n if (typeof r.unmount === 'function') window.__PATCHWORK_CLEANUP__ = () => r.unmount();\n return;\n }\n\n if (createElement && renderer?.kind === 'render') {\n renderer.render(createElement(Component, inputs), root);\n return;\n }\n\n const result = Component(inputs);\n if (result instanceof HTMLElement) {\n root.appendChild(result);\n return;\n }\n if (typeof result === 'string') {\n root.innerHTML = result;\n return;\n }\n\n root.textContent = 'No framework renderer available for this widget.';\n }\n\n // Wait for widget code via postMessage (more efficient than inline in srcdoc)\n // We convert relative URLs to absolute so they work inside blob URL context\n window.addEventListener('message', async function handleWidgetCode(event) {\n if (!event.data || event.data.type !== 'widget-code') return;\n window.removeEventListener('message', handleWidgetCode);\n \n const widgetCode = event.data.code;\n const origin = event.data.origin || ''; // Parent sends the origin\n \n // Convert relative URLs (starting with /) to absolute URLs\n // This is necessary because blob: URLs can't resolve relative imports\n // and srcdoc iframes have null origin\n const absoluteCode = widgetCode.replace(\n /from\\\\s*[\"'](\\\\/[^\"']+)[\"']/g,\n (_, path) => 'from \"' + origin + path + '\"'\n ).replace(\n /import\\\\s*[\"'](\\\\/[^\"']+)[\"']/g,\n (_, path) => 'import \"' + origin + path + '\"'\n );\n \n const blob = new Blob([absoluteCode], { type: 'application/javascript' });\n const url = URL.createObjectURL(blob);\n \n try {\n const mod = await import(/* webpackIgnore: true */ url);\n await mountModule(mod);\n window.parent.postMessage({ type: 'widget-mounted' }, '*');\n } catch (e) {\n console.error('[patchwork-iframe] Failed to mount widget:', e);\n window.parent.postMessage({ type: 'widget-error', error: e.message }, '*');\n } finally {\n URL.revokeObjectURL(url);\n }\n });\n\n // Signal ready to receive widget code\n window.parent.postMessage({ type: 'widget-ready' }, '*');\n\n // Set up ResizeObserver to report body size changes to parent\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n window.parent.postMessage({ \n type: 'widget-resize', \n width: Math.ceil(width), \n height: Math.ceil(height) \n }, '*');\n }\n });\n resizeObserver.observe(document.body);\n `;\n\n return `<!DOCTYPE html>\n<html>\n<head>\n <base href=\"${baseUrl}\">\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <style>\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body { font-family: system-ui, -apple-system, sans-serif; }\n ${css}\n </style>\n <script type=\"importmap\">\n ${JSON.stringify({ imports: importMap }, null, 2)}\n </script>\n</head>\n<body>\n <div id=\"root\"></div>\n\n <!-- Service Bridge -->\n <script>\n ${bridgeScript}\n </script>\n\n <!-- Widget Inputs -->\n <script>\n window.__PATCHWORK_INPUTS__ = ${JSON.stringify(inputs)};\n </script>\n\n <script type=\"module\">\n ${mountScript}\n </script>\n</body>\n</html>`;\n}\n\n/**\n * Mount a widget in iframe mode (sandboxed)\n */\nexport async function mountIframe(\n widget: CompiledWidget,\n options: MountOptions,\n image: LoadedImage | null,\n proxy: ServiceProxy,\n): Promise<MountedWidget> {\n const { target, sandbox = DEFAULT_SANDBOX, inputs = {} } = options;\n const mountId = generateMountId();\n\n // Create iframe\n const iframe = document.createElement('iframe');\n iframe.id = mountId;\n iframe.className = 'patchwork-widget patchwork-iframe';\n iframe.style.cssText = 'width: 100%; border: none; overflow: hidden;';\n iframe.sandbox.add(...sandbox);\n\n // Register with bridge before loading content\n const bridge = getParentBridge(proxy);\n bridge.registerIframe(iframe);\n\n // Generate and set iframe content (without widget code)\n // Use window.location.origin as base URL so relative paths like /_local-packages/ resolve correctly\n const services = widget.manifest.services || [];\n const baseUrl = typeof window !== 'undefined' ? window.location.origin : '';\n const content = generateIframeContent(image, inputs, services, baseUrl);\n iframe.srcdoc = content;\n\n // Append to target\n target.appendChild(iframe);\n\n // Handle resize messages from iframe\n const handleResize = (event: MessageEvent) => {\n if (event.source !== iframe.contentWindow) return;\n if (event.data?.type === 'widget-resize') {\n const { height } = event.data;\n if (typeof height === 'number' && height > 0) {\n iframe.style.height = `${height}px`;\n }\n }\n };\n window.addEventListener('message', handleResize);\n\n // Wait for iframe to signal ready, then send widget code\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error('Iframe mount timeout'));\n }, 30000);\n\n const handleMessage = (event: MessageEvent) => {\n if (event.source !== iframe.contentWindow) return;\n\n if (event.data?.type === 'widget-ready') {\n // Send widget code and origin for URL rewriting\n iframe.contentWindow?.postMessage(\n { type: 'widget-code', code: widget.code, origin: baseUrl },\n '*',\n );\n } else if (event.data?.type === 'widget-mounted') {\n cleanup();\n resolve();\n } else if (event.data?.type === 'widget-error') {\n cleanup();\n reject(new Error(event.data.error || 'Widget mount failed'));\n }\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n window.removeEventListener('message', handleMessage);\n };\n\n window.addEventListener('message', handleMessage);\n });\n\n // Create unmount function\n const unmount = () => {\n window.removeEventListener('message', handleResize);\n bridge.unregisterIframe(iframe);\n iframe.remove();\n };\n\n return {\n id: mountId,\n widget,\n mode: 'iframe',\n target,\n iframe,\n inputs,\n sandbox,\n unmount,\n };\n}\n\n/**\n * Hot reload an iframe widget\n */\nexport async function reloadIframe(\n mounted: MountedWidget,\n widget: CompiledWidget,\n image: LoadedImage | null,\n proxy: ServiceProxy,\n): Promise<MountedWidget> {\n // Unmount existing\n mounted.unmount();\n\n // Remount with new widget\n return mountIframe(\n widget,\n {\n target: mounted.target,\n mode: 'iframe',\n sandbox: mounted.sandbox,\n inputs: mounted.inputs,\n },\n image,\n proxy,\n );\n}\n\n/**\n * Dispose the shared bridge (call on app shutdown)\n */\nexport function disposeIframeBridge(): void {\n if (sharedBridge) {\n sharedBridge.dispose();\n sharedBridge = null;\n }\n}\n","import type { DirEntry, FileStats } from \"./types.js\";\n\nexport function createFileStats(\n size: number,\n mtime: Date,\n isDir = false,\n): FileStats {\n return {\n size,\n mtime,\n isFile: () => !isDir,\n isDirectory: () => isDir,\n };\n}\n\nexport function createDirEntry(name: string, isDir: boolean): DirEntry {\n return {\n name,\n isFile: () => !isDir,\n isDirectory: () => isDir,\n };\n}\n\nexport function normalizePath(path: string): string {\n return path.replace(/\\/+/g, \"/\").replace(/^\\/|\\/$/g, \"\");\n}\n\nexport function dirname(path: string): string {\n const normalized = normalizePath(path);\n const lastSlash = normalized.lastIndexOf(\"/\");\n return lastSlash === -1 ? \"\" : normalized.slice(0, lastSlash);\n}\n\nexport function basename(path: string): string {\n const normalized = normalizePath(path);\n const lastSlash = normalized.lastIndexOf(\"/\");\n return lastSlash === -1 ? normalized : normalized.slice(lastSlash + 1);\n}\n\nexport function join(...parts: string[]): string {\n return normalizePath(parts.filter(Boolean).join(\"/\"));\n}\n","import type {\n DirEntry,\n FileStats,\n FSProvider,\n WatchCallback,\n} from \"../core/types.js\";\nimport {\n basename,\n createDirEntry,\n createFileStats,\n dirname,\n normalizePath,\n} from \"../core/utils.js\";\n\ninterface FileEntry {\n content: string;\n mtime: Date;\n}\n\n/**\n * In-memory FSProvider implementation.\n * Useful for tests and ephemeral file systems.\n */\nexport class MemoryBackend implements FSProvider {\n private files = new Map<string, FileEntry>();\n private dirs = new Set<string>([\"\"]);\n private watchers = new Map<string, Set<WatchCallback>>();\n\n async readFile(path: string): Promise<string> {\n const entry = this.files.get(normalizePath(path));\n if (!entry) throw new Error(`ENOENT: ${path}`);\n return entry.content;\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n const normalized = normalizePath(path);\n const dir = dirname(normalized);\n if (dir && !this.dirs.has(dir)) {\n throw new Error(`ENOENT: ${dir}`);\n }\n const isNew = !this.files.has(normalized);\n this.files.set(normalized, { content, mtime: new Date() });\n this.emit(isNew ? \"create\" : \"update\", normalized);\n }\n\n async unlink(path: string): Promise<void> {\n const normalized = normalizePath(path);\n if (!this.files.delete(normalized)) {\n throw new Error(`ENOENT: ${path}`);\n }\n this.emit(\"delete\", normalized);\n }\n\n async stat(path: string): Promise<FileStats> {\n const normalized = normalizePath(path);\n const entry = this.files.get(normalized);\n if (entry) {\n return createFileStats(entry.content.length, entry.mtime, false);\n }\n if (this.dirs.has(normalized)) {\n return createFileStats(0, new Date(), true);\n }\n throw new Error(`ENOENT: ${path}`);\n }\n\n async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n const normalized = normalizePath(path);\n if (this.dirs.has(normalized)) return;\n\n const parent = dirname(normalized);\n if (parent && !this.dirs.has(parent)) {\n if (options?.recursive) {\n await this.mkdir(parent, options);\n } else {\n throw new Error(`ENOENT: ${parent}`);\n }\n }\n this.dirs.add(normalized);\n }\n\n async readdir(path: string): Promise<DirEntry[]> {\n const normalized = normalizePath(path);\n if (!this.dirs.has(normalized)) {\n throw new Error(`ENOENT: ${path}`);\n }\n\n const prefix = normalized ? `${normalized}/` : \"\";\n const entries = new Map<string, boolean>();\n\n for (const filePath of this.files.keys()) {\n if (filePath.startsWith(prefix)) {\n const rest = filePath.slice(prefix.length);\n const name = rest.split(\"/\")[0];\n if (name) entries.set(name, false);\n }\n }\n\n for (const dirPath of this.dirs) {\n if (dirPath.startsWith(prefix) && dirPath !== normalized) {\n const rest = dirPath.slice(prefix.length);\n const name = rest.split(\"/\")[0];\n if (name) entries.set(name, true);\n }\n }\n\n return Array.from(entries).map(([name, isDir]) =>\n createDirEntry(name, isDir),\n );\n }\n\n async rmdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n const normalized = normalizePath(path);\n if (!this.dirs.has(normalized)) {\n throw new Error(`ENOENT: ${path}`);\n }\n\n const prefix = `${normalized}/`;\n const hasChildren =\n [...this.files.keys()].some((p) => p.startsWith(prefix)) ||\n [...this.dirs].some((d) => d.startsWith(prefix));\n\n if (hasChildren && !options?.recursive) {\n throw new Error(`ENOTEMPTY: ${path}`);\n }\n\n if (options?.recursive) {\n for (const filePath of this.files.keys()) {\n if (filePath.startsWith(prefix)) {\n this.files.delete(filePath);\n this.emit(\"delete\", filePath);\n }\n }\n for (const dirPath of this.dirs) {\n if (dirPath.startsWith(prefix)) {\n this.dirs.delete(dirPath);\n }\n }\n }\n\n this.dirs.delete(normalized);\n }\n\n async exists(path: string): Promise<boolean> {\n const normalized = normalizePath(path);\n return this.files.has(normalized) || this.dirs.has(normalized);\n }\n\n watch(path: string, callback: WatchCallback): () => void {\n const normalized = normalizePath(path);\n let callbacks = this.watchers.get(normalized);\n if (!callbacks) {\n callbacks = new Set();\n this.watchers.set(normalized, callbacks);\n }\n callbacks.add(callback);\n return () => callbacks!.delete(callback);\n }\n\n private emit(event: \"create\" | \"update\" | \"delete\", path: string): void {\n // Notify watchers for this path and all parent paths\n let current = path;\n while (true) {\n const callbacks = this.watchers.get(current);\n if (callbacks) {\n for (const cb of callbacks) cb(event, path);\n }\n if (!current) break;\n current = dirname(current);\n }\n }\n}\n","import type {\n ChangeRecord,\n DirEntry,\n FileStats,\n FSProvider,\n WatchCallback,\n WatchEventType,\n} from \"./types.js\";\nimport { MemoryBackend } from \"../backends/memory.js\";\n\ntype ChangeListener = (record: ChangeRecord) => void;\n\n/**\n * VirtualFS wraps an FSProvider with change tracking.\n * Tracks all local modifications for sync operations.\n */\nexport class VirtualFS implements FSProvider {\n private changes = new Map<string, ChangeRecord>();\n private listeners = new Set<ChangeListener>();\n private backend: FSProvider;\n\n constructor(backend?: FSProvider) {\n this.backend = backend ?? new MemoryBackend();\n }\n\n async readFile(path: string, encoding?: \"utf8\" | \"base64\"): Promise<string> {\n return this.backend.readFile(path, encoding);\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n const existed = await this.backend.exists(path);\n await this.backend.writeFile(path, content);\n this.recordChange(path, existed ? \"update\" : \"create\");\n }\n\n async applyRemoteFile(path: string, content: string): Promise<void> {\n await this.backend.writeFile(path, content);\n }\n\n async applyRemoteDelete(path: string): Promise<void> {\n try {\n if (await this.backend.exists(path)) {\n await this.backend.unlink(path);\n }\n } catch {\n return;\n }\n }\n\n async unlink(path: string): Promise<void> {\n await this.backend.unlink(path);\n this.recordChange(path, \"delete\");\n }\n\n async stat(path: string): Promise<FileStats> {\n return this.backend.stat(path);\n }\n\n async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n return this.backend.mkdir(path, options);\n }\n\n async readdir(path: string): Promise<DirEntry[]> {\n return this.backend.readdir(path);\n }\n\n async rmdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n return this.backend.rmdir(path, options);\n }\n\n async exists(path: string): Promise<boolean> {\n return this.backend.exists(path);\n }\n\n watch(path: string, callback: WatchCallback): () => void {\n if (this.backend.watch) {\n return this.backend.watch(path, callback);\n }\n return () => {};\n }\n\n /**\n * Get all pending changes since last sync\n */\n getChanges(): ChangeRecord[] {\n return Array.from(this.changes.values());\n }\n\n /**\n * Clear change tracking (after successful sync)\n */\n clearChanges(): void {\n this.changes.clear();\n }\n\n /**\n * Mark specific paths as synced\n */\n markSynced(paths: string[]): void {\n for (const path of paths) {\n this.changes.delete(path);\n }\n }\n\n /**\n * Subscribe to change events\n */\n onChange(listener: ChangeListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private recordChange(path: string, type: WatchEventType): void {\n const record: ChangeRecord = { path, type, mtime: new Date() };\n this.changes.set(path, record);\n for (const listener of this.listeners) {\n listener(record);\n }\n }\n}\n","import type { FSProvider } from \"../core/types.js\";\n\nexport interface ContentChecksums {\n local?: string;\n remote?: string;\n}\n\nexport function hashContent(content: string): string {\n let hash = 0x811c9dc5;\n for (let i = 0; i < content.length; i += 1) {\n hash ^= content.charCodeAt(i);\n hash =\n (hash +\n (hash << 1) +\n (hash << 4) +\n (hash << 7) +\n (hash << 8) +\n (hash << 24)) >>>\n 0;\n }\n return hash.toString(16).padStart(8, \"0\");\n}\n\nexport async function readChecksum(\n provider: FSProvider,\n path: string,\n): Promise<string | undefined> {\n try {\n const content = await provider.readFile(path);\n return hashContent(content);\n } catch {\n return undefined;\n }\n}\n\nexport async function readChecksums(\n local: FSProvider,\n localPath: string,\n remote: FSProvider,\n remotePath: string,\n): Promise<ContentChecksums> {\n const [localChecksum, remoteChecksum] = await Promise.all([\n readChecksum(local, localPath),\n readChecksum(remote, remotePath),\n ]);\n return { local: localChecksum, remote: remoteChecksum };\n}\n","import type { ConflictRecord, ConflictStrategy } from \"../core/types.js\";\n\nexport interface ConflictResolutionInput {\n path: string;\n changeMtime: Date;\n remoteMtime: Date;\n localChecksum?: string;\n remoteChecksum?: string;\n strategy: ConflictStrategy;\n}\n\nexport function resolveConflict(\n input: ConflictResolutionInput,\n): ConflictRecord | null {\n if (input.remoteMtime <= input.changeMtime) return null;\n if (\n input.localChecksum &&\n input.remoteChecksum &&\n input.localChecksum === input.remoteChecksum\n ) {\n return null;\n }\n\n const conflict: ConflictRecord = {\n path: input.path,\n localMtime: input.changeMtime,\n remoteMtime: input.remoteMtime,\n };\n\n switch (input.strategy) {\n case \"local-wins\":\n conflict.resolved = \"local\";\n break;\n case \"remote-wins\":\n conflict.resolved = \"remote\";\n break;\n case \"newest-wins\":\n conflict.resolved =\n input.remoteMtime > input.changeMtime ? \"remote\" : \"local\";\n break;\n case \"manual\":\n break;\n }\n\n return conflict;\n}\n","import type {\n ChangeRecord,\n ConflictRecord,\n ConflictStrategy,\n DirEntry,\n FSProvider,\n SyncEventCallback,\n SyncEventType,\n SyncResult,\n SyncStatus,\n WatchEventType,\n} from \"../core/types.js\";\nimport type { VirtualFS } from \"../core/virtual-fs.js\";\nimport { join, normalizePath } from \"../core/utils.js\";\nimport { readChecksums } from \"./differ.js\";\nimport { resolveConflict } from \"./resolver.js\";\n\nexport interface SyncEngineConfig {\n conflictStrategy?: ConflictStrategy;\n basePath?: string;\n}\n\ntype EventMap = {\n change: ChangeRecord;\n conflict: ConflictRecord;\n error: Error;\n status: SyncStatus;\n};\n\n/**\n * Bidirectional sync engine between local VirtualFS and remote FSProvider\n */\nexport class SyncEngineImpl {\n status: SyncStatus = \"idle\";\n private intervalId?: ReturnType<typeof setInterval>;\n private listeners = new Map<SyncEventType, Set<SyncEventCallback<unknown>>>();\n private conflictStrategy: ConflictStrategy;\n private basePath: string;\n\n constructor(\n private local: VirtualFS,\n private remote: FSProvider,\n config: SyncEngineConfig = {},\n ) {\n this.conflictStrategy = config.conflictStrategy ?? \"local-wins\";\n this.basePath = config.basePath ?? \"\";\n this.startRemoteWatch();\n }\n\n async sync(): Promise<SyncResult> {\n if (this.status === \"syncing\") {\n return { pushed: 0, pulled: 0, conflicts: [] };\n }\n\n this.setStatus(\"syncing\");\n const result: SyncResult = { pushed: 0, pulled: 0, conflicts: [] };\n\n try {\n const localChanges = this.local.getChanges();\n const localChangeMap = new Map(\n localChanges.map((change) => [change.path, change]),\n );\n const syncedPaths: string[] = [];\n\n const remoteFiles = await this.listFiles(this.remote, this.basePath);\n const localFiles = await this.listFiles(this.local, \"\");\n const remoteLocalPaths = new Set(\n remoteFiles.map((path) => this.localPath(path)),\n );\n\n for (const remotePath of remoteFiles) {\n const localPath = this.localPath(remotePath);\n const localChange = localChangeMap.get(localPath);\n\n if (localChange) {\n const conflict = await this.checkConflict(localChange, remotePath);\n if (conflict) {\n result.conflicts.push(conflict);\n this.emit(\"conflict\", conflict);\n if (conflict.resolved === \"remote\") {\n if (await this.pullRemoteFile(localPath, remotePath)) {\n result.pulled++;\n this.emit(\"change\", {\n path: localPath,\n type: \"update\",\n mtime: new Date(),\n });\n }\n syncedPaths.push(localPath);\n }\n }\n continue;\n }\n\n if (await this.pullRemoteFile(localPath, remotePath)) {\n result.pulled++;\n this.emit(\"change\", {\n path: localPath,\n type: \"update\",\n mtime: new Date(),\n });\n }\n }\n\n for (const localPath of localFiles) {\n if (remoteLocalPaths.has(localPath)) continue;\n if (localChangeMap.has(localPath)) continue;\n await this.local.applyRemoteDelete(localPath);\n result.pulled++;\n this.emit(\"change\", {\n path: localPath,\n type: \"delete\",\n mtime: new Date(),\n });\n }\n\n for (const change of localChanges) {\n if (syncedPaths.includes(change.path)) continue;\n const remotePath = this.remotePath(change.path);\n\n try {\n const conflict = await this.checkConflict(change, remotePath);\n if (conflict) {\n result.conflicts.push(conflict);\n this.emit(\"conflict\", conflict);\n if (conflict.resolved === \"remote\") {\n if (await this.pullRemoteFile(change.path, remotePath)) {\n result.pulled++;\n this.emit(\"change\", {\n path: change.path,\n type: \"update\",\n mtime: new Date(),\n });\n }\n syncedPaths.push(change.path);\n }\n if (conflict.resolved !== \"local\") continue;\n }\n\n if (change.type === \"delete\") {\n if (await this.remote.exists(remotePath)) {\n await this.remote.unlink(remotePath);\n }\n result.pushed++;\n syncedPaths.push(change.path);\n this.emit(\"change\", change);\n continue;\n }\n\n const content = await this.local.readFile(change.path);\n await this.remote.writeFile(remotePath, content);\n result.pushed++;\n syncedPaths.push(change.path);\n this.emit(\"change\", change);\n } catch (err) {\n this.emit(\n \"error\",\n err instanceof Error ? err : new Error(String(err)),\n );\n }\n }\n\n if (syncedPaths.length > 0) {\n this.local.markSynced(syncedPaths);\n }\n this.setStatus(\"idle\");\n } catch (err) {\n this.setStatus(\"error\");\n this.emit(\"error\", err instanceof Error ? err : new Error(String(err)));\n }\n\n return result;\n }\n\n startAutoSync(intervalMs: number): void {\n this.stopAutoSync();\n this.intervalId = setInterval(() => this.sync(), intervalMs);\n }\n\n stopAutoSync(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = undefined;\n }\n }\n\n on<T extends SyncEventType>(\n event: T,\n callback: SyncEventCallback<EventMap[T]>,\n ): () => void {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(callback as SyncEventCallback<unknown>);\n return () => set!.delete(callback as SyncEventCallback<unknown>);\n }\n\n private emit<T extends SyncEventType>(event: T, data: EventMap[T]): void {\n const set = this.listeners.get(event);\n if (set) {\n for (const cb of set) cb(data);\n }\n }\n\n private setStatus(status: SyncStatus): void {\n this.status = status;\n this.emit(\"status\", status);\n }\n\n private remotePath(localPath: string): string {\n return this.basePath ? join(this.basePath, localPath) : localPath;\n }\n\n private localPath(remotePath: string): string {\n if (!this.basePath) return normalizePath(remotePath);\n const normalized = normalizePath(remotePath);\n const base = normalizePath(this.basePath);\n if (normalized === base) return \"\";\n if (normalized.startsWith(`${base}/`)) {\n return normalized.slice(base.length + 1);\n }\n return normalized;\n }\n\n private async listFiles(\n provider: FSProvider,\n basePath: string,\n ): Promise<string[]> {\n const normalized = normalizePath(basePath);\n let entries: DirEntry[] = [];\n try {\n entries = await provider.readdir(normalized);\n } catch {\n return [];\n }\n\n const results: string[] = [];\n for (const entry of entries) {\n const entryPath = normalized ? `${normalized}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n results.push(...(await this.listFiles(provider, entryPath)));\n } else {\n results.push(entryPath);\n }\n }\n\n return results;\n }\n\n private async pullRemoteFile(\n localPath: string,\n remotePath: string,\n ): Promise<boolean> {\n let localContent: string | null = null;\n try {\n if (await this.local.exists(localPath)) {\n localContent = await this.local.readFile(localPath);\n }\n } catch {\n localContent = null;\n }\n\n const remoteContent = await this.remote.readFile(remotePath);\n if (localContent === remoteContent) return false;\n await this.local.applyRemoteFile(localPath, remoteContent);\n return true;\n }\n\n private startRemoteWatch(): void {\n if (!this.remote.watch) return;\n this.remote.watch(this.basePath, (event, path) => {\n void this.handleRemoteEvent(event, path);\n });\n }\n\n private async handleRemoteEvent(\n event: WatchEventType,\n remotePath: string,\n ): Promise<void> {\n const localPath = this.localPath(remotePath);\n const localChange = this.local\n .getChanges()\n .find((change) => change.path === localPath);\n\n if (localChange) {\n const conflict = await this.checkRemoteEventConflict(\n localChange,\n remotePath,\n event,\n );\n if (conflict) {\n this.emit(\"conflict\", conflict);\n if (conflict.resolved === \"remote\") {\n await this.applyRemoteEvent(event, localPath, remotePath);\n this.local.markSynced([localPath]);\n this.emit(\"change\", {\n path: localPath,\n type: event,\n mtime: new Date(),\n });\n }\n return;\n }\n\n return;\n }\n\n try {\n await this.applyRemoteEvent(event, localPath, remotePath);\n this.emit(\"change\", {\n path: localPath,\n type: event,\n mtime: new Date(),\n });\n } catch (err) {\n this.emit(\"error\", err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n private async checkConflict(\n change: ChangeRecord,\n remotePath: string,\n ): Promise<ConflictRecord | null> {\n try {\n const remoteStat = await this.remote.stat(remotePath);\n if (remoteStat.mtime <= change.mtime) return null;\n const checksums = await readChecksums(\n this.local,\n change.path,\n this.remote,\n remotePath,\n );\n return resolveConflict({\n path: change.path,\n changeMtime: change.mtime,\n remoteMtime: remoteStat.mtime,\n localChecksum: checksums.local,\n remoteChecksum: checksums.remote,\n strategy: this.conflictStrategy,\n });\n } catch {\n return null;\n }\n }\n\n private async checkRemoteEventConflict(\n change: ChangeRecord,\n remotePath: string,\n event: WatchEventType,\n ): Promise<ConflictRecord | null> {\n if (event === \"delete\") {\n if (change.type === \"delete\") return null;\n return resolveConflict({\n path: change.path,\n changeMtime: change.mtime,\n remoteMtime: new Date(),\n strategy: this.conflictStrategy,\n });\n }\n\n try {\n const remoteStat = await this.remote.stat(remotePath);\n if (remoteStat.mtime <= change.mtime) return null;\n const checksums = await readChecksums(\n this.local,\n change.path,\n this.remote,\n remotePath,\n );\n return resolveConflict({\n path: change.path,\n changeMtime: change.mtime,\n remoteMtime: remoteStat.mtime,\n localChecksum: checksums.local,\n remoteChecksum: checksums.remote,\n strategy: this.conflictStrategy,\n });\n } catch {\n return null;\n }\n }\n\n private async applyRemoteEvent(\n event: WatchEventType,\n localPath: string,\n remotePath: string,\n ): Promise<void> {\n if (event === \"delete\") {\n await this.local.applyRemoteDelete(localPath);\n return;\n }\n\n const content = await this.remote.readFile(remotePath);\n await this.local.applyRemoteFile(localPath, content);\n }\n}\n","import type { DirEntry, FileStats, FSProvider } from \"../core/types.js\";\nimport {\n basename,\n createDirEntry,\n createFileStats,\n dirname,\n normalizePath,\n} from \"../core/utils.js\";\n\nconst DB_NAME = \"patchwork-vfs\";\nconst DB_VERSION = 2;\nconst FILES_STORE = \"files\";\nconst DIRS_STORE = \"dirs\";\n\ninterface FileRecord {\n content: string;\n mtime: number;\n}\n\nfunction openDB(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve(request.result);\n request.onupgradeneeded = (event) => {\n const db = request.result;\n if (!db.objectStoreNames.contains(FILES_STORE)) {\n db.createObjectStore(FILES_STORE);\n }\n if (!db.objectStoreNames.contains(DIRS_STORE)) {\n db.createObjectStore(DIRS_STORE);\n }\n };\n });\n}\n\nfunction withStore<T>(\n storeName: string,\n mode: IDBTransactionMode,\n fn: (store: IDBObjectStore) => IDBRequest<T>,\n): Promise<T> {\n return openDB().then(\n (db) =>\n new Promise((resolve, reject) => {\n const tx = db.transaction(storeName, mode);\n const store = tx.objectStore(storeName);\n const request = fn(store);\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve(request.result);\n }),\n );\n}\n\nexport class IndexedDBBackend implements FSProvider {\n constructor(private prefix = \"vfs\") {}\n\n private key(path: string): string {\n return `${this.prefix}:${normalizePath(path)}`;\n }\n\n async readFile(path: string): Promise<string> {\n const record = await withStore<FileRecord | undefined>(\n FILES_STORE,\n \"readonly\",\n (store) => store.get(this.key(path)),\n );\n if (!record) throw new Error(`ENOENT: ${path}`);\n return record.content;\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n const dir = dirname(normalizePath(path));\n if (dir && !(await this.dirExists(dir))) {\n throw new Error(`ENOENT: ${dir}`);\n }\n const record: FileRecord = { content, mtime: Date.now() };\n await withStore(FILES_STORE, \"readwrite\", (store) =>\n store.put(record, this.key(path)),\n );\n }\n\n async unlink(path: string): Promise<void> {\n await withStore(FILES_STORE, \"readwrite\", (store) =>\n store.delete(this.key(path)),\n );\n }\n\n async stat(path: string): Promise<FileStats> {\n const normalized = normalizePath(path);\n const record = await withStore<FileRecord | undefined>(\n FILES_STORE,\n \"readonly\",\n (store) => store.get(this.key(normalized)),\n );\n if (record) {\n return createFileStats(\n record.content.length,\n new Date(record.mtime),\n false,\n );\n }\n if (await this.dirExists(normalized)) {\n return createFileStats(0, new Date(), true);\n }\n throw new Error(`ENOENT: ${path}`);\n }\n\n async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n const normalized = normalizePath(path);\n if (await this.dirExists(normalized)) return;\n\n const parent = dirname(normalized);\n if (parent && !(await this.dirExists(parent))) {\n if (options?.recursive) {\n await this.mkdir(parent, options);\n } else {\n throw new Error(`ENOENT: ${parent}`);\n }\n }\n\n await withStore(DIRS_STORE, \"readwrite\", (store) =>\n store.put(Date.now(), this.key(normalized)),\n );\n }\n\n async readdir(path: string): Promise<DirEntry[]> {\n const normalized = normalizePath(path);\n if (normalized && !(await this.dirExists(normalized))) {\n throw new Error(`ENOENT: ${path}`);\n }\n\n const prefix = normalized ? `${this.key(normalized)}/` : `${this.prefix}:`;\n const entries = new Map<string, boolean>();\n\n const fileKeys = await withStore<IDBValidKey[]>(\n FILES_STORE,\n \"readonly\",\n (store) => store.getAllKeys(),\n );\n for (const key of fileKeys as string[]) {\n if (key.startsWith(prefix)) {\n const rest = key.slice(prefix.length);\n const name = rest.split(\"/\")[0];\n if (name && !rest.includes(\"/\")) entries.set(name, false);\n }\n }\n\n const dirKeys = await withStore<IDBValidKey[]>(\n DIRS_STORE,\n \"readonly\",\n (store) => store.getAllKeys(),\n );\n for (const key of dirKeys as string[]) {\n if (key.startsWith(prefix)) {\n const rest = key.slice(prefix.length);\n const name = rest.split(\"/\")[0];\n if (name && !rest.includes(\"/\")) entries.set(name, true);\n }\n }\n\n return Array.from(entries).map(([name, isDir]) =>\n createDirEntry(name, isDir),\n );\n }\n\n async rmdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n const normalized = normalizePath(path);\n if (!(await this.dirExists(normalized))) {\n throw new Error(`ENOENT: ${path}`);\n }\n\n const prefix = `${this.key(normalized)}/`;\n\n if (options?.recursive) {\n const fileKeys = await withStore<IDBValidKey[]>(\n FILES_STORE,\n \"readonly\",\n (store) => store.getAllKeys(),\n );\n for (const key of fileKeys as string[]) {\n if (key.startsWith(prefix)) {\n await withStore(FILES_STORE, \"readwrite\", (store) =>\n store.delete(key),\n );\n }\n }\n\n const dirKeys = await withStore<IDBValidKey[]>(\n DIRS_STORE,\n \"readonly\",\n (store) => store.getAllKeys(),\n );\n for (const key of dirKeys as string[]) {\n if (key.startsWith(prefix)) {\n await withStore(DIRS_STORE, \"readwrite\", (store) =>\n store.delete(key),\n );\n }\n }\n }\n\n await withStore(DIRS_STORE, \"readwrite\", (store) =>\n store.delete(this.key(normalized)),\n );\n }\n\n async exists(path: string): Promise<boolean> {\n const normalized = normalizePath(path);\n const record = await withStore<FileRecord | undefined>(\n FILES_STORE,\n \"readonly\",\n (store) => store.get(this.key(normalized)),\n );\n if (record) return true;\n return this.dirExists(normalized);\n }\n\n private async dirExists(path: string): Promise<boolean> {\n if (!path) return true; // Root always exists\n const result = await withStore<number | undefined>(\n DIRS_STORE,\n \"readonly\",\n (store) => store.get(this.key(path)),\n );\n return result !== undefined;\n }\n}\n","import type {\n DirEntry,\n FileStats,\n FSProvider,\n WatchCallback,\n WatchEventType,\n} from \"../core/types.js\";\nimport { createDirEntry, createFileStats } from \"../core/utils.js\";\n\nexport interface HttpBackendConfig {\n baseUrl: string;\n}\n\ninterface StatResponse {\n size: number;\n mtime: string;\n isFile: boolean;\n isDirectory: boolean;\n}\n\ninterface WatchEvent {\n type: WatchEventType;\n path: string;\n mtime: string;\n}\n\n/**\n * HTTP-based FSProvider for connecting to remote servers (e.g., stitchery)\n */\nexport class HttpBackend implements FSProvider {\n constructor(private config: HttpBackendConfig) {}\n\n async readFile(path: string): Promise<string> {\n const res = await fetch(this.url(path));\n if (!res.ok) throw new Error(`ENOENT: ${path}`);\n return res.text();\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n const res = await fetch(this.url(path), {\n method: \"PUT\",\n body: content,\n headers: { \"Content-Type\": \"text/plain\" },\n });\n if (!res.ok) throw new Error(`Failed to write: ${path}`);\n }\n\n async unlink(path: string): Promise<void> {\n const res = await fetch(this.url(path), { method: \"DELETE\" });\n if (!res.ok) throw new Error(`Failed to delete: ${path}`);\n }\n\n async stat(path: string): Promise<FileStats> {\n const res = await fetch(this.url(path, { stat: \"true\" }));\n if (!res.ok) throw new Error(`ENOENT: ${path}`);\n const data: StatResponse = await res.json();\n return createFileStats(data.size, new Date(data.mtime), data.isDirectory);\n }\n\n async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n const params: Record<string, string> = { mkdir: \"true\" };\n if (options?.recursive) params.recursive = \"true\";\n const res = await fetch(this.url(path, params), { method: \"POST\" });\n if (!res.ok) throw new Error(`Failed to mkdir: ${path}`);\n }\n\n async readdir(path: string): Promise<DirEntry[]> {\n const res = await fetch(this.url(path, { readdir: \"true\" }));\n if (!res.ok) throw new Error(`ENOENT: ${path}`);\n const entries: Array<{ name: string; isDirectory: boolean }> =\n await res.json();\n return entries.map((e) => createDirEntry(e.name, e.isDirectory));\n }\n\n async rmdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n const params: Record<string, string> = {};\n if (options?.recursive) params.recursive = \"true\";\n const res = await fetch(this.url(path, params), { method: \"DELETE\" });\n if (!res.ok) throw new Error(`Failed to rmdir: ${path}`);\n }\n\n async exists(path: string): Promise<boolean> {\n const res = await fetch(this.url(path), { method: \"HEAD\" });\n return res.ok;\n }\n\n watch(path: string, callback: WatchCallback): () => void {\n const controller = new AbortController();\n this.startWatch(path, callback, controller.signal);\n return () => controller.abort();\n }\n\n private async startWatch(\n path: string,\n callback: WatchCallback,\n signal: AbortSignal,\n ): Promise<void> {\n try {\n const res = await fetch(this.url(\"\", { watch: path }), { signal });\n if (!res.ok) return;\n const reader = res.body?.getReader();\n if (!reader) return;\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (!signal.aborted) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const event: WatchEvent = JSON.parse(line.slice(6));\n callback(event.type, event.path);\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n } catch {\n // Connection closed or aborted\n }\n }\n\n private url(path: string, params?: Record<string, string>): string {\n const baseUrl = this.config.baseUrl.replace(/\\/+$/, \"\");\n const cleanPath = path.replace(/^\\/+/, \"\");\n const base = cleanPath ? `${baseUrl}/${cleanPath}` : baseUrl;\n if (!params) return base;\n const query = new URLSearchParams(params).toString();\n return `${base}?${query}`;\n }\n}\n","import type {\n ChangeRecord,\n ConflictRecord,\n ConflictStrategy,\n DirEntry,\n FileStats,\n FSProvider,\n SyncEventCallback,\n SyncEventType,\n SyncResult,\n SyncStatus,\n} from \"./core/types.js\";\nimport { join } from \"./core/utils.js\";\nimport { VirtualFS } from \"./core/virtual-fs.js\";\nimport { SyncEngineImpl } from \"./sync/index.js\";\nimport type { VirtualFile, VirtualProject } from \"./types.js\";\nimport { resolveEntry } from \"./project.js\";\n\nexport interface VFSStoreOptions {\n root?: string;\n sync?: boolean;\n conflictStrategy?: ConflictStrategy;\n autoSyncIntervalMs?: number;\n}\n\nexport class VFSStore {\n private local?: VirtualFS;\n private syncEngine?: SyncEngineImpl;\n private root: string;\n\n constructor(private provider: FSProvider, options: VFSStoreOptions = {}) {\n this.root = options.root ?? \"\";\n\n if (options.sync) {\n this.local = new VirtualFS();\n this.syncEngine = new SyncEngineImpl(this.local, this.provider, {\n conflictStrategy: options.conflictStrategy,\n basePath: this.root,\n });\n if (options.autoSyncIntervalMs) {\n this.syncEngine.startAutoSync(options.autoSyncIntervalMs);\n }\n }\n }\n\n async readFile(path: string, encoding?: \"utf8\" | \"base64\"): Promise<string> {\n if (this.local) {\n try {\n return await this.local.readFile(path, encoding);\n } catch {\n const content = await this.provider.readFile(\n this.remotePath(path),\n encoding,\n );\n await this.local.applyRemoteFile(path, content);\n return content;\n }\n }\n return this.provider.readFile(this.remotePath(path), encoding);\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n if (this.local) {\n await this.local.writeFile(path, content);\n return;\n }\n await this.provider.writeFile(this.remotePath(path), content);\n }\n\n async unlink(path: string): Promise<void> {\n if (this.local) {\n await this.local.unlink(path);\n return;\n }\n await this.provider.unlink(this.remotePath(path));\n }\n\n async stat(path: string): Promise<FileStats> {\n if (this.local) {\n try {\n return await this.local.stat(path);\n } catch {\n return this.provider.stat(this.remotePath(path));\n }\n }\n return this.provider.stat(this.remotePath(path));\n }\n\n async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n if (this.local) {\n await this.local.mkdir(path, options);\n }\n await this.provider.mkdir(this.remotePath(path), options);\n }\n\n async readdir(path: string): Promise<DirEntry[]> {\n if (this.local) {\n try {\n return await this.local.readdir(path);\n } catch {\n return this.provider.readdir(this.remotePath(path));\n }\n }\n return this.provider.readdir(this.remotePath(path));\n }\n\n async rmdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n if (this.local) {\n await this.local.rmdir(path, options);\n }\n await this.provider.rmdir(this.remotePath(path), options);\n }\n\n async exists(path: string): Promise<boolean> {\n if (this.local) {\n if (await this.local.exists(path)) return true;\n return this.provider.exists(this.remotePath(path));\n }\n return this.provider.exists(this.remotePath(path));\n }\n\n async listFiles(prefix = \"\"): Promise<string[]> {\n return this.walkFiles(prefix);\n }\n\n async loadProject(id: string): Promise<VirtualProject | null> {\n const paths = await this.listFiles(id);\n if (paths.length === 0) return null;\n\n const files = new Map<string, VirtualFile>();\n await Promise.all(\n paths.map(async (path) => {\n const content = await this.provider.readFile(this.remotePath(path));\n const relative = path.slice(id.length + 1);\n files.set(relative, { path: relative, content });\n if (this.local) {\n await this.local.applyRemoteFile(path, content);\n }\n }),\n );\n\n return { id, entry: resolveEntry(files), files };\n }\n\n async saveProject(project: VirtualProject): Promise<void> {\n if (this.local) {\n await Promise.all(\n Array.from(project.files.values()).map((file) =>\n this.local!.writeFile(`${project.id}/${file.path}`, file.content),\n ),\n );\n await this.sync();\n return;\n }\n\n await Promise.all(\n Array.from(project.files.values()).map((file) =>\n this.provider.writeFile(\n this.remotePath(`${project.id}/${file.path}`),\n file.content,\n ),\n ),\n );\n }\n\n async sync(): Promise<SyncResult> {\n if (!this.syncEngine) {\n return { pushed: 0, pulled: 0, conflicts: [] };\n }\n return this.syncEngine.sync();\n }\n\n on<T extends SyncEventType>(\n event: T,\n callback: SyncEventCallback<\n T extends \"change\"\n ? ChangeRecord\n : T extends \"conflict\"\n ? ConflictRecord\n : T extends \"error\"\n ? Error\n : SyncStatus\n >,\n ): () => void {\n if (!this.syncEngine) return () => {};\n return this.syncEngine.on(event, callback as SyncEventCallback<unknown>);\n }\n\n private remotePath(path: string): string {\n return this.root ? join(this.root, path) : path;\n }\n\n private async walkFiles(prefix: string): Promise<string[]> {\n const results: string[] = [];\n const normalized = prefix ? prefix.replace(/^\\/+/g, \"\") : \"\";\n\n let entries: DirEntry[] = [];\n try {\n entries = await this.provider.readdir(this.remotePath(normalized));\n } catch {\n return results;\n }\n\n for (const entry of entries) {\n const entryPath = normalized ? `${normalized}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n results.push(...(await this.walkFiles(entryPath)));\n } else {\n results.push(entryPath);\n }\n }\n\n return results;\n }\n}\n"],"mappings":"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","names":["atIndex","dirname","join","require","DEFAULT_CDN_BASE","cdnBaseUrl","setCdnBaseUrl","cdnBaseUrl","parts","packageName","subpath","build","exports","matchAlias","build","module","mountCounter","generateMountId","cdnBaseUrl","setCdnBaseUrl","normalizePath","dirname","normalizePath","normalizePath","dirname","hashContent","normalizePath","normalizePath","dirname"]}
1
+ {"version":3,"sources":["../src/index.ts","../../../node_modules/.pnpm/tsup@8.5.1_jiti@1.21.7_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js","../src/compiler.ts","../src/vfs/project.ts","../src/schemas.ts","../src/images/loader.ts","../src/images/registry.ts","../src/transforms/cdn.ts","../src/transforms/vfs.ts","../src/mount/bridge.ts","../src/mount/embedded.ts","../src/mount/iframe.ts","../src/vfs/core/utils.ts","../src/vfs/backends/memory.ts","../src/vfs/core/virtual-fs.ts","../src/vfs/sync/differ.ts","../src/vfs/sync/resolver.ts","../src/vfs/sync/engine.ts","../src/vfs/backends/indexeddb.ts","../src/vfs/backends/http.ts","../src/vfs/store.ts"],"sourcesContent":["/**\n * @aprovan/patchwork-compiler\n *\n * JSX→ESM compilation, image loading, and DOM mounting for Patchwork widgets.\n *\n * @example\n * ```typescript\n * import { createCompiler } from '@aprovan/patchwork-compiler';\n *\n * const compiler = await createCompiler({\n * image: '@aprovan/patchwork-image-shadcn',\n * proxyUrl: 'http://localhost:3000/api/proxy'\n * });\n *\n * const widget = await compiler.compile(source, manifest);\n * const mounted = await compiler.mount(widget, {\n * target: document.getElementById('root'),\n * mode: 'embedded'\n * });\n *\n * // Later...\n * compiler.unmount(mounted);\n * ```\n */\n\n// Core compiler\nexport { createCompiler } from \"./compiler.js\";\n\n// Schemas (Zod validation)\nexport {\n // Schemas\n PlatformSchema,\n EsbuildConfigSchema,\n ImageConfigSchema,\n InputSpecSchema,\n ManifestSchema,\n CompileOptionsSchema,\n MountModeSchema,\n MountOptionsSchema,\n // Parsers\n parseImageConfig,\n safeParseImageConfig,\n parseManifest,\n safeParseManifest,\n // Defaults\n DEFAULT_IMAGE_CONFIG,\n DEFAULT_CLI_IMAGE_CONFIG,\n} from \"./schemas.js\";\n\n// Types\nexport type {\n // Core types\n Platform,\n Manifest,\n InputSpec,\n CompileOptions,\n CompiledWidget,\n MountMode,\n MountOptions,\n MountedWidget,\n Compiler,\n CompilerOptions,\n // Image types\n ImageConfig,\n ImageMountFn,\n LoadedImage,\n // Service types\n ServiceProxy,\n ServiceCallHandler,\n GlobalInterfaceDefinition,\n BridgeMessage,\n BridgeMessageType,\n ServiceCallPayload,\n ServiceResultPayload,\n} from \"./types.js\";\n\n// Images\nexport {\n // Registry\n ImageRegistry,\n getImageRegistry,\n createImageRegistry,\n // Loader\n loadImage,\n parseImageSpec,\n fetchPackageJson,\n setCdnBaseUrl,\n getCdnBaseUrl,\n} from \"./images/index.js\";\n\n// Transforms\nexport {\n cdnTransformPlugin,\n generateImportMap,\n vfsPlugin,\n} from \"./transforms/index.js\";\nexport type {\n CdnTransformOptions,\n VFSPluginOptions,\n} from \"./transforms/index.js\";\n\n// VFS\nexport {\n VFSStore,\n createProjectFromFiles,\n createSingleFileProject,\n resolveEntry,\n detectMainFile,\n IndexedDBBackend,\n HttpBackend,\n} from \"./vfs/index.js\";\nexport type {\n VirtualFile,\n VirtualProject,\n ChangeRecord,\n HttpBackendConfig,\n VFSStoreOptions,\n WatchCallback,\n WatchEventType,\n} from \"./vfs/index.js\";\n\n// Mount utilities\nexport {\n // Embedded\n mountEmbedded,\n reloadEmbedded,\n // Iframe\n mountIframe,\n reloadIframe,\n disposeIframeBridge,\n DEV_SANDBOX,\n // Bridge\n createHttpServiceProxy,\n createFieldAccessProxy,\n generateNamespaceGlobals,\n injectNamespaceGlobals,\n removeNamespaceGlobals,\n extractNamespaces,\n ParentBridge,\n createIframeServiceProxy,\n generateIframeBridgeScript,\n} from \"./mount/index.js\";\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import * as esbuild from \"esbuild-wasm\";\nimport type {\n Compiler,\n CompilerOptions,\n CompileOptions,\n CompiledWidget,\n Manifest,\n MountedWidget,\n MountOptions,\n ServiceProxy,\n} from \"./types.js\";\nimport type { VirtualProject } from \"./vfs/types.js\";\nimport { createSingleFileProject } from \"./vfs/project.js\";\nimport { getImageRegistry } from \"./images/registry.js\";\nimport { setCdnBaseUrl as setImageCdnBaseUrl } from \"./images/loader.js\";\nimport { setCdnBaseUrl as setTransformCdnBaseUrl } from \"./transforms/cdn.js\";\nimport { cdnTransformPlugin } from \"./transforms/cdn.js\";\nimport { vfsPlugin } from \"./transforms/vfs.js\";\nimport { createHttpServiceProxy } from \"./mount/bridge.js\";\nimport { mountEmbedded, reloadEmbedded } from \"./mount/embedded.js\";\nimport { mountIframe, reloadIframe } from \"./mount/iframe.js\";\n\n// Track esbuild initialization\nlet esbuildInitialized = false;\nlet esbuildInitPromise: Promise<void> | null = null;\n\n/**\n * Initialize esbuild-wasm (must be called before using esbuild)\n */\nasync function initEsbuild(): Promise<void> {\n if (esbuildInitialized) return;\n if (esbuildInitPromise) return esbuildInitPromise;\n\n esbuildInitPromise = (async () => {\n try {\n await esbuild.initialize({\n wasmURL: \"https://unpkg.com/esbuild-wasm/esbuild.wasm\",\n });\n esbuildInitialized = true;\n } catch (error) {\n // If already initialized (e.g., HMR or multiple compiler instances), that's fine\n if (error instanceof Error && error.message.includes(\"initialize\")) {\n esbuildInitialized = true;\n } else {\n throw error;\n }\n }\n })();\n\n return esbuildInitPromise;\n}\n\n/**\n * Generate a content hash for caching\n */\nfunction hashContent(content: string): string {\n // Use Web Crypto API for browser compatibility\n const encoder = new TextEncoder();\n const data = encoder.encode(content);\n // Simple hash for cache key (not cryptographic)\n let hash = 0;\n for (let i = 0; i < data.length; i++) {\n hash = ((hash << 5) - hash + (data[i] ?? 0)) | 0;\n }\n return Math.abs(hash).toString(16).padStart(8, \"0\");\n}\n\n/**\n * Create a compiler instance\n */\nexport async function createCompiler(\n options: CompilerOptions,\n): Promise<Compiler> {\n // Initialize esbuild-wasm\n await initEsbuild();\n\n const { image: imageSpec, proxyUrl, cdnBaseUrl, widgetCdnBaseUrl } = options;\n\n // Set CDN base URLs (can be different for image loading vs widget imports)\n if (cdnBaseUrl) {\n setImageCdnBaseUrl(cdnBaseUrl);\n }\n // Widget imports use widgetCdnBaseUrl if provided, otherwise fall back to cdnBaseUrl or default\n if (widgetCdnBaseUrl) {\n setTransformCdnBaseUrl(widgetCdnBaseUrl);\n } else if (cdnBaseUrl) {\n setTransformCdnBaseUrl(cdnBaseUrl);\n }\n\n const registry = getImageRegistry();\n\n // Pre-load the initial image\n await registry.preload(imageSpec);\n\n // Create service proxy\n const proxy: ServiceProxy = createHttpServiceProxy(proxyUrl);\n\n return new PatchworkCompiler(proxy, registry);\n}\n\n/**\n * Patchwork compiler implementation\n */\nclass PatchworkCompiler implements Compiler {\n private proxy: ServiceProxy;\n private registry: ReturnType<typeof getImageRegistry>;\n\n constructor(\n proxy: ServiceProxy,\n registry: ReturnType<typeof getImageRegistry>,\n ) {\n this.proxy = proxy;\n this.registry = registry;\n }\n\n /**\n * Pre-load an image package\n */\n async preloadImage(spec: string): Promise<void> {\n await this.registry.preload(spec);\n }\n\n /**\n * Check if an image is loaded\n */\n isImageLoaded(spec: string): boolean {\n return this.registry.has(spec);\n }\n\n /**\n * Compile widget source to ESM\n */\n async compile(\n source: string | VirtualProject,\n manifest: Manifest,\n _options: CompileOptions = {},\n ): Promise<CompiledWidget> {\n // Normalize input to VirtualProject (entry defined by project, defaults to main.tsx)\n const project =\n typeof source === \"string\" ? createSingleFileProject(source) : source;\n\n // Infer loader from entry file extension\n const entryExt = project.entry.split(\".\").pop();\n const loader = entryExt === \"ts\" || entryExt === \"tsx\" ? \"tsx\" : \"jsx\";\n\n // Get image from registry based on manifest\n const image = this.registry.get(manifest.image) || null;\n\n // Get config from image (with proper typing)\n const esbuildConfig = image?.config.esbuild || {};\n const frameworkConfig = image?.config.framework || {};\n\n const target = esbuildConfig.target || \"es2020\";\n const format = esbuildConfig.format || \"esm\";\n const jsx = esbuildConfig.jsx ?? \"automatic\";\n\n // Collect all packages (image deps + manifest packages)\n const packages: Record<string, string> = {\n ...(image?.dependencies || {}),\n ...(manifest.packages || {}),\n };\n\n const globals = frameworkConfig.globals || {};\n\n // Get dependency version overrides from image config (e.g., { react: '18' })\n const deps = frameworkConfig.deps || {};\n\n // Get import path aliases from image config (e.g., { '@/components/ui/*': '@packagedcn/react' })\n const aliases = image?.config.aliases || {};\n\n // Get entry file content\n const entryFile = project.files.get(project.entry);\n if (!entryFile) {\n throw new Error(`Entry file not found: ${project.entry}`);\n }\n\n // Build with esbuild using image-provided configuration\n const result = await esbuild.build({\n stdin: {\n contents: entryFile.content,\n loader,\n sourcefile: project.entry,\n },\n bundle: true,\n format,\n target,\n platform: manifest.platform === \"cli\" ? \"node\" : \"browser\",\n jsx,\n ...(esbuildConfig.jsxFactory\n ? { jsxFactory: esbuildConfig.jsxFactory }\n : {}),\n ...(esbuildConfig.jsxFragment\n ? { jsxFragment: esbuildConfig.jsxFragment }\n : {}),\n write: false,\n sourcemap: \"inline\",\n plugins: [\n vfsPlugin(project, { aliases }),\n cdnTransformPlugin({\n packages,\n globals,\n deps,\n aliases,\n }),\n ],\n });\n\n const code = result.outputFiles?.[0]?.text || \"\";\n const hash = hashContent(code);\n\n return {\n code,\n hash,\n manifest,\n };\n }\n\n /**\n * Mount a compiled widget to the DOM\n */\n async mount(\n widget: CompiledWidget,\n options: MountOptions,\n ): Promise<MountedWidget> {\n const image = this.registry.get(widget.manifest.image) || null;\n if (options.mode === \"iframe\") {\n return mountIframe(widget, options, image, this.proxy);\n }\n return mountEmbedded(widget, options, image, this.proxy);\n }\n\n /**\n * Unmount a mounted widget\n */\n unmount(mounted: MountedWidget): void {\n mounted.unmount();\n }\n\n /**\n * Hot reload a mounted widget\n */\n async reload(\n mounted: MountedWidget,\n source: string | VirtualProject,\n manifest: Manifest,\n ): Promise<void> {\n // Compile new version\n const widget = await this.compile(source, manifest);\n const image = this.registry.get(widget.manifest.image) || null;\n\n // Reload based on mode\n if (mounted.mode === \"iframe\") {\n await reloadIframe(mounted, widget, image, this.proxy);\n } else {\n await reloadEmbedded(mounted, widget, image, this.proxy);\n }\n }\n}\n","import type { VirtualFile, VirtualProject } from \"./types.js\";\n\nexport function createProjectFromFiles(\n files: VirtualFile[],\n id: string = crypto.randomUUID(),\n): VirtualProject {\n const fileMap = new Map<string, VirtualFile>();\n for (const file of files) {\n fileMap.set(file.path, file);\n }\n return { id, entry: resolveEntry(fileMap), files: fileMap };\n}\n\nexport function resolveEntry(files: Map<string, VirtualFile>): string {\n const paths = Array.from(files.keys());\n\n const mainFile = paths.find((p) => /\\bmain\\.(tsx?|jsx?)$/.test(p));\n if (mainFile) return mainFile;\n\n const indexFile = paths.find((p) => /\\bindex\\.(tsx?|jsx?)$/.test(p));\n if (indexFile) return indexFile;\n\n const firstTsx = paths.find((p) => /\\.(tsx|jsx)$/.test(p));\n if (firstTsx) return firstTsx;\n\n return paths[0] || \"main.tsx\";\n}\n\nexport function detectMainFile(language?: string): string {\n switch (language) {\n case \"tsx\":\n case \"typescript\":\n return \"main.tsx\";\n case \"jsx\":\n case \"javascript\":\n return \"main.jsx\";\n case \"ts\":\n return \"main.ts\";\n case \"js\":\n return \"main.js\";\n default:\n return \"main.tsx\";\n }\n}\n\nexport function createSingleFileProject(\n content: string,\n entry = \"main.tsx\",\n id = \"inline\",\n): VirtualProject {\n return {\n id,\n entry,\n files: new Map([[entry, { path: entry, content }]]),\n };\n}\n","/**\n * Zod schemas for Patchwork compiler types\n *\n * These schemas validate:\n * - ImageConfig from package.json patchwork field\n * - Widget manifests\n * - Input specifications\n */\n\nimport { z } from 'zod';\n\n// Platform schema\nexport const PlatformSchema = z.enum(['browser', 'cli']);\nexport type Platform = z.infer<typeof PlatformSchema>;\n\n// esbuild configuration schema\nexport const EsbuildConfigSchema = z\n .object({\n target: z.string().optional(),\n format: z.enum(['esm', 'cjs', 'iife']).optional(),\n jsx: z.enum(['automatic', 'transform', 'preserve']).optional(),\n jsxFactory: z.string().optional(),\n jsxFragment: z.string().optional(),\n })\n .strict()\n .optional();\n\nexport type EsbuildConfig = z.infer<typeof EsbuildConfigSchema>;\n\n// Framework configuration - specifies globals and CDN URLs for framework deps\nexport const FrameworkConfigSchema = z\n .object({\n // Map of package names to window global names (e.g., { react: 'React' })\n globals: z.record(z.string(), z.string()).optional(),\n // CDN URLs to preload before widget execution\n preload: z.array(z.string()).optional(),\n // Dependency version overrides for CDN packages (e.g., { react: '18' })\n deps: z.record(z.string(), z.string()).optional(),\n })\n .strict()\n .optional();\n\nexport type FrameworkConfig = z.infer<typeof FrameworkConfigSchema>;\n\n// Aliases schema - maps path patterns to target packages\nexport const AliasesSchema = z.record(z.string(), z.string()).optional();\n\nexport type Aliases = z.infer<typeof AliasesSchema>;\n\n// Dependencies schema - maps package names to version specifiers\nexport const DependenciesSchema = z.record(z.string(), z.string()).optional();\n\n// ImageConfig schema - validates package.json patchwork field\nexport const ImageConfigSchema = z\n .object({\n platform: PlatformSchema,\n dependencies: DependenciesSchema,\n esbuild: EsbuildConfigSchema,\n framework: FrameworkConfigSchema,\n aliases: AliasesSchema,\n })\n .strict();\n\nexport type ImageConfig = z.infer<typeof ImageConfigSchema>;\n\n// Input specification schema\nexport const InputSpecSchema = z.object({\n type: z.enum(['string', 'number', 'boolean', 'object', 'array']),\n default: z.unknown().optional(),\n required: z.boolean().optional(),\n description: z.string().optional(),\n});\n\nexport type InputSpec = z.infer<typeof InputSpecSchema>;\n\n// Widget manifest schema\nexport const ManifestSchema = z.object({\n name: z.string(),\n version: z.string(),\n description: z.string().optional(),\n platform: PlatformSchema,\n image: z.string(),\n inputs: z.record(z.string(), InputSpecSchema).optional(),\n services: z.array(z.string()).optional(),\n packages: z.record(z.string(), z.string()).optional(),\n});\n\nexport type Manifest = z.infer<typeof ManifestSchema>;\n\n// Compile options schema\nexport const CompileOptionsSchema = z\n .object({\n typescript: z.boolean().optional(),\n })\n .strict()\n .optional();\n\nexport type CompileOptions = z.infer<typeof CompileOptionsSchema>;\n\n// Mount mode schema\nexport const MountModeSchema = z.enum(['embedded', 'iframe']);\nexport type MountMode = z.infer<typeof MountModeSchema>;\n\n// Mount options schema\nexport const MountOptionsSchema = z.object({\n target: z.custom<HTMLElement>((v) => v instanceof HTMLElement, {\n message: 'Expected HTMLElement',\n }),\n mode: MountModeSchema,\n sandbox: z.array(z.string()).optional(),\n inputs: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type MountOptions = z.infer<typeof MountOptionsSchema>;\n\n/**\n * Parse and validate ImageConfig from package.json patchwork field\n *\n * @param data - Raw data from package.json patchwork field\n * @returns Validated ImageConfig\n * @throws z.ZodError if validation fails\n */\nexport function parseImageConfig(data: unknown): ImageConfig {\n return ImageConfigSchema.parse(data);\n}\n\n/**\n * Safely parse ImageConfig, returning null on failure\n */\nexport function safeParseImageConfig(data: unknown): ImageConfig | null {\n const result = ImageConfigSchema.safeParse(data);\n return result.success ? result.data : null;\n}\n\n/**\n * Parse and validate widget manifest\n */\nexport function parseManifest(data: unknown): Manifest {\n return ManifestSchema.parse(data);\n}\n\n/**\n * Safely parse manifest, returning null on failure\n */\nexport function safeParseManifest(data: unknown): Manifest | null {\n const result = ManifestSchema.safeParse(data);\n return result.success ? result.data : null;\n}\n\n// Default ImageConfig for fallback\nexport const DEFAULT_IMAGE_CONFIG: ImageConfig = {\n platform: 'browser',\n esbuild: {\n target: 'es2020',\n format: 'esm',\n jsx: 'automatic',\n },\n framework: {},\n};\n\n// Default CLI ImageConfig for fallback\nexport const DEFAULT_CLI_IMAGE_CONFIG: ImageConfig = {\n platform: 'cli',\n esbuild: {\n target: 'node20',\n format: 'esm',\n jsx: 'automatic',\n },\n};\n","/**\n * Image loader - fetches and loads image packages from CDN or local\n *\n * Images must be installed as npm packages or available on CDN.\n */\n\nimport type { LoadedImage } from '../types.js';\nimport { safeParseImageConfig, DEFAULT_IMAGE_CONFIG } from '../schemas.js';\n\nconst DEFAULT_CDN_BASE = 'https://esm.sh';\n\n// Module-level CDN base URL (can be overridden)\nlet cdnBaseUrl = DEFAULT_CDN_BASE;\n\n/**\n * Set the CDN base URL for image loading\n */\nexport function setCdnBaseUrl(url: string): void {\n cdnBaseUrl = url;\n}\n\n/**\n * Get the current CDN base URL\n */\nexport function getCdnBaseUrl(): string {\n return cdnBaseUrl;\n}\n\nexport interface ImagePackageJson {\n name: string;\n version: string;\n main?: string;\n dependencies?: Record<string, string>;\n patchwork?: unknown;\n}\n\n/**\n * Parse image specifier into name and version\n */\nexport function parseImageSpec(spec: string): {\n name: string;\n version?: string;\n} {\n // Handle scoped packages (@scope/name@version)\n if (spec.startsWith('@')) {\n const parts = spec.split('/');\n if (parts.length >= 2) {\n const scope = parts[0];\n const nameAndVersion = parts.slice(1).join('/');\n const atIndex = nameAndVersion.lastIndexOf('@');\n if (atIndex > 0) {\n return {\n name: `${scope}/${nameAndVersion.slice(0, atIndex)}`,\n version: nameAndVersion.slice(atIndex + 1),\n };\n }\n return { name: `${scope}/${nameAndVersion}` };\n }\n }\n\n // Handle non-scoped packages\n const atIndex = spec.lastIndexOf('@');\n if (atIndex > 0) {\n return {\n name: spec.slice(0, atIndex),\n version: spec.slice(atIndex + 1),\n };\n }\n return { name: spec };\n}\n\n/**\n * Fetch package.json from CDN\n */\nexport async function fetchPackageJson(\n packageName: string,\n version?: string,\n): Promise<ImagePackageJson> {\n const versionSuffix = version ? `@${version}` : '';\n const url = `${cdnBaseUrl}/${packageName}${versionSuffix}/package.json`;\n\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(\n `Failed to fetch package.json for ${packageName}: ${response.statusText}`,\n );\n }\n\n return response.json() as Promise<ImagePackageJson>;\n}\n\n/**\n * Try to load an image package from local node_modules\n *\n * Uses dynamic require.resolve to find the package.json,\n * then loads the setup function from the main entry.\n */\nasync function loadLocalImage(name: string): Promise<LoadedImage | null> {\n // Only works in Node.js environment\n if (\n typeof globalThis.require === 'undefined' &&\n typeof process === 'undefined'\n ) {\n return null;\n }\n\n try {\n // Use createRequire to get require.resolve in ESM context\n const { createRequire } = await import('node:module');\n const { readFile } = await import('node:fs/promises');\n const { dirname, join } = await import('node:path');\n\n // Create require from current file for resolution\n const require = createRequire(import.meta.url);\n\n // Resolve package.json path\n let packageJsonPath: string;\n try {\n packageJsonPath = require.resolve(`${name}/package.json`);\n } catch {\n // Package not installed locally\n return null;\n }\n\n // Read and parse package.json\n const packageJsonContent = await readFile(packageJsonPath, 'utf-8');\n const packageJson: ImagePackageJson = JSON.parse(packageJsonContent);\n\n // Validate and extract patchwork config\n const config =\n safeParseImageConfig(packageJson.patchwork) || DEFAULT_IMAGE_CONFIG;\n\n // Try to load setup and mount functions\n let setup: LoadedImage['setup'];\n let mount: LoadedImage['mount'];\n const packageDir = dirname(packageJsonPath);\n\n if (packageJson.main) {\n try {\n const mainPath = join(packageDir, packageJson.main);\n const imageModule = await import(\n /* webpackIgnore: true */ /* @vite-ignore */ mainPath\n );\n if (typeof imageModule.setup === 'function') {\n setup = imageModule.setup;\n }\n if (typeof imageModule.mount === 'function') {\n mount = imageModule.mount;\n }\n } catch {\n // Setup/mount are optional\n }\n }\n\n return {\n name: packageJson.name,\n version: packageJson.version,\n config,\n dependencies: packageJson.dependencies || {},\n setup,\n mount,\n };\n } catch {\n // Fall back to other methods\n return null;\n }\n}\n\n/**\n * Load an image package\n *\n * Priority:\n * 1. Try to resolve locally (require.resolve for installed packages)\n * 2. Fetch from CDN\n *\n * Images must be explicitly installed or available on CDN.\n */\nexport async function loadImage(spec: string): Promise<LoadedImage> {\n const { name, version } = parseImageSpec(spec);\n\n // Try local resolution first (for installed packages)\n const localImage = await loadLocalImage(name);\n if (localImage) {\n return localImage;\n }\n\n // Fetch from CDN\n const packageJson = await fetchPackageJson(name, version);\n\n // Validate and extract patchwork config\n const config =\n safeParseImageConfig(packageJson.patchwork) || DEFAULT_IMAGE_CONFIG;\n\n // Try to load setup/mount functions if main is specified\n let setup: LoadedImage['setup'];\n let mount: LoadedImage['mount'];\n let moduleUrl: string | undefined;\n if (packageJson.main && typeof window !== 'undefined') {\n try {\n const versionSuffix = version ? `@${version}` : '';\n // Import with explicit main entry path so relative imports resolve correctly\n // Without this, the browser treats the package name as a file and resolves\n // relative imports to the wrong directory\n const mainEntry = packageJson.main.startsWith('./')\n ? packageJson.main.slice(2)\n : packageJson.main;\n const importUrl = `${cdnBaseUrl}/${name}${versionSuffix}/${mainEntry}`;\n moduleUrl = importUrl;\n const imageModule = await import(\n /* @vite-ignore */\n importUrl\n );\n if (typeof imageModule.setup === 'function') {\n setup = imageModule.setup;\n }\n if (typeof imageModule.mount === 'function') {\n mount = imageModule.mount;\n }\n } catch (err) {\n // Setup/mount are optional, but log the error for debugging\n console.error('[patchwork-compiler] Failed to load image module:', err);\n }\n }\n\n return {\n name: packageJson.name,\n version: packageJson.version,\n moduleUrl,\n config,\n dependencies: packageJson.dependencies || {},\n setup,\n mount,\n };\n}\n","/**\n * Image registry - manages loaded images\n */\n\nimport type { LoadedImage } from '../types.js';\nimport { loadImage, parseImageSpec } from './loader.js';\n\n/**\n * Registry of loaded images\n */\nclass ImageRegistry {\n private images = new Map<string, LoadedImage>();\n private loading = new Map<string, Promise<LoadedImage>>();\n\n /**\n * Get a loaded image by spec\n */\n get(spec: string): LoadedImage | undefined {\n const { name } = parseImageSpec(spec);\n return this.images.get(name);\n }\n\n /**\n * Check if an image is loaded\n */\n has(spec: string): boolean {\n const { name } = parseImageSpec(spec);\n return this.images.has(name);\n }\n\n /**\n * Load an image (or return cached)\n */\n async load(spec: string): Promise<LoadedImage> {\n const { name } = parseImageSpec(spec);\n\n // Return cached\n const cached = this.images.get(name);\n if (cached) {\n return cached;\n }\n\n // Return in-progress load\n const inProgress = this.loading.get(name);\n if (inProgress) {\n return inProgress;\n }\n\n // Start loading\n const loadPromise = loadImage(spec).then((image) => {\n this.images.set(name, image);\n this.loading.delete(name);\n return image;\n });\n\n this.loading.set(name, loadPromise);\n return loadPromise;\n }\n\n /**\n * Preload an image\n */\n async preload(spec: string): Promise<void> {\n await this.load(spec);\n }\n\n /**\n * Clear a specific image from cache\n */\n clear(spec: string): void {\n const { name } = parseImageSpec(spec);\n this.images.delete(name);\n this.loading.delete(name);\n }\n\n /**\n * Clear all cached images\n */\n clearAll(): void {\n this.images.clear();\n this.loading.clear();\n }\n\n /**\n * Get all loaded image names\n */\n getLoadedNames(): string[] {\n return Array.from(this.images.keys());\n }\n}\n\n// Global singleton registry\nlet globalRegistry: ImageRegistry | null = null;\n\n/**\n * Get the global image registry\n */\nexport function getImageRegistry(): ImageRegistry {\n if (!globalRegistry) {\n globalRegistry = new ImageRegistry();\n }\n return globalRegistry;\n}\n\n/**\n * Create a new isolated image registry\n */\nexport function createImageRegistry(): ImageRegistry {\n return new ImageRegistry();\n}\n\nexport { ImageRegistry };\n","/**\n * CDN transform - converts bare imports to CDN URLs (esm.sh)\n */\n\nimport type { Plugin } from 'esbuild-wasm';\n\nconst DEFAULT_CDN_BASE = 'https://esm.sh';\nlet cdnBaseUrl = DEFAULT_CDN_BASE;\n\nexport function setCdnBaseUrl(url: string): void {\n cdnBaseUrl = url;\n}\n\nexport function getCdnBaseUrl(): string {\n return cdnBaseUrl;\n}\n\n// Packages that should be externalized (not bundled from CDN)\nconst EXTERNAL_PACKAGES = new Set(['react', 'react-dom', 'ink']);\n\n// Built-in Node.js modules that should remain external\nconst NODE_BUILTINS = new Set([\n 'assert',\n 'buffer',\n 'child_process',\n 'cluster',\n 'crypto',\n 'dgram',\n 'dns',\n 'events',\n 'fs',\n 'http',\n 'http2',\n 'https',\n 'net',\n 'os',\n 'path',\n 'perf_hooks',\n 'process',\n 'querystring',\n 'readline',\n 'stream',\n 'string_decoder',\n 'timers',\n 'tls',\n 'tty',\n 'url',\n 'util',\n 'v8',\n 'vm',\n 'worker_threads',\n 'zlib',\n]);\n\n/**\n * Parse a package specifier into name and version\n */\nexport function parsePackageSpec(spec: string): {\n name: string;\n version?: string;\n} {\n // Handle scoped packages (@scope/name)\n if (spec.startsWith('@')) {\n const parts = spec.split('/');\n if (parts.length >= 2) {\n const scope = parts[0];\n const nameAndVersion = parts.slice(1).join('/');\n const atIndex = nameAndVersion.lastIndexOf('@');\n if (atIndex > 0) {\n return {\n name: `${scope}/${nameAndVersion.slice(0, atIndex)}`,\n version: nameAndVersion.slice(atIndex + 1),\n };\n }\n return { name: `${scope}/${nameAndVersion}` };\n }\n }\n\n // Handle non-scoped packages\n const atIndex = spec.lastIndexOf('@');\n if (atIndex > 0) {\n return {\n name: spec.slice(0, atIndex),\n version: spec.slice(atIndex + 1),\n };\n }\n return { name: spec };\n}\n\n/**\n * Convert a package specifier to an esm.sh URL\n *\n * @param packageName - The npm package name\n * @param version - Optional version specifier\n * @param subpath - Optional subpath (e.g., '/client' for 'react-dom/client')\n * @param deps - Optional dependency version overrides (use ?deps=react@18)\n */\nexport function toEsmShUrl(\n packageName: string,\n version?: string,\n subpath?: string,\n deps?: Record<string, string>,\n): string {\n let url = `${cdnBaseUrl}/${packageName}`;\n\n if (version) {\n url += `@${version}`;\n }\n\n if (subpath) {\n url += `/${subpath}`;\n }\n\n // Add deps flag to ensure consistent dependency versions across all packages\n // This makes all packages use the same React version, avoiding version mismatches\n if (deps && Object.keys(deps).length > 0) {\n const depsStr = Object.entries(deps)\n .map(([name, ver]) => `${name}@${ver}`)\n .join(',');\n url += `?deps=${depsStr}`;\n }\n\n return url;\n}\n\n/**\n * Check if an import path is a bare module specifier\n */\nexport function isBareImport(path: string): boolean {\n // Not bare if starts with ., /, or is a URL\n if (\n path.startsWith('.') ||\n path.startsWith('/') ||\n path.startsWith('http://') ||\n path.startsWith('https://')\n ) {\n return false;\n }\n return true;\n}\n\n/**\n * Extract package name and subpath from an import\n */\nexport function parseImportPath(importPath: string): {\n packageName: string;\n subpath?: string;\n} {\n // Handle scoped packages\n if (importPath.startsWith('@')) {\n const parts = importPath.split('/');\n if (parts.length >= 2) {\n const packageName = `${parts[0]}/${parts[1]}`;\n const subpath = parts.slice(2).join('/');\n return { packageName, subpath: subpath || undefined };\n }\n }\n\n // Handle non-scoped packages\n const parts = importPath.split('/');\n const packageName = parts[0] as string;\n const subpath = parts.slice(1).join('/');\n return { packageName, subpath: subpath || undefined };\n}\n\nexport interface CdnTransformOptions {\n /** Map of package names to versions */\n packages?: Record<string, string>;\n /** Additional external packages */\n external?: string[];\n /** Use bundled versions from esm.sh (adds ?bundle) */\n bundle?: boolean;\n /** Packages to inject from window globals instead of CDN */\n globals?: Record<string, string>;\n /** Dependency version overrides for CDN URLs (e.g., { react: '18' }) */\n deps?: Record<string, string>;\n /** Import path aliases (e.g., { '@/components/ui/*': '@packagedcn/react' }) */\n aliases?: Record<string, string>;\n}\n\n/**\n * Match an import path against alias patterns\n * Supports glob patterns like '@/components/ui/*'\n */\nfunction matchAlias(\n importPath: string,\n aliases: Record<string, string>,\n): string | null {\n for (const [pattern, target] of Object.entries(aliases)) {\n // Handle glob patterns ending with /*\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2); // Remove /*\n if (importPath === prefix || importPath.startsWith(prefix + '/')) {\n return target;\n }\n }\n // Exact match\n if (importPath === pattern) {\n return target;\n }\n }\n return null;\n}\n\n/**\n * Create an esbuild plugin that transforms bare imports to CDN URLs\n * and injects globals for specified packages (like React)\n */\nexport function cdnTransformPlugin(options: CdnTransformOptions = {}): Plugin {\n const {\n packages = {},\n external = [],\n bundle = false,\n globals = {},\n deps = {},\n aliases = {},\n } = options;\n\n const externalSet = new Set([...EXTERNAL_PACKAGES, ...external]);\n const globalsSet = new Set(Object.keys(globals));\n\n return {\n name: 'cdn-transform',\n setup(build) {\n // Handle import aliases first (e.g., @/components/ui/* -> @packagedcn/react)\n // This must resolve directly to CDN URL or global-inject\n build.onResolve({ filter: /.*/ }, (args) => {\n const aliasTarget = matchAlias(args.path, aliases);\n if (aliasTarget) {\n const { packageName, subpath } = parseImportPath(aliasTarget);\n\n // Check if aliased target should use globals\n if (globalsSet.has(packageName)) {\n return {\n path: aliasTarget,\n namespace: 'global-inject',\n };\n }\n\n // Convert aliased import directly to CDN URL\n const version = packages[packageName];\n let url = toEsmShUrl(\n packageName,\n version,\n subpath,\n Object.keys(deps).length > 0 ? deps : undefined,\n );\n if (bundle) {\n url += url.includes('?') ? '&bundle' : '?bundle';\n }\n\n return {\n path: url,\n external: true,\n };\n }\n return null;\n });\n\n // Handle packages that should come from window globals\n build.onResolve({ filter: /.*/ }, (args) => {\n if (!isBareImport(args.path)) {\n return null;\n }\n\n const { packageName } = parseImportPath(args.path);\n\n // Check if this package should be injected from globals\n if (globalsSet.has(packageName)) {\n return {\n path: args.path,\n namespace: 'global-inject',\n };\n }\n\n return null;\n });\n\n // Provide virtual modules that export window globals\n build.onLoad({ filter: /.*/, namespace: 'global-inject' }, (args) => {\n const { packageName, subpath } = parseImportPath(args.path);\n const globalName = globals[packageName];\n\n if (!globalName) return null;\n\n // Handle subpath imports like 'react-dom/client'\n if (subpath) {\n // For react-dom/client, we need to access window.ReactDOM (which is already the client)\n return {\n contents: `export * from '${packageName}'; export { default } from '${packageName}';`,\n loader: 'js',\n };\n }\n\n // Generate a module that exports the global\n // This handles both default and named exports\n const contents = `\nconst mod = window.${globalName};\nexport default mod;\n// Re-export all properties as named exports\nconst { ${getCommonExports(packageName).join(', ')} } = mod;\nexport { ${getCommonExports(packageName).join(', ')} };\n`;\n return {\n contents,\n loader: 'js',\n };\n });\n\n // Mark external packages and transform to CDN URLs\n build.onResolve({ filter: /.*/ }, (args) => {\n if (!isBareImport(args.path)) {\n return null; // Let esbuild handle relative/absolute imports\n }\n\n // Check if it's a Node.js builtin\n if (NODE_BUILTINS.has(args.path)) {\n return { external: true };\n }\n\n const { packageName, subpath } = parseImportPath(args.path);\n\n // Skip if handled by globals\n if (globalsSet.has(packageName)) {\n return null;\n }\n\n // Check if it should be external (but not converted to CDN)\n if (externalSet.has(packageName)) {\n return { external: true };\n }\n\n // Get version from packages map\n const version = packages[packageName];\n\n // Use deps from options for consistent dependency versions across CDN packages\n // This prevents multiple React instances which cause element serialization errors\n let url = toEsmShUrl(\n packageName,\n version,\n subpath,\n Object.keys(deps).length > 0 ? deps : undefined,\n );\n if (bundle) {\n url += url.includes('?') ? '&bundle' : '?bundle';\n }\n\n return {\n path: url,\n external: true,\n };\n });\n },\n };\n}\n\n/**\n * Get common named exports for known packages\n */\nfunction getCommonExports(packageName: string): string[] {\n const exports: Record<string, string[]> = {\n react: [\n 'useState',\n 'useEffect',\n 'useCallback',\n 'useMemo',\n 'useRef',\n 'useContext',\n 'useReducer',\n 'useLayoutEffect',\n 'useId',\n 'createContext',\n 'createElement',\n 'cloneElement',\n 'createRef',\n 'forwardRef',\n 'lazy',\n 'memo',\n 'Fragment',\n 'Suspense',\n 'StrictMode',\n 'Component',\n 'PureComponent',\n 'Children',\n 'isValidElement',\n ],\n 'react-dom': [\n 'createPortal',\n 'flushSync',\n 'render',\n 'hydrate',\n 'unmountComponentAtNode',\n ],\n };\n return exports[packageName] || [];\n}\n\n/**\n * Generate import map for CDN dependencies\n */\nexport function generateImportMap(\n packages: Record<string, string>,\n): Record<string, string> {\n const imports: Record<string, string> = {};\n\n for (const [name, version] of Object.entries(packages)) {\n imports[name] = toEsmShUrl(name, version);\n }\n\n return imports;\n}\n","import type { Plugin, Loader } from 'esbuild-wasm';\nimport type { VirtualProject } from '../vfs/types.js';\n\nfunction dirname(path: string): string {\n const idx = path.lastIndexOf('/');\n return idx === -1 ? '.' : path.slice(0, idx) || '.';\n}\n\nfunction normalizePath(path: string): string {\n const parts: string[] = [];\n for (const segment of path.split('/')) {\n if (segment === '..') parts.pop();\n else if (segment && segment !== '.') parts.push(segment);\n }\n return parts.join('/');\n}\n\nfunction inferLoader(path: string, language?: string): Loader {\n if (language) {\n switch (language) {\n case 'typescript':\n case 'ts':\n return 'ts';\n case 'tsx':\n return 'tsx';\n case 'javascript':\n case 'js':\n return 'js';\n case 'jsx':\n return 'jsx';\n case 'json':\n return 'json';\n case 'css':\n return 'css';\n }\n }\n const ext = path.split('.').pop();\n switch (ext) {\n case 'ts':\n return 'ts';\n case 'tsx':\n return 'tsx';\n case 'js':\n return 'js';\n case 'jsx':\n return 'jsx';\n case 'json':\n return 'json';\n case 'css':\n return 'css';\n default:\n return 'tsx';\n }\n}\n\nfunction normalizeVFSPath(path: string): string {\n if (path.startsWith('@/')) {\n return path.slice(2);\n }\n return path;\n}\n\nfunction resolveRelativePath(importer: string, target: string): string {\n const importerDir = dirname(normalizeVFSPath(importer));\n const combined = importerDir === '.' ? target : `${importerDir}/${target}`;\n return normalizePath(combined);\n}\n\nfunction matchAlias(\n importPath: string,\n aliases?: Record<string, string>,\n): string | null {\n if (!aliases) return null;\n for (const [pattern, target] of Object.entries(aliases)) {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2);\n if (importPath === prefix || importPath.startsWith(prefix + '/')) {\n return target;\n }\n }\n if (importPath === pattern) {\n return target;\n }\n }\n return null;\n}\n\nfunction findFile(project: VirtualProject, path: string): string | null {\n if (project.files.has(path)) return path;\n const extensions = ['.tsx', '.ts', '.jsx', '.js', '.json'];\n for (const ext of extensions) {\n if (project.files.has(path + ext)) return path + ext;\n }\n for (const ext of extensions) {\n const indexPath = `${path}/index${ext}`;\n if (project.files.has(indexPath)) return indexPath;\n }\n return null;\n}\n\nexport interface VFSPluginOptions {\n aliases?: Record<string, string>;\n}\n\nexport function vfsPlugin(\n project: VirtualProject,\n options: VFSPluginOptions = {},\n): Plugin {\n return {\n name: 'patchwork-vfs',\n setup(build) {\n build.onResolve({ filter: /^@\\// }, (args) => {\n const aliased = matchAlias(args.path, options.aliases);\n if (aliased) return null;\n return { path: args.path, namespace: 'vfs' };\n });\n\n build.onResolve({ filter: /^\\./ }, (args) => {\n if (args.namespace !== 'vfs') return null;\n const resolved = resolveRelativePath(args.importer, args.path);\n return { path: resolved, namespace: 'vfs' };\n });\n\n build.onLoad({ filter: /.*/, namespace: 'vfs' }, (args) => {\n const normalPath = normalizeVFSPath(args.path);\n const filePath = findFile(project, normalPath);\n if (!filePath) {\n throw new Error(`File not found in VFS: ${args.path}`);\n }\n const file = project.files.get(filePath)!;\n return {\n contents: file.content,\n loader: inferLoader(filePath, file.language),\n };\n });\n },\n };\n}\n","/**\n * Service bridge - handles communication between widgets and service proxy\n */\n\nimport type {\n BridgeMessage,\n ServiceCallPayload,\n ServiceResultPayload,\n ServiceProxy,\n} from '../types.js';\n\n/**\n * Generate a unique message ID\n */\nfunction generateMessageId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * Create a service proxy that calls the backend via HTTP\n */\nexport function createHttpServiceProxy(proxyUrl: string): ServiceProxy {\n return {\n async call(\n namespace: string,\n procedure: string,\n args: unknown[],\n ): Promise<unknown> {\n const url = `${proxyUrl}/${namespace}/${procedure}`;\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ args: args[0] ?? {} }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Service call failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = await response.json();\n return result;\n },\n };\n}\n\n/**\n * Creates a proxy that enables fluent method chaining for dynamic field access.\n *\n * This allows arbitrary nested property access that resolves to a callable function,\n * supporting patterns like `proxy.foo()`, `proxy.foo.bar()`, `proxy.bar.baz.qux()`.\n *\n * Used to create global namespace objects that proxy calls to a service backend.\n */\nexport function createFieldAccessProxy<T = unknown>(\n namespace: string,\n handler: (\n namespace: string,\n methodPath: string,\n ...args: T[]\n ) => Promise<unknown>,\n): Record<string, (...args: T[]) => Promise<unknown>> {\n function createNestedProxy(path: string): (...args: T[]) => Promise<unknown> {\n const fn = (...args: T[]) => handler(namespace, path, ...args);\n\n return new Proxy(fn, {\n get(_, nestedName: string) {\n if (typeof nestedName === 'symbol') return undefined;\n const newPath = path ? `${path}.${nestedName}` : nestedName;\n return createNestedProxy(newPath);\n },\n }) as (...args: T[]) => Promise<unknown>;\n }\n\n return new Proxy(\n {},\n {\n get(_, fieldName: string) {\n if (typeof fieldName === 'symbol') return undefined;\n return createNestedProxy(fieldName);\n },\n },\n );\n}\n\n/**\n * Create namespace globals that proxy calls to a service proxy\n *\n * Creates dynamic proxy objects for each namespace that support arbitrary\n * nested method calls. This replaces the old static method registration.\n *\n * @param services - Array of service names (e.g., ['git', 'github'])\n * @param proxy - The service proxy to forward calls to\n * @returns Record of namespace names to proxy objects\n *\n * @example\n * ```typescript\n * const namespaces = generateNamespaceGlobals(['git', 'github'], proxy);\n * // namespaces.git.status() calls proxy.call('git', 'status', [])\n * // namespaces.github.repos.list_for_user({ username: 'x' })\n * // calls proxy.call('github', 'repos.list_for_user', [{ username: 'x' }])\n * ```\n */\nexport function generateNamespaceGlobals(\n services: string[],\n proxy: ServiceProxy,\n): Record<string, unknown> {\n const namespaces: Record<string, unknown> = {};\n const uniqueNamespaces = extractNamespaces(services);\n\n for (const namespace of uniqueNamespaces) {\n namespaces[namespace] = createFieldAccessProxy(\n namespace,\n (ns, method, ...args) => proxy.call(ns, method, args),\n );\n }\n\n return namespaces;\n}\n\n/**\n * Inject namespace globals into a window object\n */\nexport function injectNamespaceGlobals(\n target: Window | typeof globalThis,\n namespaces: Record<string, unknown>,\n): void {\n for (const [name, value] of Object.entries(namespaces)) {\n (target as Record<string, unknown>)[name] = value;\n }\n}\n\n/**\n * Remove namespace globals from a window object\n */\nexport function removeNamespaceGlobals(\n target: Window | typeof globalThis,\n namespaceNames: string[],\n): void {\n for (const name of namespaceNames) {\n delete (target as Record<string, unknown>)[name];\n }\n}\n\n/**\n * Extract unique namespace names from services array\n */\nexport function extractNamespaces(services: string[]): string[] {\n const namespaces = new Set<string>();\n for (const service of services) {\n const parts = service.split('.');\n if (parts[0]) {\n namespaces.add(parts[0]);\n }\n }\n return Array.from(namespaces);\n}\n\n/**\n * Parent-side bridge for iframe communication\n *\n * Listens for postMessage events from iframes and proxies service calls.\n */\nexport class ParentBridge {\n private proxy: ServiceProxy;\n private pendingCalls = new Map<\n string,\n { resolve: (value: unknown) => void; reject: (error: Error) => void }\n >();\n private iframes = new Set<HTMLIFrameElement>();\n private messageHandler: (event: MessageEvent) => void;\n\n constructor(proxy: ServiceProxy) {\n this.proxy = proxy;\n this.messageHandler = this.handleMessage.bind(this);\n if (typeof window !== 'undefined') {\n window.addEventListener('message', this.messageHandler);\n }\n }\n\n /**\n * Register an iframe to receive messages from\n */\n registerIframe(iframe: HTMLIFrameElement): void {\n this.iframes.add(iframe);\n }\n\n /**\n * Unregister an iframe\n */\n unregisterIframe(iframe: HTMLIFrameElement): void {\n this.iframes.delete(iframe);\n }\n\n /**\n * Handle incoming messages from iframes\n */\n private async handleMessage(event: MessageEvent): Promise<void> {\n // Verify source is a registered iframe\n const sourceIframe = Array.from(this.iframes).find(\n (iframe) => iframe.contentWindow === event.source,\n );\n\n if (!sourceIframe) {\n return; // Ignore messages from unknown sources\n }\n\n const message = event.data as BridgeMessage;\n if (!message || typeof message !== 'object') return;\n\n if (message.type === 'service-call') {\n const payload = message.payload as ServiceCallPayload;\n try {\n const result = await this.proxy.call(\n payload.namespace,\n payload.procedure,\n payload.args,\n );\n\n const response: BridgeMessage = {\n type: 'service-result',\n id: message.id,\n payload: { result } as ServiceResultPayload,\n };\n\n sourceIframe.contentWindow?.postMessage(response, '*');\n } catch (error) {\n const response: BridgeMessage = {\n type: 'service-result',\n id: message.id,\n payload: {\n error: error instanceof Error ? error.message : String(error),\n } as ServiceResultPayload,\n };\n\n sourceIframe.contentWindow?.postMessage(response, '*');\n }\n }\n }\n\n /**\n * Dispose the bridge\n */\n dispose(): void {\n if (typeof window !== 'undefined') {\n window.removeEventListener('message', this.messageHandler);\n }\n this.iframes.clear();\n this.pendingCalls.clear();\n }\n}\n\n/**\n * Child-side bridge for iframe communication\n *\n * Creates a service proxy that sends postMessage to parent.\n */\nexport function createIframeServiceProxy(): ServiceProxy {\n const pendingCalls = new Map<\n string,\n { resolve: (value: unknown) => void; reject: (error: Error) => void }\n >();\n\n // Listen for results from parent\n if (typeof window !== 'undefined') {\n window.addEventListener('message', (event: MessageEvent) => {\n const message = event.data as BridgeMessage;\n if (!message || typeof message !== 'object') return;\n\n if (message.type === 'service-result') {\n const pending = pendingCalls.get(message.id);\n if (pending) {\n pendingCalls.delete(message.id);\n const payload = message.payload as ServiceResultPayload;\n if (payload.error) {\n pending.reject(new Error(payload.error));\n } else {\n pending.resolve(payload.result);\n }\n }\n }\n });\n }\n\n return {\n call(\n namespace: string,\n procedure: string,\n args: unknown[],\n ): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const id = generateMessageId();\n pendingCalls.set(id, { resolve, reject });\n\n const message: BridgeMessage = {\n type: 'service-call',\n id,\n payload: { namespace, procedure, args } as ServiceCallPayload,\n };\n\n window.parent.postMessage(message, '*');\n\n // Timeout after 30 seconds\n setTimeout(() => {\n if (pendingCalls.has(id)) {\n pendingCalls.delete(id);\n reject(\n new Error(`Service call timeout: ${namespace}.${procedure}`),\n );\n }\n }, 30000);\n });\n },\n };\n}\n\n/**\n * Generate the bridge script to inject into iframes\n *\n * Creates a self-contained script that sets up:\n * 1. Message handling for service results from parent\n * 2. Dynamic proxy objects for each namespace that support arbitrary nested calls\n */\nexport function generateIframeBridgeScript(services: string[]): string {\n const uniqueNamespaces = extractNamespaces(services);\n const namespaceAssignments = uniqueNamespaces\n .map((ns) => `window.${ns} = createNamespaceProxy('${ns}');`)\n .join('\\n ');\n\n return `\n(function() {\n const pendingCalls = new Map();\n\n window.addEventListener('message', function(event) {\n const message = event.data;\n if (!message || typeof message !== 'object') return;\n\n if (message.type === 'service-result') {\n const pending = pendingCalls.get(message.id);\n if (pending) {\n pendingCalls.delete(message.id);\n if (message.payload.error) {\n pending.reject(new Error(message.payload.error));\n } else {\n pending.resolve(message.payload.result);\n }\n }\n }\n });\n\n function proxyCall(namespace, procedure, args) {\n return new Promise(function(resolve, reject) {\n const id = Date.now() + '-' + Math.random().toString(36).slice(2, 11);\n pendingCalls.set(id, { resolve: resolve, reject: reject });\n\n window.parent.postMessage({\n type: 'service-call',\n id: id,\n payload: { namespace: namespace, procedure: procedure, args: args }\n }, '*');\n\n setTimeout(function() {\n if (pendingCalls.has(id)) {\n pendingCalls.delete(id);\n reject(new Error('Service call timeout: ' + namespace + '.' + procedure));\n }\n }, 30000);\n });\n }\n\n // Create a dynamic proxy for a namespace that supports arbitrary nested method calls\n function createNamespaceProxy(namespace) {\n function createNestedProxy(path) {\n var fn = function() {\n return proxyCall(namespace, path, Array.prototype.slice.call(arguments));\n };\n\n return new Proxy(fn, {\n get: function(_, nestedName) {\n if (typeof nestedName === 'symbol') return undefined;\n var newPath = path ? path + '.' + nestedName : nestedName;\n return createNestedProxy(newPath);\n }\n });\n }\n\n return new Proxy({}, {\n get: function(_, fieldName) {\n if (typeof fieldName === 'symbol') return undefined;\n return createNestedProxy(fieldName);\n }\n });\n }\n\n ${namespaceAssignments}\n})();\n`;\n}\n","/**\n * Embedded mount mode - mounts widgets directly in the DOM\n *\n * For trusted widgets that need full window access.\n */\n\nimport type {\n CompiledWidget,\n LoadedImage,\n MountedWidget,\n MountOptions,\n ServiceProxy,\n} from '../types.js';\nimport {\n generateNamespaceGlobals,\n injectNamespaceGlobals,\n removeNamespaceGlobals,\n extractNamespaces,\n} from './bridge.js';\n\nlet mountCounter = 0;\nlet importMapInjected = false;\n\n/**\n * Inject an import map for bare module specifiers.\n * Maps package names to their CDN URLs so browsers can resolve them.\n * Must be called before any ES module imports happen.\n */\nfunction injectImportMap(\n globals: Record<string, string>,\n preloadUrls: string[],\n deps?: Record<string, string>,\n): void {\n // Only inject once per page (browser limitation)\n if (importMapInjected) return;\n\n // Check if there's already an import map\n const existingMap = document.querySelector('script[type=\"importmap\"]');\n if (existingMap) {\n // Cannot modify existing import maps in standard browsers\n importMapInjected = true;\n return;\n }\n\n // Build import map from globals + preload URLs\n // Convention: globals keys are package names, preload URLs are in matching order\n const imports: Record<string, string> = {};\n const packageNames = Object.keys(globals);\n\n packageNames.forEach((pkgName, index) => {\n // Use the preload URL if available, otherwise construct CDN URL\n if (preloadUrls[index]) {\n imports[pkgName] = preloadUrls[index];\n } else if (deps?.[pkgName]) {\n imports[pkgName] = `https://esm.sh/${pkgName}@${deps[pkgName]}`;\n } else {\n imports[pkgName] = `https://esm.sh/${pkgName}`;\n }\n });\n\n // Also add common subpaths (e.g., react-dom/client)\n if (imports['react-dom']) {\n imports['react-dom/client'] = imports['react-dom'];\n }\n\n // Inject new import map\n const script = document.createElement('script');\n script.type = 'importmap';\n script.textContent = JSON.stringify({ imports }, null, 2);\n document.head.insertBefore(script, document.head.firstChild);\n\n importMapInjected = true;\n}\n\n/**\n * Generate a unique mount ID\n */\nfunction generateMountId(): string {\n return `pw-mount-${Date.now()}-${++mountCounter}`;\n}\n\ntype CreateElementFn = (...args: unknown[]) => unknown;\ntype CreateRootFn = (el: HTMLElement) => {\n render: (el: unknown) => void;\n unmount?: () => void;\n};\ntype RenderFn = (el: unknown, container: HTMLElement) => void;\n\ntype Renderer =\n | { kind: 'root'; createRoot: CreateRootFn }\n | { kind: 'render'; render: RenderFn };\n\nfunction pickCreateElement(\n globals: Array<Record<string, unknown>>,\n): CreateElementFn | null {\n for (const obj of globals) {\n const ce = obj?.createElement;\n if (typeof ce === 'function') return ce as CreateElementFn;\n const def = obj?.default as Record<string, unknown> | undefined;\n if (def && typeof def.createElement === 'function') {\n return def.createElement as CreateElementFn;\n }\n }\n return null;\n}\n\nfunction pickRenderer(\n globals: Array<Record<string, unknown>>,\n): Renderer | null {\n for (const obj of globals) {\n if (obj && typeof obj.createRoot === 'function') {\n return { kind: 'root', createRoot: obj.createRoot as CreateRootFn };\n }\n if (obj && typeof obj.render === 'function') {\n return { kind: 'render', render: obj.render as RenderFn };\n }\n const def = obj?.default as Record<string, unknown> | undefined;\n if (def && typeof def.createRoot === 'function') {\n return { kind: 'root', createRoot: def.createRoot as CreateRootFn };\n }\n if (def && typeof def.render === 'function') {\n return { kind: 'render', render: def.render as RenderFn };\n }\n }\n return null;\n}\n\n/**\n * Mount a widget in embedded mode (direct DOM injection)\n */\nexport async function mountEmbedded(\n widget: CompiledWidget,\n options: MountOptions,\n image: LoadedImage | null,\n proxy: ServiceProxy,\n): Promise<MountedWidget> {\n const { target, inputs = {} } = options;\n const mountId = generateMountId();\n\n // Create container\n const container = document.createElement('div');\n container.id = mountId;\n container.className = 'patchwork-widget patchwork-embedded';\n target.appendChild(container);\n\n // Run image setup if available\n if (image?.setup) {\n await image.setup(container);\n }\n\n // Inject CSS if available\n if (image?.css) {\n const style = document.createElement('style');\n style.id = `${mountId}-style`;\n style.textContent = image.css;\n document.head.appendChild(style);\n }\n\n // Generate and inject service namespace globals\n const services = widget.manifest.services || [];\n const namespaceNames = extractNamespaces(services);\n const namespaces = generateNamespaceGlobals(services, proxy);\n injectNamespaceGlobals(window, namespaces);\n\n // Get framework config from image\n const frameworkConfig = image?.config?.framework || {};\n const preloadUrls = frameworkConfig.preload || [];\n const globalMapping = frameworkConfig.globals || {};\n const deps = frameworkConfig.deps || {};\n\n // Inject import map for bare module specifiers (must happen before ES module imports)\n // This allows the browser to resolve imports like 'react' to CDN URLs\n injectImportMap(globalMapping, preloadUrls, deps);\n\n // Pre-load framework modules from image config\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const preloadedModules: any[] = await Promise.all(\n preloadUrls.map(\n (url: string) => import(/* webpackIgnore: true */ /* @vite-ignore */ url),\n ),\n );\n\n // Set framework globals on window based on image config\n const win = window as unknown as Record<string, unknown>;\n const globalNames = Object.values(globalMapping) as string[];\n\n // Map preloaded modules to their global names\n // Convention: preload order matches globals order (react -> React, react-dom -> ReactDOM)\n preloadedModules.forEach((mod, index) => {\n if (globalNames[index]) {\n const name = globalNames[index];\n win[name] = mod;\n }\n });\n\n // Create a blob with the widget code\n const blob = new Blob([widget.code], { type: 'application/javascript' });\n const scriptUrl = URL.createObjectURL(blob);\n\n // Import the module\n let moduleCleanup: (() => void) | undefined;\n\n const globalObjects = globalNames\n .map((n) => win[n] as unknown)\n .filter(Boolean) as Array<Record<string, unknown>>;\n\n try {\n const module = await import(/* webpackIgnore: true */ scriptUrl);\n\n // Image-provided mount handler takes priority\n if (image?.mount) {\n const result = await image.mount(module, container, inputs);\n if (typeof result === 'function') {\n moduleCleanup = result;\n }\n } else if (typeof module.mount === 'function') {\n // Widget exports its own mount function\n const result = await module.mount(container, inputs);\n if (typeof result === 'function') {\n moduleCleanup = result;\n }\n } else if (typeof module.render === 'function') {\n // Custom render function\n const result = await module.render(container, inputs);\n if (typeof result === 'function') {\n moduleCleanup = result;\n }\n } else if (typeof module.default === 'function') {\n // Default export component - render using framework\n const Component = module.default;\n\n const createElement = pickCreateElement(globalObjects);\n const renderer = pickRenderer(globalObjects);\n\n if (createElement && renderer?.kind === 'root') {\n const root = renderer.createRoot(container);\n root.render(createElement(Component, inputs));\n if (typeof root.unmount === 'function') {\n moduleCleanup = () => root.unmount!();\n }\n } else if (createElement && renderer?.kind === 'render') {\n renderer.render(createElement(Component, inputs), container);\n } else {\n // No framework renderer - try calling as plain function\n const result = Component(inputs);\n if (result instanceof HTMLElement) {\n container.appendChild(result);\n } else if (typeof result === 'string') {\n container.innerHTML = result;\n }\n }\n }\n } finally {\n URL.revokeObjectURL(scriptUrl);\n }\n\n // Create unmount function\n const unmount = () => {\n // Call module cleanup if available\n if (moduleCleanup) {\n moduleCleanup();\n }\n\n // Remove namespace globals\n removeNamespaceGlobals(window, namespaceNames);\n\n // Remove style\n const style = document.getElementById(`${mountId}-style`);\n if (style) {\n style.remove();\n }\n\n // Remove container\n container.remove();\n };\n\n return {\n id: mountId,\n widget,\n mode: 'embedded',\n target,\n inputs,\n unmount,\n };\n}\n\n/**\n * Hot reload an embedded widget\n */\nexport async function reloadEmbedded(\n mounted: MountedWidget,\n widget: CompiledWidget,\n image: LoadedImage | null,\n proxy: ServiceProxy,\n): Promise<MountedWidget> {\n // Unmount existing\n mounted.unmount();\n\n // Remount with new widget\n return mountEmbedded(\n widget,\n { target: mounted.target, mode: 'embedded', inputs: mounted.inputs },\n image,\n proxy,\n );\n}\n","/**\n * Iframe mount mode - mounts widgets in sandboxed iframes\n *\n * For untrusted widgets that need isolation.\n */\n\nimport type {\n CompiledWidget,\n LoadedImage,\n MountedWidget,\n MountOptions,\n ServiceProxy,\n} from '../types.js';\nimport { ParentBridge, generateIframeBridgeScript } from './bridge.js';\nimport { generateImportMap } from '../transforms/cdn.js';\n\nlet mountCounter = 0;\n\n// Shared bridge for all iframes\nlet sharedBridge: ParentBridge | null = null;\n\n/**\n * Get or create the shared parent bridge\n */\nfunction getParentBridge(proxy: ServiceProxy): ParentBridge {\n if (!sharedBridge) {\n sharedBridge = new ParentBridge(proxy);\n }\n return sharedBridge;\n}\n\n/**\n * Generate a unique mount ID\n */\nfunction generateMountId(): string {\n return `pw-iframe-${Date.now()}-${++mountCounter}`;\n}\n\n/**\n * Default sandbox attributes for iframes (production)\n *\n * By default, iframes are strictly sandboxed without same-origin access.\n * This is the safest option when widgets load all dependencies from external CDNs.\n */\nconst DEFAULT_SANDBOX = ['allow-scripts'];\n\n/**\n * Development sandbox attributes - includes allow-same-origin\n *\n * allow-same-origin is required when:\n * - Fetching modules from the parent origin (e.g., /_local-packages/ in dev)\n * - Using import maps that reference parent-relative URLs\n * - Accessing the parent's CDN proxy\n *\n * Note: This does NOT allow the iframe to access parent's DOM or cookies,\n * but it does allow same-origin network requests.\n *\n * WARNING: Combining allow-scripts + allow-same-origin allows the iframe to\n * escape its sandbox. Only use in development or when hosting on a separate subdomain.\n */\nexport const DEV_SANDBOX = ['allow-scripts', 'allow-same-origin'];\n\n/**\n * Generate the HTML content for the iframe\n */\nfunction generateIframeContent(\n image: LoadedImage | null,\n inputs: Record<string, unknown>,\n services: string[],\n baseUrl: string,\n): string {\n const bridgeScript = generateIframeBridgeScript(services);\n\n // Generate import map from image dependencies and manifest packages\n const packages = {\n ...(image?.dependencies || {}),\n };\n const importMap = generateImportMap(packages);\n\n // CSS from image\n const css = image?.css || '';\n\n const frameworkConfig = image?.config?.framework || {};\n const preloadUrls = frameworkConfig.preload || [];\n const globals = frameworkConfig.globals || {};\n const globalNames = Object.values(globals);\n const imageModuleUrl = image?.moduleUrl || '';\n\n const mountScript = `\n // Run image setup inside the iframe (styling/runtime)\n const imageModuleUrl = ${JSON.stringify(imageModuleUrl)};\n\n // Preload framework modules declared by the image (if any)\n const preloadUrls = ${JSON.stringify(preloadUrls)};\n const globalNames = ${JSON.stringify(globalNames)};\n for (let i = 0; i < preloadUrls.length; i++) {\n const url = preloadUrls[i];\n const name = globalNames[i];\n if (!url || !name) continue;\n try {\n const mod = await import(/* webpackIgnore: true */ url);\n window[name] = mod;\n } catch (e) {\n console.error('[patchwork-iframe] Failed to preload:', url, e);\n }\n }\n\n const root = document.getElementById('root');\n const inputs = window.__PATCHWORK_INPUTS__ || {};\n\n if (imageModuleUrl && root) {\n try {\n const img = await import(/* webpackIgnore: true */ imageModuleUrl);\n if (typeof img?.setup === 'function') {\n await img.setup(root);\n }\n } catch (e) {\n console.error('[patchwork-iframe] Failed to run image setup:', e);\n }\n }\n\n function pickCreateElement(globals) {\n for (const obj of globals) {\n if (obj && typeof obj.createElement === 'function') return obj.createElement.bind(obj);\n if (obj?.default && typeof obj.default.createElement === 'function') return obj.default.createElement.bind(obj.default);\n }\n return null;\n }\n\n function pickRenderer(globals) {\n for (const obj of globals) {\n if (obj && typeof obj.createRoot === 'function') {\n return {\n kind: 'root',\n createRoot: obj.createRoot.bind(obj),\n };\n }\n if (obj && typeof obj.render === 'function') {\n return {\n kind: 'render',\n render: obj.render.bind(obj),\n };\n }\n if (obj?.default && typeof obj.default.createRoot === 'function') {\n return {\n kind: 'root',\n createRoot: obj.default.createRoot.bind(obj.default),\n };\n }\n if (obj?.default && typeof obj.default.render === 'function') {\n return {\n kind: 'render',\n render: obj.default.render.bind(obj.default),\n };\n }\n }\n return null;\n }\n\n function getGlobalsFromConfig() {\n const names = ${JSON.stringify(globalNames)};\n return names.map((n) => window[n]).filter(Boolean);\n }\n\n async function mountModule(mod) {\n if (!root) throw new Error('No #root element');\n\n if (typeof mod?.mount === 'function') {\n const cleanup = await mod.mount(root, inputs);\n if (typeof cleanup === 'function') window.__PATCHWORK_CLEANUP__ = cleanup;\n return;\n }\n\n if (typeof mod?.render === 'function') {\n const cleanup = await mod.render(root, inputs);\n if (typeof cleanup === 'function') window.__PATCHWORK_CLEANUP__ = cleanup;\n return;\n }\n\n const Component = mod?.default;\n if (typeof Component !== 'function') {\n root.textContent = 'Widget did not export a default component.';\n return;\n }\n\n const globals = getGlobalsFromConfig();\n const createElement = pickCreateElement(globals);\n const renderer = pickRenderer(globals);\n\n if (createElement && renderer?.kind === 'root') {\n const r = renderer.createRoot(root);\n r.render(createElement(Component, inputs));\n if (typeof r.unmount === 'function') window.__PATCHWORK_CLEANUP__ = () => r.unmount();\n return;\n }\n\n if (createElement && renderer?.kind === 'render') {\n renderer.render(createElement(Component, inputs), root);\n return;\n }\n\n const result = Component(inputs);\n if (result instanceof HTMLElement) {\n root.appendChild(result);\n return;\n }\n if (typeof result === 'string') {\n root.innerHTML = result;\n return;\n }\n\n root.textContent = 'No framework renderer available for this widget.';\n }\n\n // Wait for widget code via postMessage (more efficient than inline in srcdoc)\n // We convert relative URLs to absolute so they work inside blob URL context\n window.addEventListener('message', async function handleWidgetCode(event) {\n if (!event.data || event.data.type !== 'widget-code') return;\n window.removeEventListener('message', handleWidgetCode);\n \n const widgetCode = event.data.code;\n const origin = event.data.origin || ''; // Parent sends the origin\n \n // Convert relative URLs (starting with /) to absolute URLs\n // This is necessary because blob: URLs can't resolve relative imports\n // and srcdoc iframes have null origin\n const absoluteCode = widgetCode.replace(\n /from\\\\s*[\"'](\\\\/[^\"']+)[\"']/g,\n (_, path) => 'from \"' + origin + path + '\"'\n ).replace(\n /import\\\\s*[\"'](\\\\/[^\"']+)[\"']/g,\n (_, path) => 'import \"' + origin + path + '\"'\n );\n \n const blob = new Blob([absoluteCode], { type: 'application/javascript' });\n const url = URL.createObjectURL(blob);\n \n try {\n const mod = await import(/* webpackIgnore: true */ url);\n await mountModule(mod);\n window.parent.postMessage({ type: 'widget-mounted' }, '*');\n } catch (e) {\n console.error('[patchwork-iframe] Failed to mount widget:', e);\n window.parent.postMessage({ type: 'widget-error', error: e.message }, '*');\n } finally {\n URL.revokeObjectURL(url);\n }\n });\n\n // Signal ready to receive widget code\n window.parent.postMessage({ type: 'widget-ready' }, '*');\n\n // Set up ResizeObserver to report body size changes to parent\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n window.parent.postMessage({ \n type: 'widget-resize', \n width: Math.ceil(width), \n height: Math.ceil(height) \n }, '*');\n }\n });\n resizeObserver.observe(document.body);\n `;\n\n return `<!DOCTYPE html>\n<html>\n<head>\n <base href=\"${baseUrl}\">\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <style>\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body { font-family: system-ui, -apple-system, sans-serif; }\n ${css}\n </style>\n <script type=\"importmap\">\n ${JSON.stringify({ imports: importMap }, null, 2)}\n </script>\n</head>\n<body>\n <div id=\"root\"></div>\n\n <!-- Service Bridge -->\n <script>\n ${bridgeScript}\n </script>\n\n <!-- Widget Inputs -->\n <script>\n window.__PATCHWORK_INPUTS__ = ${JSON.stringify(inputs)};\n </script>\n\n <script type=\"module\">\n ${mountScript}\n </script>\n</body>\n</html>`;\n}\n\n/**\n * Mount a widget in iframe mode (sandboxed)\n */\nexport async function mountIframe(\n widget: CompiledWidget,\n options: MountOptions,\n image: LoadedImage | null,\n proxy: ServiceProxy,\n): Promise<MountedWidget> {\n const { target, sandbox = DEFAULT_SANDBOX, inputs = {} } = options;\n const mountId = generateMountId();\n\n // Create iframe\n const iframe = document.createElement('iframe');\n iframe.id = mountId;\n iframe.className = 'patchwork-widget patchwork-iframe';\n iframe.style.cssText = 'width: 100%; border: none; overflow: hidden;';\n iframe.sandbox.add(...sandbox);\n\n // Register with bridge before loading content\n const bridge = getParentBridge(proxy);\n bridge.registerIframe(iframe);\n\n // Generate and set iframe content (without widget code)\n // Use window.location.origin as base URL so relative paths like /_local-packages/ resolve correctly\n const services = widget.manifest.services || [];\n const baseUrl = typeof window !== 'undefined' ? window.location.origin : '';\n const content = generateIframeContent(image, inputs, services, baseUrl);\n iframe.srcdoc = content;\n\n // Append to target\n target.appendChild(iframe);\n\n // Handle resize messages from iframe\n const handleResize = (event: MessageEvent) => {\n if (event.source !== iframe.contentWindow) return;\n if (event.data?.type === 'widget-resize') {\n const { height } = event.data;\n if (typeof height === 'number' && height > 0) {\n iframe.style.height = `${height}px`;\n }\n }\n };\n window.addEventListener('message', handleResize);\n\n // Wait for iframe to signal ready, then send widget code\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error('Iframe mount timeout'));\n }, 30000);\n\n const handleMessage = (event: MessageEvent) => {\n if (event.source !== iframe.contentWindow) return;\n\n if (event.data?.type === 'widget-ready') {\n // Send widget code and origin for URL rewriting\n iframe.contentWindow?.postMessage(\n { type: 'widget-code', code: widget.code, origin: baseUrl },\n '*',\n );\n } else if (event.data?.type === 'widget-mounted') {\n cleanup();\n resolve();\n } else if (event.data?.type === 'widget-error') {\n cleanup();\n reject(new Error(event.data.error || 'Widget mount failed'));\n }\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n window.removeEventListener('message', handleMessage);\n };\n\n window.addEventListener('message', handleMessage);\n });\n\n // Create unmount function\n const unmount = () => {\n window.removeEventListener('message', handleResize);\n bridge.unregisterIframe(iframe);\n iframe.remove();\n };\n\n return {\n id: mountId,\n widget,\n mode: 'iframe',\n target,\n iframe,\n inputs,\n sandbox,\n unmount,\n };\n}\n\n/**\n * Hot reload an iframe widget\n */\nexport async function reloadIframe(\n mounted: MountedWidget,\n widget: CompiledWidget,\n image: LoadedImage | null,\n proxy: ServiceProxy,\n): Promise<MountedWidget> {\n // Unmount existing\n mounted.unmount();\n\n // Remount with new widget\n return mountIframe(\n widget,\n {\n target: mounted.target,\n mode: 'iframe',\n sandbox: mounted.sandbox,\n inputs: mounted.inputs,\n },\n image,\n proxy,\n );\n}\n\n/**\n * Dispose the shared bridge (call on app shutdown)\n */\nexport function disposeIframeBridge(): void {\n if (sharedBridge) {\n sharedBridge.dispose();\n sharedBridge = null;\n }\n}\n","import type { DirEntry, FileStats } from \"./types.js\";\n\nexport function createFileStats(\n size: number,\n mtime: Date,\n isDir = false,\n): FileStats {\n return {\n size,\n mtime,\n isFile: () => !isDir,\n isDirectory: () => isDir,\n };\n}\n\nexport function createDirEntry(name: string, isDir: boolean): DirEntry {\n return {\n name,\n isFile: () => !isDir,\n isDirectory: () => isDir,\n };\n}\n\nexport function normalizePath(path: string): string {\n return path.replace(/\\/+/g, \"/\").replace(/^\\/|\\/$/g, \"\");\n}\n\nexport function dirname(path: string): string {\n const normalized = normalizePath(path);\n const lastSlash = normalized.lastIndexOf(\"/\");\n return lastSlash === -1 ? \"\" : normalized.slice(0, lastSlash);\n}\n\nexport function basename(path: string): string {\n const normalized = normalizePath(path);\n const lastSlash = normalized.lastIndexOf(\"/\");\n return lastSlash === -1 ? normalized : normalized.slice(lastSlash + 1);\n}\n\nexport function join(...parts: string[]): string {\n return normalizePath(parts.filter(Boolean).join(\"/\"));\n}\n","import type {\n DirEntry,\n FileStats,\n FSProvider,\n WatchCallback,\n} from \"../core/types.js\";\nimport {\n basename,\n createDirEntry,\n createFileStats,\n dirname,\n normalizePath,\n} from \"../core/utils.js\";\n\ninterface FileEntry {\n content: string;\n mtime: Date;\n}\n\n/**\n * In-memory FSProvider implementation.\n * Useful for tests and ephemeral file systems.\n */\nexport class MemoryBackend implements FSProvider {\n private files = new Map<string, FileEntry>();\n private dirs = new Set<string>([\"\"]);\n private watchers = new Map<string, Set<WatchCallback>>();\n\n async readFile(path: string): Promise<string> {\n const entry = this.files.get(normalizePath(path));\n if (!entry) throw new Error(`ENOENT: ${path}`);\n return entry.content;\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n const normalized = normalizePath(path);\n const dir = dirname(normalized);\n if (dir && !this.dirs.has(dir)) {\n throw new Error(`ENOENT: ${dir}`);\n }\n const isNew = !this.files.has(normalized);\n this.files.set(normalized, { content, mtime: new Date() });\n this.emit(isNew ? \"create\" : \"update\", normalized);\n }\n\n async unlink(path: string): Promise<void> {\n const normalized = normalizePath(path);\n if (!this.files.delete(normalized)) {\n throw new Error(`ENOENT: ${path}`);\n }\n this.emit(\"delete\", normalized);\n }\n\n async stat(path: string): Promise<FileStats> {\n const normalized = normalizePath(path);\n const entry = this.files.get(normalized);\n if (entry) {\n return createFileStats(entry.content.length, entry.mtime, false);\n }\n if (this.dirs.has(normalized)) {\n return createFileStats(0, new Date(), true);\n }\n throw new Error(`ENOENT: ${path}`);\n }\n\n async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n const normalized = normalizePath(path);\n if (this.dirs.has(normalized)) return;\n\n const parent = dirname(normalized);\n if (parent && !this.dirs.has(parent)) {\n if (options?.recursive) {\n await this.mkdir(parent, options);\n } else {\n throw new Error(`ENOENT: ${parent}`);\n }\n }\n this.dirs.add(normalized);\n }\n\n async readdir(path: string): Promise<DirEntry[]> {\n const normalized = normalizePath(path);\n if (!this.dirs.has(normalized)) {\n throw new Error(`ENOENT: ${path}`);\n }\n\n const prefix = normalized ? `${normalized}/` : \"\";\n const entries = new Map<string, boolean>();\n\n for (const filePath of this.files.keys()) {\n if (filePath.startsWith(prefix)) {\n const rest = filePath.slice(prefix.length);\n const name = rest.split(\"/\")[0];\n if (name) entries.set(name, false);\n }\n }\n\n for (const dirPath of this.dirs) {\n if (dirPath.startsWith(prefix) && dirPath !== normalized) {\n const rest = dirPath.slice(prefix.length);\n const name = rest.split(\"/\")[0];\n if (name) entries.set(name, true);\n }\n }\n\n return Array.from(entries).map(([name, isDir]) =>\n createDirEntry(name, isDir),\n );\n }\n\n async rmdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n const normalized = normalizePath(path);\n if (!this.dirs.has(normalized)) {\n throw new Error(`ENOENT: ${path}`);\n }\n\n const prefix = `${normalized}/`;\n const hasChildren =\n [...this.files.keys()].some((p) => p.startsWith(prefix)) ||\n [...this.dirs].some((d) => d.startsWith(prefix));\n\n if (hasChildren && !options?.recursive) {\n throw new Error(`ENOTEMPTY: ${path}`);\n }\n\n if (options?.recursive) {\n for (const filePath of this.files.keys()) {\n if (filePath.startsWith(prefix)) {\n this.files.delete(filePath);\n this.emit(\"delete\", filePath);\n }\n }\n for (const dirPath of this.dirs) {\n if (dirPath.startsWith(prefix)) {\n this.dirs.delete(dirPath);\n }\n }\n }\n\n this.dirs.delete(normalized);\n }\n\n async exists(path: string): Promise<boolean> {\n const normalized = normalizePath(path);\n return this.files.has(normalized) || this.dirs.has(normalized);\n }\n\n watch(path: string, callback: WatchCallback): () => void {\n const normalized = normalizePath(path);\n let callbacks = this.watchers.get(normalized);\n if (!callbacks) {\n callbacks = new Set();\n this.watchers.set(normalized, callbacks);\n }\n callbacks.add(callback);\n return () => callbacks!.delete(callback);\n }\n\n private emit(event: \"create\" | \"update\" | \"delete\", path: string): void {\n // Notify watchers for this path and all parent paths\n let current = path;\n while (true) {\n const callbacks = this.watchers.get(current);\n if (callbacks) {\n for (const cb of callbacks) cb(event, path);\n }\n if (!current) break;\n current = dirname(current);\n }\n }\n}\n","import type {\n ChangeRecord,\n DirEntry,\n FileStats,\n FSProvider,\n WatchCallback,\n WatchEventType,\n} from \"./types.js\";\nimport { MemoryBackend } from \"../backends/memory.js\";\nimport { dirname } from \"./utils.js\";\n\ntype ChangeListener = (record: ChangeRecord) => void;\n\n/**\n * VirtualFS wraps an FSProvider with change tracking.\n * Tracks all local modifications for sync operations.\n */\nexport class VirtualFS implements FSProvider {\n private changes = new Map<string, ChangeRecord>();\n private listeners = new Set<ChangeListener>();\n private backend: FSProvider;\n\n constructor(backend?: FSProvider) {\n this.backend = backend ?? new MemoryBackend();\n }\n\n async readFile(path: string, encoding?: \"utf8\" | \"base64\"): Promise<string> {\n return this.backend.readFile(path, encoding);\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n await this.ensureParentDir(path);\n const existed = await this.backend.exists(path);\n await this.backend.writeFile(path, content);\n this.recordChange(path, existed ? \"update\" : \"create\");\n }\n\n async applyRemoteFile(path: string, content: string): Promise<void> {\n await this.ensureParentDir(path);\n await this.backend.writeFile(path, content);\n }\n\n async applyRemoteDelete(path: string): Promise<void> {\n try {\n if (await this.backend.exists(path)) {\n await this.backend.unlink(path);\n }\n } catch {\n return;\n }\n }\n\n async unlink(path: string): Promise<void> {\n await this.backend.unlink(path);\n this.recordChange(path, \"delete\");\n }\n\n async stat(path: string): Promise<FileStats> {\n return this.backend.stat(path);\n }\n\n async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n return this.backend.mkdir(path, options);\n }\n\n async readdir(path: string): Promise<DirEntry[]> {\n return this.backend.readdir(path);\n }\n\n async rmdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n return this.backend.rmdir(path, options);\n }\n\n async exists(path: string): Promise<boolean> {\n return this.backend.exists(path);\n }\n\n watch(path: string, callback: WatchCallback): () => void {\n if (this.backend.watch) {\n return this.backend.watch(path, callback);\n }\n return () => {};\n }\n\n /**\n * Get all pending changes since last sync\n */\n getChanges(): ChangeRecord[] {\n return Array.from(this.changes.values());\n }\n\n /**\n * Clear change tracking (after successful sync)\n */\n clearChanges(): void {\n this.changes.clear();\n }\n\n /**\n * Mark specific paths as synced\n */\n markSynced(paths: string[]): void {\n for (const path of paths) {\n this.changes.delete(path);\n }\n }\n\n /**\n * Subscribe to change events\n */\n onChange(listener: ChangeListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private recordChange(path: string, type: WatchEventType): void {\n const record: ChangeRecord = { path, type, mtime: new Date() };\n this.changes.set(path, record);\n for (const listener of this.listeners) {\n listener(record);\n }\n }\n\n private async ensureParentDir(path: string): Promise<void> {\n const dir = dirname(path);\n if (!dir) return;\n await this.backend.mkdir(dir, { recursive: true });\n }\n}\n","import type { FSProvider } from \"../core/types.js\";\n\nexport interface ContentChecksums {\n local?: string;\n remote?: string;\n}\n\nexport function hashContent(content: string): string {\n let hash = 0x811c9dc5;\n for (let i = 0; i < content.length; i += 1) {\n hash ^= content.charCodeAt(i);\n hash =\n (hash +\n (hash << 1) +\n (hash << 4) +\n (hash << 7) +\n (hash << 8) +\n (hash << 24)) >>>\n 0;\n }\n return hash.toString(16).padStart(8, \"0\");\n}\n\nexport async function readChecksum(\n provider: FSProvider,\n path: string,\n): Promise<string | undefined> {\n try {\n const content = await provider.readFile(path);\n return hashContent(content);\n } catch {\n return undefined;\n }\n}\n\nexport async function readChecksums(\n local: FSProvider,\n localPath: string,\n remote: FSProvider,\n remotePath: string,\n): Promise<ContentChecksums> {\n const [localChecksum, remoteChecksum] = await Promise.all([\n readChecksum(local, localPath),\n readChecksum(remote, remotePath),\n ]);\n return { local: localChecksum, remote: remoteChecksum };\n}\n","import type { ConflictRecord, ConflictStrategy } from \"../core/types.js\";\n\nexport interface ConflictResolutionInput {\n path: string;\n changeMtime: Date;\n remoteMtime: Date;\n localChecksum?: string;\n remoteChecksum?: string;\n strategy: ConflictStrategy;\n}\n\nexport function resolveConflict(\n input: ConflictResolutionInput,\n): ConflictRecord | null {\n if (input.remoteMtime <= input.changeMtime) return null;\n if (\n input.localChecksum &&\n input.remoteChecksum &&\n input.localChecksum === input.remoteChecksum\n ) {\n return null;\n }\n\n const conflict: ConflictRecord = {\n path: input.path,\n localMtime: input.changeMtime,\n remoteMtime: input.remoteMtime,\n };\n\n switch (input.strategy) {\n case \"local-wins\":\n conflict.resolved = \"local\";\n break;\n case \"remote-wins\":\n conflict.resolved = \"remote\";\n break;\n case \"newest-wins\":\n conflict.resolved =\n input.remoteMtime > input.changeMtime ? \"remote\" : \"local\";\n break;\n case \"manual\":\n break;\n }\n\n return conflict;\n}\n","import type {\n ChangeRecord,\n ConflictRecord,\n ConflictStrategy,\n DirEntry,\n FSProvider,\n SyncEventCallback,\n SyncEventType,\n SyncResult,\n SyncStatus,\n WatchEventType,\n} from \"../core/types.js\";\nimport type { VirtualFS } from \"../core/virtual-fs.js\";\nimport { join, normalizePath } from \"../core/utils.js\";\nimport { readChecksums } from \"./differ.js\";\nimport { resolveConflict } from \"./resolver.js\";\n\nexport interface SyncEngineConfig {\n conflictStrategy?: ConflictStrategy;\n basePath?: string;\n}\n\ntype EventMap = {\n change: ChangeRecord;\n conflict: ConflictRecord;\n error: Error;\n status: SyncStatus;\n};\n\n/**\n * Bidirectional sync engine between local VirtualFS and remote FSProvider\n */\nexport class SyncEngineImpl {\n status: SyncStatus = \"idle\";\n private intervalId?: ReturnType<typeof setInterval>;\n private listeners = new Map<SyncEventType, Set<SyncEventCallback<unknown>>>();\n private conflictStrategy: ConflictStrategy;\n private basePath: string;\n\n constructor(\n private local: VirtualFS,\n private remote: FSProvider,\n config: SyncEngineConfig = {},\n ) {\n this.conflictStrategy = config.conflictStrategy ?? \"local-wins\";\n this.basePath = config.basePath ?? \"\";\n this.startRemoteWatch();\n }\n\n async sync(): Promise<SyncResult> {\n if (this.status === \"syncing\") {\n return { pushed: 0, pulled: 0, conflicts: [] };\n }\n\n this.setStatus(\"syncing\");\n const result: SyncResult = { pushed: 0, pulled: 0, conflicts: [] };\n\n try {\n const localChanges = this.local.getChanges();\n const localChangeMap = new Map(\n localChanges.map((change) => [change.path, change]),\n );\n const syncedPaths: string[] = [];\n\n const remoteFiles = await this.listFiles(this.remote, this.basePath);\n const localFiles = await this.listFiles(this.local, \"\");\n const remoteLocalPaths = new Set(\n remoteFiles.map((path) => this.localPath(path)),\n );\n\n for (const remotePath of remoteFiles) {\n const localPath = this.localPath(remotePath);\n const localChange = localChangeMap.get(localPath);\n\n if (localChange) {\n const conflict = await this.checkConflict(localChange, remotePath);\n if (conflict) {\n result.conflicts.push(conflict);\n this.emit(\"conflict\", conflict);\n if (conflict.resolved === \"remote\") {\n if (await this.pullRemoteFile(localPath, remotePath)) {\n result.pulled++;\n this.emit(\"change\", {\n path: localPath,\n type: \"update\",\n mtime: new Date(),\n });\n }\n syncedPaths.push(localPath);\n }\n }\n continue;\n }\n\n if (await this.pullRemoteFile(localPath, remotePath)) {\n result.pulled++;\n this.emit(\"change\", {\n path: localPath,\n type: \"update\",\n mtime: new Date(),\n });\n }\n }\n\n for (const localPath of localFiles) {\n if (remoteLocalPaths.has(localPath)) continue;\n if (localChangeMap.has(localPath)) continue;\n await this.local.applyRemoteDelete(localPath);\n result.pulled++;\n this.emit(\"change\", {\n path: localPath,\n type: \"delete\",\n mtime: new Date(),\n });\n }\n\n for (const change of localChanges) {\n if (syncedPaths.includes(change.path)) continue;\n const remotePath = this.remotePath(change.path);\n\n try {\n const conflict = await this.checkConflict(change, remotePath);\n if (conflict) {\n result.conflicts.push(conflict);\n this.emit(\"conflict\", conflict);\n if (conflict.resolved === \"remote\") {\n if (await this.pullRemoteFile(change.path, remotePath)) {\n result.pulled++;\n this.emit(\"change\", {\n path: change.path,\n type: \"update\",\n mtime: new Date(),\n });\n }\n syncedPaths.push(change.path);\n }\n if (conflict.resolved !== \"local\") continue;\n }\n\n if (change.type === \"delete\") {\n if (await this.remote.exists(remotePath)) {\n await this.remote.unlink(remotePath);\n }\n result.pushed++;\n syncedPaths.push(change.path);\n this.emit(\"change\", change);\n continue;\n }\n\n const content = await this.local.readFile(change.path);\n await this.remote.writeFile(remotePath, content);\n result.pushed++;\n syncedPaths.push(change.path);\n this.emit(\"change\", change);\n } catch (err) {\n this.emit(\n \"error\",\n err instanceof Error ? err : new Error(String(err)),\n );\n }\n }\n\n if (syncedPaths.length > 0) {\n this.local.markSynced(syncedPaths);\n }\n this.setStatus(\"idle\");\n } catch (err) {\n this.setStatus(\"error\");\n this.emit(\"error\", err instanceof Error ? err : new Error(String(err)));\n }\n\n return result;\n }\n\n startAutoSync(intervalMs: number): void {\n this.stopAutoSync();\n this.intervalId = setInterval(() => this.sync(), intervalMs);\n }\n\n stopAutoSync(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = undefined;\n }\n }\n\n on<T extends SyncEventType>(\n event: T,\n callback: SyncEventCallback<EventMap[T]>,\n ): () => void {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(callback as SyncEventCallback<unknown>);\n return () => set!.delete(callback as SyncEventCallback<unknown>);\n }\n\n private emit<T extends SyncEventType>(event: T, data: EventMap[T]): void {\n const set = this.listeners.get(event);\n if (set) {\n for (const cb of set) cb(data);\n }\n }\n\n private setStatus(status: SyncStatus): void {\n this.status = status;\n this.emit(\"status\", status);\n }\n\n private remotePath(localPath: string): string {\n return this.basePath ? join(this.basePath, localPath) : localPath;\n }\n\n private localPath(remotePath: string): string {\n if (!this.basePath) return normalizePath(remotePath);\n const normalized = normalizePath(remotePath);\n const base = normalizePath(this.basePath);\n if (normalized === base) return \"\";\n if (normalized.startsWith(`${base}/`)) {\n return normalized.slice(base.length + 1);\n }\n return normalized;\n }\n\n private async listFiles(\n provider: FSProvider,\n basePath: string,\n ): Promise<string[]> {\n const normalized = normalizePath(basePath);\n let entries: DirEntry[] = [];\n try {\n entries = await provider.readdir(normalized);\n } catch {\n return [];\n }\n\n const results: string[] = [];\n for (const entry of entries) {\n const entryPath = normalized ? `${normalized}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n results.push(...(await this.listFiles(provider, entryPath)));\n } else {\n results.push(entryPath);\n }\n }\n\n return results;\n }\n\n private async pullRemoteFile(\n localPath: string,\n remotePath: string,\n ): Promise<boolean> {\n let localContent: string | null = null;\n try {\n if (await this.local.exists(localPath)) {\n localContent = await this.local.readFile(localPath);\n }\n } catch {\n localContent = null;\n }\n\n const remoteContent = await this.remote.readFile(remotePath);\n if (localContent === remoteContent) return false;\n await this.local.applyRemoteFile(localPath, remoteContent);\n return true;\n }\n\n private startRemoteWatch(): void {\n if (!this.remote.watch) return;\n this.remote.watch(this.basePath, (event, path) => {\n void this.handleRemoteEvent(event, path);\n });\n }\n\n private async handleRemoteEvent(\n event: WatchEventType,\n remotePath: string,\n ): Promise<void> {\n const localPath = this.localPath(remotePath);\n const localChange = this.local\n .getChanges()\n .find((change) => change.path === localPath);\n\n if (localChange) {\n const conflict = await this.checkRemoteEventConflict(\n localChange,\n remotePath,\n event,\n );\n if (conflict) {\n this.emit(\"conflict\", conflict);\n if (conflict.resolved === \"remote\") {\n await this.applyRemoteEvent(event, localPath, remotePath);\n this.local.markSynced([localPath]);\n this.emit(\"change\", {\n path: localPath,\n type: event,\n mtime: new Date(),\n });\n }\n return;\n }\n\n return;\n }\n\n try {\n await this.applyRemoteEvent(event, localPath, remotePath);\n this.emit(\"change\", {\n path: localPath,\n type: event,\n mtime: new Date(),\n });\n } catch (err) {\n this.emit(\"error\", err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n private async checkConflict(\n change: ChangeRecord,\n remotePath: string,\n ): Promise<ConflictRecord | null> {\n try {\n const remoteStat = await this.remote.stat(remotePath);\n if (remoteStat.mtime <= change.mtime) return null;\n const checksums = await readChecksums(\n this.local,\n change.path,\n this.remote,\n remotePath,\n );\n return resolveConflict({\n path: change.path,\n changeMtime: change.mtime,\n remoteMtime: remoteStat.mtime,\n localChecksum: checksums.local,\n remoteChecksum: checksums.remote,\n strategy: this.conflictStrategy,\n });\n } catch {\n return null;\n }\n }\n\n private async checkRemoteEventConflict(\n change: ChangeRecord,\n remotePath: string,\n event: WatchEventType,\n ): Promise<ConflictRecord | null> {\n if (event === \"delete\") {\n if (change.type === \"delete\") return null;\n return resolveConflict({\n path: change.path,\n changeMtime: change.mtime,\n remoteMtime: new Date(),\n strategy: this.conflictStrategy,\n });\n }\n\n try {\n const remoteStat = await this.remote.stat(remotePath);\n if (remoteStat.mtime <= change.mtime) return null;\n const checksums = await readChecksums(\n this.local,\n change.path,\n this.remote,\n remotePath,\n );\n return resolveConflict({\n path: change.path,\n changeMtime: change.mtime,\n remoteMtime: remoteStat.mtime,\n localChecksum: checksums.local,\n remoteChecksum: checksums.remote,\n strategy: this.conflictStrategy,\n });\n } catch {\n return null;\n }\n }\n\n private async applyRemoteEvent(\n event: WatchEventType,\n localPath: string,\n remotePath: string,\n ): Promise<void> {\n if (event === \"delete\") {\n await this.local.applyRemoteDelete(localPath);\n return;\n }\n\n const content = await this.remote.readFile(remotePath);\n await this.local.applyRemoteFile(localPath, content);\n }\n}\n","import type { DirEntry, FileStats, FSProvider } from \"../core/types.js\";\nimport {\n basename,\n createDirEntry,\n createFileStats,\n dirname,\n normalizePath,\n} from \"../core/utils.js\";\n\nconst DB_NAME = \"patchwork-vfs\";\nconst DB_VERSION = 2;\nconst FILES_STORE = \"files\";\nconst DIRS_STORE = \"dirs\";\n\ninterface FileRecord {\n content: string;\n mtime: number;\n}\n\nfunction openDB(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve(request.result);\n request.onupgradeneeded = (event) => {\n const db = request.result;\n if (!db.objectStoreNames.contains(FILES_STORE)) {\n db.createObjectStore(FILES_STORE);\n }\n if (!db.objectStoreNames.contains(DIRS_STORE)) {\n db.createObjectStore(DIRS_STORE);\n }\n };\n });\n}\n\nfunction withStore<T>(\n storeName: string,\n mode: IDBTransactionMode,\n fn: (store: IDBObjectStore) => IDBRequest<T>,\n): Promise<T> {\n return openDB().then(\n (db) =>\n new Promise((resolve, reject) => {\n const tx = db.transaction(storeName, mode);\n const store = tx.objectStore(storeName);\n const request = fn(store);\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve(request.result);\n }),\n );\n}\n\nexport class IndexedDBBackend implements FSProvider {\n constructor(private prefix = \"vfs\") {}\n\n private key(path: string): string {\n return `${this.prefix}:${normalizePath(path)}`;\n }\n\n async readFile(path: string): Promise<string> {\n const record = await withStore<FileRecord | undefined>(\n FILES_STORE,\n \"readonly\",\n (store) => store.get(this.key(path)),\n );\n if (!record) throw new Error(`ENOENT: ${path}`);\n return record.content;\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n const dir = dirname(normalizePath(path));\n if (dir && !(await this.dirExists(dir))) {\n throw new Error(`ENOENT: ${dir}`);\n }\n const record: FileRecord = { content, mtime: Date.now() };\n await withStore(FILES_STORE, \"readwrite\", (store) =>\n store.put(record, this.key(path)),\n );\n }\n\n async unlink(path: string): Promise<void> {\n await withStore(FILES_STORE, \"readwrite\", (store) =>\n store.delete(this.key(path)),\n );\n }\n\n async stat(path: string): Promise<FileStats> {\n const normalized = normalizePath(path);\n const record = await withStore<FileRecord | undefined>(\n FILES_STORE,\n \"readonly\",\n (store) => store.get(this.key(normalized)),\n );\n if (record) {\n return createFileStats(\n record.content.length,\n new Date(record.mtime),\n false,\n );\n }\n if (await this.dirExists(normalized)) {\n return createFileStats(0, new Date(), true);\n }\n throw new Error(`ENOENT: ${path}`);\n }\n\n async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n const normalized = normalizePath(path);\n if (await this.dirExists(normalized)) return;\n\n const parent = dirname(normalized);\n if (parent && !(await this.dirExists(parent))) {\n if (options?.recursive) {\n await this.mkdir(parent, options);\n } else {\n throw new Error(`ENOENT: ${parent}`);\n }\n }\n\n await withStore(DIRS_STORE, \"readwrite\", (store) =>\n store.put(Date.now(), this.key(normalized)),\n );\n }\n\n async readdir(path: string): Promise<DirEntry[]> {\n const normalized = normalizePath(path);\n if (normalized && !(await this.dirExists(normalized))) {\n throw new Error(`ENOENT: ${path}`);\n }\n\n const prefix = normalized ? `${this.key(normalized)}/` : `${this.prefix}:`;\n const entries = new Map<string, boolean>();\n\n const fileKeys = await withStore<IDBValidKey[]>(\n FILES_STORE,\n \"readonly\",\n (store) => store.getAllKeys(),\n );\n for (const key of fileKeys as string[]) {\n if (key.startsWith(prefix)) {\n const rest = key.slice(prefix.length);\n const name = rest.split(\"/\")[0];\n if (name && !rest.includes(\"/\")) entries.set(name, false);\n }\n }\n\n const dirKeys = await withStore<IDBValidKey[]>(\n DIRS_STORE,\n \"readonly\",\n (store) => store.getAllKeys(),\n );\n for (const key of dirKeys as string[]) {\n if (key.startsWith(prefix)) {\n const rest = key.slice(prefix.length);\n const name = rest.split(\"/\")[0];\n if (name && !rest.includes(\"/\")) entries.set(name, true);\n }\n }\n\n return Array.from(entries).map(([name, isDir]) =>\n createDirEntry(name, isDir),\n );\n }\n\n async rmdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n const normalized = normalizePath(path);\n if (!(await this.dirExists(normalized))) {\n throw new Error(`ENOENT: ${path}`);\n }\n\n const prefix = `${this.key(normalized)}/`;\n\n if (options?.recursive) {\n const fileKeys = await withStore<IDBValidKey[]>(\n FILES_STORE,\n \"readonly\",\n (store) => store.getAllKeys(),\n );\n for (const key of fileKeys as string[]) {\n if (key.startsWith(prefix)) {\n await withStore(FILES_STORE, \"readwrite\", (store) =>\n store.delete(key),\n );\n }\n }\n\n const dirKeys = await withStore<IDBValidKey[]>(\n DIRS_STORE,\n \"readonly\",\n (store) => store.getAllKeys(),\n );\n for (const key of dirKeys as string[]) {\n if (key.startsWith(prefix)) {\n await withStore(DIRS_STORE, \"readwrite\", (store) =>\n store.delete(key),\n );\n }\n }\n }\n\n await withStore(DIRS_STORE, \"readwrite\", (store) =>\n store.delete(this.key(normalized)),\n );\n }\n\n async exists(path: string): Promise<boolean> {\n const normalized = normalizePath(path);\n const record = await withStore<FileRecord | undefined>(\n FILES_STORE,\n \"readonly\",\n (store) => store.get(this.key(normalized)),\n );\n if (record) return true;\n return this.dirExists(normalized);\n }\n\n private async dirExists(path: string): Promise<boolean> {\n if (!path) return true; // Root always exists\n const result = await withStore<number | undefined>(\n DIRS_STORE,\n \"readonly\",\n (store) => store.get(this.key(path)),\n );\n return result !== undefined;\n }\n}\n","import type {\n DirEntry,\n FileStats,\n FSProvider,\n WatchCallback,\n WatchEventType,\n} from \"../core/types.js\";\nimport { createDirEntry, createFileStats } from \"../core/utils.js\";\n\nexport interface HttpBackendConfig {\n baseUrl: string;\n}\n\ninterface StatResponse {\n size: number;\n mtime: string;\n isFile: boolean;\n isDirectory: boolean;\n}\n\ninterface WatchEvent {\n type: WatchEventType;\n path: string;\n mtime: string;\n}\n\n/**\n * HTTP-based FSProvider for connecting to remote servers (e.g., stitchery)\n */\nexport class HttpBackend implements FSProvider {\n constructor(private config: HttpBackendConfig) {}\n\n async readFile(path: string): Promise<string> {\n const res = await fetch(this.url(path));\n if (!res.ok) throw new Error(`ENOENT: ${path}`);\n return res.text();\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n const res = await fetch(this.url(path), {\n method: \"PUT\",\n body: content,\n headers: { \"Content-Type\": \"text/plain\" },\n });\n if (!res.ok) throw new Error(`Failed to write: ${path}`);\n }\n\n async unlink(path: string): Promise<void> {\n const res = await fetch(this.url(path), { method: \"DELETE\" });\n if (!res.ok) throw new Error(`Failed to delete: ${path}`);\n }\n\n async stat(path: string): Promise<FileStats> {\n const res = await fetch(this.url(path, { stat: \"true\" }));\n if (!res.ok) throw new Error(`ENOENT: ${path}`);\n const data: StatResponse = await res.json();\n return createFileStats(data.size, new Date(data.mtime), data.isDirectory);\n }\n\n async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n const params: Record<string, string> = { mkdir: \"true\" };\n if (options?.recursive) params.recursive = \"true\";\n const res = await fetch(this.url(path, params), { method: \"POST\" });\n if (!res.ok) throw new Error(`Failed to mkdir: ${path}`);\n }\n\n async readdir(path: string): Promise<DirEntry[]> {\n const res = await fetch(this.url(path, { readdir: \"true\" }));\n if (!res.ok) throw new Error(`ENOENT: ${path}`);\n const entries: Array<{ name: string; isDirectory: boolean }> =\n await res.json();\n return entries.map((e) => createDirEntry(e.name, e.isDirectory));\n }\n\n async rmdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n const params: Record<string, string> = {};\n if (options?.recursive) params.recursive = \"true\";\n const res = await fetch(this.url(path, params), { method: \"DELETE\" });\n if (!res.ok) throw new Error(`Failed to rmdir: ${path}`);\n }\n\n async exists(path: string): Promise<boolean> {\n const res = await fetch(this.url(path), { method: \"HEAD\" });\n return res.ok;\n }\n\n watch(path: string, callback: WatchCallback): () => void {\n const controller = new AbortController();\n this.startWatch(path, callback, controller.signal);\n return () => controller.abort();\n }\n\n private async startWatch(\n path: string,\n callback: WatchCallback,\n signal: AbortSignal,\n ): Promise<void> {\n try {\n const res = await fetch(this.url(\"\", { watch: path }), { signal });\n if (!res.ok) return;\n const reader = res.body?.getReader();\n if (!reader) return;\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (!signal.aborted) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n try {\n const event: WatchEvent = JSON.parse(line.slice(6));\n callback(event.type, event.path);\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n } catch {\n // Connection closed or aborted\n }\n }\n\n private url(path: string, params?: Record<string, string>): string {\n const baseUrl = this.config.baseUrl.replace(/\\/+$/, \"\");\n const cleanPath = path.replace(/^\\/+/, \"\");\n const base = cleanPath ? `${baseUrl}/${cleanPath}` : baseUrl;\n if (!params) return base;\n const query = new URLSearchParams(params).toString();\n return `${base}?${query}`;\n }\n}\n","import type {\n ChangeRecord,\n ConflictRecord,\n ConflictStrategy,\n DirEntry,\n FileStats,\n FSProvider,\n SyncEventCallback,\n SyncEventType,\n SyncResult,\n SyncStatus,\n WatchCallback,\n} from \"./core/types.js\";\nimport { join } from \"./core/utils.js\";\nimport { VirtualFS } from \"./core/virtual-fs.js\";\nimport { SyncEngineImpl } from \"./sync/index.js\";\nimport type { VirtualFile, VirtualProject } from \"./types.js\";\nimport { resolveEntry } from \"./project.js\";\n\nexport interface VFSStoreOptions {\n root?: string;\n sync?: boolean;\n conflictStrategy?: ConflictStrategy;\n autoSyncIntervalMs?: number;\n}\n\nexport class VFSStore {\n private local?: VirtualFS;\n private syncEngine?: SyncEngineImpl;\n private root: string;\n\n constructor(private provider: FSProvider, options: VFSStoreOptions = {}) {\n this.root = options.root ?? \"\";\n\n if (options.sync) {\n this.local = new VirtualFS();\n this.syncEngine = new SyncEngineImpl(this.local, this.provider, {\n conflictStrategy: options.conflictStrategy,\n basePath: this.root,\n });\n if (options.autoSyncIntervalMs) {\n this.syncEngine.startAutoSync(options.autoSyncIntervalMs);\n }\n }\n }\n\n async readFile(path: string, encoding?: \"utf8\" | \"base64\"): Promise<string> {\n if (this.local) {\n try {\n return await this.local.readFile(path, encoding);\n } catch {\n const content = await this.provider.readFile(\n this.remotePath(path),\n encoding,\n );\n await this.local.applyRemoteFile(path, content);\n return content;\n }\n }\n return this.provider.readFile(this.remotePath(path), encoding);\n }\n\n async writeFile(path: string, content: string): Promise<void> {\n if (this.local) {\n await this.local.writeFile(path, content);\n return;\n }\n await this.provider.writeFile(this.remotePath(path), content);\n }\n\n async unlink(path: string): Promise<void> {\n if (this.local) {\n await this.local.unlink(path);\n return;\n }\n await this.provider.unlink(this.remotePath(path));\n }\n\n async stat(path: string): Promise<FileStats> {\n if (this.local) {\n try {\n return await this.local.stat(path);\n } catch {\n return this.provider.stat(this.remotePath(path));\n }\n }\n return this.provider.stat(this.remotePath(path));\n }\n\n async mkdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n if (this.local) {\n await this.local.mkdir(path, options);\n }\n await this.provider.mkdir(this.remotePath(path), options);\n }\n\n async readdir(path: string): Promise<DirEntry[]> {\n if (this.local) {\n try {\n return await this.local.readdir(path);\n } catch {\n return this.provider.readdir(this.remotePath(path));\n }\n }\n return this.provider.readdir(this.remotePath(path));\n }\n\n async rmdir(path: string, options?: { recursive?: boolean }): Promise<void> {\n if (this.local) {\n await this.local.rmdir(path, options);\n }\n await this.provider.rmdir(this.remotePath(path), options);\n }\n\n async exists(path: string): Promise<boolean> {\n if (this.local) {\n if (await this.local.exists(path)) return true;\n return this.provider.exists(this.remotePath(path));\n }\n return this.provider.exists(this.remotePath(path));\n }\n\n async listFiles(prefix = \"\"): Promise<string[]> {\n return this.walkFiles(prefix);\n }\n\n async loadProject(id: string): Promise<VirtualProject | null> {\n const paths = await this.listFiles(id);\n if (paths.length === 0) return null;\n\n const files = new Map<string, VirtualFile>();\n await Promise.all(\n paths.map(async (path) => {\n const content = await this.provider.readFile(this.remotePath(path));\n const relative = path.slice(id.length + 1);\n files.set(relative, { path: relative, content });\n if (this.local) {\n await this.local.applyRemoteFile(path, content);\n }\n }),\n );\n\n return { id, entry: resolveEntry(files), files };\n }\n\n async saveProject(project: VirtualProject): Promise<void> {\n if (this.local) {\n await Promise.all(\n Array.from(project.files.values()).map((file) =>\n this.local!.writeFile(`${project.id}/${file.path}`, file.content),\n ),\n );\n await this.sync();\n return;\n }\n\n await Promise.all(\n Array.from(project.files.values()).map((file) =>\n this.provider.writeFile(\n this.remotePath(`${project.id}/${file.path}`),\n file.content,\n ),\n ),\n );\n }\n\n watch(path: string, callback: WatchCallback): () => void {\n if (this.provider.watch) {\n return this.provider.watch(this.remotePath(path), callback);\n }\n return () => {};\n }\n\n async sync(): Promise<SyncResult> {\n if (!this.syncEngine) {\n return { pushed: 0, pulled: 0, conflicts: [] };\n }\n return this.syncEngine.sync();\n }\n\n on<T extends SyncEventType>(\n event: T,\n callback: SyncEventCallback<\n T extends \"change\"\n ? ChangeRecord\n : T extends \"conflict\"\n ? ConflictRecord\n : T extends \"error\"\n ? Error\n : SyncStatus\n >,\n ): () => void {\n if (!this.syncEngine) return () => {};\n return this.syncEngine.on(event, callback as SyncEventCallback<unknown>);\n }\n\n private remotePath(path: string): string {\n return this.root ? join(this.root, path) : path;\n }\n\n private async walkFiles(prefix: string): Promise<string[]> {\n const results: string[] = [];\n const normalized = prefix ? prefix.replace(/^\\/+/g, \"\") : \"\";\n\n let entries: DirEntry[] = [];\n try {\n entries = await this.provider.readdir(this.remotePath(normalized));\n } catch {\n return results;\n }\n\n for (const entry of entries) {\n const entryPath = normalized ? `${normalized}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n results.push(...(await this.walkFiles(entryPath)));\n } else {\n results.push(entryPath);\n }\n }\n\n return results;\n }\n}\n"],"mappings":"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","names":["atIndex","dirname","join","require","DEFAULT_CDN_BASE","cdnBaseUrl","setCdnBaseUrl","cdnBaseUrl","parts","packageName","subpath","build","exports","matchAlias","build","module","mountCounter","generateMountId","cdnBaseUrl","setCdnBaseUrl","normalizePath","dirname","normalizePath","normalizePath","dirname","dirname","hashContent","normalizePath","normalizePath","dirname"]}