@fynixorg/ui 1.0.21 → 1.0.22

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.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../typescript-fynix-plugin/index.ts"],
4
+ "sourcesContent": ["import * as ts from \"typescript/lib/tsserverlibrary\";\r\nimport fs from \"fs\";\r\nimport path from \"path\";\r\nimport {\r\n transformToTsx,\r\n getLineAndCharacterOfPosition,\r\n getPositionOfLineAndCharacter,\r\n mapTransformedToOriginal,\r\n mapOriginalToTransformed,\r\n type TransformResult,\r\n type SourceMap,\r\n} from \"../../core/parser/fnx-parser\";\r\n\r\ninterface PluginConfig {\r\n debug?: boolean;\r\n}\r\n\r\ninterface CacheEntry {\r\n code: string;\r\n lineMap: number[];\r\n sourceMap: SourceMap;\r\n version: string;\r\n originalContent: string;\r\n}\r\n\r\nexport default function init(modules: { typescript: typeof ts }) {\r\n const tsx = modules.typescript;\r\n\r\n function create(info: ts.server.PluginCreateInfo) {\r\n const config: PluginConfig = info.config || {};\r\n const log = config.debug\r\n ? info.project.projectService.logger\r\n : { info() {}, msg() {} };\r\n\r\n log.info?.(\"[Fynix TS Engine] Loaded with full TypeScript support\");\r\n\r\n // ================================\r\n // CORE ENGINE STATE\r\n // ================================\r\n const fnxCache = new Map<string, CacheEntry>();\r\n\r\n // ================================\r\n // FNX \u2192 TSX TRANSFORM (ENHANCED)\r\n // ================================\r\n function transformFnx(source: string): TransformResult {\r\n return transformToTsx(source, {\r\n debug: config.debug,\r\n logger: (message) => log.info?.(message),\r\n });\r\n }\r\n\r\n // ================================\r\n // POSITION MAPPING\r\n // ================================\r\n function mapTransformedToOriginalWithCache(\r\n position: number,\r\n cache: CacheEntry\r\n ): number {\r\n return mapTransformedToOriginal(\r\n position,\r\n cache.code,\r\n cache.originalContent,\r\n cache.lineMap,\r\n cache.sourceMap\r\n );\r\n }\r\n\r\n function mapOriginalToTransformedWithCache(\r\n position: number,\r\n cache: CacheEntry\r\n ): number {\r\n return mapOriginalToTransformed(\r\n position,\r\n cache.code,\r\n cache.originalContent,\r\n cache.lineMap,\r\n cache.sourceMap\r\n );\r\n }\r\n\r\n // ================================\r\n // TS HOST PATCH\r\n // ================================\r\n const host = info.languageServiceHost;\r\n\r\n const oldGetScriptSnapshot = host.getScriptSnapshot.bind(host);\r\n const oldGetScriptKind = host.getScriptKind?.bind(host);\r\n const oldGetScriptVersion = host.getScriptVersion.bind(host);\r\n const oldResolveModuleNames = host.resolveModuleNames?.bind(host);\r\n\r\n // Enhance module resolution for .fnx files\r\n if (oldResolveModuleNames) {\r\n host.resolveModuleNames = (\r\n moduleNames,\r\n containingFile,\r\n reusedNames,\r\n redirectedReference,\r\n options\r\n ) => {\r\n const resolved = oldResolveModuleNames(\r\n moduleNames,\r\n containingFile,\r\n reusedNames,\r\n redirectedReference,\r\n options\r\n );\r\n\r\n // Process resolved modules to handle .fnx files\r\n return resolved.map((resolvedModule, index) => {\r\n const moduleName = moduleNames[index];\r\n\r\n if (config.debug) {\r\n log.info?.(\r\n `[Fynix Plugin] Processing module: ${moduleName}, resolved: ${!!resolvedModule}`\r\n );\r\n }\r\n\r\n // If module wasn't resolved and it might be a .fnx file\r\n if (!resolvedModule && moduleName.endsWith(\".fnx\")) {\r\n // Try to resolve it as a .fnx file using file system\r\n // use imported path and fs\r\n\r\n let fnxFilePath: string;\r\n if (path.isAbsolute(moduleName)) {\r\n fnxFilePath = moduleName;\r\n } else {\r\n const containingDir = path.dirname(containingFile);\r\n fnxFilePath = path.resolve(containingDir, moduleName);\r\n }\r\n\r\n if (config.debug) {\r\n log.info?.(\r\n `[Fynix Plugin] Trying to resolve .fnx file: ${fnxFilePath}`\r\n );\r\n }\r\n\r\n // Check if file exists\r\n if (fs.existsSync(fnxFilePath)) {\r\n if (config.debug) {\r\n log.info?.(`[Fynix Plugin] Found .fnx file: ${fnxFilePath}`);\r\n }\r\n return {\r\n resolvedFileName: fnxFilePath,\r\n extension: tsx.Extension.Tsx,\r\n isExternalLibraryImport: false,\r\n };\r\n }\r\n\r\n // Try with TypeScript's resolver as fallback\r\n const resolvedFnx = tsx.resolveModuleName(\r\n moduleName,\r\n containingFile,\r\n options,\r\n host\r\n );\r\n\r\n if (resolvedFnx.resolvedModule) {\r\n if (config.debug) {\r\n log.info?.(\r\n `[Fynix Plugin] Resolved with TS: ${resolvedFnx.resolvedModule.resolvedFileName}`\r\n );\r\n }\r\n return {\r\n ...resolvedFnx.resolvedModule,\r\n extension: tsx.Extension.Tsx,\r\n };\r\n }\r\n }\r\n\r\n // If module wasn't resolved, try adding .fnx extension\r\n if (!resolvedModule && !moduleName.endsWith(\".fnx\")) {\r\n // Only try .fnx extension for relative imports (starting with . or ..)\r\n // or imports without protocol/package scope\r\n const isRelativeOrLocal =\r\n moduleName.startsWith(\".\") ||\r\n (!moduleName.startsWith(\"@\") &&\r\n !moduleName.includes(\"/\") &&\r\n !moduleName.includes(\"://\"));\r\n\r\n if (isRelativeOrLocal) {\r\n const fnxPath = moduleName + \".fnx\";\r\n\r\n // Try file system check first\r\n // use imported path and fs\r\n\r\n let fnxFilePath: string;\r\n if (path.isAbsolute(fnxPath)) {\r\n fnxFilePath = fnxPath;\r\n } else {\r\n const containingDir = path.dirname(containingFile);\r\n fnxFilePath = path.resolve(containingDir, fnxPath);\r\n }\r\n\r\n if (config.debug) {\r\n log.info?.(\r\n `[Fynix Plugin] Trying to resolve with .fnx extension: ${fnxFilePath}`\r\n );\r\n }\r\n\r\n // Check if file exists\r\n if (fs.existsSync(fnxFilePath)) {\r\n if (config.debug) {\r\n log.info?.(\r\n `[Fynix Plugin] Found file with .fnx extension: ${fnxFilePath}`\r\n );\r\n }\r\n return {\r\n resolvedFileName: fnxFilePath,\r\n extension: tsx.Extension.Tsx,\r\n isExternalLibraryImport: false,\r\n };\r\n }\r\n\r\n // Try with TypeScript's resolver as fallback\r\n const resolvedFnx = tsx.resolveModuleName(\r\n fnxPath,\r\n containingFile,\r\n options,\r\n host\r\n );\r\n\r\n if (resolvedFnx.resolvedModule) {\r\n if (config.debug) {\r\n log.info?.(\r\n `[Fynix Plugin] Resolved .fnx with TS: ${resolvedFnx.resolvedModule.resolvedFileName}`\r\n );\r\n }\r\n return {\r\n ...resolvedFnx.resolvedModule,\r\n extension: tsx.Extension.Tsx,\r\n };\r\n }\r\n }\r\n }\r\n\r\n // If resolved module points to a .fnx file, mark it as TSX\r\n if (resolvedModule?.resolvedFileName?.endsWith(\".fnx\")) {\r\n if (config.debug) {\r\n log.info?.(\r\n `[Fynix Plugin] Marking .fnx file as TSX: ${resolvedModule.resolvedFileName}`\r\n );\r\n }\r\n return {\r\n ...resolvedModule,\r\n extension: tsx.Extension.Tsx,\r\n };\r\n }\r\n\r\n return resolvedModule;\r\n });\r\n };\r\n } else {\r\n // Fallback: Create a basic module resolver if one doesn't exist\r\n host.resolveModuleNames = (\r\n moduleNames,\r\n containingFile,\r\n reusedNames,\r\n redirectedReference,\r\n options\r\n ) => {\r\n return moduleNames.map((moduleName) => {\r\n // use imported path and fs\r\n\r\n // Handle .fnx files\r\n if (moduleName.endsWith(\".fnx\")) {\r\n let fnxFilePath: string;\r\n if (path.isAbsolute(moduleName)) {\r\n fnxFilePath = moduleName;\r\n } else {\r\n const containingDir = path.dirname(containingFile);\r\n fnxFilePath = path.resolve(containingDir, moduleName);\r\n }\r\n\r\n if (fs.existsSync(fnxFilePath)) {\r\n return {\r\n resolvedFileName: fnxFilePath,\r\n extension: tsx.Extension.Tsx,\r\n isExternalLibraryImport: false,\r\n };\r\n }\r\n }\r\n\r\n // Try adding .fnx extension for relative/local imports only\r\n const isRelativeOrLocal =\r\n moduleName.startsWith(\".\") ||\r\n (!moduleName.startsWith(\"@\") &&\r\n !moduleName.includes(\"/\") &&\r\n !moduleName.includes(\"://\"));\r\n\r\n if (isRelativeOrLocal && !moduleName.endsWith(\".fnx\")) {\r\n const fnxPath = moduleName + \".fnx\";\r\n let fnxFilePath: string;\r\n if (path.isAbsolute(fnxPath)) {\r\n fnxFilePath = fnxPath;\r\n } else {\r\n const containingDir = path.dirname(containingFile);\r\n fnxFilePath = path.resolve(containingDir, fnxPath);\r\n }\r\n\r\n if (fs.existsSync(fnxFilePath)) {\r\n return {\r\n resolvedFileName: fnxFilePath,\r\n extension: tsx.Extension.Tsx,\r\n isExternalLibraryImport: false,\r\n };\r\n }\r\n }\r\n\r\n // Use TypeScript's default resolution as fallback\r\n const resolved = tsx.resolveModuleName(\r\n moduleName,\r\n containingFile,\r\n options,\r\n host\r\n );\r\n\r\n return resolved.resolvedModule;\r\n });\r\n };\r\n }\r\n\r\n // Treat .fnx as TSX files\r\n host.getScriptKind = (fileName) => {\r\n if (fileName.endsWith(\".fnx\")) return tsx.ScriptKind.TSX;\r\n return oldGetScriptKind?.(fileName) ?? tsx.ScriptKind.Unknown;\r\n };\r\n\r\n // Override fileExists to handle .fnx files\r\n const oldFileExists = host.fileExists?.bind(host);\r\n if (oldFileExists) {\r\n host.fileExists = (fileName) => {\r\n // Check original file existence first\r\n if (oldFileExists(fileName)) {\r\n return true;\r\n }\r\n\r\n // If it's a .fnx file, check file system directly\r\n if (fileName.endsWith(\".fnx\")) {\r\n try {\r\n // use imported fs\r\n return fs.existsSync(fileName);\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n return false;\r\n };\r\n }\r\n\r\n // Override readFile to handle .fnx files\r\n const oldReadFile = host.readFile?.bind(host);\r\n if (oldReadFile) {\r\n host.readFile = (fileName) => {\r\n // Try original readFile first\r\n const content = oldReadFile(fileName);\r\n if (content !== undefined) {\r\n return content;\r\n }\r\n\r\n // If it's a .fnx file, try reading directly from file system\r\n if (fileName.endsWith(\".fnx\")) {\r\n try {\r\n // use imported fs\r\n return fs.readFileSync(fileName, \"utf8\");\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n\r\n return undefined;\r\n };\r\n }\r\n\r\n // Transform FNX \u2192 TSX in memory\r\n host.getScriptSnapshot = (fileName) => {\r\n if (!fileName.endsWith(\".fnx\")) return oldGetScriptSnapshot(fileName);\r\n\r\n const version = oldGetScriptVersion(fileName);\r\n const cached = fnxCache.get(fileName);\r\n\r\n if (cached && cached.version === version) {\r\n return tsx.ScriptSnapshot.fromString(cached.code);\r\n }\r\n\r\n const snap = oldGetScriptSnapshot(fileName);\r\n if (!snap) return snap;\r\n\r\n try {\r\n const content = snap.getText(0, snap.getLength());\r\n const parsed = transformFnx(content);\r\n\r\n fnxCache.set(fileName, {\r\n code: parsed.code,\r\n lineMap: parsed.lineMap,\r\n sourceMap: parsed.sourceMap,\r\n version,\r\n originalContent: content,\r\n });\r\n\r\n log.info?.(\r\n `[Fynix] Transformed ${fileName} (${content.length} \u2192 ${parsed.code.length} bytes)`\r\n );\r\n\r\n return tsx.ScriptSnapshot.fromString(parsed.code);\r\n } catch (error) {\r\n log.info?.(`[Fynix] Transform error in ${fileName}: ${error}`);\r\n return snap;\r\n }\r\n };\r\n\r\n // ================================\r\n // DIAGNOSTIC REMAPPING (FIXED)\r\n // ================================\r\n function remapDiagnostics(\r\n diags: readonly ts.Diagnostic[],\r\n fileName: string\r\n ): ts.Diagnostic[] {\r\n if (!fileName.endsWith(\".fnx\")) {\r\n return diags as ts.Diagnostic[];\r\n }\r\n\r\n const cache = fnxCache.get(fileName);\r\n if (!cache) {\r\n return diags as ts.Diagnostic[];\r\n }\r\n\r\n const remapped: ts.Diagnostic[] = [];\r\n\r\n for (const d of diags) {\r\n // Handle diagnostics without location info\r\n if (!d.file || d.start === undefined) {\r\n remapped.push(d);\r\n continue;\r\n }\r\n\r\n // Map position from transformed to original\r\n const { line: transformedLine } = getLineAndCharacterOfPosition(\r\n cache.code,\r\n d.start\r\n );\r\n\r\n const originalLine = cache.lineMap[transformedLine];\r\n\r\n // Skip diagnostics on injected lines EXCEPT for module resolution errors\r\n if (originalLine < 0) {\r\n const messageText =\r\n typeof d.messageText === \"string\"\r\n ? d.messageText\r\n : d.messageText.messageText;\r\n\r\n // Don't skip module resolution errors - these are important for user feedback\r\n const isModuleResolutionError =\r\n messageText.includes(\"Cannot find module\") ||\r\n messageText.includes(\"Module not found\") ||\r\n d.code === 2307; // TS2307: Cannot find module\r\n\r\n if (!isModuleResolutionError) {\r\n if (config.debug) {\r\n log.info?.(\r\n `[Fynix] Skipping diagnostic on injected line ${transformedLine}: ${messageText}`\r\n );\r\n }\r\n continue;\r\n }\r\n\r\n // For module resolution errors on injected lines, map to the user's import line if it exists\r\n // or to the beginning of the logic block\r\n let mappedLine = 0;\r\n let mappedChar = 0;\r\n\r\n // Find user's import line with @fynixorg/ui if it exists\r\n const lines = cache.originalContent.split(\"\\n\");\r\n for (let i = 0; i < lines.length; i++) {\r\n if (lines[i].includes(\"@fynixorg/ui\")) {\r\n mappedLine = i;\r\n mappedChar = lines[i].indexOf(\"@fynixorg/ui\");\r\n break;\r\n }\r\n }\r\n\r\n // If no user import found, map to start of logic block\r\n if (mappedLine === 0 && mappedChar === 0) {\r\n const logicMatch = cache.originalContent.match(\r\n /<logic\\s+setup\\s*=\\s*[\"']?(ts|js)[\"']?\\s*>/i\r\n );\r\n if (logicMatch) {\r\n const before = cache.originalContent.slice(\r\n 0,\r\n logicMatch.index! + logicMatch[0].length\r\n );\r\n mappedLine = before.split(\"\\n\").length - 1;\r\n mappedChar = 0;\r\n }\r\n }\r\n\r\n const mappedStart = getPositionOfLineAndCharacter(\r\n cache.originalContent,\r\n mappedLine,\r\n mappedChar\r\n );\r\n const remappedDiag: ts.Diagnostic = {\r\n ...d,\r\n file: {\r\n ...d.file,\r\n fileName: fileName,\r\n text: cache.originalContent,\r\n getLineAndCharacterOfPosition: (pos: number) =>\r\n getLineAndCharacterOfPosition(cache.originalContent, pos),\r\n getPositionOfLineAndCharacter: (\r\n line: number,\r\n character: number\r\n ) =>\r\n getPositionOfLineAndCharacter(\r\n cache.originalContent,\r\n line,\r\n character\r\n ),\r\n } as any,\r\n start: mappedStart,\r\n length: \"@fynixorg/ui\".length,\r\n };\r\n\r\n remapped.push(remappedDiag);\r\n continue;\r\n }\r\n\r\n const originalStart = mapTransformedToOriginalWithCache(d.start, cache);\r\n\r\n // Calculate the correct length in original content\r\n let originalLength = d.length || 1;\r\n if (d.length) {\r\n const transformedEnd = d.start + d.length;\r\n const originalEnd = mapTransformedToOriginalWithCache(\r\n transformedEnd,\r\n cache\r\n );\r\n originalLength = Math.max(1, originalEnd - originalStart);\r\n }\r\n\r\n // Create a proper snapshot for the original file\r\n const originalSnapshot = tsx.ScriptSnapshot.fromString(\r\n cache.originalContent\r\n );\r\n\r\n // Create remapped diagnostic with proper file reference\r\n const remappedDiag: ts.Diagnostic = {\r\n ...d,\r\n file: {\r\n ...d.file,\r\n fileName: fileName,\r\n text: cache.originalContent,\r\n getLineAndCharacterOfPosition: (pos: number) =>\r\n getLineAndCharacterOfPosition(cache.originalContent, pos),\r\n getPositionOfLineAndCharacter: (line: number, character: number) =>\r\n getPositionOfLineAndCharacter(\r\n cache.originalContent,\r\n line,\r\n character\r\n ),\r\n } as any,\r\n start: originalStart,\r\n length: originalLength,\r\n };\r\n\r\n log.info?.(\r\n `[Fynix] Remapped diagnostic: ${\r\n typeof d.messageText === \"string\"\r\n ? d.messageText\r\n : d.messageText.messageText\r\n } at original pos ${originalStart} (line ${originalLine})`\r\n );\r\n\r\n remapped.push(remappedDiag);\r\n }\r\n\r\n return remapped;\r\n }\r\n\r\n function remapDiagnosticsWithLocation(\r\n diags: readonly ts.DiagnosticWithLocation[],\r\n fileName: string\r\n ): ts.DiagnosticWithLocation[] {\r\n if (!fileName.endsWith(\".fnx\")) {\r\n return diags as ts.DiagnosticWithLocation[];\r\n }\r\n\r\n const cache = fnxCache.get(fileName);\r\n if (!cache) {\r\n return diags as ts.DiagnosticWithLocation[];\r\n }\r\n\r\n const remapped: ts.DiagnosticWithLocation[] = [];\r\n\r\n for (const d of diags) {\r\n // Map position from transformed to original\r\n const { line: transformedLine } = getLineAndCharacterOfPosition(\r\n cache.code,\r\n d.start\r\n );\r\n\r\n const originalLine = cache.lineMap[transformedLine];\r\n\r\n // FIXED: Don't skip errors on injected lines - map to nearest real line\r\n if (originalLine < 0) {\r\n // Find the nearest non-injected line after this position\r\n let nearestLineIndex = transformedLine;\r\n let nearestOriginalLine = -1;\r\n\r\n for (let i = transformedLine; i < cache.lineMap.length; i++) {\r\n if (cache.lineMap[i] >= 0) {\r\n nearestLineIndex = i;\r\n nearestOriginalLine = cache.lineMap[i];\r\n break;\r\n }\r\n }\r\n\r\n // If no line found after, try before\r\n if (nearestOriginalLine < 0) {\r\n for (let i = transformedLine - 1; i >= 0; i--) {\r\n if (cache.lineMap[i] >= 0) {\r\n nearestLineIndex = i;\r\n nearestOriginalLine = cache.lineMap[i];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // If still no valid line found, skip this diagnostic\r\n if (nearestOriginalLine < 0) {\r\n log.info?.(\r\n `[Fynix] No valid line mapping found for diagnostic: ${\r\n typeof d.messageText === \"string\"\r\n ? d.messageText\r\n : d.messageText.messageText\r\n }`\r\n );\r\n continue;\r\n }\r\n\r\n // Map to the beginning of the nearest real line\r\n const nearestOriginalPos = getPositionOfLineAndCharacter(\r\n cache.originalContent,\r\n nearestOriginalLine,\r\n 0\r\n );\r\n\r\n const remappedDiag: ts.DiagnosticWithLocation = {\r\n ...d,\r\n file: {\r\n ...d.file,\r\n fileName: fileName,\r\n text: cache.originalContent,\r\n getLineAndCharacterOfPosition: (pos: number) =>\r\n getLineAndCharacterOfPosition(cache.originalContent, pos),\r\n getPositionOfLineAndCharacter: (\r\n line: number,\r\n character: number\r\n ) =>\r\n getPositionOfLineAndCharacter(\r\n cache.originalContent,\r\n line,\r\n character\r\n ),\r\n } as any,\r\n start: nearestOriginalPos,\r\n length: d.length || 1,\r\n };\r\n\r\n log.info?.(\r\n `[Fynix] Remapped injected line diagnostic to nearest line ${nearestOriginalLine}: ${\r\n typeof d.messageText === \"string\"\r\n ? d.messageText\r\n : d.messageText.messageText\r\n }`\r\n );\r\n\r\n remapped.push(remappedDiag);\r\n continue;\r\n }\r\n\r\n const originalStart = mapTransformedToOriginalWithCache(d.start, cache);\r\n\r\n // Calculate the correct length in original content\r\n let originalLength = d.length || 1;\r\n if (d.length) {\r\n const transformedEnd = d.start + d.length;\r\n const originalEnd = mapTransformedToOriginalWithCache(\r\n transformedEnd,\r\n cache\r\n );\r\n originalLength = Math.max(1, originalEnd - originalStart);\r\n }\r\n\r\n // Create remapped diagnostic with proper file reference\r\n const remappedDiag: ts.DiagnosticWithLocation = {\r\n ...d,\r\n file: {\r\n ...d.file,\r\n fileName: fileName,\r\n text: cache.originalContent,\r\n getLineAndCharacterOfPosition: (pos: number) =>\r\n getLineAndCharacterOfPosition(cache.originalContent, pos),\r\n getPositionOfLineAndCharacter: (line: number, character: number) =>\r\n getPositionOfLineAndCharacter(\r\n cache.originalContent,\r\n line,\r\n character\r\n ),\r\n } as any,\r\n start: originalStart,\r\n length: originalLength,\r\n };\r\n\r\n log.info?.(\r\n `[Fynix] Remapped diagnostic: ${\r\n typeof d.messageText === \"string\"\r\n ? d.messageText\r\n : d.messageText.messageText\r\n } at original pos ${originalStart} (line ${originalLine})`\r\n );\r\n\r\n remapped.push(remappedDiag);\r\n }\r\n\r\n return remapped;\r\n }\r\n\r\n // ================================\r\n // LANGUAGE SERVICE PROXY\r\n // ================================\r\n const proxy = Object.create(null) as ts.LanguageService;\r\n for (const k of Object.keys(\r\n info.languageService\r\n ) as (keyof ts.LanguageService)[]) {\r\n proxy[k] = (...args: any[]) =>\r\n (info.languageService[k] as any).apply(info.languageService, args);\r\n }\r\n\r\n // Override diagnostics with proper remapping\r\n proxy.getSemanticDiagnostics = (fileName) => {\r\n const diags = info.languageService.getSemanticDiagnostics(fileName);\r\n return remapDiagnostics(diags, fileName);\r\n };\r\n\r\n proxy.getSyntacticDiagnostics = (fileName) => {\r\n const diags = info.languageService.getSyntacticDiagnostics(fileName);\r\n return remapDiagnosticsWithLocation(diags, fileName);\r\n };\r\n\r\n proxy.getSuggestionDiagnostics = (fileName) => {\r\n const diags = info.languageService.getSuggestionDiagnostics(fileName);\r\n return remapDiagnosticsWithLocation(diags, fileName);\r\n };\r\n\r\n // ================================\r\n // COMPLETION SUPPORT\r\n // ================================\r\n proxy.getCompletionsAtPosition = (fileName, position, opts) => {\r\n let mappedPosition = position;\r\n\r\n // Map position if in .fnx file\r\n if (fileName.endsWith(\".fnx\")) {\r\n const cache = fnxCache.get(fileName);\r\n if (cache) {\r\n mappedPosition = mapOriginalToTransformedWithCache(position, cache);\r\n }\r\n }\r\n\r\n const prior = info.languageService.getCompletionsAtPosition(\r\n fileName,\r\n mappedPosition,\r\n opts\r\n );\r\n\r\n if (!fileName.endsWith(\".fnx\")) return prior;\r\n\r\n // Add Fynix-specific completions\r\n const fynixCompletions = [\r\n // Fynix hooks\r\n {\r\n name: \"nixState\",\r\n kind: tsx.ScriptElementKind.functionElement,\r\n sortText: \"0_nixState\",\r\n labelDetails: { description: \"Fynix reactive state\" },\r\n },\r\n {\r\n name: \"nixStore\",\r\n kind: tsx.ScriptElementKind.functionElement,\r\n sortText: \"0_nixStore\",\r\n labelDetails: { description: \"Fynix global store\" },\r\n },\r\n {\r\n name: \"nixAsync\",\r\n kind: tsx.ScriptElementKind.functionElement,\r\n sortText: \"0_nixAsync\",\r\n labelDetails: { description: \"Fynix async state\" },\r\n },\r\n {\r\n name: \"nixEffect\",\r\n kind: tsx.ScriptElementKind.functionElement,\r\n sortText: \"0_nixEffect\",\r\n labelDetails: { description: \"Fynix side effect\" },\r\n },\r\n {\r\n name: \"nixComputed\",\r\n kind: tsx.ScriptElementKind.functionElement,\r\n sortText: \"0_nixComputed\",\r\n labelDetails: { description: \"Fynix computed value\" },\r\n },\r\n {\r\n name: \"nixForm\",\r\n kind: tsx.ScriptElementKind.functionElement,\r\n sortText: \"0_nixForm\",\r\n labelDetails: { description: \"Fynix form handler\" },\r\n },\r\n {\r\n name: \"nixRef\",\r\n kind: tsx.ScriptElementKind.functionElement,\r\n sortText: \"0_nixRef\",\r\n labelDetails: { description: \"Fynix DOM reference\" },\r\n },\r\n {\r\n name: \"nixCallback\",\r\n kind: tsx.ScriptElementKind.functionElement,\r\n sortText: \"0_nixCallback\",\r\n labelDetails: { description: \"Fynix memoized callback\" },\r\n },\r\n {\r\n name: \"nixMemo\",\r\n kind: tsx.ScriptElementKind.functionElement,\r\n sortText: \"0_nixMemo\",\r\n labelDetails: { description: \"Fynix memoized value\" },\r\n },\r\n {\r\n name: \"nixDebounce\",\r\n kind: tsx.ScriptElementKind.functionElement,\r\n sortText: \"0_nixDebounce\",\r\n labelDetails: { description: \"Fynix debounced callback\" },\r\n },\r\n {\r\n name: \"nixLocalStorage\",\r\n kind: tsx.ScriptElementKind.functionElement,\r\n sortText: \"0_nixLocalStorage\",\r\n labelDetails: { description: \"Fynix localStorage state\" },\r\n },\r\n // Fynix reactive event handlers (r-* attributes)\r\n {\r\n name: \"r-click\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-click\",\r\n labelDetails: { description: \"Reactive click handler\" },\r\n insertText: \"r-click={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-dblclick\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-dblclick\",\r\n labelDetails: { description: \"Reactive double-click handler\" },\r\n insertText: \"r-dblclick={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-submit\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-submit\",\r\n labelDetails: { description: \"Reactive form submit handler\" },\r\n insertText: \"r-submit={($event) => { $event.preventDefault(); }}\",\r\n },\r\n {\r\n name: \"r-input\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-input\",\r\n labelDetails: { description: \"Reactive input handler\" },\r\n insertText: \"r-input={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-change\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-change\",\r\n labelDetails: { description: \"Reactive change handler\" },\r\n insertText: \"r-change={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-focus\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-focus\",\r\n labelDetails: { description: \"Reactive focus handler\" },\r\n insertText: \"r-focus={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-blur\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-blur\",\r\n labelDetails: { description: \"Reactive blur handler\" },\r\n insertText: \"r-blur={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-keydown\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-keydown\",\r\n labelDetails: { description: \"Reactive keydown handler\" },\r\n insertText: \"r-keydown={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-keyup\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-keyup\",\r\n labelDetails: { description: \"Reactive keyup handler\" },\r\n insertText: \"r-keyup={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-keypress\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-keypress\",\r\n labelDetails: { description: \"Reactive keypress handler\" },\r\n insertText: \"r-keypress={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-mouseenter\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-mouseenter\",\r\n labelDetails: { description: \"Reactive mouseenter handler\" },\r\n insertText: \"r-mouseenter={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-mouseleave\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-mouseleave\",\r\n labelDetails: { description: \"Reactive mouseleave handler\" },\r\n insertText: \"r-mouseleave={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-mouseover\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-mouseover\",\r\n labelDetails: { description: \"Reactive mouseover handler\" },\r\n insertText: \"r-mouseover={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-mouseout\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-mouseout\",\r\n labelDetails: { description: \"Reactive mouseout handler\" },\r\n insertText: \"r-mouseout={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-mousemove\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-mousemove\",\r\n labelDetails: { description: \"Reactive mousemove handler\" },\r\n insertText: \"r-mousemove={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-mousedown\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-mousedown\",\r\n labelDetails: { description: \"Reactive mousedown handler\" },\r\n insertText: \"r-mousedown={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-mouseup\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-mouseup\",\r\n labelDetails: { description: \"Reactive mouseup handler\" },\r\n insertText: \"r-mouseup={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-scroll\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-scroll\",\r\n labelDetails: { description: \"Reactive scroll handler\" },\r\n insertText: \"r-scroll={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-wheel\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-wheel\",\r\n labelDetails: { description: \"Reactive wheel handler\" },\r\n insertText: \"r-wheel={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-touchstart\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-touchstart\",\r\n labelDetails: { description: \"Reactive touchstart handler\" },\r\n insertText: \"r-touchstart={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-touchend\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-touchend\",\r\n labelDetails: { description: \"Reactive touchend handler\" },\r\n insertText: \"r-touchend={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-touchmove\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-touchmove\",\r\n labelDetails: { description: \"Reactive touchmove handler\" },\r\n insertText: \"r-touchmove={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-drag\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-drag\",\r\n labelDetails: { description: \"Reactive drag handler\" },\r\n insertText: \"r-drag={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-dragstart\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-dragstart\",\r\n labelDetails: { description: \"Reactive dragstart handler\" },\r\n insertText: \"r-dragstart={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-dragend\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-dragend\",\r\n labelDetails: { description: \"Reactive dragend handler\" },\r\n insertText: \"r-dragend={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-dragover\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-dragover\",\r\n labelDetails: { description: \"Reactive dragover handler\" },\r\n insertText: \"r-dragover={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-drop\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-drop\",\r\n labelDetails: { description: \"Reactive drop handler\" },\r\n insertText: \"r-drop={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-load\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-load\",\r\n labelDetails: { description: \"Reactive load handler\" },\r\n insertText: \"r-load={($event) => {}}\",\r\n },\r\n {\r\n name: \"r-error\",\r\n kind: tsx.ScriptElementKind.jsxAttribute,\r\n sortText: \"1_r-error\",\r\n labelDetails: { description: \"Reactive error handler\" },\r\n insertText: \"r-error={($event) => {}}\",\r\n },\r\n ];\r\n\r\n if (!prior) {\r\n return {\r\n isGlobalCompletion: false,\r\n isMemberCompletion: false,\r\n isNewIdentifierLocation: false,\r\n entries: fynixCompletions,\r\n };\r\n }\r\n\r\n return {\r\n ...prior,\r\n entries: [...fynixCompletions, ...prior.entries],\r\n };\r\n };\r\n\r\n // ================================\r\n // HOVER SUPPORT (ENHANCED)\r\n // ================================\r\n const FYNIX_HOVER_INFO: Record<string, Omit<ts.QuickInfo, \"textSpan\">> = {\r\n nixState: {\r\n kind: tsx.ScriptElementKind.functionElement,\r\n kindModifiers: \"declare\",\r\n displayParts: [\r\n {\r\n text: \"function nixState<T>(initialValue: T): NixState<T>\",\r\n kind: \"text\",\r\n },\r\n ],\r\n documentation: [\r\n {\r\n text: \"Creates a reactive state primitive. The value can be accessed via .value and will trigger re-renders when updated.\",\r\n kind: \"text\",\r\n },\r\n ],\r\n },\r\n nixStore: {\r\n kind: tsx.ScriptElementKind.functionElement,\r\n kindModifiers: \"declare\",\r\n displayParts: [\r\n {\r\n text: \"function nixStore<T>(initialValue: T): NixStore<T>\",\r\n kind: \"text\",\r\n },\r\n ],\r\n documentation: [\r\n {\r\n text: \"Creates a global reactive store that persists across component instances.\",\r\n kind: \"text\",\r\n },\r\n ],\r\n },\r\n nixAsync: {\r\n kind: tsx.ScriptElementKind.functionElement,\r\n kindModifiers: \"declare\",\r\n displayParts: [\r\n {\r\n text: \"function nixAsync<T>(asyncFn: () => Promise<T>): NixAsync<T>\",\r\n kind: \"text\",\r\n },\r\n ],\r\n documentation: [\r\n {\r\n text: \"Handles async operations with loading, error, and data states.\",\r\n kind: \"text\",\r\n },\r\n ],\r\n },\r\n nixEffect: {\r\n kind: tsx.ScriptElementKind.functionElement,\r\n kindModifiers: \"declare\",\r\n displayParts: [\r\n {\r\n text: \"function nixEffect(fn: () => void | (() => void), deps?: any[]): void\",\r\n kind: \"text\",\r\n },\r\n ],\r\n documentation: [\r\n {\r\n text: \"Runs side effects when dependencies change. Returns cleanup function.\",\r\n kind: \"text\",\r\n },\r\n ],\r\n },\r\n nixComputed: {\r\n kind: tsx.ScriptElementKind.functionElement,\r\n kindModifiers: \"declare\",\r\n displayParts: [\r\n {\r\n text: \"function nixComputed<T>(fn: () => T, deps: any[]): NixComputed<T>\",\r\n kind: \"text\",\r\n },\r\n ],\r\n documentation: [\r\n {\r\n text: \"Creates a computed value that automatically updates when dependencies change.\",\r\n kind: \"text\",\r\n },\r\n ],\r\n },\r\n nixForm: {\r\n kind: tsx.ScriptElementKind.functionElement,\r\n kindModifiers: \"declare\",\r\n displayParts: [\r\n {\r\n text: \"function nixForm<T>(config: NixFormConfig<T>): NixForm<T>\",\r\n kind: \"text\",\r\n },\r\n ],\r\n documentation: [\r\n {\r\n text: \"Creates a form handler with validation and state management.\",\r\n kind: \"text\",\r\n },\r\n ],\r\n },\r\n };\r\n\r\n proxy.getQuickInfoAtPosition = (fileName, position) => {\r\n let mappedPosition = position;\r\n\r\n // Map position if in .fnx file\r\n if (fileName.endsWith(\".fnx\")) {\r\n const cache = fnxCache.get(fileName);\r\n if (cache) {\r\n mappedPosition = mapOriginalToTransformedWithCache(position, cache);\r\n }\r\n }\r\n\r\n const program = info.languageService.getProgram();\r\n const sf = program?.getSourceFile(fileName);\r\n\r\n if (!sf || !fileName.endsWith(\".fnx\")) {\r\n return info.languageService.getQuickInfoAtPosition(\r\n fileName,\r\n mappedPosition\r\n );\r\n }\r\n\r\n const node = findNode(sf, mappedPosition);\r\n if (!node) {\r\n return info.languageService.getQuickInfoAtPosition(\r\n fileName,\r\n mappedPosition\r\n );\r\n }\r\n\r\n const text = node.getText(sf);\r\n\r\n // Check if this is a Fynix primitive\r\n if (text in FYNIX_HOVER_INFO) {\r\n return {\r\n ...FYNIX_HOVER_INFO[text],\r\n textSpan: { start: node.getStart(), length: node.getWidth() },\r\n };\r\n }\r\n\r\n return info.languageService.getQuickInfoAtPosition(\r\n fileName,\r\n mappedPosition\r\n );\r\n };\r\n\r\n // ================================\r\n // DEFINITION SUPPORT\r\n // ================================\r\n proxy.getDefinitionAtPosition = (fileName, position) => {\r\n let mappedPosition = position;\r\n\r\n if (fileName.endsWith(\".fnx\")) {\r\n const cache = fnxCache.get(fileName);\r\n if (cache) {\r\n mappedPosition = mapOriginalToTransformedWithCache(position, cache);\r\n }\r\n }\r\n\r\n const defs = info.languageService.getDefinitionAtPosition(\r\n fileName,\r\n mappedPosition\r\n );\r\n\r\n if (!defs || !fileName.endsWith(\".fnx\")) return defs;\r\n\r\n // Remap definition positions back to original\r\n const cache = fnxCache.get(fileName);\r\n if (!cache) return defs;\r\n\r\n return defs.map((def) => {\r\n if (def.fileName === fileName) {\r\n const originalStart = mapTransformedToOriginalWithCache(\r\n def.textSpan.start,\r\n cache\r\n );\r\n return {\r\n ...def,\r\n textSpan: {\r\n start: originalStart,\r\n length: def.textSpan.length,\r\n },\r\n };\r\n }\r\n return def;\r\n });\r\n };\r\n\r\n // ================================\r\n // REFERENCES SUPPORT\r\n // ================================\r\n proxy.getReferencesAtPosition = (fileName, position) => {\r\n let mappedPosition = position;\r\n\r\n if (fileName.endsWith(\".fnx\")) {\r\n const cache = fnxCache.get(fileName);\r\n if (cache) {\r\n mappedPosition = mapOriginalToTransformedWithCache(position, cache);\r\n }\r\n }\r\n\r\n const refs = info.languageService.getReferencesAtPosition(\r\n fileName,\r\n mappedPosition\r\n );\r\n\r\n if (!refs || !fileName.endsWith(\".fnx\")) return refs;\r\n\r\n const cache = fnxCache.get(fileName);\r\n if (!cache) return refs;\r\n\r\n return refs.map((ref) => {\r\n if (ref.fileName === fileName) {\r\n const originalStart = mapTransformedToOriginalWithCache(\r\n ref.textSpan.start,\r\n cache\r\n );\r\n return {\r\n ...ref,\r\n textSpan: {\r\n start: originalStart,\r\n length: ref.textSpan.length,\r\n },\r\n };\r\n }\r\n return ref;\r\n });\r\n };\r\n\r\n // ================================\r\n // RENAME SUPPORT\r\n // ================================\r\n proxy.getRenameInfo = (fileName, position) => {\r\n let mappedPosition = position;\r\n\r\n if (fileName.endsWith(\".fnx\")) {\r\n const cache = fnxCache.get(fileName);\r\n if (cache) {\r\n mappedPosition = mapOriginalToTransformedWithCache(position, cache);\r\n }\r\n }\r\n\r\n return info.languageService.getRenameInfo(fileName, mappedPosition);\r\n };\r\n\r\n return proxy;\r\n }\r\n\r\n return { create };\r\n}\r\n\r\n// ================================\r\n// UTILITIES\r\n// ================================\r\nfunction findNode(sf: ts.SourceFile, pos: number): ts.Node | undefined {\r\n function walk(node: ts.Node): ts.Node | undefined {\r\n if (pos >= node.getStart() && pos < node.getEnd()) {\r\n return ts.forEachChild(node, walk) || node;\r\n }\r\n return undefined;\r\n }\r\n return walk(sf);\r\n}\r\n"],
5
+ "mappings": "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",
6
+ "names": ["remappedDiag", "cache"]
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fynixorg/ui",
3
- "version": "1.0.21",
3
+ "version": "1.0.22",
4
4
  "type": "module",
5
5
  "description": "Core package for Fynix UI framework - A lightweight, reactive UI framework with TypeScript support.",
6
6
  "main": "./dist/fynix/index.js",
@@ -124,6 +124,10 @@
124
124
  "types": "./dist/plugins/vite-plugin-res.d.ts",
125
125
  "import": "./dist/plugins/vite-plugin-res.js"
126
126
  },
127
+ "./typescript-plugin": {
128
+ "import": "./dist/typescript-fynix-plugin/index.js",
129
+ "types": "./dist/typescript-fynix-plugin/index.d.ts"
130
+ },
127
131
  "./types": {
128
132
  "types": "./types/index.d.ts"
129
133
  },
@@ -243,4 +247,4 @@
243
247
  "fdir": "^6.5.0",
244
248
  "rollup": "^4.56.0"
245
249
  }
246
- }
250
+ }
package/types/fnx.ts ADDED
@@ -0,0 +1,65 @@
1
+ /* MIT License
2
+
3
+ * Copyright (c) 2026 Resty Gonzales
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ * SOFTWARE.
22
+ */
23
+
24
+ /**
25
+ * Virtual DOM node type for Fynix
26
+ */
27
+ export interface VNode {
28
+ type: string | symbol | ((props: any) => any);
29
+ props: Record<string, any>;
30
+ key: string | number | null;
31
+ _domNode?: Node;
32
+ _rendered?: VNode;
33
+ _state?: any;
34
+ }
35
+
36
+ /**
37
+ * Props type for Fynix components
38
+ */
39
+ export interface FynixComponentProps {
40
+ children?: VNode | VNode[];
41
+ key?: string | number;
42
+ [prop: string]: any;
43
+ }
44
+
45
+ /**
46
+ * Fynix component function type
47
+ */
48
+ export type FynixComponent<
49
+ P extends FynixComponentProps = FynixComponentProps,
50
+ > = (props: P) => VNode | Promise<VNode>;
51
+
52
+ /**
53
+ * Simple SFC structure for user-facing APIs
54
+ * This is different from the internal parser's ParsedFnxFile interface
55
+ */
56
+ export interface FnxSFCStructure {
57
+ /** The <logic> block content */
58
+ logic: string;
59
+ /** The <view> block content (JSX) */
60
+ view: string;
61
+ /** The <style> block content */
62
+ style: string;
63
+ /** Whether the style is scoped */
64
+ isScoped: boolean;
65
+ }
package/types/global.d.ts CHANGED
@@ -21,22 +21,11 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  * SOFTWARE.
22
22
  */
23
23
  /**
24
- * Virtual DOM node type for Fynix (unified with runtime.d.ts)
24
+ * Virtual DOM node type - re-exported from fnx.d.ts (single source of truth)
25
25
  */
26
- type VNode = {
27
- type: string | symbol | ((props: any) => any);
28
- props: Record<string, any>;
29
- key: string | number | null;
30
- _domNode?: Node;
31
- _rendered?: VNode;
32
- _state?: any;
33
- };
34
- // global.d.ts - Fynix Global Type Declarations
26
+ export type { VNode } from "./fnx";
35
27
 
36
- /**
37
- * Reactive state object
38
- */
39
- // types/global.d.ts
28
+ // global.d.ts - Fynix Global Type Declarations
40
29
 
41
30
  /**
42
31
  * Reactive state object - references actual nixState return type
@@ -290,3 +279,4 @@ declare module "*.ts" {
290
279
  * Vite client types
291
280
  */
292
281
  /// <reference types="vite/client" />
282
+