@fynixorg/ui 1.0.17 → 1.0.18
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/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite-plugin-res.d.ts","sourceRoot":"","sources":["../../plugins/vite-plugin-res.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAG3D,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AA8IjC,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,gBAAgB,CAAC,CAAC;IAM3C,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,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAgkBD,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;IA0ErC,KAAK,IAAI,IAAI;CAId;AAKD,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,GAAG,
|
|
1
|
+
{"version":3,"file":"vite-plugin-res.d.ts","sourceRoot":"","sources":["../../plugins/vite-plugin-res.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAG3D,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AA8IjC,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,gBAAgB,CAAC,CAAC;IAM3C,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,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAgkBD,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;IA0ErC,KAAK,IAAI,IAAI;CAId;AAKD,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,GAAG,CAwWzE;AAED,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;AAC1C,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -644,13 +644,24 @@ export default function fynixPlugin(options = {}) {
|
|
|
644
644
|
if (normalizedId.endsWith(".fnx")) {
|
|
645
645
|
try {
|
|
646
646
|
const fs = await import("fs");
|
|
647
|
-
const
|
|
647
|
+
const path = await import("path");
|
|
648
|
+
let filePath = normalizedId;
|
|
649
|
+
if (!path.isAbsolute(filePath)) {
|
|
650
|
+
if (filePath.startsWith("/")) {
|
|
651
|
+
filePath = filePath.substring(1);
|
|
652
|
+
}
|
|
653
|
+
filePath = path.resolve(process.cwd(), filePath);
|
|
654
|
+
}
|
|
655
|
+
if (options.debug) {
|
|
656
|
+
console.log(`${colors.gray}[Fynix SFC] Loading file: ${colors.cyan}${filePath}${colors.reset}`);
|
|
657
|
+
}
|
|
658
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
648
659
|
const parsed = parseSFC(content);
|
|
649
|
-
validateSFC(parsed,
|
|
650
|
-
const transformedCode = transformSFC(parsed,
|
|
660
|
+
validateSFC(parsed, filePath);
|
|
661
|
+
const transformedCode = transformSFC(parsed, filePath, safeJsxFactory);
|
|
651
662
|
if (options.showGeneratedCode) {
|
|
652
663
|
console.log(`\n${colors.cyan}${"=".repeat(80)}${colors.reset}`);
|
|
653
|
-
console.log(`${colors.cyan}[Fynix SFC]${colors.reset} Generated code for: ${colors.gray}${
|
|
664
|
+
console.log(`${colors.cyan}[Fynix SFC]${colors.reset} Generated code for: ${colors.gray}${filePath}${colors.reset}`);
|
|
654
665
|
console.log(`${colors.cyan}${"=".repeat(80)}${colors.reset}`);
|
|
655
666
|
console.log(transformedCode);
|
|
656
667
|
console.log(`${colors.cyan}${"=".repeat(80)}${colors.reset}\n`);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../plugins/vite-plugin-res.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\nimport { 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// ---------------------- Security Helpers ----------------------\r\n\r\n/**\r\n * Sanitize JavaScript identifiers to prevent injection\r\n */\r\nfunction sanitizeIdentifier(identifier: string): string {\r\n if (typeof identifier !== \"string\") return \"\";\r\n\r\n // Only allow valid JavaScript identifiers\r\n const sanitized = identifier.replace(/[^a-zA-Z0-9_$]/g, \"\");\r\n\r\n // Ensure it doesn't start with a number\r\n if (/^\\d/.test(sanitized)) {\r\n return \"_\" + sanitized;\r\n }\r\n\r\n // Prevent reserved keywords and dangerous identifiers\r\n const dangerousWords = [\r\n \"eval\",\r\n \"Function\",\r\n \"constructor\",\r\n \"prototype\",\r\n \"__proto__\",\r\n \"window\",\r\n \"global\",\r\n \"process\",\r\n \"require\",\r\n \"import\",\r\n \"export\",\r\n \"document\",\r\n \"location\",\r\n \"alert\",\r\n \"confirm\",\r\n \"prompt\",\r\n ];\r\n\r\n if (dangerousWords.includes(sanitized)) {\r\n return \"safe_\" + sanitized;\r\n }\r\n\r\n return sanitized || \"defaultIdentifier\";\r\n}\r\n\r\n/**\r\n * Escape HTML content to prevent XSS\r\n */\r\nfunction escapeHTML(str: string): string {\r\n if (typeof str !== \"string\") return \"\";\r\n\r\n return str\r\n .replace(/&/g, \"&\")\r\n .replace(/</g, \"<\")\r\n .replace(/>/g, \">\")\r\n .replace(/\"/g, \""\")\r\n .replace(/'/g, \"'\")\r\n .replace(/\\//g, \"/\")\r\n .replace(/`/g, \"`\")\r\n .replace(/=/g, \"=\");\r\n}\r\n\r\n/**\r\n * Sanitize CSS content to prevent injection\r\n */\r\nfunction sanitizeCSS(css: string): string {\r\n if (typeof css !== \"string\") return \"\";\r\n\r\n // Remove dangerous CSS constructs\r\n return css\r\n .replace(/javascript:/gi, \"\")\r\n .replace(/vbscript:/gi, \"\")\r\n .replace(/data:/gi, \"\")\r\n .replace(/expression\\s*\\(/gi, \"\")\r\n .replace(/@import/gi, \"\")\r\n .replace(/url\\s*\\(/gi, \"\")\r\n .replace(/behavior\\s*:/gi, \"\");\r\n}\r\n\r\n/**\r\n * Validate and sanitize file paths\r\n */\r\nfunction sanitizePath(path: string): string {\r\n if (typeof path !== \"string\") return \"\";\r\n\r\n // Remove dangerous path components\r\n return path\r\n .replace(/\\.\\./g, \"\") // Remove parent directory references\r\n .replace(/~/g, \"\") // Remove home directory references\r\n .replace(/\\\\+/g, \"/\") // Normalize slashes\r\n .replace(/\\/+/g, \"/\") // Remove duplicate slashes\r\n .replace(/^\\//g, \"\") // Remove leading slash\r\n .replace(/\\/$/, \"\"); // Remove trailing slash\r\n}\r\n\r\n/**\r\n * Validate template literal content for safety\r\n */\r\nfunction validateTemplateContent(content: string): string {\r\n if (typeof content !== \"string\") return \"\";\r\n\r\n // Only check for the most dangerous patterns in SFC files\r\n // Skip this validation for regular .ts/.js files\r\n const dangerousPatterns = [\r\n /eval\\s*\\(/gi, // eval calls\r\n /Function\\s*\\(/gi, // Function constructor\r\n /<script[^>]*>.*?<\\/script>/gis, // Script tags with content\r\n /javascript:\\s*[^\"'\\s]/gi, // JavaScript protocol (not in quotes)\r\n /vbscript:\\s*[^\"'\\s]/gi, // VBScript protocol (not in quotes)\r\n /data:\\s*text\\/html/gi, // Data URLs with HTML\r\n ];\r\n\r\n for (const pattern of dangerousPatterns) {\r\n if (pattern.test(content)) {\r\n console.warn(\r\n `[Security] Blocked dangerous pattern in template: ${pattern}`\r\n );\r\n return \"\";\r\n }\r\n }\r\n\r\n return content;\r\n}\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) - Secured version\r\n */\r\nfunction parseSFC(source: string): SFCParsedResult {\r\n // Validate input\r\n if (typeof source !== \"string\" || source.length > 1000000) {\r\n // 1MB limit\r\n throw new Error(\"Invalid or excessively large SFC source\");\r\n }\r\n\r\n // Check for dangerous content before processing\r\n const sanitizedSource = validateTemplateContent(source);\r\n if (!sanitizedSource) {\r\n throw new Error(\"SFC contains potentially dangerous content\");\r\n }\r\n\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 - with validation\r\n const logicMatch = sanitizedSource.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 // Validate logic content\r\n if (rawLogic.length > 100000) {\r\n // 100KB limit for logic\r\n throw new Error(\"Logic block exceeds size limit\");\r\n }\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\r\n // Security: Validate each line\r\n if (validateTemplateContent(line) === \"\") {\r\n console.warn(\r\n `[Security] Skipped potentially dangerous line in logic block`\r\n );\r\n continue;\r\n }\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 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 // 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 (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 - with validation\r\n const viewMatch = sanitizedSource.match(/<view\\s*>([\\s\\S]*?)<\\/view>/i);\r\n if (viewMatch && viewMatch[1] !== undefined) {\r\n const viewContent = viewMatch[1].trim();\r\n\r\n // Validate view content size\r\n if (viewContent.length > 50000) {\r\n // 50KB limit for view\r\n throw new Error(\"View block exceeds size limit\");\r\n }\r\n\r\n result.hasView = true;\r\n result.view = viewContent;\r\n }\r\n\r\n // Parse <style> block with optional scoped attribute - with validation\r\n const styleMatch = sanitizedSource.match(\r\n /<style(\\s+scoped)?\\s*>([\\s\\S]*?)<\\/style>/i\r\n );\r\n if (styleMatch && styleMatch[2] !== undefined) {\r\n const styleContent = styleMatch[2].trim();\r\n\r\n // Validate and sanitize style content\r\n if (styleContent.length > 100000) {\r\n // 100KB limit for styles\r\n throw new Error(\"Style block exceeds size limit\");\r\n }\r\n\r\n result.hasStyle = true;\r\n result.isStyleScoped = !!styleMatch[1];\r\n result.style = sanitizeCSS(styleContent);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Generate a secure style ID for scoped styles\r\n */\r\nfunction generateStyleId(filePath: string): string {\r\n // Sanitize the file path first\r\n const safePath = sanitizePath(filePath);\r\n\r\n // Use a more secure hash function if crypto is available\r\n if (typeof crypto !== \"undefined\" && crypto.subtle) {\r\n // For build-time, we'll use a deterministic but secure approach\r\n const encoder = new TextEncoder();\r\n const data = encoder.encode(safePath + Date.now());\r\n // Use the encoded data for additional entropy in the hash\r\n let dataHash = 0;\r\n for (let i = 0; i < data.length; i++) {\r\n const byte = data[i];\r\n if (byte !== undefined) {\r\n dataHash = (dataHash << 5) - dataHash + byte;\r\n dataHash = dataHash & dataHash;\r\n }\r\n }\r\n // Incorporate data hash into the main hash\r\n const combinedInput = safePath + \"_security_salt_\" + dataHash;\r\n let hash = 0;\r\n for (let i = 0; i < combinedInput.length; i++) {\r\n const char = combinedInput.charCodeAt(i);\r\n hash = (hash << 5) - hash + char;\r\n hash = hash & hash;\r\n }\r\n const timestamp = Date.now().toString(36);\r\n const hashStr = Math.abs(hash).toString(36);\r\n return sanitizeIdentifier(`fynix-${hashStr}-${timestamp}`);\r\n }\r\n\r\n let hash = 0;\r\n const input = safePath + \"_security_salt\";\r\n\r\n for (let i = 0; i < input.length; i++) {\r\n const char = input.charCodeAt(i);\r\n hash = (hash << 5) - hash + char;\r\n hash = hash & hash; // Convert to 32-bit integer\r\n }\r\n\r\n // Add timestamp to prevent collisions\r\n const timestamp = Date.now().toString(36);\r\n const hashStr = Math.abs(hash).toString(36);\r\n\r\n return sanitizeIdentifier(`fynix-${hashStr}-${timestamp}`);\r\n}\r\n\r\n/**\r\n * Scope CSS styles by adding data attribute selector\r\n * Fixed to properly handle keyframes with scoped styles\r\n */\r\nfunction scopeStyles(css: string, scopeId: string): string {\r\n const dataAttr = `[data-${scopeId}]`;\r\n const keyframeMap = new Map<string, string>();\r\n const keyframes: string[] = [];\r\n\r\n // 1. Extract & rename @keyframes (store safely)\r\n css = css.replace(\r\n /@keyframes\\s+([a-zA-Z0-9_-]+)\\s*\\{[\\s\\S]*?\\}/g,\r\n (block, name) => {\r\n const scopedName = `${name}-${scopeId}`;\r\n keyframeMap.set(name, scopedName);\r\n const renamed = block.replace(\r\n new RegExp(`@keyframes\\\\s+${name}`),\r\n `@keyframes ${scopedName}`\r\n );\r\n const index = keyframes.push(renamed) - 1;\r\n return `__KEYFRAMES_${index}__`;\r\n }\r\n );\r\n\r\n // 2. Rewrite animation references\r\n keyframeMap.forEach((scoped, original) => {\r\n const re = new RegExp(\r\n `(animation(?:-name)?\\\\s*:[^;]*?)\\\\b${original}\\\\b`,\r\n \"g\"\r\n );\r\n css = css.replace(re, `$1${scoped}`);\r\n });\r\n\r\n // 3. Scope normal selectors\r\n // Find the root class from the first element in the view (e.g., r-class=\"page\")\r\n let rootClass = null;\r\n try {\r\n const viewMatch = css.match(/\\.(\\w+)[^{]*\\{/);\r\n if (viewMatch) {\r\n rootClass = viewMatch[1];\r\n }\r\n } catch {}\r\n\r\n css = css.replace(/([^{}]+)\\{([^{}]*)\\}/g, (match, selector, rules) => {\r\n if (selector.trim().startsWith(\"@\")) return match;\r\n\r\n const scopedSelectors = selector\r\n .split(\",\")\r\n .map((s: string) => {\r\n const sel = s.trim();\r\n // If selector is exactly the root class (with optional pseudo-classes), rewrite as [data-xxx][pseudo]\r\n if (rootClass) {\r\n const rootRe = new RegExp(\r\n `^\\\\.${rootClass}((:[\\\\w-]+)*|(::[\\\\w-]+)*)?$`\r\n );\r\n const pseudo = sel.replace(new RegExp(`^\\\\.${rootClass}`), \"\");\r\n if (rootRe.test(sel)) {\r\n return `${dataAttr}${pseudo}`;\r\n }\r\n }\r\n // Otherwise, prepend data attribute as ancestor\r\n return `${dataAttr} ${sel}`;\r\n })\r\n .join(\", \");\r\n return `${scopedSelectors}{${rules}}`;\r\n });\r\n\r\n // 4. Restore keyframes\r\n keyframes.forEach((kf, i) => {\r\n css = css.replace(`__KEYFRAMES_${i}__`, kf);\r\n });\r\n\r\n return css;\r\n}\r\n\r\n/**\r\n * Transform SFC to component code - Secured version\r\n */\r\nfunction transformSFC(\r\n parsed: SFCParsedResult,\r\n filePath: string,\r\n jsxFactory: string\r\n): string {\r\n // Validate inputs\r\n if (!parsed || typeof parsed !== \"object\") {\r\n throw new Error(\"Invalid parsed SFC result\");\r\n }\r\n\r\n const safeFilePath = sanitizePath(filePath);\r\n const safeJsxFactory = sanitizeIdentifier(jsxFactory);\r\n\r\n if (!safeJsxFactory) {\r\n throw new Error(\"Invalid JSX factory name\");\r\n }\r\n\r\n const styleId = generateStyleId(safeFilePath);\r\n const lines: string[] = [];\r\n\r\n // Secure import statement\r\n lines.push(`import { ${safeJsxFactory} } from '@fynixorg/ui';`);\r\n\r\n if (parsed.imports.length > 0) {\r\n // Validate and sanitize each import\r\n parsed.imports.forEach((importLine) => {\r\n const validatedImport = validateTemplateContent(importLine);\r\n if (validatedImport) {\r\n lines.push(validatedImport);\r\n }\r\n });\r\n }\r\n\r\n lines.push(\"\");\r\n\r\n if (parsed.hasStyle) {\r\n let processedStyle = sanitizeCSS(parsed.style);\r\n\r\n if (parsed.isStyleScoped) {\r\n processedStyle = scopeStyles(processedStyle, styleId);\r\n }\r\n\r\n // Secure style injection - use JSON.stringify to prevent injection\r\n lines.push(`// Inject styles`);\r\n lines.push(`if (typeof document !== 'undefined') {`);\r\n lines.push(` const styleId = ${JSON.stringify(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 // Add exports BEFORE component (module-level) - with validation\r\n if (parsed.exports.length > 0) {\r\n parsed.exports.forEach((exportLine) => {\r\n const validatedExport = validateTemplateContent(exportLine);\r\n if (validatedExport) {\r\n lines.push(validatedExport);\r\n }\r\n });\r\n lines.push(\"\");\r\n }\r\n\r\n // Use type-safe props if Props interface is declared\r\n let propsType = \"any\";\r\n const propsInterfaceRegex = /interface\\s+Props\\s*{[\\s\\S]*?}/m;\r\n if (propsInterfaceRegex.test(parsed.logic)) {\r\n propsType = \"Props\";\r\n }\r\n\r\n lines.push(`function FynixComponent(props: ${propsType} = {}) {`);\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 const validatedLine = validateTemplateContent(line);\r\n if (validatedLine && validatedLine.trim()) {\r\n lines.push(` ${validatedLine}`);\r\n }\r\n });\r\n lines.push(\"\");\r\n }\r\n\r\n // Secure meta tag injection with proper escaping\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(` if (meta.title) {`);\r\n lines.push(` // Import the escapeHTML function for secure processing`);\r\n lines.push(` const escapeHTML = ${escapeHTML.toString()};`);\r\n lines.push(\r\n ` const safeTitle = escapeHTML(String(meta.title)).substring(0, 60);`\r\n );\r\n lines.push(` document.title = safeTitle;`);\r\n lines.push(` }`);\r\n lines.push(` const _meta = meta as any;`);\r\n lines.push(` const escapeHTML = ${escapeHTML.toString()};`); // Make function available\r\n lines.push(` const metaTags = [`);\r\n lines.push(\r\n ` _meta.description ? { name: \"description\", content: escapeHTML(String(_meta.description || '')).substring(0, 300) } : null,`\r\n );\r\n lines.push(\r\n ` _meta.keywords ? { name: \"keywords\", content: escapeHTML(String(_meta.keywords || '')).substring(0, 200) } : null,`\r\n );\r\n lines.push(\r\n ` _meta.ogTitle ? { property: \"og:title\", content: escapeHTML(String(_meta.ogTitle || '')).substring(0, 60) } : null,`\r\n );\r\n lines.push(\r\n ` _meta.ogDescription ? { property: \"og:description\", content: escapeHTML(String(_meta.ogDescription || '')).substring(0, 300) } : null,`\r\n );\r\n lines.push(\r\n ` _meta.ogImage ? { property: \"og:image\", content: escapeHTML(String(_meta.ogImage || '')).substring(0, 500) } : null,`\r\n );\r\n lines.push(` ].filter(Boolean);`);\r\n lines.push(` metaTags.forEach((tagObj) => {`);\r\n lines.push(` if (!tagObj) return;`);\r\n lines.push(` const { name, property, content } = tagObj;`);\r\n lines.push(` if (!content || typeof content !== 'string') return;`);\r\n lines.push(` let tag;`);\r\n lines.push(` if (name) {`);\r\n lines.push(` const safeName = name.replace(/[^a-zA-Z0-9-_]/g, '');`);\r\n lines.push(` if (!safeName) return;`);\r\n lines.push(\r\n \" tag = document.querySelector(`meta[name='${safeName}']`);\"\r\n );\r\n lines.push(` if (!tag) {`);\r\n lines.push(` tag = document.createElement(\"meta\");`);\r\n lines.push(` tag.setAttribute(\"name\", safeName);`);\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 ` const safeProperty = property.replace(/[^a-zA-Z0-9-_:]/g, '');`\r\n );\r\n lines.push(` if (!safeProperty) return;`);\r\n lines.push(\r\n \" tag = document.querySelector(`meta[property='${safeProperty}']`);\"\r\n );\r\n lines.push(` if (!tag) {`);\r\n lines.push(` tag = document.createElement(\"meta\");`);\r\n lines.push(` tag.setAttribute(\"property\", safeProperty);`);\r\n lines.push(` document.head.appendChild(tag);`);\r\n lines.push(` }`);\r\n lines.push(` }`);\r\n lines.push(` if (tag) {`);\r\n lines.push(\r\n ` // Escape content to prevent XSS using escapeHTML function`\r\n );\r\n lines.push(` tag.setAttribute(\"content\", content);`);\r\n lines.push(` }`);\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 // Add data attribute to root element - with validation\r\n let viewContent = validateTemplateContent(parsed.view.trim());\r\n\r\n if (!viewContent) {\r\n throw new Error(\"View content contains dangerous patterns\");\r\n }\r\n\r\n const showGeneratedCode =\r\n typeof globalThis !== \"undefined\" &&\r\n (globalThis as any).fynixShowGeneratedCode !== undefined\r\n ? (globalThis as any).fynixShowGeneratedCode\r\n : false;\r\n\r\n if (showGeneratedCode) {\r\n console.log(\r\n `${colors.magenta}[DEBUG] Original view content:${colors.reset}`\r\n );\r\n console.log(viewContent.substring(0, 200));\r\n }\r\n\r\n const tagMatch = viewContent.match(/^(<\\w+)((?:\\s+[^>]*?)?)(\\s*>)/s);\r\n\r\n if (tagMatch) {\r\n const openTag = tagMatch[1];\r\n const attributes = tagMatch[2];\r\n const closingBracket = tagMatch[3];\r\n\r\n if (showGeneratedCode) {\r\n console.log(\r\n `${colors.magenta}[DEBUG] Matched tag:${colors.reset} ${openTag}`\r\n );\r\n }\r\n\r\n // Secure data attribute insertion\r\n const safeDataAttr = sanitizeIdentifier(`data-${styleId}`);\r\n const modifiedStart = `${openTag}${attributes} ${safeDataAttr}=\"\"${closingBracket}`;\r\n const restOfView = viewContent.substring(tagMatch[0].length);\r\n const modifiedView = modifiedStart + restOfView;\r\n\r\n lines.push(` return (`);\r\n const viewLines = modifiedView.split(\"\\n\");\r\n viewLines.forEach((line: string) => {\r\n lines.push(` ${line}`);\r\n });\r\n lines.push(` );`);\r\n } else {\r\n // Fallback: wrap in div if we can't parse\r\n lines.push(` return (`);\r\n lines.push(` <div ${sanitizeIdentifier(`data-${styleId}`)}=\"\">`);\r\n const viewLines = viewContent.split(\"\\n\");\r\n viewLines.forEach((line: string) => {\r\n lines.push(` ${line}`);\r\n });\r\n lines.push(` </div>`);\r\n lines.push(` );`);\r\n }\r\n } else {\r\n const validatedView = validateTemplateContent(parsed.view);\r\n if (!validatedView) {\r\n throw new Error(\"View content contains dangerous patterns\");\r\n }\r\n\r\n lines.push(` return (`);\r\n const viewLines = validatedView.split(\"\\n\");\r\n viewLines.forEach((line: string) => {\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 // 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 * 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: true, // Changed to true for better type checking\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: true, // Changed to true\r\n strictFunctionTypes: true, // Changed to true\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 // Only skip module resolution errors, NOT type errors\r\n // This allows proper type checking (2322 = type mismatch, 2345 = argument type error, etc.)\r\n const skipCodes = new Set([\r\n 2307, // Cannot find module\r\n 2792, // Cannot find module (alternative)\r\n 7016, // Could not find declaration file\r\n 7026, // JSX element implicitly has type 'any'\r\n ]);\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 // Security: Sanitize JSX factory names\r\n const safeJsxFactory = sanitizeIdentifier(jsxFactory);\r\n const safeJsxFragment = sanitizeIdentifier(jsxFragment);\r\n\r\n if (!safeJsxFactory || !safeJsxFragment) {\r\n throw new Error(\"Invalid JSX factory or fragment names provided\");\r\n }\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 // Add resolveId to handle .fnx imports properly\r\n resolveId(id: string, importer?: string) {\r\n // Handle .fnx files explicitly to ensure proper module resolution\r\n if (id.endsWith(\".fnx\")) {\r\n // Log import context for debugging if needed\r\n if (options.debug && importer) {\r\n console.log(\r\n `${colors.gray}[Fynix SFC] Resolving ${colors.cyan}${id}${colors.reset} ${colors.gray}imported from ${colors.cyan}${importer}${colors.reset}`\r\n );\r\n }\r\n // Return the resolved ID to indicate this plugin handles .fnx files\r\n return id;\r\n }\r\n return null;\r\n },\r\n\r\n async load(id: string) {\r\n const normalizedId = normalizePath(id);\r\n\r\n if (normalizedId.endsWith(\".fnx\")) {\r\n try {\r\n // Read the .fnx file content\r\n const fs = await import(\"fs\");\r\n const content = fs.readFileSync(normalizedId, \"utf-8\");\r\n\r\n // Parse and transform the SFC immediately in the load hook\r\n // This prevents Vite's import analysis from seeing the raw .fnx content\r\n const parsed = parseSFC(content);\r\n validateSFC(parsed, normalizedId);\r\n const transformedCode = transformSFC(\r\n parsed,\r\n normalizedId,\r\n safeJsxFactory\r\n );\r\n\r\n if (options.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(transformedCode);\r\n console.log(`${colors.cyan}${\"=\".repeat(80)}${colors.reset}\\n`);\r\n }\r\n\r\n // Return the transformed JavaScript code\r\n return transformedCode;\r\n } catch (error) {\r\n console.error(\r\n `${colors.red}[Fynix SFC] Failed to load ${normalizedId}:${colors.reset}`,\r\n error\r\n );\r\n throw error;\r\n }\r\n }\r\n return null;\r\n },\r\n\r\n async transform(code: string, id: string) {\r\n const normalizedId = normalizePath(id);\r\n\r\n // Skip .fnx files as they're already transformed in the load hook\r\n if (normalizedId.endsWith(\".fnx\")) {\r\n return null;\r\n }\r\n\r\n // Security: Validate file path (skip for legitimate files)\r\n const safePath = sanitizePath(normalizedId);\r\n\r\n // Allow .fnx files and other legitimate extensions, block only truly dangerous paths\r\n if (\r\n !safePath ||\r\n (normalizedId.includes(\"..\") && !normalizedId.includes(\"node_modules\"))\r\n ) {\r\n console.warn(\r\n `[Security] Potentially dangerous file path blocked: ${normalizedId}`\r\n );\r\n return null;\r\n }\r\n\r\n // Security: Check file size limit (10MB)\r\n if (code.length > 10485760) {\r\n throw new Error(`File ${normalizedId} exceeds maximum size limit`);\r\n }\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 // Only apply strict security validation to .fnx files\r\n // Regular .ts/.js files should be processed normally\r\n if (normalizedId.endsWith(\".fnx\")) {\r\n const validatedCode = validateTemplateContent(code);\r\n if (!validatedCode) {\r\n throw new Error(\r\n `SFC file contains potentially dangerous content: ${normalizedId}`\r\n );\r\n }\r\n codeToTransform = validatedCode;\r\n } else {\r\n codeToTransform = code;\r\n }\r\n\r\n if (normalizedId.endsWith(\".fnx\") && enableSFC) {\r\n const parsed = parseSFC(codeToTransform);\r\n validateSFC(parsed, normalizedId);\r\n\r\n codeToTransform = transformSFC(parsed, normalizedId, safeJsxFactory);\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\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 // Final security validation before esbuild transform\r\n if (codeToTransform.length > 5242880) {\r\n // 5MB limit for transformed code\r\n throw new Error(\r\n `Transformed code exceeds size limit for ${normalizedId}`\r\n );\r\n }\r\n\r\n const result = await transform(codeToTransform, {\r\n loader,\r\n jsxFactory: safeJsxFactory,\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(config: UserConfig) {\r\n // Configure Vite to recognize .fnx files as modules\r\n config.optimizeDeps = config.optimizeDeps || {};\r\n config.optimizeDeps.extensions = config.optimizeDeps.extensions || [];\r\n if (!config.optimizeDeps.extensions.includes(\".fnx\")) {\r\n config.optimizeDeps.extensions.push(\".fnx\");\r\n }\r\n\r\n // Return additional configuration\r\n const additionalConfig: Omit<UserConfig, \"plugins\"> = {\r\n esbuild: {\r\n jsxFactory: safeJsxFactory,\r\n jsxFragment: safeJsxFragment,\r\n jsxInject: `import { ${safeJsxFactory} } from '@fynixorg/ui'`,\r\n },\r\n optimizeDeps: {\r\n include: [\"@fynixorg/ui\"],\r\n esbuildOptions: {\r\n jsx: \"transform\",\r\n jsxFactory: safeJsxFactory,\r\n jsxFragment: safeJsxFragment,\r\n },\r\n ...config.optimizeDeps,\r\n },\r\n resolve: {\r\n extensions: [\".fnx\", \".ts\", \".tsx\", \".js\", \".jsx\", \".json\"],\r\n },\r\n };\r\n\r\n return additionalConfig;\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"],
|
|
5
|
-
"mappings": "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",
|
|
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\nimport { 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// ---------------------- Security Helpers ----------------------\r\n\r\n/**\r\n * Sanitize JavaScript identifiers to prevent injection\r\n */\r\nfunction sanitizeIdentifier(identifier: string): string {\r\n if (typeof identifier !== \"string\") return \"\";\r\n\r\n // Only allow valid JavaScript identifiers\r\n const sanitized = identifier.replace(/[^a-zA-Z0-9_$]/g, \"\");\r\n\r\n // Ensure it doesn't start with a number\r\n if (/^\\d/.test(sanitized)) {\r\n return \"_\" + sanitized;\r\n }\r\n\r\n // Prevent reserved keywords and dangerous identifiers\r\n const dangerousWords = [\r\n \"eval\",\r\n \"Function\",\r\n \"constructor\",\r\n \"prototype\",\r\n \"__proto__\",\r\n \"window\",\r\n \"global\",\r\n \"process\",\r\n \"require\",\r\n \"import\",\r\n \"export\",\r\n \"document\",\r\n \"location\",\r\n \"alert\",\r\n \"confirm\",\r\n \"prompt\",\r\n ];\r\n\r\n if (dangerousWords.includes(sanitized)) {\r\n return \"safe_\" + sanitized;\r\n }\r\n\r\n return sanitized || \"defaultIdentifier\";\r\n}\r\n\r\n/**\r\n * Escape HTML content to prevent XSS\r\n */\r\nfunction escapeHTML(str: string): string {\r\n if (typeof str !== \"string\") return \"\";\r\n\r\n return str\r\n .replace(/&/g, \"&\")\r\n .replace(/</g, \"<\")\r\n .replace(/>/g, \">\")\r\n .replace(/\"/g, \""\")\r\n .replace(/'/g, \"'\")\r\n .replace(/\\//g, \"/\")\r\n .replace(/`/g, \"`\")\r\n .replace(/=/g, \"=\");\r\n}\r\n\r\n/**\r\n * Sanitize CSS content to prevent injection\r\n */\r\nfunction sanitizeCSS(css: string): string {\r\n if (typeof css !== \"string\") return \"\";\r\n\r\n // Remove dangerous CSS constructs\r\n return css\r\n .replace(/javascript:/gi, \"\")\r\n .replace(/vbscript:/gi, \"\")\r\n .replace(/data:/gi, \"\")\r\n .replace(/expression\\s*\\(/gi, \"\")\r\n .replace(/@import/gi, \"\")\r\n .replace(/url\\s*\\(/gi, \"\")\r\n .replace(/behavior\\s*:/gi, \"\");\r\n}\r\n\r\n/**\r\n * Validate and sanitize file paths\r\n */\r\nfunction sanitizePath(path: string): string {\r\n if (typeof path !== \"string\") return \"\";\r\n\r\n // Remove dangerous path components\r\n return path\r\n .replace(/\\.\\./g, \"\") // Remove parent directory references\r\n .replace(/~/g, \"\") // Remove home directory references\r\n .replace(/\\\\+/g, \"/\") // Normalize slashes\r\n .replace(/\\/+/g, \"/\") // Remove duplicate slashes\r\n .replace(/^\\//g, \"\") // Remove leading slash\r\n .replace(/\\/$/, \"\"); // Remove trailing slash\r\n}\r\n\r\n/**\r\n * Validate template literal content for safety\r\n */\r\nfunction validateTemplateContent(content: string): string {\r\n if (typeof content !== \"string\") return \"\";\r\n\r\n // Only check for the most dangerous patterns in SFC files\r\n // Skip this validation for regular .ts/.js files\r\n const dangerousPatterns = [\r\n /eval\\s*\\(/gi, // eval calls\r\n /Function\\s*\\(/gi, // Function constructor\r\n /<script[^>]*>.*?<\\/script>/gis, // Script tags with content\r\n /javascript:\\s*[^\"'\\s]/gi, // JavaScript protocol (not in quotes)\r\n /vbscript:\\s*[^\"'\\s]/gi, // VBScript protocol (not in quotes)\r\n /data:\\s*text\\/html/gi, // Data URLs with HTML\r\n ];\r\n\r\n for (const pattern of dangerousPatterns) {\r\n if (pattern.test(content)) {\r\n console.warn(\r\n `[Security] Blocked dangerous pattern in template: ${pattern}`\r\n );\r\n return \"\";\r\n }\r\n }\r\n\r\n return content;\r\n}\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) - Secured version\r\n */\r\nfunction parseSFC(source: string): SFCParsedResult {\r\n // Validate input\r\n if (typeof source !== \"string\" || source.length > 1000000) {\r\n // 1MB limit\r\n throw new Error(\"Invalid or excessively large SFC source\");\r\n }\r\n\r\n // Check for dangerous content before processing\r\n const sanitizedSource = validateTemplateContent(source);\r\n if (!sanitizedSource) {\r\n throw new Error(\"SFC contains potentially dangerous content\");\r\n }\r\n\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 - with validation\r\n const logicMatch = sanitizedSource.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 // Validate logic content\r\n if (rawLogic.length > 100000) {\r\n // 100KB limit for logic\r\n throw new Error(\"Logic block exceeds size limit\");\r\n }\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\r\n // Security: Validate each line\r\n if (validateTemplateContent(line) === \"\") {\r\n console.warn(\r\n `[Security] Skipped potentially dangerous line in logic block`\r\n );\r\n continue;\r\n }\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 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 // 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 (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 - with validation\r\n const viewMatch = sanitizedSource.match(/<view\\s*>([\\s\\S]*?)<\\/view>/i);\r\n if (viewMatch && viewMatch[1] !== undefined) {\r\n const viewContent = viewMatch[1].trim();\r\n\r\n // Validate view content size\r\n if (viewContent.length > 50000) {\r\n // 50KB limit for view\r\n throw new Error(\"View block exceeds size limit\");\r\n }\r\n\r\n result.hasView = true;\r\n result.view = viewContent;\r\n }\r\n\r\n // Parse <style> block with optional scoped attribute - with validation\r\n const styleMatch = sanitizedSource.match(\r\n /<style(\\s+scoped)?\\s*>([\\s\\S]*?)<\\/style>/i\r\n );\r\n if (styleMatch && styleMatch[2] !== undefined) {\r\n const styleContent = styleMatch[2].trim();\r\n\r\n // Validate and sanitize style content\r\n if (styleContent.length > 100000) {\r\n // 100KB limit for styles\r\n throw new Error(\"Style block exceeds size limit\");\r\n }\r\n\r\n result.hasStyle = true;\r\n result.isStyleScoped = !!styleMatch[1];\r\n result.style = sanitizeCSS(styleContent);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Generate a secure style ID for scoped styles\r\n */\r\nfunction generateStyleId(filePath: string): string {\r\n // Sanitize the file path first\r\n const safePath = sanitizePath(filePath);\r\n\r\n // Use a more secure hash function if crypto is available\r\n if (typeof crypto !== \"undefined\" && crypto.subtle) {\r\n // For build-time, we'll use a deterministic but secure approach\r\n const encoder = new TextEncoder();\r\n const data = encoder.encode(safePath + Date.now());\r\n // Use the encoded data for additional entropy in the hash\r\n let dataHash = 0;\r\n for (let i = 0; i < data.length; i++) {\r\n const byte = data[i];\r\n if (byte !== undefined) {\r\n dataHash = (dataHash << 5) - dataHash + byte;\r\n dataHash = dataHash & dataHash;\r\n }\r\n }\r\n // Incorporate data hash into the main hash\r\n const combinedInput = safePath + \"_security_salt_\" + dataHash;\r\n let hash = 0;\r\n for (let i = 0; i < combinedInput.length; i++) {\r\n const char = combinedInput.charCodeAt(i);\r\n hash = (hash << 5) - hash + char;\r\n hash = hash & hash;\r\n }\r\n const timestamp = Date.now().toString(36);\r\n const hashStr = Math.abs(hash).toString(36);\r\n return sanitizeIdentifier(`fynix-${hashStr}-${timestamp}`);\r\n }\r\n\r\n let hash = 0;\r\n const input = safePath + \"_security_salt\";\r\n\r\n for (let i = 0; i < input.length; i++) {\r\n const char = input.charCodeAt(i);\r\n hash = (hash << 5) - hash + char;\r\n hash = hash & hash; // Convert to 32-bit integer\r\n }\r\n\r\n // Add timestamp to prevent collisions\r\n const timestamp = Date.now().toString(36);\r\n const hashStr = Math.abs(hash).toString(36);\r\n\r\n return sanitizeIdentifier(`fynix-${hashStr}-${timestamp}`);\r\n}\r\n\r\n/**\r\n * Scope CSS styles by adding data attribute selector\r\n * Fixed to properly handle keyframes with scoped styles\r\n */\r\nfunction scopeStyles(css: string, scopeId: string): string {\r\n const dataAttr = `[data-${scopeId}]`;\r\n const keyframeMap = new Map<string, string>();\r\n const keyframes: string[] = [];\r\n\r\n // 1. Extract & rename @keyframes (store safely)\r\n css = css.replace(\r\n /@keyframes\\s+([a-zA-Z0-9_-]+)\\s*\\{[\\s\\S]*?\\}/g,\r\n (block, name) => {\r\n const scopedName = `${name}-${scopeId}`;\r\n keyframeMap.set(name, scopedName);\r\n const renamed = block.replace(\r\n new RegExp(`@keyframes\\\\s+${name}`),\r\n `@keyframes ${scopedName}`\r\n );\r\n const index = keyframes.push(renamed) - 1;\r\n return `__KEYFRAMES_${index}__`;\r\n }\r\n );\r\n\r\n // 2. Rewrite animation references\r\n keyframeMap.forEach((scoped, original) => {\r\n const re = new RegExp(\r\n `(animation(?:-name)?\\\\s*:[^;]*?)\\\\b${original}\\\\b`,\r\n \"g\"\r\n );\r\n css = css.replace(re, `$1${scoped}`);\r\n });\r\n\r\n // 3. Scope normal selectors\r\n // Find the root class from the first element in the view (e.g., r-class=\"page\")\r\n let rootClass = null;\r\n try {\r\n const viewMatch = css.match(/\\.(\\w+)[^{]*\\{/);\r\n if (viewMatch) {\r\n rootClass = viewMatch[1];\r\n }\r\n } catch {}\r\n\r\n css = css.replace(/([^{}]+)\\{([^{}]*)\\}/g, (match, selector, rules) => {\r\n if (selector.trim().startsWith(\"@\")) return match;\r\n\r\n const scopedSelectors = selector\r\n .split(\",\")\r\n .map((s: string) => {\r\n const sel = s.trim();\r\n // If selector is exactly the root class (with optional pseudo-classes), rewrite as [data-xxx][pseudo]\r\n if (rootClass) {\r\n const rootRe = new RegExp(\r\n `^\\\\.${rootClass}((:[\\\\w-]+)*|(::[\\\\w-]+)*)?$`\r\n );\r\n const pseudo = sel.replace(new RegExp(`^\\\\.${rootClass}`), \"\");\r\n if (rootRe.test(sel)) {\r\n return `${dataAttr}${pseudo}`;\r\n }\r\n }\r\n // Otherwise, prepend data attribute as ancestor\r\n return `${dataAttr} ${sel}`;\r\n })\r\n .join(\", \");\r\n return `${scopedSelectors}{${rules}}`;\r\n });\r\n\r\n // 4. Restore keyframes\r\n keyframes.forEach((kf, i) => {\r\n css = css.replace(`__KEYFRAMES_${i}__`, kf);\r\n });\r\n\r\n return css;\r\n}\r\n\r\n/**\r\n * Transform SFC to component code - Secured version\r\n */\r\nfunction transformSFC(\r\n parsed: SFCParsedResult,\r\n filePath: string,\r\n jsxFactory: string\r\n): string {\r\n // Validate inputs\r\n if (!parsed || typeof parsed !== \"object\") {\r\n throw new Error(\"Invalid parsed SFC result\");\r\n }\r\n\r\n const safeFilePath = sanitizePath(filePath);\r\n const safeJsxFactory = sanitizeIdentifier(jsxFactory);\r\n\r\n if (!safeJsxFactory) {\r\n throw new Error(\"Invalid JSX factory name\");\r\n }\r\n\r\n const styleId = generateStyleId(safeFilePath);\r\n const lines: string[] = [];\r\n\r\n // Secure import statement\r\n lines.push(`import { ${safeJsxFactory} } from '@fynixorg/ui';`);\r\n\r\n if (parsed.imports.length > 0) {\r\n // Validate and sanitize each import\r\n parsed.imports.forEach((importLine) => {\r\n const validatedImport = validateTemplateContent(importLine);\r\n if (validatedImport) {\r\n lines.push(validatedImport);\r\n }\r\n });\r\n }\r\n\r\n lines.push(\"\");\r\n\r\n if (parsed.hasStyle) {\r\n let processedStyle = sanitizeCSS(parsed.style);\r\n\r\n if (parsed.isStyleScoped) {\r\n processedStyle = scopeStyles(processedStyle, styleId);\r\n }\r\n\r\n // Secure style injection - use JSON.stringify to prevent injection\r\n lines.push(`// Inject styles`);\r\n lines.push(`if (typeof document !== 'undefined') {`);\r\n lines.push(` const styleId = ${JSON.stringify(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 // Add exports BEFORE component (module-level) - with validation\r\n if (parsed.exports.length > 0) {\r\n parsed.exports.forEach((exportLine) => {\r\n const validatedExport = validateTemplateContent(exportLine);\r\n if (validatedExport) {\r\n lines.push(validatedExport);\r\n }\r\n });\r\n lines.push(\"\");\r\n }\r\n\r\n // Use type-safe props if Props interface is declared\r\n let propsType = \"any\";\r\n const propsInterfaceRegex = /interface\\s+Props\\s*{[\\s\\S]*?}/m;\r\n if (propsInterfaceRegex.test(parsed.logic)) {\r\n propsType = \"Props\";\r\n }\r\n\r\n lines.push(`function FynixComponent(props: ${propsType} = {}) {`);\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 const validatedLine = validateTemplateContent(line);\r\n if (validatedLine && validatedLine.trim()) {\r\n lines.push(` ${validatedLine}`);\r\n }\r\n });\r\n lines.push(\"\");\r\n }\r\n\r\n // Secure meta tag injection with proper escaping\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(` if (meta.title) {`);\r\n lines.push(` // Import the escapeHTML function for secure processing`);\r\n lines.push(` const escapeHTML = ${escapeHTML.toString()};`);\r\n lines.push(\r\n ` const safeTitle = escapeHTML(String(meta.title)).substring(0, 60);`\r\n );\r\n lines.push(` document.title = safeTitle;`);\r\n lines.push(` }`);\r\n lines.push(` const _meta = meta as any;`);\r\n lines.push(` const escapeHTML = ${escapeHTML.toString()};`); // Make function available\r\n lines.push(` const metaTags = [`);\r\n lines.push(\r\n ` _meta.description ? { name: \"description\", content: escapeHTML(String(_meta.description || '')).substring(0, 300) } : null,`\r\n );\r\n lines.push(\r\n ` _meta.keywords ? { name: \"keywords\", content: escapeHTML(String(_meta.keywords || '')).substring(0, 200) } : null,`\r\n );\r\n lines.push(\r\n ` _meta.ogTitle ? { property: \"og:title\", content: escapeHTML(String(_meta.ogTitle || '')).substring(0, 60) } : null,`\r\n );\r\n lines.push(\r\n ` _meta.ogDescription ? { property: \"og:description\", content: escapeHTML(String(_meta.ogDescription || '')).substring(0, 300) } : null,`\r\n );\r\n lines.push(\r\n ` _meta.ogImage ? { property: \"og:image\", content: escapeHTML(String(_meta.ogImage || '')).substring(0, 500) } : null,`\r\n );\r\n lines.push(` ].filter(Boolean);`);\r\n lines.push(` metaTags.forEach((tagObj) => {`);\r\n lines.push(` if (!tagObj) return;`);\r\n lines.push(` const { name, property, content } = tagObj;`);\r\n lines.push(` if (!content || typeof content !== 'string') return;`);\r\n lines.push(` let tag;`);\r\n lines.push(` if (name) {`);\r\n lines.push(` const safeName = name.replace(/[^a-zA-Z0-9-_]/g, '');`);\r\n lines.push(` if (!safeName) return;`);\r\n lines.push(\r\n \" tag = document.querySelector(`meta[name='${safeName}']`);\"\r\n );\r\n lines.push(` if (!tag) {`);\r\n lines.push(` tag = document.createElement(\"meta\");`);\r\n lines.push(` tag.setAttribute(\"name\", safeName);`);\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 ` const safeProperty = property.replace(/[^a-zA-Z0-9-_:]/g, '');`\r\n );\r\n lines.push(` if (!safeProperty) return;`);\r\n lines.push(\r\n \" tag = document.querySelector(`meta[property='${safeProperty}']`);\"\r\n );\r\n lines.push(` if (!tag) {`);\r\n lines.push(` tag = document.createElement(\"meta\");`);\r\n lines.push(` tag.setAttribute(\"property\", safeProperty);`);\r\n lines.push(` document.head.appendChild(tag);`);\r\n lines.push(` }`);\r\n lines.push(` }`);\r\n lines.push(` if (tag) {`);\r\n lines.push(\r\n ` // Escape content to prevent XSS using escapeHTML function`\r\n );\r\n lines.push(` tag.setAttribute(\"content\", content);`);\r\n lines.push(` }`);\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 // Add data attribute to root element - with validation\r\n let viewContent = validateTemplateContent(parsed.view.trim());\r\n\r\n if (!viewContent) {\r\n throw new Error(\"View content contains dangerous patterns\");\r\n }\r\n\r\n const showGeneratedCode =\r\n typeof globalThis !== \"undefined\" &&\r\n (globalThis as any).fynixShowGeneratedCode !== undefined\r\n ? (globalThis as any).fynixShowGeneratedCode\r\n : false;\r\n\r\n if (showGeneratedCode) {\r\n console.log(\r\n `${colors.magenta}[DEBUG] Original view content:${colors.reset}`\r\n );\r\n console.log(viewContent.substring(0, 200));\r\n }\r\n\r\n const tagMatch = viewContent.match(/^(<\\w+)((?:\\s+[^>]*?)?)(\\s*>)/s);\r\n\r\n if (tagMatch) {\r\n const openTag = tagMatch[1];\r\n const attributes = tagMatch[2];\r\n const closingBracket = tagMatch[3];\r\n\r\n if (showGeneratedCode) {\r\n console.log(\r\n `${colors.magenta}[DEBUG] Matched tag:${colors.reset} ${openTag}`\r\n );\r\n }\r\n\r\n // Secure data attribute insertion\r\n const safeDataAttr = sanitizeIdentifier(`data-${styleId}`);\r\n const modifiedStart = `${openTag}${attributes} ${safeDataAttr}=\"\"${closingBracket}`;\r\n const restOfView = viewContent.substring(tagMatch[0].length);\r\n const modifiedView = modifiedStart + restOfView;\r\n\r\n lines.push(` return (`);\r\n const viewLines = modifiedView.split(\"\\n\");\r\n viewLines.forEach((line: string) => {\r\n lines.push(` ${line}`);\r\n });\r\n lines.push(` );`);\r\n } else {\r\n // Fallback: wrap in div if we can't parse\r\n lines.push(` return (`);\r\n lines.push(` <div ${sanitizeIdentifier(`data-${styleId}`)}=\"\">`);\r\n const viewLines = viewContent.split(\"\\n\");\r\n viewLines.forEach((line: string) => {\r\n lines.push(` ${line}`);\r\n });\r\n lines.push(` </div>`);\r\n lines.push(` );`);\r\n }\r\n } else {\r\n const validatedView = validateTemplateContent(parsed.view);\r\n if (!validatedView) {\r\n throw new Error(\"View content contains dangerous patterns\");\r\n }\r\n\r\n lines.push(` return (`);\r\n const viewLines = validatedView.split(\"\\n\");\r\n viewLines.forEach((line: string) => {\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 // 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 * 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: true, // Changed to true for better type checking\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: true, // Changed to true\r\n strictFunctionTypes: true, // Changed to true\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 // Only skip module resolution errors, NOT type errors\r\n // This allows proper type checking (2322 = type mismatch, 2345 = argument type error, etc.)\r\n const skipCodes = new Set([\r\n 2307, // Cannot find module\r\n 2792, // Cannot find module (alternative)\r\n 7016, // Could not find declaration file\r\n 7026, // JSX element implicitly has type 'any'\r\n ]);\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 // Security: Sanitize JSX factory names\r\n const safeJsxFactory = sanitizeIdentifier(jsxFactory);\r\n const safeJsxFragment = sanitizeIdentifier(jsxFragment);\r\n\r\n if (!safeJsxFactory || !safeJsxFragment) {\r\n throw new Error(\"Invalid JSX factory or fragment names provided\");\r\n }\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 // Add resolveId to handle .fnx imports properly\r\n resolveId(id: string, importer?: string) {\r\n // Handle .fnx files explicitly to ensure proper module resolution\r\n if (id.endsWith(\".fnx\")) {\r\n // Log import context for debugging if needed\r\n if (options.debug && importer) {\r\n console.log(\r\n `${colors.gray}[Fynix SFC] Resolving ${colors.cyan}${id}${colors.reset} ${colors.gray}imported from ${colors.cyan}${importer}${colors.reset}`\r\n );\r\n }\r\n // Return the resolved ID to indicate this plugin handles .fnx files\r\n return id;\r\n }\r\n return null;\r\n },\r\n\r\n async load(id: string) {\r\n const normalizedId = normalizePath(id);\r\n\r\n if (normalizedId.endsWith(\".fnx\")) {\r\n try {\r\n // Read the .fnx file content with proper path resolution\r\n const fs = await import(\"fs\");\r\n const path = await import(\"path\");\r\n\r\n // Resolve the path properly - if it's relative, make it absolute\r\n let filePath = normalizedId;\r\n if (!path.isAbsolute(filePath)) {\r\n // If the path starts with /, remove it and resolve from cwd\r\n if (filePath.startsWith(\"/\")) {\r\n filePath = filePath.substring(1);\r\n }\r\n filePath = path.resolve(process.cwd(), filePath);\r\n }\r\n\r\n if (options.debug) {\r\n console.log(\r\n `${colors.gray}[Fynix SFC] Loading file: ${colors.cyan}${filePath}${colors.reset}`\r\n );\r\n }\r\n\r\n const content = fs.readFileSync(filePath, \"utf-8\");\r\n\r\n // Parse and transform the SFC immediately in the load hook\r\n // This prevents Vite's import analysis from seeing the raw .fnx content\r\n const parsed = parseSFC(content);\r\n validateSFC(parsed, filePath);\r\n const transformedCode = transformSFC(\r\n parsed,\r\n filePath,\r\n safeJsxFactory\r\n );\r\n\r\n if (options.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}${filePath}${colors.reset}`\r\n );\r\n console.log(`${colors.cyan}${\"=\".repeat(80)}${colors.reset}`);\r\n console.log(transformedCode);\r\n console.log(`${colors.cyan}${\"=\".repeat(80)}${colors.reset}\\n`);\r\n }\r\n\r\n // Return the transformed JavaScript code\r\n return transformedCode;\r\n } catch (error) {\r\n console.error(\r\n `${colors.red}[Fynix SFC] Failed to load ${normalizedId}:${colors.reset}`,\r\n error\r\n );\r\n throw error;\r\n }\r\n }\r\n return null;\r\n },\r\n\r\n async transform(code: string, id: string) {\r\n const normalizedId = normalizePath(id);\r\n\r\n // Skip .fnx files as they're already transformed in the load hook\r\n if (normalizedId.endsWith(\".fnx\")) {\r\n return null;\r\n }\r\n\r\n // Security: Validate file path (skip for legitimate files)\r\n const safePath = sanitizePath(normalizedId);\r\n\r\n // Allow .fnx files and other legitimate extensions, block only truly dangerous paths\r\n if (\r\n !safePath ||\r\n (normalizedId.includes(\"..\") && !normalizedId.includes(\"node_modules\"))\r\n ) {\r\n console.warn(\r\n `[Security] Potentially dangerous file path blocked: ${normalizedId}`\r\n );\r\n return null;\r\n }\r\n\r\n // Security: Check file size limit (10MB)\r\n if (code.length > 10485760) {\r\n throw new Error(`File ${normalizedId} exceeds maximum size limit`);\r\n }\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 // Only apply strict security validation to .fnx files\r\n // Regular .ts/.js files should be processed normally\r\n if (normalizedId.endsWith(\".fnx\")) {\r\n const validatedCode = validateTemplateContent(code);\r\n if (!validatedCode) {\r\n throw new Error(\r\n `SFC file contains potentially dangerous content: ${normalizedId}`\r\n );\r\n }\r\n codeToTransform = validatedCode;\r\n } else {\r\n codeToTransform = code;\r\n }\r\n\r\n if (normalizedId.endsWith(\".fnx\") && enableSFC) {\r\n const parsed = parseSFC(codeToTransform);\r\n validateSFC(parsed, normalizedId);\r\n\r\n codeToTransform = transformSFC(parsed, normalizedId, safeJsxFactory);\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\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 // Final security validation before esbuild transform\r\n if (codeToTransform.length > 5242880) {\r\n // 5MB limit for transformed code\r\n throw new Error(\r\n `Transformed code exceeds size limit for ${normalizedId}`\r\n );\r\n }\r\n\r\n const result = await transform(codeToTransform, {\r\n loader,\r\n jsxFactory: safeJsxFactory,\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(config: UserConfig) {\r\n // Configure Vite to recognize .fnx files as modules\r\n config.optimizeDeps = config.optimizeDeps || {};\r\n config.optimizeDeps.extensions = config.optimizeDeps.extensions || [];\r\n if (!config.optimizeDeps.extensions.includes(\".fnx\")) {\r\n config.optimizeDeps.extensions.push(\".fnx\");\r\n }\r\n\r\n // Return additional configuration\r\n const additionalConfig: Omit<UserConfig, \"plugins\"> = {\r\n esbuild: {\r\n jsxFactory: safeJsxFactory,\r\n jsxFragment: safeJsxFragment,\r\n jsxInject: `import { ${safeJsxFactory} } from '@fynixorg/ui'`,\r\n },\r\n optimizeDeps: {\r\n include: [\"@fynixorg/ui\"],\r\n esbuildOptions: {\r\n jsx: \"transform\",\r\n jsxFactory: safeJsxFactory,\r\n jsxFragment: safeJsxFragment,\r\n },\r\n ...config.optimizeDeps,\r\n },\r\n resolve: {\r\n extensions: [\".fnx\", \".ts\", \".tsx\", \".js\", \".jsx\", \".json\"],\r\n },\r\n };\r\n\r\n return additionalConfig;\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"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["hash", "timestamp", "hashStr", "ctx"]
|
|
7
7
|
}
|
package/package.json
CHANGED