juxscript 1.1.134 → 1.1.136
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/dom-structure-map.json +1 -1
- package/machinery/compiler3.js +34 -1
- package/package.json +1 -1
package/dom-structure-map.json
CHANGED
package/machinery/compiler3.js
CHANGED
|
@@ -58,6 +58,7 @@ export class JuxCompiler {
|
|
|
58
58
|
*/
|
|
59
59
|
scanFiles() {
|
|
60
60
|
const views = [], dataModules = [], sharedModules = [];
|
|
61
|
+
const processedNames = new Set(); // Track processed file base names to avoid duplicates
|
|
61
62
|
|
|
62
63
|
/**
|
|
63
64
|
* Recursive directory scanner
|
|
@@ -80,6 +81,19 @@ export class JuxCompiler {
|
|
|
80
81
|
const relativePath = path.relative(this.srcDir, fullPath);
|
|
81
82
|
const name = relativePath.replace(/\.[^/.]+$/, ''); // Remove extension
|
|
82
83
|
|
|
84
|
+
// ✅ Generate unique key that includes full path to avoid collisions
|
|
85
|
+
// This handles cases like:
|
|
86
|
+
// - apps/audits/audits.jux → apps_audits_audits
|
|
87
|
+
// - apps/audits.jux → apps_audits
|
|
88
|
+
const uniqueKey = name.replace(/[\/\\]/g, '_').replace(/[^a-zA-Z0-9_]/g, '_');
|
|
89
|
+
|
|
90
|
+
// ✅ Skip if we've already processed this exact path
|
|
91
|
+
if (processedNames.has(uniqueKey)) {
|
|
92
|
+
console.warn(`⚠️ Skipping duplicate: ${relativePath} (already processed as ${uniqueKey})`);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
processedNames.add(uniqueKey);
|
|
96
|
+
|
|
83
97
|
if (file.includes('data')) {
|
|
84
98
|
dataModules.push({ name, file: relativePath, content });
|
|
85
99
|
} else if (/export\s+(function|const|let|var|class)\s+/.test(content)) {
|
|
@@ -242,6 +256,17 @@ export class JuxCompiler {
|
|
|
242
256
|
|
|
243
257
|
const capitalized = sanitizedName.charAt(0).toUpperCase() + sanitizedName.slice(1);
|
|
244
258
|
|
|
259
|
+
// ✅ Check for duplicate function names and warn
|
|
260
|
+
const functionName = `render${capitalized}`;
|
|
261
|
+
if (sourceSnapshot[functionName]) {
|
|
262
|
+
console.error(`❌ DUPLICATE FUNCTION NAME: ${functionName}`);
|
|
263
|
+
console.error(` Conflict between:`);
|
|
264
|
+
console.error(` 1. ${sourceSnapshot[functionName].file}`);
|
|
265
|
+
console.error(` 2. ${v.file}`);
|
|
266
|
+
console.error(` This will cause a build error. Rename one of these files.`);
|
|
267
|
+
throw new Error(`Duplicate function name: ${functionName}`);
|
|
268
|
+
}
|
|
269
|
+
|
|
245
270
|
sourceSnapshot[v.file] = {
|
|
246
271
|
name: v.name,
|
|
247
272
|
file: v.file,
|
|
@@ -249,11 +274,19 @@ export class JuxCompiler {
|
|
|
249
274
|
lines: v.content.split('\n')
|
|
250
275
|
};
|
|
251
276
|
|
|
277
|
+
// ✅ Also track by function name to catch duplicates
|
|
278
|
+
sourceSnapshot[functionName] = {
|
|
279
|
+
name: v.name,
|
|
280
|
+
file: v.file,
|
|
281
|
+
content: v.content,
|
|
282
|
+
lines: v.content.split('\n')
|
|
283
|
+
};
|
|
284
|
+
|
|
252
285
|
let viewCode = this.removeImports(v.content).replace(/^\s*export\s+default\s+.*$/gm, '');
|
|
253
286
|
const asyncPrefix = viewCode.includes('await ') ? 'async ' : '';
|
|
254
287
|
|
|
255
288
|
// ✅ Use sanitized name in function declaration
|
|
256
|
-
entry += `\n${asyncPrefix}function
|
|
289
|
+
entry += `\n${asyncPrefix}function ${functionName}() {\n${viewCode}\n}\n`;
|
|
257
290
|
});
|
|
258
291
|
|
|
259
292
|
dataModules.forEach(m => {
|