@arborium/arborium 2.12.0 → 2.12.2

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.
Files changed (42) hide show
  1. package/dist/arborium.iife.js +2 -2
  2. package/dist/arborium.iife.js.map +1 -1
  3. package/dist/arborium.js +68 -67
  4. package/dist/arborium.js.map +1 -1
  5. package/dist/arborium_host.js +3 -3
  6. package/dist/arborium_host_bg.wasm +0 -0
  7. package/dist/iife.d.ts +4 -4
  8. package/dist/plugins-manifest.d.ts +1 -1
  9. package/dist/themes/alabaster.css +2 -0
  10. package/dist/themes/ayu-dark.css +2 -0
  11. package/dist/themes/ayu-light.css +2 -0
  12. package/dist/themes/catppuccin-frappe.css +2 -0
  13. package/dist/themes/catppuccin-latte.css +2 -0
  14. package/dist/themes/catppuccin-macchiato.css +2 -0
  15. package/dist/themes/catppuccin-mocha.css +2 -0
  16. package/dist/themes/cobalt2.css +2 -0
  17. package/dist/themes/dayfox.css +2 -0
  18. package/dist/themes/desert256.css +2 -0
  19. package/dist/themes/dracula.css +2 -0
  20. package/dist/themes/ef-melissa-dark.css +2 -0
  21. package/dist/themes/github-dark.css +9 -7
  22. package/dist/themes/github-light.css +9 -7
  23. package/dist/themes/gruvbox-dark.css +2 -0
  24. package/dist/themes/gruvbox-light.css +2 -0
  25. package/dist/themes/kanagawa-dragon.css +2 -0
  26. package/dist/themes/light-owl.css +2 -0
  27. package/dist/themes/lucius-light.css +2 -0
  28. package/dist/themes/melange-dark.css +2 -0
  29. package/dist/themes/melange-light.css +2 -0
  30. package/dist/themes/monokai.css +2 -0
  31. package/dist/themes/nord.css +2 -0
  32. package/dist/themes/one-dark.css +2 -0
  33. package/dist/themes/rose-pine-moon.css +2 -0
  34. package/dist/themes/rustdoc-ayu.css +2 -0
  35. package/dist/themes/rustdoc-dark.css +2 -0
  36. package/dist/themes/rustdoc-light.css +10 -8
  37. package/dist/themes/solarized-dark.css +2 -0
  38. package/dist/themes/solarized-light.css +2 -0
  39. package/dist/themes/tokyo-night.css +2 -0
  40. package/dist/themes/zenburn.css +2 -0
  41. package/dist/types.d.ts +3 -1
  42. package/package.json +1 -1
package/dist/arborium.js CHANGED
@@ -74,12 +74,12 @@ const L = [
74
74
  function M(e) {
75
75
  const t = e.split(`
76
76
  `)[0];
77
- for (const [a, s] of L)
77
+ for (const [a, r] of L)
78
78
  if (a.test(t))
79
- return s;
80
- for (const [a, s] of $)
79
+ return r;
80
+ for (const [a, r] of $)
81
81
  if (a.test(e))
82
- return s;
82
+ return r;
83
83
  return null;
84
84
  }
85
85
  function R(e) {
@@ -87,7 +87,7 @@ function R(e) {
87
87
  if (t) return t[1];
88
88
  const a = e.match(/\blang-(\w+)\b/);
89
89
  if (a) return a[1];
90
- const s = /* @__PURE__ */ new Set([
90
+ const r = /* @__PURE__ */ new Set([
91
91
  "rust",
92
92
  "javascript",
93
93
  "typescript",
@@ -124,7 +124,7 @@ function R(e) {
124
124
  "sh"
125
125
  ]);
126
126
  for (const n of e.split(/\s+/))
127
- if (s.has(n.toLowerCase()))
127
+ if (r.has(n.toLowerCase()))
128
128
  return n.toLowerCase();
129
129
  return null;
130
130
  }
@@ -152,7 +152,7 @@ function H(e) {
152
152
  }, a = e.toLowerCase();
153
153
  return t[a] || a;
154
154
  }
155
- const _ = "2.12.0", U = [
155
+ const _ = "2.12.2", U = [
156
156
  "ada",
157
157
  "agda",
158
158
  "asciidoc",
@@ -603,42 +603,43 @@ const T = {
603
603
  // Empty means use bundled manifest
604
604
  hostUrl: "",
605
605
  // Empty means use CDN based on version
606
+ logger: console,
606
607
  resolveJs: ({ baseUrl: e, path: t }) => import(
607
608
  /* @vite-ignore */
608
609
  `${e}/${t}`
609
610
  ),
610
611
  resolveWasm: ({ baseUrl: e, path: t }) => fetch(`${e}/${t}`)
611
612
  };
612
- let p = null, m = null, g = { ...T };
613
+ let g = null, p = null, u = { ...T };
613
614
  const y = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new Map(), d = new Set(U);
614
- let l = null, u = null;
615
+ let l = null, m = null;
615
616
  async function k(e) {
616
617
  if (e.pluginsUrl)
617
- return u || (u = (async () => {
618
- console.debug(`[arborium] Loading local plugins manifest from: ${e.pluginsUrl}`);
618
+ return m || (m = (async () => {
619
+ e.logger.debug(`[arborium] Loading local plugins manifest from: ${e.pluginsUrl}`);
619
620
  const t = await fetch(e.pluginsUrl);
620
621
  if (!t.ok)
621
622
  throw new Error(`Failed to load plugins.json: ${t.status}`);
622
- l = await t.json(), console.debug(`[arborium] Loaded local manifest with ${l?.entries.length} entries`);
623
- })(), u);
623
+ l = await t.json(), e.logger.debug(`[arborium] Loaded local manifest with ${l?.entries.length} entries`);
624
+ })(), m);
624
625
  }
625
626
  function P(e, t) {
626
627
  if (l) {
627
- const r = l.entries.find((o) => o.language === e);
628
- if (r)
629
- return r.local_js.substring(0, r.local_js.lastIndexOf("/"));
628
+ const s = l.entries.find((o) => o.language === e);
629
+ if (s)
630
+ return s.local_js.substring(0, s.local_js.lastIndexOf("/"));
630
631
  }
631
- const a = t.cdn, s = t.version;
632
+ const a = t.cdn, r = t.version;
632
633
  let n;
633
- return a === "jsdelivr" ? n = "https://cdn.jsdelivr.net/npm" : a === "unpkg" ? n = "https://unpkg.com" : n = a, `${n}/@arborium/${e}@${s}`;
634
+ return a === "jsdelivr" ? n = "https://cdn.jsdelivr.net/npm" : a === "unpkg" ? n = "https://unpkg.com" : n = a, `${n}/@arborium/${e}@${r}`;
634
635
  }
635
636
  async function j(e, t) {
636
637
  const a = y.get(e);
637
638
  if (a)
638
- return console.debug(`[arborium] Grammar '${e}' found in cache`), a;
639
- const s = h.get(e);
640
- if (s)
641
- return console.debug(`[arborium] Grammar '${e}' already loading, waiting...`), s;
639
+ return t.logger.debug(`[arborium] Grammar '${e}' found in cache`), a;
640
+ const r = h.get(e);
641
+ if (r)
642
+ return t.logger.debug(`[arborium] Grammar '${e}' already loading, waiting...`), r;
642
643
  const n = q(e, t);
643
644
  h.set(e, n);
644
645
  try {
@@ -649,18 +650,18 @@ async function j(e, t) {
649
650
  }
650
651
  async function q(e, t) {
651
652
  if (await k(t), !d.has(e) && !l?.entries.some((a) => a.language === e))
652
- return console.debug(`[arborium] Grammar '${e}' not available`), null;
653
+ return t.logger.debug(`[arborium] Grammar '${e}' not available`), null;
653
654
  try {
654
- const a = P(e, t), s = t.resolveJs === T.resolveJs ? ` from ${a}/grammar.js` : "";
655
- console.debug(`[arborium] Loading grammar '${e}'${s}`);
655
+ const a = P(e, t), r = t.resolveJs === T.resolveJs ? ` from ${a}/grammar.js` : "";
656
+ t.logger.debug(`[arborium] Loading grammar '${e}'${r}`);
656
657
  const n = await t.resolveJs({
657
658
  language: e,
658
659
  baseUrl: a,
659
660
  path: "grammar.js"
660
- }), r = await t.resolveWasm({ language: e, baseUrl: a, path: "grammar_bg.wasm" });
661
- await n.default({ module_or_path: r });
661
+ }), s = await t.resolveWasm({ language: e, baseUrl: a, path: "grammar_bg.wasm" });
662
+ await n.default({ module_or_path: s });
662
663
  const o = n.language_id();
663
- o !== e && console.warn(`[arborium] Language ID mismatch: expected '${e}', got '${o}'`);
664
+ o !== e && t.logger.warn(`[arborium] Language ID mismatch: expected '${e}', got '${o}'`);
664
665
  const x = n.injection_languages(), v = {
665
666
  languageId: e,
666
667
  injectionLanguages: x,
@@ -676,7 +677,7 @@ async function q(e, t) {
676
677
  injections: i.injections || []
677
678
  };
678
679
  } catch (i) {
679
- return console.error("[arborium] Parse error:", i), { spans: [], injections: [] };
680
+ return t.logger.error("[arborium] Parse error:", i), { spans: [], injections: [] };
680
681
  } finally {
681
682
  n.free_session(c);
682
683
  }
@@ -692,15 +693,15 @@ async function q(e, t) {
692
693
  injections: i.injections || []
693
694
  };
694
695
  } catch (i) {
695
- return console.error("[arborium] Parse error:", i), { spans: [], injections: [] };
696
+ return t.logger.error("[arborium] Parse error:", i), { spans: [], injections: [] };
696
697
  } finally {
697
698
  n.free_session(c);
698
699
  }
699
700
  }
700
701
  };
701
- return y.set(e, v), console.debug(`[arborium] Grammar '${e}' loaded successfully`), v;
702
+ return y.set(e, v), t.logger.debug(`[arborium] Grammar '${e}' loaded successfully`), v;
702
703
  } catch (a) {
703
- return console.error(`[arborium] Failed to load grammar '${e}':`, a), null;
704
+ return t.logger.error(`[arborium] Failed to load grammar '${e}':`, a), null;
704
705
  }
705
706
  }
706
707
  const w = /* @__PURE__ */ new Map();
@@ -715,15 +716,15 @@ function I(e) {
715
716
  async loadGrammar(t) {
716
717
  const a = await j(t, e);
717
718
  if (!a) return 0;
718
- for (const [n, r] of w)
719
- if (r === a) return n;
720
- const s = C++;
721
- return w.set(s, a), s;
719
+ for (const [n, s] of w)
720
+ if (s === a) return n;
721
+ const r = C++;
722
+ return w.set(r, a), r;
722
723
  },
723
724
  /** Parse text using a grammar handle (sync) - returns UTF-8 offsets for Rust host */
724
725
  parse(t, a) {
725
- const s = w.get(t);
726
- return s ? s.parseUtf8(a) : { spans: [], injections: [] };
726
+ const r = w.get(t);
727
+ return r ? r.parseUtf8(a) : { spans: [], injections: [] };
727
728
  }
728
729
  };
729
730
  }
@@ -731,68 +732,68 @@ function S(e) {
731
732
  if (e.hostUrl)
732
733
  return e.hostUrl;
733
734
  const t = e.cdn, a = e.version;
734
- let s;
735
- t === "jsdelivr" ? s = "https://cdn.jsdelivr.net/npm" : t === "unpkg" ? s = "https://unpkg.com" : s = t;
735
+ let r;
736
+ t === "jsdelivr" ? r = "https://cdn.jsdelivr.net/npm" : t === "unpkg" ? r = "https://unpkg.com" : r = t;
736
737
  const n = a === "latest" ? "" : `@${a}`;
737
- return `${s}/@arborium/arborium${n}/dist`;
738
+ return `${r}/@arborium/arborium${n}/dist`;
738
739
  }
739
740
  async function A(e) {
740
- return p || m || (m = (async () => {
741
+ return g || p || (p = (async () => {
741
742
  I(e);
742
- const t = S(e), a = `${t}/arborium_host.js`, s = `${t}/arborium_host_bg.wasm`;
743
- console.debug(`[arborium] Loading host from ${a}`);
743
+ const t = S(e), a = `${t}/arborium_host.js`, r = `${t}/arborium_host_bg.wasm`;
744
+ e.logger.debug(`[arborium] Loading host from ${a}`);
744
745
  try {
745
746
  const n = await import(
746
747
  /* @vite-ignore */
747
748
  a
748
749
  );
749
- return await n.default(s), p = {
750
+ return await n.default(r), g = {
750
751
  highlight: n.highlight,
751
752
  isLanguageAvailable: n.isLanguageAvailable
752
- }, console.debug("[arborium] Host loaded successfully"), p;
753
+ }, e.logger.debug("[arborium] Host loaded successfully"), g;
753
754
  } catch (n) {
754
- return console.error("[arborium] Failed to load host:", n), null;
755
+ return e.logger.error("[arborium] Failed to load host:", n), null;
755
756
  }
756
- })(), m);
757
+ })(), p);
757
758
  }
758
759
  async function G(e, t, a) {
759
- const s = b(a), n = await A(s);
760
+ const r = b(a), n = await A(r);
760
761
  if (n)
761
762
  try {
762
763
  return n.highlight(e, t);
763
- } catch (r) {
764
- console.error("[arborium] Host highlight failed:", r);
764
+ } catch (s) {
765
+ r.logger.error("[arborium] Host highlight failed:", s);
765
766
  }
766
767
  return E(t);
767
768
  }
768
769
  async function z(e, t) {
769
- const a = b(t), s = await j(e, a);
770
- if (!s) return null;
771
- const { module: n } = s;
770
+ const a = b(t), r = await j(e, a);
771
+ if (!r) return null;
772
+ const { module: n } = r;
772
773
  return {
773
- languageId: () => s.languageId,
774
- injectionLanguages: () => s.injectionLanguages,
775
- highlight: async (r) => G(e, r, t),
774
+ languageId: () => r.languageId,
775
+ injectionLanguages: () => r.injectionLanguages,
776
+ highlight: async (s) => G(e, s, t),
776
777
  // Public API returns UTF-16 offsets for JavaScript compatibility
777
- parse: (r) => s.parseUtf16(r),
778
+ parse: (s) => r.parseUtf16(s),
778
779
  createSession: () => {
779
- const r = n.create_session();
780
+ const s = n.create_session();
780
781
  return {
781
- setText: (o) => n.set_text(r, o),
782
+ setText: (o) => n.set_text(s, o),
782
783
  // Session.parse() returns UTF-16 offsets for JavaScript compatibility
783
784
  parse: () => {
784
785
  try {
785
- const o = n.parse_utf16(r);
786
+ const o = n.parse_utf16(s);
786
787
  return {
787
788
  spans: o.spans || [],
788
789
  injections: o.injections || []
789
790
  };
790
791
  } catch (o) {
791
- return console.error("[arborium] Session parse error:", o), { spans: [], injections: [] };
792
+ return a.logger.error("[arborium] Session parse error:", o), { spans: [], injections: [] };
792
793
  }
793
794
  },
794
- cancel: () => n.cancel(r),
795
- free: () => n.free_session(r)
795
+ cancel: () => n.cancel(s),
796
+ free: () => n.free_session(s)
796
797
  };
797
798
  },
798
799
  dispose: () => {
@@ -800,14 +801,14 @@ async function z(e, t) {
800
801
  };
801
802
  }
802
803
  function b(e) {
803
- return e ? { ...g, ...e } : { ...g };
804
+ return e ? { ...u, ...e } : { ...u };
804
805
  }
805
806
  function N(e) {
806
- g = { ...g, ...e };
807
+ u = { ...u, ...e };
807
808
  }
808
809
  async function O(e, t) {
809
810
  const a = b(t);
810
- return await k(a), d.has(e) || (l?.entries.some((s) => s.language === e) ?? !1);
811
+ return await k(a), d.has(e) || (l?.entries.some((r) => r.language === e) ?? !1);
811
812
  }
812
813
  async function B(e) {
813
814
  const t = b(e);
@@ -1 +1 @@
1
- {"version":3,"file":"arborium.js","sources":["../src/detect.ts","../src/plugins-manifest.ts","../src/utils.ts","../src/loader.ts"],"sourcesContent":["/**\n * Simple language detection heuristics.\n * Not meant to be comprehensive - just catches common cases.\n */\n\n/** Shebang patterns */\nconst SHEBANG_PATTERNS: Array<[RegExp, string]> = [\n [/^#!.*\\bpython[23]?\\b/, 'python'],\n [/^#!.*\\bnode\\b/, 'javascript'],\n [/^#!.*\\bdeno\\b/, 'typescript'],\n [/^#!.*\\bbun\\b/, 'typescript'],\n [/^#!.*\\bruby\\b/, 'ruby'],\n [/^#!.*\\bperl\\b/, 'perl'],\n [/^#!.*\\bphp\\b/, 'php'],\n [/^#!.*\\bbash\\b/, 'bash'],\n [/^#!.*\\bzsh\\b/, 'zsh'],\n [/^#!.*\\bsh\\b/, 'bash'],\n [/^#!.*\\blua\\b/, 'lua'],\n [/^#!.*\\bawk\\b/, 'awk'],\n];\n\n/** Keyword fingerprints - first few unique keywords that identify a language */\nconst KEYWORD_FINGERPRINTS: Array<[RegExp, string]> = [\n // Rust - distinctive keywords\n [/\\b(fn|impl|trait|pub\\s+fn|let\\s+mut|&mut|->)\\b/, 'rust'],\n\n // Go - distinctive keywords\n [/\\b(func|package\\s+\\w+|import\\s+\\(|go\\s+func|chan\\s+\\w+)\\b/, 'go'],\n\n // Python - distinctive patterns\n [/\\b(def\\s+\\w+\\s*\\(|import\\s+\\w+|from\\s+\\w+\\s+import|class\\s+\\w+:)\\b/, 'python'],\n\n // TypeScript - distinctive type annotations\n [/:\\s*(string|number|boolean|void)\\b|\\binterface\\s+\\w+\\s*\\{/, 'typescript'],\n\n // JavaScript - distinctive patterns (after TS check)\n [/\\b(const|let|var)\\s+\\w+\\s*=|function\\s+\\w+\\s*\\(|=>\\s*\\{/, 'javascript'],\n\n // Ruby - distinctive keywords\n [/\\b(def\\s+\\w+|end\\b|do\\s*\\|.*\\||puts\\s+|require\\s+['\"])\\b/, 'ruby'],\n\n // Java - distinctive patterns\n [/\\b(public\\s+class|private\\s+\\w+|System\\.out\\.println)\\b/, 'java'],\n\n // C++ - distinctive patterns\n [/\\b(#include\\s*<|std::|template\\s*<|nullptr|cout\\s*<<)\\b/, 'cpp'],\n\n // C - distinctive patterns (after C++ check)\n [/\\b(#include\\s*[<\"]|printf\\s*\\(|int\\s+main\\s*\\(|void\\s+\\w+\\s*\\()\\b/, 'c'],\n\n // C# - distinctive patterns\n [/\\b(namespace\\s+\\w+|using\\s+System|public\\s+static\\s+void)\\b/, 'c-sharp'],\n\n // PHP - distinctive patterns\n [/<\\?php|\\$\\w+\\s*=/, 'php'],\n\n // Swift - distinctive patterns\n [/\\b(func\\s+\\w+|var\\s+\\w+:\\s*\\w+|let\\s+\\w+:\\s*\\w+|@objc)\\b/, 'swift'],\n\n // Kotlin - distinctive patterns\n [/\\b(fun\\s+\\w+|val\\s+\\w+|var\\s+\\w+:|data\\s+class)\\b/, 'kotlin'],\n\n // Scala - distinctive patterns\n [/\\b(def\\s+\\w+|val\\s+\\w+|var\\s+\\w+|object\\s+\\w+|case\\s+class)\\b/, 'scala'],\n\n // Haskell - distinctive patterns\n [/\\b(module\\s+\\w+|import\\s+qualified|data\\s+\\w+\\s*=|::\\s*\\w+\\s*->)\\b/, 'haskell'],\n\n // Elixir - distinctive patterns\n [/\\b(defmodule\\s+\\w+|def\\s+\\w+|defp\\s+\\w+|\\|>)\\b/, 'elixir'],\n\n // Lua - distinctive patterns\n [/\\b(local\\s+\\w+\\s*=|function\\s+\\w+\\.\\w+|require\\s*\\()\\b/, 'lua'],\n\n // SQL - distinctive patterns\n [/\\b(SELECT\\s+.*\\s+FROM|INSERT\\s+INTO|CREATE\\s+TABLE|ALTER\\s+TABLE)\\b/i, 'sql'],\n\n // Shell/Bash - distinctive patterns\n [/\\b(if\\s+\\[\\s*|then\\b|fi\\b|echo\\s+[\"']|export\\s+\\w+=)\\b/, 'bash'],\n\n // YAML - distinctive patterns\n [/^\\s*[\\w-]+:\\s*[\\w\\-\"'[{]|^---\\s*$/, 'yaml'],\n\n // JSON - distinctive patterns\n [/^\\s*\\{[\\s\\S]*\"[\\w-]+\":\\s*/, 'json'],\n\n // TOML - distinctive patterns\n [/^\\s*\\[[\\w.-]+\\]\\s*$|^\\s*\\w+\\s*=\\s*[\"'\\d\\[]/, 'toml'],\n\n // HTML - distinctive patterns\n [/<(!DOCTYPE|html|head|body|div|span|p|a\\s)/i, 'html'],\n\n // CSS - distinctive patterns\n [/^\\s*[\\w.#@][\\w\\s,#.:>+~-]*\\{[^}]*\\}|@media\\s|@import\\s/, 'css'],\n\n // Markdown - distinctive patterns\n [/^#{1,6}\\s+\\w|^\\s*[-*+]\\s+\\w|^\\s*\\d+\\.\\s+\\w|```\\w*\\n/, 'markdown'],\n\n // XML - distinctive patterns\n [/<\\?xml|<[\\w:-]+\\s+xmlns/, 'xml'],\n\n // Dockerfile\n [/^FROM\\s+\\w+|^RUN\\s+|^COPY\\s+|^ENTRYPOINT\\s+/m, 'dockerfile'],\n\n // Nginx config\n [/\\b(server\\s*\\{|location\\s+[\\/~]|proxy_pass\\s+)\\b/, 'nginx'],\n\n // Zig\n [/\\b(pub\\s+fn|const\\s+\\w+\\s*=|@import\\(|comptime)\\b/, 'zig'],\n];\n\n/**\n * Detect the language of a code snippet.\n * Returns null if detection fails.\n */\nexport function detectLanguage(source: string): string | null {\n // Check shebang first (most reliable)\n const firstLine = source.split('\\n')[0];\n for (const [pattern, language] of SHEBANG_PATTERNS) {\n if (pattern.test(firstLine)) {\n return language;\n }\n }\n\n // Check keyword fingerprints\n for (const [pattern, language] of KEYWORD_FINGERPRINTS) {\n if (pattern.test(source)) {\n return language;\n }\n }\n\n return null;\n}\n\n/**\n * Extract language from class name.\n * Supports multiple patterns:\n * - \"language-rust\" -> \"rust\" (standard)\n * - \"lang-rust\" -> \"rust\" (common alternative)\n * - \"rust\" -> \"rust\" (docs.rs style, bare language name)\n */\nexport function extractLanguageFromClass(className: string): string | null {\n // Try \"language-*\" pattern first (most specific)\n const langMatch = className.match(/\\blanguage-(\\w+)\\b/);\n if (langMatch) return langMatch[1];\n\n // Try \"lang-*\" pattern\n const shortMatch = className.match(/\\blang-(\\w+)\\b/);\n if (shortMatch) return shortMatch[1];\n\n // Try bare language names (for docs.rs compatibility)\n // Only match known language names to avoid false positives\n const knownLanguages = new Set([\n 'rust', 'javascript', 'typescript', 'python', 'ruby', 'go', 'java',\n 'c', 'cpp', 'csharp', 'php', 'swift', 'kotlin', 'scala', 'haskell',\n 'elixir', 'lua', 'sql', 'bash', 'shell', 'yaml', 'json', 'toml',\n 'html', 'css', 'xml', 'markdown', 'dockerfile', 'nginx', 'zig',\n 'text', 'plaintext', 'console', 'sh',\n ]);\n\n for (const cls of className.split(/\\s+/)) {\n if (knownLanguages.has(cls.toLowerCase())) {\n return cls.toLowerCase();\n }\n }\n\n return null;\n}\n\n/**\n * Normalize language identifier (handle aliases)\n */\nexport function normalizeLanguage(lang: string): string {\n const aliases: Record<string, string> = {\n js: 'javascript',\n ts: 'typescript',\n py: 'python',\n rb: 'ruby',\n rs: 'rust',\n sh: 'bash',\n shell: 'bash',\n yml: 'yaml',\n cs: 'c-sharp',\n csharp: 'c-sharp',\n 'c++': 'cpp',\n 'c#': 'c-sharp',\n 'f#': 'fsharp',\n dockerfile: 'dockerfile',\n docker: 'dockerfile',\n makefile: 'make',\n plaintext: 'text',\n plain: 'text',\n txt: 'text',\n };\n\n const lower = lang.toLowerCase();\n return aliases[lower] || lower;\n}\n","// AUTO-GENERATED by `cargo xtask gen-manifest` - DO NOT EDIT\n\nimport type { Highlight } from \"./types.js\"; \n\n/** Version of plugin packages (all @arborium/* packages share this version) */\nexport const pluginVersion = \"2.12.0\";\n\n/** All available languages */\nexport const availableLanguages: string[] = [\n \"ada\",\n \"agda\",\n \"asciidoc\",\n \"asm\",\n \"awk\",\n \"bash\",\n \"batch\",\n \"c\",\n \"c-sharp\",\n \"caddy\",\n \"capnp\",\n \"cedar\",\n \"cedarschema\",\n \"clojure\",\n \"cmake\",\n \"cobol\",\n \"commonlisp\",\n \"cpp\",\n \"css\",\n \"d\",\n \"dart\",\n \"devicetree\",\n \"diff\",\n \"dockerfile\",\n \"dot\",\n \"elisp\",\n \"elixir\",\n \"elm\",\n \"erlang\",\n \"fish\",\n \"fsharp\",\n \"gleam\",\n \"glsl\",\n \"go\",\n \"graphql\",\n \"groovy\",\n \"haskell\",\n \"hcl\",\n \"hlsl\",\n \"html\",\n \"idris\",\n \"ini\",\n \"java\",\n \"javascript\",\n \"jinja2\",\n \"jq\",\n \"json\",\n \"julia\",\n \"kotlin\",\n \"lean\",\n \"lua\",\n \"markdown\",\n \"matlab\",\n \"meson\",\n \"nginx\",\n \"ninja\",\n \"nix\",\n \"objc\",\n \"ocaml\",\n \"perl\",\n \"php\",\n \"postscript\",\n \"powershell\",\n \"prolog\",\n \"python\",\n \"query\",\n \"r\",\n \"rescript\",\n \"ron\",\n \"ruby\",\n \"rust\",\n \"scala\",\n \"scheme\",\n \"scss\",\n \"solidity\",\n \"sparql\",\n \"sql\",\n \"ssh-config\",\n \"starlark\",\n \"styx\",\n \"svelte\",\n \"swift\",\n \"textproto\",\n \"thrift\",\n \"tlaplus\",\n \"toml\",\n \"tsx\",\n \"typescript\",\n \"typst\",\n \"uiua\",\n \"vb\",\n \"verilog\",\n \"vhdl\",\n \"vim\",\n \"vue\",\n \"wit\",\n \"x86asm\",\n \"xml\",\n \"yaml\",\n \"yuri\",\n \"zig\",\n \"zsh\",\n];\n\n/** All possible highlights and their short tags */\nexport const highlights: Highlight[] = [\n {\n name: \"attribute\",\n tag: \"at\",\n },\n {\n name: \"constant\",\n tag: \"co\",\n },\n {\n name: \"constant.builtin\",\n tag: \"cb\",\n parentTag: \"constant\",\n },\n {\n name: \"constructor\",\n tag: \"cr\",\n },\n {\n name: \"function.builtin\",\n tag: \"fb\",\n parentTag: \"function\",\n },\n {\n name: \"function\",\n tag: \"f\",\n },\n {\n name: \"function.method\",\n tag: \"fm\",\n parentTag: \"function\",\n },\n {\n name: \"keyword\",\n tag: \"k\",\n },\n {\n name: \"keyword.conditional\",\n tag: \"kc\",\n parentTag: \"keyword\",\n },\n {\n name: \"keyword.coroutine\",\n tag: \"ko\",\n parentTag: \"keyword\",\n },\n {\n name: \"keyword.debug\",\n tag: \"kd\",\n parentTag: \"keyword\",\n },\n {\n name: \"keyword.exception\",\n tag: \"ke\",\n parentTag: \"keyword\",\n },\n {\n name: \"keyword.function\",\n tag: \"kf\",\n parentTag: \"keyword\",\n },\n {\n name: \"keyword.import\",\n tag: \"ki\",\n parentTag: \"keyword\",\n },\n {\n name: \"keyword.operator\",\n tag: \"kp\",\n parentTag: \"keyword\",\n },\n {\n name: \"keyword.repeat\",\n tag: \"kr\",\n parentTag: \"keyword\",\n },\n {\n name: \"keyword.return\",\n tag: \"kt\",\n parentTag: \"keyword\",\n },\n {\n name: \"keyword.type\",\n tag: \"ky\",\n parentTag: \"keyword\",\n },\n {\n name: \"operator\",\n tag: \"o\",\n },\n {\n name: \"property\",\n tag: \"pr\",\n },\n {\n name: \"punctuation\",\n tag: \"p\",\n },\n {\n name: \"punctuation.bracket\",\n tag: \"pb\",\n parentTag: \"punctuation\",\n },\n {\n name: \"punctuation.delimiter\",\n tag: \"pd\",\n parentTag: \"punctuation\",\n },\n {\n name: \"punctuation.special\",\n tag: \"ps\",\n parentTag: \"punctuation\",\n },\n {\n name: \"string\",\n tag: \"s\",\n },\n {\n name: \"string.special\",\n tag: \"ss\",\n parentTag: \"string\",\n },\n {\n name: \"tag\",\n tag: \"tg\",\n },\n {\n name: \"tag.delimiter\",\n tag: \"td\",\n parentTag: \"tag\",\n },\n {\n name: \"tag.error\",\n tag: \"te\",\n parentTag: \"tag\",\n },\n {\n name: \"type\",\n tag: \"t\",\n },\n {\n name: \"type.builtin\",\n tag: \"tb\",\n parentTag: \"type\",\n },\n {\n name: \"type.qualifier\",\n tag: \"tq\",\n parentTag: \"type\",\n },\n {\n name: \"variable\",\n tag: \"v\",\n },\n {\n name: \"variable.builtin\",\n tag: \"vb\",\n parentTag: \"variable\",\n },\n {\n name: \"variable.parameter\",\n tag: \"vp\",\n parentTag: \"variable\",\n },\n {\n name: \"comment\",\n tag: \"c\",\n },\n {\n name: \"comment.documentation\",\n tag: \"cd\",\n parentTag: \"comment\",\n },\n {\n name: \"macro\",\n tag: \"m\",\n },\n {\n name: \"label\",\n tag: \"l\",\n },\n {\n name: \"diff.addition\",\n tag: \"da\",\n },\n {\n name: \"diff.deletion\",\n tag: \"dd\",\n },\n {\n name: \"number\",\n tag: \"n\",\n },\n {\n name: \"text.literal\",\n tag: \"tl\",\n },\n {\n name: \"text.emphasis\",\n tag: \"em\",\n },\n {\n name: \"text.strong\",\n tag: \"st\",\n },\n {\n name: \"text.uri\",\n tag: \"tu\",\n },\n {\n name: \"text.reference\",\n tag: \"tr\",\n },\n {\n name: \"string.escape\",\n tag: \"se\",\n parentTag: \"string\",\n },\n {\n name: \"text.title\",\n tag: \"tt\",\n },\n {\n name: \"text.strikethrough\",\n tag: \"tx\",\n },\n {\n name: \"spell\",\n tag: \"sp\",\n },\n {\n name: \"embedded\",\n tag: \"eb\",\n },\n {\n name: \"error\",\n tag: \"er\",\n },\n {\n name: \"namespace\",\n tag: \"ns\",\n },\n {\n name: \"include\",\n tag: \"in\",\n parentTag: \"keyword\",\n },\n {\n name: \"storageclass\",\n tag: \"sc\",\n parentTag: \"keyword\",\n },\n {\n name: \"repeat\",\n tag: \"rp\",\n parentTag: \"keyword\",\n },\n {\n name: \"conditional\",\n tag: \"cn\",\n parentTag: \"keyword\",\n },\n {\n name: \"exception\",\n tag: \"ex\",\n parentTag: \"keyword\",\n },\n {\n name: \"preproc\",\n tag: \"pp\",\n parentTag: \"keyword\",\n },\n {\n name: \"none\",\n tag: \"\",\n },\n {\n name: \"character\",\n tag: \"ch\",\n parentTag: \"string\",\n },\n {\n name: \"character.special\",\n tag: \"cs\",\n parentTag: \"string\",\n },\n {\n name: \"variable.member\",\n tag: \"vm\",\n parentTag: \"variable\",\n },\n {\n name: \"function.definition\",\n tag: \"fd\",\n parentTag: \"function\",\n },\n {\n name: \"type.definition\",\n tag: \"tf\",\n parentTag: \"type\",\n },\n {\n name: \"function.call\",\n tag: \"fc\",\n parentTag: \"function\",\n },\n {\n name: \"keyword.modifier\",\n tag: \"km\",\n parentTag: \"keyword\",\n },\n {\n name: \"keyword.directive\",\n tag: \"dr\",\n parentTag: \"keyword\",\n },\n {\n name: \"string.regexp\",\n tag: \"rx\",\n parentTag: \"string\",\n },\n {\n name: \"nospell\",\n tag: \"\",\n },\n {\n name: \"float\",\n tag: \"n\",\n },\n {\n name: \"boolean\",\n tag: \"cb\",\n },\n];","/** Escape HTML special characters */\nexport function escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n","/**\n * Arborium loader - loads grammar plugins and highlights code.\n *\n * Architecture:\n * 1. Grammar registry is bundled at build time (no network request needed in production)\n * - Can be overridden via pluginsUrl config for local development\n * 2. Load grammar wasm-bindgen modules on demand from @arborium/<lang> packages\n * 3. Parse and highlight using the grammar's tree-sitter parser\n */\n\nimport type {\n Utf8ParseResult,\n Utf16ParseResult,\n ArboriumConfig,\n Grammar,\n Session,\n} from \"./types.js\";\nimport { availableLanguages, pluginVersion } from \"./plugins-manifest.js\";\nimport { escapeHtml } from \"./utils.js\";\n\n// Default config\nexport const defaultConfig: Required<ArboriumConfig> = {\n manual: false,\n theme: \"one-dark\",\n selector: \"pre code\",\n cdn: \"jsdelivr\",\n version: pluginVersion, // Precise version from manifest\n pluginsUrl: \"\", // Empty means use bundled manifest\n hostUrl: \"\", // Empty means use CDN based on version\n resolveJs: ({ baseUrl, path }) => import(/* @vite-ignore */ `${baseUrl}/${path}`),\n resolveWasm: ({ baseUrl, path }) => fetch(`${baseUrl}/${path}`),\n};\n\n// Rust host module (loaded on demand)\ninterface HostModule {\n highlight: (language: string, source: string) => string;\n isLanguageAvailable: (language: string) => boolean;\n}\nlet hostModule: HostModule | null = null;\nlet hostLoadPromise: Promise<HostModule | null> | null = null;\n\n// Merged config\nlet globalConfig: Required<ArboriumConfig> = { ...defaultConfig };\n\n// Grammar plugins cache\nconst grammarCache = new Map<string, GrammarPlugin>();\n\n// In-flight grammar load promises (to prevent double-loading)\nconst grammarLoadPromises = new Map<string, Promise<GrammarPlugin | null>>();\n\n// Languages we know are available (bundled at build time)\nconst knownLanguages: Set<string> = new Set(availableLanguages);\n\n// For local development: can override with pluginsUrl to load from dev server\ninterface LocalManifest {\n entries: Array<{\n language: string;\n local_js: string;\n local_wasm: string;\n }>;\n}\nlet localManifest: LocalManifest | null = null;\nlet localManifestPromise: Promise<void> | null = null;\n\n/** Load local manifest if pluginsUrl is configured (for dev server) */\nasync function ensureLocalManifest(config: Required<ArboriumConfig>): Promise<void> {\n if (!config.pluginsUrl) {\n return;\n }\n\n if (localManifestPromise) {\n return localManifestPromise;\n }\n\n localManifestPromise = (async () => {\n console.debug(`[arborium] Loading local plugins manifest from: ${config.pluginsUrl}`);\n const response = await fetch(config.pluginsUrl);\n if (!response.ok) {\n throw new Error(`Failed to load plugins.json: ${response.status}`);\n }\n localManifest = await response.json();\n console.debug(`[arborium] Loaded local manifest with ${localManifest?.entries.length} entries`);\n })();\n\n return localManifestPromise;\n}\n\n/** Get the CDN base URL for a grammar */\nfunction getGrammarBaseUrl(language: string, config: Required<ArboriumConfig>): string {\n // If we have a local manifest (dev mode), use the local path\n if (localManifest) {\n const entry = localManifest.entries.find((e) => e.language === language);\n if (entry) {\n // Extract base URL from local_js path (e.g., \"/langs/group-hazel/python/npm/grammar.js\" -> \"/langs/group-hazel/python/npm\")\n return entry.local_js.substring(0, entry.local_js.lastIndexOf(\"/\"));\n }\n }\n\n // Production: derive from language name using precise version\n const cdn = config.cdn;\n const version = config.version;\n let baseUrl: string;\n if (cdn === \"jsdelivr\") {\n baseUrl = \"https://cdn.jsdelivr.net/npm\";\n } else if (cdn === \"unpkg\") {\n baseUrl = \"https://unpkg.com\";\n } else {\n baseUrl = cdn;\n }\n return `${baseUrl}/@arborium/${language}@${version}`;\n}\n\ntype MaybePromise<T> = Promise<T> | T;\n\n// See https://github.com/wasm-bindgen/wasm-bindgen/blob/dda4821ee2fbcaa7adc58bc8c385ed8d3627a272/crates/cli-support/src/js/mod.rs#L860\n/** Source of the WASM module for wasm-bindgen */\ntype WbgInitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;\n\n/** wasm-bindgen plugin module interface */\ninterface WasmBindgenPlugin {\n default: (\n module_or_path?: { module_or_path: MaybePromise<WbgInitInput> } | undefined,\n // deprecated: | MaybePromise<WbgInitInput>,\n ) => Promise<void>;\n language_id: () => string;\n injection_languages: () => string[];\n create_session: () => number;\n free_session: (session: number) => void;\n set_text: (session: number, text: string) => void;\n /** Parse and return UTF-8 byte offsets (for Rust host) */\n parse: (session: number) => Utf8ParseResult;\n /** Parse and return UTF-16 code unit indices (for JavaScript) */\n parse_utf16: (session: number) => Utf16ParseResult;\n cancel: (session: number) => void;\n}\n\n/** A loaded grammar plugin */\ninterface GrammarPlugin {\n languageId: string;\n injectionLanguages: string[];\n module: WasmBindgenPlugin;\n /** Parse returning UTF-8 offsets (for Rust host) */\n parseUtf8: (text: string) => Utf8ParseResult;\n /** Parse returning UTF-16 offsets (for JavaScript public API) */\n parseUtf16: (text: string) => Utf16ParseResult;\n}\n\n/** Load a grammar plugin */\nasync function loadGrammarPlugin(\n language: string,\n config: Required<ArboriumConfig>,\n): Promise<GrammarPlugin | null> {\n // Check cache first\n const cached = grammarCache.get(language);\n if (cached) {\n console.debug(`[arborium] Grammar '${language}' found in cache`);\n return cached;\n }\n\n // Check if there's already an in-flight load for this language\n const inFlight = grammarLoadPromises.get(language);\n if (inFlight) {\n console.debug(`[arborium] Grammar '${language}' already loading, waiting...`);\n return inFlight;\n }\n\n // Start the actual load and track the promise\n const loadPromise = loadGrammarPluginInner(language, config);\n grammarLoadPromises.set(language, loadPromise);\n\n try {\n return await loadPromise;\n } finally {\n // Clean up the in-flight promise once done\n grammarLoadPromises.delete(language);\n }\n}\n\n/** Internal grammar loading - called only once per language */\nasync function loadGrammarPluginInner(\n language: string,\n config: Required<ArboriumConfig>,\n): Promise<GrammarPlugin | null> {\n // Load local manifest if in dev mode\n await ensureLocalManifest(config);\n\n // Check if language is known\n if (\n !knownLanguages.has(language) &&\n !localManifest?.entries.some((e) => e.language === language)\n ) {\n console.debug(`[arborium] Grammar '${language}' not available`);\n return null;\n }\n\n try {\n const baseUrl = getGrammarBaseUrl(language, config);\n const detail =\n config.resolveJs === defaultConfig.resolveJs ? ` from ${baseUrl}/grammar.js` : \"\";\n console.debug(`[arborium] Loading grammar '${language}'${detail}`);\n\n const module = (await config.resolveJs({\n language,\n baseUrl,\n path: \"grammar.js\",\n })) as WasmBindgenPlugin;\n const wasm = await config.resolveWasm({ language, baseUrl, path: \"grammar_bg.wasm\" });\n\n // Initialize the WASM module\n await module.default({ module_or_path: wasm });\n\n // Verify it loaded correctly\n const loadedId = module.language_id();\n if (loadedId !== language) {\n console.warn(`[arborium] Language ID mismatch: expected '${language}', got '${loadedId}'`);\n }\n\n // Get injection languages\n const injectionLanguages = module.injection_languages();\n\n // Wrap as GrammarPlugin with session-based parsing\n const plugin: GrammarPlugin = {\n languageId: language,\n injectionLanguages,\n module,\n // UTF-8 parsing for Rust host\n parseUtf8: (text: string) => {\n const session = module.create_session();\n try {\n module.set_text(session, text);\n const result = module.parse(session);\n return {\n spans: result.spans || [],\n injections: result.injections || [],\n };\n } catch (e) {\n console.error(`[arborium] Parse error:`, e);\n return { spans: [], injections: [] };\n } finally {\n module.free_session(session);\n }\n },\n // UTF-16 parsing for JavaScript public API\n parseUtf16: (text: string) => {\n const session = module.create_session();\n try {\n module.set_text(session, text);\n const result = module.parse_utf16(session);\n return {\n spans: result.spans || [],\n injections: result.injections || [],\n };\n } catch (e) {\n console.error(`[arborium] Parse error:`, e);\n return { spans: [], injections: [] };\n } finally {\n module.free_session(session);\n }\n },\n };\n\n grammarCache.set(language, plugin);\n console.debug(`[arborium] Grammar '${language}' loaded successfully`);\n return plugin;\n } catch (e) {\n console.error(`[arborium] Failed to load grammar '${language}':`, e);\n return null;\n }\n}\n\n// Handle to plugin mapping for the host interface\nconst handleToPlugin = new Map<number, GrammarPlugin>();\nlet nextHandle = 1;\n\n/** Setup window.arboriumHost for the Rust host to call into */\nfunction setupHostInterface(config: Required<ArboriumConfig>): void {\n (window as any).arboriumHost = {\n /** Check if a language is available (sync) */\n isLanguageAvailable(language: string): boolean {\n return knownLanguages.has(language) || grammarCache.has(language);\n },\n\n /** Load a grammar and return a handle (async) */\n async loadGrammar(language: string): Promise<number> {\n const plugin = await loadGrammarPlugin(language, config);\n if (!plugin) return 0; // 0 = not found\n\n // Check if we already have a handle\n for (const [handle, p] of handleToPlugin) {\n if (p === plugin) return handle;\n }\n\n // Create new handle\n const handle = nextHandle++;\n handleToPlugin.set(handle, plugin);\n return handle;\n },\n\n /** Parse text using a grammar handle (sync) - returns UTF-8 offsets for Rust host */\n parse(handle: number, text: string): Utf8ParseResult {\n const plugin = handleToPlugin.get(handle);\n if (!plugin) return { spans: [], injections: [] };\n return plugin.parseUtf8(text);\n },\n };\n}\n\n/** Get the host URL based on config */\nfunction getHostUrl(config: Required<ArboriumConfig>): string {\n if (config.hostUrl) {\n return config.hostUrl;\n }\n // Use CDN\n const cdn = config.cdn;\n const version = config.version;\n let baseUrl: string;\n if (cdn === \"jsdelivr\") {\n baseUrl = \"https://cdn.jsdelivr.net/npm\";\n } else if (cdn === \"unpkg\") {\n baseUrl = \"https://unpkg.com\";\n } else {\n baseUrl = cdn;\n }\n const versionSuffix = version === \"latest\" ? \"\" : `@${version}`;\n return `${baseUrl}/@arborium/arborium${versionSuffix}/dist`;\n}\n\n/** Load the Rust host module */\nasync function loadHost(config: Required<ArboriumConfig>): Promise<HostModule | null> {\n if (hostModule) return hostModule;\n if (hostLoadPromise) return hostLoadPromise;\n\n hostLoadPromise = (async () => {\n // Setup the interface the host imports\n setupHostInterface(config);\n\n const hostUrl = getHostUrl(config);\n const jsUrl = `${hostUrl}/arborium_host.js`;\n const wasmUrl = `${hostUrl}/arborium_host_bg.wasm`;\n\n console.debug(`[arborium] Loading host from ${jsUrl}`);\n try {\n const module = await import(/* @vite-ignore */ jsUrl);\n await module.default(wasmUrl);\n\n hostModule = {\n highlight: module.highlight,\n isLanguageAvailable: module.isLanguageAvailable,\n };\n console.debug(`[arborium] Host loaded successfully`);\n return hostModule;\n } catch (e) {\n console.error(\"[arborium] Failed to load host:\", e);\n return null;\n }\n })();\n\n return hostLoadPromise;\n}\n\n/** Highlight source code */\nexport async function highlight(\n language: string,\n source: string,\n configOverrides?: ArboriumConfig,\n): Promise<string> {\n const config = getConfig(configOverrides);\n // Use the Rust host (handles injections, proper span deduplication, etc.)\n const host = await loadHost(config);\n if (host) {\n try {\n return host.highlight(language, source);\n } catch (e) {\n console.error(\"[arborium] Host highlight failed:\", e);\n }\n }\n\n // Host not available - return escaped source\n return escapeHtml(source);\n}\n\n/** Load a grammar for direct use */\nexport async function loadGrammar(\n language: string,\n configOverrides?: ArboriumConfig,\n): Promise<Grammar | null> {\n const config = getConfig(configOverrides);\n const plugin = await loadGrammarPlugin(language, config);\n if (!plugin) return null;\n\n const { module } = plugin;\n\n return {\n languageId: () => plugin.languageId,\n injectionLanguages: () => plugin.injectionLanguages,\n highlight: async (source: string) => {\n // Use the Rust host for proper highlighting with injection support\n return highlight(language, source, configOverrides);\n },\n // Public API returns UTF-16 offsets for JavaScript compatibility\n parse: (source: string) => plugin.parseUtf16(source),\n createSession: (): Session => {\n const handle = module.create_session();\n return {\n setText: (text: string) => module.set_text(handle, text),\n // Session.parse() returns UTF-16 offsets for JavaScript compatibility\n parse: () => {\n try {\n const result = module.parse_utf16(handle);\n return {\n spans: result.spans || [],\n injections: result.injections || [],\n };\n } catch (e) {\n console.error(`[arborium] Session parse error:`, e);\n return { spans: [], injections: [] };\n }\n },\n cancel: () => module.cancel(handle),\n free: () => module.free_session(handle),\n };\n },\n dispose: () => {\n // No-op for now, plugins are cached\n },\n };\n}\n\n/** Get current config, optionally merging with overrides */\nexport function getConfig(overrides?: Partial<ArboriumConfig>): Required<ArboriumConfig> {\n if (overrides) {\n return { ...globalConfig, ...overrides };\n }\n return { ...globalConfig };\n}\n\n/** Set/merge config */\nexport function setConfig(newConfig: Partial<ArboriumConfig>): void {\n globalConfig = { ...globalConfig, ...newConfig };\n}\n\n/** Check if a language is available */\nexport async function isLanguageAvailable(\n language: string,\n configOverrides?: ArboriumConfig,\n): Promise<boolean> {\n const config = getConfig(configOverrides);\n await ensureLocalManifest(config);\n return (\n knownLanguages.has(language) ||\n (localManifest?.entries.some((e) => e.language === language) ?? false)\n );\n}\n\n/** Get list of available languages */\nexport async function getAvailableLanguages(configOverrides?: ArboriumConfig): Promise<string[]> {\n const config = getConfig(configOverrides);\n await ensureLocalManifest(config);\n // In dev mode, use local manifest if available\n if (localManifest) {\n return localManifest.entries.map((e) => e.language);\n }\n return Array.from(knownLanguages);\n}\n"],"names":["SHEBANG_PATTERNS","KEYWORD_FINGERPRINTS","detectLanguage","source","firstLine","pattern","language","extractLanguageFromClass","className","langMatch","shortMatch","knownLanguages","cls","normalizeLanguage","lang","aliases","lower","pluginVersion","availableLanguages","highlights","escapeHtml","text","defaultConfig","baseUrl","path","hostModule","hostLoadPromise","globalConfig","grammarCache","grammarLoadPromises","localManifest","localManifestPromise","ensureLocalManifest","config","response","getGrammarBaseUrl","entry","e","cdn","version","loadGrammarPlugin","cached","inFlight","loadPromise","loadGrammarPluginInner","detail","module","wasm","loadedId","injectionLanguages","plugin","session","result","handleToPlugin","nextHandle","setupHostInterface","handle","p","getHostUrl","versionSuffix","loadHost","hostUrl","jsUrl","wasmUrl","highlight","configOverrides","getConfig","host","loadGrammar","overrides","setConfig","newConfig","isLanguageAvailable","getAvailableLanguages"],"mappings":"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"}
1
+ {"version":3,"file":"arborium.js","sources":["../src/detect.ts","../src/plugins-manifest.ts","../src/utils.ts","../src/loader.ts"],"sourcesContent":["/**\n * Simple language detection heuristics.\n * Not meant to be comprehensive - just catches common cases.\n */\n\n/** Shebang patterns */\nconst SHEBANG_PATTERNS: Array<[RegExp, string]> = [\n [/^#!.*\\bpython[23]?\\b/, 'python'],\n [/^#!.*\\bnode\\b/, 'javascript'],\n [/^#!.*\\bdeno\\b/, 'typescript'],\n [/^#!.*\\bbun\\b/, 'typescript'],\n [/^#!.*\\bruby\\b/, 'ruby'],\n [/^#!.*\\bperl\\b/, 'perl'],\n [/^#!.*\\bphp\\b/, 'php'],\n [/^#!.*\\bbash\\b/, 'bash'],\n [/^#!.*\\bzsh\\b/, 'zsh'],\n [/^#!.*\\bsh\\b/, 'bash'],\n [/^#!.*\\blua\\b/, 'lua'],\n [/^#!.*\\bawk\\b/, 'awk'],\n];\n\n/** Keyword fingerprints - first few unique keywords that identify a language */\nconst KEYWORD_FINGERPRINTS: Array<[RegExp, string]> = [\n // Rust - distinctive keywords\n [/\\b(fn|impl|trait|pub\\s+fn|let\\s+mut|&mut|->)\\b/, 'rust'],\n\n // Go - distinctive keywords\n [/\\b(func|package\\s+\\w+|import\\s+\\(|go\\s+func|chan\\s+\\w+)\\b/, 'go'],\n\n // Python - distinctive patterns\n [/\\b(def\\s+\\w+\\s*\\(|import\\s+\\w+|from\\s+\\w+\\s+import|class\\s+\\w+:)\\b/, 'python'],\n\n // TypeScript - distinctive type annotations\n [/:\\s*(string|number|boolean|void)\\b|\\binterface\\s+\\w+\\s*\\{/, 'typescript'],\n\n // JavaScript - distinctive patterns (after TS check)\n [/\\b(const|let|var)\\s+\\w+\\s*=|function\\s+\\w+\\s*\\(|=>\\s*\\{/, 'javascript'],\n\n // Ruby - distinctive keywords\n [/\\b(def\\s+\\w+|end\\b|do\\s*\\|.*\\||puts\\s+|require\\s+['\"])\\b/, 'ruby'],\n\n // Java - distinctive patterns\n [/\\b(public\\s+class|private\\s+\\w+|System\\.out\\.println)\\b/, 'java'],\n\n // C++ - distinctive patterns\n [/\\b(#include\\s*<|std::|template\\s*<|nullptr|cout\\s*<<)\\b/, 'cpp'],\n\n // C - distinctive patterns (after C++ check)\n [/\\b(#include\\s*[<\"]|printf\\s*\\(|int\\s+main\\s*\\(|void\\s+\\w+\\s*\\()\\b/, 'c'],\n\n // C# - distinctive patterns\n [/\\b(namespace\\s+\\w+|using\\s+System|public\\s+static\\s+void)\\b/, 'c-sharp'],\n\n // PHP - distinctive patterns\n [/<\\?php|\\$\\w+\\s*=/, 'php'],\n\n // Swift - distinctive patterns\n [/\\b(func\\s+\\w+|var\\s+\\w+:\\s*\\w+|let\\s+\\w+:\\s*\\w+|@objc)\\b/, 'swift'],\n\n // Kotlin - distinctive patterns\n [/\\b(fun\\s+\\w+|val\\s+\\w+|var\\s+\\w+:|data\\s+class)\\b/, 'kotlin'],\n\n // Scala - distinctive patterns\n [/\\b(def\\s+\\w+|val\\s+\\w+|var\\s+\\w+|object\\s+\\w+|case\\s+class)\\b/, 'scala'],\n\n // Haskell - distinctive patterns\n [/\\b(module\\s+\\w+|import\\s+qualified|data\\s+\\w+\\s*=|::\\s*\\w+\\s*->)\\b/, 'haskell'],\n\n // Elixir - distinctive patterns\n [/\\b(defmodule\\s+\\w+|def\\s+\\w+|defp\\s+\\w+|\\|>)\\b/, 'elixir'],\n\n // Lua - distinctive patterns\n [/\\b(local\\s+\\w+\\s*=|function\\s+\\w+\\.\\w+|require\\s*\\()\\b/, 'lua'],\n\n // SQL - distinctive patterns\n [/\\b(SELECT\\s+.*\\s+FROM|INSERT\\s+INTO|CREATE\\s+TABLE|ALTER\\s+TABLE)\\b/i, 'sql'],\n\n // Shell/Bash - distinctive patterns\n [/\\b(if\\s+\\[\\s*|then\\b|fi\\b|echo\\s+[\"']|export\\s+\\w+=)\\b/, 'bash'],\n\n // YAML - distinctive patterns\n [/^\\s*[\\w-]+:\\s*[\\w\\-\"'[{]|^---\\s*$/, 'yaml'],\n\n // JSON - distinctive patterns\n [/^\\s*\\{[\\s\\S]*\"[\\w-]+\":\\s*/, 'json'],\n\n // TOML - distinctive patterns\n [/^\\s*\\[[\\w.-]+\\]\\s*$|^\\s*\\w+\\s*=\\s*[\"'\\d\\[]/, 'toml'],\n\n // HTML - distinctive patterns\n [/<(!DOCTYPE|html|head|body|div|span|p|a\\s)/i, 'html'],\n\n // CSS - distinctive patterns\n [/^\\s*[\\w.#@][\\w\\s,#.:>+~-]*\\{[^}]*\\}|@media\\s|@import\\s/, 'css'],\n\n // Markdown - distinctive patterns\n [/^#{1,6}\\s+\\w|^\\s*[-*+]\\s+\\w|^\\s*\\d+\\.\\s+\\w|```\\w*\\n/, 'markdown'],\n\n // XML - distinctive patterns\n [/<\\?xml|<[\\w:-]+\\s+xmlns/, 'xml'],\n\n // Dockerfile\n [/^FROM\\s+\\w+|^RUN\\s+|^COPY\\s+|^ENTRYPOINT\\s+/m, 'dockerfile'],\n\n // Nginx config\n [/\\b(server\\s*\\{|location\\s+[\\/~]|proxy_pass\\s+)\\b/, 'nginx'],\n\n // Zig\n [/\\b(pub\\s+fn|const\\s+\\w+\\s*=|@import\\(|comptime)\\b/, 'zig'],\n];\n\n/**\n * Detect the language of a code snippet.\n * Returns null if detection fails.\n */\nexport function detectLanguage(source: string): string | null {\n // Check shebang first (most reliable)\n const firstLine = source.split('\\n')[0];\n for (const [pattern, language] of SHEBANG_PATTERNS) {\n if (pattern.test(firstLine)) {\n return language;\n }\n }\n\n // Check keyword fingerprints\n for (const [pattern, language] of KEYWORD_FINGERPRINTS) {\n if (pattern.test(source)) {\n return language;\n }\n }\n\n return null;\n}\n\n/**\n * Extract language from class name.\n * Supports multiple patterns:\n * - \"language-rust\" -> \"rust\" (standard)\n * - \"lang-rust\" -> \"rust\" (common alternative)\n * - \"rust\" -> \"rust\" (docs.rs style, bare language name)\n */\nexport function extractLanguageFromClass(className: string): string | null {\n // Try \"language-*\" pattern first (most specific)\n const langMatch = className.match(/\\blanguage-(\\w+)\\b/);\n if (langMatch) return langMatch[1];\n\n // Try \"lang-*\" pattern\n const shortMatch = className.match(/\\blang-(\\w+)\\b/);\n if (shortMatch) return shortMatch[1];\n\n // Try bare language names (for docs.rs compatibility)\n // Only match known language names to avoid false positives\n const knownLanguages = new Set([\n 'rust', 'javascript', 'typescript', 'python', 'ruby', 'go', 'java',\n 'c', 'cpp', 'csharp', 'php', 'swift', 'kotlin', 'scala', 'haskell',\n 'elixir', 'lua', 'sql', 'bash', 'shell', 'yaml', 'json', 'toml',\n 'html', 'css', 'xml', 'markdown', 'dockerfile', 'nginx', 'zig',\n 'text', 'plaintext', 'console', 'sh',\n ]);\n\n for (const cls of className.split(/\\s+/)) {\n if (knownLanguages.has(cls.toLowerCase())) {\n return cls.toLowerCase();\n }\n }\n\n return null;\n}\n\n/**\n * Normalize language identifier (handle aliases)\n */\nexport function normalizeLanguage(lang: string): string {\n const aliases: Record<string, string> = {\n js: 'javascript',\n ts: 'typescript',\n py: 'python',\n rb: 'ruby',\n rs: 'rust',\n sh: 'bash',\n shell: 'bash',\n yml: 'yaml',\n cs: 'c-sharp',\n csharp: 'c-sharp',\n 'c++': 'cpp',\n 'c#': 'c-sharp',\n 'f#': 'fsharp',\n dockerfile: 'dockerfile',\n docker: 'dockerfile',\n makefile: 'make',\n plaintext: 'text',\n plain: 'text',\n txt: 'text',\n };\n\n const lower = lang.toLowerCase();\n return aliases[lower] || lower;\n}\n","// AUTO-GENERATED by `cargo xtask gen-manifest` - DO NOT EDIT\n\nimport type { Highlight } from \"./types.js\"; \n\n/** Version of plugin packages (all @arborium/* packages share this version) */\nexport const pluginVersion = \"2.12.2\";\n\n/** All available languages */\nexport const availableLanguages: string[] = [\n \"ada\",\n \"agda\",\n \"asciidoc\",\n \"asm\",\n \"awk\",\n \"bash\",\n \"batch\",\n \"c\",\n \"c-sharp\",\n \"caddy\",\n \"capnp\",\n \"cedar\",\n \"cedarschema\",\n \"clojure\",\n \"cmake\",\n \"cobol\",\n \"commonlisp\",\n \"cpp\",\n \"css\",\n \"d\",\n \"dart\",\n \"devicetree\",\n \"diff\",\n \"dockerfile\",\n \"dot\",\n \"elisp\",\n \"elixir\",\n \"elm\",\n \"erlang\",\n \"fish\",\n \"fsharp\",\n \"gleam\",\n \"glsl\",\n \"go\",\n \"graphql\",\n \"groovy\",\n \"haskell\",\n \"hcl\",\n \"hlsl\",\n \"html\",\n \"idris\",\n \"ini\",\n \"java\",\n \"javascript\",\n \"jinja2\",\n \"jq\",\n \"json\",\n \"julia\",\n \"kotlin\",\n \"lean\",\n \"lua\",\n \"markdown\",\n \"matlab\",\n \"meson\",\n \"nginx\",\n \"ninja\",\n \"nix\",\n \"objc\",\n \"ocaml\",\n \"perl\",\n \"php\",\n \"postscript\",\n \"powershell\",\n \"prolog\",\n \"python\",\n \"query\",\n \"r\",\n \"rescript\",\n \"ron\",\n \"ruby\",\n \"rust\",\n \"scala\",\n \"scheme\",\n \"scss\",\n \"solidity\",\n \"sparql\",\n \"sql\",\n \"ssh-config\",\n \"starlark\",\n \"styx\",\n \"svelte\",\n \"swift\",\n \"textproto\",\n \"thrift\",\n \"tlaplus\",\n \"toml\",\n \"tsx\",\n \"typescript\",\n \"typst\",\n \"uiua\",\n \"vb\",\n \"verilog\",\n \"vhdl\",\n \"vim\",\n \"vue\",\n \"wit\",\n \"x86asm\",\n \"xml\",\n \"yaml\",\n \"yuri\",\n \"zig\",\n \"zsh\",\n];\n\n/** All possible highlights and their short tags */\nexport const highlights: Highlight[] = [\n {\n name: \"attribute\",\n tag: \"at\",\n },\n {\n name: \"constant\",\n tag: \"co\",\n },\n {\n name: \"constant.builtin\",\n tag: \"cb\",\n parentTag: \"constant\",\n },\n {\n name: \"constructor\",\n tag: \"cr\",\n },\n {\n name: \"function.builtin\",\n tag: \"fb\",\n parentTag: \"function\",\n },\n {\n name: \"function\",\n tag: \"f\",\n },\n {\n name: \"function.method\",\n tag: \"fm\",\n parentTag: \"function\",\n },\n {\n name: \"keyword\",\n tag: \"k\",\n },\n {\n name: \"keyword.conditional\",\n tag: \"kc\",\n parentTag: \"keyword\",\n },\n {\n name: \"keyword.coroutine\",\n tag: \"ko\",\n parentTag: \"keyword\",\n },\n {\n name: \"keyword.debug\",\n tag: \"kd\",\n parentTag: \"keyword\",\n },\n {\n name: \"keyword.exception\",\n tag: \"ke\",\n parentTag: \"keyword\",\n },\n {\n name: \"keyword.function\",\n tag: \"kf\",\n parentTag: \"keyword\",\n },\n {\n name: \"keyword.import\",\n tag: \"ki\",\n parentTag: \"keyword\",\n },\n {\n name: \"keyword.operator\",\n tag: \"kp\",\n parentTag: \"keyword\",\n },\n {\n name: \"keyword.repeat\",\n tag: \"kr\",\n parentTag: \"keyword\",\n },\n {\n name: \"keyword.return\",\n tag: \"kt\",\n parentTag: \"keyword\",\n },\n {\n name: \"keyword.type\",\n tag: \"ky\",\n parentTag: \"keyword\",\n },\n {\n name: \"operator\",\n tag: \"o\",\n },\n {\n name: \"property\",\n tag: \"pr\",\n },\n {\n name: \"punctuation\",\n tag: \"p\",\n },\n {\n name: \"punctuation.bracket\",\n tag: \"pb\",\n parentTag: \"punctuation\",\n },\n {\n name: \"punctuation.delimiter\",\n tag: \"pd\",\n parentTag: \"punctuation\",\n },\n {\n name: \"punctuation.special\",\n tag: \"ps\",\n parentTag: \"punctuation\",\n },\n {\n name: \"string\",\n tag: \"s\",\n },\n {\n name: \"string.special\",\n tag: \"ss\",\n parentTag: \"string\",\n },\n {\n name: \"tag\",\n tag: \"tg\",\n },\n {\n name: \"tag.delimiter\",\n tag: \"td\",\n parentTag: \"tag\",\n },\n {\n name: \"tag.error\",\n tag: \"te\",\n parentTag: \"tag\",\n },\n {\n name: \"type\",\n tag: \"t\",\n },\n {\n name: \"type.builtin\",\n tag: \"tb\",\n parentTag: \"type\",\n },\n {\n name: \"type.qualifier\",\n tag: \"tq\",\n parentTag: \"type\",\n },\n {\n name: \"variable\",\n tag: \"v\",\n },\n {\n name: \"variable.builtin\",\n tag: \"vb\",\n parentTag: \"variable\",\n },\n {\n name: \"variable.parameter\",\n tag: \"vp\",\n parentTag: \"variable\",\n },\n {\n name: \"comment\",\n tag: \"c\",\n },\n {\n name: \"comment.documentation\",\n tag: \"cd\",\n parentTag: \"comment\",\n },\n {\n name: \"macro\",\n tag: \"m\",\n },\n {\n name: \"label\",\n tag: \"l\",\n },\n {\n name: \"diff.addition\",\n tag: \"da\",\n },\n {\n name: \"diff.deletion\",\n tag: \"dd\",\n },\n {\n name: \"number\",\n tag: \"n\",\n },\n {\n name: \"text.literal\",\n tag: \"tl\",\n },\n {\n name: \"text.emphasis\",\n tag: \"em\",\n },\n {\n name: \"text.strong\",\n tag: \"st\",\n },\n {\n name: \"text.uri\",\n tag: \"tu\",\n },\n {\n name: \"text.reference\",\n tag: \"tr\",\n },\n {\n name: \"string.escape\",\n tag: \"se\",\n parentTag: \"string\",\n },\n {\n name: \"text.title\",\n tag: \"tt\",\n },\n {\n name: \"text.strikethrough\",\n tag: \"tx\",\n },\n {\n name: \"spell\",\n tag: \"sp\",\n },\n {\n name: \"embedded\",\n tag: \"eb\",\n },\n {\n name: \"error\",\n tag: \"er\",\n },\n {\n name: \"namespace\",\n tag: \"ns\",\n },\n {\n name: \"include\",\n tag: \"in\",\n parentTag: \"keyword\",\n },\n {\n name: \"storageclass\",\n tag: \"sc\",\n parentTag: \"keyword\",\n },\n {\n name: \"repeat\",\n tag: \"rp\",\n parentTag: \"keyword\",\n },\n {\n name: \"conditional\",\n tag: \"cn\",\n parentTag: \"keyword\",\n },\n {\n name: \"exception\",\n tag: \"ex\",\n parentTag: \"keyword\",\n },\n {\n name: \"preproc\",\n tag: \"pp\",\n parentTag: \"keyword\",\n },\n {\n name: \"none\",\n tag: \"\",\n },\n {\n name: \"character\",\n tag: \"ch\",\n parentTag: \"string\",\n },\n {\n name: \"character.special\",\n tag: \"cs\",\n parentTag: \"string\",\n },\n {\n name: \"variable.member\",\n tag: \"vm\",\n parentTag: \"variable\",\n },\n {\n name: \"function.definition\",\n tag: \"fd\",\n parentTag: \"function\",\n },\n {\n name: \"type.definition\",\n tag: \"tf\",\n parentTag: \"type\",\n },\n {\n name: \"function.call\",\n tag: \"fc\",\n parentTag: \"function\",\n },\n {\n name: \"keyword.modifier\",\n tag: \"km\",\n parentTag: \"keyword\",\n },\n {\n name: \"keyword.directive\",\n tag: \"dr\",\n parentTag: \"keyword\",\n },\n {\n name: \"string.regexp\",\n tag: \"rx\",\n parentTag: \"string\",\n },\n {\n name: \"nospell\",\n tag: \"\",\n },\n {\n name: \"float\",\n tag: \"n\",\n },\n {\n name: \"boolean\",\n tag: \"cb\",\n },\n];","/** Escape HTML special characters */\nexport function escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n","/**\n * Arborium loader - loads grammar plugins and highlights code.\n *\n * Architecture:\n * 1. Grammar registry is bundled at build time (no network request needed in production)\n * - Can be overridden via pluginsUrl config for local development\n * 2. Load grammar wasm-bindgen modules on demand from @arborium/<lang> packages\n * 3. Parse and highlight using the grammar's tree-sitter parser\n */\n\nimport type {\n Utf8ParseResult,\n Utf16ParseResult,\n ArboriumConfig,\n Grammar,\n Session,\n} from \"./types.js\";\nimport { availableLanguages, pluginVersion } from \"./plugins-manifest.js\";\nimport { escapeHtml } from \"./utils.js\";\n\n// Default config\nexport const defaultConfig: Required<ArboriumConfig> = {\n manual: false,\n theme: \"one-dark\",\n selector: \"pre code\",\n cdn: \"jsdelivr\",\n version: pluginVersion, // Precise version from manifest\n pluginsUrl: \"\", // Empty means use bundled manifest\n hostUrl: \"\", // Empty means use CDN based on version\n logger: console,\n resolveJs: ({ baseUrl, path }) => import(/* @vite-ignore */ `${baseUrl}/${path}`),\n resolveWasm: ({ baseUrl, path }) => fetch(`${baseUrl}/${path}`),\n};\n\n// Rust host module (loaded on demand)\ninterface HostModule {\n highlight: (language: string, source: string) => string;\n isLanguageAvailable: (language: string) => boolean;\n}\nlet hostModule: HostModule | null = null;\nlet hostLoadPromise: Promise<HostModule | null> | null = null;\n\n// Merged config\nlet globalConfig: Required<ArboriumConfig> = { ...defaultConfig };\n\n// Grammar plugins cache\nconst grammarCache = new Map<string, GrammarPlugin>();\n\n// In-flight grammar load promises (to prevent double-loading)\nconst grammarLoadPromises = new Map<string, Promise<GrammarPlugin | null>>();\n\n// Languages we know are available (bundled at build time)\nconst knownLanguages: Set<string> = new Set(availableLanguages);\n\n// For local development: can override with pluginsUrl to load from dev server\ninterface LocalManifest {\n entries: Array<{\n language: string;\n local_js: string;\n local_wasm: string;\n }>;\n}\nlet localManifest: LocalManifest | null = null;\nlet localManifestPromise: Promise<void> | null = null;\n\n/** Load local manifest if pluginsUrl is configured (for dev server) */\nasync function ensureLocalManifest(config: Required<ArboriumConfig>): Promise<void> {\n if (!config.pluginsUrl) {\n return;\n }\n\n if (localManifestPromise) {\n return localManifestPromise;\n }\n\n localManifestPromise = (async () => {\n config.logger.debug(`[arborium] Loading local plugins manifest from: ${config.pluginsUrl}`);\n const response = await fetch(config.pluginsUrl);\n if (!response.ok) {\n throw new Error(`Failed to load plugins.json: ${response.status}`);\n }\n localManifest = await response.json();\n config.logger.debug(`[arborium] Loaded local manifest with ${localManifest?.entries.length} entries`);\n })();\n\n return localManifestPromise;\n}\n\n/** Get the CDN base URL for a grammar */\nfunction getGrammarBaseUrl(language: string, config: Required<ArboriumConfig>): string {\n // If we have a local manifest (dev mode), use the local path\n if (localManifest) {\n const entry = localManifest.entries.find((e) => e.language === language);\n if (entry) {\n // Extract base URL from local_js path (e.g., \"/langs/group-hazel/python/npm/grammar.js\" -> \"/langs/group-hazel/python/npm\")\n return entry.local_js.substring(0, entry.local_js.lastIndexOf(\"/\"));\n }\n }\n\n // Production: derive from language name using precise version\n const cdn = config.cdn;\n const version = config.version;\n let baseUrl: string;\n if (cdn === \"jsdelivr\") {\n baseUrl = \"https://cdn.jsdelivr.net/npm\";\n } else if (cdn === \"unpkg\") {\n baseUrl = \"https://unpkg.com\";\n } else {\n baseUrl = cdn;\n }\n return `${baseUrl}/@arborium/${language}@${version}`;\n}\n\ntype MaybePromise<T> = Promise<T> | T;\n\n// See https://github.com/wasm-bindgen/wasm-bindgen/blob/dda4821ee2fbcaa7adc58bc8c385ed8d3627a272/crates/cli-support/src/js/mod.rs#L860\n/** Source of the WASM module for wasm-bindgen */\ntype WbgInitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;\n\n/** wasm-bindgen plugin module interface */\ninterface WasmBindgenPlugin {\n default: (\n module_or_path?: { module_or_path: MaybePromise<WbgInitInput> } | undefined,\n // deprecated: | MaybePromise<WbgInitInput>,\n ) => Promise<void>;\n language_id: () => string;\n injection_languages: () => string[];\n create_session: () => number;\n free_session: (session: number) => void;\n set_text: (session: number, text: string) => void;\n /** Parse and return UTF-8 byte offsets (for Rust host) */\n parse: (session: number) => Utf8ParseResult;\n /** Parse and return UTF-16 code unit indices (for JavaScript) */\n parse_utf16: (session: number) => Utf16ParseResult;\n cancel: (session: number) => void;\n}\n\n/** A loaded grammar plugin */\ninterface GrammarPlugin {\n languageId: string;\n injectionLanguages: string[];\n module: WasmBindgenPlugin;\n /** Parse returning UTF-8 offsets (for Rust host) */\n parseUtf8: (text: string) => Utf8ParseResult;\n /** Parse returning UTF-16 offsets (for JavaScript public API) */\n parseUtf16: (text: string) => Utf16ParseResult;\n}\n\n/** Load a grammar plugin */\nasync function loadGrammarPlugin(\n language: string,\n config: Required<ArboriumConfig>,\n): Promise<GrammarPlugin | null> {\n // Check cache first\n const cached = grammarCache.get(language);\n if (cached) {\n config.logger.debug(`[arborium] Grammar '${language}' found in cache`);\n return cached;\n }\n\n // Check if there's already an in-flight load for this language\n const inFlight = grammarLoadPromises.get(language);\n if (inFlight) {\n config.logger.debug(`[arborium] Grammar '${language}' already loading, waiting...`);\n return inFlight;\n }\n\n // Start the actual load and track the promise\n const loadPromise = loadGrammarPluginInner(language, config);\n grammarLoadPromises.set(language, loadPromise);\n\n try {\n return await loadPromise;\n } finally {\n // Clean up the in-flight promise once done\n grammarLoadPromises.delete(language);\n }\n}\n\n/** Internal grammar loading - called only once per language */\nasync function loadGrammarPluginInner(\n language: string,\n config: Required<ArboriumConfig>,\n): Promise<GrammarPlugin | null> {\n // Load local manifest if in dev mode\n await ensureLocalManifest(config);\n\n // Check if language is known\n if (\n !knownLanguages.has(language) &&\n !localManifest?.entries.some((e) => e.language === language)\n ) {\n config.logger.debug(`[arborium] Grammar '${language}' not available`);\n return null;\n }\n\n try {\n const baseUrl = getGrammarBaseUrl(language, config);\n const detail =\n config.resolveJs === defaultConfig.resolveJs ? ` from ${baseUrl}/grammar.js` : \"\";\n config.logger.debug(`[arborium] Loading grammar '${language}'${detail}`);\n\n const module = (await config.resolveJs({\n language,\n baseUrl,\n path: \"grammar.js\",\n })) as WasmBindgenPlugin;\n const wasm = await config.resolveWasm({ language, baseUrl, path: \"grammar_bg.wasm\" });\n\n // Initialize the WASM module\n await module.default({ module_or_path: wasm });\n\n // Verify it loaded correctly\n const loadedId = module.language_id();\n if (loadedId !== language) {\n config.logger.warn(`[arborium] Language ID mismatch: expected '${language}', got '${loadedId}'`);\n }\n\n // Get injection languages\n const injectionLanguages = module.injection_languages();\n\n // Wrap as GrammarPlugin with session-based parsing\n const plugin: GrammarPlugin = {\n languageId: language,\n injectionLanguages,\n module,\n // UTF-8 parsing for Rust host\n parseUtf8: (text: string) => {\n const session = module.create_session();\n try {\n module.set_text(session, text);\n const result = module.parse(session);\n return {\n spans: result.spans || [],\n injections: result.injections || [],\n };\n } catch (e) {\n config.logger.error(`[arborium] Parse error:`, e);\n return { spans: [], injections: [] };\n } finally {\n module.free_session(session);\n }\n },\n // UTF-16 parsing for JavaScript public API\n parseUtf16: (text: string) => {\n const session = module.create_session();\n try {\n module.set_text(session, text);\n const result = module.parse_utf16(session);\n return {\n spans: result.spans || [],\n injections: result.injections || [],\n };\n } catch (e) {\n config.logger.error(`[arborium] Parse error:`, e);\n return { spans: [], injections: [] };\n } finally {\n module.free_session(session);\n }\n },\n };\n\n grammarCache.set(language, plugin);\n config.logger.debug(`[arborium] Grammar '${language}' loaded successfully`);\n return plugin;\n } catch (e) {\n config.logger.error(`[arborium] Failed to load grammar '${language}':`, e);\n return null;\n }\n}\n\n// Handle to plugin mapping for the host interface\nconst handleToPlugin = new Map<number, GrammarPlugin>();\nlet nextHandle = 1;\n\n/** Setup window.arboriumHost for the Rust host to call into */\nfunction setupHostInterface(config: Required<ArboriumConfig>): void {\n (window as any).arboriumHost = {\n /** Check if a language is available (sync) */\n isLanguageAvailable(language: string): boolean {\n return knownLanguages.has(language) || grammarCache.has(language);\n },\n\n /** Load a grammar and return a handle (async) */\n async loadGrammar(language: string): Promise<number> {\n const plugin = await loadGrammarPlugin(language, config);\n if (!plugin) return 0; // 0 = not found\n\n // Check if we already have a handle\n for (const [handle, p] of handleToPlugin) {\n if (p === plugin) return handle;\n }\n\n // Create new handle\n const handle = nextHandle++;\n handleToPlugin.set(handle, plugin);\n return handle;\n },\n\n /** Parse text using a grammar handle (sync) - returns UTF-8 offsets for Rust host */\n parse(handle: number, text: string): Utf8ParseResult {\n const plugin = handleToPlugin.get(handle);\n if (!plugin) return { spans: [], injections: [] };\n return plugin.parseUtf8(text);\n },\n };\n}\n\n/** Get the host URL based on config */\nfunction getHostUrl(config: Required<ArboriumConfig>): string {\n if (config.hostUrl) {\n return config.hostUrl;\n }\n // Use CDN\n const cdn = config.cdn;\n const version = config.version;\n let baseUrl: string;\n if (cdn === \"jsdelivr\") {\n baseUrl = \"https://cdn.jsdelivr.net/npm\";\n } else if (cdn === \"unpkg\") {\n baseUrl = \"https://unpkg.com\";\n } else {\n baseUrl = cdn;\n }\n const versionSuffix = version === \"latest\" ? \"\" : `@${version}`;\n return `${baseUrl}/@arborium/arborium${versionSuffix}/dist`;\n}\n\n/** Load the Rust host module */\nasync function loadHost(config: Required<ArboriumConfig>): Promise<HostModule | null> {\n if (hostModule) return hostModule;\n if (hostLoadPromise) return hostLoadPromise;\n\n hostLoadPromise = (async () => {\n // Setup the interface the host imports\n setupHostInterface(config);\n\n const hostUrl = getHostUrl(config);\n const jsUrl = `${hostUrl}/arborium_host.js`;\n const wasmUrl = `${hostUrl}/arborium_host_bg.wasm`;\n\n config.logger.debug(`[arborium] Loading host from ${jsUrl}`);\n try {\n const module = await import(/* @vite-ignore */ jsUrl);\n await module.default(wasmUrl);\n\n hostModule = {\n highlight: module.highlight,\n isLanguageAvailable: module.isLanguageAvailable,\n };\n config.logger.debug(`[arborium] Host loaded successfully`);\n return hostModule;\n } catch (e) {\n config.logger.error(\"[arborium] Failed to load host:\", e);\n return null;\n }\n })();\n\n return hostLoadPromise;\n}\n\n/** Highlight source code */\nexport async function highlight(\n language: string,\n source: string,\n configOverrides?: ArboriumConfig,\n): Promise<string> {\n const config = getConfig(configOverrides);\n // Use the Rust host (handles injections, proper span deduplication, etc.)\n const host = await loadHost(config);\n if (host) {\n try {\n return host.highlight(language, source);\n } catch (e) {\n config.logger.error(\"[arborium] Host highlight failed:\", e);\n }\n }\n\n // Host not available - return escaped source\n return escapeHtml(source);\n}\n\n/** Load a grammar for direct use */\nexport async function loadGrammar(\n language: string,\n configOverrides?: ArboriumConfig,\n): Promise<Grammar | null> {\n const config = getConfig(configOverrides);\n const plugin = await loadGrammarPlugin(language, config);\n if (!plugin) return null;\n\n const { module } = plugin;\n\n return {\n languageId: () => plugin.languageId,\n injectionLanguages: () => plugin.injectionLanguages,\n highlight: async (source: string) => {\n // Use the Rust host for proper highlighting with injection support\n return highlight(language, source, configOverrides);\n },\n // Public API returns UTF-16 offsets for JavaScript compatibility\n parse: (source: string) => plugin.parseUtf16(source),\n createSession: (): Session => {\n const handle = module.create_session();\n return {\n setText: (text: string) => module.set_text(handle, text),\n // Session.parse() returns UTF-16 offsets for JavaScript compatibility\n parse: () => {\n try {\n const result = module.parse_utf16(handle);\n return {\n spans: result.spans || [],\n injections: result.injections || [],\n };\n } catch (e) {\n config.logger.error(`[arborium] Session parse error:`, e);\n return { spans: [], injections: [] };\n }\n },\n cancel: () => module.cancel(handle),\n free: () => module.free_session(handle),\n };\n },\n dispose: () => {\n // No-op for now, plugins are cached\n },\n };\n}\n\n/** Get current config, optionally merging with overrides */\nexport function getConfig(overrides?: Partial<ArboriumConfig>): Required<ArboriumConfig> {\n if (overrides) {\n return { ...globalConfig, ...overrides };\n }\n return { ...globalConfig };\n}\n\n/** Set/merge config */\nexport function setConfig(newConfig: Partial<ArboriumConfig>): void {\n globalConfig = { ...globalConfig, ...newConfig };\n}\n\n/** Check if a language is available */\nexport async function isLanguageAvailable(\n language: string,\n configOverrides?: ArboriumConfig,\n): Promise<boolean> {\n const config = getConfig(configOverrides);\n await ensureLocalManifest(config);\n return (\n knownLanguages.has(language) ||\n (localManifest?.entries.some((e) => e.language === language) ?? false)\n );\n}\n\n/** Get list of available languages */\nexport async function getAvailableLanguages(configOverrides?: ArboriumConfig): Promise<string[]> {\n const config = getConfig(configOverrides);\n await ensureLocalManifest(config);\n // In dev mode, use local manifest if available\n if (localManifest) {\n return localManifest.entries.map((e) => e.language);\n }\n return Array.from(knownLanguages);\n}\n"],"names":["SHEBANG_PATTERNS","KEYWORD_FINGERPRINTS","detectLanguage","source","firstLine","pattern","language","extractLanguageFromClass","className","langMatch","shortMatch","knownLanguages","cls","normalizeLanguage","lang","aliases","lower","pluginVersion","availableLanguages","highlights","escapeHtml","text","defaultConfig","baseUrl","path","hostModule","hostLoadPromise","globalConfig","grammarCache","grammarLoadPromises","localManifest","localManifestPromise","ensureLocalManifest","config","response","getGrammarBaseUrl","entry","e","cdn","version","loadGrammarPlugin","cached","inFlight","loadPromise","loadGrammarPluginInner","detail","module","wasm","loadedId","injectionLanguages","plugin","session","result","handleToPlugin","nextHandle","setupHostInterface","handle","p","getHostUrl","versionSuffix","loadHost","hostUrl","jsUrl","wasmUrl","highlight","configOverrides","getConfig","host","loadGrammar","overrides","setConfig","newConfig","isLanguageAvailable","getAvailableLanguages"],"mappings":"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"}
@@ -355,7 +355,7 @@ function __wbg_get_imports() {
355
355
  const ret = Reflect.get(arg0, arg1);
356
356
  return ret;
357
357
  }, arguments) };
358
- imports.wbg.__wbg_isLanguageAvailable_d9b3da3dc8ecccef = function(arg0, arg1) {
358
+ imports.wbg.__wbg_isLanguageAvailable_2856c4055d784577 = function(arg0, arg1) {
359
359
  const ret = arboriumHost.isLanguageAvailable(getStringFromWasm0(arg0, arg1));
360
360
  return ret;
361
361
  };
@@ -363,7 +363,7 @@ function __wbg_get_imports() {
363
363
  const ret = arg0.length;
364
364
  return ret;
365
365
  };
366
- imports.wbg.__wbg_loadGrammar_ea8f178bf0cd9633 = function() { return handleError(function (arg0, arg1) {
366
+ imports.wbg.__wbg_loadGrammar_19f7e844b5e83a64 = function() { return handleError(function (arg0, arg1) {
367
367
  const ret = arboriumHost.loadGrammar(getStringFromWasm0(arg0, arg1));
368
368
  return ret;
369
369
  }, arguments) };
@@ -389,7 +389,7 @@ function __wbg_get_imports() {
389
389
  const ret = new Function(getStringFromWasm0(arg0, arg1));
390
390
  return ret;
391
391
  };
392
- imports.wbg.__wbg_parse_c38296dbbe74b5aa = function(arg0, arg1, arg2) {
392
+ imports.wbg.__wbg_parse_83a7b9abccb35925 = function(arg0, arg1, arg2) {
393
393
  const ret = arboriumHost.parse(arg0 >>> 0, getStringFromWasm0(arg1, arg2));
394
394
  return ret;
395
395
  };
Binary file
package/dist/iife.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { ArboriumConfig } from './types.js';
2
- /** Public API for manual highlighting */
3
- export declare function highlightAll(config?: ArboriumConfig): Promise<void>;
4
- /** Public API for highlighting a specific element */
5
- export declare function highlightElement(element: HTMLElement, language?: string, config?: ArboriumConfig): Promise<void>;
2
+ /** Highlight all code blocks on the page */
3
+ export declare function highlightAll(configOverrides?: Partial<ArboriumConfig>): Promise<void>;
4
+ /** Highlight a specific element */
5
+ export declare function highlightElement(element: HTMLElement, language?: string, configOverrides?: Partial<ArboriumConfig>): Promise<void>;
@@ -1,6 +1,6 @@
1
1
  import { Highlight } from './types.js';
2
2
  /** Version of plugin packages (all @arborium/* packages share this version) */
3
- export declare const pluginVersion = "2.12.0";
3
+ export declare const pluginVersion = "2.12.2";
4
4
  /** All available languages */
5
5
  export declare const availableLanguages: string[];
6
6
  /** All possible highlights and their short tags */
@@ -3,6 +3,8 @@
3
3
  /* Defines --arb-*-light variables */
4
4
 
5
5
  :root {
6
+ --arb-bg-light: #f7f7f7;
7
+ --arb-fg-light: #000000;
6
8
  --arb-at-light: #7a3e9d;
7
9
  --arb-co-light: #7a3e9d;
8
10
  --arb-cb-light: #7a3e9d;
@@ -3,6 +3,8 @@
3
3
  /* Defines --arb-*-dark variables */
4
4
 
5
5
  :root {
6
+ --arb-bg-dark: #0d1017;
7
+ --arb-fg-dark: #bfbdb6;
6
8
  --arb-co-dark: #d2a6ff;
7
9
  --arb-cb-dark: #d2a6ff;
8
10
  --arb-fb-dark: #ffb454;
@@ -3,6 +3,8 @@
3
3
  /* Defines --arb-*-light variables */
4
4
 
5
5
  :root {
6
+ --arb-bg-light: #fafafa;
7
+ --arb-fg-light: #5c6166;
6
8
  --arb-co-light: #a37acc;
7
9
  --arb-cb-light: #a37acc;
8
10
  --arb-fb-light: #f2ae49;
@@ -3,6 +3,8 @@
3
3
  /* Defines --arb-*-dark variables */
4
4
 
5
5
  :root {
6
+ --arb-bg-dark: #303446;
7
+ --arb-fg-dark: #c6d0f5;
6
8
  --arb-at-dark: #e5c890;
7
9
  --arb-co-dark: #ef9f76;
8
10
  --arb-cb-dark: #ef9f76;
@@ -3,6 +3,8 @@
3
3
  /* Defines --arb-*-light variables */
4
4
 
5
5
  :root {
6
+ --arb-bg-light: #eff1f5;
7
+ --arb-fg-light: #4c4f69;
6
8
  --arb-at-light: #df8e1d;
7
9
  --arb-co-light: #fe640b;
8
10
  --arb-cb-light: #fe640b;