xjs.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. // xjs.js (development loader)
  2. // - Dev/test: lightweight loader that imports source files (animal.js + layer.js)
  3. // - Production: use the bundled output from `go run main.go build` (defaults to dist/xjs.js)
  4. ;(function (global) {
  5. 'use strict';
  6. const g = global || (typeof window !== 'undefined' ? window : globalThis);
  7. const doc = (typeof document !== 'undefined') ? document : null;
  8. if (!doc) return;
  9. // Avoid double-loading
  10. if (g.xjs && g.Layer) return;
  11. const current = doc.currentScript;
  12. const base = (() => {
  13. try {
  14. const u = new URL(current && current.src ? current.src : 'xjs.js', location.href);
  15. return u.href.replace(/[^/]*$/, ''); // directory of xjs.js
  16. } catch {
  17. return '';
  18. }
  19. })();
  20. const loadScript = (src) => new Promise((resolve, reject) => {
  21. const s = doc.createElement('script');
  22. s.src = src;
  23. s.async = false; // preserve execution order
  24. s.onload = () => resolve();
  25. s.onerror = () => reject(new Error('Failed to load: ' + src));
  26. (doc.head || doc.documentElement).appendChild(s);
  27. });
  28. const ensureGlobals = () => {
  29. try {
  30. if (g.animal && !g.xjs) g.xjs = g.animal;
  31. if (g.xjs && !g.$) g.$ = g.xjs;
  32. if (g.$ && !g.xjs) g.xjs = g.$;
  33. if (g.$ && !g.animal) g.animal = g.$;
  34. } catch {}
  35. };
  36. (async () => {
  37. // Load animal first so xjs alias is available before layer tries to query it
  38. if (!g.animal) await loadScript(base + 'animal.js');
  39. ensureGlobals();
  40. if (!g.Layer) await loadScript(base + 'layer.js');
  41. ensureGlobals();
  42. })().catch((err) => {
  43. try { console.error('[xjs.dev] load failed', err); } catch {}
  44. });
  45. })(typeof window !== 'undefined' ? window : globalThis);