@fynixorg/ui 1.0.21 → 1.0.24
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/dist/fynix/index.d.ts +1 -0
- package/dist/fynix/index.d.ts.map +1 -1
- package/dist/fynix/index.js +1 -0
- package/dist/fynix/index.js.map +2 -2
- package/dist/package.json +5 -1
- package/dist/parser/fnx-parser.d.ts +49 -0
- package/dist/parser/fnx-parser.d.ts.map +1 -0
- package/dist/parser/fnx-parser.js +483 -0
- package/dist/parser/fnx-parser.js.map +7 -0
- package/dist/plugins/vite-plugin-res.d.ts +3 -15
- package/dist/plugins/vite-plugin-res.d.ts.map +1 -1
- package/dist/plugins/vite-plugin-res.js +11 -253
- package/dist/plugins/vite-plugin-res.js.map +2 -2
- package/dist/typescript-fynix-plugin/index.js +1065 -0
- package/dist/typescript-fynix-plugin/index.js.map +7 -0
- package/package.json +6 -2
- package/types/global.d.ts +4 -14
- package/types/jsx.d.ts +988 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../parser/fnx-parser.ts"],
|
|
4
|
+
"sourcesContent": ["/* MIT License\r\n\r\n* Copyright (c) 2026 Resty Gonzales\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n* SOFTWARE.\r\n */\r\n\r\n// =====================================================\r\n// parser/fnx-parser.ts - Unified FNX Single File Component Parser\r\n// =====================================================\r\n// This module provides a single source of truth for parsing .fnx files,\r\n// ensuring consistency between the Vite plugin and TypeScript plugin.\r\n\r\n/**\r\n * Source map for mapping positions between original and transformed code\r\n */\r\nexport interface SourceMap {\r\n originalToTransformed: Map<number, number>;\r\n transformedToOriginal: Map<number, number>;\r\n}\r\n\r\n/**\r\n * Parsed sections from an FNX file\r\n */\r\nexport interface ParsedFnxFile {\r\n /** Content inside <logic> block (excluding imports/exports) */\r\n logic: string;\r\n /** Content inside <view> block */\r\n view: string;\r\n /** Content inside <style> block */\r\n style: string;\r\n /** Setup language: 'ts' or 'js' */\r\n logicLang: \"ts\" | \"js\";\r\n /** Whether logic block exists */\r\n hasLogic: boolean;\r\n /** Whether view block exists */\r\n hasView: boolean;\r\n /** Whether style block exists */\r\n hasStyle: boolean;\r\n /** Whether style has scoped attribute */\r\n isStyleScoped: boolean;\r\n /** Extracted import statements */\r\n imports: string[];\r\n /** Extracted export statements */\r\n exports: string[];\r\n /** Line offset where logic starts in original file */\r\n logicStartLine: number;\r\n /** Line offset where view starts in original file */\r\n viewStartLine: number;\r\n /** Line offset where style starts in original file */\r\n styleStartLine: number;\r\n}\r\n\r\n/**\r\n * Result of transforming FNX to TypeScript/JavaScript\r\n */\r\nexport interface TransformResult {\r\n /** Transformed code (TSX/JSX) */\r\n code: string;\r\n /** Line mapping: transformedLine -> originalLine (-1 for injected lines) */\r\n lineMap: number[];\r\n /** Detailed source map for position mapping */\r\n sourceMap: SourceMap;\r\n}\r\n\r\n/**\r\n * Options for parsing FNX files\r\n */\r\nexport interface ParseOptions {\r\n /** Enable debug logging */\r\n debug?: boolean;\r\n /** Logger function for debug output */\r\n logger?: (message: string) => void;\r\n}\r\n\r\n/**\r\n * Options for transforming parsed FNX to component code\r\n */\r\nexport interface TransformOptions extends ParseOptions {\r\n /** File path for generating scoped style IDs */\r\n filePath: string;\r\n /** JSX factory function name (default: \"Fynix\") */\r\n jsxFactory?: string;\r\n /** Whether to include style injection code */\r\n includeStyleInjection?: boolean;\r\n /** Whether to include meta tag injection for route pages */\r\n includeMetaInjection?: boolean;\r\n}\r\n\r\n// =====================================================\r\n// PARSING IMPLEMENTATION\r\n// =====================================================\r\n\r\n/**\r\n * Parse an FNX Single File Component into its constituent parts.\r\n * This is the canonical parsing implementation used by all consumers.\r\n *\r\n * @param source - Raw FNX file content\r\n * @param options - Optional parsing options\r\n * @returns Parsed FNX file structure\r\n */\r\nexport function parseFnxFile(\r\n source: string,\r\n options: ParseOptions = {}\r\n): ParsedFnxFile {\r\n const { debug = false, logger = console.log } = options;\r\n\r\n const result: ParsedFnxFile = {\r\n logic: \"\",\r\n view: \"\",\r\n style: \"\",\r\n logicLang: \"ts\",\r\n hasLogic: false,\r\n hasView: false,\r\n hasStyle: false,\r\n isStyleScoped: false,\r\n imports: [],\r\n exports: [],\r\n logicStartLine: 0,\r\n viewStartLine: 0,\r\n styleStartLine: 0,\r\n };\r\n\r\n // Parse <logic> block with setup attribute\r\n const logicMatch = source.match(\r\n /<logic\\s+setup\\s*=\\s*[\"']?(ts|js)[\"']?\\s*>([\\s\\S]*?)<\\/logic>/i\r\n );\r\n\r\n if (logicMatch && logicMatch[1] && logicMatch[2] !== undefined) {\r\n result.hasLogic = true;\r\n result.logicLang = logicMatch[1].toLowerCase() as \"ts\" | \"js\";\r\n\r\n // Calculate line offset\r\n const beforeLogic = source.slice(0, logicMatch.index);\r\n const beforeLineCount = beforeLogic.split(\"\\n\").length - 1;\r\n const openingTag = logicMatch[0].substring(\r\n 0,\r\n logicMatch[0].indexOf(\">\") + 1\r\n );\r\n const tagLineCount = openingTag.split(\"\\n\").length - 1;\r\n result.logicStartLine = beforeLineCount + tagLineCount + 1;\r\n\r\n const rawLogic = logicMatch[2].trim();\r\n\r\n // Account for leading newlines in content\r\n const leadingNewlines = logicMatch[2].match(/^\\n*/)?.[0].length || 0;\r\n result.logicStartLine += leadingNewlines;\r\n\r\n // Extract imports, exports, and body logic (handling multi-line exports)\r\n const logicLines = rawLogic.split(\"\\n\");\r\n const imports: string[] = [];\r\n const exports: string[] = [];\r\n const otherLogic: string[] = [];\r\n\r\n let inExportBlock = false;\r\n let exportBuffer: string[] = [];\r\n let exportBraceDepth = 0;\r\n\r\n for (let i = 0; i < logicLines.length; i++) {\r\n const line: string = logicLines[i] ?? \"\";\r\n const trimmed: string = line.trim();\r\n\r\n if (inExportBlock) {\r\n exportBuffer.push(line);\r\n // Count braces to handle nested objects\r\n const openBraces = ((line && line.match(/{/g)) || []).length;\r\n const closeBraces = ((line && line.match(/}/g)) || []).length;\r\n exportBraceDepth += openBraces - closeBraces;\r\n if (exportBraceDepth <= 0) {\r\n exports.push(exportBuffer.join(\"\\n\"));\r\n exportBuffer = [];\r\n inExportBlock = false;\r\n exportBraceDepth = 0;\r\n }\r\n continue;\r\n }\r\n\r\n if (trimmed.startsWith(\"import \")) {\r\n imports.push(line ?? \"\");\r\n } else if (trimmed.startsWith(\"export \")) {\r\n // Check if this is a multi-line export (object or function)\r\n if (/export\\s+\\w+\\s*=\\s*{/.test(trimmed) || trimmed.endsWith(\"{\")) {\r\n inExportBlock = true;\r\n exportBuffer = [line];\r\n exportBraceDepth =\r\n ((line && line.match(/{/g)) || []).length -\r\n ((line && line.match(/}/g)) || []).length;\r\n if (exportBraceDepth <= 0) {\r\n exports.push(exportBuffer.join(\"\\n\"));\r\n exportBuffer = [];\r\n inExportBlock = false;\r\n exportBraceDepth = 0;\r\n }\r\n } else {\r\n exports.push(line ?? \"\");\r\n }\r\n } else if (trimmed) {\r\n otherLogic.push(line ?? \"\");\r\n }\r\n }\r\n\r\n // Flush export buffer if file ends mid-export\r\n if (exportBuffer.length > 0) {\r\n exports.push(exportBuffer.join(\"\\n\"));\r\n }\r\n\r\n result.imports = imports;\r\n result.exports = exports;\r\n result.logic = otherLogic.join(\"\\n\");\r\n\r\n if (debug) {\r\n logger(\r\n `[FnxParser] Logic block: lang=${result.logicLang}, start=${result.logicStartLine}, imports=${imports.length}, exports=${exports.length}`\r\n );\r\n }\r\n }\r\n\r\n // Parse <view> block\r\n const viewMatch = source.match(/<view\\s*>([\\s\\S]*?)<\\/view>/i);\r\n if (viewMatch && viewMatch[1] !== undefined) {\r\n result.hasView = true;\r\n result.view = viewMatch[1].trim();\r\n\r\n // Calculate line offset\r\n const beforeView = source.slice(0, viewMatch.index);\r\n result.viewStartLine = beforeView.split(\"\\n\").length;\r\n\r\n // Account for leading newlines\r\n const leadingNewlines = viewMatch[1].match(/^\\n*/)?.[0].length || 0;\r\n result.viewStartLine += leadingNewlines;\r\n\r\n if (debug) {\r\n logger(`[FnxParser] View block: start=${result.viewStartLine}`);\r\n }\r\n }\r\n\r\n // Parse <style> block with optional scoped attribute\r\n const styleMatch = source.match(/<style(\\s+scoped)?\\s*>([\\s\\S]*?)<\\/style>/i);\r\n if (styleMatch && styleMatch[2] !== undefined) {\r\n result.hasStyle = true;\r\n result.isStyleScoped = !!styleMatch[1];\r\n result.style = styleMatch[2].trim();\r\n\r\n // Calculate line offset\r\n const beforeStyle = source.slice(0, styleMatch.index);\r\n result.styleStartLine = beforeStyle.split(\"\\n\").length;\r\n\r\n if (debug) {\r\n logger(\r\n `[FnxParser] Style block: scoped=${result.isStyleScoped}, start=${result.styleStartLine}`\r\n );\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// =====================================================\r\n// VALIDATION\r\n// =====================================================\r\n\r\n/**\r\n * Validate parsed FNX structure\r\n * @throws Error if validation fails\r\n */\r\nexport function validateParsedFnx(\r\n parsed: ParsedFnxFile,\r\n filePath: string\r\n): void {\r\n if (!parsed.hasView) {\r\n throw new Error(\r\n `[FnxParser] Missing <view> block in ${filePath}. Every .fnx file must have a <view> section.`\r\n );\r\n }\r\n\r\n if (parsed.hasLogic && ![\"ts\", \"js\"].includes(parsed.logicLang)) {\r\n throw new Error(\r\n `[FnxParser] Invalid setup attribute in <logic> block in ${filePath}. Must be \"ts\" or \"js\".`\r\n );\r\n }\r\n\r\n // Check for TypeScript syntax in JavaScript mode\r\n if (parsed.hasLogic && parsed.logicLang === \"js\") {\r\n const tsPatterns = [\r\n { pattern: /\\binterface\\s+\\w+/, name: \"interface declaration\" },\r\n { pattern: /\\btype\\s+\\w+\\s*=/, name: \"type alias\" },\r\n { pattern: /:\\s*\\w+(\\[\\]|<[^>]+>)?\\s*[;,=)]/, name: \"type annotation\" },\r\n { pattern: /<\\w+>(?!\\s*<)/, name: \"generic type\" },\r\n { pattern: /\\benum\\s+\\w+/, name: \"enum declaration\" },\r\n { pattern: /\\bas\\s+\\w+/, name: \"type assertion\" },\r\n { pattern: /\\bnamespace\\s+\\w+/, name: \"namespace\" },\r\n { pattern: /\\babstract\\s+class/, name: \"abstract class\" },\r\n {\r\n pattern: /\\bpublic\\s+|private\\s+|protected\\s+/,\r\n name: \"access modifier\",\r\n },\r\n ];\r\n\r\n const allCode = parsed.logic + \"\\n\" + parsed.imports.join(\"\\n\");\r\n\r\n for (const { pattern, name } of tsPatterns) {\r\n if (pattern.test(allCode)) {\r\n throw new Error(\r\n `[FnxParser] TypeScript syntax detected (${name}) in ${filePath} with setup=\"js\". ` +\r\n `Either change to setup=\"ts\" or remove TypeScript-specific syntax.`\r\n );\r\n }\r\n }\r\n }\r\n}\r\n\r\n// =====================================================\r\n// TRANSFORMATION\r\n// =====================================================\r\n\r\n/**\r\n * Generate a unique style ID for scoped styles based on file path\r\n */\r\nexport function generateStyleId(filePath: string): string {\r\n let hash = 0;\r\n for (let i = 0; i < filePath.length; i++) {\r\n const char = filePath.charCodeAt(i);\r\n hash = (hash << 5) - hash + char;\r\n hash = hash & hash;\r\n }\r\n return `fynix-${Math.abs(hash).toString(36)}`;\r\n}\r\n\r\n/**\r\n * Scope CSS styles by adding data attribute selector\r\n */\r\nexport function scopeStyles(css: string, scopeId: string): string {\r\n const dataAttr = `[data-${scopeId}]`;\r\n\r\n return css.replace(/([^{}]+)\\{([^{}]*)\\}/g, (match, selector, rules) => {\r\n if (selector.trim().startsWith(\"@\")) {\r\n return match;\r\n }\r\n\r\n const selectors = selector.split(\",\").map((s: string) => {\r\n const trimmed = s.trim();\r\n\r\n // Handle pseudo-elements/classes\r\n const pseudoMatch = trimmed.match(/^(.+?)(::?[a-z-]+(?:\\([^)]*\\))?)$/i);\r\n if (pseudoMatch) {\r\n return `${dataAttr} ${pseudoMatch[1]}${pseudoMatch[2]}`;\r\n }\r\n\r\n return `${dataAttr} ${trimmed}`;\r\n });\r\n\r\n return `${selectors.join(\", \")}{${rules}}`;\r\n });\r\n}\r\n\r\n/**\r\n * Build source map for position mapping between original and transformed\r\n */\r\nexport function buildSourceMap(\r\n originalContent: string,\r\n transformedContent: string,\r\n lineMap: number[]\r\n): SourceMap {\r\n const originalToTransformed = new Map<number, number>();\r\n const transformedToOriginal = new Map<number, number>();\r\n\r\n const originalLines = originalContent.split(\"\\n\");\r\n const transformedLines = transformedContent.split(\"\\n\");\r\n\r\n let transformedPos = 0;\r\n for (let tLine = 0; tLine < transformedLines.length; tLine++) {\r\n const originalLine = lineMap[tLine];\r\n\r\n if (originalLine !== undefined && originalLine >= 0 && originalLine < originalLines.length) {\r\n // Calculate original position\r\n let originalPos = 0;\r\n for (let i = 0; i < originalLine; i++) {\r\n const lineLen = originalLines[i];\r\n originalPos += (lineLen?.length ?? 0) + 1;\r\n }\r\n\r\n // Map start of lines\r\n transformedToOriginal.set(transformedPos, originalPos);\r\n originalToTransformed.set(originalPos, transformedPos);\r\n\r\n // Map characters within line (accounting for indentation)\r\n const transformedLineText = transformedLines[tLine] ?? \"\";\r\n const originalLineText = originalLines[originalLine] ?? \"\";\r\n\r\n const tTrimmed = transformedLineText.trimStart();\r\n const oTrimmed = originalLineText.trimStart();\r\n\r\n for (\r\n let char = 0;\r\n char < Math.min(tTrimmed.length, oTrimmed.length);\r\n char++\r\n ) {\r\n const tPos =\r\n transformedPos + char + (transformedLineText.length - tTrimmed.length);\r\n const oPos =\r\n originalPos + char + (originalLineText.length - oTrimmed.length);\r\n transformedToOriginal.set(tPos, oPos);\r\n originalToTransformed.set(oPos, tPos);\r\n }\r\n }\r\n\r\n const currentTransLine = transformedLines[tLine];\r\n transformedPos += (currentTransLine?.length ?? 0) + 1;\r\n }\r\n\r\n return { originalToTransformed, transformedToOriginal };\r\n}\r\n\r\n/**\r\n * Transform parsed FNX file to TypeScript/JavaScript component code.\r\n * Used by the Vite plugin for build-time transformation.\r\n *\r\n * @param parsed - Parsed FNX file\r\n * @param options - Transform options\r\n * @returns Transformed component code with source maps\r\n */\r\nexport function transformToComponent(\r\n parsed: ParsedFnxFile,\r\n options: TransformOptions\r\n): TransformResult {\r\n const {\r\n filePath,\r\n jsxFactory = \"Fynix\",\r\n includeStyleInjection = true,\r\n includeMetaInjection = true,\r\n debug = false,\r\n logger = console.log,\r\n } = options;\r\n\r\n const styleId = generateStyleId(filePath);\r\n const lines: string[] = [];\r\n const lineMap: number[] = [];\r\n\r\n const push = (line: string, origin = -1) => {\r\n lines.push(line);\r\n lineMap.push(origin);\r\n };\r\n\r\n // Framework import\r\n push(`import { ${jsxFactory} } from '@fynixorg/ui';`);\r\n\r\n // User imports\r\n if (parsed.imports.length > 0) {\r\n parsed.imports.forEach((importLine, i) => {\r\n push(importLine, parsed.logicStartLine + i);\r\n });\r\n }\r\n\r\n push(\"\");\r\n\r\n // Style injection\r\n if (parsed.hasStyle && includeStyleInjection) {\r\n let processedStyle = parsed.style;\r\n\r\n if (parsed.isStyleScoped) {\r\n processedStyle = scopeStyles(parsed.style, styleId);\r\n }\r\n\r\n push(`// Inject styles`);\r\n push(`if (typeof document !== 'undefined') {`);\r\n push(` const styleId = '${styleId}';`);\r\n push(` if (!document.getElementById(styleId)) {`);\r\n push(` const styleEl = document.createElement('style');`);\r\n push(` styleEl.id = styleId;`);\r\n push(` styleEl.textContent = ${JSON.stringify(processedStyle)};`);\r\n push(` document.head.appendChild(styleEl);`);\r\n push(` }`);\r\n push(`}`);\r\n push(\"\");\r\n }\r\n\r\n // Exports (module level, before component)\r\n if (parsed.exports.length > 0) {\r\n parsed.exports.forEach((exportLine) => {\r\n const exportLines = exportLine.split(\"\\n\");\r\n exportLines.forEach((line) => push(line));\r\n });\r\n push(\"\");\r\n }\r\n\r\n // Component function\r\n push(`function FynixComponent(props = {}) {`);\r\n\r\n // Logic body\r\n if (parsed.hasLogic && parsed.logic.trim()) {\r\n push(` // Component logic`);\r\n const logicLines = parsed.logic.split(\"\\n\");\r\n logicLines.forEach((line, i) => {\r\n if (line.trim()) {\r\n // Map to original logic position\r\n push(` ${line}`, parsed.logicStartLine + parsed.imports.length + i);\r\n }\r\n });\r\n push(\"\");\r\n }\r\n\r\n // Meta tag injection (for route pages)\r\n if (\r\n includeMetaInjection &&\r\n parsed.exports.some((e) => e.trim().startsWith(\"export const meta\"))\r\n ) {\r\n push(\r\n ` if (typeof document !== \"undefined\" && typeof meta !== \"undefined\") {`\r\n );\r\n push(` document.title = meta.title;`);\r\n push(` const metaTags = [`);\r\n push(` { name: \"description\", content: meta.description },`);\r\n push(` { name: \"keywords\", content: meta.keywords },`);\r\n push(` { property: \"og:title\", content: meta.ogTitle },`);\r\n push(` { property: \"og:description\", content: meta.ogDescription },`);\r\n push(` { property: \"og:image\", content: meta.ogImage },`);\r\n push(` ];`);\r\n push(` metaTags.forEach(({ name, property, content }) => {`);\r\n push(` if (!content) return;`);\r\n push(` let tag;`);\r\n push(` if (name) {`);\r\n push(` tag = document.querySelector(\\`meta[name='\\${name}']\\`);`);\r\n push(` if (!tag) {`);\r\n push(` tag = document.createElement(\"meta\");`);\r\n push(` tag.setAttribute(\"name\", name);`);\r\n push(` document.head.appendChild(tag);`);\r\n push(` }`);\r\n push(` } else if (property) {`);\r\n push(\r\n ` tag = document.querySelector(\\`meta[property='\\${property}']\\`);`\r\n );\r\n push(` if (!tag) {`);\r\n push(` tag = document.createElement(\"meta\");`);\r\n push(` tag.setAttribute(\"property\", property);`);\r\n push(` document.head.appendChild(tag);`);\r\n push(` }`);\r\n push(` }`);\r\n push(` if (tag) tag.setAttribute(\"content\", content);`);\r\n push(` });`);\r\n push(` }`);\r\n push(\"\");\r\n }\r\n\r\n // View (return statement)\r\n if (parsed.hasView) {\r\n push(` // Component view`);\r\n\r\n if (parsed.isStyleScoped) {\r\n push(` return (`);\r\n push(` <div data-${styleId}=\"\">`);\r\n const viewLines = parsed.view.split(\"\\n\");\r\n viewLines.forEach((line, i) => {\r\n push(` ${line}`, parsed.viewStartLine + i);\r\n });\r\n push(` </div>`);\r\n push(` );`);\r\n } else {\r\n push(` return (`);\r\n const viewLines = parsed.view.split(\"\\n\");\r\n viewLines.forEach((line, i) => {\r\n push(` ${line}`, parsed.viewStartLine + i);\r\n });\r\n push(` );`);\r\n }\r\n } else {\r\n push(` return null;`);\r\n }\r\n\r\n push(`}`);\r\n push(\"\");\r\n push(`export default FynixComponent;`);\r\n\r\n const code = lines.join(\"\\n\");\r\n const sourceMap = buildSourceMap(\r\n // Reconstruct original content for source mapping\r\n createOriginalContent(parsed),\r\n code,\r\n lineMap\r\n );\r\n\r\n if (debug) {\r\n logger(`[FnxParser] Transformed ${filePath}: ${code.length} bytes`);\r\n }\r\n\r\n return { code, lineMap, sourceMap };\r\n}\r\n\r\n/**\r\n * Transform parsed FNX file to TSX for TypeScript language service.\r\n * This is a simplified transformation focused on type checking.\r\n *\r\n * @param source - Original FNX source\r\n * @param options - Parse options\r\n * @returns Transformed TSX code with source maps\r\n */\r\nexport function transformToTsx(\r\n source: string,\r\n options: ParseOptions = {}\r\n): TransformResult {\r\n const { debug = false, logger = console.log } = options;\r\n\r\n const lines: string[] = [];\r\n const lineMap: number[] = [];\r\n\r\n const push = (line: string, origin = -1) => {\r\n lines.push(line);\r\n lineMap.push(origin);\r\n };\r\n\r\n // Extract <logic> section\r\n const logicMatch = source.match(\r\n /<logic\\s+setup\\s*=\\s*[\"']?(ts|js)[\"']?\\s*>([\\s\\S]*?)<\\/logic>/i\r\n );\r\n\r\n let logicStart = 0;\r\n let logicContent = \"\";\r\n\r\n if (logicMatch) {\r\n const before = source.slice(0, logicMatch.index);\r\n const beforeLineCount = before.split(\"\\n\").length - 1;\r\n const openingTag = logicMatch[0].substring(\r\n 0,\r\n logicMatch[0].indexOf(\">\") + 1\r\n );\r\n const tagLineCount = openingTag.split(\"\\n\").length - 1;\r\n\r\n logicStart = beforeLineCount + tagLineCount + 1;\r\n logicContent = logicMatch[2] ?? \"\";\r\n\r\n const leadingNewlines = logicContent.match(/^\\n*/)?.[0].length || 0;\r\n logicStart += leadingNewlines;\r\n logicContent = logicContent.trimStart();\r\n\r\n if (debug) {\r\n logger(`[FnxParser TSX] Logic starts at line ${logicStart}`);\r\n }\r\n }\r\n\r\n // Collect user imports and body\r\n const userImports: { line: string; origin: number }[] = [];\r\n const userBody: { line: string; origin: number }[] = [];\r\n let hasFynixImport = false;\r\n\r\n if (logicContent) {\r\n const logicLines = logicContent.split(\"\\n\");\r\n const lastLine = logicLines[logicLines.length - 1];\r\n if (\r\n logicLines.length > 0 &&\r\n lastLine !== undefined &&\r\n lastLine.trim() === \"\"\r\n ) {\r\n logicLines.pop();\r\n }\r\n\r\n logicLines.forEach((line, i) => {\r\n const trimmed = line.trim();\r\n const origin = logicStart + i;\r\n if (trimmed.startsWith(\"import \")) {\r\n userImports.push({ line, origin });\r\n if (trimmed.includes(\"@fynixorg/ui\")) {\r\n hasFynixImport = true;\r\n }\r\n } else {\r\n userBody.push({ line, origin });\r\n }\r\n });\r\n }\r\n\r\n // User imports at top level\r\n userImports.forEach((item) => {\r\n push(item.line, item.origin);\r\n });\r\n\r\n // Inject Fynix import if not present\r\n if (!hasFynixImport) {\r\n push(`import { Fynix } from \"@fynixorg/ui\";`);\r\n }\r\n\r\n push(\"\");\r\n\r\n // Component wrapper\r\n push(\"export default function FynixComponent(props: any = {}) {\");\r\n\r\n // Logic body\r\n userBody.forEach((item) => {\r\n push(\" \" + item.line, item.origin);\r\n });\r\n\r\n // Extract <view> section\r\n const viewMatch = source.match(/<view\\s*>([\\s\\S]*?)<\\/view>/i);\r\n\r\n if (viewMatch) {\r\n let viewContent = viewMatch[1] ?? \"\";\r\n const before = source.slice(0, viewMatch.index);\r\n const beforeLineCount = before.split(\"\\n\").length - 1;\r\n let viewStart = beforeLineCount + 1;\r\n\r\n const leadingNewlines = viewContent.match(/^\\n*/)?.[0].length || 0;\r\n viewStart += leadingNewlines;\r\n viewContent = viewContent.trimStart();\r\n\r\n if (debug) {\r\n logger(`[FnxParser TSX] View starts at line ${viewStart}`);\r\n }\r\n\r\n push(\" return (\");\r\n\r\n const viewLines = viewContent.split(\"\\n\");\r\n viewLines.forEach((line, i) => {\r\n push(\" \" + line, viewStart + i);\r\n });\r\n\r\n push(\" );\");\r\n } else {\r\n push(\" return null;\");\r\n }\r\n\r\n push(\"}\");\r\n\r\n const code = lines.join(\"\\n\");\r\n const sourceMap = buildSourceMap(source, code, lineMap);\r\n\r\n return { code, lineMap, sourceMap };\r\n}\r\n\r\n// =====================================================\r\n// UTILITY FUNCTIONS\r\n// =====================================================\r\n\r\n/**\r\n * Reconstruct approximate original content from parsed result\r\n * (Used for source map building when original isn't available)\r\n */\r\nfunction createOriginalContent(parsed: ParsedFnxFile): string {\r\n const parts: string[] = [];\r\n\r\n if (parsed.hasLogic) {\r\n parts.push(`<logic setup=\"${parsed.logicLang}\">`);\r\n if (parsed.imports.length > 0) {\r\n parts.push(parsed.imports.join(\"\\n\"));\r\n }\r\n if (parsed.exports.length > 0) {\r\n parts.push(parsed.exports.join(\"\\n\"));\r\n }\r\n if (parsed.logic.trim()) {\r\n parts.push(parsed.logic);\r\n }\r\n parts.push(\"</logic>\");\r\n }\r\n\r\n if (parsed.hasView) {\r\n parts.push(`<view>`);\r\n parts.push(parsed.view);\r\n parts.push(\"</view>\");\r\n }\r\n\r\n if (parsed.hasStyle) {\r\n parts.push(parsed.isStyleScoped ? `<style scoped>` : `<style>`);\r\n parts.push(parsed.style);\r\n parts.push(\"</style>\");\r\n }\r\n\r\n return parts.join(\"\\n\");\r\n}\r\n\r\n/**\r\n * Get line and character from text position\r\n */\r\nexport function getLineAndCharacterOfPosition(\r\n text: string,\r\n pos: number\r\n): { line: number; character: number } {\r\n const lines = text.split(\"\\n\");\r\n let currentPos = 0;\r\n\r\n for (let line = 0; line < lines.length; line++) {\r\n const currentLine = lines[line];\r\n const lineLength = (currentLine?.length ?? 0) + 1;\r\n if (currentPos + lineLength > pos) {\r\n return {\r\n line,\r\n character: pos - currentPos,\r\n };\r\n }\r\n currentPos += lineLength;\r\n }\r\n\r\n return { line: Math.max(0, lines.length - 1), character: 0 };\r\n}\r\n\r\n/**\r\n * Get text position from line and character\r\n */\r\nexport function getPositionOfLineAndCharacter(\r\n text: string,\r\n line: number,\r\n character: number\r\n): number {\r\n const lines = text.split(\"\\n\");\r\n let pos = 0;\r\n\r\n for (let i = 0; i < line && i < lines.length; i++) {\r\n const currentLine = lines[i];\r\n pos += (currentLine?.length ?? 0) + 1;\r\n }\r\n\r\n const targetLine = lines[line];\r\n return pos + Math.min(character, targetLine?.length ?? 0);\r\n}\r\n\r\n/**\r\n * Map position from transformed code to original\r\n */\r\nexport function mapTransformedToOriginal(\r\n position: number,\r\n transformedCode: string,\r\n originalContent: string,\r\n lineMap: number[],\r\n sourceMap: SourceMap\r\n): number {\r\n // Try exact mapping first\r\n if (sourceMap.transformedToOriginal.has(position)) {\r\n return sourceMap.transformedToOriginal.get(position)!;\r\n }\r\n\r\n // Fallback: map by line\r\n const { line: tLine, character: tChar } = getLineAndCharacterOfPosition(\r\n transformedCode,\r\n position\r\n );\r\n\r\n const originalLine = lineMap[tLine];\r\n\r\n if (originalLine === undefined || originalLine < 0) {\r\n return 0;\r\n }\r\n\r\n return getPositionOfLineAndCharacter(originalContent, originalLine, tChar);\r\n}\r\n\r\n/**\r\n * Map position from original code to transformed\r\n */\r\nexport function mapOriginalToTransformed(\r\n position: number,\r\n transformedCode: string,\r\n originalContent: string,\r\n lineMap: number[],\r\n sourceMap: SourceMap\r\n): number {\r\n // Try exact mapping first\r\n if (sourceMap.originalToTransformed.has(position)) {\r\n return sourceMap.originalToTransformed.get(position)!;\r\n }\r\n\r\n // Fallback: map by line\r\n const { line: oLine, character: oChar } = getLineAndCharacterOfPosition(\r\n originalContent,\r\n position\r\n );\r\n\r\n const tLine = lineMap.indexOf(oLine);\r\n if (tLine < 0) {\r\n return 0;\r\n }\r\n\r\n return getPositionOfLineAndCharacter(transformedCode, tLine, oChar);\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type TransformOptions } from "esbuild";
|
|
1
|
+
import { type TransformOptions as EsbuildTransformOptions } from "esbuild";
|
|
2
2
|
import * as ts from "typescript";
|
|
3
3
|
interface FynixPluginOptions {
|
|
4
4
|
jsxFactory?: string;
|
|
@@ -6,25 +6,13 @@ interface FynixPluginOptions {
|
|
|
6
6
|
include?: string[];
|
|
7
7
|
exclude?: string[];
|
|
8
8
|
sourcemap?: boolean;
|
|
9
|
-
esbuildOptions?: Partial<
|
|
9
|
+
esbuildOptions?: Partial<EsbuildTransformOptions>;
|
|
10
10
|
enableSFC?: boolean;
|
|
11
11
|
debug?: boolean;
|
|
12
12
|
showGeneratedCode?: boolean;
|
|
13
13
|
typeCheck?: boolean;
|
|
14
14
|
tsConfig?: ts.CompilerOptions;
|
|
15
15
|
}
|
|
16
|
-
interface SFCParsedResult {
|
|
17
|
-
logic: string;
|
|
18
|
-
view: string;
|
|
19
|
-
style: string;
|
|
20
|
-
logicLang: "js" | "ts";
|
|
21
|
-
hasLogic: boolean;
|
|
22
|
-
hasView: boolean;
|
|
23
|
-
hasStyle: boolean;
|
|
24
|
-
isStyleScoped: boolean;
|
|
25
|
-
imports: string[];
|
|
26
|
-
exports: string[];
|
|
27
|
-
}
|
|
28
16
|
declare class TypeScriptChecker {
|
|
29
17
|
private compilerOptions;
|
|
30
18
|
private virtualFiles;
|
|
@@ -37,5 +25,5 @@ declare class TypeScriptChecker {
|
|
|
37
25
|
}
|
|
38
26
|
export default function fynixPlugin(options?: FynixPluginOptions): any;
|
|
39
27
|
export { fynixPlugin, TypeScriptChecker };
|
|
40
|
-
export type { FynixPluginOptions
|
|
28
|
+
export type { FynixPluginOptions };
|
|
41
29
|
//# sourceMappingURL=vite-plugin-res.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite-plugin-res.d.ts","sourceRoot":"","sources":["../../plugins/vite-plugin-res.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"vite-plugin-res.d.ts","sourceRoot":"","sources":["../../plugins/vite-plugin-res.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,IAAI,uBAAuB,EACjD,MAAM,SAAS,CAAC;AAGjB,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAyBjC,UAAU,kBAAkB;IAK1B,UAAU,CAAC,EAAE,MAAM,CAAC;IAMpB,WAAW,CAAC,EAAE,MAAM,CAAC;IAMrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAMnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAMnB,SAAS,CAAC,EAAE,OAAO,CAAC;IAKpB,cAAc,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAMlD,SAAS,CAAC,EAAE,OAAO,CAAC;IAMpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAMhB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAM5B,SAAS,CAAC,EAAE,OAAO,CAAC;IAKpB,QAAQ,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;CAC/B;AAaD,cAAM,iBAAiB;IACrB,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,OAAO,CAA2B;gBAE9B,aAAa,CAAC,EAAE,EAAE,CAAC,eAAe;IAuB9C,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAKhD,OAAO,CAAC,kBAAkB;IA8C1B,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAmErC,KAAK,IAAI,IAAI;CAId;AAKD,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,GAAG,CAqOzE;AAED,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;AAC1C,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { transform } from "esbuild";
|
|
1
|
+
import { transform, } from "esbuild";
|
|
2
2
|
import { normalizePath } from "vite";
|
|
3
3
|
import * as ts from "typescript";
|
|
4
|
+
import { parseFnxFile, validateParsedFnx, transformToComponent, } from "../parser/fnx-parser";
|
|
4
5
|
const colors = {
|
|
5
6
|
reset: "\x1b[0m",
|
|
6
7
|
red: "\x1b[31m",
|
|
@@ -12,255 +13,6 @@ const colors = {
|
|
|
12
13
|
gray: "\x1b[90m",
|
|
13
14
|
bold: "\x1b[1m",
|
|
14
15
|
};
|
|
15
|
-
function parseSFC(source) {
|
|
16
|
-
const result = {
|
|
17
|
-
logic: "",
|
|
18
|
-
view: "",
|
|
19
|
-
style: "",
|
|
20
|
-
logicLang: "ts",
|
|
21
|
-
hasLogic: false,
|
|
22
|
-
hasView: false,
|
|
23
|
-
hasStyle: false,
|
|
24
|
-
isStyleScoped: false,
|
|
25
|
-
imports: [],
|
|
26
|
-
exports: [],
|
|
27
|
-
};
|
|
28
|
-
const logicMatch = source.match(/<logic\s+setup\s*=\s*["']?(ts|js)["']?\s*>([\s\S]*?)<\/logic>/i);
|
|
29
|
-
if (logicMatch && logicMatch[1] && logicMatch[2] !== undefined) {
|
|
30
|
-
result.hasLogic = true;
|
|
31
|
-
result.logicLang = logicMatch[1].toLowerCase();
|
|
32
|
-
const rawLogic = logicMatch[2].trim();
|
|
33
|
-
const logicLines = rawLogic.split("\n");
|
|
34
|
-
const imports = [];
|
|
35
|
-
const exports = [];
|
|
36
|
-
const otherLogic = [];
|
|
37
|
-
let inExportBlock = false;
|
|
38
|
-
let exportBuffer = [];
|
|
39
|
-
let exportBraceDepth = 0;
|
|
40
|
-
for (let i = 0; i < logicLines.length; i++) {
|
|
41
|
-
const line = logicLines[i] ?? "";
|
|
42
|
-
const trimmed = line.trim();
|
|
43
|
-
if (inExportBlock) {
|
|
44
|
-
exportBuffer.push(line);
|
|
45
|
-
const openBraces = ((line && line.match(/{/g)) || []).length;
|
|
46
|
-
const closeBraces = ((line && line.match(/}/g)) || []).length;
|
|
47
|
-
exportBraceDepth += openBraces - closeBraces;
|
|
48
|
-
if (exportBraceDepth <= 0) {
|
|
49
|
-
exports.push(exportBuffer.join("\n"));
|
|
50
|
-
exportBuffer = [];
|
|
51
|
-
inExportBlock = false;
|
|
52
|
-
exportBraceDepth = 0;
|
|
53
|
-
}
|
|
54
|
-
continue;
|
|
55
|
-
}
|
|
56
|
-
if (trimmed.startsWith("import ")) {
|
|
57
|
-
imports.push(line ?? "");
|
|
58
|
-
}
|
|
59
|
-
else if (trimmed.startsWith("export ")) {
|
|
60
|
-
if (/export\s+\w+\s*=\s*{/.test(trimmed) || trimmed.endsWith("{")) {
|
|
61
|
-
inExportBlock = true;
|
|
62
|
-
exportBuffer = [line];
|
|
63
|
-
exportBraceDepth =
|
|
64
|
-
((line && line.match(/{/g)) || []).length -
|
|
65
|
-
((line && line.match(/}/g)) || []).length;
|
|
66
|
-
if (exportBraceDepth <= 0) {
|
|
67
|
-
exports.push(exportBuffer.join("\n"));
|
|
68
|
-
exportBuffer = [];
|
|
69
|
-
inExportBlock = false;
|
|
70
|
-
exportBraceDepth = 0;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
exports.push(line ?? "");
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
else if (trimmed) {
|
|
78
|
-
otherLogic.push(line ?? "");
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
if (exportBuffer.length > 0) {
|
|
82
|
-
exports.push(exportBuffer.join("\n"));
|
|
83
|
-
}
|
|
84
|
-
result.imports = imports;
|
|
85
|
-
result.exports = exports;
|
|
86
|
-
result.logic = otherLogic.join("\n");
|
|
87
|
-
}
|
|
88
|
-
const viewMatch = source.match(/<view\s*>([\s\S]*?)<\/view>/i);
|
|
89
|
-
if (viewMatch && viewMatch[1] !== undefined) {
|
|
90
|
-
result.hasView = true;
|
|
91
|
-
result.view = viewMatch[1].trim();
|
|
92
|
-
}
|
|
93
|
-
const styleMatch = source.match(/<style(\s+scoped)?\s*>([\s\S]*?)<\/style>/i);
|
|
94
|
-
if (styleMatch && styleMatch[2] !== undefined) {
|
|
95
|
-
result.hasStyle = true;
|
|
96
|
-
result.isStyleScoped = !!styleMatch[1];
|
|
97
|
-
result.style = styleMatch[2].trim();
|
|
98
|
-
}
|
|
99
|
-
return result;
|
|
100
|
-
}
|
|
101
|
-
function generateStyleId(filePath) {
|
|
102
|
-
let hash = 0;
|
|
103
|
-
for (let i = 0; i < filePath.length; i++) {
|
|
104
|
-
const char = filePath.charCodeAt(i);
|
|
105
|
-
hash = (hash << 5) - hash + char;
|
|
106
|
-
hash = hash & hash;
|
|
107
|
-
}
|
|
108
|
-
return `fynix-${Math.abs(hash).toString(36)}`;
|
|
109
|
-
}
|
|
110
|
-
function transformSFC(parsed, filePath, jsxFactory) {
|
|
111
|
-
const styleId = generateStyleId(filePath);
|
|
112
|
-
const lines = [];
|
|
113
|
-
lines.push(`import { ${jsxFactory} } from '@fynixorg/ui';`);
|
|
114
|
-
if (parsed.imports.length > 0) {
|
|
115
|
-
parsed.imports.forEach((importLine) => {
|
|
116
|
-
lines.push(importLine);
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
lines.push("");
|
|
120
|
-
if (parsed.hasStyle) {
|
|
121
|
-
let processedStyle = parsed.style;
|
|
122
|
-
if (parsed.isStyleScoped) {
|
|
123
|
-
processedStyle = scopeStyles(parsed.style, styleId);
|
|
124
|
-
}
|
|
125
|
-
lines.push(`// Inject styles`);
|
|
126
|
-
lines.push(`if (typeof document !== 'undefined') {`);
|
|
127
|
-
lines.push(` const styleId = '${styleId}';`);
|
|
128
|
-
lines.push(` if (!document.getElementById(styleId)) {`);
|
|
129
|
-
lines.push(` const styleEl = document.createElement('style');`);
|
|
130
|
-
lines.push(` styleEl.id = styleId;`);
|
|
131
|
-
lines.push(` styleEl.textContent = ${JSON.stringify(processedStyle)};`);
|
|
132
|
-
lines.push(` document.head.appendChild(styleEl);`);
|
|
133
|
-
lines.push(` }`);
|
|
134
|
-
lines.push(`}`);
|
|
135
|
-
lines.push("");
|
|
136
|
-
}
|
|
137
|
-
if (parsed.exports.length > 0) {
|
|
138
|
-
parsed.exports.forEach((exportLine) => {
|
|
139
|
-
lines.push(exportLine);
|
|
140
|
-
});
|
|
141
|
-
lines.push("");
|
|
142
|
-
}
|
|
143
|
-
lines.push(`function FynixComponent(props = {}) {`);
|
|
144
|
-
if (parsed.hasLogic && parsed.logic.trim()) {
|
|
145
|
-
lines.push(` // Component logic`);
|
|
146
|
-
const logicLines = parsed.logic.split("\n");
|
|
147
|
-
logicLines.forEach((line) => {
|
|
148
|
-
if (line.trim()) {
|
|
149
|
-
lines.push(` ${line}`);
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
lines.push("");
|
|
153
|
-
}
|
|
154
|
-
if (parsed.exports.some((e) => e.trim().startsWith("export const meta"))) {
|
|
155
|
-
lines.push(` if (typeof document !== "undefined" && typeof meta !== "undefined") {`);
|
|
156
|
-
lines.push(` document.title = meta.title;`);
|
|
157
|
-
lines.push(` const metaTags = [`);
|
|
158
|
-
lines.push(` { name: "description", content: meta.description },`);
|
|
159
|
-
lines.push(` { name: "keywords", content: meta.keywords },`);
|
|
160
|
-
lines.push(` { property: "og:title", content: meta.ogTitle },`);
|
|
161
|
-
lines.push(` { property: "og:description", content: meta.ogDescription },`);
|
|
162
|
-
lines.push(` { property: "og:image", content: meta.ogImage },`);
|
|
163
|
-
lines.push(` ];`);
|
|
164
|
-
lines.push(` metaTags.forEach(({ name, property, content }) => {`);
|
|
165
|
-
lines.push(` if (!content) return;`);
|
|
166
|
-
lines.push(` let tag;`);
|
|
167
|
-
lines.push(` if (name) {`);
|
|
168
|
-
lines.push(` tag = document.querySelector(\`meta[name='\${name}\']\`);`);
|
|
169
|
-
lines.push(` if (!tag) {`);
|
|
170
|
-
lines.push(` tag = document.createElement("meta");`);
|
|
171
|
-
lines.push(` tag.setAttribute("name", name);`);
|
|
172
|
-
lines.push(` document.head.appendChild(tag);`);
|
|
173
|
-
lines.push(` }`);
|
|
174
|
-
lines.push(` } else if (property) {`);
|
|
175
|
-
lines.push(` tag = document.querySelector(\`meta[property='\${property}\']\`);`);
|
|
176
|
-
lines.push(` if (!tag) {`);
|
|
177
|
-
lines.push(` tag = document.createElement("meta");`);
|
|
178
|
-
lines.push(` tag.setAttribute("property", property);`);
|
|
179
|
-
lines.push(` document.head.appendChild(tag);`);
|
|
180
|
-
lines.push(` }`);
|
|
181
|
-
lines.push(` }`);
|
|
182
|
-
lines.push(` if (tag) tag.setAttribute("content", content);`);
|
|
183
|
-
lines.push(` });`);
|
|
184
|
-
lines.push(` }`);
|
|
185
|
-
lines.push("");
|
|
186
|
-
}
|
|
187
|
-
if (parsed.hasView) {
|
|
188
|
-
lines.push(` // Component view`);
|
|
189
|
-
if (parsed.isStyleScoped) {
|
|
190
|
-
lines.push(` return (`);
|
|
191
|
-
lines.push(` <div data-${styleId}="">`);
|
|
192
|
-
const viewLines = parsed.view.split("\n");
|
|
193
|
-
viewLines.forEach((line) => {
|
|
194
|
-
lines.push(` ${line}`);
|
|
195
|
-
});
|
|
196
|
-
lines.push(` </div>`);
|
|
197
|
-
lines.push(` );`);
|
|
198
|
-
}
|
|
199
|
-
else {
|
|
200
|
-
lines.push(` return (`);
|
|
201
|
-
const viewLines = parsed.view.split("\n");
|
|
202
|
-
viewLines.forEach((line) => {
|
|
203
|
-
lines.push(` ${line}`);
|
|
204
|
-
});
|
|
205
|
-
lines.push(` );`);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
lines.push(` return null;`);
|
|
210
|
-
}
|
|
211
|
-
lines.push(`}`);
|
|
212
|
-
lines.push("");
|
|
213
|
-
lines.push(`export default FynixComponent;`);
|
|
214
|
-
return lines.join("\n");
|
|
215
|
-
}
|
|
216
|
-
function scopeStyles(css, scopeId) {
|
|
217
|
-
const dataAttr = `[data-${scopeId}]`;
|
|
218
|
-
return css.replace(/([^{}]+)\{([^{}]*)\}/g, (match, selector, rules) => {
|
|
219
|
-
if (selector.trim().startsWith("@")) {
|
|
220
|
-
return match;
|
|
221
|
-
}
|
|
222
|
-
const selectors = selector.split(",").map((s) => {
|
|
223
|
-
const trimmed = s.trim();
|
|
224
|
-
const pseudoMatch = trimmed.match(/^(.+?)(::?[a-z-]+(?:\([^)]*\))?)$/i);
|
|
225
|
-
if (pseudoMatch) {
|
|
226
|
-
return `${dataAttr} ${pseudoMatch[1]}${pseudoMatch[2]}`;
|
|
227
|
-
}
|
|
228
|
-
return `${dataAttr} ${trimmed}`;
|
|
229
|
-
});
|
|
230
|
-
return `${selectors.join(", ")}{${rules}}`;
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
function validateSFC(parsed, filePath) {
|
|
234
|
-
if (!parsed.hasView) {
|
|
235
|
-
throw new Error(`${colors.red}[Fynix SFC]${colors.reset} Missing <view> block in ${colors.cyan}${filePath}${colors.reset}. Every .fnx file must have a <view> section.`);
|
|
236
|
-
}
|
|
237
|
-
if (parsed.hasLogic && !["ts", "js"].includes(parsed.logicLang)) {
|
|
238
|
-
throw new Error(`${colors.red}[Fynix SFC]${colors.reset} Invalid setup attribute in <logic> block in ${colors.cyan}${filePath}${colors.reset}. Must be "ts" or "js".`);
|
|
239
|
-
}
|
|
240
|
-
if (parsed.hasLogic && parsed.logicLang === "js") {
|
|
241
|
-
const tsPatterns = [
|
|
242
|
-
{ pattern: /\binterface\s+\w+/, name: "interface declaration" },
|
|
243
|
-
{ pattern: /\btype\s+\w+\s*=/, name: "type alias" },
|
|
244
|
-
{ pattern: /:\s*\w+(\[\]|<[^>]+>)?\s*[;,=)]/, name: "type annotation" },
|
|
245
|
-
{ pattern: /<\w+>(?!\s*<)/, name: "generic type" },
|
|
246
|
-
{ pattern: /\benum\s+\w+/, name: "enum declaration" },
|
|
247
|
-
{ pattern: /\bas\s+\w+/, name: "type assertion" },
|
|
248
|
-
{ pattern: /\bnamespace\s+\w+/, name: "namespace" },
|
|
249
|
-
{ pattern: /\babstract\s+class/, name: "abstract class" },
|
|
250
|
-
{
|
|
251
|
-
pattern: /\bpublic\s+|private\s+|protected\s+/,
|
|
252
|
-
name: "access modifier",
|
|
253
|
-
},
|
|
254
|
-
];
|
|
255
|
-
const allCode = parsed.logic + "\n" + parsed.imports.join("\n");
|
|
256
|
-
for (const { pattern, name } of tsPatterns) {
|
|
257
|
-
if (pattern.test(allCode)) {
|
|
258
|
-
throw new Error(`${colors.red}[Fynix SFC]${colors.reset} TypeScript syntax detected ${colors.yellow}(${name})${colors.reset} in ${colors.cyan}${filePath}${colors.reset} with ${colors.yellow}setup="js"${colors.reset}.\n` +
|
|
259
|
-
`${colors.gray}Either change to setup="ts" or remove TypeScript-specific syntax.${colors.reset}`);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
16
|
class TypeScriptChecker {
|
|
265
17
|
constructor(customOptions) {
|
|
266
18
|
this.virtualFiles = new Map();
|
|
@@ -401,9 +153,15 @@ export default function fynixPlugin(options = {}) {
|
|
|
401
153
|
let loader = "tsx";
|
|
402
154
|
let shouldTypeCheck = false;
|
|
403
155
|
if (normalizedId.endsWith(".fnx") && enableSFC) {
|
|
404
|
-
const parsed =
|
|
405
|
-
|
|
406
|
-
|
|
156
|
+
const parsed = parseFnxFile(code);
|
|
157
|
+
validateParsedFnx(parsed, normalizedId);
|
|
158
|
+
const transformResult = transformToComponent(parsed, {
|
|
159
|
+
filePath: normalizedId,
|
|
160
|
+
jsxFactory,
|
|
161
|
+
includeStyleInjection: true,
|
|
162
|
+
includeMetaInjection: true,
|
|
163
|
+
});
|
|
164
|
+
codeToTransform = transformResult.code;
|
|
407
165
|
if (showGeneratedCode) {
|
|
408
166
|
console.log(`\n${colors.cyan}${"=".repeat(80)}${colors.reset}`);
|
|
409
167
|
console.log(`${colors.cyan}[Fynix SFC]${colors.reset} Generated code for: ${colors.gray}${normalizedId}${colors.reset}`);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../plugins/vite-plugin-res.ts"],
|
|
4
|
-
"sourcesContent": ["import { transform, type TransformOptions } from \"esbuild\";\r\nimport type { HmrContext, UserConfig } from \"vite\";\r\nimport { normalizePath } from \"vite\";\r\nimport * as ts from \"typescript\";\r\n\r\n/**\r\n * ANSI color codes for terminal output\r\n */\r\nconst colors = {\r\n reset: \"\\x1b[0m\",\r\n red: \"\\x1b[31m\",\r\n green: \"\\x1b[32m\",\r\n yellow: \"\\x1b[33m\",\r\n blue: \"\\x1b[34m\",\r\n magenta: \"\\x1b[35m\",\r\n cyan: \"\\x1b[36m\",\r\n gray: \"\\x1b[90m\",\r\n bold: \"\\x1b[1m\",\r\n};\r\n\r\n/**\r\n * Vite plugin options for Fynix with SFC support\r\n */\r\ninterface FynixPluginOptions {\r\n /**\r\n * JSX factory function name\r\n * @default \"Fynix\"\r\n */\r\n jsxFactory?: string;\r\n\r\n /**\r\n * JSX fragment factory name\r\n * @default \"Fynix.Fragment\"\r\n */\r\n jsxFragment?: string;\r\n\r\n /**\r\n * File extensions to transform\r\n * @default [\".ts\", \".js\", \".jsx\", \".tsx\", \".fnx\"]\r\n */\r\n include?: string[];\r\n\r\n /**\r\n * Paths to exclude from transformation\r\n * @default [\"node_modules\"]\r\n */\r\n exclude?: string[];\r\n\r\n /**\r\n * Enable source maps\r\n * @default true\r\n */\r\n sourcemap?: boolean;\r\n\r\n /**\r\n * Custom esbuild transform options\r\n */\r\n esbuildOptions?: Partial<TransformOptions>;\r\n\r\n /**\r\n * Enable SFC parsing for .fnx files\r\n * @default true\r\n */\r\n enableSFC?: boolean;\r\n\r\n /**\r\n * Enable debug logging\r\n * @default false\r\n */\r\n debug?: boolean;\r\n\r\n /**\r\n * Show generated code in console (useful for debugging SFC transformation)\r\n * @default false\r\n */\r\n showGeneratedCode?: boolean;\r\n\r\n /**\r\n * Enable TypeScript type checking (slower but catches type errors)\r\n * @default false\r\n */\r\n typeCheck?: boolean;\r\n\r\n /**\r\n * TypeScript compiler options override\r\n */\r\n tsConfig?: ts.CompilerOptions;\r\n}\r\n\r\n/**\r\n * Extended context type that includes Vite's transform context methods\r\n */\r\ninterface TransformContext {\r\n addWatchFile?: (id: string) => void;\r\n error?: (error: { message: string; stack?: string; id?: string }) => void;\r\n}\r\n\r\n/**\r\n * Parsed SFC sections\r\n */\r\ninterface SFCParsedResult {\r\n logic: string;\r\n view: string;\r\n style: string;\r\n logicLang: \"js\" | \"ts\";\r\n hasLogic: boolean;\r\n hasView: boolean;\r\n hasStyle: boolean;\r\n isStyleScoped: boolean;\r\n imports: string[];\r\n exports: string[];\r\n}\r\n\r\n/**\r\n * Parse a Fynix SFC file (.fnx)\r\n */\r\nfunction parseSFC(source: string): SFCParsedResult {\r\n const result: SFCParsedResult = {\r\n logic: \"\",\r\n view: \"\",\r\n style: \"\",\r\n logicLang: \"ts\",\r\n hasLogic: false,\r\n hasView: false,\r\n hasStyle: false,\r\n isStyleScoped: false,\r\n imports: [],\r\n exports: [],\r\n };\r\n\r\n // Parse <logic> block with setup attribute\r\n const logicMatch = source.match(\r\n /<logic\\s+setup\\s*=\\s*[\"']?(ts|js)[\"']?\\s*>([\\s\\S]*?)<\\/logic>/i\r\n );\r\n\r\n if (logicMatch && logicMatch[1] && logicMatch[2] !== undefined) {\r\n result.hasLogic = true;\r\n result.logicLang = logicMatch[1].toLowerCase() as \"js\" | \"ts\";\r\n const rawLogic = logicMatch[2].trim();\r\n\r\n // Extract imports, exports, and other logic (multi-line export support)\r\n const logicLines = rawLogic.split(\"\\n\");\r\n const imports: string[] = [];\r\n const exports: string[] = [];\r\n const otherLogic: string[] = [];\r\n let inExportBlock = false;\r\n let exportBuffer: string[] = [];\r\n let exportBraceDepth = 0;\r\n\r\n for (let i = 0; i < logicLines.length; i++) {\r\n const line: string = logicLines[i] ?? \"\";\r\n const trimmed: string = line.trim();\r\n if (inExportBlock) {\r\n exportBuffer.push(line);\r\n // Count braces to handle nested objects\r\n const openBraces = ((line && line.match(/{/g)) || []).length;\r\n const closeBraces = ((line && line.match(/}/g)) || []).length;\r\n exportBraceDepth += openBraces - closeBraces;\r\n if (exportBraceDepth <= 0) {\r\n exports.push(exportBuffer.join(\"\\n\"));\r\n exportBuffer = [];\r\n inExportBlock = false;\r\n exportBraceDepth = 0;\r\n }\r\n continue;\r\n }\r\n if (trimmed.startsWith(\"import \")) {\r\n imports.push(line ?? \"\");\r\n } else if (trimmed.startsWith(\"export \")) {\r\n // Check if this is a multi-line export (object or function)\r\n // Handles: export const foo = { ... }, export const foo =\\n{ ... }, and nested objects\r\n if (/export\\s+\\w+\\s*=\\s*{/.test(trimmed) || trimmed.endsWith(\"{\")) {\r\n inExportBlock = true;\r\n exportBuffer = [line];\r\n // Count braces in the first line\r\n exportBraceDepth =\r\n ((line && line.match(/{/g)) || []).length -\r\n ((line && line.match(/}/g)) || []).length;\r\n // If the export starts and ends on the same line, close immediately\r\n if (exportBraceDepth <= 0) {\r\n exports.push(exportBuffer.join(\"\\n\"));\r\n exportBuffer = [];\r\n inExportBlock = false;\r\n exportBraceDepth = 0;\r\n }\r\n } else {\r\n exports.push(line ?? \"\");\r\n }\r\n } else if (trimmed) {\r\n otherLogic.push(line ?? \"\");\r\n }\r\n }\r\n\r\n // If file ends while still in export block, flush buffer\r\n if (exportBuffer.length > 0) {\r\n exports.push(exportBuffer.join(\"\\n\"));\r\n }\r\n\r\n result.imports = imports;\r\n result.exports = exports;\r\n result.logic = otherLogic.join(\"\\n\");\r\n }\r\n\r\n // Parse <view> block\r\n const viewMatch = source.match(/<view\\s*>([\\s\\S]*?)<\\/view>/i);\r\n if (viewMatch && viewMatch[1] !== undefined) {\r\n result.hasView = true;\r\n result.view = viewMatch[1].trim();\r\n }\r\n\r\n // Parse <style> block with optional scoped attribute\r\n const styleMatch = source.match(/<style(\\s+scoped)?\\s*>([\\s\\S]*?)<\\/style>/i);\r\n if (styleMatch && styleMatch[2] !== undefined) {\r\n result.hasStyle = true;\r\n result.isStyleScoped = !!styleMatch[1];\r\n result.style = styleMatch[2].trim();\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Generate a unique style ID for scoped styles\r\n */\r\nfunction generateStyleId(filePath: string): string {\r\n let hash = 0;\r\n for (let i = 0; i < filePath.length; i++) {\r\n const char = filePath.charCodeAt(i);\r\n hash = (hash << 5) - hash + char;\r\n hash = hash & hash;\r\n }\r\n return `fynix-${Math.abs(hash).toString(36)}`;\r\n}\r\n\r\n/**\r\n * Transform SFC to component code\r\n */\r\nfunction transformSFC(\r\n parsed: SFCParsedResult,\r\n filePath: string,\r\n jsxFactory: string\r\n): string {\r\n const styleId = generateStyleId(filePath);\r\n const lines: string[] = [];\r\n\r\n lines.push(`import { ${jsxFactory} } from '@fynixorg/ui';`);\r\n\r\n if (parsed.imports.length > 0) {\r\n parsed.imports.forEach((importLine) => {\r\n lines.push(importLine);\r\n });\r\n }\r\n\r\n lines.push(\"\");\r\n\r\n if (parsed.hasStyle) {\r\n let processedStyle = parsed.style;\r\n\r\n if (parsed.isStyleScoped) {\r\n processedStyle = scopeStyles(parsed.style, styleId);\r\n }\r\n\r\n lines.push(`// Inject styles`);\r\n lines.push(`if (typeof document !== 'undefined') {`);\r\n lines.push(` const styleId = '${styleId}';`);\r\n lines.push(` if (!document.getElementById(styleId)) {`);\r\n lines.push(` const styleEl = document.createElement('style');`);\r\n lines.push(` styleEl.id = styleId;`);\r\n lines.push(` styleEl.textContent = ${JSON.stringify(processedStyle)};`);\r\n lines.push(` document.head.appendChild(styleEl);`);\r\n lines.push(` }`);\r\n lines.push(`}`);\r\n lines.push(\"\");\r\n }\r\n\r\n // \u2705 Add exports BEFORE component (module-level)\r\n if (parsed.exports.length > 0) {\r\n parsed.exports.forEach((exportLine) => {\r\n lines.push(exportLine);\r\n });\r\n lines.push(\"\");\r\n }\r\n\r\n // \u2705 Use separate function declaration\r\n lines.push(`function FynixComponent(props = {}) {`);\r\n\r\n if (parsed.hasLogic && parsed.logic.trim()) {\r\n lines.push(` // Component logic`);\r\n const logicLines = parsed.logic.split(\"\\n\");\r\n logicLines.forEach((line) => {\r\n if (line.trim()) {\r\n lines.push(` ${line}`);\r\n }\r\n });\r\n lines.push(\"\");\r\n }\r\n\r\n // Inject meta tags if meta export exists\r\n if (parsed.exports.some((e) => e.trim().startsWith(\"export const meta\"))) {\r\n lines.push(\r\n ` if (typeof document !== \"undefined\" && typeof meta !== \"undefined\") {`\r\n );\r\n lines.push(` document.title = meta.title;`);\r\n lines.push(` const metaTags = [`);\r\n lines.push(` { name: \"description\", content: meta.description },`);\r\n lines.push(` { name: \"keywords\", content: meta.keywords },`);\r\n lines.push(` { property: \"og:title\", content: meta.ogTitle },`);\r\n lines.push(\r\n ` { property: \"og:description\", content: meta.ogDescription },`\r\n );\r\n lines.push(` { property: \"og:image\", content: meta.ogImage },`);\r\n lines.push(` ];`);\r\n lines.push(` metaTags.forEach(({ name, property, content }) => {`);\r\n lines.push(` if (!content) return;`);\r\n lines.push(` let tag;`);\r\n lines.push(` if (name) {`);\r\n lines.push(\r\n ` tag = document.querySelector(\\`meta[name='\\${name}\\']\\`);`\r\n );\r\n lines.push(` if (!tag) {`);\r\n lines.push(` tag = document.createElement(\"meta\");`);\r\n lines.push(` tag.setAttribute(\"name\", name);`);\r\n lines.push(` document.head.appendChild(tag);`);\r\n lines.push(` }`);\r\n lines.push(` } else if (property) {`);\r\n lines.push(\r\n ` tag = document.querySelector(\\`meta[property='\\${property}\\']\\`);`\r\n );\r\n lines.push(` if (!tag) {`);\r\n lines.push(` tag = document.createElement(\"meta\");`);\r\n lines.push(` tag.setAttribute(\"property\", property);`);\r\n lines.push(` document.head.appendChild(tag);`);\r\n lines.push(` }`);\r\n lines.push(` }`);\r\n lines.push(` if (tag) tag.setAttribute(\"content\", content);`);\r\n lines.push(` });`);\r\n lines.push(` }`);\r\n lines.push(\"\");\r\n }\r\n\r\n if (parsed.hasView) {\r\n lines.push(` // Component view`);\r\n\r\n if (parsed.isStyleScoped) {\r\n lines.push(` return (`);\r\n lines.push(` <div data-${styleId}=\"\">`);\r\n const viewLines = parsed.view.split(\"\\n\");\r\n viewLines.forEach((line) => {\r\n lines.push(` ${line}`);\r\n });\r\n lines.push(` </div>`);\r\n lines.push(` );`);\r\n } else {\r\n lines.push(` return (`);\r\n const viewLines = parsed.view.split(\"\\n\");\r\n viewLines.forEach((line) => {\r\n lines.push(` ${line}`);\r\n });\r\n lines.push(` );`);\r\n }\r\n } else {\r\n lines.push(` return null;`);\r\n }\r\n\r\n lines.push(`}`);\r\n lines.push(\"\");\r\n\r\n // \u2705 Export default separately\r\n lines.push(`export default FynixComponent;`);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n\r\n/**\r\n * Scope CSS styles by adding data attribute selector\r\n */\r\nfunction scopeStyles(css: string, scopeId: string): string {\r\n const dataAttr = `[data-${scopeId}]`;\r\n\r\n return css.replace(/([^{}]+)\\{([^{}]*)\\}/g, (match, selector, rules) => {\r\n if (selector.trim().startsWith(\"@\")) {\r\n return match;\r\n }\r\n\r\n const selectors = selector.split(\",\").map((s: string) => {\r\n const trimmed = s.trim();\r\n\r\n const pseudoMatch = trimmed.match(/^(.+?)(::?[a-z-]+(?:\\([^)]*\\))?)$/i);\r\n if (pseudoMatch) {\r\n return `${dataAttr} ${pseudoMatch[1]}${pseudoMatch[2]}`;\r\n }\r\n\r\n return `${dataAttr} ${trimmed}`;\r\n });\r\n\r\n return `${selectors.join(\", \")}{${rules}}`;\r\n });\r\n}\r\n\r\n/**\r\n * Validate SFC structure\r\n */\r\nfunction validateSFC(parsed: SFCParsedResult, filePath: string): void {\r\n if (!parsed.hasView) {\r\n throw new Error(\r\n `${colors.red}[Fynix SFC]${colors.reset} Missing <view> block in ${colors.cyan}${filePath}${colors.reset}. Every .fnx file must have a <view> section.`\r\n );\r\n }\r\n\r\n if (parsed.hasLogic && ![\"ts\", \"js\"].includes(parsed.logicLang)) {\r\n throw new Error(\r\n `${colors.red}[Fynix SFC]${colors.reset} Invalid setup attribute in <logic> block in ${colors.cyan}${filePath}${colors.reset}. Must be \"ts\" or \"js\".`\r\n );\r\n }\r\n\r\n if (parsed.hasLogic && parsed.logicLang === \"js\") {\r\n const tsPatterns = [\r\n { pattern: /\\binterface\\s+\\w+/, name: \"interface declaration\" },\r\n { pattern: /\\btype\\s+\\w+\\s*=/, name: \"type alias\" },\r\n { pattern: /:\\s*\\w+(\\[\\]|<[^>]+>)?\\s*[;,=)]/, name: \"type annotation\" },\r\n { pattern: /<\\w+>(?!\\s*<)/, name: \"generic type\" },\r\n { pattern: /\\benum\\s+\\w+/, name: \"enum declaration\" },\r\n { pattern: /\\bas\\s+\\w+/, name: \"type assertion\" },\r\n { pattern: /\\bnamespace\\s+\\w+/, name: \"namespace\" },\r\n { pattern: /\\babstract\\s+class/, name: \"abstract class\" },\r\n {\r\n pattern: /\\bpublic\\s+|private\\s+|protected\\s+/,\r\n name: \"access modifier\",\r\n },\r\n ];\r\n\r\n const allCode = parsed.logic + \"\\n\" + parsed.imports.join(\"\\n\");\r\n\r\n for (const { pattern, name } of tsPatterns) {\r\n if (pattern.test(allCode)) {\r\n throw new Error(\r\n `${colors.red}[Fynix SFC]${colors.reset} TypeScript syntax detected ${colors.yellow}(${name})${colors.reset} in ${colors.cyan}${filePath}${colors.reset} with ${colors.yellow}setup=\"js\"${colors.reset}.\\n` +\r\n `${colors.gray}Either change to setup=\"ts\" or remove TypeScript-specific syntax.${colors.reset}`\r\n );\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Improved type checker with better error handling and virtual file system\r\n */\r\nclass TypeScriptChecker {\r\n private compilerOptions: ts.CompilerOptions;\r\n private virtualFiles: Map<string, string> = new Map();\r\n private program: ts.Program | null = null;\r\n\r\n constructor(customOptions?: ts.CompilerOptions) {\r\n this.compilerOptions = {\r\n noEmit: true,\r\n strict: false,\r\n target: ts.ScriptTarget.ESNext,\r\n module: ts.ModuleKind.ESNext,\r\n jsx: ts.JsxEmit.Preserve,\r\n lib: [\"lib.es2023.d.ts\", \"lib.dom.d.ts\"],\r\n moduleResolution: ts.ModuleResolutionKind.Bundler,\r\n esModuleInterop: true,\r\n skipLibCheck: true,\r\n allowSyntheticDefaultImports: true,\r\n strictNullChecks: false,\r\n strictFunctionTypes: false,\r\n noImplicitAny: false,\r\n allowJs: true,\r\n checkJs: false,\r\n resolveJsonModule: true,\r\n isolatedModules: true,\r\n ...customOptions,\r\n };\r\n }\r\n\r\n addFile(fileName: string, content: string): void {\r\n this.virtualFiles.set(fileName, content);\r\n this.program = null;\r\n }\r\n\r\n private createCompilerHost(): ts.CompilerHost {\r\n const defaultHost = ts.createCompilerHost(this.compilerOptions);\r\n\r\n return {\r\n ...defaultHost,\r\n getSourceFile: (fileName, languageVersion) => {\r\n if (this.virtualFiles.has(fileName)) {\r\n const content = this.virtualFiles.get(fileName);\r\n if (content === undefined) return undefined;\r\n return ts.createSourceFile(fileName, content, languageVersion, true);\r\n }\r\n\r\n try {\r\n if (ts.sys.fileExists(fileName)) {\r\n const content = ts.sys.readFile(fileName);\r\n if (content !== undefined) {\r\n return ts.createSourceFile(\r\n fileName,\r\n content,\r\n languageVersion,\r\n true\r\n );\r\n }\r\n }\r\n } catch (err) {\r\n // Silent fail\r\n }\r\n\r\n return undefined;\r\n },\r\n fileExists: (fileName) => {\r\n if (this.virtualFiles.has(fileName)) return true;\r\n return ts.sys.fileExists(fileName);\r\n },\r\n readFile: (fileName) => {\r\n if (this.virtualFiles.has(fileName)) {\r\n const content = this.virtualFiles.get(fileName);\r\n return content === undefined ? undefined : content;\r\n }\r\n const sysContent = ts.sys.readFile(fileName);\r\n return sysContent === undefined ? undefined : sysContent;\r\n },\r\n writeFile: () => {},\r\n };\r\n }\r\n\r\n checkFile(fileName: string): string[] {\r\n const errors: string[] = [];\r\n\r\n try {\r\n if (!this.virtualFiles.has(fileName)) {\r\n return [\"File not found in virtual file system\"];\r\n }\r\n\r\n const compilerHost = this.createCompilerHost();\r\n\r\n if (!this.program) {\r\n this.program = ts.createProgram(\r\n [fileName],\r\n this.compilerOptions,\r\n compilerHost\r\n );\r\n }\r\n\r\n const sourceFile = this.program.getSourceFile(fileName);\r\n if (!sourceFile) {\r\n return [`Could not get source file for ${fileName}`];\r\n }\r\n\r\n const diagnostics = [\r\n ...this.program.getSyntacticDiagnostics(sourceFile),\r\n ...this.program.getSemanticDiagnostics(sourceFile),\r\n ];\r\n\r\n const skipCodes = new Set([2307, 2792, 7016, 2304, 7026, 2874]);\r\n\r\n diagnostics.forEach((diagnostic) => {\r\n if (skipCodes.has(diagnostic.code)) {\r\n return;\r\n }\r\n\r\n if (diagnostic.file && diagnostic.start !== undefined) {\r\n const pos = diagnostic.file.getLineAndCharacterOfPosition(\r\n diagnostic.start\r\n );\r\n const line = pos?.line ?? 0;\r\n const character = pos?.character ?? 0;\r\n const message = ts.flattenDiagnosticMessageText(\r\n diagnostic.messageText,\r\n \"\\n\"\r\n );\r\n errors.push(\r\n `${colors.yellow}Line ${line + 1}:${character + 1}${colors.reset} - ${message} ${colors.gray}(TS${diagnostic.code})${colors.reset}`\r\n );\r\n } else {\r\n const message = ts.flattenDiagnosticMessageText(\r\n diagnostic.messageText,\r\n \"\\n\"\r\n );\r\n errors.push(\r\n `${message} ${colors.gray}(TS${diagnostic.code})${colors.reset}`\r\n );\r\n }\r\n });\r\n } catch (error) {\r\n errors.push(\r\n `${colors.red}Type checking error:${colors.reset} ${error instanceof Error ? error.message : String(error)}`\r\n );\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n clear(): void {\r\n this.virtualFiles.clear();\r\n this.program = null;\r\n }\r\n}\r\n\r\n/**\r\n * Vite plugin for Fynix framework with improved SFC support\r\n */\r\nexport default function fynixPlugin(options: FynixPluginOptions = {}): any {\r\n const {\r\n jsxFactory = \"Fynix\",\r\n jsxFragment = \"Fynix.Fragment\",\r\n include = [\".ts\", \".js\", \".jsx\", \".tsx\", \".fnx\"],\r\n exclude = [\"node_modules\"],\r\n sourcemap = true,\r\n esbuildOptions = {},\r\n enableSFC = true,\r\n showGeneratedCode = false,\r\n typeCheck = false,\r\n tsConfig,\r\n } = options;\r\n\r\n let typeChecker: TypeScriptChecker | null = null;\r\n\r\n if (typeCheck) {\r\n typeChecker = new TypeScriptChecker(tsConfig);\r\n }\r\n\r\n return {\r\n name: \"vite-plugin-fynix-sfc\",\r\n enforce: \"pre\" as const,\r\n\r\n async transform(code: string, id: string) {\r\n const normalizedId = normalizePath(id);\r\n\r\n const shouldExclude = exclude.some((pattern) =>\r\n normalizedId.includes(pattern)\r\n );\r\n if (shouldExclude) return null;\r\n\r\n const shouldInclude = include.some((ext) => normalizedId.endsWith(ext));\r\n if (!shouldInclude) return null;\r\n\r\n const ctx = this as unknown as TransformContext;\r\n if (typeof ctx.addWatchFile === \"function\") {\r\n ctx.addWatchFile(id);\r\n }\r\n\r\n try {\r\n let codeToTransform = code;\r\n let loader: TransformOptions[\"loader\"] = \"tsx\";\r\n let shouldTypeCheck = false;\r\n\r\n if (normalizedId.endsWith(\".fnx\") && enableSFC) {\r\n const parsed = parseSFC(code);\r\n validateSFC(parsed, normalizedId);\r\n\r\n codeToTransform = transformSFC(parsed, normalizedId, jsxFactory);\r\n\r\n if (showGeneratedCode) {\r\n console.log(`\\n${colors.cyan}${\"=\".repeat(80)}${colors.reset}`);\r\n console.log(\r\n `${colors.cyan}[Fynix SFC]${colors.reset} Generated code for: ${colors.gray}${normalizedId}${colors.reset}`\r\n );\r\n console.log(`${colors.cyan}${\"=\".repeat(80)}${colors.reset}`);\r\n console.log(codeToTransform);\r\n console.log(`${colors.cyan}${\"=\".repeat(80)}${colors.reset}\\n`);\r\n }\r\n\r\n shouldTypeCheck = typeCheck && parsed.logicLang === \"ts\";\r\n loader = parsed.logicLang === \"ts\" ? \"tsx\" : \"jsx\";\r\n\r\n if (shouldTypeCheck && typeChecker) {\r\n const virtualFileName = normalizedId.replace(\r\n /\\.fnx$/,\r\n \".virtual.tsx\"\r\n );\r\n typeChecker.addFile(virtualFileName, codeToTransform);\r\n const typeErrors = typeChecker.checkFile(virtualFileName);\r\n\r\n if (typeErrors.length > 0) {\r\n console.error(\r\n `\\n${colors.red}${colors.bold}[Fynix SFC] TypeScript Errors${colors.reset} in ${colors.cyan}${normalizedId}${colors.reset}:`\r\n );\r\n typeErrors.forEach((error) => console.error(` ${error}`));\r\n console.error(\"\");\r\n\r\n if (process.env.NODE_ENV === \"production\") {\r\n throw new Error(`TypeScript errors in ${normalizedId}`);\r\n }\r\n }\r\n\r\n shouldTypeCheck = false;\r\n }\r\n } else {\r\n if (normalizedId.endsWith(\".ts\")) {\r\n loader = \"ts\";\r\n shouldTypeCheck = typeCheck;\r\n } else if (normalizedId.endsWith(\".tsx\")) {\r\n loader = \"tsx\";\r\n shouldTypeCheck = typeCheck;\r\n } else if (normalizedId.endsWith(\".jsx\")) {\r\n loader = \"jsx\";\r\n } else if (normalizedId.endsWith(\".js\")) {\r\n loader = \"js\";\r\n }\r\n }\r\n\r\n if (shouldTypeCheck && typeChecker) {\r\n typeChecker.addFile(normalizedId, codeToTransform);\r\n const typeErrors = typeChecker.checkFile(normalizedId);\r\n\r\n if (typeErrors.length > 0) {\r\n console.error(\r\n `\\n${colors.red}${colors.bold}[Fynix SFC] TypeScript Errors${colors.reset} in ${colors.cyan}${normalizedId}${colors.reset}:`\r\n );\r\n typeErrors.forEach((error) => console.error(` ${error}`));\r\n console.error(\"\");\r\n\r\n if (process.env.NODE_ENV === \"production\") {\r\n throw new Error(`TypeScript errors in ${normalizedId}`);\r\n }\r\n }\r\n }\r\n\r\n const result = await transform(codeToTransform, {\r\n loader,\r\n jsxFactory,\r\n jsxFragment,\r\n sourcemap,\r\n sourcefile: id,\r\n target: \"esnext\",\r\n format: \"esm\",\r\n ...esbuildOptions,\r\n });\r\n\r\n return {\r\n code: result.code,\r\n map: result.map || null,\r\n };\r\n } catch (error) {\r\n const err = error as Error;\r\n console.error(\r\n `\\n${colors.red}${colors.bold}[Fynix SFC] Transform Error${colors.reset} in ${colors.cyan}${id}${colors.reset}:`\r\n );\r\n console.error(` ${colors.red}${err.message}${colors.reset}\\n`);\r\n\r\n const ctx = this as unknown as TransformContext;\r\n if (typeof ctx.error === \"function\") {\r\n ctx.error({\r\n message: `Failed to transform ${id}: ${err.message}`,\r\n stack: err.stack,\r\n id,\r\n });\r\n } else {\r\n throw err;\r\n }\r\n return null;\r\n }\r\n },\r\n\r\n handleHotUpdate(ctx: HmrContext) {\r\n const { file, server } = ctx;\r\n const normalizedFile = normalizePath(file);\r\n const shouldReload = include.some((ext) => normalizedFile.endsWith(ext));\r\n\r\n if (shouldReload) {\r\n console.log(\r\n `${colors.green}[HMR]${colors.reset} ${colors.gray}${normalizedFile}${colors.reset}`\r\n );\r\n\r\n if (typeChecker) {\r\n typeChecker.clear();\r\n }\r\n\r\n server.ws.send({\r\n type: \"full-reload\",\r\n path: \"*\",\r\n });\r\n return [];\r\n }\r\n\r\n return undefined;\r\n },\r\n\r\n config() {\r\n const config: Omit<UserConfig, \"plugins\"> = {\r\n esbuild: {\r\n jsxFactory,\r\n jsxFragment,\r\n jsxInject: `import { ${jsxFactory} } from '@fynixorg/ui'`,\r\n },\r\n optimizeDeps: {\r\n include: [\"@fynixorg/ui\"],\r\n esbuildOptions: {\r\n jsx: \"transform\",\r\n jsxFactory,\r\n jsxFragment,\r\n },\r\n },\r\n resolve: {\r\n extensions: [\".fnx\", \".ts\", \".tsx\", \".js\", \".jsx\", \".json\"],\r\n },\r\n };\r\n\r\n return config;\r\n },\r\n\r\n buildStart() {\r\n console.log(\r\n `${colors.cyan}[vite-plugin-fynix-sfc]${colors.reset} Initialized`\r\n );\r\n if (enableSFC) {\r\n console.log(\r\n `${colors.cyan}[vite-plugin-fynix-sfc]${colors.reset} SFC support: ${colors.green}enabled${colors.reset}`\r\n );\r\n }\r\n if (typeCheck) {\r\n console.log(\r\n `${colors.cyan}[vite-plugin-fynix-sfc]${colors.reset} Type checking: ${colors.green}enabled${colors.reset}`\r\n );\r\n }\r\n },\r\n\r\n buildEnd() {\r\n if (typeChecker) {\r\n typeChecker.clear();\r\n }\r\n },\r\n };\r\n}\r\n\r\nexport { fynixPlugin, TypeScriptChecker };\r\nexport type { FynixPluginOptions, SFCParsedResult };\r\n\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import {\r\n transform,\r\n type TransformOptions as EsbuildTransformOptions,\r\n} from \"esbuild\";\r\nimport type { HmrContext, UserConfig } from \"vite\";\r\nimport { normalizePath } from \"vite\";\r\nimport * as ts from \"typescript\";\r\nimport {\r\n parseFnxFile,\r\n validateParsedFnx,\r\n transformToComponent,\r\n} from \"../parser/fnx-parser\";\r\n\r\n/**\r\n * ANSI color codes for terminal output\r\n */\r\nconst colors = {\r\n reset: \"\\x1b[0m\",\r\n red: \"\\x1b[31m\",\r\n green: \"\\x1b[32m\",\r\n yellow: \"\\x1b[33m\",\r\n blue: \"\\x1b[34m\",\r\n magenta: \"\\x1b[35m\",\r\n cyan: \"\\x1b[36m\",\r\n gray: \"\\x1b[90m\",\r\n bold: \"\\x1b[1m\",\r\n};\r\n\r\n/**\r\n * Vite plugin options for Fynix with SFC support\r\n */\r\ninterface FynixPluginOptions {\r\n /**\r\n * JSX factory function name\r\n * @default \"Fynix\"\r\n */\r\n jsxFactory?: string;\r\n\r\n /**\r\n * JSX fragment factory name\r\n * @default \"Fynix.Fragment\"\r\n */\r\n jsxFragment?: string;\r\n\r\n /**\r\n * File extensions to transform\r\n * @default [\".ts\", \".js\", \".jsx\", \".tsx\", \".fnx\"]\r\n */\r\n include?: string[];\r\n\r\n /**\r\n * Paths to exclude from transformation\r\n * @default [\"node_modules\"]\r\n */\r\n exclude?: string[];\r\n\r\n /**\r\n * Enable source maps\r\n * @default true\r\n */\r\n sourcemap?: boolean;\r\n\r\n /**\r\n * Custom esbuild transform options\r\n */\r\n esbuildOptions?: Partial<EsbuildTransformOptions>;\r\n\r\n /**\r\n * Enable SFC parsing for .fnx files\r\n * @default true\r\n */\r\n enableSFC?: boolean;\r\n\r\n /**\r\n * Enable debug logging\r\n * @default false\r\n */\r\n debug?: boolean;\r\n\r\n /**\r\n * Show generated code in console (useful for debugging SFC transformation)\r\n * @default false\r\n */\r\n showGeneratedCode?: boolean;\r\n\r\n /**\r\n * Enable TypeScript type checking (slower but catches type errors)\r\n * @default false\r\n */\r\n typeCheck?: boolean;\r\n\r\n /**\r\n * TypeScript compiler options override\r\n */\r\n tsConfig?: ts.CompilerOptions;\r\n}\r\n\r\n/**\r\n * Extended context type that includes Vite's transform context methods\r\n */\r\ninterface TransformContext {\r\n addWatchFile?: (id: string) => void;\r\n error?: (error: { message: string; stack?: string; id?: string }) => void;\r\n}\r\n\r\n/**\r\n * Improved type checker with better error handling and virtual file system\r\n */\r\nclass TypeScriptChecker {\r\n private compilerOptions: ts.CompilerOptions;\r\n private virtualFiles: Map<string, string> = new Map();\r\n private program: ts.Program | null = null;\r\n\r\n constructor(customOptions?: ts.CompilerOptions) {\r\n this.compilerOptions = {\r\n noEmit: true,\r\n strict: false,\r\n target: ts.ScriptTarget.ESNext,\r\n module: ts.ModuleKind.ESNext,\r\n jsx: ts.JsxEmit.Preserve,\r\n lib: [\"lib.es2023.d.ts\", \"lib.dom.d.ts\"],\r\n moduleResolution: ts.ModuleResolutionKind.Bundler,\r\n esModuleInterop: true,\r\n skipLibCheck: true,\r\n allowSyntheticDefaultImports: true,\r\n strictNullChecks: false,\r\n strictFunctionTypes: false,\r\n noImplicitAny: false,\r\n allowJs: true,\r\n checkJs: false,\r\n resolveJsonModule: true,\r\n isolatedModules: true,\r\n ...customOptions,\r\n };\r\n }\r\n\r\n addFile(fileName: string, content: string): void {\r\n this.virtualFiles.set(fileName, content);\r\n this.program = null;\r\n }\r\n\r\n private createCompilerHost(): ts.CompilerHost {\r\n const defaultHost = ts.createCompilerHost(this.compilerOptions);\r\n\r\n return {\r\n ...defaultHost,\r\n getSourceFile: (fileName, languageVersion) => {\r\n if (this.virtualFiles.has(fileName)) {\r\n const content = this.virtualFiles.get(fileName);\r\n if (content === undefined) return undefined;\r\n return ts.createSourceFile(fileName, content, languageVersion, true);\r\n }\r\n\r\n try {\r\n if (ts.sys.fileExists(fileName)) {\r\n const content = ts.sys.readFile(fileName);\r\n if (content !== undefined) {\r\n return ts.createSourceFile(\r\n fileName,\r\n content,\r\n languageVersion,\r\n true\r\n );\r\n }\r\n }\r\n } catch (err) {\r\n // Silent fail\r\n }\r\n\r\n return undefined;\r\n },\r\n fileExists: (fileName) => {\r\n if (this.virtualFiles.has(fileName)) return true;\r\n return ts.sys.fileExists(fileName);\r\n },\r\n readFile: (fileName) => {\r\n if (this.virtualFiles.has(fileName)) {\r\n const content = this.virtualFiles.get(fileName);\r\n return content === undefined ? undefined : content;\r\n }\r\n const sysContent = ts.sys.readFile(fileName);\r\n return sysContent === undefined ? undefined : sysContent;\r\n },\r\n writeFile: () => {},\r\n };\r\n }\r\n\r\n checkFile(fileName: string): string[] {\r\n const errors: string[] = [];\r\n\r\n try {\r\n if (!this.virtualFiles.has(fileName)) {\r\n return [\"File not found in virtual file system\"];\r\n }\r\n\r\n const compilerHost = this.createCompilerHost();\r\n\r\n if (!this.program) {\r\n this.program = ts.createProgram(\r\n [fileName],\r\n this.compilerOptions,\r\n compilerHost\r\n );\r\n }\r\n\r\n const sourceFile = this.program.getSourceFile(fileName);\r\n if (!sourceFile) {\r\n return [`Could not get source file for ${fileName}`];\r\n }\r\n\r\n const diagnostics = [\r\n ...this.program.getSyntacticDiagnostics(sourceFile),\r\n ...this.program.getSemanticDiagnostics(sourceFile),\r\n ];\r\n\r\n const skipCodes = new Set([2307, 2792, 7016, 2304, 7026, 2874]);\r\n\r\n diagnostics.forEach((diagnostic) => {\r\n if (skipCodes.has(diagnostic.code)) {\r\n return;\r\n }\r\n\r\n if (diagnostic.file && diagnostic.start !== undefined) {\r\n const pos = diagnostic.file.getLineAndCharacterOfPosition(\r\n diagnostic.start\r\n );\r\n const line = pos?.line ?? 0;\r\n const character = pos?.character ?? 0;\r\n const message = ts.flattenDiagnosticMessageText(\r\n diagnostic.messageText,\r\n \"\\n\"\r\n );\r\n errors.push(\r\n `${colors.yellow}Line ${line + 1}:${character + 1}${colors.reset} - ${message} ${colors.gray}(TS${diagnostic.code})${colors.reset}`\r\n );\r\n } else {\r\n const message = ts.flattenDiagnosticMessageText(\r\n diagnostic.messageText,\r\n \"\\n\"\r\n );\r\n errors.push(\r\n `${message} ${colors.gray}(TS${diagnostic.code})${colors.reset}`\r\n );\r\n }\r\n });\r\n } catch (error) {\r\n errors.push(\r\n `${colors.red}Type checking error:${colors.reset} ${error instanceof Error ? error.message : String(error)}`\r\n );\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n clear(): void {\r\n this.virtualFiles.clear();\r\n this.program = null;\r\n }\r\n}\r\n\r\n/**\r\n * Vite plugin for Fynix framework with improved SFC support\r\n */\r\nexport default function fynixPlugin(options: FynixPluginOptions = {}): any {\r\n const {\r\n jsxFactory = \"Fynix\",\r\n jsxFragment = \"Fynix.Fragment\",\r\n include = [\".ts\", \".js\", \".jsx\", \".tsx\", \".fnx\"],\r\n exclude = [\"node_modules\"],\r\n sourcemap = true,\r\n esbuildOptions = {},\r\n enableSFC = true,\r\n showGeneratedCode = false,\r\n typeCheck = false,\r\n tsConfig,\r\n } = options;\r\n\r\n let typeChecker: TypeScriptChecker | null = null;\r\n\r\n if (typeCheck) {\r\n typeChecker = new TypeScriptChecker(tsConfig);\r\n }\r\n\r\n return {\r\n name: \"vite-plugin-fynix-sfc\",\r\n enforce: \"pre\" as const,\r\n\r\n async transform(code: string, id: string) {\r\n const normalizedId = normalizePath(id);\r\n\r\n const shouldExclude = exclude.some((pattern) =>\r\n normalizedId.includes(pattern)\r\n );\r\n if (shouldExclude) return null;\r\n\r\n const shouldInclude = include.some((ext) => normalizedId.endsWith(ext));\r\n if (!shouldInclude) return null;\r\n\r\n const ctx = this as unknown as TransformContext;\r\n if (typeof ctx.addWatchFile === \"function\") {\r\n ctx.addWatchFile(id);\r\n }\r\n\r\n try {\r\n let codeToTransform = code;\r\n let loader: EsbuildTransformOptions[\"loader\"] = \"tsx\";\r\n let shouldTypeCheck = false;\r\n\r\n if (normalizedId.endsWith(\".fnx\") && enableSFC) {\r\n const parsed = parseFnxFile(code);\r\n validateParsedFnx(parsed, normalizedId);\r\n\r\n const transformResult = transformToComponent(parsed, {\r\n filePath: normalizedId,\r\n jsxFactory,\r\n includeStyleInjection: true,\r\n includeMetaInjection: true,\r\n });\r\n\r\n codeToTransform = transformResult.code;\r\n\r\n if (showGeneratedCode) {\r\n console.log(`\\n${colors.cyan}${\"=\".repeat(80)}${colors.reset}`);\r\n console.log(\r\n `${colors.cyan}[Fynix SFC]${colors.reset} Generated code for: ${colors.gray}${normalizedId}${colors.reset}`\r\n );\r\n console.log(`${colors.cyan}${\"=\".repeat(80)}${colors.reset}`);\r\n console.log(codeToTransform);\r\n console.log(`${colors.cyan}${\"=\".repeat(80)}${colors.reset}\\n`);\r\n }\r\n\r\n shouldTypeCheck = typeCheck && parsed.logicLang === \"ts\";\r\n loader = parsed.logicLang === \"ts\" ? \"tsx\" : \"jsx\";\r\n\r\n if (shouldTypeCheck && typeChecker) {\r\n const virtualFileName = normalizedId.replace(\r\n /\\.fnx$/,\r\n \".virtual.tsx\"\r\n );\r\n typeChecker.addFile(virtualFileName, codeToTransform);\r\n const typeErrors = typeChecker.checkFile(virtualFileName);\r\n\r\n if (typeErrors.length > 0) {\r\n console.error(\r\n `\\n${colors.red}${colors.bold}[Fynix SFC] TypeScript Errors${colors.reset} in ${colors.cyan}${normalizedId}${colors.reset}:`\r\n );\r\n typeErrors.forEach((error) => console.error(` ${error}`));\r\n console.error(\"\");\r\n\r\n if (process.env.NODE_ENV === \"production\") {\r\n throw new Error(`TypeScript errors in ${normalizedId}`);\r\n }\r\n }\r\n\r\n shouldTypeCheck = false;\r\n }\r\n } else {\r\n if (normalizedId.endsWith(\".ts\")) {\r\n loader = \"ts\";\r\n shouldTypeCheck = typeCheck;\r\n } else if (normalizedId.endsWith(\".tsx\")) {\r\n loader = \"tsx\";\r\n shouldTypeCheck = typeCheck;\r\n } else if (normalizedId.endsWith(\".jsx\")) {\r\n loader = \"jsx\";\r\n } else if (normalizedId.endsWith(\".js\")) {\r\n loader = \"js\";\r\n }\r\n }\r\n\r\n if (shouldTypeCheck && typeChecker) {\r\n typeChecker.addFile(normalizedId, codeToTransform);\r\n const typeErrors = typeChecker.checkFile(normalizedId);\r\n\r\n if (typeErrors.length > 0) {\r\n console.error(\r\n `\\n${colors.red}${colors.bold}[Fynix SFC] TypeScript Errors${colors.reset} in ${colors.cyan}${normalizedId}${colors.reset}:`\r\n );\r\n typeErrors.forEach((error) => console.error(` ${error}`));\r\n console.error(\"\");\r\n\r\n if (process.env.NODE_ENV === \"production\") {\r\n throw new Error(`TypeScript errors in ${normalizedId}`);\r\n }\r\n }\r\n }\r\n\r\n const result = await transform(codeToTransform, {\r\n loader,\r\n jsxFactory,\r\n jsxFragment,\r\n sourcemap,\r\n sourcefile: id,\r\n target: \"esnext\",\r\n format: \"esm\",\r\n ...esbuildOptions,\r\n });\r\n\r\n return {\r\n code: result.code,\r\n map: result.map || null,\r\n };\r\n } catch (error) {\r\n const err = error as Error;\r\n console.error(\r\n `\\n${colors.red}${colors.bold}[Fynix SFC] Transform Error${colors.reset} in ${colors.cyan}${id}${colors.reset}:`\r\n );\r\n console.error(` ${colors.red}${err.message}${colors.reset}\\n`);\r\n\r\n const ctx = this as unknown as TransformContext;\r\n if (typeof ctx.error === \"function\") {\r\n ctx.error({\r\n message: `Failed to transform ${id}: ${err.message}`,\r\n stack: err.stack,\r\n id,\r\n });\r\n } else {\r\n throw err;\r\n }\r\n return null;\r\n }\r\n },\r\n\r\n handleHotUpdate(ctx: HmrContext) {\r\n const { file, server } = ctx;\r\n const normalizedFile = normalizePath(file);\r\n const shouldReload = include.some((ext) => normalizedFile.endsWith(ext));\r\n\r\n if (shouldReload) {\r\n console.log(\r\n `${colors.green}[HMR]${colors.reset} ${colors.gray}${normalizedFile}${colors.reset}`\r\n );\r\n\r\n if (typeChecker) {\r\n typeChecker.clear();\r\n }\r\n\r\n server.ws.send({\r\n type: \"full-reload\",\r\n path: \"*\",\r\n });\r\n return [];\r\n }\r\n\r\n return undefined;\r\n },\r\n\r\n config() {\r\n const config: Omit<UserConfig, \"plugins\"> = {\r\n esbuild: {\r\n jsxFactory,\r\n jsxFragment,\r\n jsxInject: `import { ${jsxFactory} } from '@fynixorg/ui'`,\r\n },\r\n optimizeDeps: {\r\n include: [\"@fynixorg/ui\"],\r\n esbuildOptions: {\r\n jsx: \"transform\",\r\n jsxFactory,\r\n jsxFragment,\r\n },\r\n },\r\n resolve: {\r\n extensions: [\".fnx\", \".ts\", \".tsx\", \".js\", \".jsx\", \".json\"],\r\n },\r\n };\r\n\r\n return config;\r\n },\r\n\r\n buildStart() {\r\n console.log(\r\n `${colors.cyan}[vite-plugin-fynix-sfc]${colors.reset} Initialized`\r\n );\r\n if (enableSFC) {\r\n console.log(\r\n `${colors.cyan}[vite-plugin-fynix-sfc]${colors.reset} SFC support: ${colors.green}enabled${colors.reset}`\r\n );\r\n }\r\n if (typeCheck) {\r\n console.log(\r\n `${colors.cyan}[vite-plugin-fynix-sfc]${colors.reset} Type checking: ${colors.green}enabled${colors.reset}`\r\n );\r\n }\r\n },\r\n\r\n buildEnd() {\r\n if (typeChecker) {\r\n typeChecker.clear();\r\n }\r\n },\r\n };\r\n}\r\n\r\nexport { fynixPlugin, TypeScriptChecker };\r\nexport type { FynixPluginOptions };\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["ctx"]
|
|
7
7
|
}
|