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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "totalComponents": 69,
3
- "generatedAt": "2026-02-13T17:12:00.182Z",
3
+ "generatedAt": "2026-02-13T17:20:09.076Z",
4
4
  "components": [
5
5
  {
6
6
  "file": "alert.js",
@@ -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 render${capitalized}() {\n${viewCode}\n}\n`;
289
+ entry += `\n${asyncPrefix}function ${functionName}() {\n${viewCode}\n}\n`;
257
290
  });
258
291
 
259
292
  dataModules.forEach(m => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "juxscript",
3
- "version": "1.1.134",
3
+ "version": "1.1.136",
4
4
  "type": "module",
5
5
  "description": "A JavaScript UX authorship platform",
6
6
  "main": "index.js",