@fictjs/vite-plugin 0.14.0 → 0.16.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
@@ -79,4 +79,5 @@ Notes:
79
79
 
80
80
  - `reactiveScopes` only applies to **direct calls** and only treats the **first argument** as the reactive callback.
81
81
  - Aliased/indirect calls are not recognized (e.g., `const rh = renderHook; rh(() => ...)`).
82
+ - Cross-module metadata lookup is filesystem-based (relative/absolute/alias/ts resolution). Bare package imports require a custom `resolveModuleMetadata` hook if you need metadata propagation.
82
83
  - `debug` logs are disabled by default; enable with `debug: true` or `FICT_VITE_PLUGIN_DEBUG=1`.
package/dist/index.cjs CHANGED
@@ -50,7 +50,7 @@ var CACHE_VERSION = 1;
50
50
  var MODULE_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".mts", ".cts"];
51
51
  var VIRTUAL_HANDLER_PREFIX = "\0fict-handler:";
52
52
  var VIRTUAL_HANDLER_RESOLVE_PREFIX = "virtual:fict-handler:";
53
- var extractedHandlers = /* @__PURE__ */ new Map();
53
+ var manuallyRegisteredHandlers = /* @__PURE__ */ new Map();
54
54
  function fict(options = {}) {
55
55
  const {
56
56
  include = ["**/*.tsx", "**/*.jsx"],
@@ -67,6 +67,7 @@ function fict(options = {}) {
67
67
  let tsProject = null;
68
68
  let tsProjectInit = null;
69
69
  const moduleMetadata = /* @__PURE__ */ new Map();
70
+ const extractedHandlers = /* @__PURE__ */ new Map();
70
71
  const debugEnabled = debugOption === true || process.env.FICT_VITE_PLUGIN_DEBUG === "1" || process.env.FICT_VITE_PLUGIN_DEBUG === "true";
71
72
  const debugLog = (message, details) => {
72
73
  if (!debugEnabled) return;
@@ -106,6 +107,10 @@ function fict(options = {}) {
106
107
  tsProject = null;
107
108
  tsProjectInit = null;
108
109
  };
110
+ const resetTransformState = () => {
111
+ moduleMetadata.clear();
112
+ extractedHandlers.clear();
113
+ };
109
114
  return {
110
115
  name: "vite-plugin-fict",
111
116
  enforce: "pre",
@@ -113,7 +118,10 @@ function fict(options = {}) {
113
118
  config = resolvedConfig;
114
119
  isDev = config.command === "serve" || config.mode === "development";
115
120
  resetCache();
116
- extractedHandlers.clear();
121
+ resetTransformState();
122
+ },
123
+ buildStart() {
124
+ resetTransformState();
117
125
  },
118
126
  resolveId(id) {
119
127
  if (id.startsWith(VIRTUAL_HANDLER_RESOLVE_PREFIX)) {
@@ -130,22 +138,18 @@ function fict(options = {}) {
130
138
  registrySize: extractedHandlers.size,
131
139
  handlers: Array.from(extractedHandlers.keys())
132
140
  });
133
- const handler = extractedHandlers.get(handlerId);
134
- if (handler) {
135
- const generatedCode = generateHandlerModule(handler);
136
- debugLog(`Generated virtual module (${generatedCode.length} chars)`, {
137
- preview: generatedCode.slice(0, 200)
138
- });
139
- return generatedCode;
140
- }
141
+ const handler = extractedHandlers.get(handlerId) ?? manuallyRegisteredHandlers.get(handlerId);
141
142
  if (!handler) {
142
- const [sourceModule, exportName] = parseHandlerId(handlerId);
143
- if (sourceModule && exportName) {
144
- return `export { ${exportName} as default } from '${sourceModule}'`;
145
- }
143
+ debugLog(`Virtual module not found: ${handlerId}`, {
144
+ registrySize: extractedHandlers.size
145
+ });
146
146
  return null;
147
147
  }
148
- return generateHandlerModule(handler);
148
+ const generatedCode = generateHandlerModule(handler);
149
+ debugLog(`Generated virtual module (${generatedCode.length} chars)`, {
150
+ preview: generatedCode.slice(0, 200)
151
+ });
152
+ return generatedCode;
149
153
  },
150
154
  config(userConfig, env) {
151
155
  const userOptimize = userConfig.optimizeDeps;
@@ -338,7 +342,7 @@ function fict(options = {}) {
338
342
  if (shouldSplit) {
339
343
  let splitResult = null;
340
344
  try {
341
- splitResult = extractAndRewriteHandlers(finalCode, filename);
345
+ splitResult = extractAndRewriteHandlers(finalCode, filename, extractedHandlers);
342
346
  } catch (error) {
343
347
  this.warn(buildPluginMessage("extractAndRewriteHandlers failed", filename, error));
344
348
  }
@@ -712,13 +716,6 @@ async function createTypeScriptProject(ts, rootDir, configPath) {
712
716
  dispose: () => service.dispose?.()
713
717
  };
714
718
  }
715
- function parseHandlerId(handlerId) {
716
- const separatorIndex = handlerId.lastIndexOf("$$");
717
- if (separatorIndex === -1) {
718
- return [handlerId, "default"];
719
- }
720
- return [handlerId.slice(0, separatorIndex), handlerId.slice(separatorIndex + 2)];
721
- }
722
719
  function createHandlerId(sourceModule, exportName) {
723
720
  return `${sourceModule}$$${exportName}`;
724
721
  }
@@ -751,7 +748,7 @@ function generateHandlerModule(handler) {
751
748
  var HANDLER_DEP_PREFIX = "__fict_dep_";
752
749
  function registerExtractedHandler(sourceModule, exportName, helpersUsed, code, localDeps = []) {
753
750
  const handlerId = createHandlerId(sourceModule, exportName);
754
- extractedHandlers.set(handlerId, {
751
+ manuallyRegisteredHandlers.set(handlerId, {
755
752
  sourceModule,
756
753
  exportName,
757
754
  helpersUsed,
@@ -974,7 +971,7 @@ function collectPatternIdentifiers(pattern) {
974
971
  }
975
972
  return names;
976
973
  }
977
- function extractAndRewriteHandlers(code, sourceModule) {
974
+ function extractAndRewriteHandlers(code, sourceModule, handlerRegistry) {
978
975
  let ast;
979
976
  try {
980
977
  ast = (0, import_parser.parse)(code, {
@@ -1069,7 +1066,7 @@ function extractAndRewriteHandlers(code, sourceModule) {
1069
1066
  }
1070
1067
  }
1071
1068
  const handlerId = createHandlerId(sourceModule, name);
1072
- extractedHandlers.set(handlerId, {
1069
+ handlerRegistry.set(handlerId, {
1073
1070
  sourceModule,
1074
1071
  exportName: name,
1075
1072
  helpersUsed,
@@ -1104,7 +1101,7 @@ function extractAndRewriteHandlers(code, sourceModule) {
1104
1101
  }
1105
1102
  }
1106
1103
  const handlerId = createHandlerId(sourceModule, name);
1107
- extractedHandlers.set(handlerId, {
1104
+ handlerRegistry.set(handlerId, {
1108
1105
  sourceModule,
1109
1106
  exportName: name,
1110
1107
  helpersUsed,
@@ -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 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 Object.assign(\n new Error(\n buildPluginMessage(\n 'Failed to parse transformed code for handler extraction',\n sourceModule,\n error,\n ),\n ),\n { cause: error },\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"]}
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 used only by the standalone registerExtractedHandler helper.\n * The plugin itself keeps per-instance registries to avoid cross-instance races.\n */\nconst manuallyRegisteredHandlers = 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 extractedHandlers = new Map<string, ExtractedHandler>()\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 const resetTransformState = () => {\n moduleMetadata.clear()\n extractedHandlers.clear()\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 // Reset transform-only state from previous builds.\n resetTransformState()\n },\n\n buildStart() {\n // Vite can reuse plugin instances across watch rebuilds.\n // Reset per-build metadata to avoid unbounded growth.\n resetTransformState()\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) ?? manuallyRegisteredHandlers.get(handlerId)\n if (!handler) {\n debugLog(`Virtual module not found: ${handlerId}`, {\n registrySize: extractedHandlers.size,\n })\n return null\n }\n\n // Generate the virtual module with the handler code\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 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, extractedHandlers)\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 * 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 manuallyRegisteredHandlers.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 handlerRegistry: Map<string, ExtractedHandler>,\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 Object.assign(\n new Error(\n buildPluginMessage(\n 'Failed to parse transformed code for handler extraction',\n sourceModule,\n error,\n ),\n ),\n { cause: error },\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 handlerRegistry.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 handlerRegistry.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
@@ -15,7 +15,7 @@ var CACHE_VERSION = 1;
15
15
  var MODULE_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".mts", ".cts"];
16
16
  var VIRTUAL_HANDLER_PREFIX = "\0fict-handler:";
17
17
  var VIRTUAL_HANDLER_RESOLVE_PREFIX = "virtual:fict-handler:";
18
- var extractedHandlers = /* @__PURE__ */ new Map();
18
+ var manuallyRegisteredHandlers = /* @__PURE__ */ new Map();
19
19
  function fict(options = {}) {
20
20
  const {
21
21
  include = ["**/*.tsx", "**/*.jsx"],
@@ -32,6 +32,7 @@ function fict(options = {}) {
32
32
  let tsProject = null;
33
33
  let tsProjectInit = null;
34
34
  const moduleMetadata = /* @__PURE__ */ new Map();
35
+ const extractedHandlers = /* @__PURE__ */ new Map();
35
36
  const debugEnabled = debugOption === true || process.env.FICT_VITE_PLUGIN_DEBUG === "1" || process.env.FICT_VITE_PLUGIN_DEBUG === "true";
36
37
  const debugLog = (message, details) => {
37
38
  if (!debugEnabled) return;
@@ -71,6 +72,10 @@ function fict(options = {}) {
71
72
  tsProject = null;
72
73
  tsProjectInit = null;
73
74
  };
75
+ const resetTransformState = () => {
76
+ moduleMetadata.clear();
77
+ extractedHandlers.clear();
78
+ };
74
79
  return {
75
80
  name: "vite-plugin-fict",
76
81
  enforce: "pre",
@@ -78,7 +83,10 @@ function fict(options = {}) {
78
83
  config = resolvedConfig;
79
84
  isDev = config.command === "serve" || config.mode === "development";
80
85
  resetCache();
81
- extractedHandlers.clear();
86
+ resetTransformState();
87
+ },
88
+ buildStart() {
89
+ resetTransformState();
82
90
  },
83
91
  resolveId(id) {
84
92
  if (id.startsWith(VIRTUAL_HANDLER_RESOLVE_PREFIX)) {
@@ -95,22 +103,18 @@ function fict(options = {}) {
95
103
  registrySize: extractedHandlers.size,
96
104
  handlers: Array.from(extractedHandlers.keys())
97
105
  });
98
- const handler = extractedHandlers.get(handlerId);
99
- if (handler) {
100
- const generatedCode = generateHandlerModule(handler);
101
- debugLog(`Generated virtual module (${generatedCode.length} chars)`, {
102
- preview: generatedCode.slice(0, 200)
103
- });
104
- return generatedCode;
105
- }
106
+ const handler = extractedHandlers.get(handlerId) ?? manuallyRegisteredHandlers.get(handlerId);
106
107
  if (!handler) {
107
- const [sourceModule, exportName] = parseHandlerId(handlerId);
108
- if (sourceModule && exportName) {
109
- return `export { ${exportName} as default } from '${sourceModule}'`;
110
- }
108
+ debugLog(`Virtual module not found: ${handlerId}`, {
109
+ registrySize: extractedHandlers.size
110
+ });
111
111
  return null;
112
112
  }
113
- return generateHandlerModule(handler);
113
+ const generatedCode = generateHandlerModule(handler);
114
+ debugLog(`Generated virtual module (${generatedCode.length} chars)`, {
115
+ preview: generatedCode.slice(0, 200)
116
+ });
117
+ return generatedCode;
114
118
  },
115
119
  config(userConfig, env) {
116
120
  const userOptimize = userConfig.optimizeDeps;
@@ -303,7 +307,7 @@ function fict(options = {}) {
303
307
  if (shouldSplit) {
304
308
  let splitResult = null;
305
309
  try {
306
- splitResult = extractAndRewriteHandlers(finalCode, filename);
310
+ splitResult = extractAndRewriteHandlers(finalCode, filename, extractedHandlers);
307
311
  } catch (error) {
308
312
  this.warn(buildPluginMessage("extractAndRewriteHandlers failed", filename, error));
309
313
  }
@@ -677,13 +681,6 @@ async function createTypeScriptProject(ts, rootDir, configPath) {
677
681
  dispose: () => service.dispose?.()
678
682
  };
679
683
  }
680
- function parseHandlerId(handlerId) {
681
- const separatorIndex = handlerId.lastIndexOf("$$");
682
- if (separatorIndex === -1) {
683
- return [handlerId, "default"];
684
- }
685
- return [handlerId.slice(0, separatorIndex), handlerId.slice(separatorIndex + 2)];
686
- }
687
684
  function createHandlerId(sourceModule, exportName) {
688
685
  return `${sourceModule}$$${exportName}`;
689
686
  }
@@ -716,7 +713,7 @@ function generateHandlerModule(handler) {
716
713
  var HANDLER_DEP_PREFIX = "__fict_dep_";
717
714
  function registerExtractedHandler(sourceModule, exportName, helpersUsed, code, localDeps = []) {
718
715
  const handlerId = createHandlerId(sourceModule, exportName);
719
- extractedHandlers.set(handlerId, {
716
+ manuallyRegisteredHandlers.set(handlerId, {
720
717
  sourceModule,
721
718
  exportName,
722
719
  helpersUsed,
@@ -939,7 +936,7 @@ function collectPatternIdentifiers(pattern) {
939
936
  }
940
937
  return names;
941
938
  }
942
- function extractAndRewriteHandlers(code, sourceModule) {
939
+ function extractAndRewriteHandlers(code, sourceModule, handlerRegistry) {
943
940
  let ast;
944
941
  try {
945
942
  ast = parse(code, {
@@ -1034,7 +1031,7 @@ function extractAndRewriteHandlers(code, sourceModule) {
1034
1031
  }
1035
1032
  }
1036
1033
  const handlerId = createHandlerId(sourceModule, name);
1037
- extractedHandlers.set(handlerId, {
1034
+ handlerRegistry.set(handlerId, {
1038
1035
  sourceModule,
1039
1036
  exportName: name,
1040
1037
  helpersUsed,
@@ -1069,7 +1066,7 @@ function extractAndRewriteHandlers(code, sourceModule) {
1069
1066
  }
1070
1067
  }
1071
1068
  const handlerId = createHandlerId(sourceModule, name);
1072
- extractedHandlers.set(handlerId, {
1069
+ handlerRegistry.set(handlerId, {
1073
1070
  sourceModule,
1074
1071
  exportName: name,
1075
1072
  helpersUsed,
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 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 Object.assign(\n new Error(\n buildPluginMessage(\n 'Failed to parse transformed code for handler extraction',\n sourceModule,\n error,\n ),\n ),\n { cause: error },\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 used only by the standalone registerExtractedHandler helper.\n * The plugin itself keeps per-instance registries to avoid cross-instance races.\n */\nconst manuallyRegisteredHandlers = 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 extractedHandlers = new Map<string, ExtractedHandler>()\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 const resetTransformState = () => {\n moduleMetadata.clear()\n extractedHandlers.clear()\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 // Reset transform-only state from previous builds.\n resetTransformState()\n },\n\n buildStart() {\n // Vite can reuse plugin instances across watch rebuilds.\n // Reset per-build metadata to avoid unbounded growth.\n resetTransformState()\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) ?? manuallyRegisteredHandlers.get(handlerId)\n if (!handler) {\n debugLog(`Virtual module not found: ${handlerId}`, {\n registrySize: extractedHandlers.size,\n })\n return null\n }\n\n // Generate the virtual module with the handler code\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 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, extractedHandlers)\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 * 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 manuallyRegisteredHandlers.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 handlerRegistry: Map<string, ExtractedHandler>,\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 Object.assign(\n new Error(\n buildPluginMessage(\n 'Failed to parse transformed code for handler extraction',\n sourceModule,\n error,\n ),\n ),\n { cause: error },\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 handlerRegistry.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 handlerRegistry.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.14.0",
3
+ "version": "0.16.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.29.0",
39
39
  "@babel/types": "^7.29.0",
40
- "@fictjs/compiler": "0.14.0"
40
+ "@fictjs/compiler": "0.16.0"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/babel__core": "^7.20.5",