@fictjs/vite-plugin 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -38,6 +38,43 @@ export default defineConfig({
38
38
  })
39
39
  ```
40
40
 
41
+ Core defaults:
42
+
43
+ - `include`: `['**/*.tsx', '**/*.jsx']`
44
+ - `exclude`: `['**/node_modules/**']`
45
+ - `useTypeScriptProject`: `true`
46
+ - `cache`:
47
+ - enabled by default
48
+ - memory cache always on
49
+ - persistent cache defaults to `true` during `vite build`, otherwise in-memory only
50
+
51
+ Compiler option passthrough:
52
+
53
+ - This plugin forwards compiler options directly (for example: `strictGuarantee`, `strictReactivity`, `lazyConditional`, `emitModuleMetadata`, `warningLevels`, `reactiveScopes`).
54
+ - Current compiler default is `strictGuarantee: true` (fail-closed).
55
+
56
+ Runtime dev/prod define:
57
+
58
+ - The plugin defines `__DEV__` automatically:
59
+ - `true` in dev server
60
+ - `false` in production build
61
+
62
+ Recommended profiles:
63
+
64
+ ```ts
65
+ // Strict app/CI baseline
66
+ fict({
67
+ strictGuarantee: true,
68
+ })
69
+
70
+ // Migration / benchmark compatibility
71
+ fict({
72
+ strictGuarantee: false,
73
+ emitModuleMetadata: false,
74
+ dev: false,
75
+ })
76
+ ```
77
+
41
78
  Notes:
42
79
 
43
80
  - `reactiveScopes` only applies to **direct calls** and only treats the **first argument** as the reactive callback.
package/dist/index.cjs CHANGED
@@ -304,22 +304,30 @@ function fict(options = {}) {
304
304
  }
305
305
  }
306
306
  try {
307
- const isTypeScript = filename.endsWith(".tsx") || filename.endsWith(".ts");
308
- const result = await (0, import_core.transformAsync)(code, {
309
- filename,
310
- sourceMaps: fictOptions.sourcemap,
311
- sourceFileName: filename,
312
- presets: isTypeScript ? [["@babel/preset-typescript", { isTSX: true, allExtensions: true }]] : [],
313
- plugins: [
314
- ["@babel/plugin-syntax-jsx", {}],
315
- [import_compiler.createFictPlugin, fictOptions]
316
- ]
317
- });
318
- if (!result || !result.code) {
319
- return null;
307
+ const precompiledInput = isPrecompiledFictModule(code);
308
+ let finalCode;
309
+ let finalMap;
310
+ if (precompiledInput) {
311
+ finalCode = code;
312
+ finalMap = null;
313
+ } else {
314
+ const isTypeScript = filename.endsWith(".tsx") || filename.endsWith(".ts");
315
+ const result = await (0, import_core.transformAsync)(code, {
316
+ filename,
317
+ sourceMaps: fictOptions.sourcemap,
318
+ sourceFileName: filename,
319
+ presets: isTypeScript ? [["@babel/preset-typescript", { isTSX: true, allExtensions: true }]] : [],
320
+ plugins: [
321
+ ["@babel/plugin-syntax-jsx", {}],
322
+ [import_compiler.createFictPlugin, fictOptions]
323
+ ]
324
+ });
325
+ if (!result || !result.code) {
326
+ return null;
327
+ }
328
+ finalCode = result.code;
329
+ finalMap = result.map;
320
330
  }
321
- let finalCode = result.code;
322
- let finalMap = result.map;
323
331
  const shouldSplit = options.functionSplitting ?? (config?.command === "build" && (compilerOptions.resumable || !config?.build?.ssr));
324
332
  debugLog("Function split decision", {
325
333
  shouldSplit,
@@ -483,6 +491,13 @@ function normalizeFileName(id, root) {
483
491
  if (root) return import_node_path.default.normalize(import_node_path.default.resolve(root, clean));
484
492
  return import_node_path.default.normalize(import_node_path.default.resolve(clean));
485
493
  }
494
+ function isPrecompiledFictModule(code) {
495
+ const hasCompilerMarker = code.includes("__fict_hir_codegen__") || code.includes("__fictQrl(") || code.includes("__fictUseLexicalScope");
496
+ if (!hasCompilerMarker) {
497
+ return false;
498
+ }
499
+ return /export\s+(?:const|function)\s+__fict_[er]\d+/.test(code);
500
+ }
486
501
  function joinBasePath(base, fileName) {
487
502
  if (!base) return fileName;
488
503
  if (base === "/") return `/${fileName}`;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { createHash } from 'node:crypto'\nimport { promises as fs } from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\n\nimport { transformAsync } from '@babel/core'\nimport _generate from '@babel/generator'\nimport { parse } from '@babel/parser'\nimport _traverse from '@babel/traverse'\nimport * as t from '@babel/types'\nimport { createFictPlugin, type FictCompilerOptions } from '@fictjs/compiler'\nimport type { Plugin, ResolvedConfig, TransformResult } from 'vite'\n\n// Handle ESM/CJS interop for Babel packages\nconst traverse = (\n typeof _traverse === 'function' ? _traverse : (_traverse as { default: typeof _traverse }).default\n) as typeof _traverse\nconst generate = (\n typeof _generate === 'function' ? _generate : (_generate as { default: typeof _generate }).default\n) as typeof _generate\n\nexport interface FictPluginOptions extends FictCompilerOptions {\n /**\n * File patterns to include for transformation.\n * @default ['**\\/*.tsx', '**\\/*.jsx']\n */\n include?: string[]\n /**\n * File patterns to exclude from transformation.\n * @default ['**\\/node_modules\\/**']\n */\n exclude?: string[]\n /**\n * Transform cache settings (memory + optional persistent disk cache).\n * Set to false to disable caching entirely.\n */\n cache?:\n | boolean\n | {\n enabled?: boolean\n persistent?: boolean\n dir?: string\n }\n /**\n * Explicit tsconfig path for TypeScript project integration.\n * If omitted, the plugin will search from Vite root.\n */\n tsconfigPath?: string\n /**\n * Enable TypeScript project integration when TypeScript is available.\n * @default true\n */\n useTypeScriptProject?: boolean\n /**\n * Enable function-level code splitting for resumable handlers.\n * When enabled, event handlers and resume functions are extracted\n * to separate chunks for optimal lazy loading.\n * @default false for dev, true for production build\n */\n functionSplitting?: boolean\n /**\n * Enable verbose debug logs from the plugin.\n * Can also be enabled via `FICT_VITE_PLUGIN_DEBUG=1`.\n * @default false\n */\n debug?: boolean\n}\n\ninterface NormalizedCacheOptions {\n enabled: boolean\n persistent: boolean\n dir?: string\n}\n\ninterface CachedTransform {\n code: string\n map: TransformResult['map']\n}\n\ninterface TypeScriptProject {\n configPath: string\n configHash: string\n readonly projectVersion: number\n updateFile: (fileName: string, code: string) => void\n getProgram: () => TypeScriptProgram | null\n resolveModuleName: (specifier: string, containingFile: string) => string | null\n dispose: () => void\n}\n\ninterface TypeScriptProgram {\n getTypeChecker?: () => unknown\n}\n\ninterface TypeScriptSystem {\n fileExists: (path: string) => boolean\n readFile: (path: string) => string | undefined\n readDirectory: (...args: unknown[]) => string[]\n directoryExists?: (path: string) => boolean\n getDirectories?: (path: string) => string[]\n useCaseSensitiveFileNames: boolean\n newLine: string\n}\n\ninterface TypeScriptParsedConfig {\n fileNames: string[]\n options: unknown\n}\n\ninterface TypeScriptLanguageService {\n getProgram?: () => TypeScriptProgram | null\n dispose?: () => void\n}\n\ninterface TypeScriptLanguageServiceHost {\n getScriptFileNames: () => string[]\n getScriptVersion: (fileName: string) => string\n getScriptSnapshot: (fileName: string) => unknown\n getCurrentDirectory: () => string\n getCompilationSettings: () => unknown\n getDefaultLibFileName: (options: unknown) => string\n fileExists: TypeScriptSystem['fileExists']\n readFile: TypeScriptSystem['readFile']\n readDirectory: TypeScriptSystem['readDirectory']\n directoryExists?: TypeScriptSystem['directoryExists']\n getDirectories?: TypeScriptSystem['getDirectories']\n useCaseSensitiveFileNames: () => boolean\n getNewLine: () => string\n getProjectVersion: () => string\n}\n\ninterface TypeScriptApi {\n sys: TypeScriptSystem\n findConfigFile: (\n searchPath: string,\n fileExists: TypeScriptSystem['fileExists'],\n configName: string,\n ) => string | undefined\n readConfigFile: (\n configPath: string,\n readFile: TypeScriptSystem['readFile'],\n ) => { config: unknown; error?: unknown }\n parseJsonConfigFileContent: (\n config: unknown,\n host: TypeScriptSystem,\n basePath: string,\n ) => TypeScriptParsedConfig\n ScriptSnapshot: {\n fromString: (text: string) => unknown\n }\n getDefaultLibFilePath: (options: unknown) => string\n createLanguageService: (\n host: TypeScriptLanguageServiceHost,\n registry: unknown,\n ) => TypeScriptLanguageService\n createDocumentRegistry: () => unknown\n resolveModuleName: (\n specifier: string,\n containingFile: string,\n options: unknown,\n host: TypeScriptSystem,\n ) => { resolvedModule?: { resolvedFileName?: string } } | undefined\n}\n\nconst CACHE_VERSION = 1\nconst MODULE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.mts', '.cts']\n\n// Virtual module prefix for extracted handlers\nconst VIRTUAL_HANDLER_PREFIX = '\\0fict-handler:'\nconst VIRTUAL_HANDLER_RESOLVE_PREFIX = 'virtual:fict-handler:'\n\n/**\n * Information about an extracted resumable handler\n */\ninterface ExtractedHandler {\n /** The module this handler was extracted from */\n sourceModule: string\n /** The export name in the source module */\n exportName: string\n /** Runtime helpers used by this handler */\n helpersUsed: string[]\n /** Local dependencies from source module that need to be re-exported */\n localDeps: string[]\n /** The handler function code (without export) */\n code: string\n}\n\n/**\n * Registry for extracted handlers during compilation\n */\nconst extractedHandlers = new Map<string, ExtractedHandler>()\n\n/**\n * Vite plugin for Fict reactive UI library.\n *\n * Transforms $state and $effect calls into reactive signals using the Fict compiler.\n *\n * @example\n * ```ts\n * // vite.config.ts\n * import { defineConfig } from 'vite'\n * import fict from '@fictjs/vite-plugin'\n *\n * export default defineConfig({\n * plugins: [fict()],\n * })\n * ```\n */\nexport default function fict(options: FictPluginOptions = {}): Plugin {\n const {\n include = ['**/*.tsx', '**/*.jsx'],\n exclude = ['**/node_modules/**'],\n cache: cacheOption,\n tsconfigPath,\n useTypeScriptProject = true,\n debug: debugOption,\n ...compilerOptions\n } = options\n\n let config: ResolvedConfig | undefined\n let isDev = false\n let cache: TransformCache | null = null\n let tsProject: TypeScriptProject | null = null\n let tsProjectInit: Promise<TypeScriptProject | null> | null = null\n const moduleMetadata: FictCompilerOptions['moduleMetadata'] = new Map()\n const debugEnabled =\n debugOption === true ||\n process.env.FICT_VITE_PLUGIN_DEBUG === '1' ||\n process.env.FICT_VITE_PLUGIN_DEBUG === 'true'\n\n const debugLog = (message: string, details?: unknown) => {\n if (!debugEnabled) return\n const payload = details === undefined ? '' : ` ${safeDebugString(details)}`\n config?.logger?.info(`[fict-plugin] ${message}${payload}`)\n }\n\n const ensureCache = () => {\n if (cache) return cache\n const normalized = normalizeCacheOptions(cacheOption, config)\n cache = new TransformCache(normalized)\n return cache\n }\n\n const resetCache = () => {\n cache?.clear()\n cache = null\n }\n\n const ensureTypeScriptProject = async () => {\n if (!useTypeScriptProject) return null\n if (tsProject) return tsProject\n if (!tsProjectInit) {\n tsProjectInit = (async () => {\n const ts = await loadTypeScript()\n if (!ts) return null\n const rootDir = config?.root ?? process.cwd()\n const resolvedConfigPath = resolveTsconfigPath(ts, rootDir, tsconfigPath)\n if (!resolvedConfigPath) return null\n return createTypeScriptProject(ts, rootDir, resolvedConfigPath)\n })()\n }\n tsProject = await tsProjectInit\n return tsProject\n }\n\n const resetTypeScriptProject = () => {\n if (tsProject) {\n tsProject.dispose()\n }\n tsProject = null\n tsProjectInit = null\n }\n\n return {\n name: 'vite-plugin-fict',\n\n enforce: 'pre',\n\n configResolved(resolvedConfig) {\n config = resolvedConfig\n isDev = config.command === 'serve' || config.mode === 'development'\n // Rebuild cache with resolved config so cacheDir is available\n resetCache()\n // Clear extracted handlers from previous builds\n extractedHandlers.clear()\n },\n\n resolveId(id: string) {\n // Handle virtual handler modules\n if (id.startsWith(VIRTUAL_HANDLER_RESOLVE_PREFIX)) {\n return VIRTUAL_HANDLER_PREFIX + id.slice(VIRTUAL_HANDLER_RESOLVE_PREFIX.length)\n }\n return null\n },\n\n load(id: string) {\n // Load virtual handler modules\n if (!id.startsWith(VIRTUAL_HANDLER_PREFIX)) {\n return null\n }\n\n const handlerId = id.slice(VIRTUAL_HANDLER_PREFIX.length)\n debugLog(`Loading virtual module: ${handlerId}`, {\n registrySize: extractedHandlers.size,\n handlers: Array.from(extractedHandlers.keys()),\n })\n const handler = extractedHandlers.get(handlerId)\n if (handler) {\n const generatedCode = generateHandlerModule(handler)\n debugLog(`Generated virtual module (${generatedCode.length} chars)`, {\n preview: generatedCode.slice(0, 200),\n })\n return generatedCode\n }\n\n if (!handler) {\n // In dev mode or when splitting is disabled, the handler is still in the main module\n // Generate a re-export from the source module\n const [sourceModule, exportName] = parseHandlerId(handlerId)\n if (sourceModule && exportName) {\n return `export { ${exportName} as default } from '${sourceModule}'`\n }\n return null\n }\n\n // Generate the virtual module with the handler code\n return generateHandlerModule(handler)\n },\n\n config(userConfig, env) {\n const userOptimize = userConfig.optimizeDeps\n const hasUserOptimize = !!userOptimize\n const hasDisabledOptimize =\n hasUserOptimize && (userOptimize as { disabled?: boolean }).disabled === true\n\n const include = new Set(userOptimize?.include ?? [])\n const exclude = new Set(userOptimize?.exclude ?? [])\n const dedupe = new Set((userConfig.resolve?.dedupe ?? []) as string[])\n\n // Avoid duplicate runtime instances between pre-bundled deps and /@fs modules.\n // Exclude all workspace packages from prebundling to ensure changes take effect\n // immediately without requiring node_modules reinstall.\n const workspaceDeps = [\n 'fict',\n 'fict/plus',\n 'fict/advanced',\n 'fict/slim',\n 'fict/jsx-runtime',\n 'fict/jsx-dev-runtime',\n '@fictjs/runtime',\n '@fictjs/runtime/internal',\n '@fictjs/runtime/advanced',\n '@fictjs/runtime/jsx-runtime',\n '@fictjs/runtime/jsx-dev-runtime',\n '@fictjs/compiler',\n '@fictjs/devtools',\n '@fictjs/devtools/core',\n '@fictjs/devtools/vite',\n '@fictjs/router',\n '@fictjs/ssr',\n '@fictjs/testing-library',\n ]\n for (const dep of workspaceDeps) {\n include.delete(dep)\n exclude.add(dep)\n }\n // Only dedupe core runtime packages to avoid duplicate instances\n const dedupePackages = ['fict', '@fictjs/runtime', '@fictjs/runtime/internal']\n for (const dep of dedupePackages) {\n dedupe.add(dep)\n }\n\n // Determine if we're in dev mode based on command or mode\n const devMode = env.command === 'serve' || env.mode === 'development'\n\n return {\n // Define __DEV__ for runtime devtools support\n // In dev mode, enable devtools; in production, disable them for smaller bundles\n define: {\n __DEV__: String(devMode),\n ...(userConfig.define ?? {}),\n },\n esbuild: {\n // Disable esbuild JSX handling for .tsx/.jsx files\n // Our plugin will handle the full transformation\n include: /\\.(ts|js|mts|mjs|cjs)$/,\n },\n build: {\n rollupOptions: {\n // Preserve exports in entry chunks to prevent tree-shaking of handler exports\n preserveEntrySignatures: 'exports-only',\n },\n },\n resolve: {\n ...(userConfig.resolve ?? {}),\n dedupe: Array.from(dedupe),\n },\n // Watch workspace packages dist directories for changes in dev mode\n // This ensures HMR picks up rebuilt packages without needing to restart\n server: {\n watch: {\n ignored: ['!**/node_modules/@fictjs/**', '!**/node_modules/fict/**'],\n },\n },\n ...(hasDisabledOptimize\n ? { optimizeDeps: userOptimize }\n : {\n optimizeDeps: hasUserOptimize\n ? { ...userOptimize, include: Array.from(include), exclude: Array.from(exclude) }\n : { exclude: workspaceDeps },\n }),\n }\n },\n\n async transform(code: string, id: string): Promise<TransformResult | null> {\n const filename = stripQuery(id)\n\n // Skip non-matching files\n if (!shouldTransform(filename, include, exclude)) {\n return null\n }\n\n const aliasEntries = normalizeAliases(config?.resolve?.alias)\n const fictOptions: FictCompilerOptions = {\n ...compilerOptions,\n dev: compilerOptions.dev ?? isDev,\n sourcemap: compilerOptions.sourcemap ?? true,\n filename,\n moduleMetadata,\n resolveModuleMetadata: (source, importer) => {\n const userResolved = compilerOptions.resolveModuleMetadata?.(source, importer)\n if (userResolved) return userResolved\n if (!importer) return undefined\n\n const importerFile = normalizeFileName(importer, config?.root)\n const lookupMetadata = (resolved: string) => {\n const direct = moduleMetadata.get(resolved)\n if (direct) return direct\n const ext = path.extname(resolved)\n if (!ext) {\n for (const suffix of MODULE_EXTENSIONS) {\n const byExt = moduleMetadata.get(`${resolved}${suffix}`)\n if (byExt) return byExt\n }\n for (const suffix of MODULE_EXTENSIONS) {\n const byIndex = moduleMetadata.get(path.join(resolved, `index${suffix}`))\n if (byIndex) return byIndex\n }\n }\n return undefined\n }\n let resolvedSource: string | null = null\n\n if (path.isAbsolute(source)) {\n resolvedSource = normalizeFileName(source, config?.root)\n } else if (source.startsWith('.')) {\n resolvedSource = normalizeFileName(\n path.resolve(path.dirname(importerFile), source),\n config?.root,\n )\n } else {\n const aliased = applyAlias(source, aliasEntries)\n if (aliased) {\n if (path.isAbsolute(aliased)) {\n resolvedSource = normalizeFileName(aliased, config?.root)\n } else if (aliased.startsWith('.')) {\n resolvedSource = normalizeFileName(\n path.resolve(path.dirname(importerFile), aliased),\n config?.root,\n )\n } else if (config?.root) {\n resolvedSource = normalizeFileName(path.resolve(config.root, aliased), config?.root)\n }\n } else if (tsProject) {\n const tsResolved = tsProject.resolveModuleName(source, importerFile)\n if (tsResolved) {\n resolvedSource = normalizeFileName(tsResolved, config?.root)\n }\n }\n }\n\n if (!resolvedSource) return undefined\n return lookupMetadata(resolvedSource)\n },\n }\n\n const tsProject = await ensureTypeScriptProject()\n if (tsProject) {\n const resolvedName = normalizeFileName(filename, config?.root)\n tsProject.updateFile(resolvedName, code)\n const program = tsProject.getProgram()\n const checker =\n program && typeof program.getTypeChecker === 'function'\n ? program.getTypeChecker()\n : undefined\n fictOptions.typescript = {\n program: program ?? undefined,\n checker,\n projectVersion: tsProject.projectVersion,\n configPath: tsProject.configPath,\n }\n }\n\n const cacheStore = ensureCache()\n const cacheKey = cacheStore.enabled\n ? buildCacheKey(filename, code, fictOptions, tsProject)\n : null\n\n if (cacheKey) {\n const cached = await cacheStore.get(cacheKey)\n if (cached) {\n return cached\n }\n }\n\n try {\n const isTypeScript = filename.endsWith('.tsx') || filename.endsWith('.ts')\n\n const result = await transformAsync(code, {\n filename,\n sourceMaps: fictOptions.sourcemap,\n sourceFileName: filename,\n presets: isTypeScript\n ? [['@babel/preset-typescript', { isTSX: true, allExtensions: true }]]\n : [],\n plugins: [\n ['@babel/plugin-syntax-jsx', {}],\n [createFictPlugin, fictOptions],\n ],\n })\n\n if (!result || !result.code) {\n return null\n }\n\n let finalCode = result.code\n let finalMap = result.map as TransformResult['map']\n\n // Apply function-level code splitting in production builds\n // For SSR builds with resumable enabled, we also need to rewrite QRLs to virtual URLs\n // so they match the manifest generated by the client build\n const shouldSplit =\n options.functionSplitting ??\n (config?.command === 'build' && (compilerOptions.resumable || !config?.build?.ssr))\n\n debugLog('Function split decision', {\n shouldSplit,\n ssr: config?.build?.ssr,\n resumable: compilerOptions.resumable,\n file: filename,\n })\n if (shouldSplit) {\n let splitResult: { code: string; handlers: string[] } | null = null\n try {\n splitResult = extractAndRewriteHandlers(finalCode, filename)\n } catch (error) {\n this.warn(buildPluginMessage('extractAndRewriteHandlers failed', filename, error))\n }\n debugLog('Split result', {\n file: filename,\n handlers: splitResult?.handlers.length ?? 0,\n })\n if (splitResult) {\n debugLog(`Function splitting extracted ${splitResult.handlers.length} handlers`, {\n file: filename,\n })\n finalCode = splitResult.code\n // Note: source maps are invalidated by this rewrite\n // For production builds, this is acceptable\n finalMap = null\n\n // Emit each extracted handler as a separate chunk for lazy loading\n // This ensures the virtual modules are included in the build\n if (config?.command === 'build' && !config?.build?.ssr) {\n for (const handlerName of splitResult.handlers) {\n const handlerId = createHandlerId(filename, handlerName)\n const virtualModuleId = `${VIRTUAL_HANDLER_RESOLVE_PREFIX}${handlerId}`\n this.emitFile({\n type: 'chunk',\n id: virtualModuleId,\n name: `handler-${handlerName}`,\n })\n }\n }\n }\n }\n\n const transformed: TransformResult = {\n code: finalCode,\n map: finalMap,\n }\n\n if (cacheKey) {\n await cacheStore.set(cacheKey, transformed)\n }\n\n return transformed\n } catch (error) {\n // Better error handling\n const message =\n error instanceof Error ? error.message : 'Unknown error during Fict transformation'\n\n this.error({\n message: `[fict] Transform failed for ${id}: ${message}`,\n id,\n })\n\n return null\n }\n },\n\n handleHotUpdate({ file, server }) {\n if (tsProject && file === tsProject.configPath) {\n resetTypeScriptProject()\n resetCache()\n }\n\n // Force full reload for .tsx/.jsx files to ensure reactive graph is rebuilt\n if (shouldTransform(file, include, exclude)) {\n server.ws.send({\n type: 'full-reload',\n path: '*',\n })\n }\n },\n\n generateBundle(_options, bundle) {\n if (!config || config.command !== 'build') return\n if (config.build.ssr) return\n\n const base = config.base ?? '/'\n const manifest: Record<string, string> = {}\n\n for (const output of Object.values(bundle)) {\n if (output.type !== 'chunk') continue\n const fileName = output.fileName\n const url = joinBasePath(base, fileName)\n for (const moduleId of Object.keys(output.modules)) {\n if (!moduleId) continue\n\n // Handle virtual handler modules\n if (moduleId.startsWith(VIRTUAL_HANDLER_PREFIX)) {\n const handlerId = moduleId.slice(VIRTUAL_HANDLER_PREFIX.length)\n // Map the virtual module resolve prefix to the chunk URL\n const virtualKey = `${VIRTUAL_HANDLER_RESOLVE_PREFIX}${handlerId}`\n if (!manifest[virtualKey]) {\n manifest[virtualKey] = url\n }\n continue\n }\n\n // Skip other virtual modules\n if (moduleId.startsWith('\\0')) continue\n\n const normalized = normalizeFileName(moduleId, config.root)\n if (!path.isAbsolute(normalized)) continue\n const key = pathToFileURL(normalized).href\n if (!manifest[key]) {\n manifest[key] = url\n }\n }\n }\n\n this.emitFile({\n type: 'asset',\n fileName: 'fict.manifest.json',\n source: JSON.stringify(manifest),\n })\n },\n }\n}\n\n/**\n * Check if a file should be transformed based on include/exclude patterns\n */\nfunction shouldTransform(id: string, include: string[], exclude: string[]): boolean {\n // Normalize path separators\n const normalizedId = stripQuery(id).replace(/\\\\/g, '/')\n\n // Check exclude patterns first\n for (const pattern of exclude) {\n if (matchPattern(normalizedId, pattern)) {\n return false\n }\n }\n\n // Check include patterns\n for (const pattern of include) {\n if (matchPattern(normalizedId, pattern)) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * Simple glob pattern matching\n * Supports: **\\/*.ext, *.ext, exact matches\n */\nfunction matchPattern(id: string, pattern: string): boolean {\n // Exact match\n if (id === pattern) return true\n\n // Simple check: if pattern ends with extension like *.tsx, just check if file ends with it\n if (pattern.startsWith('**/') || pattern.startsWith('*')) {\n const ext = pattern.replace(/^\\*\\*?\\//, '')\n if (ext.startsWith('*')) {\n // **/*.tsx -> check if ends with .tsx\n const ending = ext.replace(/^\\*/, '')\n return id.endsWith(ending)\n }\n }\n\n // Convert glob pattern to regex\n const regexPattern = pattern\n .replace(/\\./g, '\\\\.') // Escape dots\n .replace(/\\*\\*/g, '.*') // ** matches any path\n .replace(/\\*/g, '[^/]*') // * matches any non-slash\n\n const regex = new RegExp(`^${regexPattern}$`)\n return regex.test(id)\n}\n\n/**\n * Remove Vite query parameters (e.g. ?import, ?v=123) from an id\n */\nfunction stripQuery(id: string): string {\n const queryStart = id.indexOf('?')\n return queryStart === -1 ? id : id.slice(0, queryStart)\n}\n\nfunction normalizeCacheOptions(\n cacheOption: FictPluginOptions['cache'],\n config?: ResolvedConfig,\n): NormalizedCacheOptions {\n const defaultPersistent = config?.command === 'build'\n const defaultDir = config?.cacheDir ? path.join(config.cacheDir, 'fict') : undefined\n\n if (cacheOption === false) {\n return { enabled: false, persistent: false, dir: undefined }\n }\n\n if (cacheOption === true || cacheOption === undefined) {\n return { enabled: true, persistent: defaultPersistent, dir: defaultDir }\n }\n\n return {\n enabled: cacheOption.enabled ?? true,\n persistent: cacheOption.persistent ?? defaultPersistent,\n dir: cacheOption.dir ?? defaultDir,\n }\n}\n\nfunction normalizeFileName(id: string, root?: string): string {\n let clean = stripQuery(id)\n if (clean.startsWith('/@fs/')) {\n clean = clean.slice('/@fs/'.length)\n }\n if (clean.startsWith('file://')) {\n try {\n clean = fileURLToPath(clean)\n } catch {\n // fall through\n }\n }\n if (path.isAbsolute(clean)) return path.normalize(clean)\n if (root) return path.normalize(path.resolve(root, clean))\n return path.normalize(path.resolve(clean))\n}\n\nfunction joinBasePath(base: string, fileName: string): string {\n if (!base) return fileName\n if (base === '/') return `/${fileName}`\n const normalized = base.endsWith('/') ? base : `${base}/`\n return `${normalized}${fileName}`\n}\n\ninterface AliasEntry {\n find: string | RegExp\n replacement: string\n}\n\nfunction normalizeAliases(aliases: ResolvedConfig['resolve']['alias'] | undefined): AliasEntry[] {\n if (!aliases) return []\n if (Array.isArray(aliases)) {\n return aliases\n .map(alias => {\n if (!alias || !('find' in alias)) return null\n const replacement =\n typeof alias.replacement === 'string' ? alias.replacement : String(alias.replacement)\n return { find: alias.find, replacement } as AliasEntry\n })\n .filter((alias): alias is AliasEntry => !!alias)\n }\n return Object.entries(aliases).map(([find, replacement]) => ({\n find,\n replacement: typeof replacement === 'string' ? replacement : String(replacement),\n }))\n}\n\nfunction applyAlias(source: string, aliases: AliasEntry[]): string | null {\n for (const alias of aliases) {\n if (typeof alias.find === 'string') {\n if (source === alias.find || source.startsWith(`${alias.find}/`)) {\n return alias.replacement + source.slice(alias.find.length)\n }\n continue\n }\n if (alias.find instanceof RegExp && alias.find.test(source)) {\n return source.replace(alias.find, alias.replacement)\n }\n }\n return null\n}\n\nfunction hashString(value: string): string {\n return createHash('sha256').update(value).digest('hex')\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') {\n return JSON.stringify(value)\n }\n\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(',')}]`\n }\n\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined && typeof v !== 'function')\n .sort(([a], [b]) => a.localeCompare(b))\n\n const body = entries\n .map(([key, val]) => `${JSON.stringify(key)}:${stableStringify(val)}`)\n .join(',')\n\n return `{${body}}`\n}\n\nfunction normalizeOptionsForCache(options: FictCompilerOptions): Record<string, unknown> {\n const normalized: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(options)) {\n if (value === undefined || typeof value === 'function') continue\n if (key === 'typescript') {\n const tsInfo = value as {\n projectVersion?: number\n configPath?: string\n }\n normalized.typescript = {\n projectVersion: tsInfo?.projectVersion,\n configPath: tsInfo?.configPath,\n }\n continue\n }\n normalized[key] = value\n }\n return normalized\n}\n\nfunction buildCacheKey(\n filename: string,\n code: string,\n options: FictCompilerOptions,\n tsProject: TypeScriptProject | null,\n): string {\n const codeHash = hashString(code)\n const optionsHash = hashString(stableStringify(normalizeOptionsForCache(options)))\n const tsKey = tsProject ? `${tsProject.configHash}:${tsProject.projectVersion}` : ''\n return hashString([CACHE_VERSION, filename, codeHash, optionsHash, tsKey].join('|'))\n}\n\nclass TransformCache {\n private memory = new Map<string, CachedTransform>()\n\n constructor(private options: NormalizedCacheOptions) {}\n\n get enabled(): boolean {\n return this.options.enabled\n }\n\n async get(key: string): Promise<CachedTransform | null> {\n if (!this.options.enabled) return null\n const cached = this.memory.get(key)\n if (cached) return cached\n\n if (!this.options.persistent || !this.options.dir) return null\n\n const filePath = path.join(this.options.dir, `${key}.json`)\n try {\n const raw = await fs.readFile(filePath, 'utf8')\n const parsed = JSON.parse(raw) as CachedTransform\n if (!parsed || typeof parsed.code !== 'string') return null\n this.memory.set(key, parsed)\n return parsed\n } catch {\n return null\n }\n }\n\n async set(key: string, value: CachedTransform): Promise<void> {\n if (!this.options.enabled) return\n this.memory.set(key, value)\n if (!this.options.persistent || !this.options.dir) return\n\n const filePath = path.join(this.options.dir, `${key}.json`)\n try {\n await fs.mkdir(this.options.dir, { recursive: true })\n await fs.writeFile(filePath, JSON.stringify(value))\n } catch {\n // Ignore cache write failures\n }\n }\n\n clear(): void {\n this.memory.clear()\n }\n}\n\nfunction isTypeScriptApi(value: unknown): value is TypeScriptApi {\n if (!value || typeof value !== 'object') return false\n const candidate = value as Partial<TypeScriptApi>\n return (\n typeof candidate.findConfigFile === 'function' &&\n typeof candidate.readConfigFile === 'function' &&\n typeof candidate.parseJsonConfigFileContent === 'function' &&\n typeof candidate.createLanguageService === 'function' &&\n typeof candidate.createDocumentRegistry === 'function' &&\n typeof candidate.resolveModuleName === 'function' &&\n !!candidate.sys &&\n typeof candidate.sys === 'object' &&\n typeof candidate.sys.fileExists === 'function' &&\n typeof candidate.sys.readFile === 'function'\n )\n}\n\nfunction safeDebugString(value: unknown): string {\n try {\n return typeof value === 'string' ? value : JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\nfunction formatError(error: unknown): string {\n if (error instanceof Error) return error.message\n try {\n return JSON.stringify(error)\n } catch {\n return String(error)\n }\n}\n\nfunction buildPluginMessage(context: string, file: string, error: unknown): string {\n return `[fict-plugin] ${context} (${file}): ${formatError(error)}`\n}\n\nasync function loadTypeScript(): Promise<TypeScriptApi | null> {\n try {\n const mod = await import('typescript')\n const candidate = (mod as { default?: unknown }).default ?? mod\n return isTypeScriptApi(candidate) ? candidate : null\n } catch {\n return null\n }\n}\n\nfunction resolveTsconfigPath(\n ts: TypeScriptApi,\n rootDir: string,\n explicitPath?: string,\n): string | null {\n if (explicitPath) {\n return path.resolve(rootDir, explicitPath)\n }\n return ts.findConfigFile(rootDir, ts.sys.fileExists, 'tsconfig.json') ?? null\n}\n\nasync function createTypeScriptProject(\n ts: TypeScriptApi,\n rootDir: string,\n configPath: string,\n): Promise<TypeScriptProject | null> {\n const configText = ts.sys.readFile(configPath)\n if (!configText) return null\n const configHash = hashString(configText)\n\n const configFile = ts.readConfigFile(configPath, ts.sys.readFile)\n if (configFile.error) return null\n\n const parsed = ts.parseJsonConfigFileContent(configFile.config, ts.sys, path.dirname(configPath))\n\n const fileSet = new Set<string>(parsed.fileNames.map((name: string) => path.normalize(name)))\n const fileVersions = new Map<string, number>()\n const fileHashes = new Map<string, string>()\n const fileCache = new Map<string, string>()\n let projectVersion = 0\n\n const normalizeName = (fileName: string) => normalizeFileName(fileName, rootDir)\n\n const serviceHost: TypeScriptLanguageServiceHost = {\n getScriptFileNames: () => Array.from(fileSet),\n getScriptVersion: (fileName: string) => {\n const normalized = normalizeName(fileName)\n return String(fileVersions.get(normalized) ?? 0)\n },\n getScriptSnapshot: (fileName: string) => {\n const normalized = normalizeName(fileName)\n const text = fileCache.get(normalized) ?? ts.sys.readFile(normalized)\n if (text === undefined) return undefined\n return ts.ScriptSnapshot.fromString(text)\n },\n getCurrentDirectory: () => rootDir,\n getCompilationSettings: () => parsed.options,\n getDefaultLibFileName: (options: unknown) => ts.getDefaultLibFilePath(options),\n fileExists: ts.sys.fileExists,\n readFile: ts.sys.readFile,\n readDirectory: ts.sys.readDirectory,\n directoryExists: ts.sys.directoryExists,\n getDirectories: ts.sys.getDirectories,\n useCaseSensitiveFileNames: () => ts.sys.useCaseSensitiveFileNames,\n getNewLine: () => ts.sys.newLine,\n getProjectVersion: () => String(projectVersion),\n }\n\n const service = ts.createLanguageService(serviceHost, ts.createDocumentRegistry())\n\n const updateFile = (fileName: string, code: string) => {\n const normalized = normalizeName(fileName)\n const nextHash = hashString(code)\n if (fileHashes.get(normalized) === nextHash) return\n fileHashes.set(normalized, nextHash)\n fileCache.set(normalized, code)\n fileVersions.set(normalized, (fileVersions.get(normalized) ?? 0) + 1)\n fileSet.add(normalized)\n projectVersion += 1\n }\n\n return {\n configPath,\n configHash,\n get projectVersion() {\n return projectVersion\n },\n updateFile,\n getProgram: () => service.getProgram?.() ?? null,\n resolveModuleName: (specifier: string, containingFile: string) => {\n try {\n const resolved = ts.resolveModuleName(specifier, containingFile, parsed.options, ts.sys)\n return resolved?.resolvedModule?.resolvedFileName ?? null\n } catch {\n return null\n }\n },\n dispose: () => service.dispose?.(),\n }\n}\n\n// ============================================================================\n// Function-level Code Splitting Helpers\n// ============================================================================\n\n/**\n * Parse a handler ID into source module and export name.\n * Format: /path/to/module.tsx$$exportName (using $$ as separator to avoid URL fragment conflicts)\n */\nfunction parseHandlerId(handlerId: string): [string | null, string | null] {\n const separatorIndex = handlerId.lastIndexOf('$$')\n if (separatorIndex === -1) {\n return [handlerId, 'default']\n }\n return [handlerId.slice(0, separatorIndex), handlerId.slice(separatorIndex + 2)]\n}\n\n/**\n * Generate handler ID from source module and export name.\n * Uses $$ as separator to avoid conflicts with URL # fragments.\n */\nfunction createHandlerId(sourceModule: string, exportName: string): string {\n return `${sourceModule}$$${exportName}`\n}\n\n/**\n * Generate a standalone virtual module for an extracted handler.\n * The module contains the complete handler code with its own imports,\n * creating a truly independent chunk that doesn't depend on the source module.\n */\nfunction generateHandlerModule(handler: ExtractedHandler): string {\n // If no code was extracted (fallback case), use re-export\n if (!handler.code) {\n return `export { ${handler.exportName} as default } from '${handler.sourceModule}';\\n`\n }\n\n // Group imports by source module\n const importsByModule = new Map<string, string[]>()\n\n for (const helperName of handler.helpersUsed) {\n const helper = RUNTIME_HELPERS[helperName]\n if (!helper) continue\n\n const existing = importsByModule.get(helper.from) ?? []\n if (!existing.includes(helper.import)) {\n existing.push(helper.import)\n }\n importsByModule.set(helper.from, existing)\n }\n\n // Generate import statements for runtime helpers\n const imports: string[] = []\n for (const [module, names] of importsByModule) {\n imports.push(`import { ${names.join(', ')} } from '${module}';`)\n }\n\n // Import local dependencies from the source module\n // These are re-exported by the source module with __fict_dep_ prefix\n if (handler.localDeps.length > 0) {\n const depImports = handler.localDeps.map(dep => `${HANDLER_DEP_PREFIX}${dep} as ${dep}`)\n imports.push(`import { ${depImports.join(', ')} } from '${handler.sourceModule}';`)\n }\n\n // Generate the complete standalone module\n return `${imports.join('\\n')}${imports.length > 0 ? '\\n\\n' : ''}export default ${handler.code};\\n`\n}\n\n/** Prefix for re-exported handler dependencies */\nconst HANDLER_DEP_PREFIX = '__fict_dep_'\n\n/**\n * Register an extracted handler for function-level splitting.\n */\nexport function registerExtractedHandler(\n sourceModule: string,\n exportName: string,\n helpersUsed: string[],\n code: string,\n localDeps: string[] = [],\n): string {\n const handlerId = createHandlerId(sourceModule, exportName)\n extractedHandlers.set(handlerId, {\n sourceModule,\n exportName,\n helpersUsed,\n localDeps,\n code,\n })\n return `${VIRTUAL_HANDLER_RESOLVE_PREFIX}${handlerId}`\n}\n\n/**\n * Runtime helper name mappings for generating imports in virtual modules\n */\nconst RUNTIME_HELPERS: Record<string, { import: string; from: string }> = {\n __fictUseLexicalScope: { import: '__fictUseLexicalScope', from: '@fictjs/runtime/internal' },\n __fictGetScopeProps: { import: '__fictGetScopeProps', from: '@fictjs/runtime/internal' },\n __fictGetSSRScope: { import: '__fictGetSSRScope', from: '@fictjs/runtime/internal' },\n __fictEnsureScope: { import: '__fictEnsureScope', from: '@fictjs/runtime/internal' },\n __fictPrepareContext: { import: '__fictPrepareContext', from: '@fictjs/runtime/internal' },\n __fictPushContext: { import: '__fictPushContext', from: '@fictjs/runtime/internal' },\n __fictPopContext: { import: '__fictPopContext', from: '@fictjs/runtime/internal' },\n hydrateComponent: { import: 'hydrateComponent', from: '@fictjs/runtime/internal' },\n __fictQrl: { import: '__fictQrl', from: '@fictjs/runtime/internal' },\n}\n\n/** Known global identifiers that don't need to be imported */\nconst GLOBAL_IDENTIFIERS = new Set([\n // JavaScript globals\n 'undefined',\n 'null',\n 'true',\n 'false',\n 'NaN',\n 'Infinity',\n 'globalThis',\n 'window',\n 'document',\n 'console',\n 'setTimeout',\n 'setInterval',\n 'clearTimeout',\n 'clearInterval',\n 'requestAnimationFrame',\n 'cancelAnimationFrame',\n 'fetch',\n 'URL',\n 'URLSearchParams',\n 'FormData',\n 'Headers',\n 'Request',\n 'Response',\n 'AbortController',\n 'AbortSignal',\n // Built-in constructors\n 'Object',\n 'Array',\n 'String',\n 'Number',\n 'Boolean',\n 'Symbol',\n 'BigInt',\n 'Date',\n 'RegExp',\n 'Error',\n 'TypeError',\n 'RangeError',\n 'SyntaxError',\n 'Map',\n 'Set',\n 'WeakMap',\n 'WeakSet',\n 'Promise',\n 'Proxy',\n 'Reflect',\n 'JSON',\n 'Math',\n 'Intl',\n // Event and DOM\n 'Event',\n 'CustomEvent',\n 'Element',\n 'Node',\n 'HTMLElement',\n])\n\n/**\n * Collect identifiers referenced in an AST node that are not locally defined.\n * Uses simple recursive traversal instead of Babel's traverse to work on sub-nodes.\n */\nfunction collectReferencedIdentifiers(node: t.Node, localBindings: Set<string>): Set<string> {\n const referenced = new Set<string>()\n\n function visitNode(\n current: t.Node | null | undefined,\n parent: t.Node | null,\n key: string | null,\n ): void {\n if (!current) return\n\n if (t.isIdentifier(current)) {\n const name = current.name\n\n // Skip if it's a property access (obj.prop) - only the object is a reference\n if (\n parent &&\n t.isMemberExpression(parent) &&\n parent.property === current &&\n !parent.computed\n ) {\n return\n }\n\n // Skip if it's a key in object property (non-computed)\n if (parent && t.isObjectProperty(parent) && parent.key === current && !parent.computed) {\n return\n }\n\n // Skip if it's a function/variable declaration name\n if (parent && t.isVariableDeclarator(parent) && parent.id === current) {\n return\n }\n if (\n parent &&\n (t.isFunctionDeclaration(parent) || t.isFunctionExpression(parent)) &&\n parent.id === current\n ) {\n return\n }\n\n // Skip if it's a parameter\n if (key === 'params') {\n return\n }\n\n // Skip if it's a catch clause parameter\n if (parent && t.isCatchClause(parent) && parent.param === current) {\n return\n }\n\n // Skip local bindings (locally declared variables)\n if (localBindings.has(name)) {\n return\n }\n\n // Skip globals\n if (GLOBAL_IDENTIFIERS.has(name)) {\n return\n }\n\n // Skip runtime helpers\n if (RUNTIME_HELPERS[name]) {\n return\n }\n\n referenced.add(name)\n return\n }\n\n // Recursively visit child nodes\n for (const nodeKey of Object.keys(current)) {\n // Skip metadata keys that aren't child nodes\n if (\n nodeKey === 'loc' ||\n nodeKey === 'start' ||\n nodeKey === 'end' ||\n nodeKey === 'extra' ||\n nodeKey === 'comments' ||\n nodeKey === 'leadingComments' ||\n nodeKey === 'trailingComments' ||\n nodeKey === 'innerComments'\n ) {\n continue\n }\n const child = (current as unknown as Record<string, unknown>)[nodeKey]\n if (Array.isArray(child)) {\n for (const item of child) {\n if (\n item &&\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n typeof (item as Record<string, unknown>).type === 'string'\n ) {\n visitNode(item as t.Node, current, nodeKey)\n }\n }\n } else if (\n child &&\n typeof child === 'object' &&\n child !== null &&\n 'type' in child &&\n typeof (child as Record<string, unknown>).type === 'string'\n ) {\n visitNode(child as t.Node, current, nodeKey)\n }\n }\n }\n\n visitNode(node, null, null)\n return referenced\n}\n\n/**\n * Collect all bindings (variables, functions, params) defined within an AST node.\n * Uses simple recursive traversal instead of Babel's traverse to work on sub-nodes.\n */\nfunction collectLocalBindings(node: t.Node): Set<string> {\n const bindings = new Set<string>()\n\n function visitNode(current: t.Node | null | undefined): void {\n if (!current) return\n\n // Handle variable declarations\n if (t.isVariableDeclarator(current)) {\n if (t.isIdentifier(current.id)) {\n bindings.add(current.id.name)\n } else if (t.isObjectPattern(current.id) || t.isArrayPattern(current.id)) {\n const names = collectPatternIdentifiers(current.id)\n for (const name of names) {\n bindings.add(name)\n }\n }\n }\n\n // Handle function declarations\n if (t.isFunctionDeclaration(current)) {\n if (current.id) {\n bindings.add(current.id.name)\n }\n for (const param of current.params) {\n const names = collectPatternIdentifiers(param)\n for (const name of names) {\n bindings.add(name)\n }\n }\n }\n\n // Handle function expressions\n if (t.isFunctionExpression(current)) {\n for (const param of current.params) {\n const names = collectPatternIdentifiers(param)\n for (const name of names) {\n bindings.add(name)\n }\n }\n }\n\n // Handle arrow function expressions\n if (t.isArrowFunctionExpression(current)) {\n for (const param of current.params) {\n const names = collectPatternIdentifiers(param)\n for (const name of names) {\n bindings.add(name)\n }\n }\n }\n\n // Handle catch clauses\n if (t.isCatchClause(current)) {\n if (current.param && t.isIdentifier(current.param)) {\n bindings.add(current.param.name)\n }\n }\n\n // Recursively visit child nodes\n for (const nodeKey of Object.keys(current)) {\n // Skip metadata keys that aren't child nodes\n if (\n nodeKey === 'loc' ||\n nodeKey === 'start' ||\n nodeKey === 'end' ||\n nodeKey === 'extra' ||\n nodeKey === 'comments' ||\n nodeKey === 'leadingComments' ||\n nodeKey === 'trailingComments' ||\n nodeKey === 'innerComments'\n ) {\n continue\n }\n const child = (current as unknown as Record<string, unknown>)[nodeKey]\n if (Array.isArray(child)) {\n for (const item of child) {\n if (\n item &&\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n typeof (item as Record<string, unknown>).type === 'string'\n ) {\n visitNode(item as t.Node)\n }\n }\n } else if (\n child &&\n typeof child === 'object' &&\n child !== null &&\n 'type' in child &&\n typeof (child as Record<string, unknown>).type === 'string'\n ) {\n visitNode(child as t.Node)\n }\n }\n }\n\n visitNode(node)\n\n return bindings\n}\n\n/**\n * Collect identifier names from a pattern (for destructuring).\n */\nfunction collectPatternIdentifiers(pattern: t.LVal | t.PatternLike): string[] {\n const names: string[] = []\n\n if (t.isIdentifier(pattern)) {\n names.push(pattern.name)\n } else if (t.isObjectPattern(pattern)) {\n for (const prop of pattern.properties) {\n if (t.isObjectProperty(prop) && t.isLVal(prop.value)) {\n names.push(...collectPatternIdentifiers(prop.value))\n } else if (t.isRestElement(prop)) {\n names.push(...collectPatternIdentifiers(prop.argument))\n }\n }\n } else if (t.isArrayPattern(pattern)) {\n for (const element of pattern.elements) {\n if (element) {\n names.push(...collectPatternIdentifiers(element))\n }\n }\n } else if (t.isRestElement(pattern)) {\n names.push(...collectPatternIdentifiers(pattern.argument))\n } else if (t.isAssignmentPattern(pattern)) {\n names.push(...collectPatternIdentifiers(pattern.left))\n }\n\n return names\n}\n\n/**\n * Extract handlers using Babel AST and rewrite QRLs to use virtual modules.\n * This creates truly independent chunks for each handler.\n * Local dependencies are detected and re-exported for handlers to import.\n */\nfunction extractAndRewriteHandlers(\n code: string,\n sourceModule: string,\n): { code: string; handlers: string[] } | null {\n let ast: ReturnType<typeof parse>\n\n try {\n ast = parse(code, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n })\n } catch (error) {\n throw new Error(\n buildPluginMessage(\n 'Failed to parse transformed code for handler extraction',\n sourceModule,\n error,\n ),\n )\n }\n\n // Collect all top-level declarations that could be referenced by handlers\n const topLevelDeclarations = new Set<string>()\n const importedNames = new Set<string>()\n\n for (const node of ast.program.body) {\n // Collect imports\n if (t.isImportDeclaration(node)) {\n for (const specifier of node.specifiers) {\n if (t.isImportSpecifier(specifier) || t.isImportDefaultSpecifier(specifier)) {\n importedNames.add(specifier.local.name)\n } else if (t.isImportNamespaceSpecifier(specifier)) {\n importedNames.add(specifier.local.name)\n }\n }\n continue\n }\n\n // Collect function declarations\n if (t.isFunctionDeclaration(node) && node.id) {\n topLevelDeclarations.add(node.id.name)\n continue\n }\n\n // Collect variable declarations\n if (t.isVariableDeclaration(node)) {\n for (const declarator of node.declarations) {\n if (t.isIdentifier(declarator.id)) {\n topLevelDeclarations.add(declarator.id.name)\n }\n }\n continue\n }\n\n // Collect class declarations\n if (t.isClassDeclaration(node) && node.id) {\n topLevelDeclarations.add(node.id.name)\n continue\n }\n\n // Collect exported declarations\n if (t.isExportNamedDeclaration(node) && node.declaration) {\n if (t.isFunctionDeclaration(node.declaration) && node.declaration.id) {\n topLevelDeclarations.add(node.declaration.id.name)\n } else if (t.isVariableDeclaration(node.declaration)) {\n for (const declarator of node.declaration.declarations) {\n if (t.isIdentifier(declarator.id)) {\n topLevelDeclarations.add(declarator.id.name)\n }\n }\n } else if (t.isClassDeclaration(node.declaration) && node.declaration.id) {\n topLevelDeclarations.add(node.declaration.id.name)\n }\n }\n }\n\n // Merge imports into top-level declarations (they're also available at top level)\n for (const name of importedNames) {\n topLevelDeclarations.add(name)\n }\n\n const handlerNames: string[] = []\n const nodesToRemove = new Set<t.Node>()\n const allLocalDeps = new Set<string>()\n\n // First pass: find all handler exports and extract their code\n traverse(ast, {\n ExportNamedDeclaration(path) {\n const declaration = path.node.declaration\n\n // Handle: export const __fict_e0 = (scopeId, event, el) => { ... }\n if (t.isVariableDeclaration(declaration)) {\n for (const declarator of declaration.declarations) {\n if (!t.isIdentifier(declarator.id)) continue\n\n const name = declarator.id.name\n // Only extract event handlers (__fict_e*), not resume handlers (__fict_r*)\n // Resume handlers have complex component dependencies that can't be easily extracted\n if (!name.match(/^__fict_e\\d+$/)) continue\n\n if (!declarator.init) continue\n\n handlerNames.push(name)\n\n // Generate the handler function code\n const handlerCode = generate(declarator.init).code\n\n // Detect which runtime helpers are used\n const helpersUsed: string[] = []\n for (const helperName of Object.keys(RUNTIME_HELPERS)) {\n if (handlerCode.includes(helperName)) {\n helpersUsed.push(helperName)\n }\n }\n\n // Detect local dependencies\n const localBindings = collectLocalBindings(declarator.init)\n const referencedIds = collectReferencedIdentifiers(declarator.init, localBindings)\n const localDeps: string[] = []\n for (const ref of referencedIds) {\n // Only include if it's a top-level declaration (not a handler itself)\n if (topLevelDeclarations.has(ref) && !ref.match(/^__fict_[er]\\d+$/)) {\n localDeps.push(ref)\n allLocalDeps.add(ref)\n }\n }\n\n // Register the handler with its full code\n const handlerId = createHandlerId(sourceModule, name)\n extractedHandlers.set(handlerId, {\n sourceModule,\n exportName: name,\n helpersUsed,\n localDeps,\n code: handlerCode,\n })\n\n // Mark this export for removal\n nodesToRemove.add(path.node)\n }\n return\n }\n\n // Handle: export function __fict_e0(scopeId, event, el) { ... }\n if (t.isFunctionDeclaration(declaration) && declaration.id) {\n const name = declaration.id.name\n // Only extract event handlers (__fict_e*), not resume handlers (__fict_r*)\n // Resume handlers have complex component dependencies that can't be easily extracted\n if (!name.match(/^__fict_e\\d+$/)) return\n\n handlerNames.push(name)\n\n // Convert to arrow function expression for the virtual module\n const params = declaration.params\n const body = declaration.body\n const arrowFn = t.arrowFunctionExpression(params, body, declaration.async)\n\n // Generate the handler function code\n const handlerCode = generate(arrowFn).code\n\n // Detect which runtime helpers are used\n const helpersUsed: string[] = []\n for (const helperName of Object.keys(RUNTIME_HELPERS)) {\n if (handlerCode.includes(helperName)) {\n helpersUsed.push(helperName)\n }\n }\n\n // Detect local dependencies\n const localBindings = collectLocalBindings(arrowFn)\n const referencedIds = collectReferencedIdentifiers(arrowFn, localBindings)\n const localDeps: string[] = []\n for (const ref of referencedIds) {\n // Only include if it's a top-level declaration (not a handler itself)\n if (topLevelDeclarations.has(ref) && !ref.match(/^__fict_[er]\\d+$/)) {\n localDeps.push(ref)\n allLocalDeps.add(ref)\n }\n }\n\n // Register the handler with its full code\n const handlerId = createHandlerId(sourceModule, name)\n extractedHandlers.set(handlerId, {\n sourceModule,\n exportName: name,\n helpersUsed,\n localDeps,\n code: handlerCode,\n })\n\n // Mark this export for removal\n nodesToRemove.add(path.node)\n }\n },\n })\n\n if (handlerNames.length === 0) {\n return null\n }\n\n // Second pass: remove handler exports, rewrite QRL calls, and add re-exports for dependencies\n traverse(ast, {\n ExportNamedDeclaration(path) {\n if (nodesToRemove.has(path.node)) {\n path.remove()\n }\n },\n\n CallExpression(path) {\n // Rewrite __fictQrl(import.meta.url, \"__fict_e0\") -> \"virtual:...\"\n if (!t.isIdentifier(path.node.callee, { name: '__fictQrl' })) return\n if (path.node.arguments.length !== 2) return\n\n const secondArg = path.node.arguments[1]\n if (!t.isStringLiteral(secondArg)) return\n\n const handlerName = secondArg.value\n if (!handlerNames.includes(handlerName)) return\n\n // Replace with the virtual module URL\n const handlerId = createHandlerId(sourceModule, handlerName)\n const virtualUrl = `${VIRTUAL_HANDLER_RESOLVE_PREFIX}${handlerId}#default`\n path.replaceWith(t.stringLiteral(virtualUrl))\n },\n })\n\n // Add re-exports for local dependencies used by handlers\n // This allows handlers to import them from the source module\n if (allLocalDeps.size > 0) {\n const reExports: t.ExportSpecifier[] = []\n for (const dep of allLocalDeps) {\n // Export as __fict_dep_<name> to avoid conflicts\n reExports.push(\n t.exportSpecifier(t.identifier(dep), t.identifier(`${HANDLER_DEP_PREFIX}${dep}`)),\n )\n }\n ast.program.body.push(t.exportNamedDeclaration(null, reExports))\n }\n\n // Generate the modified code\n const result = generate(ast, {\n retainLines: true,\n compact: false,\n })\n\n return { code: result.code, handlers: handlerNames }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAA2B;AAC3B,qBAA+B;AAC/B,uBAAiB;AACjB,sBAA6C;AAE7C,kBAA+B;AAC/B,uBAAsB;AACtB,oBAAsB;AACtB,sBAAsB;AACtB,QAAmB;AACnB,sBAA2D;AAI3D,IAAM,WACJ,OAAO,gBAAAA,YAAc,aAAa,gBAAAA,UAAa,gBAAAA,QAA4C;AAE7F,IAAM,WACJ,OAAO,iBAAAC,YAAc,aAAa,iBAAAA,UAAa,iBAAAA,QAA4C;AAiJ7F,IAAM,gBAAgB;AACtB,IAAM,oBAAoB,CAAC,OAAO,QAAQ,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,MAAM;AAGvF,IAAM,yBAAyB;AAC/B,IAAM,iCAAiC;AAqBvC,IAAM,oBAAoB,oBAAI,IAA8B;AAkB7C,SAAR,KAAsB,UAA6B,CAAC,GAAW;AACpE,QAAM;AAAA,IACJ,UAAU,CAAC,YAAY,UAAU;AAAA,IACjC,UAAU,CAAC,oBAAoB;AAAA,IAC/B,OAAO;AAAA,IACP;AAAA,IACA,uBAAuB;AAAA,IACvB,OAAO;AAAA,IACP,GAAG;AAAA,EACL,IAAI;AAEJ,MAAI;AACJ,MAAI,QAAQ;AACZ,MAAI,QAA+B;AACnC,MAAI,YAAsC;AAC1C,MAAI,gBAA0D;AAC9D,QAAM,iBAAwD,oBAAI,IAAI;AACtE,QAAM,eACJ,gBAAgB,QAChB,QAAQ,IAAI,2BAA2B,OACvC,QAAQ,IAAI,2BAA2B;AAEzC,QAAM,WAAW,CAAC,SAAiB,YAAsB;AACvD,QAAI,CAAC,aAAc;AACnB,UAAM,UAAU,YAAY,SAAY,KAAK,IAAI,gBAAgB,OAAO,CAAC;AACzE,YAAQ,QAAQ,KAAK,iBAAiB,OAAO,GAAG,OAAO,EAAE;AAAA,EAC3D;AAEA,QAAM,cAAc,MAAM;AACxB,QAAI,MAAO,QAAO;AAClB,UAAM,aAAa,sBAAsB,aAAa,MAAM;AAC5D,YAAQ,IAAI,eAAe,UAAU;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAM;AACvB,WAAO,MAAM;AACb,YAAQ;AAAA,EACV;AAEA,QAAM,0BAA0B,YAAY;AAC1C,QAAI,CAAC,qBAAsB,QAAO;AAClC,QAAI,UAAW,QAAO;AACtB,QAAI,CAAC,eAAe;AAClB,uBAAiB,YAAY;AAC3B,cAAM,KAAK,MAAM,eAAe;AAChC,YAAI,CAAC,GAAI,QAAO;AAChB,cAAM,UAAU,QAAQ,QAAQ,QAAQ,IAAI;AAC5C,cAAM,qBAAqB,oBAAoB,IAAI,SAAS,YAAY;AACxE,YAAI,CAAC,mBAAoB,QAAO;AAChC,eAAO,wBAAwB,IAAI,SAAS,kBAAkB;AAAA,MAChE,GAAG;AAAA,IACL;AACA,gBAAY,MAAM;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,yBAAyB,MAAM;AACnC,QAAI,WAAW;AACb,gBAAU,QAAQ;AAAA,IACpB;AACA,gBAAY;AACZ,oBAAgB;AAAA,EAClB;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,SAAS;AAAA,IAET,eAAe,gBAAgB;AAC7B,eAAS;AACT,cAAQ,OAAO,YAAY,WAAW,OAAO,SAAS;AAEtD,iBAAW;AAEX,wBAAkB,MAAM;AAAA,IAC1B;AAAA,IAEA,UAAU,IAAY;AAEpB,UAAI,GAAG,WAAW,8BAA8B,GAAG;AACjD,eAAO,yBAAyB,GAAG,MAAM,+BAA+B,MAAM;AAAA,MAChF;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,IAAY;AAEf,UAAI,CAAC,GAAG,WAAW,sBAAsB,GAAG;AAC1C,eAAO;AAAA,MACT;AAEA,YAAM,YAAY,GAAG,MAAM,uBAAuB,MAAM;AACxD,eAAS,2BAA2B,SAAS,IAAI;AAAA,QAC/C,cAAc,kBAAkB;AAAA,QAChC,UAAU,MAAM,KAAK,kBAAkB,KAAK,CAAC;AAAA,MAC/C,CAAC;AACD,YAAM,UAAU,kBAAkB,IAAI,SAAS;AAC/C,UAAI,SAAS;AACX,cAAM,gBAAgB,sBAAsB,OAAO;AACnD,iBAAS,6BAA6B,cAAc,MAAM,WAAW;AAAA,UACnE,SAAS,cAAc,MAAM,GAAG,GAAG;AAAA,QACrC,CAAC;AACD,eAAO;AAAA,MACT;AAEA,UAAI,CAAC,SAAS;AAGZ,cAAM,CAAC,cAAc,UAAU,IAAI,eAAe,SAAS;AAC3D,YAAI,gBAAgB,YAAY;AAC9B,iBAAO,YAAY,UAAU,uBAAuB,YAAY;AAAA,QAClE;AACA,eAAO;AAAA,MACT;AAGA,aAAO,sBAAsB,OAAO;AAAA,IACtC;AAAA,IAEA,OAAO,YAAY,KAAK;AACtB,YAAM,eAAe,WAAW;AAChC,YAAM,kBAAkB,CAAC,CAAC;AAC1B,YAAM,sBACJ,mBAAoB,aAAwC,aAAa;AAE3E,YAAMC,WAAU,IAAI,IAAI,cAAc,WAAW,CAAC,CAAC;AACnD,YAAMC,WAAU,IAAI,IAAI,cAAc,WAAW,CAAC,CAAC;AACnD,YAAM,SAAS,IAAI,IAAK,WAAW,SAAS,UAAU,CAAC,CAAc;AAKrE,YAAM,gBAAgB;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,iBAAW,OAAO,eAAe;AAC/B,QAAAD,SAAQ,OAAO,GAAG;AAClB,QAAAC,SAAQ,IAAI,GAAG;AAAA,MACjB;AAEA,YAAM,iBAAiB,CAAC,QAAQ,mBAAmB,0BAA0B;AAC7E,iBAAW,OAAO,gBAAgB;AAChC,eAAO,IAAI,GAAG;AAAA,MAChB;AAGA,YAAM,UAAU,IAAI,YAAY,WAAW,IAAI,SAAS;AAExD,aAAO;AAAA;AAAA;AAAA,QAGL,QAAQ;AAAA,UACN,SAAS,OAAO,OAAO;AAAA,UACvB,GAAI,WAAW,UAAU,CAAC;AAAA,QAC5B;AAAA,QACA,SAAS;AAAA;AAAA;AAAA,UAGP,SAAS;AAAA,QACX;AAAA,QACA,OAAO;AAAA,UACL,eAAe;AAAA;AAAA,YAEb,yBAAyB;AAAA,UAC3B;AAAA,QACF;AAAA,QACA,SAAS;AAAA,UACP,GAAI,WAAW,WAAW,CAAC;AAAA,UAC3B,QAAQ,MAAM,KAAK,MAAM;AAAA,QAC3B;AAAA;AAAA;AAAA,QAGA,QAAQ;AAAA,UACN,OAAO;AAAA,YACL,SAAS,CAAC,+BAA+B,0BAA0B;AAAA,UACrE;AAAA,QACF;AAAA,QACA,GAAI,sBACA,EAAE,cAAc,aAAa,IAC7B;AAAA,UACE,cAAc,kBACV,EAAE,GAAG,cAAc,SAAS,MAAM,KAAKD,QAAO,GAAG,SAAS,MAAM,KAAKC,QAAO,EAAE,IAC9E,EAAE,SAAS,cAAc;AAAA,QAC/B;AAAA,MACN;AAAA,IACF;AAAA,IAEA,MAAM,UAAU,MAAc,IAA6C;AACzE,YAAM,WAAW,WAAW,EAAE;AAG9B,UAAI,CAAC,gBAAgB,UAAU,SAAS,OAAO,GAAG;AAChD,eAAO;AAAA,MACT;AAEA,YAAM,eAAe,iBAAiB,QAAQ,SAAS,KAAK;AAC5D,YAAM,cAAmC;AAAA,QACvC,GAAG;AAAA,QACH,KAAK,gBAAgB,OAAO;AAAA,QAC5B,WAAW,gBAAgB,aAAa;AAAA,QACxC;AAAA,QACA;AAAA,QACA,uBAAuB,CAAC,QAAQ,aAAa;AAC3C,gBAAM,eAAe,gBAAgB,wBAAwB,QAAQ,QAAQ;AAC7E,cAAI,aAAc,QAAO;AACzB,cAAI,CAAC,SAAU,QAAO;AAEtB,gBAAM,eAAe,kBAAkB,UAAU,QAAQ,IAAI;AAC7D,gBAAM,iBAAiB,CAAC,aAAqB;AAC3C,kBAAM,SAAS,eAAe,IAAI,QAAQ;AAC1C,gBAAI,OAAQ,QAAO;AACnB,kBAAM,MAAM,iBAAAC,QAAK,QAAQ,QAAQ;AACjC,gBAAI,CAAC,KAAK;AACR,yBAAW,UAAU,mBAAmB;AACtC,sBAAM,QAAQ,eAAe,IAAI,GAAG,QAAQ,GAAG,MAAM,EAAE;AACvD,oBAAI,MAAO,QAAO;AAAA,cACpB;AACA,yBAAW,UAAU,mBAAmB;AACtC,sBAAM,UAAU,eAAe,IAAI,iBAAAA,QAAK,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;AACxE,oBAAI,QAAS,QAAO;AAAA,cACtB;AAAA,YACF;AACA,mBAAO;AAAA,UACT;AACA,cAAI,iBAAgC;AAEpC,cAAI,iBAAAA,QAAK,WAAW,MAAM,GAAG;AAC3B,6BAAiB,kBAAkB,QAAQ,QAAQ,IAAI;AAAA,UACzD,WAAW,OAAO,WAAW,GAAG,GAAG;AACjC,6BAAiB;AAAA,cACf,iBAAAA,QAAK,QAAQ,iBAAAA,QAAK,QAAQ,YAAY,GAAG,MAAM;AAAA,cAC/C,QAAQ;AAAA,YACV;AAAA,UACF,OAAO;AACL,kBAAM,UAAU,WAAW,QAAQ,YAAY;AAC/C,gBAAI,SAAS;AACX,kBAAI,iBAAAA,QAAK,WAAW,OAAO,GAAG;AAC5B,iCAAiB,kBAAkB,SAAS,QAAQ,IAAI;AAAA,cAC1D,WAAW,QAAQ,WAAW,GAAG,GAAG;AAClC,iCAAiB;AAAA,kBACf,iBAAAA,QAAK,QAAQ,iBAAAA,QAAK,QAAQ,YAAY,GAAG,OAAO;AAAA,kBAChD,QAAQ;AAAA,gBACV;AAAA,cACF,WAAW,QAAQ,MAAM;AACvB,iCAAiB,kBAAkB,iBAAAA,QAAK,QAAQ,OAAO,MAAM,OAAO,GAAG,QAAQ,IAAI;AAAA,cACrF;AAAA,YACF,WAAWC,YAAW;AACpB,oBAAM,aAAaA,WAAU,kBAAkB,QAAQ,YAAY;AACnE,kBAAI,YAAY;AACd,iCAAiB,kBAAkB,YAAY,QAAQ,IAAI;AAAA,cAC7D;AAAA,YACF;AAAA,UACF;AAEA,cAAI,CAAC,eAAgB,QAAO;AAC5B,iBAAO,eAAe,cAAc;AAAA,QACtC;AAAA,MACF;AAEA,YAAMA,aAAY,MAAM,wBAAwB;AAChD,UAAIA,YAAW;AACb,cAAM,eAAe,kBAAkB,UAAU,QAAQ,IAAI;AAC7D,QAAAA,WAAU,WAAW,cAAc,IAAI;AACvC,cAAM,UAAUA,WAAU,WAAW;AACrC,cAAM,UACJ,WAAW,OAAO,QAAQ,mBAAmB,aACzC,QAAQ,eAAe,IACvB;AACN,oBAAY,aAAa;AAAA,UACvB,SAAS,WAAW;AAAA,UACpB;AAAA,UACA,gBAAgBA,WAAU;AAAA,UAC1B,YAAYA,WAAU;AAAA,QACxB;AAAA,MACF;AAEA,YAAM,aAAa,YAAY;AAC/B,YAAM,WAAW,WAAW,UACxB,cAAc,UAAU,MAAM,aAAaA,UAAS,IACpD;AAEJ,UAAI,UAAU;AACZ,cAAM,SAAS,MAAM,WAAW,IAAI,QAAQ;AAC5C,YAAI,QAAQ;AACV,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,UAAI;AACF,cAAM,eAAe,SAAS,SAAS,MAAM,KAAK,SAAS,SAAS,KAAK;AAEzE,cAAM,SAAS,UAAM,4BAAe,MAAM;AAAA,UACxC;AAAA,UACA,YAAY,YAAY;AAAA,UACxB,gBAAgB;AAAA,UAChB,SAAS,eACL,CAAC,CAAC,4BAA4B,EAAE,OAAO,MAAM,eAAe,KAAK,CAAC,CAAC,IACnE,CAAC;AAAA,UACL,SAAS;AAAA,YACP,CAAC,4BAA4B,CAAC,CAAC;AAAA,YAC/B,CAAC,kCAAkB,WAAW;AAAA,UAChC;AAAA,QACF,CAAC;AAED,YAAI,CAAC,UAAU,CAAC,OAAO,MAAM;AAC3B,iBAAO;AAAA,QACT;AAEA,YAAI,YAAY,OAAO;AACvB,YAAI,WAAW,OAAO;AAKtB,cAAM,cACJ,QAAQ,sBACP,QAAQ,YAAY,YAAY,gBAAgB,aAAa,CAAC,QAAQ,OAAO;AAEhF,iBAAS,2BAA2B;AAAA,UAClC;AAAA,UACA,KAAK,QAAQ,OAAO;AAAA,UACpB,WAAW,gBAAgB;AAAA,UAC3B,MAAM;AAAA,QACR,CAAC;AACD,YAAI,aAAa;AACf,cAAI,cAA2D;AAC/D,cAAI;AACF,0BAAc,0BAA0B,WAAW,QAAQ;AAAA,UAC7D,SAAS,OAAO;AACd,iBAAK,KAAK,mBAAmB,oCAAoC,UAAU,KAAK,CAAC;AAAA,UACnF;AACA,mBAAS,gBAAgB;AAAA,YACvB,MAAM;AAAA,YACN,UAAU,aAAa,SAAS,UAAU;AAAA,UAC5C,CAAC;AACD,cAAI,aAAa;AACf,qBAAS,gCAAgC,YAAY,SAAS,MAAM,aAAa;AAAA,cAC/E,MAAM;AAAA,YACR,CAAC;AACD,wBAAY,YAAY;AAGxB,uBAAW;AAIX,gBAAI,QAAQ,YAAY,WAAW,CAAC,QAAQ,OAAO,KAAK;AACtD,yBAAW,eAAe,YAAY,UAAU;AAC9C,sBAAM,YAAY,gBAAgB,UAAU,WAAW;AACvD,sBAAM,kBAAkB,GAAG,8BAA8B,GAAG,SAAS;AACrE,qBAAK,SAAS;AAAA,kBACZ,MAAM;AAAA,kBACN,IAAI;AAAA,kBACJ,MAAM,WAAW,WAAW;AAAA,gBAC9B,CAAC;AAAA,cACH;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,cAAM,cAA+B;AAAA,UACnC,MAAM;AAAA,UACN,KAAK;AAAA,QACP;AAEA,YAAI,UAAU;AACZ,gBAAM,WAAW,IAAI,UAAU,WAAW;AAAA,QAC5C;AAEA,eAAO;AAAA,MACT,SAAS,OAAO;AAEd,cAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU;AAE3C,aAAK,MAAM;AAAA,UACT,SAAS,+BAA+B,EAAE,KAAK,OAAO;AAAA,UACtD;AAAA,QACF,CAAC;AAED,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,gBAAgB,EAAE,MAAM,OAAO,GAAG;AAChC,UAAI,aAAa,SAAS,UAAU,YAAY;AAC9C,+BAAuB;AACvB,mBAAW;AAAA,MACb;AAGA,UAAI,gBAAgB,MAAM,SAAS,OAAO,GAAG;AAC3C,eAAO,GAAG,KAAK;AAAA,UACb,MAAM;AAAA,UACN,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,eAAe,UAAU,QAAQ;AAC/B,UAAI,CAAC,UAAU,OAAO,YAAY,QAAS;AAC3C,UAAI,OAAO,MAAM,IAAK;AAEtB,YAAM,OAAO,OAAO,QAAQ;AAC5B,YAAM,WAAmC,CAAC;AAE1C,iBAAW,UAAU,OAAO,OAAO,MAAM,GAAG;AAC1C,YAAI,OAAO,SAAS,QAAS;AAC7B,cAAM,WAAW,OAAO;AACxB,cAAM,MAAM,aAAa,MAAM,QAAQ;AACvC,mBAAW,YAAY,OAAO,KAAK,OAAO,OAAO,GAAG;AAClD,cAAI,CAAC,SAAU;AAGf,cAAI,SAAS,WAAW,sBAAsB,GAAG;AAC/C,kBAAM,YAAY,SAAS,MAAM,uBAAuB,MAAM;AAE9D,kBAAM,aAAa,GAAG,8BAA8B,GAAG,SAAS;AAChE,gBAAI,CAAC,SAAS,UAAU,GAAG;AACzB,uBAAS,UAAU,IAAI;AAAA,YACzB;AACA;AAAA,UACF;AAGA,cAAI,SAAS,WAAW,IAAI,EAAG;AAE/B,gBAAM,aAAa,kBAAkB,UAAU,OAAO,IAAI;AAC1D,cAAI,CAAC,iBAAAD,QAAK,WAAW,UAAU,EAAG;AAClC,gBAAM,UAAM,+BAAc,UAAU,EAAE;AACtC,cAAI,CAAC,SAAS,GAAG,GAAG;AAClB,qBAAS,GAAG,IAAI;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAEA,WAAK,SAAS;AAAA,QACZ,MAAM;AAAA,QACN,UAAU;AAAA,QACV,QAAQ,KAAK,UAAU,QAAQ;AAAA,MACjC,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAKA,SAAS,gBAAgB,IAAY,SAAmB,SAA4B;AAElF,QAAM,eAAe,WAAW,EAAE,EAAE,QAAQ,OAAO,GAAG;AAGtD,aAAW,WAAW,SAAS;AAC7B,QAAI,aAAa,cAAc,OAAO,GAAG;AACvC,aAAO;AAAA,IACT;AAAA,EACF;AAGA,aAAW,WAAW,SAAS;AAC7B,QAAI,aAAa,cAAc,OAAO,GAAG;AACvC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAMA,SAAS,aAAa,IAAY,SAA0B;AAE1D,MAAI,OAAO,QAAS,QAAO;AAG3B,MAAI,QAAQ,WAAW,KAAK,KAAK,QAAQ,WAAW,GAAG,GAAG;AACxD,UAAM,MAAM,QAAQ,QAAQ,YAAY,EAAE;AAC1C,QAAI,IAAI,WAAW,GAAG,GAAG;AAEvB,YAAM,SAAS,IAAI,QAAQ,OAAO,EAAE;AACpC,aAAO,GAAG,SAAS,MAAM;AAAA,IAC3B;AAAA,EACF;AAGA,QAAM,eAAe,QAClB,QAAQ,OAAO,KAAK,EACpB,QAAQ,SAAS,IAAI,EACrB,QAAQ,OAAO,OAAO;AAEzB,QAAM,QAAQ,IAAI,OAAO,IAAI,YAAY,GAAG;AAC5C,SAAO,MAAM,KAAK,EAAE;AACtB;AAKA,SAAS,WAAW,IAAoB;AACtC,QAAM,aAAa,GAAG,QAAQ,GAAG;AACjC,SAAO,eAAe,KAAK,KAAK,GAAG,MAAM,GAAG,UAAU;AACxD;AAEA,SAAS,sBACP,aACA,QACwB;AACxB,QAAM,oBAAoB,QAAQ,YAAY;AAC9C,QAAM,aAAa,QAAQ,WAAW,iBAAAA,QAAK,KAAK,OAAO,UAAU,MAAM,IAAI;AAE3E,MAAI,gBAAgB,OAAO;AACzB,WAAO,EAAE,SAAS,OAAO,YAAY,OAAO,KAAK,OAAU;AAAA,EAC7D;AAEA,MAAI,gBAAgB,QAAQ,gBAAgB,QAAW;AACrD,WAAO,EAAE,SAAS,MAAM,YAAY,mBAAmB,KAAK,WAAW;AAAA,EACzE;AAEA,SAAO;AAAA,IACL,SAAS,YAAY,WAAW;AAAA,IAChC,YAAY,YAAY,cAAc;AAAA,IACtC,KAAK,YAAY,OAAO;AAAA,EAC1B;AACF;AAEA,SAAS,kBAAkB,IAAY,MAAuB;AAC5D,MAAI,QAAQ,WAAW,EAAE;AACzB,MAAI,MAAM,WAAW,OAAO,GAAG;AAC7B,YAAQ,MAAM,MAAM,QAAQ,MAAM;AAAA,EACpC;AACA,MAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,QAAI;AACF,kBAAQ,+BAAc,KAAK;AAAA,IAC7B,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI,iBAAAA,QAAK,WAAW,KAAK,EAAG,QAAO,iBAAAA,QAAK,UAAU,KAAK;AACvD,MAAI,KAAM,QAAO,iBAAAA,QAAK,UAAU,iBAAAA,QAAK,QAAQ,MAAM,KAAK,CAAC;AACzD,SAAO,iBAAAA,QAAK,UAAU,iBAAAA,QAAK,QAAQ,KAAK,CAAC;AAC3C;AAEA,SAAS,aAAa,MAAc,UAA0B;AAC5D,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,SAAS,IAAK,QAAO,IAAI,QAAQ;AACrC,QAAM,aAAa,KAAK,SAAS,GAAG,IAAI,OAAO,GAAG,IAAI;AACtD,SAAO,GAAG,UAAU,GAAG,QAAQ;AACjC;AAOA,SAAS,iBAAiB,SAAuE;AAC/F,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,WAAO,QACJ,IAAI,WAAS;AACZ,UAAI,CAAC,SAAS,EAAE,UAAU,OAAQ,QAAO;AACzC,YAAM,cACJ,OAAO,MAAM,gBAAgB,WAAW,MAAM,cAAc,OAAO,MAAM,WAAW;AACtF,aAAO,EAAE,MAAM,MAAM,MAAM,YAAY;AAAA,IACzC,CAAC,EACA,OAAO,CAAC,UAA+B,CAAC,CAAC,KAAK;AAAA,EACnD;AACA,SAAO,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,WAAW,OAAO;AAAA,IAC3D;AAAA,IACA,aAAa,OAAO,gBAAgB,WAAW,cAAc,OAAO,WAAW;AAAA,EACjF,EAAE;AACJ;AAEA,SAAS,WAAW,QAAgB,SAAsC;AACxE,aAAW,SAAS,SAAS;AAC3B,QAAI,OAAO,MAAM,SAAS,UAAU;AAClC,UAAI,WAAW,MAAM,QAAQ,OAAO,WAAW,GAAG,MAAM,IAAI,GAAG,GAAG;AAChE,eAAO,MAAM,cAAc,OAAO,MAAM,MAAM,KAAK,MAAM;AAAA,MAC3D;AACA;AAAA,IACF;AACA,QAAI,MAAM,gBAAgB,UAAU,MAAM,KAAK,KAAK,MAAM,GAAG;AAC3D,aAAO,OAAO,QAAQ,MAAM,MAAM,MAAM,WAAW;AAAA,IACrD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAuB;AACzC,aAAO,+BAAW,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK;AACxD;AAEA,SAAS,gBAAgB,OAAwB;AAC/C,MAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAC/C,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,IAAI,MAAM,IAAI,eAAe,EAAE,KAAK,GAAG,CAAC;AAAA,EACjD;AAEA,QAAM,UAAU,OAAO,QAAQ,KAAgC,EAC5D,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,UAAa,OAAO,MAAM,UAAU,EAC5D,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAExC,QAAM,OAAO,QACV,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM,GAAG,KAAK,UAAU,GAAG,CAAC,IAAI,gBAAgB,GAAG,CAAC,EAAE,EACpE,KAAK,GAAG;AAEX,SAAO,IAAI,IAAI;AACjB;AAEA,SAAS,yBAAyB,SAAuD;AACvF,QAAM,aAAsC,CAAC;AAC7C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,QAAI,UAAU,UAAa,OAAO,UAAU,WAAY;AACxD,QAAI,QAAQ,cAAc;AACxB,YAAM,SAAS;AAIf,iBAAW,aAAa;AAAA,QACtB,gBAAgB,QAAQ;AAAA,QACxB,YAAY,QAAQ;AAAA,MACtB;AACA;AAAA,IACF;AACA,eAAW,GAAG,IAAI;AAAA,EACpB;AACA,SAAO;AACT;AAEA,SAAS,cACP,UACA,MACA,SACA,WACQ;AACR,QAAM,WAAW,WAAW,IAAI;AAChC,QAAM,cAAc,WAAW,gBAAgB,yBAAyB,OAAO,CAAC,CAAC;AACjF,QAAM,QAAQ,YAAY,GAAG,UAAU,UAAU,IAAI,UAAU,cAAc,KAAK;AAClF,SAAO,WAAW,CAAC,eAAe,UAAU,UAAU,aAAa,KAAK,EAAE,KAAK,GAAG,CAAC;AACrF;AAEA,IAAM,iBAAN,MAAqB;AAAA,EAGnB,YAAoB,SAAiC;AAAjC;AAFpB,SAAQ,SAAS,oBAAI,IAA6B;AAAA,EAEI;AAAA,EAEtD,IAAI,UAAmB;AACrB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,MAAM,IAAI,KAA8C;AACtD,QAAI,CAAC,KAAK,QAAQ,QAAS,QAAO;AAClC,UAAM,SAAS,KAAK,OAAO,IAAI,GAAG;AAClC,QAAI,OAAQ,QAAO;AAEnB,QAAI,CAAC,KAAK,QAAQ,cAAc,CAAC,KAAK,QAAQ,IAAK,QAAO;AAE1D,UAAM,WAAW,iBAAAA,QAAK,KAAK,KAAK,QAAQ,KAAK,GAAG,GAAG,OAAO;AAC1D,QAAI;AACF,YAAM,MAAM,MAAM,eAAAE,SAAG,SAAS,UAAU,MAAM;AAC9C,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAI,CAAC,UAAU,OAAO,OAAO,SAAS,SAAU,QAAO;AACvD,WAAK,OAAO,IAAI,KAAK,MAAM;AAC3B,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,KAAa,OAAuC;AAC5D,QAAI,CAAC,KAAK,QAAQ,QAAS;AAC3B,SAAK,OAAO,IAAI,KAAK,KAAK;AAC1B,QAAI,CAAC,KAAK,QAAQ,cAAc,CAAC,KAAK,QAAQ,IAAK;AAEnD,UAAM,WAAW,iBAAAF,QAAK,KAAK,KAAK,QAAQ,KAAK,GAAG,GAAG,OAAO;AAC1D,QAAI;AACF,YAAM,eAAAE,SAAG,MAAM,KAAK,QAAQ,KAAK,EAAE,WAAW,KAAK,CAAC;AACpD,YAAM,eAAAA,SAAG,UAAU,UAAU,KAAK,UAAU,KAAK,CAAC;AAAA,IACpD,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,QAAc;AACZ,SAAK,OAAO,MAAM;AAAA,EACpB;AACF;AAEA,SAAS,gBAAgB,OAAwC;AAC/D,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,YAAY;AAClB,SACE,OAAO,UAAU,mBAAmB,cACpC,OAAO,UAAU,mBAAmB,cACpC,OAAO,UAAU,+BAA+B,cAChD,OAAO,UAAU,0BAA0B,cAC3C,OAAO,UAAU,2BAA2B,cAC5C,OAAO,UAAU,sBAAsB,cACvC,CAAC,CAAC,UAAU,OACZ,OAAO,UAAU,QAAQ,YACzB,OAAO,UAAU,IAAI,eAAe,cACpC,OAAO,UAAU,IAAI,aAAa;AAEtC;AAEA,SAAS,gBAAgB,OAAwB;AAC/C,MAAI;AACF,WAAO,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,KAAK;AAAA,EACjE,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAEA,SAAS,YAAY,OAAwB;AAC3C,MAAI,iBAAiB,MAAO,QAAO,MAAM;AACzC,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAEA,SAAS,mBAAmB,SAAiB,MAAc,OAAwB;AACjF,SAAO,iBAAiB,OAAO,KAAK,IAAI,MAAM,YAAY,KAAK,CAAC;AAClE;AAEA,eAAe,iBAAgD;AAC7D,MAAI;AACF,UAAM,MAAM,MAAM,OAAO,YAAY;AACrC,UAAM,YAAa,IAA8B,WAAW;AAC5D,WAAO,gBAAgB,SAAS,IAAI,YAAY;AAAA,EAClD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,oBACP,IACA,SACA,cACe;AACf,MAAI,cAAc;AAChB,WAAO,iBAAAF,QAAK,QAAQ,SAAS,YAAY;AAAA,EAC3C;AACA,SAAO,GAAG,eAAe,SAAS,GAAG,IAAI,YAAY,eAAe,KAAK;AAC3E;AAEA,eAAe,wBACb,IACA,SACA,YACmC;AACnC,QAAM,aAAa,GAAG,IAAI,SAAS,UAAU;AAC7C,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,aAAa,WAAW,UAAU;AAExC,QAAM,aAAa,GAAG,eAAe,YAAY,GAAG,IAAI,QAAQ;AAChE,MAAI,WAAW,MAAO,QAAO;AAE7B,QAAM,SAAS,GAAG,2BAA2B,WAAW,QAAQ,GAAG,KAAK,iBAAAA,QAAK,QAAQ,UAAU,CAAC;AAEhG,QAAM,UAAU,IAAI,IAAY,OAAO,UAAU,IAAI,CAAC,SAAiB,iBAAAA,QAAK,UAAU,IAAI,CAAC,CAAC;AAC5F,QAAM,eAAe,oBAAI,IAAoB;AAC7C,QAAM,aAAa,oBAAI,IAAoB;AAC3C,QAAM,YAAY,oBAAI,IAAoB;AAC1C,MAAI,iBAAiB;AAErB,QAAM,gBAAgB,CAAC,aAAqB,kBAAkB,UAAU,OAAO;AAE/E,QAAM,cAA6C;AAAA,IACjD,oBAAoB,MAAM,MAAM,KAAK,OAAO;AAAA,IAC5C,kBAAkB,CAAC,aAAqB;AACtC,YAAM,aAAa,cAAc,QAAQ;AACzC,aAAO,OAAO,aAAa,IAAI,UAAU,KAAK,CAAC;AAAA,IACjD;AAAA,IACA,mBAAmB,CAAC,aAAqB;AACvC,YAAM,aAAa,cAAc,QAAQ;AACzC,YAAM,OAAO,UAAU,IAAI,UAAU,KAAK,GAAG,IAAI,SAAS,UAAU;AACpE,UAAI,SAAS,OAAW,QAAO;AAC/B,aAAO,GAAG,eAAe,WAAW,IAAI;AAAA,IAC1C;AAAA,IACA,qBAAqB,MAAM;AAAA,IAC3B,wBAAwB,MAAM,OAAO;AAAA,IACrC,uBAAuB,CAAC,YAAqB,GAAG,sBAAsB,OAAO;AAAA,IAC7E,YAAY,GAAG,IAAI;AAAA,IACnB,UAAU,GAAG,IAAI;AAAA,IACjB,eAAe,GAAG,IAAI;AAAA,IACtB,iBAAiB,GAAG,IAAI;AAAA,IACxB,gBAAgB,GAAG,IAAI;AAAA,IACvB,2BAA2B,MAAM,GAAG,IAAI;AAAA,IACxC,YAAY,MAAM,GAAG,IAAI;AAAA,IACzB,mBAAmB,MAAM,OAAO,cAAc;AAAA,EAChD;AAEA,QAAM,UAAU,GAAG,sBAAsB,aAAa,GAAG,uBAAuB,CAAC;AAEjF,QAAM,aAAa,CAAC,UAAkB,SAAiB;AACrD,UAAM,aAAa,cAAc,QAAQ;AACzC,UAAM,WAAW,WAAW,IAAI;AAChC,QAAI,WAAW,IAAI,UAAU,MAAM,SAAU;AAC7C,eAAW,IAAI,YAAY,QAAQ;AACnC,cAAU,IAAI,YAAY,IAAI;AAC9B,iBAAa,IAAI,aAAa,aAAa,IAAI,UAAU,KAAK,KAAK,CAAC;AACpE,YAAQ,IAAI,UAAU;AACtB,sBAAkB;AAAA,EACpB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,IAAI,iBAAiB;AACnB,aAAO;AAAA,IACT;AAAA,IACA;AAAA,IACA,YAAY,MAAM,QAAQ,aAAa,KAAK;AAAA,IAC5C,mBAAmB,CAAC,WAAmB,mBAA2B;AAChE,UAAI;AACF,cAAM,WAAW,GAAG,kBAAkB,WAAW,gBAAgB,OAAO,SAAS,GAAG,GAAG;AACvF,eAAO,UAAU,gBAAgB,oBAAoB;AAAA,MACvD,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,SAAS,MAAM,QAAQ,UAAU;AAAA,EACnC;AACF;AAUA,SAAS,eAAe,WAAmD;AACzE,QAAM,iBAAiB,UAAU,YAAY,IAAI;AACjD,MAAI,mBAAmB,IAAI;AACzB,WAAO,CAAC,WAAW,SAAS;AAAA,EAC9B;AACA,SAAO,CAAC,UAAU,MAAM,GAAG,cAAc,GAAG,UAAU,MAAM,iBAAiB,CAAC,CAAC;AACjF;AAMA,SAAS,gBAAgB,cAAsB,YAA4B;AACzE,SAAO,GAAG,YAAY,KAAK,UAAU;AACvC;AAOA,SAAS,sBAAsB,SAAmC;AAEhE,MAAI,CAAC,QAAQ,MAAM;AACjB,WAAO,YAAY,QAAQ,UAAU,uBAAuB,QAAQ,YAAY;AAAA;AAAA,EAClF;AAGA,QAAM,kBAAkB,oBAAI,IAAsB;AAElD,aAAW,cAAc,QAAQ,aAAa;AAC5C,UAAM,SAAS,gBAAgB,UAAU;AACzC,QAAI,CAAC,OAAQ;AAEb,UAAM,WAAW,gBAAgB,IAAI,OAAO,IAAI,KAAK,CAAC;AACtD,QAAI,CAAC,SAAS,SAAS,OAAO,MAAM,GAAG;AACrC,eAAS,KAAK,OAAO,MAAM;AAAA,IAC7B;AACA,oBAAgB,IAAI,OAAO,MAAM,QAAQ;AAAA,EAC3C;AAGA,QAAM,UAAoB,CAAC;AAC3B,aAAW,CAACG,SAAQ,KAAK,KAAK,iBAAiB;AAC7C,YAAQ,KAAK,YAAY,MAAM,KAAK,IAAI,CAAC,YAAYA,OAAM,IAAI;AAAA,EACjE;AAIA,MAAI,QAAQ,UAAU,SAAS,GAAG;AAChC,UAAM,aAAa,QAAQ,UAAU,IAAI,SAAO,GAAG,kBAAkB,GAAG,GAAG,OAAO,GAAG,EAAE;AACvF,YAAQ,KAAK,YAAY,WAAW,KAAK,IAAI,CAAC,YAAY,QAAQ,YAAY,IAAI;AAAA,EACpF;AAGA,SAAO,GAAG,QAAQ,KAAK,IAAI,CAAC,GAAG,QAAQ,SAAS,IAAI,SAAS,EAAE,kBAAkB,QAAQ,IAAI;AAAA;AAC/F;AAGA,IAAM,qBAAqB;AAKpB,SAAS,yBACd,cACA,YACA,aACA,MACA,YAAsB,CAAC,GACf;AACR,QAAM,YAAY,gBAAgB,cAAc,UAAU;AAC1D,oBAAkB,IAAI,WAAW;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,SAAO,GAAG,8BAA8B,GAAG,SAAS;AACtD;AAKA,IAAM,kBAAoE;AAAA,EACxE,uBAAuB,EAAE,QAAQ,yBAAyB,MAAM,2BAA2B;AAAA,EAC3F,qBAAqB,EAAE,QAAQ,uBAAuB,MAAM,2BAA2B;AAAA,EACvF,mBAAmB,EAAE,QAAQ,qBAAqB,MAAM,2BAA2B;AAAA,EACnF,mBAAmB,EAAE,QAAQ,qBAAqB,MAAM,2BAA2B;AAAA,EACnF,sBAAsB,EAAE,QAAQ,wBAAwB,MAAM,2BAA2B;AAAA,EACzF,mBAAmB,EAAE,QAAQ,qBAAqB,MAAM,2BAA2B;AAAA,EACnF,kBAAkB,EAAE,QAAQ,oBAAoB,MAAM,2BAA2B;AAAA,EACjF,kBAAkB,EAAE,QAAQ,oBAAoB,MAAM,2BAA2B;AAAA,EACjF,WAAW,EAAE,QAAQ,aAAa,MAAM,2BAA2B;AACrE;AAGA,IAAM,qBAAqB,oBAAI,IAAI;AAAA;AAAA,EAEjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMD,SAAS,6BAA6B,MAAc,eAAyC;AAC3F,QAAM,aAAa,oBAAI,IAAY;AAEnC,WAAS,UACP,SACA,QACA,KACM;AACN,QAAI,CAAC,QAAS;AAEd,QAAM,eAAa,OAAO,GAAG;AAC3B,YAAM,OAAO,QAAQ;AAGrB,UACE,UACE,qBAAmB,MAAM,KAC3B,OAAO,aAAa,WACpB,CAAC,OAAO,UACR;AACA;AAAA,MACF;AAGA,UAAI,UAAY,mBAAiB,MAAM,KAAK,OAAO,QAAQ,WAAW,CAAC,OAAO,UAAU;AACtF;AAAA,MACF;AAGA,UAAI,UAAY,uBAAqB,MAAM,KAAK,OAAO,OAAO,SAAS;AACrE;AAAA,MACF;AACA,UACE,WACG,wBAAsB,MAAM,KAAO,uBAAqB,MAAM,MACjE,OAAO,OAAO,SACd;AACA;AAAA,MACF;AAGA,UAAI,QAAQ,UAAU;AACpB;AAAA,MACF;AAGA,UAAI,UAAY,gBAAc,MAAM,KAAK,OAAO,UAAU,SAAS;AACjE;AAAA,MACF;AAGA,UAAI,cAAc,IAAI,IAAI,GAAG;AAC3B;AAAA,MACF;AAGA,UAAI,mBAAmB,IAAI,IAAI,GAAG;AAChC;AAAA,MACF;AAGA,UAAI,gBAAgB,IAAI,GAAG;AACzB;AAAA,MACF;AAEA,iBAAW,IAAI,IAAI;AACnB;AAAA,IACF;AAGA,eAAW,WAAW,OAAO,KAAK,OAAO,GAAG;AAE1C,UACE,YAAY,SACZ,YAAY,WACZ,YAAY,SACZ,YAAY,WACZ,YAAY,cACZ,YAAY,qBACZ,YAAY,sBACZ,YAAY,iBACZ;AACA;AAAA,MACF;AACA,YAAM,QAAS,QAA+C,OAAO;AACrE,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,mBAAW,QAAQ,OAAO;AACxB,cACE,QACA,OAAO,SAAS,YAChB,SAAS,QACT,UAAU,QACV,OAAQ,KAAiC,SAAS,UAClD;AACA,sBAAU,MAAgB,SAAS,OAAO;AAAA,UAC5C;AAAA,QACF;AAAA,MACF,WACE,SACA,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,OAAQ,MAAkC,SAAS,UACnD;AACA,kBAAU,OAAiB,SAAS,OAAO;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAEA,YAAU,MAAM,MAAM,IAAI;AAC1B,SAAO;AACT;AAMA,SAAS,qBAAqB,MAA2B;AACvD,QAAM,WAAW,oBAAI,IAAY;AAEjC,WAAS,UAAU,SAA0C;AAC3D,QAAI,CAAC,QAAS;AAGd,QAAM,uBAAqB,OAAO,GAAG;AACnC,UAAM,eAAa,QAAQ,EAAE,GAAG;AAC9B,iBAAS,IAAI,QAAQ,GAAG,IAAI;AAAA,MAC9B,WAAa,kBAAgB,QAAQ,EAAE,KAAO,iBAAe,QAAQ,EAAE,GAAG;AACxE,cAAM,QAAQ,0BAA0B,QAAQ,EAAE;AAClD,mBAAW,QAAQ,OAAO;AACxB,mBAAS,IAAI,IAAI;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAGA,QAAM,wBAAsB,OAAO,GAAG;AACpC,UAAI,QAAQ,IAAI;AACd,iBAAS,IAAI,QAAQ,GAAG,IAAI;AAAA,MAC9B;AACA,iBAAW,SAAS,QAAQ,QAAQ;AAClC,cAAM,QAAQ,0BAA0B,KAAK;AAC7C,mBAAW,QAAQ,OAAO;AACxB,mBAAS,IAAI,IAAI;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAGA,QAAM,uBAAqB,OAAO,GAAG;AACnC,iBAAW,SAAS,QAAQ,QAAQ;AAClC,cAAM,QAAQ,0BAA0B,KAAK;AAC7C,mBAAW,QAAQ,OAAO;AACxB,mBAAS,IAAI,IAAI;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAGA,QAAM,4BAA0B,OAAO,GAAG;AACxC,iBAAW,SAAS,QAAQ,QAAQ;AAClC,cAAM,QAAQ,0BAA0B,KAAK;AAC7C,mBAAW,QAAQ,OAAO;AACxB,mBAAS,IAAI,IAAI;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAGA,QAAM,gBAAc,OAAO,GAAG;AAC5B,UAAI,QAAQ,SAAW,eAAa,QAAQ,KAAK,GAAG;AAClD,iBAAS,IAAI,QAAQ,MAAM,IAAI;AAAA,MACjC;AAAA,IACF;AAGA,eAAW,WAAW,OAAO,KAAK,OAAO,GAAG;AAE1C,UACE,YAAY,SACZ,YAAY,WACZ,YAAY,SACZ,YAAY,WACZ,YAAY,cACZ,YAAY,qBACZ,YAAY,sBACZ,YAAY,iBACZ;AACA;AAAA,MACF;AACA,YAAM,QAAS,QAA+C,OAAO;AACrE,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,mBAAW,QAAQ,OAAO;AACxB,cACE,QACA,OAAO,SAAS,YAChB,SAAS,QACT,UAAU,QACV,OAAQ,KAAiC,SAAS,UAClD;AACA,sBAAU,IAAc;AAAA,UAC1B;AAAA,QACF;AAAA,MACF,WACE,SACA,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,OAAQ,MAAkC,SAAS,UACnD;AACA,kBAAU,KAAe;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,YAAU,IAAI;AAEd,SAAO;AACT;AAKA,SAAS,0BAA0B,SAA2C;AAC5E,QAAM,QAAkB,CAAC;AAEzB,MAAM,eAAa,OAAO,GAAG;AAC3B,UAAM,KAAK,QAAQ,IAAI;AAAA,EACzB,WAAa,kBAAgB,OAAO,GAAG;AACrC,eAAW,QAAQ,QAAQ,YAAY;AACrC,UAAM,mBAAiB,IAAI,KAAO,SAAO,KAAK,KAAK,GAAG;AACpD,cAAM,KAAK,GAAG,0BAA0B,KAAK,KAAK,CAAC;AAAA,MACrD,WAAa,gBAAc,IAAI,GAAG;AAChC,cAAM,KAAK,GAAG,0BAA0B,KAAK,QAAQ,CAAC;AAAA,MACxD;AAAA,IACF;AAAA,EACF,WAAa,iBAAe,OAAO,GAAG;AACpC,eAAW,WAAW,QAAQ,UAAU;AACtC,UAAI,SAAS;AACX,cAAM,KAAK,GAAG,0BAA0B,OAAO,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,EACF,WAAa,gBAAc,OAAO,GAAG;AACnC,UAAM,KAAK,GAAG,0BAA0B,QAAQ,QAAQ,CAAC;AAAA,EAC3D,WAAa,sBAAoB,OAAO,GAAG;AACzC,UAAM,KAAK,GAAG,0BAA0B,QAAQ,IAAI,CAAC;AAAA,EACvD;AAEA,SAAO;AACT;AAOA,SAAS,0BACP,MACA,cAC6C;AAC7C,MAAI;AAEJ,MAAI;AACF,cAAM,qBAAM,MAAM;AAAA,MAChB,YAAY;AAAA,MACZ,SAAS,CAAC,OAAO,YAAY;AAAA,IAC/B,CAAC;AAAA,EACH,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,uBAAuB,oBAAI,IAAY;AAC7C,QAAM,gBAAgB,oBAAI,IAAY;AAEtC,aAAW,QAAQ,IAAI,QAAQ,MAAM;AAEnC,QAAM,sBAAoB,IAAI,GAAG;AAC/B,iBAAW,aAAa,KAAK,YAAY;AACvC,YAAM,oBAAkB,SAAS,KAAO,2BAAyB,SAAS,GAAG;AAC3E,wBAAc,IAAI,UAAU,MAAM,IAAI;AAAA,QACxC,WAAa,6BAA2B,SAAS,GAAG;AAClD,wBAAc,IAAI,UAAU,MAAM,IAAI;AAAA,QACxC;AAAA,MACF;AACA;AAAA,IACF;AAGA,QAAM,wBAAsB,IAAI,KAAK,KAAK,IAAI;AAC5C,2BAAqB,IAAI,KAAK,GAAG,IAAI;AACrC;AAAA,IACF;AAGA,QAAM,wBAAsB,IAAI,GAAG;AACjC,iBAAW,cAAc,KAAK,cAAc;AAC1C,YAAM,eAAa,WAAW,EAAE,GAAG;AACjC,+BAAqB,IAAI,WAAW,GAAG,IAAI;AAAA,QAC7C;AAAA,MACF;AACA;AAAA,IACF;AAGA,QAAM,qBAAmB,IAAI,KAAK,KAAK,IAAI;AACzC,2BAAqB,IAAI,KAAK,GAAG,IAAI;AACrC;AAAA,IACF;AAGA,QAAM,2BAAyB,IAAI,KAAK,KAAK,aAAa;AACxD,UAAM,wBAAsB,KAAK,WAAW,KAAK,KAAK,YAAY,IAAI;AACpE,6BAAqB,IAAI,KAAK,YAAY,GAAG,IAAI;AAAA,MACnD,WAAa,wBAAsB,KAAK,WAAW,GAAG;AACpD,mBAAW,cAAc,KAAK,YAAY,cAAc;AACtD,cAAM,eAAa,WAAW,EAAE,GAAG;AACjC,iCAAqB,IAAI,WAAW,GAAG,IAAI;AAAA,UAC7C;AAAA,QACF;AAAA,MACF,WAAa,qBAAmB,KAAK,WAAW,KAAK,KAAK,YAAY,IAAI;AACxE,6BAAqB,IAAI,KAAK,YAAY,GAAG,IAAI;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAGA,aAAW,QAAQ,eAAe;AAChC,yBAAqB,IAAI,IAAI;AAAA,EAC/B;AAEA,QAAM,eAAyB,CAAC;AAChC,QAAM,gBAAgB,oBAAI,IAAY;AACtC,QAAM,eAAe,oBAAI,IAAY;AAGrC,WAAS,KAAK;AAAA,IACZ,uBAAuBH,OAAM;AAC3B,YAAM,cAAcA,MAAK,KAAK;AAG9B,UAAM,wBAAsB,WAAW,GAAG;AACxC,mBAAW,cAAc,YAAY,cAAc;AACjD,cAAI,CAAG,eAAa,WAAW,EAAE,EAAG;AAEpC,gBAAM,OAAO,WAAW,GAAG;AAG3B,cAAI,CAAC,KAAK,MAAM,eAAe,EAAG;AAElC,cAAI,CAAC,WAAW,KAAM;AAEtB,uBAAa,KAAK,IAAI;AAGtB,gBAAM,cAAc,SAAS,WAAW,IAAI,EAAE;AAG9C,gBAAM,cAAwB,CAAC;AAC/B,qBAAW,cAAc,OAAO,KAAK,eAAe,GAAG;AACrD,gBAAI,YAAY,SAAS,UAAU,GAAG;AACpC,0BAAY,KAAK,UAAU;AAAA,YAC7B;AAAA,UACF;AAGA,gBAAM,gBAAgB,qBAAqB,WAAW,IAAI;AAC1D,gBAAM,gBAAgB,6BAA6B,WAAW,MAAM,aAAa;AACjF,gBAAM,YAAsB,CAAC;AAC7B,qBAAW,OAAO,eAAe;AAE/B,gBAAI,qBAAqB,IAAI,GAAG,KAAK,CAAC,IAAI,MAAM,kBAAkB,GAAG;AACnE,wBAAU,KAAK,GAAG;AAClB,2BAAa,IAAI,GAAG;AAAA,YACtB;AAAA,UACF;AAGA,gBAAM,YAAY,gBAAgB,cAAc,IAAI;AACpD,4BAAkB,IAAI,WAAW;AAAA,YAC/B;AAAA,YACA,YAAY;AAAA,YACZ;AAAA,YACA;AAAA,YACA,MAAM;AAAA,UACR,CAAC;AAGD,wBAAc,IAAIA,MAAK,IAAI;AAAA,QAC7B;AACA;AAAA,MACF;AAGA,UAAM,wBAAsB,WAAW,KAAK,YAAY,IAAI;AAC1D,cAAM,OAAO,YAAY,GAAG;AAG5B,YAAI,CAAC,KAAK,MAAM,eAAe,EAAG;AAElC,qBAAa,KAAK,IAAI;AAGtB,cAAM,SAAS,YAAY;AAC3B,cAAM,OAAO,YAAY;AACzB,cAAM,UAAY,0BAAwB,QAAQ,MAAM,YAAY,KAAK;AAGzE,cAAM,cAAc,SAAS,OAAO,EAAE;AAGtC,cAAM,cAAwB,CAAC;AAC/B,mBAAW,cAAc,OAAO,KAAK,eAAe,GAAG;AACrD,cAAI,YAAY,SAAS,UAAU,GAAG;AACpC,wBAAY,KAAK,UAAU;AAAA,UAC7B;AAAA,QACF;AAGA,cAAM,gBAAgB,qBAAqB,OAAO;AAClD,cAAM,gBAAgB,6BAA6B,SAAS,aAAa;AACzE,cAAM,YAAsB,CAAC;AAC7B,mBAAW,OAAO,eAAe;AAE/B,cAAI,qBAAqB,IAAI,GAAG,KAAK,CAAC,IAAI,MAAM,kBAAkB,GAAG;AACnE,sBAAU,KAAK,GAAG;AAClB,yBAAa,IAAI,GAAG;AAAA,UACtB;AAAA,QACF;AAGA,cAAM,YAAY,gBAAgB,cAAc,IAAI;AACpD,0BAAkB,IAAI,WAAW;AAAA,UAC/B;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,UACA;AAAA,UACA,MAAM;AAAA,QACR,CAAC;AAGD,sBAAc,IAAIA,MAAK,IAAI;AAAA,MAC7B;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO;AAAA,EACT;AAGA,WAAS,KAAK;AAAA,IACZ,uBAAuBA,OAAM;AAC3B,UAAI,cAAc,IAAIA,MAAK,IAAI,GAAG;AAChC,QAAAA,MAAK,OAAO;AAAA,MACd;AAAA,IACF;AAAA,IAEA,eAAeA,OAAM;AAEnB,UAAI,CAAG,eAAaA,MAAK,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC,EAAG;AAC9D,UAAIA,MAAK,KAAK,UAAU,WAAW,EAAG;AAEtC,YAAM,YAAYA,MAAK,KAAK,UAAU,CAAC;AACvC,UAAI,CAAG,kBAAgB,SAAS,EAAG;AAEnC,YAAM,cAAc,UAAU;AAC9B,UAAI,CAAC,aAAa,SAAS,WAAW,EAAG;AAGzC,YAAM,YAAY,gBAAgB,cAAc,WAAW;AAC3D,YAAM,aAAa,GAAG,8BAA8B,GAAG,SAAS;AAChE,MAAAA,MAAK,YAAc,gBAAc,UAAU,CAAC;AAAA,IAC9C;AAAA,EACF,CAAC;AAID,MAAI,aAAa,OAAO,GAAG;AACzB,UAAM,YAAiC,CAAC;AACxC,eAAW,OAAO,cAAc;AAE9B,gBAAU;AAAA,QACN,kBAAkB,aAAW,GAAG,GAAK,aAAW,GAAG,kBAAkB,GAAG,GAAG,EAAE,CAAC;AAAA,MAClF;AAAA,IACF;AACA,QAAI,QAAQ,KAAK,KAAO,yBAAuB,MAAM,SAAS,CAAC;AAAA,EACjE;AAGA,QAAM,SAAS,SAAS,KAAK;AAAA,IAC3B,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AAED,SAAO,EAAE,MAAM,OAAO,MAAM,UAAU,aAAa;AACrD;","names":["_traverse","_generate","include","exclude","path","tsProject","fs","module"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { createHash } from 'node:crypto'\nimport { promises as fs } from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\n\nimport { transformAsync } from '@babel/core'\nimport _generate from '@babel/generator'\nimport { parse } from '@babel/parser'\nimport _traverse from '@babel/traverse'\nimport * as t from '@babel/types'\nimport { createFictPlugin, type FictCompilerOptions } from '@fictjs/compiler'\nimport type { Plugin, ResolvedConfig, TransformResult } from 'vite'\n\n// Handle ESM/CJS interop for Babel packages\nconst traverse = (\n typeof _traverse === 'function' ? _traverse : (_traverse as { default: typeof _traverse }).default\n) as typeof _traverse\nconst generate = (\n typeof _generate === 'function' ? _generate : (_generate as { default: typeof _generate }).default\n) as typeof _generate\n\nexport interface FictPluginOptions extends FictCompilerOptions {\n /**\n * File patterns to include for transformation.\n * @default ['**\\/*.tsx', '**\\/*.jsx']\n */\n include?: string[]\n /**\n * File patterns to exclude from transformation.\n * @default ['**\\/node_modules\\/**']\n */\n exclude?: string[]\n /**\n * Transform cache settings (memory + optional persistent disk cache).\n * Set to false to disable caching entirely.\n */\n cache?:\n | boolean\n | {\n enabled?: boolean\n persistent?: boolean\n dir?: string\n }\n /**\n * Explicit tsconfig path for TypeScript project integration.\n * If omitted, the plugin will search from Vite root.\n */\n tsconfigPath?: string\n /**\n * Enable TypeScript project integration when TypeScript is available.\n * @default true\n */\n useTypeScriptProject?: boolean\n /**\n * Enable function-level code splitting for resumable handlers.\n * When enabled, event handlers and resume functions are extracted\n * to separate chunks for optimal lazy loading.\n * @default false for dev, true for production build\n */\n functionSplitting?: boolean\n /**\n * Enable verbose debug logs from the plugin.\n * Can also be enabled via `FICT_VITE_PLUGIN_DEBUG=1`.\n * @default false\n */\n debug?: boolean\n}\n\ninterface NormalizedCacheOptions {\n enabled: boolean\n persistent: boolean\n dir?: string\n}\n\ninterface CachedTransform {\n code: string\n map: TransformResult['map']\n}\n\ninterface TypeScriptProject {\n configPath: string\n configHash: string\n readonly projectVersion: number\n updateFile: (fileName: string, code: string) => void\n getProgram: () => TypeScriptProgram | null\n resolveModuleName: (specifier: string, containingFile: string) => string | null\n dispose: () => void\n}\n\ninterface TypeScriptProgram {\n getTypeChecker?: () => unknown\n}\n\ninterface TypeScriptSystem {\n fileExists: (path: string) => boolean\n readFile: (path: string) => string | undefined\n readDirectory: (...args: unknown[]) => string[]\n directoryExists?: (path: string) => boolean\n getDirectories?: (path: string) => string[]\n useCaseSensitiveFileNames: boolean\n newLine: string\n}\n\ninterface TypeScriptParsedConfig {\n fileNames: string[]\n options: unknown\n}\n\ninterface TypeScriptLanguageService {\n getProgram?: () => TypeScriptProgram | null\n dispose?: () => void\n}\n\ninterface TypeScriptLanguageServiceHost {\n getScriptFileNames: () => string[]\n getScriptVersion: (fileName: string) => string\n getScriptSnapshot: (fileName: string) => unknown\n getCurrentDirectory: () => string\n getCompilationSettings: () => unknown\n getDefaultLibFileName: (options: unknown) => string\n fileExists: TypeScriptSystem['fileExists']\n readFile: TypeScriptSystem['readFile']\n readDirectory: TypeScriptSystem['readDirectory']\n directoryExists?: TypeScriptSystem['directoryExists']\n getDirectories?: TypeScriptSystem['getDirectories']\n useCaseSensitiveFileNames: () => boolean\n getNewLine: () => string\n getProjectVersion: () => string\n}\n\ninterface TypeScriptApi {\n sys: TypeScriptSystem\n findConfigFile: (\n searchPath: string,\n fileExists: TypeScriptSystem['fileExists'],\n configName: string,\n ) => string | undefined\n readConfigFile: (\n configPath: string,\n readFile: TypeScriptSystem['readFile'],\n ) => { config: unknown; error?: unknown }\n parseJsonConfigFileContent: (\n config: unknown,\n host: TypeScriptSystem,\n basePath: string,\n ) => TypeScriptParsedConfig\n ScriptSnapshot: {\n fromString: (text: string) => unknown\n }\n getDefaultLibFilePath: (options: unknown) => string\n createLanguageService: (\n host: TypeScriptLanguageServiceHost,\n registry: unknown,\n ) => TypeScriptLanguageService\n createDocumentRegistry: () => unknown\n resolveModuleName: (\n specifier: string,\n containingFile: string,\n options: unknown,\n host: TypeScriptSystem,\n ) => { resolvedModule?: { resolvedFileName?: string } } | undefined\n}\n\nconst CACHE_VERSION = 1\nconst MODULE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.mts', '.cts']\n\n// Virtual module prefix for extracted handlers\nconst VIRTUAL_HANDLER_PREFIX = '\\0fict-handler:'\nconst VIRTUAL_HANDLER_RESOLVE_PREFIX = 'virtual:fict-handler:'\n\n/**\n * Information about an extracted resumable handler\n */\ninterface ExtractedHandler {\n /** The module this handler was extracted from */\n sourceModule: string\n /** The export name in the source module */\n exportName: string\n /** Runtime helpers used by this handler */\n helpersUsed: string[]\n /** Local dependencies from source module that need to be re-exported */\n localDeps: string[]\n /** The handler function code (without export) */\n code: string\n}\n\n/**\n * Registry for extracted handlers during compilation\n */\nconst extractedHandlers = new Map<string, ExtractedHandler>()\n\n/**\n * Vite plugin for Fict reactive UI library.\n *\n * Transforms $state and $effect calls into reactive signals using the Fict compiler.\n *\n * @example\n * ```ts\n * // vite.config.ts\n * import { defineConfig } from 'vite'\n * import fict from '@fictjs/vite-plugin'\n *\n * export default defineConfig({\n * plugins: [fict()],\n * })\n * ```\n */\nexport default function fict(options: FictPluginOptions = {}): Plugin {\n const {\n include = ['**/*.tsx', '**/*.jsx'],\n exclude = ['**/node_modules/**'],\n cache: cacheOption,\n tsconfigPath,\n useTypeScriptProject = true,\n debug: debugOption,\n ...compilerOptions\n } = options\n\n let config: ResolvedConfig | undefined\n let isDev = false\n let cache: TransformCache | null = null\n let tsProject: TypeScriptProject | null = null\n let tsProjectInit: Promise<TypeScriptProject | null> | null = null\n const moduleMetadata: FictCompilerOptions['moduleMetadata'] = new Map()\n const debugEnabled =\n debugOption === true ||\n process.env.FICT_VITE_PLUGIN_DEBUG === '1' ||\n process.env.FICT_VITE_PLUGIN_DEBUG === 'true'\n\n const debugLog = (message: string, details?: unknown) => {\n if (!debugEnabled) return\n const payload = details === undefined ? '' : ` ${safeDebugString(details)}`\n config?.logger?.info(`[fict-plugin] ${message}${payload}`)\n }\n\n const ensureCache = () => {\n if (cache) return cache\n const normalized = normalizeCacheOptions(cacheOption, config)\n cache = new TransformCache(normalized)\n return cache\n }\n\n const resetCache = () => {\n cache?.clear()\n cache = null\n }\n\n const ensureTypeScriptProject = async () => {\n if (!useTypeScriptProject) return null\n if (tsProject) return tsProject\n if (!tsProjectInit) {\n tsProjectInit = (async () => {\n const ts = await loadTypeScript()\n if (!ts) return null\n const rootDir = config?.root ?? process.cwd()\n const resolvedConfigPath = resolveTsconfigPath(ts, rootDir, tsconfigPath)\n if (!resolvedConfigPath) return null\n return createTypeScriptProject(ts, rootDir, resolvedConfigPath)\n })()\n }\n tsProject = await tsProjectInit\n return tsProject\n }\n\n const resetTypeScriptProject = () => {\n if (tsProject) {\n tsProject.dispose()\n }\n tsProject = null\n tsProjectInit = null\n }\n\n return {\n name: 'vite-plugin-fict',\n\n enforce: 'pre',\n\n configResolved(resolvedConfig) {\n config = resolvedConfig\n isDev = config.command === 'serve' || config.mode === 'development'\n // Rebuild cache with resolved config so cacheDir is available\n resetCache()\n // Clear extracted handlers from previous builds\n extractedHandlers.clear()\n },\n\n resolveId(id: string) {\n // Handle virtual handler modules\n if (id.startsWith(VIRTUAL_HANDLER_RESOLVE_PREFIX)) {\n return VIRTUAL_HANDLER_PREFIX + id.slice(VIRTUAL_HANDLER_RESOLVE_PREFIX.length)\n }\n return null\n },\n\n load(id: string) {\n // Load virtual handler modules\n if (!id.startsWith(VIRTUAL_HANDLER_PREFIX)) {\n return null\n }\n\n const handlerId = id.slice(VIRTUAL_HANDLER_PREFIX.length)\n debugLog(`Loading virtual module: ${handlerId}`, {\n registrySize: extractedHandlers.size,\n handlers: Array.from(extractedHandlers.keys()),\n })\n const handler = extractedHandlers.get(handlerId)\n if (handler) {\n const generatedCode = generateHandlerModule(handler)\n debugLog(`Generated virtual module (${generatedCode.length} chars)`, {\n preview: generatedCode.slice(0, 200),\n })\n return generatedCode\n }\n\n if (!handler) {\n // In dev mode or when splitting is disabled, the handler is still in the main module\n // Generate a re-export from the source module\n const [sourceModule, exportName] = parseHandlerId(handlerId)\n if (sourceModule && exportName) {\n return `export { ${exportName} as default } from '${sourceModule}'`\n }\n return null\n }\n\n // Generate the virtual module with the handler code\n return generateHandlerModule(handler)\n },\n\n config(userConfig, env) {\n const userOptimize = userConfig.optimizeDeps\n const hasUserOptimize = !!userOptimize\n const hasDisabledOptimize =\n hasUserOptimize && (userOptimize as { disabled?: boolean }).disabled === true\n\n const include = new Set(userOptimize?.include ?? [])\n const exclude = new Set(userOptimize?.exclude ?? [])\n const dedupe = new Set((userConfig.resolve?.dedupe ?? []) as string[])\n\n // Avoid duplicate runtime instances between pre-bundled deps and /@fs modules.\n // Exclude all workspace packages from prebundling to ensure changes take effect\n // immediately without requiring node_modules reinstall.\n const workspaceDeps = [\n 'fict',\n 'fict/plus',\n 'fict/advanced',\n 'fict/slim',\n 'fict/jsx-runtime',\n 'fict/jsx-dev-runtime',\n '@fictjs/runtime',\n '@fictjs/runtime/internal',\n '@fictjs/runtime/advanced',\n '@fictjs/runtime/jsx-runtime',\n '@fictjs/runtime/jsx-dev-runtime',\n '@fictjs/compiler',\n '@fictjs/devtools',\n '@fictjs/devtools/core',\n '@fictjs/devtools/vite',\n '@fictjs/router',\n '@fictjs/ssr',\n '@fictjs/testing-library',\n ]\n for (const dep of workspaceDeps) {\n include.delete(dep)\n exclude.add(dep)\n }\n // Only dedupe core runtime packages to avoid duplicate instances\n const dedupePackages = ['fict', '@fictjs/runtime', '@fictjs/runtime/internal']\n for (const dep of dedupePackages) {\n dedupe.add(dep)\n }\n\n // Determine if we're in dev mode based on command or mode\n const devMode = env.command === 'serve' || env.mode === 'development'\n\n return {\n // Define __DEV__ for runtime devtools support\n // In dev mode, enable devtools; in production, disable them for smaller bundles\n define: {\n __DEV__: String(devMode),\n ...(userConfig.define ?? {}),\n },\n esbuild: {\n // Disable esbuild JSX handling for .tsx/.jsx files\n // Our plugin will handle the full transformation\n include: /\\.(ts|js|mts|mjs|cjs)$/,\n },\n build: {\n rollupOptions: {\n // Preserve exports in entry chunks to prevent tree-shaking of handler exports\n preserveEntrySignatures: 'exports-only',\n },\n },\n resolve: {\n ...(userConfig.resolve ?? {}),\n dedupe: Array.from(dedupe),\n },\n // Watch workspace packages dist directories for changes in dev mode\n // This ensures HMR picks up rebuilt packages without needing to restart\n server: {\n watch: {\n ignored: ['!**/node_modules/@fictjs/**', '!**/node_modules/fict/**'],\n },\n },\n ...(hasDisabledOptimize\n ? { optimizeDeps: userOptimize }\n : {\n optimizeDeps: hasUserOptimize\n ? { ...userOptimize, include: Array.from(include), exclude: Array.from(exclude) }\n : { exclude: workspaceDeps },\n }),\n }\n },\n\n async transform(code: string, id: string): Promise<TransformResult | null> {\n const filename = stripQuery(id)\n\n // Skip non-matching files\n if (!shouldTransform(filename, include, exclude)) {\n return null\n }\n\n const aliasEntries = normalizeAliases(config?.resolve?.alias)\n const fictOptions: FictCompilerOptions = {\n ...compilerOptions,\n dev: compilerOptions.dev ?? isDev,\n sourcemap: compilerOptions.sourcemap ?? true,\n filename,\n moduleMetadata,\n resolveModuleMetadata: (source, importer) => {\n const userResolved = compilerOptions.resolveModuleMetadata?.(source, importer)\n if (userResolved) return userResolved\n if (!importer) return undefined\n\n const importerFile = normalizeFileName(importer, config?.root)\n const lookupMetadata = (resolved: string) => {\n const direct = moduleMetadata.get(resolved)\n if (direct) return direct\n const ext = path.extname(resolved)\n if (!ext) {\n for (const suffix of MODULE_EXTENSIONS) {\n const byExt = moduleMetadata.get(`${resolved}${suffix}`)\n if (byExt) return byExt\n }\n for (const suffix of MODULE_EXTENSIONS) {\n const byIndex = moduleMetadata.get(path.join(resolved, `index${suffix}`))\n if (byIndex) return byIndex\n }\n }\n return undefined\n }\n let resolvedSource: string | null = null\n\n if (path.isAbsolute(source)) {\n resolvedSource = normalizeFileName(source, config?.root)\n } else if (source.startsWith('.')) {\n resolvedSource = normalizeFileName(\n path.resolve(path.dirname(importerFile), source),\n config?.root,\n )\n } else {\n const aliased = applyAlias(source, aliasEntries)\n if (aliased) {\n if (path.isAbsolute(aliased)) {\n resolvedSource = normalizeFileName(aliased, config?.root)\n } else if (aliased.startsWith('.')) {\n resolvedSource = normalizeFileName(\n path.resolve(path.dirname(importerFile), aliased),\n config?.root,\n )\n } else if (config?.root) {\n resolvedSource = normalizeFileName(path.resolve(config.root, aliased), config?.root)\n }\n } else if (tsProject) {\n const tsResolved = tsProject.resolveModuleName(source, importerFile)\n if (tsResolved) {\n resolvedSource = normalizeFileName(tsResolved, config?.root)\n }\n }\n }\n\n if (!resolvedSource) return undefined\n return lookupMetadata(resolvedSource)\n },\n }\n\n const tsProject = await ensureTypeScriptProject()\n if (tsProject) {\n const resolvedName = normalizeFileName(filename, config?.root)\n tsProject.updateFile(resolvedName, code)\n const program = tsProject.getProgram()\n const checker =\n program && typeof program.getTypeChecker === 'function'\n ? program.getTypeChecker()\n : undefined\n fictOptions.typescript = {\n program: program ?? undefined,\n checker,\n projectVersion: tsProject.projectVersion,\n configPath: tsProject.configPath,\n }\n }\n\n const cacheStore = ensureCache()\n const cacheKey = cacheStore.enabled\n ? buildCacheKey(filename, code, fictOptions, tsProject)\n : null\n\n if (cacheKey) {\n const cached = await cacheStore.get(cacheKey)\n if (cached) {\n return cached\n }\n }\n\n try {\n const precompiledInput = isPrecompiledFictModule(code)\n let finalCode: string\n let finalMap: TransformResult['map']\n\n if (precompiledInput) {\n finalCode = code\n finalMap = null\n } else {\n const isTypeScript = filename.endsWith('.tsx') || filename.endsWith('.ts')\n\n const result = await transformAsync(code, {\n filename,\n sourceMaps: fictOptions.sourcemap,\n sourceFileName: filename,\n presets: isTypeScript\n ? [['@babel/preset-typescript', { isTSX: true, allExtensions: true }]]\n : [],\n plugins: [\n ['@babel/plugin-syntax-jsx', {}],\n [createFictPlugin, fictOptions],\n ],\n })\n\n if (!result || !result.code) {\n return null\n }\n\n finalCode = result.code\n finalMap = result.map as TransformResult['map']\n }\n\n // Apply function-level code splitting in production builds\n // For SSR builds with resumable enabled, we also need to rewrite QRLs to virtual URLs\n // so they match the manifest generated by the client build\n const shouldSplit =\n options.functionSplitting ??\n (config?.command === 'build' && (compilerOptions.resumable || !config?.build?.ssr))\n\n debugLog('Function split decision', {\n shouldSplit,\n ssr: config?.build?.ssr,\n resumable: compilerOptions.resumable,\n file: filename,\n })\n if (shouldSplit) {\n let splitResult: { code: string; handlers: string[] } | null = null\n try {\n splitResult = extractAndRewriteHandlers(finalCode, filename)\n } catch (error) {\n this.warn(buildPluginMessage('extractAndRewriteHandlers failed', filename, error))\n }\n debugLog('Split result', {\n file: filename,\n handlers: splitResult?.handlers.length ?? 0,\n })\n if (splitResult) {\n debugLog(`Function splitting extracted ${splitResult.handlers.length} handlers`, {\n file: filename,\n })\n finalCode = splitResult.code\n // Note: source maps are invalidated by this rewrite\n // For production builds, this is acceptable\n finalMap = null\n\n // Emit each extracted handler as a separate chunk for lazy loading\n // This ensures the virtual modules are included in the build\n if (config?.command === 'build' && !config?.build?.ssr) {\n for (const handlerName of splitResult.handlers) {\n const handlerId = createHandlerId(filename, handlerName)\n const virtualModuleId = `${VIRTUAL_HANDLER_RESOLVE_PREFIX}${handlerId}`\n this.emitFile({\n type: 'chunk',\n id: virtualModuleId,\n name: `handler-${handlerName}`,\n })\n }\n }\n }\n }\n\n const transformed: TransformResult = {\n code: finalCode,\n map: finalMap,\n }\n\n if (cacheKey) {\n await cacheStore.set(cacheKey, transformed)\n }\n\n return transformed\n } catch (error) {\n // Better error handling\n const message =\n error instanceof Error ? error.message : 'Unknown error during Fict transformation'\n\n this.error({\n message: `[fict] Transform failed for ${id}: ${message}`,\n id,\n })\n\n return null\n }\n },\n\n handleHotUpdate({ file, server }) {\n if (tsProject && file === tsProject.configPath) {\n resetTypeScriptProject()\n resetCache()\n }\n\n // Force full reload for .tsx/.jsx files to ensure reactive graph is rebuilt\n if (shouldTransform(file, include, exclude)) {\n server.ws.send({\n type: 'full-reload',\n path: '*',\n })\n }\n },\n\n generateBundle(_options, bundle) {\n if (!config || config.command !== 'build') return\n if (config.build.ssr) return\n\n const base = config.base ?? '/'\n const manifest: Record<string, string> = {}\n\n for (const output of Object.values(bundle)) {\n if (output.type !== 'chunk') continue\n const fileName = output.fileName\n const url = joinBasePath(base, fileName)\n for (const moduleId of Object.keys(output.modules)) {\n if (!moduleId) continue\n\n // Handle virtual handler modules\n if (moduleId.startsWith(VIRTUAL_HANDLER_PREFIX)) {\n const handlerId = moduleId.slice(VIRTUAL_HANDLER_PREFIX.length)\n // Map the virtual module resolve prefix to the chunk URL\n const virtualKey = `${VIRTUAL_HANDLER_RESOLVE_PREFIX}${handlerId}`\n if (!manifest[virtualKey]) {\n manifest[virtualKey] = url\n }\n continue\n }\n\n // Skip other virtual modules\n if (moduleId.startsWith('\\0')) continue\n\n const normalized = normalizeFileName(moduleId, config.root)\n if (!path.isAbsolute(normalized)) continue\n const key = pathToFileURL(normalized).href\n if (!manifest[key]) {\n manifest[key] = url\n }\n }\n }\n\n this.emitFile({\n type: 'asset',\n fileName: 'fict.manifest.json',\n source: JSON.stringify(manifest),\n })\n },\n }\n}\n\n/**\n * Check if a file should be transformed based on include/exclude patterns\n */\nfunction shouldTransform(id: string, include: string[], exclude: string[]): boolean {\n // Normalize path separators\n const normalizedId = stripQuery(id).replace(/\\\\/g, '/')\n\n // Check exclude patterns first\n for (const pattern of exclude) {\n if (matchPattern(normalizedId, pattern)) {\n return false\n }\n }\n\n // Check include patterns\n for (const pattern of include) {\n if (matchPattern(normalizedId, pattern)) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * Simple glob pattern matching\n * Supports: **\\/*.ext, *.ext, exact matches\n */\nfunction matchPattern(id: string, pattern: string): boolean {\n // Exact match\n if (id === pattern) return true\n\n // Simple check: if pattern ends with extension like *.tsx, just check if file ends with it\n if (pattern.startsWith('**/') || pattern.startsWith('*')) {\n const ext = pattern.replace(/^\\*\\*?\\//, '')\n if (ext.startsWith('*')) {\n // **/*.tsx -> check if ends with .tsx\n const ending = ext.replace(/^\\*/, '')\n return id.endsWith(ending)\n }\n }\n\n // Convert glob pattern to regex\n const regexPattern = pattern\n .replace(/\\./g, '\\\\.') // Escape dots\n .replace(/\\*\\*/g, '.*') // ** matches any path\n .replace(/\\*/g, '[^/]*') // * matches any non-slash\n\n const regex = new RegExp(`^${regexPattern}$`)\n return regex.test(id)\n}\n\n/**\n * Remove Vite query parameters (e.g. ?import, ?v=123) from an id\n */\nfunction stripQuery(id: string): string {\n const queryStart = id.indexOf('?')\n return queryStart === -1 ? id : id.slice(0, queryStart)\n}\n\nfunction normalizeCacheOptions(\n cacheOption: FictPluginOptions['cache'],\n config?: ResolvedConfig,\n): NormalizedCacheOptions {\n const defaultPersistent = config?.command === 'build'\n const defaultDir = config?.cacheDir ? path.join(config.cacheDir, 'fict') : undefined\n\n if (cacheOption === false) {\n return { enabled: false, persistent: false, dir: undefined }\n }\n\n if (cacheOption === true || cacheOption === undefined) {\n return { enabled: true, persistent: defaultPersistent, dir: defaultDir }\n }\n\n return {\n enabled: cacheOption.enabled ?? true,\n persistent: cacheOption.persistent ?? defaultPersistent,\n dir: cacheOption.dir ?? defaultDir,\n }\n}\n\nfunction normalizeFileName(id: string, root?: string): string {\n let clean = stripQuery(id)\n if (clean.startsWith('/@fs/')) {\n clean = clean.slice('/@fs/'.length)\n }\n if (clean.startsWith('file://')) {\n try {\n clean = fileURLToPath(clean)\n } catch {\n // fall through\n }\n }\n if (path.isAbsolute(clean)) return path.normalize(clean)\n if (root) return path.normalize(path.resolve(root, clean))\n return path.normalize(path.resolve(clean))\n}\n\n/**\n * Detect modules that already contain compiler output.\n * Re-running the compiler on these inputs can produce false diagnostics.\n */\nfunction isPrecompiledFictModule(code: string): boolean {\n const hasCompilerMarker =\n code.includes('__fict_hir_codegen__') ||\n code.includes('__fictQrl(') ||\n code.includes('__fictUseLexicalScope')\n\n if (!hasCompilerMarker) {\n return false\n }\n\n return /export\\s+(?:const|function)\\s+__fict_[er]\\d+/.test(code)\n}\n\nfunction joinBasePath(base: string, fileName: string): string {\n if (!base) return fileName\n if (base === '/') return `/${fileName}`\n const normalized = base.endsWith('/') ? base : `${base}/`\n return `${normalized}${fileName}`\n}\n\ninterface AliasEntry {\n find: string | RegExp\n replacement: string\n}\n\nfunction normalizeAliases(aliases: ResolvedConfig['resolve']['alias'] | undefined): AliasEntry[] {\n if (!aliases) return []\n if (Array.isArray(aliases)) {\n return aliases\n .map(alias => {\n if (!alias || !('find' in alias)) return null\n const replacement =\n typeof alias.replacement === 'string' ? alias.replacement : String(alias.replacement)\n return { find: alias.find, replacement } as AliasEntry\n })\n .filter((alias): alias is AliasEntry => !!alias)\n }\n return Object.entries(aliases).map(([find, replacement]) => ({\n find,\n replacement: typeof replacement === 'string' ? replacement : String(replacement),\n }))\n}\n\nfunction applyAlias(source: string, aliases: AliasEntry[]): string | null {\n for (const alias of aliases) {\n if (typeof alias.find === 'string') {\n if (source === alias.find || source.startsWith(`${alias.find}/`)) {\n return alias.replacement + source.slice(alias.find.length)\n }\n continue\n }\n if (alias.find instanceof RegExp && alias.find.test(source)) {\n return source.replace(alias.find, alias.replacement)\n }\n }\n return null\n}\n\nfunction hashString(value: string): string {\n return createHash('sha256').update(value).digest('hex')\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') {\n return JSON.stringify(value)\n }\n\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(',')}]`\n }\n\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined && typeof v !== 'function')\n .sort(([a], [b]) => a.localeCompare(b))\n\n const body = entries\n .map(([key, val]) => `${JSON.stringify(key)}:${stableStringify(val)}`)\n .join(',')\n\n return `{${body}}`\n}\n\nfunction normalizeOptionsForCache(options: FictCompilerOptions): Record<string, unknown> {\n const normalized: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(options)) {\n if (value === undefined || typeof value === 'function') continue\n if (key === 'typescript') {\n const tsInfo = value as {\n projectVersion?: number\n configPath?: string\n }\n normalized.typescript = {\n projectVersion: tsInfo?.projectVersion,\n configPath: tsInfo?.configPath,\n }\n continue\n }\n normalized[key] = value\n }\n return normalized\n}\n\nfunction buildCacheKey(\n filename: string,\n code: string,\n options: FictCompilerOptions,\n tsProject: TypeScriptProject | null,\n): string {\n const codeHash = hashString(code)\n const optionsHash = hashString(stableStringify(normalizeOptionsForCache(options)))\n const tsKey = tsProject ? `${tsProject.configHash}:${tsProject.projectVersion}` : ''\n return hashString([CACHE_VERSION, filename, codeHash, optionsHash, tsKey].join('|'))\n}\n\nclass TransformCache {\n private memory = new Map<string, CachedTransform>()\n\n constructor(private options: NormalizedCacheOptions) {}\n\n get enabled(): boolean {\n return this.options.enabled\n }\n\n async get(key: string): Promise<CachedTransform | null> {\n if (!this.options.enabled) return null\n const cached = this.memory.get(key)\n if (cached) return cached\n\n if (!this.options.persistent || !this.options.dir) return null\n\n const filePath = path.join(this.options.dir, `${key}.json`)\n try {\n const raw = await fs.readFile(filePath, 'utf8')\n const parsed = JSON.parse(raw) as CachedTransform\n if (!parsed || typeof parsed.code !== 'string') return null\n this.memory.set(key, parsed)\n return parsed\n } catch {\n return null\n }\n }\n\n async set(key: string, value: CachedTransform): Promise<void> {\n if (!this.options.enabled) return\n this.memory.set(key, value)\n if (!this.options.persistent || !this.options.dir) return\n\n const filePath = path.join(this.options.dir, `${key}.json`)\n try {\n await fs.mkdir(this.options.dir, { recursive: true })\n await fs.writeFile(filePath, JSON.stringify(value))\n } catch {\n // Ignore cache write failures\n }\n }\n\n clear(): void {\n this.memory.clear()\n }\n}\n\nfunction isTypeScriptApi(value: unknown): value is TypeScriptApi {\n if (!value || typeof value !== 'object') return false\n const candidate = value as Partial<TypeScriptApi>\n return (\n typeof candidate.findConfigFile === 'function' &&\n typeof candidate.readConfigFile === 'function' &&\n typeof candidate.parseJsonConfigFileContent === 'function' &&\n typeof candidate.createLanguageService === 'function' &&\n typeof candidate.createDocumentRegistry === 'function' &&\n typeof candidate.resolveModuleName === 'function' &&\n !!candidate.sys &&\n typeof candidate.sys === 'object' &&\n typeof candidate.sys.fileExists === 'function' &&\n typeof candidate.sys.readFile === 'function'\n )\n}\n\nfunction safeDebugString(value: unknown): string {\n try {\n return typeof value === 'string' ? value : JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\nfunction formatError(error: unknown): string {\n if (error instanceof Error) return error.message\n try {\n return JSON.stringify(error)\n } catch {\n return String(error)\n }\n}\n\nfunction buildPluginMessage(context: string, file: string, error: unknown): string {\n return `[fict-plugin] ${context} (${file}): ${formatError(error)}`\n}\n\nasync function loadTypeScript(): Promise<TypeScriptApi | null> {\n try {\n const mod = await import('typescript')\n const candidate = (mod as { default?: unknown }).default ?? mod\n return isTypeScriptApi(candidate) ? candidate : null\n } catch {\n return null\n }\n}\n\nfunction resolveTsconfigPath(\n ts: TypeScriptApi,\n rootDir: string,\n explicitPath?: string,\n): string | null {\n if (explicitPath) {\n return path.resolve(rootDir, explicitPath)\n }\n return ts.findConfigFile(rootDir, ts.sys.fileExists, 'tsconfig.json') ?? null\n}\n\nasync function createTypeScriptProject(\n ts: TypeScriptApi,\n rootDir: string,\n configPath: string,\n): Promise<TypeScriptProject | null> {\n const configText = ts.sys.readFile(configPath)\n if (!configText) return null\n const configHash = hashString(configText)\n\n const configFile = ts.readConfigFile(configPath, ts.sys.readFile)\n if (configFile.error) return null\n\n const parsed = ts.parseJsonConfigFileContent(configFile.config, ts.sys, path.dirname(configPath))\n\n const fileSet = new Set<string>(parsed.fileNames.map((name: string) => path.normalize(name)))\n const fileVersions = new Map<string, number>()\n const fileHashes = new Map<string, string>()\n const fileCache = new Map<string, string>()\n let projectVersion = 0\n\n const normalizeName = (fileName: string) => normalizeFileName(fileName, rootDir)\n\n const serviceHost: TypeScriptLanguageServiceHost = {\n getScriptFileNames: () => Array.from(fileSet),\n getScriptVersion: (fileName: string) => {\n const normalized = normalizeName(fileName)\n return String(fileVersions.get(normalized) ?? 0)\n },\n getScriptSnapshot: (fileName: string) => {\n const normalized = normalizeName(fileName)\n const text = fileCache.get(normalized) ?? ts.sys.readFile(normalized)\n if (text === undefined) return undefined\n return ts.ScriptSnapshot.fromString(text)\n },\n getCurrentDirectory: () => rootDir,\n getCompilationSettings: () => parsed.options,\n getDefaultLibFileName: (options: unknown) => ts.getDefaultLibFilePath(options),\n fileExists: ts.sys.fileExists,\n readFile: ts.sys.readFile,\n readDirectory: ts.sys.readDirectory,\n directoryExists: ts.sys.directoryExists,\n getDirectories: ts.sys.getDirectories,\n useCaseSensitiveFileNames: () => ts.sys.useCaseSensitiveFileNames,\n getNewLine: () => ts.sys.newLine,\n getProjectVersion: () => String(projectVersion),\n }\n\n const service = ts.createLanguageService(serviceHost, ts.createDocumentRegistry())\n\n const updateFile = (fileName: string, code: string) => {\n const normalized = normalizeName(fileName)\n const nextHash = hashString(code)\n if (fileHashes.get(normalized) === nextHash) return\n fileHashes.set(normalized, nextHash)\n fileCache.set(normalized, code)\n fileVersions.set(normalized, (fileVersions.get(normalized) ?? 0) + 1)\n fileSet.add(normalized)\n projectVersion += 1\n }\n\n return {\n configPath,\n configHash,\n get projectVersion() {\n return projectVersion\n },\n updateFile,\n getProgram: () => service.getProgram?.() ?? null,\n resolveModuleName: (specifier: string, containingFile: string) => {\n try {\n const resolved = ts.resolveModuleName(specifier, containingFile, parsed.options, ts.sys)\n return resolved?.resolvedModule?.resolvedFileName ?? null\n } catch {\n return null\n }\n },\n dispose: () => service.dispose?.(),\n }\n}\n\n// ============================================================================\n// Function-level Code Splitting Helpers\n// ============================================================================\n\n/**\n * Parse a handler ID into source module and export name.\n * Format: /path/to/module.tsx$$exportName (using $$ as separator to avoid URL fragment conflicts)\n */\nfunction parseHandlerId(handlerId: string): [string | null, string | null] {\n const separatorIndex = handlerId.lastIndexOf('$$')\n if (separatorIndex === -1) {\n return [handlerId, 'default']\n }\n return [handlerId.slice(0, separatorIndex), handlerId.slice(separatorIndex + 2)]\n}\n\n/**\n * Generate handler ID from source module and export name.\n * Uses $$ as separator to avoid conflicts with URL # fragments.\n */\nfunction createHandlerId(sourceModule: string, exportName: string): string {\n return `${sourceModule}$$${exportName}`\n}\n\n/**\n * Generate a standalone virtual module for an extracted handler.\n * The module contains the complete handler code with its own imports,\n * creating a truly independent chunk that doesn't depend on the source module.\n */\nfunction generateHandlerModule(handler: ExtractedHandler): string {\n // If no code was extracted (fallback case), use re-export\n if (!handler.code) {\n return `export { ${handler.exportName} as default } from '${handler.sourceModule}';\\n`\n }\n\n // Group imports by source module\n const importsByModule = new Map<string, string[]>()\n\n for (const helperName of handler.helpersUsed) {\n const helper = RUNTIME_HELPERS[helperName]\n if (!helper) continue\n\n const existing = importsByModule.get(helper.from) ?? []\n if (!existing.includes(helper.import)) {\n existing.push(helper.import)\n }\n importsByModule.set(helper.from, existing)\n }\n\n // Generate import statements for runtime helpers\n const imports: string[] = []\n for (const [module, names] of importsByModule) {\n imports.push(`import { ${names.join(', ')} } from '${module}';`)\n }\n\n // Import local dependencies from the source module\n // These are re-exported by the source module with __fict_dep_ prefix\n if (handler.localDeps.length > 0) {\n const depImports = handler.localDeps.map(dep => `${HANDLER_DEP_PREFIX}${dep} as ${dep}`)\n imports.push(`import { ${depImports.join(', ')} } from '${handler.sourceModule}';`)\n }\n\n // Generate the complete standalone module\n return `${imports.join('\\n')}${imports.length > 0 ? '\\n\\n' : ''}export default ${handler.code};\\n`\n}\n\n/** Prefix for re-exported handler dependencies */\nconst HANDLER_DEP_PREFIX = '__fict_dep_'\n\n/**\n * Register an extracted handler for function-level splitting.\n */\nexport function registerExtractedHandler(\n sourceModule: string,\n exportName: string,\n helpersUsed: string[],\n code: string,\n localDeps: string[] = [],\n): string {\n const handlerId = createHandlerId(sourceModule, exportName)\n extractedHandlers.set(handlerId, {\n sourceModule,\n exportName,\n helpersUsed,\n localDeps,\n code,\n })\n return `${VIRTUAL_HANDLER_RESOLVE_PREFIX}${handlerId}`\n}\n\n/**\n * Runtime helper name mappings for generating imports in virtual modules\n */\nconst RUNTIME_HELPERS: Record<string, { import: string; from: string }> = {\n __fictUseLexicalScope: { import: '__fictUseLexicalScope', from: '@fictjs/runtime/internal' },\n __fictGetScopeProps: { import: '__fictGetScopeProps', from: '@fictjs/runtime/internal' },\n __fictGetSSRScope: { import: '__fictGetSSRScope', from: '@fictjs/runtime/internal' },\n __fictEnsureScope: { import: '__fictEnsureScope', from: '@fictjs/runtime/internal' },\n __fictPrepareContext: { import: '__fictPrepareContext', from: '@fictjs/runtime/internal' },\n __fictPushContext: { import: '__fictPushContext', from: '@fictjs/runtime/internal' },\n __fictPopContext: { import: '__fictPopContext', from: '@fictjs/runtime/internal' },\n hydrateComponent: { import: 'hydrateComponent', from: '@fictjs/runtime/internal' },\n __fictQrl: { import: '__fictQrl', from: '@fictjs/runtime/internal' },\n}\n\n/** Known global identifiers that don't need to be imported */\nconst GLOBAL_IDENTIFIERS = new Set([\n // JavaScript globals\n 'undefined',\n 'null',\n 'true',\n 'false',\n 'NaN',\n 'Infinity',\n 'globalThis',\n 'window',\n 'document',\n 'console',\n 'setTimeout',\n 'setInterval',\n 'clearTimeout',\n 'clearInterval',\n 'requestAnimationFrame',\n 'cancelAnimationFrame',\n 'fetch',\n 'URL',\n 'URLSearchParams',\n 'FormData',\n 'Headers',\n 'Request',\n 'Response',\n 'AbortController',\n 'AbortSignal',\n // Built-in constructors\n 'Object',\n 'Array',\n 'String',\n 'Number',\n 'Boolean',\n 'Symbol',\n 'BigInt',\n 'Date',\n 'RegExp',\n 'Error',\n 'TypeError',\n 'RangeError',\n 'SyntaxError',\n 'Map',\n 'Set',\n 'WeakMap',\n 'WeakSet',\n 'Promise',\n 'Proxy',\n 'Reflect',\n 'JSON',\n 'Math',\n 'Intl',\n // Event and DOM\n 'Event',\n 'CustomEvent',\n 'Element',\n 'Node',\n 'HTMLElement',\n])\n\n/**\n * Collect identifiers referenced in an AST node that are not locally defined.\n * Uses simple recursive traversal instead of Babel's traverse to work on sub-nodes.\n */\nfunction collectReferencedIdentifiers(node: t.Node, localBindings: Set<string>): Set<string> {\n const referenced = new Set<string>()\n\n function visitNode(\n current: t.Node | null | undefined,\n parent: t.Node | null,\n key: string | null,\n ): void {\n if (!current) return\n\n if (t.isIdentifier(current)) {\n const name = current.name\n\n // Skip if it's a property access (obj.prop) - only the object is a reference\n if (\n parent &&\n t.isMemberExpression(parent) &&\n parent.property === current &&\n !parent.computed\n ) {\n return\n }\n\n // Skip if it's a key in object property (non-computed)\n if (parent && t.isObjectProperty(parent) && parent.key === current && !parent.computed) {\n return\n }\n\n // Skip if it's a function/variable declaration name\n if (parent && t.isVariableDeclarator(parent) && parent.id === current) {\n return\n }\n if (\n parent &&\n (t.isFunctionDeclaration(parent) || t.isFunctionExpression(parent)) &&\n parent.id === current\n ) {\n return\n }\n\n // Skip if it's a parameter\n if (key === 'params') {\n return\n }\n\n // Skip if it's a catch clause parameter\n if (parent && t.isCatchClause(parent) && parent.param === current) {\n return\n }\n\n // Skip local bindings (locally declared variables)\n if (localBindings.has(name)) {\n return\n }\n\n // Skip globals\n if (GLOBAL_IDENTIFIERS.has(name)) {\n return\n }\n\n // Skip runtime helpers\n if (RUNTIME_HELPERS[name]) {\n return\n }\n\n referenced.add(name)\n return\n }\n\n // Recursively visit child nodes\n for (const nodeKey of Object.keys(current)) {\n // Skip metadata keys that aren't child nodes\n if (\n nodeKey === 'loc' ||\n nodeKey === 'start' ||\n nodeKey === 'end' ||\n nodeKey === 'extra' ||\n nodeKey === 'comments' ||\n nodeKey === 'leadingComments' ||\n nodeKey === 'trailingComments' ||\n nodeKey === 'innerComments'\n ) {\n continue\n }\n const child = (current as unknown as Record<string, unknown>)[nodeKey]\n if (Array.isArray(child)) {\n for (const item of child) {\n if (\n item &&\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n typeof (item as Record<string, unknown>).type === 'string'\n ) {\n visitNode(item as t.Node, current, nodeKey)\n }\n }\n } else if (\n child &&\n typeof child === 'object' &&\n child !== null &&\n 'type' in child &&\n typeof (child as Record<string, unknown>).type === 'string'\n ) {\n visitNode(child as t.Node, current, nodeKey)\n }\n }\n }\n\n visitNode(node, null, null)\n return referenced\n}\n\n/**\n * Collect all bindings (variables, functions, params) defined within an AST node.\n * Uses simple recursive traversal instead of Babel's traverse to work on sub-nodes.\n */\nfunction collectLocalBindings(node: t.Node): Set<string> {\n const bindings = new Set<string>()\n\n function visitNode(current: t.Node | null | undefined): void {\n if (!current) return\n\n // Handle variable declarations\n if (t.isVariableDeclarator(current)) {\n if (t.isIdentifier(current.id)) {\n bindings.add(current.id.name)\n } else if (t.isObjectPattern(current.id) || t.isArrayPattern(current.id)) {\n const names = collectPatternIdentifiers(current.id)\n for (const name of names) {\n bindings.add(name)\n }\n }\n }\n\n // Handle function declarations\n if (t.isFunctionDeclaration(current)) {\n if (current.id) {\n bindings.add(current.id.name)\n }\n for (const param of current.params) {\n const names = collectPatternIdentifiers(param)\n for (const name of names) {\n bindings.add(name)\n }\n }\n }\n\n // Handle function expressions\n if (t.isFunctionExpression(current)) {\n for (const param of current.params) {\n const names = collectPatternIdentifiers(param)\n for (const name of names) {\n bindings.add(name)\n }\n }\n }\n\n // Handle arrow function expressions\n if (t.isArrowFunctionExpression(current)) {\n for (const param of current.params) {\n const names = collectPatternIdentifiers(param)\n for (const name of names) {\n bindings.add(name)\n }\n }\n }\n\n // Handle catch clauses\n if (t.isCatchClause(current)) {\n if (current.param && t.isIdentifier(current.param)) {\n bindings.add(current.param.name)\n }\n }\n\n // Recursively visit child nodes\n for (const nodeKey of Object.keys(current)) {\n // Skip metadata keys that aren't child nodes\n if (\n nodeKey === 'loc' ||\n nodeKey === 'start' ||\n nodeKey === 'end' ||\n nodeKey === 'extra' ||\n nodeKey === 'comments' ||\n nodeKey === 'leadingComments' ||\n nodeKey === 'trailingComments' ||\n nodeKey === 'innerComments'\n ) {\n continue\n }\n const child = (current as unknown as Record<string, unknown>)[nodeKey]\n if (Array.isArray(child)) {\n for (const item of child) {\n if (\n item &&\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n typeof (item as Record<string, unknown>).type === 'string'\n ) {\n visitNode(item as t.Node)\n }\n }\n } else if (\n child &&\n typeof child === 'object' &&\n child !== null &&\n 'type' in child &&\n typeof (child as Record<string, unknown>).type === 'string'\n ) {\n visitNode(child as t.Node)\n }\n }\n }\n\n visitNode(node)\n\n return bindings\n}\n\n/**\n * Collect identifier names from a pattern (for destructuring).\n */\nfunction collectPatternIdentifiers(pattern: t.LVal | t.PatternLike): string[] {\n const names: string[] = []\n\n if (t.isIdentifier(pattern)) {\n names.push(pattern.name)\n } else if (t.isObjectPattern(pattern)) {\n for (const prop of pattern.properties) {\n if (t.isObjectProperty(prop) && t.isLVal(prop.value)) {\n names.push(...collectPatternIdentifiers(prop.value))\n } else if (t.isRestElement(prop)) {\n names.push(...collectPatternIdentifiers(prop.argument))\n }\n }\n } else if (t.isArrayPattern(pattern)) {\n for (const element of pattern.elements) {\n if (element) {\n names.push(...collectPatternIdentifiers(element))\n }\n }\n } else if (t.isRestElement(pattern)) {\n names.push(...collectPatternIdentifiers(pattern.argument))\n } else if (t.isAssignmentPattern(pattern)) {\n names.push(...collectPatternIdentifiers(pattern.left))\n }\n\n return names\n}\n\n/**\n * Extract handlers using Babel AST and rewrite QRLs to use virtual modules.\n * This creates truly independent chunks for each handler.\n * Local dependencies are detected and re-exported for handlers to import.\n */\nfunction extractAndRewriteHandlers(\n code: string,\n sourceModule: string,\n): { code: string; handlers: string[] } | null {\n let ast: ReturnType<typeof parse>\n\n try {\n ast = parse(code, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n })\n } catch (error) {\n throw new Error(\n buildPluginMessage(\n 'Failed to parse transformed code for handler extraction',\n sourceModule,\n error,\n ),\n )\n }\n\n // Collect all top-level declarations that could be referenced by handlers\n const topLevelDeclarations = new Set<string>()\n const importedNames = new Set<string>()\n\n for (const node of ast.program.body) {\n // Collect imports\n if (t.isImportDeclaration(node)) {\n for (const specifier of node.specifiers) {\n if (t.isImportSpecifier(specifier) || t.isImportDefaultSpecifier(specifier)) {\n importedNames.add(specifier.local.name)\n } else if (t.isImportNamespaceSpecifier(specifier)) {\n importedNames.add(specifier.local.name)\n }\n }\n continue\n }\n\n // Collect function declarations\n if (t.isFunctionDeclaration(node) && node.id) {\n topLevelDeclarations.add(node.id.name)\n continue\n }\n\n // Collect variable declarations\n if (t.isVariableDeclaration(node)) {\n for (const declarator of node.declarations) {\n if (t.isIdentifier(declarator.id)) {\n topLevelDeclarations.add(declarator.id.name)\n }\n }\n continue\n }\n\n // Collect class declarations\n if (t.isClassDeclaration(node) && node.id) {\n topLevelDeclarations.add(node.id.name)\n continue\n }\n\n // Collect exported declarations\n if (t.isExportNamedDeclaration(node) && node.declaration) {\n if (t.isFunctionDeclaration(node.declaration) && node.declaration.id) {\n topLevelDeclarations.add(node.declaration.id.name)\n } else if (t.isVariableDeclaration(node.declaration)) {\n for (const declarator of node.declaration.declarations) {\n if (t.isIdentifier(declarator.id)) {\n topLevelDeclarations.add(declarator.id.name)\n }\n }\n } else if (t.isClassDeclaration(node.declaration) && node.declaration.id) {\n topLevelDeclarations.add(node.declaration.id.name)\n }\n }\n }\n\n // Merge imports into top-level declarations (they're also available at top level)\n for (const name of importedNames) {\n topLevelDeclarations.add(name)\n }\n\n const handlerNames: string[] = []\n const nodesToRemove = new Set<t.Node>()\n const allLocalDeps = new Set<string>()\n\n // First pass: find all handler exports and extract their code\n traverse(ast, {\n ExportNamedDeclaration(path) {\n const declaration = path.node.declaration\n\n // Handle: export const __fict_e0 = (scopeId, event, el) => { ... }\n if (t.isVariableDeclaration(declaration)) {\n for (const declarator of declaration.declarations) {\n if (!t.isIdentifier(declarator.id)) continue\n\n const name = declarator.id.name\n // Only extract event handlers (__fict_e*), not resume handlers (__fict_r*)\n // Resume handlers have complex component dependencies that can't be easily extracted\n if (!name.match(/^__fict_e\\d+$/)) continue\n\n if (!declarator.init) continue\n\n handlerNames.push(name)\n\n // Generate the handler function code\n const handlerCode = generate(declarator.init).code\n\n // Detect which runtime helpers are used\n const helpersUsed: string[] = []\n for (const helperName of Object.keys(RUNTIME_HELPERS)) {\n if (handlerCode.includes(helperName)) {\n helpersUsed.push(helperName)\n }\n }\n\n // Detect local dependencies\n const localBindings = collectLocalBindings(declarator.init)\n const referencedIds = collectReferencedIdentifiers(declarator.init, localBindings)\n const localDeps: string[] = []\n for (const ref of referencedIds) {\n // Only include if it's a top-level declaration (not a handler itself)\n if (topLevelDeclarations.has(ref) && !ref.match(/^__fict_[er]\\d+$/)) {\n localDeps.push(ref)\n allLocalDeps.add(ref)\n }\n }\n\n // Register the handler with its full code\n const handlerId = createHandlerId(sourceModule, name)\n extractedHandlers.set(handlerId, {\n sourceModule,\n exportName: name,\n helpersUsed,\n localDeps,\n code: handlerCode,\n })\n\n // Mark this export for removal\n nodesToRemove.add(path.node)\n }\n return\n }\n\n // Handle: export function __fict_e0(scopeId, event, el) { ... }\n if (t.isFunctionDeclaration(declaration) && declaration.id) {\n const name = declaration.id.name\n // Only extract event handlers (__fict_e*), not resume handlers (__fict_r*)\n // Resume handlers have complex component dependencies that can't be easily extracted\n if (!name.match(/^__fict_e\\d+$/)) return\n\n handlerNames.push(name)\n\n // Convert to arrow function expression for the virtual module\n const params = declaration.params\n const body = declaration.body\n const arrowFn = t.arrowFunctionExpression(params, body, declaration.async)\n\n // Generate the handler function code\n const handlerCode = generate(arrowFn).code\n\n // Detect which runtime helpers are used\n const helpersUsed: string[] = []\n for (const helperName of Object.keys(RUNTIME_HELPERS)) {\n if (handlerCode.includes(helperName)) {\n helpersUsed.push(helperName)\n }\n }\n\n // Detect local dependencies\n const localBindings = collectLocalBindings(arrowFn)\n const referencedIds = collectReferencedIdentifiers(arrowFn, localBindings)\n const localDeps: string[] = []\n for (const ref of referencedIds) {\n // Only include if it's a top-level declaration (not a handler itself)\n if (topLevelDeclarations.has(ref) && !ref.match(/^__fict_[er]\\d+$/)) {\n localDeps.push(ref)\n allLocalDeps.add(ref)\n }\n }\n\n // Register the handler with its full code\n const handlerId = createHandlerId(sourceModule, name)\n extractedHandlers.set(handlerId, {\n sourceModule,\n exportName: name,\n helpersUsed,\n localDeps,\n code: handlerCode,\n })\n\n // Mark this export for removal\n nodesToRemove.add(path.node)\n }\n },\n })\n\n if (handlerNames.length === 0) {\n return null\n }\n\n // Second pass: remove handler exports, rewrite QRL calls, and add re-exports for dependencies\n traverse(ast, {\n ExportNamedDeclaration(path) {\n if (nodesToRemove.has(path.node)) {\n path.remove()\n }\n },\n\n CallExpression(path) {\n // Rewrite __fictQrl(import.meta.url, \"__fict_e0\") -> \"virtual:...\"\n if (!t.isIdentifier(path.node.callee, { name: '__fictQrl' })) return\n if (path.node.arguments.length !== 2) return\n\n const secondArg = path.node.arguments[1]\n if (!t.isStringLiteral(secondArg)) return\n\n const handlerName = secondArg.value\n if (!handlerNames.includes(handlerName)) return\n\n // Replace with the virtual module URL\n const handlerId = createHandlerId(sourceModule, handlerName)\n const virtualUrl = `${VIRTUAL_HANDLER_RESOLVE_PREFIX}${handlerId}#default`\n path.replaceWith(t.stringLiteral(virtualUrl))\n },\n })\n\n // Add re-exports for local dependencies used by handlers\n // This allows handlers to import them from the source module\n if (allLocalDeps.size > 0) {\n const reExports: t.ExportSpecifier[] = []\n for (const dep of allLocalDeps) {\n // Export as __fict_dep_<name> to avoid conflicts\n reExports.push(\n t.exportSpecifier(t.identifier(dep), t.identifier(`${HANDLER_DEP_PREFIX}${dep}`)),\n )\n }\n ast.program.body.push(t.exportNamedDeclaration(null, reExports))\n }\n\n // Generate the modified code\n const result = generate(ast, {\n retainLines: true,\n compact: false,\n })\n\n return { code: result.code, handlers: handlerNames }\n}\n"],"mappings":"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","names":["_traverse","_generate","include","exclude","path","tsProject","fs","module"]}
package/dist/index.js CHANGED
@@ -269,22 +269,30 @@ function fict(options = {}) {
269
269
  }
270
270
  }
271
271
  try {
272
- const isTypeScript = filename.endsWith(".tsx") || filename.endsWith(".ts");
273
- const result = await transformAsync(code, {
274
- filename,
275
- sourceMaps: fictOptions.sourcemap,
276
- sourceFileName: filename,
277
- presets: isTypeScript ? [["@babel/preset-typescript", { isTSX: true, allExtensions: true }]] : [],
278
- plugins: [
279
- ["@babel/plugin-syntax-jsx", {}],
280
- [createFictPlugin, fictOptions]
281
- ]
282
- });
283
- if (!result || !result.code) {
284
- return null;
272
+ const precompiledInput = isPrecompiledFictModule(code);
273
+ let finalCode;
274
+ let finalMap;
275
+ if (precompiledInput) {
276
+ finalCode = code;
277
+ finalMap = null;
278
+ } else {
279
+ const isTypeScript = filename.endsWith(".tsx") || filename.endsWith(".ts");
280
+ const result = await transformAsync(code, {
281
+ filename,
282
+ sourceMaps: fictOptions.sourcemap,
283
+ sourceFileName: filename,
284
+ presets: isTypeScript ? [["@babel/preset-typescript", { isTSX: true, allExtensions: true }]] : [],
285
+ plugins: [
286
+ ["@babel/plugin-syntax-jsx", {}],
287
+ [createFictPlugin, fictOptions]
288
+ ]
289
+ });
290
+ if (!result || !result.code) {
291
+ return null;
292
+ }
293
+ finalCode = result.code;
294
+ finalMap = result.map;
285
295
  }
286
- let finalCode = result.code;
287
- let finalMap = result.map;
288
296
  const shouldSplit = options.functionSplitting ?? (config?.command === "build" && (compilerOptions.resumable || !config?.build?.ssr));
289
297
  debugLog("Function split decision", {
290
298
  shouldSplit,
@@ -448,6 +456,13 @@ function normalizeFileName(id, root) {
448
456
  if (root) return path.normalize(path.resolve(root, clean));
449
457
  return path.normalize(path.resolve(clean));
450
458
  }
459
+ function isPrecompiledFictModule(code) {
460
+ const hasCompilerMarker = code.includes("__fict_hir_codegen__") || code.includes("__fictQrl(") || code.includes("__fictUseLexicalScope");
461
+ if (!hasCompilerMarker) {
462
+ return false;
463
+ }
464
+ return /export\s+(?:const|function)\s+__fict_[er]\d+/.test(code);
465
+ }
451
466
  function joinBasePath(base, fileName) {
452
467
  if (!base) return fileName;
453
468
  if (base === "/") return `/${fileName}`;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { createHash } from 'node:crypto'\nimport { promises as fs } from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\n\nimport { transformAsync } from '@babel/core'\nimport _generate from '@babel/generator'\nimport { parse } from '@babel/parser'\nimport _traverse from '@babel/traverse'\nimport * as t from '@babel/types'\nimport { createFictPlugin, type FictCompilerOptions } from '@fictjs/compiler'\nimport type { Plugin, ResolvedConfig, TransformResult } from 'vite'\n\n// Handle ESM/CJS interop for Babel packages\nconst traverse = (\n typeof _traverse === 'function' ? _traverse : (_traverse as { default: typeof _traverse }).default\n) as typeof _traverse\nconst generate = (\n typeof _generate === 'function' ? _generate : (_generate as { default: typeof _generate }).default\n) as typeof _generate\n\nexport interface FictPluginOptions extends FictCompilerOptions {\n /**\n * File patterns to include for transformation.\n * @default ['**\\/*.tsx', '**\\/*.jsx']\n */\n include?: string[]\n /**\n * File patterns to exclude from transformation.\n * @default ['**\\/node_modules\\/**']\n */\n exclude?: string[]\n /**\n * Transform cache settings (memory + optional persistent disk cache).\n * Set to false to disable caching entirely.\n */\n cache?:\n | boolean\n | {\n enabled?: boolean\n persistent?: boolean\n dir?: string\n }\n /**\n * Explicit tsconfig path for TypeScript project integration.\n * If omitted, the plugin will search from Vite root.\n */\n tsconfigPath?: string\n /**\n * Enable TypeScript project integration when TypeScript is available.\n * @default true\n */\n useTypeScriptProject?: boolean\n /**\n * Enable function-level code splitting for resumable handlers.\n * When enabled, event handlers and resume functions are extracted\n * to separate chunks for optimal lazy loading.\n * @default false for dev, true for production build\n */\n functionSplitting?: boolean\n /**\n * Enable verbose debug logs from the plugin.\n * Can also be enabled via `FICT_VITE_PLUGIN_DEBUG=1`.\n * @default false\n */\n debug?: boolean\n}\n\ninterface NormalizedCacheOptions {\n enabled: boolean\n persistent: boolean\n dir?: string\n}\n\ninterface CachedTransform {\n code: string\n map: TransformResult['map']\n}\n\ninterface TypeScriptProject {\n configPath: string\n configHash: string\n readonly projectVersion: number\n updateFile: (fileName: string, code: string) => void\n getProgram: () => TypeScriptProgram | null\n resolveModuleName: (specifier: string, containingFile: string) => string | null\n dispose: () => void\n}\n\ninterface TypeScriptProgram {\n getTypeChecker?: () => unknown\n}\n\ninterface TypeScriptSystem {\n fileExists: (path: string) => boolean\n readFile: (path: string) => string | undefined\n readDirectory: (...args: unknown[]) => string[]\n directoryExists?: (path: string) => boolean\n getDirectories?: (path: string) => string[]\n useCaseSensitiveFileNames: boolean\n newLine: string\n}\n\ninterface TypeScriptParsedConfig {\n fileNames: string[]\n options: unknown\n}\n\ninterface TypeScriptLanguageService {\n getProgram?: () => TypeScriptProgram | null\n dispose?: () => void\n}\n\ninterface TypeScriptLanguageServiceHost {\n getScriptFileNames: () => string[]\n getScriptVersion: (fileName: string) => string\n getScriptSnapshot: (fileName: string) => unknown\n getCurrentDirectory: () => string\n getCompilationSettings: () => unknown\n getDefaultLibFileName: (options: unknown) => string\n fileExists: TypeScriptSystem['fileExists']\n readFile: TypeScriptSystem['readFile']\n readDirectory: TypeScriptSystem['readDirectory']\n directoryExists?: TypeScriptSystem['directoryExists']\n getDirectories?: TypeScriptSystem['getDirectories']\n useCaseSensitiveFileNames: () => boolean\n getNewLine: () => string\n getProjectVersion: () => string\n}\n\ninterface TypeScriptApi {\n sys: TypeScriptSystem\n findConfigFile: (\n searchPath: string,\n fileExists: TypeScriptSystem['fileExists'],\n configName: string,\n ) => string | undefined\n readConfigFile: (\n configPath: string,\n readFile: TypeScriptSystem['readFile'],\n ) => { config: unknown; error?: unknown }\n parseJsonConfigFileContent: (\n config: unknown,\n host: TypeScriptSystem,\n basePath: string,\n ) => TypeScriptParsedConfig\n ScriptSnapshot: {\n fromString: (text: string) => unknown\n }\n getDefaultLibFilePath: (options: unknown) => string\n createLanguageService: (\n host: TypeScriptLanguageServiceHost,\n registry: unknown,\n ) => TypeScriptLanguageService\n createDocumentRegistry: () => unknown\n resolveModuleName: (\n specifier: string,\n containingFile: string,\n options: unknown,\n host: TypeScriptSystem,\n ) => { resolvedModule?: { resolvedFileName?: string } } | undefined\n}\n\nconst CACHE_VERSION = 1\nconst MODULE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.mts', '.cts']\n\n// Virtual module prefix for extracted handlers\nconst VIRTUAL_HANDLER_PREFIX = '\\0fict-handler:'\nconst VIRTUAL_HANDLER_RESOLVE_PREFIX = 'virtual:fict-handler:'\n\n/**\n * Information about an extracted resumable handler\n */\ninterface ExtractedHandler {\n /** The module this handler was extracted from */\n sourceModule: string\n /** The export name in the source module */\n exportName: string\n /** Runtime helpers used by this handler */\n helpersUsed: string[]\n /** Local dependencies from source module that need to be re-exported */\n localDeps: string[]\n /** The handler function code (without export) */\n code: string\n}\n\n/**\n * Registry for extracted handlers during compilation\n */\nconst extractedHandlers = new Map<string, ExtractedHandler>()\n\n/**\n * Vite plugin for Fict reactive UI library.\n *\n * Transforms $state and $effect calls into reactive signals using the Fict compiler.\n *\n * @example\n * ```ts\n * // vite.config.ts\n * import { defineConfig } from 'vite'\n * import fict from '@fictjs/vite-plugin'\n *\n * export default defineConfig({\n * plugins: [fict()],\n * })\n * ```\n */\nexport default function fict(options: FictPluginOptions = {}): Plugin {\n const {\n include = ['**/*.tsx', '**/*.jsx'],\n exclude = ['**/node_modules/**'],\n cache: cacheOption,\n tsconfigPath,\n useTypeScriptProject = true,\n debug: debugOption,\n ...compilerOptions\n } = options\n\n let config: ResolvedConfig | undefined\n let isDev = false\n let cache: TransformCache | null = null\n let tsProject: TypeScriptProject | null = null\n let tsProjectInit: Promise<TypeScriptProject | null> | null = null\n const moduleMetadata: FictCompilerOptions['moduleMetadata'] = new Map()\n const debugEnabled =\n debugOption === true ||\n process.env.FICT_VITE_PLUGIN_DEBUG === '1' ||\n process.env.FICT_VITE_PLUGIN_DEBUG === 'true'\n\n const debugLog = (message: string, details?: unknown) => {\n if (!debugEnabled) return\n const payload = details === undefined ? '' : ` ${safeDebugString(details)}`\n config?.logger?.info(`[fict-plugin] ${message}${payload}`)\n }\n\n const ensureCache = () => {\n if (cache) return cache\n const normalized = normalizeCacheOptions(cacheOption, config)\n cache = new TransformCache(normalized)\n return cache\n }\n\n const resetCache = () => {\n cache?.clear()\n cache = null\n }\n\n const ensureTypeScriptProject = async () => {\n if (!useTypeScriptProject) return null\n if (tsProject) return tsProject\n if (!tsProjectInit) {\n tsProjectInit = (async () => {\n const ts = await loadTypeScript()\n if (!ts) return null\n const rootDir = config?.root ?? process.cwd()\n const resolvedConfigPath = resolveTsconfigPath(ts, rootDir, tsconfigPath)\n if (!resolvedConfigPath) return null\n return createTypeScriptProject(ts, rootDir, resolvedConfigPath)\n })()\n }\n tsProject = await tsProjectInit\n return tsProject\n }\n\n const resetTypeScriptProject = () => {\n if (tsProject) {\n tsProject.dispose()\n }\n tsProject = null\n tsProjectInit = null\n }\n\n return {\n name: 'vite-plugin-fict',\n\n enforce: 'pre',\n\n configResolved(resolvedConfig) {\n config = resolvedConfig\n isDev = config.command === 'serve' || config.mode === 'development'\n // Rebuild cache with resolved config so cacheDir is available\n resetCache()\n // Clear extracted handlers from previous builds\n extractedHandlers.clear()\n },\n\n resolveId(id: string) {\n // Handle virtual handler modules\n if (id.startsWith(VIRTUAL_HANDLER_RESOLVE_PREFIX)) {\n return VIRTUAL_HANDLER_PREFIX + id.slice(VIRTUAL_HANDLER_RESOLVE_PREFIX.length)\n }\n return null\n },\n\n load(id: string) {\n // Load virtual handler modules\n if (!id.startsWith(VIRTUAL_HANDLER_PREFIX)) {\n return null\n }\n\n const handlerId = id.slice(VIRTUAL_HANDLER_PREFIX.length)\n debugLog(`Loading virtual module: ${handlerId}`, {\n registrySize: extractedHandlers.size,\n handlers: Array.from(extractedHandlers.keys()),\n })\n const handler = extractedHandlers.get(handlerId)\n if (handler) {\n const generatedCode = generateHandlerModule(handler)\n debugLog(`Generated virtual module (${generatedCode.length} chars)`, {\n preview: generatedCode.slice(0, 200),\n })\n return generatedCode\n }\n\n if (!handler) {\n // In dev mode or when splitting is disabled, the handler is still in the main module\n // Generate a re-export from the source module\n const [sourceModule, exportName] = parseHandlerId(handlerId)\n if (sourceModule && exportName) {\n return `export { ${exportName} as default } from '${sourceModule}'`\n }\n return null\n }\n\n // Generate the virtual module with the handler code\n return generateHandlerModule(handler)\n },\n\n config(userConfig, env) {\n const userOptimize = userConfig.optimizeDeps\n const hasUserOptimize = !!userOptimize\n const hasDisabledOptimize =\n hasUserOptimize && (userOptimize as { disabled?: boolean }).disabled === true\n\n const include = new Set(userOptimize?.include ?? [])\n const exclude = new Set(userOptimize?.exclude ?? [])\n const dedupe = new Set((userConfig.resolve?.dedupe ?? []) as string[])\n\n // Avoid duplicate runtime instances between pre-bundled deps and /@fs modules.\n // Exclude all workspace packages from prebundling to ensure changes take effect\n // immediately without requiring node_modules reinstall.\n const workspaceDeps = [\n 'fict',\n 'fict/plus',\n 'fict/advanced',\n 'fict/slim',\n 'fict/jsx-runtime',\n 'fict/jsx-dev-runtime',\n '@fictjs/runtime',\n '@fictjs/runtime/internal',\n '@fictjs/runtime/advanced',\n '@fictjs/runtime/jsx-runtime',\n '@fictjs/runtime/jsx-dev-runtime',\n '@fictjs/compiler',\n '@fictjs/devtools',\n '@fictjs/devtools/core',\n '@fictjs/devtools/vite',\n '@fictjs/router',\n '@fictjs/ssr',\n '@fictjs/testing-library',\n ]\n for (const dep of workspaceDeps) {\n include.delete(dep)\n exclude.add(dep)\n }\n // Only dedupe core runtime packages to avoid duplicate instances\n const dedupePackages = ['fict', '@fictjs/runtime', '@fictjs/runtime/internal']\n for (const dep of dedupePackages) {\n dedupe.add(dep)\n }\n\n // Determine if we're in dev mode based on command or mode\n const devMode = env.command === 'serve' || env.mode === 'development'\n\n return {\n // Define __DEV__ for runtime devtools support\n // In dev mode, enable devtools; in production, disable them for smaller bundles\n define: {\n __DEV__: String(devMode),\n ...(userConfig.define ?? {}),\n },\n esbuild: {\n // Disable esbuild JSX handling for .tsx/.jsx files\n // Our plugin will handle the full transformation\n include: /\\.(ts|js|mts|mjs|cjs)$/,\n },\n build: {\n rollupOptions: {\n // Preserve exports in entry chunks to prevent tree-shaking of handler exports\n preserveEntrySignatures: 'exports-only',\n },\n },\n resolve: {\n ...(userConfig.resolve ?? {}),\n dedupe: Array.from(dedupe),\n },\n // Watch workspace packages dist directories for changes in dev mode\n // This ensures HMR picks up rebuilt packages without needing to restart\n server: {\n watch: {\n ignored: ['!**/node_modules/@fictjs/**', '!**/node_modules/fict/**'],\n },\n },\n ...(hasDisabledOptimize\n ? { optimizeDeps: userOptimize }\n : {\n optimizeDeps: hasUserOptimize\n ? { ...userOptimize, include: Array.from(include), exclude: Array.from(exclude) }\n : { exclude: workspaceDeps },\n }),\n }\n },\n\n async transform(code: string, id: string): Promise<TransformResult | null> {\n const filename = stripQuery(id)\n\n // Skip non-matching files\n if (!shouldTransform(filename, include, exclude)) {\n return null\n }\n\n const aliasEntries = normalizeAliases(config?.resolve?.alias)\n const fictOptions: FictCompilerOptions = {\n ...compilerOptions,\n dev: compilerOptions.dev ?? isDev,\n sourcemap: compilerOptions.sourcemap ?? true,\n filename,\n moduleMetadata,\n resolveModuleMetadata: (source, importer) => {\n const userResolved = compilerOptions.resolveModuleMetadata?.(source, importer)\n if (userResolved) return userResolved\n if (!importer) return undefined\n\n const importerFile = normalizeFileName(importer, config?.root)\n const lookupMetadata = (resolved: string) => {\n const direct = moduleMetadata.get(resolved)\n if (direct) return direct\n const ext = path.extname(resolved)\n if (!ext) {\n for (const suffix of MODULE_EXTENSIONS) {\n const byExt = moduleMetadata.get(`${resolved}${suffix}`)\n if (byExt) return byExt\n }\n for (const suffix of MODULE_EXTENSIONS) {\n const byIndex = moduleMetadata.get(path.join(resolved, `index${suffix}`))\n if (byIndex) return byIndex\n }\n }\n return undefined\n }\n let resolvedSource: string | null = null\n\n if (path.isAbsolute(source)) {\n resolvedSource = normalizeFileName(source, config?.root)\n } else if (source.startsWith('.')) {\n resolvedSource = normalizeFileName(\n path.resolve(path.dirname(importerFile), source),\n config?.root,\n )\n } else {\n const aliased = applyAlias(source, aliasEntries)\n if (aliased) {\n if (path.isAbsolute(aliased)) {\n resolvedSource = normalizeFileName(aliased, config?.root)\n } else if (aliased.startsWith('.')) {\n resolvedSource = normalizeFileName(\n path.resolve(path.dirname(importerFile), aliased),\n config?.root,\n )\n } else if (config?.root) {\n resolvedSource = normalizeFileName(path.resolve(config.root, aliased), config?.root)\n }\n } else if (tsProject) {\n const tsResolved = tsProject.resolveModuleName(source, importerFile)\n if (tsResolved) {\n resolvedSource = normalizeFileName(tsResolved, config?.root)\n }\n }\n }\n\n if (!resolvedSource) return undefined\n return lookupMetadata(resolvedSource)\n },\n }\n\n const tsProject = await ensureTypeScriptProject()\n if (tsProject) {\n const resolvedName = normalizeFileName(filename, config?.root)\n tsProject.updateFile(resolvedName, code)\n const program = tsProject.getProgram()\n const checker =\n program && typeof program.getTypeChecker === 'function'\n ? program.getTypeChecker()\n : undefined\n fictOptions.typescript = {\n program: program ?? undefined,\n checker,\n projectVersion: tsProject.projectVersion,\n configPath: tsProject.configPath,\n }\n }\n\n const cacheStore = ensureCache()\n const cacheKey = cacheStore.enabled\n ? buildCacheKey(filename, code, fictOptions, tsProject)\n : null\n\n if (cacheKey) {\n const cached = await cacheStore.get(cacheKey)\n if (cached) {\n return cached\n }\n }\n\n try {\n const isTypeScript = filename.endsWith('.tsx') || filename.endsWith('.ts')\n\n const result = await transformAsync(code, {\n filename,\n sourceMaps: fictOptions.sourcemap,\n sourceFileName: filename,\n presets: isTypeScript\n ? [['@babel/preset-typescript', { isTSX: true, allExtensions: true }]]\n : [],\n plugins: [\n ['@babel/plugin-syntax-jsx', {}],\n [createFictPlugin, fictOptions],\n ],\n })\n\n if (!result || !result.code) {\n return null\n }\n\n let finalCode = result.code\n let finalMap = result.map as TransformResult['map']\n\n // Apply function-level code splitting in production builds\n // For SSR builds with resumable enabled, we also need to rewrite QRLs to virtual URLs\n // so they match the manifest generated by the client build\n const shouldSplit =\n options.functionSplitting ??\n (config?.command === 'build' && (compilerOptions.resumable || !config?.build?.ssr))\n\n debugLog('Function split decision', {\n shouldSplit,\n ssr: config?.build?.ssr,\n resumable: compilerOptions.resumable,\n file: filename,\n })\n if (shouldSplit) {\n let splitResult: { code: string; handlers: string[] } | null = null\n try {\n splitResult = extractAndRewriteHandlers(finalCode, filename)\n } catch (error) {\n this.warn(buildPluginMessage('extractAndRewriteHandlers failed', filename, error))\n }\n debugLog('Split result', {\n file: filename,\n handlers: splitResult?.handlers.length ?? 0,\n })\n if (splitResult) {\n debugLog(`Function splitting extracted ${splitResult.handlers.length} handlers`, {\n file: filename,\n })\n finalCode = splitResult.code\n // Note: source maps are invalidated by this rewrite\n // For production builds, this is acceptable\n finalMap = null\n\n // Emit each extracted handler as a separate chunk for lazy loading\n // This ensures the virtual modules are included in the build\n if (config?.command === 'build' && !config?.build?.ssr) {\n for (const handlerName of splitResult.handlers) {\n const handlerId = createHandlerId(filename, handlerName)\n const virtualModuleId = `${VIRTUAL_HANDLER_RESOLVE_PREFIX}${handlerId}`\n this.emitFile({\n type: 'chunk',\n id: virtualModuleId,\n name: `handler-${handlerName}`,\n })\n }\n }\n }\n }\n\n const transformed: TransformResult = {\n code: finalCode,\n map: finalMap,\n }\n\n if (cacheKey) {\n await cacheStore.set(cacheKey, transformed)\n }\n\n return transformed\n } catch (error) {\n // Better error handling\n const message =\n error instanceof Error ? error.message : 'Unknown error during Fict transformation'\n\n this.error({\n message: `[fict] Transform failed for ${id}: ${message}`,\n id,\n })\n\n return null\n }\n },\n\n handleHotUpdate({ file, server }) {\n if (tsProject && file === tsProject.configPath) {\n resetTypeScriptProject()\n resetCache()\n }\n\n // Force full reload for .tsx/.jsx files to ensure reactive graph is rebuilt\n if (shouldTransform(file, include, exclude)) {\n server.ws.send({\n type: 'full-reload',\n path: '*',\n })\n }\n },\n\n generateBundle(_options, bundle) {\n if (!config || config.command !== 'build') return\n if (config.build.ssr) return\n\n const base = config.base ?? '/'\n const manifest: Record<string, string> = {}\n\n for (const output of Object.values(bundle)) {\n if (output.type !== 'chunk') continue\n const fileName = output.fileName\n const url = joinBasePath(base, fileName)\n for (const moduleId of Object.keys(output.modules)) {\n if (!moduleId) continue\n\n // Handle virtual handler modules\n if (moduleId.startsWith(VIRTUAL_HANDLER_PREFIX)) {\n const handlerId = moduleId.slice(VIRTUAL_HANDLER_PREFIX.length)\n // Map the virtual module resolve prefix to the chunk URL\n const virtualKey = `${VIRTUAL_HANDLER_RESOLVE_PREFIX}${handlerId}`\n if (!manifest[virtualKey]) {\n manifest[virtualKey] = url\n }\n continue\n }\n\n // Skip other virtual modules\n if (moduleId.startsWith('\\0')) continue\n\n const normalized = normalizeFileName(moduleId, config.root)\n if (!path.isAbsolute(normalized)) continue\n const key = pathToFileURL(normalized).href\n if (!manifest[key]) {\n manifest[key] = url\n }\n }\n }\n\n this.emitFile({\n type: 'asset',\n fileName: 'fict.manifest.json',\n source: JSON.stringify(manifest),\n })\n },\n }\n}\n\n/**\n * Check if a file should be transformed based on include/exclude patterns\n */\nfunction shouldTransform(id: string, include: string[], exclude: string[]): boolean {\n // Normalize path separators\n const normalizedId = stripQuery(id).replace(/\\\\/g, '/')\n\n // Check exclude patterns first\n for (const pattern of exclude) {\n if (matchPattern(normalizedId, pattern)) {\n return false\n }\n }\n\n // Check include patterns\n for (const pattern of include) {\n if (matchPattern(normalizedId, pattern)) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * Simple glob pattern matching\n * Supports: **\\/*.ext, *.ext, exact matches\n */\nfunction matchPattern(id: string, pattern: string): boolean {\n // Exact match\n if (id === pattern) return true\n\n // Simple check: if pattern ends with extension like *.tsx, just check if file ends with it\n if (pattern.startsWith('**/') || pattern.startsWith('*')) {\n const ext = pattern.replace(/^\\*\\*?\\//, '')\n if (ext.startsWith('*')) {\n // **/*.tsx -> check if ends with .tsx\n const ending = ext.replace(/^\\*/, '')\n return id.endsWith(ending)\n }\n }\n\n // Convert glob pattern to regex\n const regexPattern = pattern\n .replace(/\\./g, '\\\\.') // Escape dots\n .replace(/\\*\\*/g, '.*') // ** matches any path\n .replace(/\\*/g, '[^/]*') // * matches any non-slash\n\n const regex = new RegExp(`^${regexPattern}$`)\n return regex.test(id)\n}\n\n/**\n * Remove Vite query parameters (e.g. ?import, ?v=123) from an id\n */\nfunction stripQuery(id: string): string {\n const queryStart = id.indexOf('?')\n return queryStart === -1 ? id : id.slice(0, queryStart)\n}\n\nfunction normalizeCacheOptions(\n cacheOption: FictPluginOptions['cache'],\n config?: ResolvedConfig,\n): NormalizedCacheOptions {\n const defaultPersistent = config?.command === 'build'\n const defaultDir = config?.cacheDir ? path.join(config.cacheDir, 'fict') : undefined\n\n if (cacheOption === false) {\n return { enabled: false, persistent: false, dir: undefined }\n }\n\n if (cacheOption === true || cacheOption === undefined) {\n return { enabled: true, persistent: defaultPersistent, dir: defaultDir }\n }\n\n return {\n enabled: cacheOption.enabled ?? true,\n persistent: cacheOption.persistent ?? defaultPersistent,\n dir: cacheOption.dir ?? defaultDir,\n }\n}\n\nfunction normalizeFileName(id: string, root?: string): string {\n let clean = stripQuery(id)\n if (clean.startsWith('/@fs/')) {\n clean = clean.slice('/@fs/'.length)\n }\n if (clean.startsWith('file://')) {\n try {\n clean = fileURLToPath(clean)\n } catch {\n // fall through\n }\n }\n if (path.isAbsolute(clean)) return path.normalize(clean)\n if (root) return path.normalize(path.resolve(root, clean))\n return path.normalize(path.resolve(clean))\n}\n\nfunction joinBasePath(base: string, fileName: string): string {\n if (!base) return fileName\n if (base === '/') return `/${fileName}`\n const normalized = base.endsWith('/') ? base : `${base}/`\n return `${normalized}${fileName}`\n}\n\ninterface AliasEntry {\n find: string | RegExp\n replacement: string\n}\n\nfunction normalizeAliases(aliases: ResolvedConfig['resolve']['alias'] | undefined): AliasEntry[] {\n if (!aliases) return []\n if (Array.isArray(aliases)) {\n return aliases\n .map(alias => {\n if (!alias || !('find' in alias)) return null\n const replacement =\n typeof alias.replacement === 'string' ? alias.replacement : String(alias.replacement)\n return { find: alias.find, replacement } as AliasEntry\n })\n .filter((alias): alias is AliasEntry => !!alias)\n }\n return Object.entries(aliases).map(([find, replacement]) => ({\n find,\n replacement: typeof replacement === 'string' ? replacement : String(replacement),\n }))\n}\n\nfunction applyAlias(source: string, aliases: AliasEntry[]): string | null {\n for (const alias of aliases) {\n if (typeof alias.find === 'string') {\n if (source === alias.find || source.startsWith(`${alias.find}/`)) {\n return alias.replacement + source.slice(alias.find.length)\n }\n continue\n }\n if (alias.find instanceof RegExp && alias.find.test(source)) {\n return source.replace(alias.find, alias.replacement)\n }\n }\n return null\n}\n\nfunction hashString(value: string): string {\n return createHash('sha256').update(value).digest('hex')\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') {\n return JSON.stringify(value)\n }\n\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(',')}]`\n }\n\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined && typeof v !== 'function')\n .sort(([a], [b]) => a.localeCompare(b))\n\n const body = entries\n .map(([key, val]) => `${JSON.stringify(key)}:${stableStringify(val)}`)\n .join(',')\n\n return `{${body}}`\n}\n\nfunction normalizeOptionsForCache(options: FictCompilerOptions): Record<string, unknown> {\n const normalized: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(options)) {\n if (value === undefined || typeof value === 'function') continue\n if (key === 'typescript') {\n const tsInfo = value as {\n projectVersion?: number\n configPath?: string\n }\n normalized.typescript = {\n projectVersion: tsInfo?.projectVersion,\n configPath: tsInfo?.configPath,\n }\n continue\n }\n normalized[key] = value\n }\n return normalized\n}\n\nfunction buildCacheKey(\n filename: string,\n code: string,\n options: FictCompilerOptions,\n tsProject: TypeScriptProject | null,\n): string {\n const codeHash = hashString(code)\n const optionsHash = hashString(stableStringify(normalizeOptionsForCache(options)))\n const tsKey = tsProject ? `${tsProject.configHash}:${tsProject.projectVersion}` : ''\n return hashString([CACHE_VERSION, filename, codeHash, optionsHash, tsKey].join('|'))\n}\n\nclass TransformCache {\n private memory = new Map<string, CachedTransform>()\n\n constructor(private options: NormalizedCacheOptions) {}\n\n get enabled(): boolean {\n return this.options.enabled\n }\n\n async get(key: string): Promise<CachedTransform | null> {\n if (!this.options.enabled) return null\n const cached = this.memory.get(key)\n if (cached) return cached\n\n if (!this.options.persistent || !this.options.dir) return null\n\n const filePath = path.join(this.options.dir, `${key}.json`)\n try {\n const raw = await fs.readFile(filePath, 'utf8')\n const parsed = JSON.parse(raw) as CachedTransform\n if (!parsed || typeof parsed.code !== 'string') return null\n this.memory.set(key, parsed)\n return parsed\n } catch {\n return null\n }\n }\n\n async set(key: string, value: CachedTransform): Promise<void> {\n if (!this.options.enabled) return\n this.memory.set(key, value)\n if (!this.options.persistent || !this.options.dir) return\n\n const filePath = path.join(this.options.dir, `${key}.json`)\n try {\n await fs.mkdir(this.options.dir, { recursive: true })\n await fs.writeFile(filePath, JSON.stringify(value))\n } catch {\n // Ignore cache write failures\n }\n }\n\n clear(): void {\n this.memory.clear()\n }\n}\n\nfunction isTypeScriptApi(value: unknown): value is TypeScriptApi {\n if (!value || typeof value !== 'object') return false\n const candidate = value as Partial<TypeScriptApi>\n return (\n typeof candidate.findConfigFile === 'function' &&\n typeof candidate.readConfigFile === 'function' &&\n typeof candidate.parseJsonConfigFileContent === 'function' &&\n typeof candidate.createLanguageService === 'function' &&\n typeof candidate.createDocumentRegistry === 'function' &&\n typeof candidate.resolveModuleName === 'function' &&\n !!candidate.sys &&\n typeof candidate.sys === 'object' &&\n typeof candidate.sys.fileExists === 'function' &&\n typeof candidate.sys.readFile === 'function'\n )\n}\n\nfunction safeDebugString(value: unknown): string {\n try {\n return typeof value === 'string' ? value : JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\nfunction formatError(error: unknown): string {\n if (error instanceof Error) return error.message\n try {\n return JSON.stringify(error)\n } catch {\n return String(error)\n }\n}\n\nfunction buildPluginMessage(context: string, file: string, error: unknown): string {\n return `[fict-plugin] ${context} (${file}): ${formatError(error)}`\n}\n\nasync function loadTypeScript(): Promise<TypeScriptApi | null> {\n try {\n const mod = await import('typescript')\n const candidate = (mod as { default?: unknown }).default ?? mod\n return isTypeScriptApi(candidate) ? candidate : null\n } catch {\n return null\n }\n}\n\nfunction resolveTsconfigPath(\n ts: TypeScriptApi,\n rootDir: string,\n explicitPath?: string,\n): string | null {\n if (explicitPath) {\n return path.resolve(rootDir, explicitPath)\n }\n return ts.findConfigFile(rootDir, ts.sys.fileExists, 'tsconfig.json') ?? null\n}\n\nasync function createTypeScriptProject(\n ts: TypeScriptApi,\n rootDir: string,\n configPath: string,\n): Promise<TypeScriptProject | null> {\n const configText = ts.sys.readFile(configPath)\n if (!configText) return null\n const configHash = hashString(configText)\n\n const configFile = ts.readConfigFile(configPath, ts.sys.readFile)\n if (configFile.error) return null\n\n const parsed = ts.parseJsonConfigFileContent(configFile.config, ts.sys, path.dirname(configPath))\n\n const fileSet = new Set<string>(parsed.fileNames.map((name: string) => path.normalize(name)))\n const fileVersions = new Map<string, number>()\n const fileHashes = new Map<string, string>()\n const fileCache = new Map<string, string>()\n let projectVersion = 0\n\n const normalizeName = (fileName: string) => normalizeFileName(fileName, rootDir)\n\n const serviceHost: TypeScriptLanguageServiceHost = {\n getScriptFileNames: () => Array.from(fileSet),\n getScriptVersion: (fileName: string) => {\n const normalized = normalizeName(fileName)\n return String(fileVersions.get(normalized) ?? 0)\n },\n getScriptSnapshot: (fileName: string) => {\n const normalized = normalizeName(fileName)\n const text = fileCache.get(normalized) ?? ts.sys.readFile(normalized)\n if (text === undefined) return undefined\n return ts.ScriptSnapshot.fromString(text)\n },\n getCurrentDirectory: () => rootDir,\n getCompilationSettings: () => parsed.options,\n getDefaultLibFileName: (options: unknown) => ts.getDefaultLibFilePath(options),\n fileExists: ts.sys.fileExists,\n readFile: ts.sys.readFile,\n readDirectory: ts.sys.readDirectory,\n directoryExists: ts.sys.directoryExists,\n getDirectories: ts.sys.getDirectories,\n useCaseSensitiveFileNames: () => ts.sys.useCaseSensitiveFileNames,\n getNewLine: () => ts.sys.newLine,\n getProjectVersion: () => String(projectVersion),\n }\n\n const service = ts.createLanguageService(serviceHost, ts.createDocumentRegistry())\n\n const updateFile = (fileName: string, code: string) => {\n const normalized = normalizeName(fileName)\n const nextHash = hashString(code)\n if (fileHashes.get(normalized) === nextHash) return\n fileHashes.set(normalized, nextHash)\n fileCache.set(normalized, code)\n fileVersions.set(normalized, (fileVersions.get(normalized) ?? 0) + 1)\n fileSet.add(normalized)\n projectVersion += 1\n }\n\n return {\n configPath,\n configHash,\n get projectVersion() {\n return projectVersion\n },\n updateFile,\n getProgram: () => service.getProgram?.() ?? null,\n resolveModuleName: (specifier: string, containingFile: string) => {\n try {\n const resolved = ts.resolveModuleName(specifier, containingFile, parsed.options, ts.sys)\n return resolved?.resolvedModule?.resolvedFileName ?? null\n } catch {\n return null\n }\n },\n dispose: () => service.dispose?.(),\n }\n}\n\n// ============================================================================\n// Function-level Code Splitting Helpers\n// ============================================================================\n\n/**\n * Parse a handler ID into source module and export name.\n * Format: /path/to/module.tsx$$exportName (using $$ as separator to avoid URL fragment conflicts)\n */\nfunction parseHandlerId(handlerId: string): [string | null, string | null] {\n const separatorIndex = handlerId.lastIndexOf('$$')\n if (separatorIndex === -1) {\n return [handlerId, 'default']\n }\n return [handlerId.slice(0, separatorIndex), handlerId.slice(separatorIndex + 2)]\n}\n\n/**\n * Generate handler ID from source module and export name.\n * Uses $$ as separator to avoid conflicts with URL # fragments.\n */\nfunction createHandlerId(sourceModule: string, exportName: string): string {\n return `${sourceModule}$$${exportName}`\n}\n\n/**\n * Generate a standalone virtual module for an extracted handler.\n * The module contains the complete handler code with its own imports,\n * creating a truly independent chunk that doesn't depend on the source module.\n */\nfunction generateHandlerModule(handler: ExtractedHandler): string {\n // If no code was extracted (fallback case), use re-export\n if (!handler.code) {\n return `export { ${handler.exportName} as default } from '${handler.sourceModule}';\\n`\n }\n\n // Group imports by source module\n const importsByModule = new Map<string, string[]>()\n\n for (const helperName of handler.helpersUsed) {\n const helper = RUNTIME_HELPERS[helperName]\n if (!helper) continue\n\n const existing = importsByModule.get(helper.from) ?? []\n if (!existing.includes(helper.import)) {\n existing.push(helper.import)\n }\n importsByModule.set(helper.from, existing)\n }\n\n // Generate import statements for runtime helpers\n const imports: string[] = []\n for (const [module, names] of importsByModule) {\n imports.push(`import { ${names.join(', ')} } from '${module}';`)\n }\n\n // Import local dependencies from the source module\n // These are re-exported by the source module with __fict_dep_ prefix\n if (handler.localDeps.length > 0) {\n const depImports = handler.localDeps.map(dep => `${HANDLER_DEP_PREFIX}${dep} as ${dep}`)\n imports.push(`import { ${depImports.join(', ')} } from '${handler.sourceModule}';`)\n }\n\n // Generate the complete standalone module\n return `${imports.join('\\n')}${imports.length > 0 ? '\\n\\n' : ''}export default ${handler.code};\\n`\n}\n\n/** Prefix for re-exported handler dependencies */\nconst HANDLER_DEP_PREFIX = '__fict_dep_'\n\n/**\n * Register an extracted handler for function-level splitting.\n */\nexport function registerExtractedHandler(\n sourceModule: string,\n exportName: string,\n helpersUsed: string[],\n code: string,\n localDeps: string[] = [],\n): string {\n const handlerId = createHandlerId(sourceModule, exportName)\n extractedHandlers.set(handlerId, {\n sourceModule,\n exportName,\n helpersUsed,\n localDeps,\n code,\n })\n return `${VIRTUAL_HANDLER_RESOLVE_PREFIX}${handlerId}`\n}\n\n/**\n * Runtime helper name mappings for generating imports in virtual modules\n */\nconst RUNTIME_HELPERS: Record<string, { import: string; from: string }> = {\n __fictUseLexicalScope: { import: '__fictUseLexicalScope', from: '@fictjs/runtime/internal' },\n __fictGetScopeProps: { import: '__fictGetScopeProps', from: '@fictjs/runtime/internal' },\n __fictGetSSRScope: { import: '__fictGetSSRScope', from: '@fictjs/runtime/internal' },\n __fictEnsureScope: { import: '__fictEnsureScope', from: '@fictjs/runtime/internal' },\n __fictPrepareContext: { import: '__fictPrepareContext', from: '@fictjs/runtime/internal' },\n __fictPushContext: { import: '__fictPushContext', from: '@fictjs/runtime/internal' },\n __fictPopContext: { import: '__fictPopContext', from: '@fictjs/runtime/internal' },\n hydrateComponent: { import: 'hydrateComponent', from: '@fictjs/runtime/internal' },\n __fictQrl: { import: '__fictQrl', from: '@fictjs/runtime/internal' },\n}\n\n/** Known global identifiers that don't need to be imported */\nconst GLOBAL_IDENTIFIERS = new Set([\n // JavaScript globals\n 'undefined',\n 'null',\n 'true',\n 'false',\n 'NaN',\n 'Infinity',\n 'globalThis',\n 'window',\n 'document',\n 'console',\n 'setTimeout',\n 'setInterval',\n 'clearTimeout',\n 'clearInterval',\n 'requestAnimationFrame',\n 'cancelAnimationFrame',\n 'fetch',\n 'URL',\n 'URLSearchParams',\n 'FormData',\n 'Headers',\n 'Request',\n 'Response',\n 'AbortController',\n 'AbortSignal',\n // Built-in constructors\n 'Object',\n 'Array',\n 'String',\n 'Number',\n 'Boolean',\n 'Symbol',\n 'BigInt',\n 'Date',\n 'RegExp',\n 'Error',\n 'TypeError',\n 'RangeError',\n 'SyntaxError',\n 'Map',\n 'Set',\n 'WeakMap',\n 'WeakSet',\n 'Promise',\n 'Proxy',\n 'Reflect',\n 'JSON',\n 'Math',\n 'Intl',\n // Event and DOM\n 'Event',\n 'CustomEvent',\n 'Element',\n 'Node',\n 'HTMLElement',\n])\n\n/**\n * Collect identifiers referenced in an AST node that are not locally defined.\n * Uses simple recursive traversal instead of Babel's traverse to work on sub-nodes.\n */\nfunction collectReferencedIdentifiers(node: t.Node, localBindings: Set<string>): Set<string> {\n const referenced = new Set<string>()\n\n function visitNode(\n current: t.Node | null | undefined,\n parent: t.Node | null,\n key: string | null,\n ): void {\n if (!current) return\n\n if (t.isIdentifier(current)) {\n const name = current.name\n\n // Skip if it's a property access (obj.prop) - only the object is a reference\n if (\n parent &&\n t.isMemberExpression(parent) &&\n parent.property === current &&\n !parent.computed\n ) {\n return\n }\n\n // Skip if it's a key in object property (non-computed)\n if (parent && t.isObjectProperty(parent) && parent.key === current && !parent.computed) {\n return\n }\n\n // Skip if it's a function/variable declaration name\n if (parent && t.isVariableDeclarator(parent) && parent.id === current) {\n return\n }\n if (\n parent &&\n (t.isFunctionDeclaration(parent) || t.isFunctionExpression(parent)) &&\n parent.id === current\n ) {\n return\n }\n\n // Skip if it's a parameter\n if (key === 'params') {\n return\n }\n\n // Skip if it's a catch clause parameter\n if (parent && t.isCatchClause(parent) && parent.param === current) {\n return\n }\n\n // Skip local bindings (locally declared variables)\n if (localBindings.has(name)) {\n return\n }\n\n // Skip globals\n if (GLOBAL_IDENTIFIERS.has(name)) {\n return\n }\n\n // Skip runtime helpers\n if (RUNTIME_HELPERS[name]) {\n return\n }\n\n referenced.add(name)\n return\n }\n\n // Recursively visit child nodes\n for (const nodeKey of Object.keys(current)) {\n // Skip metadata keys that aren't child nodes\n if (\n nodeKey === 'loc' ||\n nodeKey === 'start' ||\n nodeKey === 'end' ||\n nodeKey === 'extra' ||\n nodeKey === 'comments' ||\n nodeKey === 'leadingComments' ||\n nodeKey === 'trailingComments' ||\n nodeKey === 'innerComments'\n ) {\n continue\n }\n const child = (current as unknown as Record<string, unknown>)[nodeKey]\n if (Array.isArray(child)) {\n for (const item of child) {\n if (\n item &&\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n typeof (item as Record<string, unknown>).type === 'string'\n ) {\n visitNode(item as t.Node, current, nodeKey)\n }\n }\n } else if (\n child &&\n typeof child === 'object' &&\n child !== null &&\n 'type' in child &&\n typeof (child as Record<string, unknown>).type === 'string'\n ) {\n visitNode(child as t.Node, current, nodeKey)\n }\n }\n }\n\n visitNode(node, null, null)\n return referenced\n}\n\n/**\n * Collect all bindings (variables, functions, params) defined within an AST node.\n * Uses simple recursive traversal instead of Babel's traverse to work on sub-nodes.\n */\nfunction collectLocalBindings(node: t.Node): Set<string> {\n const bindings = new Set<string>()\n\n function visitNode(current: t.Node | null | undefined): void {\n if (!current) return\n\n // Handle variable declarations\n if (t.isVariableDeclarator(current)) {\n if (t.isIdentifier(current.id)) {\n bindings.add(current.id.name)\n } else if (t.isObjectPattern(current.id) || t.isArrayPattern(current.id)) {\n const names = collectPatternIdentifiers(current.id)\n for (const name of names) {\n bindings.add(name)\n }\n }\n }\n\n // Handle function declarations\n if (t.isFunctionDeclaration(current)) {\n if (current.id) {\n bindings.add(current.id.name)\n }\n for (const param of current.params) {\n const names = collectPatternIdentifiers(param)\n for (const name of names) {\n bindings.add(name)\n }\n }\n }\n\n // Handle function expressions\n if (t.isFunctionExpression(current)) {\n for (const param of current.params) {\n const names = collectPatternIdentifiers(param)\n for (const name of names) {\n bindings.add(name)\n }\n }\n }\n\n // Handle arrow function expressions\n if (t.isArrowFunctionExpression(current)) {\n for (const param of current.params) {\n const names = collectPatternIdentifiers(param)\n for (const name of names) {\n bindings.add(name)\n }\n }\n }\n\n // Handle catch clauses\n if (t.isCatchClause(current)) {\n if (current.param && t.isIdentifier(current.param)) {\n bindings.add(current.param.name)\n }\n }\n\n // Recursively visit child nodes\n for (const nodeKey of Object.keys(current)) {\n // Skip metadata keys that aren't child nodes\n if (\n nodeKey === 'loc' ||\n nodeKey === 'start' ||\n nodeKey === 'end' ||\n nodeKey === 'extra' ||\n nodeKey === 'comments' ||\n nodeKey === 'leadingComments' ||\n nodeKey === 'trailingComments' ||\n nodeKey === 'innerComments'\n ) {\n continue\n }\n const child = (current as unknown as Record<string, unknown>)[nodeKey]\n if (Array.isArray(child)) {\n for (const item of child) {\n if (\n item &&\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n typeof (item as Record<string, unknown>).type === 'string'\n ) {\n visitNode(item as t.Node)\n }\n }\n } else if (\n child &&\n typeof child === 'object' &&\n child !== null &&\n 'type' in child &&\n typeof (child as Record<string, unknown>).type === 'string'\n ) {\n visitNode(child as t.Node)\n }\n }\n }\n\n visitNode(node)\n\n return bindings\n}\n\n/**\n * Collect identifier names from a pattern (for destructuring).\n */\nfunction collectPatternIdentifiers(pattern: t.LVal | t.PatternLike): string[] {\n const names: string[] = []\n\n if (t.isIdentifier(pattern)) {\n names.push(pattern.name)\n } else if (t.isObjectPattern(pattern)) {\n for (const prop of pattern.properties) {\n if (t.isObjectProperty(prop) && t.isLVal(prop.value)) {\n names.push(...collectPatternIdentifiers(prop.value))\n } else if (t.isRestElement(prop)) {\n names.push(...collectPatternIdentifiers(prop.argument))\n }\n }\n } else if (t.isArrayPattern(pattern)) {\n for (const element of pattern.elements) {\n if (element) {\n names.push(...collectPatternIdentifiers(element))\n }\n }\n } else if (t.isRestElement(pattern)) {\n names.push(...collectPatternIdentifiers(pattern.argument))\n } else if (t.isAssignmentPattern(pattern)) {\n names.push(...collectPatternIdentifiers(pattern.left))\n }\n\n return names\n}\n\n/**\n * Extract handlers using Babel AST and rewrite QRLs to use virtual modules.\n * This creates truly independent chunks for each handler.\n * Local dependencies are detected and re-exported for handlers to import.\n */\nfunction extractAndRewriteHandlers(\n code: string,\n sourceModule: string,\n): { code: string; handlers: string[] } | null {\n let ast: ReturnType<typeof parse>\n\n try {\n ast = parse(code, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n })\n } catch (error) {\n throw new Error(\n buildPluginMessage(\n 'Failed to parse transformed code for handler extraction',\n sourceModule,\n error,\n ),\n )\n }\n\n // Collect all top-level declarations that could be referenced by handlers\n const topLevelDeclarations = new Set<string>()\n const importedNames = new Set<string>()\n\n for (const node of ast.program.body) {\n // Collect imports\n if (t.isImportDeclaration(node)) {\n for (const specifier of node.specifiers) {\n if (t.isImportSpecifier(specifier) || t.isImportDefaultSpecifier(specifier)) {\n importedNames.add(specifier.local.name)\n } else if (t.isImportNamespaceSpecifier(specifier)) {\n importedNames.add(specifier.local.name)\n }\n }\n continue\n }\n\n // Collect function declarations\n if (t.isFunctionDeclaration(node) && node.id) {\n topLevelDeclarations.add(node.id.name)\n continue\n }\n\n // Collect variable declarations\n if (t.isVariableDeclaration(node)) {\n for (const declarator of node.declarations) {\n if (t.isIdentifier(declarator.id)) {\n topLevelDeclarations.add(declarator.id.name)\n }\n }\n continue\n }\n\n // Collect class declarations\n if (t.isClassDeclaration(node) && node.id) {\n topLevelDeclarations.add(node.id.name)\n continue\n }\n\n // Collect exported declarations\n if (t.isExportNamedDeclaration(node) && node.declaration) {\n if (t.isFunctionDeclaration(node.declaration) && node.declaration.id) {\n topLevelDeclarations.add(node.declaration.id.name)\n } else if (t.isVariableDeclaration(node.declaration)) {\n for (const declarator of node.declaration.declarations) {\n if (t.isIdentifier(declarator.id)) {\n topLevelDeclarations.add(declarator.id.name)\n }\n }\n } else if (t.isClassDeclaration(node.declaration) && node.declaration.id) {\n topLevelDeclarations.add(node.declaration.id.name)\n }\n }\n }\n\n // Merge imports into top-level declarations (they're also available at top level)\n for (const name of importedNames) {\n topLevelDeclarations.add(name)\n }\n\n const handlerNames: string[] = []\n const nodesToRemove = new Set<t.Node>()\n const allLocalDeps = new Set<string>()\n\n // First pass: find all handler exports and extract their code\n traverse(ast, {\n ExportNamedDeclaration(path) {\n const declaration = path.node.declaration\n\n // Handle: export const __fict_e0 = (scopeId, event, el) => { ... }\n if (t.isVariableDeclaration(declaration)) {\n for (const declarator of declaration.declarations) {\n if (!t.isIdentifier(declarator.id)) continue\n\n const name = declarator.id.name\n // Only extract event handlers (__fict_e*), not resume handlers (__fict_r*)\n // Resume handlers have complex component dependencies that can't be easily extracted\n if (!name.match(/^__fict_e\\d+$/)) continue\n\n if (!declarator.init) continue\n\n handlerNames.push(name)\n\n // Generate the handler function code\n const handlerCode = generate(declarator.init).code\n\n // Detect which runtime helpers are used\n const helpersUsed: string[] = []\n for (const helperName of Object.keys(RUNTIME_HELPERS)) {\n if (handlerCode.includes(helperName)) {\n helpersUsed.push(helperName)\n }\n }\n\n // Detect local dependencies\n const localBindings = collectLocalBindings(declarator.init)\n const referencedIds = collectReferencedIdentifiers(declarator.init, localBindings)\n const localDeps: string[] = []\n for (const ref of referencedIds) {\n // Only include if it's a top-level declaration (not a handler itself)\n if (topLevelDeclarations.has(ref) && !ref.match(/^__fict_[er]\\d+$/)) {\n localDeps.push(ref)\n allLocalDeps.add(ref)\n }\n }\n\n // Register the handler with its full code\n const handlerId = createHandlerId(sourceModule, name)\n extractedHandlers.set(handlerId, {\n sourceModule,\n exportName: name,\n helpersUsed,\n localDeps,\n code: handlerCode,\n })\n\n // Mark this export for removal\n nodesToRemove.add(path.node)\n }\n return\n }\n\n // Handle: export function __fict_e0(scopeId, event, el) { ... }\n if (t.isFunctionDeclaration(declaration) && declaration.id) {\n const name = declaration.id.name\n // Only extract event handlers (__fict_e*), not resume handlers (__fict_r*)\n // Resume handlers have complex component dependencies that can't be easily extracted\n if (!name.match(/^__fict_e\\d+$/)) return\n\n handlerNames.push(name)\n\n // Convert to arrow function expression for the virtual module\n const params = declaration.params\n const body = declaration.body\n const arrowFn = t.arrowFunctionExpression(params, body, declaration.async)\n\n // Generate the handler function code\n const handlerCode = generate(arrowFn).code\n\n // Detect which runtime helpers are used\n const helpersUsed: string[] = []\n for (const helperName of Object.keys(RUNTIME_HELPERS)) {\n if (handlerCode.includes(helperName)) {\n helpersUsed.push(helperName)\n }\n }\n\n // Detect local dependencies\n const localBindings = collectLocalBindings(arrowFn)\n const referencedIds = collectReferencedIdentifiers(arrowFn, localBindings)\n const localDeps: string[] = []\n for (const ref of referencedIds) {\n // Only include if it's a top-level declaration (not a handler itself)\n if (topLevelDeclarations.has(ref) && !ref.match(/^__fict_[er]\\d+$/)) {\n localDeps.push(ref)\n allLocalDeps.add(ref)\n }\n }\n\n // Register the handler with its full code\n const handlerId = createHandlerId(sourceModule, name)\n extractedHandlers.set(handlerId, {\n sourceModule,\n exportName: name,\n helpersUsed,\n localDeps,\n code: handlerCode,\n })\n\n // Mark this export for removal\n nodesToRemove.add(path.node)\n }\n },\n })\n\n if (handlerNames.length === 0) {\n return null\n }\n\n // Second pass: remove handler exports, rewrite QRL calls, and add re-exports for dependencies\n traverse(ast, {\n ExportNamedDeclaration(path) {\n if (nodesToRemove.has(path.node)) {\n path.remove()\n }\n },\n\n CallExpression(path) {\n // Rewrite __fictQrl(import.meta.url, \"__fict_e0\") -> \"virtual:...\"\n if (!t.isIdentifier(path.node.callee, { name: '__fictQrl' })) return\n if (path.node.arguments.length !== 2) return\n\n const secondArg = path.node.arguments[1]\n if (!t.isStringLiteral(secondArg)) return\n\n const handlerName = secondArg.value\n if (!handlerNames.includes(handlerName)) return\n\n // Replace with the virtual module URL\n const handlerId = createHandlerId(sourceModule, handlerName)\n const virtualUrl = `${VIRTUAL_HANDLER_RESOLVE_PREFIX}${handlerId}#default`\n path.replaceWith(t.stringLiteral(virtualUrl))\n },\n })\n\n // Add re-exports for local dependencies used by handlers\n // This allows handlers to import them from the source module\n if (allLocalDeps.size > 0) {\n const reExports: t.ExportSpecifier[] = []\n for (const dep of allLocalDeps) {\n // Export as __fict_dep_<name> to avoid conflicts\n reExports.push(\n t.exportSpecifier(t.identifier(dep), t.identifier(`${HANDLER_DEP_PREFIX}${dep}`)),\n )\n }\n ast.program.body.push(t.exportNamedDeclaration(null, reExports))\n }\n\n // Generate the modified code\n const result = generate(ast, {\n retainLines: true,\n compact: false,\n })\n\n return { code: result.code, handlers: handlerNames }\n}\n"],"mappings":"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","names":["include","exclude","tsProject","path"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { createHash } from 'node:crypto'\nimport { promises as fs } from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\n\nimport { transformAsync } from '@babel/core'\nimport _generate from '@babel/generator'\nimport { parse } from '@babel/parser'\nimport _traverse from '@babel/traverse'\nimport * as t from '@babel/types'\nimport { createFictPlugin, type FictCompilerOptions } from '@fictjs/compiler'\nimport type { Plugin, ResolvedConfig, TransformResult } from 'vite'\n\n// Handle ESM/CJS interop for Babel packages\nconst traverse = (\n typeof _traverse === 'function' ? _traverse : (_traverse as { default: typeof _traverse }).default\n) as typeof _traverse\nconst generate = (\n typeof _generate === 'function' ? _generate : (_generate as { default: typeof _generate }).default\n) as typeof _generate\n\nexport interface FictPluginOptions extends FictCompilerOptions {\n /**\n * File patterns to include for transformation.\n * @default ['**\\/*.tsx', '**\\/*.jsx']\n */\n include?: string[]\n /**\n * File patterns to exclude from transformation.\n * @default ['**\\/node_modules\\/**']\n */\n exclude?: string[]\n /**\n * Transform cache settings (memory + optional persistent disk cache).\n * Set to false to disable caching entirely.\n */\n cache?:\n | boolean\n | {\n enabled?: boolean\n persistent?: boolean\n dir?: string\n }\n /**\n * Explicit tsconfig path for TypeScript project integration.\n * If omitted, the plugin will search from Vite root.\n */\n tsconfigPath?: string\n /**\n * Enable TypeScript project integration when TypeScript is available.\n * @default true\n */\n useTypeScriptProject?: boolean\n /**\n * Enable function-level code splitting for resumable handlers.\n * When enabled, event handlers and resume functions are extracted\n * to separate chunks for optimal lazy loading.\n * @default false for dev, true for production build\n */\n functionSplitting?: boolean\n /**\n * Enable verbose debug logs from the plugin.\n * Can also be enabled via `FICT_VITE_PLUGIN_DEBUG=1`.\n * @default false\n */\n debug?: boolean\n}\n\ninterface NormalizedCacheOptions {\n enabled: boolean\n persistent: boolean\n dir?: string\n}\n\ninterface CachedTransform {\n code: string\n map: TransformResult['map']\n}\n\ninterface TypeScriptProject {\n configPath: string\n configHash: string\n readonly projectVersion: number\n updateFile: (fileName: string, code: string) => void\n getProgram: () => TypeScriptProgram | null\n resolveModuleName: (specifier: string, containingFile: string) => string | null\n dispose: () => void\n}\n\ninterface TypeScriptProgram {\n getTypeChecker?: () => unknown\n}\n\ninterface TypeScriptSystem {\n fileExists: (path: string) => boolean\n readFile: (path: string) => string | undefined\n readDirectory: (...args: unknown[]) => string[]\n directoryExists?: (path: string) => boolean\n getDirectories?: (path: string) => string[]\n useCaseSensitiveFileNames: boolean\n newLine: string\n}\n\ninterface TypeScriptParsedConfig {\n fileNames: string[]\n options: unknown\n}\n\ninterface TypeScriptLanguageService {\n getProgram?: () => TypeScriptProgram | null\n dispose?: () => void\n}\n\ninterface TypeScriptLanguageServiceHost {\n getScriptFileNames: () => string[]\n getScriptVersion: (fileName: string) => string\n getScriptSnapshot: (fileName: string) => unknown\n getCurrentDirectory: () => string\n getCompilationSettings: () => unknown\n getDefaultLibFileName: (options: unknown) => string\n fileExists: TypeScriptSystem['fileExists']\n readFile: TypeScriptSystem['readFile']\n readDirectory: TypeScriptSystem['readDirectory']\n directoryExists?: TypeScriptSystem['directoryExists']\n getDirectories?: TypeScriptSystem['getDirectories']\n useCaseSensitiveFileNames: () => boolean\n getNewLine: () => string\n getProjectVersion: () => string\n}\n\ninterface TypeScriptApi {\n sys: TypeScriptSystem\n findConfigFile: (\n searchPath: string,\n fileExists: TypeScriptSystem['fileExists'],\n configName: string,\n ) => string | undefined\n readConfigFile: (\n configPath: string,\n readFile: TypeScriptSystem['readFile'],\n ) => { config: unknown; error?: unknown }\n parseJsonConfigFileContent: (\n config: unknown,\n host: TypeScriptSystem,\n basePath: string,\n ) => TypeScriptParsedConfig\n ScriptSnapshot: {\n fromString: (text: string) => unknown\n }\n getDefaultLibFilePath: (options: unknown) => string\n createLanguageService: (\n host: TypeScriptLanguageServiceHost,\n registry: unknown,\n ) => TypeScriptLanguageService\n createDocumentRegistry: () => unknown\n resolveModuleName: (\n specifier: string,\n containingFile: string,\n options: unknown,\n host: TypeScriptSystem,\n ) => { resolvedModule?: { resolvedFileName?: string } } | undefined\n}\n\nconst CACHE_VERSION = 1\nconst MODULE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.mts', '.cts']\n\n// Virtual module prefix for extracted handlers\nconst VIRTUAL_HANDLER_PREFIX = '\\0fict-handler:'\nconst VIRTUAL_HANDLER_RESOLVE_PREFIX = 'virtual:fict-handler:'\n\n/**\n * Information about an extracted resumable handler\n */\ninterface ExtractedHandler {\n /** The module this handler was extracted from */\n sourceModule: string\n /** The export name in the source module */\n exportName: string\n /** Runtime helpers used by this handler */\n helpersUsed: string[]\n /** Local dependencies from source module that need to be re-exported */\n localDeps: string[]\n /** The handler function code (without export) */\n code: string\n}\n\n/**\n * Registry for extracted handlers during compilation\n */\nconst extractedHandlers = new Map<string, ExtractedHandler>()\n\n/**\n * Vite plugin for Fict reactive UI library.\n *\n * Transforms $state and $effect calls into reactive signals using the Fict compiler.\n *\n * @example\n * ```ts\n * // vite.config.ts\n * import { defineConfig } from 'vite'\n * import fict from '@fictjs/vite-plugin'\n *\n * export default defineConfig({\n * plugins: [fict()],\n * })\n * ```\n */\nexport default function fict(options: FictPluginOptions = {}): Plugin {\n const {\n include = ['**/*.tsx', '**/*.jsx'],\n exclude = ['**/node_modules/**'],\n cache: cacheOption,\n tsconfigPath,\n useTypeScriptProject = true,\n debug: debugOption,\n ...compilerOptions\n } = options\n\n let config: ResolvedConfig | undefined\n let isDev = false\n let cache: TransformCache | null = null\n let tsProject: TypeScriptProject | null = null\n let tsProjectInit: Promise<TypeScriptProject | null> | null = null\n const moduleMetadata: FictCompilerOptions['moduleMetadata'] = new Map()\n const debugEnabled =\n debugOption === true ||\n process.env.FICT_VITE_PLUGIN_DEBUG === '1' ||\n process.env.FICT_VITE_PLUGIN_DEBUG === 'true'\n\n const debugLog = (message: string, details?: unknown) => {\n if (!debugEnabled) return\n const payload = details === undefined ? '' : ` ${safeDebugString(details)}`\n config?.logger?.info(`[fict-plugin] ${message}${payload}`)\n }\n\n const ensureCache = () => {\n if (cache) return cache\n const normalized = normalizeCacheOptions(cacheOption, config)\n cache = new TransformCache(normalized)\n return cache\n }\n\n const resetCache = () => {\n cache?.clear()\n cache = null\n }\n\n const ensureTypeScriptProject = async () => {\n if (!useTypeScriptProject) return null\n if (tsProject) return tsProject\n if (!tsProjectInit) {\n tsProjectInit = (async () => {\n const ts = await loadTypeScript()\n if (!ts) return null\n const rootDir = config?.root ?? process.cwd()\n const resolvedConfigPath = resolveTsconfigPath(ts, rootDir, tsconfigPath)\n if (!resolvedConfigPath) return null\n return createTypeScriptProject(ts, rootDir, resolvedConfigPath)\n })()\n }\n tsProject = await tsProjectInit\n return tsProject\n }\n\n const resetTypeScriptProject = () => {\n if (tsProject) {\n tsProject.dispose()\n }\n tsProject = null\n tsProjectInit = null\n }\n\n return {\n name: 'vite-plugin-fict',\n\n enforce: 'pre',\n\n configResolved(resolvedConfig) {\n config = resolvedConfig\n isDev = config.command === 'serve' || config.mode === 'development'\n // Rebuild cache with resolved config so cacheDir is available\n resetCache()\n // Clear extracted handlers from previous builds\n extractedHandlers.clear()\n },\n\n resolveId(id: string) {\n // Handle virtual handler modules\n if (id.startsWith(VIRTUAL_HANDLER_RESOLVE_PREFIX)) {\n return VIRTUAL_HANDLER_PREFIX + id.slice(VIRTUAL_HANDLER_RESOLVE_PREFIX.length)\n }\n return null\n },\n\n load(id: string) {\n // Load virtual handler modules\n if (!id.startsWith(VIRTUAL_HANDLER_PREFIX)) {\n return null\n }\n\n const handlerId = id.slice(VIRTUAL_HANDLER_PREFIX.length)\n debugLog(`Loading virtual module: ${handlerId}`, {\n registrySize: extractedHandlers.size,\n handlers: Array.from(extractedHandlers.keys()),\n })\n const handler = extractedHandlers.get(handlerId)\n if (handler) {\n const generatedCode = generateHandlerModule(handler)\n debugLog(`Generated virtual module (${generatedCode.length} chars)`, {\n preview: generatedCode.slice(0, 200),\n })\n return generatedCode\n }\n\n if (!handler) {\n // In dev mode or when splitting is disabled, the handler is still in the main module\n // Generate a re-export from the source module\n const [sourceModule, exportName] = parseHandlerId(handlerId)\n if (sourceModule && exportName) {\n return `export { ${exportName} as default } from '${sourceModule}'`\n }\n return null\n }\n\n // Generate the virtual module with the handler code\n return generateHandlerModule(handler)\n },\n\n config(userConfig, env) {\n const userOptimize = userConfig.optimizeDeps\n const hasUserOptimize = !!userOptimize\n const hasDisabledOptimize =\n hasUserOptimize && (userOptimize as { disabled?: boolean }).disabled === true\n\n const include = new Set(userOptimize?.include ?? [])\n const exclude = new Set(userOptimize?.exclude ?? [])\n const dedupe = new Set((userConfig.resolve?.dedupe ?? []) as string[])\n\n // Avoid duplicate runtime instances between pre-bundled deps and /@fs modules.\n // Exclude all workspace packages from prebundling to ensure changes take effect\n // immediately without requiring node_modules reinstall.\n const workspaceDeps = [\n 'fict',\n 'fict/plus',\n 'fict/advanced',\n 'fict/slim',\n 'fict/jsx-runtime',\n 'fict/jsx-dev-runtime',\n '@fictjs/runtime',\n '@fictjs/runtime/internal',\n '@fictjs/runtime/advanced',\n '@fictjs/runtime/jsx-runtime',\n '@fictjs/runtime/jsx-dev-runtime',\n '@fictjs/compiler',\n '@fictjs/devtools',\n '@fictjs/devtools/core',\n '@fictjs/devtools/vite',\n '@fictjs/router',\n '@fictjs/ssr',\n '@fictjs/testing-library',\n ]\n for (const dep of workspaceDeps) {\n include.delete(dep)\n exclude.add(dep)\n }\n // Only dedupe core runtime packages to avoid duplicate instances\n const dedupePackages = ['fict', '@fictjs/runtime', '@fictjs/runtime/internal']\n for (const dep of dedupePackages) {\n dedupe.add(dep)\n }\n\n // Determine if we're in dev mode based on command or mode\n const devMode = env.command === 'serve' || env.mode === 'development'\n\n return {\n // Define __DEV__ for runtime devtools support\n // In dev mode, enable devtools; in production, disable them for smaller bundles\n define: {\n __DEV__: String(devMode),\n ...(userConfig.define ?? {}),\n },\n esbuild: {\n // Disable esbuild JSX handling for .tsx/.jsx files\n // Our plugin will handle the full transformation\n include: /\\.(ts|js|mts|mjs|cjs)$/,\n },\n build: {\n rollupOptions: {\n // Preserve exports in entry chunks to prevent tree-shaking of handler exports\n preserveEntrySignatures: 'exports-only',\n },\n },\n resolve: {\n ...(userConfig.resolve ?? {}),\n dedupe: Array.from(dedupe),\n },\n // Watch workspace packages dist directories for changes in dev mode\n // This ensures HMR picks up rebuilt packages without needing to restart\n server: {\n watch: {\n ignored: ['!**/node_modules/@fictjs/**', '!**/node_modules/fict/**'],\n },\n },\n ...(hasDisabledOptimize\n ? { optimizeDeps: userOptimize }\n : {\n optimizeDeps: hasUserOptimize\n ? { ...userOptimize, include: Array.from(include), exclude: Array.from(exclude) }\n : { exclude: workspaceDeps },\n }),\n }\n },\n\n async transform(code: string, id: string): Promise<TransformResult | null> {\n const filename = stripQuery(id)\n\n // Skip non-matching files\n if (!shouldTransform(filename, include, exclude)) {\n return null\n }\n\n const aliasEntries = normalizeAliases(config?.resolve?.alias)\n const fictOptions: FictCompilerOptions = {\n ...compilerOptions,\n dev: compilerOptions.dev ?? isDev,\n sourcemap: compilerOptions.sourcemap ?? true,\n filename,\n moduleMetadata,\n resolveModuleMetadata: (source, importer) => {\n const userResolved = compilerOptions.resolveModuleMetadata?.(source, importer)\n if (userResolved) return userResolved\n if (!importer) return undefined\n\n const importerFile = normalizeFileName(importer, config?.root)\n const lookupMetadata = (resolved: string) => {\n const direct = moduleMetadata.get(resolved)\n if (direct) return direct\n const ext = path.extname(resolved)\n if (!ext) {\n for (const suffix of MODULE_EXTENSIONS) {\n const byExt = moduleMetadata.get(`${resolved}${suffix}`)\n if (byExt) return byExt\n }\n for (const suffix of MODULE_EXTENSIONS) {\n const byIndex = moduleMetadata.get(path.join(resolved, `index${suffix}`))\n if (byIndex) return byIndex\n }\n }\n return undefined\n }\n let resolvedSource: string | null = null\n\n if (path.isAbsolute(source)) {\n resolvedSource = normalizeFileName(source, config?.root)\n } else if (source.startsWith('.')) {\n resolvedSource = normalizeFileName(\n path.resolve(path.dirname(importerFile), source),\n config?.root,\n )\n } else {\n const aliased = applyAlias(source, aliasEntries)\n if (aliased) {\n if (path.isAbsolute(aliased)) {\n resolvedSource = normalizeFileName(aliased, config?.root)\n } else if (aliased.startsWith('.')) {\n resolvedSource = normalizeFileName(\n path.resolve(path.dirname(importerFile), aliased),\n config?.root,\n )\n } else if (config?.root) {\n resolvedSource = normalizeFileName(path.resolve(config.root, aliased), config?.root)\n }\n } else if (tsProject) {\n const tsResolved = tsProject.resolveModuleName(source, importerFile)\n if (tsResolved) {\n resolvedSource = normalizeFileName(tsResolved, config?.root)\n }\n }\n }\n\n if (!resolvedSource) return undefined\n return lookupMetadata(resolvedSource)\n },\n }\n\n const tsProject = await ensureTypeScriptProject()\n if (tsProject) {\n const resolvedName = normalizeFileName(filename, config?.root)\n tsProject.updateFile(resolvedName, code)\n const program = tsProject.getProgram()\n const checker =\n program && typeof program.getTypeChecker === 'function'\n ? program.getTypeChecker()\n : undefined\n fictOptions.typescript = {\n program: program ?? undefined,\n checker,\n projectVersion: tsProject.projectVersion,\n configPath: tsProject.configPath,\n }\n }\n\n const cacheStore = ensureCache()\n const cacheKey = cacheStore.enabled\n ? buildCacheKey(filename, code, fictOptions, tsProject)\n : null\n\n if (cacheKey) {\n const cached = await cacheStore.get(cacheKey)\n if (cached) {\n return cached\n }\n }\n\n try {\n const precompiledInput = isPrecompiledFictModule(code)\n let finalCode: string\n let finalMap: TransformResult['map']\n\n if (precompiledInput) {\n finalCode = code\n finalMap = null\n } else {\n const isTypeScript = filename.endsWith('.tsx') || filename.endsWith('.ts')\n\n const result = await transformAsync(code, {\n filename,\n sourceMaps: fictOptions.sourcemap,\n sourceFileName: filename,\n presets: isTypeScript\n ? [['@babel/preset-typescript', { isTSX: true, allExtensions: true }]]\n : [],\n plugins: [\n ['@babel/plugin-syntax-jsx', {}],\n [createFictPlugin, fictOptions],\n ],\n })\n\n if (!result || !result.code) {\n return null\n }\n\n finalCode = result.code\n finalMap = result.map as TransformResult['map']\n }\n\n // Apply function-level code splitting in production builds\n // For SSR builds with resumable enabled, we also need to rewrite QRLs to virtual URLs\n // so they match the manifest generated by the client build\n const shouldSplit =\n options.functionSplitting ??\n (config?.command === 'build' && (compilerOptions.resumable || !config?.build?.ssr))\n\n debugLog('Function split decision', {\n shouldSplit,\n ssr: config?.build?.ssr,\n resumable: compilerOptions.resumable,\n file: filename,\n })\n if (shouldSplit) {\n let splitResult: { code: string; handlers: string[] } | null = null\n try {\n splitResult = extractAndRewriteHandlers(finalCode, filename)\n } catch (error) {\n this.warn(buildPluginMessage('extractAndRewriteHandlers failed', filename, error))\n }\n debugLog('Split result', {\n file: filename,\n handlers: splitResult?.handlers.length ?? 0,\n })\n if (splitResult) {\n debugLog(`Function splitting extracted ${splitResult.handlers.length} handlers`, {\n file: filename,\n })\n finalCode = splitResult.code\n // Note: source maps are invalidated by this rewrite\n // For production builds, this is acceptable\n finalMap = null\n\n // Emit each extracted handler as a separate chunk for lazy loading\n // This ensures the virtual modules are included in the build\n if (config?.command === 'build' && !config?.build?.ssr) {\n for (const handlerName of splitResult.handlers) {\n const handlerId = createHandlerId(filename, handlerName)\n const virtualModuleId = `${VIRTUAL_HANDLER_RESOLVE_PREFIX}${handlerId}`\n this.emitFile({\n type: 'chunk',\n id: virtualModuleId,\n name: `handler-${handlerName}`,\n })\n }\n }\n }\n }\n\n const transformed: TransformResult = {\n code: finalCode,\n map: finalMap,\n }\n\n if (cacheKey) {\n await cacheStore.set(cacheKey, transformed)\n }\n\n return transformed\n } catch (error) {\n // Better error handling\n const message =\n error instanceof Error ? error.message : 'Unknown error during Fict transformation'\n\n this.error({\n message: `[fict] Transform failed for ${id}: ${message}`,\n id,\n })\n\n return null\n }\n },\n\n handleHotUpdate({ file, server }) {\n if (tsProject && file === tsProject.configPath) {\n resetTypeScriptProject()\n resetCache()\n }\n\n // Force full reload for .tsx/.jsx files to ensure reactive graph is rebuilt\n if (shouldTransform(file, include, exclude)) {\n server.ws.send({\n type: 'full-reload',\n path: '*',\n })\n }\n },\n\n generateBundle(_options, bundle) {\n if (!config || config.command !== 'build') return\n if (config.build.ssr) return\n\n const base = config.base ?? '/'\n const manifest: Record<string, string> = {}\n\n for (const output of Object.values(bundle)) {\n if (output.type !== 'chunk') continue\n const fileName = output.fileName\n const url = joinBasePath(base, fileName)\n for (const moduleId of Object.keys(output.modules)) {\n if (!moduleId) continue\n\n // Handle virtual handler modules\n if (moduleId.startsWith(VIRTUAL_HANDLER_PREFIX)) {\n const handlerId = moduleId.slice(VIRTUAL_HANDLER_PREFIX.length)\n // Map the virtual module resolve prefix to the chunk URL\n const virtualKey = `${VIRTUAL_HANDLER_RESOLVE_PREFIX}${handlerId}`\n if (!manifest[virtualKey]) {\n manifest[virtualKey] = url\n }\n continue\n }\n\n // Skip other virtual modules\n if (moduleId.startsWith('\\0')) continue\n\n const normalized = normalizeFileName(moduleId, config.root)\n if (!path.isAbsolute(normalized)) continue\n const key = pathToFileURL(normalized).href\n if (!manifest[key]) {\n manifest[key] = url\n }\n }\n }\n\n this.emitFile({\n type: 'asset',\n fileName: 'fict.manifest.json',\n source: JSON.stringify(manifest),\n })\n },\n }\n}\n\n/**\n * Check if a file should be transformed based on include/exclude patterns\n */\nfunction shouldTransform(id: string, include: string[], exclude: string[]): boolean {\n // Normalize path separators\n const normalizedId = stripQuery(id).replace(/\\\\/g, '/')\n\n // Check exclude patterns first\n for (const pattern of exclude) {\n if (matchPattern(normalizedId, pattern)) {\n return false\n }\n }\n\n // Check include patterns\n for (const pattern of include) {\n if (matchPattern(normalizedId, pattern)) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * Simple glob pattern matching\n * Supports: **\\/*.ext, *.ext, exact matches\n */\nfunction matchPattern(id: string, pattern: string): boolean {\n // Exact match\n if (id === pattern) return true\n\n // Simple check: if pattern ends with extension like *.tsx, just check if file ends with it\n if (pattern.startsWith('**/') || pattern.startsWith('*')) {\n const ext = pattern.replace(/^\\*\\*?\\//, '')\n if (ext.startsWith('*')) {\n // **/*.tsx -> check if ends with .tsx\n const ending = ext.replace(/^\\*/, '')\n return id.endsWith(ending)\n }\n }\n\n // Convert glob pattern to regex\n const regexPattern = pattern\n .replace(/\\./g, '\\\\.') // Escape dots\n .replace(/\\*\\*/g, '.*') // ** matches any path\n .replace(/\\*/g, '[^/]*') // * matches any non-slash\n\n const regex = new RegExp(`^${regexPattern}$`)\n return regex.test(id)\n}\n\n/**\n * Remove Vite query parameters (e.g. ?import, ?v=123) from an id\n */\nfunction stripQuery(id: string): string {\n const queryStart = id.indexOf('?')\n return queryStart === -1 ? id : id.slice(0, queryStart)\n}\n\nfunction normalizeCacheOptions(\n cacheOption: FictPluginOptions['cache'],\n config?: ResolvedConfig,\n): NormalizedCacheOptions {\n const defaultPersistent = config?.command === 'build'\n const defaultDir = config?.cacheDir ? path.join(config.cacheDir, 'fict') : undefined\n\n if (cacheOption === false) {\n return { enabled: false, persistent: false, dir: undefined }\n }\n\n if (cacheOption === true || cacheOption === undefined) {\n return { enabled: true, persistent: defaultPersistent, dir: defaultDir }\n }\n\n return {\n enabled: cacheOption.enabled ?? true,\n persistent: cacheOption.persistent ?? defaultPersistent,\n dir: cacheOption.dir ?? defaultDir,\n }\n}\n\nfunction normalizeFileName(id: string, root?: string): string {\n let clean = stripQuery(id)\n if (clean.startsWith('/@fs/')) {\n clean = clean.slice('/@fs/'.length)\n }\n if (clean.startsWith('file://')) {\n try {\n clean = fileURLToPath(clean)\n } catch {\n // fall through\n }\n }\n if (path.isAbsolute(clean)) return path.normalize(clean)\n if (root) return path.normalize(path.resolve(root, clean))\n return path.normalize(path.resolve(clean))\n}\n\n/**\n * Detect modules that already contain compiler output.\n * Re-running the compiler on these inputs can produce false diagnostics.\n */\nfunction isPrecompiledFictModule(code: string): boolean {\n const hasCompilerMarker =\n code.includes('__fict_hir_codegen__') ||\n code.includes('__fictQrl(') ||\n code.includes('__fictUseLexicalScope')\n\n if (!hasCompilerMarker) {\n return false\n }\n\n return /export\\s+(?:const|function)\\s+__fict_[er]\\d+/.test(code)\n}\n\nfunction joinBasePath(base: string, fileName: string): string {\n if (!base) return fileName\n if (base === '/') return `/${fileName}`\n const normalized = base.endsWith('/') ? base : `${base}/`\n return `${normalized}${fileName}`\n}\n\ninterface AliasEntry {\n find: string | RegExp\n replacement: string\n}\n\nfunction normalizeAliases(aliases: ResolvedConfig['resolve']['alias'] | undefined): AliasEntry[] {\n if (!aliases) return []\n if (Array.isArray(aliases)) {\n return aliases\n .map(alias => {\n if (!alias || !('find' in alias)) return null\n const replacement =\n typeof alias.replacement === 'string' ? alias.replacement : String(alias.replacement)\n return { find: alias.find, replacement } as AliasEntry\n })\n .filter((alias): alias is AliasEntry => !!alias)\n }\n return Object.entries(aliases).map(([find, replacement]) => ({\n find,\n replacement: typeof replacement === 'string' ? replacement : String(replacement),\n }))\n}\n\nfunction applyAlias(source: string, aliases: AliasEntry[]): string | null {\n for (const alias of aliases) {\n if (typeof alias.find === 'string') {\n if (source === alias.find || source.startsWith(`${alias.find}/`)) {\n return alias.replacement + source.slice(alias.find.length)\n }\n continue\n }\n if (alias.find instanceof RegExp && alias.find.test(source)) {\n return source.replace(alias.find, alias.replacement)\n }\n }\n return null\n}\n\nfunction hashString(value: string): string {\n return createHash('sha256').update(value).digest('hex')\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') {\n return JSON.stringify(value)\n }\n\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(',')}]`\n }\n\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined && typeof v !== 'function')\n .sort(([a], [b]) => a.localeCompare(b))\n\n const body = entries\n .map(([key, val]) => `${JSON.stringify(key)}:${stableStringify(val)}`)\n .join(',')\n\n return `{${body}}`\n}\n\nfunction normalizeOptionsForCache(options: FictCompilerOptions): Record<string, unknown> {\n const normalized: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(options)) {\n if (value === undefined || typeof value === 'function') continue\n if (key === 'typescript') {\n const tsInfo = value as {\n projectVersion?: number\n configPath?: string\n }\n normalized.typescript = {\n projectVersion: tsInfo?.projectVersion,\n configPath: tsInfo?.configPath,\n }\n continue\n }\n normalized[key] = value\n }\n return normalized\n}\n\nfunction buildCacheKey(\n filename: string,\n code: string,\n options: FictCompilerOptions,\n tsProject: TypeScriptProject | null,\n): string {\n const codeHash = hashString(code)\n const optionsHash = hashString(stableStringify(normalizeOptionsForCache(options)))\n const tsKey = tsProject ? `${tsProject.configHash}:${tsProject.projectVersion}` : ''\n return hashString([CACHE_VERSION, filename, codeHash, optionsHash, tsKey].join('|'))\n}\n\nclass TransformCache {\n private memory = new Map<string, CachedTransform>()\n\n constructor(private options: NormalizedCacheOptions) {}\n\n get enabled(): boolean {\n return this.options.enabled\n }\n\n async get(key: string): Promise<CachedTransform | null> {\n if (!this.options.enabled) return null\n const cached = this.memory.get(key)\n if (cached) return cached\n\n if (!this.options.persistent || !this.options.dir) return null\n\n const filePath = path.join(this.options.dir, `${key}.json`)\n try {\n const raw = await fs.readFile(filePath, 'utf8')\n const parsed = JSON.parse(raw) as CachedTransform\n if (!parsed || typeof parsed.code !== 'string') return null\n this.memory.set(key, parsed)\n return parsed\n } catch {\n return null\n }\n }\n\n async set(key: string, value: CachedTransform): Promise<void> {\n if (!this.options.enabled) return\n this.memory.set(key, value)\n if (!this.options.persistent || !this.options.dir) return\n\n const filePath = path.join(this.options.dir, `${key}.json`)\n try {\n await fs.mkdir(this.options.dir, { recursive: true })\n await fs.writeFile(filePath, JSON.stringify(value))\n } catch {\n // Ignore cache write failures\n }\n }\n\n clear(): void {\n this.memory.clear()\n }\n}\n\nfunction isTypeScriptApi(value: unknown): value is TypeScriptApi {\n if (!value || typeof value !== 'object') return false\n const candidate = value as Partial<TypeScriptApi>\n return (\n typeof candidate.findConfigFile === 'function' &&\n typeof candidate.readConfigFile === 'function' &&\n typeof candidate.parseJsonConfigFileContent === 'function' &&\n typeof candidate.createLanguageService === 'function' &&\n typeof candidate.createDocumentRegistry === 'function' &&\n typeof candidate.resolveModuleName === 'function' &&\n !!candidate.sys &&\n typeof candidate.sys === 'object' &&\n typeof candidate.sys.fileExists === 'function' &&\n typeof candidate.sys.readFile === 'function'\n )\n}\n\nfunction safeDebugString(value: unknown): string {\n try {\n return typeof value === 'string' ? value : JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\nfunction formatError(error: unknown): string {\n if (error instanceof Error) return error.message\n try {\n return JSON.stringify(error)\n } catch {\n return String(error)\n }\n}\n\nfunction buildPluginMessage(context: string, file: string, error: unknown): string {\n return `[fict-plugin] ${context} (${file}): ${formatError(error)}`\n}\n\nasync function loadTypeScript(): Promise<TypeScriptApi | null> {\n try {\n const mod = await import('typescript')\n const candidate = (mod as { default?: unknown }).default ?? mod\n return isTypeScriptApi(candidate) ? candidate : null\n } catch {\n return null\n }\n}\n\nfunction resolveTsconfigPath(\n ts: TypeScriptApi,\n rootDir: string,\n explicitPath?: string,\n): string | null {\n if (explicitPath) {\n return path.resolve(rootDir, explicitPath)\n }\n return ts.findConfigFile(rootDir, ts.sys.fileExists, 'tsconfig.json') ?? null\n}\n\nasync function createTypeScriptProject(\n ts: TypeScriptApi,\n rootDir: string,\n configPath: string,\n): Promise<TypeScriptProject | null> {\n const configText = ts.sys.readFile(configPath)\n if (!configText) return null\n const configHash = hashString(configText)\n\n const configFile = ts.readConfigFile(configPath, ts.sys.readFile)\n if (configFile.error) return null\n\n const parsed = ts.parseJsonConfigFileContent(configFile.config, ts.sys, path.dirname(configPath))\n\n const fileSet = new Set<string>(parsed.fileNames.map((name: string) => path.normalize(name)))\n const fileVersions = new Map<string, number>()\n const fileHashes = new Map<string, string>()\n const fileCache = new Map<string, string>()\n let projectVersion = 0\n\n const normalizeName = (fileName: string) => normalizeFileName(fileName, rootDir)\n\n const serviceHost: TypeScriptLanguageServiceHost = {\n getScriptFileNames: () => Array.from(fileSet),\n getScriptVersion: (fileName: string) => {\n const normalized = normalizeName(fileName)\n return String(fileVersions.get(normalized) ?? 0)\n },\n getScriptSnapshot: (fileName: string) => {\n const normalized = normalizeName(fileName)\n const text = fileCache.get(normalized) ?? ts.sys.readFile(normalized)\n if (text === undefined) return undefined\n return ts.ScriptSnapshot.fromString(text)\n },\n getCurrentDirectory: () => rootDir,\n getCompilationSettings: () => parsed.options,\n getDefaultLibFileName: (options: unknown) => ts.getDefaultLibFilePath(options),\n fileExists: ts.sys.fileExists,\n readFile: ts.sys.readFile,\n readDirectory: ts.sys.readDirectory,\n directoryExists: ts.sys.directoryExists,\n getDirectories: ts.sys.getDirectories,\n useCaseSensitiveFileNames: () => ts.sys.useCaseSensitiveFileNames,\n getNewLine: () => ts.sys.newLine,\n getProjectVersion: () => String(projectVersion),\n }\n\n const service = ts.createLanguageService(serviceHost, ts.createDocumentRegistry())\n\n const updateFile = (fileName: string, code: string) => {\n const normalized = normalizeName(fileName)\n const nextHash = hashString(code)\n if (fileHashes.get(normalized) === nextHash) return\n fileHashes.set(normalized, nextHash)\n fileCache.set(normalized, code)\n fileVersions.set(normalized, (fileVersions.get(normalized) ?? 0) + 1)\n fileSet.add(normalized)\n projectVersion += 1\n }\n\n return {\n configPath,\n configHash,\n get projectVersion() {\n return projectVersion\n },\n updateFile,\n getProgram: () => service.getProgram?.() ?? null,\n resolveModuleName: (specifier: string, containingFile: string) => {\n try {\n const resolved = ts.resolveModuleName(specifier, containingFile, parsed.options, ts.sys)\n return resolved?.resolvedModule?.resolvedFileName ?? null\n } catch {\n return null\n }\n },\n dispose: () => service.dispose?.(),\n }\n}\n\n// ============================================================================\n// Function-level Code Splitting Helpers\n// ============================================================================\n\n/**\n * Parse a handler ID into source module and export name.\n * Format: /path/to/module.tsx$$exportName (using $$ as separator to avoid URL fragment conflicts)\n */\nfunction parseHandlerId(handlerId: string): [string | null, string | null] {\n const separatorIndex = handlerId.lastIndexOf('$$')\n if (separatorIndex === -1) {\n return [handlerId, 'default']\n }\n return [handlerId.slice(0, separatorIndex), handlerId.slice(separatorIndex + 2)]\n}\n\n/**\n * Generate handler ID from source module and export name.\n * Uses $$ as separator to avoid conflicts with URL # fragments.\n */\nfunction createHandlerId(sourceModule: string, exportName: string): string {\n return `${sourceModule}$$${exportName}`\n}\n\n/**\n * Generate a standalone virtual module for an extracted handler.\n * The module contains the complete handler code with its own imports,\n * creating a truly independent chunk that doesn't depend on the source module.\n */\nfunction generateHandlerModule(handler: ExtractedHandler): string {\n // If no code was extracted (fallback case), use re-export\n if (!handler.code) {\n return `export { ${handler.exportName} as default } from '${handler.sourceModule}';\\n`\n }\n\n // Group imports by source module\n const importsByModule = new Map<string, string[]>()\n\n for (const helperName of handler.helpersUsed) {\n const helper = RUNTIME_HELPERS[helperName]\n if (!helper) continue\n\n const existing = importsByModule.get(helper.from) ?? []\n if (!existing.includes(helper.import)) {\n existing.push(helper.import)\n }\n importsByModule.set(helper.from, existing)\n }\n\n // Generate import statements for runtime helpers\n const imports: string[] = []\n for (const [module, names] of importsByModule) {\n imports.push(`import { ${names.join(', ')} } from '${module}';`)\n }\n\n // Import local dependencies from the source module\n // These are re-exported by the source module with __fict_dep_ prefix\n if (handler.localDeps.length > 0) {\n const depImports = handler.localDeps.map(dep => `${HANDLER_DEP_PREFIX}${dep} as ${dep}`)\n imports.push(`import { ${depImports.join(', ')} } from '${handler.sourceModule}';`)\n }\n\n // Generate the complete standalone module\n return `${imports.join('\\n')}${imports.length > 0 ? '\\n\\n' : ''}export default ${handler.code};\\n`\n}\n\n/** Prefix for re-exported handler dependencies */\nconst HANDLER_DEP_PREFIX = '__fict_dep_'\n\n/**\n * Register an extracted handler for function-level splitting.\n */\nexport function registerExtractedHandler(\n sourceModule: string,\n exportName: string,\n helpersUsed: string[],\n code: string,\n localDeps: string[] = [],\n): string {\n const handlerId = createHandlerId(sourceModule, exportName)\n extractedHandlers.set(handlerId, {\n sourceModule,\n exportName,\n helpersUsed,\n localDeps,\n code,\n })\n return `${VIRTUAL_HANDLER_RESOLVE_PREFIX}${handlerId}`\n}\n\n/**\n * Runtime helper name mappings for generating imports in virtual modules\n */\nconst RUNTIME_HELPERS: Record<string, { import: string; from: string }> = {\n __fictUseLexicalScope: { import: '__fictUseLexicalScope', from: '@fictjs/runtime/internal' },\n __fictGetScopeProps: { import: '__fictGetScopeProps', from: '@fictjs/runtime/internal' },\n __fictGetSSRScope: { import: '__fictGetSSRScope', from: '@fictjs/runtime/internal' },\n __fictEnsureScope: { import: '__fictEnsureScope', from: '@fictjs/runtime/internal' },\n __fictPrepareContext: { import: '__fictPrepareContext', from: '@fictjs/runtime/internal' },\n __fictPushContext: { import: '__fictPushContext', from: '@fictjs/runtime/internal' },\n __fictPopContext: { import: '__fictPopContext', from: '@fictjs/runtime/internal' },\n hydrateComponent: { import: 'hydrateComponent', from: '@fictjs/runtime/internal' },\n __fictQrl: { import: '__fictQrl', from: '@fictjs/runtime/internal' },\n}\n\n/** Known global identifiers that don't need to be imported */\nconst GLOBAL_IDENTIFIERS = new Set([\n // JavaScript globals\n 'undefined',\n 'null',\n 'true',\n 'false',\n 'NaN',\n 'Infinity',\n 'globalThis',\n 'window',\n 'document',\n 'console',\n 'setTimeout',\n 'setInterval',\n 'clearTimeout',\n 'clearInterval',\n 'requestAnimationFrame',\n 'cancelAnimationFrame',\n 'fetch',\n 'URL',\n 'URLSearchParams',\n 'FormData',\n 'Headers',\n 'Request',\n 'Response',\n 'AbortController',\n 'AbortSignal',\n // Built-in constructors\n 'Object',\n 'Array',\n 'String',\n 'Number',\n 'Boolean',\n 'Symbol',\n 'BigInt',\n 'Date',\n 'RegExp',\n 'Error',\n 'TypeError',\n 'RangeError',\n 'SyntaxError',\n 'Map',\n 'Set',\n 'WeakMap',\n 'WeakSet',\n 'Promise',\n 'Proxy',\n 'Reflect',\n 'JSON',\n 'Math',\n 'Intl',\n // Event and DOM\n 'Event',\n 'CustomEvent',\n 'Element',\n 'Node',\n 'HTMLElement',\n])\n\n/**\n * Collect identifiers referenced in an AST node that are not locally defined.\n * Uses simple recursive traversal instead of Babel's traverse to work on sub-nodes.\n */\nfunction collectReferencedIdentifiers(node: t.Node, localBindings: Set<string>): Set<string> {\n const referenced = new Set<string>()\n\n function visitNode(\n current: t.Node | null | undefined,\n parent: t.Node | null,\n key: string | null,\n ): void {\n if (!current) return\n\n if (t.isIdentifier(current)) {\n const name = current.name\n\n // Skip if it's a property access (obj.prop) - only the object is a reference\n if (\n parent &&\n t.isMemberExpression(parent) &&\n parent.property === current &&\n !parent.computed\n ) {\n return\n }\n\n // Skip if it's a key in object property (non-computed)\n if (parent && t.isObjectProperty(parent) && parent.key === current && !parent.computed) {\n return\n }\n\n // Skip if it's a function/variable declaration name\n if (parent && t.isVariableDeclarator(parent) && parent.id === current) {\n return\n }\n if (\n parent &&\n (t.isFunctionDeclaration(parent) || t.isFunctionExpression(parent)) &&\n parent.id === current\n ) {\n return\n }\n\n // Skip if it's a parameter\n if (key === 'params') {\n return\n }\n\n // Skip if it's a catch clause parameter\n if (parent && t.isCatchClause(parent) && parent.param === current) {\n return\n }\n\n // Skip local bindings (locally declared variables)\n if (localBindings.has(name)) {\n return\n }\n\n // Skip globals\n if (GLOBAL_IDENTIFIERS.has(name)) {\n return\n }\n\n // Skip runtime helpers\n if (RUNTIME_HELPERS[name]) {\n return\n }\n\n referenced.add(name)\n return\n }\n\n // Recursively visit child nodes\n for (const nodeKey of Object.keys(current)) {\n // Skip metadata keys that aren't child nodes\n if (\n nodeKey === 'loc' ||\n nodeKey === 'start' ||\n nodeKey === 'end' ||\n nodeKey === 'extra' ||\n nodeKey === 'comments' ||\n nodeKey === 'leadingComments' ||\n nodeKey === 'trailingComments' ||\n nodeKey === 'innerComments'\n ) {\n continue\n }\n const child = (current as unknown as Record<string, unknown>)[nodeKey]\n if (Array.isArray(child)) {\n for (const item of child) {\n if (\n item &&\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n typeof (item as Record<string, unknown>).type === 'string'\n ) {\n visitNode(item as t.Node, current, nodeKey)\n }\n }\n } else if (\n child &&\n typeof child === 'object' &&\n child !== null &&\n 'type' in child &&\n typeof (child as Record<string, unknown>).type === 'string'\n ) {\n visitNode(child as t.Node, current, nodeKey)\n }\n }\n }\n\n visitNode(node, null, null)\n return referenced\n}\n\n/**\n * Collect all bindings (variables, functions, params) defined within an AST node.\n * Uses simple recursive traversal instead of Babel's traverse to work on sub-nodes.\n */\nfunction collectLocalBindings(node: t.Node): Set<string> {\n const bindings = new Set<string>()\n\n function visitNode(current: t.Node | null | undefined): void {\n if (!current) return\n\n // Handle variable declarations\n if (t.isVariableDeclarator(current)) {\n if (t.isIdentifier(current.id)) {\n bindings.add(current.id.name)\n } else if (t.isObjectPattern(current.id) || t.isArrayPattern(current.id)) {\n const names = collectPatternIdentifiers(current.id)\n for (const name of names) {\n bindings.add(name)\n }\n }\n }\n\n // Handle function declarations\n if (t.isFunctionDeclaration(current)) {\n if (current.id) {\n bindings.add(current.id.name)\n }\n for (const param of current.params) {\n const names = collectPatternIdentifiers(param)\n for (const name of names) {\n bindings.add(name)\n }\n }\n }\n\n // Handle function expressions\n if (t.isFunctionExpression(current)) {\n for (const param of current.params) {\n const names = collectPatternIdentifiers(param)\n for (const name of names) {\n bindings.add(name)\n }\n }\n }\n\n // Handle arrow function expressions\n if (t.isArrowFunctionExpression(current)) {\n for (const param of current.params) {\n const names = collectPatternIdentifiers(param)\n for (const name of names) {\n bindings.add(name)\n }\n }\n }\n\n // Handle catch clauses\n if (t.isCatchClause(current)) {\n if (current.param && t.isIdentifier(current.param)) {\n bindings.add(current.param.name)\n }\n }\n\n // Recursively visit child nodes\n for (const nodeKey of Object.keys(current)) {\n // Skip metadata keys that aren't child nodes\n if (\n nodeKey === 'loc' ||\n nodeKey === 'start' ||\n nodeKey === 'end' ||\n nodeKey === 'extra' ||\n nodeKey === 'comments' ||\n nodeKey === 'leadingComments' ||\n nodeKey === 'trailingComments' ||\n nodeKey === 'innerComments'\n ) {\n continue\n }\n const child = (current as unknown as Record<string, unknown>)[nodeKey]\n if (Array.isArray(child)) {\n for (const item of child) {\n if (\n item &&\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n typeof (item as Record<string, unknown>).type === 'string'\n ) {\n visitNode(item as t.Node)\n }\n }\n } else if (\n child &&\n typeof child === 'object' &&\n child !== null &&\n 'type' in child &&\n typeof (child as Record<string, unknown>).type === 'string'\n ) {\n visitNode(child as t.Node)\n }\n }\n }\n\n visitNode(node)\n\n return bindings\n}\n\n/**\n * Collect identifier names from a pattern (for destructuring).\n */\nfunction collectPatternIdentifiers(pattern: t.LVal | t.PatternLike): string[] {\n const names: string[] = []\n\n if (t.isIdentifier(pattern)) {\n names.push(pattern.name)\n } else if (t.isObjectPattern(pattern)) {\n for (const prop of pattern.properties) {\n if (t.isObjectProperty(prop) && t.isLVal(prop.value)) {\n names.push(...collectPatternIdentifiers(prop.value))\n } else if (t.isRestElement(prop)) {\n names.push(...collectPatternIdentifiers(prop.argument))\n }\n }\n } else if (t.isArrayPattern(pattern)) {\n for (const element of pattern.elements) {\n if (element) {\n names.push(...collectPatternIdentifiers(element))\n }\n }\n } else if (t.isRestElement(pattern)) {\n names.push(...collectPatternIdentifiers(pattern.argument))\n } else if (t.isAssignmentPattern(pattern)) {\n names.push(...collectPatternIdentifiers(pattern.left))\n }\n\n return names\n}\n\n/**\n * Extract handlers using Babel AST and rewrite QRLs to use virtual modules.\n * This creates truly independent chunks for each handler.\n * Local dependencies are detected and re-exported for handlers to import.\n */\nfunction extractAndRewriteHandlers(\n code: string,\n sourceModule: string,\n): { code: string; handlers: string[] } | null {\n let ast: ReturnType<typeof parse>\n\n try {\n ast = parse(code, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n })\n } catch (error) {\n throw new Error(\n buildPluginMessage(\n 'Failed to parse transformed code for handler extraction',\n sourceModule,\n error,\n ),\n )\n }\n\n // Collect all top-level declarations that could be referenced by handlers\n const topLevelDeclarations = new Set<string>()\n const importedNames = new Set<string>()\n\n for (const node of ast.program.body) {\n // Collect imports\n if (t.isImportDeclaration(node)) {\n for (const specifier of node.specifiers) {\n if (t.isImportSpecifier(specifier) || t.isImportDefaultSpecifier(specifier)) {\n importedNames.add(specifier.local.name)\n } else if (t.isImportNamespaceSpecifier(specifier)) {\n importedNames.add(specifier.local.name)\n }\n }\n continue\n }\n\n // Collect function declarations\n if (t.isFunctionDeclaration(node) && node.id) {\n topLevelDeclarations.add(node.id.name)\n continue\n }\n\n // Collect variable declarations\n if (t.isVariableDeclaration(node)) {\n for (const declarator of node.declarations) {\n if (t.isIdentifier(declarator.id)) {\n topLevelDeclarations.add(declarator.id.name)\n }\n }\n continue\n }\n\n // Collect class declarations\n if (t.isClassDeclaration(node) && node.id) {\n topLevelDeclarations.add(node.id.name)\n continue\n }\n\n // Collect exported declarations\n if (t.isExportNamedDeclaration(node) && node.declaration) {\n if (t.isFunctionDeclaration(node.declaration) && node.declaration.id) {\n topLevelDeclarations.add(node.declaration.id.name)\n } else if (t.isVariableDeclaration(node.declaration)) {\n for (const declarator of node.declaration.declarations) {\n if (t.isIdentifier(declarator.id)) {\n topLevelDeclarations.add(declarator.id.name)\n }\n }\n } else if (t.isClassDeclaration(node.declaration) && node.declaration.id) {\n topLevelDeclarations.add(node.declaration.id.name)\n }\n }\n }\n\n // Merge imports into top-level declarations (they're also available at top level)\n for (const name of importedNames) {\n topLevelDeclarations.add(name)\n }\n\n const handlerNames: string[] = []\n const nodesToRemove = new Set<t.Node>()\n const allLocalDeps = new Set<string>()\n\n // First pass: find all handler exports and extract their code\n traverse(ast, {\n ExportNamedDeclaration(path) {\n const declaration = path.node.declaration\n\n // Handle: export const __fict_e0 = (scopeId, event, el) => { ... }\n if (t.isVariableDeclaration(declaration)) {\n for (const declarator of declaration.declarations) {\n if (!t.isIdentifier(declarator.id)) continue\n\n const name = declarator.id.name\n // Only extract event handlers (__fict_e*), not resume handlers (__fict_r*)\n // Resume handlers have complex component dependencies that can't be easily extracted\n if (!name.match(/^__fict_e\\d+$/)) continue\n\n if (!declarator.init) continue\n\n handlerNames.push(name)\n\n // Generate the handler function code\n const handlerCode = generate(declarator.init).code\n\n // Detect which runtime helpers are used\n const helpersUsed: string[] = []\n for (const helperName of Object.keys(RUNTIME_HELPERS)) {\n if (handlerCode.includes(helperName)) {\n helpersUsed.push(helperName)\n }\n }\n\n // Detect local dependencies\n const localBindings = collectLocalBindings(declarator.init)\n const referencedIds = collectReferencedIdentifiers(declarator.init, localBindings)\n const localDeps: string[] = []\n for (const ref of referencedIds) {\n // Only include if it's a top-level declaration (not a handler itself)\n if (topLevelDeclarations.has(ref) && !ref.match(/^__fict_[er]\\d+$/)) {\n localDeps.push(ref)\n allLocalDeps.add(ref)\n }\n }\n\n // Register the handler with its full code\n const handlerId = createHandlerId(sourceModule, name)\n extractedHandlers.set(handlerId, {\n sourceModule,\n exportName: name,\n helpersUsed,\n localDeps,\n code: handlerCode,\n })\n\n // Mark this export for removal\n nodesToRemove.add(path.node)\n }\n return\n }\n\n // Handle: export function __fict_e0(scopeId, event, el) { ... }\n if (t.isFunctionDeclaration(declaration) && declaration.id) {\n const name = declaration.id.name\n // Only extract event handlers (__fict_e*), not resume handlers (__fict_r*)\n // Resume handlers have complex component dependencies that can't be easily extracted\n if (!name.match(/^__fict_e\\d+$/)) return\n\n handlerNames.push(name)\n\n // Convert to arrow function expression for the virtual module\n const params = declaration.params\n const body = declaration.body\n const arrowFn = t.arrowFunctionExpression(params, body, declaration.async)\n\n // Generate the handler function code\n const handlerCode = generate(arrowFn).code\n\n // Detect which runtime helpers are used\n const helpersUsed: string[] = []\n for (const helperName of Object.keys(RUNTIME_HELPERS)) {\n if (handlerCode.includes(helperName)) {\n helpersUsed.push(helperName)\n }\n }\n\n // Detect local dependencies\n const localBindings = collectLocalBindings(arrowFn)\n const referencedIds = collectReferencedIdentifiers(arrowFn, localBindings)\n const localDeps: string[] = []\n for (const ref of referencedIds) {\n // Only include if it's a top-level declaration (not a handler itself)\n if (topLevelDeclarations.has(ref) && !ref.match(/^__fict_[er]\\d+$/)) {\n localDeps.push(ref)\n allLocalDeps.add(ref)\n }\n }\n\n // Register the handler with its full code\n const handlerId = createHandlerId(sourceModule, name)\n extractedHandlers.set(handlerId, {\n sourceModule,\n exportName: name,\n helpersUsed,\n localDeps,\n code: handlerCode,\n })\n\n // Mark this export for removal\n nodesToRemove.add(path.node)\n }\n },\n })\n\n if (handlerNames.length === 0) {\n return null\n }\n\n // Second pass: remove handler exports, rewrite QRL calls, and add re-exports for dependencies\n traverse(ast, {\n ExportNamedDeclaration(path) {\n if (nodesToRemove.has(path.node)) {\n path.remove()\n }\n },\n\n CallExpression(path) {\n // Rewrite __fictQrl(import.meta.url, \"__fict_e0\") -> \"virtual:...\"\n if (!t.isIdentifier(path.node.callee, { name: '__fictQrl' })) return\n if (path.node.arguments.length !== 2) return\n\n const secondArg = path.node.arguments[1]\n if (!t.isStringLiteral(secondArg)) return\n\n const handlerName = secondArg.value\n if (!handlerNames.includes(handlerName)) return\n\n // Replace with the virtual module URL\n const handlerId = createHandlerId(sourceModule, handlerName)\n const virtualUrl = `${VIRTUAL_HANDLER_RESOLVE_PREFIX}${handlerId}#default`\n path.replaceWith(t.stringLiteral(virtualUrl))\n },\n })\n\n // Add re-exports for local dependencies used by handlers\n // This allows handlers to import them from the source module\n if (allLocalDeps.size > 0) {\n const reExports: t.ExportSpecifier[] = []\n for (const dep of allLocalDeps) {\n // Export as __fict_dep_<name> to avoid conflicts\n reExports.push(\n t.exportSpecifier(t.identifier(dep), t.identifier(`${HANDLER_DEP_PREFIX}${dep}`)),\n )\n }\n ast.program.body.push(t.exportNamedDeclaration(null, reExports))\n }\n\n // Generate the modified code\n const result = generate(ast, {\n retainLines: true,\n compact: false,\n })\n\n return { code: result.code, handlers: handlerNames }\n}\n"],"mappings":"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","names":["include","exclude","tsProject","path"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fictjs/vite-plugin",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "Vite plugin for Fict",
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -37,7 +37,7 @@
37
37
  "@babel/preset-typescript": "^7.26.0",
38
38
  "@babel/traverse": "^7.28.6",
39
39
  "@babel/types": "^7.28.6",
40
- "@fictjs/compiler": "0.8.0"
40
+ "@fictjs/compiler": "0.9.0"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/babel__core": "^7.20.5",