@fynixorg/ui 1.0.18 → 1.0.21

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,6 +1,6 @@
1
1
  {
2
2
  "name": "@fynixorg/ui",
3
- "version": "1.0.18",
3
+ "version": "1.0.21",
4
4
  "type": "module",
5
5
  "description": "Core package for Fynix UI framework - A lightweight, reactive UI framework with TypeScript support.",
6
6
  "main": "./dist/fynix/index.js",
@@ -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,CAwWzE;AAED,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;AAC1C,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"vite-plugin-res.d.ts","sourceRoot":"","sources":["../../plugins/vite-plugin-res.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAG3D,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAoBjC,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;AAgVD,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,CA8NzE;AAED,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;AAC1C,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,CAAC"}
@@ -1,91 +1,6 @@
1
1
  import { transform } from "esbuild";
2
2
  import { normalizePath } from "vite";
3
3
  import * as ts from "typescript";
4
- function sanitizeIdentifier(identifier) {
5
- if (typeof identifier !== "string")
6
- return "";
7
- const sanitized = identifier.replace(/[^a-zA-Z0-9_$]/g, "");
8
- if (/^\d/.test(sanitized)) {
9
- return "_" + sanitized;
10
- }
11
- const dangerousWords = [
12
- "eval",
13
- "Function",
14
- "constructor",
15
- "prototype",
16
- "__proto__",
17
- "window",
18
- "global",
19
- "process",
20
- "require",
21
- "import",
22
- "export",
23
- "document",
24
- "location",
25
- "alert",
26
- "confirm",
27
- "prompt",
28
- ];
29
- if (dangerousWords.includes(sanitized)) {
30
- return "safe_" + sanitized;
31
- }
32
- return sanitized || "defaultIdentifier";
33
- }
34
- function escapeHTML(str) {
35
- if (typeof str !== "string")
36
- return "";
37
- return str
38
- .replace(/&/g, "&")
39
- .replace(/</g, "&lt;")
40
- .replace(/>/g, "&gt;")
41
- .replace(/"/g, "&quot;")
42
- .replace(/'/g, "&#x27;")
43
- .replace(/\//g, "&#x2F;")
44
- .replace(/`/g, "&#x60;")
45
- .replace(/=/g, "&#x3D;");
46
- }
47
- function sanitizeCSS(css) {
48
- if (typeof css !== "string")
49
- return "";
50
- return css
51
- .replace(/javascript:/gi, "")
52
- .replace(/vbscript:/gi, "")
53
- .replace(/data:/gi, "")
54
- .replace(/expression\s*\(/gi, "")
55
- .replace(/@import/gi, "")
56
- .replace(/url\s*\(/gi, "")
57
- .replace(/behavior\s*:/gi, "");
58
- }
59
- function sanitizePath(path) {
60
- if (typeof path !== "string")
61
- return "";
62
- return path
63
- .replace(/\.\./g, "")
64
- .replace(/~/g, "")
65
- .replace(/\\+/g, "/")
66
- .replace(/\/+/g, "/")
67
- .replace(/^\//g, "")
68
- .replace(/\/$/, "");
69
- }
70
- function validateTemplateContent(content) {
71
- if (typeof content !== "string")
72
- return "";
73
- const dangerousPatterns = [
74
- /eval\s*\(/gi,
75
- /Function\s*\(/gi,
76
- /<script[^>]*>.*?<\/script>/gis,
77
- /javascript:\s*[^"'\s]/gi,
78
- /vbscript:\s*[^"'\s]/gi,
79
- /data:\s*text\/html/gi,
80
- ];
81
- for (const pattern of dangerousPatterns) {
82
- if (pattern.test(content)) {
83
- console.warn(`[Security] Blocked dangerous pattern in template: ${pattern}`);
84
- return "";
85
- }
86
- }
87
- return content;
88
- }
89
4
  const colors = {
90
5
  reset: "\x1b[0m",
91
6
  red: "\x1b[31m",
@@ -98,13 +13,6 @@ const colors = {
98
13
  bold: "\x1b[1m",
99
14
  };
100
15
  function parseSFC(source) {
101
- if (typeof source !== "string" || source.length > 1000000) {
102
- throw new Error("Invalid or excessively large SFC source");
103
- }
104
- const sanitizedSource = validateTemplateContent(source);
105
- if (!sanitizedSource) {
106
- throw new Error("SFC contains potentially dangerous content");
107
- }
108
16
  const result = {
109
17
  logic: "",
110
18
  view: "",
@@ -117,14 +25,11 @@ function parseSFC(source) {
117
25
  imports: [],
118
26
  exports: [],
119
27
  };
120
- const logicMatch = sanitizedSource.match(/<logic\s+setup\s*=\s*["']?(ts|js)["']?\s*>([\s\S]*?)<\/logic>/i);
28
+ const logicMatch = source.match(/<logic\s+setup\s*=\s*["']?(ts|js)["']?\s*>([\s\S]*?)<\/logic>/i);
121
29
  if (logicMatch && logicMatch[1] && logicMatch[2] !== undefined) {
122
30
  result.hasLogic = true;
123
31
  result.logicLang = logicMatch[1].toLowerCase();
124
32
  const rawLogic = logicMatch[2].trim();
125
- if (rawLogic.length > 100000) {
126
- throw new Error("Logic block exceeds size limit");
127
- }
128
33
  const logicLines = rawLogic.split("\n");
129
34
  const imports = [];
130
35
  const exports = [];
@@ -135,10 +40,6 @@ function parseSFC(source) {
135
40
  for (let i = 0; i < logicLines.length; i++) {
136
41
  const line = logicLines[i] ?? "";
137
42
  const trimmed = line.trim();
138
- if (validateTemplateContent(line) === "") {
139
- console.warn(`[Security] Skipped potentially dangerous line in logic block`);
140
- continue;
141
- }
142
43
  if (inExportBlock) {
143
44
  exportBuffer.push(line);
144
45
  const openBraces = ((line && line.match(/{/g)) || []).length;
@@ -184,138 +85,46 @@ function parseSFC(source) {
184
85
  result.exports = exports;
185
86
  result.logic = otherLogic.join("\n");
186
87
  }
187
- const viewMatch = sanitizedSource.match(/<view\s*>([\s\S]*?)<\/view>/i);
88
+ const viewMatch = source.match(/<view\s*>([\s\S]*?)<\/view>/i);
188
89
  if (viewMatch && viewMatch[1] !== undefined) {
189
- const viewContent = viewMatch[1].trim();
190
- if (viewContent.length > 50000) {
191
- throw new Error("View block exceeds size limit");
192
- }
193
90
  result.hasView = true;
194
- result.view = viewContent;
91
+ result.view = viewMatch[1].trim();
195
92
  }
196
- const styleMatch = sanitizedSource.match(/<style(\s+scoped)?\s*>([\s\S]*?)<\/style>/i);
93
+ const styleMatch = source.match(/<style(\s+scoped)?\s*>([\s\S]*?)<\/style>/i);
197
94
  if (styleMatch && styleMatch[2] !== undefined) {
198
- const styleContent = styleMatch[2].trim();
199
- if (styleContent.length > 100000) {
200
- throw new Error("Style block exceeds size limit");
201
- }
202
95
  result.hasStyle = true;
203
96
  result.isStyleScoped = !!styleMatch[1];
204
- result.style = sanitizeCSS(styleContent);
97
+ result.style = styleMatch[2].trim();
205
98
  }
206
99
  return result;
207
100
  }
208
101
  function generateStyleId(filePath) {
209
- const safePath = sanitizePath(filePath);
210
- if (typeof crypto !== "undefined" && crypto.subtle) {
211
- const encoder = new TextEncoder();
212
- const data = encoder.encode(safePath + Date.now());
213
- let dataHash = 0;
214
- for (let i = 0; i < data.length; i++) {
215
- const byte = data[i];
216
- if (byte !== undefined) {
217
- dataHash = (dataHash << 5) - dataHash + byte;
218
- dataHash = dataHash & dataHash;
219
- }
220
- }
221
- const combinedInput = safePath + "_security_salt_" + dataHash;
222
- let hash = 0;
223
- for (let i = 0; i < combinedInput.length; i++) {
224
- const char = combinedInput.charCodeAt(i);
225
- hash = (hash << 5) - hash + char;
226
- hash = hash & hash;
227
- }
228
- const timestamp = Date.now().toString(36);
229
- const hashStr = Math.abs(hash).toString(36);
230
- return sanitizeIdentifier(`fynix-${hashStr}-${timestamp}`);
231
- }
232
102
  let hash = 0;
233
- const input = safePath + "_security_salt";
234
- for (let i = 0; i < input.length; i++) {
235
- const char = input.charCodeAt(i);
103
+ for (let i = 0; i < filePath.length; i++) {
104
+ const char = filePath.charCodeAt(i);
236
105
  hash = (hash << 5) - hash + char;
237
106
  hash = hash & hash;
238
107
  }
239
- const timestamp = Date.now().toString(36);
240
- const hashStr = Math.abs(hash).toString(36);
241
- return sanitizeIdentifier(`fynix-${hashStr}-${timestamp}`);
242
- }
243
- function scopeStyles(css, scopeId) {
244
- const dataAttr = `[data-${scopeId}]`;
245
- const keyframeMap = new Map();
246
- const keyframes = [];
247
- css = css.replace(/@keyframes\s+([a-zA-Z0-9_-]+)\s*\{[\s\S]*?\}/g, (block, name) => {
248
- const scopedName = `${name}-${scopeId}`;
249
- keyframeMap.set(name, scopedName);
250
- const renamed = block.replace(new RegExp(`@keyframes\\s+${name}`), `@keyframes ${scopedName}`);
251
- const index = keyframes.push(renamed) - 1;
252
- return `__KEYFRAMES_${index}__`;
253
- });
254
- keyframeMap.forEach((scoped, original) => {
255
- const re = new RegExp(`(animation(?:-name)?\\s*:[^;]*?)\\b${original}\\b`, "g");
256
- css = css.replace(re, `$1${scoped}`);
257
- });
258
- let rootClass = null;
259
- try {
260
- const viewMatch = css.match(/\.(\w+)[^{]*\{/);
261
- if (viewMatch) {
262
- rootClass = viewMatch[1];
263
- }
264
- }
265
- catch { }
266
- css = css.replace(/([^{}]+)\{([^{}]*)\}/g, (match, selector, rules) => {
267
- if (selector.trim().startsWith("@"))
268
- return match;
269
- const scopedSelectors = selector
270
- .split(",")
271
- .map((s) => {
272
- const sel = s.trim();
273
- if (rootClass) {
274
- const rootRe = new RegExp(`^\\.${rootClass}((:[\\w-]+)*|(::[\\w-]+)*)?$`);
275
- const pseudo = sel.replace(new RegExp(`^\\.${rootClass}`), "");
276
- if (rootRe.test(sel)) {
277
- return `${dataAttr}${pseudo}`;
278
- }
279
- }
280
- return `${dataAttr} ${sel}`;
281
- })
282
- .join(", ");
283
- return `${scopedSelectors}{${rules}}`;
284
- });
285
- keyframes.forEach((kf, i) => {
286
- css = css.replace(`__KEYFRAMES_${i}__`, kf);
287
- });
288
- return css;
108
+ return `fynix-${Math.abs(hash).toString(36)}`;
289
109
  }
290
110
  function transformSFC(parsed, filePath, jsxFactory) {
291
- if (!parsed || typeof parsed !== "object") {
292
- throw new Error("Invalid parsed SFC result");
293
- }
294
- const safeFilePath = sanitizePath(filePath);
295
- const safeJsxFactory = sanitizeIdentifier(jsxFactory);
296
- if (!safeJsxFactory) {
297
- throw new Error("Invalid JSX factory name");
298
- }
299
- const styleId = generateStyleId(safeFilePath);
111
+ const styleId = generateStyleId(filePath);
300
112
  const lines = [];
301
- lines.push(`import { ${safeJsxFactory} } from '@fynixorg/ui';`);
113
+ lines.push(`import { ${jsxFactory} } from '@fynixorg/ui';`);
302
114
  if (parsed.imports.length > 0) {
303
115
  parsed.imports.forEach((importLine) => {
304
- const validatedImport = validateTemplateContent(importLine);
305
- if (validatedImport) {
306
- lines.push(validatedImport);
307
- }
116
+ lines.push(importLine);
308
117
  });
309
118
  }
310
119
  lines.push("");
311
120
  if (parsed.hasStyle) {
312
- let processedStyle = sanitizeCSS(parsed.style);
121
+ let processedStyle = parsed.style;
313
122
  if (parsed.isStyleScoped) {
314
- processedStyle = scopeStyles(processedStyle, styleId);
123
+ processedStyle = scopeStyles(parsed.style, styleId);
315
124
  }
316
125
  lines.push(`// Inject styles`);
317
126
  lines.push(`if (typeof document !== 'undefined') {`);
318
- lines.push(` const styleId = ${JSON.stringify(styleId)};`);
127
+ lines.push(` const styleId = '${styleId}';`);
319
128
  lines.push(` if (!document.getElementById(styleId)) {`);
320
129
  lines.push(` const styleEl = document.createElement('style');`);
321
130
  lines.push(` styleEl.id = styleId;`);
@@ -327,75 +136,50 @@ function transformSFC(parsed, filePath, jsxFactory) {
327
136
  }
328
137
  if (parsed.exports.length > 0) {
329
138
  parsed.exports.forEach((exportLine) => {
330
- const validatedExport = validateTemplateContent(exportLine);
331
- if (validatedExport) {
332
- lines.push(validatedExport);
333
- }
139
+ lines.push(exportLine);
334
140
  });
335
141
  lines.push("");
336
142
  }
337
- let propsType = "any";
338
- const propsInterfaceRegex = /interface\s+Props\s*{[\s\S]*?}/m;
339
- if (propsInterfaceRegex.test(parsed.logic)) {
340
- propsType = "Props";
341
- }
342
- lines.push(`function FynixComponent(props: ${propsType} = {}) {`);
143
+ lines.push(`function FynixComponent(props = {}) {`);
343
144
  if (parsed.hasLogic && parsed.logic.trim()) {
344
145
  lines.push(` // Component logic`);
345
146
  const logicLines = parsed.logic.split("\n");
346
147
  logicLines.forEach((line) => {
347
- const validatedLine = validateTemplateContent(line);
348
- if (validatedLine && validatedLine.trim()) {
349
- lines.push(` ${validatedLine}`);
148
+ if (line.trim()) {
149
+ lines.push(` ${line}`);
350
150
  }
351
151
  });
352
152
  lines.push("");
353
153
  }
354
154
  if (parsed.exports.some((e) => e.trim().startsWith("export const meta"))) {
355
155
  lines.push(` if (typeof document !== "undefined" && typeof meta !== "undefined") {`);
356
- lines.push(` if (meta.title) {`);
357
- lines.push(` // Import the escapeHTML function for secure processing`);
358
- lines.push(` const escapeHTML = ${escapeHTML.toString()};`);
359
- lines.push(` const safeTitle = escapeHTML(String(meta.title)).substring(0, 60);`);
360
- lines.push(` document.title = safeTitle;`);
361
- lines.push(` }`);
362
- lines.push(` const _meta = meta as any;`);
363
- lines.push(` const escapeHTML = ${escapeHTML.toString()};`);
156
+ lines.push(` document.title = meta.title;`);
364
157
  lines.push(` const metaTags = [`);
365
- lines.push(` _meta.description ? { name: "description", content: escapeHTML(String(_meta.description || '')).substring(0, 300) } : null,`);
366
- lines.push(` _meta.keywords ? { name: "keywords", content: escapeHTML(String(_meta.keywords || '')).substring(0, 200) } : null,`);
367
- lines.push(` _meta.ogTitle ? { property: "og:title", content: escapeHTML(String(_meta.ogTitle || '')).substring(0, 60) } : null,`);
368
- lines.push(` _meta.ogDescription ? { property: "og:description", content: escapeHTML(String(_meta.ogDescription || '')).substring(0, 300) } : null,`);
369
- lines.push(` _meta.ogImage ? { property: "og:image", content: escapeHTML(String(_meta.ogImage || '')).substring(0, 500) } : null,`);
370
- lines.push(` ].filter(Boolean);`);
371
- lines.push(` metaTags.forEach((tagObj) => {`);
372
- lines.push(` if (!tagObj) return;`);
373
- lines.push(` const { name, property, content } = tagObj;`);
374
- lines.push(` if (!content || typeof content !== 'string') return;`);
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;`);
375
166
  lines.push(` let tag;`);
376
167
  lines.push(` if (name) {`);
377
- lines.push(` const safeName = name.replace(/[^a-zA-Z0-9-_]/g, '');`);
378
- lines.push(` if (!safeName) return;`);
379
- lines.push(" tag = document.querySelector(`meta[name='${safeName}']`);");
168
+ lines.push(` tag = document.querySelector(\`meta[name='\${name}\']\`);`);
380
169
  lines.push(` if (!tag) {`);
381
170
  lines.push(` tag = document.createElement("meta");`);
382
- lines.push(` tag.setAttribute("name", safeName);`);
171
+ lines.push(` tag.setAttribute("name", name);`);
383
172
  lines.push(` document.head.appendChild(tag);`);
384
173
  lines.push(` }`);
385
174
  lines.push(` } else if (property) {`);
386
- lines.push(` const safeProperty = property.replace(/[^a-zA-Z0-9-_:]/g, '');`);
387
- lines.push(` if (!safeProperty) return;`);
388
- lines.push(" tag = document.querySelector(`meta[property='${safeProperty}']`);");
175
+ lines.push(` tag = document.querySelector(\`meta[property='\${property}\']\`);`);
389
176
  lines.push(` if (!tag) {`);
390
177
  lines.push(` tag = document.createElement("meta");`);
391
- lines.push(` tag.setAttribute("property", safeProperty);`);
178
+ lines.push(` tag.setAttribute("property", property);`);
392
179
  lines.push(` document.head.appendChild(tag);`);
393
180
  lines.push(` }`);
394
181
  lines.push(` }`);
395
- lines.push(` if (tag) {`);
396
- lines.push(` // Escape content to prevent XSS using escapeHTML function`);
397
- lines.push(` tag.setAttribute("content", content);`);
398
- lines.push(` }`);
182
+ lines.push(` if (tag) tag.setAttribute("content", content);`);
399
183
  lines.push(` });`);
400
184
  lines.push(` }`);
401
185
  lines.push("");
@@ -403,55 +187,18 @@ function transformSFC(parsed, filePath, jsxFactory) {
403
187
  if (parsed.hasView) {
404
188
  lines.push(` // Component view`);
405
189
  if (parsed.isStyleScoped) {
406
- let viewContent = validateTemplateContent(parsed.view.trim());
407
- if (!viewContent) {
408
- throw new Error("View content contains dangerous patterns");
409
- }
410
- const showGeneratedCode = typeof globalThis !== "undefined" &&
411
- globalThis.fynixShowGeneratedCode !== undefined
412
- ? globalThis.fynixShowGeneratedCode
413
- : false;
414
- if (showGeneratedCode) {
415
- console.log(`${colors.magenta}[DEBUG] Original view content:${colors.reset}`);
416
- console.log(viewContent.substring(0, 200));
417
- }
418
- const tagMatch = viewContent.match(/^(<\w+)((?:\s+[^>]*?)?)(\s*>)/s);
419
- if (tagMatch) {
420
- const openTag = tagMatch[1];
421
- const attributes = tagMatch[2];
422
- const closingBracket = tagMatch[3];
423
- if (showGeneratedCode) {
424
- console.log(`${colors.magenta}[DEBUG] Matched tag:${colors.reset} ${openTag}`);
425
- }
426
- const safeDataAttr = sanitizeIdentifier(`data-${styleId}`);
427
- const modifiedStart = `${openTag}${attributes} ${safeDataAttr}=""${closingBracket}`;
428
- const restOfView = viewContent.substring(tagMatch[0].length);
429
- const modifiedView = modifiedStart + restOfView;
430
- lines.push(` return (`);
431
- const viewLines = modifiedView.split("\n");
432
- viewLines.forEach((line) => {
433
- lines.push(` ${line}`);
434
- });
435
- lines.push(` );`);
436
- }
437
- else {
438
- lines.push(` return (`);
439
- lines.push(` <div ${sanitizeIdentifier(`data-${styleId}`)}="">`);
440
- const viewLines = viewContent.split("\n");
441
- viewLines.forEach((line) => {
442
- lines.push(` ${line}`);
443
- });
444
- lines.push(` </div>`);
445
- lines.push(` );`);
446
- }
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(` );`);
447
198
  }
448
199
  else {
449
- const validatedView = validateTemplateContent(parsed.view);
450
- if (!validatedView) {
451
- throw new Error("View content contains dangerous patterns");
452
- }
453
200
  lines.push(` return (`);
454
- const viewLines = validatedView.split("\n");
201
+ const viewLines = parsed.view.split("\n");
455
202
  viewLines.forEach((line) => {
456
203
  lines.push(` ${line}`);
457
204
  });
@@ -466,6 +213,23 @@ function transformSFC(parsed, filePath, jsxFactory) {
466
213
  lines.push(`export default FynixComponent;`);
467
214
  return lines.join("\n");
468
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
+ }
469
233
  function validateSFC(parsed, filePath) {
470
234
  if (!parsed.hasView) {
471
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.`);
@@ -503,7 +267,7 @@ class TypeScriptChecker {
503
267
  this.program = null;
504
268
  this.compilerOptions = {
505
269
  noEmit: true,
506
- strict: true,
270
+ strict: false,
507
271
  target: ts.ScriptTarget.ESNext,
508
272
  module: ts.ModuleKind.ESNext,
509
273
  jsx: ts.JsxEmit.Preserve,
@@ -512,8 +276,8 @@ class TypeScriptChecker {
512
276
  esModuleInterop: true,
513
277
  skipLibCheck: true,
514
278
  allowSyntheticDefaultImports: true,
515
- strictNullChecks: true,
516
- strictFunctionTypes: true,
279
+ strictNullChecks: false,
280
+ strictFunctionTypes: false,
517
281
  noImplicitAny: false,
518
282
  allowJs: true,
519
283
  checkJs: false,
@@ -583,12 +347,7 @@ class TypeScriptChecker {
583
347
  ...this.program.getSyntacticDiagnostics(sourceFile),
584
348
  ...this.program.getSemanticDiagnostics(sourceFile),
585
349
  ];
586
- const skipCodes = new Set([
587
- 2307,
588
- 2792,
589
- 7016,
590
- 7026,
591
- ]);
350
+ const skipCodes = new Set([2307, 2792, 7016, 2304, 7026, 2874]);
592
351
  diagnostics.forEach((diagnostic) => {
593
352
  if (skipCodes.has(diagnostic.code)) {
594
353
  return;
@@ -618,11 +377,6 @@ class TypeScriptChecker {
618
377
  }
619
378
  export default function fynixPlugin(options = {}) {
620
379
  const { jsxFactory = "Fynix", jsxFragment = "Fynix.Fragment", include = [".ts", ".js", ".jsx", ".tsx", ".fnx"], exclude = ["node_modules"], sourcemap = true, esbuildOptions = {}, enableSFC = true, showGeneratedCode = false, typeCheck = false, tsConfig, } = options;
621
- const safeJsxFactory = sanitizeIdentifier(jsxFactory);
622
- const safeJsxFragment = sanitizeIdentifier(jsxFragment);
623
- if (!safeJsxFactory || !safeJsxFragment) {
624
- throw new Error("Invalid JSX factory or fragment names provided");
625
- }
626
380
  let typeChecker = null;
627
381
  if (typeCheck) {
628
382
  typeChecker = new TypeScriptChecker(tsConfig);
@@ -630,65 +384,8 @@ export default function fynixPlugin(options = {}) {
630
384
  return {
631
385
  name: "vite-plugin-fynix-sfc",
632
386
  enforce: "pre",
633
- resolveId(id, importer) {
634
- if (id.endsWith(".fnx")) {
635
- if (options.debug && importer) {
636
- console.log(`${colors.gray}[Fynix SFC] Resolving ${colors.cyan}${id}${colors.reset} ${colors.gray}imported from ${colors.cyan}${importer}${colors.reset}`);
637
- }
638
- return id;
639
- }
640
- return null;
641
- },
642
- async load(id) {
643
- const normalizedId = normalizePath(id);
644
- if (normalizedId.endsWith(".fnx")) {
645
- try {
646
- const fs = await import("fs");
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");
659
- const parsed = parseSFC(content);
660
- validateSFC(parsed, filePath);
661
- const transformedCode = transformSFC(parsed, filePath, safeJsxFactory);
662
- if (options.showGeneratedCode) {
663
- console.log(`\n${colors.cyan}${"=".repeat(80)}${colors.reset}`);
664
- console.log(`${colors.cyan}[Fynix SFC]${colors.reset} Generated code for: ${colors.gray}${filePath}${colors.reset}`);
665
- console.log(`${colors.cyan}${"=".repeat(80)}${colors.reset}`);
666
- console.log(transformedCode);
667
- console.log(`${colors.cyan}${"=".repeat(80)}${colors.reset}\n`);
668
- }
669
- return transformedCode;
670
- }
671
- catch (error) {
672
- console.error(`${colors.red}[Fynix SFC] Failed to load ${normalizedId}:${colors.reset}`, error);
673
- throw error;
674
- }
675
- }
676
- return null;
677
- },
678
387
  async transform(code, id) {
679
388
  const normalizedId = normalizePath(id);
680
- if (normalizedId.endsWith(".fnx")) {
681
- return null;
682
- }
683
- const safePath = sanitizePath(normalizedId);
684
- if (!safePath ||
685
- (normalizedId.includes("..") && !normalizedId.includes("node_modules"))) {
686
- console.warn(`[Security] Potentially dangerous file path blocked: ${normalizedId}`);
687
- return null;
688
- }
689
- if (code.length > 10485760) {
690
- throw new Error(`File ${normalizedId} exceeds maximum size limit`);
691
- }
692
389
  const shouldExclude = exclude.some((pattern) => normalizedId.includes(pattern));
693
390
  if (shouldExclude)
694
391
  return null;
@@ -703,20 +400,10 @@ export default function fynixPlugin(options = {}) {
703
400
  let codeToTransform = code;
704
401
  let loader = "tsx";
705
402
  let shouldTypeCheck = false;
706
- if (normalizedId.endsWith(".fnx")) {
707
- const validatedCode = validateTemplateContent(code);
708
- if (!validatedCode) {
709
- throw new Error(`SFC file contains potentially dangerous content: ${normalizedId}`);
710
- }
711
- codeToTransform = validatedCode;
712
- }
713
- else {
714
- codeToTransform = code;
715
- }
716
403
  if (normalizedId.endsWith(".fnx") && enableSFC) {
717
- const parsed = parseSFC(codeToTransform);
404
+ const parsed = parseSFC(code);
718
405
  validateSFC(parsed, normalizedId);
719
- codeToTransform = transformSFC(parsed, normalizedId, safeJsxFactory);
406
+ codeToTransform = transformSFC(parsed, normalizedId, jsxFactory);
720
407
  if (showGeneratedCode) {
721
408
  console.log(`\n${colors.cyan}${"=".repeat(80)}${colors.reset}`);
722
409
  console.log(`${colors.cyan}[Fynix SFC]${colors.reset} Generated code for: ${colors.gray}${normalizedId}${colors.reset}`);
@@ -725,6 +412,7 @@ export default function fynixPlugin(options = {}) {
725
412
  console.log(`${colors.cyan}${"=".repeat(80)}${colors.reset}\n`);
726
413
  }
727
414
  shouldTypeCheck = typeCheck && parsed.logicLang === "ts";
415
+ loader = parsed.logicLang === "ts" ? "tsx" : "jsx";
728
416
  if (shouldTypeCheck && typeChecker) {
729
417
  const virtualFileName = normalizedId.replace(/\.fnx$/, ".virtual.tsx");
730
418
  typeChecker.addFile(virtualFileName, codeToTransform);
@@ -768,12 +456,9 @@ export default function fynixPlugin(options = {}) {
768
456
  }
769
457
  }
770
458
  }
771
- if (codeToTransform.length > 5242880) {
772
- throw new Error(`Transformed code exceeds size limit for ${normalizedId}`);
773
- }
774
459
  const result = await transform(codeToTransform, {
775
460
  loader,
776
- jsxFactory: safeJsxFactory,
461
+ jsxFactory,
777
462
  jsxFragment,
778
463
  sourcemap,
779
464
  sourcefile: id,
@@ -821,32 +506,26 @@ export default function fynixPlugin(options = {}) {
821
506
  }
822
507
  return undefined;
823
508
  },
824
- config(config) {
825
- config.optimizeDeps = config.optimizeDeps || {};
826
- config.optimizeDeps.extensions = config.optimizeDeps.extensions || [];
827
- if (!config.optimizeDeps.extensions.includes(".fnx")) {
828
- config.optimizeDeps.extensions.push(".fnx");
829
- }
830
- const additionalConfig = {
509
+ config() {
510
+ const config = {
831
511
  esbuild: {
832
- jsxFactory: safeJsxFactory,
833
- jsxFragment: safeJsxFragment,
834
- jsxInject: `import { ${safeJsxFactory} } from '@fynixorg/ui'`,
512
+ jsxFactory,
513
+ jsxFragment,
514
+ jsxInject: `import { ${jsxFactory} } from '@fynixorg/ui'`,
835
515
  },
836
516
  optimizeDeps: {
837
517
  include: ["@fynixorg/ui"],
838
518
  esbuildOptions: {
839
519
  jsx: "transform",
840
- jsxFactory: safeJsxFactory,
841
- jsxFragment: safeJsxFragment,
520
+ jsxFactory,
521
+ jsxFragment,
842
522
  },
843
- ...config.optimizeDeps,
844
523
  },
845
524
  resolve: {
846
525
  extensions: [".fnx", ".ts", ".tsx", ".js", ".jsx", ".json"],
847
526
  },
848
527
  };
849
- return additionalConfig;
528
+ return config;
850
529
  },
851
530
  buildStart() {
852
531
  console.log(`${colors.cyan}[vite-plugin-fynix-sfc]${colors.reset} Initialized`);
@@ -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, \"&amp;\")\r\n .replace(/</g, \"&lt;\")\r\n .replace(/>/g, \"&gt;\")\r\n .replace(/\"/g, \"&quot;\")\r\n .replace(/'/g, \"&#x27;\")\r\n .replace(/\\//g, \"&#x2F;\")\r\n .replace(/`/g, \"&#x60;\")\r\n .replace(/=/g, \"&#x3D;\");\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
- "names": ["hash", "timestamp", "hashStr", "ctx"]
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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",
6
+ "names": ["ctx"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fynixorg/ui",
3
- "version": "1.0.18",
3
+ "version": "1.0.21",
4
4
  "type": "module",
5
5
  "description": "Core package for Fynix UI framework - A lightweight, reactive UI framework with TypeScript support.",
6
6
  "main": "./dist/fynix/index.js",