@fynixorg/ui 1.0.20 → 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite-plugin-res.d.ts","sourceRoot":"","sources":["../../plugins/vite-plugin-res.ts"],"names":[],"mappings":"
|
|
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, "<")
|
|
40
|
-
.replace(/>/g, ">")
|
|
41
|
-
.replace(/"/g, """)
|
|
42
|
-
.replace(/'/g, "'")
|
|
43
|
-
.replace(/\//g, "/")
|
|
44
|
-
.replace(/`/g, "`")
|
|
45
|
-
.replace(/=/g, "=");
|
|
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 =
|
|
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 =
|
|
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 =
|
|
91
|
+
result.view = viewMatch[1].trim();
|
|
195
92
|
}
|
|
196
|
-
const styleMatch =
|
|
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 =
|
|
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
|
-
|
|
234
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 { ${
|
|
113
|
+
lines.push(`import { ${jsxFactory} } from '@fynixorg/ui';`);
|
|
302
114
|
if (parsed.imports.length > 0) {
|
|
303
115
|
parsed.imports.forEach((importLine) => {
|
|
304
|
-
|
|
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 =
|
|
121
|
+
let processedStyle = parsed.style;
|
|
313
122
|
if (parsed.isStyleScoped) {
|
|
314
|
-
processedStyle = scopeStyles(
|
|
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 = ${
|
|
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
|
-
|
|
331
|
-
if (validatedExport) {
|
|
332
|
-
lines.push(validatedExport);
|
|
333
|
-
}
|
|
139
|
+
lines.push(exportLine);
|
|
334
140
|
});
|
|
335
141
|
lines.push("");
|
|
336
142
|
}
|
|
337
|
-
|
|
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
|
-
|
|
348
|
-
|
|
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(`
|
|
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(`
|
|
366
|
-
lines.push(`
|
|
367
|
-
lines.push(`
|
|
368
|
-
lines.push(`
|
|
369
|
-
lines.push(`
|
|
370
|
-
lines.push(` ]
|
|
371
|
-
lines.push(` metaTags.forEach((
|
|
372
|
-
lines.push(` if (!
|
|
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(`
|
|
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",
|
|
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(`
|
|
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",
|
|
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
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
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 =
|
|
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:
|
|
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:
|
|
516
|
-
strictFunctionTypes:
|
|
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,66 +384,8 @@ export default function fynixPlugin(options = {}) {
|
|
|
630
384
|
return {
|
|
631
385
|
name: "vite-plugin-fynix-sfc",
|
|
632
386
|
enforce: "pre",
|
|
633
|
-
async 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
|
-
const path = await import("path");
|
|
639
|
-
let resolvedPath = id;
|
|
640
|
-
if (id.startsWith("/")) {
|
|
641
|
-
resolvedPath = path.resolve(process.cwd(), id.substring(1));
|
|
642
|
-
}
|
|
643
|
-
else if (!path.isAbsolute(id)) {
|
|
644
|
-
resolvedPath = path.resolve(process.cwd(), id);
|
|
645
|
-
}
|
|
646
|
-
return resolvedPath;
|
|
647
|
-
}
|
|
648
|
-
return null;
|
|
649
|
-
},
|
|
650
|
-
async load(id) {
|
|
651
|
-
const normalizedId = normalizePath(id);
|
|
652
|
-
if (normalizedId.endsWith(".fnx")) {
|
|
653
|
-
try {
|
|
654
|
-
const fs = await import("fs");
|
|
655
|
-
let filePath = normalizedId;
|
|
656
|
-
if (options.debug) {
|
|
657
|
-
console.log(`${colors.gray}[Fynix SFC] Loading file: ${colors.cyan}${filePath}${colors.reset}`);
|
|
658
|
-
}
|
|
659
|
-
const content = fs.readFileSync(filePath, "utf-8");
|
|
660
|
-
const parsed = parseSFC(content);
|
|
661
|
-
validateSFC(parsed, normalizedId);
|
|
662
|
-
const transformedCode = transformSFC(parsed, normalizedId, safeJsxFactory);
|
|
663
|
-
if (options.showGeneratedCode) {
|
|
664
|
-
console.log(`\n${colors.cyan}${"=".repeat(80)}${colors.reset}`);
|
|
665
|
-
console.log(`${colors.cyan}[Fynix SFC]${colors.reset} Generated code for: ${colors.gray}${normalizedId}${colors.reset}`);
|
|
666
|
-
console.log(`${colors.cyan}${"=".repeat(80)}${colors.reset}`);
|
|
667
|
-
console.log(transformedCode);
|
|
668
|
-
console.log(`${colors.cyan}${"=".repeat(80)}${colors.reset}\n`);
|
|
669
|
-
}
|
|
670
|
-
return transformedCode;
|
|
671
|
-
}
|
|
672
|
-
catch (error) {
|
|
673
|
-
console.error(`${colors.red}[Fynix SFC] Failed to load ${normalizedId}:${colors.reset}`, error);
|
|
674
|
-
throw error;
|
|
675
|
-
}
|
|
676
|
-
}
|
|
677
|
-
return null;
|
|
678
|
-
},
|
|
679
387
|
async transform(code, id) {
|
|
680
388
|
const normalizedId = normalizePath(id);
|
|
681
|
-
if (normalizedId.endsWith(".fnx")) {
|
|
682
|
-
return null;
|
|
683
|
-
}
|
|
684
|
-
const safePath = sanitizePath(normalizedId);
|
|
685
|
-
if (!safePath ||
|
|
686
|
-
(normalizedId.includes("..") && !normalizedId.includes("node_modules"))) {
|
|
687
|
-
console.warn(`[Security] Potentially dangerous file path blocked: ${normalizedId}`);
|
|
688
|
-
return null;
|
|
689
|
-
}
|
|
690
|
-
if (code.length > 10485760) {
|
|
691
|
-
throw new Error(`File ${normalizedId} exceeds maximum size limit`);
|
|
692
|
-
}
|
|
693
389
|
const shouldExclude = exclude.some((pattern) => normalizedId.includes(pattern));
|
|
694
390
|
if (shouldExclude)
|
|
695
391
|
return null;
|
|
@@ -704,20 +400,10 @@ export default function fynixPlugin(options = {}) {
|
|
|
704
400
|
let codeToTransform = code;
|
|
705
401
|
let loader = "tsx";
|
|
706
402
|
let shouldTypeCheck = false;
|
|
707
|
-
if (normalizedId.endsWith(".fnx")) {
|
|
708
|
-
const validatedCode = validateTemplateContent(code);
|
|
709
|
-
if (!validatedCode) {
|
|
710
|
-
throw new Error(`SFC file contains potentially dangerous content: ${normalizedId}`);
|
|
711
|
-
}
|
|
712
|
-
codeToTransform = validatedCode;
|
|
713
|
-
}
|
|
714
|
-
else {
|
|
715
|
-
codeToTransform = code;
|
|
716
|
-
}
|
|
717
403
|
if (normalizedId.endsWith(".fnx") && enableSFC) {
|
|
718
|
-
const parsed = parseSFC(
|
|
404
|
+
const parsed = parseSFC(code);
|
|
719
405
|
validateSFC(parsed, normalizedId);
|
|
720
|
-
codeToTransform = transformSFC(parsed, normalizedId,
|
|
406
|
+
codeToTransform = transformSFC(parsed, normalizedId, jsxFactory);
|
|
721
407
|
if (showGeneratedCode) {
|
|
722
408
|
console.log(`\n${colors.cyan}${"=".repeat(80)}${colors.reset}`);
|
|
723
409
|
console.log(`${colors.cyan}[Fynix SFC]${colors.reset} Generated code for: ${colors.gray}${normalizedId}${colors.reset}`);
|
|
@@ -726,6 +412,7 @@ export default function fynixPlugin(options = {}) {
|
|
|
726
412
|
console.log(`${colors.cyan}${"=".repeat(80)}${colors.reset}\n`);
|
|
727
413
|
}
|
|
728
414
|
shouldTypeCheck = typeCheck && parsed.logicLang === "ts";
|
|
415
|
+
loader = parsed.logicLang === "ts" ? "tsx" : "jsx";
|
|
729
416
|
if (shouldTypeCheck && typeChecker) {
|
|
730
417
|
const virtualFileName = normalizedId.replace(/\.fnx$/, ".virtual.tsx");
|
|
731
418
|
typeChecker.addFile(virtualFileName, codeToTransform);
|
|
@@ -769,12 +456,9 @@ export default function fynixPlugin(options = {}) {
|
|
|
769
456
|
}
|
|
770
457
|
}
|
|
771
458
|
}
|
|
772
|
-
if (codeToTransform.length > 5242880) {
|
|
773
|
-
throw new Error(`Transformed code exceeds size limit for ${normalizedId}`);
|
|
774
|
-
}
|
|
775
459
|
const result = await transform(codeToTransform, {
|
|
776
460
|
loader,
|
|
777
|
-
jsxFactory
|
|
461
|
+
jsxFactory,
|
|
778
462
|
jsxFragment,
|
|
779
463
|
sourcemap,
|
|
780
464
|
sourcefile: id,
|
|
@@ -822,32 +506,26 @@ export default function fynixPlugin(options = {}) {
|
|
|
822
506
|
}
|
|
823
507
|
return undefined;
|
|
824
508
|
},
|
|
825
|
-
config(
|
|
826
|
-
config
|
|
827
|
-
config.optimizeDeps.extensions = config.optimizeDeps.extensions || [];
|
|
828
|
-
if (!config.optimizeDeps.extensions.includes(".fnx")) {
|
|
829
|
-
config.optimizeDeps.extensions.push(".fnx");
|
|
830
|
-
}
|
|
831
|
-
const additionalConfig = {
|
|
509
|
+
config() {
|
|
510
|
+
const config = {
|
|
832
511
|
esbuild: {
|
|
833
|
-
jsxFactory
|
|
834
|
-
jsxFragment
|
|
835
|
-
jsxInject: `import { ${
|
|
512
|
+
jsxFactory,
|
|
513
|
+
jsxFragment,
|
|
514
|
+
jsxInject: `import { ${jsxFactory} } from '@fynixorg/ui'`,
|
|
836
515
|
},
|
|
837
516
|
optimizeDeps: {
|
|
838
517
|
include: ["@fynixorg/ui"],
|
|
839
518
|
esbuildOptions: {
|
|
840
519
|
jsx: "transform",
|
|
841
|
-
jsxFactory
|
|
842
|
-
jsxFragment
|
|
520
|
+
jsxFactory,
|
|
521
|
+
jsxFragment,
|
|
843
522
|
},
|
|
844
|
-
...config.optimizeDeps,
|
|
845
523
|
},
|
|
846
524
|
resolve: {
|
|
847
525
|
extensions: [".fnx", ".ts", ".tsx", ".js", ".jsx", ".json"],
|
|
848
526
|
},
|
|
849
527
|
};
|
|
850
|
-
return
|
|
528
|
+
return config;
|
|
851
529
|
},
|
|
852
530
|
buildStart() {
|
|
853
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, \"&\")\r\n .replace(/</g, \"<\")\r\n .replace(/>/g, \">\")\r\n .replace(/\"/g, \""\")\r\n .replace(/'/g, \"'\")\r\n .replace(/\\//g, \"/\")\r\n .replace(/`/g, \"`\")\r\n .replace(/=/g, \"=\");\r\n}\r\n\r\n/**\r\n * Sanitize CSS content to prevent injection\r\n */\r\nfunction sanitizeCSS(css: string): string {\r\n if (typeof css !== \"string\") return \"\";\r\n\r\n // Remove dangerous CSS constructs\r\n return css\r\n .replace(/javascript:/gi, \"\")\r\n .replace(/vbscript:/gi, \"\")\r\n .replace(/data:/gi, \"\")\r\n .replace(/expression\\s*\\(/gi, \"\")\r\n .replace(/@import/gi, \"\")\r\n .replace(/url\\s*\\(/gi, \"\")\r\n .replace(/behavior\\s*:/gi, \"\");\r\n}\r\n\r\n/**\r\n * Validate and sanitize file paths\r\n */\r\nfunction sanitizePath(path: string): string {\r\n if (typeof path !== \"string\") return \"\";\r\n\r\n // Remove dangerous path components\r\n return path\r\n .replace(/\\.\\./g, \"\") // Remove parent directory references\r\n .replace(/~/g, \"\") // Remove home directory references\r\n .replace(/\\\\+/g, \"/\") // Normalize slashes\r\n .replace(/\\/+/g, \"/\") // Remove duplicate slashes\r\n .replace(/^\\//g, \"\") // Remove leading slash\r\n .replace(/\\/$/, \"\"); // Remove trailing slash\r\n}\r\n\r\n/**\r\n * Validate template literal content for safety\r\n */\r\nfunction validateTemplateContent(content: string): string {\r\n if (typeof content !== \"string\") return \"\";\r\n\r\n // Only check for the most dangerous patterns in SFC files\r\n // Skip this validation for regular .ts/.js files\r\n const dangerousPatterns = [\r\n /eval\\s*\\(/gi, // eval calls\r\n /Function\\s*\\(/gi, // Function constructor\r\n /<script[^>]*>.*?<\\/script>/gis, // Script tags with content\r\n /javascript:\\s*[^\"'\\s]/gi, // JavaScript protocol (not in quotes)\r\n /vbscript:\\s*[^\"'\\s]/gi, // VBScript protocol (not in quotes)\r\n /data:\\s*text\\/html/gi, // Data URLs with HTML\r\n ];\r\n\r\n for (const pattern of dangerousPatterns) {\r\n if (pattern.test(content)) {\r\n console.warn(\r\n `[Security] Blocked dangerous pattern in template: ${pattern}`\r\n );\r\n return \"\";\r\n }\r\n }\r\n\r\n return content;\r\n}\r\n\r\n/**\r\n * ANSI color codes for terminal output\r\n */\r\nconst colors = {\r\n reset: \"\\x1b[0m\",\r\n red: \"\\x1b[31m\",\r\n green: \"\\x1b[32m\",\r\n yellow: \"\\x1b[33m\",\r\n blue: \"\\x1b[34m\",\r\n magenta: \"\\x1b[35m\",\r\n cyan: \"\\x1b[36m\",\r\n gray: \"\\x1b[90m\",\r\n bold: \"\\x1b[1m\",\r\n};\r\n\r\n/**\r\n * Vite plugin options for Fynix with SFC support\r\n */\r\ninterface FynixPluginOptions {\r\n /**\r\n * JSX factory function name\r\n * @default \"Fynix\"\r\n */\r\n jsxFactory?: string;\r\n\r\n /**\r\n * JSX fragment factory name\r\n * @default \"Fynix.Fragment\"\r\n */\r\n jsxFragment?: string;\r\n\r\n /**\r\n * File extensions to transform\r\n * @default [\".ts\", \".js\", \".jsx\", \".tsx\", \".fnx\"]\r\n */\r\n include?: string[];\r\n\r\n /**\r\n * Paths to exclude from transformation\r\n * @default [\"node_modules\"]\r\n */\r\n exclude?: string[];\r\n\r\n /**\r\n * Enable source maps\r\n * @default true\r\n */\r\n sourcemap?: boolean;\r\n\r\n /**\r\n * Custom esbuild transform options\r\n */\r\n esbuildOptions?: Partial<TransformOptions>;\r\n\r\n /**\r\n * Enable SFC parsing for .fnx files\r\n * @default true\r\n */\r\n enableSFC?: boolean;\r\n\r\n /**\r\n * Enable debug logging\r\n * @default false\r\n */\r\n debug?: boolean;\r\n\r\n /**\r\n * Show generated code in console (useful for debugging SFC transformation)\r\n * @default false\r\n */\r\n showGeneratedCode?: boolean;\r\n\r\n /**\r\n * Enable TypeScript type checking (slower but catches type errors)\r\n * @default false\r\n */\r\n typeCheck?: boolean;\r\n\r\n /**\r\n * TypeScript compiler options override\r\n */\r\n tsConfig?: ts.CompilerOptions;\r\n}\r\n\r\n/**\r\n * Extended context type that includes Vite's transform context methods\r\n */\r\ninterface TransformContext {\r\n addWatchFile?: (id: string) => void;\r\n error?: (error: { message: string; stack?: string; id?: string }) => void;\r\n}\r\n\r\n/**\r\n * Parsed SFC sections\r\n */\r\ninterface SFCParsedResult {\r\n logic: string;\r\n view: string;\r\n style: string;\r\n logicLang: \"js\" | \"ts\";\r\n hasLogic: boolean;\r\n hasView: boolean;\r\n hasStyle: boolean;\r\n isStyleScoped: boolean;\r\n imports: string[];\r\n exports: string[];\r\n}\r\n\r\n/**\r\n * Parse a Fynix SFC file (.fnx) - Secured version\r\n */\r\nfunction parseSFC(source: string): SFCParsedResult {\r\n // Validate input\r\n if (typeof source !== \"string\" || source.length > 1000000) {\r\n // 1MB limit\r\n throw new Error(\"Invalid or excessively large SFC source\");\r\n }\r\n\r\n // Check for dangerous content before processing\r\n const sanitizedSource = validateTemplateContent(source);\r\n if (!sanitizedSource) {\r\n throw new Error(\"SFC contains potentially dangerous content\");\r\n }\r\n\r\n const result: SFCParsedResult = {\r\n logic: \"\",\r\n view: \"\",\r\n style: \"\",\r\n logicLang: \"ts\",\r\n hasLogic: false,\r\n hasView: false,\r\n hasStyle: false,\r\n isStyleScoped: false,\r\n imports: [],\r\n exports: [],\r\n };\r\n\r\n // Parse <logic> block with setup attribute - with validation\r\n const logicMatch = sanitizedSource.match(\r\n /<logic\\s+setup\\s*=\\s*[\"']?(ts|js)[\"']?\\s*>([\\s\\S]*?)<\\/logic>/i\r\n );\r\n\r\n if (logicMatch && logicMatch[1] && logicMatch[2] !== undefined) {\r\n result.hasLogic = true;\r\n result.logicLang = logicMatch[1].toLowerCase() as \"js\" | \"ts\";\r\n const rawLogic = logicMatch[2].trim();\r\n\r\n // Validate logic content\r\n if (rawLogic.length > 100000) {\r\n // 100KB limit for logic\r\n throw new Error(\"Logic block exceeds size limit\");\r\n }\r\n\r\n // Extract imports, exports, and other logic (multi-line export support)\r\n const logicLines = rawLogic.split(\"\\n\");\r\n const imports: string[] = [];\r\n const exports: string[] = [];\r\n const otherLogic: string[] = [];\r\n let inExportBlock = false;\r\n let exportBuffer: string[] = [];\r\n let exportBraceDepth = 0;\r\n\r\n for (let i = 0; i < logicLines.length; i++) {\r\n const line: string = logicLines[i] ?? \"\";\r\n const trimmed: string = line.trim();\r\n\r\n // Security: Validate each line\r\n if (validateTemplateContent(line) === \"\") {\r\n console.warn(\r\n `[Security] Skipped potentially dangerous line in logic block`\r\n );\r\n continue;\r\n }\r\n\r\n if (inExportBlock) {\r\n exportBuffer.push(line);\r\n // Count braces to handle nested objects\r\n const openBraces = ((line && line.match(/{/g)) || []).length;\r\n const closeBraces = ((line && line.match(/}/g)) || []).length;\r\n exportBraceDepth += openBraces - closeBraces;\r\n if (exportBraceDepth <= 0) {\r\n exports.push(exportBuffer.join(\"\\n\"));\r\n exportBuffer = [];\r\n inExportBlock = false;\r\n exportBraceDepth = 0;\r\n }\r\n continue;\r\n }\r\n if (trimmed.startsWith(\"import \")) {\r\n imports.push(line ?? \"\");\r\n } else if (trimmed.startsWith(\"export \")) {\r\n // Check if this is a multi-line export (object or function)\r\n if (/export\\s+\\w+\\s*=\\s*{/.test(trimmed) || trimmed.endsWith(\"{\")) {\r\n inExportBlock = true;\r\n exportBuffer = [line];\r\n // Count braces in the first line\r\n exportBraceDepth =\r\n ((line && line.match(/{/g)) || []).length -\r\n ((line && line.match(/}/g)) || []).length;\r\n if (exportBraceDepth <= 0) {\r\n exports.push(exportBuffer.join(\"\\n\"));\r\n exportBuffer = [];\r\n inExportBlock = false;\r\n exportBraceDepth = 0;\r\n }\r\n } else {\r\n exports.push(line ?? \"\");\r\n }\r\n } else if (trimmed) {\r\n otherLogic.push(line ?? \"\");\r\n }\r\n }\r\n\r\n // If file ends while still in export block, flush buffer\r\n if (exportBuffer.length > 0) {\r\n exports.push(exportBuffer.join(\"\\n\"));\r\n }\r\n\r\n result.imports = imports;\r\n result.exports = exports;\r\n result.logic = otherLogic.join(\"\\n\");\r\n }\r\n\r\n // Parse <view> block - with validation\r\n const viewMatch = sanitizedSource.match(/<view\\s*>([\\s\\S]*?)<\\/view>/i);\r\n if (viewMatch && viewMatch[1] !== undefined) {\r\n const viewContent = viewMatch[1].trim();\r\n\r\n // Validate view content size\r\n if (viewContent.length > 50000) {\r\n // 50KB limit for view\r\n throw new Error(\"View block exceeds size limit\");\r\n }\r\n\r\n result.hasView = true;\r\n result.view = viewContent;\r\n }\r\n\r\n // Parse <style> block with optional scoped attribute - with validation\r\n const styleMatch = sanitizedSource.match(\r\n /<style(\\s+scoped)?\\s*>([\\s\\S]*?)<\\/style>/i\r\n );\r\n if (styleMatch && styleMatch[2] !== undefined) {\r\n const styleContent = styleMatch[2].trim();\r\n\r\n // Validate and sanitize style content\r\n if (styleContent.length > 100000) {\r\n // 100KB limit for styles\r\n throw new Error(\"Style block exceeds size limit\");\r\n }\r\n\r\n result.hasStyle = true;\r\n result.isStyleScoped = !!styleMatch[1];\r\n result.style = sanitizeCSS(styleContent);\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Generate a secure style ID for scoped styles\r\n */\r\nfunction generateStyleId(filePath: string): string {\r\n // Sanitize the file path first\r\n const safePath = sanitizePath(filePath);\r\n\r\n // Use a more secure hash function if crypto is available\r\n if (typeof crypto !== \"undefined\" && crypto.subtle) {\r\n // For build-time, we'll use a deterministic but secure approach\r\n const encoder = new TextEncoder();\r\n const data = encoder.encode(safePath + Date.now());\r\n // Use the encoded data for additional entropy in the hash\r\n let dataHash = 0;\r\n for (let i = 0; i < data.length; i++) {\r\n const byte = data[i];\r\n if (byte !== undefined) {\r\n dataHash = (dataHash << 5) - dataHash + byte;\r\n dataHash = dataHash & dataHash;\r\n }\r\n }\r\n // Incorporate data hash into the main hash\r\n const combinedInput = safePath + \"_security_salt_\" + dataHash;\r\n let hash = 0;\r\n for (let i = 0; i < combinedInput.length; i++) {\r\n const char = combinedInput.charCodeAt(i);\r\n hash = (hash << 5) - hash + char;\r\n hash = hash & hash;\r\n }\r\n const timestamp = Date.now().toString(36);\r\n const hashStr = Math.abs(hash).toString(36);\r\n return sanitizeIdentifier(`fynix-${hashStr}-${timestamp}`);\r\n }\r\n\r\n let hash = 0;\r\n const input = safePath + \"_security_salt\";\r\n\r\n for (let i = 0; i < input.length; i++) {\r\n const char = input.charCodeAt(i);\r\n hash = (hash << 5) - hash + char;\r\n hash = hash & hash; // Convert to 32-bit integer\r\n }\r\n\r\n // Add timestamp to prevent collisions\r\n const timestamp = Date.now().toString(36);\r\n const hashStr = Math.abs(hash).toString(36);\r\n\r\n return sanitizeIdentifier(`fynix-${hashStr}-${timestamp}`);\r\n}\r\n\r\n/**\r\n * Scope CSS styles by adding data attribute selector\r\n * Fixed to properly handle keyframes with scoped styles\r\n */\r\nfunction scopeStyles(css: string, scopeId: string): string {\r\n const dataAttr = `[data-${scopeId}]`;\r\n const keyframeMap = new Map<string, string>();\r\n const keyframes: string[] = [];\r\n\r\n // 1. Extract & rename @keyframes (store safely)\r\n css = css.replace(\r\n /@keyframes\\s+([a-zA-Z0-9_-]+)\\s*\\{[\\s\\S]*?\\}/g,\r\n (block, name) => {\r\n const scopedName = `${name}-${scopeId}`;\r\n keyframeMap.set(name, scopedName);\r\n const renamed = block.replace(\r\n new RegExp(`@keyframes\\\\s+${name}`),\r\n `@keyframes ${scopedName}`\r\n );\r\n const index = keyframes.push(renamed) - 1;\r\n return `__KEYFRAMES_${index}__`;\r\n }\r\n );\r\n\r\n // 2. Rewrite animation references\r\n keyframeMap.forEach((scoped, original) => {\r\n const re = new RegExp(\r\n `(animation(?:-name)?\\\\s*:[^;]*?)\\\\b${original}\\\\b`,\r\n \"g\"\r\n );\r\n css = css.replace(re, `$1${scoped}`);\r\n });\r\n\r\n // 3. Scope normal selectors\r\n // Find the root class from the first element in the view (e.g., r-class=\"page\")\r\n let rootClass = null;\r\n try {\r\n const viewMatch = css.match(/\\.(\\w+)[^{]*\\{/);\r\n if (viewMatch) {\r\n rootClass = viewMatch[1];\r\n }\r\n } catch {}\r\n\r\n css = css.replace(/([^{}]+)\\{([^{}]*)\\}/g, (match, selector, rules) => {\r\n if (selector.trim().startsWith(\"@\")) return match;\r\n\r\n const scopedSelectors = selector\r\n .split(\",\")\r\n .map((s: string) => {\r\n const sel = s.trim();\r\n // If selector is exactly the root class (with optional pseudo-classes), rewrite as [data-xxx][pseudo]\r\n if (rootClass) {\r\n const rootRe = new RegExp(\r\n `^\\\\.${rootClass}((:[\\\\w-]+)*|(::[\\\\w-]+)*)?$`\r\n );\r\n const pseudo = sel.replace(new RegExp(`^\\\\.${rootClass}`), \"\");\r\n if (rootRe.test(sel)) {\r\n return `${dataAttr}${pseudo}`;\r\n }\r\n }\r\n // Otherwise, prepend data attribute as ancestor\r\n return `${dataAttr} ${sel}`;\r\n })\r\n .join(\", \");\r\n return `${scopedSelectors}{${rules}}`;\r\n });\r\n\r\n // 4. Restore keyframes\r\n keyframes.forEach((kf, i) => {\r\n css = css.replace(`__KEYFRAMES_${i}__`, kf);\r\n });\r\n\r\n return css;\r\n}\r\n\r\n/**\r\n * Transform SFC to component code - Secured version\r\n */\r\nfunction transformSFC(\r\n parsed: SFCParsedResult,\r\n filePath: string,\r\n jsxFactory: string\r\n): string {\r\n // Validate inputs\r\n if (!parsed || typeof parsed !== \"object\") {\r\n throw new Error(\"Invalid parsed SFC result\");\r\n }\r\n\r\n const safeFilePath = sanitizePath(filePath);\r\n const safeJsxFactory = sanitizeIdentifier(jsxFactory);\r\n\r\n if (!safeJsxFactory) {\r\n throw new Error(\"Invalid JSX factory name\");\r\n }\r\n\r\n const styleId = generateStyleId(safeFilePath);\r\n const lines: string[] = [];\r\n\r\n // Secure import statement\r\n lines.push(`import { ${safeJsxFactory} } from '@fynixorg/ui';`);\r\n\r\n if (parsed.imports.length > 0) {\r\n // Validate and sanitize each import\r\n parsed.imports.forEach((importLine) => {\r\n const validatedImport = validateTemplateContent(importLine);\r\n if (validatedImport) {\r\n lines.push(validatedImport);\r\n }\r\n });\r\n }\r\n\r\n lines.push(\"\");\r\n\r\n if (parsed.hasStyle) {\r\n let processedStyle = sanitizeCSS(parsed.style);\r\n\r\n if (parsed.isStyleScoped) {\r\n processedStyle = scopeStyles(processedStyle, styleId);\r\n }\r\n\r\n // Secure style injection - use JSON.stringify to prevent injection\r\n lines.push(`// Inject styles`);\r\n lines.push(`if (typeof document !== 'undefined') {`);\r\n lines.push(` const styleId = ${JSON.stringify(styleId)};`);\r\n lines.push(` if (!document.getElementById(styleId)) {`);\r\n lines.push(` const styleEl = document.createElement('style');`);\r\n lines.push(` styleEl.id = styleId;`);\r\n lines.push(` styleEl.textContent = ${JSON.stringify(processedStyle)};`);\r\n lines.push(` document.head.appendChild(styleEl);`);\r\n lines.push(` }`);\r\n lines.push(`}`);\r\n lines.push(\"\");\r\n }\r\n\r\n // Add exports BEFORE component (module-level) - with validation\r\n if (parsed.exports.length > 0) {\r\n parsed.exports.forEach((exportLine) => {\r\n const validatedExport = validateTemplateContent(exportLine);\r\n if (validatedExport) {\r\n lines.push(validatedExport);\r\n }\r\n });\r\n lines.push(\"\");\r\n }\r\n\r\n // Use type-safe props if Props interface is declared\r\n let propsType = \"any\";\r\n const propsInterfaceRegex = /interface\\s+Props\\s*{[\\s\\S]*?}/m;\r\n if (propsInterfaceRegex.test(parsed.logic)) {\r\n propsType = \"Props\";\r\n }\r\n\r\n lines.push(`function FynixComponent(props: ${propsType} = {}) {`);\r\n\r\n if (parsed.hasLogic && parsed.logic.trim()) {\r\n lines.push(` // Component logic`);\r\n const logicLines = parsed.logic.split(\"\\n\");\r\n logicLines.forEach((line) => {\r\n const validatedLine = validateTemplateContent(line);\r\n if (validatedLine && validatedLine.trim()) {\r\n lines.push(` ${validatedLine}`);\r\n }\r\n });\r\n lines.push(\"\");\r\n }\r\n\r\n // Secure meta tag injection with proper escaping\r\n if (parsed.exports.some((e) => e.trim().startsWith(\"export const meta\"))) {\r\n lines.push(\r\n ` if (typeof document !== \"undefined\" && typeof meta !== \"undefined\") {`\r\n );\r\n lines.push(` if (meta.title) {`);\r\n lines.push(` // Import the escapeHTML function for secure processing`);\r\n lines.push(` const escapeHTML = ${escapeHTML.toString()};`);\r\n lines.push(\r\n ` const safeTitle = escapeHTML(String(meta.title)).substring(0, 60);`\r\n );\r\n lines.push(` document.title = safeTitle;`);\r\n lines.push(` }`);\r\n lines.push(` const _meta = meta as any;`);\r\n lines.push(` const escapeHTML = ${escapeHTML.toString()};`); // Make function available\r\n lines.push(` const metaTags = [`);\r\n lines.push(\r\n ` _meta.description ? { name: \"description\", content: escapeHTML(String(_meta.description || '')).substring(0, 300) } : null,`\r\n );\r\n lines.push(\r\n ` _meta.keywords ? { name: \"keywords\", content: escapeHTML(String(_meta.keywords || '')).substring(0, 200) } : null,`\r\n );\r\n lines.push(\r\n ` _meta.ogTitle ? { property: \"og:title\", content: escapeHTML(String(_meta.ogTitle || '')).substring(0, 60) } : null,`\r\n );\r\n lines.push(\r\n ` _meta.ogDescription ? { property: \"og:description\", content: escapeHTML(String(_meta.ogDescription || '')).substring(0, 300) } : null,`\r\n );\r\n lines.push(\r\n ` _meta.ogImage ? { property: \"og:image\", content: escapeHTML(String(_meta.ogImage || '')).substring(0, 500) } : null,`\r\n );\r\n lines.push(` ].filter(Boolean);`);\r\n lines.push(` metaTags.forEach((tagObj) => {`);\r\n lines.push(` if (!tagObj) return;`);\r\n lines.push(` const { name, property, content } = tagObj;`);\r\n lines.push(` if (!content || typeof content !== 'string') return;`);\r\n lines.push(` let tag;`);\r\n lines.push(` if (name) {`);\r\n lines.push(` const safeName = name.replace(/[^a-zA-Z0-9-_]/g, '');`);\r\n lines.push(` if (!safeName) return;`);\r\n lines.push(\r\n \" tag = document.querySelector(`meta[name='${safeName}']`);\"\r\n );\r\n lines.push(` if (!tag) {`);\r\n lines.push(` tag = document.createElement(\"meta\");`);\r\n lines.push(` tag.setAttribute(\"name\", safeName);`);\r\n lines.push(` document.head.appendChild(tag);`);\r\n lines.push(` }`);\r\n lines.push(` } else if (property) {`);\r\n lines.push(\r\n ` const safeProperty = property.replace(/[^a-zA-Z0-9-_:]/g, '');`\r\n );\r\n lines.push(` if (!safeProperty) return;`);\r\n lines.push(\r\n \" tag = document.querySelector(`meta[property='${safeProperty}']`);\"\r\n );\r\n lines.push(` if (!tag) {`);\r\n lines.push(` tag = document.createElement(\"meta\");`);\r\n lines.push(` tag.setAttribute(\"property\", safeProperty);`);\r\n lines.push(` document.head.appendChild(tag);`);\r\n lines.push(` }`);\r\n lines.push(` }`);\r\n lines.push(` if (tag) {`);\r\n lines.push(\r\n ` // Escape content to prevent XSS using escapeHTML function`\r\n );\r\n lines.push(` tag.setAttribute(\"content\", content);`);\r\n lines.push(` }`);\r\n lines.push(` });`);\r\n lines.push(` }`);\r\n lines.push(\"\");\r\n }\r\n\r\n if (parsed.hasView) {\r\n lines.push(` // Component view`);\r\n\r\n if (parsed.isStyleScoped) {\r\n // Add data attribute to root element - with validation\r\n let viewContent = validateTemplateContent(parsed.view.trim());\r\n\r\n if (!viewContent) {\r\n throw new Error(\"View content contains dangerous patterns\");\r\n }\r\n\r\n const showGeneratedCode =\r\n typeof globalThis !== \"undefined\" &&\r\n (globalThis as any).fynixShowGeneratedCode !== undefined\r\n ? (globalThis as any).fynixShowGeneratedCode\r\n : false;\r\n\r\n if (showGeneratedCode) {\r\n console.log(\r\n `${colors.magenta}[DEBUG] Original view content:${colors.reset}`\r\n );\r\n console.log(viewContent.substring(0, 200));\r\n }\r\n\r\n const tagMatch = viewContent.match(/^(<\\w+)((?:\\s+[^>]*?)?)(\\s*>)/s);\r\n\r\n if (tagMatch) {\r\n const openTag = tagMatch[1];\r\n const attributes = tagMatch[2];\r\n const closingBracket = tagMatch[3];\r\n\r\n if (showGeneratedCode) {\r\n console.log(\r\n `${colors.magenta}[DEBUG] Matched tag:${colors.reset} ${openTag}`\r\n );\r\n }\r\n\r\n // Secure data attribute insertion\r\n const safeDataAttr = sanitizeIdentifier(`data-${styleId}`);\r\n const modifiedStart = `${openTag}${attributes} ${safeDataAttr}=\"\"${closingBracket}`;\r\n const restOfView = viewContent.substring(tagMatch[0].length);\r\n const modifiedView = modifiedStart + restOfView;\r\n\r\n lines.push(` return (`);\r\n const viewLines = modifiedView.split(\"\\n\");\r\n viewLines.forEach((line: string) => {\r\n lines.push(` ${line}`);\r\n });\r\n lines.push(` );`);\r\n } else {\r\n // Fallback: wrap in div if we can't parse\r\n lines.push(` return (`);\r\n lines.push(` <div ${sanitizeIdentifier(`data-${styleId}`)}=\"\">`);\r\n const viewLines = viewContent.split(\"\\n\");\r\n viewLines.forEach((line: string) => {\r\n lines.push(` ${line}`);\r\n });\r\n lines.push(` </div>`);\r\n lines.push(` );`);\r\n }\r\n } else {\r\n const validatedView = validateTemplateContent(parsed.view);\r\n if (!validatedView) {\r\n throw new Error(\"View content contains dangerous patterns\");\r\n }\r\n\r\n lines.push(` return (`);\r\n const viewLines = validatedView.split(\"\\n\");\r\n viewLines.forEach((line: string) => {\r\n lines.push(` ${line}`);\r\n });\r\n lines.push(` );`);\r\n }\r\n } else {\r\n lines.push(` return null;`);\r\n }\r\n\r\n lines.push(`}`);\r\n lines.push(\"\");\r\n\r\n // Export default separately\r\n lines.push(`export default FynixComponent;`);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n\r\n/**\r\n * Validate SFC structure\r\n */\r\nfunction validateSFC(parsed: SFCParsedResult, filePath: string): void {\r\n if (!parsed.hasView) {\r\n throw new Error(\r\n `${colors.red}[Fynix SFC]${colors.reset} Missing <view> block in ${colors.cyan}${filePath}${colors.reset}. Every .fnx file must have a <view> section.`\r\n );\r\n }\r\n\r\n if (parsed.hasLogic && ![\"ts\", \"js\"].includes(parsed.logicLang)) {\r\n throw new Error(\r\n `${colors.red}[Fynix SFC]${colors.reset} Invalid setup attribute in <logic> block in ${colors.cyan}${filePath}${colors.reset}. Must be \"ts\" or \"js\".`\r\n );\r\n }\r\n\r\n if (parsed.hasLogic && parsed.logicLang === \"js\") {\r\n const tsPatterns = [\r\n { pattern: /\\binterface\\s+\\w+/, name: \"interface declaration\" },\r\n { pattern: /\\btype\\s+\\w+\\s*=/, name: \"type alias\" },\r\n { pattern: /:\\s*\\w+(\\[\\]|<[^>]+>)?\\s*[;,=)]/, name: \"type annotation\" },\r\n { pattern: /<\\w+>(?!\\s*<)/, name: \"generic type\" },\r\n { pattern: /\\benum\\s+\\w+/, name: \"enum declaration\" },\r\n { pattern: /\\bas\\s+\\w+/, name: \"type assertion\" },\r\n { pattern: /\\bnamespace\\s+\\w+/, name: \"namespace\" },\r\n { pattern: /\\babstract\\s+class/, name: \"abstract class\" },\r\n {\r\n pattern: /\\bpublic\\s+|private\\s+|protected\\s+/,\r\n name: \"access modifier\",\r\n },\r\n ];\r\n\r\n const allCode = parsed.logic + \"\\n\" + parsed.imports.join(\"\\n\");\r\n\r\n for (const { pattern, name } of tsPatterns) {\r\n if (pattern.test(allCode)) {\r\n throw new Error(\r\n `${colors.red}[Fynix SFC]${colors.reset} TypeScript syntax detected ${colors.yellow}(${name})${colors.reset} in ${colors.cyan}${filePath}${colors.reset} with ${colors.yellow}setup=\"js\"${colors.reset}.\\n` +\r\n `${colors.gray}Either change to setup=\"ts\" or remove TypeScript-specific syntax.${colors.reset}`\r\n );\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Improved type checker with better error handling and virtual file system\r\n */\r\nclass TypeScriptChecker {\r\n private compilerOptions: ts.CompilerOptions;\r\n private virtualFiles: Map<string, string> = new Map();\r\n private program: ts.Program | null = null;\r\n\r\n constructor(customOptions?: ts.CompilerOptions) {\r\n this.compilerOptions = {\r\n noEmit: true,\r\n strict: true, // Changed to true for better type checking\r\n target: ts.ScriptTarget.ESNext,\r\n module: ts.ModuleKind.ESNext,\r\n jsx: ts.JsxEmit.Preserve,\r\n lib: [\"lib.es2023.d.ts\", \"lib.dom.d.ts\"],\r\n moduleResolution: ts.ModuleResolutionKind.Bundler,\r\n esModuleInterop: true,\r\n skipLibCheck: true,\r\n allowSyntheticDefaultImports: true,\r\n strictNullChecks: true, // Changed to true\r\n strictFunctionTypes: true, // Changed to true\r\n noImplicitAny: false,\r\n allowJs: true,\r\n checkJs: false,\r\n resolveJsonModule: true,\r\n isolatedModules: true,\r\n ...customOptions,\r\n };\r\n }\r\n\r\n addFile(fileName: string, content: string): void {\r\n this.virtualFiles.set(fileName, content);\r\n this.program = null;\r\n }\r\n\r\n private createCompilerHost(): ts.CompilerHost {\r\n const defaultHost = ts.createCompilerHost(this.compilerOptions);\r\n\r\n return {\r\n ...defaultHost,\r\n getSourceFile: (fileName, languageVersion) => {\r\n if (this.virtualFiles.has(fileName)) {\r\n const content = this.virtualFiles.get(fileName);\r\n if (content === undefined) return undefined;\r\n return ts.createSourceFile(fileName, content, languageVersion, true);\r\n }\r\n\r\n try {\r\n if (ts.sys.fileExists(fileName)) {\r\n const content = ts.sys.readFile(fileName);\r\n if (content !== undefined) {\r\n return ts.createSourceFile(\r\n fileName,\r\n content,\r\n languageVersion,\r\n true\r\n );\r\n }\r\n }\r\n } catch (err) {\r\n // Silent fail\r\n }\r\n\r\n return undefined;\r\n },\r\n fileExists: (fileName) => {\r\n if (this.virtualFiles.has(fileName)) return true;\r\n return ts.sys.fileExists(fileName);\r\n },\r\n readFile: (fileName) => {\r\n if (this.virtualFiles.has(fileName)) {\r\n const content = this.virtualFiles.get(fileName);\r\n return content === undefined ? undefined : content;\r\n }\r\n const sysContent = ts.sys.readFile(fileName);\r\n return sysContent === undefined ? undefined : sysContent;\r\n },\r\n writeFile: () => {},\r\n };\r\n }\r\n\r\n checkFile(fileName: string): string[] {\r\n const errors: string[] = [];\r\n\r\n try {\r\n if (!this.virtualFiles.has(fileName)) {\r\n return [\"File not found in virtual file system\"];\r\n }\r\n\r\n const compilerHost = this.createCompilerHost();\r\n\r\n if (!this.program) {\r\n this.program = ts.createProgram(\r\n [fileName],\r\n this.compilerOptions,\r\n compilerHost\r\n );\r\n }\r\n\r\n const sourceFile = this.program.getSourceFile(fileName);\r\n if (!sourceFile) {\r\n return [`Could not get source file for ${fileName}`];\r\n }\r\n\r\n const diagnostics = [\r\n ...this.program.getSyntacticDiagnostics(sourceFile),\r\n ...this.program.getSemanticDiagnostics(sourceFile),\r\n ];\r\n\r\n // Only skip module resolution errors, NOT type errors\r\n // This allows proper type checking (2322 = type mismatch, 2345 = argument type error, etc.)\r\n const skipCodes = new Set([\r\n 2307, // Cannot find module\r\n 2792, // Cannot find module (alternative)\r\n 7016, // Could not find declaration file\r\n 7026, // JSX element implicitly has type 'any'\r\n ]);\r\n\r\n diagnostics.forEach((diagnostic) => {\r\n if (skipCodes.has(diagnostic.code)) {\r\n return;\r\n }\r\n\r\n if (diagnostic.file && diagnostic.start !== undefined) {\r\n const pos = diagnostic.file.getLineAndCharacterOfPosition(\r\n diagnostic.start\r\n );\r\n const line = pos?.line ?? 0;\r\n const character = pos?.character ?? 0;\r\n const message = ts.flattenDiagnosticMessageText(\r\n diagnostic.messageText,\r\n \"\\n\"\r\n );\r\n errors.push(\r\n `${colors.yellow}Line ${line + 1}:${character + 1}${colors.reset} - ${message} ${colors.gray}(TS${diagnostic.code})${colors.reset}`\r\n );\r\n } else {\r\n const message = ts.flattenDiagnosticMessageText(\r\n diagnostic.messageText,\r\n \"\\n\"\r\n );\r\n errors.push(\r\n `${message} ${colors.gray}(TS${diagnostic.code})${colors.reset}`\r\n );\r\n }\r\n });\r\n } catch (error) {\r\n errors.push(\r\n `${colors.red}Type checking error:${colors.reset} ${error instanceof Error ? error.message : String(error)}`\r\n );\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n clear(): void {\r\n this.virtualFiles.clear();\r\n this.program = null;\r\n }\r\n}\r\n\r\n/**\r\n * Vite plugin for Fynix framework with improved SFC support\r\n */\r\nexport default function fynixPlugin(options: FynixPluginOptions = {}): any {\r\n const {\r\n jsxFactory = \"Fynix\",\r\n jsxFragment = \"Fynix.Fragment\",\r\n include = [\".ts\", \".js\", \".jsx\", \".tsx\", \".fnx\"],\r\n exclude = [\"node_modules\"],\r\n sourcemap = true,\r\n esbuildOptions = {},\r\n enableSFC = true,\r\n showGeneratedCode = false,\r\n typeCheck = false,\r\n tsConfig,\r\n } = options;\r\n\r\n // Security: Sanitize JSX factory names\r\n const safeJsxFactory = sanitizeIdentifier(jsxFactory);\r\n const safeJsxFragment = sanitizeIdentifier(jsxFragment);\r\n\r\n if (!safeJsxFactory || !safeJsxFragment) {\r\n throw new Error(\"Invalid JSX factory or fragment names provided\");\r\n }\r\n\r\n let typeChecker: TypeScriptChecker | null = null;\r\n\r\n if (typeCheck) {\r\n typeChecker = new TypeScriptChecker(tsConfig);\r\n }\r\n\r\n return {\r\n name: \"vite-plugin-fynix-sfc\",\r\n enforce: \"pre\" as const,\r\n\r\n // Add resolveId to handle .fnx imports properly\r\n async 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\r\n // Properly resolve the path here to avoid issues in load hook\r\n const path = await import(\"path\");\r\n let resolvedPath = id;\r\n\r\n // Handle virtual paths from Vite (starting with /)\r\n if (id.startsWith(\"/\")) {\r\n resolvedPath = path.resolve(process.cwd(), id.substring(1));\r\n } else if (!path.isAbsolute(id)) {\r\n resolvedPath = path.resolve(process.cwd(), id);\r\n }\r\n\r\n return resolvedPath;\r\n }\r\n return null;\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 // The id should already be resolved from resolveId hook\r\n const fs = await import(\"fs\");\r\n let filePath = normalizedId;\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, normalizedId);\r\n const transformedCode = transformSFC(\r\n parsed,\r\n normalizedId,\r\n safeJsxFactory\r\n );\r\n\r\n if (options.showGeneratedCode) {\r\n console.log(`\\n${colors.cyan}${\"=\".repeat(80)}${colors.reset}`);\r\n console.log(\r\n `${colors.cyan}[Fynix SFC]${colors.reset} Generated code for: ${colors.gray}${normalizedId}${colors.reset}`\r\n );\r\n console.log(`${colors.cyan}${\"=\".repeat(80)}${colors.reset}`);\r\n console.log(transformedCode);\r\n console.log(`${colors.cyan}${\"=\".repeat(80)}${colors.reset}\\n`);\r\n }\r\n\r\n // Return the transformed JavaScript code\r\n return transformedCode;\r\n } catch (error) {\r\n console.error(\r\n `${colors.red}[Fynix SFC] Failed to load ${normalizedId}:${colors.reset}`,\r\n error\r\n );\r\n throw error;\r\n }\r\n }\r\n return null;\r\n },\r\n\r\n async transform(code: string, id: string) {\r\n const normalizedId = normalizePath(id);\r\n\r\n // Skip .fnx files as they're already transformed in the load hook\r\n if (normalizedId.endsWith(\".fnx\")) {\r\n return null;\r\n }\r\n\r\n // Security: Validate file path (skip for legitimate files)\r\n const safePath = sanitizePath(normalizedId);\r\n\r\n // Allow .fnx files and other legitimate extensions, block only truly dangerous paths\r\n if (\r\n !safePath ||\r\n (normalizedId.includes(\"..\") && !normalizedId.includes(\"node_modules\"))\r\n ) {\r\n console.warn(\r\n `[Security] Potentially dangerous file path blocked: ${normalizedId}`\r\n );\r\n return null;\r\n }\r\n\r\n // Security: Check file size limit (10MB)\r\n if (code.length > 10485760) {\r\n throw new Error(`File ${normalizedId} exceeds maximum size limit`);\r\n }\r\n\r\n const shouldExclude = exclude.some((pattern) =>\r\n normalizedId.includes(pattern)\r\n );\r\n if (shouldExclude) return null;\r\n\r\n const shouldInclude = include.some((ext) => normalizedId.endsWith(ext));\r\n if (!shouldInclude) return null;\r\n\r\n const ctx = this as unknown as TransformContext;\r\n if (typeof ctx.addWatchFile === \"function\") {\r\n ctx.addWatchFile(id);\r\n }\r\n\r\n try {\r\n let codeToTransform = code;\r\n let loader: TransformOptions[\"loader\"] = \"tsx\";\r\n let shouldTypeCheck = false;\r\n\r\n // Only apply strict security validation to .fnx files\r\n // Regular .ts/.js files should be processed normally\r\n if (normalizedId.endsWith(\".fnx\")) {\r\n const validatedCode = validateTemplateContent(code);\r\n if (!validatedCode) {\r\n throw new Error(\r\n `SFC file contains potentially dangerous content: ${normalizedId}`\r\n );\r\n }\r\n codeToTransform = validatedCode;\r\n } else {\r\n codeToTransform = code;\r\n }\r\n\r\n if (normalizedId.endsWith(\".fnx\") && enableSFC) {\r\n const parsed = parseSFC(codeToTransform);\r\n validateSFC(parsed, normalizedId);\r\n\r\n codeToTransform = transformSFC(parsed, normalizedId, safeJsxFactory);\r\n\r\n if (showGeneratedCode) {\r\n console.log(`\\n${colors.cyan}${\"=\".repeat(80)}${colors.reset}`);\r\n console.log(\r\n `${colors.cyan}[Fynix SFC]${colors.reset} Generated code for: ${colors.gray}${normalizedId}${colors.reset}`\r\n );\r\n console.log(`${colors.cyan}${\"=\".repeat(80)}${colors.reset}`);\r\n console.log(codeToTransform);\r\n console.log(`${colors.cyan}${\"=\".repeat(80)}${colors.reset}\\n`);\r\n }\r\n\r\n shouldTypeCheck = typeCheck && parsed.logicLang === \"ts\";\r\n\r\n if (shouldTypeCheck && typeChecker) {\r\n const virtualFileName = normalizedId.replace(\r\n /\\.fnx$/,\r\n \".virtual.tsx\"\r\n );\r\n typeChecker.addFile(virtualFileName, codeToTransform);\r\n const typeErrors = typeChecker.checkFile(virtualFileName);\r\n\r\n if (typeErrors.length > 0) {\r\n console.error(\r\n `\\n${colors.red}${colors.bold}[Fynix SFC] TypeScript Errors${colors.reset} in ${colors.cyan}${normalizedId}${colors.reset}:`\r\n );\r\n typeErrors.forEach((error) => console.error(` ${error}`));\r\n console.error(\"\");\r\n\r\n if (process.env.NODE_ENV === \"production\") {\r\n throw new Error(`TypeScript errors in ${normalizedId}`);\r\n }\r\n }\r\n\r\n shouldTypeCheck = false;\r\n }\r\n } else {\r\n if (normalizedId.endsWith(\".ts\")) {\r\n loader = \"ts\";\r\n shouldTypeCheck = typeCheck;\r\n } else if (normalizedId.endsWith(\".tsx\")) {\r\n loader = \"tsx\";\r\n shouldTypeCheck = typeCheck;\r\n } else if (normalizedId.endsWith(\".jsx\")) {\r\n loader = \"jsx\";\r\n } else if (normalizedId.endsWith(\".js\")) {\r\n loader = \"js\";\r\n }\r\n }\r\n\r\n if (shouldTypeCheck && typeChecker) {\r\n typeChecker.addFile(normalizedId, codeToTransform);\r\n const typeErrors = typeChecker.checkFile(normalizedId);\r\n\r\n if (typeErrors.length > 0) {\r\n console.error(\r\n `\\n${colors.red}${colors.bold}[Fynix SFC] TypeScript Errors${colors.reset} in ${colors.cyan}${normalizedId}${colors.reset}:`\r\n );\r\n typeErrors.forEach((error) => console.error(` ${error}`));\r\n console.error(\"\");\r\n\r\n if (process.env.NODE_ENV === \"production\") {\r\n throw new Error(`TypeScript errors in ${normalizedId}`);\r\n }\r\n }\r\n }\r\n\r\n // Final security validation before esbuild transform\r\n if (codeToTransform.length > 5242880) {\r\n // 5MB limit for transformed code\r\n throw new Error(\r\n `Transformed code exceeds size limit for ${normalizedId}`\r\n );\r\n }\r\n\r\n const result = await transform(codeToTransform, {\r\n loader,\r\n jsxFactory: safeJsxFactory,\r\n jsxFragment,\r\n sourcemap,\r\n sourcefile: id,\r\n target: \"esnext\",\r\n format: \"esm\",\r\n ...esbuildOptions,\r\n });\r\n\r\n return {\r\n code: result.code,\r\n map: result.map || null,\r\n };\r\n } catch (error) {\r\n const err = error as Error;\r\n console.error(\r\n `\\n${colors.red}${colors.bold}[Fynix SFC] Transform Error${colors.reset} in ${colors.cyan}${id}${colors.reset}:`\r\n );\r\n console.error(` ${colors.red}${err.message}${colors.reset}\\n`);\r\n\r\n const ctx = this as unknown as TransformContext;\r\n if (typeof ctx.error === \"function\") {\r\n ctx.error({\r\n message: `Failed to transform ${id}: ${err.message}`,\r\n stack: err.stack,\r\n id,\r\n });\r\n } else {\r\n throw err;\r\n }\r\n return null;\r\n }\r\n },\r\n\r\n handleHotUpdate(ctx: HmrContext) {\r\n const { file, server } = ctx;\r\n const normalizedFile = normalizePath(file);\r\n const shouldReload = include.some((ext) => normalizedFile.endsWith(ext));\r\n\r\n if (shouldReload) {\r\n console.log(\r\n `${colors.green}[HMR]${colors.reset} ${colors.gray}${normalizedFile}${colors.reset}`\r\n );\r\n\r\n if (typeChecker) {\r\n typeChecker.clear();\r\n }\r\n\r\n server.ws.send({\r\n type: \"full-reload\",\r\n path: \"*\",\r\n });\r\n return [];\r\n }\r\n\r\n return undefined;\r\n },\r\n\r\n config(config: UserConfig) {\r\n // Configure Vite to recognize .fnx files as modules\r\n config.optimizeDeps = config.optimizeDeps || {};\r\n config.optimizeDeps.extensions = config.optimizeDeps.extensions || [];\r\n if (!config.optimizeDeps.extensions.includes(\".fnx\")) {\r\n config.optimizeDeps.extensions.push(\".fnx\");\r\n }\r\n\r\n // Return additional configuration\r\n const additionalConfig: Omit<UserConfig, \"plugins\"> = {\r\n esbuild: {\r\n jsxFactory: safeJsxFactory,\r\n jsxFragment: safeJsxFragment,\r\n jsxInject: `import { ${safeJsxFactory} } from '@fynixorg/ui'`,\r\n },\r\n optimizeDeps: {\r\n include: [\"@fynixorg/ui\"],\r\n esbuildOptions: {\r\n jsx: \"transform\",\r\n jsxFactory: safeJsxFactory,\r\n jsxFragment: safeJsxFragment,\r\n },\r\n ...config.optimizeDeps,\r\n },\r\n resolve: {\r\n extensions: [\".fnx\", \".ts\", \".tsx\", \".js\", \".jsx\", \".json\"],\r\n },\r\n };\r\n\r\n return additionalConfig;\r\n },\r\n\r\n buildStart() {\r\n console.log(\r\n `${colors.cyan}[vite-plugin-fynix-sfc]${colors.reset} Initialized`\r\n );\r\n if (enableSFC) {\r\n console.log(\r\n `${colors.cyan}[vite-plugin-fynix-sfc]${colors.reset} SFC support: ${colors.green}enabled${colors.reset}`\r\n );\r\n }\r\n if (typeCheck) {\r\n console.log(\r\n `${colors.cyan}[vite-plugin-fynix-sfc]${colors.reset} Type checking: ${colors.green}enabled${colors.reset}`\r\n );\r\n }\r\n },\r\n\r\n buildEnd() {\r\n if (typeChecker) {\r\n typeChecker.clear();\r\n }\r\n },\r\n };\r\n}\r\n\r\nexport { fynixPlugin, TypeScriptChecker };\r\nexport type { FynixPluginOptions, SFCParsedResult };\r\n"],
|
|
5
|
-
"mappings": ";;AAuBA,SAAS,iBAAwC;AAEjD,SAAS,qBAAqB;AAC9B,YAAY,QAAQ;AAOpB,SAAS,mBAAmB,YAA4B;AACtD,MAAI,OAAO,eAAe,SAAU,QAAO;AAG3C,QAAM,YAAY,WAAW,QAAQ,mBAAmB,EAAE;AAG1D,MAAI,MAAM,KAAK,SAAS,GAAG;AACzB,WAAO,MAAM;AAAA,EACf;AAGA,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,eAAe,SAAS,SAAS,GAAG;AACtC,WAAO,UAAU;AAAA,EACnB;AAEA,SAAO,aAAa;AACtB;AApCS;AAyCT,SAAS,WAAW,KAAqB;AACvC,MAAI,OAAO,QAAQ,SAAU,QAAO;AAEpC,SAAO,IACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,OAAO,QAAQ,EACvB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAC3B;AAZS;AAiBT,SAAS,YAAY,KAAqB;AACxC,MAAI,OAAO,QAAQ,SAAU,QAAO;AAGpC,SAAO,IACJ,QAAQ,iBAAiB,EAAE,EAC3B,QAAQ,eAAe,EAAE,EACzB,QAAQ,WAAW,EAAE,EACrB,QAAQ,qBAAqB,EAAE,EAC/B,QAAQ,aAAa,EAAE,EACvB,QAAQ,cAAc,EAAE,EACxB,QAAQ,kBAAkB,EAAE;AACjC;AAZS;AAiBT,SAAS,aAAa,MAAsB;AAC1C,MAAI,OAAO,SAAS,SAAU,QAAO;AAGrC,SAAO,KACJ,QAAQ,SAAS,EAAE,EACnB,QAAQ,MAAM,EAAE,EAChB,QAAQ,QAAQ,GAAG,EACnB,QAAQ,QAAQ,GAAG,EACnB,QAAQ,QAAQ,EAAE,EAClB,QAAQ,OAAO,EAAE;AACtB;AAXS;AAgBT,SAAS,wBAAwB,SAAyB;AACxD,MAAI,OAAO,YAAY,SAAU,QAAO;AAIxC,QAAM,oBAAoB;AAAA,IACxB;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA,EACF;AAEA,aAAW,WAAW,mBAAmB;AACvC,QAAI,QAAQ,KAAK,OAAO,GAAG;AACzB,cAAQ;AAAA,QACN,qDAAqD,OAAO;AAAA,MAC9D;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAxBS;AA6BT,MAAM,SAAS;AAAA,EACb,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AAkGA,SAAS,SAAS,QAAiC;AAEjD,MAAI,OAAO,WAAW,YAAY,OAAO,SAAS,KAAS;AAEzD,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAGA,QAAM,kBAAkB,wBAAwB,MAAM;AACtD,MAAI,CAAC,iBAAiB;AACpB,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAEA,QAAM,SAA0B;AAAA,IAC9B,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,eAAe;AAAA,IACf,SAAS,CAAC;AAAA,IACV,SAAS,CAAC;AAAA,EACZ;AAGA,QAAM,aAAa,gBAAgB;AAAA,IACjC;AAAA,EACF;AAEA,MAAI,cAAc,WAAW,CAAC,KAAK,WAAW,CAAC,MAAM,QAAW;AAC9D,WAAO,WAAW;AAClB,WAAO,YAAY,WAAW,CAAC,EAAE,YAAY;AAC7C,UAAM,WAAW,WAAW,CAAC,EAAE,KAAK;AAGpC,QAAI,SAAS,SAAS,KAAQ;AAE5B,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAGA,UAAM,aAAa,SAAS,MAAM,IAAI;AACtC,UAAM,UAAoB,CAAC;AAC3B,UAAM,UAAoB,CAAC;AAC3B,UAAM,aAAuB,CAAC;AAC9B,QAAI,gBAAgB;AACpB,QAAI,eAAyB,CAAC;AAC9B,QAAI,mBAAmB;AAEvB,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,YAAM,OAAe,WAAW,CAAC,KAAK;AACtC,YAAM,UAAkB,KAAK,KAAK;AAGlC,UAAI,wBAAwB,IAAI,MAAM,IAAI;AACxC,gBAAQ;AAAA,UACN;AAAA,QACF;AACA;AAAA,MACF;AAEA,UAAI,eAAe;AACjB,qBAAa,KAAK,IAAI;AAEtB,cAAM,cAAe,QAAQ,KAAK,MAAM,IAAI,KAAM,CAAC,GAAG;AACtD,cAAM,eAAgB,QAAQ,KAAK,MAAM,IAAI,KAAM,CAAC,GAAG;AACvD,4BAAoB,aAAa;AACjC,YAAI,oBAAoB,GAAG;AACzB,kBAAQ,KAAK,aAAa,KAAK,IAAI,CAAC;AACpC,yBAAe,CAAC;AAChB,0BAAgB;AAChB,6BAAmB;AAAA,QACrB;AACA;AAAA,MACF;AACA,UAAI,QAAQ,WAAW,SAAS,GAAG;AACjC,gBAAQ,KAAK,QAAQ,EAAE;AAAA,MACzB,WAAW,QAAQ,WAAW,SAAS,GAAG;AAExC,YAAI,uBAAuB,KAAK,OAAO,KAAK,QAAQ,SAAS,GAAG,GAAG;AACjE,0BAAgB;AAChB,yBAAe,CAAC,IAAI;AAEpB,8BACI,QAAQ,KAAK,MAAM,IAAI,KAAM,CAAC,GAAG,UACjC,QAAQ,KAAK,MAAM,IAAI,KAAM,CAAC,GAAG;AACrC,cAAI,oBAAoB,GAAG;AACzB,oBAAQ,KAAK,aAAa,KAAK,IAAI,CAAC;AACpC,2BAAe,CAAC;AAChB,4BAAgB;AAChB,+BAAmB;AAAA,UACrB;AAAA,QACF,OAAO;AACL,kBAAQ,KAAK,QAAQ,EAAE;AAAA,QACzB;AAAA,MACF,WAAW,SAAS;AAClB,mBAAW,KAAK,QAAQ,EAAE;AAAA,MAC5B;AAAA,IACF;AAGA,QAAI,aAAa,SAAS,GAAG;AAC3B,cAAQ,KAAK,aAAa,KAAK,IAAI,CAAC;AAAA,IACtC;AAEA,WAAO,UAAU;AACjB,WAAO,UAAU;AACjB,WAAO,QAAQ,WAAW,KAAK,IAAI;AAAA,EACrC;AAGA,QAAM,YAAY,gBAAgB,MAAM,8BAA8B;AACtE,MAAI,aAAa,UAAU,CAAC,MAAM,QAAW;AAC3C,UAAM,cAAc,UAAU,CAAC,EAAE,KAAK;AAGtC,QAAI,YAAY,SAAS,KAAO;AAE9B,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AAEA,WAAO,UAAU;AACjB,WAAO,OAAO;AAAA,EAChB;AAGA,QAAM,aAAa,gBAAgB;AAAA,IACjC;AAAA,EACF;AACA,MAAI,cAAc,WAAW,CAAC,MAAM,QAAW;AAC7C,UAAM,eAAe,WAAW,CAAC,EAAE,KAAK;AAGxC,QAAI,aAAa,SAAS,KAAQ;AAEhC,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,WAAO,WAAW;AAClB,WAAO,gBAAgB,CAAC,CAAC,WAAW,CAAC;AACrC,WAAO,QAAQ,YAAY,YAAY;AAAA,EACzC;AAEA,SAAO;AACT;AAlJS;AAuJT,SAAS,gBAAgB,UAA0B;AAEjD,QAAM,WAAW,aAAa,QAAQ;AAGtC,MAAI,OAAO,WAAW,eAAe,OAAO,QAAQ;AAElD,UAAM,UAAU,IAAI,YAAY;AAChC,UAAM,OAAO,QAAQ,OAAO,WAAW,KAAK,IAAI,CAAC;AAEjD,QAAI,WAAW;AACf,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,OAAO,KAAK,CAAC;AACnB,UAAI,SAAS,QAAW;AACtB,oBAAY,YAAY,KAAK,WAAW;AACxC,mBAAW,WAAW;AAAA,MACxB;AAAA,IACF;AAEA,UAAM,gBAAgB,WAAW,oBAAoB;AACrD,QAAIA,QAAO;AACX,aAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,YAAM,OAAO,cAAc,WAAW,CAAC;AACvC,MAAAA,SAAQA,SAAQ,KAAKA,QAAO;AAC5B,MAAAA,QAAOA,QAAOA;AAAA,IAChB;AACA,UAAMC,aAAY,KAAK,IAAI,EAAE,SAAS,EAAE;AACxC,UAAMC,WAAU,KAAK,IAAIF,KAAI,EAAE,SAAS,EAAE;AAC1C,WAAO,mBAAmB,SAASE,QAAO,IAAID,UAAS,EAAE;AAAA,EAC3D;AAEA,MAAI,OAAO;AACX,QAAM,QAAQ,WAAW;AAEzB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,WAAW,CAAC;AAC/B,YAAQ,QAAQ,KAAK,OAAO;AAC5B,WAAO,OAAO;AAAA,EAChB;AAGA,QAAM,YAAY,KAAK,IAAI,EAAE,SAAS,EAAE;AACxC,QAAM,UAAU,KAAK,IAAI,IAAI,EAAE,SAAS,EAAE;AAE1C,SAAO,mBAAmB,SAAS,OAAO,IAAI,SAAS,EAAE;AAC3D;AA7CS;AAmDT,SAAS,YAAY,KAAa,SAAyB;AACzD,QAAM,WAAW,SAAS,OAAO;AACjC,QAAM,cAAc,oBAAI,IAAoB;AAC5C,QAAM,YAAsB,CAAC;AAG7B,QAAM,IAAI;AAAA,IACR;AAAA,IACA,CAAC,OAAO,SAAS;AACf,YAAM,aAAa,GAAG,IAAI,IAAI,OAAO;AACrC,kBAAY,IAAI,MAAM,UAAU;AAChC,YAAM,UAAU,MAAM;AAAA,QACpB,IAAI,OAAO,iBAAiB,IAAI,EAAE;AAAA,QAClC,cAAc,UAAU;AAAA,MAC1B;AACA,YAAM,QAAQ,UAAU,KAAK,OAAO,IAAI;AACxC,aAAO,eAAe,KAAK;AAAA,IAC7B;AAAA,EACF;AAGA,cAAY,QAAQ,CAAC,QAAQ,aAAa;AACxC,UAAM,KAAK,IAAI;AAAA,MACb,sCAAsC,QAAQ;AAAA,MAC9C;AAAA,IACF;AACA,UAAM,IAAI,QAAQ,IAAI,KAAK,MAAM,EAAE;AAAA,EACrC,CAAC;AAID,MAAI,YAAY;AAChB,MAAI;AACF,UAAM,YAAY,IAAI,MAAM,gBAAgB;AAC5C,QAAI,WAAW;AACb,kBAAY,UAAU,CAAC;AAAA,IACzB;AAAA,EACF,QAAQ;AAAA,EAAC;AAET,QAAM,IAAI,QAAQ,yBAAyB,CAAC,OAAO,UAAU,UAAU;AACrE,QAAI,SAAS,KAAK,EAAE,WAAW,GAAG,EAAG,QAAO;AAE5C,UAAM,kBAAkB,SACrB,MAAM,GAAG,EACT,IAAI,CAAC,MAAc;AAClB,YAAM,MAAM,EAAE,KAAK;AAEnB,UAAI,WAAW;AACb,cAAM,SAAS,IAAI;AAAA,UACjB,OAAO,SAAS;AAAA,QAClB;AACA,cAAM,SAAS,IAAI,QAAQ,IAAI,OAAO,OAAO,SAAS,EAAE,GAAG,EAAE;AAC7D,YAAI,OAAO,KAAK,GAAG,GAAG;AACpB,iBAAO,GAAG,QAAQ,GAAG,MAAM;AAAA,QAC7B;AAAA,MACF;AAEA,aAAO,GAAG,QAAQ,IAAI,GAAG;AAAA,IAC3B,CAAC,EACA,KAAK,IAAI;AACZ,WAAO,GAAG,eAAe,IAAI,KAAK;AAAA,EACpC,CAAC;AAGD,YAAU,QAAQ,CAAC,IAAI,MAAM;AAC3B,UAAM,IAAI,QAAQ,eAAe,CAAC,MAAM,EAAE;AAAA,EAC5C,CAAC;AAED,SAAO;AACT;AArES;AA0ET,SAAS,aACP,QACA,UACA,YACQ;AAER,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AAEA,QAAM,eAAe,aAAa,QAAQ;AAC1C,QAAM,iBAAiB,mBAAmB,UAAU;AAEpD,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AAEA,QAAM,UAAU,gBAAgB,YAAY;AAC5C,QAAM,QAAkB,CAAC;AAGzB,QAAM,KAAK,YAAY,cAAc,yBAAyB;AAE9D,MAAI,OAAO,QAAQ,SAAS,GAAG;AAE7B,WAAO,QAAQ,QAAQ,CAAC,eAAe;AACrC,YAAM,kBAAkB,wBAAwB,UAAU;AAC1D,UAAI,iBAAiB;AACnB,cAAM,KAAK,eAAe;AAAA,MAC5B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,KAAK,EAAE;AAEb,MAAI,OAAO,UAAU;AACnB,QAAI,iBAAiB,YAAY,OAAO,KAAK;AAE7C,QAAI,OAAO,eAAe;AACxB,uBAAiB,YAAY,gBAAgB,OAAO;AAAA,IACtD;AAGA,UAAM,KAAK,kBAAkB;AAC7B,UAAM,KAAK,wCAAwC;AACnD,UAAM,KAAK,qBAAqB,KAAK,UAAU,OAAO,CAAC,GAAG;AAC1D,UAAM,KAAK,4CAA4C;AACvD,UAAM,KAAK,sDAAsD;AACjE,UAAM,KAAK,2BAA2B;AACtC,UAAM,KAAK,6BAA6B,KAAK,UAAU,cAAc,CAAC,GAAG;AACzE,UAAM,KAAK,yCAAyC;AACpD,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,GAAG;AACd,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,MAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,WAAO,QAAQ,QAAQ,CAAC,eAAe;AACrC,YAAM,kBAAkB,wBAAwB,UAAU;AAC1D,UAAI,iBAAiB;AACnB,cAAM,KAAK,eAAe;AAAA,MAC5B;AAAA,IACF,CAAC;AACD,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,MAAI,YAAY;AAChB,QAAM,sBAAsB;AAC5B,MAAI,oBAAoB,KAAK,OAAO,KAAK,GAAG;AAC1C,gBAAY;AAAA,EACd;AAEA,QAAM,KAAK,kCAAkC,SAAS,UAAU;AAEhE,MAAI,OAAO,YAAY,OAAO,MAAM,KAAK,GAAG;AAC1C,UAAM,KAAK,sBAAsB;AACjC,UAAM,aAAa,OAAO,MAAM,MAAM,IAAI;AAC1C,eAAW,QAAQ,CAAC,SAAS;AAC3B,YAAM,gBAAgB,wBAAwB,IAAI;AAClD,UAAI,iBAAiB,cAAc,KAAK,GAAG;AACzC,cAAM,KAAK,KAAK,aAAa,EAAE;AAAA,MACjC;AAAA,IACF,CAAC;AACD,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,MAAI,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,mBAAmB,CAAC,GAAG;AACxE,UAAM;AAAA,MACJ;AAAA,IACF;AACA,UAAM,KAAK,uBAAuB;AAClC,UAAM,KAAK,+DAA+D;AAC1E,UAAM,KAAK,4BAA4B,WAAW,SAAS,CAAC,GAAG;AAC/D,UAAM;AAAA,MACJ;AAAA,IACF;AACA,UAAM,KAAK,mCAAmC;AAC9C,UAAM,KAAK,OAAO;AAClB,UAAM,KAAK,gCAAgC;AAC3C,UAAM,KAAK,0BAA0B,WAAW,SAAS,CAAC,GAAG;AAC7D,UAAM,KAAK,wBAAwB;AACnC,UAAM;AAAA,MACJ;AAAA,IACF;AACA,UAAM;AAAA,MACJ;AAAA,IACF;AACA,UAAM;AAAA,MACJ;AAAA,IACF;AACA,UAAM;AAAA,MACJ;AAAA,IACF;AACA,UAAM;AAAA,MACJ;AAAA,IACF;AACA,UAAM,KAAK,wBAAwB;AACnC,UAAM,KAAK,oCAAoC;AAC/C,UAAM,KAAK,4BAA4B;AACvC,UAAM,KAAK,mDAAmD;AAC9D,UAAM,KAAK,4DAA4D;AACvE,UAAM,KAAK,gBAAgB;AAC3B,UAAM,KAAK,mBAAmB;AAC9B,UAAM,KAAK,+DAA+D;AAC1E,UAAM,KAAK,gCAAgC;AAC3C,UAAM;AAAA,MACJ;AAAA,IACF;AACA,UAAM,KAAK,qBAAqB;AAChC,UAAM,KAAK,iDAAiD;AAC5D,UAAM,KAAK,+CAA+C;AAC1D,UAAM,KAAK,2CAA2C;AACtD,UAAM,KAAK,WAAW;AACtB,UAAM,KAAK,8BAA8B;AACzC,UAAM;AAAA,MACJ;AAAA,IACF;AACA,UAAM,KAAK,oCAAoC;AAC/C,UAAM;AAAA,MACJ;AAAA,IACF;AACA,UAAM,KAAK,qBAAqB;AAChC,UAAM,KAAK,iDAAiD;AAC5D,UAAM,KAAK,uDAAuD;AAClE,UAAM,KAAK,2CAA2C;AACtD,UAAM,KAAK,WAAW;AACtB,UAAM,KAAK,SAAS;AACpB,UAAM,KAAK,kBAAkB;AAC7B,UAAM;AAAA,MACJ;AAAA,IACF;AACA,UAAM,KAAK,+CAA+C;AAC1D,UAAM,KAAK,SAAS;AACpB,UAAM,KAAK,SAAS;AACpB,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,MAAI,OAAO,SAAS;AAClB,UAAM,KAAK,qBAAqB;AAEhC,QAAI,OAAO,eAAe;AAExB,UAAI,cAAc,wBAAwB,OAAO,KAAK,KAAK,CAAC;AAE5D,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,0CAA0C;AAAA,MAC5D;AAEA,YAAM,oBACJ,OAAO,eAAe,eACrB,WAAmB,2BAA2B,SAC1C,WAAmB,yBACpB;AAEN,UAAI,mBAAmB;AACrB,gBAAQ;AAAA,UACN,GAAG,OAAO,OAAO,iCAAiC,OAAO,KAAK;AAAA,QAChE;AACA,gBAAQ,IAAI,YAAY,UAAU,GAAG,GAAG,CAAC;AAAA,MAC3C;AAEA,YAAM,WAAW,YAAY,MAAM,gCAAgC;AAEnE,UAAI,UAAU;AACZ,cAAM,UAAU,SAAS,CAAC;AAC1B,cAAM,aAAa,SAAS,CAAC;AAC7B,cAAM,iBAAiB,SAAS,CAAC;AAEjC,YAAI,mBAAmB;AACrB,kBAAQ;AAAA,YACN,GAAG,OAAO,OAAO,uBAAuB,OAAO,KAAK,IAAI,OAAO;AAAA,UACjE;AAAA,QACF;AAGA,cAAM,eAAe,mBAAmB,QAAQ,OAAO,EAAE;AACzD,cAAM,gBAAgB,GAAG,OAAO,GAAG,UAAU,IAAI,YAAY,MAAM,cAAc;AACjF,cAAM,aAAa,YAAY,UAAU,SAAS,CAAC,EAAE,MAAM;AAC3D,cAAM,eAAe,gBAAgB;AAErC,cAAM,KAAK,YAAY;AACvB,cAAM,YAAY,aAAa,MAAM,IAAI;AACzC,kBAAU,QAAQ,CAAC,SAAiB;AAClC,gBAAM,KAAK,OAAO,IAAI,EAAE;AAAA,QAC1B,CAAC;AACD,cAAM,KAAK,MAAM;AAAA,MACnB,OAAO;AAEL,cAAM,KAAK,YAAY;AACvB,cAAM,KAAK,YAAY,mBAAmB,QAAQ,OAAO,EAAE,CAAC,MAAM;AAClE,cAAM,YAAY,YAAY,MAAM,IAAI;AACxC,kBAAU,QAAQ,CAAC,SAAiB;AAClC,gBAAM,KAAK,SAAS,IAAI,EAAE;AAAA,QAC5B,CAAC;AACD,cAAM,KAAK,YAAY;AACvB,cAAM,KAAK,MAAM;AAAA,MACnB;AAAA,IACF,OAAO;AACL,YAAM,gBAAgB,wBAAwB,OAAO,IAAI;AACzD,UAAI,CAAC,eAAe;AAClB,cAAM,IAAI,MAAM,0CAA0C;AAAA,MAC5D;AAEA,YAAM,KAAK,YAAY;AACvB,YAAM,YAAY,cAAc,MAAM,IAAI;AAC1C,gBAAU,QAAQ,CAAC,SAAiB;AAClC,cAAM,KAAK,OAAO,IAAI,EAAE;AAAA,MAC1B,CAAC;AACD,YAAM,KAAK,MAAM;AAAA,IACnB;AAAA,EACF,OAAO;AACL,UAAM,KAAK,gBAAgB;AAAA,EAC7B;AAEA,QAAM,KAAK,GAAG;AACd,QAAM,KAAK,EAAE;AAGb,QAAM,KAAK,gCAAgC;AAE3C,SAAO,MAAM,KAAK,IAAI;AACxB;AArPS;AA0PT,SAAS,YAAY,QAAyB,UAAwB;AACpE,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI;AAAA,MACR,GAAG,OAAO,GAAG,cAAc,OAAO,KAAK,4BAA4B,OAAO,IAAI,GAAG,QAAQ,GAAG,OAAO,KAAK;AAAA,IAC1G;AAAA,EACF;AAEA,MAAI,OAAO,YAAY,CAAC,CAAC,MAAM,IAAI,EAAE,SAAS,OAAO,SAAS,GAAG;AAC/D,UAAM,IAAI;AAAA,MACR,GAAG,OAAO,GAAG,cAAc,OAAO,KAAK,gDAAgD,OAAO,IAAI,GAAG,QAAQ,GAAG,OAAO,KAAK;AAAA,IAC9H;AAAA,EACF;AAEA,MAAI,OAAO,YAAY,OAAO,cAAc,MAAM;AAChD,UAAM,aAAa;AAAA,MACjB,EAAE,SAAS,qBAAqB,MAAM,wBAAwB;AAAA,MAC9D,EAAE,SAAS,oBAAoB,MAAM,aAAa;AAAA,MAClD,EAAE,SAAS,mCAAmC,MAAM,kBAAkB;AAAA,MACtE,EAAE,SAAS,iBAAiB,MAAM,eAAe;AAAA,MACjD,EAAE,SAAS,gBAAgB,MAAM,mBAAmB;AAAA,MACpD,EAAE,SAAS,cAAc,MAAM,iBAAiB;AAAA,MAChD,EAAE,SAAS,qBAAqB,MAAM,YAAY;AAAA,MAClD,EAAE,SAAS,sBAAsB,MAAM,iBAAiB;AAAA,MACxD;AAAA,QACE,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,IACF;AAEA,UAAM,UAAU,OAAO,QAAQ,OAAO,OAAO,QAAQ,KAAK,IAAI;AAE9D,eAAW,EAAE,SAAS,KAAK,KAAK,YAAY;AAC1C,UAAI,QAAQ,KAAK,OAAO,GAAG;AACzB,cAAM,IAAI;AAAA,UACR,GAAG,OAAO,GAAG,cAAc,OAAO,KAAK,+BAA+B,OAAO,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,OAAO,OAAO,IAAI,GAAG,QAAQ,GAAG,OAAO,KAAK,SAAS,OAAO,MAAM,aAAa,OAAO,KAAK;AAAA,EACjM,OAAO,IAAI,oEAAoE,OAAO,KAAK;AAAA,QAClG;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAxCS;AA6CT,MAAM,qBAAN,MAAM,mBAAkB;AAAA,EAKtB,YAAY,eAAoC;AAHhD,SAAQ,eAAoC,oBAAI,IAAI;AACpD,SAAQ,UAA6B;AAGnC,SAAK,kBAAkB;AAAA,MACrB,QAAQ;AAAA,MACR,QAAQ;AAAA;AAAA,MACR,QAAQ,GAAG,aAAa;AAAA,MACxB,QAAQ,GAAG,WAAW;AAAA,MACtB,KAAK,GAAG,QAAQ;AAAA,MAChB,KAAK,CAAC,mBAAmB,cAAc;AAAA,MACvC,kBAAkB,GAAG,qBAAqB;AAAA,MAC1C,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,8BAA8B;AAAA,MAC9B,kBAAkB;AAAA;AAAA,MAClB,qBAAqB;AAAA;AAAA,MACrB,eAAe;AAAA,MACf,SAAS;AAAA,MACT,SAAS;AAAA,MACT,mBAAmB;AAAA,MACnB,iBAAiB;AAAA,MACjB,GAAG;AAAA,IACL;AAAA,EACF;AAAA,EAEA,QAAQ,UAAkB,SAAuB;AAC/C,SAAK,aAAa,IAAI,UAAU,OAAO;AACvC,SAAK,UAAU;AAAA,EACjB;AAAA,EAEQ,qBAAsC;AAC5C,UAAM,cAAc,GAAG,mBAAmB,KAAK,eAAe;AAE9D,WAAO;AAAA,MACL,GAAG;AAAA,MACH,eAAe,wBAAC,UAAU,oBAAoB;AAC5C,YAAI,KAAK,aAAa,IAAI,QAAQ,GAAG;AACnC,gBAAM,UAAU,KAAK,aAAa,IAAI,QAAQ;AAC9C,cAAI,YAAY,OAAW,QAAO;AAClC,iBAAO,GAAG,iBAAiB,UAAU,SAAS,iBAAiB,IAAI;AAAA,QACrE;AAEA,YAAI;AACF,cAAI,GAAG,IAAI,WAAW,QAAQ,GAAG;AAC/B,kBAAM,UAAU,GAAG,IAAI,SAAS,QAAQ;AACxC,gBAAI,YAAY,QAAW;AACzB,qBAAO,GAAG;AAAA,gBACR;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,KAAK;AAAA,QAEd;AAEA,eAAO;AAAA,MACT,GAxBe;AAAA,MAyBf,YAAY,wBAAC,aAAa;AACxB,YAAI,KAAK,aAAa,IAAI,QAAQ,EAAG,QAAO;AAC5C,eAAO,GAAG,IAAI,WAAW,QAAQ;AAAA,MACnC,GAHY;AAAA,MAIZ,UAAU,wBAAC,aAAa;AACtB,YAAI,KAAK,aAAa,IAAI,QAAQ,GAAG;AACnC,gBAAM,UAAU,KAAK,aAAa,IAAI,QAAQ;AAC9C,iBAAO,YAAY,SAAY,SAAY;AAAA,QAC7C;AACA,cAAM,aAAa,GAAG,IAAI,SAAS,QAAQ;AAC3C,eAAO,eAAe,SAAY,SAAY;AAAA,MAChD,GAPU;AAAA,MAQV,WAAW,6BAAM;AAAA,MAAC,GAAP;AAAA,IACb;AAAA,EACF;AAAA,EAEA,UAAU,UAA4B;AACpC,UAAM,SAAmB,CAAC;AAE1B,QAAI;AACF,UAAI,CAAC,KAAK,aAAa,IAAI,QAAQ,GAAG;AACpC,eAAO,CAAC,uCAAuC;AAAA,MACjD;AAEA,YAAM,eAAe,KAAK,mBAAmB;AAE7C,UAAI,CAAC,KAAK,SAAS;AACjB,aAAK,UAAU,GAAG;AAAA,UAChB,CAAC,QAAQ;AAAA,UACT,KAAK;AAAA,UACL;AAAA,QACF;AAAA,MACF;AAEA,YAAM,aAAa,KAAK,QAAQ,cAAc,QAAQ;AACtD,UAAI,CAAC,YAAY;AACf,eAAO,CAAC,iCAAiC,QAAQ,EAAE;AAAA,MACrD;AAEA,YAAM,cAAc;AAAA,QAClB,GAAG,KAAK,QAAQ,wBAAwB,UAAU;AAAA,QAClD,GAAG,KAAK,QAAQ,uBAAuB,UAAU;AAAA,MACnD;AAIA,YAAM,YAAY,oBAAI,IAAI;AAAA,QACxB;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,MACF,CAAC;AAED,kBAAY,QAAQ,CAAC,eAAe;AAClC,YAAI,UAAU,IAAI,WAAW,IAAI,GAAG;AAClC;AAAA,QACF;AAEA,YAAI,WAAW,QAAQ,WAAW,UAAU,QAAW;AACrD,gBAAM,MAAM,WAAW,KAAK;AAAA,YAC1B,WAAW;AAAA,UACb;AACA,gBAAM,QAAO,2BAAK,SAAQ;AAC1B,gBAAM,aAAY,2BAAK,cAAa;AACpC,gBAAM,UAAU,GAAG;AAAA,YACjB,WAAW;AAAA,YACX;AAAA,UACF;AACA,iBAAO;AAAA,YACL,GAAG,OAAO,MAAM,QAAQ,OAAO,CAAC,IAAI,YAAY,CAAC,GAAG,OAAO,KAAK,MAAM,OAAO,IAAI,OAAO,IAAI,MAAM,WAAW,IAAI,IAAI,OAAO,KAAK;AAAA,UACnI;AAAA,QACF,OAAO;AACL,gBAAM,UAAU,GAAG;AAAA,YACjB,WAAW;AAAA,YACX;AAAA,UACF;AACA,iBAAO;AAAA,YACL,GAAG,OAAO,IAAI,OAAO,IAAI,MAAM,WAAW,IAAI,IAAI,OAAO,KAAK;AAAA,UAChE;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,aAAO;AAAA,QACL,GAAG,OAAO,GAAG,uBAAuB,OAAO,KAAK,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC5G;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,QAAc;AACZ,SAAK,aAAa,MAAM;AACxB,SAAK,UAAU;AAAA,EACjB;AACF;AA7JwB;AAAxB,IAAM,oBAAN;AAkKe,SAAR,YAA6B,UAA8B,CAAC,GAAQ;AACzE,QAAM;AAAA,IACJ,aAAa;AAAA,IACb,cAAc;AAAA,IACd,UAAU,CAAC,OAAO,OAAO,QAAQ,QAAQ,MAAM;AAAA,IAC/C,UAAU,CAAC,cAAc;AAAA,IACzB,YAAY;AAAA,IACZ,iBAAiB,CAAC;AAAA,IAClB,YAAY;AAAA,IACZ,oBAAoB;AAAA,IACpB,YAAY;AAAA,IACZ;AAAA,EACF,IAAI;AAGJ,QAAM,iBAAiB,mBAAmB,UAAU;AACpD,QAAM,kBAAkB,mBAAmB,WAAW;AAEtD,MAAI,CAAC,kBAAkB,CAAC,iBAAiB;AACvC,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AAEA,MAAI,cAAwC;AAE5C,MAAI,WAAW;AACb,kBAAc,IAAI,kBAAkB,QAAQ;AAAA,EAC9C;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA;AAAA,IAGT,MAAM,UAAU,IAAY,UAAmB;AAE7C,UAAI,GAAG,SAAS,MAAM,GAAG;AAEvB,YAAI,QAAQ,SAAS,UAAU;AAC7B,kBAAQ;AAAA,YACN,GAAG,OAAO,IAAI,yBAAyB,OAAO,IAAI,GAAG,EAAE,GAAG,OAAO,KAAK,IAAI,OAAO,IAAI,iBAAiB,OAAO,IAAI,GAAG,QAAQ,GAAG,OAAO,KAAK;AAAA,UAC7I;AAAA,QACF;AAGA,cAAM,OAAO,MAAM,OAAO,MAAM;AAChC,YAAI,eAAe;AAGnB,YAAI,GAAG,WAAW,GAAG,GAAG;AACtB,yBAAe,KAAK,QAAQ,QAAQ,IAAI,GAAG,GAAG,UAAU,CAAC,CAAC;AAAA,QAC5D,WAAW,CAAC,KAAK,WAAW,EAAE,GAAG;AAC/B,yBAAe,KAAK,QAAQ,QAAQ,IAAI,GAAG,EAAE;AAAA,QAC/C;AAEA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IACA,MAAM,KAAK,IAAY;AACrB,YAAM,eAAe,cAAc,EAAE;AAErC,UAAI,aAAa,SAAS,MAAM,GAAG;AACjC,YAAI;AAEF,gBAAM,KAAK,MAAM,OAAO,IAAI;AAC5B,cAAI,WAAW;AAEf,cAAI,QAAQ,OAAO;AACjB,oBAAQ;AAAA,cACN,GAAG,OAAO,IAAI,6BAA6B,OAAO,IAAI,GAAG,QAAQ,GAAG,OAAO,KAAK;AAAA,YAClF;AAAA,UACF;AAEA,gBAAM,UAAU,GAAG,aAAa,UAAU,OAAO;AAIjD,gBAAM,SAAS,SAAS,OAAO;AAC/B,sBAAY,QAAQ,YAAY;AAChC,gBAAM,kBAAkB;AAAA,YACtB;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,cAAI,QAAQ,mBAAmB;AAC7B,oBAAQ,IAAI;AAAA,EAAK,OAAO,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC,GAAG,OAAO,KAAK,EAAE;AAC9D,oBAAQ;AAAA,cACN,GAAG,OAAO,IAAI,cAAc,OAAO,KAAK,wBAAwB,OAAO,IAAI,GAAG,YAAY,GAAG,OAAO,KAAK;AAAA,YAC3G;AACA,oBAAQ,IAAI,GAAG,OAAO,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC,GAAG,OAAO,KAAK,EAAE;AAC5D,oBAAQ,IAAI,eAAe;AAC3B,oBAAQ,IAAI,GAAG,OAAO,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC,GAAG,OAAO,KAAK;AAAA,CAAI;AAAA,UAChE;AAGA,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,kBAAQ;AAAA,YACN,GAAG,OAAO,GAAG,8BAA8B,YAAY,IAAI,OAAO,KAAK;AAAA,YACvE;AAAA,UACF;AACA,gBAAM;AAAA,QACR;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IAEA,MAAM,UAAU,MAAc,IAAY;AACxC,YAAM,eAAe,cAAc,EAAE;AAGrC,UAAI,aAAa,SAAS,MAAM,GAAG;AACjC,eAAO;AAAA,MACT;AAGA,YAAM,WAAW,aAAa,YAAY;AAG1C,UACE,CAAC,YACA,aAAa,SAAS,IAAI,KAAK,CAAC,aAAa,SAAS,cAAc,GACrE;AACA,gBAAQ;AAAA,UACN,uDAAuD,YAAY;AAAA,QACrE;AACA,eAAO;AAAA,MACT;AAGA,UAAI,KAAK,SAAS,UAAU;AAC1B,cAAM,IAAI,MAAM,QAAQ,YAAY,6BAA6B;AAAA,MACnE;AAEA,YAAM,gBAAgB,QAAQ;AAAA,QAAK,CAAC,YAClC,aAAa,SAAS,OAAO;AAAA,MAC/B;AACA,UAAI,cAAe,QAAO;AAE1B,YAAM,gBAAgB,QAAQ,KAAK,CAAC,QAAQ,aAAa,SAAS,GAAG,CAAC;AACtE,UAAI,CAAC,cAAe,QAAO;AAE3B,YAAM,MAAM;AACZ,UAAI,OAAO,IAAI,iBAAiB,YAAY;AAC1C,YAAI,aAAa,EAAE;AAAA,MACrB;AAEA,UAAI;AACF,YAAI,kBAAkB;AACtB,YAAI,SAAqC;AACzC,YAAI,kBAAkB;AAItB,YAAI,aAAa,SAAS,MAAM,GAAG;AACjC,gBAAM,gBAAgB,wBAAwB,IAAI;AAClD,cAAI,CAAC,eAAe;AAClB,kBAAM,IAAI;AAAA,cACR,oDAAoD,YAAY;AAAA,YAClE;AAAA,UACF;AACA,4BAAkB;AAAA,QACpB,OAAO;AACL,4BAAkB;AAAA,QACpB;AAEA,YAAI,aAAa,SAAS,MAAM,KAAK,WAAW;AAC9C,gBAAM,SAAS,SAAS,eAAe;AACvC,sBAAY,QAAQ,YAAY;AAEhC,4BAAkB,aAAa,QAAQ,cAAc,cAAc;AAEnE,cAAI,mBAAmB;AACrB,oBAAQ,IAAI;AAAA,EAAK,OAAO,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC,GAAG,OAAO,KAAK,EAAE;AAC9D,oBAAQ;AAAA,cACN,GAAG,OAAO,IAAI,cAAc,OAAO,KAAK,wBAAwB,OAAO,IAAI,GAAG,YAAY,GAAG,OAAO,KAAK;AAAA,YAC3G;AACA,oBAAQ,IAAI,GAAG,OAAO,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC,GAAG,OAAO,KAAK,EAAE;AAC5D,oBAAQ,IAAI,eAAe;AAC3B,oBAAQ,IAAI,GAAG,OAAO,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC,GAAG,OAAO,KAAK;AAAA,CAAI;AAAA,UAChE;AAEA,4BAAkB,aAAa,OAAO,cAAc;AAEpD,cAAI,mBAAmB,aAAa;AAClC,kBAAM,kBAAkB,aAAa;AAAA,cACnC;AAAA,cACA;AAAA,YACF;AACA,wBAAY,QAAQ,iBAAiB,eAAe;AACpD,kBAAM,aAAa,YAAY,UAAU,eAAe;AAExD,gBAAI,WAAW,SAAS,GAAG;AACzB,sBAAQ;AAAA,gBACN;AAAA,EAAK,OAAO,GAAG,GAAG,OAAO,IAAI,gCAAgC,OAAO,KAAK,OAAO,OAAO,IAAI,GAAG,YAAY,GAAG,OAAO,KAAK;AAAA,cAC3H;AACA,yBAAW,QAAQ,CAAC,UAAU,QAAQ,MAAM,KAAK,KAAK,EAAE,CAAC;AACzD,sBAAQ,MAAM,EAAE;AAEhB,kBAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,sBAAM,IAAI,MAAM,wBAAwB,YAAY,EAAE;AAAA,cACxD;AAAA,YACF;AAEA,8BAAkB;AAAA,UACpB;AAAA,QACF,OAAO;AACL,cAAI,aAAa,SAAS,KAAK,GAAG;AAChC,qBAAS;AACT,8BAAkB;AAAA,UACpB,WAAW,aAAa,SAAS,MAAM,GAAG;AACxC,qBAAS;AACT,8BAAkB;AAAA,UACpB,WAAW,aAAa,SAAS,MAAM,GAAG;AACxC,qBAAS;AAAA,UACX,WAAW,aAAa,SAAS,KAAK,GAAG;AACvC,qBAAS;AAAA,UACX;AAAA,QACF;AAEA,YAAI,mBAAmB,aAAa;AAClC,sBAAY,QAAQ,cAAc,eAAe;AACjD,gBAAM,aAAa,YAAY,UAAU,YAAY;AAErD,cAAI,WAAW,SAAS,GAAG;AACzB,oBAAQ;AAAA,cACN;AAAA,EAAK,OAAO,GAAG,GAAG,OAAO,IAAI,gCAAgC,OAAO,KAAK,OAAO,OAAO,IAAI,GAAG,YAAY,GAAG,OAAO,KAAK;AAAA,YAC3H;AACA,uBAAW,QAAQ,CAAC,UAAU,QAAQ,MAAM,KAAK,KAAK,EAAE,CAAC;AACzD,oBAAQ,MAAM,EAAE;AAEhB,gBAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,oBAAM,IAAI,MAAM,wBAAwB,YAAY,EAAE;AAAA,YACxD;AAAA,UACF;AAAA,QACF;AAGA,YAAI,gBAAgB,SAAS,SAAS;AAEpC,gBAAM,IAAI;AAAA,YACR,2CAA2C,YAAY;AAAA,UACzD;AAAA,QACF;AAEA,cAAM,SAAS,MAAM,UAAU,iBAAiB;AAAA,UAC9C;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,UACA;AAAA,UACA,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,GAAG;AAAA,QACL,CAAC;AAED,eAAO;AAAA,UACL,MAAM,OAAO;AAAA,UACb,KAAK,OAAO,OAAO;AAAA,QACrB;AAAA,MACF,SAAS,OAAO;AACd,cAAM,MAAM;AACZ,gBAAQ;AAAA,UACN;AAAA,EAAK,OAAO,GAAG,GAAG,OAAO,IAAI,8BAA8B,OAAO,KAAK,OAAO,OAAO,IAAI,GAAG,EAAE,GAAG,OAAO,KAAK;AAAA,QAC/G;AACA,gBAAQ,MAAM,KAAK,OAAO,GAAG,GAAG,IAAI,OAAO,GAAG,OAAO,KAAK;AAAA,CAAI;AAE9D,cAAME,OAAM;AACZ,YAAI,OAAOA,KAAI,UAAU,YAAY;AACnC,UAAAA,KAAI,MAAM;AAAA,YACR,SAAS,uBAAuB,EAAE,KAAK,IAAI,OAAO;AAAA,YAClD,OAAO,IAAI;AAAA,YACX;AAAA,UACF,CAAC;AAAA,QACH,OAAO;AACL,gBAAM;AAAA,QACR;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,gBAAgB,KAAiB;AAC/B,YAAM,EAAE,MAAM,OAAO,IAAI;AACzB,YAAM,iBAAiB,cAAc,IAAI;AACzC,YAAM,eAAe,QAAQ,KAAK,CAAC,QAAQ,eAAe,SAAS,GAAG,CAAC;AAEvE,UAAI,cAAc;AAChB,gBAAQ;AAAA,UACN,GAAG,OAAO,KAAK,QAAQ,OAAO,KAAK,IAAI,OAAO,IAAI,GAAG,cAAc,GAAG,OAAO,KAAK;AAAA,QACpF;AAEA,YAAI,aAAa;AACf,sBAAY,MAAM;AAAA,QACpB;AAEA,eAAO,GAAG,KAAK;AAAA,UACb,MAAM;AAAA,UACN,MAAM;AAAA,QACR,CAAC;AACD,eAAO,CAAC;AAAA,MACV;AAEA,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,QAAoB;AAEzB,aAAO,eAAe,OAAO,gBAAgB,CAAC;AAC9C,aAAO,aAAa,aAAa,OAAO,aAAa,cAAc,CAAC;AACpE,UAAI,CAAC,OAAO,aAAa,WAAW,SAAS,MAAM,GAAG;AACpD,eAAO,aAAa,WAAW,KAAK,MAAM;AAAA,MAC5C;AAGA,YAAM,mBAAgD;AAAA,QACpD,SAAS;AAAA,UACP,YAAY;AAAA,UACZ,aAAa;AAAA,UACb,WAAW,YAAY,cAAc;AAAA,QACvC;AAAA,QACA,cAAc;AAAA,UACZ,SAAS,CAAC,cAAc;AAAA,UACxB,gBAAgB;AAAA,YACd,KAAK;AAAA,YACL,YAAY;AAAA,YACZ,aAAa;AAAA,UACf;AAAA,UACA,GAAG,OAAO;AAAA,QACZ;AAAA,QACA,SAAS;AAAA,UACP,YAAY,CAAC,QAAQ,OAAO,QAAQ,OAAO,QAAQ,OAAO;AAAA,QAC5D;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,IAEA,aAAa;AACX,cAAQ;AAAA,QACN,GAAG,OAAO,IAAI,0BAA0B,OAAO,KAAK;AAAA,MACtD;AACA,UAAI,WAAW;AACb,gBAAQ;AAAA,UACN,GAAG,OAAO,IAAI,0BAA0B,OAAO,KAAK,iBAAiB,OAAO,KAAK,UAAU,OAAO,KAAK;AAAA,QACzG;AAAA,MACF;AACA,UAAI,WAAW;AACb,gBAAQ;AAAA,UACN,GAAG,OAAO,IAAI,0BAA0B,OAAO,KAAK,mBAAmB,OAAO,KAAK,UAAU,OAAO,KAAK;AAAA,QAC3G;AAAA,MACF;AAAA,IACF;AAAA,IAEA,WAAW;AACT,UAAI,aAAa;AACf,oBAAY,MAAM;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACF;AAxWwB;",
|
|
6
|
-
"names": ["
|
|
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