xjs.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  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. // Optional: export `$` only when explicitly requested
  32. if (g.XJS_GLOBAL_DOLLAR && !g.$ && g.xjs) g.$ = g.xjs;
  33. } catch {}
  34. };
  35. (async () => {
  36. // Load animal first so xjs alias is available before layer tries to query it
  37. if (!g.animal) await loadScript(base + 'animal.js');
  38. ensureGlobals();
  39. if (!g.Layer) await loadScript(base + 'layer.js');
  40. ensureGlobals();
  41. })().catch((err) => {
  42. try { console.error('[xjs.dev] load failed', err); } catch {}
  43. });
  44. })(typeof window !== 'undefined' ? window : globalThis);