juxscript 1.1.100 → 1.1.102
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
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseStack.d.ts","sourceRoot":"","sources":["BaseStack.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"BaseStack.d.ts","sourceRoot":"","sources":["BaseStack.ts"],"names":[],"mappings":"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"}
|
|
@@ -189,9 +189,23 @@ export class BaseStack extends BaseComponent {
|
|
|
189
189
|
if (child && typeof child === 'object' && '_container' in child && child._container instanceof HTMLElement) {
|
|
190
190
|
childElement = child._container;
|
|
191
191
|
}
|
|
192
|
-
// ✅ Priority 2: Check if it's a JUX Component (has container property)
|
|
193
|
-
else if (child && typeof child === 'object' &&
|
|
194
|
-
|
|
192
|
+
// ✅ Priority 2: Check if it's a JUX Component (has render method and container property)
|
|
193
|
+
else if (child && typeof child === 'object' && typeof child.render === 'function') {
|
|
194
|
+
// Create temporary container to render into
|
|
195
|
+
const tempContainer = document.createElement('div');
|
|
196
|
+
tempContainer.style.display = 'contents'; // Don't add extra wrapper
|
|
197
|
+
// Render the component into temp container
|
|
198
|
+
child.render(tempContainer);
|
|
199
|
+
// Extract the rendered element
|
|
200
|
+
if (child.container && child.container.firstElementChild) {
|
|
201
|
+
childElement = child.container.firstElementChild;
|
|
202
|
+
}
|
|
203
|
+
else if (tempContainer.firstElementChild) {
|
|
204
|
+
childElement = tempContainer.firstElementChild;
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
childElement = tempContainer;
|
|
208
|
+
}
|
|
195
209
|
}
|
|
196
210
|
// ✅ Priority 3: Check if it's already a DOM element
|
|
197
211
|
else if (child instanceof HTMLElement) {
|
|
@@ -249,9 +249,23 @@ export abstract class BaseStack extends BaseComponent<StackState> {
|
|
|
249
249
|
if (child && typeof child === 'object' && '_container' in child && child._container instanceof HTMLElement) {
|
|
250
250
|
childElement = child._container;
|
|
251
251
|
}
|
|
252
|
-
// ✅ Priority 2: Check if it's a JUX Component (has container property)
|
|
253
|
-
else if (child && typeof child === 'object' &&
|
|
254
|
-
|
|
252
|
+
// ✅ Priority 2: Check if it's a JUX Component (has render method and container property)
|
|
253
|
+
else if (child && typeof child === 'object' && typeof child.render === 'function') {
|
|
254
|
+
// Create temporary container to render into
|
|
255
|
+
const tempContainer = document.createElement('div');
|
|
256
|
+
tempContainer.style.display = 'contents'; // Don't add extra wrapper
|
|
257
|
+
|
|
258
|
+
// Render the component into temp container
|
|
259
|
+
child.render(tempContainer);
|
|
260
|
+
|
|
261
|
+
// Extract the rendered element
|
|
262
|
+
if (child.container && child.container.firstElementChild) {
|
|
263
|
+
childElement = child.container.firstElementChild as HTMLElement;
|
|
264
|
+
} else if (tempContainer.firstElementChild) {
|
|
265
|
+
childElement = tempContainer.firstElementChild as HTMLElement;
|
|
266
|
+
} else {
|
|
267
|
+
childElement = tempContainer;
|
|
268
|
+
}
|
|
255
269
|
}
|
|
256
270
|
// ✅ Priority 3: Check if it's already a DOM element
|
|
257
271
|
else if (child instanceof HTMLElement) {
|
package/machinery/compiler3.js
CHANGED
|
@@ -250,29 +250,15 @@ export class JuxCompiler {
|
|
|
250
250
|
const sourceSnapshot = {};
|
|
251
251
|
|
|
252
252
|
const juxImports = new Set();
|
|
253
|
-
const layoutImports = new Set();
|
|
254
|
-
let needsJuxFacade = false; // ✅ Track if jux facade is needed
|
|
253
|
+
const layoutImports = new Set(); // ✅ Track layout imports separately
|
|
255
254
|
|
|
255
|
+
// Scan for imports
|
|
256
256
|
[...views, ...dataModules, ...sharedModules].forEach(m => {
|
|
257
|
-
// ✅ Detect jux.something() usage
|
|
258
|
-
if (/jux\s*\.\s*\w+\s*\(/g.test(m.content)) {
|
|
259
|
-
needsJuxFacade = true;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
// Detect layout usage (both import and direct usage)
|
|
263
|
-
const layoutPattern = /(VStack|HStack|ZStack)\s*\.\s*create/g;
|
|
264
|
-
const layoutMatches = m.content.match(layoutPattern);
|
|
265
|
-
if (layoutMatches) {
|
|
266
|
-
layoutMatches.forEach(match => {
|
|
267
|
-
const layoutName = match.split('.')[0].trim();
|
|
268
|
-
layoutImports.add(layoutName);
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
|
|
272
257
|
// Regular juxscript imports
|
|
273
258
|
for (const match of m.content.matchAll(/import\s*\{\s*([^}]+)\s*\}\s*from\s*['"]juxscript['"]/g)) {
|
|
274
259
|
match[1].split(',').map(s => s.trim()).forEach(imp => {
|
|
275
260
|
if (imp) {
|
|
261
|
+
// ✅ Separate layout imports
|
|
276
262
|
if (imp === 'VStack' || imp === 'HStack' || imp === 'ZStack') {
|
|
277
263
|
layoutImports.add(imp);
|
|
278
264
|
} else {
|
|
@@ -283,7 +269,7 @@ export class JuxCompiler {
|
|
|
283
269
|
}
|
|
284
270
|
});
|
|
285
271
|
|
|
286
|
-
// ✅ Import layouts
|
|
272
|
+
// ✅ Import layouts separately
|
|
287
273
|
if (layoutImports.size > 0) {
|
|
288
274
|
entry += `import { ${[...layoutImports].sort().join(', ')} } from 'juxscript';\n`;
|
|
289
275
|
}
|
|
@@ -293,12 +279,6 @@ export class JuxCompiler {
|
|
|
293
279
|
entry += `import { ${[...juxImports].sort().join(', ')} } from 'juxscript';\n\n`;
|
|
294
280
|
}
|
|
295
281
|
|
|
296
|
-
// ✅ Import jux facade if needed
|
|
297
|
-
if (needsJuxFacade) {
|
|
298
|
-
entry += `import { jux } from 'juxscript';\n`;
|
|
299
|
-
entry += `window.jux = jux;\n`;
|
|
300
|
-
}
|
|
301
|
-
|
|
302
282
|
// Data and shared modules
|
|
303
283
|
dataModules.forEach(m => {
|
|
304
284
|
entry += `import * as ${this.sanitizeName(m.name)}Data from './jux/${m.file}';\n`;
|
|
@@ -311,7 +291,7 @@ export class JuxCompiler {
|
|
|
311
291
|
dataModules.forEach(m => entry += `Object.assign(window, ${this.sanitizeName(m.name)}Data);\n`);
|
|
312
292
|
sharedModules.forEach(m => entry += `Object.assign(window, ${this.sanitizeName(m.name)}Shared);\n`);
|
|
313
293
|
|
|
314
|
-
// ✅ Expose layouts to window
|
|
294
|
+
// ✅ Expose layouts to window
|
|
315
295
|
if (layoutImports.size > 0) {
|
|
316
296
|
entry += `\n// Expose layout components\n`;
|
|
317
297
|
layoutImports.forEach(layout => {
|
|
@@ -630,43 +610,52 @@ navigate(location.pathname);
|
|
|
630
610
|
target: 'es2020',
|
|
631
611
|
sourcemap: true,
|
|
632
612
|
external: [],
|
|
633
|
-
// ✅ Tell esbuild how to resolve .jux
|
|
634
|
-
loader: {
|
|
613
|
+
// ✅ Tell esbuild how to resolve .jux files
|
|
614
|
+
loader: {
|
|
635
615
|
'.jux': 'js' // Treat .jux files as JavaScript
|
|
636
|
-
}
|
|
616
|
+
}
|
|
637
617
|
});
|
|
638
618
|
|
|
639
|
-
// Generate index.html
|
|
619
|
+
// Generate index.html
|
|
640
620
|
console.log('📄 Generating index.html...');
|
|
641
621
|
const indexHtml = `<!DOCTYPE html>
|
|
642
622
|
<html lang="en">
|
|
623
|
+
<head>
|
|
624
|
+
<meta charset="UTF-8">
|
|
625
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
626
|
+
<title>JUX App</title>
|
|
627
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/juxscript@latest/lib/layouts/default.css">
|
|
628
|
+
</head>
|
|
629
|
+
<body>
|
|
630
|
+
<div id="app"></div>
|
|
631
|
+
<script type="module" src="/bundle.js"></script>
|
|
643
632
|
</body>
|
|
644
|
-
</html>`;
|
|
633
|
+
</html>`;
|
|
645
634
|
|
|
646
635
|
fs.writeFileSync(path.join(this.distDir, 'index.html'), indexHtml);
|
|
647
|
-
|
|
636
|
+
|
|
648
637
|
// Copy public folder
|
|
649
|
-
this.copyPublicFolder();
|
|
650
|
-
|
|
651
|
-
// Write source snapshot for error
|
|
638
|
+
this.copyPublicFolder();
|
|
639
|
+
|
|
640
|
+
// Write source snapshot for error overlay
|
|
652
641
|
const snapshotPath = path.join(this.distDir, '__jux_sources.json');
|
|
653
|
-
fs.writeFileSync(snapshotPath, JSON.stringify(this._sourceSnapshot, null, 2));
|
|
654
|
-
|
|
655
|
-
const endTime = Date.now();
|
|
642
|
+
fs.writeFileSync(snapshotPath, JSON.stringify(this._sourceSnapshot, null, 2));
|
|
643
|
+
|
|
644
|
+
const endTime = Date.now();
|
|
656
645
|
console.log(`\n✅ Build complete in ${endTime - startTime}ms`);
|
|
657
646
|
console.log(` Output: ${this.distDir}`);
|
|
658
647
|
|
|
659
648
|
this.reportValidationIssues();
|
|
660
649
|
|
|
661
|
-
return {
|
|
662
|
-
success: true,
|
|
663
|
-
errors: this._validationIssues || [],
|
|
650
|
+
return {
|
|
651
|
+
success: true,
|
|
652
|
+
errors: this._validationIssues || [],
|
|
664
653
|
distDir: this.distDir
|
|
665
|
-
};
|
|
666
|
-
|
|
654
|
+
};
|
|
655
|
+
|
|
667
656
|
} catch (err) {
|
|
668
|
-
console.error('❌ Build failed:', err.message);
|
|
669
|
-
console.error(err.stack);
|
|
657
|
+
console.error('❌ Build failed:', err.message);
|
|
658
|
+
console.error(err.stack);
|
|
670
659
|
return {
|
|
671
660
|
success: false,
|
|
672
661
|
errors: [err.message]
|
|
@@ -675,86 +664,77 @@ nsole.log(`\n✅ Build complete in ${endTime - startTime}ms`);
|
|
|
675
664
|
}
|
|
676
665
|
|
|
677
666
|
/**
|
|
678
|
-
* Copy public folder contents to dist
|
|
679
|
-
*/
|
|
680
|
-
copyPublicFolder() {
|
|
681
|
-
// ✅ Use configured public path or resolve from paths object
|
|
667
|
+
* Copy public folder contents to dist
|
|
668
|
+
*/
|
|
669
|
+
copyPublicFolder() {
|
|
670
|
+
// ✅ Use configured public path or resolve from paths object
|
|
682
671
|
const publicSrc = this.paths.public
|
|
683
672
|
? this.paths.public
|
|
684
|
-
: path.resolve(process.cwd(), this.publicDir);
|
|
673
|
+
: path.resolve(process.cwd(), this.publicDir);
|
|
685
674
|
|
|
686
675
|
if (!fs.existsSync(publicSrc)) {
|
|
687
676
|
return; // No public folder, skip
|
|
688
|
-
}
|
|
677
|
+
}
|
|
689
678
|
|
|
690
679
|
console.log('📦 Copying public assets...');
|
|
691
|
-
|
|
692
|
-
try {
|
|
680
|
+
|
|
681
|
+
try {
|
|
693
682
|
this._copyDirRecursive(publicSrc, this.distDir, 0);
|
|
694
|
-
console.log('✅ Public assets copied');
|
|
683
|
+
console.log('✅ Public assets copied');
|
|
695
684
|
} catch (err) {
|
|
696
685
|
console.warn('⚠️ Error copying public folder:', err.message);
|
|
697
686
|
}
|
|
698
|
-
}
|
|
687
|
+
}
|
|
699
688
|
|
|
700
689
|
/**
|
|
701
|
-
* Recursively copy directory contents
|
|
702
|
-
*/
|
|
690
|
+
* Recursively copy directory contents
|
|
691
|
+
*/
|
|
703
692
|
_copyDirRecursive(src, dest, depth = 0) {
|
|
704
693
|
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
705
694
|
|
|
706
|
-
entries.forEach(entry => {
|
|
695
|
+
entries.forEach(entry => {
|
|
707
696
|
// Skip hidden files and directories
|
|
708
|
-
if (entry.name.startsWith('.')) return;
|
|
709
|
-
|
|
697
|
+
if (entry.name.startsWith('.')) return;
|
|
698
|
+
|
|
710
699
|
const srcPath = path.join(src, entry.name);
|
|
711
|
-
const destPath = path.join(dest, entry.name);
|
|
700
|
+
const destPath = path.join(dest, entry.name);
|
|
712
701
|
|
|
713
|
-
if (entry.isDirectory()) {
|
|
714
|
-
// Create directory and
|
|
702
|
+
if (entry.isDirectory()) {
|
|
703
|
+
// Create directory and recurse
|
|
715
704
|
if (!fs.existsSync(destPath)) {
|
|
716
|
-
fs.mkdirSync(destPath, { recursive: true });
|
|
717
|
-
}
|
|
718
|
-
this._copyDirRecursive(srcPath, destPath, depth + 1);
|
|
719
|
-
} else {
|
|
705
|
+
fs.mkdirSync(destPath, { recursive: true });
|
|
706
|
+
}
|
|
707
|
+
this._copyDirRecursive(srcPath, destPath, depth + 1);
|
|
708
|
+
} else {
|
|
720
709
|
// Copy file
|
|
721
|
-
fs.copyFileSync(srcPath, destPath);
|
|
722
|
-
|
|
723
|
-
// Log files at root level only
|
|
724
|
-
if (depth === 0) {
|
|
725
|
-
const ext = path.extname(entry.name);
|
|
710
|
+
fs.copyFileSync(srcPath, destPath);
|
|
711
|
+
|
|
712
|
+
// Log files at root level only
|
|
713
|
+
if (depth === 0) {
|
|
714
|
+
const ext = path.extname(entry.name);
|
|
726
715
|
const icon = this._getFileIcon(ext);
|
|
727
716
|
console.log(` ${icon} ${entry.name}`);
|
|
728
717
|
}
|
|
729
718
|
}
|
|
730
719
|
});
|
|
731
720
|
}
|
|
732
|
-
|
|
721
|
+
|
|
733
722
|
/**
|
|
734
723
|
* Get icon for file type
|
|
735
724
|
*/
|
|
736
|
-
_getFileIcon(ext) {
|
|
725
|
+
_getFileIcon(ext) {
|
|
737
726
|
const icons = {
|
|
738
727
|
'.html': '📄',
|
|
739
|
-
'.css': '🎨'
|
|
740
|
-
'.js': '📜',
|
|
741
|
-
'.json': '📋',
|
|
728
|
+
'.css': '🎨',
|
|
729
|
+
'.js': '📜',
|
|
730
|
+
'.json': '📋',
|
|
742
731
|
'.png': '🖼️',
|
|
743
|
-
'.jpg': '🖼️',
|
|
744
|
-
'.jpeg': '🖼️',
|
|
745
|
-
'.gif': '🖼️',
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
} } return icons[ext.toLowerCase()] || '📦'; }; '.eot': '🔤' '.ttf': '🔤', '.woff2': '🔤', '.woff': '🔤', '.ico': '🔖', '.svg': '🎨', '.woff': '🔤',
|
|
732
|
+
'.jpg': '🖼️',
|
|
733
|
+
'.jpeg': '🖼️',
|
|
734
|
+
'.gif': '🖼️',
|
|
735
|
+
'.svg': '🎨',
|
|
736
|
+
'.ico': '🔖',
|
|
737
|
+
'.woff': '🔤',
|
|
758
738
|
'.woff2': '🔤',
|
|
759
739
|
'.ttf': '🔤',
|
|
760
740
|
'.eot': '🔤'
|